From 7bf009fbf655a3b4b0123533c32b884e9d6e74b1 Mon Sep 17 00:00:00 2001 From: Xianny <8582774+xianny@users.noreply.github.com> Date: Tue, 30 Mar 2021 13:26:05 -0700 Subject: [PATCH] Upgrade to typescript v4.2.2 (#188) * upgrade to typescript v4.2.2 * prettier; remove outdated test --- contracts/asset-proxy/package.json | 2 +- .../asset-proxy/test/dex_forwarder_bridge.ts | 354 ------------------ contracts/broker/package.json | 2 +- contracts/coordinator/package.json | 2 +- contracts/dev-utils/package.json | 2 +- contracts/erc1155/package.json | 2 +- contracts/erc20/package.json | 2 +- contracts/erc20/test/weth9.ts | 2 +- contracts/erc721/package.json | 2 +- contracts/exchange-forwarder/package.json | 2 +- contracts/exchange-libs/package.json | 2 +- contracts/exchange/package.json | 2 +- ...act_balance_and_proxy_allowance_fetcher.ts | 4 +- ..._balance_and_proxy_allowance_lazy_store.ts | 4 +- ...abstract_order_filled_cancelled_fetcher.ts | 2 +- ...tract_order_filled_cancelled_lazy_store.ts | 2 +- .../test/utils/isolated_exchange_wrapper.ts | 2 +- contracts/extensions/package.json | 2 +- contracts/integrations/package.json | 2 +- .../dev-utils/dydx_order_validation_test.ts | 2 - .../test/framework/actors/utils.ts | 2 +- contracts/multisig/package.json | 2 +- contracts/staking/package.json | 2 +- contracts/staking/src/types.ts | 3 +- .../staking/test/unit_tests/exchange_test.ts | 3 +- .../staking/test/unit_tests/finalizer_test.ts | 2 +- .../test/unit_tests/lib_cobb_douglas_test.ts | 5 - contracts/test-utils/package.json | 2 +- contracts/test-utils/src/lang_utils.ts | 2 +- contracts/test-utils/src/order_factory.ts | 4 +- contracts/test-utils/src/order_utils.ts | 3 +- contracts/treasury/package.json | 2 +- contracts/utils/package.json | 2 +- contracts/zero-ex/package.json | 2 +- .../test/liqudity-providers/curve_test.ts | 3 +- .../test/liqudity-providers/mooniswap_test.ts | 3 +- ...ermissionless_transformer_deployer_test.ts | 3 +- .../zero-ex/test/transformer_deployer_test.ts | 3 +- package.json | 2 +- packages/asset-swapper/package.json | 3 +- .../utils/market_operation_utils/constants.ts | 10 +- packages/contract-addresses/package.json | 2 +- packages/contract-artifacts/package.json | 2 +- packages/contract-wrappers-test/package.json | 2 +- packages/contract-wrappers/package.json | 2 +- packages/migrations/package.json | 2 +- packages/order-utils/package.json | 2 +- packages/order-utils/src/eip712_utils.ts | 2 +- packages/protocol-utils/package.json | 2 +- yarn.lock | 9 +- 50 files changed, 58 insertions(+), 426 deletions(-) delete mode 100644 contracts/asset-proxy/test/dex_forwarder_bridge.ts diff --git a/contracts/asset-proxy/package.json b/contracts/asset-proxy/package.json index 998a825af6..77a97a1dff 100644 --- a/contracts/asset-proxy/package.json +++ b/contracts/asset-proxy/package.json @@ -76,7 +76,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/asset-proxy/test/dex_forwarder_bridge.ts b/contracts/asset-proxy/test/dex_forwarder_bridge.ts deleted file mode 100644 index 2954fea693..0000000000 --- a/contracts/asset-proxy/test/dex_forwarder_bridge.ts +++ /dev/null @@ -1,354 +0,0 @@ -import { ContractTxFunctionObj } from '@0x/contract-wrappers'; -import { - blockchainTests, - constants, - expect, - filterLogsToArguments, - getRandomInteger, - randomAddress, - shortZip, -} from '@0x/contracts-test-utils'; -import { BigNumber, hexUtils, NULL_ADDRESS } from '@0x/utils'; -import { DecodedLogs } from 'ethereum-types'; -import * as _ from 'lodash'; - -import { DexForwarderBridgeCall, dexForwarderBridgeDataEncoder } from '../src/dex_forwarder_bridge'; - -import { artifacts } from './artifacts'; -import { - TestDexForwarderBridgeBridgeTransferFromCalledEventArgs as BtfCalledEventArgs, - TestDexForwarderBridgeContract, - TestDexForwarderBridgeEvents as TestEvents, -} from './wrappers'; - -const { ZERO_AMOUNT } = constants; - -blockchainTests.resets('DexForwarderBridge unit tests', env => { - let testContract: TestDexForwarderBridgeContract; - let inputToken: string; - let outputToken: string; - const BRIDGE_SUCCESS = '0xdc1600f3'; - const BRIDGE_FAILURE = '0xffffffff'; - const BRIDGE_REVERT_ERROR = 'oopsie'; - const NOT_AUTHORIZED_REVERT = 'DexForwarderBridge/SENDER_NOT_AUTHORIZED'; - const DEFAULTS = { - toAddress: randomAddress(), - }; - - before(async () => { - testContract = await TestDexForwarderBridgeContract.deployFrom0xArtifactAsync( - artifacts.TestDexForwarderBridge, - env.provider, - env.txDefaults, - artifacts, - ); - // Create test tokens. - [inputToken, outputToken] = [ - await callAndTransactAsync(testContract.createToken()), - await callAndTransactAsync(testContract.createToken()), - ]; - await callAndTransactAsync(testContract.setAuthorized(env.txDefaults.from as string)); - }); - - async function callAndTransactAsync(fnCall: ContractTxFunctionObj): Promise { - const result = await fnCall.callAsync(); - await fnCall.awaitTransactionSuccessAsync({}, { shouldValidate: false }); - return result; - } - - function getRandomBridgeCall( - bridgeAddress: string, - fields: Partial = {}, - ): DexForwarderBridgeCall { - return { - target: bridgeAddress, - inputTokenAmount: getRandomInteger(1, '100e18'), - outputTokenAmount: getRandomInteger(1, '100e18'), - bridgeData: hexUtils.leftPad(inputToken), - ...fields, - }; - } - - describe('bridgeTransferFrom()', () => { - let goodBridgeCalls: DexForwarderBridgeCall[]; - let revertingBridgeCall: DexForwarderBridgeCall; - let failingBridgeCall: DexForwarderBridgeCall; - let allBridgeCalls: DexForwarderBridgeCall[]; - let totalFillableOutputAmount: BigNumber; - let totalFillableInputAmount: BigNumber; - let recipientOutputBalance: BigNumber; - - beforeEach(async () => { - goodBridgeCalls = []; - for (let i = 0; i < 4; ++i) { - goodBridgeCalls.push(await createBridgeCallAsync({ returnCode: BRIDGE_SUCCESS })); - } - revertingBridgeCall = await createBridgeCallAsync({ revertError: BRIDGE_REVERT_ERROR }); - failingBridgeCall = await createBridgeCallAsync({ returnCode: BRIDGE_FAILURE }); - allBridgeCalls = _.shuffle([failingBridgeCall, revertingBridgeCall, ...goodBridgeCalls]); - - totalFillableInputAmount = BigNumber.sum(...goodBridgeCalls.map(c => c.inputTokenAmount)); - totalFillableOutputAmount = BigNumber.sum(...goodBridgeCalls.map(c => c.outputTokenAmount)); - - // Grant the taker some output tokens. - await testContract.setTokenBalance( - outputToken, - DEFAULTS.toAddress, - (recipientOutputBalance = getRandomInteger(1, '100e18')), - ); - }); - - async function setForwarderInputBalanceAsync(amount: BigNumber): Promise { - await testContract - .setTokenBalance(inputToken, testContract.address, amount) - .awaitTransactionSuccessAsync({}, { shouldValidate: false }); - } - - async function createBridgeCallAsync( - opts: Partial<{ - returnCode: string; - revertError: string; - callFields: Partial; - outputFillAmount: BigNumber; - }>, - ): Promise { - const { returnCode, revertError, callFields, outputFillAmount } = { - returnCode: BRIDGE_SUCCESS, - revertError: '', - ...opts, - }; - const bridge = await callAndTransactAsync(testContract.createBridge(returnCode, revertError)); - const call = getRandomBridgeCall(bridge, callFields); - await testContract - .setBridgeTransferAmount(call.target, outputFillAmount || call.outputTokenAmount) - .awaitTransactionSuccessAsync({}, { shouldValidate: false }); - return call; - } - - async function callBridgeTransferFromAsync(opts: { - bridgeData: string; - sellAmount?: BigNumber; - buyAmount?: BigNumber; - }): Promise { - // Fund the forwarder with input tokens to sell. - await setForwarderInputBalanceAsync(opts.sellAmount || totalFillableInputAmount); - const call = testContract.bridgeTransferFrom( - outputToken, - testContract.address, - DEFAULTS.toAddress, - opts.buyAmount || totalFillableOutputAmount, - opts.bridgeData, - ); - const returnCode = await call.callAsync(); - if (returnCode !== BRIDGE_SUCCESS) { - throw new Error('Expected BRIDGE_SUCCESS'); - } - const receipt = await call.awaitTransactionSuccessAsync({}, { shouldValidate: false }); - // tslint:disable-next-line: no-unnecessary-type-assertion - return receipt.logs as DecodedLogs; - } - - it('succeeds with no bridge calls and no input balance', async () => { - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls: [], - }); - await callBridgeTransferFromAsync({ bridgeData, sellAmount: ZERO_AMOUNT }); - }); - - it('succeeds with bridge calls and no input balance', async () => { - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls: allBridgeCalls, - }); - await callBridgeTransferFromAsync({ bridgeData, sellAmount: ZERO_AMOUNT }); - }); - - it('succeeds with no bridge calls and an input balance', async () => { - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls: [], - }); - await callBridgeTransferFromAsync({ - bridgeData, - sellAmount: new BigNumber(1), - }); - }); - - it('succeeds if entire input token balance is not consumed', async () => { - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls: allBridgeCalls, - }); - await callBridgeTransferFromAsync({ - bridgeData, - sellAmount: totalFillableInputAmount.plus(1), - }); - }); - - it('fails if not authorized', async () => { - const calls = goodBridgeCalls.slice(0, 1); - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls, - }); - await callAndTransactAsync(testContract.setAuthorized(NULL_ADDRESS)); - return expect(callBridgeTransferFromAsync({ bridgeData, sellAmount: new BigNumber(1) })).to.revertWith( - NOT_AUTHORIZED_REVERT, - ); - }); - - it('succeeds with one bridge call', async () => { - const calls = goodBridgeCalls.slice(0, 1); - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls, - }); - await callBridgeTransferFromAsync({ bridgeData, sellAmount: calls[0].inputTokenAmount }); - }); - - it('succeeds with many bridge calls', async () => { - const calls = goodBridgeCalls; - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls, - }); - await callBridgeTransferFromAsync({ bridgeData }); - }); - - it('swallows a failing bridge call', async () => { - const calls = _.shuffle([...goodBridgeCalls, failingBridgeCall]); - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls, - }); - await callBridgeTransferFromAsync({ bridgeData }); - }); - - it('consumes input tokens for output tokens', async () => { - const calls = allBridgeCalls; - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls, - }); - await callBridgeTransferFromAsync({ bridgeData }); - const currentBridgeInputBalance = await testContract - .balanceOf(inputToken, testContract.address) - .callAsync(); - expect(currentBridgeInputBalance).to.bignumber.eq(0); - const currentRecipientOutputBalance = await testContract - .balanceOf(outputToken, DEFAULTS.toAddress) - .callAsync(); - expect(currentRecipientOutputBalance).to.bignumber.eq(totalFillableOutputAmount); - }); - - it("transfers only up to each call's input amount to each bridge", async () => { - const calls = goodBridgeCalls; - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls, - }); - const logs = await callBridgeTransferFromAsync({ bridgeData }); - const btfs = filterLogsToArguments(logs, TestEvents.BridgeTransferFromCalled); - for (const [call, btf] of shortZip(goodBridgeCalls, btfs)) { - expect(btf.inputTokenBalance).to.bignumber.eq(call.inputTokenAmount); - } - }); - - it('transfers only up to outstanding sell amount to each bridge', async () => { - // Prepend an extra bridge call. - const calls = [ - await createBridgeCallAsync({ - callFields: { - inputTokenAmount: new BigNumber(1), - outputTokenAmount: new BigNumber(1), - }, - }), - ...goodBridgeCalls, - ]; - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls, - }); - const logs = await callBridgeTransferFromAsync({ bridgeData }); - const btfs = filterLogsToArguments(logs, TestEvents.BridgeTransferFromCalled); - expect(btfs).to.be.length(goodBridgeCalls.length + 1); - // The last call will receive 1 less token. - const lastCall = calls.slice(-1)[0]; - const lastBtf = btfs.slice(-1)[0]; - expect(lastBtf.inputTokenBalance).to.bignumber.eq(lastCall.inputTokenAmount.minus(1)); - }); - - it('recoups funds from a bridge that fails', async () => { - // Prepend a call that will take the whole input amount but will - // fail. - const badCall = await createBridgeCallAsync({ - callFields: { inputTokenAmount: totalFillableInputAmount }, - returnCode: BRIDGE_FAILURE, - }); - const calls = [badCall, ...goodBridgeCalls]; - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls, - }); - const logs = await callBridgeTransferFromAsync({ bridgeData }); - const btfs = filterLogsToArguments(logs, TestEvents.BridgeTransferFromCalled); - expect(btfs).to.be.length(goodBridgeCalls.length); - }); - - it('recoups funds from a bridge that reverts', async () => { - // Prepend a call that will take the whole input amount but will - // revert. - const badCall = await createBridgeCallAsync({ - callFields: { inputTokenAmount: totalFillableInputAmount }, - revertError: BRIDGE_REVERT_ERROR, - }); - const calls = [badCall, ...goodBridgeCalls]; - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls, - }); - const logs = await callBridgeTransferFromAsync({ bridgeData }); - const btfs = filterLogsToArguments(logs, TestEvents.BridgeTransferFromCalled); - expect(btfs).to.be.length(goodBridgeCalls.length); - }); - - it('recoups funds from a bridge that under-pays', async () => { - // Prepend a call that will take the whole input amount but will - // underpay the output amount.. - const badCall = await createBridgeCallAsync({ - callFields: { - inputTokenAmount: totalFillableInputAmount, - outputTokenAmount: new BigNumber(2), - }, - outputFillAmount: new BigNumber(1), - }); - const calls = [badCall, ...goodBridgeCalls]; - const bridgeData = dexForwarderBridgeDataEncoder.encode({ - inputToken, - calls, - }); - const logs = await callBridgeTransferFromAsync({ bridgeData }); - const btfs = filterLogsToArguments(logs, TestEvents.BridgeTransferFromCalled); - expect(btfs).to.be.length(goodBridgeCalls.length); - }); - }); - - describe('executeBridgeCall()', () => { - it('cannot be called externally', async () => { - return expect( - testContract - .executeBridgeCall( - randomAddress(), - randomAddress(), - randomAddress(), - randomAddress(), - new BigNumber(1), - new BigNumber(1), - constants.NULL_BYTES, - ) - .callAsync(), - ).to.revertWith('DexForwarderBridge/ONLY_SELF'); - }); - }); -}); diff --git a/contracts/broker/package.json b/contracts/broker/package.json index da5015d4ea..0c29bfe3e5 100644 --- a/contracts/broker/package.json +++ b/contracts/broker/package.json @@ -81,7 +81,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/coordinator/package.json b/contracts/coordinator/package.json index c16b142f59..566e24b2b8 100644 --- a/contracts/coordinator/package.json +++ b/contracts/coordinator/package.json @@ -79,7 +79,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/assert": "^3.0.21", diff --git a/contracts/dev-utils/package.json b/contracts/dev-utils/package.json index cf5e9e9354..963d57c35a 100644 --- a/contracts/dev-utils/package.json +++ b/contracts/dev-utils/package.json @@ -60,7 +60,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/erc1155/package.json b/contracts/erc1155/package.json index 8149d28f9f..f8c0d4b75b 100644 --- a/contracts/erc1155/package.json +++ b/contracts/erc1155/package.json @@ -77,7 +77,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/erc20/package.json b/contracts/erc20/package.json index 6dd58c2b80..468ac33149 100644 --- a/contracts/erc20/package.json +++ b/contracts/erc20/package.json @@ -79,7 +79,7 @@ "solhint": "^1.4.1", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18" diff --git a/contracts/erc20/test/weth9.ts b/contracts/erc20/test/weth9.ts index f6595b3735..f6b4f9fd47 100644 --- a/contracts/erc20/test/weth9.ts +++ b/contracts/erc20/test/weth9.ts @@ -39,8 +39,8 @@ describe('EtherToken', () => { artifacts.WETH9, provider, { - gasPrice, ...txDefaults, + gasPrice, }, artifacts, ); diff --git a/contracts/erc721/package.json b/contracts/erc721/package.json index 60a05d0db3..14e87888ae 100644 --- a/contracts/erc721/package.json +++ b/contracts/erc721/package.json @@ -81,7 +81,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18" diff --git a/contracts/exchange-forwarder/package.json b/contracts/exchange-forwarder/package.json index d99f76d848..b97eb06b4b 100644 --- a/contracts/exchange-forwarder/package.json +++ b/contracts/exchange-forwarder/package.json @@ -87,7 +87,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/exchange-libs/package.json b/contracts/exchange-libs/package.json index 19ea778a84..da337a77d0 100644 --- a/contracts/exchange-libs/package.json +++ b/contracts/exchange-libs/package.json @@ -77,7 +77,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/exchange/package.json b/contracts/exchange/package.json index 25f009a048..6554a1e78d 100644 --- a/contracts/exchange/package.json +++ b/contracts/exchange/package.json @@ -85,7 +85,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/exchange/test/utils/abstract/abstract_balance_and_proxy_allowance_fetcher.ts b/contracts/exchange/test/utils/abstract/abstract_balance_and_proxy_allowance_fetcher.ts index 13fbf17366..ed0ff53b49 100644 --- a/contracts/exchange/test/utils/abstract/abstract_balance_and_proxy_allowance_fetcher.ts +++ b/contracts/exchange/test/utils/abstract/abstract_balance_and_proxy_allowance_fetcher.ts @@ -12,12 +12,12 @@ export abstract class AbstractBalanceAndProxyAllowanceFetcher { * @param userAddress Ethereum address for which to fetch the balance * @return Balance amount in base units */ - public abstract async getBalanceAsync(assetData: string, userAddress: string): Promise; + public abstract getBalanceAsync(assetData: string, userAddress: string): Promise; /** * Get the 0x asset proxy allowance of assetData for userAddress * @param assetData AssetData for which to fetch the allowance * @param userAddress Ethereum address for which to fetch the allowance * @return Allowance amount in base units */ - public abstract async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise; + public abstract getProxyAllowanceAsync(assetData: string, userAddress: string): Promise; } diff --git a/contracts/exchange/test/utils/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts b/contracts/exchange/test/utils/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts index 0a73e92bd6..c36b9cd4b6 100644 --- a/contracts/exchange/test/utils/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts +++ b/contracts/exchange/test/utils/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts @@ -1,8 +1,8 @@ import { BigNumber } from '@0x/utils'; export abstract class AbstractBalanceAndProxyAllowanceLazyStore { - public abstract async getBalanceAsync(assetData: string, userAddress: string): Promise; - public abstract async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise; + public abstract getBalanceAsync(assetData: string, userAddress: string): Promise; + public abstract getProxyAllowanceAsync(assetData: string, userAddress: string): Promise; public abstract setBalance(assetData: string, userAddress: string, balance: BigNumber): void; public abstract deleteBalance(assetData: string, userAddress: string): void; public abstract setProxyAllowance(assetData: string, userAddress: string, proxyAllowance: BigNumber): void; diff --git a/contracts/exchange/test/utils/abstract/abstract_order_filled_cancelled_fetcher.ts b/contracts/exchange/test/utils/abstract/abstract_order_filled_cancelled_fetcher.ts index 8a73e54fee..6e801fef73 100644 --- a/contracts/exchange/test/utils/abstract/abstract_order_filled_cancelled_fetcher.ts +++ b/contracts/exchange/test/utils/abstract/abstract_order_filled_cancelled_fetcher.ts @@ -11,5 +11,5 @@ export abstract class AbstractOrderFilledCancelledFetcher { * @param orderHash OrderHash of order we are interested in * @return FilledTakerAmount */ - public abstract async getFilledTakerAmountAsync(orderHash: string): Promise; + public abstract getFilledTakerAmountAsync(orderHash: string): Promise; } diff --git a/contracts/exchange/test/utils/abstract/abstract_order_filled_cancelled_lazy_store.ts b/contracts/exchange/test/utils/abstract/abstract_order_filled_cancelled_lazy_store.ts index 06b7799ff3..968d510eb0 100644 --- a/contracts/exchange/test/utils/abstract/abstract_order_filled_cancelled_lazy_store.ts +++ b/contracts/exchange/test/utils/abstract/abstract_order_filled_cancelled_lazy_store.ts @@ -1,7 +1,7 @@ import { BigNumber } from '@0x/utils'; export abstract class AbstractOrderFilledCancelledLazyStore { - public abstract async getFilledTakerAmountAsync(orderHash: string): Promise; + public abstract getFilledTakerAmountAsync(orderHash: string): Promise; public abstract setFilledTakerAmount(orderHash: string, balance: BigNumber): void; public abstract deleteFilledTakerAmount(orderHash: string): void; public abstract setIsCancelled(orderHash: string, isCancelled: boolean): void; diff --git a/contracts/exchange/test/utils/isolated_exchange_wrapper.ts b/contracts/exchange/test/utils/isolated_exchange_wrapper.ts index c89fc5af6a..0ad7574f65 100644 --- a/contracts/exchange/test/utils/isolated_exchange_wrapper.ts +++ b/contracts/exchange/test/utils/isolated_exchange_wrapper.ts @@ -18,6 +18,7 @@ import { IsolatedExchangeFillEventArgs as FillEventArgs, } from '../wrappers'; +export { Order } from '@0x/types'; export interface AssetBalances { [assetData: string]: { [address: string]: BigNumber }; } @@ -27,7 +28,6 @@ export interface IsolatedExchangeEvents { transferFromCalls: DispatchTransferFromCallArgs[]; } -export type Order = Order; export type Numberish = string | number | BigNumber; export const DEFAULT_GOOD_SIGNATURE = createGoodSignature(); diff --git a/contracts/extensions/package.json b/contracts/extensions/package.json index 626e04f714..6731467809 100644 --- a/contracts/extensions/package.json +++ b/contracts/extensions/package.json @@ -87,7 +87,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/integrations/package.json b/contracts/integrations/package.json index f72f2cfd23..22e1ef97a5 100644 --- a/contracts/integrations/package.json +++ b/contracts/integrations/package.json @@ -90,7 +90,7 @@ "solhint": "^1.4.1", "truffle": "^5.0.32", "tslint": "5.11.0", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/asset-swapper": "^6.3.0", diff --git a/contracts/integrations/test/dev-utils/dydx_order_validation_test.ts b/contracts/integrations/test/dev-utils/dydx_order_validation_test.ts index 102a7869ad..3951e716d4 100644 --- a/contracts/integrations/test/dev-utils/dydx_order_validation_test.ts +++ b/contracts/integrations/test/dev-utils/dydx_order_validation_test.ts @@ -63,11 +63,9 @@ blockchainTests.fork('DevUtils dydx order validation tests', env => { let dai: ERC20TokenContract; let usdc: ERC20TokenContract; let devUtils: DevUtilsContract; - let accountOwner: string; let minMarginRatio: number; before(async () => { - [accountOwner] = await env.getAccountAddressesAsync(); dydx = new IDydxContract(DYDX_ADDRESS, env.provider, env.txDefaults); dai = new ERC20TokenContract(DAI_ADDRESS, env.provider, env.txDefaults); usdc = new ERC20TokenContract(USDC_ADDRESS, env.provider, env.txDefaults); diff --git a/contracts/integrations/test/framework/actors/utils.ts b/contracts/integrations/test/framework/actors/utils.ts index b958a1b216..6b397de773 100644 --- a/contracts/integrations/test/framework/actors/utils.ts +++ b/contracts/integrations/test/framework/actors/utils.ts @@ -19,5 +19,5 @@ export function filterActorsByRole( actors: Actor[], role: TClass, ): Array> { - return actors.filter(actor => actor.mixins.includes(role.name)) as InstanceType; + return actors.filter(actor => actor.mixins.includes(role.name)) as Array>; } diff --git a/contracts/multisig/package.json b/contracts/multisig/package.json index 2edbf447e4..d04221b750 100644 --- a/contracts/multisig/package.json +++ b/contracts/multisig/package.json @@ -75,7 +75,7 @@ "shx": "^0.2.2", "solhint": "^1.4.1", "tslint": "5.11.0", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/staking/package.json b/contracts/staking/package.json index 05dfed7f1e..9780571c5d 100644 --- a/contracts/staking/package.json +++ b/contracts/staking/package.json @@ -84,7 +84,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/staking/src/types.ts b/contracts/staking/src/types.ts index 9dab65af6d..5955646639 100644 --- a/contracts/staking/src/types.ts +++ b/contracts/staking/src/types.ts @@ -4,6 +4,7 @@ import { DecodedLogArgs, LogWithDecodedArgs } from 'ethereum-types'; import { constants as stakingConstants } from './constants'; +export { Numberish } from '@0x/contracts-test-utils'; // tslint:disable:max-classes-per-file export interface StakingParams { @@ -259,5 +260,3 @@ export class AggregatedStats { export interface AggregatedStatsByEpoch { [epoch: string]: AggregatedStats; } - -export type Numberish = Numberish; diff --git a/contracts/staking/test/unit_tests/exchange_test.ts b/contracts/staking/test/unit_tests/exchange_test.ts index 9e769c8630..5e7631ecd3 100644 --- a/contracts/staking/test/unit_tests/exchange_test.ts +++ b/contracts/staking/test/unit_tests/exchange_test.ts @@ -12,7 +12,6 @@ import { blockchainTests.resets('Exchange Unit Tests', env => { // Addresses - let nonOwner: string; let owner: string; let nonExchange: string; let exchange: string; @@ -24,7 +23,7 @@ blockchainTests.resets('Exchange Unit Tests', env => { before(async () => { // Set up addresses for testing. - [nonOwner, owner, nonExchange, exchange, nonAuthority, authority] = await env.getAccountAddressesAsync(); + [, owner, nonExchange, exchange, nonAuthority, authority] = await env.getAccountAddressesAsync(); // Deploy the Exchange Manager contract. exchangeManager = await TestExchangeManagerContract.deployFrom0xArtifactAsync( diff --git a/contracts/staking/test/unit_tests/finalizer_test.ts b/contracts/staking/test/unit_tests/finalizer_test.ts index d48a7fd22f..1c873f3a1c 100644 --- a/contracts/staking/test/unit_tests/finalizer_test.ts +++ b/contracts/staking/test/unit_tests/finalizer_test.ts @@ -543,7 +543,7 @@ blockchainTests.resets('Finalizer unit tests', env => { const expectedPoolRewards = await calculatePoolRewardsAsync(INITIAL_BALANCE, pools); const [pool, reward] = _.sampleSize(shortZip(pools, expectedPoolRewards), 1)[0]; return assertUnfinalizedPoolRewardsAsync(pool.poolId, { - totalReward: (reward as any) as BigNumber, + totalReward: reward, membersStake: pool.membersStake, }); }); diff --git a/contracts/staking/test/unit_tests/lib_cobb_douglas_test.ts b/contracts/staking/test/unit_tests/lib_cobb_douglas_test.ts index f6ac06d60f..58d1fa5af1 100644 --- a/contracts/staking/test/unit_tests/lib_cobb_douglas_test.ts +++ b/contracts/staking/test/unit_tests/lib_cobb_douglas_test.ts @@ -12,17 +12,13 @@ import * as _ from 'lodash'; import { artifacts } from '../artifacts'; import { TestCobbDouglasContract } from '../wrappers'; -// tslint:disable: no-unnecessary-type-assertion blockchainTests('LibCobbDouglas unit tests', env => { const FUZZ_COUNT = 1024; const PRECISION = 15; let testContract: TestCobbDouglasContract; - let ownerAddress: string; - let notOwnerAddress: string; before(async () => { - [ownerAddress, notOwnerAddress] = await env.getAccountAddressesAsync(); testContract = await TestCobbDouglasContract.deployFrom0xArtifactAsync( artifacts.TestCobbDouglas, env.provider, @@ -211,4 +207,3 @@ blockchainTests('LibCobbDouglas unit tests', env => { }); }); }); -// tslint:enable:no-unnecessary-type-assertion diff --git a/contracts/test-utils/package.json b/contracts/test-utils/package.json index 6ac2ee0227..26b7c6f1f7 100644 --- a/contracts/test-utils/package.json +++ b/contracts/test-utils/package.json @@ -39,7 +39,7 @@ "npm-run-all": "^4.1.2", "shx": "^0.2.2", "tslint": "5.11.0", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/assert": "^3.0.21", diff --git a/contracts/test-utils/src/lang_utils.ts b/contracts/test-utils/src/lang_utils.ts index 484ccd555f..37fc3102ba 100644 --- a/contracts/test-utils/src/lang_utils.ts +++ b/contracts/test-utils/src/lang_utils.ts @@ -14,6 +14,6 @@ export function shortZip(a: T1[], b: T2[]): Array<[T1, T2]> { export function replaceKeysDeep(obj: {}, mapKeys: (key: string) => string | void): _.Dictionary<{}> { return _.transform(obj, (result, value, key) => { const currentKey = mapKeys(key) || key; - result[currentKey] = _.isObject(value) ? replaceKeysDeep(value, mapKeys) : value; + result[currentKey] = _.isObject(value) ? replaceKeysDeep(value as {}, mapKeys) : (value as {}); }); } diff --git a/contracts/test-utils/src/order_factory.ts b/contracts/test-utils/src/order_factory.ts index 767fa697be..d06fe43c6b 100644 --- a/contracts/test-utils/src/order_factory.ts +++ b/contracts/test-utils/src/order_factory.ts @@ -22,14 +22,14 @@ export class OrderFactory { ): Promise { const fifteenMinutesInSeconds = 15 * 60; const currentBlockTimestamp = await getLatestBlockTimestampAsync(); - const order = ({ + const order = { takerAddress: constants.NULL_ADDRESS, senderAddress: constants.NULL_ADDRESS, expirationTimeSeconds: new BigNumber(currentBlockTimestamp).plus(fifteenMinutesInSeconds), salt: generatePseudoRandomSalt(), ...this._defaultOrderParams, ...customOrderParams, - } as any) as Order; + } as Order; // tslint:disable-line:no-object-literal-type-assertion const orderHashBuff = orderHashUtils.getOrderHashBuffer(order); const signature = signingUtils.signMessage(orderHashBuff, this._privateKey, signatureType); const signedOrder = { diff --git a/contracts/test-utils/src/order_utils.ts b/contracts/test-utils/src/order_utils.ts index 16cb9657b1..47d87d9bd2 100644 --- a/contracts/test-utils/src/order_utils.ts +++ b/contracts/test-utils/src/order_utils.ts @@ -30,7 +30,8 @@ export const orderUtils = { return cancel; }, createOrderWithoutSignature(signedOrder: SignedOrder): Order { - return _.omit(signedOrder, ['signature']) as Order; + const { signature, ...order } = signedOrder; + return order; }, createBatchMatchOrders(signedOrdersLeft: SignedOrder[], signedOrdersRight: SignedOrder[]): BatchMatchOrder { return { diff --git a/contracts/treasury/package.json b/contracts/treasury/package.json index 7e9444dafe..7a44277cea 100644 --- a/contracts/treasury/package.json +++ b/contracts/treasury/package.json @@ -69,7 +69,7 @@ "solhint": "^1.4.1", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/utils/package.json b/contracts/utils/package.json index 35d3497536..d87fb1a6eb 100644 --- a/contracts/utils/package.json +++ b/contracts/utils/package.json @@ -76,7 +76,7 @@ "solhint": "^1.4.1", "truffle": "^5.0.32", "tslint": "5.11.0", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/zero-ex/package.json b/contracts/zero-ex/package.json index 46b7f94c2a..176dcf0d1b 100644 --- a/contracts/zero-ex/package.json +++ b/contracts/zero-ex/package.json @@ -79,7 +79,7 @@ "truffle": "^5.0.32", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/base-contract": "^6.2.18", diff --git a/contracts/zero-ex/test/liqudity-providers/curve_test.ts b/contracts/zero-ex/test/liqudity-providers/curve_test.ts index 0d70d4b63a..89edb045cc 100644 --- a/contracts/zero-ex/test/liqudity-providers/curve_test.ts +++ b/contracts/zero-ex/test/liqudity-providers/curve_test.ts @@ -9,7 +9,6 @@ blockchainTests.resets('CurveLiquidityProvider feature', env => { let sellToken: TestMintableERC20TokenContract; let buyToken: TestMintableERC20TokenContract; let testCurve: TestCurveContract; - let owner: string; let taker: string; const RECIPIENT = hexUtils.random(20); const SELL_AMOUNT = getRandomInteger('1e6', '1e18'); @@ -24,7 +23,7 @@ blockchainTests.resets('CurveLiquidityProvider feature', env => { const { ZERO_AMOUNT } = constants; before(async () => { - [owner, taker] = await env.getAccountAddressesAsync(); + [, taker] = await env.getAccountAddressesAsync(); [sellToken, buyToken] = await Promise.all( new Array(2) .fill(0) diff --git a/contracts/zero-ex/test/liqudity-providers/mooniswap_test.ts b/contracts/zero-ex/test/liqudity-providers/mooniswap_test.ts index 88d849b3ee..030896bd78 100644 --- a/contracts/zero-ex/test/liqudity-providers/mooniswap_test.ts +++ b/contracts/zero-ex/test/liqudity-providers/mooniswap_test.ts @@ -15,7 +15,6 @@ blockchainTests.resets('MooniswapLiquidityProvider feature', env => { let buyToken: TestMintableERC20TokenContract; let weth: TestWethContract; let testMooniswap: TestMooniswapContract; - let owner: string; let taker: string; let mooniswapData: string; const RECIPIENT = hexUtils.random(20); @@ -25,7 +24,7 @@ blockchainTests.resets('MooniswapLiquidityProvider feature', env => { const BUY_AMOUNT = getRandomInteger('1e18', '10e18'); before(async () => { - [owner, taker] = await env.getAccountAddressesAsync(); + [, taker] = await env.getAccountAddressesAsync(); [sellToken, buyToken] = await Promise.all( new Array(2) .fill(0) diff --git a/contracts/zero-ex/test/permissionless_transformer_deployer_test.ts b/contracts/zero-ex/test/permissionless_transformer_deployer_test.ts index ef4ee76c36..1773d34236 100644 --- a/contracts/zero-ex/test/permissionless_transformer_deployer_test.ts +++ b/contracts/zero-ex/test/permissionless_transformer_deployer_test.ts @@ -10,13 +10,12 @@ import { } from './wrappers'; blockchainTests.resets('PermissionlessTransformerDeployer', env => { - let owner: string; let sender: string; let deployer: PermissionlessTransformerDeployerContract; const deployBytes = artifacts.TestPermissionlessTransformerDeployerTransformer.compilerOutput.evm.bytecode.object; before(async () => { - [owner, sender] = await env.getAccountAddressesAsync(); + [, sender] = await env.getAccountAddressesAsync(); deployer = await PermissionlessTransformerDeployerContract.deployFrom0xArtifactAsync( artifacts.PermissionlessTransformerDeployer, env.provider, diff --git a/contracts/zero-ex/test/transformer_deployer_test.ts b/contracts/zero-ex/test/transformer_deployer_test.ts index 2d6f614102..6e423b9298 100644 --- a/contracts/zero-ex/test/transformer_deployer_test.ts +++ b/contracts/zero-ex/test/transformer_deployer_test.ts @@ -9,13 +9,12 @@ import { } from './wrappers'; blockchainTests.resets('TransformerDeployer', env => { - let owner: string; let authority: string; let deployer: TransformerDeployerContract; const deployBytes = artifacts.TestTransformerDeployerTransformer.compilerOutput.evm.bytecode.object; before(async () => { - [owner, authority] = await env.getAccountAddressesAsync(); + [, authority] = await env.getAccountAddressesAsync(); deployer = await TransformerDeployerContract.deployFrom0xArtifactAsync( artifacts.TransformerDeployer, env.provider, diff --git a/package.json b/package.json index 00ee8ccf72..93f5ed4282 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "npm-run-all": "^4.1.2", "prettier": "~1.16.3", "source-map-support": "^0.5.6", - "typescript": "3.0.1", + "typescript": "4.2.2", "wsrun": "^2.2.0" }, "resolutions": { diff --git a/packages/asset-swapper/package.json b/packages/asset-swapper/package.json index e41968c43e..629f128fb4 100644 --- a/packages/asset-swapper/package.json +++ b/packages/asset-swapper/package.json @@ -89,7 +89,6 @@ "devDependencies": { "@0x/base-contract": "^6.2.18", "@0x/contracts-asset-proxy": "^3.7.8", - "@0x/contracts-erc20": "^3.3.4", "@0x/contracts-exchange": "^3.2.27", "@0x/contracts-exchange-libs": "^4.3.26", "@0x/contracts-gen": "^2.0.32", @@ -118,7 +117,7 @@ "tslint": "5.11.0", "typedoc": "~0.16.11", "typemoq": "^2.1.0", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "publishConfig": { "access": "public" diff --git a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts index f0fe469633..f8d09491e3 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/constants.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/constants.ts @@ -104,16 +104,14 @@ export const FEE_QUOTE_SOURCES = [ERC20BridgeSource.Uniswap, ERC20BridgeSource.U // HACK(mzhu25): Limit and RFQ orders need to be treated as different sources // when computing the exchange proxy gas overhead. -export const SOURCE_FLAGS: { [source in ERC20BridgeSource]: number } & { +export const SOURCE_FLAGS: { [key in ERC20BridgeSource]: number } & { RfqOrder: number; LimitOrder: number; } = Object.assign( {}, - ...['RfqOrder', 'LimitOrder', ...Object.values(ERC20BridgeSource)].map( - (source: ERC20BridgeSource | 'RfqOrder' | 'LimitOrder', index) => ({ - [source]: source === ERC20BridgeSource.Native ? 0 : 1 << index, - }), - ), + ...['RfqOrder', 'LimitOrder', ...Object.values(ERC20BridgeSource)].map((source, index) => ({ + [source]: source === ERC20BridgeSource.Native ? 0 : 1 << index, + })), ); const MIRROR_WRAPPED_TOKENS = { diff --git a/packages/contract-addresses/package.json b/packages/contract-addresses/package.json index a3dcd88fb4..2d4ceefa96 100644 --- a/packages/contract-addresses/package.json +++ b/packages/contract-addresses/package.json @@ -30,7 +30,7 @@ "devDependencies": { "gitpkg": "https://github.com/0xProject/gitpkg.git", "shx": "^0.2.2", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "publishConfig": { "access": "public" diff --git a/packages/contract-artifacts/package.json b/packages/contract-artifacts/package.json index 860fc9237d..be626c778e 100644 --- a/packages/contract-artifacts/package.json +++ b/packages/contract-artifacts/package.json @@ -36,7 +36,7 @@ "lodash": "^4.17.11", "mocha": "^6.2.0", "shx": "^0.2.2", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "publishConfig": { "access": "public" diff --git a/packages/contract-wrappers-test/package.json b/packages/contract-wrappers-test/package.json index 56d70ccdb5..58fdd49367 100644 --- a/packages/contract-wrappers-test/package.json +++ b/packages/contract-wrappers-test/package.json @@ -48,7 +48,7 @@ "mocha": "^6.2.0", "shx": "^0.2.2", "tslint": "5.11.0", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "private": true, "publishConfig": { diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json index 32e7d2897b..f91a08ca27 100644 --- a/packages/contract-wrappers/package.json +++ b/packages/contract-wrappers/package.json @@ -52,7 +52,7 @@ "gitpkg": "https://github.com/0xProject/gitpkg.git", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1" + "typescript": "4.2.2" }, "dependencies": { "@0x/assert": "^3.0.21", diff --git a/packages/migrations/package.json b/packages/migrations/package.json index e2e136503f..d7345be421 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -62,7 +62,7 @@ "shx": "^0.2.2", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1", + "typescript": "4.2.2", "web3-provider-engine": "14.0.6", "yargs": "^10.0.3" }, diff --git a/packages/order-utils/package.json b/packages/order-utils/package.json index 8da44c650f..e451a14c27 100644 --- a/packages/order-utils/package.json +++ b/packages/order-utils/package.json @@ -64,7 +64,7 @@ "sinon": "^4.0.0", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1", + "typescript": "4.2.2", "web3-provider-engine": "14.0.6" }, "dependencies": { diff --git a/packages/order-utils/src/eip712_utils.ts b/packages/order-utils/src/eip712_utils.ts index 1ab3576cdc..b2183716f1 100644 --- a/packages/order-utils/src/eip712_utils.ts +++ b/packages/order-utils/src/eip712_utils.ts @@ -142,7 +142,7 @@ export const eip712Utils = { _.omit(mtx, 'domain'), // tslint:disable-next-line: custom-no-magic-numbers v => (BigNumber.isBigNumber(v) ? v.toString(10) : v), - ) as EIP712Object, + ) as EIP712Object, // tslint:disable-line:no-unnecessary-type-assertion { ...constants.MAINNET_EXCHANGE_PROXY_DOMAIN, ...mtx.domain, diff --git a/packages/protocol-utils/package.json b/packages/protocol-utils/package.json index 39f7be163d..caa49b40cc 100644 --- a/packages/protocol-utils/package.json +++ b/packages/protocol-utils/package.json @@ -58,7 +58,7 @@ "sinon": "^4.0.0", "tslint": "5.11.0", "typedoc": "~0.16.11", - "typescript": "3.0.1", + "typescript": "4.2.2", "web3-provider-engine": "14.0.6" }, "dependencies": { diff --git a/yarn.lock b/yarn.lock index 730096055a..5d742e4cf8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12338,14 +12338,15 @@ typeorm@0.2.7: yargonaut "^1.1.2" yargs "^11.1.0" -typescript@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb" - typescript@3.7.x: version "3.7.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" +typescript@4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.2.tgz#1450f020618f872db0ea17317d16d8da8ddb8c4c" + integrity sha512-tbb+NVrLfnsJy3M59lsDgrzWIflR4d4TIUjz+heUnHZwdF7YsrMTKoRERiIvI2lvBG95dfpLxB21WZhys1bgaQ== + typescript@^3.8.3: version "3.9.7" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa"