diff --git a/.env.example b/.env.example index f93bc92db..2be20e872 100644 --- a/.env.example +++ b/.env.example @@ -16,5 +16,11 @@ WALLET_PRIVATE_KEY= MIN_TRANSACTION_TO_PROCESS=1 TRANSACTIONS_TO_BATCH=10 +# AWS KMS Support Variables +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_KMS_KEY_ID= +AWS_REGION= + #RPC OVERRIDE : OPTIONAL. RPC_OVERRIDE_URI= diff --git a/README.md b/README.md index 81a2da52d..b5d5e16e7 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,6 @@ View all end-points details (Open API Specification) : https://web3-api-akbv.cha | ------------------------ | ------------------------------------------------------------------------------------------------------------------- | ------------- | -------- | | `HOST` | Host name of the API Server | `localhost` | false | | `PORT` | Port number of the API Server | `3005` | false | -| `WALLET_PRIVATE_KEY` | Private key of the wallet | | true | | `THIRDWEB_API_KEY` | API Key to access ThirdWeb API | | true | | `POSTGRES_HOST` | PostgreSQL Host Name | | true | | `POSTGRES_DATABASE_NAME` | PostgreSQL Database Name | | true | @@ -52,8 +51,28 @@ View all end-points details (Open API Specification) : https://web3-api-akbv.cha ## Setup Instructions 1. Create a `.env` file based off `.env.example` with all the variables filled in. -2. Update the `WALLET_PRIVATE_KEY` value on the `.env` file -3. Update the `THIRDWEB_API_KEY` value on the `.env` file +2. Update the `THIRDWEB_API_KEY` value on the `.env` file + +### Wallet Setup + +| Required | +| -------- | + +There are multiple ways to setup a wallet for Web3-API using the below methods: + +#### Wallet Private Key + +1.Update the `WALLET_PRIVATE_KEY` value on the `.env` file + +#### AWS KMS Wallet + +1. Get the AWS KMS Support Variables which can be found in `.env.example` file +2. Update the AWS KMS ENV Variables with the correct values on `.env` file + +- `AWS_ACCESS_KEY_ID` : AWS Access Key +- `AWS_SECRET_ACCESS_KEY` : AWS Secret Access Key +- `AWS_REGION` : AWS KMS Key Region +- `AWS_KMS_KEY_ID` : Needs to have the full ARN ### Advance Setup : PostgreSQL DB diff --git a/core/constants/index.ts b/core/constants/index.ts index 215f90fbc..9148909aa 100644 --- a/core/constants/index.ts +++ b/core/constants/index.ts @@ -1,5 +1,4 @@ export const WEB3_API_REQUIRED_ENV_VARS = [ - "WALLET_PRIVATE_KEY", "THIRDWEB_API_KEY", "POSTGRES_HOST", "POSTGRES_DATABASE_NAME", @@ -9,6 +8,18 @@ export const WEB3_API_REQUIRED_ENV_VARS = [ "POSTGRES_USE_SSL", ]; +export const WEB3_API_WALLETS_ENV_VARS = [ + { walletPPK: ["WALLET_PRIVATE_KEY"] }, + { + awsKmsWallet: [ + "AWS_REGION", + "AWS_ACCESS_KEY_ID", + "AWS_SECRET_ACCESS_KEY", + "AWS_KMS_KEY_ID", + ], + }, +] as { [key: string]: string[] }[]; + export const WEB3_API_SERVER_ENV_VARS = WEB3_API_REQUIRED_ENV_VARS.concat([ "OPENAPI_BASE_ORIGIN", ]); diff --git a/core/sdk/sdk.ts b/core/sdk/sdk.ts index ec448db69..eedb88707 100644 --- a/core/sdk/sdk.ts +++ b/core/sdk/sdk.ts @@ -11,6 +11,7 @@ import { ContractAddress } from "@thirdweb-dev/generated-abis"; import { BaseContract, BigNumber } from "ethers"; import { Static } from "@sinclair/typebox"; import { getEnv } from "../loadEnv"; +import { AwsKmsWallet } from "@thirdweb-dev/wallets/evm/wallets/aws-kms"; import { networkResponseSchema } from "../schema"; import { isValidHttpUrl } from "../helpers"; import * as fs from "fs"; @@ -26,7 +27,14 @@ export const getSDK = async (chainName: ChainOrRpc): Promise => { const THIRDWEB_API_KEY = getEnv("THIRDWEB_API_KEY"); const WALLET_PRIVATE_KEY = getEnv("WALLET_PRIVATE_KEY", undefined); + const AWS_REGION = getEnv("AWS_REGION", undefined); + const AWS_ACCESS_KEY_ID = getEnv("AWS_ACCESS_KEY_ID", undefined); + const AWS_SECRET_ACCESS_KEY = getEnv("AWS_SECRET_ACCESS_KEY", undefined); + const AWS_KMS_KEY_ID = getEnv("AWS_KMS_KEY_ID", undefined); + let chain: Chain | null = null; + let wallet: AwsKmsWallet | LocalWallet | null = null; + try { chain = getChainBySlug(chainName); } catch (e) { @@ -37,11 +45,31 @@ export const getSDK = async (chainName: ChainOrRpc): Promise => { } } - const wallet = new LocalWallet({ - chain, - }); - wallet.import({ privateKey: WALLET_PRIVATE_KEY, encryption: false }); + // Check for KMS + if ( + AWS_ACCESS_KEY_ID && + AWS_SECRET_ACCESS_KEY && + AWS_KMS_KEY_ID && + AWS_REGION + ) { + wallet = new AwsKmsWallet({ + region: AWS_REGION, + accessKeyId: AWS_ACCESS_KEY_ID, + secretAccessKey: AWS_SECRET_ACCESS_KEY, + keyId: AWS_KMS_KEY_ID, + }); + } else if (WALLET_PRIVATE_KEY) { + wallet = new LocalWallet({ + chain, + }); + wallet.import({ privateKey: WALLET_PRIVATE_KEY, encryption: false }); + } + if (!wallet) { + throw new Error( + "No wallet found. Please check the Wallet Environment Variables.", + ); + } // TODO: PLAT-982 // Currently we require WALLET_PRIVATE_KEY to be set in order to instantiate the SDK // But we need to implement wallet.generate() and wallet.save() to save the private key to file system diff --git a/core/startup/index.ts b/core/startup/index.ts index 7db89ceeb..be046e422 100644 --- a/core/startup/index.ts +++ b/core/startup/index.ts @@ -5,13 +5,43 @@ export const envVariablesCheck = async ( server: FastifyInstance, variables: string[], ) => { - server.log.info(`Checking for required env variables`); - + server.log.info(`Checking for Required env variables`); for (let str of variables) { - server.log.info(`Checking for ${str} in env`); + server.log.info(`\t Checking for ${str} in env`); if (!getEnv(str, undefined)) { server.log.error(`${str} not found in env`); process.exit(1); } } }; + +export const walletEnvVariablesCheck = async ( + server: FastifyInstance, + variables: { [key: string]: string[] }[], +) => { + let resultArr: boolean[] = []; + let keyResult: boolean; + server.log.info(`Checking for Wallet Setup ENV variables`); + for (let obj of variables) { + keyResult = true; + for (let key in obj) { + for (let str of obj[key]) { + server.log.info( + `\t Checking for ${key.toLowerCase()} -> ${str} in env`, + ); + keyResult = keyResult && !!getEnv(str, undefined); + } + resultArr.push(keyResult); + } + if (resultArr.includes(true)) { + break; + } + } + + if (!resultArr.includes(true)) { + server.log.error( + `Please set WALLET_PRIVATE_KEY or [AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_KMS_KEY_ID] for AWS KMS Wallet on .env file`, + ); + process.exit(1); + } +}; diff --git a/package.json b/package.json index d353c12f2..c151e949e 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "copyfiles": "^2.4.1", "dotenv": "^16.0.3", "ethers": "5", - "express": "^4.18.2", + "ethers-aws-kms-signer": "^1.3.2", "fastify": "^4.15.0", "fastify-plugin": "^4.5.0", "http-status-codes": "^2.2.0", diff --git a/server/index.ts b/server/index.ts index 9876d24ee..e7929af7a 100644 --- a/server/index.ts +++ b/server/index.ts @@ -1,8 +1,11 @@ import { getEnv } from "../core"; import createServer from "./helpers/server"; import { checkTablesExistence, implementTriggerOnStartUp } from "../core"; -import { envVariablesCheck } from "../core/startup"; -import { WEB3_API_SERVER_ENV_VARS } from "../core/constants"; +import { envVariablesCheck, walletEnvVariablesCheck } from "../core/startup"; +import { + WEB3_API_SERVER_ENV_VARS, + WEB3_API_WALLETS_ENV_VARS, +} from "../core/constants"; const main = async () => { const server = await createServer("API-Server"); @@ -22,6 +25,7 @@ const main = async () => { try { await envVariablesCheck(server, WEB3_API_SERVER_ENV_VARS); + await walletEnvVariablesCheck(server, WEB3_API_WALLETS_ENV_VARS); // Check for the Tables Existence post startup await checkTablesExistence(server); await implementTriggerOnStartUp(server); diff --git a/worker/index.ts b/worker/index.ts index ebe33e15b..2dd0150ef 100644 --- a/worker/index.ts +++ b/worker/index.ts @@ -2,9 +2,16 @@ import { errorHandler } from "../core"; import fastify, { FastifyInstance } from "fastify"; import { TypeBoxTypeProvider } from "@fastify/type-provider-typebox"; import { startNotificationListener } from "./controller/listener"; -import { getLogSettings, envVariablesCheck } from "../core"; +import { + getLogSettings, + envVariablesCheck, + walletEnvVariablesCheck, +} from "../core"; import { setupWalletsForWorker } from "./controller/wallet"; -import { WEB3_API_REQUIRED_ENV_VARS } from "../core/constants"; +import { + WEB3_API_REQUIRED_ENV_VARS, + WEB3_API_WALLETS_ENV_VARS, +} from "../core/constants"; const main = async () => { const logOptions = getLogSettings("Worker-Server"); @@ -16,6 +23,7 @@ const main = async () => { await errorHandler(server); await envVariablesCheck(server, WEB3_API_REQUIRED_ENV_VARS); + await walletEnvVariablesCheck(server, WEB3_API_WALLETS_ENV_VARS); await setupWalletsForWorker(server); // Start Listening to the Table for new insertion diff --git a/yarn.lock b/yarn.lock index 150fb60b0..30b459833 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2537,6 +2537,16 @@ asap@^2.0.0: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -2573,6 +2583,22 @@ avvio@^8.2.0: debug "^4.0.0" fastq "^1.6.1" +aws-sdk@^2.922.0: + version "2.1409.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1409.0.tgz#bae5f1f4e4825e1e3319abd4abb5571201128a60" + integrity sha512-4tg4lkvqRQs/39Z/wp+WBcNwDv17zwErlwotIxkHg7kCybVD78mC0sTrjcBbRK01kOsgiS/NCImIWj6C8KsMzw== + dependencies: + buffer "4.9.2" + events "1.1.1" + ieee754 "1.1.13" + jmespath "0.16.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + util "^0.12.4" + uuid "8.0.0" + xml2js "0.5.0" + axios@^0.21.0: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -2605,7 +2631,7 @@ base-x@^4.0.0: resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== -base64-js@^1.3.1: +base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -2668,7 +2694,7 @@ bn.js@4.11.6: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== -bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -2825,6 +2851,15 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -3698,7 +3733,18 @@ ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.5: ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@5, ethers@5.7.2, ethers@^5.7.0, ethers@^5.7.1: +ethers-aws-kms-signer@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/ethers-aws-kms-signer/-/ethers-aws-kms-signer-1.3.2.tgz#af4e3686f79feff82cca94cf39279fd4c45f7fbc" + integrity sha512-A/xsjCtUGXybpo7imThn4wWcOazHKQi9wnfs9ArPrgp4TmD7dH0bw0FsX71rr9QWsP6RCj0FAGsAxCKNWgEP/g== + dependencies: + asn1.js "^5.4.1" + aws-sdk "^2.922.0" + bn.js "^5.2.0" + debug "^4.3.1" + ethers "^5.4.1" + +ethers@5, ethers@5.7.2, ethers@^5.4.1, ethers@^5.7.0, ethers@^5.7.1: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -3770,6 +3816,11 @@ eventemitter3@^5.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== +events@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== + events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -3783,7 +3834,7 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -express@^4.17.1, express@^4.18.2: +express@^4.17.1: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== @@ -4450,7 +4501,12 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.2.1: +ieee754@1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -4680,7 +4736,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== -isarray@~1.0.0: +isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -4736,6 +4792,11 @@ jayson@^3.4.4: uuid "^8.3.2" ws "^7.4.5" +jmespath@0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" + integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== + joycon@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" @@ -5870,6 +5931,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" @@ -5928,6 +5994,11 @@ query-string@^6.13.5: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -6204,11 +6275,21 @@ safe-stable-stringify@^2.1.0, safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sax@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== + +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" @@ -6834,6 +6915,14 @@ url-set-query@^1.0.0: resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== +url@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + integrity sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + use-sync-external-store@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" @@ -6872,6 +6961,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" + integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== + uuid@8.3.2, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -7263,6 +7357,19 @@ xhr@^2.0.4: parse-headers "^2.0.0" xtend "^4.0.0" +xml2js@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" + integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"