diff --git a/.github/workflows/test-and-publish.yaml b/.github/workflows/test-and-publish.yaml index 46898512..1dc495ca 100644 --- a/.github/workflows/test-and-publish.yaml +++ b/.github/workflows/test-and-publish.yaml @@ -15,19 +15,26 @@ jobs: - id: auth name: Authenticate to Google Cloud - uses: google-github-actions/auth@v0 + uses: google-github-actions/auth@v1.1.1 with: workload_identity_provider: projects/1000420590118/locations/global/workloadIdentityPools/github-workflows/providers/github-workflows service_account: github-workflows@dvf-deversifi-dev.iam.gserviceaccount.com - - uses: cachix/install-nix-action@v19 + - uses: cachix/install-nix-action@v20 with: nix_path: nixpkgs=channel:nixos-unstable extra_nix_config: | experimental-features = nix-command + - id: secrets + uses: google-github-actions/get-secretmanager-secrets@v1.0.1 + with: + secrets: github_token:dvf-shared/GITHUB_TOKEN_ALL_REPOS_READ + - name: Bootstrap nix config - run: echo ${{ secrets.CI_GITHUB_TOKEN }} | ./nix/netrc-create.sh + env: + GITHUB_TOKEN: '${{ steps.secrets.outputs.github_token }}' + run: ./nix/netrc-create.sh - name: Run pr-step run: nix run --impure -f nix/pkgs-private.nix ci.pr-step diff --git a/env/test b/env/test index 21ed6a74..9971f5d0 100644 --- a/env/test +++ b/env/test @@ -1,5 +1,5 @@ # Add Web3 url -RPC_URL=https://ropsten.infura.io/v3/7bfab7398ae84af3b1b70c955cfd9491 +RPC_URL=https://goerli.infura.io/v3/3d572ae9b01e45c789c3214696bb02d4 # Add GAS STATION API KEY # Ethereum private key prefixed with 0x PRIVATE_ETH_KEY=0x49e4d1e2aa7d026188251392dd2d335c176d846d8a894a8092c835f3b345e2ad diff --git a/examples/00.setup.js b/examples/00.setup.js index 5b835beb..9fdbe5da 100755 --- a/examples/00.setup.js +++ b/examples/00.setup.js @@ -8,7 +8,7 @@ const fs = require('fs') const readline = require('readline') const Web3 = require('web3') -const P = require('aigle') +const P = require('@rhino.fi/aigle') const saveAsJson = require('./helpers/saveAsJson') const RPC_URL = process.argv[2] diff --git a/examples/08.cancelOrder.js b/examples/08.cancelOrder.js index a3047980..239e0260 100755 --- a/examples/08.cancelOrder.js +++ b/examples/08.cancelOrder.js @@ -40,7 +40,7 @@ const rhinofiConfig = { ;(async () => { const rhinofi = await RhinofiClientFactory(web3, rhinofiConfig) - const P = require('aigle') + const P = require('@rhino.fi/aigle') let order const orders = await rhinofi.getOrders() diff --git a/examples/25.fastWithdrawalFee.js b/examples/25.fastWithdrawalFee.js index 7097bc73..d9f98478 100755 --- a/examples/25.fastWithdrawalFee.js +++ b/examples/25.fastWithdrawalFee.js @@ -40,6 +40,7 @@ const rhinofiConfig = { ;(async () => { const rhinofi = await RhinofiClientFactory(web3, rhinofiConfig) + // NOTE: fastWithdrawalFee method as been deprecated const response = await rhinofi.fastWithdrawalFee('ETH') logExampleResult(response) diff --git a/examples/28.ammWithdrawal.js b/examples/28.ammWithdrawal.js index 000ce6e4..e85ce868 100755 --- a/examples/28.ammWithdrawal.js +++ b/examples/28.ammWithdrawal.js @@ -67,7 +67,7 @@ const rhinofiConfig = { ammDepositOrderData ) - const P = require('aigle') + const P = require('@rhino.fi/aigle') await P.retry( { times: 360, interval: 1000 }, diff --git a/examples/33.generateL1RegistrationPayload.js b/examples/33.generateL1RegistrationPayload.js new file mode 100755 index 00000000..613d109e --- /dev/null +++ b/examples/33.generateL1RegistrationPayload.js @@ -0,0 +1,65 @@ +#!/usr/bin/env -S yarn node +/* eslint-disable no-unused-vars */ + +/* +DO NOT EDIT THIS FILE BY HAND! +Examples are generated using helpers/buildExamples.js script. +Check README.md for more details. +*/ + +const sw = require('@rhino.fi/starkware-crypto') +const getWeb3 = require('./helpers/getWeb3') + +const RhinofiClientFactory = require('../src') +const envVars = require('./helpers/loadFromEnvOrConfig')( + process.env.CONFIG_FILE_NAME +) +const logExampleResult = require('./helpers/logExampleResult')(__filename) + +const ethPrivKey = envVars.ETH_PRIVATE_KEY +// NOTE: you can also generate a new key using:` +// const starkPrivKey = rhinofi.stark.createPrivateKey() +const starkPrivKey = envVars.STARK_PRIVATE_KEY +const rpcUrl = envVars.RPC_URL + +const { web3, provider } = getWeb3(ethPrivKey, rpcUrl) + +const rhinofiConfig = { + api: envVars.API_URL, + dataApi: envVars.DATA_API_URL, + useAuthHeader: true, + wallet: { + type: 'tradingKey', + meta: { + starkPrivateKey: starkPrivKey + } + } + // Add more variables to override default values +} + +;(async () => { + const rhinofi = await RhinofiClientFactory(web3, rhinofiConfig) + + const { starkKeyHex, ethAddress } = await rhinofi.getUserConfig() + + const l1RegistrationSignature = await rhinofi.stark.signRegistration( + ethAddress + ) + + const callData = await rhinofi.stark.l1RegistrationCallData( + starkKeyHex, + ethAddress, + l1RegistrationSignature + ) + + logExampleResult({ + ethAddress, + starkKeyHex, + sig: l1RegistrationSignature, + callData + }) +})() +.catch(error => { + console.error(error) + process.exit(1) +}) diff --git a/examples/34.estimatedNextBatchTime.js b/examples/34.estimatedNextBatchTime.js new file mode 100755 index 00000000..725d80af --- /dev/null +++ b/examples/34.estimatedNextBatchTime.js @@ -0,0 +1,51 @@ +#!/usr/bin/env -S yarn node +/* eslint-disable no-unused-vars */ + +/* +DO NOT EDIT THIS FILE BY HAND! +Examples are generated using helpers/buildExamples.js script. +Check README.md for more details. +*/ + +const sw = require('@rhino.fi/starkware-crypto') +const getWeb3 = require('./helpers/getWeb3') + +const RhinofiClientFactory = require('../src') +const envVars = require('./helpers/loadFromEnvOrConfig')( + process.env.CONFIG_FILE_NAME +) +const logExampleResult = require('./helpers/logExampleResult')(__filename) + +const ethPrivKey = envVars.ETH_PRIVATE_KEY +// NOTE: you can also generate a new key using:` +// const starkPrivKey = rhinofi.stark.createPrivateKey() +const starkPrivKey = envVars.STARK_PRIVATE_KEY +const rpcUrl = envVars.RPC_URL + +const { web3, provider } = getWeb3(ethPrivKey, rpcUrl) + +const rhinofiConfig = { + api: envVars.API_URL, + dataApi: envVars.DATA_API_URL, + useAuthHeader: true, + wallet: { + type: 'tradingKey', + meta: { + starkPrivateKey: starkPrivKey + } + } + // Add more variables to override default values +} + +;(async () => { + const rhinofi = await RhinofiClientFactory(web3, rhinofiConfig) + + const estimatedNextBatchTimeResponse = await rhinofi.estimatedNextBatchTime() + + logExampleResult(estimatedNextBatchTimeResponse) + +})() +.catch(error => { + console.error(error) + process.exit(1) +}) diff --git a/examples/helpers/examplesList.js b/examples/helpers/examplesList.js index 09e0d12a..854ca78b 100644 --- a/examples/helpers/examplesList.js +++ b/examples/helpers/examplesList.js @@ -33,6 +33,8 @@ module.exports = Object.freeze([ 'publicPermissions', 'transfer', 'getRegistrationStatuses', + 'generateL1RegistrationPayload', + 'estimatedNextBatchTime', // TODO // 'submitBuyOrder', // 'submitSellOrder', diff --git a/examples/helpers/getOrCreateActiveOrder.js b/examples/helpers/getOrCreateActiveOrder.js index e3c18ce0..af42b9b4 100644 --- a/examples/helpers/getOrCreateActiveOrder.js +++ b/examples/helpers/getOrCreateActiveOrder.js @@ -1,4 +1,4 @@ -const P = require('aigle') +const P = require('@rhino.fi/aigle') const defaultOrderProps = Object.freeze({ cid: 'mycid-' + Math.random().toString(36).substring(7), diff --git a/examples/helpers/logMyIP.js b/examples/helpers/logMyIP.js index a9e836ad..7666620b 100755 --- a/examples/helpers/logMyIP.js +++ b/examples/helpers/logMyIP.js @@ -1,6 +1,6 @@ #!/usr/bin/env -S yarn node -const P = require('aigle') +const P = require('@rhino.fi/aigle') const request = require('./request') diff --git a/examples/helpers/waitForDepositCreditedOnChain.js b/examples/helpers/waitForDepositCreditedOnChain.js index b512511b..a97f9af9 100644 --- a/examples/helpers/waitForDepositCreditedOnChain.js +++ b/examples/helpers/waitForDepositCreditedOnChain.js @@ -1,4 +1,4 @@ -const P = require('aigle') +const P = require('@rhino.fi/aigle') module.exports = async (rhinofi, deposit) => { console.log('waiting for deposit to be credited on chain...') diff --git a/examples/src/ammWithdrawal.js b/examples/src/ammWithdrawal.js index e0aa705f..1ef0d1cc 100644 --- a/examples/src/ammWithdrawal.js +++ b/examples/src/ammWithdrawal.js @@ -25,7 +25,7 @@ const ammDeposit = await rhinofi.postAmmFundingOrders( ammDepositOrderData ) -const P = require('aigle') +const P = require('@rhino.fi/aigle') await P.retry( { times: 360, interval: 1000 }, diff --git a/examples/src/cancelOrder.js b/examples/src/cancelOrder.js index 720d41b8..b74cf3c3 100644 --- a/examples/src/cancelOrder.js +++ b/examples/src/cancelOrder.js @@ -1,4 +1,4 @@ -const P = require('aigle') +const P = require('@rhino.fi/aigle') let order const orders = await rhinofi.getOrders() diff --git a/examples/src/fastWithdrawalFee.js b/examples/src/fastWithdrawalFee.js index 885bb19c..4b6ebe76 100644 --- a/examples/src/fastWithdrawalFee.js +++ b/examples/src/fastWithdrawalFee.js @@ -1,3 +1,4 @@ +// NOTE: fastWithdrawalFee method as been deprecated const response = await rhinofi.fastWithdrawalFee('ETH') logExampleResult(response) diff --git a/examples/src/generateL1RegistrationPayload.js b/examples/src/generateL1RegistrationPayload.js new file mode 100644 index 00000000..888a6862 --- /dev/null +++ b/examples/src/generateL1RegistrationPayload.js @@ -0,0 +1,18 @@ +const { starkKeyHex, ethAddress } = await rhinofi.getUserConfig() + +const l1RegistrationSignature = await rhinofi.stark.signRegistration( + ethAddress +) + +const callData = await rhinofi.stark.l1RegistrationCallData( + starkKeyHex, + ethAddress, + l1RegistrationSignature +) + +logExampleResult({ + ethAddress, + starkKeyHex, + sig: l1RegistrationSignature, + callData +}) \ No newline at end of file diff --git a/nix/netrc-create.sh b/nix/netrc-create.sh index a49224e5..f49bdba0 100755 --- a/nix/netrc-create.sh +++ b/nix/netrc-create.sh @@ -1,10 +1,12 @@ #!/usr/bin/env bash set -ueo pipefail -github_token=''${GITHUB_TOKEN-} +github_token=${GITHUB_TOKEN-} if [[ -z $github_token ]]; then - read -s github_token + while read -r github_token; do + break + done fi github_user=${1:-dvf-ci} diff --git a/nix/sources.json b/nix/sources.json index 4fd317b2..75549091 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -29,10 +29,10 @@ "homepage": "", "owner": "rhinofi", "repo": "rhino-core", - "rev": "c2183a731421203e076c7dba37d339fa15e70b1d", - "sha256": "0ygx4q7pna7qr8d8wx42ynk7ygz3cpz8zjd7hz1nz3wx39d4ps9h", + "rev": "8424a851d2bd6913bbf111859e2aeda2a8924c7a", + "sha256": "1zvk99gfa5lfzvkyzjxlpp05abfvvyixzwhhshr3nc5gjq8yiiwb", "type": "tarball", - "url": "https://github.com/rhinofi/rhino-core/archive/c2183a731421203e076c7dba37d339fa15e70b1d.tar.gz", + "url": "https://github.com/rhinofi/rhino-core/archive/8424a851d2bd6913bbf111859e2aeda2a8924c7a.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "yarn-berry-cjs-rhinofi": { diff --git a/package.json b/package.json index ef912220..1141008f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rhino.fi/client-js", - "version": "5.1.1", + "version": "5.4.0", "main": "src/index.js", "files": [ "src", @@ -10,7 +10,8 @@ "scripts": { "test": "env-cmd -f ./env/test jest --testTimeout 10000", "test:watch": "env-cmd -f ./env/test jest --watch --testTimeout 10000 --verbose true", - "test:coverage": "env-cmd -f ./env/test jest --testTimeout 10000 --coverage" + "test:coverage": "env-cmd -f ./env/test jest --testTimeout 10000 --coverage", + "link-rhino-portal": "rm -rf ../rhino-portal/node_modules/@rhino.fi/client-js && rm -rf ../rhino-portal/node_modules/.cache && cp -r . ../rhino-portal/node_modules/@rhino.fi/client-js" }, "jest": { "coverageReporters": [ @@ -27,18 +28,17 @@ "homepage": "https://github.com/rhinofi/client-js", "license": "MIT", "dependencies": { - "@ledgerhq/hw-app-eth": "6.23.0", - "@ledgerhq/hw-transport-webhid": "6.20.0", + "@ledgerhq/hw-app-eth": "6.28.1", + "@ledgerhq/hw-transport-webhid": "6.27.1", + "@rhino.fi/aigle": "^1.15.0-alpha.3", "@rhino.fi/dvf-utils": "^1.4.5", "@rhino.fi/starkware-crypto": "^0.1.7", - "aigle": "suguru03/aigle#8739846ba9d4cfc116e1546da1181c73564cae0b", "aware": "^0.3.1", "bignumber.js": "^9.0.0", "eip-712": "1.0.0", "lodash": "^4.17.20", "ramda": "^0.27.1", "request": "^2.88.2", - "request-promise": "^4.2.6", "web3": "^1.7.5", "web3-utils": "^1.3.0" }, @@ -47,6 +47,7 @@ "@truffle/hdwallet-provider": "^2.0.13", "env-cmd": "^10.1.0", "jest": "^26.4.2", + "jest-environment-jsdom": "25", "mustache": "^4.0.0", "nock": "^13.0.4", "solc": "^0.4.24" diff --git a/src/api/bridgedDeposit.js b/src/api/bridgedDeposit.js index 972e95b9..0ec12518 100644 --- a/src/api/bridgedDeposit.js +++ b/src/api/bridgedDeposit.js @@ -28,7 +28,7 @@ const validateArg0 = validateWithJoi(schema)('INVALID_METHOD_ARGUMENT')({ const endpoint = '/v1/trading/bridgedDeposits' const validationEndpoint = '/v1/trading/deposits-validate' -module.exports = async (dvf, data, nonce, signature, txHashCb) => { +module.exports = async (dvf, data, nonce, signature, txHashCb, onlyOnChain) => { const { chain, token, amount, web3Options, permitParams, referralId } = validateArg0(data) const tokenInfo = dvf.token.getTokenInfoOrThrow(token) @@ -37,7 +37,7 @@ module.exports = async (dvf, data, nonce, signature, txHashCb) => { // Base units should be using the execution chain const tokenChainInfo = dvf.token.getTokenInfoForChainOrThrow(token, chain) - const baseUnitAmount = toBN(amount).shiftedBy(tokenChainInfo.decimals).toString() + const baseUnitAmount = dvf.token.toBaseUnitAmount(token, amount, tokenChainInfo) // Force the use of header (instead of payload) for authentication. dvf = FP.set('config.useAuthHeader', true, dvf) @@ -73,6 +73,11 @@ module.exports = async (dvf, data, nonce, signature, txHashCb) => { const { transactionHash, clearCallback } = await transactionHashPromise + if (onlyOnChain) { + await onChainDepositPromise + return { transactionHash } + } + const payload = { chain, token, @@ -82,17 +87,10 @@ module.exports = async (dvf, data, nonce, signature, txHashCb) => { } const httpDeposit = await post(dvf, endpoint, nonce, signature, payload) - const onChainDeposit = await onChainDepositPromise + await onChainDepositPromise if (typeof clearCallback === 'function') { clearCallback() } - if (!onChainDeposit.status) { - throw new DVFError('ERR_ONCHAIN_BRIDGED_DEPOSIT', { - httpDeposit, - onChainDeposit - }) - } - return { ...httpDeposit, transactionHash } } diff --git a/src/api/bridgedWithdraw.js b/src/api/bridgedWithdraw.js index 0712bd1e..00bc312b 100644 --- a/src/api/bridgedWithdraw.js +++ b/src/api/bridgedWithdraw.js @@ -3,10 +3,7 @@ const { Joi } = require('@rhino.fi/dvf-utils') const post = require('../lib/dvf/post-authenticated') -const generateRandomNonceV2 = require('../lib/dvf/generateRandomNonceV2') const validateWithJoi = require('../lib/validators/validateWithJoi') -const getSafeQuantizedAmountOrThrow = require('../lib/dvf/token/getSafeQuantizedAmountOrThrow') -const getTokenAddressFromTokenInfoOrThrow = require('../lib/dvf/token/getTokenAddressFromTokenInfoOrThrow') const schema = Joi.object({ chain: Joi.string(), @@ -15,9 +12,7 @@ const schema = Joi.object({ nonce: Joi.number().integer() .min(0) // Will be auto-generated if not provided. - .optional(), - // Temporary - to be removed after bridge withdrawal fees update (CHAIN-586) - isFeeUsd: Joi.boolean().optional() + .optional() }) const validateArg0 = validateWithJoi(schema)('INVALID_METHOD_ARGUMENT')({ @@ -27,32 +22,9 @@ const validateArg0 = validateWithJoi(schema)('INVALID_METHOD_ARGUMENT')({ const endpoint = '/v1/trading/bridgedWithdrawals' module.exports = async (dvf, data, authNonce, signature) => { - const { chain, token, amount, nonce, isFeeUsd } = validateArg0(data) - - const tokenInfo = dvf.token.getTokenInfoOrThrow(token) - // To make it fail if token is not supported - getTokenAddressFromTokenInfoOrThrow(tokenInfo, chain) - const quantisedAmount = getSafeQuantizedAmountOrThrow(amount, tokenInfo) - const { vaultId, starkKey } = await dvf.getVaultIdAndStarkKey({ - token, - targetEthAddress: dvf.config.DVF.deversifiAddress - }, authNonce, signature) - - const { tx } = await dvf.createTransferPayload({ - token, - amount, - recipientPublicKey: starkKey, - recipientVaultId: vaultId - }) - - const payload = { - chain, - token, - amount: quantisedAmount, - tx, - nonce: nonce || generateRandomNonceV2(), - ...(isFeeUsd ? { isFeeUsd: true } : {}) - } + const { chain, token, amount, nonce } = validateArg0(data) + + const payload = await dvf.createBridgedWithdrawalPayload({ chain, token, amount, nonce }, authNonce, signature) // Force the use of header (instead of payload) for authentication. dvf = FP.set('config.useAuthHeader', true, dvf) diff --git a/src/api/contract/abi/BridgeDepositContract.abi.json b/src/api/contract/abi/BridgeDepositContract.abi.json index 87d8d177..087def9c 100644 --- a/src/api/contract/abi/BridgeDepositContract.abi.json +++ b/src/api/contract/abi/BridgeDepositContract.abi.json @@ -1,364 +1,412 @@ [ - { - "type":"event", - "name":"BridgedDeposit", - "inputs":[ - { - "type":"address", - "name":"user", - "internalType":"address", - "indexed":true - }, - { - "type":"address", - "name":"token", - "internalType":"address", - "indexed":true - }, - { - "type":"uint256", - "name":"amount", - "internalType":"uint256", - "indexed":false - } - ], - "anonymous":false - }, - { - "type":"event", - "name":"BridgedWithdrawal", - "inputs":[ - { - "type":"address", - "name":"user", - "internalType":"address", - "indexed":true - }, - { - "type":"address", - "name":"token", - "internalType":"address", - "indexed":true - }, - { - "type":"uint256", - "name":"amount", - "internalType":"uint256", - "indexed":false - }, - { - "type":"string", - "name":"withdrawalId", - "internalType":"string", - "indexed":false - } - ], - "anonymous":false - }, - { - "type":"event", - "name":"OwnershipTransferred", - "inputs":[ - { - "type":"address", - "name":"previousOwner", - "internalType":"address", - "indexed":true - }, - { - "type":"address", - "name":"newOwner", - "internalType":"address", - "indexed":true - } - ], - "anonymous":false - }, - { - "type":"function", - "stateMutability":"nonpayable", - "outputs":[ - - ], - "name":"addFunds", - "inputs":[ - { - "type":"address", - "name":"token", - "internalType":"address" - }, - { - "type":"uint256", - "name":"amount", - "internalType":"uint256" - } - ] - }, - { - "type":"function", - "stateMutability":"payable", - "outputs":[ - - ], - "name":"addFundsNative", - "inputs":[ - - ] - }, - { - "type":"function", - "stateMutability":"nonpayable", - "outputs":[ - - ], - "name":"authorize", - "inputs":[ - { - "type":"address", - "name":"user", - "internalType":"address" - }, - { - "type":"bool", - "name":"value", - "internalType":"bool" - } - ] - }, - { - "type":"function", - "stateMutability":"view", - "outputs":[ - { - "type":"bool", - "name":"", - "internalType":"bool" - } - ], - "name":"authorized", - "inputs":[ - { - "type":"address", - "name":"", - "internalType":"address" - } - ] - }, - { - "type":"function", - "stateMutability":"nonpayable", - "outputs":[ - - ], - "name":"deposit", - "inputs":[ - { - "type":"address", - "name":"token", - "internalType":"address" - }, - { - "type":"uint256", - "name":"amount", - "internalType":"uint256" - } - ] - }, - { - "type":"function", - "stateMutability":"payable", - "outputs":[ - - ], - "name":"depositNative", - "inputs":[ - - ] - }, - { - "type":"function", - "stateMutability":"nonpayable", - "outputs":[ - - ], - "name":"initialize", - "inputs":[ - - ] - }, - { - "type":"function", - "stateMutability":"view", - "outputs":[ - { - "type":"address", - "name":"", - "internalType":"address" - } - ], - "name":"owner", - "inputs":[ - - ] - }, - { - "type":"function", - "stateMutability":"view", - "outputs":[ - { - "type":"bool", - "name":"", - "internalType":"bool" - } - ], - "name":"processedWithdrawalIds", - "inputs":[ - { - "type":"string", - "name":"", - "internalType":"string" - } - ] - }, - { - "type":"function", - "stateMutability":"nonpayable", - "outputs":[ - - ], - "name":"removeFunds", - "inputs":[ - { - "type":"address", - "name":"token", - "internalType":"address" - }, - { - "type":"address", - "name":"to", - "internalType":"address" - }, - { - "type":"uint256", - "name":"amount", - "internalType":"uint256" - } - ] - }, - { - "type":"function", - "stateMutability":"nonpayable", - "outputs":[ - - ], - "name":"removeFundsNative", - "inputs":[ - { - "type":"address", - "name":"to", - "internalType":"address payable" - }, - { - "type":"uint256", - "name":"amount", - "internalType":"uint256" - } - ] - }, - { - "type":"function", - "stateMutability":"view", - "outputs":[ - - ], - "name":"renounceOwnership", - "inputs":[ - - ] - }, - { - "type":"function", - "stateMutability":"nonpayable", - "outputs":[ - - ], - "name":"transferOwner", - "inputs":[ - { - "type":"address", - "name":"newOwner", - "internalType":"address" - } - ] - }, - { - "type":"function", - "stateMutability":"nonpayable", - "outputs":[ - - ], - "name":"transferOwnership", - "inputs":[ - { - "type":"address", - "name":"newOwner", - "internalType":"address" - } - ] - }, - { - "type":"function", - "stateMutability":"nonpayable", - "outputs":[ - - ], - "name":"withdraw", - "inputs":[ - { - "type":"address", - "name":"token", - "internalType":"address" - }, - { - "type":"address", - "name":"to", - "internalType":"address" - }, - { - "type":"uint256", - "name":"amount", - "internalType":"uint256" - }, - { - "type":"string", - "name":"withdrawalId", - "internalType":"string" - } - ] - }, - { - "type":"function", - "stateMutability":"nonpayable", - "outputs":[ - - ], - "name":"withdrawNative", - "inputs":[ - { - "type":"address", - "name":"to", - "internalType":"address payable" - }, - { - "type":"uint256", - "name":"amount", - "internalType":"uint256" - }, - { - "type":"string", - "name":"withdrawalId", - "internalType":"string" - } - ] - } -] + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BridgedDeposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "withdrawalId", + "type": "string" + } + ], + "name": "BridgedWithdrawal", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "addFunds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addFundsNative", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "value", + "type": "bool" + } + ], + "name": "allowDeposits", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "bool", + "name": "value", + "type": "bool" + } + ], + "name": "authorize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "authorized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositNative", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "depositsDisallowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "processedWithdrawalIds", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "removeFunds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "removeFundsNative", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "withdrawalId", + "type": "string" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "withdrawalId", + "type": "string" + } + ], + "name": "withdrawNative", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawNativeV2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawV2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file diff --git a/src/api/contract/getAllWithdrawalBalances.js b/src/api/contract/getAllWithdrawalBalances.js index b7e0f7d1..a86ef4f9 100644 --- a/src/api/contract/getAllWithdrawalBalances.js +++ b/src/api/contract/getAllWithdrawalBalances.js @@ -10,7 +10,7 @@ module.exports = async (dvf, starkTokenIds, tradingKey) => { const args = [starkTokenIds, tradingKey] try { - return (withdrawalBalance = await dvf.eth.call( + return (await dvf.eth.call( dvf.contract.abi.WithdrawalBalanceReader, dvf.config.DVF.registrationAndDepositInterfaceAddress, 'allWithdrawalBalances', diff --git a/src/api/contract/getAllWithdrawalBalancesEthAddress.js b/src/api/contract/getAllWithdrawalBalancesEthAddress.js index c5de29ca..44187d22 100644 --- a/src/api/contract/getAllWithdrawalBalancesEthAddress.js +++ b/src/api/contract/getAllWithdrawalBalancesEthAddress.js @@ -8,7 +8,7 @@ module.exports = async (dvf, starkTokenIds, address) => { const args = [starkTokenIds, address] try { - return (withdrawalBalance = await dvf.eth.call( + return (await dvf.eth.call( dvf.contract.abi.WithdrawalBalanceReader, dvf.config.DVF.registrationAndDepositInterfaceAddress, 'allWithdrawalBalances', diff --git a/src/api/contract/getWithdrawalBalance.js b/src/api/contract/getWithdrawalBalance.js index c9e39da8..f3b2f4d0 100644 --- a/src/api/contract/getWithdrawalBalance.js +++ b/src/api/contract/getWithdrawalBalance.js @@ -12,7 +12,7 @@ module.exports = async (dvf, token, tradingKey) => { const args = [tradingKey, starkTokenId] try { - return (withdrawalBalance = await dvf.eth.call( + return (await dvf.eth.call( dvf.contract.abi.getStarkEx(), dvf.config.DVF.starkExContractAddress, 'getWithdrawalBalance', diff --git a/src/api/contract/getWithdrawalBalanceEthAddress.js b/src/api/contract/getWithdrawalBalanceEthAddress.js index 2c7ffa91..b82f8a9e 100644 --- a/src/api/contract/getWithdrawalBalanceEthAddress.js +++ b/src/api/contract/getWithdrawalBalanceEthAddress.js @@ -17,7 +17,7 @@ module.exports = async (dvf, token, address) => { const args = [address, starkTokenId] try { - return (withdrawalBalance = await dvf.eth.call( + return (await dvf.eth.call( dvf.contract.abi.getStarkEx(), dvf.config.DVF.starkExContractAddress, 'getWithdrawalBalance', diff --git a/src/api/deposit.js b/src/api/deposit.js index 0719cd69..24e46638 100644 --- a/src/api/deposit.js +++ b/src/api/deposit.js @@ -1,4 +1,5 @@ -const { post } = require('request-promise') +const post = require('../lib/dvf/post-generic') + const DVFError = require('../lib/dvf/DVFError') const validateAssertions = require('../lib/validators/validateAssertions') @@ -36,7 +37,7 @@ module.exports = async (dvf, token, amount, starkPrivateKey, nonce, signature) = const starkSignature = dvf.stark.sign(starkKeyPair, starkMessage) - const url = dvf.config.api + '/v1/trading/w/deposit' + const url = '/v1/trading/w/deposit' const data = { token, @@ -51,7 +52,7 @@ module.exports = async (dvf, token, amount, starkPrivateKey, nonce, signature) = await dvf.contract.approve(token, dvf.token.toBaseUnitAmount(token, amount), dvf.config.DVF.starkExContractAddress, 'ETHEREUM') - const depositResponse = await post(url, { json: data }) + const depositResponse = await post(dvf, url, data) const { status, transactionHash } = await dvf.contract.deposit( tempVaultId, diff --git a/src/api/depositV2.js b/src/api/depositV2.js index 79beeb71..b7962cde 100644 --- a/src/api/depositV2.js +++ b/src/api/depositV2.js @@ -29,7 +29,7 @@ const validateArg0 = validateWithJoi(schema)('INVALID_METHOD_ARGUMENT')({ const endpoint = '/v1/trading/deposits' const validationEndpoint = '/v1/trading/deposits-validate' -module.exports = async (dvf, data, nonce, signature, txHashCb) => { +module.exports = async (dvf, data, nonce, signature, txHashCb, onChainOnly) => { const { token, amount, useProxiedContract, web3Options, permitParams, referralId } = validateArg0(data) const starkKey = dvf.config.starkKeyHex @@ -94,6 +94,11 @@ module.exports = async (dvf, data, nonce, signature, txHashCb) => { const { transactionHash, clearCallback } = await transactionHashPromise + if (onChainOnly) { + await onChainDepositPromise + return { transactionHash } + } + const payload = { token, amount: quantisedAmount, @@ -103,17 +108,10 @@ module.exports = async (dvf, data, nonce, signature, txHashCb) => { const httpDeposit = await post(dvf, endpoint, nonce, signature, payload) - const onChainDeposit = await onChainDepositPromise + await onChainDepositPromise if (typeof clearCallback === 'function') { clearCallback() } - if (!onChainDeposit.status) { - throw new DVFError('ERR_ONCHAIN_DEPOSIT', { - httpDeposit, - onChainDeposit - }) - } - return { ...httpDeposit, transactionHash } } diff --git a/src/api/estimatedNextBatchTime.js b/src/api/estimatedNextBatchTime.js index 2e306414..8e7822ff 100644 --- a/src/api/estimatedNextBatchTime.js +++ b/src/api/estimatedNextBatchTime.js @@ -1,15 +1,8 @@ -const { get } = require('request-promise') +const get = require('../lib/dvf/get-generic') module.exports = async dvf => { // avoid browser cache with timestamp as querystring const t = Date.now() - - const url = `${dvf.config.api}/v1/trading/r/estimatedNextBatchTime?t=${t}` - try { - const data = await get(url) - return JSON.parse(data) - } - catch(e) { - return null; - } + const url = `/v1/trading/r/estimatedNextBatchTime?t=${t}` + return get(dvf, url) } diff --git a/src/api/eth/getGasStationPrice.js b/src/api/eth/getGasStationPrice.js index 3a7d3325..a86a89d2 100644 --- a/src/api/eth/getGasStationPrice.js +++ b/src/api/eth/getGasStationPrice.js @@ -1,13 +1,12 @@ -const { get } = require('request-promise') - +const { request } = require('@rhino.fi/dvf-utils') /** * Provides a safe average gas price */ module.exports = async (dvf) => { try { - const res = await get(`${dvf.config.gasApi}/json/ethgasAPI.json?api-key=${dvf.config.gasStationApiKey || ''}`) - dvf.config.defaultGasPrice = parseInt((JSON.parse(res).average * 1.25 *100000000)) + const res = await request.get(`${dvf.config.gasApi}/json/ethgasAPI.json?api-key=${dvf.config.gasStationApiKey || ''}`) + dvf.config.defaultGasPrice = parseInt((res.average * 1.25 *100000000)) } catch(e) { console.log('Error getting safe gas priec, using default ', e) } diff --git a/src/api/fastWithdrawal.js b/src/api/fastWithdrawal.js index 4a6cca57..e15c5b8a 100644 --- a/src/api/fastWithdrawal.js +++ b/src/api/fastWithdrawal.js @@ -1,7 +1,7 @@ -const { post } = require('request-promise') +const post = require('../lib/dvf/post-generic') module.exports = async (dvf, withdrawalData) => { - const url = dvf.config.api + '/v1/trading/w/fastWithdrawal' + const url = '/v1/trading/w/fastWithdrawal' const json = await dvf.createFastWithdrawalPayload(withdrawalData) - return post(url, { json }) + return post(dvf, url, json) } diff --git a/src/api/fastWithdrawalFee.js b/src/api/fastWithdrawalFee.js index 78fa21c0..c3275a4b 100644 --- a/src/api/fastWithdrawalFee.js +++ b/src/api/fastWithdrawalFee.js @@ -1,6 +1,7 @@ -const { get } = require('request-promise') +const get = require('../lib/dvf/get-generic') +// TODO: Deprecated (CHAIN-719) module.exports = async (dvf, token) => { - const url = dvf.config.api + '/v1/trading/r/fastWithdrawalFee' - return get(url, { json: true, qs: { token } }) + const url = '/v1/trading/r/fastWithdrawalFee' + return get(dvf, url, { token }) } diff --git a/src/api/getConfig.js b/src/api/getConfig.js index d0afe3b7..fa0d1bc3 100644 --- a/src/api/getConfig.js +++ b/src/api/getConfig.js @@ -1,9 +1,9 @@ -const { post } = require('request-promise') +const post = require('../lib/dvf/post-generic') module.exports = async dvf => { - const url = dvf.config.api + '/v1/trading/r/getConf' + const url = '/v1/trading/r/getConf' try { - const exchangeConf = await post(url, { json: {} }) + const exchangeConf = await post(dvf, url) dvf.config = Object.assign({}, dvf.config, exchangeConf) return exchangeConf } catch (error) { diff --git a/src/api/getGasPrice.js b/src/api/getGasPrice.js index 1a340579..d6929836 100644 --- a/src/api/getGasPrice.js +++ b/src/api/getGasPrice.js @@ -1,14 +1,13 @@ -const { get } = require('request-promise') +const get = require('../lib/dvf/get-generic') module.exports = async (dvf) => { const defaultGasPrice = dvf.config.defaultGasPrice const oldGasPrice = { fast: defaultGasPrice * 1.2, average: defaultGasPrice * 0.9, cheap: defaultGasPrice * 0.8 } - const endpoint = '/v1/trading/r/getGasPrice' - const url = dvf.config.api + endpoint + const url = '/v1/trading/r/getGasPrice' try { - const newGasPrice = await get(url, { json: true }) + const newGasPrice = await get(dvf, url) dvf.config.defaultGasPrice = newGasPrice.fast || dvf.config.defaultGasPrice return newGasPrice || oldGasPrice } diff --git a/src/api/getTickers.js b/src/api/getTickers.js index e6c46dba..09db7150 100644 --- a/src/api/getTickers.js +++ b/src/api/getTickers.js @@ -1,10 +1,9 @@ -const { get } = require('request-promise') +const get = require('../lib/dvf/get-generic') module.exports = async (dvf, symbols) => { if (symbols.constructor !== Array) { symbols = [symbols] } - const response = await get(`${dvf.config.api}/market-data/tickers?symbols=${symbols.join(',')}`) - return JSON.parse(response) + return get(dvf, `/market-data/tickers?symbols=${symbols.join(',')}`) } diff --git a/src/api/getTokenHolders.js b/src/api/getTokenHolders.js index 58f09d92..e7e5d9e4 100644 --- a/src/api/getTokenHolders.js +++ b/src/api/getTokenHolders.js @@ -1,11 +1,11 @@ -const { get } = require('request-promise') +const get = require('../lib/dvf/get-generic') module.exports = async (dvf, token) => { if (token) { - const response = await get( - `${dvf.config.api}/v1/trading/r/getTokenHolders?token=${token}` + return get( + dvf, + `/v1/trading/r/getTokenHolders?token=${token}` ) - return response } return null } diff --git a/src/api/getTokenLiquidityLeft.js b/src/api/getTokenLiquidityLeft.js index 8f6f0911..33edbb3d 100644 --- a/src/api/getTokenLiquidityLeft.js +++ b/src/api/getTokenLiquidityLeft.js @@ -1,11 +1,11 @@ -const { get } = require('request-promise') +const get = require('../lib/dvf/get-generic') module.exports = async (dvf, token) => { if (token) { - const response = await get( - `${dvf.config.api}/v1/trading/r/getTokenLiquidityLeft?token=${token}` + return get( + dvf, + `/v1/trading/r/getTokenLiquidityLeft?token=${token}` ) - return response } return null } diff --git a/src/api/getTokenSaleStartEnd.js b/src/api/getTokenSaleStartEnd.js index fb37e538..f7764ae3 100644 --- a/src/api/getTokenSaleStartEnd.js +++ b/src/api/getTokenSaleStartEnd.js @@ -1,11 +1,11 @@ -const { get } = require('request-promise') +const get = require('../lib/dvf/get-generic') module.exports = async (dvf, token) => { if (token) { - const response = await get( - `${dvf.config.api}/v1/trading/r/getTokenSaleStartEnd?token=${token}` + return get( + dvf, + `/v1/trading/r/getTokenSaleStartEnd?token=${token}` ) - return response } return null } diff --git a/src/api/getWithdrawalQuote.js b/src/api/getWithdrawalQuote.js new file mode 100644 index 00000000..ecebf53c --- /dev/null +++ b/src/api/getWithdrawalQuote.js @@ -0,0 +1,25 @@ +const { Joi } = require('@rhino.fi/dvf-utils') +const validateWithJoi = require('../lib/validators/validateWithJoi') + +const schema = Joi.object({ + token: Joi.string(), + amount: Joi.string(), + chain: Joi.string(), + type: Joi.string(), + recipient: Joi.string().optional(), + abortSignal: Joi.any().optional() +}) + +const validateInputs = validateWithJoi(schema)('INVALID_METHOD_ARGUMENT')({ + context: 'getWithdrawalQuote' +}) + +module.exports = async (dvf, data, nonce, signature) => { + const { get } = dvf.request + const { abortSignal, ...requestData } = validateInputs(data) + + return get('/v1/trading/withdrawalQuotes', nonce, signature, { + data: requestData, + signal: abortSignal + }) +} diff --git a/src/api/ledger/deposit.js b/src/api/ledger/deposit.js index 43e9724c..b0c69ddb 100644 --- a/src/api/ledger/deposit.js +++ b/src/api/ledger/deposit.js @@ -1,4 +1,4 @@ -const {post} = require('request-promise') +const post = require('../../lib/dvf/post-generic') const validateAssertions = require('../../lib/validators/validateAssertions') module.exports = async (dvf, token, amount, path, nonce, signature) => { @@ -17,9 +17,9 @@ module.exports = async (dvf, token, amount, path, nonce, signature) => { starkPublicKey: starkDeposit.starkPublicKey } - const url = dvf.config.api + '/v1/trading/w/deposit' + const url = '/v1/trading/w/deposit' - const deposit = await post(url, {json: data}) + const deposit = await post(dvf, url, data) const ctDeposit = await dvf.contract.deposit(tempVaultId, token, amount, `0x${starkDeposit.starkPublicKey.x}`) return {...deposit, ...ctDeposit} diff --git a/src/api/ledger/transferUsingVaultIdAndStarkKey.js b/src/api/ledger/transferUsingVaultIdAndStarkKey.js index 7a2e45b6..328eaee1 100644 --- a/src/api/ledger/transferUsingVaultIdAndStarkKey.js +++ b/src/api/ledger/transferUsingVaultIdAndStarkKey.js @@ -1,9 +1,9 @@ -const { post } = require('request-promise') +const post = require('../../lib/dvf/post-generic') const makeCreateSignedTransferTxLedger = require('../../lib/ledger/makeCreateSignedTransferTxLedger') module.exports = async (dvf, transferData, path, feeRecipient) => { - const url = dvf.config.api + '/v1/trading/w/transfer' + const url = '/v1/trading/w/transfer' const createSignedTransferTx = makeCreateSignedTransferTxLedger(dvf)(path) const json = await dvf.createTransferPayload(transferData, feeRecipient, createSignedTransferTx) - return post(url, { json }) + return post(dvf, url, json) } diff --git a/src/api/ledger/withdraw.js b/src/api/ledger/withdraw.js index cc3a5e56..a0a7cf5e 100644 --- a/src/api/ledger/withdraw.js +++ b/src/api/ledger/withdraw.js @@ -1,4 +1,4 @@ -const { post } = require('request-promise') +const post = require('../../lib/dvf/post-generic') const validateAssertions = require('../../lib/validators/validateAssertions') module.exports = async (dvf, token, amount, starkWithdrawal) => { @@ -28,10 +28,7 @@ module.exports = async (dvf, token, amount, starkWithdrawal) => { expireTime } - //console.log({ data }) - const url = dvf.config.api + '/v1/trading/w/withdraw' + const url = '/v1/trading/w/withdraw' - return post(url, { - json: data - }) + return post(dvf, url, data) } diff --git a/src/api/storeStarkL1Registration.js b/src/api/storeStarkL1Registration.js new file mode 100644 index 00000000..afe2c117 --- /dev/null +++ b/src/api/storeStarkL1Registration.js @@ -0,0 +1,23 @@ +/** + * Backup the Stark L1 registration payload for the currently logged in account + * @type {(dvf: ReturnType, + * nonce: string, + * signature: string) => string} + */ +module.exports = async (dvf, nonce, signature) => { + const url = '/v1/trading/storeStarkL1Registration' + + // Explicitly fetch the config to get the user's registered address + // in the backend + const { ethAddress } = await dvf.getUserConfigFromServer(nonce, signature) + + const l1RegistrationSignature = await dvf.stark.signRegistration( + ethAddress + ) + + const data = { + l1RegistrationSignature + } + + return dvf.postAuthenticated(url, nonce, signature, data) +} diff --git a/src/api/storeStarkL1Registration.test.js b/src/api/storeStarkL1Registration.test.js new file mode 100644 index 00000000..756ef50f --- /dev/null +++ b/src/api/storeStarkL1Registration.test.js @@ -0,0 +1,47 @@ +const nock = require('nock') +const instance = require('./test/helpers/instance') +const mockGetConf = require('./test/fixtures/getConf') + +describe('dvf.storeStarkL1Registration', () => { + const tradingKey = process.env.PRIVATE_STARK_KEY + const config = { + wallet: { + type: 'tradingKey', + meta: { + starkPrivateKey: tradingKey + } + } + } + /** + * @param {(dvf: Awaited) => Promise} fn + */ + const withInstance = (fn) => async () => fn(await instance(config)) + + beforeAll(async () => { + mockGetConf() + }) + + afterAll(() => { + nock.restore() + }) + + it('Generates and submits the registration payload', withInstance(async (dvf) => { + mockGetConf() + + const expectedBody = { + l1RegistrationSignature: '0x025e160f8936b367f1aa10f4602dd54a31831de28cfc4263cbfd6b2fd3e9328602421b80ed0520b9e4d20620339ecd34093f04cec933bdebddc31e3bfcd32e5504de195d61296b6ac602ab5db8d190b90cd1e767fe9d47d4c9d96ab62cf7ad41' + } + + const payloadValidator = jest.fn(body => { + expect(body).toMatchObject(expectedBody) + return true + }) + + nock(dvf.config.api) + .post('/v1/trading/storeStarkL1Registration', payloadValidator) + .reply(200) + + await dvf.storeStarkL1Registration(tradingKey) + expect(payloadValidator).toBeCalled() + })) +}) diff --git a/src/api/submitMarketOrder.js b/src/api/submitMarketOrder.js index ab8fce8e..139b09fe 100644 --- a/src/api/submitMarketOrder.js +++ b/src/api/submitMarketOrder.js @@ -1,4 +1,4 @@ -const { post } = require('request-promise') +const post = require('../lib/dvf/post-generic') const { Joi } = require('@rhino.fi/dvf-utils') /* Keeping the schema visible and not in a seperate method @@ -30,7 +30,6 @@ const schema = Joi.object({ module.exports = async (dvf, orderData) => { const { value, error } = schema.validate(orderData) // TODO handle error - return post(dvf.config.api + '/v1/trading/w/submitOrder', { - json: await dvf.createMarketOrderPayload(value) - }) + const data = await dvf.createMarketOrderPayload(value) + return post(dvf, '/v1/trading/w/submitOrder', data) } diff --git a/src/api/submitOrder.js b/src/api/submitOrder.js index 93e5449a..a5b3805d 100644 --- a/src/api/submitOrder.js +++ b/src/api/submitOrder.js @@ -1,7 +1,7 @@ -const { post } = require('request-promise') +const post = require('../lib/dvf/post-generic') const DVFError = require('../lib/dvf/DVFError') const { Joi } = require('@rhino.fi/dvf-utils') -const P = require('aigle') +const P = require('@rhino.fi/aigle') const FP = require('lodash/fp') /* @@ -67,5 +67,5 @@ module.exports = async (dvf, orderData) => { : dvf.createOrderPayload(value) ) - return post(dvf.config.api + '/v1/trading/w/submitOrder', { json }) + return post(dvf, '/v1/trading/w/submitOrder', json) } diff --git a/src/api/test/helpers/instance.js b/src/api/test/helpers/instance.js index b28e0be0..86ebc151 100644 --- a/src/api/test/helpers/instance.js +++ b/src/api/test/helpers/instance.js @@ -5,7 +5,7 @@ const getWeb3 = require('../../../../examples/helpers/getWeb3') const RhinofiClientFactory = require('../../../index') -module.exports = async () => { +module.exports = async (configOverride = {}) => { const rpcUrl = process.env.RPC_URL const privateKey = process.env.PRIVATE_ETH_KEY @@ -13,7 +13,7 @@ module.exports = async () => { const gasStationApiKey = process.env.ETH_GAS_STATION_KEY || '' - const config = { gasStationApiKey } + const config = { gasStationApiKey, ...configOverride } // It's possible to overwrite the API address with the testnet address // for example like this: diff --git a/src/api/transferUsingVaultIdAndStarkKey.js b/src/api/transferUsingVaultIdAndStarkKey.js index bf9f3d01..4f79587b 100644 --- a/src/api/transferUsingVaultIdAndStarkKey.js +++ b/src/api/transferUsingVaultIdAndStarkKey.js @@ -1,8 +1,8 @@ -const { post } = require('request-promise') +const post = require('../lib/dvf/post-generic') module.exports = async (dvf, transferData, feeRecipient) => { - const url = dvf.config.api + '/v1/trading/w/transfer' + const url = '/v1/trading/w/transfer' const json = await dvf.createTransferPayload(transferData, feeRecipient) - return post(url, { json }) + return post(dvf, url, json) } diff --git a/src/api/withdraw.js b/src/api/withdraw.js index 9759b608..0568650a 100644 --- a/src/api/withdraw.js +++ b/src/api/withdraw.js @@ -1,4 +1,4 @@ -const { post } = require('request-promise') +const post = require('../lib/dvf/post-generic') const DVFError = require('../lib/dvf/DVFError') const validateAssertions = require('../lib/validators/validateAssertions') const { Joi } = require('@rhino.fi/dvf-utils') @@ -43,7 +43,7 @@ module.exports = async (dvf, token, amount, starkPrivateKey) => { const starkSignature = dvf.stark.sign(starkKeyPair, starkMessage) - const url = dvf.config.api + '/v1/trading/w/withdraw' + const url = '/v1/trading/w/withdraw' const data = { token, @@ -55,5 +55,5 @@ module.exports = async (dvf, token, amount, starkPrivateKey) => { expireTime } //console.log({ data }) - return post(url, { json: data }) + return post(dvf, url, data) } diff --git a/src/api/withdrawOnchain.js b/src/api/withdrawOnchain.js index 8df62820..97e0cacf 100644 --- a/src/api/withdrawOnchain.js +++ b/src/api/withdrawOnchain.js @@ -8,10 +8,10 @@ module.exports = async (dvf, token, address) => { address = dvf.config.starkKeyHex } - const { status, transactionHash } = await dvf.contract.withdraw(token, address) - - if (!status) { + try { + const withdrawal = await dvf.contract.withdraw(token, address) + return { transactionHash: withdrawal.transactionHash } + } catch (error) { throw new DVFError('ERR_ONCHAIN_WITHDRAW') } - return { transactionHash } } diff --git a/src/lib/dvf/bindApi.js b/src/lib/dvf/bindApi.js index 61b36daa..607a13b0 100644 --- a/src/lib/dvf/bindApi.js +++ b/src/lib/dvf/bindApi.js @@ -7,11 +7,20 @@ */ const _partial = require('lodash/partial') +/** + * Extracts the tail parameters from a function type, excluding the first parameter. + * @template F - The function type from which to extract parameters. + * @typedef {F extends (head: any, ...tail: infer R) => any ? R : never} ParametersExceptFirst + */ + module.exports = () => { const dvf = {} // returns a function that will call api functions prepending dvf // as first argument + /** + * @type {(fn: T) => (...args: ParametersExceptFirst) => ReturnType} + */ const compose = (funk, ...args) => { return _partial(funk, dvf, ...args) } @@ -30,6 +39,9 @@ module.exports = () => { } dvf.stark = { + signRegistration: compose(require('../stark/signRegistration')), + createRegistrationMessage: compose(require('../stark/createRegistrationMessage')), + l1RegistrationCallData: compose(require('../stark/l1RegistrationCallData')), createOrder: compose(require('../stark/createOrder')), createMarketOrder: compose(require('../stark/createMarketOrder')), createOrderMessage: compose(require('../stark/createOrderMessage')), @@ -173,6 +185,9 @@ module.exports = () => { dvf.createFastWithdrawalPayload = compose( require('./createFastWithdrawalPayload') ) + dvf.createBridgedWithdrawalPayload = compose( + require('./createBridgedWithdrawalPayload') + ) dvf.createTransferPayload = compose( require('./createTransferPayload') ) @@ -212,6 +227,7 @@ module.exports = () => { dvf.fastWithdrawal = compose(require('../../api/fastWithdrawal')) dvf.fastWithdrawalFee = compose(require('../../api/fastWithdrawalFee')) dvf.fastWithdrawalMaxAmount = compose(require('../../api/fastWithdrawalMaxAmount')) + dvf.getWithdrawalQuote = compose(require('../../api/getWithdrawalQuote')) dvf.getDeposits = compose(require('../../api/getDeposits')) dvf.getBalance = compose(require('../../api/getBalance')) dvf.getBalanceUsd = compose(require('../../api/getBalanceUsd')) @@ -265,6 +281,7 @@ module.exports = () => { dvf.walletFailedEvent = compose(require('../../api/walletFailedEvent')) dvf.walletSuccessEvent = compose(require('../../api/walletSuccessEvent')) dvf.topPerformersTokens = compose(require('../../api/topPerformersTokens')) + dvf.storeStarkL1Registration = compose(require('../../api/storeStarkL1Registration')) dvf.ledger = { deposit: compose(require('../../api/ledger/deposit')), diff --git a/src/lib/dvf/createBridgedWithdrawalPayload.js b/src/lib/dvf/createBridgedWithdrawalPayload.js new file mode 100644 index 00000000..ee38f6c2 --- /dev/null +++ b/src/lib/dvf/createBridgedWithdrawalPayload.js @@ -0,0 +1,48 @@ +const generateRandomNonceV2 = require('./generateRandomNonceV2') +const { Joi } = require('@rhino.fi/dvf-utils') +const validateWithJoi = require('../validators/validateWithJoi') +const getSafeQuantizedAmountOrThrow = require('./token/getSafeQuantizedAmountOrThrow') +const getTokenAddressFromTokenInfoOrThrow = require('./token/getTokenAddressFromTokenInfoOrThrow') + +const schema = Joi.object({ + chain: Joi.string(), + token: Joi.string(), + amount: Joi.amount(), + nonce: Joi.number().integer() + .min(0) + // Will be auto-generated if not provided. + .optional() +}) + +const validateArg0 = validateWithJoi(schema)('INVALID_METHOD_ARGUMENT')({ + context: `bridgedWithdrawal` +}) + +module.exports = async (dvf, data, authNonce, signature) => { + const { token, chain, amount, nonce } = validateArg0(data) + + const tokenInfo = dvf.token.getTokenInfoOrThrow(token) + // To make it fail if token is not supported + getTokenAddressFromTokenInfoOrThrow(tokenInfo, chain) + + const quantisedAmount = getSafeQuantizedAmountOrThrow(amount, tokenInfo) + const { vaultId, starkKey } = await dvf.getVaultIdAndStarkKey({ + token, + targetEthAddress: dvf.config.DVF.deversifiAddress + }, authNonce, signature) + + const { tx } = await dvf.createTransferPayload({ + token, + amount, + recipientPublicKey: starkKey, + recipientVaultId: vaultId + }) + + return { + chain, + token, + amount: quantisedAmount, + tx, + nonce: nonce || generateRandomNonceV2() + } +} diff --git a/src/lib/dvf/createFastWithdrawalPayload.js b/src/lib/dvf/createFastWithdrawalPayload.js index a2e35dfe..8cab4859 100644 --- a/src/lib/dvf/createFastWithdrawalPayload.js +++ b/src/lib/dvf/createFastWithdrawalPayload.js @@ -32,9 +32,15 @@ const getValidTokenInfo = dvf => token => { return tokenInfo } -const getFeeQuantised = async (dvf, token) => dvf - .fastWithdrawalFee(token) - .then(res => toBN(res.feeQuantised)) +const getFeeQuantised = (dvf) => async (token, amount, recipient) => dvf + .getWithdrawalQuote({ + token, + amount, + chain: 'ETHEREUM', + type: 'FAST', + recipient + }) + .then(res => toBN(res.fee)) const schema = Joi.object({ amount: Joi.amount(), @@ -64,17 +70,17 @@ module.exports = async (dvf, withdrawalData) => { const tokenInfo = getValidTokenInfo(dvf)(token) + const quantisedAmount = toQuantizedAmountBN(tokenInfo, amount) + const baseUnitsAmount = fromQuantizedToBaseUnitsBN(tokenInfo)(quantisedAmount) const feeQuantised = await ( transactionFee ? toQuantizedAmountBN(tokenInfo, transactionFee) - : getFeeQuantised(dvf, token) + : getFeeQuantised(dvf)(token, quantisedAmount.toString(), recipientEthAddress) ) const tokenContractAddress = token === 'ETH' ? address0 : tokenInfo.tokenAddressPerChain.ETHEREUM - const quantisedAmount = toQuantizedAmountBN(tokenInfo, amount) - const baseUnitsAmount = fromQuantizedToBaseUnitsBN(tokenInfo)(quantisedAmount) const nonce = dvf.util.generateRandomNonce() diff --git a/src/lib/dvf/post-generic.js b/src/lib/dvf/post-generic.js index a08fdce1..ccd8d908 100644 --- a/src/lib/dvf/post-generic.js +++ b/src/lib/dvf/post-generic.js @@ -1,4 +1,4 @@ -const { post } = require('request-promise') +const { request } = require('@rhino.fi/dvf-utils') const _omitBy = require('lodash/omitBy') const _isNil = require('lodash/isNil') @@ -6,11 +6,10 @@ module.exports = async (dvf, endpoint, json = {}, headers = {}) => { const url = dvf.config.api + endpoint const options = { - uri: url, headers, // removes null and undefined values - json: _omitBy(json, _isNil) + data: _omitBy(json, _isNil) } - return post(options) -} + return request.post(url, options) +} \ No newline at end of file diff --git a/src/lib/dvf/token/toBaseUnitAmount.js b/src/lib/dvf/token/toBaseUnitAmount.js index 5cbbde32..7e2fa852 100644 --- a/src/lib/dvf/token/toBaseUnitAmount.js +++ b/src/lib/dvf/token/toBaseUnitAmount.js @@ -1,7 +1,7 @@ const BN = require('bignumber.js') -module.exports = (dvf, token, amount) => { - const tokenInfo = dvf.token.getTokenInfo(token) +module.exports = (dvf, token, amount, customTokenInfo) => { + const tokenInfo = customTokenInfo || dvf.token.getTokenInfo(token) return new BN(10) .pow(tokenInfo.decimals) diff --git a/src/lib/keystore/index.js b/src/lib/keystore/index.js index 46bac70b..9b449b24 100644 --- a/src/lib/keystore/index.js +++ b/src/lib/keystore/index.js @@ -51,7 +51,10 @@ module.exports = sw => starkPrivateKey => { const sign = async tx => { const starkKeyPair = await getKeyPair() - const starkMessage = getMessage(sw)(tx) + const starkMessage = typeof tx === 'string' + ? tx + : getMessage(sw)(tx) + const signature = FP.mapValues( x => '0x' + x, starkSign({ sw }, starkKeyPair, starkMessage) diff --git a/src/lib/ledger/index.js b/src/lib/ledger/index.js index 688c718b..4569942a 100644 --- a/src/lib/ledger/index.js +++ b/src/lib/ledger/index.js @@ -22,15 +22,36 @@ const getMessage = sw => tx => { return starkTransferTxToMessageHash(sw)(tx) } +const withTransport = (dvf) => async (fn) => { + const Transport = selectTransport(dvf.isBrowser) + const transport = await Transport.create() + try { + return await fn(transport) + } finally { + await transport.close() + } +} + const getTxSignature = async (dvf, tx, path) => { + // Generic stark message Signing + if (typeof tx === 'string') { + return withTransport(dvf)(async (transport) => { + const eth = new Eth(transport) + const { address } = await eth.getAddress(path) + const starkPath = dvf.stark.ledger.getPath(address) + const paddedMessage = `0x${tx.padEnd(64, '0').substr(-64)}` + return eth.starkUnsafeSign( + starkPath, + paddedMessage + ) + }) + } + if (tx.type != null) { if (!(transferTransactionTypes.includes(tx.type))) { throw new DVFError(`Unsupported stark transaction type: ${tx.type}`, { tx }) } - let transport - try { - const Transport = selectTransport(dvf.isBrowser) - transport = await Transport.create() + return withTransport(dvf)(async (transport) => { const eth = new Eth(transport) const { address } = await eth.getAddress(path) const starkPath = dvf.stark.ledger.getPath(address) @@ -81,9 +102,7 @@ const getTxSignature = async (dvf, tx, path) => { tx.type === 'ConditionalTransferRequest' ? tx.factRegistryAddress : null, tx.type === 'ConditionalTransferRequest' ? tx.fact : null ) - } finally { - await transport.close() - } + }) } else { const { starkSignature } = await createSignedOrder( dvf, path, tx, { returnStarkPublicKey: false } diff --git a/src/lib/ledger/selectTransport.js b/src/lib/ledger/selectTransport.js index f2f85ed1..88c7e6a9 100644 --- a/src/lib/ledger/selectTransport.js +++ b/src/lib/ledger/selectTransport.js @@ -1,9 +1,4 @@ -module.exports = isBrowser => { - if (isBrowser) { - const Transport = require('@ledgerhq/hw-transport-webhid').default - return Transport - } else { - const Transport = require('@ledgerhq/hw-transport-node-hid').default - return Transport - } +module.exports = () => { + const Transport = require('@ledgerhq/hw-transport-webhid').default + return Transport } diff --git a/src/lib/stark/createMarketOrder.js b/src/lib/stark/createMarketOrder.js index 9c8827c0..a2950a69 100644 --- a/src/lib/stark/createMarketOrder.js +++ b/src/lib/stark/createMarketOrder.js @@ -1,4 +1,4 @@ -const P = require('aigle') +const P = require('@rhino.fi/aigle') const { preparePriceBN, prepareAmountBN, splitSymbol, toBN } = require('@rhino.fi/dvf-utils') const DVFError = require('../dvf/DVFError') const computeBuySellData = require('../dvf/computeBuySellData') diff --git a/src/lib/stark/createOrder.js b/src/lib/stark/createOrder.js index 701c0150..f75a19c0 100644 --- a/src/lib/stark/createOrder.js +++ b/src/lib/stark/createOrder.js @@ -1,4 +1,4 @@ -const P = require('aigle') +const P = require('@rhino.fi/aigle') const { preparePriceBN, prepareAmountBN, splitSymbol } = require('@rhino.fi/dvf-utils') const DVFError = require('../dvf/DVFError') const computeBuySellData = require('../dvf/computeBuySellData') diff --git a/src/lib/stark/createRegistrationMessage.js b/src/lib/stark/createRegistrationMessage.js new file mode 100644 index 00000000..601bd3bb --- /dev/null +++ b/src/lib/stark/createRegistrationMessage.js @@ -0,0 +1,44 @@ +const DVFError = require('../dvf/DVFError') +const sw = require('@rhino.fi/starkware-crypto') +const { utils } = require('web3') + +// Constant from Starkware contract +// https://github.com/starkware-libs/starkex-contracts/blob/210bd5f6bcb6977211677821fe925140859a0f6e/scalable-dex/contracts/src/components/ECDSA.sol#L13-L14 +const EC_ORDER = utils.BN('3618502788666131213697322783095070105526743751716087489154079457884512865583') + +/** + * @type {(dvf: ReturnType, + * starkHex: string, + * ethAddress: string) => utils.BN} + */ +module.exports = (dvf, starkHex, ethAddress) => { + if (!ethAddress) { + throw new Error('ethAddress is required') + } + + if (!starkHex) { + throw new Error('starkKeyHex is required') + } + + /* + uint256 msgHash = uint256( + keccak256(abi.encodePacked("UserRegistration:", ethKey, starkKey)) + ) % ECDSA.EC_ORDER; + */ + + try { + const hashedMessage = utils.soliditySha3( + utils.encodePacked( + { value: 'UserRegistration:', type: 'string' }, + { value: ethAddress, type: 'address' }, + { value: starkHex, type: 'uint256' }, + ) + ) + + const message = utils.BN(hashedMessage).mod(EC_ORDER).toString(16) + + return message + } catch (error) { + throw new DVFError('ERR_CREATING_STARK_REGISTRATION_MESSAGE', { error }) + } +} diff --git a/src/lib/stark/l1RegistrationCallData.js b/src/lib/stark/l1RegistrationCallData.js new file mode 100644 index 00000000..1e9af390 --- /dev/null +++ b/src/lib/stark/l1RegistrationCallData.js @@ -0,0 +1,20 @@ +/** + * @type {(dvf: ReturnType, + * tradingKey: string, + * ethAddress: string, + * starkLRegistrationSignature: string) => string} + */ +module.exports = async (dvf, starkKeyHex, ethAddress, starkL1RegistrationSignature) => { + const starkExContract = new dvf.web3.eth.Contract( + dvf.contract.abi.getStarkEx(), + dvf.config.DVF.starkExContractAddress, + ) + + const callData = starkExContract.methods.registerEthAddress( + ethAddress, + starkKeyHex, + starkL1RegistrationSignature + ).encodeABI() + + return callData +} diff --git a/src/lib/stark/ledger/createFastWithdrawalPayload.js b/src/lib/stark/ledger/createFastWithdrawalPayload.js index 0032f060..63c1ac1e 100644 --- a/src/lib/stark/ledger/createFastWithdrawalPayload.js +++ b/src/lib/stark/ledger/createFastWithdrawalPayload.js @@ -40,9 +40,15 @@ const getValidTokenInfo = dvf => token => { return tokenInfo } -const getFeeQuantised = async (dvf, token) => dvf - .fastWithdrawalFee(token) - .then(res => toBN(res.feeQuantised)) +const getFeeQuantised = (dvf) => async (token, amount, recipient) => dvf + .getWithdrawalQuote({ + token, + amount, + chain: 'ETHEREUM', + type: 'FAST', + recipient + }) + .then(res => toBN(res.fee)) const schema = Joi.object({ amount: Joi.amount(), @@ -73,17 +79,17 @@ module.exports = async (dvf, withdrawalData, path) => { const tokenInfo = getValidTokenInfo(dvf)(token) const transferQuantization = new BN(tokenInfo.quantization) + const quantisedAmount = toQuantizedAmountBN(tokenInfo, amount) + const baseUnitsAmount = fromQuantizedToBaseUnitsBN(tokenInfo)(quantisedAmount) const feeQuantised = await ( transactionFee ? toQuantizedAmountBN(tokenInfo, transactionFee) - : getFeeQuantised(dvf, token) + : getFeeQuantised(dvf)(token, quantisedAmount.toString(), recipientEthAddress) ) const tokenContractAddress = token === 'ETH' ? address0 : tokenInfo.tokenAddressPerChain.ETHEREUM - const quantisedAmount = toQuantizedAmountBN(tokenInfo, amount) - const baseUnitsAmount = fromQuantizedToBaseUnitsBN(tokenInfo)(quantisedAmount) const nonce = dvf.util.generateRandomNonce() diff --git a/src/lib/stark/signAmmFundingOrder.js b/src/lib/stark/signAmmFundingOrder.js index d6c1a2d3..43bb4d2e 100644 --- a/src/lib/stark/signAmmFundingOrder.js +++ b/src/lib/stark/signAmmFundingOrder.js @@ -1,4 +1,4 @@ -const P = require('aigle') +const P = require('@rhino.fi/aigle') const createSignedTransaction = require('../dvf/createSignedTransaction') module.exports = dvf => async data => ({ diff --git a/src/lib/stark/signRegistration.js b/src/lib/stark/signRegistration.js new file mode 100644 index 00000000..163e49fd --- /dev/null +++ b/src/lib/stark/signRegistration.js @@ -0,0 +1,35 @@ +const DVFError = require('../dvf/DVFError') +const sw = require('@rhino.fi/starkware-crypto') + +const pad = (rec) => rec.padStart(64, 0) +const removePrefix = (input) => input.replace(/^0x/, '') + +/** + * @type {(dvf: ReturnType, + * tradingKey: string, + * ethAddress: string) => Promise} + */ +module.exports = async (dvf, ethAddress) => { + const { dvfStarkProvider } = dvf + const publicKey = await dvfStarkProvider.getPublicKey() + + const message = dvf.stark.createRegistrationMessage(`0x${pad(publicKey.x)}`, ethAddress) + + try { + const { r, s } = await dvfStarkProvider.sign(message) + + const components = [ + r.toString(16), + s.toString(16), + publicKey.y + ] + .map(removePrefix) + .map(pad) + + const final = `0x${components.join('')}` + + return final + } catch (error) { + throw new DVFError('ERR_CREATING_STARK_REGISTRATION_SIGNATURE', { error }) + } +} diff --git a/yarn.lock b/yarn.lock index 9beea394..8220efc0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1010,6 +1010,17 @@ __metadata: languageName: node linkType: hard +"@jest/environment@npm:^25.5.0": + version: 25.5.0 + resolution: "@jest/environment@npm:25.5.0" + dependencies: + "@jest/fake-timers": ^25.5.0 + "@jest/types": ^25.5.0 + jest-mock: ^25.5.0 + checksum: 93a9ddbcfafef26c21bb880ea947493f4b248e5d929ed165290079ac28559fa0d6983641ad57abe30d9ae13d3ecf73034964e2adc3b7bb207f1888818e6a3432 + languageName: node + linkType: hard + "@jest/environment@npm:^26.6.2": version: 26.6.2 resolution: "@jest/environment@npm:26.6.2" @@ -1022,6 +1033,19 @@ __metadata: languageName: node linkType: hard +"@jest/fake-timers@npm:^25.5.0": + version: 25.5.0 + resolution: "@jest/fake-timers@npm:25.5.0" + dependencies: + "@jest/types": ^25.5.0 + jest-message-util: ^25.5.0 + jest-mock: ^25.5.0 + jest-util: ^25.5.0 + lolex: ^5.0.0 + checksum: e34dc713a2e26e936aa15d0d6f479ad9ffbea13d50436f873631fd8077fd746d23e2ce1f0bd2ac32fe99f0dac3eae35960a59fdd98830c0134819e5c9b7e822e + languageName: node + linkType: hard + "@jest/fake-timers@npm:^26.6.2": version: 26.6.2 resolution: "@jest/fake-timers@npm:26.6.2" @@ -1142,6 +1166,18 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:^25.5.0": + version: 25.5.0 + resolution: "@jest/types@npm:25.5.0" + dependencies: + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^1.1.1 + "@types/yargs": ^15.0.0 + chalk: ^3.0.0 + checksum: 785b67521a2c54f290ad4b53f49fec6b14fa25828bf26a838f7bbe08dd42122f27f71a620ea9a33286346786e9b120dd370abf589e6ef8c5fde9dc56906880b1 + languageName: node + linkType: hard + "@jest/types@npm:^26.6.2": version: 26.6.2 resolution: "@jest/types@npm:26.6.2" @@ -1207,12 +1243,12 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/cryptoassets@npm:^6.23.0": - version: 6.23.0 - resolution: "@ledgerhq/cryptoassets@npm:6.23.0" +"@ledgerhq/cryptoassets@npm:^6.28.1": + version: 6.37.0 + resolution: "@ledgerhq/cryptoassets@npm:6.37.0" dependencies: invariant: 2 - checksum: 903bd6bdcc847fcd6631e4fabb894bf172a19e262f42b8d2d976862991f242d67c46523048398164ec5fb49e8132092b1dbd2d2e4e04d18ea58774e04ecde95f + checksum: 2418c1751740e976d1509b7ce6da447cc3a0f05e1498db252bab70c635881658c8a4a4eaba39cfbc98f4ad373a355689131eb6f844d3a4fe2f6b2af9ddbd6e90 languageName: node linkType: hard @@ -1228,15 +1264,27 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/devices@npm:^6.20.0": - version: 6.20.0 - resolution: "@ledgerhq/devices@npm:6.20.0" +"@ledgerhq/devices@npm:^6.27.1": + version: 6.27.1 + resolution: "@ledgerhq/devices@npm:6.27.1" dependencies: "@ledgerhq/errors": ^6.10.0 "@ledgerhq/logs": ^6.10.0 rxjs: 6 semver: ^7.3.5 - checksum: 67246ffe6d6b95e3ec2f6ce2f02eeb138397911f7018c1055ec8ed103e9790b4f825754e2f0e64f554e90f698fec05e2c80abf2bf3ec3c0eecc490acf4c21ad7 + checksum: e4615841b094fe4990c74421c23f57da6a83b56bfa73880af3ce0a67db86f5b3a642f6022be24bf4b24d7b236623a578dbdba74805b28e2486006d1f0cbff543 + languageName: node + linkType: hard + +"@ledgerhq/devices@npm:^8.0.5": + version: 8.0.5 + resolution: "@ledgerhq/devices@npm:8.0.5" + dependencies: + "@ledgerhq/errors": ^6.13.0 + "@ledgerhq/logs": ^6.10.1 + rxjs: 6 + semver: ^7.3.5 + checksum: c10784e89fdc252ea60a48dc07cbe279922fb6b2ae95a686dc50445b5494b5ee1db02eecf4abaf321812702992874d3abcd3c555db2bcb93c8e8bc3c9947c2dd languageName: node linkType: hard @@ -1254,19 +1302,26 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-app-eth@npm:6.23.0": - version: 6.23.0 - resolution: "@ledgerhq/hw-app-eth@npm:6.23.0" +"@ledgerhq/errors@npm:^6.13.0": + version: 6.13.0 + resolution: "@ledgerhq/errors@npm:6.13.0" + checksum: 47f3942715ab7eb93e183276b22b3b1e16cfa2543986be8f327eacc233f9e3dcc73fc645c96cb3d004db34b7a35d079c1767b41b90ba49f1f08d6bc004c2c3ad + languageName: node + linkType: hard + +"@ledgerhq/hw-app-eth@npm:6.28.1": + version: 6.28.1 + resolution: "@ledgerhq/hw-app-eth@npm:6.28.1" dependencies: "@ethersproject/abi": ^5.5.0 "@ethersproject/rlp": ^5.5.0 - "@ledgerhq/cryptoassets": ^6.23.0 + "@ledgerhq/cryptoassets": ^6.28.1 "@ledgerhq/errors": ^6.10.0 - "@ledgerhq/hw-transport": ^6.20.0 + "@ledgerhq/hw-transport": ^6.27.1 "@ledgerhq/logs": ^6.10.0 - axios: ^0.24.0 + axios: ^0.26.1 bignumber.js: ^9.0.2 - checksum: 7278d398e25e78195e199d5b54fbc4ffbe81766e6fa4bb335852771f3c721fdcce2644a6bc298069e8e2358517f27bed407e48ced72721db3cb4b090cb71cb42 + checksum: bf40eb2095f0016ce02a5febf5049aaaacdeb521f4824ed25c4efac2cacb37d5e17b5b322d42615dd7edeee86d5843f92663064bab7be9368b6f6e2c8a672092 languageName: node linkType: hard @@ -1280,15 +1335,15 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-transport-webhid@npm:6.20.0": - version: 6.20.0 - resolution: "@ledgerhq/hw-transport-webhid@npm:6.20.0" +"@ledgerhq/hw-transport-webhid@npm:6.27.1": + version: 6.27.1 + resolution: "@ledgerhq/hw-transport-webhid@npm:6.27.1" dependencies: - "@ledgerhq/devices": ^6.20.0 + "@ledgerhq/devices": ^6.27.1 "@ledgerhq/errors": ^6.10.0 - "@ledgerhq/hw-transport": ^6.20.0 + "@ledgerhq/hw-transport": ^6.27.1 "@ledgerhq/logs": ^6.10.0 - checksum: 3d98e9a4a7144ad891873562d2d93b7f30b0c081121bb4b2531b42679903c3b5b748bffec965f12551b1b35df05f287d9fdff4c58b94e4d1cb94cff69c86e8ae + checksum: 3b1acc8ab5e11058b17acaebfe3297be4cb5678030843b56cb558bc48c7b7816db8c95cc5eebfad1dd47fd2cff8f2384b168da1180d4682afbdd2adfc00937dc languageName: node linkType: hard @@ -1303,14 +1358,14 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-transport@npm:^6.20.0": - version: 6.20.0 - resolution: "@ledgerhq/hw-transport@npm:6.20.0" +"@ledgerhq/hw-transport@npm:^6.27.1": + version: 6.28.6 + resolution: "@ledgerhq/hw-transport@npm:6.28.6" dependencies: - "@ledgerhq/devices": ^6.20.0 - "@ledgerhq/errors": ^6.10.0 + "@ledgerhq/devices": ^8.0.5 + "@ledgerhq/errors": ^6.13.0 events: ^3.3.0 - checksum: 89ecfeba2b2e179a665325603d74c7aa85042d1268bbb6f0cd023e15510cda468a3f162ba9140134fe1c1f24832765fbe5a99f396caaa67b2a5914ea02ab07c4 + checksum: 835e3de33be404276d4951fb0ba4d085a46a6f39bb5261324885378ccee2dd75742888f9b00fd6129e26d439c82a9ef5010e292181a1b8199370de7abc481c01 languageName: node linkType: hard @@ -1328,6 +1383,13 @@ __metadata: languageName: node linkType: hard +"@ledgerhq/logs@npm:^6.10.1": + version: 6.10.1 + resolution: "@ledgerhq/logs@npm:6.10.1" + checksum: 4dde46557d9daa6028f7040d26585aaa7260445212ad8348ae4a01463b7d76a1592dfc36921e47f5fc477c50b5d73e840070ac167e3cbe5b45123f36a4f96b08 + languageName: node + linkType: hard + "@metamask/eth-sig-util@npm:4.0.1": version: 4.0.1 resolution: "@metamask/eth-sig-util@npm:4.0.1" @@ -1389,28 +1451,37 @@ __metadata: languageName: node linkType: hard +"@rhino.fi/aigle@npm:^1.15.0-alpha.3": + version: 1.15.0-alpha.3 + resolution: "@rhino.fi/aigle@npm:1.15.0-alpha.3" + dependencies: + aigle-core: ^1.0.0 + checksum: 347ddf9d6718dfe0621082519b5aa98c60a3a15ed9afa648e911b686014964dc547305b6a63ceab053952fdfb90fa13347612282d88ee1efe2319bdc46cd149f + languageName: node + linkType: hard + "@rhino.fi/client-js@workspace:.": version: 0.0.0-use.local resolution: "@rhino.fi/client-js@workspace:." dependencies: - "@ledgerhq/hw-app-eth": 6.23.0 + "@ledgerhq/hw-app-eth": 6.28.1 "@ledgerhq/hw-transport-mocker": ^5.25.0 - "@ledgerhq/hw-transport-webhid": 6.20.0 + "@ledgerhq/hw-transport-webhid": 6.27.1 + "@rhino.fi/aigle": ^1.15.0-alpha.3 "@rhino.fi/dvf-utils": ^1.4.5 "@rhino.fi/starkware-crypto": ^0.1.7 "@truffle/hdwallet-provider": ^2.0.13 - aigle: "suguru03/aigle#8739846ba9d4cfc116e1546da1181c73564cae0b" aware: ^0.3.1 bignumber.js: ^9.0.0 eip-712: 1.0.0 env-cmd: ^10.1.0 jest: ^26.4.2 + jest-environment-jsdom: 25 lodash: ^4.17.20 mustache: ^4.0.0 nock: ^13.0.4 ramda: ^0.27.1 request: ^2.88.2 - request-promise: ^4.2.6 solc: ^0.4.24 web3: ^1.7.5 web3-utils: ^1.3.0 @@ -1667,6 +1738,16 @@ __metadata: languageName: node linkType: hard +"@types/istanbul-reports@npm:^1.1.1": + version: 1.1.2 + resolution: "@types/istanbul-reports@npm:1.1.2" + dependencies: + "@types/istanbul-lib-coverage": "*" + "@types/istanbul-lib-report": "*" + checksum: 00866e815d1e68d0a590d691506937b79d8d65ad8eab5ed34dbfee66136c7c0f4ea65327d32046d5fe469f22abea2b294987591dc66365ebc3991f7e413b2d78 + languageName: node + linkType: hard + "@types/istanbul-reports@npm:^3.0.0": version: 3.0.1 resolution: "@types/istanbul-reports@npm:3.0.1" @@ -1747,6 +1828,13 @@ __metadata: languageName: node linkType: hard +"@types/stack-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "@types/stack-utils@npm:1.0.1" + checksum: 9dc052b575acfeca3f165fb19d87b7b2989d54ed7d64a7eeb0b7587bc5795ef1f2c2b1511a44dcf0831ef35b8ce3486f97fcbfdd50c01f68aa297de31502c9d9 + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.0": version: 2.0.1 resolution: "@types/stack-utils@npm:2.0.1" @@ -1770,7 +1858,7 @@ __metadata: languageName: node linkType: hard -"abab@npm:^2.0.3, abab@npm:^2.0.5": +"abab@npm:^2.0.0, abab@npm:^2.0.3, abab@npm:^2.0.5": version: 2.0.6 resolution: "abab@npm:2.0.6" checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e @@ -1819,6 +1907,16 @@ __metadata: languageName: node linkType: hard +"acorn-globals@npm:^4.3.2": + version: 4.3.4 + resolution: "acorn-globals@npm:4.3.4" + dependencies: + acorn: ^6.0.1 + acorn-walk: ^6.0.1 + checksum: c31bfde102d8a104835e9591c31dd037ec771449f9c86a6b1d2ac3c7c336694f828cfabba7687525b094f896a854affbf1afe6e1b12c0d998be6bab5d49c9663 + languageName: node + linkType: hard + "acorn-globals@npm:^6.0.0": version: 6.0.0 resolution: "acorn-globals@npm:6.0.0" @@ -1829,6 +1927,13 @@ __metadata: languageName: node linkType: hard +"acorn-walk@npm:^6.0.1": + version: 6.2.0 + resolution: "acorn-walk@npm:6.2.0" + checksum: ea241a5d96338f1e8030aafae72a91ff0ec4360e2775e44a2fdb2eb618b07fc309e000a5126056631ac7f00fe8bd9bbd23fcb6d018eee4ba11086eb36c1b2e61 + languageName: node + linkType: hard + "acorn-walk@npm:^7.1.1": version: 7.2.0 resolution: "acorn-walk@npm:7.2.0" @@ -1836,7 +1941,16 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^7.1.1": +"acorn@npm:^6.0.1": + version: 6.4.2 + resolution: "acorn@npm:6.4.2" + bin: + acorn: bin/acorn + checksum: 44b07053729db7f44d28343eed32247ed56dc4a6ec6dff2b743141ecd6b861406bbc1c20bf9d4f143ea7dd08add5dc8c290582756539bc03a8db605050ce2fb4 + languageName: node + linkType: hard + +"acorn@npm:^7.1.0, acorn@npm:^7.1.1": version: 7.4.1 resolution: "acorn@npm:7.4.1" bin: @@ -1898,15 +2012,6 @@ __metadata: languageName: node linkType: hard -"aigle@suguru03/aigle#8739846ba9d4cfc116e1546da1181c73564cae0b": - version: 1.15.0-alpha.0 - resolution: "aigle@https://github.com/suguru03/aigle.git#commit=8739846ba9d4cfc116e1546da1181c73564cae0b" - dependencies: - aigle-core: ^1.0.0 - checksum: 35c493511d9697428da7b7ce57d9069f8c562b5857777cb00824c2bb62f7c373e58293f6b44a94de65c47ee05bd87664bbfc6fa2a652751f75d9089ce1053cc0 - languageName: node - linkType: hard - "ajv@npm:^6.12.3": version: 6.12.6 resolution: "ajv@npm:6.12.6" @@ -2027,6 +2132,13 @@ __metadata: languageName: node linkType: hard +"array-equal@npm:^1.0.0": + version: 1.0.0 + resolution: "array-equal@npm:1.0.0" + checksum: 3f68045806357db9b2fa1ad583e42a659de030633118a0cd35ee4975cb20db3b9a3d36bbec9b5afe70011cf989eefd215c12fe0ce08c498f770859ca6e70688a + languageName: node + linkType: hard + "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -2172,6 +2284,15 @@ __metadata: languageName: node linkType: hard +"axios@npm:^0.26.1": + version: 0.26.1 + resolution: "axios@npm:0.26.1" + dependencies: + follow-redirects: ^1.14.8 + checksum: d9eb58ff4bc0b36a04783fc9ff760e9245c829a5a1052ee7ca6013410d427036b1d10d04e7380c02f3508c5eaf3485b1ae67bd2adbfec3683704745c8d7a6e1a + languageName: node + linkType: hard + "babel-jest@npm:^26.6.3": version: 26.6.3 resolution: "babel-jest@npm:26.6.3" @@ -2778,6 +2899,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: 8e3ddf3981c4da405ddbd7d9c8d91944ddf6e33d6837756979f7840a29272a69a5189ecae0ff84006750d6d1e92368d413335eab4db5476db6e6703a1d1e0505 + languageName: node + linkType: hard + "chalk@npm:^4.0.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -3240,7 +3371,7 @@ __metadata: languageName: node linkType: hard -"cssom@npm:^0.4.4": +"cssom@npm:^0.4.1, cssom@npm:^0.4.4": version: 0.4.4 resolution: "cssom@npm:0.4.4" checksum: e3bc1076e7ee4213d4fef05e7ae03bfa83dc05f32611d8edc341f4ecc3d9647b89c8245474c7dd2cdcdb797a27c462e99da7ad00a34399694559f763478ff53f @@ -3254,7 +3385,7 @@ __metadata: languageName: node linkType: hard -"cssstyle@npm:^2.3.0": +"cssstyle@npm:^2.0.0, cssstyle@npm:^2.3.0": version: 2.3.0 resolution: "cssstyle@npm:2.3.0" dependencies: @@ -3282,6 +3413,17 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^1.1.0": + version: 1.1.0 + resolution: "data-urls@npm:1.1.0" + dependencies: + abab: ^2.0.0 + whatwg-mimetype: ^2.2.0 + whatwg-url: ^7.0.0 + checksum: dc4bd9621df0dff336d7c4c0517c792488ef3cf11cd37e72ab80f3a7f0a0aa14bad677ac97cf22c87c6eb9518e58b98590e1c8c756b56240940f0e470c81612e + languageName: node + linkType: hard + "data-urls@npm:^2.0.0": version: 2.0.0 resolution: "data-urls@npm:2.0.0" @@ -3507,6 +3649,15 @@ __metadata: languageName: node linkType: hard +"domexception@npm:^1.0.1": + version: 1.0.1 + resolution: "domexception@npm:1.0.1" + dependencies: + webidl-conversions: ^4.0.2 + checksum: f564a9c0915dcb83ceefea49df14aaed106b1468fbe505119e8bcb0b77e242534f3aba861978537c0fc9dc6f35b176d0ffc77b3e342820fb27a8f215e7ae4d52 + languageName: node + linkType: hard + "domexception@npm:^2.0.1": version: 2.0.1 resolution: "domexception@npm:2.0.1" @@ -3767,6 +3918,25 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^1.11.1": + version: 1.14.3 + resolution: "escodegen@npm:1.14.3" + dependencies: + esprima: ^4.0.1 + estraverse: ^4.2.0 + esutils: ^2.0.2 + optionator: ^0.8.1 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 381cdc4767ecdb221206bbbab021b467bbc2a6f5c9a99c9e6353040080bdd3dfe73d7604ad89a47aca6ea7d58bc635f6bd3fbc8da9a1998e9ddfa8372362ccd0 + languageName: node + linkType: hard + "escodegen@npm:^2.0.0": version: 2.0.0 resolution: "escodegen@npm:2.0.0" @@ -3796,6 +3966,13 @@ __metadata: languageName: node linkType: hard +"estraverse@npm:^4.2.0": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + "estraverse@npm:^5.2.0": version: 5.2.0 resolution: "estraverse@npm:5.2.0" @@ -4532,6 +4709,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.14.8": + version: 1.15.2 + resolution: "follow-redirects@npm:1.15.2" + peerDependenciesMeta: + debug: + optional: true + checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -5123,6 +5310,15 @@ __metadata: languageName: node linkType: hard +"html-encoding-sniffer@npm:^1.0.2": + version: 1.0.2 + resolution: "html-encoding-sniffer@npm:1.0.2" + dependencies: + whatwg-encoding: ^1.0.1 + checksum: b874df6750451b7642fbe8e998c6bdd2911b0f42ad2927814b717bf1f4b082b0904b6178a1bfbc40117bf5799777993b0825e7713ca0fca49844e5aec03aa0e2 + languageName: node + linkType: hard + "html-encoding-sniffer@npm:^2.0.1": version: 2.0.1 resolution: "html-encoding-sniffer@npm:2.0.1" @@ -5353,6 +5549,13 @@ __metadata: languageName: node linkType: hard +"ip-regex@npm:^2.1.0": + version: 2.1.0 + resolution: "ip-regex@npm:2.1.0" + checksum: 331d95052aa53ce245745ea0fc3a6a1e2e3c8d6da65fa8ea52bf73768c1b22a9ac50629d1d2b08c04e7b3ac4c21b536693c149ce2c2615ee4796030e5b3e3cba + languageName: node + linkType: hard + "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" @@ -5999,6 +6202,20 @@ __metadata: languageName: node linkType: hard +"jest-environment-jsdom@npm:25": + version: 25.5.0 + resolution: "jest-environment-jsdom@npm:25.5.0" + dependencies: + "@jest/environment": ^25.5.0 + "@jest/fake-timers": ^25.5.0 + "@jest/types": ^25.5.0 + jest-mock: ^25.5.0 + jest-util: ^25.5.0 + jsdom: ^15.2.1 + checksum: 3f8b54a0a49492ba82aedcf0b0015dbb106a8eb6adca4525424072abadf1b654383ea6f42de76eeb3deb5aac17728583df2b538bf481ca85a3e61f07e7e6ec3e + languageName: node + linkType: hard + "jest-environment-jsdom@npm:^26.6.2": version: 26.6.2 resolution: "jest-environment-jsdom@npm:26.6.2" @@ -6108,6 +6325,22 @@ __metadata: languageName: node linkType: hard +"jest-message-util@npm:^25.5.0": + version: 25.5.0 + resolution: "jest-message-util@npm:25.5.0" + dependencies: + "@babel/code-frame": ^7.0.0 + "@jest/types": ^25.5.0 + "@types/stack-utils": ^1.0.1 + chalk: ^3.0.0 + graceful-fs: ^4.2.4 + micromatch: ^4.0.2 + slash: ^3.0.0 + stack-utils: ^1.0.1 + checksum: 16ab8999802649069504a6eb1b2ee645d048cfe8dd2a8ac2a552d5f7f67bf657f02e1974c8e18313dbe9b4e9d83f80510757c1e6b4e5392db7d5da68d4eeebba + languageName: node + linkType: hard + "jest-message-util@npm:^26.6.2": version: 26.6.2 resolution: "jest-message-util@npm:26.6.2" @@ -6125,6 +6358,15 @@ __metadata: languageName: node linkType: hard +"jest-mock@npm:^25.5.0": + version: 25.5.0 + resolution: "jest-mock@npm:25.5.0" + dependencies: + "@jest/types": ^25.5.0 + checksum: b0e3cc2ccb05b45fc1ec52476d07740cab980d7ed41bf621c9000b9c5e4dafb05bc3f8ca6f7907a865d89522001a14f582863c6481af9e972a8f1765f0fe852e + languageName: node + linkType: hard + "jest-mock@npm:^26.6.2": version: 26.6.2 resolution: "jest-mock@npm:26.6.2" @@ -6280,6 +6522,19 @@ __metadata: languageName: node linkType: hard +"jest-util@npm:^25.5.0": + version: 25.5.0 + resolution: "jest-util@npm:25.5.0" + dependencies: + "@jest/types": ^25.5.0 + chalk: ^3.0.0 + graceful-fs: ^4.2.4 + is-ci: ^2.0.0 + make-dir: ^3.0.0 + checksum: 4c982e37968914d9e8b8330d2838533a4e8566b80b38cbb0916a19660a805357913aae1382fef35aeb4e348ba5dad77eb7413a16d533cdba7317941e01236352 + languageName: node + linkType: hard + "jest-util@npm:^26.6.2": version: 26.6.2 resolution: "jest-util@npm:26.6.2" @@ -6400,6 +6655,45 @@ __metadata: languageName: node linkType: hard +"jsdom@npm:^15.2.1": + version: 15.2.1 + resolution: "jsdom@npm:15.2.1" + dependencies: + abab: ^2.0.0 + acorn: ^7.1.0 + acorn-globals: ^4.3.2 + array-equal: ^1.0.0 + cssom: ^0.4.1 + cssstyle: ^2.0.0 + data-urls: ^1.1.0 + domexception: ^1.0.1 + escodegen: ^1.11.1 + html-encoding-sniffer: ^1.0.2 + nwsapi: ^2.2.0 + parse5: 5.1.0 + pn: ^1.1.0 + request: ^2.88.0 + request-promise-native: ^1.0.7 + saxes: ^3.1.9 + symbol-tree: ^3.2.2 + tough-cookie: ^3.0.1 + w3c-hr-time: ^1.0.1 + w3c-xmlserializer: ^1.1.2 + webidl-conversions: ^4.0.2 + whatwg-encoding: ^1.0.5 + whatwg-mimetype: ^2.3.0 + whatwg-url: ^7.0.0 + ws: ^7.0.0 + xml-name-validator: ^3.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: eff437b977330b1e63cd3ee2c2fe7c799c876799cae35525e1e6864d939dd41631ebd65f847adaeb83c2160c828d027d0f1d0dbe88366d1da22c875a5165a78c + languageName: node + linkType: hard + "jsdom@npm:^16.4.0": version: 16.7.0 resolution: "jsdom@npm:16.7.0" @@ -6776,6 +7070,13 @@ __metadata: languageName: node linkType: hard +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c + languageName: node + linkType: hard + "lodash@npm:^4.17.14, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.7.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -6783,6 +7084,15 @@ __metadata: languageName: node linkType: hard +"lolex@npm:^5.0.0": + version: 5.1.2 + resolution: "lolex@npm:5.1.2" + dependencies: + "@sinonjs/commons": ^1.7.0 + checksum: 7eb468d4ef4746c024d23cb2b75f679f79449a9d5cbe11abadf2f3b147c1d7ffe28816438bedfb8a75c58357a625c2f9ba197b050c226d2b3f0c4a956cf556fb + languageName: node + linkType: hard + "loose-envify@npm:^1.0.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -7828,6 +8138,13 @@ __metadata: languageName: node linkType: hard +"parse5@npm:5.1.0": + version: 5.1.0 + resolution: "parse5@npm:5.1.0" + checksum: 13c44c6d47035a3cc75303655ae5630dc264f9b9ab8344feb3f79ca195d8b57a2a246af902abef1d780ad1eee92eb9b88cd03098a7ee7dd111f032152ebaf0a6 + languageName: node + linkType: hard + "parse5@npm:6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" @@ -7998,6 +8315,13 @@ __metadata: languageName: node linkType: hard +"pn@npm:^1.1.0": + version: 1.1.0 + resolution: "pn@npm:1.1.0" + checksum: e4654186dc92a187c8c7fe4ccda902f4d39dd9c10f98d1c5a08ce5fad5507ef1e33ddb091240c3950bee81bd201b4c55098604c433a33b5e8bdd97f38b732fa0 + languageName: node + linkType: hard + "posix-character-classes@npm:^0.1.0": version: 0.1.1 resolution: "posix-character-classes@npm:0.1.1" @@ -8416,21 +8740,20 @@ __metadata: languageName: node linkType: hard -"request-promise@npm:^4.2.6": - version: 4.2.6 - resolution: "request-promise@npm:4.2.6" +"request-promise-native@npm:^1.0.7": + version: 1.0.9 + resolution: "request-promise-native@npm:1.0.9" dependencies: - bluebird: ^3.5.0 request-promise-core: 1.1.4 stealthy-require: ^1.1.1 tough-cookie: ^2.3.3 peerDependencies: request: ^2.34 - checksum: 1856c718cb4b888db8b6a206537ecac47390ea4fbdaef00da9a6169a03dd66a95c38493713f927f78a19bfeb28dcb28f5d20f6ab927d644d9e0626847d808f9f + checksum: 3e2c694eefac88cb20beef8911ad57a275ab3ccbae0c4ca6c679fffb09d5fd502458aab08791f0814ca914b157adab2d4e472597c97a73be702918e41725ed69 languageName: node linkType: hard -"request@npm:^2.79.0, request@npm:^2.85.0, request@npm:^2.88.2": +"request@npm:^2.79.0, request@npm:^2.85.0, request@npm:^2.88.0, request@npm:^2.88.2": version: 2.88.2 resolution: "request@npm:2.88.2" dependencies: @@ -8689,6 +9012,15 @@ __metadata: languageName: node linkType: hard +"saxes@npm:^3.1.9": + version: 3.1.11 + resolution: "saxes@npm:3.1.11" + dependencies: + xmlchars: ^2.1.1 + checksum: 3b69918c013fffae51c561f629a0f620c02dba70f762dab38f3cd92676dfe5edf1f0a523ca567882838f1a80e26e4671a8c2c689afa05c68f45a78261445aba0 + languageName: node + linkType: hard + "saxes@npm:^5.0.1": version: 5.0.1 resolution: "saxes@npm:5.0.1" @@ -9179,6 +9511,15 @@ __metadata: languageName: node linkType: hard +"stack-utils@npm:^1.0.1": + version: 1.0.5 + resolution: "stack-utils@npm:1.0.5" + dependencies: + escape-string-regexp: ^2.0.0 + checksum: f82baf8d89536252a55c76866d5be3d04c96b09693a8d2ab3794b9fdec3674e05bd3f3d19345093e2cbba116a1f8f413858e0537bc3c81c605249261c3d26182 + languageName: node + linkType: hard + "stack-utils@npm:^2.0.2": version: 2.0.5 resolution: "stack-utils@npm:2.0.5" @@ -9416,7 +9757,7 @@ __metadata: languageName: node linkType: hard -"symbol-tree@npm:^3.2.4": +"symbol-tree@npm:^3.2.2, symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" checksum: 6e8fc7e1486b8b54bea91199d9535bb72f10842e40c79e882fc94fb7b14b89866adf2fd79efa5ebb5b658bc07fb459ccce5ac0e99ef3d72f474e74aaf284029d @@ -9558,6 +9899,17 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^3.0.1": + version: 3.0.1 + resolution: "tough-cookie@npm:3.0.1" + dependencies: + ip-regex: ^2.1.0 + psl: ^1.1.28 + punycode: ^2.1.1 + checksum: 796f6239bce5674a1267b19f41972a2602a2a23715817237b5922b0dc2343512512eea7d41d29210a4ec545f8ef32173bbbf01277dd8ec3ae3841b19cbe69f67 + languageName: node + linkType: hard + "tough-cookie@npm:^4.0.0": version: 4.0.0 resolution: "tough-cookie@npm:4.0.0" @@ -9569,6 +9921,15 @@ __metadata: languageName: node linkType: hard +"tr46@npm:^1.0.1": + version: 1.0.1 + resolution: "tr46@npm:1.0.1" + dependencies: + punycode: ^2.1.0 + checksum: 96d4ed46bc161db75dbf9247a236ea0bfcaf5758baae6749e92afab0bc5a09cb59af21788ede7e55080f2bf02dce3e4a8f2a484cc45164e29f4b5e68f7cbcc1a + languageName: node + linkType: hard + "tr46@npm:^2.1.0": version: 2.1.0 resolution: "tr46@npm:2.1.0" @@ -9957,7 +10318,7 @@ __metadata: languageName: node linkType: hard -"w3c-hr-time@npm:^1.0.2": +"w3c-hr-time@npm:^1.0.1, w3c-hr-time@npm:^1.0.2": version: 1.0.2 resolution: "w3c-hr-time@npm:1.0.2" dependencies: @@ -9966,6 +10327,17 @@ __metadata: languageName: node linkType: hard +"w3c-xmlserializer@npm:^1.1.2": + version: 1.1.2 + resolution: "w3c-xmlserializer@npm:1.1.2" + dependencies: + domexception: ^1.0.1 + webidl-conversions: ^4.0.2 + xml-name-validator: ^3.0.0 + checksum: 1683e083d0dfc1529988f8956510a3a26e90738b41c4df0c7eb95283bfbeabeb492308117dcd32afef2a141e2a959ddf10ce562983d91b9f474a530b9dcdd337 + languageName: node + linkType: hard + "w3c-xmlserializer@npm:^2.0.0": version: 2.0.0 resolution: "w3c-xmlserializer@npm:2.0.0" @@ -10309,6 +10681,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^4.0.2": + version: 4.0.2 + resolution: "webidl-conversions@npm:4.0.2" + checksum: c93d8dfe908a0140a4ae9c0ebc87a33805b416a33ee638a605b551523eec94a9632165e54632f6d57a39c5f948c4bab10e0e066525e9a4b87a79f0d04fbca374 + languageName: node + linkType: hard + "webidl-conversions@npm:^5.0.0": version: 5.0.0 resolution: "webidl-conversions@npm:5.0.0" @@ -10337,7 +10716,7 @@ __metadata: languageName: node linkType: hard -"whatwg-encoding@npm:^1.0.5": +"whatwg-encoding@npm:^1.0.1, whatwg-encoding@npm:^1.0.5": version: 1.0.5 resolution: "whatwg-encoding@npm:1.0.5" dependencies: @@ -10353,7 +10732,7 @@ __metadata: languageName: node linkType: hard -"whatwg-mimetype@npm:^2.3.0": +"whatwg-mimetype@npm:^2.2.0, whatwg-mimetype@npm:^2.3.0": version: 2.3.0 resolution: "whatwg-mimetype@npm:2.3.0" checksum: 23eb885940bcbcca4ff841c40a78e9cbb893ec42743993a42bf7aed16085b048b44b06f3402018931687153550f9a32d259dfa524e4f03577ab898b6965e5383 @@ -10370,6 +10749,17 @@ __metadata: languageName: node linkType: hard +"whatwg-url@npm:^7.0.0": + version: 7.1.0 + resolution: "whatwg-url@npm:7.1.0" + dependencies: + lodash.sortby: ^4.7.0 + tr46: ^1.0.1 + webidl-conversions: ^4.0.2 + checksum: fecb07c87290b47d2ec2fb6d6ca26daad3c9e211e0e531dd7566e7ff95b5b3525a57d4f32640ad4adf057717e0c215731db842ad761e61d947e81010e05cf5fd + languageName: node + linkType: hard + "whatwg-url@npm:^8.0.0, whatwg-url@npm:^8.5.0": version: 8.7.0 resolution: "whatwg-url@npm:8.7.0" @@ -10529,7 +10919,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.4.6": +"ws@npm:^7.0.0, ws@npm:^7.4.6": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: @@ -10587,7 +10977,7 @@ __metadata: languageName: node linkType: hard -"xmlchars@npm:^2.2.0": +"xmlchars@npm:^2.1.1, xmlchars@npm:^2.2.0": version: 2.2.0 resolution: "xmlchars@npm:2.2.0" checksum: 8c70ac94070ccca03f47a81fcce3b271bd1f37a591bf5424e787ae313fcb9c212f5f6786e1fa82076a2c632c0141552babcd85698c437506dfa6ae2d58723062