diff --git a/.cosmos/cosmos.app.tsx b/.cosmos/cosmos.app.tsx new file mode 100644 index 000000000..37883e5ac --- /dev/null +++ b/.cosmos/cosmos.app.tsx @@ -0,0 +1,51 @@ +import React, { Component } from 'react'; +import { View } from 'react-native'; +import { Navigation } from 'react-native-navigation'; +import { NativeFixtureLoader } from 'react-cosmos-native'; +import { rendererConfig, moduleWrappers } from './cosmos.imports'; + +class CosmosApp extends Component { + render() { + return ( + + {NativeFixtureLoader({ + rendererConfig, + moduleWrappers, + })} + + ); + } +} + +Navigation.registerComponent('Cosmos.UI', () => CosmosApp); + +Navigation.events().registerAppLaunchedListener(async () => { + Navigation.setRoot({ + root: { + stack: { + children: [ + { + component: { + name: 'Cosmos.UI', + options: { + topBar: { + visible: false, + }, + }, + }, + }, + ], + }, + }, + }); +}); + +export default CosmosApp; diff --git a/.cosmos/cosmos.config.json b/.cosmos/cosmos.config.json new file mode 100644 index 000000000..f0a5a35c3 --- /dev/null +++ b/.cosmos/cosmos.config.json @@ -0,0 +1,4 @@ +{ + "fixturesDir": "fixtures", + "globalImports": ["./prepare.ts"] +} diff --git a/.cosmos/cosmos.imports.ts b/.cosmos/cosmos.imports.ts new file mode 100644 index 000000000..518906563 --- /dev/null +++ b/.cosmos/cosmos.imports.ts @@ -0,0 +1,37 @@ +// This file is automatically generated by Cosmos. Add it to .gitignore and +// only edit if you know what you're doing. + +import { RendererConfig, UserModuleWrappers } from 'react-cosmos-core'; + +import './prepare'; + +import * as fixture0 from './fixtures/XAppShortList.fixture'; +import * as fixture1 from './fixtures/SegmentButton.fixture'; +import * as fixture2 from './fixtures/AccountElement.fixture'; +import * as fixture3 from './fixtures/InfoMessage.fixture'; +import * as fixture4 from './fixtures/Badge.fixture'; +import * as fixture5 from './fixtures/Avatar.fixture'; +import * as fixture6 from './fixtures/AmountText.fixture'; + +export const rendererConfig: RendererConfig = { + playgroundUrl: 'http://localhost:5001', + rendererUrl: null, +}; + +const fixtures = { + 'fixtures/XAppShortList.fixture.tsx': { module: fixture0 }, + 'fixtures/SegmentButton.fixture.tsx': { module: fixture1 }, + 'fixtures/AccountElement.fixture.tsx': { module: fixture2 }, + 'fixtures/InfoMessage.fixture.tsx': { module: fixture3 }, + 'fixtures/Badge.fixture.tsx': { module: fixture4 }, + 'fixtures/Avatar.fixture.tsx': { module: fixture5 }, + 'fixtures/AmountText.fixture.tsx': { module: fixture6 }, +}; + +const decorators = {}; + +export const moduleWrappers: UserModuleWrappers = { + lazy: false, + fixtures, + decorators, +}; diff --git a/.cosmos/fixtures/AccountElement.fixture.tsx b/.cosmos/fixtures/AccountElement.fixture.tsx new file mode 100644 index 000000000..5eef0f32c --- /dev/null +++ b/.cosmos/fixtures/AccountElement.fixture.tsx @@ -0,0 +1,25 @@ +import React from 'react'; + +import { AccountElement } from '@components/Modules/AccountElement'; + +const RECIPIENT_DATA = { + id: 'id', + address: 'rwiETSee2wMz3SBnAG8hkMsCgvGy9LWbZ1', + name: 'Wietse', + source: 'contacts', +}; + +const onPressMock = () => { + console.log('RecipientElement onPress'); +}; + +export default { + Original: , + WithSource: ( + + ), +}; diff --git a/.cosmos/fixtures/AmountText.fixture.tsx b/.cosmos/fixtures/AmountText.fixture.tsx new file mode 100644 index 000000000..5c7eb4335 --- /dev/null +++ b/.cosmos/fixtures/AmountText.fixture.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { AmountText } from '@components/General/AmountText'; + +import withPropsCombinations from '../matrix'; + +const VALUES = ['0.00000000000001', '2.2222', '99999.123456']; + +export default { + original: withPropsCombinations(AmountText, { + value: VALUES, + }), + withPrefix: withPropsCombinations(AmountText, { + value: VALUES, + prefix: ['-'], + }), + + withCurrency: withPropsCombinations(AmountText, { + value: VALUES, + currency: ['USD'], + }), + + discreet: , +}; diff --git a/.cosmos/fixtures/Avatar.fixture.tsx b/.cosmos/fixtures/Avatar.fixture.tsx new file mode 100644 index 000000000..610253f1b --- /dev/null +++ b/.cosmos/fixtures/Avatar.fixture.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { Avatar } from '@components/General/Avatar'; + +const URI = { uri: 'https://xumm.app/_nuxt/team-peter.de2cdd6b.png' }; + +export default { + Original: , + 'With Border': , + Big: , + 'With Badge': , + 'With Badge Color': , +}; diff --git a/.cosmos/fixtures/Badge.fixture.tsx b/.cosmos/fixtures/Badge.fixture.tsx new file mode 100644 index 000000000..d5cffe4f2 --- /dev/null +++ b/.cosmos/fixtures/Badge.fixture.tsx @@ -0,0 +1,33 @@ +import React from 'react'; + +import { Badge } from '@components/General/Badge'; +import withPropsCombinations from '../matrix'; + +const SIZES = ['small', 'medium', 'large']; + +export default { + Bithomp: withPropsCombinations(Badge, { + size: SIZES, + type: ['bithomp'], + }), + + XRPScan: withPropsCombinations(Badge, { + size: SIZES, + type: ['xrpscan'], + }), + + XRPLNS: withPropsCombinations(Badge, { + size: SIZES, + type: ['xrplns'], + }), + + PayId: withPropsCombinations(Badge, { + size: SIZES, + type: ['payid'], + }), + + Success: withPropsCombinations(Badge, { + size: SIZES, + type: ['success'], + }), +}; diff --git a/.cosmos/fixtures/InfoMessage.fixture.tsx b/.cosmos/fixtures/InfoMessage.fixture.tsx new file mode 100644 index 000000000..14d36b641 --- /dev/null +++ b/.cosmos/fixtures/InfoMessage.fixture.tsx @@ -0,0 +1,29 @@ +import React from 'react'; + +import { InfoMessage } from '@components/General/InfoMessage'; +import withPropsCombinations from '../matrix'; + +const TYPES = ['info', 'warning', 'error', 'success', 'neutral']; +const label = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry'; + +export default { + All: withPropsCombinations(InfoMessage, { + type: TYPES, + label: [label], + icon: ['IconInfo'], + }), + + Flat: withPropsCombinations(InfoMessage, { + type: TYPES, + label: [label], + icon: ['IconInfo'], + flat: [true], + }), + + 'With More info': withPropsCombinations(InfoMessage, { + type: TYPES, + label: [label], + icon: ['IconInfo'], + onMoreButtonPress: [() => {}], + }), +}; diff --git a/.cosmos/fixtures/SegmentButton.fixture.tsx b/.cosmos/fixtures/SegmentButton.fixture.tsx new file mode 100644 index 000000000..4b4148866 --- /dev/null +++ b/.cosmos/fixtures/SegmentButton.fixture.tsx @@ -0,0 +1,14 @@ +import React from 'react'; + +import { SegmentButton } from '@components/General/SegmentButton'; + +const BUTTONS = ['All', 'Planned', 'Requests']; + +export default ( + { + console.log('Pressed'); + }} + /> +); diff --git a/src/components/Modules/__stories__/XAppList.stories.tsx b/.cosmos/fixtures/XAppShortList.fixture.tsx similarity index 71% rename from src/components/Modules/__stories__/XAppList.stories.tsx rename to .cosmos/fixtures/XAppShortList.fixture.tsx index 3c57d0ae2..1165a8b61 100644 --- a/src/components/Modules/__stories__/XAppList.stories.tsx +++ b/.cosmos/fixtures/XAppShortList.fixture.tsx @@ -1,10 +1,6 @@ -/* eslint-disable spellcheck/spell-checker */ import React from 'react'; -import { storiesOf } from '@storybook/react-native'; -import { withContainer } from '../../../../storybook/decoration'; - -import { XAppShortList } from '../XAppShortList'; +import { XAppShortList } from '@components/Modules/XAppShortList'; const apps = [ { @@ -33,6 +29,4 @@ const apps = [ }, ]; -storiesOf('XAppList', module) - .addDecorator(withContainer) - .add('default', () => ); +export default ; diff --git a/.cosmos/matrix/index.tsx b/.cosmos/matrix/index.tsx new file mode 100644 index 000000000..f04dc0109 --- /dev/null +++ b/.cosmos/matrix/index.tsx @@ -0,0 +1,65 @@ +import React, { ReactNode } from 'react'; +import { View } from 'react-native'; + +type VariationsByField = { + [key: string]: any[]; +}; + +type CreatedElementProps = { + [key: string]: any; +}; + +const flatMap = (arr: any[], fn: (item: any) => any[]): any[] => arr.map(fn).reduce((a, b) => a.concat(b), []); + +const combinations = (variationsByField: VariationsByField): CreatedElementProps[] => { + const fieldNames = Object.keys(variationsByField); + + if (!fieldNames.length) return [{}]; + + const _combinations = (fieldNamesList: string[], acc: CreatedElementProps): CreatedElementProps[] => { + const fieldName = fieldNamesList[0]; + const restFieldNames = fieldNamesList.slice(1); + + const variationsForField = variationsByField[fieldName]; + + if (!Array.isArray(variationsForField) || !variationsForField.length) { + throw new Error(`Please provide a non-empty array of possible values for prop ${fieldName}`); + } + + const vs = variationsForField.map((fieldValue) => ({ ...acc, [fieldName]: fieldValue })); + + if (!restFieldNames.length) { + return vs; + } + return flatMap(vs, (newAcc) => _combinations(restFieldNames, newAcc)); + }; + + return _combinations(fieldNames, {}); +}; + +const createElement = (Component: any, props: CreatedElementProps): ReactNode => { + return ( + + {React.createElement(Component, props)} + + ); +}; + +const withPropsCombinations = (component: any, possibleValuesByPropName: VariationsByField) => { + const propsCombinations = combinations(possibleValuesByPropName); + + return ( + + {propsCombinations.map((props, i) => createElement(component, { ...props, key: i }))} + + ); +}; + +export default withPropsCombinations; diff --git a/.cosmos/prepare.ts b/.cosmos/prepare.ts new file mode 100644 index 000000000..032fa393e --- /dev/null +++ b/.cosmos/prepare.ts @@ -0,0 +1,41 @@ +import Locale from '../src/locale'; + +import NetworkService from '../src/services/NetworkService'; +import { Amendments } from '../src/common/constants'; + +// set local +Locale.setLocale('EN'); + +// set connected network +// @ts-ignore +NetworkService.network = { + baseReserve: 10, + ownerReserve: 2, + isFeatureEnabled(amendment: keyof typeof Amendments): boolean { + return true; + }, + definitions: {}, + nativeAsset: { + asset: 'XRP', + icon: '', + iconSquare: '', + set: function (element: { [key: string]: unknown }): Realm.DictionaryBase { + throw new Error('Function not implemented.'); + }, + remove: function (key: string | string[]): Realm.DictionaryBase { + throw new Error('Function not implemented.'); + }, + addListener: function (callback: Realm.DictionaryChangeCallback): void { + throw new Error('Function not implemented.'); + }, + removeListener: function (callback: Realm.DictionaryChangeCallback): void { + throw new Error('Function not implemented.'); + }, + removeAllListeners: function (): void { + throw new Error('Function not implemented.'); + }, + toJSON: function (): Record { + throw new Error('Function not implemented.'); + }, + }, +}; diff --git a/.detoxrc.js b/.detoxrc.js index 28e322e42..87268b81f 100644 --- a/.detoxrc.js +++ b/.detoxrc.js @@ -2,13 +2,13 @@ module.exports = { apps: { 'ios.debug': { type: 'ios.app', - binaryPath: 'ios/build/Build/Products/Debug-iphonesimulator/XUMM.app', - build: 'xcodebuild -workspace ios/XUMM.xcworkspace -scheme XUMM -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build', + binaryPath: 'ios/build/Build/Products/Debug-iphonesimulator/Xaman.app', + build: 'xcodebuild -workspace ios/Xaman.xcworkspace -scheme Xaman -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build', }, 'ios.release': { type: 'ios.app', - binaryPath: 'ios/build/Build/Products/Debug-iphonesimulator/XUMM.app', - build: 'xcodebuild -workspace ios/XUMM.xcworkspace -scheme XUMM -configuration Release -sdk iphonesimulator -derivedDataPath ios/build', + binaryPath: 'ios/build/Build/Products/Release-iphonesimulator/Xaman.app', + build: 'xcodebuild -workspace ios/Xaman.xcworkspace -scheme Xaman -configuration Release -sdk iphonesimulator -derivedDataPath ios/build', }, 'android.debug': { type: 'android.apk', @@ -24,7 +24,7 @@ module.exports = { devices: { 'ios.simulator': { type: 'ios.simulator', - device: { type: 'iPhone 14 Pro Max' }, + device: { type: 'iPhone 15 Pro' }, }, 'android.emulator': { type: 'android.apk', @@ -36,6 +36,10 @@ module.exports = { device: 'ios.simulator', app: 'ios.debug', }, + 'ios.sim.release': { + device: 'ios.simulator', + app: 'ios.release', + }, 'android.emu.debug': { device: 'android.emulator', app: 'android.debug', diff --git a/.eslintrc b/.eslintrc index 955b0a0dc..7ef98c98e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -46,12 +46,12 @@ "__generate.js" ], "rules": { - "prettier/prettier": [0, { - "printWidth": 120, - "tabWidth": 4, - "parser": "flow", - "singleQuote": true, - "trailingComma": "all" + "prettier/prettier": [0, { + "printWidth": 120, + "tabWidth": 4, + "parser": "flow", + "singleQuote": true, + "trailingComma": "all" }], "no-useless-constructor": 0, "arrow-body-style": 0, @@ -80,7 +80,7 @@ "no-param-reassign": 0, "no-nested-ternary": 0, "no-restricted-syntax": 0, - + "no-underscore-dangle": 0, "no-unused-vars": "off", "no-unused-expressions": ["error" , {"allowShortCircuit": true} ], "@typescript-eslint/no-unused-vars": "error", @@ -124,6 +124,7 @@ "import/no-unresolved": "error", "import/extensions": ["error", "never", { "json": "always" }], "import/no-extraneous-dependencies": 0, + "import/order": 0, "react-native/no-unused-styles": 2, "react-native/split-platform-components": 0, "react-native/no-inline-styles": 2, @@ -151,7 +152,8 @@ "txblob", "tos", "gif", "ic", "asf", "ok", "Sig", "haptic", "Signable", "Unauthorize", "Preauth", "payid", "Biometrics", "Towo", "tz", "xrpscan", "xrplorer", "bithomp", "xpring", "xrplns", "Pincode", "Txn", "iap", "Realtime", "datastore", "decrypted", "Tangem", "Sdk", "Secp256k1", "blockchain", "Escrowed", "xapp", "Veriff", "Codec", "xapps", "Pressable", "nft", "ott", "Luminance", "HexToRgbA", "Misconfiguration", "kyc", "debounce", "debounced", - "nfc", "lsf", "nfts", "Taxon", "fioprotocol", "iou", "dy", "vy", "pb", "nf", "origintype" + "nfc", "lsf", "nfts", "Taxon", "fioprotocol", "iou", "dy", "vy", "pb", "nf", "origintype", "Xaman", "xls20", "livenet", "feeunits", "Preflight", "ctid", + "explainer", "Cancelled", "nftoken", "Remint" ], "skipIfMatch": [ "http://[^s]*", diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 51eb97f31..1707cb48b 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -38,7 +38,7 @@ jobs: - name: Install Dependencies if: steps.cache.outputs.cache-hit != 'true' - run: yarn install + run: yarn install --frozen-lockfile - name: Cache Pods uses: actions/cache@v1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f9d9368f5..bebbacd82 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: - name: Node uses: actions/setup-node@v1 with: - node-version: 14.x + node-version: 16.x - run: node --version @@ -26,7 +26,7 @@ jobs: key: ${{ runner.OS }}-yarn-cache-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.OS }}-yarn-cache- - - run: yarn --frozen-lockfile + - run: yarn install --frozen-lockfile - run: yarn test env: diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index cb65a5e82..39d12505a 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -14,7 +14,7 @@ jobs: - name: Node uses: actions/setup-node@v1 with: - node-version: 14.x + node-version: 16.x - run: node --version @@ -25,7 +25,7 @@ jobs: key: ${{ runner.OS }}-yarn-cache-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.OS }}-yarn-cache- - - run: yarn --frozen-lockfile + - run: yarn install --frozen-lockfile - run: yarn validate if: ${{ always() }} diff --git a/.gitignore b/.gitignore index 2828ccf7c..299a4e3b2 100644 --- a/.gitignore +++ b/.gitignore @@ -72,8 +72,6 @@ src/.vscode/settings.json #others e2e/artifacts/* -src/locale/*.json -src/locale/generated/* # Temporary files created by Metro to check the health of the file watcher .metro-health-check* diff --git a/.yarnrc.yml b/.yarnrc.yml deleted file mode 100644 index 3186f3f07..000000000 --- a/.yarnrc.yml +++ /dev/null @@ -1 +0,0 @@ -nodeLinker: node-modules diff --git a/Gemfile b/Gemfile index 79c2f7e46..79fa29a91 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,6 @@ source 'https://rubygems.org' # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version -ruby '>= 2.6.10' +ruby ">= 2.6.10" -gem 'cocoapods', '>= 1.11.3' +gem 'cocoapods', '~> 1.13' +gem 'activesupport', '>= 6.1.7.3', '< 7.1.0' diff --git a/Makefile b/Makefile index d0c35c259..9e54d7f85 100644 --- a/Makefile +++ b/Makefile @@ -10,22 +10,22 @@ OS := $(shell sh -c 'uname -s 2>/dev/null') SIMULATOR = iPhone 11 Pro Max node_modules: package.json - @if ! [ $(shell which yarn 2> /dev/null) ]; then \ - echo "yarn is not installed https://yarnpkg.com"; \ + @if ! [ $(shell which npm 2> /dev/null) ]; then \ + echo "npm is not installed https://docs.npmjs.com/downloading-and-installing-node-js-and-npm"; \ exit 1; \ fi @echo Getting Javascript dependencies - @yarn install + @npm install -yarn-ci: package.json - @if ! [ $(shell which yarn 2> /dev/null) ]; then \ - echo "yarn is not installed https://yarnpkg.com"; \ +npm-ci: package.json + @if ! [ $(shell which npm 2> /dev/null) ]; then \ + echo "npm is not installed https://docs.npmjs.com/downloading-and-installing-node-js-and-npm"; \ exit 1; \ fi @echo Getting Javascript dependencies - @yarn install --frozen-lockfile + @npm install --frozen-lockfile .podinstall: ifeq ($(OS), Darwin) @@ -43,11 +43,11 @@ build-env: pre-run: | node_modules .podinstall build-env ## Installs dependencies -pre-build: | yarn-ci .podinstall build-env ## Install dependencies before building +pre-build: | npm-ci .podinstall build-env ## Install dependencies before building validate-style: node_modules ## Runs eslint @echo Checking for style guide compliance - @yarn run validate + @npm run validate clean: ## Cleans dependencies, previous builds and temp files @echo Cleaning started @@ -103,7 +103,7 @@ run: run-ios ## alias for run-ios run-ios: | check-device-ios pre-run ## Runs the app on an iOS simulator @if [ $(shell ps -ef | grep -i "cli.js start" | grep -civ grep) -eq 0 ]; then \ echo Starting React Native packager server; \ - yarn start & echo Running iOS app in development; \ + npm start & echo Running iOS app in development; \ if [ ! -z "${SIMULATOR}" ]; then \ react-native run-ios --simulator="${SIMULATOR}"; \ else \ @@ -122,7 +122,7 @@ run-ios: | check-device-ios pre-run ## Runs the app on an iOS simulator run-android: | check-device-android pre-run ## Runs the app on an Android emulator or dev device @if [ $(shell ps -ef | grep -i "cli.js start" | grep -civ grep) -eq 0 ]; then \ echo Starting React Native packager server; \ - yarn start & echo Running Android app in development; \ + npm start & echo Running Android app in development; \ if [ ! -z ${VARIANT} ]; then \ react-native run-android --no-packager --variant=${VARIANT}; \ else \ @@ -142,7 +142,7 @@ build-ios: | stop pre-build validate-style ## Builds the iOS app $(call start_packager) @echo "Building iOS app" @cd ios - @xcodebuild -scheme XUMM archivexcodebuild -scheme XUMM archive + @xcodebuild -scheme Xaman archivexcodebuild -scheme Xaman archive $(call stop_packager) build-android: | stop pre-build validate-style ## Build the Android app @@ -153,18 +153,15 @@ build-android: | stop pre-build validate-style ## Build the Android app $(call stop_packager) pre-e2e: | pre-build ## build for e2e test - @yarn detox build e2e --configuration ios.sim.debug + @npx detox build e2e --configuration ios.sim.release test: | pre-run validate-style ## Runs tests - @yarn test + @npm run test test-e2e: ## Runs e2e tests - @yarn detox clean-framework-cache - @yarn detox build-framework-cache - @yarn cucumber-js ./e2e --configuration ios.sim.debug - -generate-locales: ## Generates app locales - @node scripts/generate-locales.js + @npx detox clean-framework-cache + @npx detox build-framework-cache + @npx cucumber-js ./e2e --configuration ios.sim.release ## Help documentation https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html help: @@ -173,7 +170,7 @@ help: define start_packager @if [ $(shell ps -ef | grep -i "cli.js start" | grep -civ grep) -eq 0 ]; then \ echo Starting React Native packager server; \ - yarn start & echo; \ + npm start & echo; \ else \ echo React Native packager server already running; \ fi diff --git a/README.md b/README.md index e253f7469..2acfc7d80 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,24 @@ -# XUMM +# Xaman [![Coverage Status](https://coveralls.io/repos/github/XRPL-Labs/XUMM-App/badge.svg?branch=master)](https://coveralls.io/github/XRPL-Labs/XUMM-App) ![Contributions welcome](https://img.shields.io/badge/contributions-welcome-orange.svg) -This is the repository for XUMM, the mobile XRPL client by [XRPL Labs](https://xrpl-labs.com). This repository contains the (React Native) app. +This is the repository for Xaman, the mobile XRP Ledger protocol client. This repository contains the (React Native) app. -The app connects to the [XUMM platform](https://github.com/XRPL-Labs/xumm-api) for sign requests: the most user friendly way to get paid / request a payment over the XRP ledger (in either XRP or any other issued currency). +The app connects to the Xaman platform for sign requests: the most user friendly way to get paid / request a payment over the Ledger (in either XRP or any other issued currency). You can download our app from the [App Store](https://apps.apple.com/us/app/id1492302343) or [Google Play Store](https://play.google.com/store/apps/details?id=com.xrpllabs.xumm), or build it yourself. -If you are a developer and you wish to engage with XUMM users, please take a look at the [XUMM Developer Dashboard](https://apps.xumm.dev/) and [read the docs](https://xumm.readme.io/). +If you are a developer and you wish to engage with XUMM users, please take a look at the [Xaman Developer Dashboard](https://apps.xumm.dev/) and [read the docs](https://xumm.readme.io/). ## Contributing ### Development -XUMM is written in JavaScript with React Native. To get started with the code, follow this docs: +Xaman is written in JavaScript with React Native. To get started with the code, follow this docs: * [Environment Setup](docs/environment-setup.md) - -#### Translations -Before being able to run the code, please generate the locale files. This will fetch the translations from the XUMM Translation Portal: - -```bash -make generate-locales -``` - +* Further reading: * [Makefile](docs/makefile.md) @@ -35,4 +28,4 @@ Further reading: ### Suggestions, bugs, etc.: -Please check https://github.com/XRPL-Labs/XUMM-Issue-Tracker for the right location to report / request. +Please check https://github.com/XRPL-Labs/Xaman-Issue-Tracker for the right location to report / request. diff --git a/RESPONSIBLE-DISCLOSURE.md b/RESPONSIBLE-DISCLOSURE.md index d2c92b85b..24e4d0dbd 100644 --- a/RESPONSIBLE-DISCLOSURE.md +++ b/RESPONSIBLE-DISCLOSURE.md @@ -1,4 +1,4 @@ -# XRPL Labs (XUMM) Responsible Disclosure +# Xaman Responsible Disclosure See: -https://github.com/XRPL-Labs/XUMM-Issue-Tracker/blob/master/RESPONSIBLE-DISCLOSURE.md +https://github.com/XRPL-Labs/Xaman-Issue-Tracker/blob/master/RESPONSIBLE-DISCLOSURE.md diff --git a/android/app/build.gradle b/android/app/build.gradle index 5b6c60545..63e9792b9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -86,6 +86,19 @@ def reactNativeArchitectures() { return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] } +def getPassword(String keyChain) { + def stdout = new ByteArrayOutputStream() + def stderr = new ByteArrayOutputStream() + exec { + commandLine 'security', '-q', 'find-generic-password', '-a', System.getenv("USER"), '-s', keyChain, '-w' + standardOutput = stdout + errorOutput = stderr + ignoreExitValue true + } + //noinspection GroovyAssignabilityCheck + stdout.toString().trim() +} + android { ndkVersion rootProject.ext.ndkVersion @@ -119,11 +132,11 @@ android { keyPassword 'android' } release { - if (project.hasProperty('XUMM_RELEASE_STORE_FILE')) { - storeFile file(XUMM_RELEASE_STORE_FILE) - storePassword XUMM_RELEASE_STORE_PASSWORD - keyAlias XUMM_RELEASE_KEY_ALIAS - keyPassword XUMM_RELEASE_KEY_PASSWORD + if (project.hasProperty('XAMAN_RELEASE_STORE_FILE')) { + storeFile file(XAMAN_RELEASE_STORE_FILE) + storePassword getPassword('XAMAN_RELEASE_STORE_PASSWORD') + keyAlias XAMAN_RELEASE_KEY_ALIAS + keyPassword getPassword('XAMAN_RELEASE_KEY_PASSWORD') } } } @@ -174,7 +187,6 @@ dependencies { // The version of react-native is set by the React Native Gradle Plugin implementation("com.facebook.react:react-android") - implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") // For animated GIF support implementation 'com.facebook.fresco:animated-gif:2.0.0' @@ -184,9 +196,8 @@ dependencies { implementation jscFlavor } - // firebase + // firebase + messaging implementation 'com.google.firebase:firebase-messaging:+' - implementation 'me.leolin:ShortcutBadger:1.1.22@aar' // biometric authentication implementation "androidx.biometric:biometric:1.1.0" // qrcode generate diff --git a/android/app/src/androidTest/java/com/xrpllabs/xumm/DetoxTest.java b/android/app/src/androidTest/java/com/xrpllabs/xumm/DetoxTest.java index 7fb4e9dcb..33dcfe89a 100644 --- a/android/app/src/androidTest/java/com/xrpllabs/xumm/DetoxTest.java +++ b/android/app/src/androidTest/java/com/xrpllabs/xumm/DetoxTest.java @@ -15,10 +15,10 @@ public class DetoxTest { @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>(MainActivity.class, false, false); + public ActivityTestRule mActivityRule = new ActivityTestRule<>(LaunchActivity.class, false, false); @Test public void runDetoxTests() { Detox.runTests(mActivityRule); } -} \ No newline at end of file +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 202a86fcb..b84ae6228 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + @@ -29,7 +30,7 @@ - + @@ -47,9 +48,16 @@ + + + + + + + + = Build.VERSION_CODES.O) { - NotificationChannel channel = new NotificationChannel(channelId, "Notification channel", NotificationManager.IMPORTANCE_DEFAULT); - manager.createNotificationChannel(channel); - } - - manager.notify(remoteMessage.getCollapseKey(), notificationId, builder.build()); + NotificationChannel channel = new NotificationChannel( + this.context.getString(R.string.default_notification_channel_id), + "All Notifications", + NotificationManager.IMPORTANCE_DEFAULT + ); + manager.createNotificationChannel(channel); + + manager.notify( + "FCM-Notification:" + notificationId, + 0, + builder.build() + ); } // remove the notification @@ -103,24 +112,51 @@ public void complete(String handlerKey, Boolean show) { } } + @ReactMethod + public void getDeliveredNotifications(final Promise promise) { + NotificationManager notificationManager = (NotificationManager) this.context.getSystemService(Context.NOTIFICATION_SERVICE); + + StatusBarNotification[] statusBarNotifications = notificationManager.getActiveNotifications(); + WritableArray result = Arguments.createArray(); + for (StatusBarNotification sbn:statusBarNotifications) { + WritableMap map = Arguments.createMap(); + Notification notification = sbn.getNotification(); + + map.putInt("identifier", sbn.getId()); + map.putString("channel_id", notification.getChannelId()); + map.putString("shortcut_id", notification.getShortcutId()); + map.putString("group", notification.getGroup()); + map.putString("key", sbn.getKey()); + map.putString("tag", sbn.getTag()); + result.pushMap(map); + } + promise.resolve(result); + } + + + @ReactMethod public void getBadge(Promise promise) { + // get current badge count from shared preferences int badge = sharedPreferences.getInt(BADGE_KEY, 0); promise.resolve(badge); } @ReactMethod - public void setBadge(int badge, Promise promise) { + public void setBadge(int badgeCount, Promise promise) { + // persist the badge count in shared preferences sharedPreferences .edit() - .putInt(BADGE_KEY, badge) + .putInt(BADGE_KEY, badgeCount) .apply(); - if (badge == 0) { - ShortcutBadger.removeCount(this.getReactApplicationContext()); - } else { - ShortcutBadger.applyCount(this.getReactApplicationContext(), badge); + + // set the badge count + try { + boolean result = NotificationBadge.applyCount(badgeCount); + promise.resolve(result); + } catch (Exception e) { + promise.reject(e); } - promise.resolve(null); } } diff --git a/android/app/src/main/java/libs/notification/NotificationBadge.java b/android/app/src/main/java/libs/notification/NotificationBadge.java new file mode 100644 index 000000000..b3e389981 --- /dev/null +++ b/android/app/src/main/java/libs/notification/NotificationBadge.java @@ -0,0 +1,615 @@ +/* + https://github.com/leolin310148/ShortcutBadger + */ + +package libs.notification; + +import android.annotation.SuppressLint; +import android.content.AsyncQueryHandler; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ProviderInfo; +import android.content.pm.ResolveInfo; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Message; + +import com.facebook.react.bridge.UiThreadUtil; + +import java.io.Closeable; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +import com.xrpllabs.xumm.ApplicationLoader; + +public class NotificationBadge { + + private static final List> BADGERS = new LinkedList<>(); + private static boolean initied; + private static Badger badger; + private static ComponentName componentName; + + public interface Badger { + void executeBadge(int badgeCount); + + List getSupportLaunchers(); + } + + public static class AdwHomeBadger implements Badger { + + public static final String INTENT_UPDATE_COUNTER = "org.adw.launcher.counter.SEND"; + public static final String PACKAGENAME = "PNAME"; + public static final String CLASSNAME = "CNAME"; + public static final String COUNT = "COUNT"; + + @Override + public void executeBadge(int badgeCount) { + + final Intent intent = new Intent(INTENT_UPDATE_COUNTER); + intent.putExtra(PACKAGENAME, componentName.getPackageName()); + intent.putExtra(CLASSNAME, componentName.getClassName()); + intent.putExtra(COUNT, badgeCount); + if (canResolveBroadcast(intent)) { + UiThreadUtil.runOnUiThread(() -> ApplicationLoader.applicationContext.sendBroadcast(intent)); + } + } + + @Override + public List getSupportLaunchers() { + return Arrays.asList( + "org.adw.launcher", + "org.adwfreak.launcher" + ); + } + } + + public static class ApexHomeBadger implements Badger { + + private static final String INTENT_UPDATE_COUNTER = "com.anddoes.launcher.COUNTER_CHANGED"; + private static final String PACKAGENAME = "package"; + private static final String COUNT = "count"; + private static final String CLASS = "class"; + + @Override + public void executeBadge(int badgeCount) { + + final Intent intent = new Intent(INTENT_UPDATE_COUNTER); + intent.putExtra(PACKAGENAME, componentName.getPackageName()); + intent.putExtra(COUNT, badgeCount); + intent.putExtra(CLASS, componentName.getClassName()); + if (canResolveBroadcast(intent)) { + UiThreadUtil.runOnUiThread(() -> ApplicationLoader.applicationContext.sendBroadcast(intent)); + } + } + + @Override + public List getSupportLaunchers() { + return List.of("com.anddoes.launcher"); + } + } + + public static class AsusHomeBadger implements Badger { + + private static final String INTENT_ACTION = "android.intent.action.BADGE_COUNT_UPDATE"; + private static final String INTENT_EXTRA_BADGE_COUNT = "badge_count"; + private static final String INTENT_EXTRA_PACKAGENAME = "badge_count_package_name"; + private static final String INTENT_EXTRA_ACTIVITY_NAME = "badge_count_class_name"; + + @Override + public void executeBadge(int badgeCount) { + final Intent intent = new Intent(INTENT_ACTION); + intent.putExtra(INTENT_EXTRA_BADGE_COUNT, badgeCount); + intent.putExtra(INTENT_EXTRA_PACKAGENAME, componentName.getPackageName()); + intent.putExtra(INTENT_EXTRA_ACTIVITY_NAME, componentName.getClassName()); + intent.putExtra("badge_vip_count", 0); + if (canResolveBroadcast(intent)) { + UiThreadUtil.runOnUiThread(() -> ApplicationLoader.applicationContext.sendBroadcast(intent)); + } + } + + @Override + public List getSupportLaunchers() { + return List.of("com.asus.launcher"); + } + } + + public static class DefaultBadger implements Badger { + private static final String INTENT_ACTION = "android.intent.action.BADGE_COUNT_UPDATE"; + private static final String INTENT_EXTRA_BADGE_COUNT = "badge_count"; + private static final String INTENT_EXTRA_PACKAGENAME = "badge_count_package_name"; + private static final String INTENT_EXTRA_ACTIVITY_NAME = "badge_count_class_name"; + + @Override + public void executeBadge(int badgeCount) { + final Intent intent = new Intent(INTENT_ACTION); + intent.putExtra(INTENT_EXTRA_BADGE_COUNT, badgeCount); + intent.putExtra(INTENT_EXTRA_PACKAGENAME, componentName.getPackageName()); + intent.putExtra(INTENT_EXTRA_ACTIVITY_NAME, componentName.getClassName()); + UiThreadUtil.runOnUiThread(() -> { + try { + ApplicationLoader.applicationContext.sendBroadcast(intent); + } catch (Exception ignore) { + + } + }); + } + + @Override + public List getSupportLaunchers() { + return Arrays.asList( + "fr.neamar.kiss", + "com.quaap.launchtime", + "com.quaap.launchtime_official" + ); + } + } + + public static class HuaweiHomeBadger implements Badger { + + @Override + public void executeBadge(int badgeCount) { + final Bundle localBundle = new Bundle(); + localBundle.putString("package", ApplicationLoader.applicationContext.getPackageName()); + localBundle.putString("class", componentName.getClassName()); + localBundle.putInt("badgenumber", badgeCount); + UiThreadUtil.runOnUiThread(() -> { + try { + ApplicationLoader.applicationContext.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, localBundle); + } catch (Exception ignore) { + + } + }); + } + + @Override + public List getSupportLaunchers() { + return List.of("com.huawei.android.launcher"); + } + } + + public static class NewHtcHomeBadger implements Badger { + + public static final String INTENT_UPDATE_SHORTCUT = "com.htc.launcher.action.UPDATE_SHORTCUT"; + public static final String INTENT_SET_NOTIFICATION = "com.htc.launcher.action.SET_NOTIFICATION"; + public static final String PACKAGENAME = "packagename"; + public static final String COUNT = "count"; + public static final String EXTRA_COMPONENT = "com.htc.launcher.extra.COMPONENT"; + public static final String EXTRA_COUNT = "com.htc.launcher.extra.COUNT"; + + @Override + public void executeBadge(int badgeCount) { + + final Intent intent1 = new Intent(INTENT_SET_NOTIFICATION); + intent1.putExtra(EXTRA_COMPONENT, componentName.flattenToShortString()); + intent1.putExtra(EXTRA_COUNT, badgeCount); + + final Intent intent = new Intent(INTENT_UPDATE_SHORTCUT); + intent.putExtra(PACKAGENAME, componentName.getPackageName()); + intent.putExtra(COUNT, badgeCount); + + if (canResolveBroadcast(intent1) || canResolveBroadcast(intent)) { + UiThreadUtil.runOnUiThread(() -> { + ApplicationLoader.applicationContext.sendBroadcast(intent1); + ApplicationLoader.applicationContext.sendBroadcast(intent); + }); + } + } + + @Override + public List getSupportLaunchers() { + return List.of("com.htc.launcher"); + } + } + + public static class NovaHomeBadger implements Badger { + + private static final String CONTENT_URI = "content://com.teslacoilsw.notifier/unread_count"; + private static final String COUNT = "count"; + private static final String TAG = "tag"; + + @Override + public void executeBadge(int badgeCount) { + ContentValues contentValues = new ContentValues(); + contentValues.put(TAG, componentName.getPackageName() + "/" + componentName.getClassName()); + contentValues.put(COUNT, badgeCount); + ApplicationLoader.applicationContext.getContentResolver().insert(Uri.parse(CONTENT_URI), contentValues); + } + + @Override + public List getSupportLaunchers() { + return List.of("com.teslacoilsw.launcher"); + } + } + + public static class OPPOHomeBader implements Badger { + + private static final String PROVIDER_CONTENT_URI = "content://com.android.badge/badge"; + // private static final String INTENT_ACTION = "com.oppo.unsettledevent"; + // private static final String INTENT_EXTRA_PACKAGENAME = "pakeageName"; + // private static final String INTENT_EXTRA_BADGE_COUNT = "number"; + // private static final String INTENT_EXTRA_BADGE_UPGRADENUMBER = "upgradeNumber"; + private static final String INTENT_EXTRA_BADGEUPGRADE_COUNT = "app_badge_count"; + private int mCurrentTotalCount = -1; + + @Override + public void executeBadge(int badgeCount) { + if (mCurrentTotalCount == badgeCount) { + return; + } + mCurrentTotalCount = badgeCount; + executeBadgeByContentProvider(badgeCount); + } + + @Override + public List getSupportLaunchers() { + return Collections.singletonList("com.oppo.launcher"); + } + + private void executeBadgeByContentProvider(int badgeCount) { + try { + Bundle extras = new Bundle(); + extras.putInt(INTENT_EXTRA_BADGEUPGRADE_COUNT, badgeCount); + ApplicationLoader.applicationContext.getContentResolver().call(Uri.parse(PROVIDER_CONTENT_URI), "setAppBadgeCount", null, extras); + } catch (Throwable ignored) { + + } + } + } + + public static class SamsungHomeBadger implements Badger { + private static final String CONTENT_URI = "content://com.sec.badge/apps?notify=true"; + private static final String[] CONTENT_PROJECTION = new String[]{"_id","class"}; + + private static DefaultBadger defaultBadger; + + @SuppressLint("Range") + @Override + public void executeBadge(int badgeCount) { + try { + if (defaultBadger == null) { + defaultBadger = new DefaultBadger(); + } + defaultBadger.executeBadge(badgeCount); + } catch (Exception ignore) { + + } + + Uri mUri = Uri.parse(CONTENT_URI); + ContentResolver contentResolver = ApplicationLoader.applicationContext.getContentResolver(); + Cursor cursor = null; + try { + cursor = contentResolver.query(mUri, CONTENT_PROJECTION, "package=?", new String[]{componentName.getPackageName()}, null); + if (cursor != null) { + String entryActivityName = componentName.getClassName(); + boolean entryActivityExist = false; + while (cursor.moveToNext()) { + int id = cursor.getInt(0); + ContentValues contentValues = getContentValues(componentName, badgeCount, false); + contentResolver.update(mUri, contentValues, "_id=?", new String[]{String.valueOf(id)}); + if (entryActivityName.equals(cursor.getString(cursor.getColumnIndex("class")))) { + entryActivityExist = true; + } + } + + if (!entryActivityExist) { + ContentValues contentValues = getContentValues(componentName, badgeCount, true); + contentResolver.insert(mUri, contentValues); + } + } + } finally { + close(cursor); + } + } + + private ContentValues getContentValues(ComponentName componentName, int badgeCount, boolean isInsert) { + ContentValues contentValues = new ContentValues(); + if (isInsert) { + contentValues.put("package", componentName.getPackageName()); + contentValues.put("class", componentName.getClassName()); + } + + contentValues.put("badgecount", badgeCount); + + return contentValues; + } + + @Override + public List getSupportLaunchers() { + return Arrays.asList( + "com.sec.android.app.launcher", + "com.sec.android.app.twlauncher" + ); + } + } + + public static class SonyHomeBadger implements Badger { + + private static final String INTENT_ACTION = "com.sonyericsson.home.action.UPDATE_BADGE"; + private static final String INTENT_EXTRA_PACKAGE_NAME = "com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME"; + private static final String INTENT_EXTRA_ACTIVITY_NAME = "com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME"; + private static final String INTENT_EXTRA_MESSAGE = "com.sonyericsson.home.intent.extra.badge.MESSAGE"; + private static final String INTENT_EXTRA_SHOW_MESSAGE = "com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE"; + + private static final String PROVIDER_CONTENT_URI = "content://com.sonymobile.home.resourceprovider/badge"; + private static final String PROVIDER_COLUMNS_BADGE_COUNT = "badge_count"; + private static final String PROVIDER_COLUMNS_PACKAGE_NAME = "package_name"; + private static final String PROVIDER_COLUMNS_ACTIVITY_NAME = "activity_name"; + private static final String SONY_HOME_PROVIDER_NAME = "com.sonymobile.home.resourceprovider"; + private final Uri BADGE_CONTENT_URI = Uri.parse(PROVIDER_CONTENT_URI); + + private static AsyncQueryHandler mQueryHandler; + + @Override + public void executeBadge(int badgeCount) { + if (sonyBadgeContentProviderExists()) { + executeBadgeByContentProvider(badgeCount); + } else { + executeBadgeByBroadcast(badgeCount); + } + } + + @Override + public List getSupportLaunchers() { + return Arrays.asList("com.sonyericsson.home", "com.sonymobile.home"); + } + + private static void executeBadgeByBroadcast(int badgeCount) { + final Intent intent = new Intent(INTENT_ACTION); + intent.putExtra(INTENT_EXTRA_PACKAGE_NAME, componentName.getPackageName()); + intent.putExtra(INTENT_EXTRA_ACTIVITY_NAME, componentName.getClassName()); + intent.putExtra(INTENT_EXTRA_MESSAGE, String.valueOf(badgeCount)); + intent.putExtra(INTENT_EXTRA_SHOW_MESSAGE, badgeCount > 0); + UiThreadUtil.runOnUiThread(() -> ApplicationLoader.applicationContext.sendBroadcast(intent)); + } + + @SuppressLint("HandlerLeak") + private void executeBadgeByContentProvider(int badgeCount) { + if (badgeCount < 0) { + return; + } + + if (mQueryHandler == null) { + mQueryHandler = new AsyncQueryHandler(ApplicationLoader.applicationContext.getApplicationContext().getContentResolver()) { + + @Override + public void handleMessage(Message msg) { + try { + super.handleMessage(msg); + } catch (Throwable ignore) { + + } + } + }; + } + insertBadgeAsync(badgeCount, componentName.getPackageName(), componentName.getClassName()); + } + + private void insertBadgeAsync(int badgeCount, String packageName, String activityName) { + final ContentValues contentValues = new ContentValues(); + contentValues.put(PROVIDER_COLUMNS_BADGE_COUNT, badgeCount); + contentValues.put(PROVIDER_COLUMNS_PACKAGE_NAME, packageName); + contentValues.put(PROVIDER_COLUMNS_ACTIVITY_NAME, activityName); + mQueryHandler.startInsert(0, null, BADGE_CONTENT_URI, contentValues); + } + + private static boolean sonyBadgeContentProviderExists() { + boolean exists = false; + ProviderInfo info = ApplicationLoader.applicationContext.getPackageManager().resolveContentProvider(SONY_HOME_PROVIDER_NAME, 0); + if (info != null) { + exists = true; + } + return exists; + } + } + + public static class XiaomiHomeBadger implements Badger { + + public static final String INTENT_ACTION = "android.intent.action.APPLICATION_MESSAGE_UPDATE"; + public static final String EXTRA_UPDATE_APP_COMPONENT_NAME = "android.intent.extra.update_application_component_name"; + public static final String EXTRA_UPDATE_APP_MSG_TEXT = "android.intent.extra.update_application_message_text"; + + @Override + public void executeBadge(int badgeCount) { + String badgeString = String.valueOf(badgeCount == 0 ? "" : badgeCount); + try { + @SuppressLint("PrivateApi") Class miuiNotificationClass = Class.forName("android.app.MiuiNotification"); + Object miuiNotification = miuiNotificationClass.newInstance(); + Field field = miuiNotification.getClass().getDeclaredField("messageCount"); + field.setAccessible(true); + field.set(miuiNotification, badgeString); + } catch (Throwable e) { + final Intent localIntent = new Intent(INTENT_ACTION); + localIntent.putExtra(EXTRA_UPDATE_APP_COMPONENT_NAME, componentName.getPackageName() + "/" + componentName.getClassName()); + localIntent.putExtra(EXTRA_UPDATE_APP_MSG_TEXT, badgeString); + if (canResolveBroadcast(localIntent)) { + UiThreadUtil.runOnUiThread(() -> ApplicationLoader.applicationContext.sendBroadcast(localIntent)); + } + } + } + + @Override + public List getSupportLaunchers() { + return Arrays.asList( + "com.miui.miuilite", + "com.miui.home", + "com.miui.miuihome", + "com.miui.miuihome2", + "com.miui.mihome", + "com.miui.mihome2" + ); + } + } + + public static class ZukHomeBadger implements Badger { + + private final Uri CONTENT_URI = Uri.parse("content://com.android.badge/badge"); + + @Override + public void executeBadge(int badgeCount) { + final Bundle extra = new Bundle(); + extra.putInt("app_badge_count", badgeCount); + UiThreadUtil.runOnUiThread(() -> { + try { + ApplicationLoader.applicationContext.getContentResolver().call(CONTENT_URI, "setAppBadgeCount", null, extra); + } catch (Exception ignore) { + + } + }); + } + + @Override + public List getSupportLaunchers() { + return Collections.singletonList("com.zui.launcher"); + } + } + + public static class VivoHomeBadger implements Badger { + + @Override + public void executeBadge(int badgeCount) { + Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM"); + intent.putExtra("packageName", ApplicationLoader.applicationContext.getPackageName()); + intent.putExtra("className", componentName.getClassName()); + intent.putExtra("notificationNum", badgeCount); + ApplicationLoader.applicationContext.sendBroadcast(intent); + } + + @Override + public List getSupportLaunchers() { + return List.of("com.vivo.launcher"); + } + } + + static { + BADGERS.add(AdwHomeBadger.class); + BADGERS.add(ApexHomeBadger.class); + BADGERS.add(NewHtcHomeBadger.class); + BADGERS.add(NovaHomeBadger.class); + BADGERS.add(SonyHomeBadger.class); + BADGERS.add(XiaomiHomeBadger.class); + BADGERS.add(AsusHomeBadger.class); + BADGERS.add(HuaweiHomeBadger.class); + BADGERS.add(OPPOHomeBader.class); + BADGERS.add(SamsungHomeBadger.class); + BADGERS.add(ZukHomeBadger.class); + BADGERS.add(VivoHomeBadger.class); + } + + public static boolean applyCount(int badgeCount) { + try { + if (badger == null && !initied) { + initBadger(); + initied = true; + } + if (badger == null) { + return false; + } + badger.executeBadge(badgeCount); + return true; + } catch (Throwable e) { + return false; + } + } + + private static void initBadger() { + Context context = ApplicationLoader.applicationContext; + Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); + if (launchIntent == null) { + return; + } + + componentName = launchIntent.getComponent(); + + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_HOME); + ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); + if (resolveInfo != null) { + String currentHomePackage = resolveInfo.activityInfo.packageName; + for (Class b : BADGERS) { + Badger shortcutBadger = null; + try { + shortcutBadger = b.newInstance(); + } catch (Exception ignored) { + } + if (shortcutBadger != null && shortcutBadger.getSupportLaunchers().contains(currentHomePackage)) { + badger = shortcutBadger; + break; + } + } + if (badger != null) { + return; + } + } + + + + List resolveInfos = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + if (resolveInfos != null) { + for (int a = 0; a < resolveInfos.size(); a++) { + resolveInfo = resolveInfos.get(a); + String currentHomePackage = resolveInfo.activityInfo.packageName; + + for (Class b : BADGERS) { + Badger shortcutBadger = null; + try { + shortcutBadger = b.newInstance(); + } catch (Exception ignored) { + } + if (shortcutBadger != null && shortcutBadger.getSupportLaunchers().contains(currentHomePackage)) { + badger = shortcutBadger; + break; + } + } + if (badger != null) { + break; + } + } + } + + if (badger == null) { + if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")) { + badger = new XiaomiHomeBadger(); + } else if (Build.MANUFACTURER.equalsIgnoreCase("ZUK")) { + badger = new ZukHomeBadger(); + } else if (Build.MANUFACTURER.equalsIgnoreCase("OPPO")) { + badger = new OPPOHomeBader(); + } else if (Build.MANUFACTURER.equalsIgnoreCase("VIVO")) { + badger = new VivoHomeBadger(); + } else { + badger = new DefaultBadger(); + } + } + + } + + private static boolean canResolveBroadcast(Intent intent) { + PackageManager packageManager = ApplicationLoader.applicationContext.getPackageManager(); + List receivers = packageManager.queryBroadcastReceivers(intent, 0); + return receivers != null && receivers.size() > 0; + } + + public static void close(Cursor cursor) { + if (cursor != null && !cursor.isClosed()) { + cursor.close(); + } + } + + public static void closeQuietly(Closeable closeable) { + try { + if (closeable != null) { + closeable.close(); + } + } catch (Throwable ignore) { + + } + } +} diff --git a/android/app/src/main/res/drawable-hdpi/formerly_logo.png b/android/app/src/main/res/drawable-hdpi/formerly_logo.png new file mode 100644 index 000000000..23b53b23f Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/formerly_logo.png differ diff --git a/android/app/src/main/res/drawable-hdpi/ic_stat_icon_xumm_android_notification.png b/android/app/src/main/res/drawable-hdpi/ic_stat_icon_xaman_android_notification.png similarity index 100% rename from android/app/src/main/res/drawable-hdpi/ic_stat_icon_xumm_android_notification.png rename to android/app/src/main/res/drawable-hdpi/ic_stat_icon_xaman_android_notification.png diff --git a/android/app/src/main/res/drawable-hdpi/icon_check_xumm.png b/android/app/src/main/res/drawable-hdpi/icon_check_xaman.png similarity index 100% rename from android/app/src/main/res/drawable-hdpi/icon_check_xumm.png rename to android/app/src/main/res/drawable-hdpi/icon_check_xaman.png diff --git a/android/app/src/main/res/drawable-hdpi/icon_coints.png b/android/app/src/main/res/drawable-hdpi/icon_coins.png similarity index 100% rename from android/app/src/main/res/drawable-hdpi/icon_coints.png rename to android/app/src/main/res/drawable-hdpi/icon_coins.png diff --git a/android/app/src/main/res/drawable-hdpi/icon_radio.png b/android/app/src/main/res/drawable-hdpi/icon_radio.png new file mode 100644 index 000000000..0b5b73ecc Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/icon_radio.png differ diff --git a/android/app/src/main/res/drawable-hdpi/image_arrow_up.png b/android/app/src/main/res/drawable-hdpi/image_arrow_up.png new file mode 100644 index 000000000..c479b78a8 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/image_arrow_up.png differ diff --git a/android/app/src/main/res/drawable-hdpi/splash_screen_background.png b/android/app/src/main/res/drawable-hdpi/splash_screen_background.png deleted file mode 100644 index 51b4f4dab..000000000 Binary files a/android/app/src/main/res/drawable-hdpi/splash_screen_background.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/splash_screen_patterns.png b/android/app/src/main/res/drawable-hdpi/splash_screen_patterns.png new file mode 100644 index 000000000..4b827b017 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/splash_screen_patterns.png differ diff --git a/android/app/src/main/res/drawable-hdpi/xaman_logo.png b/android/app/src/main/res/drawable-hdpi/xaman_logo.png new file mode 100644 index 000000000..38298d44d Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/xaman_logo.png differ diff --git a/android/app/src/main/res/drawable-hdpi/xaman_logo_light.png b/android/app/src/main/res/drawable-hdpi/xaman_logo_light.png new file mode 100644 index 000000000..4ac5f4e1f Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/xaman_logo_light.png differ diff --git a/android/app/src/main/res/drawable-hdpi/xumm_icon.png b/android/app/src/main/res/drawable-hdpi/xumm_icon.png deleted file mode 100644 index 57ad9c9ac..000000000 Binary files a/android/app/src/main/res/drawable-hdpi/xumm_icon.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/xumm_icon_light.png b/android/app/src/main/res/drawable-hdpi/xumm_icon_light.png deleted file mode 100644 index f69406181..000000000 Binary files a/android/app/src/main/res/drawable-hdpi/xumm_icon_light.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/xumm_icon_white.png b/android/app/src/main/res/drawable-hdpi/xumm_icon_white.png deleted file mode 100644 index cecf347ad..000000000 Binary files a/android/app/src/main/res/drawable-hdpi/xumm_icon_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/xumm_logo.png b/android/app/src/main/res/drawable-hdpi/xumm_logo.png deleted file mode 100644 index 0bb967448..000000000 Binary files a/android/app/src/main/res/drawable-hdpi/xumm_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-hdpi/xumm_logo_light.png b/android/app/src/main/res/drawable-hdpi/xumm_logo_light.png deleted file mode 100644 index 1a3696418..000000000 Binary files a/android/app/src/main/res/drawable-hdpi/xumm_logo_light.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/formerly_logo.png b/android/app/src/main/res/drawable-mdpi/formerly_logo.png new file mode 100644 index 000000000..a24699723 Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/formerly_logo.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_stat_icon_xumm_android_notification.png b/android/app/src/main/res/drawable-mdpi/ic_stat_icon_xaman_android_notification.png similarity index 100% rename from android/app/src/main/res/drawable-mdpi/ic_stat_icon_xumm_android_notification.png rename to android/app/src/main/res/drawable-mdpi/ic_stat_icon_xaman_android_notification.png diff --git a/android/app/src/main/res/drawable-mdpi/icon_check_xumm.png b/android/app/src/main/res/drawable-mdpi/icon_check_xaman.png similarity index 100% rename from android/app/src/main/res/drawable-mdpi/icon_check_xumm.png rename to android/app/src/main/res/drawable-mdpi/icon_check_xaman.png diff --git a/android/app/src/main/res/drawable-mdpi/icon_coints.png b/android/app/src/main/res/drawable-mdpi/icon_coins.png similarity index 100% rename from android/app/src/main/res/drawable-mdpi/icon_coints.png rename to android/app/src/main/res/drawable-mdpi/icon_coins.png diff --git a/android/app/src/main/res/drawable-mdpi/icon_radio.png b/android/app/src/main/res/drawable-mdpi/icon_radio.png new file mode 100644 index 000000000..f2d088763 Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/icon_radio.png differ diff --git a/android/app/src/main/res/drawable-mdpi/image_arrow_up.png b/android/app/src/main/res/drawable-mdpi/image_arrow_up.png new file mode 100644 index 000000000..87bf23b5f Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/image_arrow_up.png differ diff --git a/android/app/src/main/res/drawable-mdpi/splash_screen_background.png b/android/app/src/main/res/drawable-mdpi/splash_screen_background.png deleted file mode 100644 index 679592c26..000000000 Binary files a/android/app/src/main/res/drawable-mdpi/splash_screen_background.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/splash_screen_patterns.png b/android/app/src/main/res/drawable-mdpi/splash_screen_patterns.png new file mode 100644 index 000000000..ca88244e9 Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/splash_screen_patterns.png differ diff --git a/android/app/src/main/res/drawable-mdpi/xaman_logo.png b/android/app/src/main/res/drawable-mdpi/xaman_logo.png new file mode 100644 index 000000000..444de61c4 Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/xaman_logo.png differ diff --git a/android/app/src/main/res/drawable-mdpi/xaman_logo_light.png b/android/app/src/main/res/drawable-mdpi/xaman_logo_light.png new file mode 100644 index 000000000..be209c25b Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/xaman_logo_light.png differ diff --git a/android/app/src/main/res/drawable-mdpi/xumm_icon.png b/android/app/src/main/res/drawable-mdpi/xumm_icon.png deleted file mode 100644 index c3109363d..000000000 Binary files a/android/app/src/main/res/drawable-mdpi/xumm_icon.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/xumm_icon_light.png b/android/app/src/main/res/drawable-mdpi/xumm_icon_light.png deleted file mode 100644 index 431ecb9e5..000000000 Binary files a/android/app/src/main/res/drawable-mdpi/xumm_icon_light.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/xumm_icon_white.png b/android/app/src/main/res/drawable-mdpi/xumm_icon_white.png deleted file mode 100644 index 16adab508..000000000 Binary files a/android/app/src/main/res/drawable-mdpi/xumm_icon_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/xumm_logo.png b/android/app/src/main/res/drawable-mdpi/xumm_logo.png deleted file mode 100644 index 9fbd6a9a3..000000000 Binary files a/android/app/src/main/res/drawable-mdpi/xumm_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-mdpi/xumm_logo_light.png b/android/app/src/main/res/drawable-mdpi/xumm_logo_light.png deleted file mode 100644 index c057d21b2..000000000 Binary files a/android/app/src/main/res/drawable-mdpi/xumm_logo_light.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/formerly_logo.png b/android/app/src/main/res/drawable-xhdpi/formerly_logo.png new file mode 100644 index 000000000..707ae49e7 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/formerly_logo.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_stat_icon_xumm_android_notification.png b/android/app/src/main/res/drawable-xhdpi/ic_stat_icon_xaman_android_notification.png similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/ic_stat_icon_xumm_android_notification.png rename to android/app/src/main/res/drawable-xhdpi/ic_stat_icon_xaman_android_notification.png diff --git a/android/app/src/main/res/drawable-xhdpi/icon_check_xumm.png b/android/app/src/main/res/drawable-xhdpi/icon_check_xaman.png similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/icon_check_xumm.png rename to android/app/src/main/res/drawable-xhdpi/icon_check_xaman.png diff --git a/android/app/src/main/res/drawable-xhdpi/icon_coints.png b/android/app/src/main/res/drawable-xhdpi/icon_coins.png similarity index 100% rename from android/app/src/main/res/drawable-xhdpi/icon_coints.png rename to android/app/src/main/res/drawable-xhdpi/icon_coins.png diff --git a/android/app/src/main/res/drawable-xhdpi/icon_radio.png b/android/app/src/main/res/drawable-xhdpi/icon_radio.png new file mode 100644 index 000000000..1928356b0 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/icon_radio.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/image_arrow_up.png b/android/app/src/main/res/drawable-xhdpi/image_arrow_up.png new file mode 100644 index 000000000..8f3722afa Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/image_arrow_up.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/splash_screen_background.png b/android/app/src/main/res/drawable-xhdpi/splash_screen_background.png deleted file mode 100644 index 19afefcb2..000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/splash_screen_background.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/splash_screen_patterns.png b/android/app/src/main/res/drawable-xhdpi/splash_screen_patterns.png new file mode 100644 index 000000000..943157824 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/splash_screen_patterns.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/xaman_logo.png b/android/app/src/main/res/drawable-xhdpi/xaman_logo.png new file mode 100644 index 000000000..713792959 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/xaman_logo.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/xaman_logo_light.png b/android/app/src/main/res/drawable-xhdpi/xaman_logo_light.png new file mode 100644 index 000000000..eed67e6d7 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/xaman_logo_light.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/xumm_icon.png b/android/app/src/main/res/drawable-xhdpi/xumm_icon.png deleted file mode 100644 index c714b6c64..000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/xumm_icon.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/xumm_icon_light.png b/android/app/src/main/res/drawable-xhdpi/xumm_icon_light.png deleted file mode 100644 index f89cbf398..000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/xumm_icon_light.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/xumm_icon_white.png b/android/app/src/main/res/drawable-xhdpi/xumm_icon_white.png deleted file mode 100644 index e4a2bb04a..000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/xumm_icon_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/xumm_logo.png b/android/app/src/main/res/drawable-xhdpi/xumm_logo.png deleted file mode 100644 index a8776384d..000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/xumm_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xhdpi/xumm_logo_light.png b/android/app/src/main/res/drawable-xhdpi/xumm_logo_light.png deleted file mode 100644 index 744346984..000000000 Binary files a/android/app/src/main/res/drawable-xhdpi/xumm_logo_light.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/formerly_logo.png b/android/app/src/main/res/drawable-xxhdpi/formerly_logo.png new file mode 100644 index 000000000..bd6050b05 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/formerly_logo.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_stat_icon_xumm_android_notification.png b/android/app/src/main/res/drawable-xxhdpi/ic_stat_icon_xaman_android_notification.png similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/ic_stat_icon_xumm_android_notification.png rename to android/app/src/main/res/drawable-xxhdpi/ic_stat_icon_xaman_android_notification.png diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_check_xumm.png b/android/app/src/main/res/drawable-xxhdpi/icon_check_xaman.png similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/icon_check_xumm.png rename to android/app/src/main/res/drawable-xxhdpi/icon_check_xaman.png diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_coints.png b/android/app/src/main/res/drawable-xxhdpi/icon_coins.png similarity index 100% rename from android/app/src/main/res/drawable-xxhdpi/icon_coints.png rename to android/app/src/main/res/drawable-xxhdpi/icon_coins.png diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_radio.png b/android/app/src/main/res/drawable-xxhdpi/icon_radio.png new file mode 100644 index 000000000..14601a07b Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/icon_radio.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/image_arrow_up.png b/android/app/src/main/res/drawable-xxhdpi/image_arrow_up.png new file mode 100644 index 000000000..152d9f25c Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/image_arrow_up.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/splash_screen_background.png b/android/app/src/main/res/drawable-xxhdpi/splash_screen_background.png deleted file mode 100644 index d1f728053..000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/splash_screen_background.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/splash_screen_patterns.png b/android/app/src/main/res/drawable-xxhdpi/splash_screen_patterns.png new file mode 100644 index 000000000..3d942249e Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/splash_screen_patterns.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/xaman_logo.png b/android/app/src/main/res/drawable-xxhdpi/xaman_logo.png new file mode 100644 index 000000000..7e62b4f37 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/xaman_logo.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/xaman_logo_light.png b/android/app/src/main/res/drawable-xxhdpi/xaman_logo_light.png new file mode 100644 index 000000000..613ac4a66 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/xaman_logo_light.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/xumm_icon.png b/android/app/src/main/res/drawable-xxhdpi/xumm_icon.png deleted file mode 100644 index 9fd027c54..000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/xumm_icon.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/xumm_icon_light.png b/android/app/src/main/res/drawable-xxhdpi/xumm_icon_light.png deleted file mode 100644 index c89140fba..000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/xumm_icon_light.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/xumm_icon_white.png b/android/app/src/main/res/drawable-xxhdpi/xumm_icon_white.png deleted file mode 100644 index 8e7930dfc..000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/xumm_icon_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/xumm_logo.png b/android/app/src/main/res/drawable-xxhdpi/xumm_logo.png deleted file mode 100644 index b20d92221..000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/xumm_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxhdpi/xumm_logo_light.png b/android/app/src/main/res/drawable-xxhdpi/xumm_logo_light.png deleted file mode 100644 index bb11ad3fd..000000000 Binary files a/android/app/src/main/res/drawable-xxhdpi/xumm_logo_light.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/formerly_logo.png b/android/app/src/main/res/drawable-xxxhdpi/formerly_logo.png new file mode 100644 index 000000000..76ccbc61f Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/formerly_logo.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_stat_icon_xumm_android_notification.png b/android/app/src/main/res/drawable-xxxhdpi/ic_stat_icon_xaman_android_notification.png similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/ic_stat_icon_xumm_android_notification.png rename to android/app/src/main/res/drawable-xxxhdpi/ic_stat_icon_xaman_android_notification.png diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_check_xumm.png b/android/app/src/main/res/drawable-xxxhdpi/icon_check_xaman.png similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/icon_check_xumm.png rename to android/app/src/main/res/drawable-xxxhdpi/icon_check_xaman.png diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_coints.png b/android/app/src/main/res/drawable-xxxhdpi/icon_coins.png similarity index 100% rename from android/app/src/main/res/drawable-xxxhdpi/icon_coints.png rename to android/app/src/main/res/drawable-xxxhdpi/icon_coins.png diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_radio.png b/android/app/src/main/res/drawable-xxxhdpi/icon_radio.png new file mode 100644 index 000000000..08b665501 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/icon_radio.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/image_arrow_up.png b/android/app/src/main/res/drawable-xxxhdpi/image_arrow_up.png new file mode 100644 index 000000000..fce0a1014 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/image_arrow_up.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/splash_screen_background.png b/android/app/src/main/res/drawable-xxxhdpi/splash_screen_background.png deleted file mode 100644 index 4f802448a..000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/splash_screen_background.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/splash_screen_patterns.png b/android/app/src/main/res/drawable-xxxhdpi/splash_screen_patterns.png new file mode 100644 index 000000000..fba2e34a0 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/splash_screen_patterns.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/xaman_logo.png b/android/app/src/main/res/drawable-xxxhdpi/xaman_logo.png new file mode 100644 index 000000000..1410d2369 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/xaman_logo.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/xaman_logo_light.png b/android/app/src/main/res/drawable-xxxhdpi/xaman_logo_light.png new file mode 100644 index 000000000..2d41b9fea Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/xaman_logo_light.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/xumm_icon.png b/android/app/src/main/res/drawable-xxxhdpi/xumm_icon.png deleted file mode 100644 index 770a14ca6..000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/xumm_icon.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/xumm_icon_light.png b/android/app/src/main/res/drawable-xxxhdpi/xumm_icon_light.png deleted file mode 100644 index c33cb8f56..000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/xumm_icon_light.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/xumm_icon_white.png b/android/app/src/main/res/drawable-xxxhdpi/xumm_icon_white.png deleted file mode 100644 index 8e1f51705..000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/xumm_icon_white.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/xumm_logo.png b/android/app/src/main/res/drawable-xxxhdpi/xumm_logo.png deleted file mode 100644 index 71e25d650..000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/xumm_logo.png and /dev/null differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/xumm_logo_light.png b/android/app/src/main/res/drawable-xxxhdpi/xumm_logo_light.png deleted file mode 100644 index 67059b473..000000000 Binary files a/android/app/src/main/res/drawable-xxxhdpi/xumm_logo_light.png and /dev/null differ diff --git a/android/app/src/main/res/layout/activity_splash.xml b/android/app/src/main/res/layout/activity_splash.xml index d14effbae..05b48dfa2 100644 --- a/android/app/src/main/res/layout/activity_splash.xml +++ b/android/app/src/main/res/layout/activity_splash.xml @@ -6,20 +6,19 @@ android:orientation="vertical" android:background="@color/splash_screen_background" > - + android:src="@drawable/splash_screen_patterns" /> - \ No newline at end of file + android:scaleType="fitCenter" + android:src="@drawable/formerly_logo" /> + diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index 7296b2ffb..201fb36bd 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -1,5 +1,5 @@ - #0030CF + #FFFFFF #4494D3 - \ No newline at end of file + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 47fd98c18..6e7c29e20 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ - XUMM - notifications - XUMM Logo splash + Xaman + Xaman Logo splash Splash screen background pattern + + fcm_fallback_notification_channel diff --git a/android/build.gradle b/android/build.gradle index 9e0326556..c996f3833 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -8,7 +8,7 @@ buildscript { minSdkVersion = 26 compileSdkVersion = 33 targetSdkVersion = 33 - kotlinVersion = "1.5.31" + kotlinVersion = "1.7.10" RNNKotlinVersion = ext.kotlinVersion detoxKotlinVersion = ext.kotlinVersion // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. @@ -56,7 +56,7 @@ subprojects { subproject -> versionMajor = npmVersion[0] versionMinor = npmVersion[1] versionPatch = npmVersion[2] - buildNumber = 3 + buildNumber = 16 } } diff --git a/android/gradlew b/android/gradlew index 1b6c78733..79a61d421 100755 --- a/android/gradlew +++ b/android/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -205,6 +209,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/android/gradlew.bat b/android/gradlew.bat index 477c89664..93e3f59f1 100644 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,15 +76,17 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal -:omega \ No newline at end of file +:omega diff --git a/android/keystores/BUCK b/android/keystores/BUCK deleted file mode 100644 index 88e4c31b2..000000000 --- a/android/keystores/BUCK +++ /dev/null @@ -1,8 +0,0 @@ -keystore( - name = "debug", - properties = "debug.keystore.properties", - store = "debug.keystore", - visibility = [ - "PUBLIC", - ], -) diff --git a/android/keystores/debug.keystore.properties b/android/keystores/debug.keystore.properties deleted file mode 100644 index 121bfb49f..000000000 --- a/android/keystores/debug.keystore.properties +++ /dev/null @@ -1,4 +0,0 @@ -key.store=debug.keystore -key.alias=androiddebugkey -key.store.password=android -key.alias.password=android diff --git a/android/settings.gradle b/android/settings.gradle index 6e5fc81e0..b1836bea2 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,4 @@ -rootProject.name = 'XUMM' +rootProject.name = 'Xaman' apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' -includeBuild('../node_modules/react-native-gradle-plugin') +includeBuild('../node_modules/@react-native/gradle-plugin') diff --git a/docs/environment-setup.md b/docs/environment-setup.md index 78ddcf56e..249ea6c52 100644 --- a/docs/environment-setup.md +++ b/docs/environment-setup.md @@ -1,8 +1,8 @@ -The following instructions apply to the mobile apps for iOS and Android built in React Native. Download the iOS version [here](https://apps.apple.com/us/app/id1492302343) and the Android version [here](https://play.google.com/store/apps/details?id=com.xrpllabs.xumm). Source code can be found at https://github.com/XRPL-Labs/XUMM-App. +The following instructions apply to the mobile apps for iOS and Android built in React Native. Download the iOS version [here](https://apps.apple.com/us/app/id1492302343) and the Android version [here](https://play.google.com/store/apps/details?id=com.xrpllabs.xumm). Source code can be found at https://github.com/XRPL-Labs/Xaman-App. If you run into any issues getting your environment set up, check the [Troubleshooting](#troubleshooting) section at the bottom for common solutions. -A macOS computer is required to build the XUMM App iOS mobile app. +A macOS computer is required to build the Xaman App iOS mobile app. ## Environment Setup @@ -126,20 +126,20 @@ In the SDK Manager using Android Studio or the [Android SDK command line tool](h ## Obtaining the Source Code -In order to develop and build the XUMM mobile app you'll need to get a copy of the source code. Forking the `XUMM-App` repository will also make it easy to contribute your work back to the project in the future. +In order to develop and build the Xaman mobile app you'll need to get a copy of the source code. Forking the `Xaman-App` repository will also make it easy to contribute your work back to the project in the future. -1. Fork the [XUMM-App](https://github.com/XRPL-Labs/XUMM-App) repository on GitHub. +1. Fork the [Xaman-App](https://github.com/XRPL-Labs/Xaman-App) repository on GitHub. 2. Clone your fork locally: - Open a terminal - Change to a directory you want to hold your local copy - - Run `git clone https://github.com//XUMM-App.git` if you want to use HTTPS, or `git clone git@github.com:/XUMM-App.git` if you want to use SSH + - Run `git clone https://github.com//Xaman-App.git` if you want to use HTTPS, or `git clone git@github.com:/Xaman-App.git` if you want to use SSH **`` refers to the username or organization in GitHub that forked the repository** -3. Change the directory to `XUMM-App`. +3. Change the directory to `Xaman-App`. ```sh - cd XUMM-App + cd Xaman-App ``` 4. Run `make pre-run` in order to install all the dependencies. diff --git a/docs/makefile.md b/docs/makefile.md index 78a0bad98..3c47665be 100644 --- a/docs/makefile.md +++ b/docs/makefile.md @@ -35,7 +35,7 @@ The set of commands for building the app are used in conjunction with [Fastlane] - **make build**: Builds the app for both platforms Android and iOS in sequence and generates the apk and ipa files in the project's root directory to be distributed. - **make build-ios**: Builds the iOS app and generates the ipa file in the project's root directory to be distributed. - **make build-android**: Builds the Android app and generates the apk file in the project's root directory to be distributed. -- **make unsigned-ios**: Builds the iOS app and generates an unsigned XUMM-unsigned.ipa file in the project's root directory. -- **make unsigned-android**: Builds the Android app and generates an unsigned XUMM-unsigned.apk file in the project's root directory. +- **make unsigned-ios**: Builds the iOS app and generates an unsigned Xaman-unsigned.ipa file in the project's root directory. +- **make unsigned-android**: Builds the Android app and generates an unsigned Xaman-unsigned.apk file in the project's root directory. -If you plan to use the make build-\* commands be sure to set your environment variables for use in conjunction with Fastlane to suit your needs. \ No newline at end of file +If you plan to use the make build-\* commands be sure to set your environment variables for use in conjunction with Fastlane to suit your needs. diff --git a/docs/testing.md b/docs/testing.md index 0dc8336f8..5e8f6ed9d 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -18,22 +18,25 @@ To write a test, place a Javascript file with the `.spec.js` suffix in the `e2e` directory inside root directory. The test will be automatically picked up by the test runner. +## Type checking with TypeScript +Use [Typescript](https://www.typescriptlang.org/) to find and prevent type related issues. + ## Linting `make check-style` checks the codebase against our linting rules. We're using the AirBnB [ES6](https://github.com/airbnb/javascript) and [React](https://github.com/airbnb/javascript/tree/master/react) style guides. -## Storybook -- Open index.js - -- Uncomment following line +## Cosoms +- Run cosmos server ```bash -import './.storybook'; +npm run cosmos ``` -- Comment out all other lines -- Start your application again +- Uncomment following line in `/index.js` +```js +import './.cosmos/cosmos.app'; +``` + +- Comment out all other lines and Start your application again -## Type checking with TypeScript -Use [Typescript](https://www.typescriptlang.org/) to find and prevent type related issues. \ No newline at end of file diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 9d0c618e1..dc008962c 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -7,7 +7,7 @@ Execution failed for task ':app:packageAllDebugClassesForMultiDex'. ``` ##### Solution -Clean the Android part of the XUMM project. Issue the following commands: +Clean the Android part of the Xaman project. Issue the following commands: 1. ``cd android`` 2. ``./gradlew clean`` @@ -19,7 +19,7 @@ Execution failed for task ':app:installDebug'. ``` ##### Solution -The development version of the XUMM app cannot be installed alongside a release version. Open ``android/app/build.gradle`` and change the applicationId to a unique string for your app. +The development version of the Xaman app cannot be installed alongside a release version. Open ``android/app/build.gradle`` and change the applicationId to a unique string for your app. #### Errors When Running 'make run-ios' @@ -33,4 +33,4 @@ xcrun: error: unable to find utility "instruments", not a developer tool or in P - Launch XCode and agree to the terms first. - Go to **Preferences -> Locations** and you'll see an option to select a version of the Command Line Tools. Click the select box and choose any version to use. -- After this go back to the command line and run ``make run-ios`` again. \ No newline at end of file +- After this go back to the command line and run ``make run-ios`` again. diff --git a/e2e/01_setup.feature b/e2e/01_setup.feature index 85b5e6444..45748eb26 100644 --- a/e2e/01_setup.feature +++ b/e2e/01_setup.feature @@ -29,23 +29,15 @@ Feature: Setup App Then I tap 'close-change-log-button' Given I should see 'home-tab-empty-view' - Scenario: Change node to testnet - Then I tap 'tab-Settings' - Given I should have 'settings-tab-screen' - Then I tap 'advanced-button' - Given I should have 'advanced-settings-screen' - Then I tap 'change-node-button' - Given I should have 'nodes-list-screen' - Then I tap 'node-wss://s.altnet.rippletest.net:51233' - Then I tap alert button with label "Yes, I'm sure" - Then I tap 'back-button' - Given I should have 'advanced-settings-screen' - Then I tap 'back-button' - Given I should have 'settings-tab-screen' - - - - - - - + Scenario: Enabled developer mode + Then I tap 'tab-Settings' + Given I should have 'settings-tab-screen' + Then I tap 'advanced-button' + Given I should have 'advanced-settings-screen' + Then I tap 'developer-mode-switch' + Then I tap 'developer-mode-alert-continue-button' + Then I type my passcode + Then I tap 'back-button' + Given I should have 'settings-tab-screen' + Then I tap 'tab-Home' + Given I should see 'home-tab-empty-view' diff --git a/e2e/02_generate_account.feature b/e2e/02_generate_account.feature index 8482503e3..336fc10c3 100644 --- a/e2e/02_generate_account.feature +++ b/e2e/02_generate_account.feature @@ -31,11 +31,16 @@ Feature: Generate Account Given I should have 'home-tab-view' Given I should see same account address + Scenario: Change node to testnet + Then I tap 'network-switch-button' + Given I should have 'switch-network-overlay' + Then I tap 'network-XAHAUTESTNET' + Scenario: Activate Account Given I should see 'not-activated-account-container' Then I activate the account Then I should wait 20 sec to see 'tokens-list-empty-view' - Given I should see '90' in 'account-native-balance' + Given I should see '99' in 'account-native-balance' Scenario: Test signing by adding a asset Then I tap 'add-token-button' @@ -47,8 +52,6 @@ Feature: Generate Account Then I scroll up 'review-content-container' Given I should see 'accept-button' Then I slide right 'accept-button' - Given I should wait 10 sec to see 'new-trust-line-alert-overlay' - Then I tap 'continue-button' Then I type my passcode Given I should see 'submitting-view' Given I should wait 20 sec to see 'success-result-view' @@ -97,7 +100,7 @@ Feature: Generate Account Given I should see 'not-activated-account-container' Then I activate the account Then I should wait 20 sec to see 'tokens-list-empty-view' - Given I should see '90' in 'account-native-balance' + Given I should see '99' in 'account-native-balance' Scenario: Test signing by adding a asset Then I tap 'add-token-button' @@ -109,8 +112,6 @@ Feature: Generate Account Then I scroll up 'review-content-container' Given I should see 'accept-button' Then I slide right 'accept-button' - Given I should wait 10 sec to see 'new-trust-line-alert-overlay' - Then I tap 'continue-button' Then I enter my passphrase in 'passphrase-input' Then I tap 'sign-button' Given I should see 'submitting-view' @@ -142,15 +143,13 @@ Feature: Generate Account Then I tap 'add-token-button' Given I should have 'add-asset-overlay' Then I tap 'counterParty-Bitstamp' - Then I tap 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B.BTC' + Then I tap 'currency-rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B.EUR' Given I should wait 10 sec to see 'add-and-sign-button' Then I tap 'add-and-sign-button' Given I should have 'review-transaction-modal' Then I scroll up 'review-content-container' Given I should see 'accept-button' Then I slide right 'accept-button' - Given I should wait 10 sec to see 'new-trust-line-alert-overlay' - Then I tap 'continue-button' Then I enter my new passphrase in 'passphrase-input' Then I tap 'sign-button' Given I should see 'submitting-view' diff --git a/e2e/03_import_account.feature b/e2e/03_import_account.feature index b30d5c910..bf29b7e42 100644 --- a/e2e/03_import_account.feature +++ b/e2e/03_import_account.feature @@ -18,7 +18,7 @@ Feature: Import Account Given I should have 'account-import-show-address-view' Then I read my account address Then I tap 'next-button' - Given I should have 'account-import-explain-activation-view' + Given I should see 'account-import-explain-activation-view' Then I tap 'next-button' Given I should have 'account-import-security-view' Then I tap 'next-button' @@ -35,7 +35,7 @@ Feature: Import Account Given I should see 'not-activated-account-container' Then I activate the account Then I should wait 20 sec to see 'tokens-list-empty-view' - Given I should see '90' in 'account-native-balance' + Given I should see '99' in 'account-native-balance' Scenario: Test signing by adding a asset Then I tap 'add-token-button' @@ -47,8 +47,6 @@ Feature: Import Account Then I scroll up 'review-content-container' Given I should see 'accept-button' Then I slide right 'accept-button' - Given I should wait 10 sec to see 'new-trust-line-alert-overlay' - Then I tap 'continue-button' Then I type my passcode Given I should see 'submitting-view' Given I should wait 20 sec to see 'success-result-view' @@ -75,7 +73,7 @@ Feature: Import Account Given I should have 'account-import-show-address-view' Then I read my account address Then I tap 'next-button' - Given I should have 'account-import-explain-activation-view' + Given I should see 'account-import-explain-activation-view' Then I tap 'next-button' Given I should have 'account-import-security-view' Then I tap 'next-button' @@ -92,7 +90,7 @@ Feature: Import Account Given I should see 'not-activated-account-container' Then I activate the account Then I should wait 20 sec to see 'tokens-list-empty-view' - Given I should see '90' in 'account-native-balance' + Given I should see '99' in 'account-native-balance' Scenario: Test signing by adding a asset Then I tap 'add-token-button' @@ -104,8 +102,6 @@ Feature: Import Account Then I scroll up 'review-content-container' Given I should see 'accept-button' Then I slide right 'accept-button' - Given I should wait 10 sec to see 'new-trust-line-alert-overlay' - Then I tap 'continue-button' Then I type my passcode Given I should see 'submitting-view' Given I should wait 20 sec to see 'success-result-view' @@ -136,7 +132,7 @@ Feature: Import Account Given I should have 'account-import-show-address-view' Then I read my account address Then I tap 'next-button' - Given I should have 'account-import-explain-activation-view' + Given I should see 'account-import-explain-activation-view' Then I tap 'next-button' Given I should have 'account-import-security-view' Then I tap 'next-button' @@ -153,7 +149,7 @@ Feature: Import Account Given I should see 'not-activated-account-container' Then I activate the account Then I should wait 20 sec to see 'tokens-list-empty-view' - Given I should see '90' in 'account-native-balance' + Given I should see '99' in 'account-native-balance' Scenario: Test signing by adding a asset Then I tap 'add-token-button' @@ -165,8 +161,6 @@ Feature: Import Account Then I scroll up 'review-content-container' Given I should see 'accept-button' Then I slide right 'accept-button' - Given I should wait 10 sec to see 'new-trust-line-alert-overlay' - Then I tap 'continue-button' Then I type my passcode Given I should see 'submitting-view' Given I should wait 20 sec to see 'success-result-view' @@ -194,7 +188,7 @@ Feature: Import Account Given I should have 'account-import-show-address-view' Then I read my account address Then I tap 'next-button' - Given I should have 'account-import-explain-activation-view' + Given I should see 'account-import-explain-activation-view' Then I tap 'next-button' Given I should have 'account-import-security-view' Then I tap 'passphrase-radio-button' @@ -216,7 +210,7 @@ Feature: Import Account Given I should see 'not-activated-account-container' Then I activate the account Then I should wait 20 sec to see 'tokens-list-empty-view' - Given I should see '90' in 'account-native-balance' + Given I should see '99' in 'account-native-balance' Scenario: Test signing by adding a asset Then I tap 'add-token-button' @@ -228,8 +222,6 @@ Feature: Import Account Then I scroll up 'review-content-container' Given I should see 'accept-button' Then I slide right 'accept-button' - Given I should wait 10 sec to see 'new-trust-line-alert-overlay' - Then I tap 'continue-button' Then I enter my passphrase in 'passphrase-input' Then I tap 'sign-button' Given I should see 'submitting-view' diff --git a/e2e/04_upgrade_account.feature b/e2e/04_upgrade_account.feature index 1e3c5cffa..151f3402b 100644 --- a/e2e/04_upgrade_account.feature +++ b/e2e/04_upgrade_account.feature @@ -60,8 +60,6 @@ Feature: Upgrade Account Then I scroll up 'review-content-container' Given I should see 'accept-button' Then I slide right 'accept-button' - Given I should wait 10 sec to see 'new-trust-line-alert-overlay' - Then I tap 'continue-button' Then I type my passcode Given I should see 'submitting-view' Given I should wait 20 sec to see 'success-result-view' diff --git a/e2e/05_auth.feature b/e2e/05_auth.feature index 9cbf425b7..2d1acf34c 100644 --- a/e2e/05_auth.feature +++ b/e2e/05_auth.feature @@ -47,15 +47,13 @@ Feature: Lock Then I tap 'add-token-button' Given I should have 'add-asset-overlay' Then I tap 'counterParty-Bitstamp' - Then I tap 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B.BTC' + Then I tap 'currency-rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B.EUR' Given I should wait 10 sec to see 'add-and-sign-button' Then I tap 'add-and-sign-button' Given I should have 'review-transaction-modal' Then I scroll up 'review-content-container' Given I should see 'accept-button' Then I slide right 'accept-button' - Given I should wait 10 sec to see 'new-trust-line-alert-overlay' - Then I tap 'continue-button' Then I type my passcode Given I should see 'submitting-view' Given I should wait 20 sec to see 'success-result-view' diff --git a/e2e/helpers/fixtures.js b/e2e/helpers/fixtures.js index 8a187c81e..d80ecc37a 100644 --- a/e2e/helpers/fixtures.js +++ b/e2e/helpers/fixtures.js @@ -32,16 +32,15 @@ const generateSecretNumbers = () => { // get funded testnet account const generateTestnetAccount = async () => { - const resp = await fetch('https://faucet.altnet.rippletest.net/accounts', { method: 'POST' }); + const resp = await fetch('https://xahau-test.net/newcreds', { method: 'POST' }); const json = await resp.json(); return { - address: json.account.address, - secret: json.account.secret, + address: json.address, + secret: json.secret, }; }; -// activate account by sending payment const activateAccount = async (address) => { const fundedAccount = await generateTestnetAccount(); @@ -55,9 +54,10 @@ const activateAccount = async (address) => { Destination: address, Amount: '100000000', Fee: '1000', + NetworkID: 21338, }; - const Connection = new XrplClient('wss://s.altnet.rippletest.net:51233'); + const Connection = new XrplClient('wss://xahau-test.net'); await Connection.ready(); diff --git a/e2e/step_definitions/detox.js b/e2e/step_definitions/detox.js index dc14868a2..74659d085 100644 --- a/e2e/step_definitions/detox.js +++ b/e2e/step_definitions/detox.js @@ -61,11 +61,11 @@ Given('I should wait {int} sec to see {string}', async (timeout, elementId) => { }); Then('I scroll up {string}', async (elementId) => { - await element(by.id(elementId)).swipe('up', 'slow', 0.2); + await element(by.id(elementId)).swipe('up', 'slow', 0.5); }); Then('I scroll down {string}', async (elementId) => { - await element(by.id(elementId)).swipe('down', 'slow', 0.2); + await element(by.id(elementId)).swipe('down', 'slow', 0.5); }); Then('I scroll {string} to bottom', async (elementId) => { diff --git a/e2e/support/adapter.js b/e2e/support/adapter.js index 3f378defd..fd28ad497 100644 --- a/e2e/support/adapter.js +++ b/e2e/support/adapter.js @@ -3,9 +3,14 @@ const detox = require('detox/internals'); class DetoxCucumberAdapter { constructor(d) { this.detox = d; + this.testFailed = false; } async beforeEach(context) { + if (this.testFailed) { + throw new Error('Force stop'); + } + await this.detox.onTestStart({ title: context.pickle.uri, fullName: context.pickle.name, @@ -14,17 +19,25 @@ class DetoxCucumberAdapter { } async afterEach(context) { + const { pickle, result } = context; + + const status = this.mapStatus(result); + + if (status === 'failed') { + this.testFailed = true; + } + await this.detox.onTestDone({ - title: context.pickle.uri, - fullName: context.pickle.name, - status: this.mapStatus(context, true), - timedOut: context.result.duration, + title: pickle.uri, + fullName: pickle.name, + status, + timedOut: result.duration, }); } // eslint-disable-next-line class-methods-use-this - mapStatus(context) { - switch (context.result.status) { + mapStatus(result) { + switch (result.status) { case 'passed': return 'passed'; case 'failed': diff --git a/e2e/support/init.js b/e2e/support/init.js index 2979b9648..84f4f197c 100644 --- a/e2e/support/init.js +++ b/e2e/support/init.js @@ -39,7 +39,6 @@ BeforeAll(async () => { }); Before(async (context) => { - // await detox.device.reloadReactNative(); await adapter.beforeEach(context); }); diff --git a/index.js b/index.js index 87c880f55..f8b2f9ef5 100644 --- a/index.js +++ b/index.js @@ -1,27 +1,9 @@ -// import './storybook'; +// import './.cosmos/cosmos.app'; -// fix some stuff for dev import './debug'; -// fix global variables/methods import './global'; -// import app import Application from './src/app'; // run the app Application.run(); - -// if (__DEV__) { -// const modules = require.getModules(); -// const moduleIds = Object.keys(modules); -// const loadedModuleNames = moduleIds -// .filter((moduleId) => modules[moduleId].isInitialized) -// .map((moduleId) => modules[moduleId].verboseName); -// const waitingModuleNames = moduleIds -// .filter((moduleId) => !modules[moduleId].isInitialized) -// .map((moduleId) => modules[moduleId].verboseName); -// // grab this text blob, and put it in a file named packager/modulePaths.js -// console.log(`module.exports = ${JSON.stringify(loadedModuleNames.sort(), null, 2)};`); -// // make sure that the modules you expect to be waiting are actually waiting -// console.log('loaded:', loadedModuleNames.length, 'waiting:', waitingModuleNames.length); -// } diff --git a/ios/Empty.swift b/ios/Empty.swift index 9eea0a530..4b3f15a9e 100644 --- a/ios/Empty.swift +++ b/ios/Empty.swift @@ -1,6 +1,6 @@ // // Empty.swift -// XUMM +// Xaman // // Created by XRPL Labs on 26/11/2020. // diff --git a/ios/LaunchScreen.storyboard b/ios/LaunchScreen.storyboard index 00cff5267..161da2274 100644 --- a/ios/LaunchScreen.storyboard +++ b/ios/LaunchScreen.storyboard @@ -1,9 +1,9 @@ - + - + @@ -16,17 +16,17 @@ - + - + - + @@ -35,7 +35,7 @@ - - + + diff --git a/ios/Podfile b/ios/Podfile index 997ce8012..056ac0f36 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,11 @@ -require_relative '../node_modules/react-native/scripts/react_native_pods' -require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' +use_frameworks! :linkage => :static + +# Resolve react_native_pods.rb with node to allow for hoisting +require Pod::Executable.execute_command('node', ['-p', + 'require.resolve( + "react-native/scripts/react_native_pods.rb", + {paths: [process.argv[1]]}, + )', __dir__]).strip platform :ios, '13.0' prepare_react_native_project! @@ -15,14 +21,9 @@ if linkage != nil use_frameworks! :linkage => linkage.to_sym end -target 'XUMM' do +target 'Xaman' do config = use_native_modules! - # fix for FirebaseCoreInternal pod install - pod 'Firebase', :modular_headers => true - pod 'FirebaseCore', :modular_headers => true - pod 'GoogleUtilities', :modular_headers => true - # Flags change depending on the env values. flags = get_default_flags() @@ -34,13 +35,18 @@ target 'XUMM' do :app_path => "#{Pod::Config.instance.installation_root}/.." ) - target 'XUMMTests' do + target 'XamanTests' do inherit! :complete # Pods for testing end post_install do |installer| - react_native_post_install(installer) + # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 + react_native_post_install( + installer, + config[:reactNativePath], + :mac_catalyst_enabled => false + ) __apply_Xcode_12_5_M1_post_install_workaround(installer) installer.pods_project.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 80e076ae5..3465d93b2 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,78 +1,56 @@ PODS: - boost (1.76.0) - DoubleConversion (1.1.6) - - FBLazyVector (0.71.7) - - FBReactNativeSpec (0.71.7): + - FBLazyVector (0.72.7) + - FBReactNativeSpec (0.72.7): - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 0.71.7) - - RCTTypeSafety (= 0.71.7) - - React-Core (= 0.71.7) - - React-jsi (= 0.71.7) - - ReactCommon/turbomodule/core (= 0.71.7) - - Firebase (10.5.0): - - Firebase/Core (= 10.5.0) - - Firebase/AnalyticsWithoutAdIdSupport (10.5.0): + - RCTRequired (= 0.72.7) + - RCTTypeSafety (= 0.72.7) + - React-Core (= 0.72.7) + - React-jsi (= 0.72.7) + - ReactCommon/turbomodule/core (= 0.72.7) + - Firebase/AnalyticsWithoutAdIdSupport (10.18.0): - Firebase/CoreOnly - - FirebaseAnalytics/WithoutAdIdSupport (~> 10.5.0) - - Firebase/Core (10.5.0): + - FirebaseAnalytics/WithoutAdIdSupport (~> 10.18.0) + - Firebase/CoreOnly (10.18.0): + - FirebaseCore (= 10.18.0) + - Firebase/Crashlytics (10.18.0): - Firebase/CoreOnly - - FirebaseAnalytics (~> 10.5.0) - - Firebase/CoreOnly (10.5.0): - - FirebaseCore (= 10.5.0) - - Firebase/Crashlytics (10.5.0): + - FirebaseCrashlytics (~> 10.18.0) + - Firebase/Messaging (10.18.0): - Firebase/CoreOnly - - FirebaseCrashlytics (~> 10.5.0) - - Firebase/Messaging (10.5.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 10.5.0) - - FirebaseAnalytics (10.5.0): - - FirebaseAnalytics/AdIdSupport (= 10.5.0) - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/MethodSwizzler (~> 7.8) - - GoogleUtilities/Network (~> 7.8) - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseAnalytics/AdIdSupport (10.5.0): - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleAppMeasurement (= 10.5.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/MethodSwizzler (~> 7.8) - - GoogleUtilities/Network (~> 7.8) - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseAnalytics/WithoutAdIdSupport (10.5.0): + - FirebaseMessaging (~> 10.18.0) + - FirebaseAnalytics/WithoutAdIdSupport (10.18.0): - FirebaseCore (~> 10.0) - FirebaseInstallations (~> 10.0) - - GoogleAppMeasurement/WithoutAdIdSupport (= 10.5.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/MethodSwizzler (~> 7.8) - - GoogleUtilities/Network (~> 7.8) - - "GoogleUtilities/NSData+zlib (~> 7.8)" + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.18.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseCore (10.5.0): + - FirebaseCore (10.18.0): - FirebaseCoreInternal (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/Logger (~> 7.8) - - FirebaseCoreExtension (10.5.0): + - GoogleUtilities/Environment (~> 7.12) + - GoogleUtilities/Logger (~> 7.12) + - FirebaseCoreExtension (10.18.0): - FirebaseCore (~> 10.0) - - FirebaseCoreInternal (10.5.0): + - FirebaseCoreInternal (10.18.0): - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseCrashlytics (10.5.0): - - FirebaseCore (~> 10.0) + - FirebaseCrashlytics (10.18.0): + - FirebaseCore (~> 10.5) - FirebaseInstallations (~> 10.0) + - FirebaseSessions (~> 10.5) - GoogleDataTransport (~> 9.2) - GoogleUtilities/Environment (~> 7.8) - nanopb (< 2.30910.0, >= 2.30908.0) - PromisesObjC (~> 2.1) - - FirebaseInstallations (10.5.0): + - FirebaseInstallations (10.18.0): - FirebaseCore (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8) - PromisesObjC (~> 2.1) - - FirebaseMessaging (10.5.0): + - FirebaseMessaging (10.18.0): - FirebaseCore (~> 10.0) - FirebaseInstallations (~> 10.0) - GoogleDataTransport (~> 9.2) @@ -81,78 +59,60 @@ PODS: - GoogleUtilities/Reachability (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8) - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseSessions (10.18.0): + - FirebaseCore (~> 10.5) + - FirebaseCoreExtension (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/Environment (~> 7.10) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesSwift (~> 2.1) - fmt (6.2.1) - glog (0.3.5) - - GoogleAppMeasurement (10.5.0): - - GoogleAppMeasurement/AdIdSupport (= 10.5.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/MethodSwizzler (~> 7.8) - - GoogleUtilities/Network (~> 7.8) - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (10.5.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 10.5.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/MethodSwizzler (~> 7.8) - - GoogleUtilities/Network (~> 7.8) - - "GoogleUtilities/NSData+zlib (~> 7.8)" + - GoogleAppMeasurement/WithoutAdIdSupport (10.18.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleAppMeasurement/WithoutAdIdSupport (10.5.0): - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/MethodSwizzler (~> 7.8) - - GoogleUtilities/Network (~> 7.8) - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleDataTransport (9.2.1): + - GoogleDataTransport (9.2.5): - GoogleUtilities/Environment (~> 7.7) - nanopb (< 2.30910.0, >= 2.30908.0) - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities (7.11.0): - - GoogleUtilities/AppDelegateSwizzler (= 7.11.0) - - GoogleUtilities/Environment (= 7.11.0) - - GoogleUtilities/ISASwizzler (= 7.11.0) - - GoogleUtilities/Logger (= 7.11.0) - - GoogleUtilities/MethodSwizzler (= 7.11.0) - - GoogleUtilities/Network (= 7.11.0) - - "GoogleUtilities/NSData+zlib (= 7.11.0)" - - GoogleUtilities/Reachability (= 7.11.0) - - GoogleUtilities/SwizzlerTestHelpers (= 7.11.0) - - GoogleUtilities/UserDefaults (= 7.11.0) - - GoogleUtilities/AppDelegateSwizzler (7.11.0): + - GoogleUtilities/AppDelegateSwizzler (7.12.0): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (7.11.0): + - GoogleUtilities/Environment (7.12.0): - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/ISASwizzler (7.11.0) - - GoogleUtilities/Logger (7.11.0): + - GoogleUtilities/Logger (7.12.0): - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (7.11.0): + - GoogleUtilities/MethodSwizzler (7.12.0): - GoogleUtilities/Logger - - GoogleUtilities/Network (7.11.0): + - GoogleUtilities/Network (7.12.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.11.0)" - - GoogleUtilities/Reachability (7.11.0): + - "GoogleUtilities/NSData+zlib (7.12.0)" + - GoogleUtilities/Reachability (7.12.0): - GoogleUtilities/Logger - - GoogleUtilities/SwizzlerTestHelpers (7.11.0): - - GoogleUtilities/MethodSwizzler - - GoogleUtilities/UserDefaults (7.11.0): + - GoogleUtilities/UserDefaults (7.12.0): - GoogleUtilities/Logger - - hermes-engine (0.71.3): - - hermes-engine/Pre-built (= 0.71.3) - - hermes-engine/Pre-built (0.71.3) + - hermes-engine (0.72.7): + - hermes-engine/Pre-built (= 0.72.7) + - hermes-engine/Pre-built (0.72.7) - HMSegmentedControl (1.5.6) - Interactable (2.0.1): - React - libevent (2.1.12) - - nanopb (2.30909.0): - - nanopb/decode (= 2.30909.0) - - nanopb/encode (= 2.30909.0) - - nanopb/decode (2.30909.0) - - nanopb/encode (2.30909.0) - - PromisesObjC (2.1.1) + - nanopb (2.30909.1): + - nanopb/decode (= 2.30909.1) + - nanopb/encode (= 2.30909.1) + - nanopb/decode (2.30909.1) + - nanopb/encode (2.30909.1) + - PromisesObjC (2.3.1) + - PromisesSwift (2.3.1): + - PromisesObjC (= 2.3.1) - RCT-Folly (2021.07.22.00): - boost - DoubleConversion @@ -170,27 +130,29 @@ PODS: - fmt (~> 6.2.1) - glog - libevent - - RCTRequired (0.71.7) - - RCTTypeSafety (0.71.7): - - FBLazyVector (= 0.71.7) - - RCTRequired (= 0.71.7) - - React-Core (= 0.71.7) - - React (0.71.7): - - React-Core (= 0.71.7) - - React-Core/DevSupport (= 0.71.7) - - React-Core/RCTWebSocket (= 0.71.7) - - React-RCTActionSheet (= 0.71.7) - - React-RCTAnimation (= 0.71.7) - - React-RCTBlob (= 0.71.7) - - React-RCTImage (= 0.71.7) - - React-RCTLinking (= 0.71.7) - - React-RCTNetwork (= 0.71.7) - - React-RCTSettings (= 0.71.7) - - React-RCTText (= 0.71.7) - - React-RCTVibration (= 0.71.7) - - React-callinvoker (0.71.7) - - React-Codegen (0.71.7): + - RCTRequired (0.72.7) + - RCTTypeSafety (0.72.7): + - FBLazyVector (= 0.72.7) + - RCTRequired (= 0.72.7) + - React-Core (= 0.72.7) + - React (0.72.7): + - React-Core (= 0.72.7) + - React-Core/DevSupport (= 0.72.7) + - React-Core/RCTWebSocket (= 0.72.7) + - React-RCTActionSheet (= 0.72.7) + - React-RCTAnimation (= 0.72.7) + - React-RCTBlob (= 0.72.7) + - React-RCTImage (= 0.72.7) + - React-RCTLinking (= 0.72.7) + - React-RCTNetwork (= 0.72.7) + - React-RCTSettings (= 0.72.7) + - React-RCTText (= 0.72.7) + - React-RCTVibration (= 0.72.7) + - React-callinvoker (0.72.7) + - React-Codegen (0.72.7): + - DoubleConversion - FBReactNativeSpec + - glog - hermes-engine - RCT-Folly - RCTRequired @@ -198,211 +160,258 @@ PODS: - React-Core - React-jsi - React-jsiexecutor + - React-NativeModulesApple + - React-rncore - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-Core (0.71.7): + - React-Core (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.7) - - React-cxxreact (= 0.71.7) + - React-Core/Default (= 0.72.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/CoreModulesHeaders (0.71.7): + - React-Core/CoreModulesHeaders (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/Default (0.71.7): + - React-Core/Default (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/DevSupport (0.71.7): + - React-Core/DevSupport (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.7) - - React-Core/RCTWebSocket (= 0.71.7) - - React-cxxreact (= 0.71.7) + - React-Core/Default (= 0.72.7) + - React-Core/RCTWebSocket (= 0.72.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-jsinspector (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-jsinspector (= 0.72.7) + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTActionSheetHeaders (0.71.7): + - React-Core/RCTActionSheetHeaders (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTAnimationHeaders (0.71.7): + - React-Core/RCTAnimationHeaders (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTBlobHeaders (0.71.7): + - React-Core/RCTBlobHeaders (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTImageHeaders (0.71.7): + - React-Core/RCTImageHeaders (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTLinkingHeaders (0.71.7): + - React-Core/RCTLinkingHeaders (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTNetworkHeaders (0.71.7): + - React-Core/RCTNetworkHeaders (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTSettingsHeaders (0.71.7): + - React-Core/RCTSettingsHeaders (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTTextHeaders (0.71.7): + - React-Core/RCTTextHeaders (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTVibrationHeaders (0.71.7): + - React-Core/RCTVibrationHeaders (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - React-Core/Default - - React-cxxreact (= 0.71.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTWebSocket (0.71.7): + - React-Core/RCTWebSocket (0.72.7): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.71.7) - - React-cxxreact (= 0.71.7) + - React-Core/Default (= 0.72.7) + - React-cxxreact - React-hermes - - React-jsi (= 0.71.7) - - React-jsiexecutor (= 0.71.7) - - React-perflogger (= 0.71.7) + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) - Yoga - - React-CoreModules (0.71.7): + - React-CoreModules (0.72.7): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.7) - - React-Codegen (= 0.71.7) - - React-Core/CoreModulesHeaders (= 0.71.7) - - React-jsi (= 0.71.7) + - RCTTypeSafety (= 0.72.7) + - React-Codegen (= 0.72.7) + - React-Core/CoreModulesHeaders (= 0.72.7) + - React-jsi (= 0.72.7) - React-RCTBlob - - React-RCTImage (= 0.71.7) - - ReactCommon/turbomodule/core (= 0.71.7) - - React-cxxreact (0.71.7): + - React-RCTImage (= 0.72.7) + - ReactCommon/turbomodule/core (= 0.72.7) + - SocketRocket (= 0.6.1) + - React-cxxreact (0.72.7): - boost (= 1.76.0) - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.7) - - React-jsi (= 0.71.7) - - React-jsinspector (= 0.71.7) - - React-logger (= 0.71.7) - - React-perflogger (= 0.71.7) - - React-runtimeexecutor (= 0.71.7) - - React-hermes (0.71.7): + - React-callinvoker (= 0.72.7) + - React-debug (= 0.72.7) + - React-jsi (= 0.72.7) + - React-jsinspector (= 0.72.7) + - React-logger (= 0.72.7) + - React-perflogger (= 0.72.7) + - React-runtimeexecutor (= 0.72.7) + - React-debug (0.72.7) + - React-hermes (0.72.7): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - RCT-Folly/Futures (= 2021.07.22.00) - - React-cxxreact (= 0.71.7) + - React-cxxreact (= 0.72.7) - React-jsi - - React-jsiexecutor (= 0.71.7) - - React-jsinspector (= 0.71.7) - - React-perflogger (= 0.71.7) - - React-jsi (0.71.7): + - React-jsiexecutor (= 0.72.7) + - React-jsinspector (= 0.72.7) + - React-perflogger (= 0.72.7) + - React-jsi (0.72.7): - boost (= 1.76.0) - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-jsiexecutor (0.71.7): + - React-jsiexecutor (0.72.7): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.71.7) - - React-jsi (= 0.71.7) - - React-perflogger (= 0.71.7) - - React-jsinspector (0.71.7) - - React-logger (0.71.7): + - React-cxxreact (= 0.72.7) + - React-jsi (= 0.72.7) + - React-perflogger (= 0.72.7) + - React-jsinspector (0.72.7) + - React-logger (0.72.7): - glog - react-native-camera (4.2.1): - React-Core @@ -412,130 +421,159 @@ PODS: - React-Core - react-native-camera/RN (4.2.1): - React-Core - - react-native-netinfo (9.3.6): + - react-native-netinfo (11.1.0): - React-Core - - react-native-sdk (4.0.0): + - react-native-sdk (5.1.0): - React - - VeriffSDK (= 6.5.0) - - React-perflogger (0.71.7) - - React-RCTActionSheet (0.71.7): - - React-Core/RCTActionSheetHeaders (= 0.71.7) - - React-RCTAnimation (0.71.7): + - VeriffSDK (= 6.22.0) + - React-NativeModulesApple (0.72.7): + - hermes-engine + - React-callinvoker + - React-Core + - React-cxxreact + - React-jsi + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-perflogger (0.72.7) + - React-RCTActionSheet (0.72.7): + - React-Core/RCTActionSheetHeaders (= 0.72.7) + - React-RCTAnimation (0.72.7): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.7) - - React-Codegen (= 0.71.7) - - React-Core/RCTAnimationHeaders (= 0.71.7) - - React-jsi (= 0.71.7) - - ReactCommon/turbomodule/core (= 0.71.7) - - React-RCTAppDelegate (0.71.7): + - RCTTypeSafety (= 0.72.7) + - React-Codegen (= 0.72.7) + - React-Core/RCTAnimationHeaders (= 0.72.7) + - React-jsi (= 0.72.7) + - ReactCommon/turbomodule/core (= 0.72.7) + - React-RCTAppDelegate (0.72.7): - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core + - React-CoreModules + - React-hermes + - React-NativeModulesApple + - React-RCTImage + - React-RCTNetwork + - React-runtimescheduler - ReactCommon/turbomodule/core - - React-RCTBlob (0.71.7): + - React-RCTBlob (0.72.7): - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.7) - - React-Core/RCTBlobHeaders (= 0.71.7) - - React-Core/RCTWebSocket (= 0.71.7) - - React-jsi (= 0.71.7) - - React-RCTNetwork (= 0.71.7) - - ReactCommon/turbomodule/core (= 0.71.7) - - React-RCTImage (0.71.7): + - React-Codegen (= 0.72.7) + - React-Core/RCTBlobHeaders (= 0.72.7) + - React-Core/RCTWebSocket (= 0.72.7) + - React-jsi (= 0.72.7) + - React-RCTNetwork (= 0.72.7) + - ReactCommon/turbomodule/core (= 0.72.7) + - React-RCTImage (0.72.7): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.7) + - React-Codegen (= 0.72.7) + - React-Core/RCTImageHeaders (= 0.72.7) + - React-jsi (= 0.72.7) + - React-RCTNetwork (= 0.72.7) + - ReactCommon/turbomodule/core (= 0.72.7) + - React-RCTLinking (0.72.7): + - React-Codegen (= 0.72.7) + - React-Core/RCTLinkingHeaders (= 0.72.7) + - React-jsi (= 0.72.7) + - ReactCommon/turbomodule/core (= 0.72.7) + - React-RCTNetwork (0.72.7): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.7) - - React-Codegen (= 0.71.7) - - React-Core/RCTImageHeaders (= 0.71.7) - - React-jsi (= 0.71.7) - - React-RCTNetwork (= 0.71.7) - - ReactCommon/turbomodule/core (= 0.71.7) - - React-RCTLinking (0.71.7): - - React-Codegen (= 0.71.7) - - React-Core/RCTLinkingHeaders (= 0.71.7) - - React-jsi (= 0.71.7) - - ReactCommon/turbomodule/core (= 0.71.7) - - React-RCTNetwork (0.71.7): + - RCTTypeSafety (= 0.72.7) + - React-Codegen (= 0.72.7) + - React-Core/RCTNetworkHeaders (= 0.72.7) + - React-jsi (= 0.72.7) + - ReactCommon/turbomodule/core (= 0.72.7) + - React-RCTSettings (0.72.7): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.7) - - React-Codegen (= 0.71.7) - - React-Core/RCTNetworkHeaders (= 0.71.7) - - React-jsi (= 0.71.7) - - ReactCommon/turbomodule/core (= 0.71.7) - - React-RCTSettings (0.71.7): + - RCTTypeSafety (= 0.72.7) + - React-Codegen (= 0.72.7) + - React-Core/RCTSettingsHeaders (= 0.72.7) + - React-jsi (= 0.72.7) + - ReactCommon/turbomodule/core (= 0.72.7) + - React-RCTText (0.72.7): + - React-Core/RCTTextHeaders (= 0.72.7) + - React-RCTVibration (0.72.7): + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.72.7) + - React-Core/RCTVibrationHeaders (= 0.72.7) + - React-jsi (= 0.72.7) + - ReactCommon/turbomodule/core (= 0.72.7) + - React-rncore (0.72.7) + - React-runtimeexecutor (0.72.7): + - React-jsi (= 0.72.7) + - React-runtimescheduler (0.72.7): + - glog + - hermes-engine - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.71.7) - - React-Codegen (= 0.71.7) - - React-Core/RCTSettingsHeaders (= 0.71.7) - - React-jsi (= 0.71.7) - - ReactCommon/turbomodule/core (= 0.71.7) - - React-RCTText (0.71.7): - - React-Core/RCTTextHeaders (= 0.71.7) - - React-RCTVibration (0.71.7): + - React-callinvoker + - React-debug + - React-jsi + - React-runtimeexecutor + - React-utils (0.72.7): + - glog - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.71.7) - - React-Core/RCTVibrationHeaders (= 0.71.7) - - React-jsi (= 0.71.7) - - ReactCommon/turbomodule/core (= 0.71.7) - - React-runtimeexecutor (0.71.7): - - React-jsi (= 0.71.7) - - ReactCommon/turbomodule/bridging (0.71.7): + - React-debug + - ReactCommon/turbomodule/bridging (0.72.7): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.7) - - React-Core (= 0.71.7) - - React-cxxreact (= 0.71.7) - - React-jsi (= 0.71.7) - - React-logger (= 0.71.7) - - React-perflogger (= 0.71.7) - - ReactCommon/turbomodule/core (0.71.7): + - React-callinvoker (= 0.72.7) + - React-cxxreact (= 0.72.7) + - React-jsi (= 0.72.7) + - React-logger (= 0.72.7) + - React-perflogger (= 0.72.7) + - ReactCommon/turbomodule/core (0.72.7): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.71.7) - - React-Core (= 0.71.7) - - React-cxxreact (= 0.71.7) - - React-jsi (= 0.71.7) - - React-logger (= 0.71.7) - - React-perflogger (= 0.71.7) - - ReactNativeNavigation (7.32.1): + - React-callinvoker (= 0.72.7) + - React-cxxreact (= 0.72.7) + - React-jsi (= 0.72.7) + - React-logger (= 0.72.7) + - React-perflogger (= 0.72.7) + - ReactNativeNavigation (7.37.0): - HMSegmentedControl - React-Core + - React-CoreModules - React-RCTImage - React-RCTText - - ReactNativeNavigation/Core (= 7.32.1) - - ReactNativeNavigation/Core (7.32.1): + - ReactNativeNavigation/Core (= 7.37.0) + - ReactNativeNavigation/Core (7.37.0): - HMSegmentedControl - React-Core + - React-CoreModules - React-RCTImage - React-RCTText - - RealmJS (11.8.0): + - RealmJS (12.3.1): - React - - RNFBAnalytics (17.3.0): - - Firebase/AnalyticsWithoutAdIdSupport (= 10.5.0) + - RNFBAnalytics (18.6.2): + - Firebase/AnalyticsWithoutAdIdSupport (= 10.18.0) - React-Core - RNFBApp - - RNFBApp (17.3.0): - - Firebase/CoreOnly (= 10.5.0) + - RNFBApp (18.6.2): + - Firebase/CoreOnly (= 10.18.0) - React-Core - - RNFBCrashlytics (17.3.0): - - Firebase/Crashlytics (= 10.5.0) - - FirebaseCoreExtension (= 10.5.0) + - RNFBCrashlytics (18.6.2): + - Firebase/Crashlytics (= 10.18.0) + - FirebaseCoreExtension (= 10.18.0) - React-Core - RNFBApp - - RNFBMessaging (17.3.0): - - Firebase/Messaging (= 10.5.0) - - FirebaseCoreExtension (= 10.5.0) + - RNFBMessaging (18.6.2): + - Firebase/Messaging (= 10.18.0) + - FirebaseCoreExtension (= 10.18.0) - React-Core - RNFBApp - RNTangemSdk (2.3.1): - React - TangemSdk (= 3.4.0) + - SocketRocket (0.6.1) - TangemSdk (3.4.0) - - VeriffSDK (6.5.0) + - VeriffSDK (6.22.0) - Yoga (1.14.0) DEPENDENCIES: @@ -543,10 +581,7 @@ DEPENDENCIES: - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - - Firebase - - FirebaseCore - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - - GoogleUtilities - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - Interactable (from `../node_modules/react-native-interactable`) - libevent (~> 2.1.12) @@ -560,6 +595,7 @@ DEPENDENCIES: - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) @@ -568,6 +604,7 @@ DEPENDENCIES: - react-native-camera (from `../node_modules/react-native-camera`) - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" - "react-native-sdk (from `../node_modules/@veriff/react-native-sdk`)" + - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) @@ -579,7 +616,10 @@ DEPENDENCIES: - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rncore (from `../node_modules/react-native/ReactCommon`) - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - ReactNativeNavigation (from `../node_modules/react-native-navigation`) - RealmJS (from `../node_modules/realm`) @@ -600,6 +640,7 @@ SPEC REPOS: - FirebaseCrashlytics - FirebaseInstallations - FirebaseMessaging + - FirebaseSessions - fmt - GoogleAppMeasurement - GoogleDataTransport @@ -608,6 +649,8 @@ SPEC REPOS: - libevent - nanopb - PromisesObjC + - PromisesSwift + - SocketRocket - TangemSdk - VeriffSDK @@ -624,6 +667,7 @@ EXTERNAL SOURCES: :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-2023-08-07-RNv0.72.4-813b2def12bc9df02654b3e3653ae4a68d0572e0 Interactable: :path: "../node_modules/react-native-interactable" RCT-Folly: @@ -644,6 +688,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-debug: + :path: "../node_modules/react-native/ReactCommon/react/debug" React-hermes: :path: "../node_modules/react-native/ReactCommon/hermes" React-jsi: @@ -660,6 +706,8 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-community/netinfo" react-native-sdk: :path: "../node_modules/@veriff/react-native-sdk" + React-NativeModulesApple: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-perflogger: :path: "../node_modules/react-native/ReactCommon/reactperflogger" React-RCTActionSheet: @@ -682,8 +730,14 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Text" React-RCTVibration: :path: "../node_modules/react-native/Libraries/Vibration" + React-rncore: + :path: "../node_modules/react-native/ReactCommon" React-runtimeexecutor: :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-runtimescheduler: + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-utils: + :path: "../node_modules/react-native/ReactCommon/react/utils" ReactCommon: :path: "../node_modules/react-native/ReactCommon" ReactNativeNavigation: @@ -706,68 +760,76 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: 57d2868c099736d80fcd648bf211b4431e51a558 DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - FBLazyVector: a89a0525bc7ca174675045c2b492b5280d5a2470 - FBReactNativeSpec: 7714e6bc1e9ea23df6c4cb42f0b2fd9c6a3a559c - Firebase: 3d6637234ab163e31852834617b4fe1df3b7af6d - FirebaseAnalytics: 6f7430030cb6b22fe1db2e3bed782e999b76dc00 - FirebaseCore: 324b8d182d9ff7e3f6d1fa2f04b082d1c7a3e366 - FirebaseCoreExtension: d9fa427f1ae1edccf2368ce5e8d567e4c1f0ebc8 - FirebaseCoreInternal: e463f41bb935cd049505bf7e9a5bdd7dcea90df6 - FirebaseCrashlytics: ea94bc81f67d5d4702d0c782da13e1483217bac8 - FirebaseInstallations: 935bc4abb6f7a035cab7a0c31cb777b2be3dd254 - FirebaseMessaging: 35ecbbc68ff547fca80f9326c9622e79288c7149 + FBLazyVector: 5fbbff1d7734827299274638deb8ba3024f6c597 + FBReactNativeSpec: 638095fe8a01506634d77b260ef8a322019ac671 + Firebase: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 + FirebaseAnalytics: 4d310b35c48eaa4a058ddc04bdca6bdb5dc0fe80 + FirebaseCore: 2322423314d92f946219c8791674d2f3345b598f + FirebaseCoreExtension: 62b201498aa10535801cdf3448c7f4db5e24ed80 + FirebaseCoreInternal: 8eb002e564b533bdcf1ba011f33f2b5c10e2ed4a + FirebaseCrashlytics: 86d5bce01f42fa1db265f87ff1d591f04db610ec + FirebaseInstallations: e842042ec6ac1fd2e37d7706363ebe7f662afea4 + FirebaseMessaging: 9bc34a98d2e0237e1b121915120d4d48ddcf301e + FirebaseSessions: f90fe9212ee2818641eda051c0835c9c4e30d9ae fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b - GoogleAppMeasurement: 40c70a7d89013f0eca72006c4b9732163ea4cdae - GoogleDataTransport: ea169759df570f4e37bdee1623ec32a7e64e67c4 - GoogleUtilities: c2bdc4cf2ce786c4d2e6b3bcfd599a25ca78f06f - hermes-engine: 38bfe887e456b33b697187570a08de33969f5db7 + GoogleAppMeasurement: 70ce9aa438cff1cfb31ea3e660bcc67734cb716e + GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2 + GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 + hermes-engine: 9180d43df05c1ed658a87cc733dc3044cf90c00a HMSegmentedControl: 34c1f54d822d8308e7b24f5d901ec674dfa31352 Interactable: 411887c89fa16ac41f8e7898aca06dcad55e5f22 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 - nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 - PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb + nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 + PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 + PromisesSwift: 28dca69a9c40779916ac2d6985a0192a5cb4a265 RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 - RCTRequired: 5a4a30ac20c86eeadd6844a9328f78d4168cf9b2 - RCTTypeSafety: 279fc5861a89f0f37db3a585f27f971485b4b734 - React: 88307a9be3bd0e71a6822271cf28b84a587fb97f - React-callinvoker: 35fb980c454104ebe82f0afb9826830089248e08 - React-Codegen: a8dbde3b7476d5c19437d2adb9e8ea1b426b9595 - React-Core: 385cb6fa78762c6409ff39faeb0dd9ad664b6e84 - React-CoreModules: c2b7db313b04d9b71954ffd55d0c2e46bc40e9fb - React-cxxreact: 845fefb889132e5d004ff818f7a599e32c52e7d6 - React-hermes: 86135f35e1dd2dfccfb97afe96d0c06f6a3970c4 - React-jsi: 39c116aa6c3d6f3d9874eff6998a670b47882a28 - React-jsiexecutor: eaa5f71eb8f6861cf0e57f1a0f52aeb020d9e18e - React-jsinspector: 9885f6f94d231b95a739ef7bb50536fb87ce7539 - React-logger: 3f8ebad1be1bf3299d1ab6d7f971802d7395c7ef + RCTRequired: 83bca1c184feb4d2e51c72c8369b83d641443f95 + RCTTypeSafety: 13c4a87a16d7db6cd66006ce9759f073402ef85b + React: e67aa9f99957c7611c392b5e49355d877d6525e2 + React-callinvoker: 2790c09d964c2e5404b5410cde91b152e3746b7b + React-Codegen: 81a8f6f195c7e770aa2fa3c70534c26d120b2b74 + React-Core: 9ed6d5cb868115d1e630f7d85078a701dca429c1 + React-CoreModules: f1a0a9d714d90e7d6b60133372b0cf27788a8331 + React-cxxreact: 7da72565656c8ac7f97c9a031d0b199bbdec0640 + React-debug: c4e6bc83ec3d97cd26fcd57eabea3f21e6232fac + React-hermes: 1299a94f255f59a72d5baa54a2ca2e1eee104947 + React-jsi: 2208de64c3a41714ac04e86975386fc49116ea13 + React-jsiexecutor: c49502e5d02112247ee4526bc3ccfc891ae3eb9b + React-jsinspector: 8baadae51f01d867c3921213a25ab78ab4fbcd91 + React-logger: 8edc785c47c8686c7962199a307015e2ce9a0e4f react-native-camera: 3eae183c1d111103963f3dd913b65d01aef8110f - react-native-netinfo: f80db8cac2151405633324cb645c60af098ee461 - react-native-sdk: 109dff063c231e52b26aba3a1f69ff74a177d27e - React-perflogger: 2d505bbe298e3b7bacdd9e542b15535be07220f6 - React-RCTActionSheet: 0e96e4560bd733c9b37efbf68f5b1a47615892fb - React-RCTAnimation: fd138e26f120371c87e406745a27535e2c8a04ef - React-RCTAppDelegate: 4a9fd1230a98dc3d4382f8a934dc9f50834d8335 - React-RCTBlob: 38a7185f06a0ce8153a023e63b406a28d67b955d - React-RCTImage: 92b0966e7c1cadda889e961c474397ad5180e194 - React-RCTLinking: b80f8d0c6e94c54294b0048def51f57eaa9a27af - React-RCTNetwork: 491b0c65ac22edbd6695d12d084b4943103b009b - React-RCTSettings: 97af3e8abe0023349ec015910df3bda1a0380117 - React-RCTText: 33c85753bd714d527d2ae538dc56ec24c6783d84 - React-RCTVibration: 08f132cad9896458776f37c112e71d60aef1c6ae - React-runtimeexecutor: c5c89f8f543842dd864b63ded1b0bbb9c9445328 - ReactCommon: dbfbe2f7f3c5ce4ce44f43f2fd0d5950d1eb67c5 - ReactNativeNavigation: d79d9d53e6025851936bb8b3d13760b86302a669 - RealmJS: 27b8d695fa4bc9606a4a4a378de55511edc2084c - RNFBAnalytics: 7dc4c2fcf189fe932fe18ac0ef03bb943b62ef36 - RNFBApp: 3672911764485c44b6ff947273a0d470477774df - RNFBCrashlytics: 3a52f3c3e4f7ed29545255a41edc4e7433b0f442 - RNFBMessaging: a0f8a5a5b6646e382bc322225eebcdfb7be2da4f + react-native-netinfo: 3aa5637c18834966e0c932de8ae1ae56fea20a97 + react-native-sdk: 9b95ae7c87b7cbefe1a19c2ecef64f661a4d6b77 + React-NativeModulesApple: ac9cea059dfe97cf3a4f00aa2774293bf5a99463 + React-perflogger: 31ea61077185eb1428baf60c0db6e2886f141a5a + React-RCTActionSheet: 392090a3abc8992eb269ef0eaa561750588fc39d + React-RCTAnimation: dc4cf3f4c9d1ba37edb82f1fb0b00760ddbbeb26 + React-RCTAppDelegate: 24dfa6a65a25df6e87d88048bf522ca859c81eca + React-RCTBlob: aad307e1b21c87877d98063268367676452f51a3 + React-RCTImage: 6ad7a367f40ac7e9af4e15b60e4c3e6dbda87817 + React-RCTLinking: 82db248ade50d92184a9feca46528139f1590a63 + React-RCTNetwork: 93db4b433026b3137e6063f0a66336662d473e55 + React-RCTSettings: e6b44c8b24bc07936e68b8f20d923f69a32488ba + React-RCTText: 3c71ecaad8ee010b79632ea2590f86c02f5cce17 + React-RCTVibration: a756370068de4becdf432dbd42b76f42fbc1dc66 + React-rncore: 1e60bef88b49498868dfeb63144b00cae17597ef + React-runtimeexecutor: 47b0a2d5bbb416db65ef881a6f7bdcfefa0001ab + React-runtimescheduler: b825f8f8193c2111e25381ce844d01c1c520994e + React-utils: dc51e2c7c2e49d327b90771d8a7acc95918eb485 + ReactCommon: 4ef37cb61335f2c7a29225d754c06857b4cc6361 + ReactNativeNavigation: 2651d0bc1479e9df0789b077ae93320dc2c9b73b + RealmJS: 578e16cf7c0b32c13a23b2df667b021bb3c36f1c + RNFBAnalytics: 40c559013d6c4dd842435c7eed4eb8fcf4b53787 + RNFBApp: 09fd96441b0f556a1ef50ee70fa72160ae71ecb9 + RNFBCrashlytics: 0866393a9fbca1d8d353052243e21d1cdeb55394 + RNFBMessaging: 95fa608c79d3378b1a958a64f8be82e4699368a9 RNTangemSdk: b4a4c91c617daca427a69cc7f784425c6789acd7 + SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 TangemSdk: d782fc8c55cb56ffdfcaf7081422e02b19f18334 - VeriffSDK: 4f83c5c8bea408d4efaa48630cbd1cf3212d9b38 - Yoga: d56980c8914db0b51692f55533409e844b66133c + VeriffSDK: 3ec2a1389ffd7ec8a533b34d6fad8ec0071ad72f + Yoga: 4c3aa327e4a6a23eeacd71f61c81df1bcdf677d5 -PODFILE CHECKSUM: 452ef3846ceb4a1bc9bb6d1674cda171d6737af5 +PODFILE CHECKSUM: 349fd765463969a28397aadfc81d7ef7073399e5 COCOAPODS: 1.11.3 diff --git a/ios/XUMM-tvOS/Info.plist b/ios/XUMM-tvOS/Info.plist deleted file mode 100644 index ecbd496be..000000000 --- a/ios/XUMM-tvOS/Info.plist +++ /dev/null @@ -1,53 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - - NSLocationWhenInUseUsageDescription - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/ios/XUMM-tvOSTests/Info.plist b/ios/XUMM-tvOSTests/Info.plist deleted file mode 100644 index 886825ccc..000000000 --- a/ios/XUMM-tvOSTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/ios/XUMM/Images.xcassets/Graphics/SideGradient.imageset/Contents.json b/ios/XUMM/Images.xcassets/Graphics/SideGradient.imageset/Contents.json deleted file mode 100644 index 4f3fc9ca5..000000000 --- a/ios/XUMM/Images.xcassets/Graphics/SideGradient.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "side_gradient.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/XUMM/Images.xcassets/Graphics/SideGradient.imageset/side_gradient.png b/ios/XUMM/Images.xcassets/Graphics/SideGradient.imageset/side_gradient.png deleted file mode 100644 index b1e094541..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/SideGradient.imageset/side_gradient.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/splash_screen_patterns@1x.png b/ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/splash_screen_patterns@1x.png deleted file mode 100644 index b46858179..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/splash_screen_patterns@1x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/splash_screen_patterns@2x.png b/ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/splash_screen_patterns@2x.png deleted file mode 100644 index 5a237bc2d..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/splash_screen_patterns@2x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/splash_screen_patterns@3x.png b/ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/splash_screen_patterns@3x.png deleted file mode 100644 index 4f802448a..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/splash_screen_patterns@3x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/xumm_icon@1x.png b/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/xumm_icon@1x.png deleted file mode 100644 index f32cbe1e3..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/xumm_icon@1x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/xumm_icon@2x.png b/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/xumm_icon@2x.png deleted file mode 100644 index 1adc3012e..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/xumm_icon@2x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/xumm_icon@3x.png b/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/xumm_icon@3x.png deleted file mode 100644 index 770a14ca6..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/xumm_icon@3x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/xumm_icon_light@1x.png b/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/xumm_icon_light@1x.png deleted file mode 100644 index 0fb0d7118..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/xumm_icon_light@1x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/xumm_icon_light@2x.png b/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/xumm_icon_light@2x.png deleted file mode 100644 index 63a2cad20..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/xumm_icon_light@2x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/xumm_icon_light@3x.png b/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/xumm_icon_light@3x.png deleted file mode 100644 index c33cb8f56..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/xumm_icon_light@3x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/xumm_icon_white@1x.png b/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/xumm_icon_white@1x.png deleted file mode 100644 index 03c7466d0..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/xumm_icon_white@1x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/xumm_icon_white@2x.png b/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/xumm_icon_white@2x.png deleted file mode 100644 index d92080101..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/xumm_icon_white@2x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/xumm_icon_white@3x.png b/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/xumm_icon_white@3x.png deleted file mode 100644 index 8e1f51705..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/xumm_icon_white@3x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/xumm_logo@1x.png b/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/xumm_logo@1x.png deleted file mode 100644 index 4ffde7fd0..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/xumm_logo@1x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/xumm_logo@2x.png b/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/xumm_logo@2x.png deleted file mode 100644 index 5253a9254..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/xumm_logo@2x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/xumm_logo@3x.png b/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/xumm_logo@3x.png deleted file mode 100644 index 71e25d650..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/xumm_logo@3x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/Contents.json b/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/Contents.json deleted file mode 100644 index 8160bb50b..000000000 --- a/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "xumm_logo_light@1x.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "xumm_logo_light@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "xumm_logo_light@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/xumm_logo_light@1x.png b/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/xumm_logo_light@1x.png deleted file mode 100644 index 0d4557b8b..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/xumm_logo_light@1x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/xumm_logo_light@2x.png b/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/xumm_logo_light@2x.png deleted file mode 100644 index eeb5cbb36..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/xumm_logo_light@2x.png and /dev/null differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/xumm_logo_light@3x.png b/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/xumm_logo_light@3x.png deleted file mode 100644 index 67059b473..000000000 Binary files a/ios/XUMM/Images.xcassets/Graphics/XummLogoLight.imageset/xumm_logo_light@3x.png and /dev/null differ diff --git a/ios/XUMM-Bridging-Header.h b/ios/Xaman-Bridging-Header.h similarity index 100% rename from ios/XUMM-Bridging-Header.h rename to ios/Xaman-Bridging-Header.h diff --git a/ios/XUMM.xcodeproj/project.pbxproj b/ios/Xaman.xcodeproj/project.pbxproj similarity index 87% rename from ios/XUMM.xcodeproj/project.pbxproj rename to ios/Xaman.xcodeproj/project.pbxproj index 259d57ef1..61b3cb0bd 100644 --- a/ios/XUMM.xcodeproj/project.pbxproj +++ b/ios/Xaman.xcodeproj/project.pbxproj @@ -10,8 +10,8 @@ 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 2722A3DFEB89CB2CECEB8C3A /* libPods-XUMM-XUMMTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FFBD046B01D1ACD756075CD6 /* libPods-XUMM-XUMMTests.a */; }; - 9CF022905118498486EAC1CB /* libPods-XUMM.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 709FAF2CE9A4E4E10C22832F /* libPods-XUMM.a */; }; + 4E76AF7D78F0343A996A8CCE /* Pods_Xaman_XamanTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BFD60F0C13BA576045833BA5 /* Pods_Xaman_XamanTests.framework */; }; + 9F2B8C19DDAA855ECD2EF1A2 /* Pods_Xaman.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C137C8E9CDF0648A92B4C5D /* Pods_Xaman.framework */; }; A2021F6A28E591F300506772 /* CryptoTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2021F6928E591F300506772 /* CryptoTest.swift */; }; A2021F7528E5C53000506772 /* CipherTest.m in Sources */ = {isa = PBXBuildFile; fileRef = A2021F7428E5C53000506772 /* CipherTest.m */; }; A2021F7728E6DF9700506772 /* VaultMangerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = A2021F7628E6DF9700506772 /* VaultMangerTest.m */; }; @@ -78,24 +78,21 @@ /* Begin PBXFileReference section */ 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; - 00E356EE1AD99517003FC87E /* XUMMTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XUMMTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356EE1AD99517003FC87E /* XamanTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XamanTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* XUMM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XUMM.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = XUMM/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = XUMM/AppDelegate.m; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = XUMM/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = XUMM/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = XUMM/main.m; sourceTree = ""; }; - 2909398B7F1B5C5C12DE7F38 /* Pods-XUMM-XUMMTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XUMM-XUMMTests.debug.xcconfig"; path = "Target Support Files/Pods-XUMM-XUMMTests/Pods-XUMM-XUMMTests.debug.xcconfig"; sourceTree = ""; }; - 41B755F85CC80F767B6112F0 /* Pods-XUMM.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XUMM.debug.xcconfig"; path = "Target Support Files/Pods-XUMM/Pods-XUMM.debug.xcconfig"; sourceTree = ""; }; - 6FC7DE8D39088870144650EE /* Pods-XUMM.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XUMM.release.xcconfig"; path = "Target Support Files/Pods-XUMM/Pods-XUMM.release.xcconfig"; sourceTree = ""; }; - 709FAF2CE9A4E4E10C22832F /* libPods-XUMM.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-XUMM.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - A0B004DFC3510E84CF0CBF19 /* Pods-XUMM-XUMMTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XUMM-XUMMTests.release.xcconfig"; path = "Target Support Files/Pods-XUMM-XUMMTests/Pods-XUMM-XUMMTests.release.xcconfig"; sourceTree = ""; }; - A2021F6828E591F300506772 /* XUMMTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XUMMTests-Bridging-Header.h"; sourceTree = ""; }; + 04A66EC2DDF90CD814AAB046 /* Pods-Xaman-XamanTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Xaman-XamanTests.release.xcconfig"; path = "Target Support Files/Pods-Xaman-XamanTests/Pods-Xaman-XamanTests.release.xcconfig"; sourceTree = ""; }; + 0C137C8E9CDF0648A92B4C5D /* Pods_Xaman.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Xaman.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07F961A680F5B00A75B9A /* Xaman.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Xaman.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Xaman/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Xaman/AppDelegate.m; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Xaman/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Xaman/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Xaman/main.m; sourceTree = ""; }; + A2021F6828E591F300506772 /* XamanTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XamanTests-Bridging-Header.h"; sourceTree = ""; }; A2021F6928E591F300506772 /* CryptoTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptoTest.swift; sourceTree = ""; }; A2021F7428E5C53000506772 /* CipherTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CipherTest.m; sourceTree = ""; }; A2021F7628E6DF9700506772 /* VaultMangerTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VaultMangerTest.m; sourceTree = ""; }; - A20B9291256FCE670066FECA /* XUMM-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XUMM-Bridging-Header.h"; sourceTree = ""; }; + A20B9291256FCE670066FECA /* Xaman-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Xaman-Bridging-Header.h"; sourceTree = ""; }; A20B9292256FCE670066FECA /* Empty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Empty.swift; sourceTree = ""; }; A20C141E2524C8A000686A2A /* AppUpdate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppUpdate.h; sourceTree = ""; }; A20C141F2524C8A000686A2A /* AppUpdate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppUpdate.m; sourceTree = ""; }; @@ -142,7 +139,7 @@ A2AFF113243E79C30007005E /* Proxima Nova Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Proxima Nova Bold.otf"; sourceTree = ""; }; A2AFF114243E79C30007005E /* ProximaNova-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ProximaNova-Regular.otf"; sourceTree = ""; }; A2AFF115243E79C30007005E /* Proxima Nova Thin.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Proxima Nova Thin.otf"; sourceTree = ""; }; - A2AFF116243E79C30007005E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "XUMM/GoogleService-Info.plist"; sourceTree = ""; }; + A2AFF116243E79C30007005E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Xaman/GoogleService-Info.plist"; sourceTree = ""; }; A2AFF119243E79C30007005E /* QRCode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QRCode.m; sourceTree = ""; }; A2AFF11A243E79C30007005E /* UIView+QRCode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+QRCode.m"; sourceTree = ""; }; A2AFF11B243E79C30007005E /* UIView+Toast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+Toast.h"; sourceTree = ""; }; @@ -162,7 +159,7 @@ A2AFF12C243E79C30007005E /* DeviceUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceUtils.h; sourceTree = ""; }; A2AFF12D243E79C30007005E /* DeviceUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeviceUtils.m; sourceTree = ""; }; A2B145CA243E935F00E952B6 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; - A2B145CC243F734600E952B6 /* XUMM.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = XUMM.entitlements; path = XUMM/XUMM.entitlements; sourceTree = ""; }; + A2B145CC243F734600E952B6 /* Xaman.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Xaman.entitlements; path = Xaman/Xaman.entitlements; sourceTree = ""; }; A2B9D13C2449B83900259841 /* SharedPreferences.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SharedPreferences.h; sourceTree = ""; }; A2B9D13D2449B83C00259841 /* SharedPreferences.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SharedPreferences.m; sourceTree = ""; }; A2D856BE28801643003717BC /* AppUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppUtils.h; sourceTree = ""; }; @@ -177,9 +174,12 @@ A2F4F39428802A4600444302 /* UniqueIdProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UniqueIdProvider.m; sourceTree = ""; }; A2F4F396288168BC00444302 /* Clipboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Clipboard.h; sourceTree = ""; }; A2F4F397288168CB00444302 /* Clipboard.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Clipboard.m; sourceTree = ""; }; + B712F110E060129D749043CD /* Pods-Xaman.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Xaman.debug.xcconfig"; path = "Target Support Files/Pods-Xaman/Pods-Xaman.debug.xcconfig"; sourceTree = ""; }; + BFD60F0C13BA576045833BA5 /* Pods_Xaman_XamanTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Xaman_XamanTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CA7812F0C935F7652256C087 /* Pods-Xaman-XamanTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Xaman-XamanTests.debug.xcconfig"; path = "Target Support Files/Pods-Xaman-XamanTests/Pods-Xaman-XamanTests.debug.xcconfig"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; - FFBD046B01D1ACD756075CD6 /* libPods-XUMM-XUMMTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-XUMM-XUMMTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + F35B10B5380FF4BC3DA7B7F5 /* Pods-Xaman.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Xaman.release.xcconfig"; path = "Target Support Files/Pods-Xaman/Pods-Xaman.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -187,7 +187,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2722A3DFEB89CB2CECEB8C3A /* libPods-XUMM-XUMMTests.a in Frameworks */, + 4E76AF7D78F0343A996A8CCE /* Pods_Xaman_XamanTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -196,24 +196,24 @@ buildActionMask = 2147483647; files = ( A2ED131C252F113A002AFC09 /* StoreKit.framework in Frameworks */, - 9CF022905118498486EAC1CB /* libPods-XUMM.a in Frameworks */, + 9F2B8C19DDAA855ECD2EF1A2 /* Pods_Xaman.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 00E356EF1AD99517003FC87E /* XUMMTests */ = { + 00E356EF1AD99517003FC87E /* XamanTests */ = { isa = PBXGroup; children = ( A21FD5D728EDA7C400030EF0 /* extentions */, 00E356F01AD99517003FC87E /* Supporting Files */, A2021F6928E591F300506772 /* CryptoTest.swift */, - A2021F6828E591F300506772 /* XUMMTests-Bridging-Header.h */, + A2021F6828E591F300506772 /* XamanTests-Bridging-Header.h */, A2021F7428E5C53000506772 /* CipherTest.m */, A2021F7628E6DF9700506772 /* VaultMangerTest.m */, ); - path = XUMMTests; + path = XamanTests; sourceTree = ""; }; 00E356F01AD99517003FC87E /* Supporting Files */ = { @@ -224,11 +224,11 @@ name = "Supporting Files"; sourceTree = ""; }; - 13B07FAE1A68108700A75B9A /* XUMM */ = { + 13B07FAE1A68108700A75B9A /* Xaman */ = { isa = PBXGroup; children = ( A2771FC129828E33008A95E3 /* security.txt */, - A2B145CC243F734600E952B6 /* XUMM.entitlements */, + A2B145CC243F734600E952B6 /* Xaman.entitlements */, A2AFF109243E79C30007005E /* Fonts */, A2AFF116243E79C30007005E /* GoogleService-Info.plist */, A2AFF117243E79C30007005E /* Libs */, @@ -240,9 +240,9 @@ 13B07FB61A68108700A75B9A /* Info.plist */, 13B07FB71A68108700A75B9A /* main.m */, A20B9292256FCE670066FECA /* Empty.swift */, - A20B9291256FCE670066FECA /* XUMM-Bridging-Header.h */, + A20B9291256FCE670066FECA /* Xaman-Bridging-Header.h */, ); - name = XUMM; + name = Xaman; sourceTree = ""; }; 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { @@ -251,8 +251,8 @@ A2ED131B252F113A002AFC09 /* StoreKit.framework */, ED297162215061F000B7C4FE /* JavaScriptCore.framework */, ED2971642150620600B7C4FE /* JavaScriptCore.framework */, - 709FAF2CE9A4E4E10C22832F /* libPods-XUMM.a */, - FFBD046B01D1ACD756075CD6 /* libPods-XUMM-XUMMTests.a */, + 0C137C8E9CDF0648A92B4C5D /* Pods_Xaman.framework */, + BFD60F0C13BA576045833BA5 /* Pods_Xaman_XamanTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -267,9 +267,9 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( - 13B07FAE1A68108700A75B9A /* XUMM */, + 13B07FAE1A68108700A75B9A /* Xaman */, 832341AE1AAA6A7D00B99B32 /* Libraries */, - 00E356EF1AD99517003FC87E /* XUMMTests */, + 00E356EF1AD99517003FC87E /* XamanTests */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, ED14F17356ED5A81E9920E69 /* Pods */, @@ -282,8 +282,8 @@ 83CBBA001A601CBA00E9B192 /* Products */ = { isa = PBXGroup; children = ( - 13B07F961A680F5B00A75B9A /* XUMM.app */, - 00E356EE1AD99517003FC87E /* XUMMTests.xctest */, + 13B07F961A680F5B00A75B9A /* Xaman.app */, + 00E356EE1AD99517003FC87E /* XamanTests.xctest */, ); name = Products; sourceTree = ""; @@ -433,7 +433,7 @@ A2AFF115243E79C30007005E /* Proxima Nova Thin.otf */, ); name = Fonts; - path = XUMM/Fonts; + path = Xaman/Fonts; sourceTree = ""; }; A2AFF117243E79C30007005E /* Libs */ = { @@ -447,7 +447,7 @@ A2AFF12B243E79C30007005E /* Utils */, ); name = Libs; - path = XUMM/Libs; + path = Xaman/Libs; sourceTree = ""; }; A2AFF118243E79C30007005E /* UI */ = { @@ -533,10 +533,10 @@ ED14F17356ED5A81E9920E69 /* Pods */ = { isa = PBXGroup; children = ( - 41B755F85CC80F767B6112F0 /* Pods-XUMM.debug.xcconfig */, - 6FC7DE8D39088870144650EE /* Pods-XUMM.release.xcconfig */, - 2909398B7F1B5C5C12DE7F38 /* Pods-XUMM-XUMMTests.debug.xcconfig */, - A0B004DFC3510E84CF0CBF19 /* Pods-XUMM-XUMMTests.release.xcconfig */, + B712F110E060129D749043CD /* Pods-Xaman.debug.xcconfig */, + F35B10B5380FF4BC3DA7B7F5 /* Pods-Xaman.release.xcconfig */, + CA7812F0C935F7652256C087 /* Pods-Xaman-XamanTests.debug.xcconfig */, + 04A66EC2DDF90CD814AAB046 /* Pods-Xaman-XamanTests.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -544,50 +544,50 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 00E356ED1AD99517003FC87E /* XUMMTests */ = { + 00E356ED1AD99517003FC87E /* XamanTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "XUMMTests" */; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "XamanTests" */; buildPhases = ( - B9142ACC8A9585CB0A26A15C /* [CP] Check Pods Manifest.lock */, + E9D62753F665C0D1637F6639 /* [CP] Check Pods Manifest.lock */, 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, - 28D5933135EEE2A1AD8C92D2 /* [CP] Embed Pods Frameworks */, - 116587FF83F38EC43235D979 /* [CP] Copy Pods Resources */, + A99C0DF7F151CC945907E657 /* [CP] Embed Pods Frameworks */, + C5A6EC0D8FB7BBFAFA426E7A /* [CP] Copy Pods Resources */, ); buildRules = ( ); dependencies = ( 00E356F51AD99517003FC87E /* PBXTargetDependency */, ); - name = XUMMTests; + name = XamanTests; productName = XUMMTests; - productReference = 00E356EE1AD99517003FC87E /* XUMMTests.xctest */; + productReference = 00E356EE1AD99517003FC87E /* XamanTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 13B07F861A680F5B00A75B9A /* XUMM */ = { + 13B07F861A680F5B00A75B9A /* Xaman */ = { isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "XUMM" */; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Xaman" */; buildPhases = ( - A9A8793B07C13B39611117B4 /* [CP] Check Pods Manifest.lock */, + A3F03C47283A8EFCD65408F9 /* [CP] Check Pods Manifest.lock */, FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, A275AAF3297057150055DFD6 /* ShellScript */, - 78C2FE45926453CA30440BFF /* [CP] Embed Pods Frameworks */, - E73CAB45D7C9817B20EF6B4F /* [CP] Copy Pods Resources */, - 49AD273FCB4FE5E5A391683F /* [CP-User] [RNFB] Core Configuration */, - F85B711739199379F784FF26 /* [CP-User] [RNFB] Crashlytics Configuration */, + F6C165A363F1EDD2BC963F73 /* [CP] Embed Pods Frameworks */, + 8030B10F1904690935898C47 /* [CP] Copy Pods Resources */, + 590E29A235634955291A8083 /* [CP-User] [RNFB] Core Configuration */, + 68E666D63B2C268BFFA9D1D9 /* [CP-User] [RNFB] Crashlytics Configuration */, ); buildRules = ( ); dependencies = ( ); - name = XUMM; + name = Xaman; productName = XUMM; - productReference = 13B07F961A680F5B00A75B9A /* XUMM.app */; + productReference = 13B07F961A680F5B00A75B9A /* Xaman.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -606,10 +606,11 @@ 13B07F861A680F5B00A75B9A = { DevelopmentTeam = LK5BBJNJZ6; LastSwiftMigration = 1220; + ProvisioningStyle = Automatic; }; }; }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "XUMM" */; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Xaman" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; @@ -622,8 +623,8 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 13B07F861A680F5B00A75B9A /* XUMM */, - 00E356ED1AD99517003FC87E /* XUMMTests */, + 13B07F861A680F5B00A75B9A /* Xaman */, + 00E356ED1AD99517003FC87E /* XamanTests */, ); }; /* End PBXProject section */ @@ -664,7 +665,7 @@ /* Begin PBXShellScriptBuildPhase section */ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; + buildActionMask = 12; files = ( ); inputPaths = ( @@ -676,77 +677,51 @@ shellPath = /bin/sh; shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; - 116587FF83F38EC43235D979 /* [CP] Copy Pods Resources */ = { + 590E29A235634955291A8083 /* [CP-User] [RNFB] Core Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-XUMM-XUMMTests/Pods-XUMM-XUMMTests-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/TangemSdk/TangemSdk.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TangemSdk.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-XUMM-XUMMTests/Pods-XUMM-XUMMTests-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 28D5933135EEE2A1AD8C92D2 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-XUMM-XUMMTests/Pods-XUMM-XUMMTests-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/VeriffSDK/Veriff.framework/Veriff", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Veriff.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", ); + name = "[CP-User] [RNFB] Core Configuration"; runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-XUMM-XUMMTests/Pods-XUMM-XUMMTests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; }; - 49AD273FCB4FE5E5A391683F /* [CP-User] [RNFB] Core Configuration */ = { + 68E666D63B2C268BFFA9D1D9 /* [CP-User] [RNFB] Crashlytics Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", + "$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", ); - name = "[CP-User] [RNFB] Core Configuration"; + name = "[CP-User] [RNFB] Crashlytics Configuration"; runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; }; - 78C2FE45926453CA30440BFF /* [CP] Embed Pods Frameworks */ = { + 8030B10F1904690935898C47 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-XUMM/Pods-XUMM-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/VeriffSDK/Veriff.framework/Veriff", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", + "${PODS_ROOT}/Target Support Files/Pods-Xaman/Pods-Xaman-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/TangemSdk/TangemSdk.bundle", ); - name = "[CP] Embed Pods Frameworks"; + name = "[CP] Copy Pods Resources"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Veriff.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TangemSdk.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-XUMM/Pods-XUMM-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Xaman/Pods-Xaman-resources.sh\"\n"; showEnvVarsInLog = 0; }; A275AAF3297057150055DFD6 /* ShellScript */ = { @@ -766,7 +741,7 @@ shellPath = /bin/sh; shellScript = "#Disables ATS in debug builds.\nINFOPLIST=\"${TARGET_BUILD_DIR}\"/\"${INFOPLIST_PATH}\"\ncase \"${CONFIGURATION}\" in\n\"Release\"|\"Adhoc\")\n/usr/libexec/PlistBuddy -c \"Delete :NSAppTransportSecurity\" \"${INFOPLIST}\" || true\n;;\n\"Debug\")\n/usr/libexec/PlistBuddy -c \"Add :NSAppTransportSecurity:NSExceptionDomains:localhost dict\" \"${INFOPLIST}\" || true\n/usr/libexec/PlistBuddy -c \"Add :NSAppTransportSecurity:NSExceptionDomains:localhost:NSExceptionAllowsInsecureHTTPLoads bool true\" \"${INFOPLIST}\" || true\n;; \nesac\n"; }; - A9A8793B07C13B39611117B4 /* [CP] Check Pods Manifest.lock */ = { + A3F03C47283A8EFCD65408F9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -781,42 +756,40 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-XUMM-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Xaman-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B9142ACC8A9585CB0A26A15C /* [CP] Check Pods Manifest.lock */ = { + A99C0DF7F151CC945907E657 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Xaman-XamanTests/Pods-Xaman-XamanTests-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/VeriffSDK/Veriff.framework/Veriff", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", ); + name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-XUMM-XUMMTests-checkManifestLockResult.txt", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Veriff.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Xaman-XamanTests/Pods-Xaman-XamanTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - E73CAB45D7C9817B20EF6B4F /* [CP] Copy Pods Resources */ = { + C5A6EC0D8FB7BBFAFA426E7A /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-XUMM/Pods-XUMM-resources.sh", + "${PODS_ROOT}/Target Support Files/Pods-Xaman-XamanTests/Pods-Xaman-XamanTests-resources.sh", "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/TangemSdk/TangemSdk.bundle", ); @@ -827,22 +800,50 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-XUMM/Pods-XUMM-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Xaman-XamanTests/Pods-Xaman-XamanTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; - F85B711739199379F784FF26 /* [CP-User] [RNFB] Crashlytics Configuration */ = { + E9D62753F665C0D1637F6639 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", - "$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Xaman-XamanTests-checkManifestLockResult.txt", ); - name = "[CP-User] [RNFB] Crashlytics Configuration"; runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + F6C165A363F1EDD2BC963F73 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Xaman/Pods-Xaman-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/VeriffSDK/Veriff.framework/Veriff", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Veriff.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Xaman/Pods-Xaman-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; FD10A7F022414F080027D42C /* Start Packager */ = { isa = PBXShellScriptBuildPhase; @@ -923,7 +924,7 @@ /* Begin PBXTargetDependency section */ 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 13B07F861A680F5B00A75B9A /* XUMM */; + target = 13B07F861A680F5B00A75B9A /* Xaman */; targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -931,7 +932,7 @@ /* Begin XCBuildConfiguration section */ 00E356F61AD99517003FC87E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2909398B7F1B5C5C12DE7F38 /* Pods-XUMM-XUMMTests.debug.xcconfig */; + baseConfigurationReference = CA7812F0C935F7652256C087 /* Pods-Xaman-XamanTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; @@ -995,9 +996,9 @@ "${PODS_ROOT}/Firebase/CoreOnly/Sources", "\"$(PODS_ROOT)/boost\"", "\"$(PODS_ROOT)/Headers/Private/React-Core\"", - $CONFIGURATION_TEMP_DIR/XUMM.build/DerivedSources, + $CONFIGURATION_TEMP_DIR/Xaman.build/DerivedSources, ); - INFOPLIST_FILE = XUMMTests/Info.plist; + INFOPLIST_FILE = XamanTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; OTHER_LDFLAGS = ( @@ -1007,17 +1008,17 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "XUMMTests/XUMMTests-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "XamanTests/XamanTests-Bridging-Header.h"; SWIFT_OBJC_INTERFACE_HEADER_NAME = "$(SWIFT_MODULE_NAME)-Swift.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/XUMM.app/XUMM"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Xaman.app/Xaman"; }; name = Debug; }; 00E356F71AD99517003FC87E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A0B004DFC3510E84CF0CBF19 /* Pods-XUMM-XUMMTests.release.xcconfig */; + baseConfigurationReference = 04A66EC2DDF90CD814AAB046 /* Pods-Xaman-XamanTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; @@ -1077,9 +1078,9 @@ "${PODS_ROOT}/Firebase/CoreOnly/Sources", "\"$(PODS_ROOT)/boost\"", "\"$(PODS_ROOT)/Headers/Private/React-Core\"", - $CONFIGURATION_TEMP_DIR/XUMM.build/DerivedSources, + $CONFIGURATION_TEMP_DIR/Xaman.build/DerivedSources, ); - INFOPLIST_FILE = XUMMTests/Info.plist; + INFOPLIST_FILE = XamanTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; OTHER_LDFLAGS = ( @@ -1089,21 +1090,23 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "XUMMTests/XUMMTests-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "XamanTests/XamanTests-Bridging-Header.h"; SWIFT_OBJC_INTERFACE_HEADER_NAME = "$(SWIFT_MODULE_NAME)-Swift.h"; SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/XUMM.app/XUMM"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Xaman.app/Xaman"; }; name = Release; }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 41B755F85CC80F767B6112F0 /* Pods-XUMM.debug.xcconfig */; + baseConfigurationReference = B712F110E060129D749043CD /* Pods-Xaman.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = XUMM/XUMM.entitlements; - CURRENT_PROJECT_VERSION = 2; + CODE_SIGN_ENTITLEMENTS = Xaman/Xaman.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 16; DEVELOPMENT_TEAM = LK5BBJNJZ6; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; @@ -1111,18 +1114,19 @@ "$(inherited)", "FB_SONARKIT_ENABLED=1", ); - INFOPLIST_FILE = XUMM/Info.plist; + INFOPLIST_FILE = Xaman/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 2.5.0; + MARKETING_VERSION = 2.6.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = com.xrpllabs.xumm; - PRODUCT_NAME = XUMM; - SWIFT_OBJC_BRIDGING_HEADER = "XUMM-Bridging-Header.h"; + PRODUCT_NAME = Xaman; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Xaman-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -1131,26 +1135,29 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6FC7DE8D39088870144650EE /* Pods-XUMM.release.xcconfig */; + baseConfigurationReference = F35B10B5380FF4BC3DA7B7F5 /* Pods-Xaman.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = XUMM/XUMM.entitlements; - CURRENT_PROJECT_VERSION = 2; + CODE_SIGN_ENTITLEMENTS = Xaman/Xaman.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 16; DEVELOPMENT_TEAM = LK5BBJNJZ6; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; - INFOPLIST_FILE = XUMM/Info.plist; + INFOPLIST_FILE = Xaman/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 2.5.0; + MARKETING_VERSION = 2.6.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); PRODUCT_BUNDLE_IDENTIFIER = com.xrpllabs.xumm; - PRODUCT_NAME = XUMM; - SWIFT_OBJC_BRIDGING_HEADER = "XUMM-Bridging-Header.h"; + PRODUCT_NAME = Xaman; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Xaman-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; @@ -1196,6 +1203,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", + _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION, ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1204,6 +1212,14 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", + ); IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( @@ -1213,6 +1229,15 @@ ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "$(inherited)"; + OTHER_CPLUSPLUSFLAGS = "$(inherited)"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-Wl", + "-ld_classic", + "-Wl", + "-ld_classic", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; }; @@ -1253,12 +1278,24 @@ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION, + ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", + ); IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( @@ -1267,6 +1304,15 @@ "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = "$(inherited)"; + OTHER_CPLUSPLUSFLAGS = "$(inherited)"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-Wl", + "-ld_classic", + "-Wl", + "-ld_classic", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; @@ -1276,7 +1322,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "XUMMTests" */ = { + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "XamanTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 00E356F61AD99517003FC87E /* Debug */, @@ -1285,7 +1331,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "XUMM" */ = { + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Xaman" */ = { isa = XCConfigurationList; buildConfigurations = ( 13B07F941A680F5B00A75B9A /* Debug */, @@ -1294,7 +1340,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "XUMM" */ = { + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Xaman" */ = { isa = XCConfigurationList; buildConfigurations = ( 83CBBA201A601CBA00E9B192 /* Debug */, diff --git a/ios/XUMM.xcworkspace/contents.xcworkspacedata b/ios/Xaman.xcworkspace/contents.xcworkspacedata similarity index 55% rename from ios/XUMM.xcworkspace/contents.xcworkspacedata rename to ios/Xaman.xcworkspace/contents.xcworkspacedata index ace392fce..565c4f2ef 100644 --- a/ios/XUMM.xcworkspace/contents.xcworkspacedata +++ b/ios/Xaman.xcworkspace/contents.xcworkspacedata @@ -2,9 +2,12 @@ + location = "group:/Users/av/Desktop/Projects/Xaman/ios/Xaman.xcodeproj"> + + diff --git a/ios/XUMM/AppDelegate.h b/ios/Xaman/AppDelegate.h similarity index 100% rename from ios/XUMM/AppDelegate.h rename to ios/Xaman/AppDelegate.h diff --git a/ios/XUMM/AppDelegate.m b/ios/Xaman/AppDelegate.m similarity index 100% rename from ios/XUMM/AppDelegate.m rename to ios/Xaman/AppDelegate.m diff --git a/ios/XUMM/Fonts/Proxima Nova Alt Bold.otf b/ios/Xaman/Fonts/Proxima Nova Alt Bold.otf similarity index 100% rename from ios/XUMM/Fonts/Proxima Nova Alt Bold.otf rename to ios/Xaman/Fonts/Proxima Nova Alt Bold.otf diff --git a/ios/XUMM/Fonts/Proxima Nova Alt Light.otf b/ios/Xaman/Fonts/Proxima Nova Alt Light.otf similarity index 100% rename from ios/XUMM/Fonts/Proxima Nova Alt Light.otf rename to ios/Xaman/Fonts/Proxima Nova Alt Light.otf diff --git a/ios/XUMM/Fonts/Proxima Nova Alt Thin.otf b/ios/Xaman/Fonts/Proxima Nova Alt Thin.otf similarity index 100% rename from ios/XUMM/Fonts/Proxima Nova Alt Thin.otf rename to ios/Xaman/Fonts/Proxima Nova Alt Thin.otf diff --git a/ios/XUMM/Fonts/Proxima Nova Black.otf b/ios/Xaman/Fonts/Proxima Nova Black.otf similarity index 100% rename from ios/XUMM/Fonts/Proxima Nova Black.otf rename to ios/Xaman/Fonts/Proxima Nova Black.otf diff --git a/ios/XUMM/Fonts/Proxima Nova Bold.otf b/ios/Xaman/Fonts/Proxima Nova Bold.otf similarity index 100% rename from ios/XUMM/Fonts/Proxima Nova Bold.otf rename to ios/Xaman/Fonts/Proxima Nova Bold.otf diff --git a/ios/XUMM/Fonts/Proxima Nova Extrabold.otf b/ios/Xaman/Fonts/Proxima Nova Extrabold.otf similarity index 100% rename from ios/XUMM/Fonts/Proxima Nova Extrabold.otf rename to ios/Xaman/Fonts/Proxima Nova Extrabold.otf diff --git a/ios/XUMM/Fonts/Proxima Nova Thin.otf b/ios/Xaman/Fonts/Proxima Nova Thin.otf similarity index 100% rename from ios/XUMM/Fonts/Proxima Nova Thin.otf rename to ios/Xaman/Fonts/Proxima Nova Thin.otf diff --git a/ios/XUMM/Fonts/ProximaNova-Regular.otf b/ios/Xaman/Fonts/ProximaNova-Regular.otf similarity index 100% rename from ios/XUMM/Fonts/ProximaNova-Regular.otf rename to ios/Xaman/Fonts/ProximaNova-Regular.otf diff --git a/ios/XUMM/Fonts/UbuntuMono-Bold.ttf b/ios/Xaman/Fonts/UbuntuMono-Bold.ttf similarity index 100% rename from ios/XUMM/Fonts/UbuntuMono-Bold.ttf rename to ios/Xaman/Fonts/UbuntuMono-Bold.ttf diff --git a/ios/XUMM/Fonts/UbuntuMono-BoldItalic.ttf b/ios/Xaman/Fonts/UbuntuMono-BoldItalic.ttf similarity index 100% rename from ios/XUMM/Fonts/UbuntuMono-BoldItalic.ttf rename to ios/Xaman/Fonts/UbuntuMono-BoldItalic.ttf diff --git a/ios/XUMM/Fonts/UbuntuMono-Regular.ttf b/ios/Xaman/Fonts/UbuntuMono-Regular.ttf similarity index 100% rename from ios/XUMM/Fonts/UbuntuMono-Regular.ttf rename to ios/Xaman/Fonts/UbuntuMono-Regular.ttf diff --git a/ios/XUMM/Fonts/UbuntuMono-RegularItalic.ttf b/ios/Xaman/Fonts/UbuntuMono-RegularItalic.ttf similarity index 100% rename from ios/XUMM/Fonts/UbuntuMono-RegularItalic.ttf rename to ios/Xaman/Fonts/UbuntuMono-RegularItalic.ttf diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-1024.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-1024.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-1024.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-1024.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-20.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-20.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-20.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-20.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-20@2x.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-20@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-20@2x.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-20@2x.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-20@3x.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-20@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-20@3x.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-20@3x.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-29.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-29.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-29.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-29.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-29@2x.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-29@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-29@2x.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-29@2x.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-29@3x.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-29@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-29@3x.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-29@3x.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-40.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-40.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-40.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-40.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-40@2x.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-40@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-40@2x.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-40@2x.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-40@3x.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-40@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-40@3x.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-40@3x.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-60@2x.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-60@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-60@2x.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-60@2x.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-60@3x.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-60@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-60@3x.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-60@3x.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-76.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-76.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-76.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-76.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-76@2x.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-76@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-76@2x.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-76@2x.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png b/ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png diff --git a/ios/XUMM/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/Xaman/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/AppIcon.appiconset/Contents.json rename to ios/Xaman/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Contents.json b/ios/Xaman/Images.xcassets/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Contents.json rename to ios/Xaman/Images.xcassets/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundPattern.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/BackgroundPattern.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundPattern.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/BackgroundPattern.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern@2x.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern@2x.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern@3x.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern@3x.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundPattern.imageset/background-pattern@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundPatternLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/BackgroundPatternLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundPatternLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/BackgroundPatternLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundPatternLight.imageset/background_pattern_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundShapes.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/BackgroundShapes.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundShapes.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/BackgroundShapes.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@1x.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@1x.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@1x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@2x.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@2x.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@3x.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@3x.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundShapes.imageset/background-shapes@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundShapesLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/BackgroundShapesLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundShapesLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/BackgroundShapesLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/BackgroundShapesLight.imageset/background_shapes_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/Contents.json b/ios/Xaman/Images.xcassets/Graphics/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/Contents.json similarity index 66% rename from ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/Contents.json index 150aae24a..3ce3f085d 100644 --- a/ios/XUMM/Images.xcassets/Graphics/XummIconLight.imageset/Contents.json +++ b/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "xumm_icon_light@1x.png", + "filename" : "formerly_logo@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "xumm_icon_light@2x.png", + "filename" : "formerly_logo@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "xumm_icon_light@3x.png", + "filename" : "formerly_logo@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/formerly_logo@1x.png b/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/formerly_logo@1x.png new file mode 100644 index 000000000..eee7cf8b8 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/formerly_logo@1x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/formerly_logo@2x.png b/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/formerly_logo@2x.png new file mode 100644 index 000000000..7f3a673ac Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/formerly_logo@2x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/formerly_logo@3x.png b/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/formerly_logo@3x.png new file mode 100644 index 000000000..76ccbc61f Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/FormerlyLogo.imageset/formerly_logo@3x.png differ diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageAddAccount.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageAddAccount.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageAddAccount.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageAddAccount.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount.png b/ios/Xaman/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount.png rename to ios/Xaman/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageAddAccount.imageset/icon-addaccount@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageAddAccountLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageAddAccountLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageAddAccountLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageAddAccountLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageAddAccountLight.imageset/image_add_account_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/Contents.json similarity index 66% rename from ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/Contents.json index d809b7086..a239ac021 100644 --- a/ios/XUMM/Images.xcassets/Graphics/XummIconWhite.imageset/Contents.json +++ b/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "xumm_icon_white@1x.png", + "filename" : "image_arrow_up@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "xumm_icon_white@2x.png", + "filename" : "image_arrow_up@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "xumm_icon_white@3x.png", + "filename" : "image_arrow_up@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/image_arrow_up@1x.png b/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/image_arrow_up@1x.png new file mode 100644 index 000000000..88bb2ee6f Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/image_arrow_up@1x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/image_arrow_up@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/image_arrow_up@2x.png new file mode 100644 index 000000000..711be82af Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/image_arrow_up@2x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/image_arrow_up@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/image_arrow_up@3x.png new file mode 100644 index 000000000..fce0a1014 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/ImageArrowUp.imageset/image_arrow_up@3x.png differ diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBiometric.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageBiometric.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBiometric.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageBiometric.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric.png b/ios/Xaman/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBiometric.imageset/icon-biometric@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBiometricLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageBiometricLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBiometricLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageBiometricLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBiometricLight.imageset/image_biometric_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBlankNFT.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageBlankNFT.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBlankNFT.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageBlankNFT.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@1x.png b/ios/Xaman/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@1x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@1x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBlankNFT.imageset/image_blank_nft@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@1x.png b/ios/Xaman/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@1x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@1x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageBlankNFTLight.imageset/image_blank_nft_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCloudAlert.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageCloudAlert.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCloudAlert.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageCloudAlert.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert.png b/ios/Xaman/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCloudAlert.imageset/cloud_alert@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCloudAlertLight.imageset/image_cloud_alert_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCoinWallet.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageCoinWallet.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCoinWallet.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageCoinWallet.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet.png b/ios/Xaman/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCoinWallet.imageset/ImageCoinWallet@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCoinWalletLight.imageset/image_coin_wallet_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageComplete.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageComplete.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageComplete.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageComplete.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete.png b/ios/Xaman/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete.png rename to ios/Xaman/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageComplete.imageset/icon-complete@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCompleteLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageCompleteLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCompleteLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageCompleteLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageCompleteLight.imageset/image_complete_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@1x.png b/ios/Xaman/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@1x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@1x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageEncryptionMigration.imageset/image_encryption_migration@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageFirstAccount.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageFirstAccount.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageFirstAccount.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageFirstAccount.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount.png b/ios/Xaman/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount.png rename to ios/Xaman/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageFirstAccount.imageset/icon-firstaccount@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageFirstAccountLight.imageset/image_first_account_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageManageAccounts.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageManageAccounts.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageManageAccounts.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageManageAccounts.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts.png b/ios/Xaman/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts.png rename to ios/Xaman/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageManageAccounts.imageset/icon-manageaccounts@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageManageAccountsLight.imageset/image_manage_accounts_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNewAccount.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageNewAccount.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNewAccount.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageNewAccount.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount.png b/ios/Xaman/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNewAccount.imageset/icon-newaccount@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNewAccountLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageNewAccountLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNewAccountLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageNewAccountLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNewAccountLight.imageset/image_new_account_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoContacts.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageNoContacts.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoContacts.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageNoContacts.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoContacts.imageset/icon-contacts@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoContactsLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageNoContactsLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoContactsLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageNoContactsLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoContactsLight.imageset/image_no_contacts_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoEvents.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageNoEvents.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoEvents.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageNoEvents.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoEvents.imageset/icon-noevents@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoEventsLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageNoEventsLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoEventsLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageNoEventsLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNoEventsLight.imageset/image_no_events_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNotifications.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageNotifications.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNotifications.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageNotifications.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications.png b/ios/Xaman/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNotifications.imageset/icon-notifications@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNotificationsLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageNotificationsLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNotificationsLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageNotificationsLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageNotificationsLight.imageset/image_notifications_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImagePincode.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImagePincode.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImagePincode.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImagePincode.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode.png b/ios/Xaman/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode.png rename to ios/Xaman/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImagePincode.imageset/icon-pincode@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImagePincodeLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImagePincodeLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImagePincodeLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImagePincodeLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light.png b/ios/Xaman/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImagePincodeLight.imageset/image_pincode_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfile.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageProfile.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfile.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageProfile.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile.png b/ios/Xaman/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile.png rename to ios/Xaman/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageProfile.imageset/icon-profile@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfileLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageProfileLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfileLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageProfileLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageProfileLight.imageset/image_profile_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfilePro.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageProfilePro.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfilePro.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageProfilePro.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@1x.png b/ios/Xaman/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@1x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@1x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageProfilePro.imageset/image_profile_pro@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecretWarning.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageSecretWarning.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecretWarning.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageSecretWarning.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecretWarning.imageset/icon-secretwarning@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecretWarningLight.imageset/image_secret_warning_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirst.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirst.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirst.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirst.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirst.imageset/icon-security2@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSecurityFirstLight.imageset/image_security_first_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSendReceive.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageSendReceive.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSendReceive.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageSendReceive.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive.png b/ios/Xaman/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSendReceive.imageset/icon-sendreceive@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSendReceiveLight.imageset/image_send_receive_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark.png b/ios/Xaman/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageSuccessCheckMark.imageset/image_success_check_mark@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageTriangle.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageTriangle.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageTriangle.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageTriangle.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@1x.png b/ios/Xaman/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@1x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@1x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageTriangle.imageset/image_triangle@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownNFT.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownNFT.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownNFT.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownNFT.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@1x.png b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@1x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@1x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownNFT.imageset/image_unknown_nft@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@1x.png b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@1x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@1x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLine.imageset/image_unknown_trustline@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@1x.png b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@1x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@1x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageUnknownTrustLineLight.imageset/image_unknown_trustline_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageWarningShield.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageWarningShield.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageWarningShield.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageWarningShield.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield.png b/ios/Xaman/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield.png rename to ios/Xaman/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageWarningShield.imageset/image_warning_shield@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light.png b/ios/Xaman/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light.png rename to ios/Xaman/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light@2x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light@2x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light@3x.png rename to ios/Xaman/Images.xcassets/Graphics/ImageWarningShieldLight.imageset/image_warning_shield_light@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Graphics/SplashScreenShapes.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/Contents.json diff --git a/ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/splash_screen_patterns@1x.png b/ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/splash_screen_patterns@1x.png new file mode 100644 index 000000000..4d6250021 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/splash_screen_patterns@1x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/splash_screen_patterns@2x.png b/ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/splash_screen_patterns@2x.png new file mode 100644 index 000000000..04a42e5a4 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/splash_screen_patterns@2x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/splash_screen_patterns@3x.png b/ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/splash_screen_patterns@3x.png new file mode 100644 index 000000000..fba2e34a0 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/SplashScreenPatterns.imageset/splash_screen_patterns@3x.png differ diff --git a/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/Contents.json similarity index 69% rename from ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/Contents.json index 13347ebd0..fc3eeec57 100644 --- a/ios/XUMM/Images.xcassets/Graphics/XummLogo.imageset/Contents.json +++ b/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "xumm_logo@1x.png", + "filename" : "xaman_logo@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "xumm_logo@2x.png", + "filename" : "xaman_logo@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "xumm_logo@3x.png", + "filename" : "xaman_logo@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/xaman_logo@1x.png b/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/xaman_logo@1x.png new file mode 100644 index 000000000..11267d6a9 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/xaman_logo@1x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/xaman_logo@2x.png b/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/xaman_logo@2x.png new file mode 100644 index 000000000..29f584494 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/xaman_logo@2x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/xaman_logo@3x.png b/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/xaman_logo@3x.png new file mode 100644 index 000000000..1410d2369 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/XamanLogo.imageset/xaman_logo@3x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/Contents.json new file mode 100644 index 000000000..a384decab --- /dev/null +++ b/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "xaman_logo_light@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "xaman_logo_light@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "xaman_logo_light@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/xaman_logo_light@1x.png b/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/xaman_logo_light@1x.png new file mode 100644 index 000000000..06decd7c5 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/xaman_logo_light@1x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/xaman_logo_light@2x.png b/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/xaman_logo_light@2x.png new file mode 100644 index 000000000..f60c5b096 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/xaman_logo_light@2x.png differ diff --git a/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/xaman_logo_light@3x.png b/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/xaman_logo_light@3x.png new file mode 100644 index 000000000..2d41b9fea Binary files /dev/null and b/ios/Xaman/Images.xcassets/Graphics/XamanLogoLight.imageset/xaman_logo_light@3x.png differ diff --git a/ios/XUMM/Images.xcassets/Icons/Contents.json b/ios/Xaman/Images.xcassets/Icons/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/Contents.json rename to ios/Xaman/Images.xcassets/Icons/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconAccount.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconAccount.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconAccount.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconAccount.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconAccount.imageset/icon-account@1x.png b/ios/Xaman/Images.xcassets/Icons/IconAccount.imageset/icon-account@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconAccount.imageset/icon-account@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconAccount.imageset/icon-account@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconAccount.imageset/icon-account@2x.png b/ios/Xaman/Images.xcassets/Icons/IconAccount.imageset/icon-account@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconAccount.imageset/icon-account@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconAccount.imageset/icon-account@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconAccount.imageset/icon-account@3x.png b/ios/Xaman/Images.xcassets/Icons/IconAccount.imageset/icon-account@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconAccount.imageset/icon-account@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconAccount.imageset/icon-account@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconActivity.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconActivity.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconActivity.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconActivity.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconActivity.imageset/icon_activity@1x.png b/ios/Xaman/Images.xcassets/Icons/IconActivity.imageset/icon_activity@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconActivity.imageset/icon_activity@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconActivity.imageset/icon_activity@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconActivity.imageset/icon_activity@2x.png b/ios/Xaman/Images.xcassets/Icons/IconActivity.imageset/icon_activity@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconActivity.imageset/icon_activity@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconActivity.imageset/icon_activity@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconActivity.imageset/icon_activity@3x.png b/ios/Xaman/Images.xcassets/Icons/IconActivity.imageset/icon_activity@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconActivity.imageset/icon_activity@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconActivity.imageset/icon_activity@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconAlertTriangle.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconAlertTriangle.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconAlertTriangle.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconAlertTriangle.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@1x.png b/ios/Xaman/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@2x.png b/ios/Xaman/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@3x.png b/ios/Xaman/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconAlertTriangle.imageset/icon_alert_triangle@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconApps.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconApps.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconApps.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconApps.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconApps.imageset/icon_apps@1x.png b/ios/Xaman/Images.xcassets/Icons/IconApps.imageset/icon_apps@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconApps.imageset/icon_apps@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconApps.imageset/icon_apps@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconApps.imageset/icon_apps@2x.png b/ios/Xaman/Images.xcassets/Icons/IconApps.imageset/icon_apps@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconApps.imageset/icon_apps@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconApps.imageset/icon_apps@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconApps.imageset/icon_apps@3x.png b/ios/Xaman/Images.xcassets/Icons/IconApps.imageset/icon_apps@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconApps.imageset/icon_apps@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconApps.imageset/icon_apps@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconArrowDown.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconArrowDown.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconArrowDown.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconArrowDown.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@1x.png b/ios/Xaman/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@2x.png b/ios/Xaman/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@3x.png b/ios/Xaman/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconArrowDown.imageset/icon_arrow_down@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconArrowRightLong.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconArrowRightLong.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconArrowRightLong.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconArrowRightLong.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@1x.png b/ios/Xaman/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@2x.png b/ios/Xaman/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@3x.png b/ios/Xaman/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconArrowRightLong.imageset/icon_arrow_right_long@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconBell.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconBell.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconBell.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconBell.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconBell.imageset/bell@1x.png b/ios/Xaman/Images.xcassets/Icons/IconBell.imageset/bell@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconBell.imageset/bell@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconBell.imageset/bell@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconBell.imageset/bell@2x.png b/ios/Xaman/Images.xcassets/Icons/IconBell.imageset/bell@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconBell.imageset/bell@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconBell.imageset/bell@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconBell.imageset/bell@3x.png b/ios/Xaman/Images.xcassets/Icons/IconBell.imageset/bell@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconBell.imageset/bell@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconBell.imageset/bell@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconBook.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconBook.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconBook.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconBook.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconBook.imageset/icon_book@1x.png b/ios/Xaman/Images.xcassets/Icons/IconBook.imageset/icon_book@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconBook.imageset/icon_book@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconBook.imageset/icon_book@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconBook.imageset/icon_book@2x.png b/ios/Xaman/Images.xcassets/Icons/IconBook.imageset/icon_book@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconBook.imageset/icon_book@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconBook.imageset/icon_book@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconBook.imageset/icon_book@3x.png b/ios/Xaman/Images.xcassets/Icons/IconBook.imageset/icon_book@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconBook.imageset/icon_book@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconBook.imageset/icon_book@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCamera.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconCamera.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCamera.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconCamera.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconCamera.imageset/camera@1x.png b/ios/Xaman/Images.xcassets/Icons/IconCamera.imageset/camera@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCamera.imageset/camera@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconCamera.imageset/camera@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCamera.imageset/camera@2x.png b/ios/Xaman/Images.xcassets/Icons/IconCamera.imageset/camera@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCamera.imageset/camera@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconCamera.imageset/camera@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCamera.imageset/camera@3x.png b/ios/Xaman/Images.xcassets/Icons/IconCamera.imageset/camera@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCamera.imageset/camera@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconCamera.imageset/camera@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCheck.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconCheck.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCheck.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconCheck.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconCheck.imageset/icon_check@1x.png b/ios/Xaman/Images.xcassets/Icons/IconCheck.imageset/icon_check@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCheck.imageset/icon_check@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconCheck.imageset/icon_check@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCheck.imageset/icon_check@2x.png b/ios/Xaman/Images.xcassets/Icons/IconCheck.imageset/icon_check@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCheck.imageset/icon_check@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconCheck.imageset/icon_check@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCheck.imageset/icon_check@3x.png b/ios/Xaman/Images.xcassets/Icons/IconCheck.imageset/icon_check@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCheck.imageset/icon_check@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconCheck.imageset/icon_check@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCheckXumm.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconCheckXaman.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCheckXumm.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconCheckXaman.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconCheckXumm.imageset/icon_check_xumm@1x.png b/ios/Xaman/Images.xcassets/Icons/IconCheckXaman.imageset/icon_check_xumm@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCheckXumm.imageset/icon_check_xumm@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconCheckXaman.imageset/icon_check_xumm@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCheckXumm.imageset/icon_check_xumm@2x.png b/ios/Xaman/Images.xcassets/Icons/IconCheckXaman.imageset/icon_check_xumm@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCheckXumm.imageset/icon_check_xumm@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconCheckXaman.imageset/icon_check_xumm@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCheckXumm.imageset/icon_check_xumm@3x.png b/ios/Xaman/Images.xcassets/Icons/IconCheckXaman.imageset/icon_check_xumm@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCheckXumm.imageset/icon_check_xumm@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconCheckXaman.imageset/icon_check_xumm@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronDown.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconChevronDown.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronDown.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconChevronDown.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@1x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@2x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@3x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronDown.imageset/icon_chevron_down@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronLeft.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconChevronLeft.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronLeft.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconChevronLeft.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@1x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@2x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@3x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronLeft.imageset/chevron-left@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronRight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconChevronRight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronRight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconChevronRight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@1x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@2x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@3x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronRight.imageset/icon-chevron-right@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronUp.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconChevronUp.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronUp.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconChevronUp.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@1x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@2x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@3x.png b/ios/Xaman/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconChevronUp.imageset/icon_chevron_up@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconClipboard.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconClipboard.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconClipboard.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconClipboard.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@1x.png b/ios/Xaman/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@2x.png b/ios/Xaman/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@3x.png b/ios/Xaman/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconClipboard.imageset/icon_clipboard@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCoins.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconCoins.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCoins.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconCoins.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconCoins.imageset/icon_coints@1x.png b/ios/Xaman/Images.xcassets/Icons/IconCoins.imageset/icon_coints@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCoins.imageset/icon_coints@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconCoins.imageset/icon_coints@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCoins.imageset/icon_coints@2x.png b/ios/Xaman/Images.xcassets/Icons/IconCoins.imageset/icon_coints@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCoins.imageset/icon_coints@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconCoins.imageset/icon_coints@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCoins.imageset/icon_coints@3x.png b/ios/Xaman/Images.xcassets/Icons/IconCoins.imageset/icon_coints@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCoins.imageset/icon_coints@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconCoins.imageset/icon_coints@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCopy.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconCopy.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCopy.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconCopy.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconCopy.imageset/icon_copy@1x.png b/ios/Xaman/Images.xcassets/Icons/IconCopy.imageset/icon_copy@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCopy.imageset/icon_copy@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconCopy.imageset/icon_copy@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCopy.imageset/icon_copy@2x.png b/ios/Xaman/Images.xcassets/Icons/IconCopy.imageset/icon_copy@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCopy.imageset/icon_copy@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconCopy.imageset/icon_copy@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCopy.imageset/icon_copy@3x.png b/ios/Xaman/Images.xcassets/Icons/IconCopy.imageset/icon_copy@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCopy.imageset/icon_copy@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconCopy.imageset/icon_copy@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerLeftUp.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconCornerLeftUp.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerLeftUp.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconCornerLeftUp.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@1x.png b/ios/Xaman/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@2x.png b/ios/Xaman/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@3x.png b/ios/Xaman/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconCornerLeftUp.imageset/icon_corner_left_up@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerRightDown.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconCornerRightDown.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerRightDown.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconCornerRightDown.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@1x.png b/ios/Xaman/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@2x.png b/ios/Xaman/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@3x.png b/ios/Xaman/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconCornerRightDown.imageset/icon_corner_right_down@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerRightUp.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconCornerRightUp.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerRightUp.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconCornerRightUp.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@1x.png b/ios/Xaman/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@2x.png b/ios/Xaman/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@3x.png b/ios/Xaman/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconCornerRightUp.imageset/icon_corner_right_up@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEdit.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconEdit.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEdit.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconEdit.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconEdit.imageset/icon_edit@1x.png b/ios/Xaman/Images.xcassets/Icons/IconEdit.imageset/icon_edit@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEdit.imageset/icon_edit@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconEdit.imageset/icon_edit@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEdit.imageset/icon_edit@2x.png b/ios/Xaman/Images.xcassets/Icons/IconEdit.imageset/icon_edit@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEdit.imageset/icon_edit@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconEdit.imageset/icon_edit@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEdit.imageset/icon_edit@3x.png b/ios/Xaman/Images.xcassets/Icons/IconEdit.imageset/icon_edit@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEdit.imageset/icon_edit@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconEdit.imageset/icon_edit@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEvents.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconEvents.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEvents.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconEvents.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconEvents.imageset/icon-events@1x.png b/ios/Xaman/Images.xcassets/Icons/IconEvents.imageset/icon-events@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEvents.imageset/icon-events@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconEvents.imageset/icon-events@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEvents.imageset/icon-events@2x.png b/ios/Xaman/Images.xcassets/Icons/IconEvents.imageset/icon-events@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEvents.imageset/icon-events@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconEvents.imageset/icon-events@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEvents.imageset/icon-events@3x.png b/ios/Xaman/Images.xcassets/Icons/IconEvents.imageset/icon-events@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEvents.imageset/icon-events@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconEvents.imageset/icon-events@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconExternalLink.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconExternalLink.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconExternalLink.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconExternalLink.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@1x.png b/ios/Xaman/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@2x.png b/ios/Xaman/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@3x.png b/ios/Xaman/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconExternalLink.imageset/icon_external_link@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEye.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconEye.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEye.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconEye.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconEye.imageset/icon-eye@1x.png b/ios/Xaman/Images.xcassets/Icons/IconEye.imageset/icon-eye@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEye.imageset/icon-eye@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconEye.imageset/icon-eye@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEye.imageset/icon-eye@2x.png b/ios/Xaman/Images.xcassets/Icons/IconEye.imageset/icon-eye@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEye.imageset/icon-eye@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconEye.imageset/icon-eye@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEye.imageset/icon-eye@3x.png b/ios/Xaman/Images.xcassets/Icons/IconEye.imageset/icon-eye@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEye.imageset/icon-eye@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconEye.imageset/icon-eye@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEyeOff.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconEyeOff.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEyeOff.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconEyeOff.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@1x.png b/ios/Xaman/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@2x.png b/ios/Xaman/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@3x.png b/ios/Xaman/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconEyeOff.imageset/icon-eye-off@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconFileText.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconFileText.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFileText.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconFileText.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@1x.png b/ios/Xaman/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@2x.png b/ios/Xaman/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@3x.png b/ios/Xaman/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconFileText.imageset/icon_file_text@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconFilter.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconFilter.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFilter.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconFilter.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconFilter.imageset/filter@1x.png b/ios/Xaman/Images.xcassets/Icons/IconFilter.imageset/filter@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFilter.imageset/filter@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconFilter.imageset/filter@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconFilter.imageset/filter@2x.png b/ios/Xaman/Images.xcassets/Icons/IconFilter.imageset/filter@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFilter.imageset/filter@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconFilter.imageset/filter@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconFilter.imageset/filter@3x.png b/ios/Xaman/Images.xcassets/Icons/IconFilter.imageset/filter@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFilter.imageset/filter@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconFilter.imageset/filter@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconFingerprint.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconFingerprint.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFingerprint.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconFingerprint.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@1x.png b/ios/Xaman/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@2x.png b/ios/Xaman/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@3x.png b/ios/Xaman/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconFingerprint.imageset/icon_fingerprint@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconGlobe.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconGlobe.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconGlobe.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconGlobe.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@1x.png b/ios/Xaman/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@2x.png b/ios/Xaman/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@3x.png b/ios/Xaman/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconGlobe.imageset/icon_globe@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconHelpCircle.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconHelpCircle.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconHelpCircle.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconHelpCircle.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@1x.png b/ios/Xaman/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@2x.png b/ios/Xaman/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@3x.png b/ios/Xaman/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconHelpCircle.imageset/icon_help_circle@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconHideZero.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconHideZero.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconHideZero.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconHideZero.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@1x.png b/ios/Xaman/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@2x.png b/ios/Xaman/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@3x.png b/ios/Xaman/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconHideZero.imageset/icon_hide_zero@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconInfo.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconInfo.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconInfo.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconInfo.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconInfo.imageset/icon-info@1x.png b/ios/Xaman/Images.xcassets/Icons/IconInfo.imageset/icon-info@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconInfo.imageset/icon-info@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconInfo.imageset/icon-info@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconInfo.imageset/icon-info@2x.png b/ios/Xaman/Images.xcassets/Icons/IconInfo.imageset/icon-info@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconInfo.imageset/icon-info@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconInfo.imageset/icon-info@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconInfo.imageset/icon-info@3x.png b/ios/Xaman/Images.xcassets/Icons/IconInfo.imageset/icon-info@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconInfo.imageset/icon-info@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconInfo.imageset/icon-info@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconKey.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconKey.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconKey.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconKey.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconKey.imageset/icon_key@1x.png b/ios/Xaman/Images.xcassets/Icons/IconKey.imageset/icon_key@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconKey.imageset/icon_key@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconKey.imageset/icon_key@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconKey.imageset/icon_key@2x.png b/ios/Xaman/Images.xcassets/Icons/IconKey.imageset/icon_key@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconKey.imageset/icon_key@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconKey.imageset/icon_key@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconKey.imageset/icon_key@3x.png b/ios/Xaman/Images.xcassets/Icons/IconKey.imageset/icon_key@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconKey.imageset/icon_key@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconKey.imageset/icon_key@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconLink.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconLink.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconLink.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconLink.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconLink.imageset/icon_link@1x.png b/ios/Xaman/Images.xcassets/Icons/IconLink.imageset/icon_link@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconLink.imageset/icon_link@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconLink.imageset/icon_link@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconLink.imageset/icon_link@2x.png b/ios/Xaman/Images.xcassets/Icons/IconLink.imageset/icon_link@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconLink.imageset/icon_link@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconLink.imageset/icon_link@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconLink.imageset/icon_link@3x.png b/ios/Xaman/Images.xcassets/Icons/IconLink.imageset/icon_link@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconLink.imageset/icon_link@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconLink.imageset/icon_link@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconLock.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconLock.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconLock.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconLock.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconLock.imageset/lock@1x.png b/ios/Xaman/Images.xcassets/Icons/IconLock.imageset/lock@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconLock.imageset/lock@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconLock.imageset/lock@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconLock.imageset/lock@2x.png b/ios/Xaman/Images.xcassets/Icons/IconLock.imageset/lock@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconLock.imageset/lock@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconLock.imageset/lock@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconLock.imageset/lock@3x.png b/ios/Xaman/Images.xcassets/Icons/IconLock.imageset/lock@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconLock.imageset/lock@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconLock.imageset/lock@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconMinus.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconMinus.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMinus.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconMinus.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconMinus.imageset/icon-minus@1x.png b/ios/Xaman/Images.xcassets/Icons/IconMinus.imageset/icon-minus@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMinus.imageset/icon-minus@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconMinus.imageset/icon-minus@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconMinus.imageset/icon-minus@2x.png b/ios/Xaman/Images.xcassets/Icons/IconMinus.imageset/icon-minus@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMinus.imageset/icon-minus@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconMinus.imageset/icon-minus@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconMinus.imageset/icon-minus@3x.png b/ios/Xaman/Images.xcassets/Icons/IconMinus.imageset/icon-minus@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMinus.imageset/icon-minus@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconMinus.imageset/icon-minus@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconMoreHorizontal.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconMoreHorizontal.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMoreHorizontal.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconMoreHorizontal.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@1x.png b/ios/Xaman/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@2x.png b/ios/Xaman/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@3x.png b/ios/Xaman/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconMoreHorizontal.imageset/more-horizontal@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconMoreVertical.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconMoreVertical.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMoreVertical.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconMoreVertical.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@1x.png b/ios/Xaman/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@2x-1.png b/ios/Xaman/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@2x-1.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@2x-1.png rename to ios/Xaman/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@2x-1.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@3x.png b/ios/Xaman/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconMoreVertical.imageset/icon_more_vertical@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconPlus.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconPlus.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconPlus.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconPlus.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconPlus.imageset/plus@1x.png b/ios/Xaman/Images.xcassets/Icons/IconPlus.imageset/plus@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconPlus.imageset/plus@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconPlus.imageset/plus@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconPlus.imageset/plus@2x.png b/ios/Xaman/Images.xcassets/Icons/IconPlus.imageset/plus@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconPlus.imageset/plus@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconPlus.imageset/plus@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconPlus.imageset/plus@3x.png b/ios/Xaman/Images.xcassets/Icons/IconPlus.imageset/plus@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconPlus.imageset/plus@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconPlus.imageset/plus@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconPro.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconPro.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconPro.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconPro.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconPro.imageset/icon_pro@1x.png b/ios/Xaman/Images.xcassets/Icons/IconPro.imageset/icon_pro@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconPro.imageset/icon_pro@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconPro.imageset/icon_pro@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconPro.imageset/icon_pro@2x.png b/ios/Xaman/Images.xcassets/Icons/IconPro.imageset/icon_pro@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconPro.imageset/icon_pro@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconPro.imageset/icon_pro@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconPro.imageset/icon_pro@3x.png b/ios/Xaman/Images.xcassets/Icons/IconPro.imageset/icon_pro@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconPro.imageset/icon_pro@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconPro.imageset/icon_pro@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconProfile.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconProfile.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconProfile.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconProfile.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconProfile.imageset/icon-profile@1x.png b/ios/Xaman/Images.xcassets/Icons/IconProfile.imageset/icon-profile@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconProfile.imageset/icon-profile@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconProfile.imageset/icon-profile@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconProfile.imageset/icon-profile@2x.png b/ios/Xaman/Images.xcassets/Icons/IconProfile.imageset/icon-profile@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconProfile.imageset/icon-profile@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconProfile.imageset/icon-profile@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconProfile.imageset/icon-profile@3x.png b/ios/Xaman/Images.xcassets/Icons/IconProfile.imageset/icon-profile@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconProfile.imageset/icon-profile@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconProfile.imageset/icon-profile@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconQR.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconQR.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconQR.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconQR.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconQR.imageset/icon_qr@1x.png b/ios/Xaman/Images.xcassets/Icons/IconQR.imageset/icon_qr@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconQR.imageset/icon_qr@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconQR.imageset/icon_qr@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconQR.imageset/icon_qr@2x.png b/ios/Xaman/Images.xcassets/Icons/IconQR.imageset/icon_qr@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconQR.imageset/icon_qr@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconQR.imageset/icon_qr@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconQR.imageset/icon_qr@3x.png b/ios/Xaman/Images.xcassets/Icons/IconQR.imageset/icon_qr@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconQR.imageset/icon_qr@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconQR.imageset/icon_qr@3x.png diff --git a/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/Contents.json similarity index 69% rename from ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/Contents.json index 9d75246d8..c8226859b 100644 --- a/ios/XUMM/Images.xcassets/Graphics/XummIcon.imageset/Contents.json +++ b/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "xumm_icon@1x.png", + "filename" : "radio_icon@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "xumm_icon@2x.png", + "filename" : "radio_icon@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "xumm_icon@3x.png", + "filename" : "radio_icon@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/radio_icon@1x.png b/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/radio_icon@1x.png new file mode 100644 index 000000000..570eb3a28 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/radio_icon@1x.png differ diff --git a/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/radio_icon@2x.png b/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/radio_icon@2x.png new file mode 100644 index 000000000..5e73578ad Binary files /dev/null and b/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/radio_icon@2x.png differ diff --git a/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/radio_icon@3x.png b/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/radio_icon@3x.png new file mode 100644 index 000000000..08b665501 Binary files /dev/null and b/ios/Xaman/Images.xcassets/Icons/IconRadio.imageset/radio_icon@3x.png differ diff --git a/ios/XUMM/Images.xcassets/Icons/IconRefresh.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconRefresh.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconRefresh.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconRefresh.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@1x.png b/ios/Xaman/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@2x.png b/ios/Xaman/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@3x.png b/ios/Xaman/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconRefresh.imageset/icon_refresh@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconReorder.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconReorder.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconReorder.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconReorder.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@1x.png b/ios/Xaman/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@2x.png b/ios/Xaman/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@3x.png b/ios/Xaman/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconReorder.imageset/icon_reorder@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconReorderHandle.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconReorderHandle.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconReorderHandle.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconReorderHandle.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@1x.png b/ios/Xaman/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@2x.png b/ios/Xaman/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@3x.png b/ios/Xaman/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconReorderHandle.imageset/icon_reorder_handle@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconRepeat.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconRepeat.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconRepeat.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconRepeat.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@1x.png b/ios/Xaman/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@2x.png b/ios/Xaman/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@3x.png b/ios/Xaman/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconRepeat.imageset/icon_repeat@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconScan.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconScan.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconScan.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconScan.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconScan.imageset/icon-scan@1x.png b/ios/Xaman/Images.xcassets/Icons/IconScan.imageset/icon-scan@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconScan.imageset/icon-scan@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconScan.imageset/icon-scan@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconScan.imageset/icon-scan@2x.png b/ios/Xaman/Images.xcassets/Icons/IconScan.imageset/icon-scan@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconScan.imageset/icon-scan@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconScan.imageset/icon-scan@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconScan.imageset/icon-scan@3x.png b/ios/Xaman/Images.xcassets/Icons/IconScan.imageset/icon-scan@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconScan.imageset/icon-scan@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconScan.imageset/icon-scan@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSearch.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconSearch.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSearch.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconSearch.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconSearch.imageset/icon_search@1x.png b/ios/Xaman/Images.xcassets/Icons/IconSearch.imageset/icon_search@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSearch.imageset/icon_search@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconSearch.imageset/icon_search@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSearch.imageset/icon_search@2x.png b/ios/Xaman/Images.xcassets/Icons/IconSearch.imageset/icon_search@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSearch.imageset/icon_search@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconSearch.imageset/icon_search@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSearch.imageset/icon_search@3x.png b/ios/Xaman/Images.xcassets/Icons/IconSearch.imageset/icon_search@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSearch.imageset/icon_search@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconSearch.imageset/icon_search@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSend.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconSend.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSend.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconSend.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconSend.imageset/icon_send@1x.png b/ios/Xaman/Images.xcassets/Icons/IconSend.imageset/icon_send@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSend.imageset/icon_send@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconSend.imageset/icon_send@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSend.imageset/icon_send@2x.png b/ios/Xaman/Images.xcassets/Icons/IconSend.imageset/icon_send@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSend.imageset/icon_send@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconSend.imageset/icon_send@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSend.imageset/icon_send@3x.png b/ios/Xaman/Images.xcassets/Icons/IconSend.imageset/icon_send@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSend.imageset/icon_send@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconSend.imageset/icon_send@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSettings.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconSettings.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSettings.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconSettings.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconSettings.imageset/icon-settings@1x.png b/ios/Xaman/Images.xcassets/Icons/IconSettings.imageset/icon-settings@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSettings.imageset/icon-settings@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconSettings.imageset/icon-settings@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSettings.imageset/icon-settings@2x.png b/ios/Xaman/Images.xcassets/Icons/IconSettings.imageset/icon-settings@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSettings.imageset/icon-settings@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconSettings.imageset/icon-settings@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSettings.imageset/icon-settings@3x.png b/ios/Xaman/Images.xcassets/Icons/IconSettings.imageset/icon-settings@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSettings.imageset/icon-settings@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconSettings.imageset/icon-settings@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconShare.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconShare.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShare.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconShare.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconShare.imageset/icon-share@1x.png b/ios/Xaman/Images.xcassets/Icons/IconShare.imageset/icon-share@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShare.imageset/icon-share@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconShare.imageset/icon-share@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconShare.imageset/icon-share@2x.png b/ios/Xaman/Images.xcassets/Icons/IconShare.imageset/icon-share@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShare.imageset/icon-share@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconShare.imageset/icon-share@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconShare.imageset/icon-share@3x.png b/ios/Xaman/Images.xcassets/Icons/IconShare.imageset/icon-share@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShare.imageset/icon-share@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconShare.imageset/icon-share@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconShield.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconShield.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShield.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconShield.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconShield.imageset/shield@1x.png b/ios/Xaman/Images.xcassets/Icons/IconShield.imageset/shield@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShield.imageset/shield@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconShield.imageset/shield@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconShield.imageset/shield@2x.png b/ios/Xaman/Images.xcassets/Icons/IconShield.imageset/shield@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShield.imageset/shield@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconShield.imageset/shield@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconShield.imageset/shield@3x.png b/ios/Xaman/Images.xcassets/Icons/IconShield.imageset/shield@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShield.imageset/shield@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconShield.imageset/shield@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconShowZero.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconShowZero.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShowZero.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconShowZero.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@1x.png b/ios/Xaman/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@2x.png b/ios/Xaman/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@3x.png b/ios/Xaman/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconShowZero.imageset/icon_show_zero@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSlider.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconSlider.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSlider.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconSlider.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@1x.png b/ios/Xaman/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@2x.png b/ios/Xaman/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@3x.png b/ios/Xaman/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconSlider.imageset/icon_sliders@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSmartPhone.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconSmartPhone.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSmartPhone.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconSmartPhone.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@1x.png b/ios/Xaman/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@2x.png b/ios/Xaman/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@3x.png b/ios/Xaman/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconSmartPhone.imageset/icon_smartphone@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSortTop.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconSortTop.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSortTop.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconSortTop.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@1x.png b/ios/Xaman/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@2x.png b/ios/Xaman/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@3x.png b/ios/Xaman/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconSortTop.imageset/icon_sort_top@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconStar.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconStar.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconStar.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconStar.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconStar.imageset/star@1x.png b/ios/Xaman/Images.xcassets/Icons/IconStar.imageset/star@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconStar.imageset/star@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconStar.imageset/star@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconStar.imageset/star@2x.png b/ios/Xaman/Images.xcassets/Icons/IconStar.imageset/star@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconStar.imageset/star@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconStar.imageset/star@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconStar.imageset/star@3x.png b/ios/Xaman/Images.xcassets/Icons/IconStar.imageset/star@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconStar.imageset/star@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconStar.imageset/star@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconStarFull.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconStarFull.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconStarFull.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconStarFull.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@1x.png b/ios/Xaman/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@2x.png b/ios/Xaman/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@3x.png b/ios/Xaman/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconStarFull.imageset/icon_star_full@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSwitchAccount.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconSwitchAccount.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSwitchAccount.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconSwitchAccount.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@1x.png b/ios/Xaman/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@2x.png b/ios/Xaman/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@3x.png b/ios/Xaman/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconSwitchAccount.imageset/icon_switchaccount@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarActions.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarActions.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarActions.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarActions.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@1x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarActions.imageset/icon_tabbar_actions@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarActionsLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarActionsLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarActionsLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarActionsLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarActionsLight.imageset/IconTabBarActions@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEvents.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarEvents.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEvents.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEvents.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEvents.imageset/IconTabBarEvents@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelected.imageset/IconTabBarEventsSelected@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarEventsSelectedLight.imageset/IconTabBarEventsSelectedLight@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHome.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarHome.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHome.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHome.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHome.imageset/IconTabBarHome@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelected.imageset/IconTabBarHomeSelected@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarHomeSelectedLight.imageset/IconTabBarHomeSelectedLight@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarPro.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarPro.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarPro.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarPro.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarPro.imageset/IconTabBarPro@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarProSelected.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarProSelected.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarProSelected.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarProSelected.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarProSelected.imageset/IconTabBarProSelected@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarProSelectedLight.imageset/IconTabBarProSelectedLight@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarScan.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarScan.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarScan.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarScan.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@1x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarScan.imageset/icon_tabbar_scan@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettings.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettings.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettings.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettings.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettings.imageset/IconTabBarSettings@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelected.imageset/IconTabBarSettingsSelected@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarSettingsSelectedLight.imageset/IconTabBarSettingsSelectedLight@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXapp.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarXapp.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXapp.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXapp.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXapp.imageset/IconTabBarXapp@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelected.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelected.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelected.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelected.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelected.imageset/IconTabBarXappSelected@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTabBarXappSelectedLight.imageset/IconTabBarXappSelectedLight@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconThumbsUp.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconThumbsUp.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconThumbsUp.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconThumbsUp.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@1x.png b/ios/Xaman/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@2x.png b/ios/Xaman/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@3x.png b/ios/Xaman/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconThumbsUp.imageset/icon_thumbs_up@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconToggleRight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconToggleRight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconToggleRight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconToggleRight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@1x.png b/ios/Xaman/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@2x.png b/ios/Xaman/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@3x.png b/ios/Xaman/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconToggleRight.imageset/icon_toggle_right@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTrash.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTrash.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTrash.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTrash.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTrash.imageset/icon-trash@1x.png b/ios/Xaman/Images.xcassets/Icons/IconTrash.imageset/icon-trash@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTrash.imageset/icon-trash@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconTrash.imageset/icon-trash@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTrash.imageset/icon-trash@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTrash.imageset/icon-trash@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTrash.imageset/icon-trash@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTrash.imageset/icon-trash@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTrash.imageset/icon-trash@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTrash.imageset/icon-trash@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTrash.imageset/icon-trash@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTrash.imageset/icon-trash@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTrustLine.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconTrustLine.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTrustLine.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconTrustLine.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@1x.png b/ios/Xaman/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@2x.png b/ios/Xaman/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@3x.png b/ios/Xaman/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconTrustLine.imageset/icon_trustline@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconUnlock.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconUnlock.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconUnlock.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconUnlock.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@1x.png b/ios/Xaman/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@2x.png b/ios/Xaman/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@3x.png b/ios/Xaman/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconUnlock.imageset/icon_unlock@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconWallet.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconWallet.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconWallet.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconWallet.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@1x.png b/ios/Xaman/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@2x.png b/ios/Xaman/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@3x.png b/ios/Xaman/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconWallet.imageset/icon_wallet@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconX.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconX.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconX.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconX.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconX.imageset/icon_x@1x.png b/ios/Xaman/Images.xcassets/Icons/IconX.imageset/icon_x@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconX.imageset/icon_x@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconX.imageset/icon_x@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconX.imageset/icon_x@2x.png b/ios/Xaman/Images.xcassets/Icons/IconX.imageset/icon_x@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconX.imageset/icon_x@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconX.imageset/icon_x@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconX.imageset/icon_x@3x.png b/ios/Xaman/Images.xcassets/Icons/IconX.imageset/icon_x@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconX.imageset/icon_x@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconX.imageset/icon_x@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXApp.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconXApp.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXApp.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconXApp.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@1x.png b/ios/Xaman/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@2x.png b/ios/Xaman/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@3x.png b/ios/Xaman/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconXApp.imageset/icon_xapp@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXApps.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconXApps.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXApps.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconXApps.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@1x.png b/ios/Xaman/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@2x.png b/ios/Xaman/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@3x.png b/ios/Xaman/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconXApps.imageset/icon-xapps@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXAppsLight.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconXAppsLight.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXAppsLight.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconXAppsLight.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light.png b/ios/Xaman/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light.png rename to ios/Xaman/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light@2x.png b/ios/Xaman/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light@3x.png b/ios/Xaman/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconXAppsLight.imageset/icon-xapps-light@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXrp.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconXrp.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXrp.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconXrp.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@1x.png b/ios/Xaman/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@2x.png b/ios/Xaman/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@3x.png b/ios/Xaman/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconXrp.imageset/icon-xrp@3x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXrpSquare.imageset/Contents.json b/ios/Xaman/Images.xcassets/Icons/IconXrpSquare.imageset/Contents.json similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXrpSquare.imageset/Contents.json rename to ios/Xaman/Images.xcassets/Icons/IconXrpSquare.imageset/Contents.json diff --git a/ios/XUMM/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@1x.png b/ios/Xaman/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@1x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@1x.png rename to ios/Xaman/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@1x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@2x.png b/ios/Xaman/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@2x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@2x.png rename to ios/Xaman/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@2x.png diff --git a/ios/XUMM/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@3x.png b/ios/Xaman/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@3x.png similarity index 100% rename from ios/XUMM/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@3x.png rename to ios/Xaman/Images.xcassets/Icons/IconXrpSquare.imageset/icon_xrp_square@3x.png diff --git a/ios/XUMM/Info.plist b/ios/Xaman/Info.plist similarity index 99% rename from ios/XUMM/Info.plist rename to ios/Xaman/Info.plist index c34161613..9c5fd6d2f 100644 --- a/ios/XUMM/Info.plist +++ b/ios/Xaman/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - XUMM + Xaman CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/ios/XUMM/Libs/Common/AppUpdate.h b/ios/Xaman/Libs/Common/AppUpdate.h similarity index 100% rename from ios/XUMM/Libs/Common/AppUpdate.h rename to ios/Xaman/Libs/Common/AppUpdate.h diff --git a/ios/XUMM/Libs/Common/AppUpdate.m b/ios/Xaman/Libs/Common/AppUpdate.m similarity index 100% rename from ios/XUMM/Libs/Common/AppUpdate.m rename to ios/Xaman/Libs/Common/AppUpdate.m diff --git a/ios/XUMM/Libs/Common/Clipboard.h b/ios/Xaman/Libs/Common/Clipboard.h similarity index 100% rename from ios/XUMM/Libs/Common/Clipboard.h rename to ios/Xaman/Libs/Common/Clipboard.h diff --git a/ios/XUMM/Libs/Common/Clipboard.m b/ios/Xaman/Libs/Common/Clipboard.m similarity index 100% rename from ios/XUMM/Libs/Common/Clipboard.m rename to ios/Xaman/Libs/Common/Clipboard.m diff --git a/ios/XUMM/Libs/Common/InAppPurchase.h b/ios/Xaman/Libs/Common/InAppPurchase.h similarity index 100% rename from ios/XUMM/Libs/Common/InAppPurchase.h rename to ios/Xaman/Libs/Common/InAppPurchase.h diff --git a/ios/XUMM/Libs/Common/InAppPurchase.m b/ios/Xaman/Libs/Common/InAppPurchase.m similarity index 93% rename from ios/XUMM/Libs/Common/InAppPurchase.m rename to ios/Xaman/Libs/Common/InAppPurchase.m index eee8ea4c3..866217740 100644 --- a/ios/XUMM/Libs/Common/InAppPurchase.m +++ b/ios/Xaman/Libs/Common/InAppPurchase.m @@ -12,7 +12,7 @@ @interface InAppPurchaseModule() { @implementation InAppPurchaseModule -#define kXUMMProProductIdentifier @"com.xrpllabs.xumm.pro.test" +#define kXamanProProductIdentifier @"com.xrpllabs.xaman.pro.test" #define E_UNABLE_TO_MAKE_PAYMENTS @"E_UNABLE_TO_MAKE_PAYMENTS" #define E_PRODUCT_IS_NOT_AVAILABLE @"E_PRODUCT_IS_NOT_AVAILABLE" @@ -50,7 +50,7 @@ -(void) dealloc { return resolve(@YES); } - SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:kXUMMProProductIdentifier]]; + SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:kXamanProProductIdentifier]]; [self addCallback:RCTKeyForInstance(productsRequest) resolver:resolve rejecter:reject]; @@ -82,7 +82,7 @@ -(void) dealloc { SKProduct *product; for(SKProduct *p in products) { - if([kXUMMProProductIdentifier isEqualToString:p.productIdentifier]) { + if([kXamanProProductIdentifier isEqualToString:p.productIdentifier]) { product = p; break; } @@ -93,7 +93,7 @@ -(void) dealloc { [self addCallback:product.productIdentifier resolver:resolve rejecter:reject]; [[SKPaymentQueue defaultQueue] addPayment:payment]; }else{ - return reject(E_PRODUCT_IS_NOT_AVAILABLE, @"XUMM Pro product is not available", nil); + return reject(E_PRODUCT_IS_NOT_AVAILABLE, @"Xaman Pro product is not available", nil); } } @@ -118,7 +118,7 @@ - (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedW - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { for(SKPaymentTransaction *transaction in queue.transactions){ - if(transaction.transactionState == SKPaymentTransactionStateRestored && [kXUMMProProductIdentifier isEqualToString:transaction.payment.productIdentifier] ) { + if(transaction.transactionState == SKPaymentTransactionStateRestored && [kXamanProProductIdentifier isEqualToString:transaction.payment.productIdentifier] ) { NSString* receipt = [self getReceiptData]; [self resolveForKey:RCTKeyForInstance(@"PAYMENT_RESTORE_PROMISE") value:receipt]; [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; diff --git a/ios/XUMM/Libs/Common/SharedPreferences.h b/ios/Xaman/Libs/Common/SharedPreferences.h similarity index 100% rename from ios/XUMM/Libs/Common/SharedPreferences.h rename to ios/Xaman/Libs/Common/SharedPreferences.h diff --git a/ios/XUMM/Libs/Common/SharedPreferences.m b/ios/Xaman/Libs/Common/SharedPreferences.m similarity index 97% rename from ios/XUMM/Libs/Common/SharedPreferences.m rename to ios/Xaman/Libs/Common/SharedPreferences.m index dfda30317..d6436173a 100644 --- a/ios/XUMM/Libs/Common/SharedPreferences.m +++ b/ios/Xaman/Libs/Common/SharedPreferences.m @@ -25,7 +25,7 @@ @implementation SharedPreferencesModule if (result) { resolve(result); } else { - resolve(@NO); + resolve([NSNull null]); } } diff --git a/ios/XUMM/Libs/Notification/LocalNotification.h b/ios/Xaman/Libs/Notification/LocalNotification.h similarity index 100% rename from ios/XUMM/Libs/Notification/LocalNotification.h rename to ios/Xaman/Libs/Notification/LocalNotification.h diff --git a/ios/XUMM/Libs/Notification/LocalNotification.m b/ios/Xaman/Libs/Notification/LocalNotification.m similarity index 96% rename from ios/XUMM/Libs/Notification/LocalNotification.m rename to ios/Xaman/Libs/Notification/LocalNotification.m index 6b12b7cbc..90d39c768 100644 --- a/ios/XUMM/Libs/Notification/LocalNotification.m +++ b/ios/Xaman/Libs/Notification/LocalNotification.m @@ -41,8 +41,11 @@ +(void)initialise { resolve(@(RCTSharedApplication().applicationIconBadgeNumber)); } -RCT_EXPORT_METHOD(setBadge:(NSInteger)number) { +RCT_EXPORT_METHOD(setBadge:(NSInteger)number + resolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) { RCTSharedApplication().applicationIconBadgeNumber = number; + resolve(@YES); } //Called when a notification is delivered to a foreground app. diff --git a/ios/XUMM/Libs/Security/Authentication/Biometric/BiometricModule.h b/ios/Xaman/Libs/Security/Authentication/Biometric/BiometricModule.h similarity index 100% rename from ios/XUMM/Libs/Security/Authentication/Biometric/BiometricModule.h rename to ios/Xaman/Libs/Security/Authentication/Biometric/BiometricModule.h diff --git a/ios/XUMM/Libs/Security/Authentication/Biometric/BiometricModule.m b/ios/Xaman/Libs/Security/Authentication/Biometric/BiometricModule.m similarity index 100% rename from ios/XUMM/Libs/Security/Authentication/Biometric/BiometricModule.m rename to ios/Xaman/Libs/Security/Authentication/Biometric/BiometricModule.m diff --git a/ios/XUMM/Libs/Security/Authentication/Biometric/SecurityProvider.h b/ios/Xaman/Libs/Security/Authentication/Biometric/SecurityProvider.h similarity index 100% rename from ios/XUMM/Libs/Security/Authentication/Biometric/SecurityProvider.h rename to ios/Xaman/Libs/Security/Authentication/Biometric/SecurityProvider.h diff --git a/ios/XUMM/Libs/Security/Authentication/Biometric/SecurityProvider.m b/ios/Xaman/Libs/Security/Authentication/Biometric/SecurityProvider.m similarity index 100% rename from ios/XUMM/Libs/Security/Authentication/Biometric/SecurityProvider.m rename to ios/Xaman/Libs/Security/Authentication/Biometric/SecurityProvider.m diff --git a/ios/XUMM/Libs/Security/Crypto/Crypto.h b/ios/Xaman/Libs/Security/Crypto/Crypto.h similarity index 100% rename from ios/XUMM/Libs/Security/Crypto/Crypto.h rename to ios/Xaman/Libs/Security/Crypto/Crypto.h diff --git a/ios/XUMM/Libs/Security/Crypto/Crypto.m b/ios/Xaman/Libs/Security/Crypto/Crypto.m similarity index 99% rename from ios/XUMM/Libs/Security/Crypto/Crypto.m rename to ios/Xaman/Libs/Security/Crypto/Crypto.m index 93f83da77..3f198ead9 100644 --- a/ios/XUMM/Libs/Security/Crypto/Crypto.m +++ b/ios/Xaman/Libs/Security/Crypto/Crypto.m @@ -3,7 +3,7 @@ #import #import "Crypto.h" -#import "XUMM-Swift.h" +#import "Xaman-Swift.h" @implementation CryptoModule diff --git a/ios/XUMM/Libs/Security/Crypto/Crypto.swift b/ios/Xaman/Libs/Security/Crypto/Crypto.swift similarity index 100% rename from ios/XUMM/Libs/Security/Crypto/Crypto.swift rename to ios/Xaman/Libs/Security/Crypto/Crypto.swift diff --git a/ios/XUMM/Libs/Security/Providers/UniqueIdProvider.h b/ios/Xaman/Libs/Security/Providers/UniqueIdProvider.h similarity index 100% rename from ios/XUMM/Libs/Security/Providers/UniqueIdProvider.h rename to ios/Xaman/Libs/Security/Providers/UniqueIdProvider.h diff --git a/ios/XUMM/Libs/Security/Providers/UniqueIdProvider.m b/ios/Xaman/Libs/Security/Providers/UniqueIdProvider.m similarity index 100% rename from ios/XUMM/Libs/Security/Providers/UniqueIdProvider.m rename to ios/Xaman/Libs/Security/Providers/UniqueIdProvider.m diff --git a/ios/XUMM/Libs/Security/Vault/Cipher/Cipher.h b/ios/Xaman/Libs/Security/Vault/Cipher/Cipher.h similarity index 100% rename from ios/XUMM/Libs/Security/Vault/Cipher/Cipher.h rename to ios/Xaman/Libs/Security/Vault/Cipher/Cipher.h diff --git a/ios/XUMM/Libs/Security/Vault/Cipher/Cipher.m b/ios/Xaman/Libs/Security/Vault/Cipher/Cipher.m similarity index 100% rename from ios/XUMM/Libs/Security/Vault/Cipher/Cipher.m rename to ios/Xaman/Libs/Security/Vault/Cipher/Cipher.m diff --git a/ios/XUMM/Libs/Security/Vault/Cipher/V1+AesCbc.h b/ios/Xaman/Libs/Security/Vault/Cipher/V1+AesCbc.h similarity index 100% rename from ios/XUMM/Libs/Security/Vault/Cipher/V1+AesCbc.h rename to ios/Xaman/Libs/Security/Vault/Cipher/V1+AesCbc.h diff --git a/ios/XUMM/Libs/Security/Vault/Cipher/V1+AesCbc.m b/ios/Xaman/Libs/Security/Vault/Cipher/V1+AesCbc.m similarity index 98% rename from ios/XUMM/Libs/Security/Vault/Cipher/V1+AesCbc.m rename to ios/Xaman/Libs/Security/Vault/Cipher/V1+AesCbc.m index 3dbf139a2..de0ce7601 100644 --- a/ios/XUMM/Libs/Security/Vault/Cipher/V1+AesCbc.m +++ b/ios/Xaman/Libs/Security/Vault/Cipher/V1+AesCbc.m @@ -1,5 +1,5 @@ #import "V1+AesCbc.h" -#import "XUMM-Swift.h" +#import "Xaman-Swift.h" #define CIPHER_VERSION @1 diff --git a/ios/XUMM/Libs/Security/Vault/Cipher/V2+AesGcm.h b/ios/Xaman/Libs/Security/Vault/Cipher/V2+AesGcm.h similarity index 100% rename from ios/XUMM/Libs/Security/Vault/Cipher/V2+AesGcm.h rename to ios/Xaman/Libs/Security/Vault/Cipher/V2+AesGcm.h diff --git a/ios/XUMM/Libs/Security/Vault/Cipher/V2+AesGcm.m b/ios/Xaman/Libs/Security/Vault/Cipher/V2+AesGcm.m similarity index 99% rename from ios/XUMM/Libs/Security/Vault/Cipher/V2+AesGcm.m rename to ios/Xaman/Libs/Security/Vault/Cipher/V2+AesGcm.m index 2a7b9ab16..378373a4c 100644 --- a/ios/XUMM/Libs/Security/Vault/Cipher/V2+AesGcm.m +++ b/ios/Xaman/Libs/Security/Vault/Cipher/V2+AesGcm.m @@ -1,7 +1,7 @@ #import "V2+AesGcm.h" #import "UniqueIdProvider.h" -#import "XUMM-Swift.h" +#import "Xaman-Swift.h" #define CIPHER_VERSION @2 diff --git a/ios/XUMM/Libs/Security/Vault/Storage/Keychain.h b/ios/Xaman/Libs/Security/Vault/Storage/Keychain.h similarity index 100% rename from ios/XUMM/Libs/Security/Vault/Storage/Keychain.h rename to ios/Xaman/Libs/Security/Vault/Storage/Keychain.h diff --git a/ios/XUMM/Libs/Security/Vault/Storage/Keychain.m b/ios/Xaman/Libs/Security/Vault/Storage/Keychain.m similarity index 100% rename from ios/XUMM/Libs/Security/Vault/Storage/Keychain.m rename to ios/Xaman/Libs/Security/Vault/Storage/Keychain.m diff --git a/ios/XUMM/Libs/Security/Vault/VaultManager.h b/ios/Xaman/Libs/Security/Vault/VaultManager.h similarity index 100% rename from ios/XUMM/Libs/Security/Vault/VaultManager.h rename to ios/Xaman/Libs/Security/Vault/VaultManager.h diff --git a/ios/XUMM/Libs/Security/Vault/VaultManager.m b/ios/Xaman/Libs/Security/Vault/VaultManager.m similarity index 99% rename from ios/XUMM/Libs/Security/Vault/VaultManager.m rename to ios/Xaman/Libs/Security/Vault/VaultManager.m index 5c95f0a37..6266b2a2c 100644 --- a/ios/XUMM/Libs/Security/Vault/VaultManager.m +++ b/ios/Xaman/Libs/Security/Vault/VaultManager.m @@ -13,7 +13,7 @@ #import "Storage/Keychain.h" #import "Cipher/Cipher.h" -#import "XUMM-Swift.h" +#import "Xaman-Swift.h" @implementation VaultManagerModule diff --git a/ios/XUMM/Libs/UI/BlurView/BlurEffectWithAmount.h b/ios/Xaman/Libs/UI/BlurView/BlurEffectWithAmount.h similarity index 100% rename from ios/XUMM/Libs/UI/BlurView/BlurEffectWithAmount.h rename to ios/Xaman/Libs/UI/BlurView/BlurEffectWithAmount.h diff --git a/ios/XUMM/Libs/UI/BlurView/BlurEffectWithAmount.m b/ios/Xaman/Libs/UI/BlurView/BlurEffectWithAmount.m similarity index 100% rename from ios/XUMM/Libs/UI/BlurView/BlurEffectWithAmount.m rename to ios/Xaman/Libs/UI/BlurView/BlurEffectWithAmount.m diff --git a/ios/XUMM/Libs/UI/BlurView/BlurViewManager.h b/ios/Xaman/Libs/UI/BlurView/BlurViewManager.h similarity index 100% rename from ios/XUMM/Libs/UI/BlurView/BlurViewManager.h rename to ios/Xaman/Libs/UI/BlurView/BlurViewManager.h diff --git a/ios/XUMM/Libs/UI/BlurView/BlurViewManager.m b/ios/Xaman/Libs/UI/BlurView/BlurViewManager.m similarity index 100% rename from ios/XUMM/Libs/UI/BlurView/BlurViewManager.m rename to ios/Xaman/Libs/UI/BlurView/BlurViewManager.m diff --git a/ios/XUMM/Libs/UI/BlurView/UIView+Blur.h b/ios/Xaman/Libs/UI/BlurView/UIView+Blur.h similarity index 100% rename from ios/XUMM/Libs/UI/BlurView/UIView+Blur.h rename to ios/Xaman/Libs/UI/BlurView/UIView+Blur.h diff --git a/ios/XUMM/Libs/UI/BlurView/UIView+Blur.m b/ios/Xaman/Libs/UI/BlurView/UIView+Blur.m similarity index 100% rename from ios/XUMM/Libs/UI/BlurView/UIView+Blur.m rename to ios/Xaman/Libs/UI/BlurView/UIView+Blur.m diff --git a/ios/XUMM/Libs/UI/HapticFeedback/HapticFeedback.h b/ios/Xaman/Libs/UI/HapticFeedback/HapticFeedback.h similarity index 100% rename from ios/XUMM/Libs/UI/HapticFeedback/HapticFeedback.h rename to ios/Xaman/Libs/UI/HapticFeedback/HapticFeedback.h diff --git a/ios/XUMM/Libs/UI/HapticFeedback/HapticFeedback.m b/ios/Xaman/Libs/UI/HapticFeedback/HapticFeedback.m similarity index 100% rename from ios/XUMM/Libs/UI/HapticFeedback/HapticFeedback.m rename to ios/Xaman/Libs/UI/HapticFeedback/HapticFeedback.m diff --git a/ios/XUMM/Libs/UI/QRCodeView/QRCode.h b/ios/Xaman/Libs/UI/QRCodeView/QRCode.h similarity index 100% rename from ios/XUMM/Libs/UI/QRCodeView/QRCode.h rename to ios/Xaman/Libs/UI/QRCodeView/QRCode.h diff --git a/ios/XUMM/Libs/UI/QRCodeView/QRCode.m b/ios/Xaman/Libs/UI/QRCodeView/QRCode.m similarity index 100% rename from ios/XUMM/Libs/UI/QRCodeView/QRCode.m rename to ios/Xaman/Libs/UI/QRCodeView/QRCode.m diff --git a/ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/CIColor+QRCode.h b/ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/CIColor+QRCode.h similarity index 100% rename from ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/CIColor+QRCode.h rename to ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/CIColor+QRCode.h diff --git a/ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/CIColor+QRCode.m b/ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/CIColor+QRCode.m similarity index 100% rename from ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/CIColor+QRCode.m rename to ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/CIColor+QRCode.m diff --git a/ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/NSString+Utils.h b/ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/NSString+Utils.h similarity index 100% rename from ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/NSString+Utils.h rename to ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/NSString+Utils.h diff --git a/ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/NSString+Utils.m b/ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/NSString+Utils.m similarity index 100% rename from ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/NSString+Utils.m rename to ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/NSString+Utils.m diff --git a/ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/QRCodeGenerator.h b/ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/QRCodeGenerator.h similarity index 100% rename from ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/QRCodeGenerator.h rename to ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/QRCodeGenerator.h diff --git a/ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/QRCodeGenerator.m b/ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/QRCodeGenerator.m similarity index 100% rename from ios/XUMM/Libs/UI/QRCodeView/QRCodeGenerator/QRCodeGenerator.m rename to ios/Xaman/Libs/UI/QRCodeView/QRCodeGenerator/QRCodeGenerator.m diff --git a/ios/XUMM/Libs/UI/QRCodeView/UIView+QRCode.h b/ios/Xaman/Libs/UI/QRCodeView/UIView+QRCode.h similarity index 100% rename from ios/XUMM/Libs/UI/QRCodeView/UIView+QRCode.h rename to ios/Xaman/Libs/UI/QRCodeView/UIView+QRCode.h diff --git a/ios/XUMM/Libs/UI/QRCodeView/UIView+QRCode.m b/ios/Xaman/Libs/UI/QRCodeView/UIView+QRCode.m similarity index 100% rename from ios/XUMM/Libs/UI/QRCodeView/UIView+QRCode.m rename to ios/Xaman/Libs/UI/QRCodeView/UIView+QRCode.m diff --git a/ios/XUMM/Libs/UI/ToastView/Toast.h b/ios/Xaman/Libs/UI/ToastView/Toast.h similarity index 100% rename from ios/XUMM/Libs/UI/ToastView/Toast.h rename to ios/Xaman/Libs/UI/ToastView/Toast.h diff --git a/ios/XUMM/Libs/UI/ToastView/Toast.m b/ios/Xaman/Libs/UI/ToastView/Toast.m similarity index 100% rename from ios/XUMM/Libs/UI/ToastView/Toast.m rename to ios/Xaman/Libs/UI/ToastView/Toast.m diff --git a/ios/XUMM/Libs/UI/ToastView/UIView+Toast.h b/ios/Xaman/Libs/UI/ToastView/UIView+Toast.h similarity index 100% rename from ios/XUMM/Libs/UI/ToastView/UIView+Toast.h rename to ios/Xaman/Libs/UI/ToastView/UIView+Toast.h diff --git a/ios/XUMM/Libs/UI/ToastView/UIView+Toast.m b/ios/Xaman/Libs/UI/ToastView/UIView+Toast.m similarity index 100% rename from ios/XUMM/Libs/UI/ToastView/UIView+Toast.m rename to ios/Xaman/Libs/UI/ToastView/UIView+Toast.m diff --git a/ios/XUMM/Libs/Utils/AppUtils.h b/ios/Xaman/Libs/Utils/AppUtils.h similarity index 100% rename from ios/XUMM/Libs/Utils/AppUtils.h rename to ios/Xaman/Libs/Utils/AppUtils.h diff --git a/ios/XUMM/Libs/Utils/AppUtils.m b/ios/Xaman/Libs/Utils/AppUtils.m similarity index 100% rename from ios/XUMM/Libs/Utils/AppUtils.m rename to ios/Xaman/Libs/Utils/AppUtils.m diff --git a/ios/XUMM/Libs/Utils/DeviceUtils.h b/ios/Xaman/Libs/Utils/DeviceUtils.h similarity index 100% rename from ios/XUMM/Libs/Utils/DeviceUtils.h rename to ios/Xaman/Libs/Utils/DeviceUtils.h diff --git a/ios/XUMM/Libs/Utils/DeviceUtils.m b/ios/Xaman/Libs/Utils/DeviceUtils.m similarity index 100% rename from ios/XUMM/Libs/Utils/DeviceUtils.m rename to ios/Xaman/Libs/Utils/DeviceUtils.m diff --git a/ios/XUMM/Libs/Webview/RNCWKProcessPoolManager.h b/ios/Xaman/Libs/Webview/RNCWKProcessPoolManager.h similarity index 100% rename from ios/XUMM/Libs/Webview/RNCWKProcessPoolManager.h rename to ios/Xaman/Libs/Webview/RNCWKProcessPoolManager.h diff --git a/ios/XUMM/Libs/Webview/RNCWKProcessPoolManager.m b/ios/Xaman/Libs/Webview/RNCWKProcessPoolManager.m similarity index 100% rename from ios/XUMM/Libs/Webview/RNCWKProcessPoolManager.m rename to ios/Xaman/Libs/Webview/RNCWKProcessPoolManager.m diff --git a/ios/XUMM/Libs/Webview/RNCWebView.h b/ios/Xaman/Libs/Webview/RNCWebView.h similarity index 98% rename from ios/XUMM/Libs/Webview/RNCWebView.h rename to ios/Xaman/Libs/Webview/RNCWebView.h index 52fb0fd6a..724f476f9 100644 --- a/ios/XUMM/Libs/Webview/RNCWebView.h +++ b/ios/Xaman/Libs/Webview/RNCWebView.h @@ -43,5 +43,6 @@ shouldStartLoadForRequest:(NSMutableDictionary *_Nonnull)request - (void)reload; - (void)stopLoading; - (void)requestFocus; +- (void)endEditing; @end diff --git a/ios/XUMM/Libs/Webview/RNCWebView.m b/ios/Xaman/Libs/Webview/RNCWebView.m similarity index 99% rename from ios/XUMM/Libs/Webview/RNCWebView.m rename to ios/Xaman/Libs/Webview/RNCWebView.m index a6820899f..ee4aacf7c 100644 --- a/ios/XUMM/Libs/Webview/RNCWebView.m +++ b/ios/Xaman/Libs/Webview/RNCWebView.m @@ -985,6 +985,11 @@ - (void)requestFocus [_webView becomeFirstResponder]; } +- (void)endEditing +{ + [_webView endEditing:YES]; +} + - (void)enableMessaging { self.postMessageScript = diff --git a/ios/XUMM/Libs/Webview/RNCWebViewManager.h b/ios/Xaman/Libs/Webview/RNCWebViewManager.h similarity index 100% rename from ios/XUMM/Libs/Webview/RNCWebViewManager.h rename to ios/Xaman/Libs/Webview/RNCWebViewManager.h diff --git a/ios/XUMM/Libs/Webview/RNCWebViewManager.m b/ios/Xaman/Libs/Webview/RNCWebViewManager.m similarity index 93% rename from ios/XUMM/Libs/Webview/RNCWebViewManager.m rename to ios/Xaman/Libs/Webview/RNCWebViewManager.m index 837d389c6..e75e5e67e 100644 --- a/ios/XUMM/Libs/Webview/RNCWebViewManager.m +++ b/ios/Xaman/Libs/Webview/RNCWebViewManager.m @@ -132,6 +132,18 @@ - (UIView *)view }]; } +RCT_EXPORT_METHOD(endEditing:(nonnull NSNumber *)reactTag) +{ + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { + RNCWebView *view = viewRegistry[reactTag]; + if (![view isKindOfClass:[RNCWebView class]]) { + RCTLogError(@"Invalid view returned from registry, expecting RNCWebView, got: %@", view); + } else { + [view endEditing]; + } + }]; +} + #pragma mark - Exported synchronous methods - (BOOL) webView:(RNCWebView *)webView diff --git a/ios/XUMM/XUMM.entitlements b/ios/Xaman/Xaman.entitlements similarity index 100% rename from ios/XUMM/XUMM.entitlements rename to ios/Xaman/Xaman.entitlements diff --git a/ios/XUMM/main.m b/ios/Xaman/main.m similarity index 100% rename from ios/XUMM/main.m rename to ios/Xaman/main.m diff --git a/ios/XUMMTests/CipherTest.m b/ios/XamanTests/CipherTest.m similarity index 100% rename from ios/XUMMTests/CipherTest.m rename to ios/XamanTests/CipherTest.m diff --git a/ios/XUMMTests/CryptoTest.swift b/ios/XamanTests/CryptoTest.swift similarity index 100% rename from ios/XUMMTests/CryptoTest.swift rename to ios/XamanTests/CryptoTest.swift diff --git a/ios/XUMMTests/Info.plist b/ios/XamanTests/Info.plist similarity index 100% rename from ios/XUMMTests/Info.plist rename to ios/XamanTests/Info.plist diff --git a/ios/XUMMTests/PerformanceLogger.h b/ios/XamanTests/PerformanceLogger.h similarity index 100% rename from ios/XUMMTests/PerformanceLogger.h rename to ios/XamanTests/PerformanceLogger.h diff --git a/ios/XUMMTests/PerformanceLogger.m b/ios/XamanTests/PerformanceLogger.m similarity index 100% rename from ios/XUMMTests/PerformanceLogger.m rename to ios/XamanTests/PerformanceLogger.m diff --git a/ios/XUMMTests/VaultMangerTest.m b/ios/XamanTests/VaultMangerTest.m similarity index 100% rename from ios/XUMMTests/VaultMangerTest.m rename to ios/XamanTests/VaultMangerTest.m diff --git a/ios/XUMMTests/XUMMTests-Bridging-Header.h b/ios/XamanTests/XamanTests-Bridging-Header.h similarity index 100% rename from ios/XUMMTests/XUMMTests-Bridging-Header.h rename to ios/XamanTests/XamanTests-Bridging-Header.h diff --git a/jest.config.js b/jest.config.js index ad5883a92..92c396114 100644 --- a/jest.config.js +++ b/jest.config.js @@ -11,21 +11,26 @@ module.exports = { coverageReporters: ['lcov'], globals: { window: {}, - 'ts-jest': { - babelConfig: false, - isolatedModules: true, - tsconfig: 'tsconfig.jest.json', - }, }, transform: { '^.+\\.(js|jsx)$': '/node_modules/babel-jest', - '\\.(ts|tsx)$': 'ts-jest', + '\\.(ts|tsx)$': [ + 'ts-jest', + { + babelConfig: false, + isolatedModules: true, + tsconfig: 'tsconfig.jest.json', + }, + ], }, testMatch: ['**/__tests__/**/?(*.)+(spec|test).(js|ts|tsx)'], testPathIgnorePatterns: ['\\.snap$', '/node_modules/', '/e2e/'], cacheDirectory: '.jest/cache', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'ios.ts', 'ios.tsx', 'android.ts', 'android.tsx'], - setupFilesAfterEnv: ['/src/__mocks__/globalMock.ts'], maxWorkers: 1, testTimeout: 20000, + moduleNameMapper: { + // Force module uuid to resolve with the CJS entry point, because Jest does not support package.json.exports. See https://github.com/uuidjs/uuid/issues/451 + uuid: require.resolve('uuid'), + }, }; diff --git a/jest.setup.js b/jest.setup.js index 43e02b59c..017259456 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -1,9 +1,18 @@ -// hide console.log console.error in jest tests +import Locale from '@locale'; +import moment from 'moment-timezone'; + +/* Hide console.log console.error in jest tests */ jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn()); jest.spyOn(global.console, 'error').mockImplementation(() => jest.fn()); jest.spyOn(global.console, 'debug').mockImplementation(() => jest.fn()); +/* Mock RNN event listeners */ jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter.js'); jest.mock('react-native/Libraries/Animated/NativeAnimatedHelper'); +/* Realm */ process.env.REALM_DISABLE_ANALYTICS = true; + +// Localization +Locale.setLocale('EN'); +moment.tz.setDefault('Europe/Amsterdam'); diff --git a/metro.config.js b/metro.config.js index 715c7bca7..ab634150b 100644 --- a/metro.config.js +++ b/metro.config.js @@ -1,17 +1,11 @@ +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); + /** - * Metro configuration for React Native - * https://github.com/facebook/react-native + * Metro configuration + * https://facebook.github.io/metro/docs/configuration * - * @format + * @type {import('metro-config').MetroConfig} */ +const config = {}; -module.exports = { - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - }, -}; +module.exports = mergeConfig(getDefaultConfig(__dirname), config); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..486e8b78f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,19736 @@ +{ + "name": "xaman", + "version": "2.6.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "xaman", + "version": "2.6.0", + "hasInstallScript": true, + "license": "SEE LICENSE IN ", + "dependencies": { + "@react-native-community/netinfo": "11.1.0", + "@react-native-firebase/analytics": "18.6.2", + "@react-native-firebase/app": "18.6.2", + "@react-native-firebase/crashlytics": "18.6.2", + "@react-native-firebase/messaging": "18.6.2", + "@veriff/react-native-sdk": "5.1.0", + "bignumber.js": "9.1.2", + "fuse.js": "6.6.2", + "i18n-js": "4.3.2", + "lodash": "4.17.21", + "moment-timezone": "0.5.43", + "node-libs-browser": "2.2.1", + "react": "18.2.0", + "react-native": "0.72.7", + "react-native-camera": "4.2.1", + "react-native-interactable": "2.0.1", + "react-native-navigation": "7.37.0", + "realm": "12.3.1", + "ripple-binary-codec": "npm:xrpl-binary-codec-prerelease@7.0.1", + "tangem-sdk-react-native": "2.3.1", + "uuid": "9.0.1", + "xrpl-accountlib": "3.2.1", + "xrpl-client": "2.3.1", + "xrpl-orderbook-reader": "0.4.0", + "xumm-string-decode": "0.6.2" + }, + "devDependencies": { + "@babel/core": "7.20.12", + "@babel/plugin-transform-runtime": "7.19.6", + "@babel/preset-env": "7.20.2", + "@babel/runtime": "7.20.13", + "@react-native/metro-config": "0.72.11", + "@types/detox": "18.1.0", + "@types/i18n-js": "3.8.5", + "@types/jest": "29.5.5", + "@types/lodash": "4.14.199", + "@types/react": "18.2.23", + "@types/react-native": "0.72.2", + "@types/react-test-renderer": "18.0.3", + "@types/uuid": "9.0.4", + "@typescript-eslint/eslint-plugin": "6.7.2", + "@typescript-eslint/parser": "6.7.2", + "babel-jest": "29.7.0", + "babel-plugin-rewrite-require": "1.14.5", + "babel-plugin-transform-remove-console": "6.9.4", + "coveralls": "3.1.1", + "cucumber": "6.0.7", + "detox": "20.12.1", + "eslint": "8.50.0", + "eslint-config-airbnb": "19.0.4", + "eslint-config-airbnb-base": "15.0.0", + "eslint-config-prettier": "9.0.0", + "eslint-import-resolver-typescript": "3.6.1", + "eslint-plugin-import": "2.28.1", + "eslint-plugin-jest": "27.4.0", + "eslint-plugin-jsx-a11y": "6.7.1", + "eslint-plugin-prettier": "5.0.0", + "eslint-plugin-react": "7.33.2", + "eslint-plugin-react-native": "4.1.0", + "eslint-plugin-spellcheck": "0.0.20", + "eslint-plugin-typescript": "0.14.0", + "fetch-mock": "9.11.0", + "jest": "29.7.0", + "jetifier": "2.0.0", + "metro-react-native-babel-preset": "0.76.8", + "patch-package": "8.0.0", + "prettier": "3.0.3", + "react-cosmos": "6.0.0-beta.6", + "react-cosmos-native": "6.0.0-beta.6", + "react-test-renderer": "18.2.0", + "ts-jest": "29.1.1", + "typescript": "5.2.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", + "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", + "peer": true, + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "dependencies": { + "@babel/types": "^7.23.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.5.tgz", + "integrity": "sha512-QELlRWxSpgdwdJzSJn4WAhKC+hvw/AtHbbrIoncKHkhKKR/luAlKkgBDcri1EzWAo8f8VvYVryEHN4tax/V67A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", + "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.23.3.tgz", + "integrity": "sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-default-from": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.23.3.tgz", + "integrity": "sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", + "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", + "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", + "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.5.tgz", + "integrity": "sha512-2fMkXEJkrmwgu2Bsv1Saxgj30IXZdJ+84lQcKKI7sm719oXs0BBw2ZENKdJdR1PjWndgLCEBNXJOri0fk7RYQA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.23.3.tgz", + "integrity": "sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-flow-strip-types": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz", + "integrity": "sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/register/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.5.tgz", + "integrity": "sha512-7+ziVclejQTLYhXl+Oi1f6gTGD1XDCeLa4R472TNGQxb08zbEJ0OdNoh5Piz+57Ltmui6xR88BXR4gS3/Toslw==", + "dev": true, + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", + "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.5", + "@babel/types": "^7.23.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", + "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "peer": true, + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/utils/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pkgr/utils/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/@pkgr/utils/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native-community/cli": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-11.3.10.tgz", + "integrity": "sha512-bIx0t5s9ewH1PlcEcuQUD+UnVrCjPGAfjhVR5Gew565X60nE+GTIHRn70nMv9G4he/amBF+Z+vf5t8SNZEWMwg==", + "dependencies": { + "@react-native-community/cli-clean": "11.3.10", + "@react-native-community/cli-config": "11.3.10", + "@react-native-community/cli-debugger-ui": "11.3.10", + "@react-native-community/cli-doctor": "11.3.10", + "@react-native-community/cli-hermes": "11.3.10", + "@react-native-community/cli-plugin-metro": "11.3.10", + "@react-native-community/cli-server-api": "11.3.10", + "@react-native-community/cli-tools": "11.3.10", + "@react-native-community/cli-types": "11.3.10", + "chalk": "^4.1.2", + "commander": "^9.4.1", + "execa": "^5.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "prompts": "^2.4.0", + "semver": "^7.5.2" + }, + "bin": { + "react-native": "build/bin.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@react-native-community/cli-clean": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-11.3.10.tgz", + "integrity": "sha512-g6QjW+DSqoWRHzmIQW3AH22k1AnynWuOdy2YPwYEGgPddTeXZtJphIpEVwDOiC0L4mZv2VmiX33/cGNUwO0cIA==", + "dependencies": { + "@react-native-community/cli-tools": "11.3.10", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "prompts": "^2.4.0" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@react-native-community/cli-clean/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-config": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-11.3.10.tgz", + "integrity": "sha512-YYu14nm1JYLS6mDRBz78+zDdSFudLBFpPkhkOoj4LuBhNForQBIqFFHzQbd9/gcguJxfW3vlYSnudfaUI7oGLg==", + "dependencies": { + "@react-native-community/cli-tools": "11.3.10", + "chalk": "^4.1.2", + "cosmiconfig": "^5.1.0", + "deepmerge": "^4.3.0", + "glob": "^7.1.3", + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@react-native-community/cli-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-debugger-ui": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.10.tgz", + "integrity": "sha512-kyitGV3RsjlXIioq9lsuawha2GUBPCTAyXV6EBlm3qlyF3dMniB3twEvz+fIOid/e1ZeucH3Tzy5G3qcP8yWoA==", + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native-community/cli-doctor": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-11.3.10.tgz", + "integrity": "sha512-DpMsfCWKZ15L9nFK/SyDvpl5v6MjV+arMHMC1i8kR+DOmf2xWmp/pgMywKk0/u50yGB9GwxBHt3i/S/IMK5Ylg==", + "dependencies": { + "@react-native-community/cli-config": "11.3.10", + "@react-native-community/cli-platform-android": "11.3.10", + "@react-native-community/cli-platform-ios": "11.3.10", + "@react-native-community/cli-tools": "11.3.10", + "chalk": "^4.1.2", + "command-exists": "^1.2.8", + "envinfo": "^7.7.2", + "execa": "^5.0.0", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5", + "node-stream-zip": "^1.9.1", + "ora": "^5.4.1", + "prompts": "^2.4.0", + "semver": "^7.5.2", + "strip-ansi": "^5.2.0", + "sudo-prompt": "^9.0.0", + "wcwidth": "^1.0.1", + "yaml": "^2.2.1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@react-native-community/cli-doctor/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@react-native-community/cli-hermes": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-11.3.10.tgz", + "integrity": "sha512-vqINuzAlcHS9ImNwJtT43N7kfBQ7ro9A8O1Gpc5TQ0A8V36yGG8eoCHeauayklVVgMZpZL6f6mcoLLr9IOgBZQ==", + "dependencies": { + "@react-native-community/cli-platform-android": "11.3.10", + "@react-native-community/cli-tools": "11.3.10", + "chalk": "^4.1.2", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@react-native-community/cli-hermes/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.10.tgz", + "integrity": "sha512-RGu9KuDIXnrcNkacSHj5ETTQtp/D/835L6veE2jMigO21p//gnKAjw3AVLCysGr8YXYfThF8OSOALrwNc94puQ==", + "dependencies": { + "@react-native-community/cli-tools": "11.3.10", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "glob": "^7.1.3", + "logkitty": "^0.7.1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.10.tgz", + "integrity": "sha512-JjduMrBM567/j4Hvjsff77dGSLMA0+p9rr0nShlgnKPcc+0J4TDy0hgWpUceM7OG00AdDjpetAPupz0kkAh4cQ==", + "dependencies": { + "@react-native-community/cli-tools": "11.3.10", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-xml-parser": "^4.0.12", + "glob": "^7.1.3", + "ora": "^5.4.1" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-plugin-metro": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.10.tgz", + "integrity": "sha512-ZYAc5Hc+QVqJgj1XFbpKnIPbSJ9xKcBnfQrRhR+jFyt2DWx85u4bbzY1GSVc/USs0UbSUXv4dqPbnmOJz52EYQ==", + "dependencies": { + "@react-native-community/cli-server-api": "11.3.10", + "@react-native-community/cli-tools": "11.3.10", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "metro": "0.76.8", + "metro-config": "0.76.8", + "metro-core": "0.76.8", + "metro-react-native-babel-transformer": "0.76.8", + "metro-resolver": "0.76.8", + "metro-runtime": "0.76.8", + "readline": "^1.3.0" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-server-api": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-11.3.10.tgz", + "integrity": "sha512-WEwHWIpqx3gA6Da+lrmq8+z78E1XbxxjBlvHAXevhjJj42N4SO417eZiiUVrFzEFVVJSUee9n9aRa0kUR+0/2w==", + "dependencies": { + "@react-native-community/cli-debugger-ui": "11.3.10", + "@react-native-community/cli-tools": "11.3.10", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.1", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^7.5.1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@react-native-community/cli-server-api/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@react-native-community/cli-server-api/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-11.3.10.tgz", + "integrity": "sha512-4kCuCwVcGagSrNg9vxMNVhynwpByuC/J5UnKGEet3HuqmoDhQW15m18fJXiehA8J+u9WBvHduefy9nZxO0C06Q==", + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "find-up": "^5.0.0", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^7.5.2", + "shell-quote": "^1.7.3" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@react-native-community/cli-tools/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@react-native-community/cli-types": { + "version": "11.3.10", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-11.3.10.tgz", + "integrity": "sha512-0FHK/JE7bTn0x1y8Lk5m3RISDHIBQqWLltO2Mf7YQ6cAeKs8iNOJOeKaHJEY+ohjsOyCziw+XSC4cY57dQrwNA==", + "dependencies": { + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@react-native-community/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@react-native-community/cli/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@react-native-community/cli/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@react-native-community/cli/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@react-native-community/netinfo": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-11.1.0.tgz", + "integrity": "sha512-pIbCuqgrY7SkngAcjUs9fMzNh1h4soQMVw1IeGp1HN5//wox3fUVOuvyIubTscUbdLFKiltJAiuQek7Nhx1bqA==", + "peerDependencies": { + "react-native": ">=0.59" + } + }, + "node_modules/@react-native-firebase/analytics": { + "version": "18.6.2", + "resolved": "https://registry.npmjs.org/@react-native-firebase/analytics/-/analytics-18.6.2.tgz", + "integrity": "sha512-SDvQvAq7NZZixG/gpzgdy4++bjCHlSXytg4gWXxfVZQSquY3K/wiGFxelAvHjYQRvJ9CAuZw7jvq/RbJ3wT4zg==", + "peerDependencies": { + "@react-native-firebase/app": "18.6.2" + } + }, + "node_modules/@react-native-firebase/app": { + "version": "18.6.2", + "resolved": "https://registry.npmjs.org/@react-native-firebase/app/-/app-18.6.2.tgz", + "integrity": "sha512-0hZ/4itfn5kxoUZsZfrpyTh4FDh4jFU/5svYaSAldPK3+xRmi1BSSx9PVzWt7vyw1Bi5ep/oLq/6sFaoqk5FFw==", + "dependencies": { + "opencollective-postinstall": "^2.0.3", + "superstruct": "^0.6.2" + }, + "peerDependencies": { + "expo": ">=47.0.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@react-native-firebase/crashlytics": { + "version": "18.6.2", + "resolved": "https://registry.npmjs.org/@react-native-firebase/crashlytics/-/crashlytics-18.6.2.tgz", + "integrity": "sha512-Wo7uuPKHx4eQg8MS/JnKZK7k90tIxmAyz8RonrqgQYBG2GO2NguNHZsZqo3VP9XlpHW0lImdq5J0BWBwL4+a3w==", + "dependencies": { + "stacktrace-js": "^2.0.2" + }, + "peerDependencies": { + "@react-native-firebase/app": "18.6.2", + "expo": ">=47.0.0" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@react-native-firebase/messaging": { + "version": "18.6.2", + "resolved": "https://registry.npmjs.org/@react-native-firebase/messaging/-/messaging-18.6.2.tgz", + "integrity": "sha512-xGkv9tBjRaSqN6iGRC2euDiZVlraXVva4s/UQNbz5JBehTiStRP2lsRfGKiWuSWMMQgeKR0abRBgJLor8/OfwA==", + "peerDependencies": { + "@react-native-firebase/app": "18.6.2" + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.72.0.tgz", + "integrity": "sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==" + }, + "node_modules/@react-native/codegen": { + "version": "0.72.7", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.72.7.tgz", + "integrity": "sha512-O7xNcGeXGbY+VoqBGNlZ3O05gxfATlwE1Q1qQf5E38dK+tXn5BY4u0jaQ9DPjfE8pBba8g/BYI1N44lynidMtg==", + "dependencies": { + "@babel/parser": "^7.20.0", + "flow-parser": "^0.206.0", + "jscodeshift": "^0.14.0", + "nullthrows": "^1.1.1" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.72.11", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.72.11.tgz", + "integrity": "sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw==" + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.72.1", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.72.1.tgz", + "integrity": "sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA==" + }, + "node_modules/@react-native/metro-config": { + "version": "0.72.11", + "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.72.11.tgz", + "integrity": "sha512-661EyQnDdVelyc0qP/ew7kKkGAh6N6KlkuPLC2SQ8sxaXskVU6fSuNlpLW4bUTBUDFKG8gEOU2hp6rzk4wQnGQ==", + "dev": true, + "dependencies": { + "@react-native/js-polyfills": "^0.72.1", + "metro-config": "0.76.8", + "metro-react-native-babel-transformer": "0.76.8", + "metro-runtime": "0.76.8" + } + }, + "node_modules/@react-native/normalize-colors": { + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz", + "integrity": "sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw==" + }, + "node_modules/@react-native/virtualized-lists": { + "version": "0.72.8", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz", + "integrity": "sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==", + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "peerDependencies": { + "react-native": "*" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@skidding/launch-editor": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@skidding/launch-editor/-/launch-editor-2.2.3.tgz", + "integrity": "sha512-0SuGEsWdulnbryUJ6humogFuuDMWMb4VJyhOc3FGVkibxVdECYDDkGx8VjS/NePZSegNONDIVhCEVZLTv4ycTQ==", + "dev": true, + "dependencies": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/brorand": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/@types/brorand/-/brorand-1.0.33.tgz", + "integrity": "sha512-KmNsWYtzKXpmxjecvYWUEGK5biJB/1kpHRObHZD8eme1tz/TvbESbZeNAHPRNd5qyCJiHk2ztbNzKbPC6TuPFg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/detox": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@types/detox/-/detox-18.1.0.tgz", + "integrity": "sha512-CpR+ziJgDOQhMwTt9fNciZhM9LxqyDRa49DKH0aplcSn26UU2WKSd1Tn1lNBrNCkMD8QNzFg+PYdGRFWrqK3Wg==", + "deprecated": "This is a stub types definition. detox provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "detox": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/i18n-js": { + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/@types/i18n-js/-/i18n-js-3.8.5.tgz", + "integrity": "sha512-6LlMVfkAW8gwcgxIRjxuWxjhD+hw4Mj2VC609FpYCG5n8usb2GE2xbKsEQXWmAIe6LBN2OOw7HnSjZqMDHVtDw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", + "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.23.tgz", + "integrity": "sha512-qHLW6n1q2+7KyBEYnrZpcsAmU/iiCh9WGCKgXvMxx89+TYdJWRjZohVIo9XTcoLhfX3+/hP0Pbulu3bCZQ9PSA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-native": { + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.72.2.tgz", + "integrity": "sha512-/eEjr04Zqo7mTMszuSdrLx90+j5nWhDMMOgtnKZfAYyV3RwmlpSb7F17ilmMMxZWJY81n/JZ4e6wdhMJFpjrCg==", + "dev": true, + "dependencies": { + "@react-native/virtualized-lists": "^0.72.4", + "@types/react": "*" + } + }, + "node_modules/@types/react-test-renderer": { + "version": "18.0.3", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.3.tgz", + "integrity": "sha512-4wcNLnY6nIT+L6g94CpzL4CXX2P18JvKPU9CDlaHr3DnbP3GiaQLhDotJqjWlVqOcE4UhLRjp0MtxqwuNKONnA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "node_modules/@types/uuid": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.4.tgz", + "integrity": "sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/url-search-params": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ungap/url-search-params/-/url-search-params-0.1.4.tgz", + "integrity": "sha512-RLwrxCTDNiNev9hpr9rDq8NyeQ8Nn0X1we4Wu7Tlf368I8r+7hBj3uObhifhuLk74egaYaSX5nUsBlWz6kjj+A==" + }, + "node_modules/@veriff/react-native-sdk": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@veriff/react-native-sdk/-/react-native-sdk-5.1.0.tgz", + "integrity": "sha512-b1ulyAgM+45TVZKrVTc5uULUZ/xG6yEs1TvGjwcVLhAc6tqljIAGFqNMVgTkD4uNCkmd2i/qzQx7zDQApdtkkw==", + "dependencies": { + "eslint-plugin-ft-flow": "^2.0.3" + }, + "peerDependencies": { + "react": "18.2.0", + "react-native": "^0.72.0" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", + "dependencies": { + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "node_modules/ansi-fragments/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-fragments/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/appdirsjs": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", + "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "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" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/assertion-error-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz", + "integrity": "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==", + "dev": true, + "dependencies": { + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + } + }, + "node_modules/ast-types": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", + "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "node_modules/ast-types/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/axe-core": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", + "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-rewrite-require": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/babel-plugin-rewrite-require/-/babel-plugin-rewrite-require-1.14.5.tgz", + "integrity": "sha512-TsDvs3JesFMn/cLO0A9/pLSWBtUWi8fGTT8yE7NsrbZ477zzu5nVVQ09+xhbvIjPaQEQ+JXrwRR+qxjt8n/NnA==", + "dev": true + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" + }, + "node_modules/babel-plugin-transform-flow-enums": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", + "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", + "dependencies": { + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "node_modules/babel-plugin-transform-remove-console": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", + "integrity": "sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==", + "dev": true + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-fbjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", + "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/becke-ch--regex--s0-0-v1--base--pl--lib": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/becke-ch--regex--s0-0-v1--base--pl--lib/-/becke-ch--regex--s0-0-v1--base--pl--lib-1.4.0.tgz", + "integrity": "sha512-FnWonOyaw7Vivg5nIkrUll9HSS5TjFbyuURAiDssuL6VxrBe3ERzudRxOcWRhZYlP89UArMDikz7SapRPQpmZQ==", + "dev": true + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "dependencies": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bip32/node_modules/@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/bson/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "dev": true, + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/bunyan-debug-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bunyan-debug-stream/-/bunyan-debug-stream-3.1.0.tgz", + "integrity": "sha512-VaFYbDVdiSn3ZpdozrjZ8mFpxHXl26t11C1DKRQtbo0EgffqeFNrRLOGIESKVeGEvVu4qMxMSSxzNlSw7oTj7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "bunyan": "*" + } + }, + "node_modules/bunyan-debug-stream/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/bunyan-debug-stream/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/bunyan-debug-stream/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/bunyan-debug-stream/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/bunyan-debug-stream/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bunyan-debug-stream/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/caf": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/caf/-/caf-15.0.1.tgz", + "integrity": "sha512-Xp/IK6vMwujxWZXra7djdYzPdPnEQKa7Mudu2wZgDQ3TJry1I0TgtjEgwZHpoBcMp68j4fb0/FZ1SJyMEgJrXQ==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001566", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", + "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/child-process-promise": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", + "integrity": "sha512-Fi4aNdqBsr0mv+jgWxcZ/7rAIC2mgihrptyVI4foh/rrjY/3BNjfP9+oaiFx/fzim+1ZyCNBae0DlyfQhSugog==", + "dev": true, + "dependencies": { + "cross-spawn": "^4.0.2", + "node-version": "^1.0.0", + "promise-polyfill": "^6.0.1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-js": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.34.0.tgz", + "integrity": "sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz", + "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==", + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.34.0.tgz", + "integrity": "sha512-pmhivkYXkymswFfbXsANmBAewXx86UBfmagP+w0wkK06kLsLlTK5oQmsURPivzMkIBQiYq2cjamcZExIwlFQIg==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/coveralls": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", + "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.2" + }, + "bin": { + "coveralls": "bin/coveralls.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "node_modules/cross-spawn/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/cross-spawn/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/cucumber": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/cucumber/-/cucumber-6.0.7.tgz", + "integrity": "sha512-pN3AgWxHx8rOi+wOlqjASNETOjf3TgeyqhMNLQam7nSTXgQzju1oAmXkleRQRcXvpVvejcDHiZBLFSfBkqbYpA==", + "deprecated": "Cucumber is publishing new releases under @cucumber/cucumber", + "dev": true, + "dependencies": { + "assertion-error-formatter": "^3.0.0", + "bluebird": "^3.4.1", + "cli-table3": "^0.5.1", + "colors": "^1.1.2", + "commander": "^3.0.1", + "cucumber-expressions": "^8.1.0", + "cucumber-tag-expressions": "^2.0.2", + "duration": "^0.2.1", + "escape-string-regexp": "^2.0.0", + "figures": "^3.0.0", + "gherkin": "5.0.0", + "glob": "^7.1.3", + "indent-string": "^4.0.0", + "is-generator": "^1.0.2", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash": "^4.17.14", + "mz": "^2.4.0", + "progress": "^2.0.0", + "resolve": "^1.3.3", + "serialize-error": "^4.1.0", + "stack-chain": "^2.0.0", + "stacktrace-js": "^2.0.0", + "string-argv": "^0.3.0", + "title-case": "^2.1.1", + "util-arity": "^1.0.2", + "verror": "^1.9.0" + }, + "bin": { + "cucumber-js": "bin/cucumber-js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cucumber-expressions": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/cucumber-expressions/-/cucumber-expressions-8.3.0.tgz", + "integrity": "sha512-cP2ya0EiorwXBC7Ll7Cj7NELYbasNv9Ty42L4u7sso9KruWemWG1ZiTq4PMqir3SNDSrbykoqI5wZgMbLEDjLQ==", + "deprecated": "This package is now published under @cucumber/cucumber-expressions", + "dev": true, + "dependencies": { + "becke-ch--regex--s0-0-v1--base--pl--lib": "^1.4.0", + "xregexp": "^4.2.4" + } + }, + "node_modules/cucumber-tag-expressions": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cucumber-tag-expressions/-/cucumber-tag-expressions-2.0.3.tgz", + "integrity": "sha512-+x5j1IfZrBtbvYHuoUX0rl4nUGxaey6Do9sM0CABmZfDCcWXuuRm1fQeCaklIYQgOFHQ6xOHvDSdkMHHpni6tQ==", + "dev": true + }, + "node_modules/cucumber/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/deprecated-react-native-prop-types": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.2.3.tgz", + "integrity": "sha512-2rLTiMKidIFFYpIVM69UnQKngLqQfL6I11Ch8wGSBftS18FUXda+o2we2950X+1dmbgps28niI3qwyH4eX3Z1g==", + "dependencies": { + "@react-native/normalize-colors": "<0.73.0", + "invariant": "^2.2.4", + "prop-types": "^15.8.1" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detox": { + "version": "20.12.1", + "resolved": "https://registry.npmjs.org/detox/-/detox-20.12.1.tgz", + "integrity": "sha512-qe56xeqRTE3v6WVKBKqiXtqlj0ZcnklbFlzyQAcICOCXWNZvRjtXZhKyBq0PzKjxInH1RajjsEJQWe5iYVX/9Q==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "ajv": "^8.6.3", + "bunyan": "^1.8.12", + "bunyan-debug-stream": "^3.1.0", + "caf": "^15.0.1", + "chalk": "^4.0.0", + "child-process-promise": "^2.2.0", + "execa": "^5.1.1", + "find-up": "^5.0.0", + "fs-extra": "^11.0.0", + "funpermaproxy": "^1.1.0", + "glob": "^8.0.3", + "ini": "^1.3.4", + "json-cycle": "^1.3.0", + "lodash": "^4.17.11", + "multi-sort-stream": "^1.0.3", + "multipipe": "^4.0.0", + "node-ipc": "9.2.1", + "proper-lockfile": "^3.0.2", + "resolve-from": "^5.0.0", + "sanitize-filename": "^1.6.1", + "semver": "^7.0.0", + "serialize-error": "^8.0.1", + "shell-quote": "^1.7.2", + "signal-exit": "^3.0.3", + "stream-json": "^1.7.4", + "strip-ansi": "^6.0.1", + "telnet-client": "1.2.8", + "tempfile": "^2.0.0", + "trace-event-lib": "^1.3.1", + "which": "^1.3.1", + "ws": "^7.0.0", + "yargs": "^17.0.0", + "yargs-parser": "^21.0.0", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "detox": "local-cli/cli.js" + }, + "engines": { + "node": ">=14.5.0" + }, + "peerDependencies": { + "jest": "29.x.x || 28.x.x || ^27.2.5" + }, + "peerDependenciesMeta": { + "jest": { + "optional": true + } + } + }, + "node_modules/detox/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/detox/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/detox/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/detox/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/detox/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/detox/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detox/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/detox/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detox/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detox/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/detox/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/detox/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detox/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/detox/node_modules/serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detox/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/detox/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detox/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.607", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.607.tgz", + "integrity": "sha512-YUlnPwE6eYxzwBnFmawA8LiLRfm70R2aJRIUv0n03uHt/cUzzYACOogmvk8M2+hVzt/kB80KJXx7d5f5JofPvQ==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "dependencies": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promisify": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-7.0.0.tgz", + "integrity": "sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-ft-flow": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz", + "integrity": "sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg==", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "@babel/eslint-parser": "^7.12.0", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.13.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.4.0.tgz", + "integrity": "sha512-ukVeKmMPAUA5SWjHenvyyXnirKfHKMdOsTZdn5tZx5EW05HGVQwBohigjFZGGj3zuv1cV6hc82FvWv6LdIbkgg==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-native": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz", + "integrity": "sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q==", + "dev": true, + "dependencies": { + "eslint-plugin-react-native-globals": "^0.1.1" + }, + "peerDependencies": { + "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-native-globals": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", + "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", + "dev": true + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-spellcheck": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-spellcheck/-/eslint-plugin-spellcheck-0.0.20.tgz", + "integrity": "sha512-GJa6vgzWAYqe0elKADAsiBRrhvqBnKyt7tpFSqlCZJsK2W9+K80oMyHhKolA7vJ13H5RCGs5/KCN+mKUyKoAiA==", + "dev": true, + "dependencies": { + "globals": "^13.0.0", + "hunspell-spellchecker": "^1.0.2", + "lodash": "^4.17.15" + }, + "peerDependencies": { + "eslint": ">=0.8.0" + } + }, + "node_modules/eslint-plugin-spellcheck/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-spellcheck/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-typescript": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-typescript/-/eslint-plugin-typescript-0.14.0.tgz", + "integrity": "sha512-2u1WnnDF2mkWWgU1lFQ2RjypUlmRoBEvQN02y9u+IL12mjWlkKFGEBnVsjs9Y8190bfPQCvWly1c2rYYUSOxWw==", + "deprecated": "Deprecated: Use @typescript-eslint/eslint-plugin instead", + "dev": true, + "dependencies": { + "requireindex": "~1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-xml-parser": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", + "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fetch-mock": { + "version": "9.11.0", + "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-9.11.0.tgz", + "integrity": "sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/runtime": "^7.0.0", + "core-js": "^3.0.0", + "debug": "^4.1.1", + "glob-to-regexp": "^0.4.0", + "is-subset": "^0.1.1", + "lodash.isequal": "^4.5.0", + "path-to-regexp": "^2.2.1", + "querystring": "^0.2.0", + "whatwg-url": "^6.5.0" + }, + "engines": { + "node": ">=4.0.0" + }, + "funding": { + "type": "charity", + "url": "https://www.justgiving.com/refugee-support-europe" + }, + "peerDependencies": { + "node-fetch": "*" + }, + "peerDependenciesMeta": { + "node-fetch": { + "optional": true + } + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" + }, + "node_modules/flow-enums-runtime": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.5.tgz", + "integrity": "sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==" + }, + "node_modules/flow-parser": { + "version": "0.206.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.206.0.tgz", + "integrity": "sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/funpermaproxy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/funpermaproxy/-/funpermaproxy-1.1.0.tgz", + "integrity": "sha512-2Sp1hWuO8m5fqeFDusyhKqYPT+7rGLw34N3qonDcdRP8+n7M7Gl/yKp/q7oCxnnJ6pWCectOmLFJpsMU/++KrQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/fuse.js": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", + "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gherkin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gherkin/-/gherkin-5.0.0.tgz", + "integrity": "sha512-Y+93z2Nh+TNIKuKEf+6M0FQrX/z0Yv9C2LFfc5NlcGJWRrrTeI/jOg2374y1FOw6ZYQ3RgJBezRkli7CLDubDA==", + "deprecated": "This package is now published under @cucumber/gherkin", + "dev": true, + "bin": { + "gherkin-javascript": "bin/gherkin" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.12.0.tgz", + "integrity": "sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==" + }, + "node_modules/hermes-parser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.12.0.tgz", + "integrity": "sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw==", + "dependencies": { + "hermes-estree": "0.12.0" + } + }, + "node_modules/hermes-profile-transformer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", + "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", + "dependencies": { + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hermes-profile-transformer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hunspell-spellchecker": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hunspell-spellchecker/-/hunspell-spellchecker-1.0.2.tgz", + "integrity": "sha512-4DwmFAvlz+ChsqLDsZT2cwBsYNXh+oWboemxXtafwKIyItq52xfR4e4kr017sLAoPaSYVofSOvPUfmOAhXyYvw==", + "dev": true, + "bin": { + "hunspell-tojson": "bin/hunspell-tojson.js" + } + }, + "node_modules/i18n-js": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-4.3.2.tgz", + "integrity": "sha512-n8gbEbQEueym2/q2yrZk5/xKWjFcKtg3/Escw4JHSVWa8qtKqP8j7se3UjkRbHlO/REqFA0V/MG1q8tEfyHeOA==", + "dependencies": { + "bignumber.js": "*", + "lodash": "*", + "make-plural": "*" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-generator": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz", + "integrity": "sha512-G56jBpbJeg7ds83HW1LuShNs8J73Fv3CPz/bmROHOHlnKkN8sWb9ujiagjmxxMUywftgq48HlBZELKKqFLk0oA==", + "dev": true + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", + "dev": true + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jetifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-2.0.0.tgz", + "integrity": "sha512-J4Au9KuT74te+PCCCHKgAjyLlEa+2VyIAEPNCdE5aNkAJ6FAJcAqcdzEkSnzNksIa9NkGmC4tPiClk2e7tCJuQ==", + "dev": true, + "bin": { + "jetifier": "bin/jetify", + "jetifier-standalone": "bin/jetifier-standalone", + "jetify": "bin/jetify" + } + }, + "node_modules/joi": { + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-base64": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", + "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==", + "dev": true + }, + "node_modules/js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/js-queue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", + "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", + "dev": true, + "dependencies": { + "easy-stack": "^1.0.1" + }, + "engines": { + "node": ">=1.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jsc-android": { + "version": "250231.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", + "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==" + }, + "node_modules/jsc-safe-url": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==" + }, + "node_modules/jscodeshift": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", + "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", + "dependencies": { + "@babel/core": "^7.13.16", + "@babel/parser": "^7.13.16", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/preset-flow": "^7.13.13", + "@babel/preset-typescript": "^7.13.0", + "@babel/register": "^7.13.16", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.21.0", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/jscodeshift/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jscodeshift/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jscodeshift/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jscodeshift/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jscodeshift/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jscodeshift/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jscodeshift/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-cycle": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.5.0.tgz", + "integrity": "sha512-GOehvd5PO2FeZ5T4c+RxobeT5a1PiGpF4u9/3+UvrMU4bhnVqzJY7hm39wg8PDCqkU91fWGH8qjWR4bn+wgq9w==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stable-stringify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.0.tgz", + "integrity": "sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json-stable-stringify/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jsprim/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/jsprim/node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/knuth-shuffle-seeded": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz", + "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==", + "dev": true, + "dependencies": { + "seed-random": "~2.2.0" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==", + "dev": true, + "bin": { + "lcov-parse": "bin/cli.js" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true, + "engines": { + "node": ">=0.8.6" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", + "dependencies": { + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" + }, + "bin": { + "logkitty": "bin/logkitty.js" + } + }, + "node_modules/logkitty/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/logkitty/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/logkitty/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/logkitty/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/logkitty/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/logkitty/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/logkitty/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/logkitty/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-plural": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz", + "integrity": "sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw==" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/metro": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.76.8.tgz", + "integrity": "sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "accepts": "^1.3.7", + "async": "^3.2.2", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.12.0", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^27.2.0", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.76.8", + "metro-cache": "0.76.8", + "metro-cache-key": "0.76.8", + "metro-config": "0.76.8", + "metro-core": "0.76.8", + "metro-file-map": "0.76.8", + "metro-inspector-proxy": "0.76.8", + "metro-minify-terser": "0.76.8", + "metro-minify-uglify": "0.76.8", + "metro-react-native-babel-preset": "0.76.8", + "metro-resolver": "0.76.8", + "metro-runtime": "0.76.8", + "metro-source-map": "0.76.8", + "metro-symbolicate": "0.76.8", + "metro-transform-plugins": "0.76.8", + "metro-transform-worker": "0.76.8", + "mime-types": "^2.1.27", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "rimraf": "^3.0.2", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^6.0.0", + "throat": "^5.0.0", + "ws": "^7.5.1", + "yargs": "^17.6.2" + }, + "bin": { + "metro": "src/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.76.8.tgz", + "integrity": "sha512-Hh6PW34Ug/nShlBGxkwQJSgPGAzSJ9FwQXhUImkzdsDgVu6zj5bx258J8cJVSandjNoQ8nbaHK6CaHlnbZKbyA==", + "dependencies": { + "@babel/core": "^7.20.0", + "hermes-parser": "0.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-cache": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.76.8.tgz", + "integrity": "sha512-QBJSJIVNH7Hc/Yo6br/U/qQDUpiUdRgZ2ZBJmvAbmAKp2XDzsapnMwK/3BGj8JNWJF7OLrqrYHsRsukSbUBpvQ==", + "dependencies": { + "metro-core": "0.76.8", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-cache-key": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.76.8.tgz", + "integrity": "sha512-buKQ5xentPig9G6T37Ww/R/bC+/V1MA5xU/D8zjnhlelsrPG6w6LtHUS61ID3zZcMZqYaELWk5UIadIdDsaaLw==", + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-config": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.76.8.tgz", + "integrity": "sha512-SL1lfKB0qGHALcAk2zBqVgQZpazDYvYFGwCK1ikz0S6Y/CM2i2/HwuZN31kpX6z3mqjv/6KvlzaKoTb1otuSAA==", + "dependencies": { + "connect": "^3.6.5", + "cosmiconfig": "^5.0.5", + "jest-validate": "^29.2.1", + "metro": "0.76.8", + "metro-cache": "0.76.8", + "metro-core": "0.76.8", + "metro-runtime": "0.76.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-core": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.76.8.tgz", + "integrity": "sha512-sl2QLFI3d1b1XUUGxwzw/KbaXXU/bvFYrSKz6Sg19AdYGWFyzsgZ1VISRIDf+HWm4R/TJXluhWMEkEtZuqi3qA==", + "dependencies": { + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.76.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-file-map": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.76.8.tgz", + "integrity": "sha512-A/xP1YNEVwO1SUV9/YYo6/Y1MmzhL4ZnVgcJC3VmHp/BYVOXVStzgVbWv2wILe56IIMkfXU+jpXrGKKYhFyHVw==", + "dependencies": { + "anymatch": "^3.0.3", + "debug": "^2.2.0", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.2.0", + "jest-worker": "^27.2.0", + "micromatch": "^4.0.4", + "node-abort-controller": "^3.1.1", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/metro-file-map/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/metro-file-map/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/metro-file-map/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/metro-file-map/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/metro-file-map/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/metro-file-map/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/metro-file-map/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro-file-map/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-file-map/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/metro-file-map/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/metro-file-map/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/metro-file-map/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/metro-file-map/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/metro-file-map/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-inspector-proxy": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.76.8.tgz", + "integrity": "sha512-Us5o5UEd4Smgn1+TfHX4LvVPoWVo9VsVMn4Ldbk0g5CQx3Gu0ygc/ei2AKPGTwsOZmKxJeACj7yMH2kgxQP/iw==", + "dependencies": { + "connect": "^3.6.5", + "debug": "^2.2.0", + "node-fetch": "^2.2.0", + "ws": "^7.5.1", + "yargs": "^17.6.2" + }, + "bin": { + "metro-inspector-proxy": "src/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-inspector-proxy/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro-inspector-proxy/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/metro-minify-terser": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.76.8.tgz", + "integrity": "sha512-Orbvg18qXHCrSj1KbaeSDVYRy/gkro2PC7Fy2tDSH1c9RB4aH8tuMOIXnKJE+1SXxBtjWmQ5Yirwkth2DyyEZA==", + "dependencies": { + "terser": "^5.15.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-minify-uglify": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.76.8.tgz", + "integrity": "sha512-6l8/bEvtVaTSuhG1FqS0+Mc8lZ3Bl4RI8SeRIifVLC21eeSDp4CEBUWSGjpFyUDfi6R5dXzYaFnSgMNyfxADiQ==", + "dependencies": { + "uglify-es": "^3.1.9" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-react-native-babel-preset": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.8.tgz", + "integrity": "sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.18.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", + "@babel/plugin-proposal-numeric-separator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.20.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.20.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.20.0", + "@babel/plugin-transform-flow-strip-types": "^7.20.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.4.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/metro-react-native-babel-transformer": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.8.tgz", + "integrity": "sha512-3h+LfS1WG1PAzhq8QF0kfXjxuXetbY/lgz8vYMQhgrMMp17WM1DNJD0gjx8tOGYbpbBC1qesJ45KMS4o5TA73A==", + "dependencies": { + "@babel/core": "^7.20.0", + "babel-preset-fbjs": "^3.4.0", + "hermes-parser": "0.12.0", + "metro-react-native-babel-preset": "0.76.8", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/metro-resolver": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.76.8.tgz", + "integrity": "sha512-KccOqc10vrzS7ZhG2NSnL2dh3uVydarB7nOhjreQ7C4zyWuiW9XpLC4h47KtGQv3Rnv/NDLJYeDqaJ4/+140HQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-runtime": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.8.tgz", + "integrity": "sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-source-map": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.8.tgz", + "integrity": "sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.76.8", + "nullthrows": "^1.1.1", + "ob1": "0.76.8", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-symbolicate": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.76.8.tgz", + "integrity": "sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==", + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.76.8", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-symbolicate/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.76.8.tgz", + "integrity": "sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.76.8.tgz", + "integrity": "sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "babel-preset-fbjs": "^3.4.0", + "metro": "0.76.8", + "metro-babel-transformer": "0.76.8", + "metro-cache": "0.76.8", + "metro-cache-key": "0.76.8", + "metro-source-map": "0.76.8", + "metro-transform-plugins": "0.76.8", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/metro/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/metro/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/metro/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/metro/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/metro/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/metro/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/metro/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/metro/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/metro/node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==", + "dependencies": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-object/node_modules/for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multi-sort-stream": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multi-sort-stream/-/multi-sort-stream-1.0.4.tgz", + "integrity": "sha512-hAZ8JOEQFbgdLe8HWZbb7gdZg0/yAIHF00Qfo3kd0rXFv96nXe+/bPTrKHZ2QMHugGX4FiAyET1Lt+jiB+7Qlg==", + "dev": true + }, + "node_modules/multipipe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-4.0.0.tgz", + "integrity": "sha512-jzcEAzFXoWwWwUbvHCNPwBlTz3WCWe/jPcXSmTfbo/VjRwRTfvLZ/bdvtiTdqCe8d4otCSsPCbhGYcX+eggpKQ==", + "dev": true, + "dependencies": { + "duplexer2": "^0.1.2", + "object-assign": "^4.1.0" + } + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "dev": true, + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "dev": true, + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "dev": true, + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "dev": true, + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/nocache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", + "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/node-abi": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.52.0.tgz", + "integrity": "sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + }, + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", + "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-ipc": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.2.1.tgz", + "integrity": "sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==", + "dev": true, + "dependencies": { + "event-pubsub": "4.3.0", + "js-message": "1.0.7", + "js-queue": "2.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==" + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, + "node_modules/node-version": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", + "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ob1": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.8.tgz", + "integrity": "sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==", + "engines": { + "node": ">=16" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pad-right": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", + "integrity": "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==", + "dev": true, + "dependencies": { + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/patch-package/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/patch-package/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/patch-package/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/patch-package/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/patch-package/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/patch-package/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/patch-package/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/patch-package/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/patch-package/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/patch-package/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", + "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pem": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/pem/-/pem-1.14.8.tgz", + "integrity": "sha512-ZpbOf4dj9/fQg5tQzTqv4jSKJQsK7tPl0pm4/pvPcZVjZcJg7TMfr3PBk6gJH97lnpJDu4e4v8UUqEz5daipCg==", + "dev": true, + "dependencies": { + "es6-promisify": "^7.0.0", + "md5": "^2.3.0", + "os-tmpdir": "^1.0.2", + "which": "^2.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/pem/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-4.0.0.tgz", + "integrity": "sha512-N4zdA4sfOe6yCv+ulPCmpnIBQ5I60xfhDr1otdBBhKte9QtEf3bhfrfkW7dTb+IQ0iEx4ZDzas0kc1o5rdWpYg==", + "dev": true, + "dependencies": { + "find-up": "^6.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-up/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/promise-polyfill": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", + "integrity": "sha512-g0LWaH0gFsxovsU7R5LrrhHhWAWiHRnh1GPrhXnPgYsDkIqjRYUYSZEsej/wtleDrz5xVSIDbeKfidztp2XHFQ==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/proper-lockfile": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-3.2.0.tgz", + "integrity": "sha512-iMghHHXv2bsxl6NchhEaFck8tvX3F9cknEEh1SUpguUOBjN7PAAW9BLzmbc1g/mCD1gY3EE2EABBHPJfFdHFmA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-cosmos": { + "version": "6.0.0-beta.6", + "resolved": "https://registry.npmjs.org/react-cosmos/-/react-cosmos-6.0.0-beta.6.tgz", + "integrity": "sha512-dhzxa78JSXQhY5Cpb+W5SMJVYxTEW0P5gkBaAfL2nRTkofKy/PBLUJB20Y5rglSMKdGlhOS3wmjF4IFknhQ9Uw==", + "dev": true, + "dependencies": { + "@skidding/launch-editor": "^2.2.3", + "chokidar": "^3.5.3", + "express": "^4.18.2", + "glob": "^10.2.2", + "http-proxy-middleware": "^2.0.6", + "lodash-es": "^4.17.21", + "micromatch": "^4.0.5", + "open": "^8.4.2", + "pem": "^1.14.7", + "pkg-up": "^4.0.0", + "react-cosmos-core": "6.0.0-beta.5", + "react-cosmos-renderer": "6.0.0-beta.5", + "react-cosmos-ui": "6.0.0-beta.6", + "ws": "^8.13.0", + "yargs": "^17.7.2" + }, + "bin": { + "cosmos": "bin/cosmos.js", + "cosmos-export": "bin/cosmos-export.js", + "cosmos-native": "bin/cosmos-native.js" + } + }, + "node_modules/react-cosmos-core": { + "version": "6.0.0-beta.5", + "resolved": "https://registry.npmjs.org/react-cosmos-core/-/react-cosmos-core-6.0.0-beta.5.tgz", + "integrity": "sha512-6htNpF6YGQZIAWMRa+XZ9ltpIzIt0L2ZrrO+yXuTYH/OfQnvBb9awLvha/XT290KX/LVhKl+H95dMqBMuEENRA==", + "dev": true, + "dependencies": { + "js-base64": "^3.7.5", + "lodash-es": "^4.17.21", + "react-is": "^18.2.0" + } + }, + "node_modules/react-cosmos-native": { + "version": "6.0.0-beta.6", + "resolved": "https://registry.npmjs.org/react-cosmos-native/-/react-cosmos-native-6.0.0-beta.6.tgz", + "integrity": "sha512-sd7WkXg2AUfwcMH8CzwMZRv4qL2Wwa9dEuObKF8owlLzHwduZZbUZ10DovyAq/PYbiX9kYvpq9cFGisEr30jDQ==", + "dev": true, + "dependencies": { + "react-cosmos-core": "6.0.0-beta.5", + "react-cosmos-renderer": "6.0.0-beta.5" + } + }, + "node_modules/react-cosmos-renderer": { + "version": "6.0.0-beta.5", + "resolved": "https://registry.npmjs.org/react-cosmos-renderer/-/react-cosmos-renderer-6.0.0-beta.5.tgz", + "integrity": "sha512-8ZO7qg84TVW0qbRuMsQodLoKUxtkza0a2Vz+/bojekNZIG+CEHNNFgIHsXLSDrg2vlT97rLnrBaAoGUvLikouA==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.21", + "react-cosmos-core": "6.0.0-beta.5", + "react-is": "^18.2.0" + } + }, + "node_modules/react-cosmos-ui": { + "version": "6.0.0-beta.6", + "resolved": "https://registry.npmjs.org/react-cosmos-ui/-/react-cosmos-ui-6.0.0-beta.6.tgz", + "integrity": "sha512-zk11mp1UiHmR2TxSTp5moox6dRea1EoWYhKjOb6zG9gfwZ3/FQfzHfarr4ShkmZEynBk5fTvfev4t/HPKbjGcg==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.21", + "react-cosmos-core": "6.0.0-beta.5" + } + }, + "node_modules/react-cosmos/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/react-cosmos/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-cosmos/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-cosmos/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-cosmos/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-cosmos/node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/react-devtools-core": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz", + "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-lifecycles-compat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-2.0.0.tgz", + "integrity": "sha512-txfpPCQYiazVdcbMRhatqWKcAxJweUu2wDXvts5/7Wyp6+Y9cHojqXHsLPEckzutfHlxZhG8Oiundbmp8Fd6eQ==" + }, + "node_modules/react-native": { + "version": "0.72.7", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.72.7.tgz", + "integrity": "sha512-dqVFojOO9rOvyFbbM3/v9/GJR355OSuBhEY4NQlMIRc2w0Xch5MT/2uPoq3+OvJ+5h7a8LFAco3fucSffG0FbA==", + "dependencies": { + "@jest/create-cache-key-function": "^29.2.1", + "@react-native-community/cli": "11.3.10", + "@react-native-community/cli-platform-android": "11.3.10", + "@react-native-community/cli-platform-ios": "11.3.10", + "@react-native/assets-registry": "^0.72.0", + "@react-native/codegen": "^0.72.7", + "@react-native/gradle-plugin": "^0.72.11", + "@react-native/js-polyfills": "^0.72.1", + "@react-native/normalize-colors": "^0.72.0", + "@react-native/virtualized-lists": "^0.72.8", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "base64-js": "^1.1.2", + "deprecated-react-native-prop-types": "^4.2.3", + "event-target-shim": "^5.0.1", + "flow-enums-runtime": "^0.0.5", + "invariant": "^2.2.4", + "jest-environment-node": "^29.2.1", + "jsc-android": "^250231.0.0", + "memoize-one": "^5.0.0", + "metro-runtime": "0.76.8", + "metro-source-map": "0.76.8", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "pretty-format": "^26.5.2", + "promise": "^8.3.0", + "react-devtools-core": "^4.27.2", + "react-refresh": "^0.4.0", + "react-shallow-renderer": "^16.15.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.24.0-canary-efb381bbf-20230505", + "stacktrace-parser": "^0.1.10", + "use-sync-external-store": "^1.0.0", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.2", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-native-camera": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-native-camera/-/react-native-camera-4.2.1.tgz", + "integrity": "sha512-+Vkql24PFYQfsPRznJCvPwJQfyzCnjlcww/iZ4Ej80bgivKjL9eU0IMQIXp4yi6XCrKi4voWXxIDPMupQZKeIQ==", + "dependencies": { + "prop-types": "^15.6.2" + } + }, + "node_modules/react-native-interactable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-native-interactable/-/react-native-interactable-2.0.1.tgz", + "integrity": "sha512-b5Mej8JnW9+q/hf+6bxWsKIX4E1rjILBgPnyYFIaEhJZGrZeu5jxENvw3+Q7t43ARp1wJIZZGfilVoFmwtgOdw==", + "peerDependencies": { + "react": ">= 15.4.1", + "react-native": ">= 0.40.0" + } + }, + "node_modules/react-native-navigation": { + "version": "7.37.0", + "resolved": "https://registry.npmjs.org/react-native-navigation/-/react-native-navigation-7.37.0.tgz", + "integrity": "sha512-z2NFYpFC2fjEc+os5EBDfzAC78ASL51CKtFY8nSVEzvpMbd+BMtUI4lu5O/4MUdqVrRwnQU15mepPKMYno0q+A==", + "dependencies": { + "hoist-non-react-statics": "3.x.x", + "lodash": "4.17.x", + "prop-types": "15.x.x", + "react-lifecycles-compat": "2.0.0", + "tslib": "1.9.3" + }, + "bin": { + "rnn-link": "autolink/postlink/run.js" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "remx": "*" + }, + "peerDependenciesMeta": { + "remx": { + "optional": true + } + } + }, + "node_modules/react-native/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/react-native/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/react-native/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-native/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-native/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-native/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/react-native/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/react-native/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-native/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", + "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-shallow-renderer": { + "version": "16.15.0", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", + "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-test-renderer": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.2.0.tgz", + "integrity": "sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==", + "dev": true, + "dependencies": { + "react-is": "^18.2.0", + "react-shallow-renderer": "^16.15.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-test-renderer/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" + }, + "node_modules/realm": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/realm/-/realm-12.3.1.tgz", + "integrity": "sha512-SZOpIf5O9aJ8jwSmeDv9OFYRaTuIlH2EpsXLkONgehJ7KZNArsRUrK21p+YSKPovQHsGN7yAUW3e/kssq8T2XA==", + "hasInstallScript": true, + "dependencies": { + "bson": "^4.7.2", + "debug": "^4.3.4", + "node-fetch": "^2.6.9", + "node-machine-id": "^1.1.12", + "prebuild-install": "^7.1.1" + }, + "peerDependencies": { + "react-native": ">=0.71.0" + }, + "peerDependenciesMeta": { + "react-native": { + "optional": true + } + } + }, + "node_modules/recast": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", + "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", + "dependencies": { + "ast-types": "0.15.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requireindex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", + "integrity": "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==", + "dev": true, + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/ripple-address-codec": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.1.tgz", + "integrity": "sha512-Qa3+9wKVvpL/xYtT6+wANsn0A1QcC5CT6IMZbRJZ/1lGt7gmwIfsrCuz1X0+LCEO7zgb+3UT1I1dc0k/5dwKQQ==", + "dependencies": { + "base-x": "^3.0.9", + "create-hash": "^1.1.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-binary-codec": { + "name": "xrpl-binary-codec-prerelease", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/xrpl-binary-codec-prerelease/-/xrpl-binary-codec-prerelease-7.0.1.tgz", + "integrity": "sha512-IOIWUTkCyeYWReT6hn/2ONMpk0FNk1mltqQjpl7n2cfCuxJwSxwk+J4fi5s0cExNJSFT1aUhRSgDQLOtCBo2hQ==", + "dependencies": { + "assert": "^2.0.0", + "big-integer": "^1.6.48", + "buffer": "6.0.3", + "create-hash": "^1.2.0", + "decimal.js": "^10.2.0", + "ripple-address-codec": "^4.3.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-binary-codec/node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/ripple-binary-codec/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/ripple-binary-codec/node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/ripple-keypairs": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.1.tgz", + "integrity": "sha512-dmPlraWKJciFJxHcoubDahGnoIalG5e/BtV6HNDUs7wLXmtnLMHt6w4ed9R8MTL2zNrVPiIdI/HCtMMo0Tm7JQ==", + "dependencies": { + "bn.js": "^5.1.1", + "brorand": "^1.0.5", + "elliptic": "^6.5.4", + "hash.js": "^1.0.3", + "ripple-address-codec": "^4.3.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-secret-codec": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ripple-secret-codec/-/ripple-secret-codec-1.0.3.tgz", + "integrity": "sha512-vYcHlJx1p+5uH4ORda2dlvbgCy68m/Ib2kn+Np6PMmRoBenf9pKHa4vzaWmp2SjJKPi1921lQjdeAWoXdm7E0g==", + "dependencies": { + "base-x": "^3.0.3", + "bignumber.js": "^5.0.0" + } + }, + "node_modules/ripple-secret-codec/node_modules/bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-KWTu6ZMVk9sxlDJQh2YH1UOnfDP8O8TpxUxgQG/vKASoSnEjK9aVuOueFaPcQEYQ5fyNXNTOYwYw3099RYebWg==", + "engines": { + "node": "*" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "dev": true, + "optional": true + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.24.0-canary-efb381bbf-20230505", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", + "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-error": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-4.1.0.tgz", + "integrity": "sha512-5j9GgyGsP9vV9Uj1S0lDCvlsd+gc2LEPVK7HHHte7IyPwOD4lVQFeaX143gx3U5AnoCi+wbcb3mvaxVysjpxEw==", + "dev": true, + "dependencies": { + "type-fest": "^0.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-chain": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-2.0.0.tgz", + "integrity": "sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg==", + "dev": true + }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "dev": true + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-json": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.8.0.tgz", + "integrity": "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==", + "dev": true, + "dependencies": { + "stream-chain": "^2.2.5" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" + }, + "node_modules/superstruct": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.6.2.tgz", + "integrity": "sha512-lvA97MFAJng3rfjcafT/zGTSWm6Tbpk++DP6It4Qg7oNaeM+2tdJMuVgGje21/bIpBEs6iQql1PJH6dKTjl4Ig==", + "dependencies": { + "clone-deep": "^2.0.1", + "kind-of": "^6.0.1" + } + }, + "node_modules/superstruct/node_modules/clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dependencies": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superstruct/node_modules/shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dependencies": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superstruct/node_modules/shallow-clone/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz", + "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.4.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/synckit/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tangem-sdk-react-native": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tangem-sdk-react-native/-/tangem-sdk-react-native-2.3.1.tgz", + "integrity": "sha512-J7qx626jgfHhdEPSNwpDz6kUpI9Z/VYMb9U0V7t1e5TomsR+/B9pyJMftdb05GhJxFflCaydIGStW8cDhZ1WNw==", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/telnet-client": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-1.2.8.tgz", + "integrity": "sha512-W+w4k3QAmULVNhBVT2Fei369kGZCh/TH25M7caJAXW+hLxwoQRuw0di3cX4l0S9fgH3Mvq7u+IFMoBDpEw/eIg==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.4" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + } + }, + "node_modules/temp": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "dependencies": { + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==", + "dev": true, + "dependencies": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tempfile/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/terser": { + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.25.0.tgz", + "integrity": "sha512-we0I9SIsfvNUMP77zC9HG+MylwYYsGFSBG8qm+13oud2Yh+O104y614FRbyjpxys16jZwot72Fpi827YvGzuqg==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tiny-secp256k1": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", + "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tiny-secp256k1/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tr46/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/trace-event-lib": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/trace-event-lib/-/trace-event-lib-1.4.1.tgz", + "integrity": "sha512-TOgFolKG8JFY+9d5EohGWMvwvteRafcyfPWWNIqcuD1W/FUvxWcy2MSCZ/beYHM63oYPHYHCd3tkbgCctHVP7w==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", + "dependencies": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-es/node_modules/commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, + "node_modules/url/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "dev": true + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-arity": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", + "integrity": "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" + }, + "node_modules/whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", + "dependencies": { + "bs58check": "<3.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xregexp": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.4.1.tgz", + "integrity": "sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==", + "dev": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.12.1" + } + }, + "node_modules/xrpl-accountlib": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/xrpl-accountlib/-/xrpl-accountlib-3.2.1.tgz", + "integrity": "sha512-6jFuzuc7N6tTj0xImpzEaYihWNgtzeBGyRVIjwlBHq5GU6w2BwQZbrLWdJds7CJOGgrDNouWfAT8C2ES5w0lqA==", + "dependencies": { + "assert": "^2.0.0", + "bip32": "^2.0.6", + "bip39": "^3.0.4", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "^1.1.7", + "lodash": "^4.17.21", + "ripple-address-codec": "^4.2.5", + "ripple-keypairs": "^1.1.4", + "ripple-secret-codec": "^1.0.3", + "xrpl-binary-codec-prerelease": "^7.0.1", + "xrpl-client": "^2.3.0", + "xrpl-secret-numbers": "^0.3.3", + "xrpl-sign-keypairs": "^2.5.0" + } + }, + "node_modules/xrpl-accountlib/node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/xrpl-accountlib/node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/xrpl-binary-codec-prerelease": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/xrpl-binary-codec-prerelease/-/xrpl-binary-codec-prerelease-7.0.1.tgz", + "integrity": "sha512-IOIWUTkCyeYWReT6hn/2ONMpk0FNk1mltqQjpl7n2cfCuxJwSxwk+J4fi5s0cExNJSFT1aUhRSgDQLOtCBo2hQ==", + "dependencies": { + "assert": "^2.0.0", + "big-integer": "^1.6.48", + "buffer": "6.0.3", + "create-hash": "^1.2.0", + "decimal.js": "^10.2.0", + "ripple-address-codec": "^4.3.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/xrpl-binary-codec-prerelease/node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/xrpl-binary-codec-prerelease/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/xrpl-binary-codec-prerelease/node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/xrpl-client": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/xrpl-client/-/xrpl-client-2.3.1.tgz", + "integrity": "sha512-UyeYZvewX+n+OHpb1W7zutHWfS75Z45Ltz15OOMNhmxFnBPRbJJ0sMQRtk6jVoxuF7Id8kZ85IwifqKNByyMWw==", + "dependencies": { + "debug": "^4.1.1", + "websocket": "^1.0.34" + } + }, + "node_modules/xrpl-orderbook-reader": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/xrpl-orderbook-reader/-/xrpl-orderbook-reader-0.4.0.tgz", + "integrity": "sha512-b2qWucqXBCL+p8LIjedBgBbP6L9ZLp3Ux/glImpbECIbqXKU0BiEhDon3xI/E586H+Gt05Sz6hRfmpvpmZUIiw==", + "dependencies": { + "@types/debug": "^4.1.5", + "assert": "^2.0.0", + "bignumber.js": "^9.0.0", + "debug": "^4.1.1" + } + }, + "node_modules/xrpl-orderbook-reader/node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/xrpl-orderbook-reader/node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/xrpl-secret-numbers": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/xrpl-secret-numbers/-/xrpl-secret-numbers-0.3.4.tgz", + "integrity": "sha512-B3m0OLRsmNLQpN/BUR15+LC4yejM/pdneoWgijfBYbgjVVnpyCF5+Ur7zbAs4nCAlBUZYXnxp+o/rSNZkke9jQ==", + "dependencies": { + "@types/brorand": "^1.0.30", + "brorand": "^1.1.0", + "ripple-keypairs": "^1.1.5" + } + }, + "node_modules/xrpl-sign-keypairs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xrpl-sign-keypairs/-/xrpl-sign-keypairs-2.5.0.tgz", + "integrity": "sha512-chcO69Aao1lN54ypdmZ3HQOculTf8DaqzSULnPHS1ivsufk/iz7Fa2rg1//cgJx+bYvvV9y9xP6E55S6YBEZ0Q==", + "dependencies": { + "big-integer": "^1.6.51", + "ripple-address-codec": "^4.2.4", + "ripple-keypairs": "^1.1.4", + "xrpl-binary-codec-prerelease": "^7.0.1" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/xumm-string-decode": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xumm-string-decode/-/xumm-string-decode-0.6.2.tgz", + "integrity": "sha512-RHhCZUSmv1zPaTx4TeCiUkWQYLX4uGzJDVl3SdrestYqtz4cZBf6dUOTgvJBRGywqL7QluILlC6t1Rp8uKjG0A==", + "dependencies": { + "@ungap/url-search-params": "^0.1.4", + "debug": "^4.3.1", + "url": "^0.11.0" + }, + "engines": { + "node": ">=8.16.1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index af61d788a..8b1618419 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "xumm", - "version": "2.5.0", + "name": "xaman", + "version": "2.6.0", "license": "SEE LICENSE IN ", "scripts": { "start": "node node_modules/react-native/local-cli/cli.js start", @@ -8,36 +8,36 @@ "validate": "eslint --ignore-path .gitignore --ignore-pattern node_modules --quiet . && yarn run tsc", "tsc": "NODE_OPTIONS=--max_old_space_size=12000 tsc --noEmit", "test": "jest --forceExit --detectOpenHandles", + "sync-locals": "node scripts/sync-locales.js sync", "update-snapshots": "jest --updateSnapshot", - "storybook": "start-storybook -p 7007", - "postinstall": "make post-install" + "postinstall": "make post-install", + "cosmos": "cosmos-native --config .cosmos/cosmos.config.json" }, "dependencies": { - "@react-native-community/netinfo": "9.3.6", - "@react-native-firebase/analytics": "17.3.0", - "@react-native-firebase/app": "17.3.0", - "@react-native-firebase/crashlytics": "17.3.0", - "@react-native-firebase/messaging": "17.3.0", - "@veriff/react-native-sdk": "4.0.0", - "bignumber.js": "9.1.1", + "@react-native-community/netinfo": "11.1.0", + "@react-native-firebase/analytics": "18.6.2", + "@react-native-firebase/app": "18.6.2", + "@react-native-firebase/crashlytics": "18.6.2", + "@react-native-firebase/messaging": "18.6.2", + "@veriff/react-native-sdk": "5.1.0", + "bignumber.js": "9.1.2", "fuse.js": "6.6.2", - "i18n-js": "4.2.2", + "i18n-js": "4.3.2", "lodash": "4.17.21", "moment-timezone": "0.5.43", "node-libs-browser": "2.2.1", "react": "18.2.0", - "react-native": "0.71.7", + "react-native": "0.72.7", "react-native-camera": "4.2.1", "react-native-interactable": "2.0.1", - "react-native-navigation": "7.32.1", - "realm": "11.8.0", - "ripple-address-codec": "4.2.4", - "ripple-binary-codec": "1.4.3", + "react-native-navigation": "7.37.0", + "realm": "12.3.1", + "ripple-binary-codec": "npm:xrpl-binary-codec-prerelease@7.0.1", "tangem-sdk-react-native": "2.3.1", - "uuid": "9.0.0", - "xrpl-accountlib": "2.0.3", - "xrpl-client": "2.0.11", - "xrpl-orderbook-reader": "0.3.3", + "uuid": "9.0.1", + "xrpl-accountlib": "3.2.1", + "xrpl-client": "2.3.1", + "xrpl-orderbook-reader": "0.4.0", "xumm-string-decode": "0.6.2" }, "devDependencies": { @@ -45,52 +45,49 @@ "@babel/plugin-transform-runtime": "7.19.6", "@babel/preset-env": "7.20.2", "@babel/runtime": "7.20.13", - "@storybook/addon-actions": "6.5.16", - "@storybook/addon-links": "6.5.16", - "@storybook/addon-ondevice-actions": "5.3.23", - "@storybook/addon-storyshots": "6.5.16", - "@storybook/addons": "6.5.16", - "@storybook/react-native": "5.3.27", - "@storybook/react-native-server": "5.3.23", + "@react-native/metro-config": "0.72.11", "@types/detox": "18.1.0", - "@types/i18n-js": "3.8.4", - "@types/jest": "29.4.0", - "@types/lodash": "4.14.191", - "@types/react": "18.0.27", - "@types/react-native": "0.71.3", - "@types/react-test-renderer": "18.0.0", - "@types/uuid": "9.0.0", - "@typescript-eslint/eslint-plugin": "5.49.0", - "@typescript-eslint/parser": "5.49.0", - "babel-jest": "29.4.1", - "babel-loader": "9.1.2", + "@types/i18n-js": "3.8.5", + "@types/jest": "29.5.5", + "@types/lodash": "4.14.199", + "@types/react": "18.2.23", + "@types/react-native": "0.72.2", + "@types/react-test-renderer": "18.0.3", + "@types/uuid": "9.0.4", + "@typescript-eslint/eslint-plugin": "6.7.2", + "@typescript-eslint/parser": "6.7.2", + "babel-jest": "29.7.0", "babel-plugin-rewrite-require": "1.14.5", "babel-plugin-transform-remove-console": "6.9.4", "coveralls": "3.1.1", "cucumber": "6.0.7", - "detox": "20.1.2", - "eslint": "8.33.0", + "detox": "20.12.1", + "eslint": "8.50.0", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-base": "15.0.0", - "eslint-config-prettier": "8.6.0", - "eslint-import-resolver-typescript": "3.5.3", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-jest": "27.2.1", + "eslint-config-prettier": "9.0.0", + "eslint-import-resolver-typescript": "3.6.1", + "eslint-plugin-import": "2.28.1", + "eslint-plugin-jest": "27.4.0", "eslint-plugin-jsx-a11y": "6.7.1", - "eslint-plugin-prettier": "4.2.1", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-native": "4.0.0", + "eslint-plugin-prettier": "5.0.0", + "eslint-plugin-react": "7.33.2", + "eslint-plugin-react-native": "4.1.0", "eslint-plugin-spellcheck": "0.0.20", "eslint-plugin-typescript": "0.14.0", "fetch-mock": "9.11.0", - "jest": "29.4.1", + "jest": "29.7.0", "jetifier": "2.0.0", - "metro-react-native-babel-preset": "0.73.5", - "patch-package": "7.0.0", - "prettier": "2.8.3", - "react-dom": "18.2.0", + "metro-react-native-babel-preset": "0.76.8", + "patch-package": "8.0.0", + "prettier": "3.0.3", + "react-cosmos": "6.0.0-beta.6", + "react-cosmos-native": "6.0.0-beta.6", "react-test-renderer": "18.2.0", - "ts-jest": "29.0.5", - "typescript": "4.9.4" + "ts-jest": "29.1.1", + "typescript": "5.2.2" + }, + "engines": { + "node": ">=16" } } diff --git a/patches/@react-native-firebase+messaging+17.3.0.patch b/patches/@react-native-firebase+messaging+18.6.2.patch similarity index 100% rename from patches/@react-native-firebase+messaging+17.3.0.patch rename to patches/@react-native-firebase+messaging+18.6.2.patch diff --git a/patches/react-native+0.71.3.patch b/patches/react-native+0.71.3.patch deleted file mode 100644 index 0b5eab536..000000000 --- a/patches/react-native+0.71.3.patch +++ /dev/null @@ -1,47 +0,0 @@ -diff --git a/node_modules/react-native/Libraries/Network/RCTNetworking.mm b/node_modules/react-native/Libraries/Network/RCTNetworking.mm -index 24c1752..29afd81 100644 ---- a/node_modules/react-native/Libraries/Network/RCTNetworking.mm -+++ b/node_modules/react-native/Libraries/Network/RCTNetworking.mm -@@ -552,6 +552,15 @@ - (void)sendRequest:(NSURLRequest *)request - responseSender:(RCTResponseSenderBlock)responseSender - { - RCTAssertThread(_methodQueue, @"sendRequest: must be called on method queue"); -+ #if DEBUG -+ #else -+ // this will force the app to just connect to trusted domains -+ NSArray *allowedEndpoints; -+ allowedEndpoints = [NSArray arrayWithObjects: @"clients3.google.com", @"xumm.app", nil]; -+ NSString* domain = [request.URL host]; -+ -+ NSAssert([allowedEndpoints containsObject: domain], [@"Fetch endpoint have unsecure domain: " stringByAppendingString:domain]); -+ #endif - __weak __typeof(self) weakSelf = self; - __block RCTNetworkTask *task; - RCTURLRequestProgressBlock uploadProgressBlock = ^(int64_t progress, int64_t total) { -diff --git a/node_modules/react-native/Libraries/WebSocket/RCTSRWebSocket.m b/node_modules/react-native/Libraries/WebSocket/RCTSRWebSocket.m -index 925596f..ddcad72 100644 ---- a/node_modules/react-native/Libraries/WebSocket/RCTSRWebSocket.m -+++ b/node_modules/react-native/Libraries/WebSocket/RCTSRWebSocket.m -@@ -236,7 +236,21 @@ - (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *result); + + NSString *const RCTNetworkingPHUploadHackScheme = @"ph-upload"; +@@ -553,6 +556,15 @@ - (void)sendRequest:(NSURLRequest *)request + responseSender:(RCTResponseSenderBlock)responseSender + { + RCTAssertThread(_methodQueue, @"sendRequest: must be called on method queue"); ++ ++ #if DEBUG ++ // Debug build, skip the check ++ #else ++ // Production build, perform the check ++ NSString* host = [request.URL host]; ++ NSAssert([allowedEndpoints containsObject: host], [@"Fetch endpoint have unsecure domain: " stringByAppendingString:domain]); ++ #endif ++ + __weak __typeof(self) weakSelf = self; + __block RCTNetworkTask *task; + RCTURLRequestProgressBlock uploadProgressBlock = ^(int64_t progress, int64_t total) { +diff --git a/node_modules/react-native/React/CoreModules/RCTWebSocketModule.mm b/node_modules/react-native/React/CoreModules/RCTWebSocketModule.mm +index 4451b94..2f68e6f 100644 +--- a/node_modules/react-native/React/CoreModules/RCTWebSocketModule.mm ++++ b/node_modules/react-native/React/CoreModules/RCTWebSocketModule.mm +@@ -16,6 +16,9 @@ + + #import "CoreModulesPlugins.h" + ++// Define the allowed endpoints ++static NSSet *allowedEndpoints = [NSSet setWithObjects:@"xrplcluster.com", @"xahau.network", @"xahau-test.net", @"xrpl.link", @"s2.ripple.com", @"testnet.xrpl-labs.com", @"s.altnet.rippletest.net", @"s.devnet.rippletest.net", @"custom-node.xrpl-labs.com", nil]; ++ + @implementation SRWebSocket (React) + + - (NSNumber *)reactTag +@@ -68,6 +71,19 @@ - (void)invalidate + : (JS::NativeWebSocketModule::SpecConnectOptions &)options socketID + : (double)socketID) + { ++ ++ #if DEBUG ++ // Debug build, skip the check ++ #else ++ // Production build, perform the check ++ NSString *host = [URL host]; ++ if (![allowedEndpoints containsObject:host]) { ++ // Log the denied request for debugging ++ NSLog(@"Request to %@ denied - not in allowed endpoints", host); ++ return; ++ } ++ #endif ++ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; + + // We load cookies from sharedHTTPCookieStorage (shared with XHR and diff --git a/patches/react-native-navigation+7.32.1.patch b/patches/react-native-navigation+7.37.0.patch similarity index 83% rename from patches/react-native-navigation+7.32.1.patch rename to patches/react-native-navigation+7.37.0.patch index 974bad3be..851e3d082 100644 --- a/patches/react-native-navigation+7.32.1.patch +++ b/patches/react-native-navigation+7.37.0.patch @@ -13,7 +13,7 @@ index a34598c..9703957 100644 + } + }); } - + @Override public void onHostResume() { - eventEmitter = new EventEmitter(reactContext); @@ -43,39 +43,12 @@ index a34598c..9703957 100644 } }); } -diff --git a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/utils/MotionEvent.kt b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/utils/MotionEvent.kt -index a79e487..b7af2b3 100644 ---- a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/utils/MotionEvent.kt -+++ b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/utils/MotionEvent.kt -@@ -3,11 +3,20 @@ package com.reactnativenavigation.utils - import android.graphics.Rect - import android.view.MotionEvent - import android.view.View -+import android.view.ViewGroup - - val hitRect = Rect() - - fun MotionEvent.coordinatesInsideView(view: View?): Boolean { - view ?: return false -- view.getHitRect(hitRect) -- return hitRect.contains(x.toInt(), y.toInt()) -+ val viewGroup = (view as ViewGroup).getChildAt(0) as ViewGroup -+ return if (viewGroup.childCount > 0) { -+ val content = viewGroup.getChildAt(0) -+ -+ content.getHitRect(hitRect) -+ -+ hitRect.contains(x.toInt(), y.toInt()) -+ } else { -+ false -+ } - } diff --git a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/utils/SystemUiUtils.kt b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/utils/SystemUiUtils.kt index 89665d1..03eb03f 100644 --- a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/utils/SystemUiUtils.kt +++ b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/utils/SystemUiUtils.kt @@ -25,7 +25,7 @@ object SystemUiUtils { - + @JvmStatic fun getStatusBarHeight(activity: Activity?): Int { - val res = if (statusBarHeight > 0) { @@ -90,7 +63,7 @@ index a9e2c53..7a8096b 100644 @@ -4,7 +4,6 @@ import android.app.Activity; import android.content.res.Configuration; import android.view.View; - + -import com.reactnativenavigation.utils.LogKt; import com.reactnativenavigation.viewcontrollers.viewcontroller.ScrollEventListener; import com.reactnativenavigation.options.Options; @@ -101,7 +74,7 @@ index a9e2c53..7a8096b 100644 import com.reactnativenavigation.viewcontrollers.child.ChildControllersRegistry; -import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController; import com.reactnativenavigation.views.component.ComponentLayout; - + import androidx.annotation.NonNull; @@ -143,6 +141,7 @@ public class ComponentViewController extends ChildController { public int getTopInset() { @@ -112,7 +85,7 @@ index a9e2c53..7a8096b 100644 return statusBarInset + perform; } @@ -155,12 +154,14 @@ public class ComponentViewController extends ChildController { - + @Override protected WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) { + SystemUiUtils.saveStatusBarHeight(insets.getInsetsIgnoringVisibility(WindowInsetsCompat.Type.systemBars()).top); @@ -126,5 +99,5 @@ index a9e2c53..7a8096b 100644 + int systemWindowInsetBottom = insets.getInsets( + WindowInsetsCompat.Type.navigationBars()).bottom - systemBarsInsets.bottom; - + WindowInsetsCompat finalInsets = new WindowInsetsCompat.Builder() diff --git a/scripts/generate-locales.js b/scripts/generate-locales.js deleted file mode 100644 index 48827f5af..000000000 --- a/scripts/generate-locales.js +++ /dev/null @@ -1,187 +0,0 @@ -/* eslint-disable no-undef */ -/* eslint-disable no-loop-func */ -/* eslint-disable no-console */ -const fetch = require('node-fetch'); -const fs = require('fs'); -const path = require('path'); -const assert = require('assert'); -const moment = require('moment/min/moment-with-locales'); - -const translationMeta = {}; - -const LOCALES_DIR = path.join(__dirname, '..', 'src', 'locale'); -const EN_LOCALE_PATH = path.join(LOCALES_DIR, 'en.json'); - -const mergeObjects = (t1, t2) => { - const out = { ...t1 }; - // eslint-disable-next-line guard-for-in - for (const key in t2) { - if (typeof t2[key] === 'object') { - out[key] = mergeObjects(out[key], t2[key]); - } - if (typeof t2[key] === 'string') { - if (key in out) { - if (t2[key] !== out[key]) { - out[key] = t2[key]; - } - } else { - out[key] = t2[key]; - } - } - } - - return out; -}; - -(async () => { - try { - console.log('Updating translations'); - console.log(); - console.log(' - Getting meta'); - const metaCall = await fetch('https://translate.xumm.dev/json/export-meta'); - const meta = await metaCall.json(); - console.log(` > Got ${Object.keys(meta.languages).length} languages`); - const languageValidate = - Object.keys(meta.languages).sort().join(',') === Object.keys(meta['language-local-name']).sort().join(','); - assert(languageValidate, 'Present languages (keys) do not match present language locale names.'); - console.log(` > Got ${Object.keys(meta['language-code-alias']).length} aliased languages`); - - console.log(' - Generating moment locales'); - const momentLocalesCall = await fetch('https://api.github.com/repositories/1424470/contents/src/locale'); - const momentLocalesJson = await momentLocalesCall.json(); - const momentLocalesData = momentLocalesJson.map((l) => l.name.split('.')[0]); - - const momentLocales = Object.keys(meta.languages).reduce((a, b) => { - let resolvedLocale = 'en'; - - if (momentLocalesData.indexOf(b.toLowerCase()) > -1) { - resolvedLocale = b.toLowerCase(); - } else if (momentLocalesData.indexOf(b.split('-')[0].toLowerCase()) > -1) { - resolvedLocale = b.split('-')[0].toLowerCase(); - } else { - // Check alias - const aliasses = Object.keys(meta['language-code-alias']).filter((k) => { - return meta['language-code-alias'][k].toLowerCase() === b.toLowerCase(); - }); - if (aliasses.length > 0) { - aliasses.forEach((al) => { - const alias = al.toLowerCase().replace('_', '-'); - // console.log(alias + ' for ' + b) - if (momentLocalesData.indexOf(alias) > -1) { - resolvedLocale = alias; - } - }); - } - } - - moment.locale(resolvedLocale); - const localeData = moment.localeData(); - - Object.assign(a, { - [b]: Object.keys(localeData).reduce((c, d) => { - if ( - ['RegExp', 'Function'].indexOf(localeData[d].constructor.name) < 0 && - !d.match(/(Parse|Regex)$/) && - d !== '_config' - ) { - if (typeof localeData[d] === 'object' && localeData[d] !== null) { - // Fix RU, LT, CA, ... 'isFormat' RegExp - Object.keys(localeData[d]).forEach((k) => { - if (localeData[d][k].constructor.name === 'RegExp') { - localeData[d][k] = `RegExp(${localeData[d][k]})`; - console.log(' | RegExp replace: ', k, localeData[d][k]); - } - }); - } - Object.assign(c, { - [d.replace(/^_/, '')]: localeData[d], - }); - } - return c; - }, {}), - }); - return a; - }, {}); - - console.log(' - Getting translations & generating output files'); - for await (k of Object.keys(meta.languages)) { - console.log(` - Fetch ${k}`); - const lCall = await fetch(`https://translate.xumm.dev/json/export-generated-lang/code:${k}`); - const json = await lCall.json(); - - const appTranslation = Object.keys(json.translations) - .sort() - .reduce((a, b) => { - const key = b.split('.'); - if (key[0] === 'app') { - Object.assign(a, { - [key[1]]: Object.assign(a[key[1]] || {}, { [key[2]]: json.translations[b] }), - }); - } - return a; - }, {}); - - console.log(` - Write ${k}.json`); - - let fileContents = ''; - - if (k === 'en') { - // merge EN translations - // eslint-disable-next-line import/no-dynamic-require - const currentEN = require(EN_LOCALE_PATH); - const merged = mergeObjects(currentEN, appTranslation); - fileContents = JSON.stringify(merged, null, 2); - } else { - // merge moment translations - Object.assign(appTranslation, { moment: momentLocales[k] }); - fileContents = JSON.stringify(appTranslation, null, 2); - } - - fileContents = fileContents.replace(/"RegExp\(.+\)"/g, (m) => { - return JSON.parse(`"${m.slice(8, -2)}"`); - }); - - fs.writeFile(`${LOCALES_DIR}/${k === 'en' ? '' : 'generated/'}${k}.json`, fileContents, (err) => { - if (err) throw new Error(`Error writing ${k}.json`); - }); - - const metaData = { name: json.name, source: `${json.code}.json` }; - Object.assign(translationMeta, { [k]: metaData }); - json.alias.forEach((a) => { - console.log(` - Alias ${k}: ${a}`); - Object.assign(translationMeta, { [a]: metaData }); - }); - } - - console.log(); - console.log(' - Writing meta (meta.json)'); - const metaContents = JSON.stringify(translationMeta, null, 2); - - fs.writeFile(`${LOCALES_DIR}/meta.json`, metaContents, (err) => { - if (err) throw new Error('Error writing meta.json'); - }); - - console.log(' - Writing loader (index.ts)'); - let listOfRequires = ''; - for (key in translationMeta) { - if (key !== 'en') { - if (Object.prototype.hasOwnProperty.call(translationMeta, key)) { - const objectKey = /[^a-zA-Z_]/.test(key) ? `'${key}'` : key; - listOfRequires += ` ${objectKey}: require('./${translationMeta[key].source}'),\n`; - } - } - } - loaderContent = `export default {\n${listOfRequires}};\n`; - fs.writeFile(`${LOCALES_DIR}/generated/index.ts`, loaderContent, (err) => { - if (err) throw new Error('Error writing index.ts'); - }); - - console.log(); - console.log('Done'); - - console.log(); - } catch (e) { - console.log('Error: ', e.message); - console.log(); - } -})(); diff --git a/scripts/pre-commit.sh b/scripts/pre-commit.sh index 6e196b794..27f852c31 100755 --- a/scripts/pre-commit.sh +++ b/scripts/pre-commit.sh @@ -1,27 +1,34 @@ #!/usr/bin/env bash files=$(git diff --cached --name-only --diff-filter=ACM | grep -E '.js$|.ts$|.tsx$') -if [ -z "files" ]; then +if [ -z "$files" ]; then exit 0 fi -if [ -n "$files" ]; then - echo "Checking lint for:" - for f in $files; do - echo "$f" - e=$(node_modules/.bin/eslint --quiet --fix $f) - if [[ -n "$e" ]]; then - echo "ERROR: Check eslint hints." - echo "$e" - exit 1 # reject - fi - done - - echo "Checking for TSC" - tsc=$(node_modules/.bin/tsc --noEmit) - if [[ -n "$tsc" ]]; then - echo "ERROR: Check TSC hints." - echo "$tsc" +echo "Checking lint for:" +for f in $files; do + echo "$f" + e=$(node_modules/.bin/eslint --quiet --fix $f) + if [[ -n "$e" ]]; then + echo "ERROR: Check eslint hints." + echo "$e" exit 1 # reject fi -fi \ No newline at end of file +done + +echo "Checking for TSC" +tsc=$(node_modules/.bin/tsc --noEmit) +if [[ -n "$tsc" ]]; then + echo "ERROR: Check TSC hints." + echo "$tsc" + exit 1 # reject +fi + + +echo "Checking for Translations" +translations=$(node scripts/sync-locales.js check) +if [[ -n "$translations" ]]; then + echo "ERROR: Check Translations hints." + echo "$translations" + exit 1 # reject +fi diff --git a/scripts/sync-locales.js b/scripts/sync-locales.js new file mode 100644 index 000000000..767e8f446 --- /dev/null +++ b/scripts/sync-locales.js @@ -0,0 +1,122 @@ +/* eslint-disable import/no-dynamic-require */ + +/* + Add missing translation keys to languages +*/ + +const fs = require('fs'); +const path = require('path'); + +const LOCALES_DIR = path.join(__dirname, '..', 'src', 'locale'); +const TRANSLATIONS_DIR = path.join(LOCALES_DIR, 'translations'); +const FORMAT_REGEX = /("isFormat":\s*)([^,\n\r]+)/g; + +const mergeObjects = (t1, t2) => { + const out = { ...t1 }; + // eslint-disable-next-line guard-for-in + for (const key in t2) { + if (key in out) { + if (typeof t2[key] === 'object') { + out[key] = mergeObjects(out[key], t2[key]); + } + if (typeof t2[key] === 'string') { + out[key] = t2[key]; + } + } + } + + return out; +}; + +const sync = () => { + const dir = fs.readdirSync(TRANSLATIONS_DIR); + for (let i = 0; i < dir.length; i++) { + if (!dir[i].endsWith('.json')) { + continue; + } + + const format = []; + const file = `${TRANSLATIONS_DIR}/${dir[i]}`; + const content = fs.readFileSync(file, 'utf-8'); + let contentNormalized = ''; + + for (let line of content.split('\n')) { + if (line.split(FORMAT_REGEX).length === 4) { + // eslint-disable-next-line prefer-destructuring + const index = format.push(line.split(FORMAT_REGEX)[2]); + line = line.replace(FORMAT_REGEX, `$1"FORMAT_REPLACED${index}"`); + } + contentNormalized += line; + } + + const contentNormalizedJson = JSON.parse(contentNormalized); + + const currentENJson = require(path.join(LOCALES_DIR, 'en.json')); + const merged = mergeObjects(currentENJson, contentNormalizedJson); + + if (Object.prototype.hasOwnProperty.call(contentNormalizedJson, 'moment')) { + merged.moment = contentNormalizedJson.moment; + } + + let fileContent = JSON.stringify(merged, null, 2); + + if (format.length > 0) { + for (let j = 0; j < format.length; j++) { + fileContent = fileContent.replace(`"FORMAT_REPLACED${j + 1}"`, format[j]); + } + } + + fs.writeFileSync(file, fileContent, (err) => { + if (err) throw new Error(`Error writing ${file}`); + }); + } + + // eslint-disable-next-line no-console + console.log('Sync Done!'); +}; + +const check = () => { + const dir = fs.readdirSync(TRANSLATIONS_DIR); + for (let i = 0; i < dir.length; i++) { + if (!dir[i].endsWith('.json')) { + continue; + } + + const file = `${TRANSLATIONS_DIR}/${dir[i]}`; + const content = fs.readFileSync(file, 'utf-8'); + + const currentENContent = fs.readFileSync(path.join(LOCALES_DIR, 'en.json'), 'utf-8'); + + let missMatched = false; + + for (const line of currentENContent.split('\n')) { + const key = line.match(/"([^"]+)":/g); + if (!key) { + continue; + } + if (content.indexOf(key[0]) === -1) { + missMatched = key[0].replace('"', '').replace('":', ''); + break; + } + } + + if (missMatched) { + console.error( + `Error: translations missing key "${missMatched}" in ${dir[i]}, please run "npm run sync-locals" command!`, + ); + process.exit(1); + return; + } + } +}; + +switch (process.argv[2]) { + case 'check': + check(); + break; + case 'sync': + sync(); + break; + default: + break; +} diff --git a/src/__mocks__/@react-native-community/netinfo.ts b/src/__mocks__/@react-native-community/netinfo.ts index dfe00c4af..0ce148922 100644 --- a/src/__mocks__/@react-native-community/netinfo.ts +++ b/src/__mocks__/@react-native-community/netinfo.ts @@ -5,8 +5,7 @@ const NetInfo = jest.mock('@react-native-community/netinfo'); // @ts-ignore -NetInfo.addEventListener = jest.fn(state => { - console.log(`szw listener (mock)`); +NetInfo.addEventListener = jest.fn((state) => { return jest.fn(); }); // @ts-ignore diff --git a/src/__mocks__/globalMock.ts b/src/__mocks__/globalMock.ts deleted file mode 100644 index 6105a743d..000000000 --- a/src/__mocks__/globalMock.ts +++ /dev/null @@ -1,4 +0,0 @@ -jest.mock('global', () => ({ - ...global, - WebSocket: function WebSocket() {}, -})); diff --git a/src/__mocks__/react-native.ts b/src/__mocks__/react-native.ts index 5be07d940..c05531347 100644 --- a/src/__mocks__/react-native.ts +++ b/src/__mocks__/react-native.ts @@ -22,7 +22,7 @@ ReactNative.NativeModules.UtilsModule = { hapticFeedback: jest.fn((type: any) => true), restartBundle: jest.fn(() => true), timeoutEvent: jest.fn((event: string, timeout: number) => true), - getElapsedRealtime: jest.fn(() => Promise.resolve(123)), + getElapsedRealtime: jest.fn(() => Promise.resolve('1337')), exitApp: jest.fn(() => true), }; @@ -81,6 +81,7 @@ ReactNative.NativeModules.HapticFeedbackModule = { }; ReactNative.NativeModules.VaultManagerModule = { + latestCipherVersion: 2, getStorageEncryptionKey: jest.fn(() => Promise.resolve( '1567F58A794600717029077C34A8FAAB9B16B9FFAB174248DD296DA82084EE7921E51DC5757CA655271AF4928263FEC4A36D2139AD02F9CB1BC70F8FD7D38796', @@ -91,6 +92,17 @@ ReactNative.NativeModules.VaultManagerModule = { openVault: jest.fn((vaultName: string, key: string) => Promise.resolve('clearText')), vaultExist: jest.fn((vaultName: string) => Promise.resolve(true)), purgeVault: jest.fn((vaultName: string) => Promise.resolve(true)), + reKeyVault: jest.fn((vaultName: string, oldKey: string, newKey: string) => Promise.resolve(true)), + reKeyBatchVaults: jest.fn((vaultNames: string[], oldKey: string, newKey: string) => Promise.resolve(true)), + clearStorage: jest.fn(() => Promise.resolve(true)), + isMigrationRequired: jest.fn((vaultName: string) => + Promise.resolve({ + vault: vaultName, + current_cipher_version: 2, + latest_cipher_version: 2, + migration_required: false, + }), + ), }; module.exports = ReactNative; diff --git a/src/app.tsx b/src/app.tsx index 991ed78e5..a8b3b11d3 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -48,7 +48,7 @@ class Application { constructor() { this.storage = new DataStorage(); - this.logger = services.LoggerService.createLogger('Application'); + this.logger = services.LoggerService.createLogger('App'); this.initialized = false; } @@ -57,7 +57,7 @@ class Application { Navigation.events().registerAppLaunchedListener(() => { // start the app this.logger.debug( - `XUMM version ${GetAppVersionCode()}_${GetAppBuildNumber()}_${IsDebugBuild() ? 'D' : 'R'}`, + `Xaman version ${GetAppVersionCode()}_${GetAppBuildNumber()}_${IsDebugBuild() ? 'D' : 'R'}`, ); this.logger.debug(`Device ${GetDeviceBrand()} - OS Version ${GetDeviceOSVersion()}`); @@ -67,13 +67,12 @@ class Application { // if already initialized then soft boot // NOTE: this can happen if Activity is destroyed and re-initiated if (this.initialized) { - tasks = [this.configure, this.loadAppLocale, this.reinstateServices]; + tasks = [this.configure, this.reinstateServices]; } else { tasks = [ this.checkup, - this.configure, this.initializeStorage, - this.loadAppLocale, + this.configure, this.initializeServices, this.registerScreens, ]; @@ -108,7 +107,7 @@ class Application { text: 'Try again later', onPress: ExitApp, }, - { text: 'WIPE XUMM', style: 'destructive', onPress: this.wipeStorage }, + { text: 'Wipe Xaman', style: 'destructive', onPress: this.wipeStorage }, ]); } else if (message.indexOf('Encrypted interprocess sharing is currently unsupported') > -1) { Alert.alert('Error', ErrorMessages.appAlreadyRunningInDifferentProcess, [ @@ -133,7 +132,7 @@ class Application { wipeStorage = () => { Prompt( 'WARNING', - 'You are wiping XUMM, This action cannot be undone. Are you sure?', + 'You are wiping Xaman, This action cannot be undone. Are you sure?', [ { text: 'No', @@ -198,6 +197,7 @@ class Application { reject(e); }); } catch (e) { + reject(e); this.logger.error('initializeServices Error:', e); } }); @@ -222,34 +222,6 @@ class Application { }); }; - // load app locals and settings - loadAppLocale = () => { - // eslint-disable-next-line no-async-promise-executor - return new Promise(async (resolve, reject) => { - try { - const Localize = require('@locale').default; - - const core = CoreRepository.getSettings(); - - const localeSettings = await GetDeviceLocaleSettings(); - - // app is not initialized yet, set to default device locale - if (!core) { - this.logger.debug('Locale is not initialized, setting base on device languageCode'); - const locale = Localize.setLocale(localeSettings.languageCode, localeSettings); - CoreRepository.saveSettings({ language: locale }); - } else { - // use locale set in settings - this.logger.debug(`Locale set to: ${core.language.toUpperCase()}`); - Localize.setLocale(core.language, core.useSystemSeparators ? localeSettings : undefined); - } - resolve(); - } catch (e) { - reject(e); - } - }); - }; - // register all screens registerScreens = () => { return new Promise((resolve, reject) => { @@ -314,30 +286,58 @@ class Application { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { try { - if (Platform.OS === 'android') { - // set secure flag for the app by default - SetFlagSecure(true); - - // enable layout animation - if (UIManager.setLayoutAnimationEnabledExperimental) { - UIManager.setLayoutAnimationEnabledExperimental(true); - } - } - - // disable RTL as we don't support it right now - I18nManager.allowRTL(false); + // get core settings + const coreSettings = CoreRepository.getSettings(); - // set timezone + /* ======================== TIMEZONE ==================================== */ await GetDeviceTimeZone() .then((tz: string) => { this.logger.debug(`Timezone set to ${tz}`); moment.tz.setDefault(tz); }) .catch(() => { - this.logger.war('Unable to get device timezone, fallback to default timezone'); + this.logger.warn('Unable to get device timezone, fallback to default timezone'); // ignore in case of error }); + /* ======================== LOCALE ==================================== */ + const Localize = require('@locale').default; + + // get device local settings + const localeSettings = await GetDeviceLocaleSettings(); + + // if there is a language set in the settings load the setting base on the settings + if (coreSettings?.language) { + this.logger.debug( + `Settings [Locale]/[Currency]: ${coreSettings.language.toUpperCase()}/${coreSettings.currency}`, + ); + Localize.setLocale( + coreSettings.language, + coreSettings.useSystemSeparators ? localeSettings : undefined, + ); + } else { + // app is not initialized yet, set to default device locale + this.logger.debug('Locale is not initialized, setting base on device settings'); + const locale = Localize.setLocale(localeSettings.languageCode, localeSettings); + CoreRepository.saveSettings({ language: locale }); + } + + /* ======================== FlagSecure & LayoutAnimationExperimental =============================== */ + if (Platform.OS === 'android') { + // Enable Flag Secure if developer mode is not active + if (!coreSettings?.developerMode) { + SetFlagSecure(true); + } + + // enable layout animation + if (UIManager.setLayoutAnimationEnabledExperimental) { + UIManager.setLayoutAnimationEnabledExperimental(true); + } + } + + /* ======================== RTL & FONTS ==================================== */ + // disable RTL as we don't support it right now + I18nManager.allowRTL(false); // Disable accessibility fonts // @ts-ignore Text.defaultProps = {}; diff --git a/src/common/constants/amendments.ts b/src/common/constants/amendments.ts new file mode 100644 index 000000000..49ca16b4d --- /dev/null +++ b/src/common/constants/amendments.ts @@ -0,0 +1,50 @@ +/** + * Network known amendments + */ + +export default { + Hooks: 'ECF412BE0964EC2E71DCF807EEEA6EA8470D3DB15173D46F28AB6E234860AC32', + Flow: '740352F2412A9909880C23A559FCECEDA3BE2126FED62FC7660D628A06927F11', + FlowCross: '3012E8230864E95A58C60FD61430D7E1B4D3353195F2981DC12B0C7C0950FFAC', + DepositAuth: 'F64E1EABBE79D55B3BB82020516CEC2C582A98A6BFE20FBE9BB6A0D233418064', + Checks: '157D2D480E006395B76F948E3E07A45A05FE10230D88A7993C71F97AE4B1F2D1', + DepositPreauth: '3CBC5C4E630A1B82380295CDA84B32B49DD066602E74E39B85EF64137FA65194', + MultiSignReserve: '586480873651E106F1D6339B0C4A8945BA705A777F3F4524626FF1FC07EFE41D', + DeletableAccounts: '30CD365592B8EE40489BA01AE2F7555CAC9C983145871DC82A42A31CF5BAE7D9', + RequireFullyCanonicalSig: '00C1FC4A53E60AB02C864641002B3172F38677E29C26C5406685179B37E1EDAC', + HardenedValidations: '1F4AFA8FA1BC8827AD4C0F682C03A8B671DCDF6B5C4DE36D44243A684103EF88', + NegativeUNL: 'B4E4F5D2D6FB84DF7399960A732309C9FD530EAE5941838160042833625A6076', + TicketBatch: '955DF3FA5891195A9DAEFA1DDC6BB244B545DDE1BAA84CBB25D5F12A8DA68A0C', + FlowSortStrands: 'AF8DF7465C338AE64B1E937D6C8DA138C0D63AD5134A68792BBBE1F63356C422', + CheckCashMakesTrustLine: '98DECF327BF79997AEC178323AD51A830E457BFC6D454DAF3E46E5EC42DC619F', + ExpandedSignerList: 'B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856', + NonFungibleTokensV1_1: '32A122F1352A4C7B3A6D790362CC34749C5E57FCE896377BFDC6CCD14F6CD627', + NonFungibleTokensV1: '3C43D9A973AA4443EF3FC38E42DD306160FBFFDAB901CD8BAA15D09F2597EB87', + BalanceRewards: '42F8B586B357ABBAAAA1C733C3E7D3B75761395340D0CDF600179E8737E22478', + PaychanAndEscrowForTokens: '919857E4B902A20216E4819B9BD9FD1FD19A66ECF63151C18A4C48C873DB9578', + URIToken: 'ECE6819DBA5DB528F1A241695F5A9811EF99467CDE22510954FD357780BBD078', + CryptoConditionsSuite: '86E83A7D2ECE3AD5FA87AB2195AE015C950469ABF0B72EAACED318F74886AE90', + Import: 'F5751842D26FC057B92CAA435ABF4F1428C2BCC4180D18775ADE92CB2643BBA3', + + fix1781: '25BA44241B3BD880770BFA4DA21C7180576831855368CBEC6A3154FDE4A7676E', + fix1513: '67A34F2CF55BFC0F93AACD5B281413176FEE195269FA6D95219A2DF738671172', + fix1571: '7117E2EC2DBF119CA55181D69819F1999ECEE1A0225A7FD2B9ED47940968479C', + fix1543: 'CA7C02118BA27599528543DFE77BA6838D1B0F43B447D4D7F53523CE6A0E9AC2', + fix1623: '58BE9B5968C4DA7C59BA900961828B113E5490699B21877DEF9A31E9D0FE5D5F', + fix1515: '5D08145F0A4983F23AFFFF514E83FAD355C5ABFBB6CAB76FB5BC8519FF5F33BE', + fix1578: 'FBD513F1B893AC765B78F250E6FFA6A11B573209D1842ADC787C850696741288', + + fixQualityUpperBound: '89308AF3B8B10B7192C4E613E1D2E4D9BA64B2EE2D5232402AE82A6A7220D953', + fixTakerDryOfferRemoval: '2CD5286D8D687E98B41102BDD797198E81EA41DF7BD104E6561FEB104EFF2561', + fixMasterKeyAsRegularKey: 'C4483A1896170C66C098DEA5B0E024309C60DC960DE5F01CD7AF986AA3D9AD37', + fixCheckThreading: '8F81B066ED20DAECA20DF57187767685EEF3980B228E0667A650BAF24426D3B4', + fixPayChanRecipientOwnerDir: '621A0B264970359869E3C0363A899909AAB7A887C8B73519E4ECF952D33258A8', + fixAmendmentMajorityCalc: '4F46DF03559967AC60F2EB272FEFE3928A7594A45FF774B87A7E540DB0F8F068', + fixSTAmountCanonicalize: '452F5906C46D46F407883344BFDD90E672B672C5E9943DB4891E3A34FEEEB9DB', + fixRmSmallIncreasedQOffers: 'B6B3EEDC0267AB50491FDC450A398AF30DBCD977CECED8BEF2499CAB5DAC19E2', + fixUniversalNumber: '2E2FB9CF8A44EB80F4694D38AADAE9B8B7ADAFD2F092E10068E61C98C4F092B0', + fixNonFungibleTokensV1_2: '73761231F7F3D94EC3D8C63D91BDD0D89045C6F71B917D1925C01253515A6669', + fixNFTokenRemint: 'AE35ABDEFBDE520372B31C957020B34A7A4A9DC3115A69803A44016477C84D6E', + fixNFTokenDirV1: '0285B7E5E08E1A8E4C15636F0591D87F73CB6A7B6452A932AD72BBC8E5D1CBE3', + fixNFTokenNegOffer: '36799EA497B1369B170805C078AEFE6188345F9B3E324C21E9CA3FF574E3C3D6', +}; diff --git a/src/common/constants/api.ts b/src/common/constants/api.ts index 58469ed33..c6a9118fd 100644 --- a/src/common/constants/api.ts +++ b/src/common/constants/api.ts @@ -29,9 +29,9 @@ export default { ['xAppsStore', '/v1/app/xapp/store/v1/{category}'], ['xAppsShortList', '/v1/app/xapp/shortlist'], ['xAppLaunch', '/v1/app/xapp/launch/{xAppId}'], + ['xAppInfo', '/v1/app/xapp/info/{xAppId}'], ['currencies', '/v1/app/currencies/{locale}'], ['rates', '/v1/app/rates/{currency}'], - ['validEndpoints', '/v1/app/valid-endpoints/{hash}'], ['auditTrail', '/v1/app/audit-trail/{destination}'], ['addAccount', '/v1/app/add-account'], ['addTransaction', '/v1/app/add-tx'], @@ -39,5 +39,6 @@ export default { ['thirdPartyApp', '/v1/app/third-party-permissions/{appId}'], ['xls20Details', '/v1/app/xls20-details'], ['xls20Offered', '/v1/app/xls20-offered/{account}'], + ['networkRails', '/v1/app/rails'], ]), }; diff --git a/src/common/constants/config.ts b/src/common/constants/config.ts index 8738dd42d..9c66b86f3 100644 --- a/src/common/constants/config.ts +++ b/src/common/constants/config.ts @@ -3,12 +3,14 @@ */ export default { - // App Details - appName: 'XUMM', + // App Details and URL's + appName: 'Xaman', supportEmail: 'support@xumm.dev', termOfUseURL: 'https://xumm.app/app/webviews/tos-privacy/', creditsURL: 'https://xumm.app/app/webviews/credits/', changeLogURL: 'https://xumm.app/app/webviews/update/en/?update=', + explorerProxy: 'https://xumm.app/explorer', + hooksExplainerURL: 'https://xumm.app/app/webviews/hooks/', // persist storage config storage: { @@ -16,70 +18,12 @@ export default { path: 'xumm.realm', }, - // NOTE: any changes here should be applied in patches/react-native+VERSION.patch as well - // xrpl nodes - nodes: { - default: 'wss://xrplcluster.com', - proxy: 'wss://custom-node.xrpl-labs.com', - main: ['wss://xrplcluster.com', 'wss://xrpl.link', 'wss://s2.ripple.com'], - test: ['wss://testnet.xrpl-labs.com', 'wss://s.altnet.rippletest.net:51233'], - dev: ['wss://s.devnet.rippletest.net:51233'], - deprecated: ['wss://xrpl.ws'], - cluster: 'wss://xrplcluster.com', - }, - - // xrpl explorers - explorer: [ - { - value: 'xpring', - title: 'XRPL.org', - tx: { - main: 'https://livenet.xrpl.org/transactions/', - test: 'https://testnet.xrpl.org/transactions/', - dev: 'https://devnet.xrpl.org/transactions/', - }, - account: { - main: 'https://livenet.xrpl.org/accounts/', - test: 'https://testnet.xrpl.org/accounts/', - dev: 'https://devnet.xrpl.org/accounts/', - }, - }, - { - value: 'bithomp', - title: 'Bithomp', - tx: { - main: 'https://bithomp.com/explorer/', - test: 'https://test.bithomp.com/explorer/', - dev: 'https://devnet.xrpl.org/transactions/', - }, - account: { - main: 'https://bithomp.com/explorer/', - test: 'https://test.bithomp.com/explorer/', - dev: 'https://devnet.xrpl.org/accounts/', - }, - }, - { - value: 'xrpscan', - title: 'XRPScan', - tx: { - main: 'https://xrpscan.com/tx/', - test: 'https://test.bithomp.com/explorer/', - dev: 'https://devnet.xrpl.org/transactions/', - }, - account: { - main: 'https://xrpscan.com/account/', - test: 'https://test.bithomp.com/explorer/', - dev: 'https://devnet.xrpl.org/accounts/', - }, - }, - ], - fallbackExplorer: 'bithomp', - - // default network base and owner reserve - network: { - baseReserve: 10, // in XRP - ownerReserve: 2, // in XRP - netFee: 12, // in drops + // list of static xapp identifiers + xappIdentifiers: { + support: 'xumm.support', + nftInfo: 'xumm.nft-info', + activateAccount: 'xumm.activateacc', + xappDonation: 'xumm.xapp-donation', }, // localization config @@ -90,4 +34,7 @@ export default { // app theme config defaultTheme: 'light', + + // account label limit + accountLabelLimit: 64, }; diff --git a/src/common/constants/errors.ts b/src/common/constants/errors.ts index db8b10498..ad32bb601 100644 --- a/src/common/constants/errors.ts +++ b/src/common/constants/errors.ts @@ -11,17 +11,17 @@ export default { unexpectedValidationError: 'An unexpected error occurred while validating the transaction.\n\n' + - 'Please try again later, if the problem continues, contact XUMM support.', + 'Please try again later, if the problem continues, contact Xaman support.', storageDecryptionFailed: - 'The secure XUMM datastore could not be decrypted. ' + + 'The secure Xaman datastore could not be decrypted. ' + 'This is usually the case when you restored your phone from a backup or migrated to a new phone ' + 'or your operating system does not allow us to access the database at this moment.\n\n' + - 'Try again later, or wipe XUMM and import your accounts with their secrets again.', + 'Try again later, or wipe Xaman and import your accounts with their secrets again.', appAlreadyRunningInDifferentProcess: - 'The secure XUMM datastore could not be opened. ' + - 'This can occur when the OS tries to update XUMM to a new version. Please force quit and relaunch XUMM.', + 'The secure Xaman datastore could not be opened. ' + + 'This can occur when the OS tries to update Xaman to a new version. Please force quit and relaunch Xaman.', - runningOnRootedDevice: 'For your security, XUMM cannot be opened on a rooted phone.', - runningOnJailBrokenDevice: 'For your security, XUMM cannot be opened on a Jail Broken phone.', + runningOnRootedDevice: 'For your security, Xaman cannot be opened on a rooted phone.', + runningOnJailBrokenDevice: 'For your security, Xaman cannot be opened on a Jail Broken phone.', }; diff --git a/src/common/constants/index.ts b/src/common/constants/index.ts index 7335af65e..2ba5ad9a4 100644 --- a/src/common/constants/index.ts +++ b/src/common/constants/index.ts @@ -3,8 +3,11 @@ */ import AppConfig from './config'; -import ErrorMessages from './errors'; import AppScreens from './screens'; -import APIConfig from './api'; +import ApiConfig from './api'; +import NetworkConfig from './network'; + +import Amendments from './amendments'; +import ErrorMessages from './errors'; -export { AppConfig, AppScreens, ErrorMessages, APIConfig }; +export { AppConfig, AppScreens, ApiConfig, NetworkConfig, Amendments, ErrorMessages }; diff --git a/src/common/constants/network.ts b/src/common/constants/network.ts new file mode 100644 index 000000000..6b47e7d29 --- /dev/null +++ b/src/common/constants/network.ts @@ -0,0 +1,103 @@ +/* eslint-disable max-len */ +/* eslint-disable spellcheck/spell-checker */ + +// Supported networks +// NOTE: any changes here should be applied in patches/react-native+VERSION.patch as well + +import { NetworkType } from '@store/types'; + +export default { + baseReserve: 10, // default network base reserve in native currency + ownerReserve: 2, // default network owner reserve in native currency + netFee: 12, // default network net fee in drops + + // default network id + // NOTE: 0 -> XRPL Mainnet + defaultNetworkId: 0, + + // list of network rails + networks: [ + { + name: 'XRP Ledger', + key: 'MAINNET', + networkId: 0, + color: '#6F21F5', + type: NetworkType.Main, + nodes: ['wss://xrplcluster.com', 'wss://s2.ripple.com', 'wss://xrpl.link'], + nativeAsset: { + asset: 'XRP', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAJ4ElEQVR42u2de3CVxRnGfyeBBFBuhWgVUGoVEBUIEFoYbaHDZFpRp6RoCdKCoGkhzDDodEZuEnAU7EgQxGqGcpM6bVGQix0oFIu2A3JxCh1NGxksIBSQaYVAhQSS0z/STLCSkJzzPd+3u2ef/X/33ed8Zy/Pvhfw8PDw8PDw8PDwiAydyOXBJrfhDOVOMlKWtUx6MZS8BJjLpVNdN1mspYp4wu0iO5jJzSlF/S0UsYtLSbBWxRqyAFrzURLdXN7hb+iREuTfwRtJfbB1rYzWMDeQrmpaBU+R7jT5zXiGygAZexYOBNhdnDhbaecs/R14J2C2yuBswF3G2ctXnKQ/i/2Bc1UOZYF3Guc9rnWO/ra8L2CqDOYIuo2zlUyn6G8Z+OJT0+ZAK0olXa9xaDtuzkYJR6W0AujCYUn3K4k5QX+MZRJ+jtK1dohunJQMsciJH6BYws0pel4+SA7lkmGmWk+/Zo8sp///DzSE85KhJltNf6GEkwpyrzTYA1wUDFbFSGvpHx2Q5PDFdokR4Q5Yyb1W0q/5IKsZ39CgkyR/uc+5xzr6B4uW5Cei2XROk20V/b35TMJDUXTHrk/pbg39t3FCwsFL0V48jnCTFfR35pBk/q+R1lgT0lkjMeEDOligef5NMveNNG+a+LRdYsYuWhtNfxv2Sua9g2tMMWUbLVJO89xP+0TM6SjSSdfRzFDN8y3JfA9wvWnb0asG6qSqo8cndZqnSQcy83RSleZ5u6lXkmkpoHmeoV8Qxg3inOM6aaFIgPl2UAbeH6gvjGk6qUrzzAvSyIed1UlVmucjQRs60UmdVKV5TlEYO8s5nVR1wJilMvh5p3RS1RF7sfKy8ktndFLVJXNV4zXPRJDO6xKzy7jOCc1zg15myeD3EtN3h6iTqoTGP4YjNLZmj9U6qUrz3BeeY35HPrRWJ1Vpnh8lrnmatIUtFeukafxKYvdhuoR9ilD5ky4W/gQxfiGx+STdojhHZ3NaMp0Fop8gTXSIjvAqOVCkk/6WloID9AqRmPKtKLWUYRKdNM67NTG0AZ77t0jsrGRY1GpiXlLhyg2tq8FNbYDoyFDNWBP0dI1OGqeaF2kbwKm/SCI4x4lTaMqL0nTRBOOcYFxS2soI0bcfJ84Mk95U58umGaeUMU3zKvvfmec+0Y23phUb9aYtc+qo00vncGujrWnPpIAyYNTXlpvnWJPOWumU41TzHkUMbCD8NY2e/IztsjW/tr1ppmtZJn8QT7z25L2HJUxlAvl8j/vIp4BpLGW36FZikXNlK/4cCgVRtt1muxe3Y5/T9If9cJQAbuRjZ+m3JMTk6/zTSfotCrK6i385R/9p+mIRviFIBBVlszDQdigXnKHf0lDz4SKdNOxmcbKFMVQ78ANYnW7kSevptz7hznNW078Q6xHjZWvpL3Ej6ZqtP8EyrZttmEhjuac/6n/Bz62if5Fb9NdgqiWH0moHUg3Wgwf5j/H0n+dHOIwcjhlN/9Evp5N0DVlsMpb+t7mBFEAaM+TP5k1vF5nh4sZbH3ob9nT5IQNIMbTgOUP+B5XMMziJlBTdRT7LTWnvcBcpjBj5HIyM/IOMdCTFflLIoJDjoZN/nMIEPE6dRSY/llSzuXL7B5Nrald4XI5mjBQly/zimj/S0KSBhuB2ikV+RccoTj6DW2ogne9QEqBocYwShqTSNSuoE1I209mahIfRWbYyjWx/0kl2b8hhAq+wkzON9GHbyStMIMev9cGjAznkMZGZvEAJK1nNalZSwgvMZALD6W9BenAPDw8PDw8PDw8PDw8PDw8PDw8PDw8Pj6shnc70IZdRFFDAFKZQQAGjyKUPnRtI5uSRBJrTl0dYwBYOUNHga1gFB9jCAsbS13v9JI8MhvI02/k8wfwO23maoWR4IpuO9oxjbUAJP86ylnGJ1TNNza/+IdYLEn1cYB0P+X9Dw+jKXFFS/LqEyHP5mif6SujNqyHFC1SxMfXCMRpGfzaH7h29yf1wvMahO69HFD9czepoKl+Yg1YURZxXq5KFZucBVSKPo0bEiH3C91OP/HaUGBUluZqOqUR/bgQhSVcPWcpNFTGtSFIcOohNeaH7+lGWtKhC8m17wMWDDMOdFuSVPhJhgWn5yl9uRb6gcjd3g+Gi6u2KVmFvqtb6MMHQjbd+veinLtE/zsIMutVMdIX+MZZ9/XU/wU/cWPvtTeFdZf9eYHsSe0sT19fChTIOFpZuqIUrhUwsK15SC5dK+VhUvqcWrhWzsqSAVZ3a7145NwtKuNU9NLpZ0HC3HY+XGRF4OISXWdf49JbprHaW/jhx1pudAifGEqfpjxNnlcmZt54PLc9zKW+xikXM5lleZAVvUhpaHt5iU+mfHsKtdDOP07+elTiTPoxnTQi37xlmKv5aWWwLoxuZ6zOT7/JrKqX2GCdV5wsl5wu8zC1NtqgTz3BK+EGMMon+e2XfWxVLuDFhu9oyX2ZZJcNMof9uWWWYnfRL2roesgzthuikvfi36KQzLyA3qRiTrxLal2g7E8AHkiRu44QozfDAQO38JodFETeROrh35pBkWvvoHLitWfxFYushga2NREdKRYrLtRJ727NLYm9pNJ7Vrdkjmc6fuEZmcxuRTruHNmHT34K3JVPZJZZ82/K+CzppOm9IpvFBCJmfVQvnhvB00hhLrX72Ux0dQtNJ54sOdOE9fKsOz4vDMH6WyPUjXK/83nwmmccsteETnbnUDxa5yz+uNPphieYZlfvf/ZInnGrG6QxWKItROsCOlnxQl/iBwthBnJP8ZSdHqmUVSuZ0nsG2bFrRV2+fLdJJA00Fojq2LTTiPaNYMrdTwRWNU11cVhpS3yvGMlEOiq4mX93XGeTilM4ayRwPcH3y+uFeiWnbDHPyaykqI7o/uWSBKrN2iRR/Ez+1HYnL683ZaK3madJiuzGxt23V1mRyqIPquPFaIjqp5nB20vBgH9WB+6WmGjLHCc3TpCvn7KYYMSmlAz5VOukT0UpUNoU8q3TS8Y0Z/AHJ4LYF/at00hFXG3iI5O9nY9oLjU5a0XAyqBxRTqsnsREanfQcg+obsJsoc/lCbIVKJ+15pcG6iNxXTdE8TbqMHv2yTprF353XPM3SSb96+TAqh71t5gc2RyZI/rVOJ23JuymjeZqkk+6s0UljbEgpzTMRXCdaoNcTg8ckXX+cRGidibiJIxKeHkUStHCcW3ENPfhUskxzRnDO7YWL6CcIRzxD4InFjnAHriI7cLaOwYpAO9zkdvp3bmBboHwth66BJbc4SD7uI8bYwB4uy7kZYEDSO/x5fscPU6h6aQaj2Jx0Stoj5NR1mMdTzEugTedR7nbgvpvYHfkeHmNGQrzNIs/XtfTw8PDw8PDw8PBIVfwX0X8tlQ9X7JkAAAAASUVORK5CYII=', + iconSquare: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAANM0lEQVR42u2dA5QrSR/F61vbtr2bZPh49tm2rbVt27Zte589L+mMbdszmeD/1T+z1hvUJI17z/k9ZpKu23U71dUFoVtFxu0r7K5oYdPmyN/vlLwv/7xROJzx8s9ZkmqJR0JhBXgk1ZIsPjd8jvhcSe785dxFB88ltB2dmbSXNHCI5F5h1+KkcX4JAdOQJXlOMlWcHb+/gKTsrv1kZV8mK/0a+WefhIAl8ElWS5YG64C1RDvIQo+WvCdsWgsqg8VprwPvSUZx3TB3xT/HPVY4nNv+xQwAEmX9mCcGrNxJmEZcGLtriSSzgyYAkCGDsNj4QXA4o2RhtnbRBAA0SV8j9ugcIGzaY+jJUQAIyLr0umw+H2KUnp0JkirFJgBQKRmv77Y+9+FzYnvOBIBvg8dkC2MXoSud4z5eHtyWEJkAwGbJcXq60S0PsQEAVMm61zvcV/5B8kDqw2QAAI0iYtsIERbZtEnyAFrDbAAAHuFwzgx1s2emjro4AfDLOjkjVJV/sA6v/AC0CZs2vKf7+KMlDTo1AIAmvjHuya7OCp0bAEC5+i7SyLid5ZtuMIgBAGxR+7DM7nrUUAYA4HA+pKq7c4wBhzcAEJBM6G6Pz8EGHtgGQKVsvh/UnabPywY3AIAXulr5+6LpA0zykKx3V6YxamYwAABer6hz0yvbl6sgAEyDTVskOqSp7+8ofyDdZAYAkNmxbwG7a7YZDQCgA6NG6X/yhQkmNQCApP9efKt9xTYCwLQ4nCP/KwDvwyRgamzaO/+1HHkzTAIWWIt0v38a87McBgFLwMsu/k3tS5QTABZg5d+bP1ifH1gHr4jdtM8fr/7jYAqwGKP/2PvzCAwBlsKmPfjHALhhCrAYzt/a/xj2DCyIX5yaujd3f8bADGBJIrZF8g3wXJgBLMos8csm1ASA5bBpt3EAPoAZwJI4nO8KLHgFLMw6DkAijAAWxc0ByIURwKJkCyx8BSxMBQfAAyOARWkVMAFYGpgAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAjsWuMRpOuyKZld+R3mMW35tPYS7Lo8CGJpj3ZRwxN5DJyWTvlzcTLs2mXaA0BMAL/c7hoVVwDdVV+P9GPm+spalaaaTyJnZtGP29poECAuiz2lL1FAHTOqROSSYW8vgBf/Qzvx/l3F5DPHyAVOmV8MgKgd/bu66baBh+pEF8xL7inwLBeXHJ/IalSTb2P9urjRgCMwIjzs8jTFlAWgoW35BnOgyW35fOxKxF7yZ7iHsBATLgsO9iMUSFuQsy8NtcwZZ9yZQ4fs7KyT7s6B71ARkR1RZh6VY6lgs8dArOvz0U3qJFZcHMen0hlTYFRF+q3KTB0RSa1etQ1/ZbfmY/nAGbgwnsLSJWaW/00YEmG7srYd0E6NTb7SZWufLgID8LMxGUPFpIqcUXrtzBdN2XrNTed6hvVVf7rHi/Gk2AzcsfzpaRK3NUaMTM17GWyTUulqlofqdLtz5dgKISZue+VMlKl8movnTEpJawP/UorvaRKj71djrFAZocf5z/9fgWpUmFZG504JvRPSE8am0xF5W2kSi99UsXeIABWCcELH1eSKuWXtNFxo5JCdvxHj0iknCIPqdLrX1bRDhEYDWopdozQ6J1vq0mVMvJbQzKS9NDBCZSa00qq9PFPtbRTpIbh0FZk5yiNPl9VR6qUkNFCB56b0GPHe9CABErMbCFV+nZ9PQ8dx3wAK7NbjJt+2FRPqhSX3ET79Y9Xfpz8ns6UZlIkHvLNZef3RgCszp693bTW2Uiq5E5v5uaQ0iv/1qQmUiUuK5f5t89AAMA+feNpS6K6SpZd6KHImd2fVHPO1FRKy1XX5ucgcVn/9lkIADjg3Pjg1VuVeADdw2+Ud2kc/R693HTTUyXU4vEr/Wb6z3sUBABwL0tKTguxVD41fvydcjpz8vYfmp0wJolueaaESirbSKW454jLtl0PEABw5LBEyirwUE+IK/YnP9cGhxxc8VBRcNDZrc+W0Lvf1vytqaOyOXbU8E7ckyAA4JgRSZRb7CGji59U87dKpz1AAMDJ45KpuKKNjCoeq3T6xG6MVUIAwNlTU6iy1ktGE09id8xQMFoVAQD26alUXecjo6iu0UfRs9Nw7hAAtTOueNKJzsXHyMeq3gMEAPCDrYoa/TaH+Fuq9zxUfgSgB+G+/LwSD+lM3GPVgecMAAFQAD9N/XpdHelFP21uoEMG4SFXCAMAeAIJP8TiCfJhEn82H0P4JrMgAODYkUn02apaCrU+XVnLn60PHxAA0Gd+On2xuo4XlOpR8dwF3OgiALqFhy8/8ma50tUaePwQvye/NzxGAAwBz7MdvCyT7nqxlDa4Gzu1WjW/dr3WSHe+UEqDlmWYY84uAoBA8FImvLYob7zBN6+3PVfC8J/53/j/+DWo8AgAAAgAAAgAAAgAAAgAAAgAAAiAUZdh5H12x13SvoP9NY8V8cR4hv/M/8a7uPNr+LXwzPgBQL8/79l190ultDG+kdq8Aeqo+LX8M/yzQ5Zn4rkAAmAceMeWR98qp7IqL6kSD6vg9+T3hse6DQCmTIZiMNw6VyMPj4DnCIA+4I0xuOKHWLysu4pNOQBM6PqEmKsfLaKmFj+FS/zZfAyYEBPyAGBK5Dfr9TUlEut+hiwAWCiL9wTTm/iYzpqCSfEMAoBlUQACgIWxAAKApREBAoDFcQECgOXRAQKADTJAWAOALZKKK37fIunSBwrpsgcLg5vhvf1NNe9Nhi2STBcAbJLH7XEezNah5sjxo5Po5qdLOCjYJM/YAcA2qV5fgB56vWvbpO4e66Ybnyqm5lZsk2rQAGCj7IiZqUp6oVJzsFE2AtCD7NnbTWudjUqvtIcPUdfmPmhAQrDiqhKXlcuMc48A0G4x7uCCs6oUl9xE+/VXf4Xl93SmqGue/bi5nsuOAFh9ni6Pq1elhIyWHm1j8zdBYmYLqdK36+tp1xgNAbAiO0Zo9M631aRKGfmt3OwJSS+VynuCj3+qtdqcYwTgfw4XvfBxpdKhyKGcnXX0iETKKfKQKr3+ZZV1J9VYsfI//X6F0ietJ45JDnk5eBXpovI2UqWXPqlibxAAs3PfK2VKx9qcMSl8Y21OnZCsdCOOx94uRwDMzB3Pl5Iq1Tb4uJ9fF8uwVNX6SJF4iAYCYEJ4zI3S3Rn7LdTPpJNec9VO1rnu8WIEwExceG8BqRIPTRiwJEOPM9ZUbtnKu9YgAGZgwc155FdTL3jvLt7GSLdl5aUYWz0BUiFe4Gv5nfkIgJGZcmUO+fxqKgS/z9SrcnRf5gmXZQcH4akQXzhmX5+LABgRlRWBK//Ma3MtG/xpV+cgAEZixPlZ3FxR1hRYeEue4TxYcls+H7uqph97igAYgb37urmLUlnlv+CeAsN6ccn9hSon9bC3CIDe4YdDiiaz8KYVhvfj/LsLlDUFefMOBMAAQx1WxTV068aPhwpHzTLPujoxc9Lo5y0N3WoSrdzawN4iAEaAh/hOvDy4FVGHWXxrPo25OIsOG2zeyeM8WpW3YeKydsYb9nKXaA33AAAgAAAgAAAgAAAgAAAgAAAgAAAgAAAgAAAYKQAeGGFRQCsHoApGWBRQwQHIhREWBWRzABJhhEUBbg7ABhhhUcA6DsAHMMKSAIfzXQ7AnTDDkgCbdpuQKZhrUQMAmCVkCmJghCUBEdsihYjdtI/8SwCGWAzgF6em7i1Y3B0EQywGcArWLwF4BIZYDPCA+E0O5zgYYjHAKPGbIuP2lf/ggykWAXiD975/kt21GsZYBPCz+Jvs2jIYYwmATVsk/qb2ZlAzDDI5qPwt8vf9xD/K7noPJgGTB+Ad8W/iO2OYZGqAwzlS/Lvof/JFCTDKpIAkIWgH8Z+yu2bDKGDSq/8MsV1NfX9H+eJ0GGYyQEawbndIDudiGGYywALRYbV/C7hgGjBJ02dbsE53Su3zBPww0OAAvwxAb9ElOZwvwUCDA54XXVZk3EHyDSphokEBFSJm84GiW7K7RhtwxhgAAcl4oUR218MwFBhuwosyRcbtbKAFtADYLM5M2kUold11nKQc5uocUCYv2MeIHpHDGSU/oB4m6xRQL85xR4ge1TnuQbyuOszWGcAjbNowEQrxoCIdPSQDwC8r/3QRUtm0SZIWmB9mgOc/R3mGoDlUF6aCA9AgbNpwEVbx+op85x3aggNQGqx7utBZCUfLA1ofooIDsEW2Po4XutKAlTvJA7u1B2+OAQgIm/aYyodc6sXLLKofQAdAhbzqjxWG0Nnx+3NS8W0AFF31XxcO58HCcGq/Qd7SxYID4JL0EYYWT0Xjpeg6PtEegDTJgmDdMY9oB27D8fzMfyk0AAmyfswLdqiYV/Q/Xp1L8i7WIgWS5uByhVwnuG5YSrwgb/sSLCslXglZAuCVrOSmcbAOQMFhFXvKMAyR3CvsWpzpepBAluQ5yVTJfgLajngHv/b5B7OETbv9l5Wr10vcv5hZJfFIKKwAj6RKkiVxS9Zz8/aXczYr2BPI51Kn+j/SsaHDQvf8/gAAAABJRU5ErkJggg==', + }, + }, + { + name: 'Xahau', + key: 'XAHAU', + networkId: 21337, + color: '#0C0240', + type: NetworkType.Main, + nodes: ['wss://xahau.network'], + nativeAsset: { + asset: 'XAH', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAmmSURBVHgB7Z2/lhxHFcY/Gc6BTFJGhEt+AkPEIWqICG1eYMY8geEFaHgA5CfwDC8gkZKo5YzIfzIi9UJEZOOQREtf94w12jOzW9XbXV3fre93zndmpU1mb92u/up21W1ACCGEEEIIIYQQQgghhBA183zQtWN9MyigHh4M6sE1RrF6hQXG8hH8BuyoDvXwEbjGJlavB22wEA2Aa+f6GP55DL+T2QsszCcArh2rBivUgmtMYmWzf8DC1GCFvoBfnoBrLFLUIhMN+INVTDAzYgvfPbjGIVavkBnvVsj0PnzxIbjiHyuzPtnHSlaIC89lz0+xEg04A5aip/CB17LnIjX/FGqwQg24sYVvD66Yx2jRmn8sNVih/vB3MuJ54fsMhdCAK3BTxGqFvJY9s9T8U5AVKg+b/b3u4WpRIFY1YQpiqnpwWSHPC98isVosUyCniMUKeS17Fmd9btKCK6BT1KB8WnDFNFar1fxT6MAV1FT1KNsK2cLXNvWxxDNWq9f8YwnwOQCnKtUKeS17FlHzT8H21bMEd6oalIfXsieF9blJB64gp6pHWVZIC9/CCJAVyonXsmcLYmSF8uD1mGOxNf8UOnAFPVU91rdCLbhiFiNa63OTAP9WaIf18Lrw9bIV/TtqsEIfID9ey540Nf8UOnANQqrsLpfbCnk85khX848lwL8Veo58eC17Utb8YzGbwDQYU5TLCnkse36NClpUqs/o/fF6zLFFBZhP9m6FOiyH54VvNTTgGpwpWqrPqMeyp5uafwrqM5qO12OOrmr+sajlejoeF75mfVi7btybBlyDNUVzWSGPZU+3Nf8UZIXiaLH8d80t1zX/WGSF7sZj2bOKmn8sDbgGb4qmWiGPZc/XqONtPEnICp3HY9mzqpp/LLJC5+kzfr8cqrLmH0sDrsGcopRb/3aF77e0WohbkRUa8XhHrLrmn4L3PqMd7uaPK3/HuaWafwI19Bm9zQqFQr7jnFLNP5EWXAOcKrNCl17uti/oe84hl0ccc+DdCp17EV9T4Pe8j1TzvwcB/s8OtDf+5r7g7zpFqvnfkxo6Shyt0Jbgu6ZINf+Z6MA18KkyKxTgb/ZvQcADlE/AmCSea8j/ha+/rx/0Hgj4AcrHkuN/g34Dv/wYfrDZ//eDvoKYlQ5cFqBWqea/EAH+q0Lsoqv5M1igIzVYIWbsAjDr8xmIYFgE36QD34ura6AHycL3FMYLIMB/VYgNm/0t+a9Axjvg4wrjrVaUw59BmPzseO8zyrTwFStQQ5/R0mXbHdZ4OYg4UEPL9ZJFX/NnKoOe458Y35L4C4jc9IN+h7E8LVakho4SpUlHHAujAVcCsetzOIHdAh25gqxQLuwC+CVkfYpDViiPWohiacCVTGxyV/P3YoGOXEFWaCnsAvgt9MS3eGSFlpH2+RPRgCu5Spfb3j7eLNCRK8gKzYVdAHT7/MVohbw318qhFxC01NBndEm57+3j1QId+Q/GQz8NxBRsn//fIOiRFUqX9vk7IkBnB1Jk1ud9CFfU0Gd0Lqnm75QOXIm4htTP3zEBskK3Sfv8K0BW6LKeQVRBB67EzCH186+IAFmhm2pRId4fhF1CfUbfph/0IUR1dOCapZdSgKiSAFmhHUTV1FwV6qHZX6DePqMbCIE6+4zuIMSBAK7knUMBQhyobbt0CyEObMGVvPfVNxDiQECdLVS2EGJgD67EnfMu8ASian4FrqSdWx1EtXuBDEuAmt80GQZ9O+gfENXRgmu2XkpmhQJEVZj3ZUrSpdWhYmq0QLbtIUAcCZAVqoYtuGbnXJIVqoAAtU2/TR0qpCYL9AnUIvE2AmSF3FJ7zT9WskJO6cGViGvqC1REDRaoHfQBRCw/wdhR+yUEPar5T5Oa4zqhA1filSQ3b4OvlS24Eq5E/QWCkgAtfOeQWaEGgo49uBKtZFm79Jp3zdKhmv/8khUiogdXcjFIVoiEFlyJxSSXVsjTgzCr+T+HWIrHg3406O8QRdKBa0ZllKxQoWzBlUjMcmWFPFiggLHPpUp1eZAVKow9uGZQD5IVKgTV/NeTHpAVQA+upPEmvVZ1RVpwJYtHmRWiPmvxAJxYzf8VRAnYMcr3ML55k453wMmnEKVgVSFaK8R4AWyhCkRJ2MwfQDombBYoYHziGyDm5vrM/11hTHD7/NfJv09/prQ+R34ILloo+adwM7mPiXt10Ld4k9BfnfzOPUx3AKv5v4A45dysfUzuLw+f/8bbM/nxZwGuC6BHXbP/bZbEkvs4ax8/j79TcifAYoFa+Ev+0wS/ZEns80tUZElyw3AH8Fjztz6ln+FNcmvWFhexQy4MT0VjpQd4IpotuJI7RhsIEUGAv81uOwgRyR5cyR2jACEi+Bm4EjtGLYSIpAdXct8lW/gGCBFBC67kjtEGQkTgsZ+/yp4iGm81f5NeNCGi2IIrsWO0gxARBPg84B4gRAR7cCV2jFoIEYHHmr8WviKaHlzJHaMNhIigBVdix0in1kQUXt/hGyBEBB5r/jsIEcEWXIkdox6a/UUEAT4Xvh9DiAj24ErsGKnsKaLwWPM3bSAoyd0Vooc/n7wf9BFELOdy7tFBYdC7GFvAvEQGcvYFauFzkfgn1M2lSTScfJoeYuwk/VO8SfZHOJ8T1nL958jQCynXHcBrP39L/hb+uG2WPk3edw+fD/Em0YF5JrqXGNthLkquC8Bq/tRvEjmD2blfg6Nj26VxPk1o06VZ+qic2NrqDxibiC1GjgtgC58PiLaD/or1uTmGAW8n73F2foi7rUdpZLNCSxHgs+Zfkp2zu2uPMVlY4peiDsTswRXsWJV0zNEewDHFLlWvQfqQ0WvNf4fysHd0scRvir4GYQWxB1eQYxVQHubpLUmY4piqDkS04ApurFqUi1XZmGKZKhor5HWfP8NzjKfgimmq7C73BIXjcZ+/aYPyMStkFypLTKfocxTMFlzBjBXTMccGXLGdohYFEqCFbyl4t0K2Hiiu494eXEGM1Q581GKFcu9mvojXmn8P3h2sDbhiPUVPUQg9uAIXK/ZjjjVYoQYr04IraLHysH27Biv0Cvl3qn5PAGfQYrSBDxpwxX2KVrNCe3AG7C7t4AtZoQXYgjdgdynAF7JCMxPgd+HbwidWN2cahynKZoX24A/WOXl/m2MLrvFIVRYr5HWzm2kD/9gDJJbxmKLFrVAP4NqhaunuZlbIZkqmsUnVYlaoBXDtVDW9zbGGY5QNZiYAuHaqHerDdriyjM8U2R39MWZkh/HK8qiA+ggYD5gwjVOqnkEIIYQQQgghhBBCCCGEENXyf9a6e7m7pC8gAAAAAElFTkSuQmCC', + iconSquare: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAA1tSURBVHgB7Z1daBzXFcfPysHU4GI5UHBrsNYmJDQvXtl5btbuaxrkPpUG6g9o6qdaVtNXa6XnxB9vTVpsOZDSJ3807au1yVOhSXbTQmigROuAW0PAklK3gUB2e/87M9J4tR8zO/fMzsz9/2BG67WkzMbnf+459557bkmySqUxjbu5joq0D4tMzZjXZXNNhy6SHTb8q+V9bd83/2Zr5vXH5mpKc3ZDMkhJsoJn8HPmetFcVfGMnRSHpn/VzfWeEURLMsBkBeAZ/WnxDL8qxCXq5lqRCYthMgKoNKrmvig0euJxx1w3jRDuSMqkJ4Btbz8vDG9If5AzLBkh3JSUSEcAlcYFc68JE1cSjdSEoCsAL9S5IfT4ZDzUhaAjgEqjbO5XxEtuCUnKinhCaIll7Aug0kCcf1UY7hC7qIwG9gTgJbmY2ZkXQvRAZLFsa2HNjgC8kGdVGOuTdMBocNJGSDQlSak0UK7QEBo/SY/D5rrn214ikgnAi/dh/Iz3SdpABB/5Njg24wvAm9tfEUImB0L4G1L5cOy8c7wcwDP+q0JINuiItBekeTy2TcYXgDfkrAgh2cKIQM7GnSaNJ4DthJeQLAIRHDMiaEb9geg5gDfVeVsIyS5w6Pd8W438A6PxFrk41UnyAtYJjkVZLIs6AmCFtyyE5ANMkV6K8o2jR4BK44x4FZ2E5IlISfFwAbDEgeSbdfFCodagbxgRAnVqQuMn+WW/uS4P+4bBIwBDH1IMEAqhcK7e7y+HjQCLQkj+gZO/Pugv+wvA8/5lIaQYlAfVC/UPgSqNNaEASLFAQnykd21g5whA70+KiVnMbZ/pfbNfCMTYnxQRE+1M/bL3zScFUPkAXRzKQkgxKfuterboGQF2JdpdQ0jGQc57qfcND2/Vd00IKTZYF3g6SIbDI0BVCHGC7WQ4LACGP8QFkAy/HPqDMPwhrrEVBgUjQFUIcYp2t2+tL4BOVQhxB4RBP8ALXwClo0KIW1RxK/n7fdeFELfo5gEYARL3VyQkp1SMANoUAHGUNgTA2h/iJFgCmJnyT2AnxEFKZYwAbG1OHKU0wxCIuMw0RwDiMhQAcZrp5GeEEZJjKADiNBQAcRoKgDgNBUCchgIgTkMBEKehAIjTUADEaSgA4jRPScGY/vYumavuE23u1Ddl4z/fiDbl7+2W6vG9osnKu4/EVQonABhl5bk9cuGV74gmR9/5Qi6+/kA0KZVEar84IKdfflq0uGo+h7wrzlLIEKj25kNp/etr0WTeCKz6gq5nrjy7R9X41x58Ldd+/4W4TCEFgFHg7OLnos2NpUPdkEsDeP9blw+LFp2OyFIKjiLrFDYJrn/wWK69o+vdEJ8vmhBFgzPG8+P3a7Hyx0dy0+HYP6DQs0DzJkZvfvqVaIJQaO6E3aT78MHdculVHWEBhD7Lbz0U4sA06KmFNfXZGpuhEEKfRWP8Wt6foc+TFF4A+IfGP7gmMP7bluJ1GL5m4osRkaHPNk4shGGqDzmBJpgRmv9p8qnXW2/oJr4//hW74IdxZiUYs0LaodDi+WShCxJfrGFogbifoc+TOCOAtEIh5APj/qzWjBJA4lv7DRPfXpyqBUIodGd1UzQZNxS6YH5GM/E9+eo/hezEuWK4LIZC+N7aeT3vj9Vehj79cU4AaawSxw2Fasqhj+vlDsNwshwaYZD2KjFCoSiGjcRXa9qTc/6jcXY/QBoFcwiFRs3qaCa+LHcYjbMCSKtgDgtkg1aJYfxaiS/LHaLh9I6wSRbM4f15pT0LDH2i4/yWyEntHUB+oFVKzXKH6DgvAIRCKJjTJlwwp7nRheUO8eCmePE85pLyKmk4FLp9Ra/eh+UO8cA5wR0hXVZ/+4z6NkfMzJxR8v5IfI+89ImQyHQogBDw0o0/PKcWm2uC0AfGT+8fiw5DoBBpFMxpwXKH8aAAekhj74BtWO4wPhRAH9IomLMF5/yTQQH0IU+hEMsdkkEBDCCNvQNJYblDciiAISAUympowdDHDhTAENIqmBsHljvYgQIYQRoFc3FhuYM9KIAI1DIWarDcwR4UQASyFAqxu4NdKICIZCEUYncH+1AAMUij2e4wWO5gHwogJpMKhWD4LHewDwUQE4wA2kcj9QNxP72/fSiAMUi7YI7lDnpQAGNyPyVvnOcS7TxAAYyBZjOrXiAAhj56UAAx0e7i3IutcweigM+GJr2nf6R7PlmWKNw5wdpoNrMa+N88f6B7MLf2SIDtoOHPhtyj6AV33BMcAxjH2p+fl0mApPvEz3UXwTqNSt/3CywE7gmOA7pGTIo0QqFBu+CQ80D4+PxzVbsnYk4aCiAikwh9djzDed1nGLUNFCJET6PP/vR8N08oAhRABLQPsIhKcBplSXSIug8a5xivLB/aEkKeE2YKIAJXXjsoWQHt1i8rPU/cGD8QAkIjtH7MoxAogBEg/rV9EnxS0Gz3hEIHu80xO2HA8IM8IW9CoACGMKi1eRa4bvF0+gAbszzhhLl6XLfNpA0ogCHUMpD4DkJDnJsWeyEhYV793TOZT5gpgAGcMtN9aZU7jIvtUGjjv/abgfUmzFmDAhjA5V9nJ/EdBkKh/ZZCodYDvYUuCAH5wagz09KGAuhDlkOfXmbMc9qaFWr9W3+lN2udt1kL1AM81WIG5vxBp0+RChJVzNdjYw5idhjt5uN89DHFnoasNR6mAHq495Z+uUNn67YNjDowbHz93Bg2jBuvA6PXrsXR+v3r5tmX33zY3UiUNSiAECgF1gp91r/8pttrNOy1g1r/wPizAJ7H5v+D1b8+lnO17LaYpAB8tMsd0Mktb+cOJCHLXj8MBeCjeWwpyonzYvw2RoCse/0wFIDob3HM057eJHud8+L1wzgvAO1yh1xtJOnI2LlInrx+GOcFoDnnn7c+npiYiiuAPHr9ME4L4MTxvQx9erj/MLoHz6vXD+O0AK4vHxIt8trMauPL0SMARoqF1x/k1uuHcVYA2uUOeW1mNaocovGPr7pef5JNgm3ipAC0yx3y3EFhWA6Az1W0swmcFIBmuQMSX4Q/aVAasDm4/N3d3TUNjHD4OmP+DM8e5bn6CaBoXj+McwLQLHcASbx/aev2JDDo7lfz3Lj27d3lGbZv4GFjH7aYhzn+1RELcijZwGcIpoYR50+iG3ZaONUYC0aCrXqa055HXvpExuXqawdln2/MwTPafFYIc/Ynn0aa6gyElJUaJSU6To0A2olv0uOLYGwXXtFrfoXPjk0ppxZGnzBZcMPfwpkNMdrlDoivkya+OI0Sc+uaoMNFWs1284ATAtAud7DZwx/J5rqy99XuMJcnnBCAduJr8/A6/J5l5TUExPcIhYgDAsCc/7xiXI3E1/aKKH6fdiiU5rkDWabwAtDe4rjwhs4UIUOhdCi0ALRnfZD4YpujBgyF0mGXHDhfkwKC0AedlDXBdKLmdOFf/v4/OfrsHvn+4W+JFnAQWHurf+jOds0whR0BrtcOdduKaF1p1fsgFEKeoflZLpmRMmsNq9KikCvBGNq1OzqnVe8D4KWrL+g2moWYXdq079PhGWHEZXhGGHEbCoA4DQVAnIYCIE5DARCnoQCI01AAxGkoAOI0FABxGgqAOA0EsCGEuMkGBUBchgIgTtOCAFpCiJN0No0A2veFECfpcAQgzoJ9MBDAVFMIcZKpjzECUADEVZpT0pzFLFBLCHGLJmzfXwnuvCeEuEU38vEFUKoLIe6ABLiOF0Et0B0hxC3ex80TgJcH1IUQN6gbm2/hRagatH1XCCk+CH9Wgj+EBDC1IoS4wfvBi20BMAwiTtC5G4Q/oHdDzJIQUlxM+PPUjfAbO0+lrTTWzL0shBSPNeP9j4Tf6LMlsn1NCCkeSH5rvW/2GwGmzf0zc+0XQorDDu8Pdo4AXjK8LIQUh77eH5QG/kilgVFA94whQtKhr/cHw9qinBNC8s9A7w8GC6A5Wzf320JIfvFWfZuzbw/6hlGNsRbMtS6E5JOWjMhnhwvAWzFbEELyhxf6hFZ9+zG6NWJzdsWsDVwVQvIDjP/asNAnIGJv0CmUSKwJIfkAthqprCeaALy1gZPCfIBkHxj/D32bHUlJ4lBpVMz9o9g/R0g6IPQ5Zow/cqeTeO3RvV98zv8PEZIlYJNn4xg/iH8+QDcp7s4MUQQkK8AWLxrbvCkxGT+UqTTmzf2yMBwikyUw/rGqmJMZb6VxxtyvC0VAJkMQ9sT2/AHJDddLjG8JC+dIujwSb7YnUWtPO5670iib+z2hCIg+8PrBVGdLEmLnkDzvQY75K8ZMjokW3gqvyHEbxg/sx+5eXnBJOBoQu2AR9mKSeL8fOslrNyTqLJpff1qYIJNkwOujdeeCLa8fRtc4t0eDslAIJB7dE1zEm+VR616ejlFSCCQ6MHzU8SyNO7cfh3SNkUIggwk8PiZS3o5azJaUyRhhpTFn7j8z19xEn4NMmmDGsC6ex0/9oJbJGp63flAVTwxV/12KodiEjR7JbWrevh/ZMbYtMXReNI91FO+E/paiyCfhNaGWeEYPL393kkYfJruG5XWogwiMGNpls2Y3Y17jvbL/dVpIltgIXS3vAPYprNj+TfwD6SSD/B/tZ6T8GfzKVwAAAABJRU5ErkJggg==', + }, + }, + { + name: 'Xahau Testnet', + key: 'XAHAUTESTNET', + networkId: 21338, + color: '#FFFD74', + type: NetworkType.Test, + nodes: ['wss://xahau-test.net'], + nativeAsset: { + asset: 'XAH', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAmmSURBVHgB7Z2/lhxHFcY/Gc6BTFJGhEt+AkPEIWqICG1eYMY8geEFaHgA5CfwDC8gkZKo5YzIfzIi9UJEZOOQREtf94w12jOzW9XbXV3fre93zndmpU1mb92u/up21W1ACCGEEEIIIYQQQgghhBA183zQtWN9MyigHh4M6sE1RrF6hQXG8hH8BuyoDvXwEbjGJlavB22wEA2Aa+f6GP55DL+T2QsszCcArh2rBivUgmtMYmWzf8DC1GCFvoBfnoBrLFLUIhMN+INVTDAzYgvfPbjGIVavkBnvVsj0PnzxIbjiHyuzPtnHSlaIC89lz0+xEg04A5aip/CB17LnIjX/FGqwQg24sYVvD66Yx2jRmn8sNVih/vB3MuJ54fsMhdCAK3BTxGqFvJY9s9T8U5AVKg+b/b3u4WpRIFY1YQpiqnpwWSHPC98isVosUyCniMUKeS17Fmd9btKCK6BT1KB8WnDFNFar1fxT6MAV1FT1KNsK2cLXNvWxxDNWq9f8YwnwOQCnKtUKeS17FlHzT8H21bMEd6oalIfXsieF9blJB64gp6pHWVZIC9/CCJAVyonXsmcLYmSF8uD1mGOxNf8UOnAFPVU91rdCLbhiFiNa63OTAP9WaIf18Lrw9bIV/TtqsEIfID9ey540Nf8UOnANQqrsLpfbCnk85khX848lwL8Veo58eC17Utb8YzGbwDQYU5TLCnkse36NClpUqs/o/fF6zLFFBZhP9m6FOiyH54VvNTTgGpwpWqrPqMeyp5uafwrqM5qO12OOrmr+sajlejoeF75mfVi7btybBlyDNUVzWSGPZU+3Nf8UZIXiaLH8d80t1zX/WGSF7sZj2bOKmn8sDbgGb4qmWiGPZc/XqONtPEnICp3HY9mzqpp/LLJC5+kzfr8cqrLmH0sDrsGcopRb/3aF77e0WohbkRUa8XhHrLrmn4L3PqMd7uaPK3/HuaWafwI19Bm9zQqFQr7jnFLNP5EWXAOcKrNCl17uti/oe84hl0ccc+DdCp17EV9T4Pe8j1TzvwcB/s8OtDf+5r7g7zpFqvnfkxo6Shyt0Jbgu6ZINf+Z6MA18KkyKxTgb/ZvQcADlE/AmCSea8j/ha+/rx/0Hgj4AcrHkuN/g34Dv/wYfrDZ//eDvoKYlQ5cFqBWqea/EAH+q0Lsoqv5M1igIzVYIWbsAjDr8xmIYFgE36QD34ura6AHycL3FMYLIMB/VYgNm/0t+a9Axjvg4wrjrVaUw59BmPzseO8zyrTwFStQQ5/R0mXbHdZ4OYg4UEPL9ZJFX/NnKoOe458Y35L4C4jc9IN+h7E8LVakho4SpUlHHAujAVcCsetzOIHdAh25gqxQLuwC+CVkfYpDViiPWohiacCVTGxyV/P3YoGOXEFWaCnsAvgt9MS3eGSFlpH2+RPRgCu5Spfb3j7eLNCRK8gKzYVdAHT7/MVohbw318qhFxC01NBndEm57+3j1QId+Q/GQz8NxBRsn//fIOiRFUqX9vk7IkBnB1Jk1ud9CFfU0Gd0Lqnm75QOXIm4htTP3zEBskK3Sfv8K0BW6LKeQVRBB67EzCH186+IAFmhm2pRId4fhF1CfUbfph/0IUR1dOCapZdSgKiSAFmhHUTV1FwV6qHZX6DePqMbCIE6+4zuIMSBAK7knUMBQhyobbt0CyEObMGVvPfVNxDiQECdLVS2EGJgD67EnfMu8ASian4FrqSdWx1EtXuBDEuAmt80GQZ9O+gfENXRgmu2XkpmhQJEVZj3ZUrSpdWhYmq0QLbtIUAcCZAVqoYtuGbnXJIVqoAAtU2/TR0qpCYL9AnUIvE2AmSF3FJ7zT9WskJO6cGViGvqC1REDRaoHfQBRCw/wdhR+yUEPar5T5Oa4zqhA1filSQ3b4OvlS24Eq5E/QWCkgAtfOeQWaEGgo49uBKtZFm79Jp3zdKhmv/8khUiogdXcjFIVoiEFlyJxSSXVsjTgzCr+T+HWIrHg3406O8QRdKBa0ZllKxQoWzBlUjMcmWFPFiggLHPpUp1eZAVKow9uGZQD5IVKgTV/NeTHpAVQA+upPEmvVZ1RVpwJYtHmRWiPmvxAJxYzf8VRAnYMcr3ML55k453wMmnEKVgVSFaK8R4AWyhCkRJ2MwfQDombBYoYHziGyDm5vrM/11hTHD7/NfJv09/prQ+R34ILloo+adwM7mPiXt10Ld4k9BfnfzOPUx3AKv5v4A45dysfUzuLw+f/8bbM/nxZwGuC6BHXbP/bZbEkvs4ax8/j79TcifAYoFa+Ev+0wS/ZEns80tUZElyw3AH8Fjztz6ln+FNcmvWFhexQy4MT0VjpQd4IpotuJI7RhsIEUGAv81uOwgRyR5cyR2jACEi+Bm4EjtGLYSIpAdXct8lW/gGCBFBC67kjtEGQkTgsZ+/yp4iGm81f5NeNCGi2IIrsWO0gxARBPg84B4gRAR7cCV2jFoIEYHHmr8WviKaHlzJHaMNhIigBVdix0in1kQUXt/hGyBEBB5r/jsIEcEWXIkdox6a/UUEAT4Xvh9DiAj24ErsGKnsKaLwWPM3bSAoyd0Vooc/n7wf9BFELOdy7tFBYdC7GFvAvEQGcvYFauFzkfgn1M2lSTScfJoeYuwk/VO8SfZHOJ8T1nL958jQCynXHcBrP39L/hb+uG2WPk3edw+fD/Em0YF5JrqXGNthLkquC8Bq/tRvEjmD2blfg6Nj26VxPk1o06VZ+qic2NrqDxibiC1GjgtgC58PiLaD/or1uTmGAW8n73F2foi7rUdpZLNCSxHgs+Zfkp2zu2uPMVlY4peiDsTswRXsWJV0zNEewDHFLlWvQfqQ0WvNf4fysHd0scRvir4GYQWxB1eQYxVQHubpLUmY4piqDkS04ApurFqUi1XZmGKZKhor5HWfP8NzjKfgimmq7C73BIXjcZ+/aYPyMStkFypLTKfocxTMFlzBjBXTMccGXLGdohYFEqCFbyl4t0K2Hiiu494eXEGM1Q581GKFcu9mvojXmn8P3h2sDbhiPUVPUQg9uAIXK/ZjjjVYoQYr04IraLHysH27Biv0Cvl3qn5PAGfQYrSBDxpwxX2KVrNCe3AG7C7t4AtZoQXYgjdgdynAF7JCMxPgd+HbwidWN2cahynKZoX24A/WOXl/m2MLrvFIVRYr5HWzm2kD/9gDJJbxmKLFrVAP4NqhaunuZlbIZkqmsUnVYlaoBXDtVDW9zbGGY5QNZiYAuHaqHerDdriyjM8U2R39MWZkh/HK8qiA+ggYD5gwjVOqnkEIIYQQQgghhBBCCCGEENXyf9a6e7m7pC8gAAAAAElFTkSuQmCC', + iconSquare: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAA1tSURBVHgB7Z1daBzXFcfPysHU4GI5UHBrsNYmJDQvXtl5btbuaxrkPpUG6g9o6qdaVtNXa6XnxB9vTVpsOZDSJ3807au1yVOhSXbTQmigROuAW0PAklK3gUB2e/87M9J4tR8zO/fMzsz9/2BG67WkzMbnf+459557bkmySqUxjbu5joq0D4tMzZjXZXNNhy6SHTb8q+V9bd83/2Zr5vXH5mpKc3ZDMkhJsoJn8HPmetFcVfGMnRSHpn/VzfWeEURLMsBkBeAZ/WnxDL8qxCXq5lqRCYthMgKoNKrmvig0euJxx1w3jRDuSMqkJ4Btbz8vDG9If5AzLBkh3JSUSEcAlcYFc68JE1cSjdSEoCsAL9S5IfT4ZDzUhaAjgEqjbO5XxEtuCUnKinhCaIll7Aug0kCcf1UY7hC7qIwG9gTgJbmY2ZkXQvRAZLFsa2HNjgC8kGdVGOuTdMBocNJGSDQlSak0UK7QEBo/SY/D5rrn214ikgnAi/dh/Iz3SdpABB/5Njg24wvAm9tfEUImB0L4G1L5cOy8c7wcwDP+q0JINuiItBekeTy2TcYXgDfkrAgh2cKIQM7GnSaNJ4DthJeQLAIRHDMiaEb9geg5gDfVeVsIyS5w6Pd8W438A6PxFrk41UnyAtYJjkVZLIs6AmCFtyyE5ANMkV6K8o2jR4BK44x4FZ2E5IlISfFwAbDEgeSbdfFCodagbxgRAnVqQuMn+WW/uS4P+4bBIwBDH1IMEAqhcK7e7y+HjQCLQkj+gZO/Pugv+wvA8/5lIaQYlAfVC/UPgSqNNaEASLFAQnykd21g5whA70+KiVnMbZ/pfbNfCMTYnxQRE+1M/bL3zScFUPkAXRzKQkgxKfuterboGQF2JdpdQ0jGQc57qfcND2/Vd00IKTZYF3g6SIbDI0BVCHGC7WQ4LACGP8QFkAy/HPqDMPwhrrEVBgUjQFUIcYp2t2+tL4BOVQhxB4RBP8ALXwClo0KIW1RxK/n7fdeFELfo5gEYARL3VyQkp1SMANoUAHGUNgTA2h/iJFgCmJnyT2AnxEFKZYwAbG1OHKU0wxCIuMw0RwDiMhQAcZrp5GeEEZJjKADiNBQAcRoKgDgNBUCchgIgTkMBEKehAIjTUADEaSgA4jRPScGY/vYumavuE23u1Ddl4z/fiDbl7+2W6vG9osnKu4/EVQonABhl5bk9cuGV74gmR9/5Qi6+/kA0KZVEar84IKdfflq0uGo+h7wrzlLIEKj25kNp/etr0WTeCKz6gq5nrjy7R9X41x58Ldd+/4W4TCEFgFHg7OLnos2NpUPdkEsDeP9blw+LFp2OyFIKjiLrFDYJrn/wWK69o+vdEJ8vmhBFgzPG8+P3a7Hyx0dy0+HYP6DQs0DzJkZvfvqVaIJQaO6E3aT78MHdculVHWEBhD7Lbz0U4sA06KmFNfXZGpuhEEKfRWP8Wt6foc+TFF4A+IfGP7gmMP7bluJ1GL5m4osRkaHPNk4shGGqDzmBJpgRmv9p8qnXW2/oJr4//hW74IdxZiUYs0LaodDi+WShCxJfrGFogbifoc+TOCOAtEIh5APj/qzWjBJA4lv7DRPfXpyqBUIodGd1UzQZNxS6YH5GM/E9+eo/hezEuWK4LIZC+N7aeT3vj9Vehj79cU4AaawSxw2Fasqhj+vlDsNwshwaYZD2KjFCoSiGjcRXa9qTc/6jcXY/QBoFcwiFRs3qaCa+LHcYjbMCSKtgDgtkg1aJYfxaiS/LHaLh9I6wSRbM4f15pT0LDH2i4/yWyEntHUB+oFVKzXKH6DgvAIRCKJjTJlwwp7nRheUO8eCmePE85pLyKmk4FLp9Ra/eh+UO8cA5wR0hXVZ/+4z6NkfMzJxR8v5IfI+89ImQyHQogBDw0o0/PKcWm2uC0AfGT+8fiw5DoBBpFMxpwXKH8aAAekhj74BtWO4wPhRAH9IomLMF5/yTQQH0IU+hEMsdkkEBDCCNvQNJYblDciiAISAUympowdDHDhTAENIqmBsHljvYgQIYQRoFc3FhuYM9KIAI1DIWarDcwR4UQASyFAqxu4NdKICIZCEUYncH+1AAMUij2e4wWO5gHwogJpMKhWD4LHewDwUQE4wA2kcj9QNxP72/fSiAMUi7YI7lDnpQAGNyPyVvnOcS7TxAAYyBZjOrXiAAhj56UAAx0e7i3IutcweigM+GJr2nf6R7PlmWKNw5wdpoNrMa+N88f6B7MLf2SIDtoOHPhtyj6AV33BMcAxjH2p+fl0mApPvEz3UXwTqNSt/3CywE7gmOA7pGTIo0QqFBu+CQ80D4+PxzVbsnYk4aCiAikwh9djzDed1nGLUNFCJET6PP/vR8N08oAhRABLQPsIhKcBplSXSIug8a5xivLB/aEkKeE2YKIAJXXjsoWQHt1i8rPU/cGD8QAkIjtH7MoxAogBEg/rV9EnxS0Gz3hEIHu80xO2HA8IM8IW9CoACGMKi1eRa4bvF0+gAbszzhhLl6XLfNpA0ogCHUMpD4DkJDnJsWeyEhYV793TOZT5gpgAGcMtN9aZU7jIvtUGjjv/abgfUmzFmDAhjA5V9nJ/EdBkKh/ZZCodYDvYUuCAH5wagz09KGAuhDlkOfXmbMc9qaFWr9W3+lN2udt1kL1AM81WIG5vxBp0+RChJVzNdjYw5idhjt5uN89DHFnoasNR6mAHq495Z+uUNn67YNjDowbHz93Bg2jBuvA6PXrsXR+v3r5tmX33zY3UiUNSiAECgF1gp91r/8pttrNOy1g1r/wPizAJ7H5v+D1b8+lnO17LaYpAB8tMsd0Mktb+cOJCHLXj8MBeCjeWwpyonzYvw2RoCse/0wFIDob3HM057eJHud8+L1wzgvAO1yh1xtJOnI2LlInrx+GOcFoDnnn7c+npiYiiuAPHr9ME4L4MTxvQx9erj/MLoHz6vXD+O0AK4vHxIt8trMauPL0SMARoqF1x/k1uuHcVYA2uUOeW1mNaocovGPr7pef5JNgm3ipAC0yx3y3EFhWA6Az1W0swmcFIBmuQMSX4Q/aVAasDm4/N3d3TUNjHD4OmP+DM8e5bn6CaBoXj+McwLQLHcASbx/aev2JDDo7lfz3Lj27d3lGbZv4GFjH7aYhzn+1RELcijZwGcIpoYR50+iG3ZaONUYC0aCrXqa055HXvpExuXqawdln2/MwTPafFYIc/Ynn0aa6gyElJUaJSU6To0A2olv0uOLYGwXXtFrfoXPjk0ppxZGnzBZcMPfwpkNMdrlDoivkya+OI0Sc+uaoMNFWs1284ATAtAud7DZwx/J5rqy99XuMJcnnBCAduJr8/A6/J5l5TUExPcIhYgDAsCc/7xiXI3E1/aKKH6fdiiU5rkDWabwAtDe4rjwhs4UIUOhdCi0ALRnfZD4YpujBgyF0mGXHDhfkwKC0AedlDXBdKLmdOFf/v4/OfrsHvn+4W+JFnAQWHurf+jOds0whR0BrtcOdduKaF1p1fsgFEKeoflZLpmRMmsNq9KikCvBGNq1OzqnVe8D4KWrL+g2moWYXdq079PhGWHEZXhGGHEbCoA4DQVAnIYCIE5DARCnoQCI01AAxGkoAOI0FABxGgqAOA0EsCGEuMkGBUBchgIgTtOCAFpCiJN0No0A2veFECfpcAQgzoJ9MBDAVFMIcZKpjzECUADEVZpT0pzFLFBLCHGLJmzfXwnuvCeEuEU38vEFUKoLIe6ABLiOF0Et0B0hxC3ex80TgJcH1IUQN6gbm2/hRagatH1XCCk+CH9Wgj+EBDC1IoS4wfvBi20BMAwiTtC5G4Q/oHdDzJIQUlxM+PPUjfAbO0+lrTTWzL0shBSPNeP9j4Tf6LMlsn1NCCkeSH5rvW/2GwGmzf0zc+0XQorDDu8Pdo4AXjK8LIQUh77eH5QG/kilgVFA94whQtKhr/cHw9qinBNC8s9A7w8GC6A5Wzf320JIfvFWfZuzbw/6hlGNsRbMtS6E5JOWjMhnhwvAWzFbEELyhxf6hFZ9+zG6NWJzdsWsDVwVQvIDjP/asNAnIGJv0CmUSKwJIfkAthqprCeaALy1gZPCfIBkHxj/D32bHUlJ4lBpVMz9o9g/R0g6IPQ5Zow/cqeTeO3RvV98zv8PEZIlYJNn4xg/iH8+QDcp7s4MUQQkK8AWLxrbvCkxGT+UqTTmzf2yMBwikyUw/rGqmJMZb6VxxtyvC0VAJkMQ9sT2/AHJDddLjG8JC+dIujwSb7YnUWtPO5670iib+z2hCIg+8PrBVGdLEmLnkDzvQY75K8ZMjokW3gqvyHEbxg/sx+5eXnBJOBoQu2AR9mKSeL8fOslrNyTqLJpff1qYIJNkwOujdeeCLa8fRtc4t0eDslAIJB7dE1zEm+VR616ejlFSCCQ6MHzU8SyNO7cfh3SNkUIggwk8PiZS3o5azJaUyRhhpTFn7j8z19xEn4NMmmDGsC6ex0/9oJbJGp63flAVTwxV/12KodiEjR7JbWrevh/ZMbYtMXReNI91FO+E/paiyCfhNaGWeEYPL393kkYfJruG5XWogwiMGNpls2Y3Y17jvbL/dVpIltgIXS3vAPYprNj+TfwD6SSD/B/tZ6T8GfzKVwAAAABJRU5ErkJggg==', + }, + }, + { + name: 'XRPL Testnet', + key: 'TESTNET', + networkId: 1, + color: '#FF6719', + type: NetworkType.Test, + nodes: ['wss://testnet.xrpl-labs.com', 'wss://s.altnet.rippletest.net:51233'], + nativeAsset: { + asset: 'XRP', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAJ4ElEQVR42u2de3CVxRnGfyeBBFBuhWgVUGoVEBUIEFoYbaHDZFpRp6RoCdKCoGkhzDDodEZuEnAU7EgQxGqGcpM6bVGQix0oFIu2A3JxCh1NGxksIBSQaYVAhQSS0z/STLCSkJzzPd+3u2ef/X/33ed8Zy/Pvhfw8PDw8PDw8PDwiAydyOXBJrfhDOVOMlKWtUx6MZS8BJjLpVNdN1mspYp4wu0iO5jJzSlF/S0UsYtLSbBWxRqyAFrzURLdXN7hb+iREuTfwRtJfbB1rYzWMDeQrmpaBU+R7jT5zXiGygAZexYOBNhdnDhbaecs/R14J2C2yuBswF3G2ctXnKQ/i/2Bc1UOZYF3Guc9rnWO/ra8L2CqDOYIuo2zlUyn6G8Z+OJT0+ZAK0olXa9xaDtuzkYJR6W0AujCYUn3K4k5QX+MZRJ+jtK1dohunJQMsciJH6BYws0pel4+SA7lkmGmWk+/Zo8sp///DzSE85KhJltNf6GEkwpyrzTYA1wUDFbFSGvpHx2Q5PDFdokR4Q5Yyb1W0q/5IKsZ39CgkyR/uc+5xzr6B4uW5Cei2XROk20V/b35TMJDUXTHrk/pbg39t3FCwsFL0V48jnCTFfR35pBk/q+R1lgT0lkjMeEDOligef5NMveNNG+a+LRdYsYuWhtNfxv2Sua9g2tMMWUbLVJO89xP+0TM6SjSSdfRzFDN8y3JfA9wvWnb0asG6qSqo8cndZqnSQcy83RSleZ5u6lXkmkpoHmeoV8Qxg3inOM6aaFIgPl2UAbeH6gvjGk6qUrzzAvSyIed1UlVmucjQRs60UmdVKV5TlEYO8s5nVR1wJilMvh5p3RS1RF7sfKy8ktndFLVJXNV4zXPRJDO6xKzy7jOCc1zg15myeD3EtN3h6iTqoTGP4YjNLZmj9U6qUrz3BeeY35HPrRWJ1Vpnh8lrnmatIUtFeukafxKYvdhuoR9ilD5ky4W/gQxfiGx+STdojhHZ3NaMp0Fop8gTXSIjvAqOVCkk/6WloID9AqRmPKtKLWUYRKdNM67NTG0AZ77t0jsrGRY1GpiXlLhyg2tq8FNbYDoyFDNWBP0dI1OGqeaF2kbwKm/SCI4x4lTaMqL0nTRBOOcYFxS2soI0bcfJ84Mk95U58umGaeUMU3zKvvfmec+0Y23phUb9aYtc+qo00vncGujrWnPpIAyYNTXlpvnWJPOWumU41TzHkUMbCD8NY2e/IztsjW/tr1ppmtZJn8QT7z25L2HJUxlAvl8j/vIp4BpLGW36FZikXNlK/4cCgVRtt1muxe3Y5/T9If9cJQAbuRjZ+m3JMTk6/zTSfotCrK6i385R/9p+mIRviFIBBVlszDQdigXnKHf0lDz4SKdNOxmcbKFMVQ78ANYnW7kSevptz7hznNW078Q6xHjZWvpL3Ej6ZqtP8EyrZttmEhjuac/6n/Bz62if5Fb9NdgqiWH0moHUg3Wgwf5j/H0n+dHOIwcjhlN/9Evp5N0DVlsMpb+t7mBFEAaM+TP5k1vF5nh4sZbH3ob9nT5IQNIMbTgOUP+B5XMMziJlBTdRT7LTWnvcBcpjBj5HIyM/IOMdCTFflLIoJDjoZN/nMIEPE6dRSY/llSzuXL7B5Nrald4XI5mjBQly/zimj/S0KSBhuB2ikV+RccoTj6DW2ogne9QEqBocYwShqTSNSuoE1I209mahIfRWbYyjWx/0kl2b8hhAq+wkzON9GHbyStMIMev9cGjAznkMZGZvEAJK1nNalZSwgvMZALD6W9BenAPDw8PDw8PDw8PDw8PDw8PDw8PDw8Pj6shnc70IZdRFFDAFKZQQAGjyKUPnRtI5uSRBJrTl0dYwBYOUNHga1gFB9jCAsbS13v9JI8MhvI02/k8wfwO23maoWR4IpuO9oxjbUAJP86ylnGJ1TNNza/+IdYLEn1cYB0P+X9Dw+jKXFFS/LqEyHP5mif6SujNqyHFC1SxMfXCMRpGfzaH7h29yf1wvMahO69HFD9czepoKl+Yg1YURZxXq5KFZucBVSKPo0bEiH3C91OP/HaUGBUluZqOqUR/bgQhSVcPWcpNFTGtSFIcOohNeaH7+lGWtKhC8m17wMWDDMOdFuSVPhJhgWn5yl9uRb6gcjd3g+Gi6u2KVmFvqtb6MMHQjbd+veinLtE/zsIMutVMdIX+MZZ9/XU/wU/cWPvtTeFdZf9eYHsSe0sT19fChTIOFpZuqIUrhUwsK15SC5dK+VhUvqcWrhWzsqSAVZ3a7145NwtKuNU9NLpZ0HC3HY+XGRF4OISXWdf49JbprHaW/jhx1pudAifGEqfpjxNnlcmZt54PLc9zKW+xikXM5lleZAVvUhpaHt5iU+mfHsKtdDOP07+elTiTPoxnTQi37xlmKv5aWWwLoxuZ6zOT7/JrKqX2GCdV5wsl5wu8zC1NtqgTz3BK+EGMMon+e2XfWxVLuDFhu9oyX2ZZJcNMof9uWWWYnfRL2roesgzthuikvfi36KQzLyA3qRiTrxLal2g7E8AHkiRu44QozfDAQO38JodFETeROrh35pBkWvvoHLitWfxFYushga2NREdKRYrLtRJ727NLYm9pNJ7Vrdkjmc6fuEZmcxuRTruHNmHT34K3JVPZJZZ82/K+CzppOm9IpvFBCJmfVQvnhvB00hhLrX72Ux0dQtNJ54sOdOE9fKsOz4vDMH6WyPUjXK/83nwmmccsteETnbnUDxa5yz+uNPphieYZlfvf/ZInnGrG6QxWKItROsCOlnxQl/iBwthBnJP8ZSdHqmUVSuZ0nsG2bFrRV2+fLdJJA00Fojq2LTTiPaNYMrdTwRWNU11cVhpS3yvGMlEOiq4mX93XGeTilM4ayRwPcH3y+uFeiWnbDHPyaykqI7o/uWSBKrN2iRR/Ez+1HYnL683ZaK3madJiuzGxt23V1mRyqIPquPFaIjqp5nB20vBgH9WB+6WmGjLHCc3TpCvn7KYYMSmlAz5VOukT0UpUNoU8q3TS8Y0Z/AHJ4LYF/at00hFXG3iI5O9nY9oLjU5a0XAyqBxRTqsnsREanfQcg+obsJsoc/lCbIVKJ+15pcG6iNxXTdE8TbqMHv2yTprF353XPM3SSb96+TAqh71t5gc2RyZI/rVOJ23JuymjeZqkk+6s0UljbEgpzTMRXCdaoNcTg8ckXX+cRGidibiJIxKeHkUStHCcW3ENPfhUskxzRnDO7YWL6CcIRzxD4InFjnAHriI7cLaOwYpAO9zkdvp3bmBboHwth66BJbc4SD7uI8bYwB4uy7kZYEDSO/x5fscPU6h6aQaj2Jx0Stoj5NR1mMdTzEugTedR7nbgvpvYHfkeHmNGQrzNIs/XtfTw8PDw8PDw8PBIVfwX0X8tlQ9X7JkAAAAASUVORK5CYII=', + iconSquare: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAANM0lEQVR42u2dA5QrSR/F61vbtr2bZPh49tm2rbVt27Zte589L+mMbdszmeD/1T+z1hvUJI17z/k9ZpKu23U71dUFoVtFxu0r7K5oYdPmyN/vlLwv/7xROJzx8s9ZkmqJR0JhBXgk1ZIsPjd8jvhcSe785dxFB88ltB2dmbSXNHCI5F5h1+KkcX4JAdOQJXlOMlWcHb+/gKTsrv1kZV8mK/0a+WefhIAl8ElWS5YG64C1RDvIQo+WvCdsWgsqg8VprwPvSUZx3TB3xT/HPVY4nNv+xQwAEmX9mCcGrNxJmEZcGLtriSSzgyYAkCGDsNj4QXA4o2RhtnbRBAA0SV8j9ugcIGzaY+jJUQAIyLr0umw+H2KUnp0JkirFJgBQKRmv77Y+9+FzYnvOBIBvg8dkC2MXoSud4z5eHtyWEJkAwGbJcXq60S0PsQEAVMm61zvcV/5B8kDqw2QAAI0iYtsIERbZtEnyAFrDbAAAHuFwzgx1s2emjro4AfDLOjkjVJV/sA6v/AC0CZs2vKf7+KMlDTo1AIAmvjHuya7OCp0bAEC5+i7SyLid5ZtuMIgBAGxR+7DM7nrUUAYA4HA+pKq7c4wBhzcAEJBM6G6Pz8EGHtgGQKVsvh/UnabPywY3AIAXulr5+6LpA0zykKx3V6YxamYwAABer6hz0yvbl6sgAEyDTVskOqSp7+8ofyDdZAYAkNmxbwG7a7YZDQCgA6NG6X/yhQkmNQCApP9efKt9xTYCwLQ4nCP/KwDvwyRgamzaO/+1HHkzTAIWWIt0v38a87McBgFLwMsu/k3tS5QTABZg5d+bP1ifH1gHr4jdtM8fr/7jYAqwGKP/2PvzCAwBlsKmPfjHALhhCrAYzt/a/xj2DCyIX5yaujd3f8bADGBJIrZF8g3wXJgBLMos8csm1ASA5bBpt3EAPoAZwJI4nO8KLHgFLMw6DkAijAAWxc0ByIURwKJkCyx8BSxMBQfAAyOARWkVMAFYGpgAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAjsWuMRpOuyKZld+R3mMW35tPYS7Lo8CGJpj3ZRwxN5DJyWTvlzcTLs2mXaA0BMAL/c7hoVVwDdVV+P9GPm+spalaaaTyJnZtGP29poECAuiz2lL1FAHTOqROSSYW8vgBf/Qzvx/l3F5DPHyAVOmV8MgKgd/bu66baBh+pEF8xL7inwLBeXHJ/IalSTb2P9urjRgCMwIjzs8jTFlAWgoW35BnOgyW35fOxKxF7yZ7iHsBATLgsO9iMUSFuQsy8NtcwZZ9yZQ4fs7KyT7s6B71ARkR1RZh6VY6lgs8dArOvz0U3qJFZcHMen0hlTYFRF+q3KTB0RSa1etQ1/ZbfmY/nAGbgwnsLSJWaW/00YEmG7srYd0E6NTb7SZWufLgID8LMxGUPFpIqcUXrtzBdN2XrNTed6hvVVf7rHi/Gk2AzcsfzpaRK3NUaMTM17GWyTUulqlofqdLtz5dgKISZue+VMlKl8movnTEpJawP/UorvaRKj71djrFAZocf5z/9fgWpUmFZG504JvRPSE8am0xF5W2kSi99UsXeIABWCcELH1eSKuWXtNFxo5JCdvxHj0iknCIPqdLrX1bRDhEYDWopdozQ6J1vq0mVMvJbQzKS9NDBCZSa00qq9PFPtbRTpIbh0FZk5yiNPl9VR6qUkNFCB56b0GPHe9CABErMbCFV+nZ9PQ8dx3wAK7NbjJt+2FRPqhSX3ET79Y9Xfpz8ns6UZlIkHvLNZef3RgCszp693bTW2Uiq5E5v5uaQ0iv/1qQmUiUuK5f5t89AAMA+feNpS6K6SpZd6KHImd2fVHPO1FRKy1XX5ucgcVn/9lkIADjg3Pjg1VuVeADdw2+Ud2kc/R693HTTUyXU4vEr/Wb6z3sUBABwL0tKTguxVD41fvydcjpz8vYfmp0wJolueaaESirbSKW454jLtl0PEABw5LBEyirwUE+IK/YnP9cGhxxc8VBRcNDZrc+W0Lvf1vytqaOyOXbU8E7ckyAA4JgRSZRb7CGji59U87dKpz1AAMDJ45KpuKKNjCoeq3T6xG6MVUIAwNlTU6iy1ktGE09id8xQMFoVAQD26alUXecjo6iu0UfRs9Nw7hAAtTOueNKJzsXHyMeq3gMEAPCDrYoa/TaH+Fuq9zxUfgSgB+G+/LwSD+lM3GPVgecMAAFQAD9N/XpdHelFP21uoEMG4SFXCAMAeAIJP8TiCfJhEn82H0P4JrMgAODYkUn02apaCrU+XVnLn60PHxAA0Gd+On2xuo4XlOpR8dwF3OgiALqFhy8/8ma50tUaePwQvye/NzxGAAwBz7MdvCyT7nqxlDa4Gzu1WjW/dr3WSHe+UEqDlmWYY84uAoBA8FImvLYob7zBN6+3PVfC8J/53/j/+DWo8AgAAAgAAAgAAAgAAAgAAAgAAAiAUZdh5H12x13SvoP9NY8V8cR4hv/M/8a7uPNr+LXwzPgBQL8/79l190ultDG+kdq8Aeqo+LX8M/yzQ5Zn4rkAAmAceMeWR98qp7IqL6kSD6vg9+T3hse6DQCmTIZiMNw6VyMPj4DnCIA+4I0xuOKHWLysu4pNOQBM6PqEmKsfLaKmFj+FS/zZfAyYEBPyAGBK5Dfr9TUlEut+hiwAWCiL9wTTm/iYzpqCSfEMAoBlUQACgIWxAAKApREBAoDFcQECgOXRAQKADTJAWAOALZKKK37fIunSBwrpsgcLg5vhvf1NNe9Nhi2STBcAbJLH7XEezNah5sjxo5Po5qdLOCjYJM/YAcA2qV5fgB56vWvbpO4e66Ybnyqm5lZsk2rQAGCj7IiZqUp6oVJzsFE2AtCD7NnbTWudjUqvtIcPUdfmPmhAQrDiqhKXlcuMc48A0G4x7uCCs6oUl9xE+/VXf4Xl93SmqGue/bi5nsuOAFh9ni6Pq1elhIyWHm1j8zdBYmYLqdK36+tp1xgNAbAiO0Zo9M631aRKGfmt3OwJSS+VynuCj3+qtdqcYwTgfw4XvfBxpdKhyKGcnXX0iETKKfKQKr3+ZZV1J9VYsfI//X6F0ietJ45JDnk5eBXpovI2UqWXPqlibxAAs3PfK2VKx9qcMSl8Y21OnZCsdCOOx94uRwDMzB3Pl5Iq1Tb4uJ9fF8uwVNX6SJF4iAYCYEJ4zI3S3Rn7LdTPpJNec9VO1rnu8WIEwExceG8BqRIPTRiwJEOPM9ZUbtnKu9YgAGZgwc155FdTL3jvLt7GSLdl5aUYWz0BUiFe4Gv5nfkIgJGZcmUO+fxqKgS/z9SrcnRf5gmXZQcH4akQXzhmX5+LABgRlRWBK//Ma3MtG/xpV+cgAEZixPlZ3FxR1hRYeEue4TxYcls+H7uqph97igAYgb37urmLUlnlv+CeAsN6ccn9hSon9bC3CIDe4YdDiiaz8KYVhvfj/LsLlDUFefMOBMAAQx1WxTV068aPhwpHzTLPujoxc9Lo5y0N3WoSrdzawN4iAEaAh/hOvDy4FVGHWXxrPo25OIsOG2zeyeM8WpW3YeKydsYb9nKXaA33AAAgAAAgAAAgAAAgAAAgAAAgAAAgAAAgAAAYKQAeGGFRQCsHoApGWBRQwQHIhREWBWRzABJhhEUBbg7ABhhhUcA6DsAHMMKSAIfzXQ7AnTDDkgCbdpuQKZhrUQMAmCVkCmJghCUBEdsihYjdtI/8SwCGWAzgF6em7i1Y3B0EQywGcArWLwF4BIZYDPCA+E0O5zgYYjHAKPGbIuP2lf/ggykWAXiD975/kt21GsZYBPCz+Jvs2jIYYwmATVsk/qb2ZlAzDDI5qPwt8vf9xD/K7noPJgGTB+Ad8W/iO2OYZGqAwzlS/Lvof/JFCTDKpIAkIWgH8Z+yu2bDKGDSq/8MsV1NfX9H+eJ0GGYyQEawbndIDudiGGYywALRYbV/C7hgGjBJ02dbsE53Su3zBPww0OAAvwxAb9ElOZwvwUCDA54XXVZk3EHyDSphokEBFSJm84GiW7K7RhtwxhgAAcl4oUR218MwFBhuwosyRcbtbKAFtADYLM5M2kUold11nKQc5uocUCYv2MeIHpHDGSU/oB4m6xRQL85xR4ge1TnuQbyuOszWGcAjbNowEQrxoCIdPSQDwC8r/3QRUtm0SZIWmB9mgOc/R3mGoDlUF6aCA9AgbNpwEVbx+op85x3aggNQGqx7utBZCUfLA1ofooIDsEW2Po4XutKAlTvJA7u1B2+OAQgIm/aYyodc6sXLLKofQAdAhbzqjxWG0Nnx+3NS8W0AFF31XxcO58HCcGq/Qd7SxYID4JL0EYYWT0Xjpeg6PtEegDTJgmDdMY9oB27D8fzMfyk0AAmyfswLdqiYV/Q/Xp1L8i7WIgWS5uByhVwnuG5YSrwgb/sSLCslXglZAuCVrOSmcbAOQMFhFXvKMAyR3CvsWpzpepBAluQ5yVTJfgLajngHv/b5B7OETbv9l5Wr10vcv5hZJfFIKKwAj6RKkiVxS9Zz8/aXczYr2BPI51Kn+j/SsaHDQvf8/gAAAABJRU5ErkJggg==', + }, + }, + { + name: 'XRPL Devnet', + key: 'DEVNET', + networkId: 2, + color: '#B480FF', + type: NetworkType.Dev, + nodes: ['wss://s.devnet.rippletest.net:51233'], + nativeAsset: { + asset: 'XRP', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAQAAAD41aSMAAAJ4ElEQVR42u2de3CVxRnGfyeBBFBuhWgVUGoVEBUIEFoYbaHDZFpRp6RoCdKCoGkhzDDodEZuEnAU7EgQxGqGcpM6bVGQix0oFIu2A3JxCh1NGxksIBSQaYVAhQSS0z/STLCSkJzzPd+3u2ef/X/33ed8Zy/Pvhfw8PDw8PDw8PDwiAydyOXBJrfhDOVOMlKWtUx6MZS8BJjLpVNdN1mspYp4wu0iO5jJzSlF/S0UsYtLSbBWxRqyAFrzURLdXN7hb+iREuTfwRtJfbB1rYzWMDeQrmpaBU+R7jT5zXiGygAZexYOBNhdnDhbaecs/R14J2C2yuBswF3G2ctXnKQ/i/2Bc1UOZYF3Guc9rnWO/ra8L2CqDOYIuo2zlUyn6G8Z+OJT0+ZAK0olXa9xaDtuzkYJR6W0AujCYUn3K4k5QX+MZRJ+jtK1dohunJQMsciJH6BYws0pel4+SA7lkmGmWk+/Zo8sp///DzSE85KhJltNf6GEkwpyrzTYA1wUDFbFSGvpHx2Q5PDFdokR4Q5Yyb1W0q/5IKsZ39CgkyR/uc+5xzr6B4uW5Cei2XROk20V/b35TMJDUXTHrk/pbg39t3FCwsFL0V48jnCTFfR35pBk/q+R1lgT0lkjMeEDOligef5NMveNNG+a+LRdYsYuWhtNfxv2Sua9g2tMMWUbLVJO89xP+0TM6SjSSdfRzFDN8y3JfA9wvWnb0asG6qSqo8cndZqnSQcy83RSleZ5u6lXkmkpoHmeoV8Qxg3inOM6aaFIgPl2UAbeH6gvjGk6qUrzzAvSyIed1UlVmucjQRs60UmdVKV5TlEYO8s5nVR1wJilMvh5p3RS1RF7sfKy8ktndFLVJXNV4zXPRJDO6xKzy7jOCc1zg15myeD3EtN3h6iTqoTGP4YjNLZmj9U6qUrz3BeeY35HPrRWJ1Vpnh8lrnmatIUtFeukafxKYvdhuoR9ilD5ky4W/gQxfiGx+STdojhHZ3NaMp0Fop8gTXSIjvAqOVCkk/6WloID9AqRmPKtKLWUYRKdNM67NTG0AZ77t0jsrGRY1GpiXlLhyg2tq8FNbYDoyFDNWBP0dI1OGqeaF2kbwKm/SCI4x4lTaMqL0nTRBOOcYFxS2soI0bcfJ84Mk95U58umGaeUMU3zKvvfmec+0Y23phUb9aYtc+qo00vncGujrWnPpIAyYNTXlpvnWJPOWumU41TzHkUMbCD8NY2e/IztsjW/tr1ppmtZJn8QT7z25L2HJUxlAvl8j/vIp4BpLGW36FZikXNlK/4cCgVRtt1muxe3Y5/T9If9cJQAbuRjZ+m3JMTk6/zTSfotCrK6i385R/9p+mIRviFIBBVlszDQdigXnKHf0lDz4SKdNOxmcbKFMVQ78ANYnW7kSevptz7hznNW078Q6xHjZWvpL3Ej6ZqtP8EyrZttmEhjuac/6n/Bz62if5Fb9NdgqiWH0moHUg3Wgwf5j/H0n+dHOIwcjhlN/9Evp5N0DVlsMpb+t7mBFEAaM+TP5k1vF5nh4sZbH3ob9nT5IQNIMbTgOUP+B5XMMziJlBTdRT7LTWnvcBcpjBj5HIyM/IOMdCTFflLIoJDjoZN/nMIEPE6dRSY/llSzuXL7B5Nrald4XI5mjBQly/zimj/S0KSBhuB2ikV+RccoTj6DW2ogne9QEqBocYwShqTSNSuoE1I209mahIfRWbYyjWx/0kl2b8hhAq+wkzON9GHbyStMIMev9cGjAznkMZGZvEAJK1nNalZSwgvMZALD6W9BenAPDw8PDw8PDw8PDw8PDw8PDw8PDw8Pj6shnc70IZdRFFDAFKZQQAGjyKUPnRtI5uSRBJrTl0dYwBYOUNHga1gFB9jCAsbS13v9JI8MhvI02/k8wfwO23maoWR4IpuO9oxjbUAJP86ylnGJ1TNNza/+IdYLEn1cYB0P+X9Dw+jKXFFS/LqEyHP5mif6SujNqyHFC1SxMfXCMRpGfzaH7h29yf1wvMahO69HFD9czepoKl+Yg1YURZxXq5KFZucBVSKPo0bEiH3C91OP/HaUGBUluZqOqUR/bgQhSVcPWcpNFTGtSFIcOohNeaH7+lGWtKhC8m17wMWDDMOdFuSVPhJhgWn5yl9uRb6gcjd3g+Gi6u2KVmFvqtb6MMHQjbd+veinLtE/zsIMutVMdIX+MZZ9/XU/wU/cWPvtTeFdZf9eYHsSe0sT19fChTIOFpZuqIUrhUwsK15SC5dK+VhUvqcWrhWzsqSAVZ3a7145NwtKuNU9NLpZ0HC3HY+XGRF4OISXWdf49JbprHaW/jhx1pudAifGEqfpjxNnlcmZt54PLc9zKW+xikXM5lleZAVvUhpaHt5iU+mfHsKtdDOP07+elTiTPoxnTQi37xlmKv5aWWwLoxuZ6zOT7/JrKqX2GCdV5wsl5wu8zC1NtqgTz3BK+EGMMon+e2XfWxVLuDFhu9oyX2ZZJcNMof9uWWWYnfRL2roesgzthuikvfi36KQzLyA3qRiTrxLal2g7E8AHkiRu44QozfDAQO38JodFETeROrh35pBkWvvoHLitWfxFYushga2NREdKRYrLtRJ727NLYm9pNJ7Vrdkjmc6fuEZmcxuRTruHNmHT34K3JVPZJZZ82/K+CzppOm9IpvFBCJmfVQvnhvB00hhLrX72Ux0dQtNJ54sOdOE9fKsOz4vDMH6WyPUjXK/83nwmmccsteETnbnUDxa5yz+uNPphieYZlfvf/ZInnGrG6QxWKItROsCOlnxQl/iBwthBnJP8ZSdHqmUVSuZ0nsG2bFrRV2+fLdJJA00Fojq2LTTiPaNYMrdTwRWNU11cVhpS3yvGMlEOiq4mX93XGeTilM4ayRwPcH3y+uFeiWnbDHPyaykqI7o/uWSBKrN2iRR/Ez+1HYnL683ZaK3madJiuzGxt23V1mRyqIPquPFaIjqp5nB20vBgH9WB+6WmGjLHCc3TpCvn7KYYMSmlAz5VOukT0UpUNoU8q3TS8Y0Z/AHJ4LYF/at00hFXG3iI5O9nY9oLjU5a0XAyqBxRTqsnsREanfQcg+obsJsoc/lCbIVKJ+15pcG6iNxXTdE8TbqMHv2yTprF353XPM3SSb96+TAqh71t5gc2RyZI/rVOJ23JuymjeZqkk+6s0UljbEgpzTMRXCdaoNcTg8ckXX+cRGidibiJIxKeHkUStHCcW3ENPfhUskxzRnDO7YWL6CcIRzxD4InFjnAHriI7cLaOwYpAO9zkdvp3bmBboHwth66BJbc4SD7uI8bYwB4uy7kZYEDSO/x5fscPU6h6aQaj2Jx0Stoj5NR1mMdTzEugTedR7nbgvpvYHfkeHmNGQrzNIs/XtfTw8PDw8PDw8PBIVfwX0X8tlQ9X7JkAAAAASUVORK5CYII=', + iconSquare: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAANM0lEQVR42u2dA5QrSR/F61vbtr2bZPh49tm2rbVt27Zte589L+mMbdszmeD/1T+z1hvUJI17z/k9ZpKu23U71dUFoVtFxu0r7K5oYdPmyN/vlLwv/7xROJzx8s9ZkmqJR0JhBXgk1ZIsPjd8jvhcSe785dxFB88ltB2dmbSXNHCI5F5h1+KkcX4JAdOQJXlOMlWcHb+/gKTsrv1kZV8mK/0a+WefhIAl8ElWS5YG64C1RDvIQo+WvCdsWgsqg8VprwPvSUZx3TB3xT/HPVY4nNv+xQwAEmX9mCcGrNxJmEZcGLtriSSzgyYAkCGDsNj4QXA4o2RhtnbRBAA0SV8j9ugcIGzaY+jJUQAIyLr0umw+H2KUnp0JkirFJgBQKRmv77Y+9+FzYnvOBIBvg8dkC2MXoSud4z5eHtyWEJkAwGbJcXq60S0PsQEAVMm61zvcV/5B8kDqw2QAAI0iYtsIERbZtEnyAFrDbAAAHuFwzgx1s2emjro4AfDLOjkjVJV/sA6v/AC0CZs2vKf7+KMlDTo1AIAmvjHuya7OCp0bAEC5+i7SyLid5ZtuMIgBAGxR+7DM7nrUUAYA4HA+pKq7c4wBhzcAEJBM6G6Pz8EGHtgGQKVsvh/UnabPywY3AIAXulr5+6LpA0zykKx3V6YxamYwAABer6hz0yvbl6sgAEyDTVskOqSp7+8ofyDdZAYAkNmxbwG7a7YZDQCgA6NG6X/yhQkmNQCApP9efKt9xTYCwLQ4nCP/KwDvwyRgamzaO/+1HHkzTAIWWIt0v38a87McBgFLwMsu/k3tS5QTABZg5d+bP1ifH1gHr4jdtM8fr/7jYAqwGKP/2PvzCAwBlsKmPfjHALhhCrAYzt/a/xj2DCyIX5yaujd3f8bADGBJIrZF8g3wXJgBLMos8csm1ASA5bBpt3EAPoAZwJI4nO8KLHgFLMw6DkAijAAWxc0ByIURwKJkCyx8BSxMBQfAAyOARWkVMAFYGpgAEAAAEAAAEAAAEAAAEAAAEAAAEAAAEAAjsWuMRpOuyKZld+R3mMW35tPYS7Lo8CGJpj3ZRwxN5DJyWTvlzcTLs2mXaA0BMAL/c7hoVVwDdVV+P9GPm+spalaaaTyJnZtGP29poECAuiz2lL1FAHTOqROSSYW8vgBf/Qzvx/l3F5DPHyAVOmV8MgKgd/bu66baBh+pEF8xL7inwLBeXHJ/IalSTb2P9urjRgCMwIjzs8jTFlAWgoW35BnOgyW35fOxKxF7yZ7iHsBATLgsO9iMUSFuQsy8NtcwZZ9yZQ4fs7KyT7s6B71ARkR1RZh6VY6lgs8dArOvz0U3qJFZcHMen0hlTYFRF+q3KTB0RSa1etQ1/ZbfmY/nAGbgwnsLSJWaW/00YEmG7srYd0E6NTb7SZWufLgID8LMxGUPFpIqcUXrtzBdN2XrNTed6hvVVf7rHi/Gk2AzcsfzpaRK3NUaMTM17GWyTUulqlofqdLtz5dgKISZue+VMlKl8movnTEpJawP/UorvaRKj71djrFAZocf5z/9fgWpUmFZG504JvRPSE8am0xF5W2kSi99UsXeIABWCcELH1eSKuWXtNFxo5JCdvxHj0iknCIPqdLrX1bRDhEYDWopdozQ6J1vq0mVMvJbQzKS9NDBCZSa00qq9PFPtbRTpIbh0FZk5yiNPl9VR6qUkNFCB56b0GPHe9CABErMbCFV+nZ9PQ8dx3wAK7NbjJt+2FRPqhSX3ET79Y9Xfpz8ns6UZlIkHvLNZef3RgCszp693bTW2Uiq5E5v5uaQ0iv/1qQmUiUuK5f5t89AAMA+feNpS6K6SpZd6KHImd2fVHPO1FRKy1XX5ucgcVn/9lkIADjg3Pjg1VuVeADdw2+Ud2kc/R693HTTUyXU4vEr/Wb6z3sUBABwL0tKTguxVD41fvydcjpz8vYfmp0wJolueaaESirbSKW454jLtl0PEABw5LBEyirwUE+IK/YnP9cGhxxc8VBRcNDZrc+W0Lvf1vytqaOyOXbU8E7ckyAA4JgRSZRb7CGji59U87dKpz1AAMDJ45KpuKKNjCoeq3T6xG6MVUIAwNlTU6iy1ktGE09id8xQMFoVAQD26alUXecjo6iu0UfRs9Nw7hAAtTOueNKJzsXHyMeq3gMEAPCDrYoa/TaH+Fuq9zxUfgSgB+G+/LwSD+lM3GPVgecMAAFQAD9N/XpdHelFP21uoEMG4SFXCAMAeAIJP8TiCfJhEn82H0P4JrMgAODYkUn02apaCrU+XVnLn60PHxAA0Gd+On2xuo4XlOpR8dwF3OgiALqFhy8/8ma50tUaePwQvye/NzxGAAwBz7MdvCyT7nqxlDa4Gzu1WjW/dr3WSHe+UEqDlmWYY84uAoBA8FImvLYob7zBN6+3PVfC8J/53/j/+DWo8AgAAAgAAAgAAAgAAAgAAAgAAAiAUZdh5H12x13SvoP9NY8V8cR4hv/M/8a7uPNr+LXwzPgBQL8/79l190ultDG+kdq8Aeqo+LX8M/yzQ5Zn4rkAAmAceMeWR98qp7IqL6kSD6vg9+T3hse6DQCmTIZiMNw6VyMPj4DnCIA+4I0xuOKHWLysu4pNOQBM6PqEmKsfLaKmFj+FS/zZfAyYEBPyAGBK5Dfr9TUlEut+hiwAWCiL9wTTm/iYzpqCSfEMAoBlUQACgIWxAAKApREBAoDFcQECgOXRAQKADTJAWAOALZKKK37fIunSBwrpsgcLg5vhvf1NNe9Nhi2STBcAbJLH7XEezNah5sjxo5Po5qdLOCjYJM/YAcA2qV5fgB56vWvbpO4e66Ybnyqm5lZsk2rQAGCj7IiZqUp6oVJzsFE2AtCD7NnbTWudjUqvtIcPUdfmPmhAQrDiqhKXlcuMc48A0G4x7uCCs6oUl9xE+/VXf4Xl93SmqGue/bi5nsuOAFh9ni6Pq1elhIyWHm1j8zdBYmYLqdK36+tp1xgNAbAiO0Zo9M631aRKGfmt3OwJSS+VynuCj3+qtdqcYwTgfw4XvfBxpdKhyKGcnXX0iETKKfKQKr3+ZZV1J9VYsfI//X6F0ietJ45JDnk5eBXpovI2UqWXPqlibxAAs3PfK2VKx9qcMSl8Y21OnZCsdCOOx94uRwDMzB3Pl5Iq1Tb4uJ9fF8uwVNX6SJF4iAYCYEJ4zI3S3Rn7LdTPpJNec9VO1rnu8WIEwExceG8BqRIPTRiwJEOPM9ZUbtnKu9YgAGZgwc155FdTL3jvLt7GSLdl5aUYWz0BUiFe4Gv5nfkIgJGZcmUO+fxqKgS/z9SrcnRf5gmXZQcH4akQXzhmX5+LABgRlRWBK//Ma3MtG/xpV+cgAEZixPlZ3FxR1hRYeEue4TxYcls+H7uqph97igAYgb37urmLUlnlv+CeAsN6ccn9hSon9bC3CIDe4YdDiiaz8KYVhvfj/LsLlDUFefMOBMAAQx1WxTV068aPhwpHzTLPujoxc9Lo5y0N3WoSrdzawN4iAEaAh/hOvDy4FVGHWXxrPo25OIsOG2zeyeM8WpW3YeKydsYb9nKXaA33AAAgAAAgAAAgAAAgAAAgAAAgAAAgAAAgAAAYKQAeGGFRQCsHoApGWBRQwQHIhREWBWRzABJhhEUBbg7ABhhhUcA6DsAHMMKSAIfzXQ7AnTDDkgCbdpuQKZhrUQMAmCVkCmJghCUBEdsihYjdtI/8SwCGWAzgF6em7i1Y3B0EQywGcArWLwF4BIZYDPCA+E0O5zgYYjHAKPGbIuP2lf/ggykWAXiD975/kt21GsZYBPCz+Jvs2jIYYwmATVsk/qb2ZlAzDDI5qPwt8vf9xD/K7noPJgGTB+Ad8W/iO2OYZGqAwzlS/Lvof/JFCTDKpIAkIWgH8Z+yu2bDKGDSq/8MsV1NfX9H+eJ0GGYyQEawbndIDudiGGYywALRYbV/C7hgGjBJ02dbsE53Su3zBPww0OAAvwxAb9ElOZwvwUCDA54XXVZk3EHyDSphokEBFSJm84GiW7K7RhtwxhgAAcl4oUR218MwFBhuwosyRcbtbKAFtADYLM5M2kUold11nKQc5uocUCYv2MeIHpHDGSU/oB4m6xRQL85xR4ge1TnuQbyuOszWGcAjbNowEQrxoCIdPSQDwC8r/3QRUtm0SZIWmB9mgOc/R3mGoDlUF6aCA9AgbNpwEVbx+op85x3aggNQGqx7utBZCUfLA1ofooIDsEW2Po4XutKAlTvJA7u1B2+OAQgIm/aYyodc6sXLLKofQAdAhbzqjxWG0Nnx+3NS8W0AFF31XxcO58HCcGq/Qd7SxYID4JL0EYYWT0Xjpeg6PtEegDTJgmDdMY9oB27D8fzMfyk0AAmyfswLdqiYV/Q/Xp1L8i7WIgWS5uByhVwnuG5YSrwgb/sSLCslXglZAuCVrOSmcbAOQMFhFXvKMAyR3CvsWpzpepBAluQ5yVTJfgLajngHv/b5B7OETbv9l5Wr10vcv5hZJfFIKKwAj6RKkiVxS9Zz8/aXczYr2BPI51Kn+j/SsaHDQvf8/gAAAABJRU5ErkJggg==', + }, + }, + ], + + // custom node url endpoint + customNodeProxy: 'wss://custom-node.xrpl-labs.com', + + // cluster endpoints + clusterEndpoints: ['wss://xrplcluster.com', 'wss://xahau.network'], + + // legacy config + legacy: { + defaultExplorer: 'xpring', + defaultNode: 'wss://xrplcluster.com', + }, +}; diff --git a/src/common/constants/package.json b/src/common/constants/package.json index 54c1db3a6..d00cc6cae 100644 --- a/src/common/constants/package.json +++ b/src/common/constants/package.json @@ -1,3 +1,3 @@ { - "name": "@constants" -} \ No newline at end of file + "name": "@constants" +} diff --git a/src/common/constants/screens.ts b/src/common/constants/screens.ts index 537b80726..3a9b517d6 100644 --- a/src/common/constants/screens.ts +++ b/src/common/constants/screens.ts @@ -42,14 +42,15 @@ const screens = { MigrationExplain: 'modal.MigrationExplain', XAppBrowser: 'modal.XAppBrowser', DestinationPicker: 'modal.DestinationPicker', + TransactionLoader: 'modal.TransactionLoader', }, Overlay: { SwitchAccount: 'overlay.SwitchAccount', - AddCurrency: 'overlay.AddCurrency', + AddToken: 'overlay.AddToken', + TokenSettings: 'overlay.TokenSettings', Vault: 'overlay.Vault', Auth: 'overlay.Auth', Lock: 'overlay.lock', - CurrencySettings: 'overlay.CurrencySettings', Alert: 'overlay.Alert', FlaggedDestination: 'overlay.FlaggedDestination', ShareAccount: 'overlay.ShareAccount', @@ -67,6 +68,9 @@ const screens = { CriticalProcessing: 'overlay.CriticalProcessing', PassphraseAuthentication: 'overlay.PassphraseAuthentication', SwitchAssetCategory: 'overlay.SwitchAssetCategory', + SwitchNetwork: 'overlay.SwitchNetwork', + XAppInfo: 'overlay.XAppInfo', + NetworkRailsSync: 'overlay.NetworkRailsSync', }, Transaction: { Payment: 'app.Transaction.Payment', @@ -80,8 +84,8 @@ const screens = { Add: 'app.Settings.AddressBook.Add', Edit: 'app.Settings.AddressBook.Edit', }, - Node: { - List: 'app.Settings.Node.List', + Network: { + List: 'app.Settings.Network.List', }, ThirdPartyApps: { List: 'app.Settings.ThirdPartyApps.List', diff --git a/src/common/helpers/images.ts b/src/common/helpers/images.ts index e28fae77d..035cc4af5 100644 --- a/src/common/helpers/images.ts +++ b/src/common/helpers/images.ts @@ -54,13 +54,10 @@ export const Images = { ImageEncryptionMigration: buildImageSource('ImageEncryptionMigration', 'image_encryption_migration'), ImageBlankNFT: buildImageSource('ImageBlankNFT', 'image_blank_nft'), ImageBlankNFTLight: buildImageSource('ImageBlankNFTLight', 'image_blank_nft_light'), - // Xumm - XummLogo: buildImageSource('XummLogo', 'xumm_logo'), - XummLogoLight: buildImageSource('XummLogoLight', 'xumm_logo_light'), - XummIcon: buildImageSource('XummIcon', 'xumm_icon'), - XummIconLight: buildImageSource('XummIconLight', 'xumm_icon_light'), - XummIconWhite: buildImageSource('XummIconWhite', 'xumm_icon_white'), - SideGradient: buildImageSource('SideGradient', 'side_gradient'), + ImageArrowUp: buildImageSource('ImageArrowUp', 'image_arrow_up'), + // Xaman + XamanLogo: buildImageSource('XamanLogo', 'xaman_logo'), + XamanLogoLight: buildImageSource('XamanLogoLight', 'xaman_logo_light'), // Icons IconTabBarScan: buildImageSource('IconTabBarScan', 'icon_tabbar_scan'), IconTabBarHome: buildImageSource('IconTabBarHome', 'icon_tabbar_home'), @@ -143,7 +140,7 @@ export const Images = { IconFileText: buildImageSource('IconFileText', 'icon_file_text'), IconQR: buildImageSource('IconQR', 'icon_qr'), IconArrowRightLong: buildImageSource('IconArrowRightLong', 'icon_arrow_right_long'), - IconCheckXumm: buildImageSource('IconCheckXumm', 'icon_check_xumm'), + IconCheckXaman: buildImageSource('IconCheckXaman', 'icon_check_xaman'), IconApps: buildImageSource('IconApps', 'icon_apps'), IconReorder: buildImageSource('IconReorder', 'icon_reorder'), IconReorderHandle: buildImageSource('IconReorderHandle', 'icon_reorder_handle'), @@ -160,4 +157,5 @@ export const Images = { IconWallet: buildImageSource('IconWallet', 'icon_wallet'), IconToggleRight: buildImageSource('IconToggleRight', 'icon_toggle_right'), IconCopy: buildImageSource('IconCopy', 'icon_copy'), + IconRadio: buildImageSource('IconRadio', 'icon_radio'), }; diff --git a/src/common/helpers/navigator.ts b/src/common/helpers/navigator.ts index 282974ab3..d1f87703c 100644 --- a/src/common/helpers/navigator.ts +++ b/src/common/helpers/navigator.ts @@ -294,14 +294,6 @@ const Navigator = { }); }, - changeSelectedTabIndex(index: number) { - Navigation.mergeOptions(RootType.DefaultRoot, { - bottomTabs: { - currentTabIndex: index, - }, - }); - }, - showAlertModal(props: { testID?: string; type: 'success' | 'info' | 'warning' | 'error'; diff --git a/src/common/helpers/resolver.ts b/src/common/helpers/resolver.ts index 4cb50aa1a..b6bdfa332 100644 --- a/src/common/helpers/resolver.ts +++ b/src/common/helpers/resolver.ts @@ -1,20 +1,19 @@ import { memoize, has, get, assign } from 'lodash'; -import Flag from '@common/libs/ledger/parser/common/flag'; -import Amount from '@common/libs/ledger/parser/common/amount'; - import AccountRepository from '@store/repositories/account'; import ContactRepository from '@store/repositories/contact'; import LedgerService from '@services/LedgerService'; import BackendService from '@services/BackendService'; +import Amount from '@common/libs/ledger/parser/common/amount'; export interface PayIDInfo { account: string; tag: string; } + export interface AccountNameType { - address: string; + address?: string; name: string; source: string; kycApproved?: boolean; @@ -143,25 +142,19 @@ const getAccountInfo = (address: string): Promise => { return; } - const { account_data } = accountInfo; + const { account_data, account_flags } = accountInfo; // if balance is more than 1m possibly exchange account if (has(account_data, ['Balance'])) { - if (new Amount(account_data.Balance, true).dropsToXrp(true) > 1000000) { + if (new Amount(account_data.Balance, true).dropsToNative(true) > 1000000) { assign(info, { possibleExchange: true }); } } - // parse account flags - let accountFlags = {} as any; - if (has(account_data, ['Flags'])) { - accountFlags = new Flag('Account', account_data.Flags).parse(); - } - // check for black hole if (has(account_data, ['RegularKey'])) { if ( - accountFlags.disableMasterKey && + account_flags.disableMasterKey && ['rrrrrrrrrrrrrrrrrrrrrhoLvTp', 'rrrrrrrrrrrrrrrrrrrrBZbvji'].indexOf(account_data.RegularKey) > -1 ) { assign(info, { blackHole: true }); @@ -169,14 +162,14 @@ const getAccountInfo = (address: string): Promise => { } // check for disallow incoming XRP - if (accountFlags.disallowIncomingXRP) { + if (account_flags.disallowIncomingXRP) { assign(info, { disallowIncomingXRP: true }); } if (get(accountAdvisory, 'force_dtag')) { // first check on account advisory assign(info, { requireDestinationTag: true, possibleExchange: true }); - } else if (accountFlags.requireDestinationTag) { + } else if (account_flags.requireDestinationTag) { // check if account have the required destination tag flag set assign(info, { requireDestinationTag: true, possibleExchange: true }); } else { @@ -195,7 +188,7 @@ const getAccountInfo = (address: string): Promise => { return ( typeof tx.tx.TransactionType === 'string' && typeof tx.tx.DestinationTag !== 'undefined' && - tx.tx.DestinationTag > 9999 + Number(tx.tx.DestinationTag) > 9999 ); }).length; diff --git a/src/common/libs/ledger/exchange.ts b/src/common/libs/ledger/exchange.ts index 9fce23cc2..4bec07e26 100644 --- a/src/common/libs/ledger/exchange.ts +++ b/src/common/libs/ledger/exchange.ts @@ -12,9 +12,11 @@ import { import Localize from '@locale'; -import { ApiService, SocketService } from '@services'; +import NetworkService from '@services/NetworkService'; +import BackendService from '@services/BackendService'; import { ValueToIOU } from '@common/utils/amount'; + /* types ==================================================================== */ export enum MarketDirection { SELL = 'SELL', @@ -27,7 +29,7 @@ export type ExchangePair = { }; /* Constants ==================================================================== */ -const MAX_XRP_DECIMAL_PLACES = 6; +const MAX_NATIVE_DECIMAL_PLACES = 6; const MAX_IOU_DECIMAL_PLACES = 8; /* Class ==================================================================== */ @@ -58,14 +60,10 @@ class LedgerExchange { }; } - initialize = (direction: MarketDirection) => { + initialize = async (direction: MarketDirection) => { // fetch liquidity boundaries - return ApiService.liquidityBoundaries - .get({ - issuer: this.pair.issuer, - currency: this.pair.currency, - }) - .then((res: any) => { + return BackendService.getLiquidityBoundaries(this.pair.issuer, this.pair.currency) + .then((res) => { if (res && has(res, 'options')) { this.boundaryOptions = res.options; } @@ -88,7 +86,7 @@ class LedgerExchange { }; } - const decimalPlaces = direction === MarketDirection.SELL ? MAX_IOU_DECIMAL_PLACES : MAX_XRP_DECIMAL_PLACES; + const decimalPlaces = direction === MarketDirection.SELL ? MAX_IOU_DECIMAL_PLACES : MAX_NATIVE_DECIMAL_PLACES; const { maxSlippagePercentage } = this.boundaryOptions; const amount = new BigNumber(value); @@ -127,8 +125,8 @@ class LedgerExchange { issuer: this.pair.issuer, }; - const from = direction === MarketDirection.SELL ? { currency: 'XRP' } : pair; - const to = direction === MarketDirection.SELL ? pair : { currency: 'XRP' }; + const from = direction === MarketDirection.SELL ? { currency: NetworkService.getNativeAsset() } : pair; + const to = direction === MarketDirection.SELL ? pair : { currency: NetworkService.getNativeAsset() }; return { trade: { @@ -137,7 +135,7 @@ class LedgerExchange { amount, }, options: this.boundaryOptions, - method: SocketService.send, + method: NetworkService.send, }; }; diff --git a/src/common/libs/ledger/factory/explainer.ts b/src/common/libs/ledger/factory/explainer.ts new file mode 100644 index 000000000..73a14f68b --- /dev/null +++ b/src/common/libs/ledger/factory/explainer.ts @@ -0,0 +1,58 @@ +import { get } from 'lodash'; + +import { AccountModel } from '@store/models'; + +import * as Transactions from '@common/libs/ledger/transactions/genuine'; +import * as PseudoTransactions from '@common/libs/ledger/transactions/pseudo'; +import * as LedgerObjects from '@common/libs/ledger/objects'; + +/* Types ==================================================================== */ +import { LedgerObjectTypes, PseudoTransactionTypes, TransactionTypes } from '@common/libs/ledger/types'; + +import { + PseudoTransactions as PseudoTransactionsType, + Transactions as TransactionsType, +} from '@common/libs/ledger/transactions/types'; + +import { LedgerObjects as LedgerObjectsType } from '@common/libs/ledger/objects/types'; + +type ExplainerType = { + getLabel(tx: T, account: AccountModel): string; + getDescription(item: T, account: AccountModel): string; + getRecipient(item: T, account: AccountModel): { address: string; tag?: number }; +}; + +/* Module ==================================================================== */ +const ExplainerFactory = { + fromType: ( + type: TransactionTypes | PseudoTransactionTypes | LedgerObjectTypes, + ): ExplainerType => { + let explainer; + + switch (true) { + // Genuine transaction + case type in TransactionTypes: + explainer = get(Transactions, `${type}Info`, undefined); + break; + // Pseudo transaction + case type in PseudoTransactionTypes: + explainer = get(PseudoTransactions, `${type}Info`, undefined); + break; + // Ledger object + case type in LedgerObjectTypes: + explainer = get(LedgerObjects, `${type}Info`, undefined); + break; + default: + break; + } + + if (typeof explainer === 'undefined') { + throw new Error(`Explainer "${type}Info" not found. Did you forget to include it?`); + } + + return explainer; + }, +}; + +/* Export ==================================================================== */ +export default ExplainerFactory; diff --git a/src/common/libs/ledger/factory/index.ts b/src/common/libs/ledger/factory/index.ts index 24523e51e..b631969d2 100644 --- a/src/common/libs/ledger/factory/index.ts +++ b/src/common/libs/ledger/factory/index.ts @@ -1,4 +1,6 @@ import TransactionFactory from './transaction'; import LedgerObjectFactory from './object'; +import ExplainerFactory from './explainer'; +import ValidationFactory from './validation'; -export { TransactionFactory, LedgerObjectFactory }; +export { TransactionFactory, LedgerObjectFactory, ExplainerFactory, ValidationFactory }; diff --git a/src/common/libs/ledger/factory/object.ts b/src/common/libs/ledger/factory/object.ts index af666dcfc..889046658 100644 --- a/src/common/libs/ledger/factory/object.ts +++ b/src/common/libs/ledger/factory/object.ts @@ -1,9 +1,12 @@ import { get } from 'lodash'; import * as LedgerObjects from '@common/libs/ledger/objects'; + +/* Types ==================================================================== */ import { LedgerObjects as LedgerObjectsType } from '@common/libs/ledger/objects/types'; import { LedgerEntriesTypes } from '@common/libs/ledger/types'; +/* Module ==================================================================== */ const LedgerObjectFactory = { /* Parse ledger entry to LedgerObject instance @@ -23,4 +26,5 @@ const LedgerObjectFactory = { }, }; +/* Export ==================================================================== */ export default LedgerObjectFactory; diff --git a/src/common/libs/ledger/factory/transaction.ts b/src/common/libs/ledger/factory/transaction.ts index 1d542dd5f..0c969d9ba 100644 --- a/src/common/libs/ledger/factory/transaction.ts +++ b/src/common/libs/ledger/factory/transaction.ts @@ -1,10 +1,11 @@ import { get, has } from 'lodash'; -import { LedgerTransactionType, PseudoTransactionTypes, TransactionJSONType } from '@common/libs/ledger/types'; - -import * as Transactions from '@common/libs/ledger/transactions'; +import * as Transactions from '@common/libs/ledger/transactions/genuine'; import * as PseudoTransactions from '@common/libs/ledger/transactions/pseudo'; +/* Types ==================================================================== */ +import { LedgerTransactionType, PseudoTransactionTypes, TransactionJSONType } from '@common/libs/ledger/types'; + import { Transactions as TransactionsType, PseudoTransactions as PseudoTransactionsType, @@ -12,6 +13,15 @@ import { /* Module ==================================================================== */ const TransactionFactory = { + /** + * Returns a pseudo transaction based on the given type. + * + * @function + * @param {TransactionJSONType} json - The JSON representation of the transaction. + * @param {PseudoTransactionTypes} type - The type of pseudo transaction to generate. + * @returns {PseudoTransactionsType} Returns an instance of the appropriate pseudo transaction. + * @throws {Error} Throws an error if the pseudo transaction type is unsupported. + */ getPseudoTransaction: (json: TransactionJSONType, type: PseudoTransactionTypes): PseudoTransactionsType => { switch (type) { case PseudoTransactionTypes.SignIn: @@ -19,10 +29,19 @@ const TransactionFactory = { case PseudoTransactionTypes.PaymentChannelAuthorize: return new PseudoTransactions.PaymentChannelAuthorize(json); default: - throw new Error('Unsupported pseudo transaction type'); + throw new Error(`Unsupported Pseudo transaction type ${type}`); } }, + /** + * Returns a transaction based on the given transaction JSON. + * + * @function + * @param {TransactionJSONType} transaction - The JSON representation of the transaction. + * @param {any} [meta] - Optional metadata associated with the transaction. + * @returns {TransactionsType} Returns an instance of the appropriate transaction. + * @throws {Error} Throws an error if the transaction type is unsupported. + */ getTransaction: (transaction: TransactionJSONType, meta?: any): TransactionsType => { // get the transaction type const type = get(transaction, 'TransactionType', undefined); @@ -36,8 +55,13 @@ const TransactionFactory = { return new Transaction(transaction, meta); }, - /* - Parse a LEDGER transaction to Transaction instance + /** + * Parses a LEDGER transaction and returns a Transaction instance. + * + * @function + * @param {LedgerTransactionType} item - The ledger transaction to parse. + * @returns {TransactionsType} Returns an instance of the corresponding transaction. + * @throws {Error} Throws an error if the provided item is not a valid Ledger transaction type. */ fromLedger: (item: LedgerTransactionType): TransactionsType => { if (!has(item, 'tx') || !has(item, 'meta')) { @@ -48,8 +72,12 @@ const TransactionFactory = { return TransactionFactory.getTransaction(transaction, meta); }, - /* - Parse a JSON transaction to Transaction instance + /** + * Parses a JSON transaction and returns a Transaction instance. + * + * @function + * @param {TransactionJSONType} item - The JSON representation of the transaction to parse. + * @returns {TransactionsType} Returns an instance of the corresponding transaction. */ fromJson: (item: TransactionJSONType): TransactionsType => { return TransactionFactory.getTransaction(item); diff --git a/src/common/libs/ledger/factory/validation.ts b/src/common/libs/ledger/factory/validation.ts new file mode 100644 index 000000000..8b5e3eeca --- /dev/null +++ b/src/common/libs/ledger/factory/validation.ts @@ -0,0 +1,47 @@ +import { get } from 'lodash'; + +import { AccountModel } from '@store/models'; + +import * as Transactions from '@common/libs/ledger/transactions/genuine'; +import * as PseudoTransactions from '@common/libs/ledger/transactions/pseudo'; + +/* Types ==================================================================== */ +import { PseudoTransactionTypes, TransactionTypes } from '@common/libs/ledger/types'; + +import { + Transactions as TransactionsType, + PseudoTransactions as PseudoTransactionsType, +} from '@common/libs/ledger/transactions/types'; + +type ValidationType = (tx: T, account: AccountModel) => Promise; + +/* Module ==================================================================== */ +const ValidationFactory = { + fromType: ( + type: TransactionTypes | PseudoTransactionTypes, + ): ValidationType => { + let validator; + + switch (true) { + // Genuine transaction + case type in TransactionTypes: + validator = get(Transactions, `${type}Validation`, undefined); + break; + // Pseudo transaction + case type in PseudoTransactionTypes: + validator = get(PseudoTransactions, `${type}Validation`, undefined); + break; + default: + break; + } + + if (typeof validator === 'undefined') { + throw new Error(`Validation "${type}Validation" not found. Did you forget to include it?`); + } + + return validator; + }, +}; + +/* Export ==================================================================== */ +export default ValidationFactory; diff --git a/src/common/libs/ledger/objects/base.ts b/src/common/libs/ledger/objects/BaseLedgerObject.ts similarity index 80% rename from src/common/libs/ledger/objects/base.ts rename to src/common/libs/ledger/objects/BaseLedgerObject.ts index 6f3985eaa..11e895138 100644 --- a/src/common/libs/ledger/objects/base.ts +++ b/src/common/libs/ledger/objects/BaseLedgerObject.ts @@ -3,11 +3,15 @@ */ import { get, has, set, isUndefined } from 'lodash'; -import { Account } from '../parser/types'; -import Flag from '../parser/common/flag'; +import { EncodeCTID } from '@common/utils/codec'; + +import NetworkService from '@services/NetworkService'; + +import { Account } from '@common/libs/ledger/parser/types'; +import Flag from '@common/libs/ledger/parser/common/flag'; /* Types ==================================================================== */ -import { LedgerEntriesTypes } from '../types'; +import { LedgerEntriesTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class BaseLedgerObject { @@ -17,6 +21,10 @@ class BaseLedgerObject { this.object = object; } + get CTID(): string { + return EncodeCTID(this.Sequence, this.Index, NetworkService.getNetworkId()); + } + get Account(): Account { const source = get(this, ['object', 'Account'], undefined); const sourceTag = get(this, ['object', 'SourceTag'], undefined); @@ -42,7 +50,7 @@ class BaseLedgerObject { return get(this, ['object', 'LedgerEntryType'], undefined); } - get Sequence(): string { + get Sequence(): number { return get(this, ['object', 'Sequence'], undefined); } @@ -58,7 +66,7 @@ class BaseLedgerObject { return get(this, ['object', 'OwnerNode'], undefined); } - get Index(): string { + get Index(): number { return get(this, ['object', 'index'], undefined); } diff --git a/src/common/libs/ledger/objects/check.ts b/src/common/libs/ledger/objects/Check/CheckClass.ts similarity index 79% rename from src/common/libs/ledger/objects/check.ts rename to src/common/libs/ledger/objects/Check/CheckClass.ts index 0362119b9..3b26d941d 100644 --- a/src/common/libs/ledger/objects/check.ts +++ b/src/common/libs/ledger/objects/Check/CheckClass.ts @@ -1,15 +1,16 @@ import moment from 'moment-timezone'; - import { get, isUndefined } from 'lodash'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; -import BaseLedgerObject from './base'; +import BaseLedgerObject from '@common/libs/ledger/objects/BaseLedgerObject'; /* Types ==================================================================== */ -import { AmountType, Destination } from '../parser/types'; -import { LedgerObjectTypes } from '../types'; +import { AmountType, Destination } from '@common/libs/ledger/parser/types'; +import { LedgerObjectTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class Check extends BaseLedgerObject { @@ -29,8 +30,8 @@ class Check extends BaseLedgerObject { if (typeof sendMax === 'string') { return { - currency: 'XRP', - value: new Amount(sendMax).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(sendMax).dropsToNative(), }; } diff --git a/src/common/libs/ledger/objects/Check/CheckInfo.ts b/src/common/libs/ledger/objects/Check/CheckInfo.ts new file mode 100644 index 000000000..2833b2e2a --- /dev/null +++ b/src/common/libs/ledger/objects/Check/CheckInfo.ts @@ -0,0 +1,20 @@ +import Localize from '@locale'; + +import Check from '@common/libs/ledger/objects/Check/CheckClass'; +import { CheckCreateInfo } from '@common/libs/ledger/transactions/genuine/CheckCreate'; + +/* Descriptor ==================================================================== */ +const CheckInfo = { + getLabel: (): string => { + return Localize.t('global.check'); + }, + + getDescription: CheckCreateInfo.getDescription, + + getRecipient: (object: Check) => { + return object.Destination; + }, +}; + +/* Export ==================================================================== */ +export default CheckInfo; diff --git a/src/common/libs/ledger/objects/Check/CheckValidation.ts b/src/common/libs/ledger/objects/Check/CheckValidation.ts new file mode 100644 index 000000000..e83528a44 --- /dev/null +++ b/src/common/libs/ledger/objects/Check/CheckValidation.ts @@ -0,0 +1,11 @@ +import Check from './CheckClass'; + +/* Validator ==================================================================== */ +const CheckValidation = (object: Check): Promise => { + return new Promise((resolve, reject) => { + reject(new Error(`Object type ${object.Type} does not container validation!`)); + }); +}; + +/* Export ==================================================================== */ +export default CheckValidation; diff --git a/src/common/libs/ledger/objects/Check/index.ts b/src/common/libs/ledger/objects/Check/index.ts new file mode 100644 index 000000000..0d0e7fc56 --- /dev/null +++ b/src/common/libs/ledger/objects/Check/index.ts @@ -0,0 +1,3 @@ +export { default as Check } from './CheckClass'; +export { default as CheckValidation } from './CheckValidation'; +export { default as CheckInfo } from './CheckInfo'; diff --git a/src/common/libs/ledger/objects/escrow.ts b/src/common/libs/ledger/objects/Escrow/EscrowClass.ts similarity index 82% rename from src/common/libs/ledger/objects/escrow.ts rename to src/common/libs/ledger/objects/Escrow/EscrowClass.ts index 7f047ec4f..732ee2924 100644 --- a/src/common/libs/ledger/objects/escrow.ts +++ b/src/common/libs/ledger/objects/Escrow/EscrowClass.ts @@ -1,14 +1,15 @@ import moment from 'moment-timezone'; - import { get, isUndefined } from 'lodash'; -import BaseLedgerObject from './base'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; +import NetworkService from '@services/NetworkService'; + +import BaseLedgerObject from '@common/libs/ledger/objects/BaseLedgerObject'; +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; /* Types ==================================================================== */ -import { AmountType, Destination } from '../parser/types'; -import { LedgerObjectTypes } from '../types'; +import { AmountType, Destination } from '@common/libs/ledger/parser/types'; +import { LedgerObjectTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class Escrow extends BaseLedgerObject { @@ -26,8 +27,8 @@ class Escrow extends BaseLedgerObject { if (typeof amount === 'string') { return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), }; } diff --git a/src/common/libs/ledger/objects/Escrow/EscrowInfo.ts b/src/common/libs/ledger/objects/Escrow/EscrowInfo.ts new file mode 100644 index 000000000..777ad7ad4 --- /dev/null +++ b/src/common/libs/ledger/objects/Escrow/EscrowInfo.ts @@ -0,0 +1,20 @@ +import Localize from '@locale'; + +import Escrow from '@common/libs/ledger/objects/Escrow/EscrowClass'; +import { EscrowCreateInfo } from '@common/libs/ledger/transactions/genuine/EscrowCreate'; + +/* Descriptor ==================================================================== */ +const EscrowInfo = { + getLabel: (): string => { + return Localize.t('global.escrow'); + }, + + getDescription: EscrowCreateInfo.getDescription, + + getRecipient: (object: Escrow) => { + return object.Destination; + }, +}; + +/* Export ==================================================================== */ +export default EscrowInfo; diff --git a/src/common/libs/ledger/objects/Escrow/EscrowValidation.ts b/src/common/libs/ledger/objects/Escrow/EscrowValidation.ts new file mode 100644 index 000000000..4b3c53011 --- /dev/null +++ b/src/common/libs/ledger/objects/Escrow/EscrowValidation.ts @@ -0,0 +1,11 @@ +import Escrow from './EscrowClass'; + +/* Validator ==================================================================== */ +const EscrowValidation = (object: Escrow): Promise => { + return new Promise((resolve, reject) => { + reject(new Error(`Object type ${object.Type} does not container validation!`)); + }); +}; + +/* Export ==================================================================== */ +export default EscrowValidation; diff --git a/src/common/libs/ledger/objects/Escrow/index.ts b/src/common/libs/ledger/objects/Escrow/index.ts new file mode 100644 index 000000000..95d624ace --- /dev/null +++ b/src/common/libs/ledger/objects/Escrow/index.ts @@ -0,0 +1,3 @@ +export { default as Escrow } from './EscrowClass'; +export { default as EscrowValidation } from './EscrowValidation'; +export { default as EscrowInfo } from './EscrowInfo'; diff --git a/src/common/libs/ledger/objects/nfTokenOffer.ts b/src/common/libs/ledger/objects/NFTokenOffer/NFTokenOfferClass.ts similarity index 79% rename from src/common/libs/ledger/objects/nfTokenOffer.ts rename to src/common/libs/ledger/objects/NFTokenOffer/NFTokenOfferClass.ts index ef7dc8043..0c767e834 100644 --- a/src/common/libs/ledger/objects/nfTokenOffer.ts +++ b/src/common/libs/ledger/objects/NFTokenOffer/NFTokenOfferClass.ts @@ -1,13 +1,15 @@ import { get, isUndefined } from 'lodash'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; +import NetworkService from '@services/NetworkService'; -import BaseLedgerObject from './base'; +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; + +import BaseLedgerObject from '@common/libs/ledger/objects/BaseLedgerObject'; /* Types ==================================================================== */ -import { AmountType, Destination } from '../parser/types'; -import { LedgerObjectTypes } from '../types'; +import { AmountType, Destination } from '@common/libs/ledger/parser/types'; +import { LedgerObjectTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class NFTokenOffer extends BaseLedgerObject { @@ -45,8 +47,8 @@ class NFTokenOffer extends BaseLedgerObject { if (typeof amount === 'string') { return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), }; } diff --git a/src/common/libs/ledger/objects/NFTokenOffer/NFTokenOfferInfo.ts b/src/common/libs/ledger/objects/NFTokenOffer/NFTokenOfferInfo.ts new file mode 100644 index 000000000..07451a108 --- /dev/null +++ b/src/common/libs/ledger/objects/NFTokenOffer/NFTokenOfferInfo.ts @@ -0,0 +1,69 @@ +import moment from 'moment-timezone'; +import Localize from '@locale'; + +import { AccountModel } from '@store/models/objects'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import NFTokenOffer from '@common/libs/ledger/objects/NFTokenOffer/NFTokenOfferClass'; + +/* Descriptor ==================================================================== */ +const NFTokenOfferInfo = { + getLabel: (object: NFTokenOffer, account: AccountModel): string => { + // incoming offers + if (object.Owner !== account.address) { + if (object.Flags.SellToken) { + return Localize.t('events.nftOfferedToYou'); + } + return Localize.t('events.offerOnYouNFT'); + } + // outgoing offers + if (object.Flags.SellToken) { + return Localize.t('events.sellNFToken'); + } + return Localize.t('events.buyNFToken'); + }, + + getDescription: (object: NFTokenOffer): string => { + let content = ''; + + if (object.Flags.SellToken) { + content += Localize.t('events.nftOfferSellExplain', { + address: object.Owner, + tokenID: object.NFTokenID, + amount: object.Amount.value, + currency: NormalizeCurrencyCode(object.Amount.currency), + }); + } else { + content += Localize.t('events.nftOfferBuyExplain', { + address: object.Owner, + tokenID: object.NFTokenID, + amount: object.Amount.value, + currency: NormalizeCurrencyCode(object.Amount.currency), + }); + } + + if (object.Destination) { + content += '\n'; + content += Localize.t('events.thisNftOfferMayOnlyBeAcceptedBy', { address: object.Destination.address }); + } + + if (object.Expiration) { + content += '\n'; + content += Localize.t('events.theOfferExpiresAtUnlessCanceledOrAccepted', { + expiration: moment(object.Expiration).format('LLLL'), + }); + } + + return content; + }, + + getRecipient: (object: NFTokenOffer) => { + return { + address: object.Owner, + }; + }, +}; + +/* Export ==================================================================== */ +export default NFTokenOfferInfo; diff --git a/src/common/libs/ledger/objects/NFTokenOffer/NFTokenOfferValidation.ts b/src/common/libs/ledger/objects/NFTokenOffer/NFTokenOfferValidation.ts new file mode 100644 index 000000000..98fd9c2ca --- /dev/null +++ b/src/common/libs/ledger/objects/NFTokenOffer/NFTokenOfferValidation.ts @@ -0,0 +1,11 @@ +import NFTokenOffer from './NFTokenOfferClass'; + +/* Validator ==================================================================== */ +const NFTokenOfferValidation = (object: NFTokenOffer): Promise => { + return new Promise((resolve, reject) => { + reject(new Error(`Object type ${object.Type} does not container validation!`)); + }); +}; + +/* Export ==================================================================== */ +export default NFTokenOfferValidation; diff --git a/src/common/libs/ledger/objects/NFTokenOffer/index.ts b/src/common/libs/ledger/objects/NFTokenOffer/index.ts new file mode 100644 index 000000000..dc2ac2ee4 --- /dev/null +++ b/src/common/libs/ledger/objects/NFTokenOffer/index.ts @@ -0,0 +1,3 @@ +export { default as NFTokenOffer } from './NFTokenOfferClass'; +export { default as NFTokenOfferValidation } from './NFTokenOfferValidation'; +export { default as NFTokenOfferInfo } from './NFTokenOfferInfo'; diff --git a/src/common/libs/ledger/objects/offer.ts b/src/common/libs/ledger/objects/Offer/OfferClass.ts similarity index 75% rename from src/common/libs/ledger/objects/offer.ts rename to src/common/libs/ledger/objects/Offer/OfferClass.ts index 96b9b2c09..df2a19516 100644 --- a/src/common/libs/ledger/objects/offer.ts +++ b/src/common/libs/ledger/objects/Offer/OfferClass.ts @@ -1,12 +1,15 @@ import { get, isUndefined } from 'lodash'; -import BaseLedgerObject from './base'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; + +import BaseLedgerObject from '@common/libs/ledger/objects/BaseLedgerObject'; /* Types ==================================================================== */ -import { AmountType } from '../parser/types'; -import { LedgerObjectTypes } from '../types'; +import { AmountType } from '@common/libs/ledger/parser/types'; +import { LedgerObjectTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class Offer extends BaseLedgerObject { @@ -32,8 +35,8 @@ class Offer extends BaseLedgerObject { if (typeof pays === 'string') { return { - currency: 'XRP', - value: new Amount(pays).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(pays).dropsToNative(), }; } @@ -51,8 +54,8 @@ class Offer extends BaseLedgerObject { if (typeof gets === 'string') { return { - currency: 'XRP', - value: new Amount(gets).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(gets).dropsToNative(), }; } @@ -72,7 +75,7 @@ class Offer extends BaseLedgerObject { const pays = Number(this.TakerPays.value); let rate = gets / pays; - rate = this.TakerGets.currency !== 'XRP' ? rate : 1 / rate; + rate = this.TakerGets.currency !== NetworkService.getNativeAsset() ? rate : 1 / rate; return new Amount(rate, false).toNumber(); } diff --git a/src/common/libs/ledger/objects/Offer/OfferInfo.ts b/src/common/libs/ledger/objects/Offer/OfferInfo.ts new file mode 100644 index 000000000..eab224b4a --- /dev/null +++ b/src/common/libs/ledger/objects/Offer/OfferInfo.ts @@ -0,0 +1,21 @@ +import Localize from '@locale'; + +import { OfferCreateInfo } from '@common/libs/ledger/transactions/genuine/OfferCreate'; + +import Offer from '@common/libs/ledger/objects/Offer/OfferClass'; + +/* Descriptor ==================================================================== */ +const OfferInfo = { + getLabel: (): string => { + return Localize.t('global.offer'); + }, + + getDescription: OfferCreateInfo.getDescription, + + getRecipient: (object: Offer) => { + return object.Account; + }, +}; + +/* Export ==================================================================== */ +export default OfferInfo; diff --git a/src/common/libs/ledger/objects/Offer/OfferValidation.ts b/src/common/libs/ledger/objects/Offer/OfferValidation.ts new file mode 100644 index 000000000..e0496028c --- /dev/null +++ b/src/common/libs/ledger/objects/Offer/OfferValidation.ts @@ -0,0 +1,11 @@ +import Offer from '@common/libs/ledger/objects/Offer/OfferClass'; + +/* Validator ==================================================================== */ +const OfferValidation = (object: Offer): Promise => { + return new Promise((resolve, reject) => { + reject(new Error(`Object type ${object.Type} does not container validation!`)); + }); +}; + +/* Export ==================================================================== */ +export default OfferValidation; diff --git a/src/common/libs/ledger/objects/Offer/index.ts b/src/common/libs/ledger/objects/Offer/index.ts new file mode 100644 index 000000000..402842c5b --- /dev/null +++ b/src/common/libs/ledger/objects/Offer/index.ts @@ -0,0 +1,3 @@ +export { default as Offer } from './OfferClass'; +export { default as OfferValidation } from './OfferValidation'; +export { default as OfferInfo } from './OfferInfo'; diff --git a/src/common/libs/ledger/objects/payChannel.ts b/src/common/libs/ledger/objects/PayChannel/PayChannelClass.ts similarity index 81% rename from src/common/libs/ledger/objects/payChannel.ts rename to src/common/libs/ledger/objects/PayChannel/PayChannelClass.ts index 1a1f24efe..292f52e9f 100644 --- a/src/common/libs/ledger/objects/payChannel.ts +++ b/src/common/libs/ledger/objects/PayChannel/PayChannelClass.ts @@ -1,15 +1,16 @@ import moment from 'moment-timezone'; - import { get, isUndefined } from 'lodash'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; -import BaseLedgerObject from './base'; +import BaseLedgerObject from '@common/libs/ledger/objects/BaseLedgerObject'; /* Types ==================================================================== */ -import { AmountType, Destination } from '../parser/types'; -import { LedgerObjectTypes } from '../types'; +import { AmountType, Destination } from '@common/libs/ledger/parser/types'; +import { LedgerObjectTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class PayChannel extends BaseLedgerObject { @@ -29,8 +30,8 @@ class PayChannel extends BaseLedgerObject { if (typeof amount === 'string') { return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), }; } @@ -50,8 +51,8 @@ class PayChannel extends BaseLedgerObject { if (typeof balance === 'string') { return { - currency: 'XRP', - value: new Amount(balance).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(balance).dropsToNative(), }; } diff --git a/src/common/libs/ledger/objects/PayChannel/PayChannelInfo.ts b/src/common/libs/ledger/objects/PayChannel/PayChannelInfo.ts new file mode 100644 index 000000000..1245b568f --- /dev/null +++ b/src/common/libs/ledger/objects/PayChannel/PayChannelInfo.ts @@ -0,0 +1,27 @@ +import Localize from '@locale'; + +import { AccountModel } from '@store/models/objects'; + +import { PaymentChannelCreateInfo } from '@common/libs/ledger/transactions/genuine/PaymentChannelCreate'; + +import PayChannel from '@common/libs/ledger/objects/PayChannel/PayChannelClass'; + +/* Descriptor ==================================================================== */ +const PayChannelInfo = { + getLabel: (): string => { + return Localize.t('events.paymentChannel'); + }, + + getDescription: PaymentChannelCreateInfo.getDescription, + + getRecipient: (object: PayChannel, account: AccountModel) => { + if (object.Account.address !== account.address) { + return object.Account; + } + + return object.Destination; + }, +}; + +/* Export ==================================================================== */ +export default PayChannelInfo; diff --git a/src/common/libs/ledger/objects/PayChannel/PayChannelValidation.ts b/src/common/libs/ledger/objects/PayChannel/PayChannelValidation.ts new file mode 100644 index 000000000..7bb68f3f4 --- /dev/null +++ b/src/common/libs/ledger/objects/PayChannel/PayChannelValidation.ts @@ -0,0 +1,11 @@ +import PayChannel from '@common/libs/ledger/objects/PayChannel/PayChannelClass'; + +/* Validator ==================================================================== */ +const PayChannelValidation = (object: PayChannel): Promise => { + return new Promise((resolve, reject) => { + reject(new Error(`Object type ${object.Type} does not container validation!`)); + }); +}; + +/* Export ==================================================================== */ +export default PayChannelValidation; diff --git a/src/common/libs/ledger/objects/PayChannel/index.ts b/src/common/libs/ledger/objects/PayChannel/index.ts new file mode 100644 index 000000000..525e0c6c3 --- /dev/null +++ b/src/common/libs/ledger/objects/PayChannel/index.ts @@ -0,0 +1,3 @@ +export { default as PayChannel } from './PayChannelClass'; +export { default as PayChannelValidation } from './PayChannelValidation'; +export { default as PayChannelInfo } from './PayChannelInfo'; diff --git a/src/common/libs/ledger/objects/ticket.ts b/src/common/libs/ledger/objects/Ticket/TicketClass.ts similarity index 81% rename from src/common/libs/ledger/objects/ticket.ts rename to src/common/libs/ledger/objects/Ticket/TicketClass.ts index ee62a71f4..3dddec3a8 100644 --- a/src/common/libs/ledger/objects/ticket.ts +++ b/src/common/libs/ledger/objects/Ticket/TicketClass.ts @@ -1,9 +1,9 @@ import { get } from 'lodash'; -import BaseLedgerObject from './base'; +import BaseLedgerObject from '@common/libs/ledger/objects/BaseLedgerObject'; /* Types ==================================================================== */ -import { LedgerObjectTypes } from '../types'; +import { LedgerObjectTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class Ticket extends BaseLedgerObject { diff --git a/src/common/libs/ledger/objects/Ticket/TicketInfo.ts b/src/common/libs/ledger/objects/Ticket/TicketInfo.ts new file mode 100644 index 000000000..20965c7ef --- /dev/null +++ b/src/common/libs/ledger/objects/Ticket/TicketInfo.ts @@ -0,0 +1,21 @@ +import Localize from '@locale'; + +import Ticket from '@common/libs/ledger/objects/Ticket/TicketClass'; + +/* Descriptor ==================================================================== */ +const TicketInfo = { + getLabel: (object: Ticket): string => { + return `${Localize.t('global.ticket')} #${object.TicketSequence}`; + }, + + getDescription: (object: Ticket): string => { + return `${Localize.t('global.ticketSequence')} #${object.TicketSequence}`; + }, + + getRecipient: (object: Ticket) => { + return object.Account; + }, +}; + +/* Export ==================================================================== */ +export default TicketInfo; diff --git a/src/common/libs/ledger/objects/Ticket/TicketValidation.ts b/src/common/libs/ledger/objects/Ticket/TicketValidation.ts new file mode 100644 index 000000000..5a739921a --- /dev/null +++ b/src/common/libs/ledger/objects/Ticket/TicketValidation.ts @@ -0,0 +1,11 @@ +import Ticket from '@common/libs/ledger/objects/Ticket/TicketClass'; + +/* Validator ==================================================================== */ +const TicketValidation = (object: Ticket): Promise => { + return new Promise((resolve, reject) => { + reject(new Error(`Object type ${object.Type} does not container validation!`)); + }); +}; + +/* Export ==================================================================== */ +export default TicketValidation; diff --git a/src/common/libs/ledger/objects/Ticket/index.ts b/src/common/libs/ledger/objects/Ticket/index.ts new file mode 100644 index 000000000..4288687d3 --- /dev/null +++ b/src/common/libs/ledger/objects/Ticket/index.ts @@ -0,0 +1,3 @@ +export { default as Ticket } from './TicketClass'; +export { default as TicketValidation } from './TicketValidation'; +export { default as TicketInfo } from './TicketInfo'; diff --git a/src/common/libs/ledger/objects/index.ts b/src/common/libs/ledger/objects/index.ts index 7b1e9678b..04425cb37 100644 --- a/src/common/libs/ledger/objects/index.ts +++ b/src/common/libs/ledger/objects/index.ts @@ -1,9 +1,8 @@ -import BaseLedgerObject from './base'; -import Offer from './offer'; -import Escrow from './escrow'; -import Check from './check'; -import Ticket from './ticket'; -import PayChannel from './payChannel'; -import NFTokenOffer from './nfTokenOffer'; +export { default as BaseLedgerObject } from './BaseLedgerObject'; -export { BaseLedgerObject, Offer, Escrow, Check, Ticket, PayChannel, NFTokenOffer }; +export * from './Check'; +export * from './Escrow'; +export * from './NFTokenOffer'; +export * from './Offer'; +export * from './PayChannel'; +export * from './Ticket'; diff --git a/src/common/libs/ledger/parser/common/amount.ts b/src/common/libs/ledger/parser/common/amount.ts index 44b25f85a..fae65748f 100644 --- a/src/common/libs/ledger/parser/common/amount.ts +++ b/src/common/libs/ledger/parser/common/amount.ts @@ -30,7 +30,7 @@ class Amount { this.amount = new BigNumber(newAmount); } - dropsToXrp(toNumber = false): any { + dropsToNative(toNumber = false): any { const xrp = this.amount.dividedBy(1000000.0); if (toNumber) { @@ -40,7 +40,7 @@ class Amount { return xrp.toString(10); } - xrpToDrops(toNumber = false): any { + nativeToDrops(toNumber = false): any { const drops = this.amount.times(1000000.0).decimalPlaces(0); if (toNumber) { diff --git a/src/common/libs/ledger/parser/common/flag.ts b/src/common/libs/ledger/parser/common/flag.ts index 05e845e4d..0b5e407a3 100644 --- a/src/common/libs/ledger/parser/common/flag.ts +++ b/src/common/libs/ledger/parser/common/flag.ts @@ -1,4 +1,3 @@ -import { AccountFlags } from './flags/accountFlags'; import { txFlags, txFlagIndices } from './flags/txFlags'; /* Class ==================================================================== */ @@ -28,9 +27,6 @@ class Flag { let flagsList = {} as any; switch (this.type) { - case 'Account': - flagsList = AccountFlags; - break; case 'AccountSet': flagsList = txFlags.AccountSet; break; @@ -53,6 +49,12 @@ class Flag { case 'NFTokenOffer': flagsList = txFlags.NFTokenCreateOffer; break; + case 'URITokenMint': + flagsList = txFlags.URITokenMint; + break; + case 'ClaimReward': + flagsList = txFlags.ClaimReward; + break; default: break; } diff --git a/src/common/libs/ledger/parser/common/flags/accountFlags.ts b/src/common/libs/ledger/parser/common/flags/accountFlags.ts deleted file mode 100644 index acc3b0f6d..000000000 --- a/src/common/libs/ledger/parser/common/flags/accountFlags.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ - -import { txFlagIndices } from './txFlags'; - -// Ordering from https://developers.ripple.com/accountroot.html -const accountRootFlags = { - // lsfDefaultRipple: - // Enable rippling on trust lines by default. - // Required for issuing addresses; discouraged for others. - DefaultRipple: 0x00800000, - - // lsfDepositAuth: - // Require account to auth deposits. - // This account can only receive funds from transactions it sends, - // or preauthorized accounts. - DepositAuth: 0x01000000, - - // lsfDisableMaster: - // Force regular key. - // Disallows use of the master key. - DisableMaster: 0x00100000, - - // lsfDisallowXRP: - // Disallow sending XRP. - // Not enforced by rippled; client applications should check. - DisallowXRP: 0x00080000, - - // lsfGlobalFreeze: - // Trustlines globally frozen. - GlobalFreeze: 0x00400000, - - // lsfNoFreeze: - // Permanently disallowed freezing trustlines. - // Once enabled, cannot be disabled. - NoFreeze: 0x00200000, - - // lsfPasswordSpent: - // Password set fee is spent. - // The account has used its free SetRegularKey transaction. - PasswordSpent: 0x00010000, - - // lsfRequireAuth: - // Require authorization to hold IOUs (issuances). - RequireAuth: 0x00040000, - - // lsfRequireDestTag: - // Require a DestinationTag for incoming payments. - RequireDestTag: 0x00020000, -}; - -const AccountFlags = { - passwordSpent: accountRootFlags.PasswordSpent, - requireDestinationTag: accountRootFlags.RequireDestTag, - requireAuthorization: accountRootFlags.RequireAuth, - depositAuth: accountRootFlags.DepositAuth, - disallowIncomingXRP: accountRootFlags.DisallowXRP, - disableMasterKey: accountRootFlags.DisableMaster, - noFreeze: accountRootFlags.NoFreeze, - globalFreeze: accountRootFlags.GlobalFreeze, - defaultRipple: accountRootFlags.DefaultRipple, -}; - -const AccountFlagIndices = { - requireDestinationTag: txFlagIndices.AccountSet.asfRequireDest, - requireAuthorization: txFlagIndices.AccountSet.asfRequireAuth, - depositAuth: txFlagIndices.AccountSet.asfDepositAuth, - disallowIncomingXRP: txFlagIndices.AccountSet.asfDisallowXRP, - disableMasterKey: txFlagIndices.AccountSet.asfDisableMaster, - enableTransactionIDTracking: txFlagIndices.AccountSet.asfAccountTxnID, - noFreeze: txFlagIndices.AccountSet.asfNoFreeze, - globalFreeze: txFlagIndices.AccountSet.asfGlobalFreeze, - defaultRipple: txFlagIndices.AccountSet.asfDefaultRipple, -}; - -export { AccountFlagIndices, AccountFlags }; diff --git a/src/common/libs/ledger/parser/common/flags/txFlags.ts b/src/common/libs/ledger/parser/common/flags/txFlags.ts index 89b8952e0..97e904e33 100644 --- a/src/common/libs/ledger/parser/common/flags/txFlags.ts +++ b/src/common/libs/ledger/parser/common/flags/txFlags.ts @@ -56,6 +56,14 @@ const txFlags = { SellToken: 0x00000001, Approved: 0x00000002, }, + + URITokenMint: { + Burnable: 0x00000001, + }, + + ClaimReward: { + OptOut: 0x00000001, + }, }; // The following are integer (as opposed to bit) flags @@ -72,7 +80,11 @@ const txFlagIndices = { asfGlobalFreeze: 7, asfDefaultRipple: 8, asfDepositAuth: 9, - asfAuthorizedMinter: 10, + asfAuthorizedNFTokenMinter: 10, + asfDisallowIncomingNFTokenOffer: 12, + asfDisallowIncomingCheck: 13, + asfDisallowIncomingPayChan: 14, + asfDisallowIncomingTrustline: 15, }, }; diff --git a/src/common/libs/ledger/parser/meta.ts b/src/common/libs/ledger/parser/meta.ts index 9adf6c08c..721ada0c5 100644 --- a/src/common/libs/ledger/parser/meta.ts +++ b/src/common/libs/ledger/parser/meta.ts @@ -2,8 +2,10 @@ import BigNumber from 'bignumber.js'; import { compact, find, flatMap, flatten, groupBy, has, get, isEmpty, map, mapValues } from 'lodash'; +import NetworkService from '@services/NetworkService'; + /* Types ==================================================================== */ -import { BalanceChangeType, OfferStatus } from './types'; +import { BalanceChangeType, OfferStatus, OwnerCountChangeType, ClaimRewardStatus } from './types'; /* Class ==================================================================== */ class Meta { @@ -13,7 +15,7 @@ class Meta { if (!meta.AffectedNodes) { this.nodes = []; } - this.nodes = meta.AffectedNodes.map(this.normalizeNode); + this.nodes = meta.AffectedNodes?.map(this.normalizeNode) || []; } private normalizeNode = (affectedNode: any) => { @@ -106,7 +108,7 @@ class Meta { }; }; - private parseXRPQuantity = (node: any, valueParser: any) => { + private parseNativeQuantity = (node: any, valueParser: any) => { const value = valueParser(node); if (value === null) { @@ -118,7 +120,7 @@ class Meta { return { address: node.finalFields.Account || node.newFields.Account, balance: { - currency: 'XRP', + currency: NetworkService.getNativeAsset(), value: valueNumber.absoluteValue().dividedBy(1000000.0).decimalPlaces(8).toString(10), action: valueNumber.isNegative() ? 'DEC' : 'INC', }, @@ -224,7 +226,7 @@ class Meta { parseBalanceChanges = (): { [key: string]: BalanceChangeType[] } => { const values = this.nodes.map((node) => { if (node.entryType === 'AccountRoot') { - return [this.parseXRPQuantity(node, this.computeBalanceChange)]; + return [this.parseNativeQuantity(node, this.computeBalanceChange)]; } if (node.entryType === 'RippleState') { return this.parseTrustlineQuantity(node, this.computeBalanceChange); @@ -236,7 +238,7 @@ class Meta { return this.groupByAddress(compact(flatten(values))); }; - parseOwnerCountChanges = () => { + parseOwnerCountChanges = (): OwnerCountChangeType[] => { const values = this.nodes.map((node) => { if (node.entryType === 'AccountRoot') { return this.parseOwnerCountQuantity(node, this.computeOwnerCountChange); @@ -257,6 +259,26 @@ class Meta { return compact(values); }; + + // TODO: fix me + parseClaimRewardStatus = (): ClaimRewardStatus => { + // if there is an emitted transaction from "ADDRESS_ONE", it means the reward has been claimed + const ADDRESS_ONE = 'rrrrrrrrrrrrrrrrrrrrBZbvji'; + + const emittedTx = find(this.nodes, (node) => { + return ( + node.entryType === 'EmittedTxn' && + get(node, 'newFields.EmittedTxn.Account') === ADDRESS_ONE && + get(node, 'newFields.EmittedTxn.TransactionType') === 'GenesisMint' + ); + }); + + if (emittedTx) { + return ClaimRewardStatus.OptIn; + } + + return ClaimRewardStatus.OptOut; + }; } export default Meta; diff --git a/src/common/libs/ledger/parser/types.ts b/src/common/libs/ledger/parser/types.ts index 642ceb49a..c2a85c9c4 100644 --- a/src/common/libs/ledger/parser/types.ts +++ b/src/common/libs/ledger/parser/types.ts @@ -10,10 +10,21 @@ export enum OfferStatus { UNKNOWN = 'UNKNOWN', } +export enum ClaimRewardStatus { + OptIn = 'OptIn', + OptOut = 'OptOut', +} + export interface BalanceChangeType extends AmountType { action: 'DEC' | 'INC'; } +export interface OwnerCountChangeType { + address: string; + value: number; + action: string; +} + /** * Ledger and transaction types */ @@ -25,7 +36,7 @@ export type LedgerAmount = string | AmountType; /** * Specification of which currency the account taking the offer would pay/ - * receive, as an object with currency and issuer fields (omit issuer for XRP). + * receive, as an object with currency and issuer fields (omit issuer for native asset). * Similar to currency amounts. */ export interface TakerRequestAmount { @@ -34,7 +45,7 @@ export interface TakerRequestAmount { } /** - * A currency-counterparty pair, or just currency if it's XRP. + * A currency-counterparty pair, or just currency if it's native currency. */ export interface Issuer { currency: string; @@ -70,26 +81,44 @@ export type MemoType = { MemoType?: string; }; +/** + * Transaction Account + */ export type Account = { name?: string; address: string; tag?: number; }; +/** + * Transaction Destination + */ export type Destination = { name?: string; address: string; tag?: number; }; +/** + * Transaction Result submitted by the app + */ export type TransactionResult = { success: boolean; code: string; message?: string; }; +/** + * Signer entry + */ export type SignerEntry = { account: string; weight: number; walletLocator?: string; }; + +export interface Signer { + account: string; + signature: string; + pubKey: string; +} diff --git a/src/common/libs/ledger/pathFinding.ts b/src/common/libs/ledger/pathFinding.ts index 537880054..6e8fd8b53 100644 --- a/src/common/libs/ledger/pathFinding.ts +++ b/src/common/libs/ledger/pathFinding.ts @@ -2,11 +2,11 @@ synchronous path_finding */ +import EventEmitter from 'events'; import { flatMap } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import EventEmitter from 'events'; -import { SocketService } from '@services'; +import { NetworkService } from '@services'; import { PathOption, RipplePathFindResponse } from '@common/libs/ledger/types'; import { LedgerAmount } from '@common/libs/ledger/parser/types'; @@ -14,6 +14,7 @@ import { LedgerAmount } from '@common/libs/ledger/parser/types'; /* Types ==================================================================== */ declare interface LedgerPathFinding { on(event: 'expire', listener: () => void): this; + on(event: string, listener: Function): this; } @@ -68,12 +69,12 @@ class LedgerPathFinding extends EventEmitter { // listen for ledger close events private subscribePathFind = () => { - SocketService.onEvent('path', this.handlePathFindEvent); + NetworkService.onEvent('path', this.handlePathFindEvent); }; // listen for ledger close events private unsubscribePathFind = () => { - SocketService.offEvent('path', this.handlePathFindEvent); + NetworkService.offEvent('path', this.handlePathFindEvent); }; private handlePathOptions = (options: PathOption[], shouldResolve?: boolean) => { @@ -81,7 +82,7 @@ class LedgerPathFinding extends EventEmitter { const { source_amount } = option; if (typeof source_amount === 'string') { - this.paymentOptions.XRP = option; + this.paymentOptions[NetworkService.getNativeAsset()] = option; } else if (typeof source_amount === 'object') { this.paymentOptions[`${source_amount.issuer}:${source_amount.currency}`] = option; } @@ -140,7 +141,7 @@ class LedgerPathFinding extends EventEmitter { this.requestId = uuidv4(); // send socket request - SocketService.send({ + NetworkService.send({ id: this.requestId, command: 'path_find', subcommand: 'create', @@ -153,7 +154,7 @@ class LedgerPathFinding extends EventEmitter { // request is canceled if (id !== this.requestId) { - reject(new Error('CANCELED')); + reject(new Error('Request has been canceled and invalidated')); return; } @@ -207,7 +208,7 @@ class LedgerPathFinding extends EventEmitter { this.unsubscribePathFind(); // close the request - SocketService.send({ + NetworkService.send({ id: this.requestId, command: 'path_find', subcommand: 'close', diff --git a/src/common/libs/ledger/transactions/__tests__/accountDelete.test.ts b/src/common/libs/ledger/transactions/__tests__/accountDelete.test.ts deleted file mode 100644 index 6ce3f1746..000000000 --- a/src/common/libs/ledger/transactions/__tests__/accountDelete.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import AccountDelete from '../accountDelete'; - -import txTemplates from './templates/AccountDeleteTx.json'; - -jest.mock('@services/LedgerService'); - -describe('AccountDelete tx', () => { - it('Should set tx type if not set', () => { - const instance = new AccountDelete(); - expect(instance.TransactionType).toBe('AccountDelete'); - expect(instance.Type).toBe('AccountDelete'); - }); - - it('Should return right parsed values', () => { - const { tx, meta } = txTemplates; - const instance = new AccountDelete(tx, meta); - - expect(instance.Amount).toStrictEqual({ - currency: 'XRP', - value: '15.00102', - }); - - expect(instance.Destination).toStrictEqual({ - tag: 0, - address: 'r49LZgcrnFU7YRAjMwxWSoxAcsRom5ZGym', - }); - }); - - it('it should calculate right fee', () => { - const { tx, meta } = txTemplates; - const instance = new AccountDelete(tx, meta); - - expect(instance.calculateFee()).toBe('2000000'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/accountSet.test.ts b/src/common/libs/ledger/transactions/__tests__/accountSet.test.ts deleted file mode 100644 index ccbb07bff..000000000 --- a/src/common/libs/ledger/transactions/__tests__/accountSet.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import AccountSet from '../accountSet'; - -import txTemplates from './templates/AccountSetTx.json'; - -describe('AccountSet tx', () => { - it('Should set tx type if not set', () => { - const instance = new AccountSet(); - expect(instance.TransactionType).toBe('AccountSet'); - expect(instance.Type).toBe('AccountSet'); - }); - - it('Should return right parsed values', () => { - const { tx } = txTemplates; - const instance = new AccountSet(tx); - - expect(instance.Domain).toBe('example.com'); - expect(instance.MessageKey).toBe('03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB'); - expect(instance.SetFlag).toBe('asfAccountTxnID'); - expect(instance.ClearFlag).toBe('asfDisableMaster'); - expect(instance.EmailHash).toBe('0bc83cb571cd1c50ba6f3e8a78ef1346'); - expect(instance.TransferRate).toBe(0.2); - expect(instance.TickSize).toBe(0); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/base.test.ts b/src/common/libs/ledger/transactions/__tests__/base.test.ts deleted file mode 100644 index 5abf093b1..000000000 --- a/src/common/libs/ledger/transactions/__tests__/base.test.ts +++ /dev/null @@ -1,200 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import LedgerService from '@services/LedgerService'; -import BaseTransaction from '../base'; - -import Memo from '../../parser/common/memo'; - -import txTemplates from './templates/BaseTx.json'; -import paymentTemplates from './templates/PaymentTx.json'; - -describe('BaseTransaction tx', () => { - it('Should return right parsed values', () => { - const { tx, meta } = txTemplates; - - const instance = new BaseTransaction(tx, meta); - - expect(instance.Account).toStrictEqual({ - tag: 456, - address: tx.Account, - }); - - expect(instance.Memos).toStrictEqual([ - { MemoData: 'XRP Tip Bot', MemoFormat: undefined, MemoType: 'XrpTipBotNote' }, - ]); - - expect(instance.Fee).toBe('0.000012'); - - expect(instance.Date).toBe('2020-09-02T07:24:11.000Z'); - - expect(instance.Hash).toBe(tx.hash); - expect(instance.SigningPubKey).toBe(tx.SigningPubKey); - - expect(instance.LedgerIndex).toBe(tx.ledger_index); - expect(instance.LastLedgerSequence).toBe(tx.LastLedgerSequence); - expect(instance.Sequence).toBe(tx.Sequence); - - expect(instance.TransactionResult).toStrictEqual({ - success: true, - code: 'tesSUCCESS', - message: undefined, - }); - }); - - it('Should set/get common fields', () => { - const instance = new BaseTransaction(); - - instance.Account = { - address: 'rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY', - tag: 456, - }; - expect(instance.Account).toStrictEqual({ - tag: 456, - address: 'rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY', - }); - - instance.Memos = [Memo.Encode('Memo Description')]; - expect(instance.Memos).toStrictEqual([ - { MemoData: 'Memo Description', MemoFormat: 'text/plain', MemoType: 'Description' }, - ]); - - instance.Fee = '0.000012'; - expect(instance.Fee).toBe('0.000012'); - - instance.Hash = '7F10793B5781BD5DD52F70096520321A08DD2ED19AFC7E3F193AAC293954F7DF'; - expect(instance.Hash).toBe('7F10793B5781BD5DD52F70096520321A08DD2ED19AFC7E3F193AAC293954F7DF'); - - instance.Sequence = 34306; - expect(instance.Sequence).toBe(34306); - - instance.LastLedgerSequence = 57913677; - expect(instance.LastLedgerSequence).toBe(57913677); - - instance.SigningPubKey = '03DF3AB842EB1B57F0A848CD7CC2CFD35F66E4AD0625EEACFFE72A45E4D13E49A'; - expect(instance.SigningPubKey).toBe('03DF3AB842EB1B57F0A848CD7CC2CFD35F66E4AD0625EEACFFE72A45E4D13E49A'); - }); - - it('Should return right transaction result', () => { - const instance = new BaseTransaction(); - - // transaction already verified by network - // @ts-ignore - instance.meta.TransactionResult = 'tesSUCCESS'; - - expect(instance.TransactionResult).toStrictEqual({ - success: true, - code: 'tesSUCCESS', - message: undefined, - }); - - // transaction is not verified by network and failed - // @ts-ignore - instance.meta.TransactionResult = 'tecNO_LINE_INSUF_RESERVE'; - - instance.SubmitResult = { - success: true, - engineResult: 'tecNO_LINE_INSUF_RESERVE', - message: 'No such line. Too little reserve to create it.', - node: 'wss://xrplcluster.com', - nodeType: 'Mainnet', - }; - - instance.VerifyResult = { - success: false, - }; - - expect(instance.TransactionResult).toStrictEqual({ - success: false, - code: 'tecNO_LINE_INSUF_RESERVE', - message: 'No such line. Too little reserve to create it.', - }); - - // transaction is not verified by network and hard failed - // @ts-ignore - instance.meta.TransactionResult = undefined; - - instance.SubmitResult = { - success: false, - engineResult: 'temBAD_FEE', - message: 'temBAD_FEE description', - node: 'wss://xrplcluster.com', - nodeType: 'Mainnet', - }; - - instance.VerifyResult = { - success: false, - }; - - expect(instance.TransactionResult).toStrictEqual({ - success: false, - code: 'temBAD_FEE', - message: 'temBAD_FEE description', - }); - }); - - it('Should be able to prepare the transaction for signing', async () => { - const address = 'rEAa7TDpBdL1hoRRAp3WDmzBcuQzaXssmb'; - - // mock the ledger service response - const spy = jest.spyOn(LedgerService, 'getAccountInfo').mockImplementation(() => - Promise.resolve({ - account_data: { - Account: address, - Balance: '49507625423', - Flags: 131072, - OwnerCount: 1135, - PreviousTxnID: '48DB4C987EDE802030089C48F27FF7A0F589EBA7C3A9F90873AA030D5960F149', - PreviousTxnLgrSeq: 58057100, - Sequence: 34321, - }, - }), - ); - - // create a transaction instance for signing - const { tx, meta } = paymentTemplates.SimplePayment; - const instance = new BaseTransaction(tx, meta); - - // prepare the transaction by applying the private key - await instance.prepare(); - - // run test to check if it properly prepared transaction - expect(instance.Account).toStrictEqual({ - tag: undefined, - address, - }); - - // should set the sequence number - expect(instance.Sequence).toBe(34321); - - spy.mockRestore(); - }); - - it('Should be able to populate the transaction LastLedgerSequence', async () => { - const LastLedger = 68312096; - - // mock the ledger service response - const spy = jest.spyOn(LedgerService, 'getLedgerStatus').mockImplementation(() => { - return { Fee: 12, LastLedger }; - }); - - // should set if LastLedgerSequence undefined - const { tx, meta } = paymentTemplates.SimplePayment; - const instance = new BaseTransaction(tx, meta); - instance.LastLedgerSequence = undefined; - instance.populateLastLedgerSequence(); - expect(instance.LastLedgerSequence).toBe(LastLedger + 10); - - // should update LastLedgerSequence if sequence is passed - instance.LastLedgerSequence = LastLedger - 500; - instance.populateLastLedgerSequence(); - expect(instance.LastLedgerSequence).toBe(LastLedger + 10); - - // should update LastLedgerSequence if sequence is less than 32570 - instance.LastLedgerSequence = 50; - instance.populateLastLedgerSequence(); - expect(instance.LastLedgerSequence).toBe(LastLedger + 50); - - spy.mockRestore(); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/checkCancel.test.ts b/src/common/libs/ledger/transactions/__tests__/checkCancel.test.ts deleted file mode 100644 index e17ae4883..000000000 --- a/src/common/libs/ledger/transactions/__tests__/checkCancel.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import CheckCancel from '../checkCancel'; -import CheckCreate from '../checkCreate'; - -import checkCancelTemplates from './templates/CheckCancelTx.json'; -import checkCreateTemplate from './templates/CheckCreateTx.json'; - -describe('CheckCancel tx', () => { - it('Should set tx type if not set', () => { - const instance = new CheckCancel(); - expect(instance.TransactionType).toBe('CheckCancel'); - expect(instance.Type).toBe('CheckCancel'); - }); - - it('Should return right parsed values', () => { - // @ts-ignore - const { tx, meta } = checkCancelTemplates; - const instance = new CheckCancel(tx, meta); - - expect(instance.CheckID).toBe('6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B'); - }); - - it('Should set check object', () => { - // @ts-ignore - const { tx, meta } = checkCancelTemplates; - const instance = new CheckCancel(tx, meta); - - const checkCreate = new CheckCreate(checkCreateTemplate.tx); - - instance.Check = checkCreate; - - expect(instance.Check).toBeDefined(); - expect(instance.isExpired).toBe(true); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/checkCash.test.ts b/src/common/libs/ledger/transactions/__tests__/checkCash.test.ts deleted file mode 100644 index c7ceeae1b..000000000 --- a/src/common/libs/ledger/transactions/__tests__/checkCash.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import CheckCash from '../checkCash'; -import CheckCreate from '../checkCreate'; - -import checkCashTemplates from './templates/CheckCashTx.json'; -import checkCreateTemplate from './templates/CheckCreateTx.json'; - -describe('CheckCash tx', () => { - it('Should set tx type if not set', () => { - const instance = new CheckCash(); - expect(instance.TransactionType).toBe('CheckCash'); - expect(instance.Type).toBe('CheckCash'); - }); - - it('Should return right parsed values', () => { - // @ts-ignore - const { tx, meta } = checkCashTemplates; - const instance = new CheckCash(tx, meta); - - expect(instance.CheckID).toBe('6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B'); - - expect(instance.Amount).toStrictEqual({ - currency: 'XRP', - value: '100', - }); - }); - - it('Should set check object', () => { - // @ts-ignore - const { tx, meta } = checkCashTemplates; - const instance = new CheckCash(tx, meta); - - const checkCreate = new CheckCreate(checkCreateTemplate.tx); - - instance.Check = checkCreate; - - expect(instance.Check).toBeDefined(); - expect(instance.isExpired).toBe(true); - }); - - it('Should set/get fields', () => { - const instance = new CheckCash(); - - // @ts-ignore - instance.Amount = '100'; - expect(instance.Amount).toStrictEqual({ - currency: 'XRP', - value: '100', - }); - - // @ts-ignore - instance.Amount = { - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }; - expect(instance.Amount).toStrictEqual({ - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }); - - // @ts-ignore - instance.DeliverMin = '100'; - expect(instance.DeliverMin).toStrictEqual({ - currency: 'XRP', - value: '100', - }); - - // @ts-ignore - instance.DeliverMin = { - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }; - expect(instance.DeliverMin).toStrictEqual({ - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/checkCreate.test.ts b/src/common/libs/ledger/transactions/__tests__/checkCreate.test.ts deleted file mode 100644 index a092844ae..000000000 --- a/src/common/libs/ledger/transactions/__tests__/checkCreate.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import CheckCreate from '../checkCreate'; - -import checkCreateTemplate from './templates/CheckCreateTx.json'; - -describe('CheckCreate tx', () => { - it('Should set tx type if not set', () => { - const instance = new CheckCreate(); - expect(instance.TransactionType).toBe('CheckCreate'); - expect(instance.Type).toBe('CheckCreate'); - }); - - it('Should return right parsed values', () => { - const { tx, meta } = checkCreateTemplate; - const instance = new CheckCreate(tx, meta); - - expect(instance.SendMax).toStrictEqual({ - currency: 'XRP', - value: '100', - }); - - expect(instance.Expiration).toBe('2018-01-24T12:52:01.000Z'); - - expect(instance.Destination).toStrictEqual({ - tag: 1, - address: 'rfkE1aSy9G8Upk4JssnwBxhEv5p4mn2KTy', - }); - - expect(instance.InvoiceID).toBe('6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B'); - }); - - it('Should set/get fields', () => { - const instance = new CheckCreate(); - - // @ts-ignore - instance.SendMax = '100'; - expect(instance.SendMax).toStrictEqual({ - currency: 'XRP', - value: '100', - }); - - // @ts-ignore - instance.SendMax = { - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }; - expect(instance.SendMax).toStrictEqual({ - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/depositPreauth.test.ts b/src/common/libs/ledger/transactions/__tests__/depositPreauth.test.ts deleted file mode 100644 index 5505cfa95..000000000 --- a/src/common/libs/ledger/transactions/__tests__/depositPreauth.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import DepositPreauth from '../depositPreauth'; - -import depositPreauthTemplate from './templates/DepositPreauthTx.json'; - -describe('DepositPreauth tx', () => { - it('Should set tx type if not set', () => { - const instance = new DepositPreauth(); - expect(instance.TransactionType).toBe('DepositPreauth'); - expect(instance.Type).toBe('DepositPreauth'); - }); - - it('Should return right parsed values', () => { - // @ts-ignore - const { tx, meta } = depositPreauthTemplate; - const instance = new DepositPreauth(tx, meta); - - expect(instance.Authorize).toBe('rEhxGqkqPPSxQ3P25J66ft5TwpzV14k2de'); - - expect(instance.Unauthorize).toBe('rEhxGqkqPPSxQ3P25J66ft5TwpzV14k2de'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/escrowCancel.test.ts b/src/common/libs/ledger/transactions/__tests__/escrowCancel.test.ts deleted file mode 100644 index bdd8c0772..000000000 --- a/src/common/libs/ledger/transactions/__tests__/escrowCancel.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import EscrowCancel from '../escrowCancel'; - -import escrowCancelTemplate from './templates/EscrowCancelTx.json'; - -describe('EscrowCancel tx', () => { - it('Should set tx type if not set', () => { - const instance = new EscrowCancel(); - expect(instance.TransactionType).toBe('EscrowCancel'); - expect(instance.Type).toBe('EscrowCancel'); - }); - - it('Should return right parsed values', () => { - const { tx, meta } = escrowCancelTemplate; - const instance = new EscrowCancel(tx, meta); - - expect(instance.Owner).toBe('rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn'); - - expect(instance.OfferSequence).toBe(7); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/escrowCreate.test.ts b/src/common/libs/ledger/transactions/__tests__/escrowCreate.test.ts deleted file mode 100644 index b902a4437..000000000 --- a/src/common/libs/ledger/transactions/__tests__/escrowCreate.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import EscrowCreate from '../escrowCreate'; - -import escrowCreateTemplate from './templates/EscrowCreateTx.json'; - -describe('EscrowCreate tx', () => { - it('Should set tx type if not set', () => { - const instance = new EscrowCreate(); - expect(instance.TransactionType).toBe('EscrowCreate'); - expect(instance.Type).toBe('EscrowCreate'); - }); - - it('Should return right parsed values', () => { - const { tx, meta } = escrowCreateTemplate; - const instance = new EscrowCreate(tx, meta); - - expect(instance.Destination).toStrictEqual({ - tag: 23480, - address: 'rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW', - }); - expect(instance.Amount).toStrictEqual({ - currency: 'XRP', - value: '0.01', - }); - - expect(instance.Condition).toBe( - 'A0258020E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855810100', - ); - - expect(instance.CancelAfter).toBe('2016-11-23T23:12:38.000Z'); - expect(instance.FinishAfter).toBe('2016-11-22T23:12:38.000Z'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/escrowFinish.test.ts b/src/common/libs/ledger/transactions/__tests__/escrowFinish.test.ts deleted file mode 100644 index 601c97c8d..000000000 --- a/src/common/libs/ledger/transactions/__tests__/escrowFinish.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import EscrowFinish from '../escrowFinish'; - -import escrowFinishTemplate from './templates/EscrowFinishTx.json'; - -describe('EscrowFinish tx', () => { - it('Should set tx type if not set', () => { - const instance = new EscrowFinish(); - expect(instance.TransactionType).toBe('EscrowFinish'); - expect(instance.Type).toBe('EscrowFinish'); - }); - - it('Should return right parsed values', () => { - const { tx, meta } = escrowFinishTemplate; - const instance = new EscrowFinish(tx, meta); - - expect(instance.Destination).toStrictEqual({ - tag: undefined, - address: 'rKwJaGmB5Hz24Qs2iyCaTdUuL1WsEXUWy5', - }); - expect(instance.Amount).toStrictEqual({ - currency: 'XRP', - value: '500000000', - }); - - expect(instance.Owner).toBe(tx.Owner); - - expect(instance.Fulfillment).toBe(tx.Fulfillment); - expect(instance.Condition).toBe(tx.Condition); - - expect(instance.OfferSequence).toBe(tx.OfferSequence); - }); - - it('it should calcualte right fee with fulfillment ', () => { - const { tx, meta } = escrowFinishTemplate; - const instance = new EscrowFinish(tx, meta); - expect(instance.calculateFee()).toBe('402'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/nfTokenAcceptOffer.test.ts b/src/common/libs/ledger/transactions/__tests__/nfTokenAcceptOffer.test.ts deleted file mode 100644 index 6cc59a8ef..000000000 --- a/src/common/libs/ledger/transactions/__tests__/nfTokenAcceptOffer.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ -import NFTokenAcceptOffer from '../nfTokenAcceptOffer'; - -describe('NFTokenAcceptOffer tx', () => { - it('Should set tx type if not set', () => { - const instance = new NFTokenAcceptOffer(); - expect(instance.TransactionType).toBe('NFTokenAcceptOffer'); - expect(instance.Type).toBe('NFTokenAcceptOffer'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/nfTokenBurn.test.ts b/src/common/libs/ledger/transactions/__tests__/nfTokenBurn.test.ts deleted file mode 100644 index 91c061db1..000000000 --- a/src/common/libs/ledger/transactions/__tests__/nfTokenBurn.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ -import NFTokenBurn from '../nfTokenBurn'; - -describe('NFTokenBurn tx', () => { - it('Should set tx type if not set', () => { - const instance = new NFTokenBurn(); - expect(instance.TransactionType).toBe('NFTokenBurn'); - expect(instance.Type).toBe('NFTokenBurn'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/nfTokenCancelOffer.test.ts b/src/common/libs/ledger/transactions/__tests__/nfTokenCancelOffer.test.ts deleted file mode 100644 index d4cfd5083..000000000 --- a/src/common/libs/ledger/transactions/__tests__/nfTokenCancelOffer.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ -import NFTokenCancelOffer from '../nfTokenCancelOffer'; - -describe('NFTokenCancelOffer tx', () => { - it('Should set tx type if not set', () => { - const instance = new NFTokenCancelOffer(); - expect(instance.TransactionType).toBe('NFTokenCancelOffer'); - expect(instance.Type).toBe('NFTokenCancelOffer'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/nfTokenCreateOffer.ts b/src/common/libs/ledger/transactions/__tests__/nfTokenCreateOffer.ts deleted file mode 100644 index 7434be978..000000000 --- a/src/common/libs/ledger/transactions/__tests__/nfTokenCreateOffer.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ -import NFTokenCreateOffer from '../nfTokenCreateOffer'; - -describe('NFTokenCreateOffer tx', () => { - it('Should set tx type if not set', () => { - const instance = new NFTokenCreateOffer(); - expect(instance.TransactionType).toBe('NFTokenCreateOffer'); - expect(instance.Type).toBe('NFTokenCreateOffer'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/nfTokenMint.test.ts b/src/common/libs/ledger/transactions/__tests__/nfTokenMint.test.ts deleted file mode 100644 index a33320d84..000000000 --- a/src/common/libs/ledger/transactions/__tests__/nfTokenMint.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ -import NFTokenMint from '../nfTokenMint'; - -describe('NFTokenMint tx', () => { - it('Should set tx type if not set', () => { - const instance = new NFTokenMint(); - expect(instance.TransactionType).toBe('NFTokenMint'); - expect(instance.Type).toBe('NFTokenMint'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/offerCancel.test.ts b/src/common/libs/ledger/transactions/__tests__/offerCancel.test.ts deleted file mode 100644 index a205ffe14..000000000 --- a/src/common/libs/ledger/transactions/__tests__/offerCancel.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import OfferCancel from '../offerCancel'; - -import offerCancelTemplates from './templates/OfferCancelTx.json'; - -describe('OfferCancel tx', () => { - it('Should set tx type if not set', () => { - const instance = new OfferCancel(); - expect(instance.TransactionType).toBe('OfferCancel'); - expect(instance.Type).toBe('OfferCancel'); - }); - - it('Should return right parsed values', () => { - const { tx, meta } = offerCancelTemplates; - const instance = new OfferCancel(tx, meta); - - expect(instance.OfferSequence).toBe(6); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/offerCreate.test.ts b/src/common/libs/ledger/transactions/__tests__/offerCreate.test.ts deleted file mode 100644 index dcd29eda2..000000000 --- a/src/common/libs/ledger/transactions/__tests__/offerCreate.test.ts +++ /dev/null @@ -1,173 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import OfferCreate from '../offerCreate'; - -import offerCreateTemplates from './templates/OfferCreateTx.json'; - -describe('OfferCreate tx', () => { - it('Should set tx type if not set', () => { - const instance = new OfferCreate(); - expect(instance.TransactionType).toBe('OfferCreate'); - expect(instance.Type).toBe('OfferCreate'); - }); - - it('Should return right parsed values for executed order XRP->IOU', () => { - const { tx, meta } = offerCreateTemplates.XRPIOU; - const instance = new OfferCreate(tx, meta); - - expect(instance.GetOfferStatus(tx.Account)).toBe('FILLED'); - expect(instance.OfferSequence).toBe(94); - expect(instance.Rate).toBe(0.000024271999999999997); - expect(instance.Expiration).toBe(undefined); - - expect(instance.TakerPays).toStrictEqual({ - currency: 'BTC', - issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', - value: '0.012136', - }); - expect(instance.TakerPaid()).toStrictEqual({ - action: 'INC', - currency: 'BTC', - issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', - value: '0.01257026', - }); - expect(instance.TakerGets).toStrictEqual({ - currency: 'XRP', - value: '500', - }); - expect(instance.TakerGot()).toStrictEqual({ - action: 'DEC', - currency: 'XRP', - value: '500', - }); - }); - - it('Should return right parsed values for executed order IOU->XRP', () => { - const { tx, meta } = offerCreateTemplates.IOUXRP; - const instance = new OfferCreate(tx, meta); - - expect(instance.GetOfferStatus(tx.Account)).toBe('FILLED'); - expect(instance.OfferSequence).toBe(112); - expect(instance.Rate).toBe(0.000025941414017897298); - expect(instance.Expiration).toBe(undefined); - - expect(instance.TakerPays).toStrictEqual({ - currency: 'XRP', - value: '484.553386', - }); - expect(instance.TakerPaid()).toStrictEqual({ - action: 'INC', - currency: 'XRP', - value: '501.44754', - }); - expect(instance.TakerGets).toStrictEqual({ - currency: 'BTC', - issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', - value: '0.01257', - }); - expect(instance.TakerGot()).toStrictEqual({ - action: 'DEC', - currency: 'BTC', - issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', - value: '0.01257026', - }); - }); - - it('Should set right values XRP->IOU ', () => { - const offer = new OfferCreate(); - - offer.TakerGets = { currency: 'XRP', value: '500' }; - offer.TakerPays = { currency: 'BTC', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', value: '0.012136' }; - offer.Expiration = '05 October 2011 14:48 UTC'; - - expect(offer.TakerGets).toStrictEqual({ - currency: 'XRP', - value: '500', - }); - - expect(offer.TakerPays).toStrictEqual({ - currency: 'BTC', - issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', - value: '0.012136', - }); - - expect(offer.Expiration).toBe('2011-10-05T14:48:00.000Z'); - }); - - it('Should set right values IOU->XRP ', () => { - const offer = new OfferCreate(); - - offer.TakerPays = { currency: 'XRP', value: '500' }; - offer.TakerGets = { currency: 'BTC', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', value: '0.012136' }; - - expect(offer.TakerPays).toStrictEqual({ - currency: 'XRP', - value: '500', - }); - - expect(offer.TakerGets).toStrictEqual({ - currency: 'BTC', - issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', - value: '0.012136', - }); - }); - - it('Should return right parsed values for executed order from another owner', () => { - const { tx, meta } = offerCreateTemplates.XRPIOUDifferentOwner; - const instance = new OfferCreate(tx, meta); - - expect(instance.GetOfferStatus('rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ')).toBe('PARTIALLY_FILLED'); - expect(instance.OfferSequence).toBe(56270334); - expect(instance.Rate).toBe(0.38076); - expect(instance.Expiration).toBe(undefined); - - expect(instance.TakerGets).toStrictEqual({ - currency: 'XRP', - value: '100', - }); - expect(instance.TakerGot('rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ')).toStrictEqual({ - action: 'DEC', - currency: '534F4C4F00000000000000000000000000000000', - issuer: 'rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz', - value: '38.46538462', - }); - expect(instance.TakerPays).toStrictEqual({ - currency: '534F4C4F00000000000000000000000000000000', - issuer: 'rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz', - value: '38.076', - }); - expect(instance.TakerPaid('rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ')).toStrictEqual({ - action: 'INC', - currency: 'XRP', - value: '100', - }); - }); - - it('Should return zero for taker got and taker paid if order cancelled or killed', () => { - const { tx, meta } = offerCreateTemplates.XRPIOUCANCELED; - const instance = new OfferCreate(tx, meta); - - // expect(instance.Executed).toBe(true); - expect(instance.OfferSequence).toBe(61160755); - - expect(instance.TakerGets).toStrictEqual({ - currency: 'XRP', - value: '50', - }); - expect(instance.TakerGot('rQamE9ddZiRZLKRAAzwGKboQ8rQHgesjEs')).toStrictEqual({ - currency: 'XRP', - value: '0', - }); - expect(instance.TakerPays).toStrictEqual({ - currency: 'CSC', - issuer: 'rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr', - value: '11616.66671104', - }); - expect(instance.TakerPaid('rQamE9ddZiRZLKRAAzwGKboQ8rQHgesjEs')).toStrictEqual({ - currency: 'CSC', - issuer: 'rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr', - value: '0', - }); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/payment.test.ts b/src/common/libs/ledger/transactions/__tests__/payment.test.ts deleted file mode 100644 index af7f17402..000000000 --- a/src/common/libs/ledger/transactions/__tests__/payment.test.ts +++ /dev/null @@ -1,224 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ -import LedgerService from '@services/LedgerService'; - -import Payment from '../payment'; - -import txTemplates from './templates/PaymentTx.json'; - -describe('Payment tx', () => { - it('Should set tx type if not set', () => { - const instance = new Payment(); - expect(instance.TransactionType).toBe('Payment'); - expect(instance.Type).toBe('Payment'); - }); - - it('Should return right parsed values for tx XRP->XRP', () => { - const { tx, meta } = txTemplates.XRP2XRP; - const instance = new Payment(tx, meta); - - expect(instance.InvoiceID).toBe('123'); - - expect(instance.Amount).toStrictEqual({ - currency: 'XRP', - value: '85.5321', - }); - - expect(instance.Destination).toStrictEqual({ - tag: 123, - address: 'rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh', - }); - }); - - it('Should return right parsed values for tx to self with path sets', () => { - const { tx, meta } = txTemplates.ToSelfWithPath; - const instance = new Payment(tx, meta); - - expect(instance.BalanceChange()).toStrictEqual({ - received: { - action: 'INC', - currency: 'XRP', - value: '0.999988', - }, - sent: { - action: 'DEC', - currency: 'USD', - issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', - value: '1.23905437', - }, - }); - }); - - it('Should set/get payment fields', () => { - const instance = new Payment(); - - instance.InvoiceID = '123'; - expect(instance.InvoiceID).toBe('123'); - - // amount - // @ts-ignore - instance.Amount = '85.5321'; - expect(instance.Amount).toStrictEqual({ - currency: 'XRP', - value: '85.5321', - }); - - instance.Amount = { - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }; - expect(instance.Amount).toStrictEqual({ - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }); - - instance.Destination = { - address: 'rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh', - tag: 1234, - }; - expect(instance.Destination).toStrictEqual({ - tag: 1234, - address: 'rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh', - }); - - instance.SendMax = { - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }; - expect(instance.SendMax).toStrictEqual({ - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }); - // @ts-ignore - instance.SendMax = '85.5321'; - expect(instance.SendMax).toStrictEqual({ - currency: 'XRP', - value: '85.5321', - }); - - instance.DeliverMin = { - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }; - expect(instance.DeliverMin).toStrictEqual({ - currency: 'USD', - issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - value: '1', - }); - // @ts-ignore - instance.DeliverMin = '85.5321'; - expect(instance.DeliverMin).toStrictEqual({ - currency: 'XRP', - value: '85.5321', - }); - }); - - it('Should be able to validate the transaction', async () => { - const Account = 'rEAa7TDpBdL1hoRRAp3WDmzBcuQzaXssmb'; - const Destination = 'r39CmfchUiq3y2xJ23nJpnDHVitPbiHbAz'; - - // should reject if no amount is added to the transaction - const paymentsWithEmptyAmount = [ - {}, - { Amount: '0' }, - { Amount: { currency: 'USD' } }, - { Amount: { currency: 'USD', value: '0' } }, - ]; - for (const payment of paymentsWithEmptyAmount) { - await expect(new Payment(payment).validate()).rejects.toThrow( - new Error('[missing "en.send.pleaseEnterAmount" translation]'), - ); - } - - // should reject if sending XRP and insufficient balance - const spyAvailableBalance = jest - .spyOn(LedgerService, 'getAccountAvailableBalance') - .mockImplementation(() => Promise.resolve(10)); - - const spyGetFilteredAccountLine = jest.spyOn(LedgerService, 'getFilteredAccountLine').mockImplementation(() => - Promise.resolve({ - limit: '10000', - balance: '10', - account: 'r...', - currency: 'USD', - limit_peer: '0', - quality_in: 0, - quality_out: 0, - }), - ); - - const paymentsWithXRPPayments = [ - { Account, Destination, Amount: '20000000' }, - { Account, Destination, Amount: { currency: 'USD', value: '1' }, SendMax: '20000000' }, - ]; - - for (const payment of paymentsWithXRPPayments) { - await expect(new Payment(payment).validate()).rejects.toThrow( - new Error('[missing "en.send.insufficientBalanceSpendableBalance" translation]'), - ); - } - - spyGetFilteredAccountLine.mockRestore(); - spyAvailableBalance.mockRestore(); - - // should reject if sending IOU and insufficient balance - const spy2 = jest.spyOn(LedgerService, 'getFilteredAccountLine').mockImplementation(() => - Promise.resolve({ - limit: '10000', - balance: '10', - account: 'r...', - currency: 'USD', - limit_peer: '0', - quality_in: 0, - quality_out: 0, - }), - ); - - const paymentsWithIOUPayments = [ - { Account, Destination, Amount: { currency: 'USD', value: '20' } }, - { Account, Destination, SendMax: { currency: 'USD', value: '20' }, Amount: '20000000' }, - ]; - - for (const payment of paymentsWithIOUPayments) { - await expect(new Payment(payment).validate()).rejects.toThrow( - new Error('[missing "en.send.insufficientBalanceSpendableBalance" translation]'), - ); - } - spy2.mockRestore(); - - // should reject if sending IOU and destination doesn't have proper TrustLine - const destinationLineConditions = [ - undefined, - { - limit: '0', - balance: '0', - account: 'r...', - currency: 'USD', - limit_peer: '0', - quality_in: 0, - quality_out: 0, - }, - ]; - - for (const condition of destinationLineConditions) { - const spy3 = jest - .spyOn(LedgerService, 'getFilteredAccountLine') - .mockImplementation(() => Promise.resolve(condition)); - await expect( - new Payment({ - Account, - Destination, - Amount: { currency: 'USD', value: '20', issuer: 'r...' }, - }).validate(), - ).rejects.toThrow( - new Error('[missing "en.send.unableToSendPaymentRecipientDoesNotHaveTrustLine" translation]'), - ); - spy3.mockRestore(); - } - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/paymentChannelClaim.test.ts b/src/common/libs/ledger/transactions/__tests__/paymentChannelClaim.test.ts deleted file mode 100644 index de7616e30..000000000 --- a/src/common/libs/ledger/transactions/__tests__/paymentChannelClaim.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import PaymentChannelClaim from '../paymentChannelClaim'; - -import paymentChannelClaimTemplates from './templates/PaymentChannelClaimTx.json'; - -describe('PaymentChannelClaim tx', () => { - it('Should set tx type if not set', () => { - const instance = new PaymentChannelClaim(); - expect(instance.TransactionType).toBe('PaymentChannelClaim'); - expect(instance.Type).toBe('PaymentChannelClaim'); - }); - - it('Should return right parsed values', () => { - const { tx, meta } = paymentChannelClaimTemplates; - const instance = new PaymentChannelClaim(tx, meta); - - expect(instance.Type).toBe('PaymentChannelClaim'); - - expect(instance.Channel).toBe('C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198'); - expect(instance.PublicKey).toBe('32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A'); - expect(instance.Signature).toBe( - '30440220718D264EF05CAED7C781FF6DE298DCAC68D002562C9BF3A07C1E721B420C0DAB02203A5A4779EF4D2CCC7BC3EF886676D803A9981B928D3B8ACA483B80ECA3CD7B9B', - ); - - expect(instance.Amount).toEqual({ currency: 'XRP', value: '1' }); - expect(instance.Balance).toEqual({ currency: 'XRP', value: '1' }); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/paymentChannelCreate.test.ts b/src/common/libs/ledger/transactions/__tests__/paymentChannelCreate.test.ts deleted file mode 100644 index 9bc36a7ba..000000000 --- a/src/common/libs/ledger/transactions/__tests__/paymentChannelCreate.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import PaymentChannelCreate from '../paymentChannelCreate'; - -import paymentChannelCreateTemplate from './templates/PaymentChannelCreateTx.json'; - -describe('PaymentChannelCreate tx', () => { - it('Should set tx type if not set', () => { - const instance = new PaymentChannelCreate(); - expect(instance.TransactionType).toBe('PaymentChannelCreate'); - expect(instance.Type).toBe('PaymentChannelCreate'); - }); - - it('Should return right parsed values', () => { - const { tx, meta } = paymentChannelCreateTemplate; - const instance = new PaymentChannelCreate(tx, meta); - - expect(instance.Type).toBe('PaymentChannelCreate'); - expect(instance.Account).toEqual({ - address: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - tag: 11747, - }); - expect(instance.Destination).toEqual({ - address: 'rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW', - tag: 23480, - }); - expect(instance.SettleDelay).toBe(86400); - expect(instance.PublicKey).toBe('32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A'); - expect(instance.Amount).toEqual({ currency: 'XRP', value: '0.01' }); - expect(instance.CancelAfter).toBe('2016-11-22T23:12:38.000Z'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/paymentChannelFund.test.ts b/src/common/libs/ledger/transactions/__tests__/paymentChannelFund.test.ts deleted file mode 100644 index 83959e246..000000000 --- a/src/common/libs/ledger/transactions/__tests__/paymentChannelFund.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import PaymentChannelFund from '../paymentChannelFund'; - -import paymentChannelFundTemplates from './templates/PaymentChannelFundTx.json'; - -describe('PaymentChannelFund tx', () => { - it('Should set tx type if not set', () => { - const instance = new PaymentChannelFund(); - expect(instance.TransactionType).toBe('PaymentChannelFund'); - expect(instance.Type).toBe('PaymentChannelFund'); - }); - - it('Should return right parsed values', () => { - const { tx, meta } = paymentChannelFundTemplates; - const instance = new PaymentChannelFund(tx, meta); - - expect(instance.Account).toEqual({ - address: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', - tag: undefined, - }); - expect(instance.Type).toBe('PaymentChannelFund'); - expect(instance.Channel).toBe('C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198'); - expect(instance.Amount).toEqual({ currency: 'XRP', value: '0.2' }); - expect(instance.Expiration).toBe('2017-03-18T16:59:18.000Z'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/setRegularKey.test.ts b/src/common/libs/ledger/transactions/__tests__/setRegularKey.test.ts deleted file mode 100644 index 19dd76d1c..000000000 --- a/src/common/libs/ledger/transactions/__tests__/setRegularKey.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import SetRegularKey from '../setRegularKey'; - -import setRegularKeyTemplates from './templates/SetRegularKeyTx.json'; - -describe('SetRegularKey tx', () => { - it('Should set tx type if not set', () => { - const instance = new SetRegularKey(); - expect(instance.TransactionType).toBe('SetRegularKey'); - expect(instance.Type).toBe('SetRegularKey'); - }); - - it('Should return right parsed values', () => { - // @ts-ignore - const { tx, meta } = setRegularKeyTemplates; - const instance = new SetRegularKey(tx, meta); - - expect(instance.RegularKey).toBe('rAR8rR8sUkBoCZFawhkWzY4Y5YoyuznwD'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/signerListSet.test.ts b/src/common/libs/ledger/transactions/__tests__/signerListSet.test.ts deleted file mode 100644 index 12ffe02e6..000000000 --- a/src/common/libs/ledger/transactions/__tests__/signerListSet.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import SignerListSet from '../signerListSet'; - -import signerListSetTemplates from './templates/SignerListSetTx.json'; - -describe('SignerListSet tx', () => { - it('Should set tx type if not set', () => { - const instance = new SignerListSet(); - expect(instance.TransactionType).toBe('SignerListSet'); - expect(instance.Type).toBe('SignerListSet'); - }); - - it('Should return right parsed values', () => { - const { tx, meta } = signerListSetTemplates; - const instance = new SignerListSet(tx, meta); - - expect(instance.SignerQuorum).toBe(3); - - expect(instance.SignerEntries).toStrictEqual([ - { - account: 'rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW', - walletLocator: '03075F65D8353E3A5DA3193FF976BC17A2D0B9376BE7DA942349B6526E5A2BBF54', - weight: 2, - }, - { account: 'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v', walletLocator: undefined, weight: 1 }, - { account: 'raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n', walletLocator: undefined, weight: 1 }, - ]); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/templates/AccountDeleteTx.json b/src/common/libs/ledger/transactions/__tests__/templates/AccountDeleteTx.json deleted file mode 100644 index 21f66b78f..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/AccountDeleteTx.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "tx": {"Account": "r93Fr5Cmf6KAho1GfF9mvNKV97tZsCFKcB", "Destination": "r49LZgcrnFU7YRAjMwxWSoxAcsRom5ZGym", "DestinationTag": 0, "Fee": "5000000", "Flags": 2147483648, "LastLedgerSequence": 55314025, "Sequence": 1, "SigningPubKey": "03075F65D8353E3A5DA3193FF976BC17A2D0B9376BE7DA942349B6526E5A2BBF54", "TransactionType": "AccountDelete", "TxnSignature": "30440220786E084DFD1E6317A52D68C65349B7956ABF7CEFA7A9062EB55CB3E8CD96615E022023C3A862938B615B5643A7A16571B825E3FCD1144245D55799D16B7F0FB56955", "date": 642227752, "hash": "2BCD5B4C9CB7DC65C4C620F2767104CF3F35F805B189A414C1E02479788B7FDA", "inLedger": 55314020, "ledger_index": 55314020}, - "meta":{"AffectedNodes":[{"DeletedNode":{"FinalFields":{"Account":"r93Fr5Cmf6KAho1GfF9mvNKV97tZsCFKcB","Balance":"0","Flags":0,"OwnerCount":0,"PreviousTxnID":"E9B45B9DB6F9477FD58AA3124200286C51B983AB018F416BD40B97BC8654EF8C","PreviousTxnLgrSeq":51542281,"Sequence":2},"LedgerEntryType":"AccountRoot","LedgerIndex":"25C343511654DE07BC7DE30F04022AC318C793CEBEAC7C33C2F787829D2CD353","PreviousFields":{"Balance":"20001020","Sequence":1}}},{"ModifiedNode":{"FinalFields":{"Account":"r49LZgcrnFU7YRAjMwxWSoxAcsRom5ZGym","Balance":"370793356","Flags":0,"OwnerCount":1,"Sequence":109},"LedgerEntryType":"AccountRoot","LedgerIndex":"FC77C0C251734B0A2567C2F7DD9034FC87B8C0D0925C5AF2F745C75DCE4B2E4B","PreviousFields":{"Balance":"355792336"},"PreviousTxnID":"8A5285AE7627A93E92C695699CABC286191B16A8600664E613F81B08794227EF","PreviousTxnLgrSeq":54844438}}],"DeliveredAmount":"15001020","TransactionIndex":0,"TransactionResult":"tesSUCCESS","delivered_amount":"15001020"} -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/AccountSetTx.json b/src/common/libs/ledger/transactions/__tests__/templates/AccountSetTx.json deleted file mode 100644 index 5a8a35bda..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/AccountSetTx.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "tx": { - "TransactionType": "AccountSet", - "Account" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "Fee": "12", - "Sequence": 5, - "Domain": "6578616D706C652E636F6D", - "SetFlag": 5, - "ClearFlag": 4, - "EmailHash": "0bc83cb571cd1c50ba6f3e8a78ef1346", - "MessageKey": "03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB", - "TransferRate": 1002000000, - "TickSize": 0 - }, - "meta": {} -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/BaseTx.json b/src/common/libs/ledger/transactions/__tests__/templates/BaseTx.json deleted file mode 100644 index 7b3828bfd..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/BaseTx.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "tx": { - "Account":"rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY", - "Fee":"12", - "Flags":2147483648, - "LastLedgerSequence":57913677, - "Memos":[ - { - "Memo":{ - "MemoData":"5852502054697020426F74", - "MemoType":"587270546970426F744E6F7465" - } - } - ], - "Sequence":34306, - "SigningPubKey":"03DF3AB842EB1B57F0A848CD7CC2CFD35F66E4AD0625EEACFFE72A45E4D13E49A", - "SourceTag":456, - "TxnSignature":"304402204ED27C2D29F609772B0E67ACCFC8C205422A85D54C065437179032419", - "hash":"7F10793B5781BD5DD52F70096520321A08DD2ED19AFC7E3F193AAC293954F7DF", - "ledger_index":57913674, - "date":652346651 - }, - "meta":{ - "TransactionResult":"tesSUCCESS" - } -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/CheckCancelTx.json b/src/common/libs/ledger/transactions/__tests__/templates/CheckCancelTx.json deleted file mode 100644 index 86d8e8351..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/CheckCancelTx.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "tx": { - "Account": "rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo", - "TransactionType": "CheckCancel", - "CheckID": "6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B", - "Fee": "12" - }, - "meta": {} -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/CheckCashTx.json b/src/common/libs/ledger/transactions/__tests__/templates/CheckCashTx.json deleted file mode 100644 index 6f29b958c..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/CheckCashTx.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "tx": { - "Account": "rfkE1aSy9G8Upk4JssnwBxhEv5p4mn2KTy", - "TransactionType": "CheckCash", - "Amount": "100000000", - "CheckID": "6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B", - "Fee": "12" - }, - "meta": {} -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/DepositPreauthTx.json b/src/common/libs/ledger/transactions/__tests__/templates/DepositPreauthTx.json deleted file mode 100644 index 48df48b8f..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/DepositPreauthTx.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "tx": { - "TransactionType" : "DepositPreauth", - "Account" : "rsUiUMpnrgxQp24dJYZDhmV4bE3aBtQyt8", - "Authorize" : "rEhxGqkqPPSxQ3P25J66ft5TwpzV14k2de", - "Unauthorize" : "rEhxGqkqPPSxQ3P25J66ft5TwpzV14k2de", - "Fee" : "10", - "Flags" : 2147483648, - "Sequence" : 2 - }, - "meta": {} -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/EscrowCancelTx.json b/src/common/libs/ledger/transactions/__tests__/templates/EscrowCancelTx.json deleted file mode 100644 index 998c6ce08..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/EscrowCancelTx.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "tx": { - "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "TransactionType": "EscrowCancel", - "Owner": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "OfferSequence": 7 - }, - "meta": {} - -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/EscrowCreateTx.json b/src/common/libs/ledger/transactions/__tests__/templates/EscrowCreateTx.json deleted file mode 100644 index d43e8ed68..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/EscrowCreateTx.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "tx": { - "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "TransactionType": "EscrowCreate", - "Amount": "10000", - "Destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", - "CancelAfter": 533257958, - "FinishAfter": 533171558, - "Condition": "A0258020E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855810100", - "DestinationTag": 23480, - "SourceTag": 11747 - }, - "meta": {} -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/EscrowFinishTx.json b/src/common/libs/ledger/transactions/__tests__/templates/EscrowFinishTx.json deleted file mode 100644 index e2a538b0d..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/EscrowFinishTx.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "tx": { - "Account": "rDH2ToBGzAipLXPa5NuLyQgnvswym1z3TU", "Fulfillment": "A0028000", "Condition": "A0258020E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855810100", "Fee": "12", "Flags": 2147483648, "LastLedgerSequence": 57885237, "OfferSequence": 22, "Owner": "rKwJaGmB5Hz24Qs2iyCaTdUuL1WsEXUWy5", "Sequence": 31, "SigningPubKey": "03289275F786BB7CA4E960931E9D96638849BFA445770B949B4365ADDCC293D3D7", "TransactionType": "EscrowFinish", "TxnSignature": "3044022043FC36A6BFF0926E8ABD55CBA905D9F54AF641FA0ACD25B27AD93627301E13CA02203B7FCA454DC0C69585043BB22F670B7308ED65087DA755475C523F243F62DEDA", "date": 652233611, "hash": "D292CE89F8EDB65C2F1930DAB6F80476FF061BB455F840B808A23D5ACBC652FA", "inLedger": 57885156, "ledger_index": 57885156 - }, - "meta": {"AffectedNodes":[{"ModifiedNode":{"FinalFields":{"Flags":0,"Owner":"rKwJaGmB5Hz24Qs2iyCaTdUuL1WsEXUWy5","RootIndex":"1EA8DBF223B8F9BCABA4F5185C3ABA96D4EAAE84545E2FF8B6DA06563B38BE8A"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"1EA8DBF223B8F9BCABA4F5185C3ABA96D4EAAE84545E2FF8B6DA06563B38BE8A"}},{"ModifiedNode":{"FinalFields":{"Account":"rDH2ToBGzAipLXPa5NuLyQgnvswym1z3TU","Balance":"20999604","Flags":0,"OwnerCount":0,"Sequence":32},"LedgerEntryType":"AccountRoot","LedgerIndex":"27BB55D1F31075E514FDC112EFB687A1D551AD1A8317D5CCE647F575EF210A78","PreviousFields":{"Balance":"20999616","Sequence":31},"PreviousTxnID":"B907C4AE96C13BB2F486E0F86E91F92C4C3174051632A78710E22E63EF362BD3","PreviousTxnLgrSeq":57885155}},{"ModifiedNode":{"FinalFields":{"Account":"rKwJaGmB5Hz24Qs2iyCaTdUuL1WsEXUWy5","Balance":"800000200930520","Flags":1048576,"OwnerCount":12,"Sequence":40},"LedgerEntryType":"AccountRoot","LedgerIndex":"875F97C6293127CF84490851CB474E613C968F686A0F601FB88027A7DACC4ADA","PreviousFields":{"Balance":"300000200930520","OwnerCount":13},"PreviousTxnID":"EE77A0F9A443EC710529FC35B5715A663BCF380315E8D863CE5BF8C3971BC642","PreviousTxnLgrSeq":57217428}},{"DeletedNode":{"FinalFields":{"Account":"rKwJaGmB5Hz24Qs2iyCaTdUuL1WsEXUWy5","Amount":"500000000000000","Destination":"rKwJaGmB5Hz24Qs2iyCaTdUuL1WsEXUWy5","FinishAfter":652233600,"Flags":0,"OwnerNode":"0000000000000000","PreviousTxnID":"C9AD36030158FE0E21D5654C3C54710B6406B6D996073ADEDF556C497650FE70","PreviousTxnLgrSeq":35059629},"LedgerEntryType":"Escrow","LedgerIndex":"D6D410E6257423FE6D9E60838E66BADC71AD81EFC787D1D6D977438C4C621B8E"}}],"TransactionIndex":24,"TransactionResult":"tesSUCCESS"} -} diff --git a/src/common/libs/ledger/transactions/__tests__/templates/OfferCancelTx.json b/src/common/libs/ledger/transactions/__tests__/templates/OfferCancelTx.json deleted file mode 100644 index dacf01152..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/OfferCancelTx.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "tx": { - "TransactionType": "OfferCancel", - "Account": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX", - "Fee": "12", - "Flags": 0, - "LastLedgerSequence": 7108629, - "OfferSequence": 6, - "Sequence": 7 - }, - "meta": {} -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/OfferCreateTx.json b/src/common/libs/ledger/transactions/__tests__/templates/OfferCreateTx.json deleted file mode 100644 index 20463fd48..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/OfferCreateTx.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "XRPIOU": - {"meta":{"AffectedNodes":[{"DeletedNode":{"FinalFields":{"Account":"r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W","BookDirectory":"7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E0BA2F40B4EE3","BookNode":"0000000000000000","Flags":0,"OwnerNode":"0000000000000025","PreviousTxnID":"BCDFFC8B314C3D7653D58CBA76A26E6F8D26ECFF4EDA7E3951EDEA737E03F56B","PreviousTxnLgrSeq":57554958,"Sequence":6165568,"TakerGets":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"},"TakerPays":"0"},"LedgerEntryType":"Offer","LedgerIndex":"233480D06A56B5755E5609A50517AEB5EC2782275FBC79A337CD9893623440D6","PreviousFields":{"TakerGets":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006237706382424785"},"TakerPays":"24660424"}}},{"ModifiedNode":{"FinalFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.2741974727555413"},"Flags":2228224,"HighLimit":{"currency":"BTC","issuer":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","value":"1000000000"},"HighNode":"0000000000000000","HighQualityIn":1007500000,"HighQualityOut":1007500000,"LowLimit":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"},"LowNode":"0000000000000239"},"LedgerEntryType":"RippleState","LedgerIndex":"2848FC6E20665BDA02DFE93E992532870FE2DDA83296E5173C0AD3CED3013C05","PreviousFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.2742216387846283"}},"PreviousTxnID":"409ED2E4553C0B52D10D0BF5FB63F07474689586A07AFE47AF17D14D9EA7549B","PreviousTxnLgrSeq":57551518}},{"ModifiedNode":{"FinalFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.01257026145669207"},"Flags":2228224,"HighLimit":{"currency":"BTC","issuer":"rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ","value":"999999999"},"HighNode":"0000000000000000","LowLimit":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"},"LowNode":"00000000000005D0"},"LedgerEntryType":"RippleState","LedgerIndex":"2914E0C6425B8511D1654C7EECF23749E791273C10AB32680804F34EA4DBB3F5","PreviousFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"0"}},"PreviousTxnID":"F392BAEFF7AA8C7E7DE23B0AF7D36B86D1DF8777CB799DBDC8D95F88678DC4D5","PreviousTxnLgrSeq":57554966}},{"ModifiedNode":{"FinalFields":{"Flags":0,"IndexNext":"00000000000003AF","IndexPrevious":"00000000000003AC","Owner":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","RootIndex":"D7DB060F26AD80E73A4054E2FEF854BD70E40D0948AFD6CF1FDA6072ACC236A4"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"2A7ABCD0F11214DFCB87F9BBE5CCE5454AFA44662ABD1C946264346C47D31B5D"}},{"DeletedNode":{"FinalFields":{"Account":"r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W","BookDirectory":"7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E08C0C68AC608","BookNode":"0000000000000000","Flags":0,"OwnerNode":"0000000000000025","PreviousTxnID":"5AB22EA17EA83AD91631DD8185507A9E0CB3272F4AE70F0FE248D81C2B53BA79","PreviousTxnLgrSeq":57554958,"Sequence":6165567,"TakerGets":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"},"TakerPays":"0"},"LedgerEntryType":"Offer","LedgerIndex":"2DF1C31A075E217CEED582EC8CDEC2A18B85ECA13427788BBE8FD11DAE017192","PreviousFields":{"TakerGets":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0003468173582540199"},"TakerPays":"13700235"}}},{"ModifiedNode":{"FinalFields":{"Account":"rJgzgoFxK5huntPQ9GoWon9TUrUAp1bYTz","BookDirectory":"7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E239465A8A2FC","BookNode":"0000000000000000","Flags":131072,"OwnerNode":"0000000000000000","Sequence":1746328,"TakerGets":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.02731544433330442"},"TakerPays":"1087091843"},"LedgerEntryType":"Offer","LedgerIndex":"3C539D84E584F55C9E03B6FBD61419B39F3F485D527CD774D072F2E2D21894E7","PreviousFields":{"TakerGets":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.038891"},"TakerPays":"1547772328"},"PreviousTxnID":"A9F617BF44D1DE1C40060C88EB9CA9E97F30E3AE87CE887ABD67C05E2057933D","PreviousTxnLgrSeq":57554789}},{"ModifiedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","Balance":"77055251382","Flags":1048576,"OwnerCount":3561,"RegularKey":"rNjh3o3JMHoEpLkfAJQachVZMA6adqLDTF","Sequence":137603},"LedgerEntryType":"AccountRoot","LedgerIndex":"3DFC09260620F332881F20FD0AF6640CB54AFDD7DDC78875C7EE31583B96DED9","PreviousFields":{"Balance":"77054292526","OwnerCount":3562},"PreviousTxnID":"8059364512594412DF2988271986F18A37865E575CFDDC64ED98FBBCB06FBD49","PreviousTxnLgrSeq":57551524}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E1FE5D43D888B","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003AE","PreviousTxnID":"409ED2E4553C0B52D10D0BF5FB63F07474689586A07AFE47AF17D14D9EA7549B","PreviousTxnLgrSeq":57551518,"Sequence":137584,"TakerGets":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"},"TakerPays":"0"},"LedgerEntryType":"Offer","LedgerIndex":"42A19FEA5279B3051B37CA7F4485AC00E7A9C15393CBF3DD8C99F772D161C7BA","PreviousFields":{"TakerGets":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0000241177935"},"TakerPays":"958856"}}},{"ModifiedNode":{"FinalFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.02729229322197103"},"Flags":2228224,"HighLimit":{"currency":"BTC","issuer":"rJgzgoFxK5huntPQ9GoWon9TUrUAp1bYTz","value":"100000000"},"HighNode":"0000000000000000","LowLimit":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"},"LowNode":"000000000000040C"},"LedgerEntryType":"RippleState","LedgerIndex":"58AA18291BD0DFF10C846DED7D7A8DC33CBB8F20389BAF4ABAA402D2B2DD3511","PreviousFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.038891"}},"PreviousTxnID":"D7C4018944FF66B3E97552EAFC2F24AD8FC684AA286138979A561D7083AE5F26","PreviousTxnLgrSeq":57550308}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"5F0E08C0C68AC608","Flags":0,"RootIndex":"7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E08C0C68AC608","TakerGetsCurrency":"0000000000000000000000004254430000000000","TakerGetsIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1","TakerPaysCurrency":"0000000000000000000000000000000000000000","TakerPaysIssuer":"0000000000000000000000000000000000000000"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E08C0C68AC608"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"5F0E0BA2F40B4EE3","Flags":0,"RootIndex":"7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E0BA2F40B4EE3","TakerGetsCurrency":"0000000000000000000000004254430000000000","TakerGetsIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1","TakerPaysCurrency":"0000000000000000000000000000000000000000","TakerPaysIssuer":"0000000000000000000000000000000000000000"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E0BA2F40B4EE3"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"5F0E1FE5D43D888B","Flags":0,"RootIndex":"7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E1FE5D43D888B","TakerGetsCurrency":"0000000000000000000000004254430000000000","TakerGetsIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1","TakerPaysCurrency":"0000000000000000000000000000000000000000","TakerPaysIssuer":"0000000000000000000000000000000000000000"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E1FE5D43D888B"}},{"ModifiedNode":{"FinalFields":{"Account":"rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ","Balance":"44536186578","Domain":"78756D6D2E617070","EmailHash":"833237B8665D2F4E00135E8DE646589F","Flags":8388608,"OwnerCount":10,"Sequence":95},"LedgerEntryType":"AccountRoot","LedgerIndex":"8C4F456312F02D5199BCB1FB8F657BF19675288E3F4EBF2AFCFB5A1253788404","PreviousFields":{"Balance":"45036186590","Sequence":94},"PreviousTxnID":"F392BAEFF7AA8C7E7DE23B0AF7D36B86D1DF8777CB799DBDC8D95F88678DC4D5","PreviousTxnLgrSeq":57554966}},{"ModifiedNode":{"FinalFields":{"Flags":0,"IndexPrevious":"0000000000000024","Owner":"r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W","RootIndex":"FDE0DCA95589B07340A7D5BE2FD72AA8EEAC878664CC9B707308B4419333E551"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"A3A947C2C2EE493F88EA00AAA2572C4053D9C0C095213864C6D6C9DA6AEDEBD8"}},{"ModifiedNode":{"FinalFields":{"Account":"r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W","Balance":"148101261095","Flags":0,"OwnerCount":41,"Sequence":6165583},"LedgerEntryType":"AccountRoot","LedgerIndex":"B1B9AAC12B56B1CFC93DDC8AF6958B50E89509F377ED4825A3D970F249892CE3","PreviousFields":{"Balance":"148062900436","OwnerCount":43},"PreviousTxnID":"5AEEFB4FF0296EE9E5B863533B3B3A23B4006AEA9F789CA461C467796A3F2C28","PreviousTxnLgrSeq":57554965}},{"ModifiedNode":{"FinalFields":{"Account":"rJgzgoFxK5huntPQ9GoWon9TUrUAp1bYTz","Balance":"30814402909","Flags":1048576,"OwnerCount":7,"RegularKey":"r3rqA1xN1tw7h7Wuf1mUUMedZztdGwbSsi","Sequence":1746334},"LedgerEntryType":"AccountRoot","LedgerIndex":"BE2B7346E21F262E7493F8DFEE03D8473AAC3B663DAA069FF1CE96D95E24C24D","PreviousFields":{"Balance":"30353722424"},"PreviousTxnID":"937B599EFB289EE4FB7FB5471BEF3EA3B5D0A1BBBCEA1955187FE9FADF34CEA3","PreviousTxnLgrSeq":57554789}},{"ModifiedNode":{"FinalFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.0000719850427779746"},"Flags":2228224,"HighLimit":{"currency":"BTC","issuer":"r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W","value":"0"},"HighNode":"0000000000000022","LowLimit":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"},"LowNode":"00000000000005CF"},"LedgerEntryType":"RippleState","LedgerIndex":"F758B827C835B48DDACFE4CDD235E843BD09C1FCA7F0BBE64B29DA39527566D1","PreviousFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.001044514215267465"}},"PreviousTxnID":"D7C4018944FF66B3E97552EAFC2F24AD8FC684AA286138979A561D7083AE5F26","PreviousTxnLgrSeq":57550308}}],"TransactionIndex":31,"TransactionResult":"tesSUCCESS"},"tx":{"Account":"rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ","Fee":"12","Flags":2148139008,"Sequence":94,"SigningPubKey":"0350714189757DA0403CE1FF2025522337EA1B60D9796B11D5559EE914982D6AC3","TakerGets":"500000000","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.012136"},"TransactionType":"OfferCreate","TxnSignature":"3045022100D538B72956E7E9BC7FC74F1E6A84C8540D928C37D100171E04494F587D40B5AA02207D26A5853C65F1BC66B4C32BFB2B6CEBFBCA9D1404D26829DADB49AFF603CAF9","date":650929271,"hash":"F76BF4320745FC89CB46926E854180111468FE715E3824EBFCCC6133892F1C54","inLedger":57554974,"ledger_index":57554974},"validated":true - }, - "IOUXRP": { - "meta":{"AffectedNodes":[{"ModifiedNode":{"FinalFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.003285007303762344"},"Flags":2228224,"HighLimit":{"currency":"BTC","issuer":"rH2k8SkwoWgwry9J89jgFP9NbSWu13jnsu","value":"1000000000"},"HighNode":"0000000000000000","LowLimit":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"},"LowNode":"0000000000000572"},"LedgerEntryType":"RippleState","LedgerIndex":"10F978727E038ECC535125DB753C0E9C4AFF452D06F5E46056B6AC637681A18D","PreviousFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"0"}},"PreviousTxnID":"5AAA008AEF59CC8348B0B80665FB9A24F2DDE3F369CD3A6D78CDC2A784EF9BD4","PreviousTxnLgrSeq":57440457}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E8A48FA142D9","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"367E9F1859A5CBDFCB896D8CF84F9C62C9A1CDC86728FB6F99C9BC7FB9706E78","PreviousTxnLgrSeq":57606787,"Sequence":137786,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"21C292C5EAFF4A05D5E20ACEB38F115EC2D3D3A7F010E12FB1948B46F324A49E","PreviousFields":{"TakerGets":"24862701","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006234554234"}}}},{"ModifiedNode":{"FinalFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.2757865425151007"},"Flags":2228224,"HighLimit":{"currency":"BTC","issuer":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","value":"1000000000"},"HighNode":"0000000000000000","HighQualityIn":1007500000,"HighQualityOut":1007500000,"LowLimit":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"},"LowNode":"0000000000000239"},"LedgerEntryType":"RippleState","LedgerIndex":"2848FC6E20665BDA02DFE93E992532870FE2DDA83296E5173C0AD3CED3013C05","PreviousFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.2665263787044"}},"PreviousTxnID":"DF2F3D365F1D5A132A232487D949CA4405A36E939D7E4D7098056B7564A158DF","PreviousTxnLgrSeq":57716202}},{"ModifiedNode":{"FinalFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"0"},"Flags":2228224,"HighLimit":{"currency":"BTC","issuer":"rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ","value":"999999999"},"HighNode":"0000000000000000","LowLimit":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"},"LowNode":"00000000000005D0"},"LedgerEntryType":"RippleState","LedgerIndex":"2914E0C6425B8511D1654C7EECF23749E791273C10AB32680804F34EA4DBB3F5","PreviousFields":{"Balance":{"currency":"BTC","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-0.01257026145669207"}},"PreviousTxnID":"F76BF4320745FC89CB46926E854180111468FE715E3824EBFCCC6133892F1C54","PreviousTxnLgrSeq":57554974}},{"ModifiedNode":{"FinalFields":{"Account":"rH2k8SkwoWgwry9J89jgFP9NbSWu13jnsu","Balance":"4944871522","Flags":0,"OwnerCount":13,"Sequence":5846706},"LedgerEntryType":"AccountRoot","LedgerIndex":"2F540B6D279A09812A00D53D5B6BE6BB1F0EB64BEC17E6D4DB43AFD285F5DA03","PreviousFields":{"Balance":"5074982428"},"PreviousTxnID":"44777E04DA3E214C63F77F5AE8D5A55E1FA3C4A01849B5A0540E2EDE2C36DD71","PreviousTxnLgrSeq":57720311}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08BC5AD346E4B0","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08BC5AD346E4B0","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08BC5AD346E4B0"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08C30DA29D47A8","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C30DA29D47A8","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C30DA29D47A8"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08C78A140F58AF","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C78A140F58AF","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C78A140F58AF"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08C8EFF9C78117","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C8EFF9C78117","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C8EFF9C78117"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08CD6F6E7D03DD","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08CD6F6E7D03DD","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08CD6F6E7D03DD"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08D1EFE324E9D0","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D1EFE324E9D0","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D1EFE324E9D0"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08D6766F28C26D","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D6766F28C26D","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D6766F28C26D"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08DAFC1D7F626F","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DAFC1D7F626F","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DAFC1D7F626F"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08DF84CFB7DF86","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DF84CFB7DF86","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DF84CFB7DF86"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08E1C9D2A957C0","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E1C9D2A957C0","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E1C9D2A957C0"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08E40F66E3583B","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E40F66E3583B","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E40F66E3583B"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08E64CD245FD3F","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E64CD245FD3F","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E64CD245FD3F"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08E8A48FA142D9","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E8A48FA142D9","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E8A48FA142D9"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08EAEBBE826341","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EAEBBE826341","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EAEBBE826341"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08EF7E7913BD20","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EF7E7913BD20","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EF7E7913BD20"}},{"DeletedNode":{"FinalFields":{"ExchangeRate":"4A08F413DBFCA8D4","Flags":0,"RootIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08F413DBFCA8D4","TakerGetsCurrency":"0000000000000000000000000000000000000000","TakerGetsIssuer":"0000000000000000000000000000000000000000","TakerPaysCurrency":"0000000000000000000000004254430000000000","TakerPaysIssuer":"0A20B3C85F482532A9578DBB3950B85CA06594D1"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08F413DBFCA8D4"}},{"ModifiedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","Balance":"77034273276","Flags":1048576,"OwnerCount":3546,"RegularKey":"rNjh3o3JMHoEpLkfAJQachVZMA6adqLDTF","Sequence":137886},"LedgerEntryType":"AccountRoot","LedgerIndex":"3DFC09260620F332881F20FD0AF6640CB54AFDD7DDC78875C7EE31583B96DED9","PreviousFields":{"Balance":"77405609934","OwnerCount":3562},"PreviousTxnID":"6F767EBF8A6EE0A5EBB13BCE1A6E1A68B48A056860B8F6C4D3BFA560323D11E6","PreviousTxnLgrSeq":57716215}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DF84CFB7DF86","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"BC1EAF0C255247107D291BE1AF8150371650F479739295EA1503BFCBA8AF4639","PreviousTxnLgrSeq":57618429,"Sequence":137793,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"40163B6DCB8605C04E27D7EF04C2BA2CB6054DE5EFAEA5209F7BC63BEB3B09A1","PreviousFields":{"TakerGets":"24945295","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006230240409"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EF7E7913BD20","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"746F2FD32830E2D98B5DAC0A0995580CC3432573EEFF322088D4BB35DCCB27BE","PreviousTxnLgrSeq":57606484,"Sequence":137782,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"53517932EE3B4B55900C0AB15CFB97131582D03239D562AF120689083218224C","PreviousFields":{"TakerGets":"25200305","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006338194962"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D6766F28C26D","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"5AA34A8EE3352B511E184F518AF87E8E24D655F9A30498E4DF38C2E8FF976DAE","PreviousTxnLgrSeq":57618435,"Sequence":137795,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"579D4E4C4907E49E75F23A1DF7A6082C5504E6455D6E2B640AEDEB6C0EB1BCE4","PreviousFields":{"TakerGets":"24937024","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006203343998"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DAFC1D7F626F","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"04D7A8D3FE2BEC6E4B48443DEFF933CE6F503C2177E3BD4D690BC99BE9E560B8","PreviousTxnLgrSeq":57618432,"Sequence":137794,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"5BEF1C3D085CF4FC78D255E792F733CC5A78A5641255F57A807E3197EB79CDC0","PreviousFields":{"TakerGets":"24945295","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.00062178048"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C8EFF9C78117","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"3CB558D77B877052062391EC70C8076B129969103B8E6CFC44C93FAD01F5DD51","PreviousTxnLgrSeq":57665661,"Sequence":137814,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"5DBA7CD8E65EFEBC4B809FEF0E955C99A340414408113D7D00169D61057EFDAE","PreviousFields":{"TakerGets":"24937934","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006166484804"}}}},{"ModifiedNode":{"FinalFields":{"Account":"rH2k8SkwoWgwry9J89jgFP9NbSWu13jnsu","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08F844EE3B17FF","BookNode":"0000000000000000","Flags":0,"OwnerNode":"0000000000000000","Sequence":5846705,"TakerGets":"7120085558","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.1797661224897064"}},"LedgerEntryType":"Offer","LedgerIndex":"78679C155C3C1B4B326EB0260B509CD8756D41FD1568623C4284CA4B8DB55FEC","PreviousFields":{"TakerGets":"7250196464","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.1830511297934687"}},"PreviousTxnID":"44777E04DA3E214C63F77F5AE8D5A55E1FA3C4A01849B5A0540E2EDE2C36DD71","PreviousTxnLgrSeq":57720311}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D1EFE324E9D0","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"07BB934EFF809492F147C21496078932E11B7FDC53A16137B6A426BFFEA224BF","PreviousTxnLgrSeq":57665660,"Sequence":137813,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"8132C7C049A64FBC9DBCB0F2612D90726BE9FF53B12B726B7B24F3DFBCEDC95A","PreviousFields":{"TakerGets":"24950348","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006194243385"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EAEBBE826341","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"A8D41EC9989F7F063E55A53B8DAE7FE7B2431CE39EF13D3A98A2348EF125966E","PreviousTxnLgrSeq":57606492,"Sequence":137784,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"8173170090E7E6963716BBD3ECBFB4DA1ED12370A348A1F7273E0BE0075EADEC","PreviousFields":{"TakerGets":"25237303","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.00063348105"}}}},{"ModifiedNode":{"FinalFields":{"Account":"rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ","Balance":"83504431937","Domain":"78756D6D2E617070","EmailHash":"833237B8665D2F4E00135E8DE646589F","Flags":8388608,"MessageKey":"02000000000000000000000000415F8315C9948AD91E2CCE5B8583A36DA431FB61","OwnerCount":8,"Sequence":113},"LedgerEntryType":"AccountRoot","LedgerIndex":"8C4F456312F02D5199BCB1FB8F657BF19675288E3F4EBF2AFCFB5A1253788404","PreviousFields":{"Balance":"83002984385","Sequence":112},"PreviousTxnID":"5291D8194147E5ED9129BFF9E0339B39E07C1CD719E54B30653E9344727D57DF","PreviousTxnLgrSeq":57695167}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E64CD245FD3F","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"B48B46A79691F8BBD19D63223BBA2074EBF8995856172B130103ED59DB7D49F4","PreviousTxnLgrSeq":57615973,"Sequence":137785,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"9A00987C10DD38724BC6EF1E0080E0CC1A0D9265CC1AF47688C864396111A1C7","PreviousFields":{"TakerGets":"20216802","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.000506434433563534"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C78A140F58AF","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"57D2B11EE64C44597BDD85E31F4C6A891017CC946797645D737E24560FFCA39D","PreviousTxnLgrSeq":57665661,"Sequence":137815,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"A429CE20CD262747F94BEBDB17F84952CEA366B9394A0C56028EB62F79B75AB0","PreviousFields":{"TakerGets":"24929068","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006160460489"}}}},{"ModifiedNode":{"FinalFields":{"Flags":0,"IndexNext":"00000000000003B3","IndexPrevious":"00000000000003B1","Owner":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","RootIndex":"D7DB060F26AD80E73A4054E2FEF854BD70E40D0948AFD6CF1FDA6072ACC236A4"},"LedgerEntryType":"DirectoryNode","LedgerIndex":"BCA921F8CC2334DDA15A3EA20C948F6AEB04C3AF380F9F93FBCD1F362FC2683C"}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E40F66E3583B","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"E652CF5F2E1714690E779BB60D461A899F1908633AADE5197E25048BEB2851F3","PreviousTxnLgrSeq":57618426,"Sequence":137792,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"C218BB6634F1CA95567983AE2837F6775F20BE0BE9F634BD3C7117A93A998026","PreviousFields":{"TakerGets":"24951203","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006244174823"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08CD6F6E7D03DD","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"4325EDD0C2B2B127B24C69272E5972752930F9A15B9A34157F6C620A1C132D37","PreviousTxnLgrSeq":57665661,"Sequence":137816,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"C8223AB157C397D5EE385CD02BC7CC73C3E3E075566191A64F0A46313B7E6D13","PreviousFields":{"TakerGets":"24937934","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006178817773"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C30DA29D47A8","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"A7DC8EC97E8D638E7002BB27B3DFA4035ADCD2BBBEBA6B2A62E94C3518975922","PreviousTxnLgrSeq":57665662,"Sequence":137817,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"C99502126ACAE08B063084F092005F985B2ED1A49DF16A97C3C36ED4283BD064","PreviousFields":{"TakerGets":"24929068","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006148164162"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E1C9D2A957C0","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"AFBB0278CCEE5EDCA6B56AB26260F74FD8B606D01437E61372551FB54945990C","PreviousTxnLgrSeq":57616098,"Sequence":137791,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"CA32FC4954D09521249F88DA27B01D876C599784E81AE04E55A7ECD7DC61ABA7","PreviousFields":{"TakerGets":"25225419","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006306497911"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08BC5AD346E4B0","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"DF2F3D365F1D5A132A232487D949CA4405A36E939D7E4D7098056B7564A158DF","PreviousTxnLgrSeq":57716202,"Sequence":137818,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"D532F2825AF6ABC35CFDD56CF80871B93C51AE2E31B367D2D524F9D3D31ABC05","PreviousFields":{"TakerGets":"968498","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0000238143788372706"}}}},{"DeletedNode":{"FinalFields":{"Account":"rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx","BookDirectory":"37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08F413DBFCA8D4","BookNode":"0000000000000000","Flags":0,"OwnerNode":"00000000000003B2","PreviousTxnID":"821B7C8CF63A00388C2F0C8A4058E9ECB1D32E500365767D45AE8E5EE64A306A","PreviousTxnLgrSeq":57606487,"Sequence":137783,"TakerGets":"0","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0"}},"LedgerEntryType":"Offer","LedgerIndex":"D557D5A0D6C2C7A06BC453AEADF460681CE72FC0F7F0CE2E6C94A1E115A7B12D","PreviousFields":{"TakerGets":"25162461","TakerPays":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.0006341357733"}}}}],"TransactionIndex":44,"TransactionResult":"tesSUCCESS"},"tx":{"Account":"rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ","Fee":"12","Flags":2148139008,"Sequence":112,"SigningPubKey":"0350714189757DA0403CE1FF2025522337EA1B60D9796B11D5559EE914982D6AC3","TakerGets":{"currency":"BTC","issuer":"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B","value":"0.01257"},"TakerPays":"484553386","TransactionType":"OfferCreate","TxnSignature":"304402200A65C5378313C3909AF3B10EBBC7B32F9B4878E47EB99AAD75E4A9F19B1C89E90220034ACC4B948F67D7FA324EF3A11769CA95CECB67DCFD015135E216D48D332B19","date":651582571,"hash":"09E6D8BBCFD4457BA860FC2CCB978A2900527C3BFD58272BBF909C92761EEDC1","inLedger":57720311,"ledger_index":57720311},"validated":true - }, - "XRPIOUDifferentOwner": { - "meta": {"AffectedNodes":[{"ModifiedNode":{"FinalFields":{"Balance":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-74204.07015609303"},"Flags":2228224,"HighLimit":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ","value":"1000000"},"HighNode":"0000000000000000","LowLimit":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz","value":"0"},"LowNode":"0000000000000035"},"LedgerEntryType":"RippleState","LedgerIndex":"18254A083849DD60EF85FDA66EE4F411A2D4D9682283D659EE11C63344F46B76","PreviousFields":{"Balance":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"-74242.53554070841"}},"PreviousTxnID":"B93043A7224DF1C852B9600AE1EE33E382993B9E1749E4AEEEC60B3D0C4FC2B3","PreviousTxnLgrSeq":58371567}},{"ModifiedNode":{"FinalFields":{"Account":"rsTQsbTfRkqgUxxs8BToD3VdnENaha9UcY","Balance":"26644314","Flags":0,"OwnerCount":1,"Sequence":56270335},"LedgerEntryType":"AccountRoot","LedgerIndex":"520ECB79A4A213162874D70D8C45D12563C1D1DB00A8FD6B977108C8FB3D72CD","PreviousFields":{"Balance":"126644326","Sequence":56270334},"PreviousTxnID":"EC9FDC09CB573ED8AA518DA292DCCB586E2AF0229780583F1058D9F6DAE98738","PreviousTxnLgrSeq":58373277}},{"ModifiedNode":{"FinalFields":{"Account":"rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ","Balance":"13577412223","Domain":"78756D6D2E617070","EmailHash":"833237B8665D2F4E00135E8DE646589F","Flags":8388608,"OwnerCount":12,"Sequence":151},"LedgerEntryType":"AccountRoot","LedgerIndex":"8C4F456312F02D5199BCB1FB8F657BF19675288E3F4EBF2AFCFB5A1253788404","PreviousFields":{"Balance":"13477412223"},"PreviousTxnID":"B93043A7224DF1C852B9600AE1EE33E382993B9E1749E4AEEEC60B3D0C4FC2B3","PreviousTxnLgrSeq":58371567}},{"ModifiedNode":{"FinalFields":{"Account":"rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ","BookDirectory":"5C8970D155D65DB8FF49B291D7EFFA4A09F9E8A68D9974B25B093CAFAC6A8000","BookNode":"0000000000000000","Expiration":685445908,"Flags":131072,"OwnerNode":"0000000000000001","Sequence":145,"TakerGets":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz","value":"4049.259889225568"},"TakerPays":"10528075712"},"LedgerEntryType":"Offer","LedgerIndex":"B45DFCD1B3600D7F52E16A293843C0C6F0C0CFEDD107197FBEE4E1B81D9E8C5F","PreviousFields":{"TakerGets":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz","value":"4087.721427687106"},"TakerPays":"10628075712"},"PreviousTxnID":"B93043A7224DF1C852B9600AE1EE33E382993B9E1749E4AEEEC60B3D0C4FC2B3","PreviousTxnLgrSeq":58371567}},{"ModifiedNode":{"FinalFields":{"Balance":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"38.46153846153847"},"Flags":1114112,"HighLimit":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz","value":"0"},"HighNode":"0000000000000039","LowLimit":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rsTQsbTfRkqgUxxs8BToD3VdnENaha9UcY","value":"999999999"},"LowNode":"0000000000000000"},"LedgerEntryType":"RippleState","LedgerIndex":"CFEB9EFAA13564F24373E8E1CC9802E029901968779C00C59DB3A8074DFC05BC","PreviousFields":{"Balance":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rrrrrrrrrrrrrrrrrrrrBZbvji","value":"0"}},"PreviousTxnID":"76E1C9E8E0314FE9C44B76A80FE03B4535314C37937681242544B92D2CA817D2","PreviousTxnLgrSeq":57321856}}],"TransactionIndex":20,"TransactionResult":"tesSUCCESS"}, "tx": {"Account":"rsTQsbTfRkqgUxxs8BToD3VdnENaha9UcY","Fee":"12","Flags":2148270080,"LastLedgerSequence":58373915,"Sequence":56270334,"SigningPubKey":"03569D98DB9776AE05EF760C14D7E370153B4CA8F395023530D03F65AE24D20F08","TakerGets":"100000000","TakerPays":{"currency":"534F4C4F00000000000000000000000000000000","issuer":"rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz","value":"38.076"},"TransactionType":"OfferCreate","TxnSignature":"3045022100CE70EA4BDDDCB01FCEE19C206701F0CCFC99FDD273E18FBACD4F0453876B6621022008760D1BE1D546FE1AFF527A369E32119CC37BD381029F13E5AECD5EFD108E8A","date":654163710,"hash":"6E22657ECC83382EA4A6484A0FDCC4CC995B5B6038FB11C769369C767A4E9156","inLedger":58373877,"ledger_index":58373877} - }, - "XRPIOUCANCELED" : { - "tx": { - "Account":"rQamE9ddZiRZLKRAAzwGKboQ8rQHgesjEs", - "Fee":"12", - "Flags":2148139008, - "Sequence":61160755, - "SigningPubKey":"036568BFAC68D548BE97CA690DD8D111608F4D92F9062A2B674AB90CEB25FDA40A", - "TakerGets":"50000000", - "TakerPays":{ - "currency":"CSC", - "issuer":"rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr", - "value":"11616.66671104" - }, - "TransactionType":"OfferCreate", - "TxnSignature":"30440220776191E81D51594AC62A8E2DD202296B9CEFF8680369614E49BABBF5E5480ABF022049E9C1587CFF00B8CFF00EC0F1FC814A10C39B2A1E25B37A08703EAA088D95C7", - "date":677198861, - "hash":"F59BBE153A4BBB9A7EFF6BA266A6C1C158828659755116D6A93FF57DA90A8241", - "inLedger":64317224, - "ledger_index":64317224 - }, - "meta":{ - "AffectedNodes":[ - { - "DeletedNode":{ - "FinalFields":{ - "Account":"rNPV7cQYEZdH99NVJyD98XRPF3LmWgyv1P", - "BookDirectory":"B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD580E80392863AC68", - "BookNode":"0", - "Flags":0, - "OwnerNode":"0", - "PreviousTxnID":"EE845FCEBA0BC0BF49E0275F93DEC2F9F3B329A1EAEC03F7B9F7E1746392E6C7", - "PreviousTxnLgrSeq":63632375, - "Sequence":992, - "TakerGets":{ - "currency":"CSC", - "issuer":"rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr", - "value":"49000" - }, - "TakerPays":"200000000" - }, - "LedgerEntryType":"Offer", - "LedgerIndex":"1A2CF9FCD4D0345662D880E94C10F218576A95B9D46B563CACAA2B92228B5135" - } - }, - { - "ModifiedNode":{ - "FinalFields":{ - "Flags":0, - "Owner":"rNPV7cQYEZdH99NVJyD98XRPF3LmWgyv1P", - "RootIndex":"29B9170F58DA90BAA2039815C5D2750EE486A99FAEB999A5826AC2F3BDB4CFCB" - }, - "LedgerEntryType":"DirectoryNode", - "LedgerIndex":"29B9170F58DA90BAA2039815C5D2750EE486A99FAEB999A5826AC2F3BDB4CFCB" - } - }, - { - "ModifiedNode":{ - "FinalFields":{ - "Account":"rQamE9ddZiRZLKRAAzwGKboQ8rQHgesjEs", - "Balance":"25330009591", - "Flags":0, - "OwnerCount":4, - "Sequence":61160756 - }, - "LedgerEntryType":"AccountRoot", - "LedgerIndex":"389B42D413DB075A4F01DFBC9FC3B89ECF300C7BBAD3AD988CF0FD2D130BCAA7", - "PreviousFields":{ - "Balance":"25330009603", - "Sequence":61160755 - }, - "PreviousTxnID":"9D2B9F25AC84550C3FB437C0874E2804B6346201D2F31B58CDFFE9EE25C0CCC6", - "PreviousTxnLgrSeq":64317090 - } - }, - { - "ModifiedNode":{ - "FinalFields":{ - "Account":"rNPV7cQYEZdH99NVJyD98XRPF3LmWgyv1P", - "Balance":"115000000", - "Flags":0, - "OwnerCount":17, - "Sequence":1252 - }, - "LedgerEntryType":"AccountRoot", - "LedgerIndex":"69AA11C2451CF161BD80063B618EE524BAF31EF5ED03D0D971A2481F936F2A08", - "PreviousFields":{ - "OwnerCount":18 - }, - "PreviousTxnID":"51C5592C4CB7ECF8FBB0A3110A047A9453CF25C48D234E898E6D54AC33B13997", - "PreviousTxnLgrSeq":64312490 - } - }, - { - "DeletedNode":{ - "FinalFields":{ - "ExchangeRate":"580e80392863ac68", - "Flags":0, - "RootIndex":"B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD580E80392863AC68", - "TakerGetsCurrency":"0000000000000000000000004353430000000000", - "TakerGetsIssuer":"07453A365D565F637A8CB8478AF080F2CE8E0D48", - "TakerPaysCurrency":"0000000000000000000000000000000000000000", - "TakerPaysIssuer":"0000000000000000000000000000000000000000" - }, - "LedgerEntryType":"DirectoryNode", - "LedgerIndex":"B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD580E80392863AC68" - } - } - ], - "TransactionIndex":4, - "TransactionResult":"tesSUCCESS" - }, - "validated":true - } -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/PaymentChannelCreateTx.json b/src/common/libs/ledger/transactions/__tests__/templates/PaymentChannelCreateTx.json deleted file mode 100644 index b1992280c..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/PaymentChannelCreateTx.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "tx": { - "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "TransactionType": "PaymentChannelCreate", - "Amount": "10000", - "Destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", - "SettleDelay": 86400, - "PublicKey": "32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A", - "CancelAfter": 533171558, - "DestinationTag": 23480, - "SourceTag": 11747 - }, - "meta": {} -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/PaymentChannelFundTx.json b/src/common/libs/ledger/transactions/__tests__/templates/PaymentChannelFundTx.json deleted file mode 100644 index 0970341cb..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/PaymentChannelFundTx.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "tx": { - "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "TransactionType": "PaymentChannelFund", - "Channel": "C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198", - "Amount": "200000", - "Expiration": 543171558 - }, - "meta": {} -} \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/PaymentTx.json b/src/common/libs/ledger/transactions/__tests__/templates/PaymentTx.json deleted file mode 100644 index 43a112de3..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/PaymentTx.json +++ /dev/null @@ -1,394 +0,0 @@ -{ - "SimplePayment": { - "tx":{ - "Account": "rEAa7TDpBdL1hoRRAp3WDmzBcuQzaXssmb", - "TransactionType" : "Payment", - "Destination" : "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX", - "Amount" : { - "currency" : "USD", - "value" : "1", - "issuer" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn" - }, - "LastLedgerSequence":32000, - "Fee" : "12" - }, - "meta": {} - }, - "XRP2XRP":{ - "tx":{ - "hash":"7F10793B5781BD5DD52F70096520321A08DD2ED19AFC7E3F193AAC293954F7DF", - "ledger_index":57913674, - "date":"2020-09-02T07:24:11Z", - "Account":"rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY", - "Amount":"85532100", - "Destination":"rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh", - "DestinationTag":123, - "Fee":"12", - "Flags":2147483648, - "LastLedgerSequence":57913677, - "InvoiceID": "123", - "Sequence":34306, - "SigningPubKey":"03DF3AB842EB1B57F0A848CD7CC2CFD35F66E4AD0625EEACFFE72A45E4D13E49A", - "SourceTag":456, - "TransactionType":"Payment", - "TxnSignature":"304402204ED27C2D29F609772B0E67ACCFC8C205422A85D54C065437179032419" - }, - "meta":{ - "AffectedNodes":[ - { - "ModifiedNode":{ - "FinalFields":{ - "Account":"rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY", - "Balance":"49682206850", - "Domain":"787270746970626F742E636F6D", - "EmailHash":"833237B8665D2F4E00135E8DE646589F", - "Flags":131072, - "OwnerCount":1136, - "Sequence":34307 - }, - "LedgerEntryType":"AccountRoot", - "LedgerIndex":"44EF183C00DFCB5DAF505684AA7967C83F42C085EBA6B271E5349CB12C3D5965", - "PreviousFields":{ - "Balance":"49767738962", - "Sequence":34306 - }, - "PreviousTxnID":"F9B3CA1DAEB4A4AE5EE4BC3DC4C7F0C0DA6A24FCA5CE7C9D9A28A4FFD68B1831", - "PreviousTxnLgrSeq":57911131 - } - }, - { - "ModifiedNode":{ - "FinalFields":{ - "Account":"rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh", - "Balance":"541432284558887", - "Flags":131072, - "OwnerCount":2, - "Sequence":560953 - }, - "LedgerEntryType":"AccountRoot", - "LedgerIndex":"CFAFBE212FBA5490C7F0E2C8844200852C379ABFA389CC4C02BCD1ACA283742C", - "PreviousFields":{ - "Balance":"541432199026787" - }, - "PreviousTxnID":"53B3640676234DA67BDD09D1CE2C7DDD6E6A4A1E7AB01E3DECA251000399C15E", - "PreviousTxnLgrSeq":57913669 - } - } - ], - "TransactionIndex":4, - "TransactionResult":"tesSUCCESS", - "delivered_amount":"85532100" - } - }, - "ToSelfWithPath": { - "tx": { - "Account": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", - "Amount": "1000000", - "Destination": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", - "Fee": "12", - "Flags": 2147614720, - "Paths": [ - [ - { - "account": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", - "type": 1 - }, - { - "currency": "XRP", - "type": 16 - } - ], - [ - { - "account": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", - "type": 1 - }, - { - "currency": "XRP", - "type": 16 - } - ] - ], - "SendMax": { - "currency": "USD", - "issuer": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", - "value": "1.239054364262807" - }, - "Sequence": 989, - "SigningPubKey": "0350714189757DA0403CE1FF2025522337EA1B60D9796B11D5559EE914982D6AC3", - "TransactionType": "Payment", - "TxnSignature": "30450221009A70AEC89FB632C61F1CF61F8E8A50CB1787B18AF1CD64925D3153F8CF290A8F02207D8E334101D2FDD86097345CE0926FF794A4ADEA87A34E2C625E4487201CAF18", - "date": 689945571, - "hash": "09AD40BDA7091BDE0DA9B3C3B5A5855A52D004B1895A879ABC72FDE1A97FC094", - "inLedger": 67629165, - "ledger_index": 67629165 - }, - "meta": { - "AffectedNodes": [ - { - "ModifiedNode": { - "FinalFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "-0.4160283696746996" - }, - "Flags": 2228224, - "HighLimit": { - "currency": "USD", - "issuer": "rhS2H7ETM3wBkFETvYycoUm9FEDYi44Pg4", - "value": "1000000000" - }, - "HighNode": "20", - "LowLimit": { - "currency": "USD", - "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", - "value": "0" - }, - "LowNode": "4d3" - }, - "LedgerEntryType": "RippleState", - "LedgerIndex": "0225F9FB255748DA08738AF78EEFBD0EC8B036C8EE4F3DE7DBA5D9BA90E8D507", - "PreviousFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "0" - } - }, - "PreviousTxnID": "E3078BCF67E010A9042FC77E5B29BB0CCEFC32073A4D305ED5C62C3098F16558", - "PreviousTxnLgrSeq": 67628982 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "518.9596536050613" - }, - "Flags": 1114112, - "HighLimit": { - "currency": "USD", - "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", - "value": "0" - }, - "HighNode": "1c19", - "LowLimit": { - "currency": "USD", - "issuer": "rpXhhWmCvDwkzNtRbm7mmD1vZqdfatQNEe", - "value": "1000000000" - }, - "LowNode": "0" - }, - "LedgerEntryType": "RippleState", - "LedgerIndex": "0B0388546E94E2B339A52C70CE9B7791FDF104F114C94CEACB2A9440819DD435", - "PreviousFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "518.139100772877" - } - }, - "PreviousTxnID": "C60DBC7F61E390B07D7340FD13E57FEE171E9E10490F2DF874474C83D37D9C2C", - "PreviousTxnLgrSeq": 67629045 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Account": "rhS2H7ETM3wBkFETvYycoUm9FEDYi44Pg4", - "Balance": "3479304510", - "Flags": 0, - "OwnerCount": 16, - "Sequence": 35450886 - }, - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "6B555B9A14F4E40BB83EF68DE332ECCCC84D310AFFABBAA3606F7969C688EC21", - "PreviousFields": { - "Balance": "3479640630" - }, - "PreviousTxnID": "6F9600BB28AD0B5D1FCC2474357B8F1F6AA7271F26DCFFB5C1C5DD726B3F0EEF", - "PreviousTxnLgrSeq": 67629105 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "-11.48010255685665" - }, - "Flags": 2228224, - "HighLimit": { - "currency": "USD", - "issuer": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", - "value": "999999999" - }, - "HighNode": "0", - "LowLimit": { - "currency": "USD", - "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", - "value": "0" - }, - "LowNode": "5e3" - }, - "LedgerEntryType": "RippleState", - "LedgerIndex": "737CF70DE25483B1B3F30A029EE3CF1B6D32EBF408622715E2E23FEE21DC76CE", - "PreviousFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "-11.89696298327069" - } - }, - "PreviousTxnID": "1625E4886B87EB82C6C97E261172BAB24EED4D7CCC0F2B154AF063802641098E", - "PreviousTxnLgrSeq": 65590823 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Account": "rpXhhWmCvDwkzNtRbm7mmD1vZqdfatQNEe", - "Balance": "143632907823", - "Flags": 0, - "MessageKey": "02000000000000000000000000C40291E3D8888D158B3370626B71BDF2C883E942", - "OwnerCount": 8, - "Sequence": 59082581 - }, - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "73F7B01109BB599FEDF75529CD8A6521890745E813DD45EC36A73828EDDD56BF", - "PreviousFields": { - "Balance": "143633571703" - }, - "PreviousTxnID": "1382FDF544FFC891675B68DDAEC68653AF88433DE20307FD3C78D78FFD96BC51", - "PreviousTxnLgrSeq": 67629046 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Account": "rhS2H7ETM3wBkFETvYycoUm9FEDYi44Pg4", - "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4F0465B73F5072A0", - "BookNode": "0", - "Flags": 0, - "OwnerNode": "20", - "Sequence": 35450885, - "TakerGets": "299663880", - "TakerPays": { - "currency": "USD", - "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", - "value": "370.9052583803254" - } - }, - "LedgerEntryType": "Offer", - "LedgerIndex": "79657B69DC978214ED264BBC03C7F4DB4954BA7C7D793C073CA4BD0C752F9D45", - "PreviousFields": { - "TakerGets": "300000000", - "TakerPays": { - "currency": "USD", - "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", - "value": "371.32128675" - } - }, - "PreviousTxnID": "6F9600BB28AD0B5D1FCC2474357B8F1F6AA7271F26DCFFB5C1C5DD726B3F0EEF", - "PreviousTxnLgrSeq": 67629105 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Account": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", - "Balance": "1402710884", - "Domain": "7769657473652E636F6D", - "EmailHash": "FC377D96856A120F509E8FF6DB877ECC", - "Flags": 8388608, - "MessageKey": "020000000000000000000000004CCAE8EBCB878C8DB19A910A5EEBCE32E8693211", - "OwnerCount": 6, - "Sequence": 990 - }, - "LedgerEntryType": "AccountRoot", - "LedgerIndex": "8C4F456312F02D5199BCB1FB8F657BF19675288E3F4EBF2AFCFB5A1253788404", - "PreviousFields": { - "Balance": "1401710896", - "Sequence": 989 - }, - "PreviousTxnID": "EE605A8185B3864347FB592E0334E23ED431B9D653C591E911B6B402B2DFF102", - "PreviousTxnLgrSeq": 67619482 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "0" - }, - "Flags": 2228224, - "HighLimit": { - "currency": "USD", - "issuer": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", - "value": "1000000000" - }, - "HighNode": "1", - "LowLimit": { - "currency": "USD", - "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", - "value": "0" - }, - "LowNode": "1d6b" - }, - "LedgerEntryType": "RippleState", - "LedgerIndex": "C60A95B9FCD548EAB9E724EFF0FF40390487EC2D684105788C55B9B2A84BB7FA", - "PreviousFields": { - "Balance": { - "currency": "USD", - "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", - "value": "-0.822193937848758" - } - }, - "PreviousTxnID": "4E85479C9CCBECABF53B2CE10566AADC26AED044FCDF09B286CFBE47398FBEEE", - "PreviousTxnLgrSeq": 67351128 - } - }, - { - "ModifiedNode": { - "FinalFields": { - "Account": "rpXhhWmCvDwkzNtRbm7mmD1vZqdfatQNEe", - "BookDirectory": "79C54A4EBD69AB2EADCE313042F36092BE432423CC6A4F784F046421FDB4C0E0", - "BookNode": "0", - "Flags": 131072, - "OwnerNode": "0", - "Sequence": 59082564, - "TakerGets": "21469375232", - "TakerPays": { - "currency": "USD", - "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", - "value": "26536.08466816782" - } - }, - "LedgerEntryType": "Offer", - "LedgerIndex": "D38039EAC1B3DD2CCAD3C041F724E546C92527A145F7A4F1D296CCB0F10F7C2D", - "PreviousFields": { - "TakerGets": "21470039112", - "TakerPays": { - "currency": "USD", - "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", - "value": "26536.905221" - } - }, - "PreviousTxnID": "E794C0FAD8C74DD54A3294B5E3E4BD68776ECC67C43F839199B4D5E744898740", - "PreviousTxnLgrSeq": 67629003 - } - } - ], - "TransactionIndex": 56, - "TransactionResult": "tesSUCCESS", - "delivered_amount": "1000000" - }, - "validated": true - } - } \ No newline at end of file diff --git a/src/common/libs/ledger/transactions/__tests__/templates/SetRegularKeyTx.json b/src/common/libs/ledger/transactions/__tests__/templates/SetRegularKeyTx.json deleted file mode 100644 index 8079d8de1..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/SetRegularKeyTx.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "tx": { - "TransactionType": "SetRegularKey", - "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "Fee": "12", - "RegularKey": "rAR8rR8sUkBoCZFawhkWzY4Y5YoyuznwD", - "Flags": 0 - }, - "meta": {} -} diff --git a/src/common/libs/ledger/transactions/__tests__/templates/SignerListSetTx.json b/src/common/libs/ledger/transactions/__tests__/templates/SignerListSetTx.json deleted file mode 100644 index 4d3db33ad..000000000 --- a/src/common/libs/ledger/transactions/__tests__/templates/SignerListSetTx.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "tx": { - "TransactionType": "SignerListSet", - "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", - "Fee": "12", - "Flags": 0, - "SignerQuorum": 3, - "SignerEntries": [ - { - "SignerEntry": { - "Account": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", - "SignerWeight": 2, - "WalletLocator": "03075F65D8353E3A5DA3193FF976BC17A2D0B9376BE7DA942349B6526E5A2BBF54" - } - }, - { - "SignerEntry": { - "Account": "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v", - "SignerWeight": 1 - } - }, - { - "SignerEntry": { - "Account": "raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n", - "SignerWeight": 1 - } - } - ] - }, - "meta": {} -} diff --git a/src/common/libs/ledger/transactions/__tests__/ticketCreate.test.ts b/src/common/libs/ledger/transactions/__tests__/ticketCreate.test.ts deleted file mode 100644 index fb34c9d86..000000000 --- a/src/common/libs/ledger/transactions/__tests__/ticketCreate.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ -import TicketCreate from '../ticketCreate'; - -describe('TicketCreate tx', () => { - it('Should set tx type if not set', () => { - const instance = new TicketCreate(); - expect(instance.TransactionType).toBe('TicketCreate'); - expect(instance.Type).toBe('TicketCreate'); - }); -}); diff --git a/src/common/libs/ledger/transactions/__tests__/trustSet.test.ts b/src/common/libs/ledger/transactions/__tests__/trustSet.test.ts deleted file mode 100644 index 4632b93fb..000000000 --- a/src/common/libs/ledger/transactions/__tests__/trustSet.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* eslint-disable spellcheck/spell-checker */ -/* eslint-disable max-len */ - -import TrustSet from '../trustSet'; - -import trustSetTemplate from './templates/TrustSetTx.json'; - -describe('TrustSet tx', () => { - it('Should set tx type if not set', () => { - const instance = new TrustSet(); - expect(instance.TransactionType).toBe('TrustSet'); - expect(instance.Type).toBe('TrustSet'); - }); - - it('Should return right parsed values', () => { - // @ts-ignore - const { tx, meta } = trustSetTemplate; - const instance = new TrustSet(tx, meta); - - expect(instance.Currency).toBe('USD'); - expect(instance.Issuer).toBe('rsP3mgGb2tcYUrxiLFiHJiQXhsziegtwBc'); - expect(instance.Limit).toBe(100); - expect(instance.QualityIn).toBe(1); - expect(instance.QualityOut).toBe(1); - }); - - it('Should set/get fields', () => { - const instance = new TrustSet(); - - instance.Currency = 'USD'; - expect(instance.Currency).toBe('USD'); - - instance.Issuer = 'rsP3mgGb2tcYUrxiLFiHJiQXhsziegtwBc'; - expect(instance.Issuer).toBe('rsP3mgGb2tcYUrxiLFiHJiQXhsziegtwBc'); - - instance.Limit = 100; - expect(instance.Limit).toBe(100); - }); -}); diff --git a/src/common/libs/ledger/transactions/accountDelete.ts b/src/common/libs/ledger/transactions/accountDelete.ts deleted file mode 100644 index b753168ca..000000000 --- a/src/common/libs/ledger/transactions/accountDelete.ts +++ /dev/null @@ -1,152 +0,0 @@ -/** - * AccountDelete transaction Parser - */ - -import { get, isUndefined, has } from 'lodash'; - -import LedgerService from '@services/LedgerService'; - -import Localize from '@locale'; - -import Amount from '../parser/common/amount'; -import Flag from '../parser/common/flag'; -import { Destination, AmountType } from '../parser/types'; - -import BaseTransaction from './base'; -/* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; - -/* Class ==================================================================== */ -class AccountDelete extends BaseTransaction { - public static Type = TransactionTypes.AccountDelete as const; - public readonly Type = AccountDelete.Type; - - constructor(tx?: TransactionJSONType, meta?: any) { - super(tx, meta); - - // set transaction type if not set - if (isUndefined(this.TransactionType)) { - this.TransactionType = AccountDelete.Type; - } - - this.fields = this.fields.concat(['Destination', 'DestinationTag']); - } - - get Amount(): AmountType { - let amount; - - if (has(this, ['meta', 'DeliveredAmount'])) { - amount = get(this, ['meta', 'DeliveredAmount']); - } else { - amount = get(this, ['meta', 'delivered_amount']); - } - - // the delivered_amount will be unavailable in old transactions - // not in this tx type, but better to check - if (amount === 'unavailable') { - amount = undefined; - } - - if (isUndefined(amount)) return undefined; - - // as this only will be XRP we only check for string & number - if (typeof amount === 'string' || typeof amount === 'number') { - return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), - }; - } - - return undefined; - } - - get Destination(): Destination { - const destination = get(this, ['tx', 'Destination'], undefined); - const destinationTag = get(this, ['tx', 'DestinationTag'], undefined); - - if (isUndefined(destination)) return undefined; - - return { - address: destination, - tag: destinationTag, - }; - } - - validate = (): Promise => { - // eslint-disable-next-line no-async-promise-executor - return new Promise(async (resolve, reject) => { - // account and destination cannot be same - if (this.Account.address === this.Destination.address) { - reject(new Error(Localize.t('account.destinationAccountAndSourceCannotBeSame'))); - return; - } - - // check if account have any blocker object - try { - const accountObjects = await LedgerService.getAccountBlockerObjects(this.Account.address); - if (!Array.isArray(accountObjects) || accountObjects.length > 0) { - reject(new Error(Localize.t('account.deleteAccountObjectsExistError'))); - return; - } - } catch { - reject(new Error(Localize.t('account.unableToCheckAccountObjects'))); - return; - } - - // check if account sequence is met the account delete condition - const { LastLedger } = LedgerService.getLedgerStatus(); - if (LastLedger === 0) { - reject(new Error(Localize.t('account.unableToFetchLedgerSequence'))); - return; - } - - // check if account have any blocker object - try { - const accountSequence = await LedgerService.getAccountSequence(this.Account.address); - const remainingSequence = accountSequence + 256 - LastLedger; - - if (remainingSequence > 0) { - reject( - new Error( - Localize.t('account.deleteAccountSequenceIsNotEnoughError', { - remainingSequence, - }), - ), - ); - return; - } - } catch { - reject(new Error(Localize.t('account.unableGetAccountInfo'))); - return; - } - - // check if destination exist or required destination tag flag is set - try { - const destinationAccountInfo = await LedgerService.getAccountInfo(this.Destination.address); - - if (!destinationAccountInfo || has(destinationAccountInfo, 'error')) { - reject(new Error(Localize.t('account.destinationAccountIsNotActivated'))); - return; - } - - const { account_data } = destinationAccountInfo; - - if (has(account_data, ['Flags'])) { - const accountFlags = new Flag('Account', account_data.Flags).parse(); - if (accountFlags.requireDestinationTag && this.Destination.tag === undefined) { - reject(new Error(Localize.t('account.destinationAddressRequiredDestinationTag'))); - return; - } - } - } catch { - reject(new Error(Localize.t('account.unableGetDestinationAccountInfo'))); - } - - // everything is fine, resolve - resolve(); - }); - }; -} - -/* Export ==================================================================== */ -export default AccountDelete; diff --git a/src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDeleteClass.ts b/src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDeleteClass.ts new file mode 100644 index 000000000..8003f2e10 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDeleteClass.ts @@ -0,0 +1,71 @@ +import { get, isUndefined, has } from 'lodash'; + +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; +import { Destination, AmountType } from '@common/libs/ledger/parser/types'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class AccountDelete extends BaseTransaction { + public static Type = TransactionTypes.AccountDelete as const; + public readonly Type = AccountDelete.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = AccountDelete.Type; + } + + this.fields = this.fields.concat(['Destination', 'DestinationTag']); + } + + get Amount(): AmountType { + let amount; + + if (has(this, ['meta', 'DeliveredAmount'])) { + amount = get(this, ['meta', 'DeliveredAmount']); + } else { + amount = get(this, ['meta', 'delivered_amount']); + } + + // the delivered_amount will be unavailable in old transactions + // not in this tx type, but better to check + if (amount === 'unavailable') { + amount = undefined; + } + + if (isUndefined(amount)) return undefined; + + // as this only will be native currency we only check for string & number + if (typeof amount === 'string' || typeof amount === 'number') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), + }; + } + + return undefined; + } + + get Destination(): Destination { + const destination = get(this, ['tx', 'Destination'], undefined); + const destinationTag = get(this, ['tx', 'DestinationTag'], undefined); + + if (isUndefined(destination)) return undefined; + + return { + address: destination, + tag: destinationTag, + }; + } +} + +/* Export ==================================================================== */ +export default AccountDelete; diff --git a/src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDeleteInfo.ts b/src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDeleteInfo.ts new file mode 100644 index 000000000..559f3fddd --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDeleteInfo.ts @@ -0,0 +1,48 @@ +import { isUndefined } from 'lodash'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import { AccountModel } from '@store/models/objects'; + +import Localize from '@locale'; + +import AccountDelete from './AccountDeleteClass'; + +/* Descriptor ==================================================================== */ +const AccountDeleteInfo = { + getLabel: (): string => { + return Localize.t('events.deleteAccount'); + }, + + getDescription: (tx: AccountDelete): string => { + let content = Localize.t('events.itDeletedAccount', { address: tx.Account.address }); + + content += '\n\n'; + content += Localize.t('events.itWasInstructedToDeliverTheRemainingBalanceOf', { + amount: tx.Amount.value, + currency: NormalizeCurrencyCode(tx.Amount.currency), + destination: tx.Destination.address, + }); + + if (!isUndefined(tx.Account.tag)) { + content += '\n'; + content += Localize.t('events.theTransactionHasASourceTag', { tag: tx.Account.tag }); + } + if (!isUndefined(tx.Destination.tag)) { + content += '\n'; + content += Localize.t('events.theTransactionHasADestinationTag', { tag: tx.Destination.tag }); + } + + return content; + }, + + getRecipient: (tx: AccountDelete, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return tx.Destination; + }, +}; + +/* Export ==================================================================== */ +export default AccountDeleteInfo; diff --git a/src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDeleteValidation.ts b/src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDeleteValidation.ts new file mode 100644 index 000000000..88de19480 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/AccountDelete/AccountDeleteValidation.ts @@ -0,0 +1,82 @@ +import { has } from 'lodash'; + +import LedgerService from '@services/LedgerService'; +import Localize from '@locale'; + +import AccountDelete from './AccountDeleteClass'; + +/* Validation ==================================================================== */ +const AccountDeleteValidation = (tx: AccountDelete): Promise => { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve, reject) => { + // account and destination cannot be same + if (tx.Account.address === tx.Destination.address) { + reject(new Error(Localize.t('account.destinationAccountAndSourceCannotBeSame'))); + return; + } + + // check if account have any blocker object + try { + const accountObjects = await LedgerService.getAccountBlockerObjects(tx.Account.address); + if (Array.isArray(accountObjects) && accountObjects.length > 0) { + reject(new Error(Localize.t('account.deleteAccountObjectsExistError'))); + return; + } + } catch { + reject(new Error(Localize.t('account.unableToCheckAccountObjects'))); + return; + } + + // check if account sequence is met the account delete condition + const { LastLedger } = LedgerService.getLedgerStatus(); + if (LastLedger === 0) { + reject(new Error(Localize.t('account.unableToFetchLedgerSequence'))); + return; + } + + // check if account have any blocker object + try { + const accountSequence = await LedgerService.getAccountSequence(tx.Account.address); + const remainingSequence = accountSequence + 256 - LastLedger; + + if (remainingSequence > 0) { + reject( + new Error( + Localize.t('account.deleteAccountSequenceIsNotEnoughError', { + remainingSequence, + }), + ), + ); + return; + } + } catch { + reject(new Error(Localize.t('account.unableGetAccountInfo'))); + return; + } + + // check if destination exist or required destination tag flag is set + try { + const destinationAccountInfo = await LedgerService.getAccountInfo(tx.Destination.address); + + if (!destinationAccountInfo || has(destinationAccountInfo, 'error')) { + reject(new Error(Localize.t('account.destinationAccountIsNotActivated'))); + return; + } + + const { account_flags } = destinationAccountInfo; + + if (account_flags?.requireDestinationTag && tx.Destination.tag === undefined) { + reject(new Error(Localize.t('account.destinationAddressRequiredDestinationTag'))); + return; + } + } catch { + reject(new Error(Localize.t('account.unableGetDestinationAccountInfo'))); + } + + // everything is fine, resolve + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default AccountDeleteValidation; diff --git a/src/common/libs/ledger/transactions/genuine/AccountDelete/index.ts b/src/common/libs/ledger/transactions/genuine/AccountDelete/index.ts new file mode 100644 index 000000000..837d0c61d --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/AccountDelete/index.ts @@ -0,0 +1,3 @@ +export { default as AccountDelete } from './AccountDeleteClass'; +export { default as AccountDeleteValidation } from './AccountDeleteValidation'; +export { default as AccountDeleteInfo } from './AccountDeleteInfo'; diff --git a/src/common/libs/ledger/transactions/accountSet.ts b/src/common/libs/ledger/transactions/genuine/AccountSet/AccountSetClass.ts similarity index 81% rename from src/common/libs/ledger/transactions/accountSet.ts rename to src/common/libs/ledger/transactions/genuine/AccountSet/AccountSetClass.ts index 6cba92580..f5d1f73c7 100644 --- a/src/common/libs/ledger/transactions/accountSet.ts +++ b/src/common/libs/ledger/transactions/genuine/AccountSet/AccountSetClass.ts @@ -1,16 +1,18 @@ /** - * AccountSet transaction Parser + * AccountSet transaction */ import BigNumber from 'bignumber.js'; import { get, isUndefined } from 'lodash'; + import { HexEncoding } from '@common/utils/string'; -import BaseTransaction from './base'; -import Flag from '../parser/common/flag'; +import Flag from '@common/libs/ledger/parser/common/flag'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class AccountSet extends BaseTransaction { @@ -34,6 +36,8 @@ class AccountSet extends BaseTransaction { 'TransferRate', 'TickSize', 'NFTokenMinter', + 'WalletLocator', + 'WalletSize', ]); } @@ -46,7 +50,9 @@ class AccountSet extends BaseTransaction { isUndefined(this.MessageKey) && isUndefined(this.TransferRate) && isUndefined(this.TickSize) && - isUndefined(this.NFTokenMinter) + isUndefined(this.NFTokenMinter) && + isUndefined(this.WalletLocator) && + isUndefined(this.WalletSize) ); } @@ -92,17 +98,25 @@ class AccountSet extends BaseTransaction { get TransferRate(): number { const transferRate = get(this, ['tx', 'TransferRate'], undefined); - if (transferRate) { - return new BigNumber(transferRate).dividedBy(1000000).minus(1000).dividedBy(10).toNumber(); + if (isUndefined(transferRate)) { + return undefined; + } + + if (transferRate === 0) { + return 0; } - return undefined; + return new BigNumber(transferRate).dividedBy(1000000).minus(1000).dividedBy(10).toNumber(); } get TickSize(): number { return get(this, ['tx', 'TickSize'], undefined); } + get NFTokenMinter(): string { + return get(this, ['tx', 'NFTokenMinter'], undefined); + } + get WalletLocator(): string { return get(this, ['tx', 'WalletLocator'], undefined); } @@ -110,10 +124,6 @@ class AccountSet extends BaseTransaction { get WalletSize(): number { return get(this, ['tx', 'WalletSize'], undefined); } - - get NFTokenMinter(): string { - return get(this, ['tx', 'NFTokenMinter'], undefined); - } } /* Export ==================================================================== */ diff --git a/src/common/libs/ledger/transactions/genuine/AccountSet/AccountSetInfo.ts b/src/common/libs/ledger/transactions/genuine/AccountSet/AccountSetInfo.ts new file mode 100644 index 000000000..34be90dc4 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/AccountSet/AccountSetInfo.ts @@ -0,0 +1,115 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import AccountSet from './AccountSetClass'; + +/* Descriptor ==================================================================== */ +const AccountSetInfo = { + getLabel: (tx: AccountSet): string => { + if (tx.isNoOperation() && tx.isCancelTicket()) { + return Localize.t('events.cancelTicket'); + } + return Localize.t('events.accountSettings'); + }, + + getDescription: (tx: AccountSet): string => { + let content = Localize.t('events.thisIsAnAccountSetTransaction'); + + if (tx.isNoOperation()) { + content += '\n'; + if (tx.isCancelTicket()) { + content += Localize.t('events.thisTransactionClearTicket', { ticketSequence: tx.TicketSequence }); + } else { + content += Localize.t('events.thisTransactionDoesNotEffectAnyAccountSettings'); + } + return content; + } + + if (tx.Domain !== undefined) { + content += '\n'; + if (tx.Domain === '') { + content += Localize.t('events.itRemovesTheAccountDomain'); + } else { + content += Localize.t('events.itSetsAccountDomainTo', { domain: tx.Domain }); + } + } + + if (tx.EmailHash !== undefined) { + content += '\n'; + if (tx.EmailHash === '') { + content += Localize.t('events.itRemovesTheAccountEmailHash'); + } else { + content += Localize.t('events.itSetsAccountEmailHashTo', { emailHash: tx.EmailHash }); + } + } + + if (tx.MessageKey !== undefined) { + content += '\n'; + if (tx.MessageKey === '') { + content += Localize.t('events.itRemovesTheAccountMessageKey'); + } else { + content += Localize.t('events.itSetsAccountMessageKeyTo', { messageKey: tx.MessageKey }); + } + } + + if (tx.TransferRate !== undefined) { + content += '\n'; + if (tx.TransferRate === 0) { + content += Localize.t('events.itRemovesTheAccountTransferRate'); + } else { + content += Localize.t('events.itSetsAccountTransferRateTo', { transferRate: tx.TransferRate }); + } + } + + if (tx.NFTokenMinter !== undefined) { + content += '\n'; + if (tx.NFTokenMinter === '') { + content += Localize.t('events.itRemovesTheAccountMinter'); + } else { + content += Localize.t('events.itSetsAccountMinterTo', { minter: tx.NFTokenMinter }); + } + } + + if (tx.SetFlag !== undefined) { + content += '\n'; + content += Localize.t('events.itSetsTheAccountFlag', { flag: tx.SetFlag }); + } + + if (tx.ClearFlag !== undefined) { + content += '\n'; + content += Localize.t('events.itClearsTheAccountFlag', { flag: tx.ClearFlag }); + } + + if (tx.WalletLocator !== undefined) { + content += '\n'; + if (tx.WalletLocator === '') { + content += Localize.t('events.itRemovesTheAccountWalletLocator'); + } else { + content += Localize.t('events.itSetsAccountWalletLocatorTo', { walletLocator: tx.WalletLocator }); + } + } + + if (tx.WalletSize !== undefined) { + content += '\n'; + if (tx.WalletSize === 0) { + content += Localize.t('events.itRemovesTheAccountWalletSize'); + } else { + content += Localize.t('events.itSetsAccountWalletSizeTo', { walletSize: tx.WalletSize }); + } + } + + return content; + }, + + getRecipient: (tx: AccountSet, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default AccountSetInfo; diff --git a/src/common/libs/ledger/transactions/genuine/AccountSet/AccountSetValidation.ts b/src/common/libs/ledger/transactions/genuine/AccountSet/AccountSetValidation.ts new file mode 100644 index 000000000..020413c8d --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/AccountSet/AccountSetValidation.ts @@ -0,0 +1,12 @@ +// import AccountSet from './AccountSetClass'; + +/* Validator ==================================================================== */ +const AccountSetValidator = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default AccountSetValidator; diff --git a/src/common/libs/ledger/transactions/genuine/AccountSet/index.ts b/src/common/libs/ledger/transactions/genuine/AccountSet/index.ts new file mode 100644 index 000000000..0ea377801 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/AccountSet/index.ts @@ -0,0 +1,3 @@ +export { default as AccountSet } from './AccountSetClass'; +export { default as AccountSetValidation } from './AccountSetValidation'; +export { default as AccountSetInfo } from './AccountSetInfo'; diff --git a/src/common/libs/ledger/transactions/base.ts b/src/common/libs/ledger/transactions/genuine/BaseTransaction.ts similarity index 75% rename from src/common/libs/ledger/transactions/base.ts rename to src/common/libs/ledger/transactions/genuine/BaseTransaction.ts index c40d4a261..1e49cebd2 100644 --- a/src/common/libs/ledger/transactions/base.ts +++ b/src/common/libs/ledger/transactions/genuine/BaseTransaction.ts @@ -5,12 +5,17 @@ import BigNumber from 'bignumber.js'; import { filter, find, flatMap, get, has, isUndefined, remove, set, size } from 'lodash'; import LedgerService from '@services/LedgerService'; +import NetworkService from '@services/NetworkService'; -import { AccountSchema } from '@store/schemas/latest'; +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; import { AppScreens } from '@common/constants'; import { Navigator } from '@common/helpers/navigator'; +import { EncodeCTID } from '@common/utils/codec'; + import { SignedObjectType, SubmitResultType, @@ -19,16 +24,15 @@ import { VerifyResultType, } from '@common/libs/ledger/types'; -import Localize from '@locale'; - -import Meta from '../parser/meta'; -import LedgerDate from '../parser/common/date'; -import Amount from '../parser/common/amount'; -import Flag from '../parser/common/flag'; -import Memo from '../parser/common/memo'; +import Meta from '@common/libs/ledger/parser/meta'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; +import Amount from '@common/libs/ledger/parser/common/amount'; +import Flag from '@common/libs/ledger/parser/common/flag'; +import Memo from '@common/libs/ledger/parser/common/memo'; /* Types ==================================================================== */ -import { Account, AmountType, MemoType, TransactionResult } from '../parser/types'; +import { Account, AmountType, MemoType, Signer, TransactionResult } from '@common/libs/ledger/parser/types'; +import { StringTypeCheck } from '@common/utils/string'; /* Class ==================================================================== */ class BaseTransaction { @@ -48,8 +52,6 @@ class BaseTransaction { public SignMethod: 'PIN' | 'BIOMETRIC' | 'PASSPHRASE' | 'TANGEM' | 'OTHER'; public SignerAccount: any; - validate?: () => Promise; - constructor(tx?: TransactionJSONType, meta?: any) { if (!isUndefined(tx)) { this.tx = tx; @@ -73,6 +75,9 @@ class BaseTransaction { 'SourceTag', 'SigningPubKey', 'TxnSignature', + 'NetworkID', + 'HookParameters', + 'OperationLimit', ]; // memorize balance and owner count changes @@ -82,9 +87,9 @@ class BaseTransaction { /** Prepare the transaction for signing, including setting the account sequence - * @returns {Promise} - */ - prepare = async (account: AccountSchema) => { + * @returns {Promise} + */ + prepare = async (account: AccountModel) => { // ignore for pseudo transactions if (this.isPseudoTransaction()) { return; @@ -114,15 +119,20 @@ class BaseTransaction { }; /** - Populate transaction LastLedgerSequence - * @param {number} ledgerOffset max ledger gap - * @returns {void} - */ - populateLastLedgerSequence = (ledgerOffset = 10) => { + Populate transaction LastLedgerSequence + * @param {number} ledgerOffset max ledger gap + * @returns {void} + */ + populateFields = ({ lastLedgerOffset }: { lastLedgerOffset?: number } = {}): void => { // ignore for pseudo transactions if (this.isPseudoTransaction()) { return; } + + // NOTE: as tangem signing can take a lot of time we increase gap to 150 ledger + // offset default to 10 + const LastLedgerOffset = lastLedgerOffset || 10; + // if no LastLedgerSequence or LastLedgerSequence is already pass the threshold // update with LastLedger + 10 const { LastLedger } = LedgerService.getLedgerStatus(); @@ -131,7 +141,8 @@ class BaseTransaction { throw new Error(Localize.t('global.unableToGetLastClosedLedger')); } // expected LastLedger sequence - const ExpectedLastLedger = LastLedger + ledgerOffset; + const ExpectedLastLedger = LastLedger + LastLedgerOffset; + // if LastLedgerSequence is not set if (isUndefined(this.LastLedgerSequence)) { // only set if last ledger is set @@ -144,25 +155,52 @@ class BaseTransaction { // the Last Ledger is already passed, update it base on Last ledger this.LastLedgerSequence = ExpectedLastLedger; } + + // check if we need to populate NetworkID + if (isUndefined(this.NetworkID)) { + // get current network id + const networkId = NetworkService.getNetworkId(); + // legacy networks have ids less than 1024, these networks cannot specify NetworkID in txn + if (networkId > 1024) { + this.NetworkID = NetworkService.getNetworkId(); + } + } }; /** - Sign the transaction with provided account - * @param {AccountSchema} account object sign with - * @param {bool} multiSign indicates if transaction should sign for multi signing - * @returns {Promise} signed tx blob - */ - sign = (account: AccountSchema, multiSign = false): Promise => { + Sign the transaction with provided account + * @param {AccountModel} account object sign with + * @param multiSign + * @returns {Promise} signed tx blob + */ + sign = (account: AccountModel, multiSign = false): Promise => { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { try { + // account params should be provided if (!account) { reject(new Error('Account param is required!')); return; } + // transaction is already been signed? if (this.SignedBlob) { - reject(new Error('Transaction already signed!')); + reject(new Error('Transaction already been signed!')); + return; + } + + // check transaction can be signed by the network user is connected with before triggering the sign flow + const definitions = NetworkService.getNetworkDefinitions(); + + if ( + Array.isArray(definitions.transactionNames) && + !definitions.transactionNames.includes(this.TransactionType) + ) { + reject( + new Error( + `Your current connected network doesn't support "${this.TransactionType}" transaction. Please switch to a compatible network.`, + ), + ); return; } @@ -185,6 +223,7 @@ class BaseTransaction { return; } + // show vault overlay and handle the reset of signing Navigator.showOverlay(AppScreens.Overlay.Vault, { account, multiSign, @@ -208,9 +247,7 @@ class BaseTransaction { resolve(this.SignedBlob); }, - onDismissed: () => { - reject(); - }, + onDismissed: reject, }); } catch (e) { reject(e); @@ -266,7 +303,7 @@ class BaseTransaction { // this will prevent fee burn if something wrong on AccountDelete transactions const shouldFailHard = this.TransactionType === TransactionTypes.AccountDelete; - // Submit signed transaction to the XRPL + // Submit signed transaction to the Ledger const submitResult = await LedgerService.submitTransaction(this.SignedBlob, this.Hash, shouldFailHard); // set submit result @@ -279,8 +316,12 @@ class BaseTransaction { success: false, engineResult: 'telFAILED', message: e?.message, - node: undefined, - nodeType: undefined, + network: { + id: undefined, + node: undefined, + key: undefined, + type: undefined, + }, } as SubmitResultType; // set submit result @@ -298,42 +339,6 @@ class BaseTransaction { this.isAborted = true; }; - /** - * Calculate the fee base on transaction type - * @param {number} netFee in drops - * @returns {string} calculated fee in drops - */ - calculateFee = (netFee?: number): string => { - // if netFee is not set, default to 12 drops - if (!netFee) { - netFee = 12; - } - - let baseFee = new BigNumber(0); - - // netFee × (33 + (Fulfillment size in bytes ÷ 16)) - // @ts-ignore - if (this.TransactionType === TransactionTypes.EscrowFinish && this.Fulfillment) { - baseFee = new BigNumber(netFee).multipliedBy( - // @ts-ignore - new BigNumber(Buffer.from(this.Fulfillment).length).dividedBy(16).plus(33), - ); - } - - // AccountDelete transactions require at least the owner reserve amount - if (this.TransactionType === TransactionTypes.AccountDelete) { - const { OwnerReserve } = LedgerService.getNetworkReserve(); - baseFee = new BigNumber(OwnerReserve).multipliedBy(1000000); - } - - // if no changing needs to apply set the net fee as base fee - if (baseFee.isZero()) { - baseFee = new BigNumber(netFee); - } - - return baseFee.toFixed(0, BigNumber.ROUND_UP); - }; - /** * check if transaction contain any xApp identifier and return it * @returns {string} xApp identifier if found any @@ -343,7 +348,10 @@ class BaseTransaction { if (!memos) return undefined; for (const memo of memos) { - if (memo.MemoType === 'xumm/xapp' && memo.MemoData) { + if ( + ['xumm/xapp', 'xaman/xapp'].includes(memo.MemoType) && + StringTypeCheck.isValidXAppIdentifier(memo.MemoData) + ) { return memo.MemoData; } } @@ -369,9 +377,9 @@ class BaseTransaction { // if cross currency remove fee from changes if (size(filter(balanceChanges, { action: 'DEC' })) > 1) { - const decreaseXRP = find(balanceChanges, { action: 'DEC', currency: 'XRP' }); - if (decreaseXRP.value === this.Fee) { - remove(balanceChanges, { action: 'DEC', currency: 'XRP' }); + const decreaseNative = find(balanceChanges, { action: 'DEC', currency: NetworkService.getNativeAsset() }); + if (decreaseNative.value === this.Fee) { + remove(balanceChanges, { action: 'DEC', currency: NetworkService.getNativeAsset() }); } } @@ -384,11 +392,11 @@ class BaseTransaction { // this should apply for NFTokenAcceptOffer and OfferCreate transactions as well let feeFieldKey = undefined as 'sent' | 'received'; if (owner === this.Account.address) { - if (changes.sent?.currency === 'XRP') { + if (changes.sent?.currency === NetworkService.getNativeAsset()) { feeFieldKey = 'sent'; } else if ( [TransactionTypes.NFTokenAcceptOffer, TransactionTypes.OfferCreate].includes(this.TransactionType) && - changes.received?.currency === 'XRP' + changes.received?.currency === NetworkService.getNativeAsset() ) { feeFieldKey = 'received'; } @@ -405,7 +413,7 @@ class BaseTransaction { ) { set(changes, 'sent', undefined); set(changes, 'received', { - currency: 'XRP', + currency: NetworkService.getNativeAsset(), value: afterFee.absoluteValue().decimalPlaces(8).toString(10), }); } else { @@ -517,13 +525,13 @@ class BaseTransaction { } set Fee(fee: string) { - set(this, ['tx', 'Fee'], new Amount(fee, false).xrpToDrops()); + set(this, ['tx', 'Fee'], new Amount(fee, false).nativeToDrops()); } get Fee(): string { const fee = get(this, ['tx', 'Fee'], undefined); if (isUndefined(fee)) return undefined; - return new Amount(fee).dropsToXrp(); + return new Amount(fee).dropsToNative(); } get Date(): any { @@ -586,6 +594,31 @@ class BaseTransaction { }; } + // serialize transaction object to rippled tx json + get Json(): TransactionJSONType { + // shallow copy + const tx = { ...this.tx }; + Object.getOwnPropertyNames(this.tx).forEach((k: string) => { + if (!this.fields.includes(k)) { + delete tx[k]; + } + }); + + return tx; + } + + get CTID(): string { + // check if CTID is already in the transaction response + const ctid = get(this, ['tx', 'ctid'], undefined); + + if (typeof ctid === 'undefined') { + // calculate the ctid + return EncodeCTID(this.LedgerIndex, this.TransactionIndex, NetworkService.getNetworkId()); + } + + return ctid; + } + get Hash(): string { return get(this, ['tx', 'hash']); } @@ -598,24 +631,26 @@ class BaseTransaction { return get(this, ['tx', 'ledger_index']); } - // serialize transaction object to rippled tx json - get Json(): TransactionJSONType { - // shallow copy - const tx = { ...this.tx }; - Object.getOwnPropertyNames(this.tx).forEach((k: string) => { - if (!this.fields.includes(k)) { - delete tx[k]; - } - }); + set LedgerIndex(index: number) { + set(this, ['tx', 'ledger_index'], index); + } - return tx; + get TransactionIndex(): number { + return get(this, ['meta', 'TransactionIndex']); } - get Signers(): Array { - const signers = get(this, ['tx', 'Signers']); + set TransactionIndex(index: number) { + set(this, ['meta', 'TransactionIndex'], index); + } - return flatMap(signers, (e) => { - return { account: e.Signer.Account, signature: e.Signer.TxnSignature, pubKey: e.Signer.SigningPubKey }; + get Signers(): Array { + const signers = get(this, ['tx', 'Signers']) as any; + return flatMap(signers, (item) => { + return { + account: item.Signer.Account, + signature: item.Signer.TxnSignature, + pubKey: item.Signer.SigningPubKey, + }; }); } @@ -670,6 +705,47 @@ class BaseTransaction { get TxnSignature(): string { return get(this, ['tx', 'TxnSignature'], undefined); } + + set NetworkID(networkId: number) { + set(this, ['tx', 'NetworkID'], networkId); + } + + get NetworkID(): number { + return get(this, ['tx', 'NetworkID'], undefined); + } + + set OperationLimit(operationLimit: number) { + set(this, ['tx', 'OperationLimit'], operationLimit); + } + + get OperationLimit(): number { + return get(this, ['tx', 'OperationLimit'], undefined); + } + + set FirstLedgerSequence(firstLedgerSequence: number) { + set(this, ['tx', 'FirstLedgerSequence'], firstLedgerSequence); + } + + get FirstLedgerSequence(): number { + return get(this, ['tx', 'FirstLedgerSequence'], undefined); + } + + get EmitDetails(): any { + return get(this, ['tx', 'EmitDetails'], undefined); + } + + get HookParameters(): { + HookParameter: { + HookParameterName: string; + HookParameterValue: string; + }; + }[] { + return get(this, ['tx', 'HookParameters'], undefined); + } + + get MetaData() { + return { ...this.meta }; + } } /* Export ==================================================================== */ diff --git a/src/common/libs/ledger/transactions/checkCancel.ts b/src/common/libs/ledger/transactions/genuine/CheckCancel/CheckCancelClass.ts similarity index 56% rename from src/common/libs/ledger/transactions/checkCancel.ts rename to src/common/libs/ledger/transactions/genuine/CheckCancel/CheckCancelClass.ts index 0831d473a..365b0d38e 100644 --- a/src/common/libs/ledger/transactions/checkCancel.ts +++ b/src/common/libs/ledger/transactions/genuine/CheckCancel/CheckCancelClass.ts @@ -2,13 +2,11 @@ import moment from 'moment-timezone'; import { set, get, isUndefined } from 'lodash'; -import Localize from '@locale'; - -import BaseTransaction from './base'; -import CheckCreate from './checkCreate'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; +import { CheckCreate } from '@common/libs/ledger/transactions/genuine/CheckCreate'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class CheckCancel extends BaseTransaction { @@ -47,29 +45,6 @@ class CheckCancel extends BaseTransaction { return exp.isBefore(now); } - - validate = (): Promise => { - return new Promise((resolve, reject) => { - if (!this.Check) { - reject(new Error(Localize.t('payload.unableToGetCheckObject'))); - return; - } - - // The source or the destination of the check can cancel a Check at any time using this transaction type. - // If the Check has expired, any address can cancel it. - if (!this.isExpired) { - if ( - this.Account.address !== this.Check.Destination.address && - this.Account.address !== this.Check.Account.address - ) { - reject(new Error(Localize.t('payload.nonExpiredCheckCanOnlyCancelByCreatedAccount'))); - return; - } - } - - resolve(); - }); - }; } /* Export ==================================================================== */ diff --git a/src/common/libs/ledger/transactions/genuine/CheckCancel/CheckCancelInfo.ts b/src/common/libs/ledger/transactions/genuine/CheckCancel/CheckCancelInfo.ts new file mode 100644 index 000000000..73ca63543 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/CheckCancel/CheckCancelInfo.ts @@ -0,0 +1,26 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import CheckCancel from './CheckCancelClass'; + +/* Descriptor ==================================================================== */ +const CheckCancelInfo = { + getLabel: (): string => { + return Localize.t('events.cancelCheck'); + }, + + getDescription: (tx: CheckCancel): string => { + return Localize.t('events.theTransactionWillCancelCheckWithId', { checkId: tx.CheckID }); + }, + + getRecipient: (tx: CheckCancel, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default CheckCancelInfo; diff --git a/src/common/libs/ledger/transactions/genuine/CheckCancel/CheckCancelValidation.ts b/src/common/libs/ledger/transactions/genuine/CheckCancel/CheckCancelValidation.ts new file mode 100644 index 000000000..c54422166 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/CheckCancel/CheckCancelValidation.ts @@ -0,0 +1,30 @@ +import Localize from '@locale'; + +import CheckCancel from './CheckCancelClass'; + +/* Validator ==================================================================== */ +const CheckCancelValidation = (tx: CheckCancel): Promise => { + return new Promise((resolve, reject) => { + if (!tx.Check) { + reject(new Error(Localize.t('payload.unableToGetCheckObject'))); + return; + } + + // The source or the destination of the check can cancel a Check at any time using this transaction type. + // If the Check has expired, any address can cancel it. + if (!tx.isExpired) { + if ( + tx.Account.address !== tx.Check.Destination.address && + tx.Account.address !== tx.Check.Account.address + ) { + reject(new Error(Localize.t('payload.nonExpiredCheckCanOnlyCancelByCreatedAccount'))); + return; + } + } + + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default CheckCancelValidation; diff --git a/src/common/libs/ledger/transactions/genuine/CheckCancel/index.ts b/src/common/libs/ledger/transactions/genuine/CheckCancel/index.ts new file mode 100644 index 000000000..43696fef4 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/CheckCancel/index.ts @@ -0,0 +1,3 @@ +export { default as CheckCancel } from './CheckCancelClass'; +export { default as CheckCancelValidation } from './CheckCancelValidation'; +export { default as CheckCancelInfo } from './CheckCancelInfo'; diff --git a/src/common/libs/ledger/transactions/checkCash.ts b/src/common/libs/ledger/transactions/genuine/CheckCash/CheckCashClass.ts similarity index 57% rename from src/common/libs/ledger/transactions/checkCash.ts rename to src/common/libs/ledger/transactions/genuine/CheckCash/CheckCashClass.ts index 7ea753b91..e23b75da9 100644 --- a/src/common/libs/ledger/transactions/checkCash.ts +++ b/src/common/libs/ledger/transactions/genuine/CheckCash/CheckCashClass.ts @@ -1,17 +1,16 @@ import moment from 'moment-timezone'; import { set, get, isUndefined } from 'lodash'; -import { NormalizeCurrencyCode } from '@common/utils/amount'; -import Localize from '@locale'; +import NetworkService from '@services/NetworkService'; -import BaseTransaction from './base'; -import CheckCreate from './checkCreate'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; +import { CheckCreate } from '@common/libs/ledger/transactions/genuine/CheckCreate'; -import Amount from '../parser/common/amount'; +import Amount from '@common/libs/ledger/parser/common/amount'; /* Types ==================================================================== */ -import { AmountType } from '../parser/types'; -import { TransactionJSONType, TransactionTypes } from '../types'; +import { AmountType } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class CheckCash extends BaseTransaction { @@ -38,8 +37,8 @@ class CheckCash extends BaseTransaction { if (typeof amount === 'string') { return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), }; } @@ -55,9 +54,9 @@ class CheckCash extends BaseTransaction { set(this, 'tx.Amount', undefined); return; } - // XRP + // native currency if (typeof input === 'string') { - set(this, 'tx.Amount', new Amount(input, false).xrpToDrops()); + set(this, 'tx.Amount', new Amount(input, false).nativeToDrops()); } if (typeof input === 'object') { @@ -78,8 +77,8 @@ class CheckCash extends BaseTransaction { if (typeof deliverMin === 'string') { return { - currency: 'XRP', - value: new Amount(deliverMin).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(deliverMin).dropsToNative(), }; } @@ -95,9 +94,9 @@ class CheckCash extends BaseTransaction { set(this, 'tx.DeliverMin', undefined); return; } - // XRP + // native currency if (typeof input === 'string') { - set(this, 'tx.DeliverMin', new Amount(input, false).xrpToDrops()); + set(this, 'tx.DeliverMin', new Amount(input, false).nativeToDrops()); } if (typeof input === 'object') { @@ -145,58 +144,6 @@ class CheckCash extends BaseTransaction { return exp.isBefore(now); } - - validate = (): Promise => { - return new Promise((resolve, reject) => { - // check object should be assigned - if (!this.Check) { - reject(new Error(Localize.t('payload.unableToGetCheckObject'))); - return; - } - // The user must enter an amount - if ( - (!this.Amount || !this.Amount?.value || this.Amount?.value === '0') && - (!this.DeliverMin || !this.DeliverMin?.value || this.DeliverMin?.value === '0') - ) { - reject(new Error(Localize.t('send.pleaseEnterAmount'))); - return; - } - - // check if the entered amount don't exceed the cash amount - if (this.Amount && Number(this.Amount.value) > Number(this.Check.SendMax.value)) { - reject( - new Error( - Localize.t('payload.insufficientCashAmount', { - amount: this.Check.SendMax.value, - currency: NormalizeCurrencyCode(this.Check.SendMax.currency), - }), - ), - ); - return; - } - - // check for insufficient amount - if (this.DeliverMin && Number(this.DeliverMin.value) > Number(this.Check.SendMax.value)) { - reject( - new Error( - Localize.t('payload.insufficientCashAmount', { - amount: this.Check.SendMax.value, - currency: NormalizeCurrencyCode(this.Check.SendMax.currency), - }), - ), - ); - return; - } - - // the signer should be the same as check destination - if (this.Account.address !== this.Check.Destination.address) { - reject(new Error(Localize.t('payload.checkCanOnlyCashByCheckDestination'))); - return; - } - - resolve(); - }); - }; } /* Export ==================================================================== */ diff --git a/src/common/libs/ledger/transactions/genuine/CheckCash/CheckCashInfo.ts b/src/common/libs/ledger/transactions/genuine/CheckCash/CheckCashInfo.ts new file mode 100644 index 000000000..cfe27c347 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/CheckCash/CheckCashInfo.ts @@ -0,0 +1,35 @@ +import { AccountModel } from '@store/models'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import Localize from '@locale'; + +import CheckCash from './CheckCashClass'; + +/* Descriptor ==================================================================== */ +const CheckCashInfo = { + getLabel: (): string => { + return Localize.t('events.cashCheck'); + }, + + getDescription: (tx: CheckCash): string => { + const amount = tx.Amount || tx.DeliverMin; + + return Localize.t('events.itWasInstructedToDeliverByCashingCheck', { + address: tx.Check?.Destination.address || 'address', + amount: amount.value, + currency: NormalizeCurrencyCode(amount.currency), + checkId: tx.CheckID, + }); + }, + + getRecipient: (tx: CheckCash, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address === account.address && tx.Check) { + return tx.Check.Account; + } + return tx.Account; + }, +}; + +/* Export ==================================================================== */ +export default CheckCashInfo; diff --git a/src/common/libs/ledger/transactions/genuine/CheckCash/CheckCashValidation.ts b/src/common/libs/ledger/transactions/genuine/CheckCash/CheckCashValidation.ts new file mode 100644 index 000000000..5d6e843ef --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/CheckCash/CheckCashValidation.ts @@ -0,0 +1,61 @@ +import Localize from '@locale'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import CheckCash from './CheckCashClass'; + +/* Validator ==================================================================== */ +const CheckCashValidation = (tx: CheckCash): Promise => { + return new Promise((resolve, reject) => { + // check object should be assigned + if (!tx.Check) { + reject(new Error(Localize.t('payload.unableToGetCheckObject'))); + return; + } + // The user must enter an amount + if ( + (!tx.Amount || !tx.Amount?.value || tx.Amount?.value === '0') && + (!tx.DeliverMin || !tx.DeliverMin?.value || tx.DeliverMin?.value === '0') + ) { + reject(new Error(Localize.t('send.pleaseEnterAmount'))); + return; + } + + // check if the entered amount don't exceed the cash amount + if (tx.Amount && Number(tx.Amount.value) > Number(tx.Check.SendMax.value)) { + reject( + new Error( + Localize.t('payload.insufficientCashAmount', { + amount: tx.Check.SendMax.value, + currency: NormalizeCurrencyCode(tx.Check.SendMax.currency), + }), + ), + ); + return; + } + + // check for insufficient amount + if (tx.DeliverMin && Number(tx.DeliverMin.value) > Number(tx.Check.SendMax.value)) { + reject( + new Error( + Localize.t('payload.insufficientCashAmount', { + amount: tx.Check.SendMax.value, + currency: NormalizeCurrencyCode(tx.Check.SendMax.currency), + }), + ), + ); + return; + } + + // the signer should be the same as check destination + if (tx.Account.address !== tx.Check.Destination.address) { + reject(new Error(Localize.t('payload.checkCanOnlyCashByCheckDestination'))); + return; + } + + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default CheckCashValidation; diff --git a/src/common/libs/ledger/transactions/genuine/CheckCash/index.ts b/src/common/libs/ledger/transactions/genuine/CheckCash/index.ts new file mode 100644 index 000000000..a3040edf5 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/CheckCash/index.ts @@ -0,0 +1,3 @@ +export { default as CheckCash } from './CheckCashClass'; +export { default as CheckCashValidation } from './CheckCashValidation'; +export { default as CheckCashInfo } from './CheckCashInfo'; diff --git a/src/common/libs/ledger/transactions/checkCreate.ts b/src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateClass.ts similarity index 50% rename from src/common/libs/ledger/transactions/checkCreate.ts rename to src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateClass.ts index 7e5457c92..a1aa25dc5 100644 --- a/src/common/libs/ledger/transactions/checkCreate.ts +++ b/src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateClass.ts @@ -1,21 +1,16 @@ import { has, get, set, isUndefined, isNumber, toInteger } from 'lodash'; - import * as AccountLib from 'xrpl-accountlib'; -import { ErrorMessages } from '@common/constants'; -import { NormalizeCurrencyCode } from '@common/utils/amount'; - -import LedgerService from '@services/LedgerService'; +import NetworkService from '@services/NetworkService'; -import Localize from '@locale'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; -import BaseTransaction from './base'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; /* Types ==================================================================== */ -import { AmountType, Destination } from '../parser/types'; -import { TransactionJSONType, TransactionTypes } from '../types'; +import { AmountType, Destination } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class CheckCreate extends BaseTransaction { @@ -42,8 +37,8 @@ class CheckCreate extends BaseTransaction { if (typeof sendMax === 'string') { return { - currency: 'XRP', - value: new Amount(sendMax).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(sendMax).dropsToNative(), }; } @@ -59,9 +54,9 @@ class CheckCreate extends BaseTransaction { set(this, ['tx', 'SendMax'], undefined); return; } - // XRP + // native currency if (typeof input === 'string') { - set(this, ['tx', 'SendMax'], new Amount(input, false).xrpToDrops()); + set(this, ['tx', 'SendMax'], new Amount(input, false).nativeToDrops()); } if (typeof input === 'object') { @@ -88,7 +83,7 @@ class CheckCreate extends BaseTransaction { set Destination(destination: Destination) { if (has(destination, 'address')) { if (!AccountLib.utils.isValidAddress(destination.address)) { - throw new Error(`${destination.address} is not a valid XRP Address`); + throw new Error(`${destination.address} is not a valid Address`); } set(this, ['tx', 'Destination'], destination.address); } @@ -115,63 +110,6 @@ class CheckCreate extends BaseTransaction { get InvoiceID(): string { return get(this, ['tx', 'InvoiceID'], undefined); } - - validate = (): Promise => { - // eslint-disable-next-line no-async-promise-executor - return new Promise(async (resolve, reject) => { - try { - // check if check amount is set - if (!this.SendMax || !this.SendMax?.value || this.SendMax?.value === '0') { - reject(new Error(Localize.t('send.pleaseEnterAmount'))); - return; - } - - // check if the Check Amount is exceeding the balance - if (this.SendMax.currency === 'XRP') { - try { - // fetch fresh account balance from ledger - const availableBalance = await LedgerService.getAccountAvailableBalance(this.Account.address); - - if (Number(this.SendMax.value) > Number(availableBalance)) { - reject( - new Error( - Localize.t('send.insufficientBalanceSpendableBalance', { - spendable: Localize.formatNumber(availableBalance), - currency: 'XRP', - }), - ), - ); - return; - } - } catch { - reject(Localize.t('account.unableGetAccountInfo')); - return; - } - } else { - // get TrustLine from ledger - const line = await LedgerService.getFilteredAccountLine(this.Account.address, this.SendMax); - - // check if line exist - if (line && Number(this.SendMax.value) > Number(line.balance)) { - reject( - new Error( - Localize.t('send.insufficientBalanceSpendableBalance', { - spendable: Localize.formatNumber(Number(line.balance)), - currency: NormalizeCurrencyCode(line.currency), - }), - ), - ); - return; - } - } - - // everything seems fine, resolve - resolve(); - } catch { - reject(new Error(ErrorMessages.unexpectedValidationError)); - } - }); - }; } /* Export ==================================================================== */ diff --git a/src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateInfo.ts b/src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateInfo.ts new file mode 100644 index 000000000..b35dc8e66 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateInfo.ts @@ -0,0 +1,48 @@ +import { AccountModel } from '@store/models'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import Localize from '@locale'; + +import CheckCreate from './CheckCreateClass'; + +/* Descriptor ==================================================================== */ +const CheckCreateInfo = { + getLabel: (): string => { + return Localize.t('events.createCheck'); + }, + + getDescription: (tx: CheckCreate): string => { + let content = Localize.t('events.theCheckIsFromTo', { + address: tx.Account.address, + destination: tx.Destination.address, + }); + + if (tx.Account.tag) { + content += '\n'; + content += Localize.t('events.theCheckHasASourceTag', { tag: tx.Account.tag }); + } + if (tx.Destination.tag) { + content += '\n'; + content += Localize.t('events.theCheckHasADestinationTag', { tag: tx.Destination.tag }); + } + + content += '\n\n'; + content += Localize.t('events.maximumAmountCheckIsAllowToDebit', { + value: tx.SendMax.value, + currency: NormalizeCurrencyCode(tx.SendMax.currency), + }); + + return content; + }, + + getRecipient: (tx: CheckCreate, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account?.address !== account.address) { + return tx.Account; + } + return tx.Destination; + }, +}; + +/* Export ==================================================================== */ +export default CheckCreateInfo; diff --git a/src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateValidation.ts b/src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateValidation.ts new file mode 100644 index 000000000..39fa54686 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/CheckCreate/CheckCreateValidation.ts @@ -0,0 +1,71 @@ +import Localize from '@locale'; + +import { ErrorMessages } from '@common/constants'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import NetworkService from '@services/NetworkService'; +import LedgerService from '@services/LedgerService'; + +import CheckCreate from './CheckCreateClass'; + +/* Validator ==================================================================== */ +const CheckCreateValidation = (tx: CheckCreate): Promise => { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve, reject) => { + try { + // check if check amount is set + if (!tx.SendMax || !tx.SendMax?.value || tx.SendMax?.value === '0') { + reject(new Error(Localize.t('send.pleaseEnterAmount'))); + return; + } + + // check if the Check Amount is exceeding the balance + if (tx.SendMax.currency === NetworkService.getNativeAsset()) { + try { + // fetch fresh account balance from ledger + const availableBalance = await LedgerService.getAccountAvailableBalance(tx.Account.address); + + if (Number(tx.SendMax.value) > Number(availableBalance)) { + reject( + new Error( + Localize.t('send.insufficientBalanceSpendableBalance', { + spendable: Localize.formatNumber(availableBalance), + currency: NetworkService.getNativeAsset(), + }), + ), + ); + return; + } + } catch { + reject(Localize.t('account.unableGetAccountInfo')); + return; + } + } else { + // get TrustLine from ledger + const line = await LedgerService.getFilteredAccountLine(tx.Account.address, tx.SendMax); + + // check if line exist + if (line && Number(tx.SendMax.value) > Number(line.balance)) { + reject( + new Error( + Localize.t('send.insufficientBalanceSpendableBalance', { + spendable: Localize.formatNumber(Number(line.balance)), + currency: NormalizeCurrencyCode(line.currency), + }), + ), + ); + return; + } + } + + // everything seems fine, resolve + resolve(); + } catch { + reject(new Error(ErrorMessages.unexpectedValidationError)); + } + }); +}; + +/* Export ==================================================================== */ +export default CheckCreateValidation; diff --git a/src/common/libs/ledger/transactions/genuine/CheckCreate/index.ts b/src/common/libs/ledger/transactions/genuine/CheckCreate/index.ts new file mode 100644 index 000000000..e7fd0eee4 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/CheckCreate/index.ts @@ -0,0 +1,3 @@ +export { default as CheckCreate } from './CheckCreateClass'; +export { default as CheckCreateValidation } from './CheckCreateValidation'; +export { default as CheckCreateInfo } from './CheckCreateInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/ClaimReward/ClaimRewardClass.ts b/src/common/libs/ledger/transactions/genuine/ClaimReward/ClaimRewardClass.ts new file mode 100644 index 000000000..14d3b1fb5 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/ClaimReward/ClaimRewardClass.ts @@ -0,0 +1,46 @@ +import { get, isUndefined } from 'lodash'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; +import { ClaimRewardStatus } from '@common/libs/ledger/parser/types'; + +/* Class ==================================================================== */ +class ClaimReward extends BaseTransaction { + public static Type = TransactionTypes.ClaimReward as const; + public readonly Type = ClaimReward.Type; + + private cachedClaimStatus: ClaimRewardStatus | undefined; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = ClaimReward.Type; + } + + this.fields = this.fields.concat(['Issuer']); + } + + get Issuer(): string { + return get(this, ['tx', 'Issuer']); + } + + /** + * Returns the claim status for the reward. + * + * @returns {ClaimRewardStatus} The claim status for the reward. + */ + get ClaimStatus(): ClaimRewardStatus { + if (this.Flags?.OptOut) { + return ClaimRewardStatus.OptOut; + } + + return ClaimRewardStatus.OptIn; + } +} + +/* Export ==================================================================== */ +export default ClaimReward; diff --git a/src/common/libs/ledger/transactions/genuine/ClaimReward/ClaimRewardInfo.ts b/src/common/libs/ledger/transactions/genuine/ClaimReward/ClaimRewardInfo.ts new file mode 100644 index 000000000..fcd2c04cc --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/ClaimReward/ClaimRewardInfo.ts @@ -0,0 +1,41 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import ClaimReward from './ClaimRewardClass'; +import { ClaimRewardStatus } from '@common/libs/ledger/parser/types'; + +/* Descriptor ==================================================================== */ +const ClaimRewardInfo = { + getLabel: (tx: ClaimReward): string => { + switch (tx.ClaimStatus) { + case ClaimRewardStatus.OptIn: + return Localize.t('events.claimReward'); + case ClaimRewardStatus.OptOut: + return Localize.t('events.claimRewardOptOut'); + default: + return Localize.t('events.claimReward'); + } + }, + + getDescription: (tx: ClaimReward): string => { + let content = Localize.t('events.claimRewardExplain'); + + if (tx.ClaimStatus === ClaimRewardStatus.OptOut) { + content += '\n'; + content += Localize.t('events.claimRewardExplainOptOut', { address: tx.Account.address }); + } + + return content; + }, + + getRecipient: (tx: ClaimReward, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account?.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default ClaimRewardInfo; diff --git a/src/common/libs/ledger/transactions/genuine/ClaimReward/ClaimRewardValidation.ts b/src/common/libs/ledger/transactions/genuine/ClaimReward/ClaimRewardValidation.ts new file mode 100644 index 000000000..203600766 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/ClaimReward/ClaimRewardValidation.ts @@ -0,0 +1,12 @@ +// import ClaimReward from './ClaimRewardClass'; + +/* Validator ==================================================================== */ +const ClaimRewardValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default ClaimRewardValidation; diff --git a/src/common/libs/ledger/transactions/genuine/ClaimReward/index.ts b/src/common/libs/ledger/transactions/genuine/ClaimReward/index.ts new file mode 100644 index 000000000..571cf7d27 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/ClaimReward/index.ts @@ -0,0 +1,3 @@ +export { default as ClaimReward } from './ClaimRewardClass'; +export { default as ClaimRewardValidation } from './ClaimRewardValidation'; +export { default as ClaimRewardInfo } from './ClaimRewardInfo'; diff --git a/src/common/libs/ledger/transactions/depositPreauth.ts b/src/common/libs/ledger/transactions/genuine/DepositPreauth/DepositPreauthClass.ts similarity index 85% rename from src/common/libs/ledger/transactions/depositPreauth.ts rename to src/common/libs/ledger/transactions/genuine/DepositPreauth/DepositPreauthClass.ts index 041abec82..13069e0cc 100644 --- a/src/common/libs/ledger/transactions/depositPreauth.ts +++ b/src/common/libs/ledger/transactions/genuine/DepositPreauth/DepositPreauthClass.ts @@ -1,9 +1,9 @@ import { get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class DepositPreauth extends BaseTransaction { diff --git a/src/common/libs/ledger/transactions/genuine/DepositPreauth/DepositPreauthInfo.ts b/src/common/libs/ledger/transactions/genuine/DepositPreauth/DepositPreauthInfo.ts new file mode 100644 index 000000000..e517a8fdc --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/DepositPreauth/DepositPreauthInfo.ts @@ -0,0 +1,39 @@ +import Localize from '@locale'; + +import DepositPreauth from './DepositPreauthClass'; + +/* Descriptor ==================================================================== */ +const DepositPreauthInfo = { + getLabel: (tx: DepositPreauth): string => { + if (tx.Authorize) { + return Localize.t('events.authorizeDeposit'); + } + + if (tx.Unauthorize) { + return Localize.t('events.unauthorizeDeposit'); + } + + return tx.Type; + }, + + getDescription: (tx: DepositPreauth): string => { + if (tx.Authorize) { + return Localize.t('events.itAuthorizesSendingPaymentsToThisAccount', { address: tx.Authorize }); + } + + if (tx.Unauthorize) { + return Localize.t('events.itRemovesAuthorizesSendingPaymentsToThisAccount', { address: tx.Unauthorize }); + } + + return 'No description, "Authorize" and "Unauthorize" field has not been set.'; + }, + + getRecipient: (tx: DepositPreauth): { address: string; tag?: number } => { + return { + address: tx.Authorize || tx.Unauthorize, + }; + }, +}; + +/* Export ==================================================================== */ +export default DepositPreauthInfo; diff --git a/src/common/libs/ledger/transactions/genuine/DepositPreauth/DepositPreauthValidation.ts b/src/common/libs/ledger/transactions/genuine/DepositPreauth/DepositPreauthValidation.ts new file mode 100644 index 000000000..9bb7ed406 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/DepositPreauth/DepositPreauthValidation.ts @@ -0,0 +1,12 @@ +// import DepositPreauth from './DepositPreauthClass'; + +/* Validator ==================================================================== */ +const DepositPreauthValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default DepositPreauthValidation; diff --git a/src/common/libs/ledger/transactions/genuine/DepositPreauth/index.ts b/src/common/libs/ledger/transactions/genuine/DepositPreauth/index.ts new file mode 100644 index 000000000..ccc459027 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/DepositPreauth/index.ts @@ -0,0 +1,3 @@ +export { default as DepositPreauth } from './DepositPreauthClass'; +export { default as DepositPreauthValidation } from './DepositPreauthValidation'; +export { default as DepositPreauthInfo } from './DepositPreauthInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/EnableAmendment/EnableAmendmentClass.ts b/src/common/libs/ledger/transactions/genuine/EnableAmendment/EnableAmendmentClass.ts new file mode 100644 index 000000000..73ec8afc3 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EnableAmendment/EnableAmendmentClass.ts @@ -0,0 +1,30 @@ +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; +import { get } from 'lodash'; + +/* Class ==================================================================== */ +class EnableAmendment extends BaseTransaction { + public static Type = TransactionTypes.EnableAmendment as const; + public readonly Type = EnableAmendment.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + this.fields = this.fields.concat(['Amendment']); + } + + get Amendment(): string { + const amendment = get(this, ['tx', 'Amendment'], undefined); + + if (typeof amendment === 'undefined') { + return undefined; + } + + return amendment; + } +} + +/* Export ==================================================================== */ +export default EnableAmendment; diff --git a/src/common/libs/ledger/transactions/genuine/EnableAmendment/EnableAmendmentInfo.ts b/src/common/libs/ledger/transactions/genuine/EnableAmendment/EnableAmendmentInfo.ts new file mode 100644 index 000000000..14b1ed39f --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EnableAmendment/EnableAmendmentInfo.ts @@ -0,0 +1,27 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import EnableAmendment from './EnableAmendmentClass'; + +/* Descriptor ==================================================================== */ +const EnableAmendmentInfo = { + getLabel: (): string => { + return Localize.t('events.enableAmendment'); + }, + + getDescription: (tx: EnableAmendment): string => { + // TODO: add more description + return `This is an ${tx.Type} transaction`; + }, + + getRecipient: (tx: EnableAmendment, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default EnableAmendmentInfo; diff --git a/src/common/libs/ledger/transactions/genuine/EnableAmendment/EnableAmendmentValidation.ts b/src/common/libs/ledger/transactions/genuine/EnableAmendment/EnableAmendmentValidation.ts new file mode 100644 index 000000000..b8fa566c4 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EnableAmendment/EnableAmendmentValidation.ts @@ -0,0 +1,12 @@ +// import EnableAmendment from './EnableAmendmentClass'; + +/* Validator ==================================================================== */ +const EnableAmendmentValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default EnableAmendmentValidation; diff --git a/src/common/libs/ledger/transactions/genuine/EnableAmendment/index.ts b/src/common/libs/ledger/transactions/genuine/EnableAmendment/index.ts new file mode 100644 index 000000000..21619ba27 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EnableAmendment/index.ts @@ -0,0 +1,3 @@ +export { default as EnableAmendment } from './EnableAmendmentClass'; +export { default as EnableAmendmentValidation } from './EnableAmendmentValidation'; +export { default as EnableAmendmentInfo } from './EnableAmendmentInfo'; diff --git a/src/common/libs/ledger/transactions/escrowCancel.ts b/src/common/libs/ledger/transactions/genuine/EscrowCancel/EscrowCancelClass.ts similarity index 72% rename from src/common/libs/ledger/transactions/escrowCancel.ts rename to src/common/libs/ledger/transactions/genuine/EscrowCancel/EscrowCancelClass.ts index 1c2746a28..04b9e9ade 100644 --- a/src/common/libs/ledger/transactions/escrowCancel.ts +++ b/src/common/libs/ledger/transactions/genuine/EscrowCancel/EscrowCancelClass.ts @@ -1,9 +1,9 @@ -import { get, set, isUndefined } from 'lodash'; +import { set, get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class EscrowCancel extends BaseTransaction { @@ -18,7 +18,7 @@ class EscrowCancel extends BaseTransaction { this.TransactionType = EscrowCancel.Type; } - this.fields = this.fields.concat(['OfferSequence', 'Owner']); + this.fields = this.fields.concat(['OfferSequence', 'Owner', 'EscrowID']); } set Owner(owner: string) { @@ -36,6 +36,14 @@ class EscrowCancel extends BaseTransaction { get OfferSequence(): number { return get(this, ['tx', 'OfferSequence'], undefined); } + + set EscrowID(escrowID: string) { + set(this, ['tx', 'EscrowID'], escrowID); + } + + get EscrowID(): number { + return get(this, ['tx', 'EscrowID'], undefined); + } } /* Export ==================================================================== */ diff --git a/src/common/libs/ledger/transactions/genuine/EscrowCancel/EscrowCancelInfo.ts b/src/common/libs/ledger/transactions/genuine/EscrowCancel/EscrowCancelInfo.ts new file mode 100644 index 000000000..e9671a8da --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EscrowCancel/EscrowCancelInfo.ts @@ -0,0 +1,37 @@ +import { isUndefined } from 'lodash'; + +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import EscrowCancel from './EscrowCancelClass'; +import EscrowCreate from '../EscrowCreate/EscrowCreateClass'; + +/* Descriptor ==================================================================== */ +const EscrowCancelInfo = { + getLabel: (): string => { + return Localize.t('events.cancelEscrow'); + }, + + getDescription: (tx: EscrowCancel): string => { + // TODO: add more description + let content = `This is an ${tx.Type} transaction`; + + if (!isUndefined(tx.EscrowID)) { + content += '\n'; + content += Localize.t('events.theTransactionHasAEscrowId', { escrowId: tx.EscrowID }); + } + + return content; + }, + + getRecipient: (tx: EscrowCreate, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account?.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default EscrowCancelInfo; diff --git a/src/common/libs/ledger/transactions/genuine/EscrowCancel/EscrowCancelValidation.ts b/src/common/libs/ledger/transactions/genuine/EscrowCancel/EscrowCancelValidation.ts new file mode 100644 index 000000000..684d60925 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EscrowCancel/EscrowCancelValidation.ts @@ -0,0 +1,12 @@ +// import EscrowCancel from './EscrowCancelClass'; + +/* Validator ==================================================================== */ +const EscrowCancelValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default EscrowCancelValidation; diff --git a/src/common/libs/ledger/transactions/genuine/EscrowCancel/index.ts b/src/common/libs/ledger/transactions/genuine/EscrowCancel/index.ts new file mode 100644 index 000000000..33f28161e --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EscrowCancel/index.ts @@ -0,0 +1,3 @@ +export { default as EscrowCancel } from './EscrowCancelClass'; +export { default as EscrowCancelValidation } from './EscrowCancelValidation'; +export { default as EscrowCancelInfo } from './EscrowCancelInfo'; diff --git a/src/common/libs/ledger/transactions/escrowCreate.ts b/src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateClass.ts similarity index 78% rename from src/common/libs/ledger/transactions/escrowCreate.ts rename to src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateClass.ts index 07421b52d..e4640cec4 100644 --- a/src/common/libs/ledger/transactions/escrowCreate.ts +++ b/src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateClass.ts @@ -1,14 +1,16 @@ import { has, get, set, isUndefined, isNumber, toInteger } from 'lodash'; - import * as AccountLib from 'xrpl-accountlib'; -import BaseTransaction from './base'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { AmountType, Destination } from '../parser/types'; -import { TransactionJSONType, TransactionTypes } from '../types'; +import { AmountType, Destination } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class EscrowCreate extends BaseTransaction { @@ -38,9 +40,17 @@ class EscrowCreate extends BaseTransaction { if (isUndefined(amount)) return undefined; + if (typeof amount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), + }; + } + return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), + currency: amount.currency, + value: amount.value, + issuer: amount.issuer, }; } @@ -59,7 +69,7 @@ class EscrowCreate extends BaseTransaction { set Destination(destination: Destination) { if (has(destination, 'address')) { if (!AccountLib.utils.isValidAddress(destination.address)) { - throw new Error(`${destination.address} is not a valid XRP Address`); + throw new Error(`${destination.address} is not a valid Address`); } set(this, 'tx.Destination', destination.address); } diff --git a/src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateInfo.ts b/src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateInfo.ts new file mode 100644 index 000000000..a4cbdf1e6 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateInfo.ts @@ -0,0 +1,52 @@ +import moment from 'moment-timezone'; +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import EscrowCreate from './EscrowCreateClass'; + +/* Descriptor ==================================================================== */ +const EscrowCreateInfo = { + getLabel: (): string => { + return Localize.t('events.createEscrow'); + }, + + getDescription: (tx: EscrowCreate): string => { + let content = Localize.t('events.theEscrowIsFromTo', { + account: tx.Account.address, + destination: tx.Destination.address, + }); + if (tx.Destination.tag) { + content += '\n'; + content += Localize.t('events.theEscrowHasADestinationTag', { tag: tx.Destination.tag }); + content += ' '; + } + content += '\n'; + content += Localize.t('events.itEscrowedWithCurrency', { + amount: tx.Amount.value, + currency: tx.Amount.currency, + }); + + if (tx.CancelAfter) { + content += '\n'; + content += Localize.t('events.itCanBeCanceledAfter', { date: moment(tx.CancelAfter).format('LLLL') }); + } + + if (tx.FinishAfter) { + content += '\n'; + content += Localize.t('events.itCanBeFinishedAfter', { date: moment(tx.FinishAfter).format('LLLL') }); + } + + return content; + }, + + getRecipient: (tx: EscrowCreate, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account?.address !== account.address) { + return tx.Account; + } + return tx.Destination; + }, +}; + +/* Export ==================================================================== */ +export default EscrowCreateInfo; diff --git a/src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateValidation.ts b/src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateValidation.ts new file mode 100644 index 000000000..2629849e5 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EscrowCreate/EscrowCreateValidation.ts @@ -0,0 +1,12 @@ +// import EscrowCreate from './EscrowCreateClass'; + +/* Validator ==================================================================== */ +const EscrowCreateValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default EscrowCreateValidation; diff --git a/src/common/libs/ledger/transactions/genuine/EscrowCreate/index.ts b/src/common/libs/ledger/transactions/genuine/EscrowCreate/index.ts new file mode 100644 index 000000000..782a18480 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EscrowCreate/index.ts @@ -0,0 +1,3 @@ +export { default as EscrowCreate } from './EscrowCreateClass'; +export { default as EscrowCreateValidation } from './EscrowCreateValidation'; +export { default as EscrowCreateInfo } from './EscrowCreateInfo'; diff --git a/src/common/libs/ledger/transactions/escrowFinish.ts b/src/common/libs/ledger/transactions/genuine/EscrowFinish/EscrowFinishClass.ts similarity index 55% rename from src/common/libs/ledger/transactions/escrowFinish.ts rename to src/common/libs/ledger/transactions/genuine/EscrowFinish/EscrowFinishClass.ts index c2ee853b8..d08547a5f 100644 --- a/src/common/libs/ledger/transactions/escrowFinish.ts +++ b/src/common/libs/ledger/transactions/genuine/EscrowFinish/EscrowFinishClass.ts @@ -1,11 +1,14 @@ -import { get, set, isUndefined, findKey } from 'lodash'; +import { find, get, set, isUndefined } from 'lodash'; -import BaseTransaction from './base'; -import Amount from '../parser/common/amount'; +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; -import { Destination, AmountType } from '../parser/types'; +import { AmountType, Destination } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class EscrowFinish extends BaseTransaction { @@ -20,39 +23,41 @@ class EscrowFinish extends BaseTransaction { this.TransactionType = EscrowFinish.Type; } - this.fields = this.fields.concat(['Owner', 'OfferSequence', 'Condition', 'Fulfillment']); + this.fields = this.fields.concat(['Owner', 'OfferSequence', 'Condition', 'Fulfillment', 'EscrowID']); } get Amount(): AmountType { const affectedNodes = get(this, ['meta', 'AffectedNodes'], []); - const finalFields = get( - affectedNodes, - `${findKey(affectedNodes, 'DeletedNode')}.DeletedNode.FinalFields`, - undefined, - ); + const node = find(affectedNodes, (o) => o?.DeletedNode?.LedgerEntryType === 'Escrow'); + const object = get(node, 'DeletedNode.FinalFields'); + + if (isUndefined(object)) return undefined; - if (isUndefined(finalFields)) return undefined; + if (typeof object.Amount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(object.Amount).dropsToNative(), + }; + } return { - currency: 'XRP', - value: new Amount(finalFields.Amount).dropsToXrp(), + currency: object.Amount.currency, + value: object.Amount.value, + issuer: object.Amount.issuer, }; } get Destination(): Destination { const affectedNodes = get(this, ['meta', 'AffectedNodes'], []); - const finalFields = get( - affectedNodes, - `${findKey(affectedNodes, 'DeletedNode')}.DeletedNode.FinalFields`, - undefined, - ); + const node = find(affectedNodes, (o) => o?.DeletedNode?.LedgerEntryType === 'Escrow'); + const object = get(node, 'DeletedNode.FinalFields'); - if (!isUndefined(finalFields)) { + if (!isUndefined(object)) { return { - address: finalFields.Destination, - tag: finalFields.DestinationTag, + address: object.Destination, + tag: object.DestinationTag, }; } @@ -93,6 +98,14 @@ class EscrowFinish extends BaseTransaction { get OfferSequence(): number { return get(this, ['tx', 'OfferSequence']); } + + set EscrowID(escrowID: string) { + set(this, ['tx', 'EscrowID'], escrowID); + } + + get EscrowID(): number { + return get(this, ['tx', 'EscrowID'], undefined); + } } /* Export ==================================================================== */ diff --git a/src/common/libs/ledger/transactions/genuine/EscrowFinish/EscrowFinishInfo.ts b/src/common/libs/ledger/transactions/genuine/EscrowFinish/EscrowFinishInfo.ts new file mode 100644 index 000000000..215ff9d76 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EscrowFinish/EscrowFinishInfo.ts @@ -0,0 +1,49 @@ +import { isUndefined } from 'lodash'; +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import EscrowFinish from './EscrowFinishClass'; + +/* Descriptor ==================================================================== */ +const EscrowFinishInfo = { + getLabel: (): string => { + return Localize.t('events.finishEscrow'); + }, + + getDescription: (tx: EscrowFinish): string => { + let content = Localize.t('events.escrowFinishExplain', { + address: tx.Account.address, + amount: tx.Amount.value, + currency: tx.Amount.currency, + destination: tx.Destination.address, + }); + + if (!isUndefined(tx.Destination.tag)) { + content += '\n'; + content += Localize.t('events.theEscrowHasADestinationTag', { tag: tx.Destination.tag }); + } + + if (!isUndefined(tx.EscrowID)) { + content += '\n'; + content += Localize.t('events.theTransactionHasAEscrowId', { escrowId: tx.EscrowID }); + } + + content += '\n'; + content += Localize.t('events.theEscrowWasCreatedBy', { owner: tx.Owner }); + + return content; + }, + + getRecipient: (tx: EscrowFinish, account: AccountModel): { address: string; tag?: number } => { + if (tx.Owner === account.address) { + return tx.Destination; + } + return { + address: tx.Owner, + }; + }, +}; + +/* Export ==================================================================== */ +export default EscrowFinishInfo; diff --git a/src/common/libs/ledger/transactions/genuine/EscrowFinish/EscrowFinishValidation.ts b/src/common/libs/ledger/transactions/genuine/EscrowFinish/EscrowFinishValidation.ts new file mode 100644 index 000000000..42c69681c --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EscrowFinish/EscrowFinishValidation.ts @@ -0,0 +1,12 @@ +// import EscrowFinish from './EscrowFinishClass'; + +/* Validator ==================================================================== */ +const EscrowFinishValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default EscrowFinishValidation; diff --git a/src/common/libs/ledger/transactions/genuine/EscrowFinish/index.ts b/src/common/libs/ledger/transactions/genuine/EscrowFinish/index.ts new file mode 100644 index 000000000..d88987c38 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/EscrowFinish/index.ts @@ -0,0 +1,3 @@ +export { default as EscrowFinish } from './EscrowFinishClass'; +export { default as EscrowFinishValidation } from './EscrowFinishValidation'; +export { default as EscrowFinishInfo } from './EscrowFinishInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/GenesisMint/GenesisMintClass.ts b/src/common/libs/ledger/transactions/genuine/GenesisMint/GenesisMintClass.ts new file mode 100644 index 000000000..ad00ed7b3 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/GenesisMint/GenesisMintClass.ts @@ -0,0 +1,35 @@ +import { get } from 'lodash'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; +/* Types ==================================================================== */ +import { TransactionTypes, TransactionJSONType } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class GenesisMint extends BaseTransaction { + public static Type = TransactionTypes.GenesisMint as const; + public readonly Type = GenesisMint.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + this.fields = this.fields.concat(['GenesisMints']); + } + + get GenesisMints() { + const genesisMints = get(this, ['tx', 'GenesisMints'], undefined); + + if (!genesisMints || (Array.isArray(genesisMints) && genesisMints.length === 0)) { + return undefined; + } + + return genesisMints; + } + + // eslint-disable-next-line class-methods-use-this + set GenesisMints(_genesisMints: any) { + throw new Error('Settings GenesisMints is not allowed!'); + } +} + +/* Export ==================================================================== */ +export default GenesisMint; diff --git a/src/common/libs/ledger/transactions/genuine/GenesisMint/GenesisMintInfo.ts b/src/common/libs/ledger/transactions/genuine/GenesisMint/GenesisMintInfo.ts new file mode 100644 index 000000000..7f471f42d --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/GenesisMint/GenesisMintInfo.ts @@ -0,0 +1,27 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import GenesisMint from './GenesisMintClass'; + +/* Descriptor ==================================================================== */ +const GenesisMintInfo = { + getLabel: (): string => { + return Localize.t('events.genesisMint'); + }, + + getDescription: (tx: GenesisMint): string => { + // TODO: add more description + return `This is an ${tx.Type} transaction`; + }, + + getRecipient: (tx: GenesisMint, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default GenesisMintInfo; diff --git a/src/common/libs/ledger/transactions/genuine/GenesisMint/GenesisMintValidation.ts b/src/common/libs/ledger/transactions/genuine/GenesisMint/GenesisMintValidation.ts new file mode 100644 index 000000000..bd796fd43 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/GenesisMint/GenesisMintValidation.ts @@ -0,0 +1,12 @@ +// import GenesisMint from './GenesisMintClass'; + +/* Validator ==================================================================== */ +const GenesisMintValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default GenesisMintValidation; diff --git a/src/common/libs/ledger/transactions/genuine/GenesisMint/index.ts b/src/common/libs/ledger/transactions/genuine/GenesisMint/index.ts new file mode 100644 index 000000000..8e40a8cf2 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/GenesisMint/index.ts @@ -0,0 +1,3 @@ +export { default as GenesisMint } from './GenesisMintClass'; +export { default as GenesisMintValidation } from './GenesisMintValidation'; +export { default as GenesisMintInfo } from './GenesisMintInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/Import/ImportClass.ts b/src/common/libs/ledger/transactions/genuine/Import/ImportClass.ts new file mode 100644 index 000000000..be3ed8abb --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Import/ImportClass.ts @@ -0,0 +1,34 @@ +import { get, isUndefined } from 'lodash'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class Import extends BaseTransaction { + public static Type = TransactionTypes.Import as const; + public readonly Type = Import.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = Import.Type; + } + + this.fields = this.fields.concat(['Blob', 'Issuer']); + } + + get Blob(): string { + return get(this, ['tx', 'Blob']); + } + + get Issuer(): string { + return get(this, ['tx', 'Issuer']); + } +} + +/* Export ==================================================================== */ +export default Import; diff --git a/src/common/libs/ledger/transactions/genuine/Import/ImportInfo.ts b/src/common/libs/ledger/transactions/genuine/Import/ImportInfo.ts new file mode 100644 index 000000000..c72bc132a --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Import/ImportInfo.ts @@ -0,0 +1,36 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import Import from './ImportClass'; +import { isUndefined } from 'lodash'; + +/* Descriptor ==================================================================== */ +const ImportInfo = { + getLabel: (): string => { + return Localize.t('events.import'); + }, + + getDescription: (tx: Import): string => { + const { Issuer } = tx; + let content = Localize.t('events.importTransactionExplain'); + + if (!isUndefined(Issuer)) { + content += '\n'; + content += Localize.t('events.theIssuerIs', { issuer: Issuer }); + } + + return content; + }, + + getRecipient: (tx: Import, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default ImportInfo; diff --git a/src/common/libs/ledger/transactions/genuine/Import/ImportValidation.ts b/src/common/libs/ledger/transactions/genuine/Import/ImportValidation.ts new file mode 100644 index 000000000..6b7abb93e --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Import/ImportValidation.ts @@ -0,0 +1,12 @@ +// import Import from './ImportClass'; + +/* Validator ==================================================================== */ +const ImportValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default ImportValidation; diff --git a/src/common/libs/ledger/transactions/genuine/Import/index.ts b/src/common/libs/ledger/transactions/genuine/Import/index.ts new file mode 100644 index 000000000..39b24bf85 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Import/index.ts @@ -0,0 +1,3 @@ +export { default as Import } from './ImportClass'; +export { default as ImportValidation } from './ImportValidation'; +export { default as ImportInfo } from './ImportInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/Invoke/InvokeClass.ts b/src/common/libs/ledger/transactions/genuine/Invoke/InvokeClass.ts new file mode 100644 index 000000000..6dcbfce69 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Invoke/InvokeClass.ts @@ -0,0 +1,47 @@ +import { get, isUndefined } from 'lodash'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { Destination } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class Invoke extends BaseTransaction { + public static Type = TransactionTypes.Invoke as const; + public readonly Type = Invoke.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = Invoke.Type; + } + + this.fields = this.fields.concat(['Blob', 'Destination', 'InvoiceID', 'DestinationTag']); + } + + get Destination(): Destination { + const destination = get(this, ['tx', 'Destination'], undefined); + const destinationTag = get(this, ['tx', 'DestinationTag'], undefined); + + if (isUndefined(destination)) return undefined; + + return { + address: destination, + tag: destinationTag, + }; + } + + get Blob(): string { + return get(this, ['tx', 'Blob']); + } + + get InvoiceID(): string { + return get(this, ['tx', 'InvoiceID']); + } +} + +/* Export ==================================================================== */ +export default Invoke; diff --git a/src/common/libs/ledger/transactions/genuine/Invoke/InvokeInfo.ts b/src/common/libs/ledger/transactions/genuine/Invoke/InvokeInfo.ts new file mode 100644 index 000000000..5dd365946 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Invoke/InvokeInfo.ts @@ -0,0 +1,55 @@ +import { AccountModel } from '@store/models'; +import Localize from '@locale'; + +import Invoke from './InvokeClass'; +import { isUndefined } from 'lodash'; + +/* Descriptor ==================================================================== */ +const InvokeInfo = { + getLabel: (): string => { + return Localize.t('events.invoke'); + }, + + getDescription: (tx: Invoke): string => { + const { Account, Destination, InvoiceID } = tx; + + let content = Localize.t('events.invokeInitiatorExplain', { + address: Account.address, + }); + + if (!isUndefined(Destination)) { + content += '\n'; + content += Localize.t('events.theTransactionHasADestination', { + destination: Destination.address, + }); + } + + if (!isUndefined(Destination?.tag)) { + content += '\n'; + content += Localize.t('events.theTransactionHasADestinationTag', { + tag: Destination.tag, + }); + } + + if (!isUndefined(InvoiceID)) { + content += '\n'; + content += Localize.t('events.theTransactionHasAInvoiceId', { + invoiceId: InvoiceID, + }); + } + + return content; + }, + + getRecipient: (tx: Invoke, account: AccountModel): { address: string; tag?: number } => { + const { Account, Destination } = tx; + if (Account.address !== account.address) { + return Account; + } + + return Destination; + }, +}; + +/* Export ==================================================================== */ +export default InvokeInfo; diff --git a/src/common/libs/ledger/transactions/genuine/Invoke/InvokeValidation.ts b/src/common/libs/ledger/transactions/genuine/Invoke/InvokeValidation.ts new file mode 100644 index 000000000..c480aa0a1 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Invoke/InvokeValidation.ts @@ -0,0 +1,12 @@ +// import Invoke from './InvokeClass'; + +/* Validator ==================================================================== */ +const InvokeValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default InvokeValidation; diff --git a/src/common/libs/ledger/transactions/genuine/Invoke/index.ts b/src/common/libs/ledger/transactions/genuine/Invoke/index.ts new file mode 100644 index 000000000..0b059ab5c --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Invoke/index.ts @@ -0,0 +1,3 @@ +export { default as Invoke } from './InvokeClass'; +export { default as InvokeValidation } from './InvokeValidation'; +export { default as InvokeInfo } from './InvokeInfo'; diff --git a/src/common/libs/ledger/transactions/nfTokenAcceptOffer.ts b/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/NFTokenAcceptOfferClass.ts similarity index 77% rename from src/common/libs/ledger/transactions/nfTokenAcceptOffer.ts rename to src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/NFTokenAcceptOfferClass.ts index db118d699..c39f2d6a1 100644 --- a/src/common/libs/ledger/transactions/nfTokenAcceptOffer.ts +++ b/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/NFTokenAcceptOfferClass.ts @@ -1,14 +1,15 @@ -import { set, get, find, isUndefined } from 'lodash'; +import { set, find, get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; +import NetworkService from '@services/NetworkService'; -import Amount from '../parser/common/amount'; +import Amount from '@common/libs/ledger/parser/common/amount'; -import NFTokenCreateOffer from './nfTokenCreateOffer'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; +import { NFTokenCreateOffer } from '@common/libs/ledger/transactions/genuine/NFTokenCreateOffer'; /* Types ==================================================================== */ -import { AmountType } from '../parser/types'; -import { TransactionJSONType, TransactionTypes } from '../types'; +import { AmountType } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class NFTokenAcceptOffer extends BaseTransaction { @@ -68,8 +69,8 @@ class NFTokenAcceptOffer extends BaseTransaction { if (typeof brokerFee === 'string') { return { - currency: 'XRP', - value: new Amount(brokerFee).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(brokerFee).dropsToNative(), }; } diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/NFTokenAcceptOfferInfo.ts b/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/NFTokenAcceptOfferInfo.ts new file mode 100644 index 000000000..ec92d27ba --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/NFTokenAcceptOfferInfo.ts @@ -0,0 +1,67 @@ +import { AccountModel } from '@store/models'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import Localize from '@locale'; + +import NFTokenAcceptOffer from './NFTokenAcceptOfferClass'; + +/* Descriptor ==================================================================== */ +const NFTokenAcceptOfferInfo = { + getLabel: (): string => { + return Localize.t('events.acceptNFTOffer'); + }, + + getDescription: (tx: NFTokenAcceptOffer): string => { + const offerID = tx.NFTokenBuyOffer || tx.NFTokenSellOffer; + + // this should never happen + // but as we are in beta we should check + if (!tx.Offer) { + return 'Unable to fetch the offer for this transaction!'; + } + + let content = ''; + + if (tx.Offer.Flags.SellToken) { + content += Localize.t('events.nftAcceptOfferBuyExplanation', { + address: tx.Account.address, + offerID, + tokenID: tx.Offer.NFTokenID, + amount: tx.Offer.Amount.value, + currency: NormalizeCurrencyCode(tx.Offer.Amount.currency), + }); + } else { + content += Localize.t('events.nftAcceptOfferSellExplanation', { + address: tx.Account.address, + offerID, + tokenID: tx.Offer.NFTokenID, + amount: tx.Offer.Amount.value, + currency: NormalizeCurrencyCode(tx.Offer.Amount.currency), + }); + } + + if (tx.NFTokenBrokerFee) { + content += '\n'; + content += Localize.t('events.nftAcceptOfferBrokerFee', { + brokerFee: tx.NFTokenBrokerFee.value, + currency: NormalizeCurrencyCode(tx.NFTokenBrokerFee.currency), + }); + } + + return content; + }, + + getRecipient: (tx: NFTokenAcceptOffer, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + if (tx.Offer) { + return { address: tx.Offer.Owner }; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default NFTokenAcceptOfferInfo; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/NFTokenAcceptOfferValidation.ts b/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/NFTokenAcceptOfferValidation.ts new file mode 100644 index 000000000..e90d45e5f --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/NFTokenAcceptOfferValidation.ts @@ -0,0 +1,12 @@ +// import NFTokenAcceptOffer from './NFTokenAcceptOfferClass'; + +/* Validator ==================================================================== */ +const NFTokenAcceptOfferValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default NFTokenAcceptOfferValidation; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/index.ts b/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/index.ts new file mode 100644 index 000000000..6f1a541d6 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenAcceptOffer/index.ts @@ -0,0 +1,3 @@ +export { default as NFTokenAcceptOffer } from './NFTokenAcceptOfferClass'; +export { default as NFTokenAcceptOfferValidation } from './NFTokenAcceptOfferValidation'; +export { default as NFTokenAcceptOfferInfo } from './NFTokenAcceptOfferInfo'; diff --git a/src/common/libs/ledger/transactions/nfTokenBurn.ts b/src/common/libs/ledger/transactions/genuine/NFTokenBurn/NFTokenBurnClass.ts similarity index 84% rename from src/common/libs/ledger/transactions/nfTokenBurn.ts rename to src/common/libs/ledger/transactions/genuine/NFTokenBurn/NFTokenBurnClass.ts index 1c625a436..b4bfb9d2a 100644 --- a/src/common/libs/ledger/transactions/nfTokenBurn.ts +++ b/src/common/libs/ledger/transactions/genuine/NFTokenBurn/NFTokenBurnClass.ts @@ -1,9 +1,9 @@ import { get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class NFTokenBurn extends BaseTransaction { diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenBurn/NFTokenBurnInfo.ts b/src/common/libs/ledger/transactions/genuine/NFTokenBurn/NFTokenBurnInfo.ts new file mode 100644 index 000000000..f76bb5ab6 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenBurn/NFTokenBurnInfo.ts @@ -0,0 +1,27 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import NFTokenBurn from './NFTokenBurnClass'; + +/* Descriptor ==================================================================== */ +const NFTokenBurnInfo = { + getLabel: (): string => { + return Localize.t('events.burnNFT'); + }, + + getDescription: (tx: NFTokenBurn): string => { + return Localize.t('events.nfTokenBurnExplain', { tokenID: tx.NFTokenID }); + }, + + getRecipient: (tx: NFTokenBurn, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default NFTokenBurnInfo; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenBurn/NFTokenBurnValidation.ts b/src/common/libs/ledger/transactions/genuine/NFTokenBurn/NFTokenBurnValidation.ts new file mode 100644 index 000000000..f11b40faf --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenBurn/NFTokenBurnValidation.ts @@ -0,0 +1,12 @@ +// import NFTokenBurn from './NFTokenBurnClass'; + +/* Validator ==================================================================== */ +const NFTokenBurnValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default NFTokenBurnValidation; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenBurn/index.ts b/src/common/libs/ledger/transactions/genuine/NFTokenBurn/index.ts new file mode 100644 index 000000000..2e8bba8b1 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenBurn/index.ts @@ -0,0 +1,3 @@ +export { default as NFTokenBurn } from './NFTokenBurnClass'; +export { default as NFTokenBurnValidation } from './NFTokenBurnValidation'; +export { default as NFTokenBurnInfo } from './NFTokenBurnInfo'; diff --git a/src/common/libs/ledger/transactions/nfTokenCancelOffer.ts b/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/NFTokenCancelOfferClass.ts similarity index 78% rename from src/common/libs/ledger/transactions/nfTokenCancelOffer.ts rename to src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/NFTokenCancelOfferClass.ts index dfd766a5f..ff1a9ea01 100644 --- a/src/common/libs/ledger/transactions/nfTokenCancelOffer.ts +++ b/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/NFTokenCancelOfferClass.ts @@ -1,10 +1,11 @@ import { get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; +/* Class ==================================================================== */ /* Class ==================================================================== */ class NFTokenCancelOffer extends BaseTransaction { public static Type = TransactionTypes.NFTokenCancelOffer as const; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/NFTokenCancelOfferInfo.ts b/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/NFTokenCancelOfferInfo.ts new file mode 100644 index 000000000..f290af4f3 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/NFTokenCancelOfferInfo.ts @@ -0,0 +1,36 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import NFTokenCancelOffer from './NFTokenCancelOfferClass'; + +/* Descriptor ==================================================================== */ +const NFTokenCancelOfferInfo = { + getLabel: (): string => { + return Localize.t('events.cancelNFTOffer'); + }, + + getDescription: (tx: NFTokenCancelOffer): string => { + let content = ''; + + content += Localize.t('events.theTransactionWillCancelNftOffer', { address: tx.Account.address }); + content += '\n'; + + tx.NFTokenOffers?.forEach((id: string) => { + content += `${id}\n`; + }); + + return content; + }, + + getRecipient: (tx: NFTokenCancelOffer, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default NFTokenCancelOfferInfo; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/NFTokenCancelOfferValidation.ts b/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/NFTokenCancelOfferValidation.ts new file mode 100644 index 000000000..fcec2ca84 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/NFTokenCancelOfferValidation.ts @@ -0,0 +1,12 @@ +// import NFTokenCancelOffer from './NFTokenCancelOfferClass'; + +/* Validator ==================================================================== */ +const NFTokenCancelOfferValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default NFTokenCancelOfferValidation; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/index.ts b/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/index.ts new file mode 100644 index 000000000..b0e98eaef --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenCancelOffer/index.ts @@ -0,0 +1,3 @@ +export { default as NFTokenCancelOffer } from './NFTokenCancelOfferClass'; +export { default as NFTokenCancelOfferValidation } from './NFTokenCancelOfferValidation'; +export { default as NFTokenCancelOfferInfo } from './NFTokenCancelOfferInfo'; diff --git a/src/common/libs/ledger/transactions/nfTokenCreateOffer.ts b/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferClass.ts similarity index 77% rename from src/common/libs/ledger/transactions/nfTokenCreateOffer.ts rename to src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferClass.ts index 6b3cc56fe..502bc9e4b 100644 --- a/src/common/libs/ledger/transactions/nfTokenCreateOffer.ts +++ b/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferClass.ts @@ -1,13 +1,15 @@ import { get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; +import NetworkService from '@services/NetworkService'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { Destination, AmountType } from '../parser/types'; -import { TransactionJSONType, TransactionTypes } from '../types'; +import { Destination, AmountType } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class NFTokenCreateOffer extends BaseTransaction { @@ -35,8 +37,8 @@ class NFTokenCreateOffer extends BaseTransaction { if (typeof amount === 'string') { return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), }; } diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferInfo.ts b/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferInfo.ts new file mode 100644 index 000000000..04f0b3cf3 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferInfo.ts @@ -0,0 +1,66 @@ +import moment from 'moment-timezone'; + +import { AccountModel } from '@store/models'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import Localize from '@locale'; + +import NFTokenCreateOffer from './NFTokenCreateOfferClass'; + +/* Descriptor ==================================================================== */ +const NFTokenCreateOfferInfo = { + getLabel: (): string => { + return Localize.t('events.createNFTOffer'); + }, + + getDescription: (tx: NFTokenCreateOffer): string => { + let content = ''; + + if (tx.Flags.SellToken) { + content += Localize.t('events.nftOfferSellExplain', { + address: tx.Account.address, + tokenID: tx.NFTokenID, + amount: tx.Amount.value, + currency: NormalizeCurrencyCode(tx.Amount.currency), + }); + } else { + content += Localize.t('events.nftOfferBuyExplain', { + address: tx.Account.address, + tokenID: tx.NFTokenID, + amount: tx.Amount.value, + currency: NormalizeCurrencyCode(tx.Amount.currency), + }); + } + + if (tx.Owner) { + content += '\n'; + content += Localize.t('events.theNftOwnerIs', { address: tx.Owner }); + } + + if (tx.Destination) { + content += '\n'; + content += Localize.t('events.thisNftOfferMayOnlyBeAcceptedBy', { address: tx.Destination.address }); + } + + if (tx.Expiration) { + content += '\n'; + content += Localize.t('events.theOfferExpiresAtUnlessCanceledOrAccepted', { + expiration: moment(tx.Expiration).format('LLLL'), + }); + } + + return content; + }, + + getRecipient: (tx: NFTokenCreateOffer, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + + return tx.Destination; + }, +}; + +/* Export ==================================================================== */ +export default NFTokenCreateOfferInfo; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferValidation.ts b/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferValidation.ts new file mode 100644 index 000000000..34b1eacdd --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/NFTokenCreateOfferValidation.ts @@ -0,0 +1,12 @@ +// import NFTokenCreateOffer from './NFTokenCreateOfferClass'; + +/* Validator ==================================================================== */ +const NFTokenCreateOfferValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default NFTokenCreateOfferValidation; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/index.ts b/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/index.ts new file mode 100644 index 000000000..b6ac0c90f --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenCreateOffer/index.ts @@ -0,0 +1,3 @@ +export { default as NFTokenCreateOffer } from './NFTokenCreateOfferClass'; +export { default as NFTokenCreateOfferValidation } from './NFTokenCreateOfferValidation'; +export { default as NFTokenCreateOfferInfo } from './NFTokenCreateOfferInfo'; diff --git a/src/common/libs/ledger/transactions/nfTokenMint.ts b/src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintClass.ts similarity index 67% rename from src/common/libs/ledger/transactions/nfTokenMint.ts rename to src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintClass.ts index 859b0e298..4aff6be6e 100644 --- a/src/common/libs/ledger/transactions/nfTokenMint.ts +++ b/src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintClass.ts @@ -1,13 +1,13 @@ +import { set, get, isUndefined, isEmpty } from 'lodash'; import BigNumber from 'bignumber.js'; -import { get, set, isUndefined } from 'lodash'; import { HexEncoding } from '@common/utils/string'; import { EncodeNFTokenID } from '@common/utils/codec'; -import BaseTransaction from './base'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class NFTokenMint extends BaseTransaction { @@ -42,30 +42,37 @@ class NFTokenMint extends BaseTransaction { } set NFTokenID(id: string) { - set(this, 'nfTokenID', id); + set(this, ['meta', 'nftoken_id'], id); } get NFTokenID(): string { - let tokenID = get(this, 'nfTokenID', undefined); + if (isEmpty(this.meta)) { + throw new Error('Determining the minted NFTokenID necessitates the metadata!'); + } + + // fixNFTokenRemint will include the minted nfTokenId in the metaData + let nfTokenID = get(this, ['meta', 'nftoken_id'], undefined); // if we already set the token id return - if (tokenID) { - return tokenID; + if (nfTokenID) { + return nfTokenID; } // which account issued this token - const Issuer = this.Issuer || this.Account.address; + const issuer = this.Issuer || this.Account.address; // Fetch minted token sequence let tokenSequence; let nextTokenSequence; + let firstNFTokenSequence; this.meta.AffectedNodes.forEach((node: any) => { if (node.ModifiedNode && node.ModifiedNode.LedgerEntryType === 'AccountRoot') { const { PreviousFields, FinalFields } = node.ModifiedNode; - if (PreviousFields && FinalFields && FinalFields.Account === Issuer) { + if (PreviousFields && FinalFields && FinalFields.Account === issuer) { tokenSequence = PreviousFields.MintedNFTokens; nextTokenSequence = FinalFields.MintedNFTokens; + firstNFTokenSequence = PreviousFields?.FirstNFTokenSequence || FinalFields?.FirstNFTokenSequence; } } }); @@ -75,19 +82,19 @@ class NFTokenMint extends BaseTransaction { tokenSequence = 0; } - // Unable to find TokenSequence - if (typeof tokenSequence === 'undefined') { - return ''; - } + // Include first NFToken Sequence + tokenSequence += firstNFTokenSequence ?? 0; const intFlags = get(this, ['tx', 'Flags'], undefined); + const rawTransferFee = get(this, ['tx', 'TransferFee'], undefined); + const taxon = get(this, ['tx', 'NFTokenTaxon']); - tokenID = EncodeNFTokenID(Issuer, tokenSequence, intFlags, this.TransferFee, this.NFTokenTaxon); + nfTokenID = EncodeNFTokenID(issuer, tokenSequence, intFlags, rawTransferFee, taxon); // store the token id - this.NFTokenID = tokenID; + this.NFTokenID = nfTokenID; - return tokenID; + return nfTokenID; } get TransferFee(): number { diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintInfo.ts b/src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintInfo.ts new file mode 100644 index 000000000..852b37f17 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintInfo.ts @@ -0,0 +1,39 @@ +import Localize from '@locale'; + +import NFTokenMint from './NFTokenMintClass'; + +/* Descriptor ==================================================================== */ +const NFTokenMintInfo = { + getLabel: (): string => { + return Localize.t('events.mintNFT'); + }, + + getDescription: (tx: NFTokenMint): string => { + let content = ''; + + content += Localize.t('events.theTokenIdIs', { tokenID: tx.NFTokenID }); + + if (typeof tx.TransferFee === 'number') { + content += '\n'; + content += Localize.t('events.theTokenHasATransferFee', { transferFee: tx.TransferFee }); + } + + if (typeof tx.NFTokenTaxon === 'number') { + content += '\n'; + content += Localize.t('events.theTokenTaxonForThisTokenIs', { taxon: tx.NFTokenTaxon }); + } + + return content; + }, + + getRecipient: (tx: NFTokenMint): { address: string; tag?: number } => { + if (tx.Issuer) { + return { address: tx.Issuer }; + } + + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default NFTokenMintInfo; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintValidation.ts b/src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintValidation.ts new file mode 100644 index 000000000..50d5b9776 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenMint/NFTokenMintValidation.ts @@ -0,0 +1,12 @@ +// import NFTokenMint from './NFTokenMintClass'; + +/* Validator ==================================================================== */ +const NFTokenMintValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default NFTokenMintValidation; diff --git a/src/common/libs/ledger/transactions/genuine/NFTokenMint/index.ts b/src/common/libs/ledger/transactions/genuine/NFTokenMint/index.ts new file mode 100644 index 000000000..0a704fcb6 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/NFTokenMint/index.ts @@ -0,0 +1,3 @@ +export { default as NFTokenMint } from './NFTokenMintClass'; +export { default as NFTokenMintValidation } from './NFTokenMintValidation'; +export { default as NFTokenMintInfo } from './NFTokenMintInfo'; diff --git a/src/common/libs/ledger/transactions/offerCancel.ts b/src/common/libs/ledger/transactions/genuine/OfferCancel/OfferCancelClass.ts similarity index 64% rename from src/common/libs/ledger/transactions/offerCancel.ts rename to src/common/libs/ledger/transactions/genuine/OfferCancel/OfferCancelClass.ts index eca978b2f..d9037e548 100644 --- a/src/common/libs/ledger/transactions/offerCancel.ts +++ b/src/common/libs/ledger/transactions/genuine/OfferCancel/OfferCancelClass.ts @@ -1,9 +1,10 @@ import { get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; + +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class OfferCancel extends BaseTransaction { @@ -18,12 +19,22 @@ class OfferCancel extends BaseTransaction { this.TransactionType = OfferCancel.Type; } - this.fields = this.fields.concat(['OfferSequence']); + this.fields = this.fields.concat(['OfferSequence', 'OfferID']); } get OfferSequence(): number { return get(this, ['tx', 'OfferSequence']); } + + get OfferID(): string { + const OfferID = get(this, ['tx', 'OfferID'], undefined); + + if (isUndefined(OfferID)) { + return undefined; + } + + return OfferID; + } } /* Export ==================================================================== */ diff --git a/src/common/libs/ledger/transactions/genuine/OfferCancel/OfferCancelInfo.ts b/src/common/libs/ledger/transactions/genuine/OfferCancel/OfferCancelInfo.ts new file mode 100644 index 000000000..19c650c00 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/OfferCancel/OfferCancelInfo.ts @@ -0,0 +1,38 @@ +import { isUndefined } from 'lodash'; +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import OfferCancel from './OfferCancelClass'; + +/* Descriptor ==================================================================== */ +const OfferCancelInfo = { + getLabel: (): string => { + return Localize.t('events.cancelOffer'); + }, + + getDescription: (tx: OfferCancel): string => { + let content = Localize.t('events.theTransactionWillCancelOffer', { + address: tx.Account.address, + offerSequence: tx.OfferSequence, + }); + + if (!isUndefined(tx.OfferID)) { + content += '\n'; + content += Localize.t('events.theTransactionHasAOfferId', { offerId: tx.OfferID }); + } + + return content; + }, + + getRecipient: (tx: OfferCancel, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default OfferCancelInfo; diff --git a/src/common/libs/ledger/transactions/genuine/OfferCancel/OfferCancelValidation.ts b/src/common/libs/ledger/transactions/genuine/OfferCancel/OfferCancelValidation.ts new file mode 100644 index 000000000..4a0fdacfc --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/OfferCancel/OfferCancelValidation.ts @@ -0,0 +1,12 @@ +// import OfferCancel from './OfferCancelClass'; + +/* Validator ==================================================================== */ +const OfferCancelValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default OfferCancelValidation; diff --git a/src/common/libs/ledger/transactions/genuine/OfferCancel/index.ts b/src/common/libs/ledger/transactions/genuine/OfferCancel/index.ts new file mode 100644 index 000000000..5df820180 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/OfferCancel/index.ts @@ -0,0 +1,3 @@ +export { default as OfferCancel } from './OfferCancelClass'; +export { default as OfferCancelValidation } from './OfferCancelValidation'; +export { default as OfferCancelInfo } from './OfferCancelInfo'; diff --git a/src/common/libs/ledger/transactions/offerCreate.ts b/src/common/libs/ledger/transactions/genuine/OfferCreate/OfferCreateClass.ts similarity index 79% rename from src/common/libs/ledger/transactions/offerCreate.ts rename to src/common/libs/ledger/transactions/genuine/OfferCreate/OfferCreateClass.ts index f64dd9d39..3d6cb4ddc 100644 --- a/src/common/libs/ledger/transactions/offerCreate.ts +++ b/src/common/libs/ledger/transactions/genuine/OfferCreate/OfferCreateClass.ts @@ -1,16 +1,17 @@ -/* eslint-disable no-lonely-if */ import { get, isUndefined, set } from 'lodash'; -import { EncodeLedgerIndex } from '@common/utils/codec'; +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; +import Meta from '@common/libs/ledger/parser/meta'; -import BaseTransaction from './base'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; -import Meta from '../parser/meta'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { AmountType, OfferStatus } from '../parser/types'; -import { TransactionJSONType, TransactionTypes } from '../types'; +import { OfferStatus, AmountType } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; +import { EncodeLedgerIndex } from '@common/utils/codec'; /* Class ==================================================================== */ class OfferCreate extends BaseTransaction { @@ -28,7 +29,7 @@ class OfferCreate extends BaseTransaction { } // concat keys - this.fields = this.fields.concat(['TakerPays', 'TakerGets', 'OfferSequence', 'Expiration']); + this.fields = this.fields.concat(['TakerPays', 'TakerGets', 'OfferSequence', 'Expiration', 'OfferID']); // memorize offer status this.offerStatus = undefined; @@ -41,8 +42,8 @@ class OfferCreate extends BaseTransaction { if (typeof gets === 'string') { return { - currency: 'XRP', - value: new Amount(gets).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(gets).dropsToNative(), }; } @@ -54,8 +55,8 @@ class OfferCreate extends BaseTransaction { } set TakerGets(gets: AmountType) { - if (gets.currency === 'XRP') { - set(this, 'tx.TakerGets', new Amount(gets.value, false).xrpToDrops()); + if (gets.currency === NetworkService.getNativeAsset()) { + set(this, 'tx.TakerGets', new Amount(gets.value, false).nativeToDrops()); return; } @@ -73,8 +74,8 @@ class OfferCreate extends BaseTransaction { if (typeof pays === 'string') { return { - currency: 'XRP', - value: new Amount(pays).dropsToXrp(), + currency: NetworkService.getNativeAsset(), + value: new Amount(pays).dropsToNative(), }; } @@ -86,8 +87,8 @@ class OfferCreate extends BaseTransaction { } set TakerPays(pays: AmountType) { - if (pays.currency === 'XRP') { - set(this, 'tx.TakerPays', new Amount(pays.value, false).xrpToDrops()); + if (pays.currency === NetworkService.getNativeAsset()) { + set(this, 'tx.TakerPays', new Amount(pays.value, false).nativeToDrops()); return; } @@ -103,11 +104,21 @@ class OfferCreate extends BaseTransaction { const pays = Number(this.TakerPays.value); let rate = gets / pays; - rate = this.TakerGets.currency !== 'XRP' ? rate : 1 / rate; + rate = this.TakerGets.currency !== NetworkService.getNativeAsset() ? rate : 1 / rate; return new Amount(rate, false).toNumber(); } + get OfferID(): string { + const OfferID = get(this, ['tx', 'OfferID'], undefined); + + if (isUndefined(OfferID)) { + return undefined; + } + + return OfferID; + } + get OfferSequence(): number { const offerSequence = get(this, ['tx', 'OfferSequence'], undefined); diff --git a/src/common/libs/ledger/transactions/genuine/OfferCreate/OfferCreateInfo.ts b/src/common/libs/ledger/transactions/genuine/OfferCreate/OfferCreateInfo.ts new file mode 100644 index 000000000..76fd6710c --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/OfferCreate/OfferCreateInfo.ts @@ -0,0 +1,80 @@ +import { isUndefined } from 'lodash'; +import moment from 'moment-timezone'; + +import NetworkService from '@services/NetworkService'; + +import { AccountModel } from '@store/models'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; +import { OfferStatus } from '@common/libs/ledger/parser/types'; + +import Localize from '@locale'; + +import OfferCreate from './OfferCreateClass'; + +/* Descriptor ==================================================================== */ +const OfferCreateInfo = { + getLabel: (tx: OfferCreate, account: AccountModel): string => { + if ([OfferStatus.FILLED, OfferStatus.PARTIALLY_FILLED].includes(tx.GetOfferStatus(account.address))) { + return Localize.t('events.exchangedAssets'); + } + return Localize.t('events.createOffer'); + }, + + getDescription: (tx: OfferCreate): string => { + let content = ''; + + content = Localize.t('events.offerTransactionExplain', { + address: tx.Account.address, + takerGetsValue: tx.TakerGets.value, + takerGetsCurrency: NormalizeCurrencyCode(tx.TakerGets.currency), + takerPaysValue: tx.TakerPays.value, + takerPaysCurrency: NormalizeCurrencyCode(tx.TakerPays.currency), + }); + + content += '\n'; + content += Localize.t('events.theExchangeRateForThisOfferIs', { + rate: tx.Rate, + takerPaysCurrency: + tx.TakerGets.currency === NetworkService.getNativeAsset() + ? NormalizeCurrencyCode(tx.TakerPays.currency) + : NormalizeCurrencyCode(tx.TakerGets.currency), + takerGetsCurrency: + tx.TakerGets.currency !== NetworkService.getNativeAsset() + ? NormalizeCurrencyCode(tx.TakerPays.currency) + : NormalizeCurrencyCode(tx.TakerGets.currency), + }); + + if (!isUndefined(tx.OfferSequence)) { + content += '\n'; + content += Localize.t('events.theTransactionIsAlsoCancelOffer', { + address: tx.Account.address, + offerSequence: tx.OfferSequence, + }); + } + + if (!isUndefined(tx.OfferID)) { + content += '\n'; + content += Localize.t('events.theTransactionHasAOfferId', { offerId: tx.OfferID }); + } + + if (tx.Expiration) { + content += '\n'; + content += Localize.t('events.theOfferExpiresAtUnlessCanceledOrConsumed', { + expiration: moment(tx.Expiration).format('LLLL'), + }); + } + + return content; + }, + + getRecipient: (tx: OfferCreate, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default OfferCreateInfo; diff --git a/src/common/libs/ledger/transactions/genuine/OfferCreate/OfferCreateValidation.ts b/src/common/libs/ledger/transactions/genuine/OfferCreate/OfferCreateValidation.ts new file mode 100644 index 000000000..97e6941df --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/OfferCreate/OfferCreateValidation.ts @@ -0,0 +1,12 @@ +// import OfferCreate from './OfferCreateClass'; + +/* Validator ==================================================================== */ +const OfferCreateValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default OfferCreateValidation; diff --git a/src/common/libs/ledger/transactions/genuine/OfferCreate/index.ts b/src/common/libs/ledger/transactions/genuine/OfferCreate/index.ts new file mode 100644 index 000000000..a627bb735 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/OfferCreate/index.ts @@ -0,0 +1,3 @@ +export { default as OfferCreate } from './OfferCreateClass'; +export { default as OfferCreateValidation } from './OfferCreateValidation'; +export { default as OfferCreateInfo } from './OfferCreateInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/Payment/PaymentClass.ts b/src/common/libs/ledger/transactions/genuine/Payment/PaymentClass.ts new file mode 100644 index 000000000..d0b848b0f --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Payment/PaymentClass.ts @@ -0,0 +1,241 @@ +import { get, set, has, isUndefined, isNumber, toInteger } from 'lodash'; +import * as AccountLib from 'xrpl-accountlib'; + +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { LedgerAmount, Destination, AmountType } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class Payment extends BaseTransaction { + public static Type = TransactionTypes.Payment as const; + public readonly Type = Payment.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = Payment.Type; + } + + this.fields = this.fields.concat([ + 'Destination', + 'DestinationTag', + 'InvoiceID', + 'Paths', + 'Amount', + 'SendMax', + 'DeliverMin', + ]); + } + + get Destination(): Destination { + const destination = get(this, ['tx', 'Destination'], undefined); + const destinationTag = get(this, ['tx', 'DestinationTag'], undefined); + + if (isUndefined(destination)) return undefined; + + return { + address: destination, + tag: destinationTag, + }; + } + + set Destination(destination: Destination) { + if (has(destination, 'address')) { + if (!AccountLib.utils.isValidAddress(destination.address)) { + throw new Error(`${destination.address} is not a valid Address`); + } + set(this, 'tx.Destination', destination.address); + } + + if (has(destination, 'tag')) { + const tag = get(destination, 'tag', undefined); + if (tag !== undefined && tag !== null && tag !== '') { + // try to convert to number if not + if (!isNumber(tag)) { + set(this, 'tx.DestinationTag', toInteger(tag)); + } else { + set(this, 'tx.DestinationTag', tag); + } + } else { + set(this, 'tx.DestinationTag', undefined); + } + } + } + + get DeliveredAmount(): AmountType { + let deliveredAmount = undefined as AmountType; + + if (has(this, ['meta', 'DeliveredAmount'])) { + deliveredAmount = get(this, ['meta', 'DeliveredAmount']); + } else { + deliveredAmount = get(this, ['meta', 'delivered_amount']); + } + + // the delivered_amount will be unavailable in old transactions + // @ts-ignore + if (deliveredAmount === 'unavailable') { + deliveredAmount = undefined; + } + + if (isUndefined(deliveredAmount)) return undefined; + + if (typeof deliveredAmount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(deliveredAmount).dropsToNative(), + }; + } + + return { + currency: deliveredAmount.currency, + value: deliveredAmount.value, + issuer: deliveredAmount.issuer, + }; + } + + // @ts-ignore + get Amount(): AmountType { + let amount = undefined as AmountType; + + amount = get(this, ['tx', 'Amount']); + + if (isUndefined(amount)) return undefined; + + if (typeof amount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), + }; + } + + return { + currency: amount.currency, + value: amount.value, + issuer: amount.issuer, + }; + } + + // @ts-ignore + set Amount(input: LedgerAmount) { + // native currency + if (typeof input === 'string') { + set(this, 'tx.Amount', new Amount(input, false).nativeToDrops()); + } + + if (typeof input === 'object') { + set(this, 'tx.Amount', { + currency: input.currency, + value: input.value, + issuer: input.issuer, + }); + } + } + + // @ts-ignore + get SendMax(): AmountType { + const sendMax = get(this, ['tx', 'SendMax'], undefined); + + if (!sendMax) { + return undefined; + } + + if (typeof sendMax === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(sendMax).dropsToNative(), + }; + } + + return { + currency: sendMax.currency, + value: sendMax.value, + issuer: sendMax.issuer, + }; + } + + set SendMax(input: LedgerAmount) { + if (typeof input === 'undefined') { + set(this, 'tx.SendMax', undefined); + return; + } + // native currency + if (typeof input === 'string') { + set(this, 'tx.SendMax', new Amount(input, false).nativeToDrops()); + } + + if (typeof input === 'object') { + set(this, 'tx.SendMax', { + currency: input.currency, + value: input.value, + issuer: input.issuer, + }); + } + } + + set DeliverMin(input: AmountType | undefined) { + if (typeof input === 'undefined') { + set(this, 'tx.DeliverMin', undefined); + return; + } + + // native currency + if (typeof input === 'string') { + set(this, 'tx.DeliverMin', new Amount(input, false).nativeToDrops()); + return; + } + + set(this, 'tx.DeliverMin', { + currency: input.currency, + value: input.value, + issuer: input.issuer, + }); + } + + get DeliverMin(): AmountType { + const deliverMin = get(this, ['tx', 'DeliverMin'], undefined); + + if (!deliverMin) { + return undefined; + } + + if (typeof deliverMin === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(deliverMin).dropsToNative(), + }; + } + + return { + currency: deliverMin.currency, + value: deliverMin.value, + issuer: deliverMin.issuer, + }; + } + + get InvoiceID(): string { + return get(this, 'tx.InvoiceID', undefined); + } + + set InvoiceID(invoiceId: string) { + set(this, 'tx.InvoiceID', invoiceId); + } + + get Paths(): Array { + return get(this, 'tx.Paths', undefined); + } + + set Paths(path: Array) { + set(this, 'tx.Paths', path); + } +} + +/* Export ==================================================================== */ +export default Payment; diff --git a/src/common/libs/ledger/transactions/genuine/Payment/PaymentInfo.ts b/src/common/libs/ledger/transactions/genuine/Payment/PaymentInfo.ts new file mode 100644 index 000000000..a57ff1ffa --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Payment/PaymentInfo.ts @@ -0,0 +1,61 @@ +import { AccountModel } from '@store/models'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import Localize from '@locale'; + +import Payment from './PaymentClass'; + +/* Descriptor ==================================================================== */ +const PaymentInfo = { + getLabel: (tx: Payment, account: AccountModel): string => { + if ([tx.Account.address, tx.Destination?.address].indexOf(account.address) === -1) { + const balanceChanges = tx.BalanceChange(account.address); + if (balanceChanges?.sent && balanceChanges?.received) { + return Localize.t('events.exchangedAssets'); + } + return Localize.t('global.payment'); + } + if (tx.Destination.address === account.address) { + return Localize.t('events.paymentReceived'); + } + + return Localize.t('events.paymentSent'); + }, + + getDescription: (tx: Payment): string => { + let content = ''; + if (tx.Account.tag) { + content += Localize.t('events.thePaymentHasASourceTag', { tag: tx.Account.tag }); + content += ' \n'; + } + if (tx.Destination.tag) { + content += Localize.t('events.thePaymentHasADestinationTag', { tag: tx.Destination.tag }); + content += ' \n'; + } + + content += Localize.t('events.itWasInstructedToDeliver', { + amount: tx.Amount.value, + currency: NormalizeCurrencyCode(tx.Amount.currency), + }); + + if (tx.SendMax) { + content += ' '; + content += Localize.t('events.bySpendingUpTo', { + amount: tx.SendMax.value, + currency: NormalizeCurrencyCode(tx.SendMax.currency), + }); + } + return content; + }, + + getRecipient: (tx: Payment, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account?.address !== account.address) { + return tx.Account; + } + return tx.Destination; + }, +}; + +/* Export ==================================================================== */ +export default PaymentInfo; diff --git a/src/common/libs/ledger/transactions/genuine/Payment/PaymentValidation.ts b/src/common/libs/ledger/transactions/genuine/Payment/PaymentValidation.ts new file mode 100644 index 000000000..e19d8428d --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Payment/PaymentValidation.ts @@ -0,0 +1,168 @@ +import NetworkService from '@services/NetworkService'; +import LedgerService from '@services/LedgerService'; + +import { ErrorMessages } from '@common/constants'; +import { AmountType } from '@common/libs/ledger/parser/types'; +import { NormalizeAmount, NormalizeCurrencyCode } from '@common/utils/amount'; + +import Localize from '@locale'; + +import Payment from './PaymentClass'; + +/* Validator ==================================================================== */ +const PaymentValidation = (tx: Payment): Promise => { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve, reject) => { + try { + // ignore validation if transaction including Path + if (tx.Paths) { + resolve(); + return; + } + + // check if amount is present + if (!tx.Amount || !tx.Amount?.value || tx.Amount?.value === '0') { + reject(new Error(Localize.t('send.pleaseEnterAmount'))); + return; + } + + // ===== check if recipient have proper TrustLine when delivering IOU ===== + // Note: ignore if sending to the issuer + if (tx.Amount.currency !== NetworkService.getNativeAsset() && tx.Amount.issuer !== tx.Destination.address) { + const destinationLine = await LedgerService.getFilteredAccountLine(tx.Destination.address, tx.Amount); + + if ( + !destinationLine || + (Number(destinationLine.limit) === 0 && Number(destinationLine.balance) === 0) + ) { + reject(new Error(Localize.t('send.unableToSendPaymentRecipientDoesNotHaveTrustLine'))); + return; + } + } + + let NativeAmount = undefined as AmountType; + + // SendMax have higher priority + if (tx.SendMax && tx.SendMax.currency === NetworkService.getNativeAsset()) { + NativeAmount = tx.SendMax; + } else if (tx.Amount.currency === NetworkService.getNativeAsset() && !tx.SendMax) { + NativeAmount = tx.Amount; + } + + if (NativeAmount) { + // ===== check balance ===== + try { + // fetch fresh account balance from ledger + const availableBalance = await LedgerService.getAccountAvailableBalance(tx.Account.address); + + if (Number(NativeAmount.value) > Number(availableBalance)) { + reject( + new Error( + Localize.t('send.insufficientBalanceSpendableBalance', { + spendable: Localize.formatNumber(availableBalance), + currency: NetworkService.getNativeAsset(), + }), + ), + ); + return; + } + } catch (e) { + reject(Localize.t('account.unableGetAccountInfo')); + return; + } + } + + let IOUAmount = undefined as AmountType; + + // SendMax have higher priority + if (tx.SendMax && tx.SendMax.currency !== NetworkService.getNativeAsset()) { + IOUAmount = tx.SendMax; + } else if (tx.Amount.currency !== NetworkService.getNativeAsset() && !tx.SendMax) { + IOUAmount = tx.Amount; + } + + if (IOUAmount) { + // ===== check balances ===== + // sender is not issuer + if (IOUAmount.issuer !== tx.Account.address) { + // check IOU balance + const sourceLine = await LedgerService.getFilteredAccountLine(tx.Account.address, IOUAmount); + + // TODO: show proper error message + if (!sourceLine) { + resolve(); + return; + } + + // check if asset is frozen by issuer + if (sourceLine.freeze_peer) { + reject( + new Error( + Localize.t('send.trustLineIsFrozenByIssuer', { + currency: NormalizeCurrencyCode(sourceLine.currency), + }), + ), + ); + return; + } + + if (Number(IOUAmount.value) > Number(sourceLine.balance)) { + reject( + new Error( + Localize.t('send.insufficientBalanceSpendableBalance', { + spendable: Localize.formatNumber(NormalizeAmount(sourceLine.balance)), + currency: NormalizeCurrencyCode(sourceLine.currency), + }), + ), + ); + return; + } + } else { + // sender is the issuer + // check for exceed the TrustLine Limit on obligations + const sourceLine = await LedgerService.getFilteredAccountLine(tx.Account.address, { + issuer: tx.Destination.address, + currency: IOUAmount.currency, + }); + + // TODO: show proper error message + if (!sourceLine) { + resolve(); + return; + } + + if ( + Number(IOUAmount.value) + Math.abs(Number(sourceLine.balance)) > + Number(sourceLine.limit_peer) + ) { + reject( + new Error( + Localize.t('send.trustLineLimitExceeded', { + balance: Localize.formatNumber( + NormalizeAmount(Math.abs(Number(sourceLine.balance))), + ), + peer_limit: Localize.formatNumber(NormalizeAmount(Number(sourceLine.limit_peer))), + available: Localize.formatNumber( + NormalizeAmount( + Number( + Number(sourceLine.limit_peer) - Math.abs(Number(sourceLine.balance)), + ), + ), + ), + }), + ), + ); + return; + } + } + } + + resolve(); + } catch (e) { + reject(new Error(ErrorMessages.unexpectedValidationError)); + } + }); +}; + +/* Export ==================================================================== */ +export default PaymentValidation; diff --git a/src/common/libs/ledger/transactions/genuine/Payment/index.ts b/src/common/libs/ledger/transactions/genuine/Payment/index.ts new file mode 100644 index 000000000..b5a1b107b --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/Payment/index.ts @@ -0,0 +1,3 @@ +export { default as Payment } from './PaymentClass'; +export { default as PaymentValidation } from './PaymentValidation'; +export { default as PaymentInfo } from './PaymentInfo'; diff --git a/src/common/libs/ledger/transactions/paymentChannelClaim.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/PaymentChannelClaimClass.ts similarity index 65% rename from src/common/libs/ledger/transactions/paymentChannelClaim.ts rename to src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/PaymentChannelClaimClass.ts index e1025699d..ec5aa5ac2 100644 --- a/src/common/libs/ledger/transactions/paymentChannelClaim.ts +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/PaymentChannelClaimClass.ts @@ -1,11 +1,14 @@ import { get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; -import Amount from '../parser/common/amount'; +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { AmountType } from '../parser/types'; -import { TransactionJSONType, TransactionTypes } from '../types'; +import { AmountType } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class PaymentChannelClaim extends BaseTransaction { @@ -32,9 +35,17 @@ class PaymentChannelClaim extends BaseTransaction { if (isUndefined(balance)) return undefined; + if (typeof balance === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(balance).dropsToNative(), + }; + } + return { - currency: 'XRP', - value: new Amount(balance).dropsToXrp(), + currency: balance.currency, + value: balance.value, + issuer: balance.issuer, }; } @@ -43,9 +54,17 @@ class PaymentChannelClaim extends BaseTransaction { if (isUndefined(amount)) return undefined; + if (typeof amount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), + }; + } + return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), + currency: amount.currency, + value: amount.value, + issuer: amount.issuer, }; } diff --git a/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/PaymentChannelClaimInfo.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/PaymentChannelClaimInfo.ts new file mode 100644 index 000000000..e6d5d009f --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/PaymentChannelClaimInfo.ts @@ -0,0 +1,43 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import PaymentChannelClaim from './PaymentChannelClaimClass'; + +/* Descriptor ==================================================================== */ +const PaymentChannelClaimInfo = { + getLabel: (): string => { + return Localize.t('events.claimPaymentChannel'); + }, + + getDescription: (tx: PaymentChannelClaim): string => { + let content = ''; + + content += Localize.t('events.itWillUpdateThePaymentChannel', { channel: tx.Channel }); + content += '\n'; + + if (tx.Balance) { + content += Localize.t('events.theChannelBalanceClaimedIs', { + balance: tx.Balance.value, + currency: tx.Balance.currency, + }); + content += '\n'; + } + + if (tx.IsClosed) { + content += Localize.t('events.thePaymentChannelWillBeClosed'); + } + + return content; + }, + + getRecipient: (tx: PaymentChannelClaim, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default PaymentChannelClaimInfo; diff --git a/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/PaymentChannelClaimValidation.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/PaymentChannelClaimValidation.ts new file mode 100644 index 000000000..8ef56d947 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/PaymentChannelClaimValidation.ts @@ -0,0 +1,12 @@ +// import PaymentChannelClaim from './PaymentChannelClaimClass'; + +/* Validator ==================================================================== */ +const PaymentChannelClaimValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default PaymentChannelClaimValidation; diff --git a/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/index.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/index.ts new file mode 100644 index 000000000..da27d548f --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelClaim/index.ts @@ -0,0 +1,3 @@ +export { default as PaymentChannelClaim } from './PaymentChannelClaimClass'; +export { default as PaymentChannelClaimValidation } from './PaymentChannelClaimValidation'; +export { default as PaymentChannelClaimInfo } from './PaymentChannelClaimInfo'; diff --git a/src/common/libs/ledger/transactions/paymentChannelCreate.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateClass.ts similarity index 74% rename from src/common/libs/ledger/transactions/paymentChannelCreate.ts rename to src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateClass.ts index 92ef214fd..2fa738c23 100644 --- a/src/common/libs/ledger/transactions/paymentChannelCreate.ts +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateClass.ts @@ -1,12 +1,15 @@ -import { get, isUndefined, set } from 'lodash'; +import { set, get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { AmountType, Destination } from '../parser/types'; -import { TransactionJSONType, TransactionTypes } from '../types'; +import { Destination, AmountType } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class PaymentChannelCreate extends BaseTransaction { @@ -36,9 +39,17 @@ class PaymentChannelCreate extends BaseTransaction { if (isUndefined(amount)) return undefined; + if (typeof amount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), + }; + } + return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), + currency: amount.currency, + value: amount.value, + issuer: amount.issuer, }; } @@ -68,7 +79,9 @@ class PaymentChannelCreate extends BaseTransaction { get CancelAfter(): string { const date = get(this, ['tx', 'CancelAfter'], undefined); + if (isUndefined(date)) return undefined; + const ledgerDate = new LedgerDate(date); return ledgerDate.toISO8601(); } diff --git a/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateInfo.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateInfo.ts new file mode 100644 index 000000000..c650987c9 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateInfo.ts @@ -0,0 +1,86 @@ +import moment from 'moment-timezone'; + +import { AccountModel } from '@store/models'; + +import { LedgerObjectTypes, TransactionTypes } from '@common/libs/ledger/types'; + +import Localize from '@locale'; + +import PaymentChannelCreate from './PaymentChannelCreateClass'; + +/* Descriptor ==================================================================== */ +const PaymentChannelCreateInfo = { + getLabel: (): string => { + return Localize.t('events.createPaymentChannel'); + }, + + getDescription: (tx: PaymentChannelCreate): string => { + let content = ''; + + content += Localize.t( + // @ts-ignore + tx.Type === LedgerObjectTypes.PayChannel + ? 'events.accountCreatedAPaymentChannelTo' + : 'events.accountWillCreateAPaymentChannelTo', + { + account: tx.Account.address, + destination: tx.Destination.address, + }, + ); + content += '\n'; + + content += Localize.t('events.theChannelIdIs', { + // @ts-ignore + channel: tx.Type === LedgerObjectTypes.PayChannel ? tx.Index : tx.ChannelID, + }); + content += '\n'; + + if (tx.Type === TransactionTypes.PaymentChannelCreate) { + content += Localize.t('events.theChannelAmountIs', { + amount: tx.Amount.value, + currency: tx.Amount.currency, + }); + content += '\n'; + } + + if (tx.Account.tag !== undefined) { + content += Localize.t('events.theASourceTagIs', { tag: tx.Account.tag }); + content += ' \n'; + } + + if (tx.Destination.tag !== undefined) { + content += Localize.t('events.theDestinationTagIs', { tag: tx.Destination.tag }); + content += ' \n'; + } + + // @ts-ignore + if (tx.Type === LedgerObjectTypes.PayChannel && tx.Expiration) { + // @ts-ignore + content += Localize.t('events.theChannelExpiresAt', { cancelAfter: tx.Expiration }); + content += ' \n'; + } + + if (tx.SettleDelay) { + content += Localize.t('events.theChannelHasASettlementDelay', { delay: tx.SettleDelay }); + content += ' \n'; + } + + if (tx.CancelAfter) { + content += Localize.t('events.itCanBeCancelledAfter', { + cancelAfter: moment(tx.CancelAfter).format('LLLL'), + }); + } + + return content; + }, + + getRecipient: (tx: PaymentChannelCreate, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return tx.Destination; + }, +}; + +/* Export ==================================================================== */ +export default PaymentChannelCreateInfo; diff --git a/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateValidation.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateValidation.ts new file mode 100644 index 000000000..a998c31b5 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/PaymentChannelCreateValidation.ts @@ -0,0 +1,12 @@ +// import PaymentChannelCreate from './PaymentChannelCreateClass'; + +/* Validator ==================================================================== */ +const PaymentChannelCreateValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default PaymentChannelCreateValidation; diff --git a/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/index.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/index.ts new file mode 100644 index 000000000..a8e6e7d31 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelCreate/index.ts @@ -0,0 +1,3 @@ +export { default as PaymentChannelCreate } from './PaymentChannelCreateClass'; +export { default as PaymentChannelCreateValidation } from './PaymentChannelCreateValidation'; +export { default as PaymentChannelCreateInfo } from './PaymentChannelCreateInfo'; diff --git a/src/common/libs/ledger/transactions/paymentChannelFund.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/PaymentChannelFundClass.ts similarity index 64% rename from src/common/libs/ledger/transactions/paymentChannelFund.ts rename to src/common/libs/ledger/transactions/genuine/PaymentChannelFund/PaymentChannelFundClass.ts index 8a213f157..824294c14 100644 --- a/src/common/libs/ledger/transactions/paymentChannelFund.ts +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/PaymentChannelFundClass.ts @@ -1,12 +1,15 @@ import { get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; -import Amount from '../parser/common/amount'; -import LedgerDate from '../parser/common/date'; +import NetworkService from '@services/NetworkService'; + +import Amount from '@common/libs/ledger/parser/common/amount'; +import LedgerDate from '@common/libs/ledger/parser/common/date'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { AmountType } from '../parser/types'; -import { TransactionJSONType, TransactionTypes } from '../types'; +import { AmountType } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class PaymentChannelFund extends BaseTransaction { @@ -33,9 +36,17 @@ class PaymentChannelFund extends BaseTransaction { if (isUndefined(amount)) return undefined; + if (typeof amount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), + }; + } + return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), + currency: amount.currency, + value: amount.value, + issuer: amount.issuer, }; } diff --git a/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/PaymentChannelFundInfo.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/PaymentChannelFundInfo.ts new file mode 100644 index 000000000..349f4aa90 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/PaymentChannelFundInfo.ts @@ -0,0 +1,35 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import PaymentChannelFund from './PaymentChannelFundClass'; + +/* Descriptor ==================================================================== */ +const PaymentChannelFundInfo = { + getLabel: (): string => { + return Localize.t('events.fundPaymentChannel'); + }, + + getDescription: (tx: PaymentChannelFund): string => { + let content = ''; + + content += Localize.t('events.itWillUpdateThePaymentChannel', { channel: tx.Channel }); + content += '\n'; + content += Localize.t('events.itWillIncreaseTheChannelAmount', { + amount: tx.Amount.value, + currency: tx.Amount.currency, + }); + + return content; + }, + + getRecipient: (tx: PaymentChannelFund, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default PaymentChannelFundInfo; diff --git a/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/PaymentChannelFundValidation.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/PaymentChannelFundValidation.ts new file mode 100644 index 000000000..23b88b207 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/PaymentChannelFundValidation.ts @@ -0,0 +1,12 @@ +// import PaymentChannelFund from './PaymentChannelFundClass'; + +/* Validator ==================================================================== */ +const PaymentChannelFundValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default PaymentChannelFundValidation; diff --git a/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/index.ts b/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/index.ts new file mode 100644 index 000000000..f46acf9d0 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/PaymentChannelFund/index.ts @@ -0,0 +1,3 @@ +export { default as PaymentChannelFund } from './PaymentChannelFundClass'; +export { default as PaymentChannelFundValidation } from './PaymentChannelFundValidation'; +export { default as PaymentChannelFundInfo } from './PaymentChannelFundInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/SetHook/SetHookClass.ts b/src/common/libs/ledger/transactions/genuine/SetHook/SetHookClass.ts new file mode 100644 index 000000000..6986cb87f --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/SetHook/SetHookClass.ts @@ -0,0 +1,30 @@ +import { get, isUndefined } from 'lodash'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class SetHook extends BaseTransaction { + public static Type = TransactionTypes.SetHook as const; + public readonly Type = SetHook.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = SetHook.Type; + } + + this.fields = this.fields.concat(['Hooks']); + } + + get Hooks(): Array { + return get(this, ['tx', 'Hooks']); + } +} + +/* Export ==================================================================== */ +export default SetHook; diff --git a/src/common/libs/ledger/transactions/genuine/SetHook/SetHookInfo.ts b/src/common/libs/ledger/transactions/genuine/SetHook/SetHookInfo.ts new file mode 100644 index 000000000..6c9c4777e --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/SetHook/SetHookInfo.ts @@ -0,0 +1,27 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import SetHook from './SetHookClass'; + +/* Descriptor ==================================================================== */ +const SetHookInfo = { + getLabel: (): string => { + return Localize.t('events.setHooks'); + }, + + getDescription: (tx: SetHook): string => { + // TODO: add more description + return `This is an ${tx.Type} transaction`; + }, + + getRecipient: (tx: SetHook, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default SetHookInfo; diff --git a/src/common/libs/ledger/transactions/genuine/SetHook/SetHookValidation.ts b/src/common/libs/ledger/transactions/genuine/SetHook/SetHookValidation.ts new file mode 100644 index 000000000..ed2b0fe52 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/SetHook/SetHookValidation.ts @@ -0,0 +1,12 @@ +// import SetHook from './SetHookClass'; + +/* Validator ==================================================================== */ +const SetHookValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default SetHookValidation; diff --git a/src/common/libs/ledger/transactions/genuine/SetHook/index.ts b/src/common/libs/ledger/transactions/genuine/SetHook/index.ts new file mode 100644 index 000000000..79d38f1db --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/SetHook/index.ts @@ -0,0 +1,3 @@ +export { default as SetHook } from './SetHookClass'; +export { default as SetHookValidation } from './SetHookValidation'; +export { default as SetHookInfo } from './SetHookInfo'; diff --git a/src/common/libs/ledger/transactions/setRegularKey.ts b/src/common/libs/ledger/transactions/genuine/SetRegularKey/SetRegularKeyClass.ts similarity index 83% rename from src/common/libs/ledger/transactions/setRegularKey.ts rename to src/common/libs/ledger/transactions/genuine/SetRegularKey/SetRegularKeyClass.ts index 563a62913..87645dbc3 100644 --- a/src/common/libs/ledger/transactions/setRegularKey.ts +++ b/src/common/libs/ledger/transactions/genuine/SetRegularKey/SetRegularKeyClass.ts @@ -1,9 +1,9 @@ import { get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class SetRegularKey extends BaseTransaction { diff --git a/src/common/libs/ledger/transactions/genuine/SetRegularKey/SetRegularKeyInfo.ts b/src/common/libs/ledger/transactions/genuine/SetRegularKey/SetRegularKeyInfo.ts new file mode 100644 index 000000000..e2c581e60 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/SetRegularKey/SetRegularKeyInfo.ts @@ -0,0 +1,35 @@ +import Localize from '@locale'; + +import SetRegularKey from './SetRegularKeyClass'; + +/* Descriptor ==================================================================== */ +const SetRegularKeyInfo = { + getLabel: (tx: SetRegularKey): string => { + if (tx.RegularKey) { + return Localize.t('events.setRegularKey'); + } + return Localize.t('events.removeRegularKey'); + }, + + getDescription: (tx: SetRegularKey): string => { + let content = Localize.t('events.thisIsAnSetRegularKeyTransaction'); + content += '\n'; + if (tx.RegularKey) { + content += Localize.t('events.itSetsAccountRegularKeyTo', { regularKey: tx.RegularKey }); + } else { + content += Localize.t('events.itRemovesTheAccountRegularKey'); + } + return content; + }, + + getRecipient: (tx: SetRegularKey): { address: string; tag?: number } => { + if (tx.RegularKey) { + return { address: tx.RegularKey }; + } + + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default SetRegularKeyInfo; diff --git a/src/common/libs/ledger/transactions/genuine/SetRegularKey/SetRegularKeyValidation.ts b/src/common/libs/ledger/transactions/genuine/SetRegularKey/SetRegularKeyValidation.ts new file mode 100644 index 000000000..20e1bdee1 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/SetRegularKey/SetRegularKeyValidation.ts @@ -0,0 +1,12 @@ +// import SetRegularKey from './SetRegularKeyClass'; + +/* Validator ==================================================================== */ +const SetRegularKeyValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default SetRegularKeyValidation; diff --git a/src/common/libs/ledger/transactions/genuine/SetRegularKey/index.ts b/src/common/libs/ledger/transactions/genuine/SetRegularKey/index.ts new file mode 100644 index 000000000..d767ce011 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/SetRegularKey/index.ts @@ -0,0 +1,3 @@ +export { default as SetRegularKey } from './SetRegularKeyClass'; +export { default as SetRegularKeyValidation } from './SetRegularKeyValidation'; +export { default as SetRegularKeyInfo } from './SetRegularKeyInfo'; diff --git a/src/common/libs/ledger/transactions/signerListSet.ts b/src/common/libs/ledger/transactions/genuine/SignerListSet/SignerListSetClass.ts similarity index 81% rename from src/common/libs/ledger/transactions/signerListSet.ts rename to src/common/libs/ledger/transactions/genuine/SignerListSet/SignerListSetClass.ts index 0f17ffe0d..fa3727e3b 100644 --- a/src/common/libs/ledger/transactions/signerListSet.ts +++ b/src/common/libs/ledger/transactions/genuine/SignerListSet/SignerListSetClass.ts @@ -1,10 +1,10 @@ -import { get, isUndefined, flatMap } from 'lodash'; +import { flatMap, get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; -import { SignerEntry } from '../parser/types'; +import { SignerEntry } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class SignerListSet extends BaseTransaction { diff --git a/src/common/libs/ledger/transactions/genuine/SignerListSet/SignerListSetInfo.ts b/src/common/libs/ledger/transactions/genuine/SignerListSet/SignerListSetInfo.ts new file mode 100644 index 000000000..557a22587 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/SignerListSet/SignerListSetInfo.ts @@ -0,0 +1,27 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import SignerListSet from './SignerListSetClass'; + +/* Descriptor ==================================================================== */ +const SignerListSetInfo = { + getLabel: (): string => { + return Localize.t('events.setSignerList'); + }, + + getDescription: (tx: SignerListSet): string => { + // TODO: add more description + return `This is an ${tx.Type} transaction`; + }, + + getRecipient: (tx: SignerListSet, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default SignerListSetInfo; diff --git a/src/common/libs/ledger/transactions/genuine/SignerListSet/SignerListSetValidation.ts b/src/common/libs/ledger/transactions/genuine/SignerListSet/SignerListSetValidation.ts new file mode 100644 index 000000000..54a146574 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/SignerListSet/SignerListSetValidation.ts @@ -0,0 +1,12 @@ +// import SignerListSet from './SignerListSetClass'; + +/* Validator ==================================================================== */ +const SignerListSetValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default SignerListSetValidation; diff --git a/src/common/libs/ledger/transactions/genuine/SignerListSet/index.ts b/src/common/libs/ledger/transactions/genuine/SignerListSet/index.ts new file mode 100644 index 000000000..a23fbcc96 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/SignerListSet/index.ts @@ -0,0 +1,3 @@ +export { default as SignerListSet } from './SignerListSetClass'; +export { default as SignerListSetValidation } from './SignerListSetValidation'; +export { default as SignerListSetInfo } from './SignerListSetInfo'; diff --git a/src/common/libs/ledger/transactions/ticketCreate.ts b/src/common/libs/ledger/transactions/genuine/TicketCreate/TicketCreateClass.ts similarity index 83% rename from src/common/libs/ledger/transactions/ticketCreate.ts rename to src/common/libs/ledger/transactions/genuine/TicketCreate/TicketCreateClass.ts index 1de9cf258..ac1818981 100644 --- a/src/common/libs/ledger/transactions/ticketCreate.ts +++ b/src/common/libs/ledger/transactions/genuine/TicketCreate/TicketCreateClass.ts @@ -1,10 +1,12 @@ -import { get, isUndefined, set } from 'lodash'; +import { set, get, isUndefined } from 'lodash'; -import BaseTransaction from './base'; +import Meta from '@common/libs/ledger/parser/meta'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; -import Meta from '../parser/meta'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; + +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class TicketCreate extends BaseTransaction { diff --git a/src/common/libs/ledger/transactions/genuine/TicketCreate/TicketCreateInfo.ts b/src/common/libs/ledger/transactions/genuine/TicketCreate/TicketCreateInfo.ts new file mode 100644 index 000000000..c087a31b6 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/TicketCreate/TicketCreateInfo.ts @@ -0,0 +1,29 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import TicketCreate from './TicketCreateClass'; + +/* Descriptor ==================================================================== */ +const TicketCreateInfo = { + getLabel: (): string => { + return Localize.t('events.createTicket'); + }, + + getDescription: (tx: TicketCreate): string => { + let content = Localize.t('events.itCreatesTicketForThisAccount', { ticketCount: tx.TicketCount }); + content += '\n\n'; + content += Localize.t('events.createdTicketsSequence', { ticketsSequence: tx.TicketsSequence.join(', ') }); + return content; + }, + + getRecipient: (tx: TicketCreate, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default TicketCreateInfo; diff --git a/src/common/libs/ledger/transactions/genuine/TicketCreate/TicketCreateValidation.ts b/src/common/libs/ledger/transactions/genuine/TicketCreate/TicketCreateValidation.ts new file mode 100644 index 000000000..ada8cab59 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/TicketCreate/TicketCreateValidation.ts @@ -0,0 +1,12 @@ +// import TicketCreate from './TicketCreateClass'; + +/* Validator ==================================================================== */ +const TicketCreateValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default TicketCreateValidation; diff --git a/src/common/libs/ledger/transactions/genuine/TicketCreate/index.ts b/src/common/libs/ledger/transactions/genuine/TicketCreate/index.ts new file mode 100644 index 000000000..c0aeb8738 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/TicketCreate/index.ts @@ -0,0 +1,3 @@ +export { default as TicketCreate } from './TicketCreateClass'; +export { default as TicketCreateValidation } from './TicketCreateValidation'; +export { default as TicketCreateInfo } from './TicketCreateInfo'; diff --git a/src/common/libs/ledger/transactions/trustSet.ts b/src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetClass.ts similarity index 86% rename from src/common/libs/ledger/transactions/trustSet.ts rename to src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetClass.ts index d3252f867..b61116852 100644 --- a/src/common/libs/ledger/transactions/trustSet.ts +++ b/src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetClass.ts @@ -1,12 +1,10 @@ -/** - * TrustLine transaction Parser - */ +import { set, get, isUndefined, toNumber } from 'lodash'; -import { get, set, isUndefined, toNumber } from 'lodash'; -import BaseTransaction from './base'; +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; /* Types ==================================================================== */ -import { TransactionJSONType, TransactionTypes } from '../types'; + +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class TrustSet extends BaseTransaction { diff --git a/src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetInfo.ts b/src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetInfo.ts new file mode 100644 index 000000000..6cb944102 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetInfo.ts @@ -0,0 +1,60 @@ +import { AccountModel } from '@store/models'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import Localize from '@locale'; + +import TrustSet from './TrustSetClass'; + +/* Descriptor ==================================================================== */ +const TrustSetInfo = { + getLabel: (tx: TrustSet, account: AccountModel): string => { + // incoming TrustLine + if (tx.Account.address !== account.address) { + if (tx.Limit === 0) { + return Localize.t('events.incomingTrustLineRemoved'); + } + return Localize.t('events.incomingTrustLineAdded'); + } + const ownerCountChange = tx.OwnerCountChange(account.address); + if (ownerCountChange) { + if (ownerCountChange.action === 'INC') { + return Localize.t('events.addedATrustLine'); + } + return Localize.t('events.removedATrustLine'); + } + return Localize.t('events.updatedATrustLine'); + }, + + getDescription: (tx: TrustSet, account: AccountModel): string => { + const ownerCountChange = tx.OwnerCountChange(account.address); + + if (ownerCountChange && ownerCountChange.action === 'DEC') { + return Localize.t('events.itRemovedTrustLineCurrencyTo', { + currency: NormalizeCurrencyCode(tx.Currency), + issuer: tx.Issuer, + }); + } + + return Localize.t('events.itEstablishesTrustLineTo', { + limit: tx.Limit, + currency: NormalizeCurrencyCode(tx.Currency), + issuer: tx.Issuer, + address: tx.Account.address, + }); + }, + + getRecipient: (tx: TrustSet, account: AccountModel): { address: string; tag?: number } => { + // incoming trustline + if (tx.Issuer === account.address) { + return tx.Account; + } + + return { + address: tx.Issuer, + }; + }, +}; + +/* Export ==================================================================== */ +export default TrustSetInfo; diff --git a/src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetValidation.ts b/src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetValidation.ts new file mode 100644 index 000000000..ed13fa357 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/TrustSet/TrustSetValidation.ts @@ -0,0 +1,12 @@ +// import TrustSet from './TrustSetClass'; + +/* Validator ==================================================================== */ +const TrustSetValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default TrustSetValidation; diff --git a/src/common/libs/ledger/transactions/genuine/TrustSet/index.ts b/src/common/libs/ledger/transactions/genuine/TrustSet/index.ts new file mode 100644 index 000000000..0f6892c69 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/TrustSet/index.ts @@ -0,0 +1,3 @@ +export { default as TrustSet } from './TrustSetClass'; +export { default as TrustSetValidation } from './TrustSetValidation'; +export { default as TrustSetInfo } from './TrustSetInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenBurn/URITokenBurnClass.ts b/src/common/libs/ledger/transactions/genuine/URITokenBurn/URITokenBurnClass.ts new file mode 100644 index 000000000..0ce0f429d --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenBurn/URITokenBurnClass.ts @@ -0,0 +1,30 @@ +import { get, isUndefined } from 'lodash'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class URITokenBurn extends BaseTransaction { + public static Type = TransactionTypes.URITokenBurn as const; + public readonly Type = URITokenBurn.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = URITokenBurn.Type; + } + + this.fields = this.fields.concat(['URITokenID']); + } + + get URITokenID(): string { + return get(this, ['tx', 'URITokenID']); + } +} + +/* Export ==================================================================== */ +export default URITokenBurn; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenBurn/URITokenBurnInfo.ts b/src/common/libs/ledger/transactions/genuine/URITokenBurn/URITokenBurnInfo.ts new file mode 100644 index 000000000..a235828d8 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenBurn/URITokenBurnInfo.ts @@ -0,0 +1,30 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import URITokenBurn from './URITokenBurnClass'; + +/* Descriptor ==================================================================== */ +const URITokenBurnInfo = { + getLabel: (): string => { + return Localize.t('events.burnURIToken'); + }, + + getDescription: (tx: URITokenBurn): string => { + const { URITokenID } = tx; + + return Localize.t('events.uriTokenBurnExplain', { tokenID: URITokenID }); + }, + + getRecipient: (tx: URITokenBurn, account: AccountModel): { address: string; tag?: number } => { + const { Account } = tx; + + if (Account.address !== account.address) { + return Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default URITokenBurnInfo; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenBurn/URITokenBurnValidation.ts b/src/common/libs/ledger/transactions/genuine/URITokenBurn/URITokenBurnValidation.ts new file mode 100644 index 000000000..5ddeb7589 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenBurn/URITokenBurnValidation.ts @@ -0,0 +1,12 @@ +// import URITokenBurn from './URITokenBurnClass'; + +/* Validator ==================================================================== */ +const URITokenBurnValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default URITokenBurnValidation; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenBurn/index.ts b/src/common/libs/ledger/transactions/genuine/URITokenBurn/index.ts new file mode 100644 index 000000000..e6bb9dd26 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenBurn/index.ts @@ -0,0 +1,3 @@ +export { default as URITokenBurn } from './URITokenBurnClass'; +export { default as URITokenBurnValidation } from './URITokenBurnValidation'; +export { default as URITokenBurnInfo } from './URITokenBurnInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenBuy/URITokenBuyClass.ts b/src/common/libs/ledger/transactions/genuine/URITokenBuy/URITokenBuyClass.ts new file mode 100644 index 000000000..69bc2b9ff --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenBuy/URITokenBuyClass.ts @@ -0,0 +1,56 @@ +import { get, isUndefined } from 'lodash'; + +import NetworkService from '@services/NetworkService'; + +import { Amount } from '@common/libs/ledger/parser/common'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { AmountType } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class URITokenBuy extends BaseTransaction { + public static Type = TransactionTypes.URITokenBuy as const; + public readonly Type = URITokenBuy.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = URITokenBuy.Type; + } + + this.fields = this.fields.concat(['URITokenID', 'Amount']); + } + + get URITokenID(): string { + return get(this, ['tx', 'URITokenID']); + } + + get Amount(): AmountType { + let amount = undefined as AmountType; + + amount = get(this, ['tx', 'Amount']); + + if (isUndefined(amount)) return undefined; + + if (typeof amount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), + }; + } + + return { + currency: amount.currency, + value: amount.value, + issuer: amount.issuer, + }; + } +} + +/* Export ==================================================================== */ +export default URITokenBuy; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenBuy/URITokenBuyInfo.ts b/src/common/libs/ledger/transactions/genuine/URITokenBuy/URITokenBuyInfo.ts new file mode 100644 index 000000000..57296bf40 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenBuy/URITokenBuyInfo.ts @@ -0,0 +1,35 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import URITokenBuy from './URITokenBuyClass'; + +/* Descriptor ==================================================================== */ +const URITokenBuyInfo = { + getLabel: (): string => { + return Localize.t('events.buyURIToken'); + }, + + getDescription: (tx: URITokenBuy): string => { + const { Account, Amount, URITokenID } = tx; + + return Localize.t('events.uriTokenBuyExplain', { + address: Account.address, + amount: Amount.value, + currency: Amount.currency, + tokenID: URITokenID, + }); + }, + + getRecipient: (tx: URITokenBuy, account: AccountModel): { address: string; tag?: number } => { + const { Account } = tx; + + if (Account.address !== account.address) { + return Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default URITokenBuyInfo; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenBuy/URITokenBuyValidation.ts b/src/common/libs/ledger/transactions/genuine/URITokenBuy/URITokenBuyValidation.ts new file mode 100644 index 000000000..a169942d6 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenBuy/URITokenBuyValidation.ts @@ -0,0 +1,12 @@ +// import URITokenBuy from './URITokenBuyClass'; + +/* Validator ==================================================================== */ +const URITokenBuyValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default URITokenBuyValidation; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenBuy/index.ts b/src/common/libs/ledger/transactions/genuine/URITokenBuy/index.ts new file mode 100644 index 000000000..1c735de28 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenBuy/index.ts @@ -0,0 +1,3 @@ +export { default as URITokenBuy } from './URITokenBuyClass'; +export { default as URITokenBuyValidation } from './URITokenBuyValidation'; +export { default as URITokenBuyInfo } from './URITokenBuyInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/URITokenCancelSellOfferClass.ts b/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/URITokenCancelSellOfferClass.ts new file mode 100644 index 000000000..972e676f4 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/URITokenCancelSellOfferClass.ts @@ -0,0 +1,30 @@ +import { get, isUndefined } from 'lodash'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class URITokenCancelSellOffer extends BaseTransaction { + public static Type = TransactionTypes.URITokenCancelSellOffer as const; + public readonly Type = URITokenCancelSellOffer.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = URITokenCancelSellOffer.Type; + } + + this.fields = this.fields.concat(['URITokenID']); + } + + get URITokenID(): string { + return get(this, ['tx', 'URITokenID']); + } +} + +/* Export ==================================================================== */ +export default URITokenCancelSellOffer; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/URITokenCancelSellOfferInfo.ts b/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/URITokenCancelSellOfferInfo.ts new file mode 100644 index 000000000..04ddb35a4 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/URITokenCancelSellOfferInfo.ts @@ -0,0 +1,31 @@ +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import URITokenCancelSellOffer from './URITokenCancelSellOfferClass'; + +/* Descriptor ==================================================================== */ +const URITokenCancelSellOfferInfo = { + getLabel: (): string => { + return Localize.t('events.cancelURITokenSellOffer'); + }, + + getDescription: (tx: URITokenCancelSellOffer): string => { + const { Account, URITokenID } = tx; + + return Localize.t('events.theTransactionWillCancelURITokenOffer', { + address: Account.address, + tokenId: URITokenID, + }); + }, + + getRecipient: (tx: URITokenCancelSellOffer, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default URITokenCancelSellOfferInfo; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/URITokenCancelSellOfferValidation.ts b/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/URITokenCancelSellOfferValidation.ts new file mode 100644 index 000000000..8e1512984 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/URITokenCancelSellOfferValidation.ts @@ -0,0 +1,12 @@ +// import URITokenCancelSellOffer from './URITokenCancelSellOfferClass'; + +/* Validator ==================================================================== */ +const URITokenCancelSellOfferValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default URITokenCancelSellOfferValidation; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/index.ts b/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/index.ts new file mode 100644 index 000000000..ad88a885b --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenCancelSellOffer/index.ts @@ -0,0 +1,3 @@ +export { default as URITokenCancelSellOffer } from './URITokenCancelSellOfferClass'; +export { default as URITokenCancelSellOfferValidation } from './URITokenCancelSellOfferValidation'; +export { default as URITokenCancelSellOfferInfo } from './URITokenCancelSellOfferInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/URITokenCreateSellOfferClass.ts b/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/URITokenCreateSellOfferClass.ts new file mode 100644 index 000000000..3ea2525c3 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/URITokenCreateSellOfferClass.ts @@ -0,0 +1,67 @@ +import { get, isUndefined } from 'lodash'; + +import NetworkService from '@services/NetworkService'; + +import { Amount } from '@common/libs/ledger/parser/common'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { AmountType, Destination } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class URITokenCreateSellOffer extends BaseTransaction { + public static Type = TransactionTypes.URITokenCreateSellOffer as const; + public readonly Type = URITokenCreateSellOffer.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = URITokenCreateSellOffer.Type; + } + + this.fields = this.fields.concat(['URITokenID', 'Amount', 'Destination']); + } + + get URITokenID(): string { + return get(this, ['tx', 'URITokenID']); + } + + get Amount(): AmountType { + let amount = undefined as AmountType; + + amount = get(this, ['tx', 'Amount']); + + if (isUndefined(amount)) return undefined; + + if (typeof amount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), + }; + } + + return { + currency: amount.currency, + value: amount.value, + issuer: amount.issuer, + }; + } + + get Destination(): Destination { + const destination = get(this, ['tx', 'Destination'], undefined); + + if (isUndefined(destination)) return undefined; + + return { + address: destination, + tag: undefined, + }; + } +} + +/* Export ==================================================================== */ +export default URITokenCreateSellOffer; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/URITokenCreateSellOfferInfo.ts b/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/URITokenCreateSellOfferInfo.ts new file mode 100644 index 000000000..d9a5378f3 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/URITokenCreateSellOfferInfo.ts @@ -0,0 +1,43 @@ +import { isUndefined } from 'lodash'; +import { AccountModel } from '@store/models'; + +import Localize from '@locale'; + +import URITokenCreateSellOffer from './URITokenCreateSellOfferClass'; + +/* Descriptor ==================================================================== */ +const URITokenCreateSellOfferInfo = { + getLabel: (): string => { + return Localize.t('events.createURITokenSellOffer'); + }, + + getDescription: (tx: URITokenCreateSellOffer): string => { + const { Account, URITokenID, Destination, Amount } = tx; + + let content = Localize.t('events.uriTokenSellOfferExplain', { + address: Account.address, + uriToken: URITokenID, + value: Amount.value, + currency: Amount.currency, + }); + + if (!isUndefined(Destination)) { + content += '\n'; + content += Localize.t('events.thisURITokenOfferMayOnlyBeAcceptedBy', { + address: Destination.address, + }); + } + + return content; + }, + + getRecipient: (tx: URITokenCreateSellOffer, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default URITokenCreateSellOfferInfo; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/URITokenCreateSellOfferValidation.ts b/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/URITokenCreateSellOfferValidation.ts new file mode 100644 index 000000000..acb2a6481 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/URITokenCreateSellOfferValidation.ts @@ -0,0 +1,12 @@ +// import URITokenCreateSellOffer from './URITokenCreateSellOfferClass'; + +/* Validator ==================================================================== */ +const URITokenCreateSellOfferValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default URITokenCreateSellOfferValidation; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/index.ts b/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/index.ts new file mode 100644 index 000000000..2318481fc --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenCreateSellOffer/index.ts @@ -0,0 +1,3 @@ +export { default as URITokenCreateSellOffer } from './URITokenCreateSellOfferClass'; +export { default as URITokenCreateSellOfferValidation } from './URITokenCreateSellOfferValidation'; +export { default as URITokenCreateSellOfferInfo } from './URITokenCreateSellOfferInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenMint/URITokenMintClass.ts b/src/common/libs/ledger/transactions/genuine/URITokenMint/URITokenMintClass.ts new file mode 100644 index 000000000..a023cef30 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenMint/URITokenMintClass.ts @@ -0,0 +1,71 @@ +import { get, isUndefined } from 'lodash'; + +import NetworkService from '@services/NetworkService'; + +import { Amount } from '@common/libs/ledger/parser/common'; + +import BaseTransaction from '@common/libs/ledger/transactions/genuine/BaseTransaction'; + +/* Types ==================================================================== */ +import { AmountType, Destination } from '@common/libs/ledger/parser/types'; +import { TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/* Class ==================================================================== */ +class URITokenMint extends BaseTransaction { + public static Type = TransactionTypes.URITokenMint as const; + public readonly Type = URITokenMint.Type; + + constructor(tx?: TransactionJSONType, meta?: any) { + super(tx, meta); + + // set transaction type if not set + if (isUndefined(this.TransactionType)) { + this.TransactionType = URITokenMint.Type; + } + + this.fields = this.fields.concat(['URI', 'Digest', 'Amount', 'Destination']); + } + + get URI(): string { + return get(this, ['tx', 'URI']); + } + + get Digest(): string { + return get(this, ['tx', 'Digest']); + } + + get Amount(): AmountType { + let amount = undefined as AmountType; + + amount = get(this, ['tx', 'Amount']); + + if (isUndefined(amount)) return undefined; + + if (typeof amount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), + }; + } + + return { + currency: amount.currency, + value: amount.value, + issuer: amount.issuer, + }; + } + + get Destination(): Destination { + const destination = get(this, ['tx', 'Destination'], undefined); + + if (isUndefined(destination)) return undefined; + + return { + address: destination, + tag: undefined, + }; + } +} + +/* Export ==================================================================== */ +export default URITokenMint; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenMint/URITokenMintInfo.ts b/src/common/libs/ledger/transactions/genuine/URITokenMint/URITokenMintInfo.ts new file mode 100644 index 000000000..59adee12c --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenMint/URITokenMintInfo.ts @@ -0,0 +1,53 @@ +import { isUndefined } from 'lodash'; +import { AccountModel } from '@store/models'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import Localize from '@locale'; + +import URITokenMint from './URITokenMintClass'; + +/* Descriptor ==================================================================== */ +const URITokenMintInfo = { + getLabel: (): string => { + return Localize.t('events.mintURIToken'); + }, + + getDescription: (tx: URITokenMint): string => { + const { URI, Digest, Amount, Destination } = tx; + + let content = Localize.t('events.theURIForThisTokenIs', { uri: URI }); + + if (!isUndefined(Digest)) { + content += '\n'; + content += Localize.t('events.theTokenHasADigest', { digest: Digest }); + } + + if (!isUndefined(Amount)) { + content += '\n'; + content += Localize.t('events.uriTokenMintAmount', { + value: Amount.value, + currency: NormalizeCurrencyCode(Amount.currency), + }); + } + + if (!isUndefined(Destination)) { + content += '\n'; + content += Localize.t('events.uriTokenDestinationExplain', { + address: Destination.address, + }); + } + + return content; + }, + + getRecipient: (tx: URITokenMint, account: AccountModel): { address: string; tag?: number } => { + if (tx.Account.address !== account.address) { + return tx.Account; + } + return undefined; + }, +}; + +/* Export ==================================================================== */ +export default URITokenMintInfo; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenMint/URITokenMintValidation.ts b/src/common/libs/ledger/transactions/genuine/URITokenMint/URITokenMintValidation.ts new file mode 100644 index 000000000..17b85cb86 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenMint/URITokenMintValidation.ts @@ -0,0 +1,12 @@ +// import URITokenMint from './URITokenMintClass'; + +/* Validator ==================================================================== */ +const URITokenMintValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default URITokenMintValidation; diff --git a/src/common/libs/ledger/transactions/genuine/URITokenMint/index.ts b/src/common/libs/ledger/transactions/genuine/URITokenMint/index.ts new file mode 100644 index 000000000..01fed0467 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/URITokenMint/index.ts @@ -0,0 +1,3 @@ +export { default as URITokenMint } from './URITokenMintClass'; +export { default as URITokenMintValidation } from './URITokenMintValidation'; +export { default as URITokenMintInfo } from './URITokenMintInfo'; diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/Import.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/Import.test.ts new file mode 100644 index 000000000..bfbc01d2a --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/Import.test.ts @@ -0,0 +1,57 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { Import, ImportInfo } from '../Import'; + +import importTemplate from './fixtures/ImportTx.json'; + +jest.mock('@services/NetworkService'); + +describe('Import ', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new Import(); + expect(instance.TransactionType).toBe('Import'); + expect(instance.Type).toBe('Import'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = importTemplate.RegularKey; + const instance = new Import(tx, meta); + + expect(instance.TransactionType).toBe('Import'); + expect(instance.Type).toBe('Import'); + + expect(instance.Blob).toBe( + '7B226C6564676572223A7B226163726F6F74223A2231394337303837314142443136354331424132323830433639433137443332423838303042313035333245443338414233423331383341324137373832433446222C22636C6F7365223A3734393931393335322C22636F696E73223A223939393939393939393839393939393634222C2263726573223A31302C22666C616773223A302C22696E646578223A3130352C2270636C6F7365223A3734393931393335312C227068617368223A2235314537454336314441354530444632413442443839353633443244434534353531354435464132364334333235334341323046303134363534464442433237222C227478726F6F74223A2245393634323543334135454235453543334538353846314641393039343546433733443836384542413846373444324544324243324333334338414230414541227D2C227472616E73616374696F6E223A7B22626C6F62223A22313230303035323230303030303030303234303030303030313232303142303030303030374332303144303030303533353936383430303030303030303039383936383037333231303236393141433541453143344333333341453544463841393342444334393546304545424643364442304441374542364546383038463341464330303645334645373434373330343530323231303041453230343237354537433434314543443544414531383530454534413332364442364338443938424535343534304645304536414434374143444441443738303232303133374638424336423433453846333138344246433034324132373345464131333439373741453334433034423039313945414641453933424137383536314338313134414531323341383535364633434639313135343731313337364146423046383934463833324233443838313446353144464332413039443632434242413144464244443436393144414339364144393842393046222C226D657461223A2232303143303030303030303046384535313130303631323530303030303036383535314630393343333446433832344642323839313730333133443641314241353636464439414133393731393746354343424541383443424539433536443133423536393246413641394643384541363031384435443136353332443737393543393142464230383331333535424446444131373745383643384246393937393835464536323430303030303031323632343030303030303037373335393346344531453732323030303130303030323430303030303031333244303030303030303036323430303030303030373639434644373438313134414531323341383535364633434639313135343731313337364146423046383934463833324233443838313446353144464332413039443632434242413144464244443436393144414339364144393842393046453145314631303331303030222C2270726F6F66223A7B226368696C6472656E223A7B2230223A7B226368696C6472656E223A7B7D2C2268617368223A2241333434354643343645353432463533374645423344414336374139453536453638324546464642343034303132444236333341303443384637384135333533222C226B6579223A2230313138353231313841424344363244414534373034463334354431384144303044323146344344413338343432434546354135354130413838453336443136227D7D2C2268617368223A2245393634323543334135454235453543334538353846314641393039343546433733443836384542413846373444324544324243324333334338414230414541222C226B6579223A2230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030227D7D2C2276616C69646174696F6E223A7B2264617461223A7B226E394B417566666D677268585736777A676B354D476945445751583961435162627A6362636159635362586677394769516E7575223A223232383030303030303132363030303030303639323932434232444337413341384239314338433145374245383234353531423730454333443438373630464530443243383732443132454538454644394643323136353231324234323137434336463943324234364639334437363241313530313730373931333536433037393241373643433134303345383337424431353046384538394438353230413334374638464632323434303545434339463046384531353031393531453745433631444135453044463241344244383935363344324443453435353135443546413236433433323533434132304630313436353446444243323737333231303242384434373943383245334637383734423239333646383837333246374141353835414539423643333241393239453445394143444232383131433839424331373634363330343430323230344336423637363342394445454437453742363545384245443538334645463039333338364646334338304235324544433936384244463331464441453035313032323036384645413442423539413545453235363836444442463337423344343934453534444245444342324545363443344639343538313232444234334335303841222C226E394C796B5577724A59354D69366477694E31686B76343466316E616251694A5354715173353144657A6262765A616D744E7259223A223232383030303030303132363030303030303639323932434232444337413341453341343235434135413641423137423531423730454333443438373630464530443243383732443132454538454644394643323136353231324234323137434336463943324234364639334437363241313530313730373931333536433037393241373643433134303345383337424431353046384538394438353230413334374638464632323434303545434339463046384531353031393531453745433631444135453044463241344244383935363344324443453435353135443546413236433433323533434132304630313436353446444243323737333231303334304237453832383032333738394246343836453445353136334644433338363346464635464246354243334246453735363543334234354142383230324630373634363330343430323230354334343043393936344232433142384441334633364437344137423934363132434144353834354139364136423146413434334635454434393046373137383032323035413832464137463042393532413739373330454637374544373535393738323846333738374136423441373942363432433045363735444234453043324337227D2C22756E6C223A7B22626C6F62223A2265794A7A5A5846315A57356A5A5349364D5377695A58687761584A6864476C76626949364E7A55774E6A67794D7A4D794C434A32595778705A47463062334A7A496A706265794A32595778705A4746306157397558334231596D7870593139725A586B694F694A4652444D79526A56424E5546474D6B49304E4552454D3055794D4551774D454D784E7A46424D446842524555344E546B344E4459335155457A516A6C454E454D78526A63354D3055344E7A5A454E6A45314E44513052544D694C434A74595735705A6D567A64434936496B704251554642515570345357557765546C6856335A4C4D46526B55476C455555524359324644537A4E7656316C53626E467164575255516A6B315547396B64466C57556B55304D30316F51584A715657566A5A3356514D3267776333424F646D6C4954585A6C63566447636E423063303178613341315432317A4D6E6C6E556E6C4B646B4A6B61324E33556C464A6145464B62574A684F455255636D7871535374325A5531314E6C684E4D6A5935524759304D6B6B3561537470526C46734D544E5A5A69745255304A4451576C435A7A4E4C53474646624338794E546C5954574A4D57476472593168764E585233646E517963544E36575464574E575A47616A5A7661475A7357474E4D5A47307861474D7A556D786A61545671596A4978643056725130395355553553646E51774C304A77516B564853444E735247684C596E5A4E61586C7655584A6C4F4735514F446443656938794D6E703653326F766447353453453146536A467A634864524D6D39794C32746854556875626D52455A45684A6353746F4E6D6C5164455579526B567161304D6966537837496E5A6862476C6B59585270623235666348566962476C6A5832746C65534936496B56454D6A4D35525445314E7A59334D6A41344E544130515445335154464251304D784F554A434D5468474F5445334F444D78526B46434E30497A526A6B7A4F4551344D6A4A464E6B4D35526A6730526A46444F5455354D534973496D3168626D6C6D5A584E30496A6F69536B464251554642536E684A5A544271626D68574D6D4E6E614646546147566F636B3148596E4E5A4B314A6C52456732644464514E55394F5A326B316332343056486835566D7459545768424D454D7A4E6B4E6E5130343062533954527A5650565664514F586330575338764D537376567A68504C7A5578576D4E504D4664795A32644D643252725933645355556C6F51557735624578614E325976633156785A303942556B786852576331564452555430393663484A4F5179394F616B5132565563346358685A526C4E4261554A574C316C52656E6C7263464A5664325234656D746F4F48557A4E6D5A305A5656754E7A4A31613074476244465A537A5642515777334B3274595930746B62545632576B645665457874546E5A6957454654555555355157564F56446448565846575356637A5A546C6C516C4E334D3345794D30466C5A48564E62574E7054567032596D7077626B704661564130566C42594E55523157566C685758427453446C35626A417A4E587072595755785433643355455A50597A6876556C45725358467A6333647A50534A395858303D222C226D616E6966657374223A224A414141414146784965313031414E735A5A476B76666E46544F2B6A6D356C7158633566687445663268683053427A703161484E77584D6837544E392B623632635A71546E67614659553574624770594843386F59754933473376776A394F57325A3967646B416E556A6659357A4F456B687133317455343333386A637955705641352F565473414E46636537756E446F2B4A65566F456866754F622F593857413344697539587A754F4434552F696B66676639535A4F6C4F47634263424A41773434504C6A482B485574456E775834356C49526D6F30783561494E464D765A7342704539517465534442584B77597A4C646E5357346531627332316F2B49494C4A4969494B552F2B315578783046527051624D44413D3D222C227075626C69635F6B6579223A22454437344434303336433635393141344244463943353443454641333942393936413544434535463836443131464441313837343438314345394435413143444331222C227369676E6174757265223A223841444644373231393246313436394444313432314632423542323831333243303133363446384636453232333334363634304144463335464546363433343045393145464332413543373743333835363044423037443142303041313039303244354545303832433843314634363338413238384234353843343643333045222C2276657273696F6E223A317D7D7D', + ); + expect(instance.Issuer).toBe('rrrrrrrrrrrrrrrrrrrrrholvtp'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = importTemplate.RegularKey; + const instance = new Import(tx, meta); + + const expectedDescription = `${Localize.t('events.importTransactionExplain')}\n${Localize.t( + 'events.theIssuerIs', + { issuer: instance.Issuer }, + )}`; + + expect(ImportInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(ImportInfo.getLabel()).toEqual(Localize.t('events.import')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/accountDelete.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/accountDelete.test.ts new file mode 100644 index 000000000..31394017c --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/accountDelete.test.ts @@ -0,0 +1,174 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; +import LedgerService from '@services/LedgerService'; + +import { AccountDelete, AccountDeleteInfo, AccountDeleteValidation } from '../AccountDelete'; +import txTemplates from './fixtures/AccountDeleteTx.json'; + +jest.mock('@services/LedgerService'); +jest.mock('@services/NetworkService'); + +describe('AccountDelete', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new AccountDelete(); + expect(instance.TransactionType).toBe('AccountDelete'); + expect(instance.Type).toBe('AccountDelete'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = txTemplates; + const instance = new AccountDelete(tx, meta); + + expect(instance.Amount).toStrictEqual({ + currency: 'XRP', + value: '15.00102', + }); + + expect(instance.Destination).toStrictEqual({ + tag: 0, + address: 'rDestinationxxxxxxxxxxxxxxxxxxxxxx', + }); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = txTemplates; + const instance = new AccountDelete(tx, meta); + + const expectedDescription = `${Localize.t('events.itDeletedAccount', { + address: 'rAccountxxxxxxxxxxxxxxxxxxxxxxxxxx', + })}\n\n${Localize.t('events.itWasInstructedToDeliverTheRemainingBalanceOf', { + amount: '15.00102', + currency: 'XRP', + destination: 'rDestinationxxxxxxxxxxxxxxxxxxxxxx', + })}\n${Localize.t('events.theTransactionHasASourceTag', { tag: 1337 })}\n${Localize.t( + 'events.theTransactionHasADestinationTag', + { tag: 0 }, + )}`; + + expect(AccountDeleteInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(AccountDeleteInfo.getLabel()).toEqual(Localize.t('events.deleteAccount')); + }); + }); + }); + + describe('Validation', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should reject if account and destination are the same', async () => { + const { tx, meta } = txTemplates; + const instance = new AccountDelete( + { + ...tx, + ...{ + Account: 'rxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', + Destination: 'rxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', + }, + }, + meta, + ); + + expect.assertions(1); + try { + await AccountDeleteValidation(instance); + } catch (error: any) { + expect(error.message).toEqual(Localize.t('account.destinationAccountAndSourceCannotBeSame')); + } + }); + + it('should reject if account has blocker objects', async () => { + const { tx, meta } = txTemplates; + const instance = new AccountDelete(tx, meta); + + // @ts-ignore + jest.spyOn(LedgerService, 'getAccountBlockerObjects').mockResolvedValueOnce([{ LedgerEntryType: 'Offer' }]); + expect.assertions(1); + try { + await AccountDeleteValidation(instance); + } catch (error: any) { + expect(error.message).toEqual(Localize.t('account.deleteAccountObjectsExistError')); + } + }); + + it('should reject if account sequence is not enough', async () => { + const { tx, meta } = txTemplates; + const instance = new AccountDelete(tx, meta); + + const accountSequence = 10; + const lastLedger = 5; + + jest.spyOn(LedgerService, 'getAccountSequence').mockResolvedValueOnce(accountSequence); + jest.spyOn(LedgerService, 'getLedgerStatus').mockReturnValueOnce({ Fee: 15, LastLedger: lastLedger }); + expect.assertions(1); + try { + await AccountDeleteValidation(instance); + } catch (error: any) { + expect(error.message).toEqual( + Localize.t('account.deleteAccountSequenceIsNotEnoughError', { + remainingSequence: accountSequence + 256 - lastLedger, + }), + ); + } + }); + + it('should reject if destination account is not activated', async () => { + const { tx, meta } = txTemplates; + const instance = new AccountDelete(tx, meta); + + // @ts-ignore + jest.spyOn(LedgerService, 'getAccountInfo').mockResolvedValueOnce({ error: 'accountNotFound' }); + expect.assertions(1); + try { + await AccountDeleteValidation(instance); + } catch (error: any) { + expect(error.message).toEqual(Localize.t('account.destinationAccountIsNotActivated')); + } + }); + + it('should reject if destination account requires destination tag but tag is not provided', async () => { + const { tx, meta } = txTemplates; + const instance = new AccountDelete({ ...tx, DestinationTag: undefined }, meta); + + // @ts-ignore + jest.spyOn(LedgerService, 'getAccountInfo').mockResolvedValueOnce({ + account_flags: { requireDestinationTag: true }, + }); + expect.assertions(1); + try { + await AccountDeleteValidation(instance); + } catch (error: any) { + expect(error.message).toEqual(Localize.t('account.destinationAddressRequiredDestinationTag')); + } + }); + + it('should resolve if all conditions are met', async () => { + const { tx, meta } = txTemplates; + const instance = new AccountDelete(tx, meta); + + jest.spyOn(LedgerService, 'getAccountBlockerObjects').mockResolvedValueOnce([]); + jest.spyOn(LedgerService, 'getAccountSequence').mockResolvedValueOnce(10); + // @ts-ignore + jest.spyOn(LedgerService, 'getAccountInfo').mockResolvedValueOnce({ + account_flags: { requireDestinationTag: false }, + }); + try { + await AccountDeleteValidation(instance); + } catch { + // should not throw an error + expect(true).toBe(true); + } + }); + }); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/accountSet.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/accountSet.test.ts new file mode 100644 index 000000000..c3d1e55f8 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/accountSet.test.ts @@ -0,0 +1,142 @@ +import Localize from '@locale'; + +import { AccountSet, AccountSetInfo } from '../AccountSet'; +import txTemplates from './fixtures/AccountSetTx.json'; + +jest.mock('@services/LedgerService'); +jest.mock('@services/NetworkService'); + +describe('AccountSet', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new AccountSet(); + expect(instance.TransactionType).toBe('AccountSet'); + expect(instance.Type).toBe('AccountSet'); + }); + + it('Should return right parsed values', () => { + const { + Set: { tx }, + } = txTemplates; + const instance = new AccountSet(tx); + + expect(instance.Domain).toBe('example.com'); + expect(instance.MessageKey).toBe('03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB'); + expect(instance.SetFlag).toBe('asfAccountTxnID'); + expect(instance.ClearFlag).toBe('asfDisableMaster'); + expect(instance.EmailHash).toBe('0bc83cb571cd1c50ba6f3e8a78ef1346'); + expect(instance.TransferRate).toBe(0.2); + expect(instance.TickSize).toBe(0); + expect(instance.NFTokenMinter).toBe('rMinterxxxxxxxxxxxxxxxxxxxxxxxxxx'); + expect(instance.WalletLocator).toBe('ABCDEF123456789'); + expect(instance.WalletSize).toBe(1337); + }); + }); + + describe('Info', () => { + it('NoOperation', () => { + const { + Set: { tx }, + } = txTemplates; + const instance = new AccountSet({ + ...tx, + ...{ + SetFlag: undefined, + ClearFlag: undefined, + Domain: undefined, + EmailHash: undefined, + MessageKey: undefined, + TransferRate: undefined, + TickSize: undefined, + NFTokenMinter: undefined, + WalletLocator: undefined, + WalletSize: undefined, + }, + }); + + const expectedDescription = `${Localize.t('events.thisIsAnAccountSetTransaction')}\n${Localize.t( + 'events.thisTransactionDoesNotEffectAnyAccountSettings', + )}`; + + expect(AccountSetInfo.getDescription(instance)).toEqual(expectedDescription); + }); + + it('CancelTicket', () => { + const { + Set: { tx }, + } = txTemplates; + const instance = new AccountSet({ + ...tx, + ...{ + TicketSequence: 1337, + Sequence: 0, + SetFlag: undefined, + ClearFlag: undefined, + Domain: undefined, + EmailHash: undefined, + MessageKey: undefined, + TransferRate: undefined, + TickSize: undefined, + NFTokenMinter: undefined, + WalletLocator: undefined, + WalletSize: undefined, + }, + }); + + const expectedDescription = `${Localize.t('events.thisIsAnAccountSetTransaction')}\n${Localize.t( + 'events.thisTransactionClearTicket', + { ticketSequence: instance.TicketSequence }, + )}`; + + expect(AccountSetInfo.getDescription(instance)).toEqual(expectedDescription); + }); + + it('Set', () => { + const { + Set: { tx }, + } = txTemplates; + const instance = new AccountSet(tx); + + const expectedDescription = `${Localize.t('events.thisIsAnAccountSetTransaction')}\n${Localize.t( + 'events.itSetsAccountDomainTo', + { domain: instance.Domain }, + )}\n${Localize.t('events.itSetsAccountEmailHashTo', { emailHash: instance.EmailHash })}\n${Localize.t( + 'events.itSetsAccountMessageKeyTo', + { messageKey: instance.MessageKey }, + )}\n${Localize.t('events.itSetsAccountTransferRateTo', { + transferRate: instance.TransferRate, + })}\n${Localize.t('events.itSetsAccountMinterTo', { minter: instance.NFTokenMinter })}\n${Localize.t( + 'events.itSetsTheAccountFlag', + { flag: instance.SetFlag }, + )}\n${Localize.t('events.itClearsTheAccountFlag', { flag: instance.ClearFlag })}\n${Localize.t( + 'events.itSetsAccountWalletLocatorTo', + { + walletLocator: instance.WalletLocator, + }, + )}\n${Localize.t('events.itSetsAccountWalletSizeTo', { walletSize: instance.WalletSize })}`; + + expect(AccountSetInfo.getDescription(instance)).toEqual(expectedDescription); + }); + + it('Clear', () => { + const { + Clear: { tx }, + } = txTemplates; + const instance = new AccountSet(tx); + + const expectedDescription = `${Localize.t('events.thisIsAnAccountSetTransaction')}\n${Localize.t( + 'events.itRemovesTheAccountDomain', + )}\n${Localize.t('events.itRemovesTheAccountEmailHash')}\n${Localize.t( + 'events.itRemovesTheAccountMessageKey', + )}\n${Localize.t('events.itRemovesTheAccountTransferRate')}\n${Localize.t( + 'events.itRemovesTheAccountMinter', + )}\n${Localize.t('events.itRemovesTheAccountWalletLocator')}\n${Localize.t( + 'events.itRemovesTheAccountWalletSize', + )}`; + + expect(AccountSetInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/base.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/base.test.ts new file mode 100644 index 000000000..29647ddd0 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/base.test.ts @@ -0,0 +1,370 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import LedgerService from '@services/LedgerService'; +import NetworkService from '@services/NetworkService'; + +import { TransactionTypes } from '../../../types'; + +import BaseTransaction from '../BaseTransaction'; + +import Memo from '../../../parser/common/memo'; +import { txFlags } from '../../../parser/common/flags/txFlags'; + +import txTemplates from './fixtures/BaseTx.json'; +import paymentTemplates from './fixtures/PaymentTx.json'; +import invokeTemplate from './fixtures/InvokeTx.json'; + +jest.mock('@services/NetworkService'); + +describe('BaseTransaction', () => { + describe('Set & Get', () => { + it('Should return right parsed values for all fields', () => { + const { tx, meta } = txTemplates; + + const instance = new BaseTransaction(tx, meta); + + expect(instance.Account).toStrictEqual({ + tag: 456, + address: tx.Account, + }); + expect(instance.Memos).toStrictEqual([ + { MemoData: 'XRP Tip Bot', MemoFormat: undefined, MemoType: 'XrpTipBotNote' }, + ]); + expect(instance.Fee).toBe('0.000012'); + expect(instance.Date).toBe('2020-09-02T07:24:11.000Z'); + expect(instance.Hash).toBe(tx.hash); + expect(instance.SigningPubKey).toBe(tx.SigningPubKey); + expect(instance.LedgerIndex).toBe(tx.ledger_index); + expect(instance.LastLedgerSequence).toBe(tx.LastLedgerSequence); + expect(instance.Sequence).toBe(tx.Sequence); + expect(instance.TxnSignature).toBe(tx.TxnSignature); + expect(instance.NetworkID).toBe(tx.NetworkID); + expect(instance.OperationLimit).toBe(tx.OperationLimit); + expect(instance.EmitDetails).toBe(tx.EmitDetails); + expect(instance.FirstLedgerSequence).toBe(tx.FirstLedgerSequence); + expect(instance.TicketSequence).toBe(tx.TicketSequence); + expect(instance.Flags).toStrictEqual({ FullyCanonicalSig: true }); + expect(instance.Signers).toStrictEqual( + tx.Signers.flatMap((item) => { + return { + account: item.Signer.Account, + signature: item.Signer.TxnSignature, + pubKey: item.Signer.SigningPubKey, + }; + }), + ); + expect(instance.HookParameters).toStrictEqual(tx.HookParameters); + expect(instance.TransactionResult).toStrictEqual({ + success: true, + code: 'tesSUCCESS', + message: undefined, + }); + }); + + it('Should Set/Get common fields', () => { + const instance = new BaseTransaction(); + + instance.TransactionType = TransactionTypes.Payment; + expect(instance.TransactionType).toBe(TransactionTypes.Payment); + + instance.Account = { + address: 'rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY', + tag: 456, + }; + expect(instance.Account).toStrictEqual({ + tag: 456, + address: 'rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY', + }); + + instance.Memos = []; + expect(instance.Memos).toBeUndefined(); + instance.Memos = [Memo.Encode('Memo Description')]; + expect(instance.Memos).toStrictEqual([ + { MemoData: 'Memo Description', MemoFormat: 'text/plain', MemoType: 'Description' }, + ]); + + instance.Fee = '0.000012'; + expect(instance.Fee).toBe('0.000012'); + + instance.Hash = '7F10793B5781BD5DD52F70096520321A08DD2ED19AFC7E3F193AAC293954F7DF'; + expect(instance.Hash).toBe('7F10793B5781BD5DD52F70096520321A08DD2ED19AFC7E3F193AAC293954F7DF'); + + instance.Sequence = 34306; + expect(instance.Sequence).toBe(34306); + + instance.LastLedgerSequence = 57913677; + expect(instance.LastLedgerSequence).toBe(57913677); + + instance.SigningPubKey = '03DF3AB842EB1B57F0A848CD7CC2CFD35F66E4AD0625EEACFFE72A45E4D13E49A'; + expect(instance.SigningPubKey).toBe('03DF3AB842EB1B57F0A848CD7CC2CFD35F66E4AD0625EEACFFE72A45E4D13E49A'); + + instance.FirstLedgerSequence = 1; + expect(instance.FirstLedgerSequence).toBe(1); + + instance.OperationLimit = 1337; + expect(instance.OperationLimit).toBe(1337); + + instance.NetworkID = 0; + expect(instance.NetworkID).toBe(0); + + instance.TicketSequence = 123; + expect(instance.TicketSequence).toBe(123); + + instance.TransactionIndex = 1; + expect(instance.TransactionIndex).toBe(1); + + instance.LedgerIndex = 1337; + expect(instance.LedgerIndex).toBe(1337); + + instance.TxnSignature = 'TxnSignature'; + expect(instance.TxnSignature).toBe('TxnSignature'); + + instance.PreviousTxnID = '7F10793B5781BD5DD52F70096520321A08DD2ED19AFC7E3F193AAC293954F7DF'; + expect(instance.PreviousTxnID).toBe('7F10793B5781BD5DD52F70096520321A08DD2ED19AFC7E3F193AAC293954F7DF'); + + instance.Signers = [ + { + Signer: { + Account: 'rSignerxxxxxxxxxxxxxxxxxxxxxxxxxx', + TxnSignature: 'TxnSignature', + SigningPubKey: 'SigningPubKey', + }, + }, + ]; + expect(instance.Signers).toStrictEqual([ + { + account: 'rSignerxxxxxxxxxxxxxxxxxxxxxxxxxx', + signature: 'TxnSignature', + pubKey: 'SigningPubKey', + }, + ]); + + instance.Flags = [txFlags.Payment.PartialPayment, txFlags.Payment.LimitQuality]; + expect(instance.Flags).toStrictEqual({ + PartialPayment: true, + FullyCanonicalSig: false, + LimitQuality: true, + NoRippleDirect: false, + }); + }); + + it('should return an tx json with only the allowed fields', () => { + const txData = { + TransactionType: 'Payment', + Amount: 1337, + RegularKey: 'rAccountxxxxxxxxxxxxxxxxxxxxxxxxxx', + }; + const allowedFields = ['TransactionType', 'Amount']; + + const transaction = new BaseTransaction(txData); + // @ts-ignore + transaction.fields = allowedFields; + const jsonResult = transaction.Json; + + expect(jsonResult).toEqual({ TransactionType: 'Payment', Amount: 1337 }); + }); + + it('Should return the ctid from tx if present', () => { + const { tx, meta } = invokeTemplate; + const instance = new BaseTransaction(tx, meta); + expect(instance.CTID).toBe('C000002D00005359'); + }); + + it('Should be able to generate the right CTID', () => { + const { tx, meta } = paymentTemplates.XRP2XRP; + const instance = new BaseTransaction(tx, meta); + expect(instance.CTID).toBe('C373B14A00040000'); + }); + }); + + describe('Prepare & Signing', () => { + it('Should return right transaction result', () => { + const instance = new BaseTransaction(); + + // transaction already verified by network + // @ts-ignore + instance.meta.TransactionResult = 'tesSUCCESS'; + + expect(instance.TransactionResult).toStrictEqual({ + success: true, + code: 'tesSUCCESS', + message: undefined, + }); + + // transaction is not verified by network and failed + // @ts-ignore + instance.meta.TransactionResult = 'tecNO_LINE_INSUF_RESERVE'; + + instance.SubmitResult = { + success: true, + engineResult: 'tecNO_LINE_INSUF_RESERVE', + message: 'No such line. Too little reserve to create it.', + network: { + id: 0, + node: 'wss://xrplcluster.com', + type: 'Mainnet', + key: 'MAINNET', + }, + }; + + instance.VerifyResult = { + success: false, + }; + + expect(instance.TransactionResult).toStrictEqual({ + success: false, + code: 'tecNO_LINE_INSUF_RESERVE', + message: 'No such line. Too little reserve to create it.', + }); + + // transaction is not verified by network and hard failed + // @ts-ignore + instance.meta.TransactionResult = undefined; + + instance.SubmitResult = { + success: false, + engineResult: 'temBAD_FEE', + message: 'temBAD_FEE description', + network: { + id: 0, + node: 'wss://xrplcluster.com', + type: 'Mainnet', + key: 'MAINNET', + }, + }; + + instance.VerifyResult = { + success: false, + }; + + expect(instance.TransactionResult).toStrictEqual({ + success: false, + code: 'temBAD_FEE', + message: 'temBAD_FEE description', + }); + }); + + it('Should be able to prepare the transaction for signing', async () => { + const address = 'rEAa7TDpBdL1hoRRAp3WDmzBcuQzaXssmb'; + + // mock the ledger service response + const spy = jest.spyOn(LedgerService, 'getAccountInfo').mockImplementation(() => + Promise.resolve({ + account_data: { + Account: address, + Balance: '49507625423', + Flags: 131072, + OwnerCount: 1135, + PreviousTxnID: '48DB4C987EDE802030089C48F27FF7A0F589EBA7C3A9F90873AA030D5960F149', + PreviousTxnLgrSeq: 58057100, + Sequence: 34321, + }, + networkId: 0, + }), + ); + + // create a transaction instance for signing + const { tx, meta } = paymentTemplates.SimplePayment; + const instance = new BaseTransaction(tx, meta); + + // prepare the transaction by applying the private key + await instance.prepare(undefined); + + // run test to check if it properly prepared transaction + expect(instance.Account).toStrictEqual({ + tag: undefined, + address, + }); + + // should set the sequence number + expect(instance.Sequence).toBe(34321); + + spy.mockRestore(); + }); + + it('Should be able to populate the transaction LastLedgerSequence', async () => { + const LastLedger = 68312096; + + // mock the ledger service response + const spy = jest.spyOn(LedgerService, 'getLedgerStatus').mockImplementation(() => { + return { Fee: 12, LastLedger }; + }); + + // should set if LastLedgerSequence undefined + const { tx, meta } = paymentTemplates.SimplePayment; + const instance = new BaseTransaction(tx, meta); + instance.LastLedgerSequence = undefined; + instance.populateFields(); + expect(instance.LastLedgerSequence).toBe(LastLedger + 10); + + // should update LastLedgerSequence if sequence is passed + instance.LastLedgerSequence = LastLedger - 500; + instance.populateFields(); + expect(instance.LastLedgerSequence).toBe(LastLedger + 10); + + // should update LastLedgerSequence if sequence is less than 32570 + instance.LastLedgerSequence = 50; + instance.populateFields(); + expect(instance.LastLedgerSequence).toBe(LastLedger + 50); + + spy.mockRestore(); + }); + + describe('Should be able to handle setting NetworkID', () => { + let getLedgerStatusSpy: any; + + beforeAll(() => { + // mock the ledger service response + getLedgerStatusSpy = jest.spyOn(LedgerService, 'getLedgerStatus').mockImplementation(() => { + return { Fee: 12, LastLedger: 123 }; + }); + }); + + afterAll(() => { + getLedgerStatusSpy.mockRestore(); + }); + + it('Should populate the transaction NetworkID on NON legacy networks', async () => { + const connectedNetworkId = 1337; + + // mock the ledger service response + const spy = jest.spyOn(NetworkService, 'getNetworkId').mockImplementation(() => { + return connectedNetworkId; + }); + + const { tx, meta } = paymentTemplates.SimplePayment; + const instance = new BaseTransaction(tx, meta); + + instance.populateFields(); + expect(instance.NetworkID).toBe(connectedNetworkId); + + spy.mockRestore(); + }); + + it('Should not populate the transaction NetworkID on legacy networks', async () => { + const connectedNetworkId = 0; + + // mock the ledger service response + const spy = jest.spyOn(NetworkService, 'getNetworkId').mockImplementation(() => { + return connectedNetworkId; + }); + + // should set if LastLedgerSequence undefined + const { tx, meta } = paymentTemplates.SimplePayment; + const instance = new BaseTransaction({ tx }, meta); + + instance.populateFields(); + expect(instance.NetworkID).toBe(undefined); + + spy.mockRestore(); + }); + }); + + it('Should be able to generate the right CTID', () => { + const { tx, meta } = paymentTemplates.XRP2XRP; + const instance = new BaseTransaction(tx, meta); + expect(instance.CTID).toBe('C373B14A00040000'); + }); + }); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/checkCancel.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/checkCancel.test.ts new file mode 100644 index 000000000..084f2b2c4 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/checkCancel.test.ts @@ -0,0 +1,109 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import Localize from '@locale'; + +import { CheckCancel, CheckCancelInfo, CheckCancelValidation } from '../CheckCancel'; +import { CheckCreate } from '../CheckCreate'; + +import checkCancelTemplates from './fixtures/CheckCancelTx.json'; +import checkCreateTemplate from './fixtures/CheckCreateTx.json'; + +jest.mock('@services/NetworkService'); + +describe('CheckCancel', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new CheckCancel(); + expect(instance.TransactionType).toBe('CheckCancel'); + expect(instance.Type).toBe('CheckCancel'); + }); + + it('Should return right parsed values', () => { + // @ts-ignore + const { tx, meta } = checkCancelTemplates; + const instance = new CheckCancel(tx, meta); + + expect(instance.CheckID).toBe('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); + }); + + it('Should set check object', () => { + // @ts-ignore + const { tx, meta } = checkCancelTemplates; + const instance = new CheckCancel(tx, meta); + + instance.Check = new CheckCreate(checkCreateTemplate.tx); + + expect(instance.Check).toBeDefined(); + expect(instance.isExpired).toBe(true); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = checkCancelTemplates; + const instance = new CheckCancel(tx, meta); + + const expectedDescription = `${Localize.t('events.theTransactionWillCancelCheckWithId', { + checkId: tx.CheckID, + })}`; + + expect(CheckCancelInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(CheckCancelInfo.getLabel()).toEqual(Localize.t('events.cancelCheck')); + }); + }); + }); + + describe('Validation', () => { + let instance: CheckCancel; + + beforeAll(() => { + const { tx, meta } = checkCancelTemplates; + instance = new CheckCancel(tx, meta); + + instance.Check = new CheckCreate(checkCreateTemplate.tx); + }); + + it('should resolve if Check is expired', async () => { + expect(instance.isExpired).toBe(true); + await expect(CheckCancelValidation(instance)).resolves.toBeUndefined(); + }); + + it('should reject with an error if Check object is not present', async () => { + instance.Check = undefined; + + await expect(CheckCancelValidation(instance)).rejects.toThrowError( + Localize.t('payload.unableToGetCheckObject'), + ); + }); + + it('should reject if Check is not expired and Account address does not match Check Destination or Account addresses', async () => { + const tx = { + Check: { + Destination: { address: 'destAddress' }, + Account: { address: 'accAddress' }, + }, + isExpired: false, + Account: { address: 'otherAddress' }, + }; + + instance.Check = new CheckCreate({ + Account: 'rAccountxxxxxxxxxxxxxxxxxxxxxxxxxx', + Destination: 'rDestinationxxxxxxxxxxxxxxxxxxxxxx', + }); + + instance.Account = { + address: 'rOtherAccountxxxxxxxxxxxxxxxxxxxxxxxxxx', + }; + + await expect(CheckCancelValidation(tx as any)).rejects.toThrowError( + Localize.t('payload.nonExpiredCheckCanOnlyCancelByCreatedAccount'), + ); + }); + }); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/checkCash.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/checkCash.test.ts new file mode 100644 index 000000000..8b42c4334 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/checkCash.test.ts @@ -0,0 +1,202 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import Localize from '@locale'; + +import { CheckCash, CheckCashInfo, CheckCashValidation } from '../CheckCash'; +import { CheckCreate } from '../CheckCreate'; + +import { NormalizeCurrencyCode } from '../../../../../utils/amount'; + +import checkCashTemplates from './fixtures/CheckCashTx.json'; +import checkCreateTemplate from './fixtures/CheckCreateTx.json'; + +jest.mock('@services/NetworkService'); + +describe('CheckCash', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new CheckCash(); + expect(instance.TransactionType).toBe('CheckCash'); + expect(instance.Type).toBe('CheckCash'); + }); + + it('Should return right parsed values', () => { + // @ts-ignore + const { tx, meta } = checkCashTemplates; + const instance = new CheckCash(tx, meta); + + expect(instance.CheckID).toBe('6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B'); + + expect(instance.Amount).toStrictEqual({ + currency: 'XRP', + value: '100', + }); + }); + + it('Should set check object', () => { + // @ts-ignore + const { tx, meta } = checkCashTemplates; + const instance = new CheckCash(tx, meta); + + instance.Check = new CheckCreate(checkCreateTemplate.tx); + + expect(instance.Check).toBeDefined(); + expect(instance.isExpired).toBe(true); + }); + + it('Should set/get fields', () => { + const instance = new CheckCash(); + + // @ts-ignore + instance.Amount = '100'; + expect(instance.Amount).toStrictEqual({ + currency: 'XRP', + value: '100', + }); + + instance.Amount = { + currency: 'USD', + issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + value: '1', + }; + expect(instance.Amount).toStrictEqual({ + currency: 'USD', + issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + value: '1', + }); + + // @ts-ignore + instance.DeliverMin = '100'; + expect(instance.DeliverMin).toStrictEqual({ + currency: 'XRP', + value: '100', + }); + + instance.DeliverMin = { + currency: 'USD', + issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + value: '1', + }; + expect(instance.DeliverMin).toStrictEqual({ + currency: 'USD', + issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + value: '1', + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = checkCashTemplates; + const instance = new CheckCash(tx, meta); + + const expectedDescription = Localize.t('events.itWasInstructedToDeliverByCashingCheck', { + address: instance.Check?.Destination.address || 'address', + amount: instance.Amount.value, + currency: NormalizeCurrencyCode(instance.Amount.currency), + checkId: tx.CheckID, + }); + + expect(CheckCashInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(CheckCashInfo.getLabel()).toEqual(Localize.t('events.cashCheck')); + }); + }); + }); + + describe('Validation', () => { + it('should reject if Check is not assigned', async () => { + const { tx, meta } = checkCashTemplates; + const instance = new CheckCash(tx, meta); + + await expect(CheckCashValidation(instance)).rejects.toThrowError( + Localize.t('payload.unableToGetCheckObject'), + ); + }); + + it('should reject if no valid Amount or DeliverMin is provided', async () => { + const { tx, meta } = checkCashTemplates; + const instance = new CheckCash({ ...tx }, meta); + + instance.Check = new CheckCreate(checkCreateTemplate.tx); + + for await (const v of [ + '0', + undefined, + { + currency: 'USD', + issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + value: '0', + }, + ]) { + // @ts-ignore + instance.Amount = v; + // @ts-ignore + instance.DeliverMin = v; + + await expect(CheckCashValidation(instance)).rejects.toThrowError( + Localize.t('send.pleaseEnterAmount'), + ); + } + }); + + it('should reject if Amount exceeds Check SendMax', async () => { + const { tx, meta } = checkCashTemplates; + const instance = new CheckCash({ ...tx, ...{ Amount: checkCreateTemplate.tx.SendMax + 1 } }, meta); + + instance.Check = new CheckCreate(checkCreateTemplate.tx); + + await expect(CheckCashValidation(instance)).rejects.toThrowError( + Localize.t('payload.insufficientCashAmount', { + amount: instance.Check.SendMax.value, + currency: NormalizeCurrencyCode(instance.Check.SendMax.currency), + }), + ); + }); + + it('should reject if DeliverMin exceeds Check SendMax', async () => { + const { tx, meta } = checkCashTemplates; + const instance = new CheckCash({ ...tx, ...{ DeliverMin: checkCreateTemplate.tx.SendMax + 1 } }, meta); + + instance.Check = new CheckCreate(checkCreateTemplate.tx); + + await expect(CheckCashValidation(instance)).rejects.toThrowError( + Localize.t('payload.insufficientCashAmount', { + amount: instance.Check.SendMax.value, + currency: NormalizeCurrencyCode(instance.Check.SendMax.currency), + }), + ); + }); + + it('should reject if Account address is not equal to Check Destination address', async () => { + const { tx, meta } = checkCashTemplates; + const instance = new CheckCash({ ...tx, ...{ Account: 'rAccountxxxxxxxxxxxxxxxxxxxxxxxxxx' } }, meta); + + instance.Check = new CheckCreate(checkCreateTemplate.tx); + + await expect(CheckCashValidation(instance)).rejects.toThrowError( + Localize.t('payload.checkCanOnlyCashByCheckDestination'), + ); + }); + + it('should resolve if all validations pass', async () => { + const { tx, meta } = checkCashTemplates; + const instance = new CheckCash( + { + ...tx, + ...{ Account: checkCreateTemplate.tx.Destination, Amount: checkCreateTemplate.tx.SendMax }, + }, + meta, + ); + + instance.Check = new CheckCreate(checkCreateTemplate.tx); + + await expect(CheckCashValidation(instance)).resolves.toBeUndefined(); + }); + }); + }); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/checkCreate.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/checkCreate.test.ts new file mode 100644 index 000000000..d0923fa5a --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/checkCreate.test.ts @@ -0,0 +1,204 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import LedgerService from '@services/LedgerService'; + +import { NormalizeCurrencyCode } from '../../../../../utils/amount'; + +import { CheckCreate, CheckCreateInfo, CheckCreateValidation } from '../CheckCreate'; + +import checkCreateTemplate from './fixtures/CheckCreateTx.json'; + +jest.mock('@services/LedgerService'); +jest.mock('@services/NetworkService'); + +describe('CheckCreate', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new CheckCreate(); + expect(instance.TransactionType).toBe('CheckCreate'); + expect(instance.Type).toBe('CheckCreate'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = checkCreateTemplate; + const instance = new CheckCreate(tx, meta); + + expect(instance.SendMax).toStrictEqual({ + currency: 'XRP', + value: '100', + }); + + expect(instance.Expiration).toBe('2018-01-24T12:52:01.000Z'); + + expect(instance.Destination).toStrictEqual({ + tag: 1, + address: 'rrrrrrrrrrrrrrrrrrrn5RM1rHd', + }); + + expect(instance.InvoiceID).toBe('6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B'); + }); + + it('Should set/get fields', () => { + const instance = new CheckCreate(); + + // @ts-ignore + instance.SendMax = '100'; + expect(instance.SendMax).toStrictEqual({ + currency: 'XRP', + value: '100', + }); + + instance.Destination = { + address: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + tag: 1337, + }; + expect(instance.Destination).toStrictEqual({ + address: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + tag: 1337, + }); + + // @ts-ignore + instance.SendMax = { + currency: 'USD', + issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + value: '1', + }; + expect(instance.SendMax).toStrictEqual({ + currency: 'USD', + issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + value: '1', + }); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = checkCreateTemplate; + const instance = new CheckCreate(tx, meta); + + const expectedDescription = `${Localize.t('events.theCheckIsFromTo', { + address: instance.Account.address, + destination: instance.Destination.address, + })}\n${Localize.t('events.theCheckHasASourceTag', { tag: instance.Account.tag })}\n${Localize.t( + 'events.theCheckHasADestinationTag', + { tag: instance.Destination.tag }, + )}\n\n${Localize.t('events.maximumAmountCheckIsAllowToDebit', { + value: instance.SendMax.value, + currency: NormalizeCurrencyCode(instance.SendMax.currency), + })}`; + + expect(CheckCreateInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(CheckCreateInfo.getLabel()).toEqual(Localize.t('events.createCheck')); + }); + }); + }); + + describe('Validation', () => { + it('should reject if SendMax is not set or zero', async () => { + const { tx, meta } = checkCreateTemplate; + const instance = new CheckCreate({ ...tx, ...{ SendMax: undefined } }, meta); + + for await (const v of [ + '0', + undefined, + { + currency: 'USD', + issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + value: '0', + }, + ]) { + // @ts-ignore + instance.SendMax = v; + + await expect(CheckCreateValidation(instance)).rejects.toThrowError( + Localize.t('send.pleaseEnterAmount'), + ); + } + }); + + it('should reject if SendMax value is greater than the available balance for the native asset', async () => { + const { tx, meta } = checkCreateTemplate; + const instance = new CheckCreate(tx, meta); + + (LedgerService.getAccountAvailableBalance as jest.Mock).mockResolvedValueOnce(50); + + await expect(CheckCreateValidation(instance)).rejects.toThrow( + Localize.t('send.insufficientBalanceSpendableBalance', { + spendable: Localize.formatNumber(50), + currency: 'XRP', + }), + ); + }); + + it('should reject if IOU balance is less than SendMax', async () => { + const { tx, meta } = checkCreateTemplate; + const instance = new CheckCreate( + { + ...tx, + ...{ + SendMax: { + currency: 'USD', + issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + value: '1000', + }, + }, + }, + meta, + ); + + (LedgerService.getFilteredAccountLine as jest.Mock).mockResolvedValueOnce({ + balance: '50', + currency: 'USD', + }); + + await expect(CheckCreateValidation(instance)).rejects.toThrow( + Localize.t('send.insufficientBalanceSpendableBalance', { + spendable: Localize.formatNumber(50), + currency: 'USD', + }), + ); + }); + + it('should resolve if SendMax is valid for the IOU amount and it does not exceed line balance', async () => { + const { tx, meta } = checkCreateTemplate; + const instance = new CheckCreate( + { + ...tx, + ...{ + SendMax: { + currency: 'USD', + issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji', + value: '100', + }, + }, + }, + meta, + ); + + (LedgerService.getFilteredAccountLine as jest.Mock).mockResolvedValueOnce({ + balance: '100', + currency: 'USD', + }); + + await expect(CheckCreateValidation(instance)).resolves.not.toThrow(); + }); + + it('should resolve if SendMax is valid for the native asset and it does not exceed available balance', async () => { + const { tx, meta } = checkCreateTemplate; + const instance = new CheckCreate(tx, meta); + + (LedgerService.getAccountAvailableBalance as jest.Mock).mockResolvedValueOnce(100); + + await expect(CheckCreateValidation(instance)).resolves.not.toThrow(); + }); + }); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/claimReward.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/claimReward.test.ts new file mode 100644 index 000000000..b4f6d9cbb --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/claimReward.test.ts @@ -0,0 +1,70 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { ClaimReward, ClaimRewardInfo } from '../ClaimReward'; + +import { ClaimRewardStatus } from '@common/libs/ledger/parser/types'; + +import claimRewardTemplates from './fixtures/ClaimRewardTx.json'; + +jest.mock('@services/NetworkService'); + +describe('ClaimReward', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new ClaimReward(); + expect(instance.TransactionType).toBe('ClaimReward'); + expect(instance.Type).toBe('ClaimReward'); + }); + + it('Should return right parsed values [OptOut]', () => { + const { tx, meta } = claimRewardTemplates.Emitted; + const instance = new ClaimReward(tx, meta); + expect(instance.TransactionType).toBe('ClaimReward'); + expect(instance.Issuer).toBe(claimRewardTemplates.Emitted.tx.Issuer); + expect(instance.ClaimStatus).toBe(ClaimRewardStatus.OptOut); + }); + + it('Should return right parsed values [OptIn]', () => { + const { tx, meta } = claimRewardTemplates.OptIn; + const instance = new ClaimReward(tx, meta); + expect(instance.TransactionType).toBe('ClaimReward'); + expect(instance.Issuer).toBe(claimRewardTemplates.Emitted.tx.Issuer); + expect(instance.ClaimStatus).toBe(ClaimRewardStatus.OptIn); + }); + }); + + describe('Info', () => { + const emittedInstance = new ClaimReward(claimRewardTemplates.Emitted.tx, claimRewardTemplates.Emitted.meta); + const optInInstance = new ClaimReward(claimRewardTemplates.OptIn.tx, claimRewardTemplates.OptIn.meta); + + describe('getDescription()', () => { + it('should return the expected description [OptOut]', () => { + const expectedDescription = `${Localize.t('events.claimRewardExplain')}\n${Localize.t( + 'events.claimRewardExplainOptOut', + { address: emittedInstance.Account.address }, + )}`; + expect(ClaimRewardInfo.getDescription(emittedInstance)).toEqual(expectedDescription); + }); + + it('should return the expected description [OptIn]', () => { + const expectedDescription = `${Localize.t('events.claimRewardExplain')}`; + expect(ClaimRewardInfo.getDescription(optInInstance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label [OptOut]', () => { + expect(ClaimRewardInfo.getLabel(emittedInstance)).toEqual(Localize.t('events.claimRewardOptOut')); + }); + + it('should return the expected label [OptIn]', () => { + expect(ClaimRewardInfo.getLabel(optInInstance)).toEqual(Localize.t('events.claimReward')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/depositPreauth.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/depositPreauth.test.ts new file mode 100644 index 000000000..9561e07ca --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/depositPreauth.test.ts @@ -0,0 +1,69 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import Localize from '@locale'; + +import { DepositPreauth, DepositPreauthInfo } from '../DepositPreauth'; +import depositPreauthTemplate from './fixtures/DepositPreauthTx.json'; + +jest.mock('@services/NetworkService'); + +describe('DepositPreauth', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new DepositPreauth(); + expect(instance.TransactionType).toBe('DepositPreauth'); + expect(instance.Type).toBe('DepositPreauth'); + }); + + it('Should return right parsed values', () => { + // @ts-ignore + const { tx, meta } = depositPreauthTemplate; + const instance = new DepositPreauth(tx, meta); + + expect(instance.Authorize).toBe('rrrrrrrrrrrrrrrrrrrrbzbvji'); + expect(instance.Unauthorize).toBe('rrrrrrrrrrrrrrrrrrrrbzbvji'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description Authorize', () => { + const { tx, meta } = depositPreauthTemplate; + const instance = new DepositPreauth({ ...tx, ...{ Unauthorize: undefined } }, meta); + + const expectedDescription = Localize.t('events.itAuthorizesSendingPaymentsToThisAccount', { + address: tx.Authorize, + }); + + expect(DepositPreauthInfo.getDescription(instance)).toEqual(expectedDescription); + }); + + it('should return the expected description for Unauthorize', () => { + const { tx, meta } = depositPreauthTemplate; + const instance = new DepositPreauth({ ...tx, ...{ Authorize: undefined } }, meta); + + const expectedDescription = Localize.t('events.itRemovesAuthorizesSendingPaymentsToThisAccount', { + address: tx.Unauthorize, + }); + + expect(DepositPreauthInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label for Authorize', () => { + const { tx, meta } = depositPreauthTemplate; + const instance = new DepositPreauth({ ...tx, ...{ Unauthorize: undefined } }, meta); + expect(DepositPreauthInfo.getLabel(instance)).toEqual(Localize.t('events.authorizeDeposit')); + }); + + it('should return the expected label for Unauthorize', () => { + const { tx, meta } = depositPreauthTemplate; + const instance = new DepositPreauth({ ...tx, ...{ Authorize: undefined } }, meta); + expect(DepositPreauthInfo.getLabel(instance)).toEqual(Localize.t('events.unauthorizeDeposit')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/enableAmendment.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/enableAmendment.test.ts new file mode 100644 index 000000000..82fb6369c --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/enableAmendment.test.ts @@ -0,0 +1,12 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import { EnableAmendment } from '../EnableAmendment'; + +jest.mock('@services/NetworkService'); + +describe('EnableAmendment tx', () => { + it('Should set tx type if not set', () => { + const instance = new EnableAmendment(); + expect(instance.Type).toBe('EnableAmendment'); + }); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/escrowCancel.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/escrowCancel.test.ts new file mode 100644 index 000000000..a9e03b954 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/escrowCancel.test.ts @@ -0,0 +1,55 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import Localize from '@locale'; + +import { EscrowCancel, EscrowCancelInfo } from '../EscrowCancel'; +import escrowCancelTemplate from './fixtures/EscrowCancelTx.json'; + +jest.mock('@services/NetworkService'); + +describe('EscrowCancel tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new EscrowCancel(); + expect(instance.TransactionType).toBe('EscrowCancel'); + expect(instance.Type).toBe('EscrowCancel'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = escrowCancelTemplate; + const instance = new EscrowCancel(tx, meta); + + expect(instance.Owner).toBe('rrrrrrrrrrrrrrrrrrrrrholvtp'); + expect(instance.EscrowID).toBe(tx.EscrowID); + + expect(instance.OfferSequence).toBe(7); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = escrowCancelTemplate; + const instance = new EscrowCancel(tx, meta); + + // TODO: add description tests + const expectedDescription = `${`This is an ${instance.Type} transaction`}\n${Localize.t( + 'events.theTransactionHasAEscrowId', + { + escrowId: tx.EscrowID, + }, + )}`; + + expect(EscrowCancelInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(EscrowCancelInfo.getLabel()).toEqual(Localize.t('events.cancelEscrow')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/escrowCreate.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/escrowCreate.test.ts new file mode 100644 index 000000000..c41132fbc --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/escrowCreate.test.ts @@ -0,0 +1,65 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import Localize from '@locale'; + +import { EscrowCreate, EscrowCreateInfo } from '../EscrowCreate'; +import escrowCreateTemplate from './fixtures/EscrowCreateTx.json'; + +jest.mock('@services/NetworkService'); + +describe('EscrowCreate', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new EscrowCreate(); + expect(instance.TransactionType).toBe('EscrowCreate'); + expect(instance.Type).toBe('EscrowCreate'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = escrowCreateTemplate; + const instance = new EscrowCreate(tx, meta); + + expect(instance.Destination).toStrictEqual({ + tag: 23480, + address: 'rrrrrrrrrrrrrrrrrrrrbzbvji', + }); + expect(instance.Amount).toStrictEqual({ + currency: 'XRP', + value: '0.01', + }); + + expect(instance.Condition).toBe( + 'A0258020E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855810100', + ); + + expect(instance.CancelAfter).toBe('2016-11-23T23:12:38.000Z'); + expect(instance.FinishAfter).toBe('2016-11-22T23:12:38.000Z'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = escrowCreateTemplate; + const instance = new EscrowCreate(tx, meta); + + const expectedDescription = + 'The escrow is from rrrrrrrrrrrrrrrrrrrrrholvtp to rrrrrrrrrrrrrrrrrrrrbzbvji\n' + + 'The escrow has a destination tag: 23480 \n' + + 'It escrowed 0.01 XRP\n' + + 'It can be cancelled after Thursday, November 24, 2016 12:12 AM\n' + + 'It can be finished after Wednesday, November 23, 2016 12:12 AM'; + + expect(EscrowCreateInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(EscrowCreateInfo.getLabel()).toEqual(Localize.t('events.createEscrow')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/escrowFinish.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/escrowFinish.test.ts new file mode 100644 index 000000000..774042e07 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/escrowFinish.test.ts @@ -0,0 +1,66 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import Localize from '@locale'; + +import { EscrowFinish, EscrowFinishInfo } from '../EscrowFinish'; +import escrowFinishTemplate from './fixtures/EscrowFinishTx.json'; + +jest.mock('@services/NetworkService'); + +describe('EscrowFinish', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new EscrowFinish(); + expect(instance.TransactionType).toBe('EscrowFinish'); + expect(instance.Type).toBe('EscrowFinish'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = escrowFinishTemplate; + const instance = new EscrowFinish(tx, meta); + + expect(instance.Destination).toStrictEqual({ + tag: 1337, + address: 'rrrrrrrrrrrrrrrrrrrrrholvtp', + }); + expect(instance.Amount).toStrictEqual({ + currency: 'XRP', + value: '500000000', + }); + + expect(instance.Owner).toBe(tx.Owner); + + expect(instance.Fulfillment).toBe(tx.Fulfillment); + expect(instance.Condition).toBe(tx.Condition); + expect(instance.EscrowID).toBe(tx.EscrowID); + + expect(instance.OfferSequence).toBe(tx.OfferSequence); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = escrowFinishTemplate; + const instance = new EscrowFinish(tx, meta); + + const expectedDescription = + 'Completion was triggered by rrrrrrrrrrrrrrrrrrrrbzbvji\r\n' + + 'The escrowed amount of 500000000 XRP was delivered to rrrrrrrrrrrrrrrrrrrrrholvtp\n' + + 'The escrow has a destination tag: 1337\n' + + 'The transaction escrow ID is: EF963D9313AA45E85610598797D1A65E\n' + + 'The escrow was created by rrrrrrrrrrrrrrrrrrrrrholvtp'; + + expect(EscrowFinishInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(EscrowFinishInfo.getLabel()).toEqual(Localize.t('events.finishEscrow')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/AccountDeleteTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/AccountDeleteTx.json new file mode 100644 index 000000000..98019f098 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/AccountDeleteTx.json @@ -0,0 +1,64 @@ +{ + "tx": { + "Account": "rAccountxxxxxxxxxxxxxxxxxxxxxxxxxx", + "SourceTag": 1337, + "Destination": "rDestinationxxxxxxxxxxxxxxxxxxxxxx", + "DestinationTag": 0, + "Fee": "5000000", + "Flags": 2147483648, + "LastLedgerSequence": 55314025, + "Sequence": 1, + "SigningPubKey": "03075F65D8353E3A5DA3193FF976BC17A2D0B9376BE7DA942349B6526E5A2BBF54", + "TransactionType": "AccountDelete", + "TxnSignature": "30440220786E084DFD1E6317A52D68C65349B7956ABF7CEFA7A9062EB55CB3E8CD96615E022023C3A862938B615B5643A7A16571B825E3FCD1144245D55799D16B7F0FB56955", + "date": 642227752, + "hash": "2BCD5B4C9CB7DC65C4C620F2767104CF3F35F805B189A414C1E02479788B7FDA", + "inLedger": 55314020, + "ledger_index": 55314020 + }, + "meta": { + "AffectedNodes": [ + { + "DeletedNode": { + "FinalFields": { + "Account": "rAccountxxxxxxxxxxxxxxxxxxxxxxxxxx", + "Balance": "0", + "Flags": 0, + "OwnerCount": 0, + "PreviousTxnID": "E9B45B9DB6F9477FD58AA3124200286C51B983AB018F416BD40B97BC8654EF8C", + "PreviousTxnLgrSeq": 51542281, + "Sequence": 2 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "25C343511654DE07BC7DE30F04022AC318C793CEBEAC7C33C2F787829D2CD353", + "PreviousFields": { + "Balance": "20001020", + "Sequence": 1 + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rDestinationxxxxxxxxxxxxxxxxxxxxxx", + "Balance": "370793356", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 109 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "FC77C0C251734B0A2567C2F7DD9034FC87B8C0D0925C5AF2F745C75DCE4B2E4B", + "PreviousFields": { + "Balance": "355792336" + }, + "PreviousTxnID": "8A5285AE7627A93E92C695699CABC286191B16A8600664E613F81B08794227EF", + "PreviousTxnLgrSeq": 54844438 + } + } + ], + "DeliveredAmount": "15001020", + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS", + "delivered_amount": "15001020" + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/AccountSetTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/AccountSetTx.json new file mode 100644 index 000000000..5e1cff528 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/AccountSetTx.json @@ -0,0 +1,38 @@ +{ + "Set": { + "tx": { + "TransactionType": "AccountSet", + "Account": "rAccountxxxxxxxxxxxxxxxxxxxxxxxxxx", + "Fee": "12", + "Sequence": 5, + "Domain": "6578616D706C652E636F6D", + "SetFlag": 5, + "ClearFlag": 4, + "EmailHash": "0bc83cb571cd1c50ba6f3e8a78ef1346", + "MessageKey": "03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB", + "TransferRate": 1002000000, + "TickSize": 0, + "NFTokenMinter": "rMinterxxxxxxxxxxxxxxxxxxxxxxxxxx", + "WalletLocator": "ABCDEF123456789", + "WalletSize": 1337 + }, + "meta": {} + }, + "Clear": { + "tx": { + "TransactionType": "AccountSet", + "Account": "rAccountxxxxxxxxxxxxxxxxxxxxxxxxxx", + "Fee": "12", + "Sequence": 5, + "Domain": "", + "EmailHash": "", + "MessageKey": "", + "TransferRate": 0, + "NFTokenMinter": "", + "WalletLocator": "", + "WalletSize": 0 + }, + "meta": {} + } + +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/BaseTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/BaseTx.json new file mode 100644 index 000000000..c1ac9da05 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/BaseTx.json @@ -0,0 +1,52 @@ +{ + "tx": { + "Account": "rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY", + "Fee": "12", + "Flags": 2147483648, + "LastLedgerSequence": 57913677, + "Memos": [ + { + "Memo": { + "MemoData": "5852502054697020426F74", + "MemoType": "587270546970426F744E6F7465" + } + } + ], + "TicketSequence": 0, + "Signers": [{ + "Signer": { + "Account": "rSignerxxxxxxxxxxxxxxxxxxxxxxxxxx", + "TxnSignature": "TxnSignature", + "SigningPubKey":"SigningPubKey" + } + }], + "Sequence": 34306, + "SigningPubKey": "03DF3AB842EB1B57F0A848CD7CC2CFD35F66E4AD0625EEACFFE72A45E4D13E49A", + "SourceTag": 456, + "TxnSignature": "304402204ED27C2D29F609772B0E67ACCFC8C205422A85D54C065437179032419", + "NetworkID": 0, + "OperationLimit": 0, + "EmitDetails": { + "EmitBurden": "1", + "EmitGeneration": 1, + "EmitHookHash": "610F33B8EBF7EC795F822A454FB852156AEFE50BE0CB8326338A81CD74801864", + "EmitNonce": "B397D9F5C8BB29D21BC9994D5C095B58168331A56F7101DE24CB832953F990D1", + "EmitParentTxnID": "6FB583E69711E84F5CD847B3C77614FDB473F8F8711095EFC2EFE069C7083AFE" + }, + "HookParameters": [ + { + "HookParameter": { + "HookParameterName": "54455354", + "HookParameterValue": "DEADBEEF" + } + } + ], + "FirstLedgerSequence": 1, + "hash": "7F10793B5781BD5DD52F70096520321A08DD2ED19AFC7E3F193AAC293954F7DF", + "ledger_index": 57913674, + "date": 652346651 + }, + "meta": { + "TransactionResult": "tesSUCCESS" + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/CheckCancelTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/CheckCancelTx.json new file mode 100644 index 000000000..c45e82a45 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/CheckCancelTx.json @@ -0,0 +1,9 @@ +{ + "tx": { + "TransactionType": "CheckCancel", + "Account": "rAccountxxxxxxxxxxxxxxxxxxxxxxxxxx", + "CheckID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "Fee": "12" + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/CheckCashTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/CheckCashTx.json new file mode 100644 index 000000000..d90cbe894 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/CheckCashTx.json @@ -0,0 +1,10 @@ +{ + "tx": { + "Account": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "TransactionType": "CheckCash", + "Amount": "100000000", + "CheckID": "6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B", + "Fee": "12" + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/__tests__/templates/CheckCreateTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/CheckCreateTx.json similarity index 67% rename from src/common/libs/ledger/transactions/__tests__/templates/CheckCreateTx.json rename to src/common/libs/ledger/transactions/genuine/__tests__/fixtures/CheckCreateTx.json index bbb8f8cda..9e60fcb3a 100644 --- a/src/common/libs/ledger/transactions/__tests__/templates/CheckCreateTx.json +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/CheckCreateTx.json @@ -1,8 +1,9 @@ { "tx": { "TransactionType": "CheckCreate", - "Account": "rUn84CUYbNjRoTQ6mSW7BVJPSVJNLb1QLo", - "Destination": "rfkE1aSy9G8Upk4JssnwBxhEv5p4mn2KTy", + "Account": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "SourceTag": 1337, + "Destination": "rrrrrrrrrrrrrrrrrrrn5RM1rHd", "SendMax": "100000000", "Expiration": 570113521, "InvoiceID": "6F1DFD1D0FE8A32E40E1F2C05CF1C15545BAB56B617F9C6C2D63A6B704BEF59B", @@ -10,4 +11,4 @@ "Fee": "12" }, "meta": {} -} \ No newline at end of file +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/ClaimRewardTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/ClaimRewardTx.json new file mode 100644 index 000000000..f5023c5d6 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/ClaimRewardTx.json @@ -0,0 +1,183 @@ +{ + "Emitted": { + "tx": { + "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp", + "Fee": "8640", + "Flags": 1, + "Issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "LastLedgerSequence": 312, + "NetworkID": 21337, + "Sequence": 13, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "ClaimReward", + "TxnSignature": "3045022100CA4FC90EBC4BEE7E78CDA43EE7D57E5C5A5685585F72FC3BED0152AD2E852C1902204E44EC1AC0E90C524BDC0B40E8A9280EE7E4B7D9D9EB2E6612601E263B4763E9", + "ctid": "C000012500005359", + "date": 749750432, + "hash": "6FB583E69711E84F5CD847B3C77614FDB473F8F8711095EFC2EFE069C7083AFE", + "inLedger": 293, + "ledger_index": 293, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "CreatedNode": { + "LedgerEntryType": "EmittedTxn", + "LedgerIndex": "279388F00ECE38E6DB479C6759E0677392BFE475A282479C432E4D2DA2F27351", + "NewFields": { + "EmittedTxn": { + "Account": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "EmitDetails": { + "EmitBurden": "1", + "EmitGeneration": 1, + "EmitHookHash": "610F33B8EBF7EC795F822A454FB852156AEFE50BE0CB8326338A81CD74801864", + "EmitNonce": "B397D9F5C8BB29D21BC9994D5C095B58168331A56F7101DE24CB832953F990D1", + "EmitParentTxnID": "6FB583E69711E84F5CD847B3C77614FDB473F8F8711095EFC2EFE069C7083AFE" + }, + "Fee": "10", + "FirstLedgerSequence": 294, + "Flags": 2147483648, + "GenesisMints": [ + { + "GenesisMint": { + "Amount": "66671973", + "Destination": "rrrrrrrrrrrrrrrrrrrrrhoLvTp" + } + } + ], + "LastLedgerSequence": 298, + "Sequence": 0, + "SigningPubKey": "000000000000000000000000000000000000000000000000000000000000000000", + "TransactionType": "GenesisMint" + } + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp", + "AccountIndex": "1", + "Balance": "19999982708", + "Flags": 0, + "OwnerCount": 1, + "RewardAccumulator": "0", + "RewardLgrFirst": 293, + "RewardLgrLast": 293, + "RewardTime": 749750430, + "Sequence": 14 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19999991348", + "RewardLgrFirst": 41, + "RewardLgrLast": 41, + "RewardTime": 749750178, + "Sequence": 13 + } + } + }, + { + "CreatedNode": { + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "B4DE823055D00BC12CD78FE1AAF74EE6062195B2629F49A25915A39C64BE1900", + "NewFields": { + "Flags": 4, + "RootIndex": "B4DE823055D00BC12CD78FE1AAF74EE6062195B2629F49A25915A39C64BE1900" + } + } + } + ], + "HookEmissions": [ + { + "HookEmission": { + "EmittedTxnID": "AB3AA9197E79412BE261C472EBB3100F0949A3E9AEA6F19A4AF30133EE2AB9A3", + "HookAccount": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "HookHash": "610F33B8EBF7EC795F822A454FB852156AEFE50BE0CB8326338A81CD74801864" + } + } + ], + "HookExecutions": [ + { + "HookExecution": { + "HookAccount": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "HookEmitCount": 1, + "HookExecutionIndex": 0, + "HookHash": "610F33B8EBF7EC795F822A454FB852156AEFE50BE0CB8326338A81CD74801864", + "HookInstructionCount": "248", + "HookResult": 3, + "HookReturnCode": "15b", + "HookReturnString": "5265776172643A20456D6974746564207265776172642074786E207375636365737366756C6C792E00", + "HookStateChangeCount": 1 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } + }, + "OptIn": { + "tx": { + "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp", + "Fee": "8640", + "Flags": 0, + "Issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "LastLedgerSequence": 60, + "NetworkID": 21337, + "Sequence": 12, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "ClaimReward", + "TxnSignature": "3045022100B0B053784266CBF5F91A3DE885307F0D1D9DFBB2B290CE4CF198873BB6DAB12C022008A14A9FCD4C4354472C5188E4E20F6EC054C9A092B5D81641B3D25117BFBD7D", + "ctid": "C000002900005359", + "date": 749750489, + "hash": "9930FCE45EE47A6E94CB5F8E42F98421F5D36DFB7B3E63C1E9CEB87F18A2F459", + "inLedger": 41, + "ledger_index": 41, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp", + "AccountIndex": "1", + "Balance": "19999991348", + "Flags": 0, + "OwnerCount": 1, + "RewardAccumulator": "0", + "RewardLgrFirst": 41, + "RewardLgrLast": 41, + "RewardTime": 749750487, + "Sequence": 13 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19999999988", + "Sequence": 12 + } + } + } + ], + "HookExecutions": [ + { + "HookExecution": { + "HookAccount": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "HookEmitCount": 0, + "HookExecutionIndex": 0, + "HookHash": "610F33B8EBF7EC795F822A454FB852156AEFE50BE0CB8326338A81CD74801864", + "HookInstructionCount": "98", + "HookResult": 3, + "HookReturnCode": "94", + "HookReturnString": "5265776172643A2050617373696E67207265776172642073657475702074786E00", + "HookStateChangeCount": 1 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/DepositPreauthTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/DepositPreauthTx.json new file mode 100644 index 000000000..56f3b154f --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/DepositPreauthTx.json @@ -0,0 +1,12 @@ +{ + "tx": { + "TransactionType": "DepositPreauth", + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "Authorize": "rrrrrrrrrrrrrrrrrrrrbzbvji", + "Unauthorize": "rrrrrrrrrrrrrrrrrrrrbzbvji", + "Fee": "10", + "Flags": 2147483648, + "Sequence": 2 + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EnableAmendmentTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EnableAmendmentTx.json new file mode 100644 index 000000000..4d1714cf0 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EnableAmendmentTx.json @@ -0,0 +1,4 @@ +{ + "tx": {}, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EscrowCancelTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EscrowCancelTx.json new file mode 100644 index 000000000..605bcbb97 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EscrowCancelTx.json @@ -0,0 +1,10 @@ +{ + "tx": { + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "TransactionType": "EscrowCancel", + "Owner": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "OfferSequence": 7, + "EscrowID": "EF963D9313AA45E85610598797D1A65E" + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EscrowCreateTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EscrowCreateTx.json new file mode 100644 index 000000000..08fd8357c --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EscrowCreateTx.json @@ -0,0 +1,14 @@ +{ + "tx": { + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "TransactionType": "EscrowCreate", + "Amount": "10000", + "Destination": "rrrrrrrrrrrrrrrrrrrrbzbvji", + "CancelAfter": 533257958, + "FinishAfter": 533171558, + "Condition": "A0258020E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855810100", + "DestinationTag": 23480, + "SourceTag": 11747 + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EscrowFinishTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EscrowFinishTx.json new file mode 100644 index 000000000..f148db000 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/EscrowFinishTx.json @@ -0,0 +1,93 @@ +{ + "tx": { + "TransactionType": "EscrowFinish", + "Account": "rrrrrrrrrrrrrrrrrrrrbzbvji", + "Fulfillment": "A0028000", + "Condition": "A0258020E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855810100", + "EscrowID": "EF963D9313AA45E85610598797D1A65E", + "Fee": "12", + "Flags": 2147483648, + "LastLedgerSequence": 57885237, + "OfferSequence": 22, + "Owner": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "Sequence": 31, + "SigningPubKey": "03289275F786BB7CA4E960931E9D96638849BFA445770B949B4365ADDCC293D3D7", + "TxnSignature": "3044022043FC36A6BFF0926E8ABD55CBA905D9F54AF641FA0ACD25B27AD93627301E13CA02203B7FCA454DC0C69585043BB22F670B7308ED65087DA755475C523F243F62DEDA", + "date": 652233611, + "hash": "D292CE89F8EDB65C2F1930DAB6F80476FF061BB455F840B808A23D5ACBC652FA", + "inLedger": 57885156, + "ledger_index": 57885156 + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "RootIndex": "1EA8DBF223B8F9BCABA4F5185C3ABA96D4EAAE84545E2FF8B6DA06563B38BE8A" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "1EA8DBF223B8F9BCABA4F5185C3ABA96D4EAAE84545E2FF8B6DA06563B38BE8A" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rrrrrrrrrrrrrrrrrrrrbzbvji", + "Balance": "20999604", + "Flags": 0, + "OwnerCount": 0, + "Sequence": 32 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "27BB55D1F31075E514FDC112EFB687A1D551AD1A8317D5CCE647F575EF210A78", + "PreviousFields": { + "Balance": "20999616", + "Sequence": 31 + }, + "PreviousTxnID": "B907C4AE96C13BB2F486E0F86E91F92C4C3174051632A78710E22E63EF362BD3", + "PreviousTxnLgrSeq": 57885155 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "Balance": "800000200930520", + "Flags": 1048576, + "OwnerCount": 12, + "Sequence": 40 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "875F97C6293127CF84490851CB474E613C968F686A0F601FB88027A7DACC4ADA", + "PreviousFields": { + "Balance": "300000200930520", + "OwnerCount": 13 + }, + "PreviousTxnID": "EE77A0F9A443EC710529FC35B5715A663BCF380315E8D863CE5BF8C3971BC642", + "PreviousTxnLgrSeq": 57217428 + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "Amount": "500000000000000", + "Destination": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "DestinationTag": 1337, + "FinishAfter": 652233600, + "Flags": 0, + "OwnerNode": "0000000000000000", + "PreviousTxnID": "C9AD36030158FE0E21D5654C3C54710B6406B6D996073ADEDF556C497650FE70", + "PreviousTxnLgrSeq": 35059629 + }, + "LedgerEntryType": "Escrow", + "LedgerIndex": "D6D410E6257423FE6D9E60838E66BADC71AD81EFC787D1D6D977438C4C621B8E" + } + } + ], + "TransactionIndex": 24, + "TransactionResult": "tesSUCCESS" + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/GenesisMintTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/GenesisMintTx.json new file mode 100644 index 000000000..4d1714cf0 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/GenesisMintTx.json @@ -0,0 +1,4 @@ +{ + "tx": {}, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/ImportTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/ImportTx.json new file mode 100644 index 000000000..9c0d201fd --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/ImportTx.json @@ -0,0 +1,188 @@ +{ + "RegularKey":{ + "tx":{ + "Account":"rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Blob":"7B226C6564676572223A7B226163726F6F74223A2231394337303837314142443136354331424132323830433639433137443332423838303042313035333245443338414233423331383341324137373832433446222C22636C6F7365223A3734393931393335322C22636F696E73223A223939393939393939393839393939393634222C2263726573223A31302C22666C616773223A302C22696E646578223A3130352C2270636C6F7365223A3734393931393335312C227068617368223A2235314537454336314441354530444632413442443839353633443244434534353531354435464132364334333235334341323046303134363534464442433237222C227478726F6F74223A2245393634323543334135454235453543334538353846314641393039343546433733443836384542413846373444324544324243324333334338414230414541227D2C227472616E73616374696F6E223A7B22626C6F62223A22313230303035323230303030303030303234303030303030313232303142303030303030374332303144303030303533353936383430303030303030303039383936383037333231303236393141433541453143344333333341453544463841393342444334393546304545424643364442304441374542364546383038463341464330303645334645373434373330343530323231303041453230343237354537433434314543443544414531383530454534413332364442364338443938424535343534304645304536414434374143444441443738303232303133374638424336423433453846333138344246433034324132373345464131333439373741453334433034423039313945414641453933424137383536314338313134414531323341383535364633434639313135343731313337364146423046383934463833324233443838313446353144464332413039443632434242413144464244443436393144414339364144393842393046222C226D657461223A2232303143303030303030303046384535313130303631323530303030303036383535314630393343333446433832344642323839313730333133443641314241353636464439414133393731393746354343424541383443424539433536443133423536393246413641394643384541363031384435443136353332443737393543393142464230383331333535424446444131373745383643384246393937393835464536323430303030303031323632343030303030303037373335393346344531453732323030303130303030323430303030303031333244303030303030303036323430303030303030373639434644373438313134414531323341383535364633434639313135343731313337364146423046383934463833324233443838313446353144464332413039443632434242413144464244443436393144414339364144393842393046453145314631303331303030222C2270726F6F66223A7B226368696C6472656E223A7B2230223A7B226368696C6472656E223A7B7D2C2268617368223A2241333434354643343645353432463533374645423344414336374139453536453638324546464642343034303132444236333341303443384637384135333533222C226B6579223A2230313138353231313841424344363244414534373034463334354431384144303044323146344344413338343432434546354135354130413838453336443136227D7D2C2268617368223A2245393634323543334135454235453543334538353846314641393039343546433733443836384542413846373444324544324243324333334338414230414541222C226B6579223A2230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030227D7D2C2276616C69646174696F6E223A7B2264617461223A7B226E394B417566666D677268585736777A676B354D476945445751583961435162627A6362636159635362586677394769516E7575223A223232383030303030303132363030303030303639323932434232444337413341384239314338433145374245383234353531423730454333443438373630464530443243383732443132454538454644394643323136353231324234323137434336463943324234364639334437363241313530313730373931333536433037393241373643433134303345383337424431353046384538394438353230413334374638464632323434303545434339463046384531353031393531453745433631444135453044463241344244383935363344324443453435353135443546413236433433323533434132304630313436353446444243323737333231303242384434373943383245334637383734423239333646383837333246374141353835414539423643333241393239453445394143444232383131433839424331373634363330343430323230344336423637363342394445454437453742363545384245443538334645463039333338364646334338304235324544433936384244463331464441453035313032323036384645413442423539413545453235363836444442463337423344343934453534444245444342324545363443344639343538313232444234334335303841222C226E394C796B5577724A59354D69366477694E31686B76343466316E616251694A5354715173353144657A6262765A616D744E7259223A223232383030303030303132363030303030303639323932434232444337413341453341343235434135413641423137423531423730454333443438373630464530443243383732443132454538454644394643323136353231324234323137434336463943324234364639334437363241313530313730373931333536433037393241373643433134303345383337424431353046384538394438353230413334374638464632323434303545434339463046384531353031393531453745433631444135453044463241344244383935363344324443453435353135443546413236433433323533434132304630313436353446444243323737333231303334304237453832383032333738394246343836453445353136334644433338363346464635464246354243334246453735363543334234354142383230324630373634363330343430323230354334343043393936344232433142384441334633364437344137423934363132434144353834354139364136423146413434334635454434393046373137383032323035413832464137463042393532413739373330454637374544373535393738323846333738374136423441373942363432433045363735444234453043324337227D2C22756E6C223A7B22626C6F62223A2265794A7A5A5846315A57356A5A5349364D5377695A58687761584A6864476C76626949364E7A55774E6A67794D7A4D794C434A32595778705A47463062334A7A496A706265794A32595778705A4746306157397558334231596D7870593139725A586B694F694A4652444D79526A56424E5546474D6B49304E4552454D3055794D4551774D454D784E7A46424D446842524555344E546B344E4459335155457A516A6C454E454D78526A63354D3055344E7A5A454E6A45314E44513052544D694C434A74595735705A6D567A64434936496B704251554642515570345357557765546C6856335A4C4D46526B55476C455555524359324644537A4E7656316C53626E467164575255516A6B315547396B64466C57556B55304D30316F51584A715657566A5A3356514D3267776333424F646D6C4954585A6C63566447636E423063303178613341315432317A4D6E6C6E556E6C4B646B4A6B61324E33556C464A6145464B62574A684F455255636D7871535374325A5531314E6C684E4D6A5935524759304D6B6B3561537470526C46734D544E5A5A69745255304A4451576C435A7A4E4C53474646624338794E546C5954574A4D57476472593168764E585233646E517963544E36575464574E575A47616A5A7661475A7357474E4D5A47307861474D7A556D786A61545671596A4978643056725130395355553553646E51774C304A77516B564853444E735247684C596E5A4E61586C7655584A6C4F4735514F446443656938794D6E703653326F766447353453453146536A467A634864524D6D39794C32746854556875626D52455A45684A6353746F4E6D6C5164455579526B567161304D6966537837496E5A6862476C6B59585270623235666348566962476C6A5832746C65534936496B56454D6A4D35525445314E7A59334D6A41344E544130515445335154464251304D784F554A434D5468474F5445334F444D78526B46434E30497A526A6B7A4F4551344D6A4A464E6B4D35526A6730526A46444F5455354D534973496D3168626D6C6D5A584E30496A6F69536B464251554642536E684A5A544271626D68574D6D4E6E614646546147566F636B3148596E4E5A4B314A6C52456732644464514E55394F5A326B316332343056486835566D7459545768424D454D7A4E6B4E6E5130343062533954527A5650565664514F586330575338764D537376567A68504C7A5578576D4E504D4664795A32644D643252725933645355556C6F51557735624578614E325976633156785A303942556B786852576331564452555430393663484A4F5179394F616B5132565563346358685A526C4E4261554A574C316C52656E6C7263464A5664325234656D746F4F48557A4E6D5A305A5656754E7A4A31613074476244465A537A5642515777334B3274595930746B62545632576B645665457874546E5A6957454654555555355157564F56446448565846575356637A5A546C6C516C4E334D3345794D30466C5A48564E62574E7054567032596D7077626B704661564130566C42594E55523157566C685758427453446C35626A417A4E587072595755785433643355455A50597A6876556C45725358467A6333647A50534A395858303D222C226D616E6966657374223A224A414141414146784965313031414E735A5A476B76666E46544F2B6A6D356C7158633566687445663268683053427A703161484E77584D6837544E392B623632635A71546E67614659553574624770594843386F59754933473376776A394F57325A3967646B416E556A6659357A4F456B687133317455343333386A637955705641352F565473414E46636537756E446F2B4A65566F456866754F622F593857413344697539587A754F4434552F696B66676639535A4F6C4F47634263424A41773434504C6A482B485574456E775834356C49526D6F30783561494E464D765A7342704539517465534442584B77597A4C646E5357346531627332316F2B49494C4A4969494B552F2B315578783046527051624D44413D3D222C227075626C69635F6B6579223A22454437344434303336433635393141344244463943353443454641333942393936413544434535463836443131464441313837343438314345394435413143444331222C227369676E6174757265223A223841444644373231393246313436394444313432314632423542323831333243303133363446384636453232333334363634304144463335464546363433343045393145464332413543373743333835363044423037443142303041313039303244354545303832433843314634363338413238384234353843343643333045222C2276657273696F6E223A317D7D7D", + "Issuer": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "Fee":"0", + "Flags":0, + "LastLedgerSequence":125, + "NetworkID":21337, + "Sequence":0, + "SigningPubKey":"02691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE", + "TransactionType":"Import", + "TxnSignature":"3045022100F874A36BD971B24F4CECD046C0CA8CE9B1C442A63C6CAB92CD2A03BDF643A51A02204D3CD4BDDCF5CFD6A0C02FDD578A09E9F031309C47826F8057CE09A2D0B8474F", + "ctid":"C000006A00005359", + "date":749919361, + "hash":"A5D875B3BBF720F8A3B504FD8B9C3A0F6692702D3121FDF1A71B12AB01C0E2C4", + "inLedger":106, + "ledger_index":106 + }, + "meta":{ + "AffectedNodes":[ + { + "ModifiedNode":{ + "FinalFields":{ + "AccountCount":"1", + "BaseFee":"a", + "Flags":0, + "ReferenceFeeUnits":10, + "ReserveBase":1000000, + "ReserveIncrement":200000, + "XahauActivationLgrSeq":0 + }, + "LedgerEntryType":"FeeSettings", + "LedgerIndex":"4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A651", + "PreviousFields":{ + "AccountCount":"0" + } + } + }, + { + "CreatedNode":{ + "LedgerEntryType":"ImportVLSequence", + "LedgerIndex":"8C3DBC376345DD153015FB05620B3AF91C64A4101DC6B22721591663AAD80D94", + "NewFields":{ + "ImportSequence":1, + "PublicKey":"ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1" + } + } + }, + { + "CreatedNode":{ + "LedgerEntryType":"AccountRoot", + "LedgerIndex":"92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "NewFields":{ + "Account":"rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance":"12000000", + "Flags":1114112, + "ImportSequence":18, + "RegularKey":"rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "Sequence":106 + } + } + } + ], + "TransactionIndex":0, + "TransactionResult":"tesSUCCESS" + }, + "validated":true + }, + "SignerList": { + "tx": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Blob": "7B226C6564676572223A7B226163726F6F74223A2239303139313439453639463532424245423134344339384635413635463443454638434646314439453042433539393032323732313541463732384145333637222C22636C6F7365223A3734393932303734312C22636F696E73223A223939393939393939393937393939393430222C2263726573223A31302C22666C616773223A302C22696E646578223A31322C2270636C6F7365223A3734393932303734302C227068617368223A2245434536444331323331413530324431343641453432413042304534383845463634373239444532413430303835423931354433304235413537433331363133222C227478726F6F74223A2230464537334244423634323644333337344235304444463131423031313430454141424235334345323237453733393136414545413946434542413946324644227D2C227472616E73616374696F6E223A7B22626C6F62223A223132303030433232303030303030303032343030303030303038323031423030303030303146323031443030303035333539323032333030303030303032363834303030303030303030314538343843373330303831313441453132334138353536463343463931313534373131333736414642304638393446383332423344463345303130373332313032383934393032313032394435434338374537384243463035334146454330434146443135313038454331313945414146454334363646354330393534303742463734343733303435303232313030443333373138363044384246303046313735433842424534303736303246444336364241434336434536413942414336414131363438454536394345373046423032323036323646353335453831364132443545413641323937303433433134464244364534413831453946453336413946423737453743433238324646394639364444383131344233383946424345443041463944434446463632393030424641454641334542383732443841393645314530313037333231303236393141433541453143344333333341453544463841393342444334393546304545424643364442304441374542364546383038463341464330303645334645373434373330343530323231303046444335423245443438363031373632433536384638394146443245464131374445383535334137363739414144414643463834393735424337364142423535303232303346314143353446354442353930363838423032464235383439324238453436323839313132374541373238384234433141303834363837463934384236383238313134463531444643324130394436324342424131444642444434363931444143393641443938423930464531463146344542313330303031383131344635314446433241303944363243424241314446424444343639314441433936414439384239304645314542313330303031383131344233383946424345443041463944434446463632393030424641454641334542383732443841393645314631222C226D657461223A22323031433030303030303030463845353131303035333536343732434431313646313434394632383032343331363943343432323731313638453336383735303437394343374232303831363137304544424443413445364537323230303031303030303230323330303030303030323230323630303030303030303334303030303030303030303030303030304634454231333030303138313134423338394642434544304146394443444646363239303042464145464133454238373244384139364531454231333030303138313134463531444643324130394436324342424131444642444434363931444143393641443938423930464531463145314531453531313030363132353030303030303042353533373342453831333432363133353445413531433436353336443030334141464438373242433343444332463034464230383843394638423635413145344645353639324641364139464338454136303138443544313635333244373739354339314246423038333133353542444644413137374538364338424639393739383546453632343030303030303038363234303030303030303737333539334634453145373232303030303030303032343030303030303039324430303030303030313632343030303030303037373137304636383831313441453132334138353536463343463931313534373131333736414642304638393446383332423344453145314631303331303030222C2270726F6F66223A7B226368696C6472656E223A7B2236223A7B226368696C6472656E223A7B7D2C2268617368223A2245433137383244343235453641384230313139354134353737414132463046433333434343464430413246333745354438343636354345334146433144374646222C226B6579223A2236314533353037463543344241433730383435324645444531423543363343393239334145343532374441424544353339343336343736433736303035304543227D7D2C2268617368223A2230464537334244423634323644333337344235304444463131423031313430454141424235334345323237453733393136414545413946434542413946324644222C226B6579223A2230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030227D7D2C2276616C69646174696F6E223A7B2264617461223A7B226E394B417566666D677268585736777A676B354D476945445751583961435162627A6362636159635362586677394769516E7575223A2232323830303030303031323630303030303030433239324342324531453333413944343041343142363633333242374635313342313239373331413134394543414631393336373542423339383846453946394531323842373432313838363846453935433134463943324233323634323735303137414246333931314334383339444130463330373030454443394444434233374333383046383635414443373133323734343733313443373839374138423042433530313945434536444331323331413530324431343641453432413042304534383845463634373239444532413430303835423931354433304235413537433331363133373332313032423844343739433832453346373837344232393336463838373332463741413538354145394236433332413932394534453941434442323831314338394243313736343733303435303232313030453137353341333431303632363443313137333643304232334636353544433845304137444131303434374139413542314546373943384533434635434633313032323031414646353838394646333546334343424434333836373131333742313945453133394644373036334245324641314231423932443735393739393342394341222C226E394C796B5577724A59354D69366477694E31686B76343466316E616251694A5354715173353144657A6262765A616D744E7259223A223232383030303030303132363030303030303043323932434232453145343341434538423738394636433341434130343531334231323937333141313439454341463139333637354242333938384645394639453132384237343231383836384645393543313446394332423332363432373530313741424633393131433438333944413046333037303045444339444443423337433338304638363541444337313332373434373331344337383937413842304243353031394543453644433132333141353032443134364145343241304230453438384546363437323944453241343030383542393135443330423541353743333136313337333231303334304237453832383032333738394246343836453445353136334644433338363346464635464246354243334246453735363543334234354142383230324630373634363330343430323230363931394635363145384637373044303642333134344637363643463538334441414235393134353942334144363241324436353742304336383935353339433032323037333843333336414633464545414631453041334245423531313033353130453243383936393145373536444145304433313735374338453145453336463934227D2C22756E6C223A7B22626C6F62223A2265794A7A5A5846315A57356A5A5349364D5377695A58687761584A6864476C76626949364E7A55774E6A67794D7A4D794C434A32595778705A47463062334A7A496A706265794A32595778705A4746306157397558334231596D7870593139725A586B694F694A4652444D79526A56424E5546474D6B49304E4552454D3055794D4551774D454D784E7A46424D446842524555344E546B344E4459335155457A516A6C454E454D78526A63354D3055344E7A5A454E6A45314E44513052544D694C434A74595735705A6D567A64434936496B704251554642515570345357557765546C6856335A4C4D46526B55476C455555524359324644537A4E7656316C53626E467164575255516A6B315547396B64466C57556B55304D30316F51584A715657566A5A3356514D3267776333424F646D6C4954585A6C63566447636E423063303178613341315432317A4D6E6C6E556E6C4B646B4A6B61324E33556C464A6145464B62574A684F455255636D7871535374325A5531314E6C684E4D6A5935524759304D6B6B3561537470526C46734D544E5A5A69745255304A4451576C435A7A4E4C53474646624338794E546C5954574A4D57476472593168764E585233646E517963544E36575464574E575A47616A5A7661475A7357474E4D5A47307861474D7A556D786A61545671596A4978643056725130395355553553646E51774C304A77516B564853444E735247684C596E5A4E61586C7655584A6C4F4735514F446443656938794D6E703653326F766447353453453146536A467A634864524D6D39794C32746854556875626D52455A45684A6353746F4E6D6C5164455579526B567161304D6966537837496E5A6862476C6B59585270623235666348566962476C6A5832746C65534936496B56454D6A4D35525445314E7A59334D6A41344E544130515445335154464251304D784F554A434D5468474F5445334F444D78526B46434E30497A526A6B7A4F4551344D6A4A464E6B4D35526A6730526A46444F5455354D534973496D3168626D6C6D5A584E30496A6F69536B464251554642536E684A5A544271626D68574D6D4E6E614646546147566F636B3148596E4E5A4B314A6C52456732644464514E55394F5A326B316332343056486835566D7459545768424D454D7A4E6B4E6E5130343062533954527A5650565664514F586330575338764D537376567A68504C7A5578576D4E504D4664795A32644D643252725933645355556C6F51557735624578614E325976633156785A303942556B786852576331564452555430393663484A4F5179394F616B5132565563346358685A526C4E4261554A574C316C52656E6C7263464A5664325234656D746F4F48557A4E6D5A305A5656754E7A4A31613074476244465A537A5642515777334B3274595930746B62545632576B645665457874546E5A6957454654555555355157564F56446448565846575356637A5A546C6C516C4E334D3345794D30466C5A48564E62574E7054567032596D7077626B704661564130566C42594E55523157566C685758427453446C35626A417A4E587072595755785433643355455A50597A6876556C45725358467A6333647A50534A395858303D222C226D616E6966657374223A224A414141414146784965313031414E735A5A476B76666E46544F2B6A6D356C7158633566687445663268683053427A703161484E77584D6837544E392B623632635A71546E67614659553574624770594843386F59754933473376776A394F57325A3967646B416E556A6659357A4F456B687133317455343333386A637955705641352F565473414E46636537756E446F2B4A65566F456866754F622F593857413344697539587A754F4434552F696B66676639535A4F6C4F47634263424A41773434504C6A482B485574456E775834356C49526D6F30783561494E464D765A7342704539517465534442584B77597A4C646E5357346531627332316F2B49494C4A4969494B552F2B315578783046527051624D44413D3D222C227075626C69635F6B6579223A22454437344434303336433635393141344244463943353443454641333942393936413544434535463836443131464441313837343438314345394435413143444331222C227369676E6174757265223A223841444644373231393246313436394444313432314632423542323831333243303133363446384636453232333334363634304144463335464546363433343045393145464332413543373743333835363044423037443142303041313039303244354545303832433843314634363338413238384234353843343643333045222C2276657273696F6E223A317D7D7D", + "Fee": "0", + "Flags": 0, + "LastLedgerSequence": 32, + "NetworkID": 21337, + "Sequence": 0, + "Signers": [ + { + "Signer": { + "Account": "rH4KEcG9dEwGwpn6AyoWK9cZPLL4RLSmWW", + "SigningPubKey": "028949021029D5CC87E78BCF053AFEC0CAFD15108EC119EAAFEC466F5C095407BF", + "TxnSignature": "304402207288179A250F0F48B990AF7C8032FDA4CB59979173200BA13E12B6A7798E6AFB02202F9D61B6EE3D8C67AAAE8D8421A33AE1E6B67B49A0DD8973930144B1BB360F42" + } + }, + { + "Signer": { + "Account": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "SigningPubKey": "02691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE", + "TxnSignature": "30450221008F33A023D09085056A86D678D6DE125080228ACABD82000FE82658C771FA057B02207FD82CE2903A6A1535C812A050985CEB06A36FA2BE932E22B90159DFE26746FF" + } + } + ], + "SigningPubKey": "", + "TransactionType": "Import", + "ctid": "C000000E00005359", + "date": 749920742, + "hash": "7098E74C2F30F01B97369086509F168DCFC5D8CD25CC287567B62C196E943BA8", + "inLedger": 14, + "ledger_index": 14 + }, + "meta": { + "AffectedNodes": [ + { + "CreatedNode": { + "LedgerEntryType": "SignerList", + "LedgerIndex": "472CD116F1449F280243169C442271168E368750479CC7B20816170EDBDCA4E6", + "NewFields": { + "Flags": 65536, + "SignerEntries": [ + { + "SignerEntry": { + "Account": "rH4KEcG9dEwGwpn6AyoWK9cZPLL4RLSmWW", + "SignerWeight": 1 + } + }, + { + "SignerEntry": { + "Account": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "SignerWeight": 1 + } + } + ], + "SignerQuorum": 2 + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "AccountCount": "1", + "BaseFee": "a", + "Flags": 0, + "ReferenceFeeUnits": 10, + "ReserveBase": 1000000, + "ReserveIncrement": 200000, + "XahauActivationLgrSeq": 0 + }, + "LedgerEntryType": "FeeSettings", + "LedgerIndex": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A651", + "PreviousFields": { + "AccountCount": "0" + } + } + }, + { + "CreatedNode": { + "LedgerEntryType": "ImportVLSequence", + "LedgerIndex": "8C3DBC376345DD153015FB05620B3AF91C64A4101DC6B22721591663AAD80D94", + "NewFields": { + "ImportSequence": 1, + "PublicKey": "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1CDC1" + } + } + }, + { + "CreatedNode": { + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "NewFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "4000012", + "Flags": 1048576, + "ImportSequence": 8, + "OwnerCount": 1, + "Sequence": 14 + } + } + }, + { + "CreatedNode": { + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D", + "NewFields": { + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "RootIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + }, + "validated": true + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/InvokeTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/InvokeTx.json new file mode 100644 index 000000000..c2c9a8042 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/InvokeTx.json @@ -0,0 +1,54 @@ +{ + "tx": { + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "Destination": "rrrrrrrrrrrrrrrrrrrrbzbvji", + "InvoiceID": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "DestinationTag": 1337, + "Fee": "28", + "Flags": 0, + "Blob": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "HookParameters": [ + { + "HookParameter": { + "HookParameterName": "54455354", + "HookParameterValue": "DEADBEEF" + } + } + ], + "LastLedgerSequence": 64, + "NetworkID": 21337, + "Sequence": 13, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "Invoke", + "TxnSignature": "3044022047815A2C433D05290579551F821AB09AE20A9639A2C149BD85EFA096F1F429F902200ECDF3FB8F4F928A6711D3F27294C0E4732374A4A3811BA9D2BFA53C520B1BB3", + "ctid": "C000002D00005359", + "date": 749730271, + "hash": "AE44B4FC8E5ECF634E2E9590D6E501892A6C2DB24313297EAB11600AEFDCD148", + "inLedger": 45, + "ledger_index": 45, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "Balance": "19999999932", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 14 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19999999960", + "Sequence": 13 + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenAcceptOfferTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenAcceptOfferTx.json new file mode 100644 index 000000000..14c058b8a --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenAcceptOfferTx.json @@ -0,0 +1,401 @@ +{ + "tx": { + "Account": "rrrrrrrrrrrrrrrrrrrrbzbvji", + "Fee": "12", + "Flags": 0, + "LastLedgerSequence": 1889209, + "NFTokenSellOffer": "D68E2D453EBA6468C3BE8FFE4F73EA077A5B7EE6712082D213212D83FDF7245E", + "NFTokenBuyOffer": "13471FEBC1F76E6174D4FE5E334BD8DF1C7243EFFD7583A5DDB75DD2EC3CB347", + "NFTokenBrokerFee": "1000000", + "Sequence": 1166479, + "SigningPubKey": "EDB9A1F05A7A91250ECB784754F3BEC3A76C3DAB34F28FAC570798EC0B0817407D", + "TransactionType": "NFTokenAcceptOffer", + "TxnSignature": "53275DA6103CC8CFFFE014305D9934F317F4DCC0A3472B064F5BFAE58F3136D9C6CD33A568688FE2C490A52025E4466939B749B067B6929CD619C6CE62BA150C", + "date": "2022-05-06T20:13:30Z" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rrrrrrrrrrrrrrrrrrrrbzbvji", + "Balance": "9999997732", + "Flags": 0, + "OwnerCount": 11, + "Sequence": 1166480 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "471307512702DC1933C63B795519B8BF08BC4EAD840D87BD84AA98A1EB90DDF6", + "PreviousFields": { + "Balance": "9999997846", + "Sequence": 1166479 + }, + "PreviousTxnID": "3328F7B354E5CDFEA6AB076740482657BE1A2FE93060B591A5B42846E7667270", + "PreviousTxnLgrSeq": 1889190 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "NFTokens": [ + { + "NFToken": { + "NFTokenID": "00080000E7F5BAC19E99193969DAC1452B90558C1F9D5C6D0000099B00000000", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "00080000E7F5BAC19E99193969DAC1452B90558C1F9D5C6D16E5DA9C00000001", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "00080000E7F5BAC19E99193969DAC1452B90558C1F9D5C6D2DCBAB9D00000002", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "00080000E7F5BAC19E99193969DAC1452B90558C1F9D5C6D44B17C9E00000003", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C0000099B00000000", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C0A85CBBC00000022", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C216B9CBF00000023", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + } + ] + }, + "LedgerEntryType": "NFTokenPage", + "LedgerIndex": "4AC8FAD7D35E374F513CA5A7D12AC2029CBB4944FFFFFFFFFFFFFFFFFFFFFFFF", + "PreviousFields": { + "NFTokens": [ + { + "NFToken": { + "NFTokenID": "00080000E7F5BAC19E99193969DAC1452B90558C1F9D5C6D0000099B00000000", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "00080000E7F5BAC19E99193969DAC1452B90558C1F9D5C6D16E5DA9C00000001", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "00080000E7F5BAC19E99193969DAC1452B90558C1F9D5C6D2DCBAB9D00000002", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "00080000E7F5BAC19E99193969DAC1452B90558C1F9D5C6D44B17C9E00000003", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C0000099B00000000", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C0A85CBBC00000022", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + } + ] + }, + "PreviousTxnID": "8318D2B2FEF3E2A730BD4FC2DFE471C3766739868778A04E7D80E14F3A3F0E6E", + "PreviousTxnLgrSeq": 1889166 + } + }, + { + "DeletedNode": { + "FinalFields": { + "Amount": "102", + "Flags": 1, + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C216B9CBF00000023", + "NFTokenOfferNode": "0", + "Owner": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", + "OwnerNode": "0", + "PreviousTxnID": "7D78020F85A1781BD4E551790D33E7290D7A0D2072324D65CAE68AD74CD15E45", + "PreviousTxnLgrSeq": 1889190 + }, + "LedgerEntryType": "NFTokenOffer", + "LedgerIndex": "D68E2D453EBA6468C3BE8FFE4F73EA077A5B7EE6712082D213212D83FDF7245E" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "NFTokens": [ + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C38516DBE00000024", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C3C7172B500000019", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C409177A80000000E", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C44B17C9E00000003", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C4F373EC100000025", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C535743B40000001A", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C577748AB0000000F", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C5B974D9F00000004", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C661D0FC000000026", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C6A3D14B70000001B", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C6E5D19AA00000010", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C727D1EA100000005", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C7D02E0C300000027", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8122E5B60000001C", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8542EAAD00000011", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + } + ], + "NextPageMin": "6203F49C21D5D6E022CB16DE3538F248662FC73CFFFFFFFFFFFFFFFFFFFFFFFF" + }, + "LedgerEntryType": "NFTokenPage", + "LedgerIndex": "6203F49C21D5D6E022CB16DE3538F248662FC73C662FC73C8962EFA000000006", + "PreviousFields": { + "NFTokens": [ + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C216B9CBF00000023", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C38516DBE00000024", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C3C7172B500000019", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C409177A80000000E", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C44B17C9E00000003", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C4F373EC100000025", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C535743B40000001A", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C577748AB0000000F", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C5B974D9F00000004", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C661D0FC000000026", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C6A3D14B70000001B", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C6E5D19AA00000010", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C727D1EA100000005", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C7D02E0C300000027", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8122E5B60000001C", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + }, + { + "NFToken": { + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8542EAAD00000011", + "URI": "68747470733A2F2F677265677765697362726F642E636F6D" + } + } + ] + }, + "PreviousTxnID": "8318D2B2FEF3E2A730BD4FC2DFE471C3766739868778A04E7D80E14F3A3F0E6E", + "PreviousTxnLgrSeq": 1889166 + } + }, + { + "DeletedNode": { + "FinalFields": { + "Flags": 2, + "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C216B9CBF00000023", + "RootIndex": "AAD0CD65F5E4B4E54448973E81605DC53F2D063379E5CE5831E6F9220F79638C" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "AAD0CD65F5E4B4E54448973E81605DC53F2D063379E5CE5831E6F9220F79638C" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", + "RootIndex": "AD6F3AF6156005C0482079B801CC331F212FDE722B4F0714B0563173F303C345" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "AD6F3AF6156005C0482079B801CC331F212FDE722B4F0714B0563173F303C345" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", + "Balance": "10000000004", + "BurnedNFTokens": 6, + "Flags": 0, + "MintedNFTokens": 42, + "OwnerCount": 10, + "Sequence": 1166489 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "BE121B82D5812149D633F605EB07265A80B762A365CE94883089FEEE4B955701", + "PreviousFields": { + "Balance": "9999999902", + "OwnerCount": 11 + }, + "PreviousTxnID": "7D78020F85A1781BD4E551790D33E7290D7A0D2072324D65CAE68AD74CD15E45", + "PreviousTxnLgrSeq": 1889190 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + }, + "hash": "553922B202932DD500C6E0D6905BA1D8ACC0DF746519DD6AAA724AF70D23F1E6", + "ledger_index": 1889191 +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenBurnTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenBurnTx.json new file mode 100644 index 000000000..303bf6dbe --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenBurnTx.json @@ -0,0 +1,10 @@ +{ + "tx": { + "TransactionType": "NFTokenBurn", + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "Owner": "rrrrrrrrrrrrrrrrrrrrbzbvji", + "Fee": "10", + "NFTokenID": "000B013A95F14B0044F78A264E41713C64B5F89242540EE208C3098E00000D65" + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenCancelOfferTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenCancelOfferTx.json new file mode 100644 index 000000000..1d12facbe --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenCancelOfferTx.json @@ -0,0 +1,11 @@ +{ + "tx": { + "TransactionType": "NFTokenCancelOffer", + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "NFTokenOffers": [ + "9C92E061381C1EF37A8CDE0E8FC35188BFC30B1883825042A64309AC09F4C36D", + "736A0B59D00E8F74CABDB6A4217FC8E8E0F19A2EDB3F9145F4021E950746106F" + ] + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenCreateOfferTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenCreateOfferTx.json new file mode 100644 index 000000000..bd074ea29 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenCreateOfferTx.json @@ -0,0 +1,24 @@ +{ + "sellOffer": { + "tx": { + "TransactionType": "NFTokenCreateOffer", + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "NFTokenID": "000100001E962F495F07A990F4ED55ACCFEEF365DBAA76B6A048C0A200000007", + "Amount": "1000000", + "Owner": "rrrrrrrrrrrrrrrrrrrrbzbvji", + "Destination": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "Expiration": 570113521, + "Flags": 1 + }, + "meta": {} + }, + "buyOffer": { + "tx": { + "TransactionType": "NFTokenCreateOffer", + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "NFTokenID": "000100001E962F495F07A990F4ED55ACCFEEF365DBAA76B6A048C0A200000007", + "Amount": "1000000" + }, + "meta": {} + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenMintTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenMintTx.json new file mode 100644 index 000000000..caeb5c9bc --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/NFTokenMintTx.json @@ -0,0 +1,646 @@ +{ + "tx": { + "Account": "rXMART8usFd5kABXCayoP6ZfB35b4v43t", + "Fee": "12", + "Flags": 8, + "Issuer": "ra5jrnrq9BxsvzGeJY5XS9inftcJWMdJUx", + "LastLedgerSequence": 84235092, + "Memos": [ + { + "Memo": { + "MemoData": "68747470733A2F2F786D6172742E6172742F766965772D6E66742F64333939353861386534393063323635343734343864616433316534613265353A31363637323331383132363439", + "MemoType": "784D6172742D4E46542D6D696E74" + } + } + ], + "NFTokenTaxon": 48, + "Sequence": 72576766, + "SigningPubKey": "ED8BB649713ED492AE35B4B5CA745CCA55ADF8EF4CEDB2CC8BA4E28557E993AD2F", + "TransactionType": "NFTokenMint", + "TransferFee": 5000, + "TxnSignature": "DBBF5DE93EED808D0E9FD5143FC24F926C8D33483700B7EFE480B19DA17EA5E2BC96313EA523B7C0662DE718C71090560745F0B009F3B4C1AADB6F656E7B0200", + "URI": "697066733A2F2F62616679626569646272676F706B373763657764723771666B6F62736A71356D70367A706A68333736623474627235343268726C627561637266712F6D657461646174612E6A736F6E", + "hash": "43491361F729EEB2B23A220B136782FFD389D9659FE81D0CB38688E6BBD93986" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "NFTokens": [ + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9D86540E100000E3B", + "URI": "697066733A2F2F626166796265696273776B37683571666B747470683471683436777733713662796B7365737A643374667A707264613272633665756F36787333612F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9D995555900000AD3", + "URI": "697066733A2F2F626166796265696576723779336F72756F6A7434686D69756B37726167753273617267786371366B766D666F756F746F6377656C326B346C7574612F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9DDB55E5400000AC8", + "URI": "697066733A2F2F6261667962656967776D366D766B63643762356879657670366E70656132356C797A6675686F6C7666776E333476677A756B6875726D32776A76752F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9DECB023400000E68", + "URI": "697066733A2F2F62616679626569627A6F353263697532336574736C796A6B3273736766737774677036633633726C726B66797763716932737370637979373266752F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E0A54EF700000E25", + "URI": "697066733A2F2F626166796265696174356A3634706A627969616961646F736234666B68776F686777696868767237696765646C37327A64756C6E74647A726868792F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E13D553B00000C71", + "URI": "697066733A2F2F626166796265696774736761356F6670356F376E376434736472736D63686672366437636F3272797A327263736362656B6B3373756764667572342F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E2EB06CF00000E5D", + "URI": "697066733A2F2F6261667962656966703573736275706C796F6A3535746E356F667A6135796D6C686E673677717A64336265786268337479656D74673477367832692F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E41B1BA700000AF5", + "URI": "697066733A2F2F62616679626569617073356F736C6279323232357132746B6B3562367A74356661756D353271743268686533677436757864707A6C6A706F6637752F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E4C5538200000E1A", + "URI": "697066733A2F2F6261667962656967336A65326D6F6A6D6F326675786F69796F6171357A767562746C71347A71617277746F34736E6B64626D376A673275356175712F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E530BF0700000E95", + "URI": "697066733A2F2F6261667962656961356F756C366C6E6B6D336C78697A64743776726C766A72767063796E777A7668693375683374787436793637726771786676692F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E70B0BDA00000E52", + "URI": "697066733A2F2F6261667962656966676D756A657875336B6177796B6E71326B7076796933646C32776F62716F6C3471627062767261657A79686C7137346F666B712F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E7FC53EC00000840", + "URI": "697066733A2F2F62616679626569646E6E7563356C6A356C6B35377A64616A7267683470737A753476357A3737797565326D7276766536617A66646F356F633472692F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E83B1CB200000AEA", + "URI": "697066733A2F2F62616679626569666E3274677A69716D7A356173786B707A6A6862786B696C6337647364726662347332723469626870326F686B706B73346B63692F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E8E5549D00000E0F", + "URI": "697066733A2F2F62616679626569616D7373757A77677A336263773272676E666275736D706A726E653461696A796D7A7476743535616D72686B76377561746779792F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9E950C01200000E8A", + "URI": "697066733A2F2F626166796265696136376F6872797832757663686978776763706F6833746A3536746E666A7463726E366175616F32647234323377346D737475692F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9EA033F5E000005CE", + "URI": "68747470733A2F2F626166796265696175766575646F767A6C6A676A347A666637716F6137786A7163326165797361327979656E7064736565737673746C78736375712E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9EB2B0CD500000E47", + "URI": "697066733A2F2F626166796265696237677074356F6967376C6E787864746671347468743733757035706C76356B6C63777674346174787A3577696C776735726C6D2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9EC1C54E700000835", + "URI": "697066733A2F2F62616679626569677077766D35346469727034736B6732336137776869623733696C3432616A376C6F666871377464796C356633666F67646A36792F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9EC5B214D00000ADF", + "URI": "697066733A2F2F62616679626569656B6A7470337663337333337A7376677469627971333676737A326D346D34767A346C6167666966776E6B72637A3661616F6F752F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9ED70C52D00000E7F", + "URI": "697066733A2F2F6261667962656968616C366C6D64707969773736686D34616E65757A78727A6F6D69356D76706632347176773434797068797470686175707666712F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9EF4B11E000000E3C", + "URI": "697066733A2F2F6261667962656967667A6236756C7A70796B75737135796E6379787532357377686937376F62326273736D6F6432367A6E78626C646C74647433752F6D657461646174612E6A736F6E" + } + } + ], + "NextPageMin": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD35DE41DEA2A0A6BF00000518", + "PreviousPageMin": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD31113FA9D78E69D700000D45" + }, + "LedgerEntryType": "NFTokenPage", + "LedgerIndex": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD31113FA9F0464448000018E4", + "PreviousFields": { + "NextPageMin": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD446B0EC5184C788F00000B24" + }, + "PreviousTxnID": "2413C2CE13ACEE12FB285B4D7B030518BFD0FD7B214A2C462C17BD642F7E57AA", + "PreviousTxnLgrSeq": 84136367 + } + }, + { + "CreatedNode": { + "LedgerEntryType": "NFTokenPage", + "LedgerIndex": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD35DE41DEA2A0A6BF00000518", + "NewFields": { + "NFTokens": [ + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F07B2A5800000AD4", + "URI": "697066733A2F2F62616679626569686732376B757A746C6E786D7575716A757578357A6A7A3234666A6E6471767670787770667762696569626563707634683367752F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F49B2F5300000AC9", + "URI": "697066733A2F2F6261667962656967367974777969656B6A667A61767036676E377A716B646F77336575703577346C637536737473776F74367975676178673270692F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F5B0D33300000E69", + "URI": "697066733A2F2F6261667962656965347577357675716C68756135356272367062366E6D73693661676E71626E66637A63746A7533747A6A6E6B6E736E337877796D2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F78B1FF600000E26", + "URI": "697066733A2F2F6261667962656965666A3467796537366B6765616565706532646D347775623636696E327A6A6277336A637035656B64696A346D617A646E7078792F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F7F68B0B00000EA1", + "URI": "697066733A2F2F626166796265696232757566786E36656D32336F33616E7A637A736F757274643569786864796232676C656D7933616B7067636B6A7433753668692F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F8232A3A00000C72", + "URI": "697066733A2F2F62616679626569673437617736667432766C7477336D357968326769766F75656A367A68786377707A706C6566336E366E746F75706E71686264792F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F9D0D7CE00000E5E", + "URI": "697066733A2F2F6261667962656962656673616A73757535756A796E75686A6E77793337746A696264636476746E73736B74616969746B6B76656667796D353479342F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FB00E8A600000AF6", + "URI": "697066733A2F2F6261667962656962656972686465617A6D357563336E77356478726E3335633475346164726B7261627A72667175797072697270637A71357575342F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FBAB208100000E1B", + "URI": "697066733A2F2F6261667962656964637165356135766874706A7A6C326867717A6335626A70796369646D70676C61716A6B7A7237356C726232637A7865353262612F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FC168C0600000E96", + "URI": "697066733A2F2F62616679626569656174746B69623575686C646C626C65376777696C36797A68656F7A7A767967786C716567376934617863767A757A36356B72792F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FDF0D8D900000E53", + "URI": "697066733A2F2F62616679626569616376716836763572323777697065346C346B616F71346E626A6B6477643473776A6B736B6C35346B6C3533367165366574616D2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FEE220EB00000841", + "URI": "697066733A2F2F62616679626569643479746B7478666873796969746B66357374626E646C3365763475646B6F673662356337753636773279346B6F67656F3537752F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FF20EDB100000AEB", + "URI": "697066733A2F2F626166796265696277777A796C373561336A7234687234766363626E7533657A3579366D6A7364776C676C7136717A366A776A6B7A336D707975342F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FFCB259C00000E10", + "URI": "697066733A2F2F62616679626569676B706B79796D6C6C79643773366B6C7174667566717936363773756A6F70793570353335377475726B647A3532796F6D7272652F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813886C71F64E361D03D8C00A99D99371ABBD35DE41DE0586ACBF00000B18", + "URI": "68747470733A2F2F62616679626569626D37727677717264666933346B7A61656B776D726465617370696265716262716F3377666979797870356836356136753674692E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813886C71F64E361D03D8C00A99D99371ABBD35DE41DE4C6BAA190000067A", + "URI": "68747470733A2F2F6261667962656966676F71693476647A6F777479677A6A67687A6469336B61356969326662687A6D7173366B78326468727A7A767534346E6768652E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + } + ], + "NextPageMin": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD446B0EC5184C788F00000B24", + "PreviousPageMin": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD31113FA9F0464448000018E4" + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "NFTokens": [ + { + "NFToken": { + "NFTokenID": "000813886C71F64E361D03D8C00A99D99371ABBD35DE41DEA2A0A6BF00000518", + "URI": "643274356465703837303637626166793662396563693766323135676C3666363779347531613035393467776633366D6A33657462643478763777687A6265747334717963796977336578647A7961612E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813886C71F64E361D03D8C00A99D99371ABBD35DE41DEE75219BA0000051B", + "URI": "686876747470733A3533786163776733617861362F766965772D6E66742F613634626237316663333830306461646174612E6A73336F6333" + } + }, + { + "NFToken": { + "NFTokenID": "00081B5847D9243F76287C3C34F87C0AB342A79536C07F37E31F681C0000004D", + "URI": "697066733A2F2F626166796265696878696C37786F65716E6466727A62746E706F36646F68766134757373796C633762366E656E6235773274677365776B647572652F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0D2C5CCA9B000000C0", + "URI": "68747470733A2F2F626166796265696373636D6A7768686A6A636D6D7664363464357336636136336D743636337467706973687870356C337132736236706672776C6D2E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0D93E8B10300000028", + "URI": "68747470733A2F2F6261667962656964326768726F776A6C756867656B7569797A6B6762686974356632686B713637766B6362796F6E6C7173696E6565356D7A7874342E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DA048C06200000007", + "URI": "68747470733A2F2F62616679626569667032636E62666B6371726F7262736F747971773336376C63676C65346971673236776462777A687033766B79696E73767A69612E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DAACE820400000029", + "URI": "68747470733A2F2F6261667962656968697676766873723768767078353574696D696C6167366E797670336C69773469617A33793567787A6D766A33616866696735712E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DB72E916300000008", + "URI": "68747470733A2F2F62616679626569636C71326A7272633370756C6B6C7836377074356B6B6378626A6C7067666A357069326D326E66626E7132696F6B376D7A7737712E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DC1B453050000002A", + "URI": "68747470733A2F2F62616679626569613434337872766C7871737A663774703378726A796B6976736536636134756F736734327378737768363764336B6F356933656D2E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DCE14626400000009", + "URI": "68747470733A2F2F62616679626569636837356135377863706E766B756A626A647A6C733266786961616F367A627763636C647972346761646E3471623737657768652E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DE4FA33650000000A", + "URI": "68747470733A2F2F626166796265696165376A6F66766A61736E713471363674723536646A776E6B3769757834376A75757675337777376C6C64667A6F6135636D32752E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DFBE004660000000B", + "URI": "68747470733A2F2F62616679626569636E6E62766472676833647032357376756D756161716273346B75746A676C707A673733637274696971643437707767773268792E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC50166A78E00000B23", + "URI": "68747470733A2F2F6261667962656966656464777266356F35376A6B6C63356A75786C6835326F697076686167706B627637746E6A776F77727A6C7A756779666C626D2E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC503AC5FC600000B5B", + "URI": "68747470733A2F2F62616679626569636869746E766B716233716F7A346168706735666E366E333663637A7775716F6F6568626B636D657A796A716B67787263636B712E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC50586AC8300000B18", + "URI": "68747470733A2F2F6261667962656967346777686D6D326E3372726A7669677062736E7677756763666E7561626466666D6D6C3770707677346A796836726A61726F712E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC505C73BA9047ED3FE", + "URI": "697066733A2F2F62616679626569646272676F706B373763657764723771666B6F62736A71356D70367A706A68333736623474627235343268726C627561637266712F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC509A6B19800000B0D", + "URI": "68747470733A2F2F62616679626569637161633376646D7762773236636474376D7137616B776D67376670326D687565343664376A35746D68726E6D7064716433336D2E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + } + ], + "NextPageMin": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD446B0EC5912F4AC100000B56", + "PreviousPageMin": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD35DE41DEA2A0A6BF00000518" + }, + "LedgerEntryType": "NFTokenPage", + "LedgerIndex": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD446B0EC5184C788F00000B24", + "PreviousFields": { + "NFTokens": [ + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F07B2A5800000AD4", + "URI": "697066733A2F2F62616679626569686732376B757A746C6E786D7575716A757578357A6A7A3234666A6E6471767670787770667762696569626563707634683367752F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F49B2F5300000AC9", + "URI": "697066733A2F2F6261667962656967367974777969656B6A667A61767036676E377A716B646F77336575703577346C637536737473776F74367975676178673270692F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F5B0D33300000E69", + "URI": "697066733A2F2F6261667962656965347577357675716C68756135356272367062366E6D73693661676E71626E66637A63746A7533747A6A6E6B6E736E337877796D2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F78B1FF600000E26", + "URI": "697066733A2F2F6261667962656965666A3467796537366B6765616565706532646D347775623636696E327A6A6277336A637035656B64696A346D617A646E7078792F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F7F68B0B00000EA1", + "URI": "697066733A2F2F626166796265696232757566786E36656D32336F33616E7A637A736F757274643569786864796232676C656D7933616B7067636B6A7433753668692F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F8232A3A00000C72", + "URI": "697066733A2F2F62616679626569673437617736667432766C7477336D357968326769766F75656A367A68786377707A706C6566336E366E746F75706E71686264792F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9F9D0D7CE00000E5E", + "URI": "697066733A2F2F6261667962656962656673616A73757535756A796E75686A6E77793337746A696264636476746E73736B74616969746B6B76656667796D353479342F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FB00E8A600000AF6", + "URI": "697066733A2F2F6261667962656962656972686465617A6D357563336E77356478726E3335633475346164726B7261627A72667175797072697270637A71357575342F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FBAB208100000E1B", + "URI": "697066733A2F2F6261667962656964637165356135766874706A7A6C326867717A6335626A70796369646D70676C61716A6B7A7237356C726232637A7865353262612F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FC168C0600000E96", + "URI": "697066733A2F2F62616679626569656174746B69623575686C646C626C65376777696C36797A68656F7A7A767967786C716567376934617863767A757A36356B72792F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FDF0D8D900000E53", + "URI": "697066733A2F2F62616679626569616376716836763572323777697065346C346B616F71346E626A6B6477643473776A6B736B6C35346B6C3533367165366574616D2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FEE220EB00000841", + "URI": "697066733A2F2F62616679626569643479746B7478666873796969746B66357374626E646C3365763475646B6F673662356337753636773279346B6F67656F3537752F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FF20EDB100000AEB", + "URI": "697066733A2F2F626166796265696277777A796C373561336A7234687234766363626E7533657A3579366D6A7364776C676C7136717A366A776A6B7A336D707975342F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081B58960BD7654DAFCBA827DA3DBCD74D515231113FA9FFCB259C00000E10", + "URI": "697066733A2F2F62616679626569676B706B79796D6C6C79643773366B6C7174667566717936363773756A6F70793570353335377475726B647A3532796F6D7272652F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813886C71F64E361D03D8C00A99D99371ABBD35DE41DE0586ACBF00000B18", + "URI": "68747470733A2F2F62616679626569626D37727677717264666933346B7A61656B776D726465617370696265716262716F3377666979797870356836356136753674692E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813886C71F64E361D03D8C00A99D99371ABBD35DE41DE4C6BAA190000067A", + "URI": "68747470733A2F2F6261667962656966676F71693476647A6F777479677A6A67687A6469336B61356969326662687A6D7173366B78326468727A7A767534346E6768652E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813886C71F64E361D03D8C00A99D99371ABBD35DE41DEA2A0A6BF00000518", + "URI": "643274356465703837303637626166793662396563693766323135676C3666363779347531613035393467776633366D6A33657462643478763777687A6265747334717963796977336578647A7961612E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813886C71F64E361D03D8C00A99D99371ABBD35DE41DEE75219BA0000051B", + "URI": "686876747470733A3533786163776733617861362F766965772D6E66742F613634626237316663333830306461646174612E6A73336F6333" + } + }, + { + "NFToken": { + "NFTokenID": "00081B5847D9243F76287C3C34F87C0AB342A79536C07F37E31F681C0000004D", + "URI": "697066733A2F2F626166796265696878696C37786F65716E6466727A62746E706F36646F68766134757373796C633762366E656E6235773274677365776B647572652F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0D2C5CCA9B000000C0", + "URI": "68747470733A2F2F626166796265696373636D6A7768686A6A636D6D7664363464357336636136336D743636337467706973687870356C337132736236706672776C6D2E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0D93E8B10300000028", + "URI": "68747470733A2F2F6261667962656964326768726F776A6C756867656B7569797A6B6762686974356632686B713637766B6362796F6E6C7173696E6565356D7A7874342E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DA048C06200000007", + "URI": "68747470733A2F2F62616679626569667032636E62666B6371726F7262736F747971773336376C63676C65346971673236776462777A687033766B79696E73767A69612E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DAACE820400000029", + "URI": "68747470733A2F2F6261667962656968697676766873723768767078353574696D696C6167366E797670336C69773469617A33793567787A6D766A33616866696735712E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DB72E916300000008", + "URI": "68747470733A2F2F62616679626569636C71326A7272633370756C6B6C7836377074356B6B6378626A6C7067666A357069326D326E66626E7132696F6B376D7A7737712E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DC1B453050000002A", + "URI": "68747470733A2F2F62616679626569613434337872766C7871737A663774703378726A796B6976736536636134756F736734327378737768363764336B6F356933656D2E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DCE14626400000009", + "URI": "68747470733A2F2F62616679626569636837356135377863706E766B756A626A647A6C733266786961616F367A627763636C647972346761646E3471623737657768652E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DE4FA33650000000A", + "URI": "68747470733A2F2F626166796265696165376A6F66766A61736E713471363674723536646A776E6B3769757834376A75757675337777376C6C64667A6F6135636D32752E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "00081388E4D936D95707A0EE7626BB1C3C63AE643DAA3B0DFBE004660000000B", + "URI": "68747470733A2F2F62616679626569636E6E62766472676833647032357376756D756161716273346B75746A676C707A673733637274696971643437707767773268792E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC50166A78E00000B23", + "URI": "68747470733A2F2F6261667962656966656464777266356F35376A6B6C63356A75786C6835326F697076686167706B627637746E6A776F77727A6C7A756779666C626D2E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC503AC5FC600000B5B", + "URI": "68747470733A2F2F62616679626569636869746E766B716233716F7A346168706735666E366E333663637A7775716F6F6568626B636D657A796A716B67787263636B712E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC50586AC8300000B18", + "URI": "68747470733A2F2F6261667962656967346777686D6D326E3372726A7669677062736E7677756763666E7561626466666D6D6C3770707677346A796836726A61726F712E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + }, + { + "NFToken": { + "NFTokenID": "000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC509A6B19800000B0D", + "URI": "68747470733A2F2F62616679626569637161633376646D7762773236636474376D7137616B776D67376670326D687565343664376A35746D68726E6D7064716433336D2E697066732E7733732E6C696E6B2F6D657461646174612E6A736F6E" + } + } + ], + "PreviousPageMin": "05BDF50FBDEF54276A1C889252E71B4347C3A0BD31113FA9F0464448000018E4" + }, + "PreviousTxnID": "2413C2CE13ACEE12FB285B4D7B030518BFD0FD7B214A2C462C17BD642F7E57AA", + "PreviousTxnLgrSeq": 84136367 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rXMART8usFd5kABXCayoP6ZfB35b4v43t", + "Balance": "11660327731", + "Domain": "786D6172742E617274", + "EmailHash": "D48190C85BE485DEA4CF4A56A8E93772", + "Flags": 0, + "OwnerCount": 395, + "Sequence": 72576767 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "141E89D379C6949CA34BCB244DCBB7A6B2889781B157119CCC05ED19DFB676B0", + "PreviousFields": { + "Balance": "11660327743", + "OwnerCount": 394, + "Sequence": 72576766 + }, + "PreviousTxnID": "05A49F5DAC50F7D2017982DBD00584E56842AC83C914C0C140E5E87D900A429F", + "PreviousTxnLgrSeq": 84234972 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "ra5jrnrq9BxsvzGeJY5XS9inftcJWMdJUx", + "Balance": "199057406", + "BurnedNFTokens": 814, + "FirstNFTokenSequence": 75416281, + "Flags": 0, + "MintedNFTokens": 4390, + "NFTokenMinter": "rXMART8usFd5kABXCayoP6ZfB35b4v43t", + "OwnerCount": 3, + "Sequence": 75416281 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "307F4EA78A22ABAE3F4BCE15440DEACE60780484A54C143C833217AEB355C1D5", + "PreviousFields": { + "MintedNFTokens": 4389 + }, + "PreviousTxnID": "1B5C68B7F43DD973B29B3E3E09A0F292C3F56C3E9FA1FEAAE6AB5CDB5228A47F", + "PreviousTxnLgrSeq": 84234811 + } + } + ], + "TransactionIndex": 31, + "TransactionResult": "tesSUCCESS", + "nftoken_id": "000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC505C73BA9047ED3FE" + }, + "validated": true, + "date": 754523010, + "ledger_index": 84235074, + "inLedger": 84235074 +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/OfferCancelTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/OfferCancelTx.json new file mode 100644 index 000000000..e9fad0164 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/OfferCancelTx.json @@ -0,0 +1,13 @@ +{ + "tx": { + "TransactionType": "OfferCancel", + "Account": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX", + "Fee": "12", + "Flags": 0, + "LastLedgerSequence": 7108629, + "OfferSequence": 6, + "Sequence": 7, + "OfferID": "EF963D9313AA45E85610598797D1A65E" + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/OfferCreateTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/OfferCreateTx.json new file mode 100644 index 000000000..334531c75 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/OfferCreateTx.json @@ -0,0 +1,1683 @@ +{ + "XRPIOU": { + "meta": { + "AffectedNodes": [ + { + "DeletedNode": { + "FinalFields": { + "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", + "BookDirectory": "7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E0BA2F40B4EE3", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "0000000000000025", + "PreviousTxnID": "BCDFFC8B314C3D7653D58CBA76A26E6F8D26ECFF4EDA7E3951EDEA737E03F56B", + "PreviousTxnLgrSeq": 57554958, + "Sequence": 6165568, + "TakerGets": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "TakerPays": "0" + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "233480D06A56B5755E5609A50517AEB5EC2782275FBC79A337CD9893623440D6", + "PreviousFields": { + "TakerGets": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006237706382424785" + }, + "TakerPays": "24660424" + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.2741974727555413" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "BTC", + "issuer": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "value": "1000000000" + }, + "HighNode": "0000000000000000", + "HighQualityIn": 1007500000, + "HighQualityOut": 1007500000, + "LowLimit": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "0000000000000239" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "2848FC6E20665BDA02DFE93E992532870FE2DDA83296E5173C0AD3CED3013C05", + "PreviousFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.2742216387846283" + } + }, + "PreviousTxnID": "409ED2E4553C0B52D10D0BF5FB63F07474689586A07AFE47AF17D14D9EA7549B", + "PreviousTxnLgrSeq": 57551518 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.01257026145669207" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "BTC", + "issuer": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "value": "999999999" + }, + "HighNode": "0000000000000000", + "LowLimit": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "00000000000005D0" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "2914E0C6425B8511D1654C7EECF23749E791273C10AB32680804F34EA4DBB3F5", + "PreviousFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "0" + } + }, + "PreviousTxnID": "F392BAEFF7AA8C7E7DE23B0AF7D36B86D1DF8777CB799DBDC8D95F88678DC4D5", + "PreviousTxnLgrSeq": 57554966 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "IndexNext": "00000000000003AF", + "IndexPrevious": "00000000000003AC", + "Owner": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "RootIndex": "D7DB060F26AD80E73A4054E2FEF854BD70E40D0948AFD6CF1FDA6072ACC236A4" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "2A7ABCD0F11214DFCB87F9BBE5CCE5454AFA44662ABD1C946264346C47D31B5D" + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", + "BookDirectory": "7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E08C0C68AC608", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "0000000000000025", + "PreviousTxnID": "5AB22EA17EA83AD91631DD8185507A9E0CB3272F4AE70F0FE248D81C2B53BA79", + "PreviousTxnLgrSeq": 57554958, + "Sequence": 6165567, + "TakerGets": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "TakerPays": "0" + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "2DF1C31A075E217CEED582EC8CDEC2A18B85ECA13427788BBE8FD11DAE017192", + "PreviousFields": { + "TakerGets": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0003468173582540199" + }, + "TakerPays": "13700235" + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rJgzgoFxK5huntPQ9GoWon9TUrUAp1bYTz", + "BookDirectory": "7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E239465A8A2FC", + "BookNode": "0000000000000000", + "Flags": 131072, + "OwnerNode": "0000000000000000", + "Sequence": 1746328, + "TakerGets": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.02731544433330442" + }, + "TakerPays": "1087091843" + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "3C539D84E584F55C9E03B6FBD61419B39F3F485D527CD774D072F2E2D21894E7", + "PreviousFields": { + "TakerGets": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.038891" + }, + "TakerPays": "1547772328" + }, + "PreviousTxnID": "A9F617BF44D1DE1C40060C88EB9CA9E97F30E3AE87CE887ABD67C05E2057933D", + "PreviousTxnLgrSeq": 57554789 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "Balance": "77055251382", + "Flags": 1048576, + "OwnerCount": 3561, + "RegularKey": "rNjh3o3JMHoEpLkfAJQachVZMA6adqLDTF", + "Sequence": 137603 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "3DFC09260620F332881F20FD0AF6640CB54AFDD7DDC78875C7EE31583B96DED9", + "PreviousFields": { + "Balance": "77054292526", + "OwnerCount": 3562 + }, + "PreviousTxnID": "8059364512594412DF2988271986F18A37865E575CFDDC64ED98FBBCB06FBD49", + "PreviousTxnLgrSeq": 57551524 + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E1FE5D43D888B", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003AE", + "PreviousTxnID": "409ED2E4553C0B52D10D0BF5FB63F07474689586A07AFE47AF17D14D9EA7549B", + "PreviousTxnLgrSeq": 57551518, + "Sequence": 137584, + "TakerGets": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "TakerPays": "0" + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "42A19FEA5279B3051B37CA7F4485AC00E7A9C15393CBF3DD8C99F772D161C7BA", + "PreviousFields": { + "TakerGets": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0000241177935" + }, + "TakerPays": "958856" + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.02729229322197103" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "BTC", + "issuer": "rJgzgoFxK5huntPQ9GoWon9TUrUAp1bYTz", + "value": "100000000" + }, + "HighNode": "0000000000000000", + "LowLimit": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "000000000000040C" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "58AA18291BD0DFF10C846DED7D7A8DC33CBB8F20389BAF4ABAA402D2B2DD3511", + "PreviousFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.038891" + } + }, + "PreviousTxnID": "D7C4018944FF66B3E97552EAFC2F24AD8FC684AA286138979A561D7083AE5F26", + "PreviousTxnLgrSeq": 57550308 + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "5F0E08C0C68AC608", + "Flags": 0, + "RootIndex": "7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E08C0C68AC608", + "TakerGetsCurrency": "0000000000000000000000004254430000000000", + "TakerGetsIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1", + "TakerPaysCurrency": "0000000000000000000000000000000000000000", + "TakerPaysIssuer": "0000000000000000000000000000000000000000" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E08C0C68AC608" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "5F0E0BA2F40B4EE3", + "Flags": 0, + "RootIndex": "7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E0BA2F40B4EE3", + "TakerGetsCurrency": "0000000000000000000000004254430000000000", + "TakerGetsIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1", + "TakerPaysCurrency": "0000000000000000000000000000000000000000", + "TakerPaysIssuer": "0000000000000000000000000000000000000000" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E0BA2F40B4EE3" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "5F0E1FE5D43D888B", + "Flags": 0, + "RootIndex": "7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E1FE5D43D888B", + "TakerGetsCurrency": "0000000000000000000000004254430000000000", + "TakerGetsIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1", + "TakerPaysCurrency": "0000000000000000000000000000000000000000", + "TakerPaysIssuer": "0000000000000000000000000000000000000000" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "7B73A610A009249B0CC0D4311E8BA7927B5A34D86634581C5F0E1FE5D43D888B" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "Balance": "44536186578", + "Domain": "78756D6D2E617070", + "EmailHash": "833237B8665D2F4E00135E8DE646589F", + "Flags": 8388608, + "OwnerCount": 10, + "Sequence": 95 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "8C4F456312F02D5199BCB1FB8F657BF19675288E3F4EBF2AFCFB5A1253788404", + "PreviousFields": { + "Balance": "45036186590", + "Sequence": 94 + }, + "PreviousTxnID": "F392BAEFF7AA8C7E7DE23B0AF7D36B86D1DF8777CB799DBDC8D95F88678DC4D5", + "PreviousTxnLgrSeq": 57554966 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "IndexPrevious": "0000000000000024", + "Owner": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", + "RootIndex": "FDE0DCA95589B07340A7D5BE2FD72AA8EEAC878664CC9B707308B4419333E551" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "A3A947C2C2EE493F88EA00AAA2572C4053D9C0C095213864C6D6C9DA6AEDEBD8" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", + "Balance": "148101261095", + "Flags": 0, + "OwnerCount": 41, + "Sequence": 6165583 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "B1B9AAC12B56B1CFC93DDC8AF6958B50E89509F377ED4825A3D970F249892CE3", + "PreviousFields": { + "Balance": "148062900436", + "OwnerCount": 43 + }, + "PreviousTxnID": "5AEEFB4FF0296EE9E5B863533B3B3A23B4006AEA9F789CA461C467796A3F2C28", + "PreviousTxnLgrSeq": 57554965 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rJgzgoFxK5huntPQ9GoWon9TUrUAp1bYTz", + "Balance": "30814402909", + "Flags": 1048576, + "OwnerCount": 7, + "RegularKey": "r3rqA1xN1tw7h7Wuf1mUUMedZztdGwbSsi", + "Sequence": 1746334 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "BE2B7346E21F262E7493F8DFEE03D8473AAC3B663DAA069FF1CE96D95E24C24D", + "PreviousFields": { + "Balance": "30353722424" + }, + "PreviousTxnID": "937B599EFB289EE4FB7FB5471BEF3EA3B5D0A1BBBCEA1955187FE9FADF34CEA3", + "PreviousTxnLgrSeq": 57554789 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.0000719850427779746" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "BTC", + "issuer": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", + "value": "0" + }, + "HighNode": "0000000000000022", + "LowLimit": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "00000000000005CF" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "F758B827C835B48DDACFE4CDD235E843BD09C1FCA7F0BBE64B29DA39527566D1", + "PreviousFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.001044514215267465" + } + }, + "PreviousTxnID": "D7C4018944FF66B3E97552EAFC2F24AD8FC684AA286138979A561D7083AE5F26", + "PreviousTxnLgrSeq": 57550308 + } + } + ], + "TransactionIndex": 31, + "TransactionResult": "tesSUCCESS" + }, + "tx": { + "Account": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "Fee": "12", + "Flags": 2148139008, + "Sequence": 94, + "SigningPubKey": "0350714189757DA0403CE1FF2025522337EA1B60D9796B11D5559EE914982D6AC3", + "OfferID": "EF963D9313AA45E85610598797D1A65E", + "TakerGets": "500000000", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.012136" + }, + "TransactionType": "OfferCreate", + "TxnSignature": "3045022100D538B72956E7E9BC7FC74F1E6A84C8540D928C37D100171E04494F587D40B5AA02207D26A5853C65F1BC66B4C32BFB2B6CEBFBCA9D1404D26829DADB49AFF603CAF9", + "date": 650929271, + "hash": "F76BF4320745FC89CB46926E854180111468FE715E3824EBFCCC6133892F1C54", + "inLedger": 57554974, + "ledger_index": 57554974 + }, + "validated": true + }, + "IOUXRP": { + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.003285007303762344" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "BTC", + "issuer": "rH2k8SkwoWgwry9J89jgFP9NbSWu13jnsu", + "value": "1000000000" + }, + "HighNode": "0000000000000000", + "LowLimit": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "0000000000000572" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "10F978727E038ECC535125DB753C0E9C4AFF452D06F5E46056B6AC637681A18D", + "PreviousFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "0" + } + }, + "PreviousTxnID": "5AAA008AEF59CC8348B0B80665FB9A24F2DDE3F369CD3A6D78CDC2A784EF9BD4", + "PreviousTxnLgrSeq": 57440457 + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E8A48FA142D9", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "367E9F1859A5CBDFCB896D8CF84F9C62C9A1CDC86728FB6F99C9BC7FB9706E78", + "PreviousTxnLgrSeq": 57606787, + "Sequence": 137786, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "21C292C5EAFF4A05D5E20ACEB38F115EC2D3D3A7F010E12FB1948B46F324A49E", + "PreviousFields": { + "TakerGets": "24862701", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006234554234" + } + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.2757865425151007" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "BTC", + "issuer": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "value": "1000000000" + }, + "HighNode": "0000000000000000", + "HighQualityIn": 1007500000, + "HighQualityOut": 1007500000, + "LowLimit": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "0000000000000239" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "2848FC6E20665BDA02DFE93E992532870FE2DDA83296E5173C0AD3CED3013C05", + "PreviousFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.2665263787044" + } + }, + "PreviousTxnID": "DF2F3D365F1D5A132A232487D949CA4405A36E939D7E4D7098056B7564A158DF", + "PreviousTxnLgrSeq": 57716202 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "0" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "BTC", + "issuer": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "value": "999999999" + }, + "HighNode": "0000000000000000", + "LowLimit": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "00000000000005D0" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "2914E0C6425B8511D1654C7EECF23749E791273C10AB32680804F34EA4DBB3F5", + "PreviousFields": { + "Balance": { + "currency": "BTC", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.01257026145669207" + } + }, + "PreviousTxnID": "F76BF4320745FC89CB46926E854180111468FE715E3824EBFCCC6133892F1C54", + "PreviousTxnLgrSeq": 57554974 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rH2k8SkwoWgwry9J89jgFP9NbSWu13jnsu", + "Balance": "4944871522", + "Flags": 0, + "OwnerCount": 13, + "Sequence": 5846706 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "2F540B6D279A09812A00D53D5B6BE6BB1F0EB64BEC17E6D4DB43AFD285F5DA03", + "PreviousFields": { + "Balance": "5074982428" + }, + "PreviousTxnID": "44777E04DA3E214C63F77F5AE8D5A55E1FA3C4A01849B5A0540E2EDE2C36DD71", + "PreviousTxnLgrSeq": 57720311 + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08BC5AD346E4B0", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08BC5AD346E4B0", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08BC5AD346E4B0" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08C30DA29D47A8", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C30DA29D47A8", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C30DA29D47A8" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08C78A140F58AF", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C78A140F58AF", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C78A140F58AF" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08C8EFF9C78117", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C8EFF9C78117", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C8EFF9C78117" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08CD6F6E7D03DD", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08CD6F6E7D03DD", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08CD6F6E7D03DD" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08D1EFE324E9D0", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D1EFE324E9D0", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D1EFE324E9D0" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08D6766F28C26D", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D6766F28C26D", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D6766F28C26D" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08DAFC1D7F626F", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DAFC1D7F626F", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DAFC1D7F626F" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08DF84CFB7DF86", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DF84CFB7DF86", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DF84CFB7DF86" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08E1C9D2A957C0", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E1C9D2A957C0", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E1C9D2A957C0" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08E40F66E3583B", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E40F66E3583B", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E40F66E3583B" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08E64CD245FD3F", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E64CD245FD3F", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E64CD245FD3F" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08E8A48FA142D9", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E8A48FA142D9", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E8A48FA142D9" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08EAEBBE826341", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EAEBBE826341", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EAEBBE826341" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08EF7E7913BD20", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EF7E7913BD20", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EF7E7913BD20" + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "4A08F413DBFCA8D4", + "Flags": 0, + "RootIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08F413DBFCA8D4", + "TakerGetsCurrency": "0000000000000000000000000000000000000000", + "TakerGetsIssuer": "0000000000000000000000000000000000000000", + "TakerPaysCurrency": "0000000000000000000000004254430000000000", + "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08F413DBFCA8D4" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "Balance": "77034273276", + "Flags": 1048576, + "OwnerCount": 3546, + "RegularKey": "rNjh3o3JMHoEpLkfAJQachVZMA6adqLDTF", + "Sequence": 137886 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "3DFC09260620F332881F20FD0AF6640CB54AFDD7DDC78875C7EE31583B96DED9", + "PreviousFields": { + "Balance": "77405609934", + "OwnerCount": 3562 + }, + "PreviousTxnID": "6F767EBF8A6EE0A5EBB13BCE1A6E1A68B48A056860B8F6C4D3BFA560323D11E6", + "PreviousTxnLgrSeq": 57716215 + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DF84CFB7DF86", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "BC1EAF0C255247107D291BE1AF8150371650F479739295EA1503BFCBA8AF4639", + "PreviousTxnLgrSeq": 57618429, + "Sequence": 137793, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "40163B6DCB8605C04E27D7EF04C2BA2CB6054DE5EFAEA5209F7BC63BEB3B09A1", + "PreviousFields": { + "TakerGets": "24945295", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006230240409" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EF7E7913BD20", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "746F2FD32830E2D98B5DAC0A0995580CC3432573EEFF322088D4BB35DCCB27BE", + "PreviousTxnLgrSeq": 57606484, + "Sequence": 137782, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "53517932EE3B4B55900C0AB15CFB97131582D03239D562AF120689083218224C", + "PreviousFields": { + "TakerGets": "25200305", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006338194962" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D6766F28C26D", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "5AA34A8EE3352B511E184F518AF87E8E24D655F9A30498E4DF38C2E8FF976DAE", + "PreviousTxnLgrSeq": 57618435, + "Sequence": 137795, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "579D4E4C4907E49E75F23A1DF7A6082C5504E6455D6E2B640AEDEB6C0EB1BCE4", + "PreviousFields": { + "TakerGets": "24937024", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006203343998" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08DAFC1D7F626F", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "04D7A8D3FE2BEC6E4B48443DEFF933CE6F503C2177E3BD4D690BC99BE9E560B8", + "PreviousTxnLgrSeq": 57618432, + "Sequence": 137794, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "5BEF1C3D085CF4FC78D255E792F733CC5A78A5641255F57A807E3197EB79CDC0", + "PreviousFields": { + "TakerGets": "24945295", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.00062178048" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C8EFF9C78117", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "3CB558D77B877052062391EC70C8076B129969103B8E6CFC44C93FAD01F5DD51", + "PreviousTxnLgrSeq": 57665661, + "Sequence": 137814, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "5DBA7CD8E65EFEBC4B809FEF0E955C99A340414408113D7D00169D61057EFDAE", + "PreviousFields": { + "TakerGets": "24937934", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006166484804" + } + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rH2k8SkwoWgwry9J89jgFP9NbSWu13jnsu", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08F844EE3B17FF", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "0000000000000000", + "Sequence": 5846705, + "TakerGets": "7120085558", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.1797661224897064" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "78679C155C3C1B4B326EB0260B509CD8756D41FD1568623C4284CA4B8DB55FEC", + "PreviousFields": { + "TakerGets": "7250196464", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.1830511297934687" + } + }, + "PreviousTxnID": "44777E04DA3E214C63F77F5AE8D5A55E1FA3C4A01849B5A0540E2EDE2C36DD71", + "PreviousTxnLgrSeq": 57720311 + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08D1EFE324E9D0", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "07BB934EFF809492F147C21496078932E11B7FDC53A16137B6A426BFFEA224BF", + "PreviousTxnLgrSeq": 57665660, + "Sequence": 137813, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "8132C7C049A64FBC9DBCB0F2612D90726BE9FF53B12B726B7B24F3DFBCEDC95A", + "PreviousFields": { + "TakerGets": "24950348", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006194243385" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08EAEBBE826341", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "A8D41EC9989F7F063E55A53B8DAE7FE7B2431CE39EF13D3A98A2348EF125966E", + "PreviousTxnLgrSeq": 57606492, + "Sequence": 137784, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "8173170090E7E6963716BBD3ECBFB4DA1ED12370A348A1F7273E0BE0075EADEC", + "PreviousFields": { + "TakerGets": "25237303", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.00063348105" + } + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "Balance": "83504431937", + "Domain": "78756D6D2E617070", + "EmailHash": "833237B8665D2F4E00135E8DE646589F", + "Flags": 8388608, + "MessageKey": "02000000000000000000000000415F8315C9948AD91E2CCE5B8583A36DA431FB61", + "OwnerCount": 8, + "Sequence": 113 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "8C4F456312F02D5199BCB1FB8F657BF19675288E3F4EBF2AFCFB5A1253788404", + "PreviousFields": { + "Balance": "83002984385", + "Sequence": 112 + }, + "PreviousTxnID": "5291D8194147E5ED9129BFF9E0339B39E07C1CD719E54B30653E9344727D57DF", + "PreviousTxnLgrSeq": 57695167 + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E64CD245FD3F", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "B48B46A79691F8BBD19D63223BBA2074EBF8995856172B130103ED59DB7D49F4", + "PreviousTxnLgrSeq": 57615973, + "Sequence": 137785, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "9A00987C10DD38724BC6EF1E0080E0CC1A0D9265CC1AF47688C864396111A1C7", + "PreviousFields": { + "TakerGets": "20216802", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.000506434433563534" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C78A140F58AF", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "57D2B11EE64C44597BDD85E31F4C6A891017CC946797645D737E24560FFCA39D", + "PreviousTxnLgrSeq": 57665661, + "Sequence": 137815, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "A429CE20CD262747F94BEBDB17F84952CEA366B9394A0C56028EB62F79B75AB0", + "PreviousFields": { + "TakerGets": "24929068", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006160460489" + } + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "IndexNext": "00000000000003B3", + "IndexPrevious": "00000000000003B1", + "Owner": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "RootIndex": "D7DB060F26AD80E73A4054E2FEF854BD70E40D0948AFD6CF1FDA6072ACC236A4" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "BCA921F8CC2334DDA15A3EA20C948F6AEB04C3AF380F9F93FBCD1F362FC2683C" + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E40F66E3583B", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "E652CF5F2E1714690E779BB60D461A899F1908633AADE5197E25048BEB2851F3", + "PreviousTxnLgrSeq": 57618426, + "Sequence": 137792, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "C218BB6634F1CA95567983AE2837F6775F20BE0BE9F634BD3C7117A93A998026", + "PreviousFields": { + "TakerGets": "24951203", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006244174823" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08CD6F6E7D03DD", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "4325EDD0C2B2B127B24C69272E5972752930F9A15B9A34157F6C620A1C132D37", + "PreviousTxnLgrSeq": 57665661, + "Sequence": 137816, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "C8223AB157C397D5EE385CD02BC7CC73C3E3E075566191A64F0A46313B7E6D13", + "PreviousFields": { + "TakerGets": "24937934", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006178817773" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08C30DA29D47A8", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "A7DC8EC97E8D638E7002BB27B3DFA4035ADCD2BBBEBA6B2A62E94C3518975922", + "PreviousTxnLgrSeq": 57665662, + "Sequence": 137817, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "C99502126ACAE08B063084F092005F985B2ED1A49DF16A97C3C36ED4283BD064", + "PreviousFields": { + "TakerGets": "24929068", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006148164162" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08E1C9D2A957C0", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "AFBB0278CCEE5EDCA6B56AB26260F74FD8B606D01437E61372551FB54945990C", + "PreviousTxnLgrSeq": 57616098, + "Sequence": 137791, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "CA32FC4954D09521249F88DA27B01D876C599784E81AE04E55A7ECD7DC61ABA7", + "PreviousFields": { + "TakerGets": "25225419", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006306497911" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08BC5AD346E4B0", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "DF2F3D365F1D5A132A232487D949CA4405A36E939D7E4D7098056B7564A158DF", + "PreviousTxnLgrSeq": 57716202, + "Sequence": 137818, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "D532F2825AF6ABC35CFDD56CF80871B93C51AE2E31B367D2D524F9D3D31ABC05", + "PreviousFields": { + "TakerGets": "968498", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0000238143788372706" + } + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Account": "rBuDDpdVBt57JbyfXbs8gjWvp4ScKssHzx", + "BookDirectory": "37AAC93D336021AE94310D0430FFA090F7137C97D473488C4A08F413DBFCA8D4", + "BookNode": "0000000000000000", + "Flags": 0, + "OwnerNode": "00000000000003B2", + "PreviousTxnID": "821B7C8CF63A00388C2F0C8A4058E9ECB1D32E500365767D45AE8E5EE64A306A", + "PreviousTxnLgrSeq": 57606487, + "Sequence": 137783, + "TakerGets": "0", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "D557D5A0D6C2C7A06BC453AEADF460681CE72FC0F7F0CE2E6C94A1E115A7B12D", + "PreviousFields": { + "TakerGets": "25162461", + "TakerPays": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.0006341357733" + } + } + } + } + ], + "TransactionIndex": 44, + "TransactionResult": "tesSUCCESS" + }, + "tx": { + "Account": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "Fee": "12", + "Flags": 2148139008, + "Sequence": 112, + "SigningPubKey": "0350714189757DA0403CE1FF2025522337EA1B60D9796B11D5559EE914982D6AC3", + "TakerGets": { + "currency": "BTC", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0.01257" + }, + "OfferID": "EF963D9313AA45E85610598797D1A65E", + "TakerPays": "484553386", + "Expiration": 685445908, + "TransactionType": "OfferCreate", + "TxnSignature": "304402200A65C5378313C3909AF3B10EBBC7B32F9B4878E47EB99AAD75E4A9F19B1C89E90220034ACC4B948F67D7FA324EF3A11769CA95CECB67DCFD015135E216D48D332B19", + "date": 651582571, + "hash": "09E6D8BBCFD4457BA860FC2CCB978A2900527C3BFD58272BBF909C92761EEDC1", + "inLedger": 57720311, + "ledger_index": 57720311 + }, + "validated": true + }, + "XRPIOUDifferentOwner": { + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-74204.07015609303" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "value": "1000000" + }, + "HighNode": "0000000000000000", + "LowLimit": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz", + "value": "0" + }, + "LowNode": "0000000000000035" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "18254A083849DD60EF85FDA66EE4F411A2D4D9682283D659EE11C63344F46B76", + "PreviousFields": { + "Balance": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-74242.53554070841" + } + }, + "PreviousTxnID": "B93043A7224DF1C852B9600AE1EE33E382993B9E1749E4AEEEC60B3D0C4FC2B3", + "PreviousTxnLgrSeq": 58371567 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rsTQsbTfRkqgUxxs8BToD3VdnENaha9UcY", + "Balance": "26644314", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 56270335 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "520ECB79A4A213162874D70D8C45D12563C1D1DB00A8FD6B977108C8FB3D72CD", + "PreviousFields": { + "Balance": "126644326", + "Sequence": 56270334 + }, + "PreviousTxnID": "EC9FDC09CB573ED8AA518DA292DCCB586E2AF0229780583F1058D9F6DAE98738", + "PreviousTxnLgrSeq": 58373277 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "Balance": "13577412223", + "Domain": "78756D6D2E617070", + "EmailHash": "833237B8665D2F4E00135E8DE646589F", + "Flags": 8388608, + "OwnerCount": 12, + "Sequence": 151 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "8C4F456312F02D5199BCB1FB8F657BF19675288E3F4EBF2AFCFB5A1253788404", + "PreviousFields": { + "Balance": "13477412223" + }, + "PreviousTxnID": "B93043A7224DF1C852B9600AE1EE33E382993B9E1749E4AEEEC60B3D0C4FC2B3", + "PreviousTxnLgrSeq": 58371567 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "BookDirectory": "5C8970D155D65DB8FF49B291D7EFFA4A09F9E8A68D9974B25B093CAFAC6A8000", + "BookNode": "0000000000000000", + "Expiration": 685445908, + "Flags": 131072, + "OwnerNode": "0000000000000001", + "Sequence": 145, + "TakerGets": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz", + "value": "4049.259889225568" + }, + "TakerPays": "10528075712" + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "B45DFCD1B3600D7F52E16A293843C0C6F0C0CFEDD107197FBEE4E1B81D9E8C5F", + "PreviousFields": { + "TakerGets": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz", + "value": "4087.721427687106" + }, + "TakerPays": "10628075712" + }, + "PreviousTxnID": "B93043A7224DF1C852B9600AE1EE33E382993B9E1749E4AEEEC60B3D0C4FC2B3", + "PreviousTxnLgrSeq": 58371567 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "38.46153846153847" + }, + "Flags": 1114112, + "HighLimit": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz", + "value": "0" + }, + "HighNode": "0000000000000039", + "LowLimit": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rsTQsbTfRkqgUxxs8BToD3VdnENaha9UcY", + "value": "999999999" + }, + "LowNode": "0000000000000000" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "CFEB9EFAA13564F24373E8E1CC9802E029901968779C00C59DB3A8074DFC05BC", + "PreviousFields": { + "Balance": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "0" + } + }, + "PreviousTxnID": "76E1C9E8E0314FE9C44B76A80FE03B4535314C37937681242544B92D2CA817D2", + "PreviousTxnLgrSeq": 57321856 + } + } + ], + "TransactionIndex": 20, + "TransactionResult": "tesSUCCESS" + }, + "tx": { + "Account": "rsTQsbTfRkqgUxxs8BToD3VdnENaha9UcY", + "Fee": "12", + "Flags": 2148270080, + "LastLedgerSequence": 58373915, + "Sequence": 56270334, + "SigningPubKey": "03569D98DB9776AE05EF760C14D7E370153B4CA8F395023530D03F65AE24D20F08", + "TakerGets": "100000000", + "TakerPays": { + "currency": "534F4C4F00000000000000000000000000000000", + "issuer": "rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz", + "value": "38.076" + }, + "TransactionType": "OfferCreate", + "TxnSignature": "3045022100CE70EA4BDDDCB01FCEE19C206701F0CCFC99FDD273E18FBACD4F0453876B6621022008760D1BE1D546FE1AFF527A369E32119CC37BD381029F13E5AECD5EFD108E8A", + "date": 654163710, + "hash": "6E22657ECC83382EA4A6484A0FDCC4CC995B5B6038FB11C769369C767A4E9156", + "inLedger": 58373877, + "ledger_index": 58373877 + } + }, + "XRPIOUCANCELED": { + "tx": { + "Account": "rQamE9ddZiRZLKRAAzwGKboQ8rQHgesjEs", + "Fee": "12", + "Flags": 2148139008, + "Sequence": 61160755, + "SigningPubKey": "036568BFAC68D548BE97CA690DD8D111608F4D92F9062A2B674AB90CEB25FDA40A", + "TakerGets": "50000000", + "TakerPays": { + "currency": "CSC", + "issuer": "rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr", + "value": "11616.66671104" + }, + "TransactionType": "OfferCreate", + "TxnSignature": "30440220776191E81D51594AC62A8E2DD202296B9CEFF8680369614E49BABBF5E5480ABF022049E9C1587CFF00B8CFF00EC0F1FC814A10C39B2A1E25B37A08703EAA088D95C7", + "date": 677198861, + "hash": "F59BBE153A4BBB9A7EFF6BA266A6C1C158828659755116D6A93FF57DA90A8241", + "inLedger": 64317224, + "ledger_index": 64317224 + }, + "meta": { + "AffectedNodes": [ + { + "DeletedNode": { + "FinalFields": { + "Account": "rNPV7cQYEZdH99NVJyD98XRPF3LmWgyv1P", + "BookDirectory": "B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD580E80392863AC68", + "BookNode": "0", + "Flags": 0, + "OwnerNode": "0", + "PreviousTxnID": "EE845FCEBA0BC0BF49E0275F93DEC2F9F3B329A1EAEC03F7B9F7E1746392E6C7", + "PreviousTxnLgrSeq": 63632375, + "Sequence": 992, + "TakerGets": { + "currency": "CSC", + "issuer": "rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr", + "value": "49000" + }, + "TakerPays": "200000000" + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "1A2CF9FCD4D0345662D880E94C10F218576A95B9D46B563CACAA2B92228B5135" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rNPV7cQYEZdH99NVJyD98XRPF3LmWgyv1P", + "RootIndex": "29B9170F58DA90BAA2039815C5D2750EE486A99FAEB999A5826AC2F3BDB4CFCB" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "29B9170F58DA90BAA2039815C5D2750EE486A99FAEB999A5826AC2F3BDB4CFCB" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rQamE9ddZiRZLKRAAzwGKboQ8rQHgesjEs", + "Balance": "25330009591", + "Flags": 0, + "OwnerCount": 4, + "Sequence": 61160756 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "389B42D413DB075A4F01DFBC9FC3B89ECF300C7BBAD3AD988CF0FD2D130BCAA7", + "PreviousFields": { + "Balance": "25330009603", + "Sequence": 61160755 + }, + "PreviousTxnID": "9D2B9F25AC84550C3FB437C0874E2804B6346201D2F31B58CDFFE9EE25C0CCC6", + "PreviousTxnLgrSeq": 64317090 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rNPV7cQYEZdH99NVJyD98XRPF3LmWgyv1P", + "Balance": "115000000", + "Flags": 0, + "OwnerCount": 17, + "Sequence": 1252 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "69AA11C2451CF161BD80063B618EE524BAF31EF5ED03D0D971A2481F936F2A08", + "PreviousFields": { + "OwnerCount": 18 + }, + "PreviousTxnID": "51C5592C4CB7ECF8FBB0A3110A047A9453CF25C48D234E898E6D54AC33B13997", + "PreviousTxnLgrSeq": 64312490 + } + }, + { + "DeletedNode": { + "FinalFields": { + "ExchangeRate": "580e80392863ac68", + "Flags": 0, + "RootIndex": "B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD580E80392863AC68", + "TakerGetsCurrency": "0000000000000000000000004353430000000000", + "TakerGetsIssuer": "07453A365D565F637A8CB8478AF080F2CE8E0D48", + "TakerPaysCurrency": "0000000000000000000000000000000000000000", + "TakerPaysIssuer": "0000000000000000000000000000000000000000" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD580E80392863AC68" + } + } + ], + "TransactionIndex": 4, + "TransactionResult": "tesSUCCESS" + }, + "validated": true + } +} diff --git a/src/common/libs/ledger/transactions/__tests__/templates/PaymentChannelClaimTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentChannelClaimTx.json similarity index 78% rename from src/common/libs/ledger/transactions/__tests__/templates/PaymentChannelClaimTx.json rename to src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentChannelClaimTx.json index d6790b0a5..4d56e7cac 100644 --- a/src/common/libs/ledger/transactions/__tests__/templates/PaymentChannelClaimTx.json +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentChannelClaimTx.json @@ -7,5 +7,11 @@ "Signature": "30440220718D264EF05CAED7C781FF6DE298DCAC68D002562C9BF3A07C1E721B420C0DAB02203A5A4779EF4D2CCC7BC3EF886676D803A9981B928D3B8ACA483B80ECA3CD7B9B", "PublicKey": "32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A" }, - "meta": {} -} \ No newline at end of file + "meta": { + "AffectedNodes": [{ + "DeletedNode": { + "LedgerEntryType": "PayChannel" + } + }] + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentChannelCreateTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentChannelCreateTx.json new file mode 100644 index 000000000..79a4b55e1 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentChannelCreateTx.json @@ -0,0 +1,16 @@ +{ + "tx": { + "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", + "TransactionType": "PaymentChannelCreate", + "Amount": "10000", + "Destination": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", + "SettleDelay": 86400, + "PublicKey": "32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A", + "CancelAfter": 533171558, + "DestinationTag": 23480, + "SourceTag": 11747, + "Fee": 12, + "Sequence": 0 + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentChannelFundTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentChannelFundTx.json new file mode 100644 index 000000000..5a84ac24f --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentChannelFundTx.json @@ -0,0 +1,10 @@ +{ + "tx": { + "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", + "TransactionType": "PaymentChannelFund", + "Channel": "C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198", + "Amount": "200000", + "Expiration": 543171558 + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentTx.json new file mode 100644 index 000000000..e32d3594b --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/PaymentTx.json @@ -0,0 +1,396 @@ +{ + "SimplePayment": { + "tx": { + "Account": "rEAa7TDpBdL1hoRRAp3WDmzBcuQzaXssmb", + "TransactionType": "Payment", + "Destination": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX", + "Amount": { + "currency": "USD", + "value": "1", + "issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn" + }, + "LastLedgerSequence": 32000, + "Fee": "12" + }, + "meta": {} + }, + "XRP2XRP": { + "tx": { + "hash": "7F10793B5781BD5DD52F70096520321A08DD2ED19AFC7E3F193AAC293954F7DF", + "ledger_index": 57913674, + "date": "2020-09-02T07:24:11Z", + "Account": "rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY", + "Amount": "85532100", + "Destination": "rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh", + "DestinationTag": 123, + "Fee": "12", + "Flags": 2147483648, + "LastLedgerSequence": 57913677, + "InvoiceID": "123", + "Sequence": 34306, + "SigningPubKey": "03DF3AB842EB1B57F0A848CD7CC2CFD35F66E4AD0625EEACFFE72A45E4D13E49A", + "SourceTag": 456, + "TransactionType": "Payment", + "TxnSignature": "304402204ED27C2D29F609772B0E67ACCFC8C205422A85D54C065437179032419" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY", + "Balance": "49682206850", + "Domain": "787270746970626F742E636F6D", + "EmailHash": "833237B8665D2F4E00135E8DE646589F", + "Flags": 131072, + "OwnerCount": 1136, + "Sequence": 34307 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "44EF183C00DFCB5DAF505684AA7967C83F42C085EBA6B271E5349CB12C3D5965", + "PreviousFields": { + "Balance": "49767738962", + "Sequence": 34306 + }, + "PreviousTxnID": "F9B3CA1DAEB4A4AE5EE4BC3DC4C7F0C0DA6A24FCA5CE7C9D9A28A4FFD68B1831", + "PreviousTxnLgrSeq": 57911131 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh", + "Balance": "541432284558887", + "Flags": 131072, + "OwnerCount": 2, + "Sequence": 560953 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "CFAFBE212FBA5490C7F0E2C8844200852C379ABFA389CC4C02BCD1ACA283742C", + "PreviousFields": { + "Balance": "541432199026787" + }, + "PreviousTxnID": "53B3640676234DA67BDD09D1CE2C7DDD6E6A4A1E7AB01E3DECA251000399C15E", + "PreviousTxnLgrSeq": 57913669 + } + } + ], + "TransactionIndex": 4, + "TransactionResult": "tesSUCCESS", + "delivered_amount": "85532100" + } + }, + "ToSelfWithPath": { + "tx": { + "Account": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "SourceTag": 1337, + "Amount": "1000000", + "Destination": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "DestinationTag": 1338, + "Fee": "12", + "Flags": 2147614720, + "Paths": [ + [ + { + "account": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", + "type": 1 + }, + { + "currency": "XRP", + "type": 16 + } + ], + [ + { + "account": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "type": 1 + }, + { + "currency": "XRP", + "type": 16 + } + ] + ], + "SendMax": { + "currency": "USD", + "issuer": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "value": "1.239054364262807" + }, + "Sequence": 989, + "SigningPubKey": "0350714189757DA0403CE1FF2025522337EA1B60D9796B11D5559EE914982D6AC3", + "TransactionType": "Payment", + "TxnSignature": "30450221009A70AEC89FB632C61F1CF61F8E8A50CB1787B18AF1CD64925D3153F8CF290A8F02207D8E334101D2FDD86097345CE0926FF794A4ADEA87A34E2C625E4487201CAF18", + "date": 689945571, + "hash": "09AD40BDA7091BDE0DA9B3C3B5A5855A52D004B1895A879ABC72FDE1A97FC094", + "inLedger": 67629165, + "ledger_index": 67629165 + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.4160283696746996" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "USD", + "issuer": "rhS2H7ETM3wBkFETvYycoUm9FEDYi44Pg4", + "value": "1000000000" + }, + "HighNode": "20", + "LowLimit": { + "currency": "USD", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "4d3" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "0225F9FB255748DA08738AF78EEFBD0EC8B036C8EE4F3DE7DBA5D9BA90E8D507", + "PreviousFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "0" + } + }, + "PreviousTxnID": "E3078BCF67E010A9042FC77E5B29BB0CCEFC32073A4D305ED5C62C3098F16558", + "PreviousTxnLgrSeq": 67628982 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "518.9596536050613" + }, + "Flags": 1114112, + "HighLimit": { + "currency": "USD", + "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", + "value": "0" + }, + "HighNode": "1c19", + "LowLimit": { + "currency": "USD", + "issuer": "rpXhhWmCvDwkzNtRbm7mmD1vZqdfatQNEe", + "value": "1000000000" + }, + "LowNode": "0" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "0B0388546E94E2B339A52C70CE9B7791FDF104F114C94CEACB2A9440819DD435", + "PreviousFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "518.139100772877" + } + }, + "PreviousTxnID": "C60DBC7F61E390B07D7340FD13E57FEE171E9E10490F2DF874474C83D37D9C2C", + "PreviousTxnLgrSeq": 67629045 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rhS2H7ETM3wBkFETvYycoUm9FEDYi44Pg4", + "Balance": "3479304510", + "Flags": 0, + "OwnerCount": 16, + "Sequence": 35450886 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "6B555B9A14F4E40BB83EF68DE332ECCCC84D310AFFABBAA3606F7969C688EC21", + "PreviousFields": { + "Balance": "3479640630" + }, + "PreviousTxnID": "6F9600BB28AD0B5D1FCC2474357B8F1F6AA7271F26DCFFB5C1C5DD726B3F0EEF", + "PreviousTxnLgrSeq": 67629105 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-11.48010255685665" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "USD", + "issuer": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "value": "999999999" + }, + "HighNode": "0", + "LowLimit": { + "currency": "USD", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "0" + }, + "LowNode": "5e3" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "737CF70DE25483B1B3F30A029EE3CF1B6D32EBF408622715E2E23FEE21DC76CE", + "PreviousFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-11.89696298327069" + } + }, + "PreviousTxnID": "1625E4886B87EB82C6C97E261172BAB24EED4D7CCC0F2B154AF063802641098E", + "PreviousTxnLgrSeq": 65590823 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rpXhhWmCvDwkzNtRbm7mmD1vZqdfatQNEe", + "Balance": "143632907823", + "Flags": 0, + "MessageKey": "02000000000000000000000000C40291E3D8888D158B3370626B71BDF2C883E942", + "OwnerCount": 8, + "Sequence": 59082581 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "73F7B01109BB599FEDF75529CD8A6521890745E813DD45EC36A73828EDDD56BF", + "PreviousFields": { + "Balance": "143633571703" + }, + "PreviousTxnID": "1382FDF544FFC891675B68DDAEC68653AF88433DE20307FD3C78D78FFD96BC51", + "PreviousTxnLgrSeq": 67629046 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rhS2H7ETM3wBkFETvYycoUm9FEDYi44Pg4", + "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4F0465B73F5072A0", + "BookNode": "0", + "Flags": 0, + "OwnerNode": "20", + "Sequence": 35450885, + "TakerGets": "299663880", + "TakerPays": { + "currency": "USD", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "370.9052583803254" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "79657B69DC978214ED264BBC03C7F4DB4954BA7C7D793C073CA4BD0C752F9D45", + "PreviousFields": { + "TakerGets": "300000000", + "TakerPays": { + "currency": "USD", + "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", + "value": "371.32128675" + } + }, + "PreviousTxnID": "6F9600BB28AD0B5D1FCC2474357B8F1F6AA7271F26DCFFB5C1C5DD726B3F0EEF", + "PreviousTxnLgrSeq": 67629105 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "Balance": "1402710884", + "Domain": "7769657473652E636F6D", + "EmailHash": "FC377D96856A120F509E8FF6DB877ECC", + "Flags": 8388608, + "MessageKey": "020000000000000000000000004CCAE8EBCB878C8DB19A910A5EEBCE32E8693211", + "OwnerCount": 6, + "Sequence": 990 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "8C4F456312F02D5199BCB1FB8F657BF19675288E3F4EBF2AFCFB5A1253788404", + "PreviousFields": { + "Balance": "1401710896", + "Sequence": 989 + }, + "PreviousTxnID": "EE605A8185B3864347FB592E0334E23ED431B9D653C591E911B6B402B2DFF102", + "PreviousTxnLgrSeq": 67619482 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "0" + }, + "Flags": 2228224, + "HighLimit": { + "currency": "USD", + "issuer": "rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ", + "value": "1000000000" + }, + "HighNode": "1", + "LowLimit": { + "currency": "USD", + "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", + "value": "0" + }, + "LowNode": "1d6b" + }, + "LedgerEntryType": "RippleState", + "LedgerIndex": "C60A95B9FCD548EAB9E724EFF0FF40390487EC2D684105788C55B9B2A84BB7FA", + "PreviousFields": { + "Balance": { + "currency": "USD", + "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", + "value": "-0.822193937848758" + } + }, + "PreviousTxnID": "4E85479C9CCBECABF53B2CE10566AADC26AED044FCDF09B286CFBE47398FBEEE", + "PreviousTxnLgrSeq": 67351128 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rpXhhWmCvDwkzNtRbm7mmD1vZqdfatQNEe", + "BookDirectory": "79C54A4EBD69AB2EADCE313042F36092BE432423CC6A4F784F046421FDB4C0E0", + "BookNode": "0", + "Flags": 131072, + "OwnerNode": "0", + "Sequence": 59082564, + "TakerGets": "21469375232", + "TakerPays": { + "currency": "USD", + "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", + "value": "26536.08466816782" + } + }, + "LedgerEntryType": "Offer", + "LedgerIndex": "D38039EAC1B3DD2CCAD3C041F724E546C92527A145F7A4F1D296CCB0F10F7C2D", + "PreviousFields": { + "TakerGets": "21470039112", + "TakerPays": { + "currency": "USD", + "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", + "value": "26536.905221" + } + }, + "PreviousTxnID": "E794C0FAD8C74DD54A3294B5E3E4BD68776ECC67C43F839199B4D5E744898740", + "PreviousTxnLgrSeq": 67629003 + } + } + ], + "TransactionIndex": 56, + "TransactionResult": "tesSUCCESS", + "delivered_amount": "1000000" + }, + "validated": true + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/SetHookTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/SetHookTx.json new file mode 100644 index 000000000..aad637db8 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/SetHookTx.json @@ -0,0 +1,637 @@ +{ + "Create":{ + "tx": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Fee": "299520", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "CreateCode": "0061736D0100000001310760057F7F7F7F7F017E60037F7F7F017E60027F7F017E60037F7F7E017E60047F7F7F7F017E60027F7F017F60017F017E02730803656E76057472616365000003656E760A6F74786E5F6669656C64000103656E760C686F6F6B5F6163636F756E74000203656E7606616363657074000303656E76057374617465000403656E760973746174655F736574000403656E760974726163655F6E756D000303656E76025F670005030201060503010002062B077F01418089040B7F004180080B7F004180090B7F004180080B7F00418089040B7F0041000B7F0041010B07080104686F6F6B00080ADA810001D6810001027F230041D0006B220124002001200036024C41D60841154189084114410010001A200141306A41144181802010011A200141106A411410021A0240024020012903102001290330520D0020012903182001290338520D0020012802202001280240460D010B41AF084127421410031A0B200141086A22004108200141106A2202411410041A2001200129030842017C370308200041082002411410051A4180084108200129030810061A41EC084113419D084112410010001A20004108422210031A4101410110071A200141D0006A240042000B0B860101004180080B7F636F756E745B305D0073746174655F62617369633A2053746172742E0073746174655F62617369633A20456E642E0073746174655F62617369633A20696E636F6D696E67207478206F6E20604163636F756E74602E002273746174655F62617369633A2053746172742E22002273746174655F62617369633A20456E642E22", + "Flags": 1, + "HookApiVersion": 0, + "HookNamespace": "097692A0AA4759D14DDCDC0BBE7BA76B85248529B38F678E1D4E9E635D0FDB28", + "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF" + } + } + ], + "LastLedgerSequence": 114, + "NetworkID": 21337, + "Sequence": 35, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "SetHook", + "TxnSignature": "304402203CF4487A4E0FA4E98532265822F4EC70DF5B040A30ADEB9FDD017839F832917602206B39286E20D6BBEC7FFB3033B8CE5CDDFE28C41F5F588ADFCB8E9940744FCC98", + "ctid": "C000005F00005359", + "date": 747906951, + "hash": "97139225A8D0FF4E56FB5F144D48C0A7AEB17483B1813521F55AA3F3716C8866", + "inLedger": 95, + "ledger_index": 95, + + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "CreatedNode": { + "LedgerEntryType": "Hook", + "LedgerIndex": "2448F6F57C6B3636716BDE3AD860EC7C92D1B029006770E7F396234469324934", + "NewFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Hooks": [ + { + "Hook": { + "HookHash": "B1F39E63D27603F1A2E7E804E92514FAC721F353D849B0787288F5026809AD84" + } + } + ] + } + } + }, + { + "CreatedNode": { + "LedgerEntryType": "HookDefinition", + "LedgerIndex": "917916518AD9B59CC08C2D7793B9D6E7DCDC1121F65E9F6B446CF2C3DF94F01E", + "NewFields": { + "CreateCode": "0061736D0100000001310760057F7F7F7F7F017E60037F7F7F017E60027F7F017E60037F7F7E017E60047F7F7F7F017E60027F7F017F60017F017E02730803656E76057472616365000003656E760A6F74786E5F6669656C64000103656E760C686F6F6B5F6163636F756E74000203656E7606616363657074000303656E76057374617465000403656E760973746174655F736574000403656E760974726163655F6E756D000303656E76025F670005030201060503010002062B077F01418089040B7F004180080B7F004180090B7F004180080B7F00418089040B7F0041000B7F0041010B07080104686F6F6B00080ADA810001D6810001027F230041D0006B220124002001200036024C41D60841154189084114410010001A200141306A41144181802010011A200141106A411410021A0240024020012903102001290330520D0020012903182001290338520D0020012802202001280240460D010B41AF084127421410031A0B200141086A22004108200141106A2202411410041A2001200129030842017C370308200041082002411410051A4180084108200129030810061A41EC084113419D084112410010001A20004108422210031A4101410110071A200141D0006A240042000B0B860101004180080B7F636F756E745B305D0073746174655F62617369633A2053746172742E0073746174655F62617369633A20456E642E0073746174655F62617369633A20696E636F6D696E67207478206F6E20604163636F756E74602E002273746174655F62617369633A2053746172742E22002273746174655F62617369633A20456E642E22", + "Fee": "107", + "HookHash": "B1F39E63D27603F1A2E7E804E92514FAC721F353D849B0787288F5026809AD84", + "HookNamespace": "097692A0AA4759D14DDCDC0BBE7BA76B85248529B38F678E1D4E9E635D0FDB28", + "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF", + "HookSetTxnID": "97139225A8D0FF4E56FB5F144D48C0A7AEB17483B1813521F55AA3F3716C8866", + "ReferenceCount": "1" + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "19997212794", + "Flags": 0, + "OwnerCount": 4, + "Sequence": 36 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19997512314", + "OwnerCount": 3, + "Sequence": 35 + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "RootIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } + }, + "Delete": { + "tx": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Fee": "20", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "CreateCode": "", + "Flags": 1 + } + } + ], + "LastLedgerSequence": 112, + "NetworkID": 21337, + "Sequence": 34, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "SetHook", + "TxnSignature": "3044022047E99ADF3354919A4794F7ECFE9437293AAE7B822F05A6733CCD34043EF8949E0220376E07328D3B9524F277D0FFAEBFA38AEDEE9028089B3175661B1F00981C4B38", + "ctid": "C000005D00005359", + "date": 747906949, + "hash": "ABBBCDC6D8BF1C1D56F3F75317CDCEBA6B1CBFE798B32B1AE965C37371B2513C", + "inLedger": 93, + "ledger_index": 93, + + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "DeletedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "Flags": 0, + "HookHash": "3E081C0CE176CFDEFC2F3DCB7A899B420C0878216B1B91B8105A6573DBA3EFCC" + } + } + ], + "OwnerNode": "0", + "PreviousTxnID": "2BEA252E6E4E17C6654D78B2A2BAE2AF8AE315A03F675D8F4D1FB74E12854ED5", + "PreviousTxnLgrSeq": 91 + }, + "LedgerEntryType": "Hook", + "LedgerIndex": "2448F6F57C6B3636716BDE3AD860EC7C92D1B029006770E7F396234469324934" + } + }, + { + "DeletedNode": { + "FinalFields": { + "CreateCode": "0061736D0100000001200560057F7F7F7F7F017E6000017E60037F7F7E017E60027F7F017F60017F017E02520603656E76057472616365000003656E76096F74786E5F74797065000103656E760974726163655F6E756D000203656E7608726F6C6C6261636B000203656E7606616363657074000203656E76025F670003030201040503010002062B077F0141A089040B7F004180080B7F004192090B7F004180080B7F0041A089040B7F0041000B7F0041010B07080104686F6F6B00060AFA800001F6800001017F230041106B220124002001200036020C41EA0841144183084113410010001A200110013703004180084102200129030010021A200129030042E300520440419608412D425B10031A0B41FF08411241C3084111410010001A41D4084116421610041A4101410110051A200141106A240042000B0B990101004180080B9101747400686F6F6B5F6F6E5F74743A2053746172742E00686F6F6B5F6F6E5F74743A20486F6F6B4F6E206669656C6420697320696E636F72726563746C79207365742E00686F6F6B5F6F6E5F74743A20456E642E00686F6F6B5F6F6E5F74743A2046696E69736865642E0022686F6F6B5F6F6E5F74743A2053746172742E220022686F6F6B5F6F6E5F74743A20456E642E22", + "Fee": "57", + "Flags": 0, + "HookApiVersion": 0, + "HookHash": "3E081C0CE176CFDEFC2F3DCB7A899B420C0878216B1B91B8105A6573DBA3EFCC", + "HookNamespace": "326178559E63837BA3B83BC05E5DC323A7B52C782AC4D5B3B182B2E050565581", + "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF", + "HookParameters": [], + "HookSetTxnID": "651323FFDEE0B1AB2D2B6BB32F6E83624C3FA1DCEB45BF34CA88B95569FB6C1A", + "ReferenceCount": "0" + }, + "LedgerEntryType": "HookDefinition", + "LedgerIndex": "8B72B7217F49533E8F9CDB580AC9183330AB38EB9458D9F18A864A6638A60935", + "PreviousFields": { + "ReferenceCount": "1" + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "19997512314", + "Flags": 0, + "OwnerCount": 3, + "Sequence": 35 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19997512334", + "OwnerCount": 4, + "Sequence": 34 + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "RootIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } + }, + "DeleteAll": { + "tx": { + "Account": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "Fee": "20", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "CreateCode": "", + "Flags": 3 + } + }, + { + "Hook": { + "CreateCode": "", + "Flags": 3 + } + }, + { + "Hook": { + "CreateCode": "", + "Flags": 3 + } + }, + { + "Hook": { + "CreateCode": "", + "Flags": 3 + } + }, + { + "Hook": { + "CreateCode": "", + "Flags": 3 + } + }, + { + "Hook": { + "CreateCode": "", + "Flags": 3 + } + }, + { + "Hook": { + "CreateCode": "", + "Flags": 3 + } + }, + { + "Hook": { + "CreateCode": "", + "Flags": 3 + } + }, + { + "Hook": { + "CreateCode": "", + "Flags": 3 + } + }, + { + "Hook": { + "CreateCode": "", + "Flags": 3 + } + } + ], + "LastLedgerSequence": 104, + "NetworkID": 21337, + "Sequence": 17, + "SigningPubKey": "02691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE", + "TransactionType": "SetHook", + "TxnSignature": "30440220363783BE10DAA19A0A5CAC1CFB1FC17990F09A164B8D3D18FED8EB4F7D31153302201BCCD4DC003EC2993193B81FCF49562D4B6F5F48AA182DA4538A18820E397498", + "ctid": "C000005500005359", + "date": 747906941, + "hash": "D561C1FCD975C4C863DA99A26684A751078F725123F7702BEFEE02DBB9967BF9", + "inLedger": 85, + "ledger_index": 85, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "DeletedNode": { + "FinalFields": { + "Account": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "Flags": 0, + "HookHash": "3E081C0CE176CFDEFC2F3DCB7A899B420C0878216B1B91B8105A6573DBA3EFCC" + } + } + ], + "OwnerNode": "0", + "PreviousTxnID": "5E4F0B3756AE5EEEA44AFA2C57FCD9CC9FD0B6B6734EAA8F89CA26507BD5DD5A", + "PreviousTxnLgrSeq": 81 + }, + "LedgerEntryType": "Hook", + "LedgerIndex": "35C9989E8A07B1607730134CF60C3AD4EB79C5C7D94F4B5005D065994DB2824B" + } + }, + { + "DeletedNode": { + "FinalFields": { + "CreateCode": "0061736D0100000001200560057F7F7F7F7F017E6000017E60037F7F7E017E60027F7F017F60017F017E02520603656E76057472616365000003656E76096F74786E5F74797065000103656E760974726163655F6E756D000203656E7608726F6C6C6261636B000203656E7606616363657074000203656E76025F670003030201040503010002062B077F0141A089040B7F004180080B7F004192090B7F004180080B7F0041A089040B7F0041000B7F0041010B07080104686F6F6B00060AFA800001F6800001017F230041106B220124002001200036020C41EA0841144183084113410010001A200110013703004180084102200129030010021A200129030042E300520440419608412D425B10031A0B41FF08411241C3084111410010001A41D4084116421610041A4101410110051A200141106A240042000B0B990101004180080B9101747400686F6F6B5F6F6E5F74743A2053746172742E00686F6F6B5F6F6E5F74743A20486F6F6B4F6E206669656C6420697320696E636F72726563746C79207365742E00686F6F6B5F6F6E5F74743A20456E642E00686F6F6B5F6F6E5F74743A2046696E69736865642E0022686F6F6B5F6F6E5F74743A2053746172742E220022686F6F6B5F6F6E5F74743A20456E642E22", + "Fee": "57", + "Flags": 0, + "HookApiVersion": 0, + "HookHash": "3E081C0CE176CFDEFC2F3DCB7A899B420C0878216B1B91B8105A6573DBA3EFCC", + "HookNamespace": "326178559E63837BA3B83BC05E5DC323A7B52C782AC4D5B3B182B2E050565581", + "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF", + "HookParameters": [], + "HookSetTxnID": "FBFA07E93EF41B0C6456F9D0305CFDF69020B6DF1DF969C8ACE55C01B6117258", + "ReferenceCount": "0" + }, + "LedgerEntryType": "HookDefinition", + "LedgerIndex": "8B72B7217F49533E8F9CDB580AC9183330AB38EB9458D9F18A864A6638A60935", + "PreviousFields": { + "ReferenceCount": "1" + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "RootIndex": "A4292EBEDCFFA7D6FEFFF14509C960E169FD03FECDB3880A390F3CA12C32A79C" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "A4292EBEDCFFA7D6FEFFF14509C960E169FD03FECDB3880A390F3CA12C32A79C" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "Balance": "19999999908", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 18 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "DE3BE7FDF6864FB024807B36BFCB4607E7CDA7D4C155C7AFB4B0973D638938BF", + "PreviousFields": { + "Balance": "19999999928", + "OwnerCount": 2, + "Sequence": 17 + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } + }, + "Install": { + "tx": { + "Account": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "Fee": "20", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "Flags": 1, + "HookHash": "3E081C0CE176CFDEFC2F3DCB7A899B420C0878216B1B91B8105A6573DBA3EFCC", + "HookNamespace": "326178559E63837BA3B83BC05E5DC323A7B52C782AC4D5B3B182B2E050565581", + "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF" + } + } + ], + "LastLedgerSequence": 74, + "NetworkID": 21337, + "Sequence": 14, + "SigningPubKey": "02691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE", + "TransactionType": "SetHook", + "TxnSignature": "3045022100CAF76637A7E707723381539BCD9DA8227090A57078ACE5C652F262507AC4A7F502205F41634BDB2BFD29F47D009F055C3244469A92889897682A24DCB587EB1E971E", + "ctid": "C000003700005359", + "date": 747906443, + "hash": "84D0DF728D84FBA3BFDEE0F5A52A8AC12C8A37685B73E60CE61833B5D4EF48A1", + "inLedger": 55, + "ledger_index": 55, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "CreatedNode": { + "LedgerEntryType": "Hook", + "LedgerIndex": "35C9989E8A07B1607730134CF60C3AD4EB79C5C7D94F4B5005D065994DB2824B", + "NewFields": { + "Account": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "Hooks": [ + { + "Hook": { + "Flags": 0, + "HookHash": "3E081C0CE176CFDEFC2F3DCB7A899B420C0878216B1B91B8105A6573DBA3EFCC" + } + } + ] + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "CreateCode": "0061736D0100000001200560057F7F7F7F7F017E6000017E60037F7F7E017E60027F7F017F60017F017E02520603656E76057472616365000003656E76096F74786E5F74797065000103656E760974726163655F6E756D000203656E7608726F6C6C6261636B000203656E7606616363657074000203656E76025F670003030201040503010002062B077F0141A089040B7F004180080B7F004192090B7F004180080B7F0041A089040B7F0041000B7F0041010B07080104686F6F6B00060AFA800001F6800001017F230041106B220124002001200036020C41EA0841144183084113410010001A200110013703004180084102200129030010021A200129030042E300520440419608412D425B10031A0B41FF08411241C3084111410010001A41D4084116421610041A4101410110051A200141106A240042000B0B990101004180080B9101747400686F6F6B5F6F6E5F74743A2053746172742E00686F6F6B5F6F6E5F74743A20486F6F6B4F6E206669656C6420697320696E636F72726563746C79207365742E00686F6F6B5F6F6E5F74743A20456E642E00686F6F6B5F6F6E5F74743A2046696E69736865642E0022686F6F6B5F6F6E5F74743A2053746172742E220022686F6F6B5F6F6E5F74743A20456E642E22", + "Fee": "57", + "Flags": 0, + "HookApiVersion": 0, + "HookHash": "3E081C0CE176CFDEFC2F3DCB7A899B420C0878216B1B91B8105A6573DBA3EFCC", + "HookNamespace": "326178559E63837BA3B83BC05E5DC323A7B52C782AC4D5B3B182B2E050565581", + "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF", + "HookParameters": [], + "HookSetTxnID": "4FE2C280D01607BC03D23020EE16B9284CB044A608CFD5866763AE2CD43C6726", + "ReferenceCount": "2" + }, + "LedgerEntryType": "HookDefinition", + "LedgerIndex": "8B72B7217F49533E8F9CDB580AC9183330AB38EB9458D9F18A864A6638A60935", + "PreviousFields": { + "ReferenceCount": "1" + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "RootIndex": "A4292EBEDCFFA7D6FEFFF14509C960E169FD03FECDB3880A390F3CA12C32A79C" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "A4292EBEDCFFA7D6FEFFF14509C960E169FD03FECDB3880A390F3CA12C32A79C" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "Balance": "19999999968", + "Flags": 0, + "OwnerCount": 2, + "Sequence": 15 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "DE3BE7FDF6864FB024807B36BFCB4607E7CDA7D4C155C7AFB4B0973D638938BF", + "PreviousFields": { + "Balance": "19999999988", + "OwnerCount": 1, + "Sequence": 14 + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } + }, + "NSReset": { + "tx": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Fee": "20", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "Flags": 2, + "HookNamespace": "097692A0AA4759D14DDCDC0BBE7BA76B85248529B38F678E1D4E9E635D0FDB28" + } + } + ], + "LastLedgerSequence": 152, + "NetworkID": 21337, + "Sequence": 52, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "SetHook", + "TxnSignature": "3044022024778CA0A3FA49AC2B5CBCAC510924906A762BA995C2D82E7D7C114A5AD3AC0F02205652262899261D5308D65C73B720062B239A82E265A5443019449451A98561C9", + "ctid": "C000008500005359", + "date": 747907423, + "hash": "A45968AE61699F7E16E11548FC7EC4544805CCEAEE7E7DEEE73C1DDFFA32F42C", + "inLedger": 133, + "ledger_index": 133, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "DeletedNode": { + "FinalFields": { + "Flags": 0, + "HookStateData": "0100000000000000", + "HookStateKey": "000000000000000000000000AE123A8556F3CF91154711376AFB0F894F832B3D", + "OwnerNode": "0" + }, + "LedgerEntryType": "HookState", + "LedgerIndex": "12AAAB4BCAD190E0EFFF08A642FDF78F93C545105596E134131CC7930407B868" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "HookHash": "B1F39E63D27603F1A2E7E804E92514FAC721F353D849B0787288F5026809AD84" + } + } + ], + "OwnerNode": "0" + }, + "LedgerEntryType": "Hook", + "LedgerIndex": "2448F6F57C6B3636716BDE3AD860EC7C92D1B029006770E7F396234469324934" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "19995669133", + "Flags": 0, + "OwnerCount": 7, + "Sequence": 53 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19995669153", + "HookNamespaces": [ + "097692A0AA4759D14DDCDC0BBE7BA76B85248529B38F678E1D4E9E635D0FDB28" + ], + "HookStateCount": 1, + "Sequence": 52 + } + } + }, + { + "DeletedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "RootIndex": "C7DA6E45B8456F782AB4321B28BF68054C62DF37ADC880731B33D460A03D7681" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "C7DA6E45B8456F782AB4321B28BF68054C62DF37ADC880731B33D460A03D7681" + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } + }, + "Update": { + "tx": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Fee": "20", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "HookNamespace": "67344F5689D314BBBAD7CFE24B224C1A551014883981D8DC2015A2C3C8BC7D32" + } + } + ], + "LastLedgerSequence": 108, + "NetworkID": 21337, + "Sequence": 32, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "SetHook", + "TxnSignature": "3045022100928B2B2F0E193A951DA587E7B27F04E8E13A1CDC8F4E15B9F1F6B69F6D330D51022001C0056DD68CBD4C387D0992950AF25099B2A4C34FD39818C14C9F088ECB1536", + "ctid": "C000005900005359", + "date": 747906945, + "hash": "C5768D37FD66DBF120F3FD5933CABFAF1AC0186A9595891F96B3AF8655B3B820", + "inLedger": 89, + "ledger_index": 89, + + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "HookHash": "3E081C0CE176CFDEFC2F3DCB7A899B420C0878216B1B91B8105A6573DBA3EFCC", + "HookNamespace": "67344F5689D314BBBAD7CFE24B224C1A551014883981D8DC2015A2C3C8BC7D32" + } + } + ], + "OwnerNode": "0" + }, + "LedgerEntryType": "Hook", + "LedgerIndex": "2448F6F57C6B3636716BDE3AD860EC7C92D1B029006770E7F396234469324934", + "PreviousFields": { + "Hooks": [ + { + "Hook": { + "HookHash": "3E081C0CE176CFDEFC2F3DCB7A899B420C0878216B1B91B8105A6573DBA3EFCC" + } + } + ] + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "19997748354", + "Flags": 0, + "OwnerCount": 4, + "Sequence": 33 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19997748374", + "Sequence": 32 + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/SetRegularKeyTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/SetRegularKeyTx.json new file mode 100644 index 000000000..95acc266a --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/SetRegularKeyTx.json @@ -0,0 +1,10 @@ +{ + "tx": { + "TransactionType": "SetRegularKey", + "Account": "rAccountxxxxxxxxxxxxxxxxxxxxxxxxxx", + "Fee": "12", + "RegularKey": "rDestinationxxxxxxxxxxxxxxxxxxxxxx", + "Flags": 0 + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/SignerListSetTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/SignerListSetTx.json new file mode 100644 index 000000000..cc0b5949b --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/SignerListSetTx.json @@ -0,0 +1,31 @@ +{ + "tx": { + "TransactionType": "SignerListSet", + "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", + "Fee": "12", + "Flags": 0, + "SignerQuorum": 3, + "SignerEntries": [ + { + "SignerEntry": { + "Account": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", + "SignerWeight": 2, + "WalletLocator": "03075F65D8353E3A5DA3193FF976BC17A2D0B9376BE7DA942349B6526E5A2BBF54" + } + }, + { + "SignerEntry": { + "Account": "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v", + "SignerWeight": 1 + } + }, + { + "SignerEntry": { + "Account": "raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n", + "SignerWeight": 1 + } + } + ] + }, + "meta": {} +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/TicketCreateTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/TicketCreateTx.json new file mode 100644 index 000000000..166c02370 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/TicketCreateTx.json @@ -0,0 +1,24 @@ +{ + "tx": { + "TransactionType": "TicketCreate", + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", + "Fee": "10", + "Sequence": 381, + "TicketCount": 10 + }, + "meta": { + "AffectedNodes": [ + { + "CreatedNode": { + "LedgerEntryType": "Ticket", + "LedgerIndex": "33494104C387C6FC868EE5D354B99C9FB9F31441DF7882C10EAD08EC8DA4551D", + "NewFields": { + "Account": "rJ7vWZ7esxmH3wP3p17zxPdHZbA15EEkzB", + "OwnerNode": "3", + "TicketSequence": 70035199 + } + } + } + ] + } +} diff --git a/src/common/libs/ledger/transactions/__tests__/templates/TrustSetTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/TrustSetTx.json similarity index 71% rename from src/common/libs/ledger/transactions/__tests__/templates/TrustSetTx.json rename to src/common/libs/ledger/transactions/genuine/__tests__/fixtures/TrustSetTx.json index 744059319..0683d80ae 100644 --- a/src/common/libs/ledger/transactions/__tests__/templates/TrustSetTx.json +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/TrustSetTx.json @@ -1,13 +1,13 @@ { "tx": { "TransactionType": "TrustSet", - "Account": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX", + "Account": "rrrrrrrrrrrrrrrrrrrrrholvtp", "Fee": "12", "Flags": 262144, "LastLedgerSequence": 8007750, "LimitAmount": { "currency": "USD", - "issuer": "rsP3mgGb2tcYUrxiLFiHJiQXhsziegtwBc", + "issuer": "rrrrrrrrrrrrrrrrrrrrbzbvji", "value": "100" }, "QualityIn": 1, @@ -15,4 +15,4 @@ "Sequence": 12 }, "meta": {} -} \ No newline at end of file +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenBurnTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenBurnTx.json new file mode 100644 index 000000000..11cb1822e --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenBurnTx.json @@ -0,0 +1,70 @@ +{ + "tx": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Fee": "20", + "Flags": 0, + "LastLedgerSequence": 62, + "NetworkID": 21337, + "Sequence": 13, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "URITokenBurn", + "TxnSignature": "30440220483E681B64A06FF12CA8B6FBB2D3FF3F728D10C4796D815FCCFB99A45A255EA3022057B38CA0F76B7E1A19628B109BDD3EA86967ACD68242E8A83463E928914D7CFC", + "URITokenID": "C84F707D006E99BEA1BC0A05C9123C8FFE3B40C45625C20DA24059DE09C09C9F", + "ctid": "C000002B00005359", + "date": 749731011, + "hash": "A97F0F555EA374DE81D3C530F84BBA467C6EA33BD81601FAC3E822FB111811DD", + "inLedger": 43, + "ledger_index": 43, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "19999999948", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 14 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19999999968", + "OwnerCount": 2, + "Sequence": 13 + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "RootIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + } + }, + { + "DeletedNode": { + "FinalFields": { + "Flags": 0, + "Issuer": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "OwnerNode": "0", + "PreviousTxnID": "FC8A22B1E6DF180850B23E7B89E9785FB0948110E51FF101CDF0A53EED5F9BAF", + "PreviousTxnLgrSeq": 41, + "URI": "697066733A2F2F434944" + }, + "LedgerEntryType": "URIToken", + "LedgerIndex": "C84F707D006E99BEA1BC0A05C9123C8FFE3B40C45625C20DA24059DE09C09C9F" + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenBuyTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenBuyTx.json new file mode 100644 index 000000000..c09e74323 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenBuyTx.json @@ -0,0 +1,100 @@ +{ + "tx": { + "Account": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "Amount": "10000000", + "Fee": "20", + "Flags": 0, + "LastLedgerSequence": 74, + "NetworkID": 21337, + "Sequence": 15, + "SigningPubKey": "02691AC5AE1C4C333AE5DF8A93BDC495F0EEBFC6DB0DA7EB6EF808F3AFC006E3FE", + "TransactionType": "URITokenBuy", + "TxnSignature": "3045022100BF40341A3E2E434F2669553DB2CB462AF77C20AA75E00107E007296D3E073253022005C64CCFAF26D495EF1DB48DCD75F90849BE7423129DBF76D3581F93664810BE", + "URITokenID": "716E5990589AA8FA4247E0FEABE8B605CFFBBA5CA519A70BCA37C8CC173F3244", + "ctid": "C000003700005359", + "date": 749731275, + "hash": "DA93B74D1A5EAAEEA575D225D9117989F4C2F2FCFFF1A0246E39783B127A09AD", + "inLedger": 55, + "ledger_index": 55, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Issuer": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Owner": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "OwnerNode": "0", + "URI": "697066733A2F2F434944425559" + }, + "LedgerEntryType": "URIToken", + "LedgerIndex": "716E5990589AA8FA4247E0FEABE8B605CFFBBA5CA519A70BCA37C8CC173F3244", + "PreviousFields": { + "Amount": "10000000", + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn" + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "20019999868", + "Flags": 0, + "OwnerCount": 3, + "Sequence": 18 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "20009999868" + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "RootIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "RootIndex": "A4292EBEDCFFA7D6FEFFF14509C960E169FD03FECDB3880A390F3CA12C32A79C" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "A4292EBEDCFFA7D6FEFFF14509C960E169FD03FECDB3880A390F3CA12C32A79C" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", + "Balance": "19979999948", + "Flags": 0, + "OwnerCount": 3, + "Sequence": 16 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "DE3BE7FDF6864FB024807B36BFCB4607E7CDA7D4C155C7AFB4B0973D638938BF", + "PreviousFields": { + "Balance": "19989999968", + "OwnerCount": 2, + "Sequence": 15 + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenCancelSellOfferTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenCancelSellOfferTx.json new file mode 100644 index 000000000..33718c5c7 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenCancelSellOfferTx.json @@ -0,0 +1,59 @@ +{ + "tx": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Fee": "20", + "Flags": 0, + "LastLedgerSequence": 64, + "NetworkID": 21337, + "Sequence": 14, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "URITokenCancelSellOffer", + "TxnSignature": "3045022100AC5CEEEEAAB016C471CEDAD64F6AF1B556DE93BB24FA2355ADFFCDF469311CA2022000F56DFAB528189AD79705CFF7461A0537154C2270AA92DA0234AFD8B40DBDA4", + "URITokenID": "9CE208D4743A11AB5BAE47E23E917D456EB722A89568EDCCCA94B3B04ADC95D2", + "ctid": "C000002D00005359", + "date": 749731893, + "hash": "1B81816E413B1F8841129B518F3403E574F57A130D2861CBC39771C495001469", + "inLedger": 45, + "ledger_index": 45, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "19999999928", + "Flags": 0, + "OwnerCount": 2, + "Sequence": 15 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19999999948", + "Sequence": 14 + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Issuer": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "OwnerNode": "0", + "URI": "697066733A2F2F43494443414E43454C" + }, + "LedgerEntryType": "URIToken", + "LedgerIndex": "9CE208D4743A11AB5BAE47E23E917D456EB722A89568EDCCCA94B3B04ADC95D2", + "PreviousFields": { + "Amount": "10000000" + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenCreateSellOfferTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenCreateSellOfferTx.json new file mode 100644 index 000000000..250346857 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenCreateSellOfferTx.json @@ -0,0 +1,60 @@ +{ + "tx": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Amount": "10000000", + "Fee": "20", + "Flags": 0, + "LastLedgerSequence": 62, + "NetworkID": 21337, + "Sequence": 13, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "URITokenCreateSellOffer", + "TxnSignature": "3045022100A2AD4E96777FB43CE04F1BD443D4BAD7575E0D2BE8AD6881AA39F6A74B38F5B902202EBF0CF6B20E11EE03FC448CAA0109A7DDD5D9902805B7C3FB3B5C68BCD94A3B", + "URITokenID": "1016FBAE4CAFB51A7E768724151964FF572495934C2D4A98CCC67229749C3F72", + "Destination": "rDestinationxxxxxxxxxxxxxxxxxxxxxx", + "ctid": "C000002B00005359", + "date": 749731691, + "hash": "F672C7CD07F25EF9FDFE762AA9EF1787B6018EF5F442296FAABAD83E9E13313C", + "inLedger": 43, + "ledger_index": 43, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Amount": "10000000", + "Flags": 0, + "Issuer": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "OwnerNode": "0", + "URI": "697066733A2F2F43494453454C4C" + }, + "LedgerEntryType": "URIToken", + "LedgerIndex": "1016FBAE4CAFB51A7E768724151964FF572495934C2D4A98CCC67229749C3F72", + "PreviousFields": {} + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "19999999948", + "Flags": 0, + "OwnerCount": 2, + "Sequence": 14 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19999999968", + "Sequence": 13 + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenMintTx.json b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenMintTx.json new file mode 100644 index 000000000..9e077314d --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/fixtures/URITokenMintTx.json @@ -0,0 +1,69 @@ +{ + "tx": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Fee": "20", + "Flags": 0, + "LastLedgerSequence": 66, + "NetworkID": 21337, + "Sequence": 14, + "SigningPubKey": "0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052", + "TransactionType": "URITokenMint", + "TxnSignature": "3045022100E0F97F9C968F834EDC95AAF95039EEB825C1EDFA2011E5D15B2B07F93D2C3CA602205A037BCC7A7087874DB4884E88815A27E8BC2E7CA0D04D29E551177245DB9DE5", + "URI": "697066733A2F2F434944", + "Digest": "697066733A2F2F434944697066733A2F2F434944697066733A2F2F434944", + "Amount": "1000000", + "Destination": "rDestinationxxxxxxxxxxxxxxxxxxxxxx", + "ctid": "C000002F00005359", + "date": 749730721, + "hash": "BDF61C60FA7AEE7CAC04C10B56F6E57C0F61F65655CF77C46ED97F814E6C0E55", + "inLedger": 47, + "ledger_index": 47, + "validated": true + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Balance": "19999999912", + "Flags": 0, + "OwnerCount": 2, + "Sequence": 15 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F", + "PreviousFields": { + "Balance": "19999999932", + "OwnerCount": 1, + "Sequence": 14 + } + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "RootIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "A33EC6BB85FB5674074C4A3A43373BB17645308F3EAE1933E3E35252162B217D" + } + }, + { + "CreatedNode": { + "LedgerEntryType": "URIToken", + "LedgerIndex": "C84F707D006E99BEA1BC0A05C9123C8FFE3B40C45625C20DA24059DE09C09C9F", + "NewFields": { + "Issuer": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "Owner": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", + "URI": "697066733A2F2F434944" + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + } +} diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/genesisMint.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/genesisMint.test.ts new file mode 100644 index 000000000..bfbc406d1 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/genesisMint.test.ts @@ -0,0 +1,12 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import { GenesisMint } from '../GenesisMint'; + +jest.mock('@services/NetworkService'); + +describe('GenesisMint tx', () => { + it('Should set tx type if not set', () => { + const instance = new GenesisMint(); + expect(instance.Type).toBe('GenesisMint'); + }); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/invoke.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/invoke.test.ts new file mode 100644 index 000000000..81c8dcb99 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/invoke.test.ts @@ -0,0 +1,60 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import Localize from '@locale'; + +import { Invoke, InvokeInfo } from '../Invoke'; + +import invokeTemplate from './fixtures/InvokeTx.json'; + +jest.mock('@services/NetworkService'); + +describe('Invoke', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new Invoke(); + expect(instance.TransactionType).toBe('Invoke'); + expect(instance.Type).toBe('Invoke'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = invokeTemplate; + const instance = new Invoke(tx, meta); + + expect(instance.Blob).toBe('0388935426E0D08083314842EDFBB2D517BD47699F9A4527318A8E10468C97C052'); + expect(instance.Destination).toStrictEqual({ + address: 'rrrrrrrrrrrrrrrrrrrrbzbvji', + tag: 1337, + }); + expect(instance.InvoiceID).toBe('92FA6A9FC8EA6018D5D16532D7795C91BFB0831355BDFDA177E86C8BF997985F'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = invokeTemplate; + const instance = new Invoke(tx, meta); + + const expectedDescription = `${Localize.t('events.invokeInitiatorExplain', { + address: instance.Account.address, + })}\n${Localize.t('events.theTransactionHasADestination', { + destination: instance.Destination.address, + })}\n${Localize.t('events.theTransactionHasADestinationTag', { + tag: instance.Destination.tag, + })}\n${Localize.t('events.theTransactionHasAInvoiceId', { + invoiceId: instance.InvoiceID, + })}`; + + expect(InvokeInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(InvokeInfo.getLabel()).toEqual(Localize.t('events.invoke')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenAcceptOffer.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenAcceptOffer.test.ts new file mode 100644 index 000000000..bf2f45838 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenAcceptOffer.test.ts @@ -0,0 +1,56 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import Localize from '@locale'; + +import { NFTokenAcceptOffer, NFTokenAcceptOfferInfo } from '../NFTokenAcceptOffer'; +import nFTokenAcceptOfferTemplate from './fixtures/NFTokenAcceptOfferTx.json'; + +jest.mock('@services/NetworkService'); + +describe('NFTokenAcceptOffer', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new NFTokenAcceptOffer(); + expect(instance.TransactionType).toBe('NFTokenAcceptOffer'); + expect(instance.Type).toBe('NFTokenAcceptOffer'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = nFTokenAcceptOfferTemplate; + const instance = new NFTokenAcceptOffer(tx, meta); + + expect(instance.NFTokenSellOffer).toBe('D68E2D453EBA6468C3BE8FFE4F73EA077A5B7EE6712082D213212D83FDF7245E'); + expect(instance.NFTokenBuyOffer).toBe('13471FEBC1F76E6174D4FE5E334BD8DF1C7243EFFD7583A5DDB75DD2EC3CB347'); + expect(instance.NFTokenBrokerFee).toStrictEqual({ + currency: 'XRP', + value: '1', + }); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = nFTokenAcceptOfferTemplate; + const instance = new NFTokenAcceptOffer(tx, meta); + + // TODO: add description tests + // const expectedDescription = Localize.t('events.itAuthorizesSendingPaymentsToThisAccount', { + // address: tx.Authorize, + // }); + // + // expect(EscrowCancelInfo.getDescription(instance)).toEqual(expectedDescription); + + expect(instance).toBeDefined(); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(NFTokenAcceptOfferInfo.getLabel()).toEqual(Localize.t('events.acceptNFTOffer')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenBurn.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenBurn.test.ts new file mode 100644 index 000000000..78e3efe76 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenBurn.test.ts @@ -0,0 +1,41 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { NFTokenBurn, NFTokenBurnInfo } from '../NFTokenBurn'; +import nFTokenBurnTemplate from './fixtures/NFTokenBurnTx.json'; + +jest.mock('@services/NetworkService'); + +describe('NFTokenBurn tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new NFTokenBurn(); + expect(instance.TransactionType).toBe('NFTokenBurn'); + expect(instance.Type).toBe('NFTokenBurn'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = nFTokenBurnTemplate; + const instance = new NFTokenBurn(tx, meta); + + const expectedDescription = `${Localize.t('events.nfTokenBurnExplain', { + tokenID: instance.NFTokenID, + })}`; + expect(NFTokenBurnInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(NFTokenBurnInfo.getLabel()).toEqual(Localize.t('events.burnNFT')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenCancelOffer.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenCancelOffer.test.ts new file mode 100644 index 000000000..6805cb93a --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenCancelOffer.test.ts @@ -0,0 +1,39 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import Localize from '@locale'; + +import { NFTokenCancelOffer, NFTokenCancelOfferInfo } from '../NFTokenCancelOffer'; +import nfTokenCancelOfferTemplate from './fixtures/NFTokenCancelOfferTx.json'; + +jest.mock('@services/NetworkService'); +describe('NFTokenCancelOffer tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new NFTokenCancelOffer(); + expect(instance.TransactionType).toBe('NFTokenCancelOffer'); + expect(instance.Type).toBe('NFTokenCancelOffer'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = nfTokenCancelOfferTemplate; + const instance = new NFTokenCancelOffer(tx, meta); + + const expectedDescription = `${Localize.t('events.theTransactionWillCancelNftOffer', { + address: instance.Account.address, + })}\n9C92E061381C1EF37A8CDE0E8FC35188BFC30B1883825042A64309AC09F4C36D\n736A0B59D00E8F74CABDB6A4217FC8E8E0F19A2EDB3F9145F4021E950746106F\n`; + expect(NFTokenCancelOfferInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(NFTokenCancelOfferInfo.getLabel()).toEqual(Localize.t('events.cancelNFTOffer')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenCreateOffer.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenCreateOffer.test.ts new file mode 100644 index 000000000..56bbd74dc --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenCreateOffer.test.ts @@ -0,0 +1,69 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; +import moment from 'moment-timezone'; + +import { NormalizeCurrencyCode } from '@common/utils/amount'; + +import { NFTokenCreateOffer, NFTokenCreateOfferInfo } from '../NFTokenCreateOffer'; +import nfTokenCreateOfferTemplate from './fixtures/NFTokenCreateOfferTx.json'; + +jest.mock('@services/NetworkService'); + +describe('NFTokenCreateOffer tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new NFTokenCreateOffer(); + expect(instance.TransactionType).toBe('NFTokenCreateOffer'); + expect(instance.Type).toBe('NFTokenCreateOffer'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description for sell offer', () => { + const { tx, meta } = nfTokenCreateOfferTemplate.sellOffer; + const instance = new NFTokenCreateOffer(tx, meta); + + const expectedDescription = `${Localize.t('events.nftOfferSellExplain', { + address: instance.Account.address, + tokenID: instance.NFTokenID, + amount: instance.Amount.value, + currency: NormalizeCurrencyCode(instance.Amount.currency), + })}\n${Localize.t('events.theNftOwnerIs', { address: instance.Owner })}\n${Localize.t( + 'events.thisNftOfferMayOnlyBeAcceptedBy', + { + address: instance.Destination.address, + }, + )}\n${Localize.t('events.theOfferExpiresAtUnlessCanceledOrAccepted', { + expiration: moment(instance.Expiration).format('LLLL'), + })}`; + + expect(NFTokenCreateOfferInfo.getDescription(instance)).toEqual(expectedDescription); + }); + + it('should return the expected description for buy offer', () => { + const { tx, meta } = nfTokenCreateOfferTemplate.buyOffer; + const instance = new NFTokenCreateOffer(tx, meta); + + const expectedDescription = `${Localize.t('events.nftOfferBuyExplain', { + address: instance.Account.address, + tokenID: instance.NFTokenID, + amount: instance.Amount.value, + currency: NormalizeCurrencyCode(instance.Amount.currency), + })}`; + + expect(NFTokenCreateOfferInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(NFTokenCreateOfferInfo.getLabel()).toEqual(Localize.t('events.createNFTOffer')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenMint.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenMint.test.ts new file mode 100644 index 000000000..2c1062ca2 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/nfTokenMint.test.ts @@ -0,0 +1,58 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { NFTokenMint, NFTokenMintInfo } from '../NFTokenMint'; + +import nfTokenMintTemplate from './fixtures/NFTokenMintTx.json'; + +jest.mock('@services/NetworkService'); + +describe('NFTokenMint tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new NFTokenMint(); + expect(instance.TransactionType).toBe('NFTokenMint'); + expect(instance.Type).toBe('NFTokenMint'); + }); + + it('Should return right NFTokenID from meta data', () => { + const { tx, meta } = nfTokenMintTemplate; + const instance = new NFTokenMint(tx, meta); + expect(instance.NFTokenID).toEqual(meta.nftoken_id); + }); + + it('Should calculate right NFTokenID', () => { + const { tx, meta } = nfTokenMintTemplate; + const { nftoken_id } = meta; + const instance = new NFTokenMint(tx, { ...meta, nftoken_id: undefined }); + expect(instance.NFTokenID).toEqual(nftoken_id); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = nfTokenMintTemplate; + const instance = new NFTokenMint(tx, meta); + + const expectedDescription = `${Localize.t('events.theTokenIdIs', { + tokenID: instance.NFTokenID, + })}\n${Localize.t('events.theTokenHasATransferFee', { + transferFee: instance.TransferFee, + })}\n${Localize.t('events.theTokenTaxonForThisTokenIs', { taxon: instance.NFTokenTaxon })}`; + + expect(NFTokenMintInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(NFTokenMintInfo.getLabel()).toEqual(Localize.t('events.mintNFT')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/offerCancel.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/offerCancel.test.ts new file mode 100644 index 000000000..161a69d63 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/offerCancel.test.ts @@ -0,0 +1,51 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { OfferCancel, OfferCancelInfo } from '../OfferCancel'; +import offerCancelTemplates from './fixtures/OfferCancelTx.json'; + +jest.mock('@services/NetworkService'); + +describe('OfferCancel tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new OfferCancel(); + expect(instance.TransactionType).toBe('OfferCancel'); + expect(instance.Type).toBe('OfferCancel'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = offerCancelTemplates; + const instance = new OfferCancel(tx, meta); + + expect(instance.OfferSequence).toBe(6); + expect(instance.OfferID).toBe(tx.OfferID); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = offerCancelTemplates; + const instance = new OfferCancel(tx, meta); + + const expectedDescription = `${Localize.t('events.theTransactionWillCancelOffer', { + address: instance.Account.address, + offerSequence: instance.OfferSequence, + })}\n${Localize.t('events.theTransactionHasAOfferId', { offerId: tx.OfferID })}`; + + expect(OfferCancelInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(OfferCancelInfo.getLabel()).toEqual(Localize.t('events.cancelOffer')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/offerCreate.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/offerCreate.test.ts new file mode 100644 index 000000000..b70efa56e --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/offerCreate.test.ts @@ -0,0 +1,234 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; +import moment from 'moment-timezone'; + +import NetworkService from '@services/NetworkService'; + +import { OfferCreate, OfferCreateInfo } from '../OfferCreate'; +import offerCreateTemplates from './fixtures/OfferCreateTx.json'; + +import { NormalizeCurrencyCode } from '../../../../../utils/amount'; + +jest.mock('@services/NetworkService'); + +describe('OfferCreate tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new OfferCreate(); + expect(instance.TransactionType).toBe('OfferCreate'); + expect(instance.Type).toBe('OfferCreate'); + }); + + it('Should return right parsed values for executed order XRP->IOU', () => { + const { tx, meta } = offerCreateTemplates.XRPIOU; + const instance = new OfferCreate(tx, meta); + + expect(instance.GetOfferStatus(tx.Account)).toBe('FILLED'); + expect(instance.OfferSequence).toBe(94); + expect(instance.Rate).toBe(0.000024271999999999997); + expect(instance.Expiration).toBe(undefined); + expect(instance.OfferID).toBe(tx.OfferID); + + expect(instance.TakerPays).toStrictEqual({ + currency: 'BTC', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '0.012136', + }); + expect(instance.TakerPaid()).toStrictEqual({ + action: 'INC', + currency: 'BTC', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '0.01257026', + }); + expect(instance.TakerGets).toStrictEqual({ + currency: 'XRP', + value: '500', + }); + expect(instance.TakerGot()).toStrictEqual({ + action: 'DEC', + currency: 'XRP', + value: '500', + }); + }); + + it('Should return right parsed values for executed order IOU->XRP', () => { + const { tx, meta } = offerCreateTemplates.IOUXRP; + const instance = new OfferCreate(tx, meta); + + expect(instance.GetOfferStatus(tx.Account)).toBe('FILLED'); + expect(instance.OfferSequence).toBe(112); + expect(instance.Rate).toBe(0.000025941414017897298); + expect(instance.Expiration).toBe('2021-09-20T09:38:28.000Z'); + + expect(instance.TakerPays).toStrictEqual({ + currency: 'XRP', + value: '484.553386', + }); + expect(instance.TakerPaid()).toStrictEqual({ + action: 'INC', + currency: 'XRP', + value: '501.44754', + }); + expect(instance.TakerGets).toStrictEqual({ + currency: 'BTC', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '0.01257', + }); + expect(instance.TakerGot()).toStrictEqual({ + action: 'DEC', + currency: 'BTC', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '0.01257026', + }); + }); + + it('Should set right values XRP->IOU ', () => { + const offer = new OfferCreate(); + + offer.TakerGets = { currency: 'XRP', value: '500' }; + offer.TakerPays = { currency: 'BTC', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', value: '0.012136' }; + offer.Expiration = '05 October 2011 14:48 UTC'; + + expect(offer.TakerGets).toStrictEqual({ + currency: 'XRP', + value: '500', + }); + + expect(offer.TakerPays).toStrictEqual({ + currency: 'BTC', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '0.012136', + }); + + expect(offer.Expiration).toBe('2011-10-05T14:48:00.000Z'); + }); + + it('Should set right values IOU->XRP ', () => { + const offer = new OfferCreate(); + + offer.TakerPays = { currency: 'XRP', value: '500' }; + offer.TakerGets = { currency: 'BTC', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', value: '0.012136' }; + + expect(offer.TakerPays).toStrictEqual({ + currency: 'XRP', + value: '500', + }); + + expect(offer.TakerGets).toStrictEqual({ + currency: 'BTC', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '0.012136', + }); + }); + + it('Should return right parsed values for executed order from another owner', () => { + const { tx, meta } = offerCreateTemplates.XRPIOUDifferentOwner; + const instance = new OfferCreate(tx, meta); + + expect(instance.GetOfferStatus('rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ')).toBe('PARTIALLY_FILLED'); + expect(instance.OfferSequence).toBe(56270334); + expect(instance.Rate).toBe(0.38076); + expect(instance.Expiration).toBe(undefined); + + expect(instance.TakerGets).toStrictEqual({ + currency: 'XRP', + value: '100', + }); + expect(instance.TakerGot('rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ')).toStrictEqual({ + action: 'DEC', + currency: '534F4C4F00000000000000000000000000000000', + issuer: 'rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz', + value: '38.46538462', + }); + expect(instance.TakerPays).toStrictEqual({ + currency: '534F4C4F00000000000000000000000000000000', + issuer: 'rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz', + value: '38.076', + }); + expect(instance.TakerPaid('rwietsevLFg8XSmG3bEZzFein1g8RBqWDZ')).toStrictEqual({ + action: 'INC', + currency: 'XRP', + value: '100', + }); + }); + + it('Should return zero for taker got and taker paid if order cancelled or killed', () => { + const { tx, meta } = offerCreateTemplates.XRPIOUCANCELED; + const instance = new OfferCreate(tx, meta); + + // expect(instance.Executed).toBe(true); + expect(instance.OfferSequence).toBe(61160755); + + expect(instance.TakerGets).toStrictEqual({ + currency: 'XRP', + value: '50', + }); + expect(instance.TakerGot('rQamE9ddZiRZLKRAAzwGKboQ8rQHgesjEs')).toStrictEqual({ + currency: 'XRP', + value: '0', + }); + expect(instance.TakerPays).toStrictEqual({ + currency: 'CSC', + issuer: 'rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr', + value: '11616.66671104', + }); + expect(instance.TakerPaid('rQamE9ddZiRZLKRAAzwGKboQ8rQHgesjEs')).toStrictEqual({ + currency: 'CSC', + issuer: 'rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr', + value: '0', + }); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = offerCreateTemplates.IOUXRP; + const instance = new OfferCreate(tx, meta); + + const expectedDescription = `${Localize.t('events.offerTransactionExplain', { + address: instance.Account.address, + takerGetsValue: instance.TakerGets.value, + takerGetsCurrency: NormalizeCurrencyCode(instance.TakerGets.currency), + takerPaysValue: instance.TakerPays.value, + takerPaysCurrency: NormalizeCurrencyCode(instance.TakerPays.currency), + })}\n${Localize.t('events.theExchangeRateForThisOfferIs', { + rate: instance.Rate, + takerPaysCurrency: + instance.TakerGets.currency === NetworkService.getNativeAsset() + ? NormalizeCurrencyCode(instance.TakerPays.currency) + : NormalizeCurrencyCode(instance.TakerGets.currency), + takerGetsCurrency: + instance.TakerGets.currency !== NetworkService.getNativeAsset() + ? NormalizeCurrencyCode(instance.TakerPays.currency) + : NormalizeCurrencyCode(instance.TakerGets.currency), + })}\n${Localize.t('events.theTransactionIsAlsoCancelOffer', { + address: instance.Account.address, + offerSequence: instance.OfferSequence, + })}\n${Localize.t('events.theTransactionHasAOfferId', { offerId: tx.OfferID })}\n${Localize.t( + 'events.theOfferExpiresAtUnlessCanceledOrConsumed', + { + expiration: moment(instance.Expiration).format('LLLL'), + }, + )}`; + + expect(OfferCreateInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + const { tx, meta } = offerCreateTemplates.IOUXRP; + const instance = new OfferCreate(tx, meta); + // @ts-ignore + expect(OfferCreateInfo.getLabel(instance, { address: tx.Account })).toEqual( + Localize.t('events.exchangedAssets'), + ); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/payment.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/payment.test.ts new file mode 100644 index 000000000..9e2aac95e --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/payment.test.ts @@ -0,0 +1,280 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import LedgerService from '@services/LedgerService'; + +import { Payment, PaymentInfo, PaymentValidation } from '../Payment'; +import paymentTemplate from './fixtures/PaymentTx.json'; + +import { NormalizeCurrencyCode } from '../../../../../utils/amount'; + +jest.mock('@services/NetworkService'); + +describe('Payment tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new Payment(); + expect(instance.TransactionType).toBe('Payment'); + expect(instance.Type).toBe('Payment'); + }); + + it('Should return right parsed values for tx XRP->XRP', () => { + const { tx, meta } = paymentTemplate.XRP2XRP; + const instance = new Payment(tx, meta); + + expect(instance.InvoiceID).toBe('123'); + + expect(instance.Amount).toStrictEqual({ + currency: 'XRP', + value: '85.5321', + }); + + expect(instance.Destination).toStrictEqual({ + tag: 123, + address: 'rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh', + }); + }); + + it('Should return right parsed values for tx to self with path sets', () => { + const { tx, meta } = paymentTemplate.ToSelfWithPath; + const instance = new Payment(tx, meta); + + expect(instance.BalanceChange()).toStrictEqual({ + received: { + action: 'INC', + currency: 'XRP', + value: '0.999988', + }, + sent: { + action: 'DEC', + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '1.23905437', + }, + }); + }); + + it('Should set/get payment fields', () => { + const instance = new Payment(); + + instance.InvoiceID = '123'; + expect(instance.InvoiceID).toBe('123'); + + // amount + // @ts-ignore + instance.Amount = '85.5321'; + expect(instance.Amount).toStrictEqual({ + currency: 'XRP', + value: '85.5321', + }); + + instance.Amount = { + currency: 'USD', + issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + value: '1', + }; + expect(instance.Amount).toStrictEqual({ + currency: 'USD', + issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + value: '1', + }); + + instance.Destination = { + address: 'rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh', + tag: 1234, + }; + expect(instance.Destination).toStrictEqual({ + tag: 1234, + address: 'rLHzPsX6oXkzU2qL12kHCH8G8cnZv1rBJh', + }); + + instance.SendMax = { + currency: 'USD', + issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + value: '1', + }; + expect(instance.SendMax).toStrictEqual({ + currency: 'USD', + issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + value: '1', + }); + // @ts-ignore + instance.SendMax = '85.5321'; + expect(instance.SendMax).toStrictEqual({ + currency: 'XRP', + value: '85.5321', + }); + + instance.DeliverMin = { + currency: 'USD', + issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + value: '1', + }; + expect(instance.DeliverMin).toStrictEqual({ + currency: 'USD', + issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + value: '1', + }); + // @ts-ignore + instance.DeliverMin = '85.5321'; + expect(instance.DeliverMin).toStrictEqual({ + currency: 'XRP', + value: '85.5321', + }); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = paymentTemplate.ToSelfWithPath; + const instance = new Payment(tx, meta); + + const expectedDescription = `${Localize.t('events.thePaymentHasASourceTag', { + tag: instance.Account.tag, + })} \n${Localize.t('events.thePaymentHasADestinationTag', { + tag: instance.Destination.tag, + })} \n${Localize.t('events.itWasInstructedToDeliver', { + amount: instance.Amount.value, + currency: NormalizeCurrencyCode(instance.Amount.currency), + })} ${Localize.t('events.bySpendingUpTo', { + amount: instance.SendMax.value, + currency: NormalizeCurrencyCode(instance.SendMax.currency), + })}`; + + expect(PaymentInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + const { tx, meta } = paymentTemplate.SimplePayment; + const instance = new Payment(tx, meta); + // @ts-ignore + expect(PaymentInfo.getLabel(instance, { address: tx.Account })).toEqual( + Localize.t('events.paymentSent'), + ); + }); + }); + }); + + describe('Validation', () => { + it('should be able to validate the payment', async () => { + const Account = 'rEAa7TDpBdL1hoRRAp3WDmzBcuQzaXssmb'; + const Destination = 'r39CmfchUiq3y2xJ23nJpnDHVitPbiHbAz'; + + // should reject if no amount is added to the transaction + const paymentsWithEmptyAmount = [ + {}, + { Amount: '0' }, + { Amount: { currency: 'USD' } }, + { Amount: { currency: 'USD', value: '0' } }, + ]; + for (const payment of paymentsWithEmptyAmount) { + await expect(PaymentValidation(new Payment(payment))).rejects.toThrow( + new Error(Localize.t('send.pleaseEnterAmount')), + ); + } + + // should reject if sending XRP and insufficient balance + const spyAvailableBalance = jest + .spyOn(LedgerService, 'getAccountAvailableBalance') + .mockImplementation(() => Promise.resolve(10)); + + const spyGetFilteredAccountLine = jest + .spyOn(LedgerService, 'getFilteredAccountLine') + .mockImplementation(() => + Promise.resolve({ + limit: '10000', + balance: '10', + account: 'r...', + currency: 'USD', + limit_peer: '0', + quality_in: 0, + quality_out: 0, + }), + ); + + const paymentsWithXRPPayments = [ + { Account, Destination, Amount: '20000000' }, + { Account, Destination, Amount: { currency: 'USD', value: '1' }, SendMax: '20000000' }, + ]; + + for (const payment of paymentsWithXRPPayments) { + await expect(PaymentValidation(new Payment(payment))).rejects.toThrow( + new Error( + Localize.t('send.insufficientBalanceSpendableBalance', { + spendable: '10', + currency: 'XRP', + }), + ), + ); + } + + spyGetFilteredAccountLine.mockRestore(); + spyAvailableBalance.mockRestore(); + + // should reject if sending IOU and insufficient balance + const spy2 = jest.spyOn(LedgerService, 'getFilteredAccountLine').mockImplementation(() => + Promise.resolve({ + limit: '10000', + balance: '10', + account: 'r...', + currency: 'USD', + limit_peer: '0', + quality_in: 0, + quality_out: 0, + }), + ); + + const paymentsWithIOUPayments = [ + { Account, Destination, Amount: { currency: 'USD', value: '20' } }, + { Account, Destination, SendMax: { currency: 'USD', value: '20' }, Amount: '20000000' }, + ]; + + for (const payment of paymentsWithIOUPayments) { + await expect(PaymentValidation(new Payment(payment))).rejects.toThrow( + new Error( + Localize.t('send.insufficientBalanceSpendableBalance', { + spendable: '10', + currency: 'USD', + }), + ), + ); + } + spy2.mockRestore(); + + // should reject if sending IOU and destination doesn't have proper TrustLine + const destinationLineConditions = [ + undefined, + { + limit: '0', + balance: '0', + account: 'r...', + currency: 'USD', + limit_peer: '0', + quality_in: 0, + quality_out: 0, + }, + ]; + + for (const condition of destinationLineConditions) { + const spy3 = jest + .spyOn(LedgerService, 'getFilteredAccountLine') + .mockImplementation(() => Promise.resolve(condition)); + await expect( + PaymentValidation( + new Payment({ + Account, + Destination, + Amount: { currency: 'USD', value: '20', issuer: 'r...' }, + }), + ), + ).rejects.toThrow(new Error(Localize.t('send.unableToSendPaymentRecipientDoesNotHaveTrustLine'))); + spy3.mockRestore(); + } + }); + }); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/paymentChannelClaim.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/paymentChannelClaim.test.ts new file mode 100644 index 000000000..46f6e26fe --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/paymentChannelClaim.test.ts @@ -0,0 +1,61 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { PaymentChannelClaim, PaymentChannelClaimInfo } from '../PaymentChannelClaim'; +import paymentChannelClaimTemplates from './fixtures/PaymentChannelClaimTx.json'; + +jest.mock('@services/NetworkService'); + +describe('PaymentChannelClaim tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new PaymentChannelClaim(); + expect(instance.TransactionType).toBe('PaymentChannelClaim'); + expect(instance.Type).toBe('PaymentChannelClaim'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = paymentChannelClaimTemplates; + const instance = new PaymentChannelClaim(tx, meta); + + expect(instance.Type).toBe('PaymentChannelClaim'); + + expect(instance.Channel).toBe('C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198'); + expect(instance.PublicKey).toBe('32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A'); + expect(instance.Signature).toBe( + '30440220718D264EF05CAED7C781FF6DE298DCAC68D002562C9BF3A07C1E721B420C0DAB02203A5A4779EF4D2CCC7BC3EF886676D803A9981B928D3B8ACA483B80ECA3CD7B9B', + ); + + expect(instance.Amount).toEqual({ currency: 'XRP', value: '1' }); + expect(instance.Balance).toEqual({ currency: 'XRP', value: '1' }); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = paymentChannelClaimTemplates; + const instance = new PaymentChannelClaim(tx, meta); + + const expectedDescription = `${Localize.t('events.itWillUpdateThePaymentChannel', { + channel: instance.Channel, + })}\n${Localize.t('events.theChannelBalanceClaimedIs', { + balance: instance.Balance.value, + currency: instance.Balance.currency, + })}\n${Localize.t('events.thePaymentChannelWillBeClosed')}`; + + expect(PaymentChannelClaimInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(PaymentChannelClaimInfo.getLabel()).toEqual(Localize.t('events.claimPaymentChannel')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/paymentChannelCreate.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/paymentChannelCreate.test.ts new file mode 100644 index 000000000..209b00c14 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/paymentChannelCreate.test.ts @@ -0,0 +1,88 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ +import moment from 'moment-timezone'; + +import Localize from '@locale'; + +import { PaymentChannelCreate, PaymentChannelCreateInfo } from '../PaymentChannelCreate'; +import paymentChannelCreateTemplate from './fixtures/PaymentChannelCreateTx.json'; + +jest.mock('@services/NetworkService'); + +describe('PaymentChannelCreate tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new PaymentChannelCreate(); + expect(instance.TransactionType).toBe('PaymentChannelCreate'); + expect(instance.Type).toBe('PaymentChannelCreate'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = paymentChannelCreateTemplate; + const instance = new PaymentChannelCreate(tx, meta); + + expect(instance.Type).toBe('PaymentChannelCreate'); + expect(instance.Account).toEqual({ + address: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + tag: 11747, + }); + expect(instance.Destination).toEqual({ + address: 'rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW', + tag: 23480, + }); + expect(instance.SettleDelay).toBe(86400); + expect(instance.PublicKey).toBe('32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A'); + expect(instance.Amount).toEqual({ currency: 'XRP', value: '0.01' }); + expect(instance.CancelAfter).toBe('2016-11-22T23:12:38.000Z'); + }); + + it('Should populate public key if not set', async () => { + const { tx, meta } = paymentChannelCreateTemplate; + delete tx.PublicKey; + const instance = new PaymentChannelCreate(tx, meta); + + expect(instance.PublicKey).toBe(undefined); + + await instance.prepare({ + publicKey: '32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A', + } as any); + + expect(instance.PublicKey).toBe('32D2471DB72B27E3310F355BB33E339BF26F8392D5A93D3BC0FC3B566612DA0F0A'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = paymentChannelCreateTemplate; + const instance = new PaymentChannelCreate(tx, meta); + + const expectedDescription = `${Localize.t('events.accountWillCreateAPaymentChannelTo', { + account: instance.Account.address, + destination: instance.Destination.address, + })}\n${Localize.t('events.theChannelIdIs', { + channel: instance.ChannelID, + })}\n${Localize.t('events.theChannelAmountIs', { + amount: instance.Amount.value, + currency: instance.Amount.currency, + })}\n${Localize.t('events.theASourceTagIs', { tag: instance.Account.tag })} \n${Localize.t( + 'events.theDestinationTagIs', + { tag: instance.Destination.tag }, + )} \n${Localize.t('events.theChannelHasASettlementDelay', { delay: tx.SettleDelay })} \n${Localize.t( + 'events.itCanBeCancelledAfter', + { cancelAfter: moment(instance.CancelAfter).format('LLLL') }, + )}`; + + expect(PaymentChannelCreateInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(PaymentChannelCreateInfo.getLabel()).toEqual(Localize.t('events.createPaymentChannel')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/paymentChannelFund.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/paymentChannelFund.test.ts new file mode 100644 index 000000000..566d7d0a5 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/paymentChannelFund.test.ts @@ -0,0 +1,59 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { PaymentChannelFund, PaymentChannelFundInfo } from '../PaymentChannelFund'; +import paymentChannelFundTemplates from './fixtures/PaymentChannelFundTx.json'; + +jest.mock('@services/NetworkService'); + +describe('PaymentChannelFund tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new PaymentChannelFund(); + expect(instance.TransactionType).toBe('PaymentChannelFund'); + expect(instance.Type).toBe('PaymentChannelFund'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = paymentChannelFundTemplates; + const instance = new PaymentChannelFund(tx, meta); + + expect(instance.Account).toEqual({ + address: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + tag: undefined, + }); + expect(instance.Type).toBe('PaymentChannelFund'); + expect(instance.Channel).toBe('C1AE6DDDEEC05CF2978C0BAD6FE302948E9533691DC749DCDD3B9E5992CA6198'); + expect(instance.Amount).toEqual({ currency: 'XRP', value: '0.2' }); + expect(instance.Expiration).toBe('2017-03-18T16:59:18.000Z'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = paymentChannelFundTemplates; + const instance = new PaymentChannelFund(tx, meta); + + const expectedDescription = `${Localize.t('events.itWillUpdateThePaymentChannel', { + channel: instance.Channel, + })}\n${Localize.t('events.itWillIncreaseTheChannelAmount', { + amount: instance.Amount.value, + currency: instance.Amount.currency, + })}`; + + expect(PaymentChannelFundInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(PaymentChannelFundInfo.getLabel()).toEqual(Localize.t('events.fundPaymentChannel')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/setHook.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/setHook.test.ts new file mode 100644 index 000000000..b78dbd828 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/setHook.test.ts @@ -0,0 +1,41 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { SetHook, SetHookInfo } from '../SetHook'; + +import setHookTemplate from './fixtures/SetHookTx.json'; + +jest.mock('@services/NetworkService'); + +describe('SetHook tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new SetHook(); + expect(instance.TransactionType).toBe('SetHook'); + expect(instance.Type).toBe('SetHook'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = setHookTemplate.Create; + const instance = new SetHook(tx, meta); + + const expectedDescription = `This is an ${instance.Type} transaction`; + + expect(SetHookInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(SetHookInfo.getLabel()).toEqual(Localize.t('events.setHooks')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/setRegularKey.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/setRegularKey.test.ts new file mode 100644 index 000000000..f9e961fb2 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/setRegularKey.test.ts @@ -0,0 +1,58 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { SetRegularKey, SetRegularKeyInfo } from '../SetRegularKey'; +import setRegularKeyTemplates from './fixtures/SetRegularKeyTx.json'; + +jest.mock('@services/NetworkService'); + +describe('SetRegularKey tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new SetRegularKey(); + expect(instance.TransactionType).toBe('SetRegularKey'); + expect(instance.Type).toBe('SetRegularKey'); + }); + + it('Should return right parsed values', () => { + // @ts-ignore + const { tx, meta } = setRegularKeyTemplates; + const instance = new SetRegularKey(tx, meta); + + expect(instance.RegularKey).toBe('rDestinationxxxxxxxxxxxxxxxxxxxxxx'); + }); + }); + + describe('Info', () => { + describe('getDescription() && getLabel()', () => { + it('should return the expected description for setting the key', () => { + const { tx, meta } = setRegularKeyTemplates; + const instance = new SetRegularKey(tx, meta); + + const expectedDescription = `${Localize.t('events.thisIsAnSetRegularKeyTransaction')}\n${Localize.t( + 'events.itSetsAccountRegularKeyTo', + { regularKey: tx.RegularKey }, + )}`; + + expect(SetRegularKeyInfo.getLabel(instance)).toEqual(Localize.t('events.setRegularKey')); + expect(SetRegularKeyInfo.getDescription(instance)).toEqual(expectedDescription); + }); + + it('should return the expected description for removing the key', () => { + const { tx, meta } = setRegularKeyTemplates; + const instance = new SetRegularKey({ ...tx, RegularKey: '' }, meta); + + const expectedDescription = `${Localize.t('events.thisIsAnSetRegularKeyTransaction')}\n${Localize.t( + 'events.itRemovesTheAccountRegularKey', + )}`; + + expect(SetRegularKeyInfo.getLabel(instance)).toEqual(Localize.t('events.removeRegularKey')); + expect(SetRegularKeyInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/signerListSet.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/signerListSet.test.ts new file mode 100644 index 000000000..ca8b4a318 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/signerListSet.test.ts @@ -0,0 +1,57 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { SignerListSet, SignerListSetInfo } from '../SignerListSet'; +import signerListSetTemplates from './fixtures/SignerListSetTx.json'; + +jest.mock('@services/NetworkService'); + +describe('SignerListSet tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new SignerListSet(); + expect(instance.TransactionType).toBe('SignerListSet'); + expect(instance.Type).toBe('SignerListSet'); + }); + + it('Should return right parsed values', () => { + const { tx, meta } = signerListSetTemplates; + const instance = new SignerListSet(tx, meta); + + expect(instance.SignerQuorum).toBe(3); + + expect(instance.SignerEntries).toStrictEqual([ + { + account: 'rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW', + walletLocator: '03075F65D8353E3A5DA3193FF976BC17A2D0B9376BE7DA942349B6526E5A2BBF54', + weight: 2, + }, + { account: 'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v', walletLocator: undefined, weight: 1 }, + { account: 'raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n', walletLocator: undefined, weight: 1 }, + ]); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = signerListSetTemplates; + const instance = new SignerListSet(tx, meta); + + const expectedDescription = `This is an ${instance.Type} transaction`; + + expect(SignerListSetInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(SignerListSetInfo.getLabel()).toEqual(Localize.t('events.setSignerList')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/ticketCreate.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/ticketCreate.test.ts new file mode 100644 index 000000000..f1416febf --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/ticketCreate.test.ts @@ -0,0 +1,44 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { TicketCreate, TicketCreateInfo } from '../TicketCreate'; +import ticketCreateTemplate from './fixtures/TicketCreateTx.json'; + +jest.mock('@services/NetworkService'); + +describe('TicketCreate tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new TicketCreate(); + expect(instance.TransactionType).toBe('TicketCreate'); + expect(instance.Type).toBe('TicketCreate'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = ticketCreateTemplate; + const instance = new TicketCreate(tx, meta); + + const expectedDescription = `${Localize.t('events.itCreatesTicketForThisAccount', { + ticketCount: instance.TicketCount, + })}\n\n${Localize.t('events.createdTicketsSequence', { + ticketsSequence: instance.TicketsSequence.join(', '), + })}`; + + expect(TicketCreateInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(TicketCreateInfo.getLabel()).toEqual(Localize.t('events.createTicket')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/trustSet.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/trustSet.test.ts new file mode 100644 index 000000000..f19554e7e --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/trustSet.test.ts @@ -0,0 +1,82 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { TrustSet, TrustSetInfo } from '../TrustSet'; +import trustSetTemplate from './fixtures/TrustSetTx.json'; +import { NormalizeCurrencyCode } from '../../../../../utils/amount'; + +jest.mock('@services/NetworkService'); + +describe('TrustSet tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new TrustSet(); + expect(instance.TransactionType).toBe('TrustSet'); + expect(instance.Type).toBe('TrustSet'); + }); + + it('Should return right parsed values', () => { + // @ts-ignore + const { tx, meta } = trustSetTemplate; + const instance = new TrustSet(tx, meta); + + expect(instance.Currency).toBe('USD'); + expect(instance.Issuer).toBe('rrrrrrrrrrrrrrrrrrrrbzbvji'); + expect(instance.Limit).toBe(100); + expect(instance.QualityIn).toBe(1); + expect(instance.QualityOut).toBe(1); + }); + + it('Should set/get fields', () => { + const instance = new TrustSet(); + + instance.Currency = 'USD'; + expect(instance.Currency).toBe('USD'); + + instance.Issuer = 'rrrrrrrrrrrrrrrrrrrrbzbvji'; + expect(instance.Issuer).toBe('rrrrrrrrrrrrrrrrrrrrbzbvji'); + + instance.Limit = 100; + expect(instance.Limit).toBe(100); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = trustSetTemplate; + const instance = new TrustSet(tx, meta); + + // TODO: add more tests for different situations + + const expectedDescription = `${Localize.t('events.itEstablishesTrustLineTo', { + limit: instance.Limit, + currency: NormalizeCurrencyCode(instance.Currency), + issuer: instance.Issuer, + address: instance.Account.address, + })}`; + + // @ts-ignore + expect(TrustSetInfo.getDescription(instance, { address: tx.Account })).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + const { tx, meta } = trustSetTemplate; + const instance = new TrustSet(tx, meta); + + // TODO: add more tests for different situations + + // @ts-ignore + expect(TrustSetInfo.getLabel(instance, { address: tx.Account })).toEqual( + Localize.t('events.updatedATrustLine'), + ); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenBurn.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenBurn.test.ts new file mode 100644 index 000000000..d0980870d --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenBurn.test.ts @@ -0,0 +1,43 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { URITokenBurn, URITokenBurnInfo } from '../URITokenBurn'; + +import uriTokenBurnTemplate from './fixtures/URITokenBurnTx.json'; + +jest.mock('@services/NetworkService'); + +describe('URITokenBurn tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new URITokenBurn(); + expect(instance.TransactionType).toBe('URITokenBurn'); + expect(instance.Type).toBe('URITokenBurn'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = uriTokenBurnTemplate; + const instance = new URITokenBurn(tx, meta); + + const expectedDescription = `${Localize.t('events.uriTokenBurnExplain', { + tokenID: instance.URITokenID, + })}`; + + expect(URITokenBurnInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(URITokenBurnInfo.getLabel()).toEqual(Localize.t('events.burnURIToken')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenBuy.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenBuy.test.ts new file mode 100644 index 000000000..ff647c80e --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenBuy.test.ts @@ -0,0 +1,46 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import { URITokenBuy, URITokenBuyInfo } from '../URITokenBuy'; + +import uriTokenBuy from './fixtures/URITokenBuyTx.json'; + +import Localize from '@locale'; + +jest.mock('@services/NetworkService'); + +describe('URITokenBuy tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new URITokenBuy(); + expect(instance.TransactionType).toBe('URITokenBuy'); + expect(instance.Type).toBe('URITokenBuy'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = uriTokenBuy; + const instance = new URITokenBuy(tx, meta); + + const expectedDescription = `${Localize.t('events.uriTokenBuyExplain', { + address: instance.Account.address, + amount: instance.Amount.value, + currency: instance.Amount.currency, + tokenID: instance.URITokenID, + })}`; + + expect(URITokenBuyInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(URITokenBuyInfo.getLabel()).toEqual(Localize.t('events.buyURIToken')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenCancelSellOffer.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenCancelSellOffer.test.ts new file mode 100644 index 000000000..7e910036e --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenCancelSellOffer.test.ts @@ -0,0 +1,44 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { URITokenCancelSellOffer, URITokenCancelSellOfferInfo } from '../URITokenCancelSellOffer'; + +import uriTokenCancelSellOfferTemplate from './fixtures/URITokenCancelSellOfferTx.json'; + +jest.mock('@services/NetworkService'); + +describe('URITokenCancelSellOffer tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new URITokenCancelSellOffer(); + expect(instance.TransactionType).toBe('URITokenCancelSellOffer'); + expect(instance.Type).toBe('URITokenCancelSellOffer'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = uriTokenCancelSellOfferTemplate; + const instance = new URITokenCancelSellOffer(tx, meta); + + const expectedDescription = `${Localize.t('events.theTransactionWillCancelURITokenOffer', { + address: tx.Account, + tokenId: tx.URITokenID, + })}`; + + expect(URITokenCancelSellOfferInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(URITokenCancelSellOfferInfo.getLabel()).toEqual(Localize.t('events.cancelURITokenSellOffer')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenCreateSellOffer.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenCreateSellOffer.test.ts new file mode 100644 index 000000000..93fae1b2d --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenCreateSellOffer.test.ts @@ -0,0 +1,48 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { URITokenCreateSellOffer, URITokenCreateSellOfferInfo } from '../URITokenCreateSellOffer'; + +import uriTokenCreateSellOfferTemplate from './fixtures/URITokenCreateSellOfferTx.json'; + +jest.mock('@services/NetworkService'); + +describe('URITokenCreateSellOffer tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new URITokenCreateSellOffer(); + expect(instance.TransactionType).toBe('URITokenCreateSellOffer'); + expect(instance.Type).toBe('URITokenCreateSellOffer'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = uriTokenCreateSellOfferTemplate; + const instance = new URITokenCreateSellOffer(tx, meta); + + const expectedDescription = `${Localize.t('events.uriTokenSellOfferExplain', { + address: instance.Account.address, + uriToken: instance.URITokenID, + value: instance.Amount.value, + currency: instance.Amount.currency, + })}\n${Localize.t('events.thisURITokenOfferMayOnlyBeAcceptedBy', { + address: tx.Destination, + })}`; + + expect(URITokenCreateSellOfferInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(URITokenCreateSellOfferInfo.getLabel()).toEqual(Localize.t('events.createURITokenSellOffer')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenMint.test.ts b/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenMint.test.ts new file mode 100644 index 000000000..b01500be6 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/__tests__/uriTokenMint.test.ts @@ -0,0 +1,46 @@ +/* eslint-disable spellcheck/spell-checker */ +/* eslint-disable max-len */ + +import Localize from '@locale'; + +import { URITokenMint, URITokenMintInfo } from '../URITokenMint'; + +import uriTokenMintTemplate from './fixtures/URITokenMintTx.json'; + +jest.mock('@services/NetworkService'); + +describe('URITokenMint tx', () => { + describe('Class', () => { + it('Should set tx type if not set', () => { + const instance = new URITokenMint(); + expect(instance.TransactionType).toBe('URITokenMint'); + expect(instance.Type).toBe('URITokenMint'); + }); + }); + + describe('Info', () => { + describe('getDescription()', () => { + it('should return the expected description', () => { + const { tx, meta } = uriTokenMintTemplate; + const instance = new URITokenMint(tx, meta); + + const expectedDescription = `${Localize.t('events.theURIForThisTokenIs', { + uri: instance.URI, + })}\n${Localize.t('events.theTokenHasADigest', { digest: instance.Digest })}\n${Localize.t( + 'events.uriTokenMintAmount', + { value: instance.Amount.value, currency: instance.Amount.currency }, + )}\n${Localize.t('events.uriTokenDestinationExplain', { address: instance.Destination.address })}`; + + expect(URITokenMintInfo.getDescription(instance)).toEqual(expectedDescription); + }); + }); + + describe('getLabel()', () => { + it('should return the expected label', () => { + expect(URITokenMintInfo.getLabel()).toEqual(Localize.t('events.mintURIToken')); + }); + }); + }); + + describe('Validation', () => {}); +}); diff --git a/src/common/libs/ledger/transactions/genuine/index.ts b/src/common/libs/ledger/transactions/genuine/index.ts new file mode 100644 index 000000000..3f5eb1ac1 --- /dev/null +++ b/src/common/libs/ledger/transactions/genuine/index.ts @@ -0,0 +1,36 @@ +export { default as BaseTransaction } from './BaseTransaction'; +export * from './Payment'; +export * from './TrustSet'; +export * from './AccountSet'; +export * from './AccountDelete'; +export * from './OfferCreate'; +export * from './OfferCancel'; +export * from './EscrowCreate'; +export * from './EscrowCancel'; +export * from './EscrowFinish'; +export * from './SetRegularKey'; +export * from './SignerListSet'; +export * from './DepositPreauth'; +export * from './CheckCreate'; +export * from './CheckCash'; +export * from './CheckCancel'; +export * from './TicketCreate'; +export * from './PaymentChannelCreate'; +export * from './PaymentChannelClaim'; +export * from './PaymentChannelFund'; +export * from './NFTokenMint'; +export * from './NFTokenBurn'; +export * from './NFTokenCreateOffer'; +export * from './NFTokenAcceptOffer'; +export * from './NFTokenCancelOffer'; +export * from './SetHook'; +export * from './ClaimReward'; +export * from './Invoke'; +export * from './Import'; +export * from './URITokenMint'; +export * from './URITokenBurn'; +export * from './URITokenBuy'; +export * from './URITokenCreateSellOffer'; +export * from './URITokenCancelSellOffer'; +export * from './GenesisMint'; +export * from './EnableAmendment'; diff --git a/src/common/libs/ledger/transactions/index.ts b/src/common/libs/ledger/transactions/index.ts index 58f738952..9d8550861 100644 --- a/src/common/libs/ledger/transactions/index.ts +++ b/src/common/libs/ledger/transactions/index.ts @@ -1,53 +1,2 @@ -import BaseTransaction from './base'; -import Payment from './payment'; -import TrustSet from './trustSet'; -import AccountSet from './accountSet'; -import AccountDelete from './accountDelete'; -import OfferCreate from './offerCreate'; -import OfferCancel from './offerCancel'; -import EscrowCreate from './escrowCreate'; -import EscrowCancel from './escrowCancel'; -import EscrowFinish from './escrowFinish'; -import SetRegularKey from './setRegularKey'; -import SignerListSet from './signerListSet'; -import DepositPreauth from './depositPreauth'; -import CheckCreate from './checkCreate'; -import CheckCash from './checkCash'; -import CheckCancel from './checkCancel'; -import TicketCreate from './ticketCreate'; -import PaymentChannelCreate from './paymentChannelCreate'; -import PaymentChannelClaim from './paymentChannelClaim'; -import PaymentChannelFund from './paymentChannelFund'; -import NFTokenMint from './nfTokenMint'; -import NFTokenBurn from './nfTokenBurn'; -import NFTokenCreateOffer from './nfTokenCreateOffer'; -import NFTokenAcceptOffer from './nfTokenAcceptOffer'; -import NFTokenCancelOffer from './nfTokenCancelOffer'; - -export { - BaseTransaction, - Payment, - TrustSet, - AccountDelete, - AccountSet, - OfferCreate, - OfferCancel, - EscrowCreate, - EscrowCancel, - EscrowFinish, - SetRegularKey, - SignerListSet, - DepositPreauth, - CheckCreate, - CheckCash, - CheckCancel, - TicketCreate, - PaymentChannelCreate, - PaymentChannelClaim, - PaymentChannelFund, - NFTokenMint, - NFTokenBurn, - NFTokenCreateOffer, - NFTokenAcceptOffer, - NFTokenCancelOffer, -}; +export * from './genuine'; +export * from './pseudo'; diff --git a/src/common/libs/ledger/transactions/payment.ts b/src/common/libs/ledger/transactions/payment.ts deleted file mode 100644 index 7d173388c..000000000 --- a/src/common/libs/ledger/transactions/payment.ts +++ /dev/null @@ -1,407 +0,0 @@ -import { get, set, has, isUndefined, isNumber, toInteger } from 'lodash'; -import * as AccountLib from 'xrpl-accountlib'; - -import LedgerService from '@services/LedgerService'; - -import { ErrorMessages } from '@common/constants'; -import { NormalizeCurrencyCode, NormalizeAmount } from '@common/utils/amount'; - -import Localize from '@locale'; - -import BaseTransaction from './base'; - -import Amount from '../parser/common/amount'; - -/* Types ==================================================================== */ -import { LedgerAmount, Destination, AmountType } from '../parser/types'; -import { TransactionJSONType, TransactionTypes } from '../types'; - -/* Class ==================================================================== */ -class Payment extends BaseTransaction { - public static Type = TransactionTypes.Payment as const; - public readonly Type = Payment.Type; - - constructor(tx?: TransactionJSONType, meta?: any) { - super(tx, meta); - - // set transaction type if not set - if (isUndefined(this.TransactionType)) { - this.TransactionType = Payment.Type; - } - - this.fields = this.fields.concat([ - 'Destination', - 'DestinationTag', - 'InvoiceID', - 'Paths', - 'Amount', - 'SendMax', - 'DeliverMin', - ]); - } - - get Destination(): Destination { - const destination = get(this, ['tx', 'Destination'], undefined); - const destinationTag = get(this, ['tx', 'DestinationTag'], undefined); - - if (isUndefined(destination)) return undefined; - - return { - address: destination, - tag: destinationTag, - }; - } - - set Destination(destination: Destination) { - if (has(destination, 'address')) { - if (!AccountLib.utils.isValidAddress(destination.address)) { - throw new Error(`${destination.address} is not a valid XRP Address`); - } - set(this, 'tx.Destination', destination.address); - } - - if (has(destination, 'tag')) { - const tag = get(destination, 'tag', undefined); - if (tag !== undefined && tag !== null && tag !== '') { - // try to convert to number if not - if (!isNumber(tag)) { - set(this, 'tx.DestinationTag', toInteger(tag)); - } else { - set(this, 'tx.DestinationTag', tag); - } - } else { - set(this, 'tx.DestinationTag', undefined); - } - } - } - - get DeliveredAmount(): AmountType { - let deliveredAmount = undefined as AmountType; - - if (has(this, ['meta', 'DeliveredAmount'])) { - deliveredAmount = get(this, ['meta', 'DeliveredAmount']); - } else { - deliveredAmount = get(this, ['meta', 'delivered_amount']); - } - - // the delivered_amount will be unavailable in old transactions - // @ts-ignore - if (deliveredAmount === 'unavailable') { - deliveredAmount = undefined; - } - - if (isUndefined(deliveredAmount)) return undefined; - - if (typeof deliveredAmount === 'string') { - return { - currency: 'XRP', - value: new Amount(deliveredAmount).dropsToXrp(), - }; - } - - return { - currency: deliveredAmount.currency, - value: deliveredAmount.value, - issuer: deliveredAmount.issuer, - }; - } - - // @ts-ignore - get Amount(): AmountType { - let amount = undefined as AmountType; - - amount = get(this, ['tx', 'Amount']); - - if (isUndefined(amount)) return undefined; - - if (typeof amount === 'string') { - return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), - }; - } - - return { - currency: amount.currency, - value: amount.value, - issuer: amount.issuer, - }; - } - - // @ts-ignore - set Amount(input: LedgerAmount) { - // XRP - if (typeof input === 'string') { - set(this, 'tx.Amount', new Amount(input, false).xrpToDrops()); - } - - if (typeof input === 'object') { - set(this, 'tx.Amount', { - currency: input.currency, - value: input.value, - issuer: input.issuer, - }); - } - } - - // @ts-ignore - get SendMax(): AmountType { - const sendMax = get(this, ['tx', 'SendMax'], undefined); - - if (!sendMax) { - return undefined; - } - - if (typeof sendMax === 'string') { - return { - currency: 'XRP', - value: new Amount(sendMax).dropsToXrp(), - }; - } - - return { - currency: sendMax.currency, - value: sendMax.value, - issuer: sendMax.issuer, - }; - } - - set SendMax(input: LedgerAmount) { - if (typeof input === 'undefined') { - set(this, 'tx.SendMax', undefined); - return; - } - // XRP - if (typeof input === 'string') { - set(this, 'tx.SendMax', new Amount(input, false).xrpToDrops()); - } - - if (typeof input === 'object') { - set(this, 'tx.SendMax', { - currency: input.currency, - value: input.value, - issuer: input.issuer, - }); - } - } - - set DeliverMin(input: AmountType | undefined) { - if (typeof input === 'undefined') { - set(this, 'tx.DeliverMin', undefined); - return; - } - - // XRP - if (typeof input === 'string') { - set(this, 'tx.DeliverMin', new Amount(input, false).xrpToDrops()); - return; - } - - set(this, 'tx.DeliverMin', { - currency: input.currency, - value: input.value, - issuer: input.issuer, - }); - } - - get DeliverMin(): AmountType { - const deliverMin = get(this, ['tx', 'DeliverMin'], undefined); - - if (!deliverMin) { - return undefined; - } - - if (typeof deliverMin === 'string') { - return { - currency: 'XRP', - value: new Amount(deliverMin).dropsToXrp(), - }; - } - - return { - currency: deliverMin.currency, - value: deliverMin.value, - issuer: deliverMin.issuer, - }; - } - - get InvoiceID(): string { - return get(this, 'tx.InvoiceID', undefined); - } - - set InvoiceID(invoiceId: string) { - set(this, 'tx.InvoiceID', invoiceId); - } - - get Paths(): Array { - return get(this, 'tx.Paths', undefined); - } - - set Paths(path: Array) { - set(this, 'tx.Paths', path); - } - - validate = (): Promise => { - // eslint-disable-next-line no-async-promise-executor - return new Promise(async (resolve, reject) => { - try { - // ignore validation if transaction including Path - if (this.Paths) { - resolve(); - return; - } - - // check if amount is present - if (!this.Amount || !this.Amount?.value || this.Amount?.value === '0') { - reject(new Error(Localize.t('send.pleaseEnterAmount'))); - return; - } - - // ===== check if recipient have proper TrustLine when delivering IOU ===== - // Note: ignore if sending to the issuer - if (this.Amount.currency !== 'XRP' && this.Amount.issuer !== this.Destination.address) { - const destinationLine = await LedgerService.getFilteredAccountLine( - this.Destination.address, - this.Amount, - ); - - if ( - !destinationLine || - (Number(destinationLine.limit) === 0 && Number(destinationLine.balance) === 0) - ) { - reject(new Error(Localize.t('send.unableToSendPaymentRecipientDoesNotHaveTrustLine'))); - return; - } - } - - let XRPAmount = undefined as AmountType; - - // SendMax have higher priority - if (this.SendMax && this.SendMax.currency === 'XRP') { - XRPAmount = this.SendMax; - } else if (this.Amount.currency === 'XRP' && !this.SendMax) { - XRPAmount = this.Amount; - } - - if (XRPAmount) { - // ===== check balance ===== - try { - // fetch fresh account balance from ledger - const availableBalance = await LedgerService.getAccountAvailableBalance(this.Account.address); - - if (Number(XRPAmount.value) > Number(availableBalance)) { - reject( - new Error( - Localize.t('send.insufficientBalanceSpendableBalance', { - spendable: Localize.formatNumber(availableBalance), - currency: 'XRP', - }), - ), - ); - return; - } - } catch (e) { - reject(Localize.t('account.unableGetAccountInfo')); - return; - } - } - - let IOUAmount = undefined as AmountType; - - // SendMax have higher priority - if (this.SendMax && this.SendMax.currency !== 'XRP') { - IOUAmount = this.SendMax; - } else if (this.Amount.currency !== 'XRP' && !this.SendMax) { - IOUAmount = this.Amount; - } - - if (IOUAmount) { - // ===== check balances ===== - // sender is not issuer - if (IOUAmount.issuer !== this.Account.address) { - // check IOU balance - const sourceLine = await LedgerService.getFilteredAccountLine(this.Account.address, IOUAmount); - - // TODO: show proper error message - if (!sourceLine) { - resolve(); - return; - } - - // check if asset is frozen by issuer - if (sourceLine.freeze_peer) { - reject( - new Error( - Localize.t('send.trustLineIsFrozenByIssuer', { - currency: NormalizeCurrencyCode(sourceLine.currency), - }), - ), - ); - return; - } - - if (Number(IOUAmount.value) > Number(sourceLine.balance)) { - reject( - new Error( - Localize.t('send.insufficientBalanceSpendableBalance', { - spendable: Localize.formatNumber(NormalizeAmount(sourceLine.balance)), - currency: NormalizeCurrencyCode(sourceLine.currency), - }), - ), - ); - return; - } - } else { - // sender is the issuer - // check for exceed the TrustLine Limit on obligations - const sourceLine = await LedgerService.getFilteredAccountLine(this.Account.address, { - issuer: this.Destination.address, - currency: IOUAmount.currency, - }); - - // TODO: show proper error message - if (!sourceLine) { - resolve(); - return; - } - - if ( - Number(IOUAmount.value) + Math.abs(Number(sourceLine.balance)) > - Number(sourceLine.limit_peer) - ) { - reject( - new Error( - Localize.t('send.trustLineLimitExceeded', { - balance: Localize.formatNumber( - NormalizeAmount(Math.abs(Number(sourceLine.balance))), - ), - peer_limit: Localize.formatNumber( - NormalizeAmount(Number(sourceLine.limit_peer)), - ), - available: Localize.formatNumber( - NormalizeAmount( - Number( - Number(sourceLine.limit_peer) - - Math.abs(Number(sourceLine.balance)), - ), - ), - ), - }), - ), - ); - return; - } - } - } - - resolve(); - } catch (e) { - console.warn(e); - reject(new Error(ErrorMessages.unexpectedValidationError)); - } - }); - }; -} - -/* Export ==================================================================== */ -export default Payment; diff --git a/src/common/libs/ledger/transactions/pseudo/base.ts b/src/common/libs/ledger/transactions/pseudo/BasePseudo.ts similarity index 93% rename from src/common/libs/ledger/transactions/pseudo/base.ts rename to src/common/libs/ledger/transactions/pseudo/BasePseudo.ts index 7276f88ae..5315a2224 100644 --- a/src/common/libs/ledger/transactions/pseudo/base.ts +++ b/src/common/libs/ledger/transactions/pseudo/BasePseudo.ts @@ -4,16 +4,16 @@ import { flatMap, get, has, isUndefined, set } from 'lodash'; -import { AccountSchema } from '@store/schemas/latest'; +import { AccountModel } from '@store/models'; import { AppScreens } from '@common/constants'; import { Navigator } from '@common/helpers/navigator'; import { PseudoTransactionTypes, SignedObjectType, TransactionJSONType } from '@common/libs/ledger/types'; -import Memo from '../../parser/common/memo'; +import Memo from '@common/libs/ledger/parser/common/memo'; /* Types ==================================================================== */ -import { Account, MemoType } from '../../parser/types'; +import { Account, MemoType } from '@common/libs/ledger/parser/types'; /* Class ==================================================================== */ class BasePseudoTransaction { @@ -47,12 +47,12 @@ class BasePseudoTransaction { } /** - Sign the transaction with provided account - * @param {AccountSchema} account object sign with - * @param {bool} multiSign indicates if transaction should sign for multi signing - * @returns {Promise} signed tx blob - */ - sign = (account: AccountSchema, multiSign = false): Promise => { + Sign the transaction with provided account + * @param {AccountModel} account object sign with + * @param {boolean} multiSign indicates if transaction should sign for multi signing + * @returns {Promise} signed tx blob + */ + sign = (account: AccountModel, multiSign: boolean = false): Promise => { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { try { diff --git a/src/common/libs/ledger/transactions/pseudo/paymentChannelAuthorize.ts b/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/PaymentChannelAuthorizeClass.ts similarity index 63% rename from src/common/libs/ledger/transactions/pseudo/paymentChannelAuthorize.ts rename to src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/PaymentChannelAuthorizeClass.ts index b4b7a1fa6..fb1e7fbbe 100644 --- a/src/common/libs/ledger/transactions/pseudo/paymentChannelAuthorize.ts +++ b/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/PaymentChannelAuthorizeClass.ts @@ -1,12 +1,14 @@ import { get, isUndefined } from 'lodash'; -import Amount from '../../parser/common/amount'; +import NetworkService from '@services/NetworkService'; -import BasePseudoTransaction from './base'; +import Amount from '@common/libs/ledger/parser/common/amount'; + +import BasePseudoTransaction from '@common/libs/ledger/transactions/pseudo/BasePseudo'; /* Types ==================================================================== */ -import { AmountType } from '../../parser/types'; -import { PseudoTransactionTypes, TransactionJSONType } from '../../types'; +import { AmountType } from '@common/libs/ledger/parser/types'; +import { PseudoTransactionTypes, TransactionJSONType } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class PaymentChannelAuthorize extends BasePseudoTransaction { @@ -37,9 +39,17 @@ class PaymentChannelAuthorize extends BasePseudoTransaction { if (isUndefined(amount)) return undefined; + if (typeof amount === 'string') { + return { + currency: NetworkService.getNativeAsset(), + value: new Amount(amount).dropsToNative(), + }; + } + return { - currency: 'XRP', - value: new Amount(amount).dropsToXrp(), + currency: amount.currency, + value: amount.value, + issuer: amount.issuer, }; } } diff --git a/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/PaymentChannelAuthorizeInfo.ts b/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/PaymentChannelAuthorizeInfo.ts new file mode 100644 index 000000000..c2f1edeb8 --- /dev/null +++ b/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/PaymentChannelAuthorizeInfo.ts @@ -0,0 +1,19 @@ +import Localize from '@locale'; + +/* Descriptor ==================================================================== */ +const PaymentChannelAuthorizeInfo = { + getLabel: (): string => { + return Localize.t('global.paymentChannelAuthorize'); + }, + + getDescription: (): string => { + throw new Error('PaymentChannelAuthorize Pseudo transaction do not contain description!'); + }, + + getRecipient: () => { + throw new Error('SignIn Pseudo transactions do not contain recipient!'); + }, +}; + +/* Export ==================================================================== */ +export default PaymentChannelAuthorizeInfo; diff --git a/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/PaymentChannelAuthorizeValidation.ts b/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/PaymentChannelAuthorizeValidation.ts new file mode 100644 index 000000000..0c445aefd --- /dev/null +++ b/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/PaymentChannelAuthorizeValidation.ts @@ -0,0 +1,12 @@ +// import PaymentChannelAuthorize from './PaymentChannelAuthorizeClass'; + +/* Validator ==================================================================== */ +const PaymentChannelAuthorizeValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default PaymentChannelAuthorizeValidation; diff --git a/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/index.ts b/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/index.ts new file mode 100644 index 000000000..9eb968fdd --- /dev/null +++ b/src/common/libs/ledger/transactions/pseudo/PaymentChannelAuthorize/index.ts @@ -0,0 +1,3 @@ +export { default as PaymentChannelAuthorize } from './PaymentChannelAuthorizeClass'; +export { default as PaymentChannelAuthorizeValidation } from './PaymentChannelAuthorizeValidation'; +export { default as PaymentChannelAuthorizeInfo } from './PaymentChannelAuthorizeInfo'; diff --git a/src/common/libs/ledger/transactions/pseudo/signIn.ts b/src/common/libs/ledger/transactions/pseudo/SignIn/SignInClass.ts similarity index 80% rename from src/common/libs/ledger/transactions/pseudo/signIn.ts rename to src/common/libs/ledger/transactions/pseudo/SignIn/SignInClass.ts index bc3fdbe17..46eed0bb9 100644 --- a/src/common/libs/ledger/transactions/pseudo/signIn.ts +++ b/src/common/libs/ledger/transactions/pseudo/SignIn/SignInClass.ts @@ -1,9 +1,9 @@ import { isUndefined } from 'lodash'; -import BasePseudoTransaction from './base'; +import BasePseudoTransaction from '@common/libs/ledger/transactions/pseudo/BasePseudo'; /* Types ==================================================================== */ -import { PseudoTransactionTypes, TransactionJSONType } from '../../types'; +import { PseudoTransactionTypes, TransactionJSONType } from '@common/libs/ledger/types'; /* Class ==================================================================== */ class SignIn extends BasePseudoTransaction { diff --git a/src/common/libs/ledger/transactions/pseudo/SignIn/SignInInfo.ts b/src/common/libs/ledger/transactions/pseudo/SignIn/SignInInfo.ts new file mode 100644 index 000000000..c47a4670e --- /dev/null +++ b/src/common/libs/ledger/transactions/pseudo/SignIn/SignInInfo.ts @@ -0,0 +1,19 @@ +import Localize from '@locale'; + +/* Descriptor ==================================================================== */ +const SignInInfo = { + getLabel: (): string => { + return Localize.t('global.signIn'); + }, + + getDescription: (): string => { + throw new Error('SignIn Pseudo transactions do not contain description!'); + }, + + getRecipient: () => { + throw new Error('SignIn Pseudo transactions do not contain recipient!'); + }, +}; + +/* Export ==================================================================== */ +export default SignInInfo; diff --git a/src/common/libs/ledger/transactions/pseudo/SignIn/SignInValidation.ts b/src/common/libs/ledger/transactions/pseudo/SignIn/SignInValidation.ts new file mode 100644 index 000000000..619448fe7 --- /dev/null +++ b/src/common/libs/ledger/transactions/pseudo/SignIn/SignInValidation.ts @@ -0,0 +1,12 @@ +// import SignIn from './SignInClass'; + +/* Validator ==================================================================== */ +const SignInValidation = (): Promise => { + // TODO: add validation + return new Promise((resolve) => { + resolve(); + }); +}; + +/* Export ==================================================================== */ +export default SignInValidation; diff --git a/src/common/libs/ledger/transactions/pseudo/SignIn/index.ts b/src/common/libs/ledger/transactions/pseudo/SignIn/index.ts new file mode 100644 index 000000000..251de8a00 --- /dev/null +++ b/src/common/libs/ledger/transactions/pseudo/SignIn/index.ts @@ -0,0 +1,3 @@ +export { default as SignIn } from './SignInClass'; +export { default as SignInValidation } from './SignInValidation'; +export { default as SignInInfo } from './SignInInfo'; diff --git a/src/common/libs/ledger/transactions/pseudo/index.ts b/src/common/libs/ledger/transactions/pseudo/index.ts index 993503886..53f606034 100644 --- a/src/common/libs/ledger/transactions/pseudo/index.ts +++ b/src/common/libs/ledger/transactions/pseudo/index.ts @@ -1,6 +1,3 @@ -import BasePseudoTransaction from './base'; - -import SignIn from './signIn'; -import PaymentChannelAuthorize from './paymentChannelAuthorize'; - -export { BasePseudoTransaction, SignIn, PaymentChannelAuthorize }; +export { default as BasePseudoTransaction } from './BasePseudo'; +export * from './PaymentChannelAuthorize'; +export * from './SignIn'; diff --git a/src/common/libs/ledger/transactions/types.ts b/src/common/libs/ledger/transactions/types.ts index 2eb0685d6..bfd4074b1 100644 --- a/src/common/libs/ledger/transactions/types.ts +++ b/src/common/libs/ledger/transactions/types.ts @@ -23,12 +23,23 @@ import { NFTokenCancelOffer, NFTokenCreateOffer, NFTokenMint, + SetHook, + ClaimReward, + Invoke, + Import, + URITokenMint, + URITokenBurn, + URITokenBuy, + URITokenCreateSellOffer, + URITokenCancelSellOffer, + GenesisMint, + EnableAmendment, } from '.'; import { SignIn, PaymentChannelAuthorize } from './pseudo'; /** - * All Transactions types + * Genuine Transactions types */ export type Transactions = | Payment @@ -54,7 +65,18 @@ export type Transactions = | NFTokenBurn | NFTokenCreateOffer | NFTokenAcceptOffer - | NFTokenCancelOffer; + | NFTokenCancelOffer + | SetHook + | ClaimReward + | Invoke + | Import + | URITokenMint + | URITokenBurn + | URITokenBuy + | URITokenCreateSellOffer + | URITokenCancelSellOffer + | GenesisMint + | EnableAmendment; /** * Pseudo Transactions types diff --git a/src/common/libs/ledger/types.ts b/src/common/libs/ledger/types.ts index 0a9c5a2c9..b63e0f545 100644 --- a/src/common/libs/ledger/types.ts +++ b/src/common/libs/ledger/types.ts @@ -1,8 +1,5 @@ import { AmountType, LedgerAmount } from './parser/types'; -export enum TransactionBaseTypes { - Transaction = 'Transaction', -} export enum TransactionTypes { Payment = 'Payment', TrustSet = 'TrustSet', @@ -28,6 +25,17 @@ export enum TransactionTypes { NFTokenCreateOffer = 'NFTokenCreateOffer', NFTokenAcceptOffer = 'NFTokenAcceptOffer', NFTokenCancelOffer = 'NFTokenCancelOffer', + SetHook = 'SetHook', + ClaimReward = 'ClaimReward', + Invoke = 'Invoke', + Import = 'Import', + URITokenMint = 'URITokenMint', + URITokenBurn = 'URITokenBurn', + URITokenBuy = 'URITokenBuy', + URITokenCreateSellOffer = 'URITokenCreateSellOffer', + URITokenCancelSellOffer = 'URITokenCancelSellOffer', + GenesisMint = 'GenesisMint', + EnableAmendment = 'EnableAmendment', } export enum PseudoTransactionTypes { @@ -41,7 +49,6 @@ export enum LedgerObjectTypes { NFTokenOffer = 'NFTokenOffer', Offer = 'Offer', Ticket = 'Ticket', - PayChannel = 'PayChannel', } @@ -70,6 +77,7 @@ export interface LedgerTransactionType { status?: string; tx?: TransactionJSONType; meta?: any; + [key: string]: any; } @@ -94,8 +102,12 @@ export type SubmitResultType = { engineResult: string; message: string; hash?: string; - node: string; - nodeType: string; + network: { + id: number; + node: string; + type: string; + key: string; + }; }; /** @@ -106,16 +118,25 @@ export type VerifyResultType = { transaction?: any; }; +/** + * Ledger marker + */ export type LedgerMarker = { ledger: number; seq: number; }; +/** + * Ledger balance + */ export interface Balance { currency: string; value: string; } +/** + * Ledger account root + */ export interface AccountRoot { Account: string; Balance: string; @@ -134,18 +155,6 @@ export interface AccountRoot { TransferRate?: number; } -/** - * Ledger Account tx ledger response - */ -export type AccountTxResponse = { - account: string; - ledger_index_max: number; - ledger_index_min: number; - limit: number; - marker: LedgerMarker; - transactions: Array; -}; - /** * Ledger trustline type */ @@ -179,19 +188,38 @@ export interface LedgerNFToken { nft_serial: number; } +/** + * Extra info for network responses + */ +export interface BaseResponse { + networkId: number; +} + +/** + * Ledger Account tx ledger response + */ +export interface AccountTxResponse extends BaseResponse { + account: string; + ledger_index_max: number; + ledger_index_min: number; + limit: number; + marker: LedgerMarker; + transactions: Array; +} + /** * Ledger account_lines response */ -export type AccountLinesResponse = { +export interface AccountLinesResponse extends BaseResponse { account: string; lines: LedgerTrustline[]; ledger_current_index?: number; ledger_index?: number; ledger_hash?: string; marker?: string; -}; +} -export interface AccountNFTsResponse { +export interface AccountNFTsResponse extends BaseResponse { account: string; account_nfts: LedgerNFToken[]; ledger_hash?: string; @@ -202,7 +230,7 @@ export interface AccountNFTsResponse { /** * Ledger gateway_balances response */ -export interface GatewayBalancesResponse { +export interface GatewayBalancesResponse extends BaseResponse { account: string; obligations?: { [currency: string]: string }; balances?: { [address: string]: Balance[] }; @@ -215,8 +243,9 @@ export interface GatewayBalancesResponse { /** * Ledger account_info response */ -export interface AccountInfoResponse { +export interface AccountInfoResponse extends BaseResponse { account_data: AccountRoot; + account_flags?: { [key: string]: boolean }; signer_lists?: any; ledger_current_index?: number; ledger_index?: number; @@ -227,7 +256,7 @@ export interface AccountInfoResponse { /** * Ledger account_objects response */ -export interface AccountObjectsResponse { +export interface AccountObjectsResponse extends BaseResponse { account: string; account_objects: LedgerEntriesTypes[]; ledger_hash?: string; @@ -247,6 +276,7 @@ interface FeeResponseDrops { median_fee: string; open_ledger_fee: string; } + export interface FeeResponse { current_queue_size: string; max_queue_size: string; @@ -256,7 +286,7 @@ export interface FeeResponse { /** * Ledger ledger_entry command response */ -export interface LedgerEntryResponse { +export interface LedgerEntryResponse extends BaseResponse { index: string; ledger_current_index: number; node?: LedgerEntriesTypes; @@ -288,6 +318,9 @@ export interface OfferLedgerEntry { Expiration?: number; } +/** + * Escrow leger entry + */ export interface EscrowLedgerEntry { LedgerEntryType: 'Escrow'; Account: string; @@ -305,6 +338,9 @@ export interface EscrowLedgerEntry { PreviousTxnLgrSeq: number; } +/** + * Check leger entry + */ export interface CheckLedgerEntry { LedgerEntryType: 'Check'; Account: string; @@ -322,6 +358,9 @@ export interface CheckLedgerEntry { SourceTag: number; } +/** + * Ripple state leger entry + */ export interface RippleStateLedgerEntry { LedgerEntryType: 'RippleState'; Flags: number; @@ -338,6 +377,9 @@ export interface RippleStateLedgerEntry { HighQualityOut?: number; } +/** + * NFTokenOffer leger entry + */ export interface NFTokenOfferLedgerEntry { LedgerEntryType: 'NFTokenOffer'; Owner: string; @@ -352,6 +394,9 @@ export interface NFTokenOfferLedgerEntry { PreviousTxnLgrSeq: number; } +/** + * Path finding + */ interface PathStep { account?: string; currency?: string; @@ -366,7 +411,7 @@ export interface PathOption { source_amount: LedgerAmount; } -export interface RipplePathFindResponse { +export interface RipplePathFindResponse extends BaseResponse { id?: any; error?: string; result: { @@ -381,3 +426,14 @@ export interface RipplePathFindResponse { validated: boolean; }; } + +/** + * GenesisMints type + */ +export interface GenesisMintsType + extends Array<{ + GenesisMint: { + Amount: string; + Destination: string; + }; + }> {} diff --git a/src/common/libs/payload/__tests__/digest.test.ts b/src/common/libs/payload/__tests__/digest.test.ts new file mode 100644 index 000000000..e7c306c0f --- /dev/null +++ b/src/common/libs/payload/__tests__/digest.test.ts @@ -0,0 +1,132 @@ +/* eslint-disable max-len */ +// eslint-disable spellcheck/spell-checker + +import { DigestSerializeWithSHA1 } from '../digest'; + +describe('DigestSerializeWithSHA1', () => { + describe('Serialize', () => { + it('should serialize an empty object', () => { + const input = {}; + const expectedOutput = '{[]}'; + expect(DigestSerializeWithSHA1.serialize(input)).toEqual(expectedOutput); + }); + + it('should serialize an object with string and number properties', () => { + const input = { + TransactionType: 'Payment', + Sequence: 30, + }; + const expectedOutput = '{["Sequence","TransactionType"]30,"Payment",}'; + expect(DigestSerializeWithSHA1.serialize(input)).toEqual(expectedOutput); + }); + + it('should serialize an array of strings', () => { + const input = { + TransactionType: 'Payment', + Memos: [ + { + Memo: { + MemoData: '5852502054697020426F74', + MemoType: '587270546970426F744E6F7465', + }, + }, + ], + }; + const expectedOutput = + '{["Memos","TransactionType"][{["Memo"]{["MemoData","MemoType"]"5852502054697020426F74","587270546970426F744E6F7465",},}],"Payment",}'; + expect(DigestSerializeWithSHA1.serialize(input)).toEqual(expectedOutput); + }); + + it('should serialize nested objects', () => { + const input = { + TransactionType: 'Payment', + Amount: { + currency: 'USD', + value: '1', + issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + }, + }; + const expectedOutput = + '{["Amount","TransactionType"]{["currency","issuer","value"]"USD","rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn","1",},"Payment",}'; + expect(DigestSerializeWithSHA1.serialize(input)).toEqual(expectedOutput); + }); + + it('should serialize object with different key orders', () => { + const input = { + TransactionType: 'Payment', + Amount: { + currency: 'USD', + value: '1', + issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + }, + Memos: [ + { + Memo: { + MemoData: '5852502054697020426F74', + MemoType: '587270546970426F744E6F7465', + }, + }, + ], + }; + const input2 = { + Amount: { + currency: 'USD', + issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + value: '1', + }, + Memos: [ + { + Memo: { + MemoType: '587270546970426F744E6F7465', + MemoData: '5852502054697020426F74', + }, + }, + ], + TransactionType: 'Payment', + }; + + const expectedOutput = + '{["Amount","Memos","TransactionType"]{["currency","issuer","value"]"USD","rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn","1",},[{["Memo"]{["MemoData","MemoType"]"5852502054697020426F74","587270546970426F744E6F7465",},}],"Payment",}'; + + expect(DigestSerializeWithSHA1.serialize(input)).toEqual(expectedOutput); + expect(DigestSerializeWithSHA1.serialize(input2)).toEqual(expectedOutput); + }); + + it('should throw an error for unsupported data type', () => { + const input = null as any; + expect(() => DigestSerializeWithSHA1.serialize(input)).toThrow('Invalid object type object'); + }); + + it('should throw an error for illegal data types', () => { + const input = { + TransactionType: 'Payment', + Amount: () => {}, + }; + expect(() => DigestSerializeWithSHA1.serialize(input)).toThrow('Invalid object type function'); + }); + }); + + describe('Digest', () => { + it('should calculate digest correctly for valid input', async () => { + const input = { + TransactionType: 'Payment', + Amount: { + currency: 'USD', + value: '1', + issuer: 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn', + }, + }; + + const result = await DigestSerializeWithSHA1.digest(input); + // Ensure that the result is the expected digest + expect(result).toEqual('6c4873827bb120755dda381b8e55b79f7ffa75a4'); + }); + + it('should reject with an error for invalid input', async () => { + const invalidInput = null as any; + await expect(DigestSerializeWithSHA1.digest(invalidInput)).rejects.toThrowError( + 'digest `request_json` should be valid object!', + ); + }); + }); +}); diff --git a/src/common/libs/payload/__tests__/object.test.ts b/src/common/libs/payload/__tests__/object.test.ts index a08405857..c4074f3d3 100644 --- a/src/common/libs/payload/__tests__/object.test.ts +++ b/src/common/libs/payload/__tests__/object.test.ts @@ -9,8 +9,6 @@ import { PayloadOrigin } from '../types'; import PayloadTemplate from './templates/payload.json'; -// "e24cfcfd-c737-4de7-9f18-b809aa6b571d" - describe('Payload', () => { it('Should be able to generate payload and return right values', () => { const transaction = { @@ -27,11 +25,12 @@ describe('Payload', () => { expect(craftedPayload.getApplicationIcon()).toBe( 'https://xumm-cdn.imgix.net/app-logo/91348bab-73d2-489a-bb7b-a8dba83e40ff.png', ); - expect(craftedPayload.getApplicationName()).toBe('XUMM'); + expect(craftedPayload.getApplicationName()).toBe('Xaman'); expect(craftedPayload.getTransaction().Json).toEqual(transaction); expect(craftedPayload.getSigners()).toEqual(['rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY']); const payloadPatchSpy = jest.spyOn(ApiService.payload, 'patch'); + // @ts-ignore craftedPayload.patch({ signed_blob: '', tx_id: '', multisigned: '' }); expect(payloadPatchSpy).toBeCalledTimes(0); payloadPatchSpy.mockClear(); @@ -71,7 +70,7 @@ describe('Payload', () => { try { await Payload.from(invalidTypesPayload.meta.uuid); } catch (e) { - expect(e.toString()).toEqual('Error: [missing "en.payload.UnableVerifyPayload" translation]'); + expect(e.toString()).toEqual('Error: Unable to verify the payload signature'); } payloadFetchSpy.mockClear(); @@ -87,7 +86,7 @@ describe('Payload', () => { try { await Payload.from(invalidSignInPayload.meta.uuid); } catch (e) { - expect(e.toString()).toEqual('Error: [missing "en.payload.UnableVerifyPayload" translation]'); + expect(e.toString()).toEqual('Error: Unable to verify the payload signature'); } payloadFetchSpy.mockClear(); @@ -103,7 +102,7 @@ describe('Payload', () => { try { await Payload.from(InvalidPayload.meta.uuid); } catch (e) { - expect(e.toString()).toEqual('Error: [missing "en.payload.UnableVerifyPayload" translation]'); + expect(e.toString()).toEqual('Error: Unable to verify the payload signature'); } payloadFetchSpy.mockClear(); @@ -171,7 +170,9 @@ describe('Payload', () => { try { await Payload.from(AccountSetPayload.meta.uuid); } catch (e) { - expect(e.toString()).toEqual('Error: [missing "en.payload.payloadAlreadyResolved" translation]'); + expect(e.toString()).toEqual( + 'Error: This payload has already been signed or rejected. Please repeat the process that generated the request, and scan the new request.', + ); } payloadFetchSpy.mockClear(); @@ -190,7 +191,9 @@ describe('Payload', () => { try { await Payload.from(AccountSetPayload.meta.uuid); } catch (e) { - expect(e.toString()).toEqual('Error: [missing "en.payload.payloadExpired" translation]'); + expect(e.toString()).toEqual( + 'Error: This payload has expired. Please repeat the process that generated the request, and scan the new request.', + ); } payloadFetchSpy2.mockClear(); @@ -225,7 +228,7 @@ describe('Payload', () => { try { payload.getTransaction(); } catch (e) { - expect(e.toString()).toEqual('Error: Requested transaction type is not supported in XUMM!'); + expect(e.toString()).toEqual('Error: Requested transaction type is not supported in Xaman!'); } }); diff --git a/src/common/libs/payload/__tests__/templates/payload.json b/src/common/libs/payload/__tests__/templates/payload.json index 0baad4670..0580c3be9 100644 --- a/src/common/libs/payload/__tests__/templates/payload.json +++ b/src/common/libs/payload/__tests__/templates/payload.json @@ -1,149 +1,148 @@ { - - "AccountSet": { - "meta": { - "exists": true, - "uuid": "f829c410-4aa3-4297-8de7-0b0534d1101d", - "multisign": false, - "submit": true, - "destination": "", - "resolved_destination": "", - "resolved": false, - "signed": false, - "cancelled": false, - "expired": false, - "pushed": true, - "app_opened": false, - "opened_by_deeplink": null, - "return_url_app": null, - "return_url_web": "https://xrpl.services/?payloadId=f829c410-4aa3-4297-8de7-0b0534d1101d", - "custom_instruction": "- Set Domain to 'test.com'", - "is_xapp": false, - "push_message_id": "1644506689964712" - }, - "application": { - "name": "Xrpl Services", - "description": "Website to provide easy access to XRPL transactions via Xumm", - "disabled": 0, - "uuidv4": "9ea0a9e1-3e5c-4b71-8b3e-d0f39f26e084", - "icon_url": "https://xumm-cdn.imgix.net/app-logo/27ef1d94-bc3d-4983-a631-8047cf4b9148.png", - "issued_user_token": null - }, - "payload": { - "tx_type": "AccountSet", - "tx_destination": "", - "tx_destination_tag": null, - "request_json": { - "TransactionType": "AccountSet", - "Domain": "746573742E636F6D", - "Account": "raKNPicxh5259rUYdrJMgpJp9RhyKYXQmg" - }, - "origintype": null, - "signmethod": null, - "created_at": "2022-02-10T15:24:50Z", - "expires_at": "2022-02-10T15:29:50Z", - "expires_in_seconds": 284, - "hash": "f378ba834ca39d9f48c3918b7580f1fd452a1fae" - } - }, - "SignIn": { - "meta": { - "exists": true, - "uuid": "aadcda7c-f2b4-4649-a9f4-da638fadfec4", - "multisign": false, - "submit": false, - "destination": "", - "resolved_destination": "", - "resolved": false, - "signed": false, - "cancelled": false, - "expired": false, - "pushed": false, - "app_opened": false, - "opened_by_deeplink": null, - "return_url_app": null, - "return_url_web": "https://xrpl.services/?payloadId=aadcda7c-f2b4-4649-a9f4-da638fadfec4&signinToValidate=true", - "custom_instruction": null, - "is_xapp": false, - "push_message_id": null - }, - "application": { - "name": "Xrpl Services", - "description": "Website to provide easy access to XRPL transactions via Xumm", - "disabled": 0, - "uuidv4": "9ea0a9e1-3e5c-4b71-8b3e-d0f39f26e084", - "icon_url": "https://xumm-cdn.imgix.net/app-logo/27ef1d94-bc3d-4983-a631-8047cf4b9148.png", - "issued_user_token": null - }, - "payload": { - "tx_type": "SignIn", - "tx_destination": "", - "tx_destination_tag": null, - "request_json": { - "SignIn": true - }, - "origintype": null, - "signmethod": null, - "created_at": "2022-02-11T10:58:31Z", - "expires_at": "2022-02-11T11:03:31Z", - "expires_in_seconds": 284, - "hash": "7ff739c2179645e24de42ef41f5396d8f2368e57" - }, - "response": { - "hex": null, - "txid": null, - "resolved_at": null, - "dispatched_to": null, - "dispatched_result": null, - "dispatched_nodetype": null, - "multisign_account": null, - "account": null - } - }, - "InvalidPayload": { - "meta": { - "exists": true, - "uuid": "f829c410-4aa3-4297-8de7-0b0534d1101d", - "multisign": false, - "submit": true, - "destination": "", - "resolved_destination": "", - "resolved": false, - "signed": false, - "cancelled": false, - "expired": false, - "pushed": true, - "app_opened": false, - "opened_by_deeplink": null, - "return_url_app": null, - "return_url_web": "https://xrpl.services/?payloadId=f829c410-4aa3-4297-8de7-0b0534d1101d", - "custom_instruction": "- Set Domain to 'test.com'", - "is_xapp": false, - "push_message_id": "1644506689964712" - }, - "application": { - "name": "Xrpl Services", - "description": "Website to provide easy access to XRPL transactions via Xumm", - "disabled": 0, - "uuidv4": "9ea0a9e1-3e5c-4b71-8b3e-d0f39f26e084", - "icon_url": "https://xumm-cdn.imgix.net/app-logo/27ef1d94-bc3d-4983-a631-8047cf4b9148.png", - "issued_user_token": null - }, - "payload": { - "tx_type": "AccountSet", - "tx_destination": "", - "tx_destination_tag": null, - "request_json": { - "TransactionType": "AccountSet", - "Domain": "746573742E636F6D", - "Account": "raKNPicxh5259rUYdrJMgpJp9RhyKYXQmc" - }, - "origintype": null, - "signmethod": null, - "created_at": "2022-02-10T15:24:50Z", - "expires_at": "2022-02-10T15:29:50Z", - "expires_in_seconds": 284, - "hash": "f378ba834ca39d9f48c3918b7580f1fd452a1fae" - } - } -} \ No newline at end of file + "AccountSet": { + "meta": { + "exists": true, + "uuid": "f829c410-4aa3-4297-8de7-0b0534d1101d", + "multisign": false, + "submit": true, + "destination": "", + "resolved_destination": "", + "resolved": false, + "signed": false, + "cancelled": false, + "expired": false, + "pushed": true, + "app_opened": false, + "opened_by_deeplink": null, + "return_url_app": null, + "return_url_web": "https://xrpl.services/?payloadId=f829c410-4aa3-4297-8de7-0b0534d1101d", + "custom_instruction": "- Set Domain to 'test.com'", + "is_xapp": false, + "push_message_id": "1644506689964712" + }, + "application": { + "name": "Xrpl Services", + "description": "Website to provide easy access to XRP ledger protocol transactions via Xaman", + "disabled": 0, + "uuidv4": "9ea0a9e1-3e5c-4b71-8b3e-d0f39f26e084", + "icon_url": "https://xumm-cdn.imgix.net/app-logo/27ef1d94-bc3d-4983-a631-8047cf4b9148.png", + "issued_user_token": null + }, + "payload": { + "tx_type": "AccountSet", + "tx_destination": "", + "tx_destination_tag": null, + "request_json": { + "TransactionType": "AccountSet", + "Domain": "746573742E636F6D", + "Account": "raKNPicxh5259rUYdrJMgpJp9RhyKYXQmg" + }, + "origintype": null, + "signmethod": null, + "created_at": "2022-02-10T15:24:50Z", + "expires_at": "2022-02-10T15:29:50Z", + "expires_in_seconds": 284, + "hash": "6059d72eed581ee30b4fdf2c5d92957780dc19cc" + } + }, + "SignIn": { + "meta": { + "exists": true, + "uuid": "aadcda7c-f2b4-4649-a9f4-da638fadfec4", + "multisign": false, + "submit": false, + "destination": "", + "resolved_destination": "", + "resolved": false, + "signed": false, + "cancelled": false, + "expired": false, + "pushed": false, + "app_opened": false, + "opened_by_deeplink": null, + "return_url_app": null, + "return_url_web": "https://xrpl.services/?payloadId=aadcda7c-f2b4-4649-a9f4-da638fadfec4&signinToValidate=true", + "custom_instruction": null, + "is_xapp": false, + "push_message_id": null + }, + "application": { + "name": "Xrpl Services", + "description": "Website to provide easy access to XRP ledger protocol transactions via Xaman", + "disabled": 0, + "uuidv4": "9ea0a9e1-3e5c-4b71-8b3e-d0f39f26e084", + "icon_url": "https://xumm-cdn.imgix.net/app-logo/27ef1d94-bc3d-4983-a631-8047cf4b9148.png", + "issued_user_token": null + }, + "payload": { + "tx_type": "SignIn", + "tx_destination": "", + "tx_destination_tag": null, + "request_json": { + "SignIn": true + }, + "origintype": null, + "signmethod": null, + "created_at": "2022-02-11T10:58:31Z", + "expires_at": "2022-02-11T11:03:31Z", + "expires_in_seconds": 284, + "hash": "7ff739c2179645e24de42ef41f5396d8f2368e57" + }, + "response": { + "hex": null, + "txid": null, + "resolved_at": null, + "dispatched_to": null, + "dispatched_result": null, + "dispatched_nodetype": null, + "multisign_account": null, + "account": null + } + }, + "InvalidPayload": { + "meta": { + "exists": true, + "uuid": "f829c410-4aa3-4297-8de7-0b0534d1101d", + "multisign": false, + "submit": true, + "destination": "", + "resolved_destination": "", + "resolved": false, + "signed": false, + "cancelled": false, + "expired": false, + "pushed": true, + "app_opened": false, + "opened_by_deeplink": null, + "return_url_app": null, + "return_url_web": "https://xrpl.services/?payloadId=f829c410-4aa3-4297-8de7-0b0534d1101d", + "custom_instruction": "- Set Domain to 'test.com'", + "is_xapp": false, + "push_message_id": "1644506689964712" + }, + "application": { + "name": "Xrpl Services", + "description": "Website to provide easy access to XRP ledger protocol transactions via Xaman", + "disabled": 0, + "uuidv4": "9ea0a9e1-3e5c-4b71-8b3e-d0f39f26e084", + "icon_url": "https://xumm-cdn.imgix.net/app-logo/27ef1d94-bc3d-4983-a631-8047cf4b9148.png", + "issued_user_token": null + }, + "payload": { + "tx_type": "AccountSet", + "tx_destination": "", + "tx_destination_tag": null, + "request_json": { + "TransactionType": "AccountSet", + "Domain": "746573742E636F6D", + "Account": "raKNPicxh5259rUYdrJMgpJp9RhyKYXQmc" + }, + "origintype": null, + "signmethod": null, + "created_at": "2022-02-10T15:24:50Z", + "expires_at": "2022-02-10T15:29:50Z", + "expires_in_seconds": 284, + "hash": "f378ba834ca39d9f48c3918b7580f1fd452a1fae" + } + } +} diff --git a/src/common/libs/payload/digest/codec.ts b/src/common/libs/payload/digest/codec.ts new file mode 100644 index 000000000..562fc2883 --- /dev/null +++ b/src/common/libs/payload/digest/codec.ts @@ -0,0 +1,58 @@ +/** + * @deprecated This digest algo is deprecated and should not be used in new code. + */ + +import { mapKeys } from 'lodash'; +import * as AccountLib from 'xrpl-accountlib'; + +import { GetDeviceUniqueId } from '@common/helpers/device'; +import { SHA1 } from '@common/libs/crypto'; +import { PseudoTransactionTypes, TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +import Digest from './digest'; +/* Class ==================================================================== */ +class DigestCodecWithSHA1 extends Digest { + /** + * The name of the hashing algorithm used by this codec. + * @deprecated This constant is for historical purposes and should not be used in new code. + */ + public static DIGEST_HASH_ALGO = 'DigestCodecWithSHA1'; + + /** + * Calculate the digest using SHA-1 algorithm and binary codec. + * + * @param {TransactionJSONType} request_json - Transaction JSON data to be hashed. + * @param {TransactionTypes | PseudoTransactionTypes} tx_type - The type of transaction. + * @returns {Promise} A promise that resolves with the SHA-1 hash and codec. + * @deprecated SHA-1 is a deprecated and insecure hashing algorithm. Use a more secure hashing method. + */ + static digest = ( + request_json: TransactionJSONType, + tx_type: TransactionTypes | PseudoTransactionTypes, + ): Promise => { + return new Promise((resolve, reject) => { + let hashEncodingMethod = 'encode'; + let normalizedRequestJson = request_json; + + // if it's the pseudo PaymentChannelAuthorize we need + // 1) use encodeForSigningClaim method for encoding + // 2) lower case the keys + if (tx_type === PseudoTransactionTypes.PaymentChannelAuthorize) { + hashEncodingMethod = 'encodeForSigningClaim'; + normalizedRequestJson = mapKeys(request_json, (v, k) => k.toLowerCase()); + } + + // calculate checksum + // @ts-ignore + const checksum = AccountLib.binary[hashEncodingMethod](normalizedRequestJson); + + // calculate digest SHA1{checksum}+{deviceId} + const deviceId = GetDeviceUniqueId(); + // get the SHA1 of combined strings + SHA1(`${checksum}+${deviceId}`).then(resolve).catch(reject); + }); + }; +} + +/* Export ==================================================================== */ +export default DigestCodecWithSHA1; diff --git a/src/common/libs/payload/digest/digest.ts b/src/common/libs/payload/digest/digest.ts new file mode 100644 index 000000000..c9259f62f --- /dev/null +++ b/src/common/libs/payload/digest/digest.ts @@ -0,0 +1,25 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { PseudoTransactionTypes, TransactionJSONType, TransactionTypes } from '@common/libs/ledger/types'; + +/** + * Abstract Class Digest. + * + * @class Digest + */ +abstract class Digest { + constructor() { + if (this.constructor === Digest) { + throw new Error('Abstract classes cannot be instantiated.'); + } + } + + static digest = ( + request_json: TransactionJSONType, + tx_type?: TransactionTypes | PseudoTransactionTypes, + ): Promise => { + throw new Error('Method digest() must be implemented.'); + }; +} + +export default Digest; diff --git a/src/common/libs/payload/digest/index.ts b/src/common/libs/payload/digest/index.ts new file mode 100644 index 000000000..447508783 --- /dev/null +++ b/src/common/libs/payload/digest/index.ts @@ -0,0 +1,4 @@ +import DigestSerializeWithSHA1 from '@common/libs/payload/digest/serialize'; +import DigestCodecWithSHA1 from '@common/libs/payload/digest/codec'; + +export { DigestSerializeWithSHA1, DigestCodecWithSHA1 }; diff --git a/src/common/libs/payload/digest/serialize.ts b/src/common/libs/payload/digest/serialize.ts new file mode 100644 index 000000000..ac3196393 --- /dev/null +++ b/src/common/libs/payload/digest/serialize.ts @@ -0,0 +1,73 @@ +/** + * Digesting and serializing transaction json using the SHA-1 hashing algorithm. + */ + +import { GetDeviceUniqueId } from '@common/helpers/device'; +import { SHA1 } from '@common/libs/crypto'; +import { TransactionJSONType } from '@common/libs/ledger/types'; + +import Digest from './digest'; + +/* Class ==================================================================== */ +class DigestSerializeWithSHA1 extends Digest { + /** + * The name of the hashing algorithm used by this codec. + */ + public static DIGEST_HASH_ALGO = 'DigestSerializeWithSHA1'; + + /** + * Serialize an object into a string representation. + * + * @param {*} obj - The object to be serialized. + * @returns {string} The serialized string representation of the object. + * @throws {Error} Throws an error if the input object type is not supported. + */ + static serialize = (obj: any): string => { + if (Array.isArray(obj)) { + return `[${obj.map((el) => DigestSerializeWithSHA1.serialize(el)).join(',')}]`; + } + if (typeof obj === 'object' && obj !== null) { + let out = ''; + const keys = Object.keys(obj).sort(); + out += `{${JSON.stringify(keys)}`; + for (let i = 0; i < keys.length; i++) { + out += `${DigestSerializeWithSHA1.serialize(obj[keys[i]])},`; + } + return `${out}}`; + } + if (['string', 'number', 'boolean'].includes(typeof obj)) { + return `${JSON.stringify(obj)}`; + } + + throw new Error(`Invalid object type ${typeof obj}`); + }; + + /** + * Calculate the digest of a serialized object using the SHA-1 algorithm. + * + * @param {TransactionJSONType} request_json - The JSON data to be serialized and hashed. + * @returns {Promise} A promise that resolves with the SHA-1 hash. + * @throws {Error} Throws an error if the input data is not a valid object. + */ + static digest = (request_json: TransactionJSONType): Promise => { + return new Promise((resolve, reject) => { + if (typeof request_json !== 'object' || !request_json) { + reject(new Error('digest `request_json` should be valid object!')); + return; + } + + const serialized = DigestSerializeWithSHA1.serialize(request_json); + // calculate checksum + SHA1(`${serialized}`) + .then((checksum) => { + // calculate digest SHA1{checksum}+{deviceId} + const deviceId = GetDeviceUniqueId(); + return SHA1(`${checksum}+${deviceId}`).then(resolve).catch(reject); + }) + .catch(reject); + }); + }; +} + +/* Export ==================================================================== */ +export default DigestSerializeWithSHA1; diff --git a/src/common/libs/payload/object.ts b/src/common/libs/payload/object.ts index 90229f56e..207387b13 100644 --- a/src/common/libs/payload/object.ts +++ b/src/common/libs/payload/object.ts @@ -1,13 +1,8 @@ -import { get, has, mapKeys, isObject, isString, isUndefined } from 'lodash'; -import * as codec from 'ripple-binary-codec'; +import { get, has, isObject, isString, isUndefined } from 'lodash'; import ApiService from '@services/ApiService'; import LoggerService from '@services/LoggerService'; -import { SHA1 } from '@common/libs/crypto'; - -import { GetDeviceUniqueId } from '@common/helpers/device'; - import { TransactionFactory } from '@common/libs/ledger/factory'; import Localize from '@locale'; @@ -24,6 +19,8 @@ import { PayloadType, } from './types'; +import { DigestSerializeWithSHA1 } from './digest'; + // errors import errors from './errors'; @@ -129,26 +126,11 @@ export class Payload { return false; } - let hashEncodingMethod = 'encode'; - let normalizedRequestJson = request_json; - - // if it's the pseudo PaymentChannelAuthorize we need - // 1) use encodeForSigningClaim method for encoding - // 2) lower case the keys - if (tx_type === PseudoTransactionTypes.PaymentChannelAuthorize) { - hashEncodingMethod = 'encodeForSigningClaim'; - normalizedRequestJson = mapKeys(request_json, (v, k) => k.toLowerCase()); - } + // get digest for request json object + const digest = await DigestSerializeWithSHA1.digest(request_json); - // encode + hash and check for the checksum - // @ts-ignore - const encodedTX = codec[hashEncodingMethod](normalizedRequestJson); - - const deviceId = GetDeviceUniqueId(); - const checksum = await SHA1(`${encodedTX}+${deviceId}`); - - return checksum === hash; - } catch { + return digest === hash; + } catch (error: any) { return false; } }; @@ -185,11 +167,14 @@ export class Payload { fetch = (uuid: string): Promise => { return new Promise((resolve, reject) => { ApiService.payload - .get({ uuid, from: this.getOrigin() }) + .get({ uuid, from: this.getOrigin() }, undefined, { + 'X-Xaman-Digest': DigestSerializeWithSHA1.DIGEST_HASH_ALGO, + }) .then(async (res: PayloadType) => { // get verification status const verified = await this.verify(res.payload); + // if not verified then if (!verified) { reject(new Error(Localize.t('payload.UnableVerifyPayload'))); return; @@ -256,7 +241,7 @@ export class Payload { /** * reject the payload */ - reject = (initiator: 'USER' | 'XUMM', reason?: string) => { + reject = (initiator: 'USER' | 'APP', reason?: string) => { // ignore the method if payload is generated if (this.isGenerated()) { return; @@ -300,7 +285,7 @@ export class Payload { }; /** - * Return true if payload generated by xumm + * Return true if payload generated by Xaman */ isGenerated = (): boolean => { return !!this.generated; @@ -314,6 +299,9 @@ export class Payload { return isUndefined(get(request_json, 'TransactionType', undefined)); }; + /** + * Return true if path finding is enabled in the payload + */ isPathFinding = (): boolean => { return !!this.meta.pathfinding; }; @@ -324,20 +312,20 @@ export class Payload { getTransaction(): Transactions | PseudoTransactions { const { request_json, tx_type } = this.payload; - // check if normal transaction and supported by Xumm + // check if normal transaction and supported by the app if ( request_json.TransactionType && !Object.values(TransactionTypes).includes(request_json.TransactionType as TransactionTypes) ) { - throw new Error('Requested transaction type is not supported in XUMM!'); + throw new Error(`Requested transaction type is not supported "${request_json.TransactionType}".`); } - // check if pseudo transaction and supported by Xumm + // check if pseudo transaction and supported by the app if ( !request_json.TransactionType && !Object.values(PseudoTransactionTypes).includes(tx_type as PseudoTransactionTypes) ) { - throw new Error('Requested pseudo transaction type is not supported in XUMM!'); + throw new Error(`Requested pseudo transaction type is not supported "${request_json.TransactionType}".`); } let craftedTransaction; @@ -378,7 +366,7 @@ export class Payload { */ getApplicationName = (): string => { if (this.isGenerated()) { - return 'XUMM'; + return 'Xaman'; } return this.application.name; }; @@ -423,9 +411,20 @@ export class Payload { /** * Return forced network if any */ - getForcedNetwork = (): string => { + getForcedNetwork = (): string | undefined => { const { force_network } = this.meta; - return force_network; + if (typeof force_network === 'string') { + return force_network; + } + + return undefined; + }; + + /** + * Return the time when payload has been created + */ + getRequestTime = () => { + return this.payload.created_at; }; } diff --git a/src/common/libs/payload/types.ts b/src/common/libs/payload/types.ts index b149a1927..bec5b1d59 100644 --- a/src/common/libs/payload/types.ts +++ b/src/common/libs/payload/types.ts @@ -67,9 +67,12 @@ export interface ResponseType { export interface PatchSuccessType { signed_blob: string; tx_id: string; + signmethod: 'PIN' | 'BIOMETRIC' | 'PASSPHRASE' | 'TANGEM' | 'OTHER'; + signpubkey: string; multisigned: string; permission?: Permission; origintype?: PayloadOrigin; + environment: Environment; } export interface PatchSubmitType { @@ -80,6 +83,11 @@ export interface PatchRejectType { reject: boolean; } +export interface Environment { + nodeuri: string; + nodetype: string; +} + export interface Dispatched { to: string; nodetype: string; diff --git a/src/common/libs/preferences.ts b/src/common/libs/preferences.ts index 7c8dfbe79..393d807fb 100644 --- a/src/common/libs/preferences.ts +++ b/src/common/libs/preferences.ts @@ -14,6 +14,7 @@ enum Keys { LATEST_VERSION_CODE = 'LATEST_VERSION_CODE', UPDATE_IGNORE_VERSION_CODE = 'UPDATE_IGNORE_VERSION_CODE', XAPP_STORE_IGNORE_MESSAGE_ID = 'XAPP_STORE_IGNORE_MESSAGE_ID', + CURATED_LIST_VERSION = 'CURATED_LIST_VERSION', } /* Lib ==================================================================== */ @@ -37,7 +38,7 @@ const Preferences = { /** * Delete shared preferences */ - del: async (key: Keys): Promise => { + del: async (key: Keys): Promise => { return SharedPreferencesModule.del(key); }, }; diff --git a/src/common/libs/vault.ts b/src/common/libs/vault.ts index 3b32bdda9..229fec255 100644 --- a/src/common/libs/vault.ts +++ b/src/common/libs/vault.ts @@ -46,7 +46,7 @@ const Vault = { return new Promise((resolve, reject) => { VaultManagerModule.openVault(name, key) .then((clearText: string) => { - // this should never happen + // this should never happen, just double-checking if (!clearText) { reject(new Error('Vault open clear text is not defined!')); return; @@ -66,9 +66,7 @@ const Vault = { exist: async (name: string): Promise => { return new Promise((resolve, reject) => { VaultManagerModule.vaultExist(name) - .then((result: boolean) => { - resolve(result); - }) + .then(resolve) .catch((error: any) => { logger.error('Vault vaultExist error', error); reject(error); @@ -82,9 +80,7 @@ const Vault = { isStorageEncryptionKeyExist: (): Promise => { return new Promise((resolve, reject) => { VaultManagerModule.isStorageEncryptionKeyExist() - .then((result: boolean) => { - resolve(result); - }) + .then(resolve) .catch((error: any) => { logger.error('Vault isStorageEncryptionKeyExist error', error); reject(error); @@ -124,12 +120,17 @@ const Vault = { /** * check if vault needs migration */ - isMigrationRequired: (name: string): Promise => { + isMigrationRequired: ( + name: string, + ): Promise<{ + vault: string; + current_cipher_version: number; + latest_cipher_version: number; + migration_required: boolean; + }> => { return new Promise((resolve, reject) => { VaultManagerModule.isMigrationRequired(name) - .then((result: any) => { - resolve(result); - }) + .then(resolve) .catch((error: any) => { logger.error('Vault isMigrationRequired error', error); reject(error); @@ -143,9 +144,7 @@ const Vault = { reKey: async (name: string, oldKey: string, newKey: string): Promise => { return new Promise((resolve, reject) => { VaultManagerModule.reKeyVault(name, oldKey, newKey) - .then((result: boolean) => { - resolve(result); - }) + .then(resolve) .catch((error: any) => { logger.error('Vault reKey error', error); reject(error); @@ -159,9 +158,7 @@ const Vault = { reKeyBatch: async (names: string[], oldKey: string, newKey: string): Promise => { return new Promise((resolve, reject) => { VaultManagerModule.reKeyBatchVaults(names, oldKey, newKey) - .then((result: boolean) => { - resolve(result); - }) + .then(resolve) .catch((error: any) => { logger.error('Vault batch reKey error', error); reject(error); @@ -173,9 +170,7 @@ const Vault = { purge: (name: string): Promise => { return new Promise((resolve, reject) => { VaultManagerModule.purgeVault(name) - .then((result: boolean) => { - resolve(result); - }) + .then(resolve) .catch((error: any) => { logger.error('Vault purge error', error); reject(error); @@ -187,9 +182,7 @@ const Vault = { clearStorage: (): Promise => { return new Promise((resolve, reject) => { VaultManagerModule.clearStorage() - .then((result: boolean) => { - resolve(result); - }) + .then(resolve) .catch((error: any) => { logger.error('Vault clear storage error', error); reject(error); diff --git a/src/common/package.json b/src/common/package.json index 505957c0d..2ff7b1a82 100644 --- a/src/common/package.json +++ b/src/common/package.json @@ -1,4 +1,4 @@ { - "name": "@common", - "private": true -} \ No newline at end of file + "name": "@common", + "private": true +} diff --git a/src/common/utils/__tests__/amount.test.ts b/src/common/utils/__tests__/amount.test.ts index fe7d0ea02..266ec9978 100644 --- a/src/common/utils/__tests__/amount.test.ts +++ b/src/common/utils/__tests__/amount.test.ts @@ -1,101 +1,12 @@ /* eslint-disable spellcheck/spell-checker */ -import { NormalizeAmount, NormalizeCurrencyCode, XRPLValueToNFT, NFTValueToXRPL, ValueToIOU } from '../amount'; +import { NormalizeAmount, NormalizeCurrencyCode, ValueToIOU } from '../amount'; -describe('Utils.Amount', () => { - describe('XRPLValueToNFT', () => { - it('should return right values', () => { - const tests = [ - { - value: 4.65661287307739e-10, - output: false, - }, - { - value: 12.123, - output: false, - }, - { - value: 0.000000000000000000000001, - output: false, - }, - { - value: 0.0000000000000000000000000000000000000000000000000000000000000000000001, - output: false, - }, - { - value: 7.5128000168e-78, - output: false, - }, - { - value: 0.000000000000000000000000000000000000000000000000000000000000000000000000000000001, - output: 1, - }, - { - value: 1e-81, - output: 1, - }, - { - value: 10e-82, - output: 1, - }, - { - value: 0.0000000000000000000000000000000000000000000000000000000000000000000000000000001, - output: 100, - }, - { - value: 1000000000000000e-94, - output: 100, - }, - { - value: 0.000000000000000000000000000000000000000000000000000000000000000000000000000000031, - output: 31, - }, - { - value: 3100000000000000e-95, - output: 31, - }, - ]; - - tests.forEach((v) => { - expect(XRPLValueToNFT(v.value)).toBe(v.output); - }); - }); - }); - - describe('NFTValueToXRPL', () => { - it('should return right values', () => { - const balance = 3100000000000000e-95; - - const tests = [ - { - balance, - value: '31', - output: '0.000000000000000000000000000000000000000000000000000000000000000000000000000000031', - }, - { - balance, - value: '-31', - output: '-0.000000000000000000000000000000000000000000000000000000000000000000000000000000031', - }, - { - balance: undefined, - value: '5', - output: '0.000000000000000000000000000000000000000000000000000000000000000000000000000000005', - }, - ]; - - tests.forEach((v) => { - expect(NFTValueToXRPL(v.value, v.balance)).toBe(v.output); - }); - }); - }); +jest.mock('@services/NetworkService'); +describe('Utils.Amount', () => { describe('NormalizeAmount', () => { it('should return right values', () => { const tests = [ - { - value: 10e-82, - output: 1, - }, { value: 999.0123456789, output: 999.01234568, diff --git a/src/common/utils/__tests__/codec.test.ts b/src/common/utils/__tests__/codec.test.ts new file mode 100644 index 000000000..173606b33 --- /dev/null +++ b/src/common/utils/__tests__/codec.test.ts @@ -0,0 +1,39 @@ +/* eslint-disable spellcheck/spell-checker */ +import { EncodeNFTokenID, DecodeNFTokenID } from '../codec'; + +describe('Utils.codec', () => { + describe('DecodeNFTokenID', () => { + it('should decode NFTokenID correctly', () => { + const nfTokenID = '000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC505C73BA9047ED3FE'; + + const decoded = DecodeNFTokenID(nfTokenID); + + expect(decoded.NFTokenID).toBe(nfTokenID); + expect(decoded.Flags).toBe(8); + expect(decoded.TransferFee).toBe(5000); + expect(decoded.Issuer).toBe('ra5jrnrq9BxsvzGeJY5XS9inftcJWMdJUx'); + expect(decoded.Taxon).toBe(48); + expect(decoded.Sequence).toBe(75420670); + }); + + it('should throw error for invalid NFTokenID length', () => { + const nfTokenID = 'invalidTokenID'; // NFTokenID with invalid length + expect(() => DecodeNFTokenID(nfTokenID)).toThrow('Invalid nfTokenID, should be 64 bytes hex'); + }); + }); + + describe('EncodeNFTokenID', () => { + it('should encode NFTokenID correctly', () => { + const account = 'ra5jrnrq9BxsvzGeJY5XS9inftcJWMdJUx'; + const tokenSequence = 75420670; + const flags = 8; + const transferFee = 5000; + const tokenTaxon = 48; + + const encoded = EncodeNFTokenID(account, tokenSequence, flags, transferFee, tokenTaxon); + + const expectedEncoded = '000813883EBCBE82C32E1CA28616DBDD2E40873D446B0EC505C73BA9047ED3FE'; + expect(encoded).toBe(expectedEncoded); + }); + }); +}); diff --git a/src/common/utils/__tests__/explorer.test.ts b/src/common/utils/__tests__/explorer.test.ts new file mode 100644 index 000000000..f38aabb6e --- /dev/null +++ b/src/common/utils/__tests__/explorer.test.ts @@ -0,0 +1,15 @@ +/* eslint-disable spellcheck/spell-checker */ +import { AppConfig } from '@common/constants'; +import { GetTransactionLink, GetAccountLink } from '../explorer'; + +jest.mock('@services/NetworkService'); + +describe('Utils.Explorer', () => { + it('should return right transaction link', () => { + expect(GetTransactionLink('CTID')).toEqual(`${AppConfig.explorerProxy}/0/CTID`); + }); + + it('should return right account link', () => { + expect(GetAccountLink('ACCOUNT')).toEqual(`${AppConfig.explorerProxy}/0/ACCOUNT`); + }); +}); diff --git a/src/common/utils/__tests__/fee.test.ts b/src/common/utils/__tests__/fee.test.ts new file mode 100644 index 000000000..653d20652 --- /dev/null +++ b/src/common/utils/__tests__/fee.test.ts @@ -0,0 +1,45 @@ +/* eslint-disable spellcheck/spell-checker */ +import { NormalizeFeeDataSet } from '../fee'; + +describe('Utils.Fee', () => { + it('Should return right values', () => { + const baseFees = { + 10: ['12', '15', '25'], + 12: ['12', '15', '25'], + 24: ['24', '30', '45'], + 100: ['100', '150', '200'], + 500: ['500', '600', '900'], + 1200: ['1200', '1500', '2500'], + 10000: ['10000', '15000', '20000'], + 50000: ['50000', '60000', '75000'], + 20000: ['20000', '25000', '35000'], + 800000: ['800000', '850000', '850000'], + }; + + Object.keys(baseFees).forEach((base) => { + expect( + NormalizeFeeDataSet({ + drops: { base_fee: Number(base) }, + fee_hooks_feeunits: 0, + }), + ).toMatchObject({ + availableFees: [ + { + type: 'LOW', + value: baseFees[base][0], + }, + { + type: 'MEDIUM', + value: baseFees[base][1], + }, + { + type: 'HIGH', + value: baseFees[base][2], + }, + ], + feeHooks: 0, + suggested: 'LOW', + }); + }); + }); +}); diff --git a/src/common/utils/__tests__/fixtures/tangem.cards.json b/src/common/utils/__tests__/fixtures/tangem.cards.json index 79800ff8d..091ff291d 100644 --- a/src/common/utils/__tests__/fixtures/tangem.cards.json +++ b/src/common/utils/__tests__/fixtures/tangem.cards.json @@ -1,5 +1,409 @@ { - "multiCurrency": {"android": {"backupStatus":"noBackup","isAccessCodeSet":false,"isPasscodeSet":false,"settings":{"isHDWalletAllowed":true,"supportedEncryptionModes":["strong","fast","none"],"isBackupAllowed":true,"isLinkedTerminalEnabled":true,"maxWalletsCount":20,"isResettingUserCodesAllowed":true,"isSettingAccessCodeAllowed":false,"isFilesAllowed":true,"isSettingPasscodeAllowed":false,"securityDelay":15000},"firmwareVersion":{"type":"r","stringValue":"4.46r","minor":46,"patch":0,"major":4},"supportedCurves":["secp256k1","secp256r1","ed25519"],"linkedTerminalStatus":"none","wallets":[{"derivedKeys":{"{\"rawPath\":\"m/44'/144'/0'/0/0\",\"nodes\":[2147483692,2147483792,2147483648,0,0]}":{"chainCode":"46426409F857AC12AD537F5A348FFDB2C65358587A4EBDD8E3A88C11DF37B3F3","publicKey":"03C105B85FEEA5DFA880CDD0973A40A48DFD71CFB1304F9666B33CDF3A0895ADE6"}},"hasBackup":false,"index":0,"totalSignedHashes":15,"settings":{"isPermanent":false},"publicKey":"0326AC2CCC0D1999DD12104E0A99433EB45C8F51652354F1B52637C2A23C188E2F","curve":"secp256k1","extendedPublicKey":{"chainCode":"AFD6246F6635C534F4E61385B31BCD6464E3726A7F9BFFF2CB82AA1FB9EA94BF","publicKey":"0326AC2CCC0D1999DD12104E0A99433EB45C8F51652354F1B52637C2A23C188E2F"},"chainCode":"AFD6246F6635C534F4E61385B31BCD6464E3726A7F9BFFF2CB82AA1FB9EA94BF"}],"cardPublicKey":"028097892AE47AB427FC02A83C51649208AB7658EA0A2997D42733707F7CA2D72C","cardId":"AC01000000045622","manufacturer":{"signature":"C79C7D377BCE893C042462EA5FBD2E851FD8569932689507D9D3E8203A88CDBC64D7B8295B825201F3B3BA99F675DF7827F35526DAC4B33B6DB782AAA5697DD8","manufactureDate":"2021-10-01","name":"TANGEM"},"attestation":{"cardUniquenessAttestation":"skipped","firmwareAttestation":"skipped","walletKeysAttestation":"skipped","cardKeyAttestation":"verifiedOffline"},"batchId":"AC01","issuer":{"publicKey":"0356E7C3376329DFAE7388DF1695670386103C92486A87644FA9E512C9CF4E92FE","name":"TANGEM AG"}}, "ios": {"isAccessCodeSet":false,"supportedCurves":["secp256k1","ed25519","secp256r1"],"cardPublicKey":"028097892AE47AB427FC02A83C51649208AB7658EA0A2997D42733707F7CA2D72C","wallets":[{"chainCode":"AFD6246F6635C534F4E61385B31BCD6464E3726A7F9BFFF2CB82AA1FB9EA94BF","publicKey":"0326AC2CCC0D1999DD12104E0A99433EB45C8F51652354F1B52637C2A23C188E2F","curve":"secp256k1","index":0,"derivedKeys":["m/44'/144'/0'/0/0",{"chainCode":"46426409F857AC12AD537F5A348FFDB2C65358587A4EBDD8E3A88C11DF37B3F3","publicKey":"03C105B85FEEA5DFA880CDD0973A40A48DFD71CFB1304F9666B33CDF3A0895ADE6"}],"hasBackup":false,"settings":{"isPermanent":false},"totalSignedHashes":15}],"linkedTerminalStatus":"none","backupStatus":{"status":"noBackup"},"issuer":{"publicKey":"0356E7C3376329DFAE7388DF1695670386103C92486A87644FA9E512C9CF4E92FE","name":"TANGEM AG"},"isPasscodeSet":false,"settings":{"isHDWalletAllowed":true,"isSettingAccessCodeAllowed":false,"isBackupAllowed":true,"securityDelay":15000,"supportedEncryptionModes":["strong","fast","none"],"isSettingPasscodeAllowed":false,"isFilesAllowed":true,"isLinkedTerminalEnabled":true,"isResettingUserCodesAllowed":true,"maxWalletsCount":20},"firmwareVersion":{"type":"r","stringValue":"4.46r","major":4,"patch":0,"minor":46},"batchId":"AC01","attestation":{"cardUniquenessAttestation":"skipped","firmwareAttestation":"skipped","walletKeysAttestation":"skipped","cardKeyAttestation":"verified"},"manufacturer":{"signature":"C79C7D377BCE893C042462EA5FBD2E851FD8569932689507D9D3E8203A88CDBC64D7B8295B825201F3B3BA99F675DF7827F35526DAC4B33B6DB782AAA5697DD8","manufactureDate":"2021-10-01","name":"TANGEM"},"cardId":"AC01000000045622"}}, - "normalSecp": {"android": {"isAccessCodeSet":false,"isPasscodeSet":true,"settings":{"isHDWalletAllowed":false,"supportedEncryptionModes":["strong","fast","none"],"isBackupAllowed":false,"isLinkedTerminalEnabled":false,"maxWalletsCount":1,"isResettingUserCodesAllowed":true,"isSettingAccessCodeAllowed":false,"isFilesAllowed":true,"isSettingPasscodeAllowed":true,"securityDelay":15000},"firmwareVersion":{"type":"r","stringValue":"3.06r","minor":6,"patch":0,"major":3},"supportedCurves":["secp256k1"],"linkedTerminalStatus":"none","wallets":[{"derivedKeys":{},"hasBackup":false,"index":0,"totalSignedHashes":15,"settings":{"isPermanent":true},"remainingSignatures":999985,"curve":"secp256k1","publicKey":"045F608652134052BB7D78991FCC6CFC8D50E54AAF336D953999B6326F6E33889D799B03DB1C0AEC9DCA4AEFE2F60C959CF2F4EB62B281CA91C909E2EFC4C62C9A"}],"cardPublicKey":"049258E7CE9B22AF339EDC88D49F28725371911F02F9CFA864429A26BE4131F89383D233D90F8AE88F42B9E7537F2237F6F2E3979156471363F8D0BB4B4F17E400","cardId":"CB77000000037807","manufacturer":{"signature":"66552B3FF8B3C0A5F1DB8EEAC3E4D27134E4726C7C5DA69465C1AD999AB4B11FFE6D98124E120A9418B49F89D9A21FC416B8E7F49D994AF70025DAF3C2A5904A","manufactureDate":"2021-02-25","name":"TANGEM"},"attestation":{"cardUniquenessAttestation":"skipped","firmwareAttestation":"skipped","walletKeysAttestation":"skipped","cardKeyAttestation":"verifiedOffline"},"batchId":"0090","issuer":{"publicKey":"0437FCC00D189CC4E427A4662E32797A0CB2D5A68BA2638F6FA6C4A4C4E4FA7CA04F60D3A3BC176D2C5A043A7AB18CB069F3FE8D14FE6648FEAD4EEFF4BB491946","name":"XRPL LABS"}}, "ios": {"isAccessCodeSet":false,"linkedTerminalStatus":"none","cardPublicKey":"049258E7CE9B22AF339EDC88D49F28725371911F02F9CFA864429A26BE4131F89383D233D90F8AE88F42B9E7537F2237F6F2E3979156471363F8D0BB4B4F17E400","wallets":[{"index":0,"hasBackup":false,"derivedKeys":[],"publicKey":"045F608652134052BB7D78991FCC6CFC8D50E54AAF336D953999B6326F6E33889D799B03DB1C0AEC9DCA4AEFE2F60C959CF2F4EB62B281CA91C909E2EFC4C62C9A","curve":"secp256k1","remainingSignatures":999985,"settings":{"isPermanent":true},"totalSignedHashes":15}],"supportedCurves":["secp256k1"],"issuer":{"publicKey":"0437FCC00D189CC4E427A4662E32797A0CB2D5A68BA2638F6FA6C4A4C4E4FA7CA04F60D3A3BC176D2C5A043A7AB18CB069F3FE8D14FE6648FEAD4EEFF4BB491946","name":"XRPL LABS"},"isPasscodeSet":true,"settings":{"isHDWalletAllowed":false,"isSettingAccessCodeAllowed":false,"isBackupAllowed":false,"securityDelay":15000,"supportedEncryptionModes":["strong","fast","none"],"isSettingPasscodeAllowed":true,"isFilesAllowed":true,"isLinkedTerminalEnabled":false,"isResettingUserCodesAllowed":true,"maxWalletsCount":1},"firmwareVersion":{"type":"r","stringValue":"3.06r","major":3,"patch":0,"minor":6},"manufacturer":{"signature":"66552B3FF8B3C0A5F1DB8EEAC3E4D27134E4726C7C5DA69465C1AD999AB4B11FFE6D98124E120A9418B49F89D9A21FC416B8E7F49D994AF70025DAF3C2A5904A","manufactureDate":"2021-02-25","name":"TANGEM"},"cardId":"CB77000000037807","attestation":{"cardUniquenessAttestation":"skipped","firmwareAttestation":"skipped","walletKeysAttestation":"skipped","cardKeyAttestation":"verifiedOffline"},"batchId":"0090"}}, - "normalED": {"ios": {"isAccessCodeSet":false,"linkedTerminalStatus":"none","cardPublicKey":"04245D8307D762DE9BA1F28049F2022D9415C333986F105638F323AADD4DB79A941AADD2E953146F95A457DD0B8E5805DC3E7F3BE0EC5943223D6DE49461383041","wallets":[{"index":0,"hasBackup":false,"derivedKeys":[],"publicKey":"8E834BE3CD95FF38494B7C32A1394DDF3EC8278F83760B38FD9998FBB2978A96","curve":"ed25519","remainingSignatures":999996,"settings":{"isPermanent":false},"totalSignedHashes":4}],"supportedCurves":["ed25519"],"issuer":{"publicKey":"048196AA4B410AC44A3B9CCE18E7BE226AEA070ACC83A9CF67540FAC49AF25129F6A538A28AD6341358E3C4F9963064F7E365372A651D374E5C23CDD37FD099BF2","name":"TANGEM"},"isPasscodeSet":false,"settings":{"isHDWalletAllowed":false,"isSettingAccessCodeAllowed":false,"isBackupAllowed":false,"securityDelay":15000,"supportedEncryptionModes":["strong","fast","none"],"isSettingPasscodeAllowed":true,"isFilesAllowed":true,"isLinkedTerminalEnabled":true,"isResettingUserCodesAllowed":true,"maxWalletsCount":1},"firmwareVersion":{"type":"r","stringValue":"3.05r","major":3,"patch":0,"minor":5},"manufacturer":{"signature":"7A4650B7259BB48D1B78C76B4514FC0394BB180A57E43132119490605E2940A0BD38CD688F8852AB50E4B99109B0352CF8F7F5C3EFBBD5932B3EAD690077A723","manufactureDate":"2020-11-30","name":"TANGEM"},"cardId":"CB67999999990078","attestation":{"cardUniquenessAttestation":"skipped","firmwareAttestation":"skipped","walletKeysAttestation":"skipped","cardKeyAttestation":"verifiedOffline"},"batchId":"0080"}, "android": {"isAccessCodeSet":false,"isPasscodeSet":false,"settings":{"isHDWalletAllowed":false,"supportedEncryptionModes":["strong","fast","none"],"isBackupAllowed":false,"isLinkedTerminalEnabled":true,"maxWalletsCount":1,"isResettingUserCodesAllowed":true,"isSettingAccessCodeAllowed":false,"isFilesAllowed":true,"isSettingPasscodeAllowed":true,"securityDelay":15000},"firmwareVersion":{"type":"r","stringValue":"3.05r","minor":5,"patch":0,"major":3},"supportedCurves":["ed25519"],"linkedTerminalStatus":"none","wallets":[{"derivedKeys":{},"hasBackup":false,"index":0,"totalSignedHashes":4,"settings":{"isPermanent":false},"remainingSignatures":999996,"curve":"ed25519","publicKey":"8E834BE3CD95FF38494B7C32A1394DDF3EC8278F83760B38FD9998FBB2978A96"}],"cardPublicKey":"04245D8307D762DE9BA1F28049F2022D9415C333986F105638F323AADD4DB79A941AADD2E953146F95A457DD0B8E5805DC3E7F3BE0EC5943223D6DE49461383041","cardId":"CB67999999990078","manufacturer":{"signature":"7A4650B7259BB48D1B78C76B4514FC0394BB180A57E43132119490605E2940A0BD38CD688F8852AB50E4B99109B0352CF8F7F5C3EFBBD5932B3EAD690077A723","manufactureDate":"2020-11-30","name":"TANGEM"},"attestation":{"cardUniquenessAttestation":"skipped","firmwareAttestation":"skipped","walletKeysAttestation":"skipped","cardKeyAttestation":"verifiedOffline"},"batchId":"0080","issuer":{"publicKey":"048196AA4B410AC44A3B9CCE18E7BE226AEA070ACC83A9CF67540FAC49AF25129F6A538A28AD6341358E3C4F9963064F7E365372A651D374E5C23CDD37FD099BF2","name":"TANGEM"}} } -} \ No newline at end of file + "multiCurrency": { + "android": { + "backupStatus": "noBackup", + "isAccessCodeSet": false, + "isPasscodeSet": false, + "settings": { + "isHDWalletAllowed": true, + "supportedEncryptionModes": [ + "strong", + "fast", + "none" + ], + "isBackupAllowed": true, + "isLinkedTerminalEnabled": true, + "maxWalletsCount": 20, + "isResettingUserCodesAllowed": true, + "isSettingAccessCodeAllowed": false, + "isFilesAllowed": true, + "isSettingPasscodeAllowed": false, + "securityDelay": 15000 + }, + "firmwareVersion": { + "type": "r", + "stringValue": "4.46r", + "minor": 46, + "patch": 0, + "major": 4 + }, + "supportedCurves": [ + "secp256k1", + "secp256r1", + "ed25519" + ], + "linkedTerminalStatus": "none", + "wallets": [ + { + "derivedKeys": { + "{\"rawPath\":\"m/44'/144'/0'/0/0\",\"nodes\":[2147483692,2147483792,2147483648,0,0]}": { + "chainCode": "46426409F857AC12AD537F5A348FFDB2C65358587A4EBDD8E3A88C11DF37B3F3", + "publicKey": "03C105B85FEEA5DFA880CDD0973A40A48DFD71CFB1304F9666B33CDF3A0895ADE6" + } + }, + "hasBackup": false, + "index": 0, + "totalSignedHashes": 15, + "settings": { + "isPermanent": false + }, + "publicKey": "0326AC2CCC0D1999DD12104E0A99433EB45C8F51652354F1B52637C2A23C188E2F", + "curve": "secp256k1", + "extendedPublicKey": { + "chainCode": "AFD6246F6635C534F4E61385B31BCD6464E3726A7F9BFFF2CB82AA1FB9EA94BF", + "publicKey": "0326AC2CCC0D1999DD12104E0A99433EB45C8F51652354F1B52637C2A23C188E2F" + }, + "chainCode": "AFD6246F6635C534F4E61385B31BCD6464E3726A7F9BFFF2CB82AA1FB9EA94BF" + } + ], + "cardPublicKey": "028097892AE47AB427FC02A83C51649208AB7658EA0A2997D42733707F7CA2D72C", + "cardId": "AC01000000045622", + "manufacturer": { + "signature": "C79C7D377BCE893C042462EA5FBD2E851FD8569932689507D9D3E8203A88CDBC64D7B8295B825201F3B3BA99F675DF7827F35526DAC4B33B6DB782AAA5697DD8", + "manufactureDate": "2021-10-01", + "name": "TANGEM" + }, + "attestation": { + "cardUniquenessAttestation": "skipped", + "firmwareAttestation": "skipped", + "walletKeysAttestation": "skipped", + "cardKeyAttestation": "verifiedOffline" + }, + "batchId": "AC01", + "issuer": { + "publicKey": "0356E7C3376329DFAE7388DF1695670386103C92486A87644FA9E512C9CF4E92FE", + "name": "TANGEM AG" + } + }, + "ios": { + "isAccessCodeSet": false, + "supportedCurves": [ + "secp256k1", + "ed25519", + "secp256r1" + ], + "cardPublicKey": "028097892AE47AB427FC02A83C51649208AB7658EA0A2997D42733707F7CA2D72C", + "wallets": [ + { + "chainCode": "AFD6246F6635C534F4E61385B31BCD6464E3726A7F9BFFF2CB82AA1FB9EA94BF", + "publicKey": "0326AC2CCC0D1999DD12104E0A99433EB45C8F51652354F1B52637C2A23C188E2F", + "curve": "secp256k1", + "index": 0, + "derivedKeys": [ + "m/44'/144'/0'/0/0", + { + "chainCode": "46426409F857AC12AD537F5A348FFDB2C65358587A4EBDD8E3A88C11DF37B3F3", + "publicKey": "03C105B85FEEA5DFA880CDD0973A40A48DFD71CFB1304F9666B33CDF3A0895ADE6" + } + ], + "hasBackup": false, + "settings": { + "isPermanent": false + }, + "totalSignedHashes": 15 + } + ], + "linkedTerminalStatus": "none", + "backupStatus": { + "status": "noBackup" + }, + "issuer": { + "publicKey": "0356E7C3376329DFAE7388DF1695670386103C92486A87644FA9E512C9CF4E92FE", + "name": "TANGEM AG" + }, + "isPasscodeSet": false, + "settings": { + "isHDWalletAllowed": true, + "isSettingAccessCodeAllowed": false, + "isBackupAllowed": true, + "securityDelay": 15000, + "supportedEncryptionModes": [ + "strong", + "fast", + "none" + ], + "isSettingPasscodeAllowed": false, + "isFilesAllowed": true, + "isLinkedTerminalEnabled": true, + "isResettingUserCodesAllowed": true, + "maxWalletsCount": 20 + }, + "firmwareVersion": { + "type": "r", + "stringValue": "4.46r", + "major": 4, + "patch": 0, + "minor": 46 + }, + "batchId": "AC01", + "attestation": { + "cardUniquenessAttestation": "skipped", + "firmwareAttestation": "skipped", + "walletKeysAttestation": "skipped", + "cardKeyAttestation": "verified" + }, + "manufacturer": { + "signature": "C79C7D377BCE893C042462EA5FBD2E851FD8569932689507D9D3E8203A88CDBC64D7B8295B825201F3B3BA99F675DF7827F35526DAC4B33B6DB782AAA5697DD8", + "manufactureDate": "2021-10-01", + "name": "TANGEM" + }, + "cardId": "AC01000000045622" + } + }, + "normalSecp": { + "android": { + "isAccessCodeSet": false, + "isPasscodeSet": true, + "settings": { + "isHDWalletAllowed": false, + "supportedEncryptionModes": [ + "strong", + "fast", + "none" + ], + "isBackupAllowed": false, + "isLinkedTerminalEnabled": false, + "maxWalletsCount": 1, + "isResettingUserCodesAllowed": true, + "isSettingAccessCodeAllowed": false, + "isFilesAllowed": true, + "isSettingPasscodeAllowed": true, + "securityDelay": 15000 + }, + "firmwareVersion": { + "type": "r", + "stringValue": "3.06r", + "minor": 6, + "patch": 0, + "major": 3 + }, + "supportedCurves": [ + "secp256k1" + ], + "linkedTerminalStatus": "none", + "wallets": [ + { + "derivedKeys": {}, + "hasBackup": false, + "index": 0, + "totalSignedHashes": 15, + "settings": { + "isPermanent": true + }, + "remainingSignatures": 999985, + "curve": "secp256k1", + "publicKey": "045F608652134052BB7D78991FCC6CFC8D50E54AAF336D953999B6326F6E33889D799B03DB1C0AEC9DCA4AEFE2F60C959CF2F4EB62B281CA91C909E2EFC4C62C9A" + } + ], + "cardPublicKey": "049258E7CE9B22AF339EDC88D49F28725371911F02F9CFA864429A26BE4131F89383D233D90F8AE88F42B9E7537F2237F6F2E3979156471363F8D0BB4B4F17E400", + "cardId": "CB77000000037807", + "manufacturer": { + "signature": "66552B3FF8B3C0A5F1DB8EEAC3E4D27134E4726C7C5DA69465C1AD999AB4B11FFE6D98124E120A9418B49F89D9A21FC416B8E7F49D994AF70025DAF3C2A5904A", + "manufactureDate": "2021-02-25", + "name": "TANGEM" + }, + "attestation": { + "cardUniquenessAttestation": "skipped", + "firmwareAttestation": "skipped", + "walletKeysAttestation": "skipped", + "cardKeyAttestation": "verifiedOffline" + }, + "batchId": "0090", + "issuer": { + "publicKey": "0437FCC00D189CC4E427A4662E32797A0CB2D5A68BA2638F6FA6C4A4C4E4FA7CA04F60D3A3BC176D2C5A043A7AB18CB069F3FE8D14FE6648FEAD4EEFF4BB491946", + "name": "XRPL LABS" + } + }, + "ios": { + "isAccessCodeSet": false, + "linkedTerminalStatus": "none", + "cardPublicKey": "049258E7CE9B22AF339EDC88D49F28725371911F02F9CFA864429A26BE4131F89383D233D90F8AE88F42B9E7537F2237F6F2E3979156471363F8D0BB4B4F17E400", + "wallets": [ + { + "index": 0, + "hasBackup": false, + "derivedKeys": [], + "publicKey": "045F608652134052BB7D78991FCC6CFC8D50E54AAF336D953999B6326F6E33889D799B03DB1C0AEC9DCA4AEFE2F60C959CF2F4EB62B281CA91C909E2EFC4C62C9A", + "curve": "secp256k1", + "remainingSignatures": 999985, + "settings": { + "isPermanent": true + }, + "totalSignedHashes": 15 + } + ], + "supportedCurves": [ + "secp256k1" + ], + "issuer": { + "publicKey": "0437FCC00D189CC4E427A4662E32797A0CB2D5A68BA2638F6FA6C4A4C4E4FA7CA04F60D3A3BC176D2C5A043A7AB18CB069F3FE8D14FE6648FEAD4EEFF4BB491946", + "name": "XRPL LABS" + }, + "isPasscodeSet": true, + "settings": { + "isHDWalletAllowed": false, + "isSettingAccessCodeAllowed": false, + "isBackupAllowed": false, + "securityDelay": 15000, + "supportedEncryptionModes": [ + "strong", + "fast", + "none" + ], + "isSettingPasscodeAllowed": true, + "isFilesAllowed": true, + "isLinkedTerminalEnabled": false, + "isResettingUserCodesAllowed": true, + "maxWalletsCount": 1 + }, + "firmwareVersion": { + "type": "r", + "stringValue": "3.06r", + "major": 3, + "patch": 0, + "minor": 6 + }, + "manufacturer": { + "signature": "66552B3FF8B3C0A5F1DB8EEAC3E4D27134E4726C7C5DA69465C1AD999AB4B11FFE6D98124E120A9418B49F89D9A21FC416B8E7F49D994AF70025DAF3C2A5904A", + "manufactureDate": "2021-02-25", + "name": "TANGEM" + }, + "cardId": "CB77000000037807", + "attestation": { + "cardUniquenessAttestation": "skipped", + "firmwareAttestation": "skipped", + "walletKeysAttestation": "skipped", + "cardKeyAttestation": "verifiedOffline" + }, + "batchId": "0090" + } + }, + "normalED": { + "ios": { + "isAccessCodeSet": false, + "linkedTerminalStatus": "none", + "cardPublicKey": "04245D8307D762DE9BA1F28049F2022D9415C333986F105638F323AADD4DB79A941AADD2E953146F95A457DD0B8E5805DC3E7F3BE0EC5943223D6DE49461383041", + "wallets": [ + { + "index": 0, + "hasBackup": false, + "derivedKeys": [], + "publicKey": "8E834BE3CD95FF38494B7C32A1394DDF3EC8278F83760B38FD9998FBB2978A96", + "curve": "ed25519", + "remainingSignatures": 999996, + "settings": { + "isPermanent": false + }, + "totalSignedHashes": 4 + } + ], + "supportedCurves": [ + "ed25519" + ], + "issuer": { + "publicKey": "048196AA4B410AC44A3B9CCE18E7BE226AEA070ACC83A9CF67540FAC49AF25129F6A538A28AD6341358E3C4F9963064F7E365372A651D374E5C23CDD37FD099BF2", + "name": "TANGEM" + }, + "isPasscodeSet": false, + "settings": { + "isHDWalletAllowed": false, + "isSettingAccessCodeAllowed": false, + "isBackupAllowed": false, + "securityDelay": 15000, + "supportedEncryptionModes": [ + "strong", + "fast", + "none" + ], + "isSettingPasscodeAllowed": true, + "isFilesAllowed": true, + "isLinkedTerminalEnabled": true, + "isResettingUserCodesAllowed": true, + "maxWalletsCount": 1 + }, + "firmwareVersion": { + "type": "r", + "stringValue": "3.05r", + "major": 3, + "patch": 0, + "minor": 5 + }, + "manufacturer": { + "signature": "7A4650B7259BB48D1B78C76B4514FC0394BB180A57E43132119490605E2940A0BD38CD688F8852AB50E4B99109B0352CF8F7F5C3EFBBD5932B3EAD690077A723", + "manufactureDate": "2020-11-30", + "name": "TANGEM" + }, + "cardId": "CB67999999990078", + "attestation": { + "cardUniquenessAttestation": "skipped", + "firmwareAttestation": "skipped", + "walletKeysAttestation": "skipped", + "cardKeyAttestation": "verifiedOffline" + }, + "batchId": "0080" + }, + "android": { + "isAccessCodeSet": false, + "isPasscodeSet": false, + "settings": { + "isHDWalletAllowed": false, + "supportedEncryptionModes": [ + "strong", + "fast", + "none" + ], + "isBackupAllowed": false, + "isLinkedTerminalEnabled": true, + "maxWalletsCount": 1, + "isResettingUserCodesAllowed": true, + "isSettingAccessCodeAllowed": false, + "isFilesAllowed": true, + "isSettingPasscodeAllowed": true, + "securityDelay": 15000 + }, + "firmwareVersion": { + "type": "r", + "stringValue": "3.05r", + "minor": 5, + "patch": 0, + "major": 3 + }, + "supportedCurves": [ + "ed25519" + ], + "linkedTerminalStatus": "none", + "wallets": [ + { + "derivedKeys": {}, + "hasBackup": false, + "index": 0, + "totalSignedHashes": 4, + "settings": { + "isPermanent": false + }, + "remainingSignatures": 999996, + "curve": "ed25519", + "publicKey": "8E834BE3CD95FF38494B7C32A1394DDF3EC8278F83760B38FD9998FBB2978A96" + } + ], + "cardPublicKey": "04245D8307D762DE9BA1F28049F2022D9415C333986F105638F323AADD4DB79A941AADD2E953146F95A457DD0B8E5805DC3E7F3BE0EC5943223D6DE49461383041", + "cardId": "CB67999999990078", + "manufacturer": { + "signature": "7A4650B7259BB48D1B78C76B4514FC0394BB180A57E43132119490605E2940A0BD38CD688F8852AB50E4B99109B0352CF8F7F5C3EFBBD5932B3EAD690077A723", + "manufactureDate": "2020-11-30", + "name": "TANGEM" + }, + "attestation": { + "cardUniquenessAttestation": "skipped", + "firmwareAttestation": "skipped", + "walletKeysAttestation": "skipped", + "cardKeyAttestation": "verifiedOffline" + }, + "batchId": "0080", + "issuer": { + "publicKey": "048196AA4B410AC44A3B9CCE18E7BE226AEA070ACC83A9CF67540FAC49AF25129F6A538A28AD6341358E3C4F9963064F7E365372A651D374E5C23CDD37FD099BF2", + "name": "TANGEM" + } + } + } +} diff --git a/src/common/utils/__tests__/string.test.ts b/src/common/utils/__tests__/string.test.ts index 2efaa499e..b8a8b18d3 100644 --- a/src/common/utils/__tests__/string.test.ts +++ b/src/common/utils/__tests__/string.test.ts @@ -89,6 +89,7 @@ describe('Utils.String', () => { // @ts-ignore expect(StringTypeCheck.isValidURL({ someting: true })).toBe(false); expect(StringTypeCheck.isValidURL(undefined)).toBe(false); + expect(StringTypeCheck.isValidURL(null)).toBe(false); expect(StringTypeCheck.isValidURL('')).toBe(false); for (let i = 0; i < validUrls.length; i++) { @@ -107,6 +108,7 @@ describe('Utils.String', () => { // @ts-ignore expect(StringTypeCheck.isValidAmount({ someting: true })).toBe(false); expect(StringTypeCheck.isValidAmount(undefined)).toBe(false); + expect(StringTypeCheck.isValidAmount(null)).toBe(false); expect(StringTypeCheck.isValidAmount('')).toBe(false); for (let i = 0; i < validAmounts.length; i++) { @@ -122,6 +124,8 @@ describe('Utils.String', () => { // @ts-ignore expect(StringTypeCheck.isValidHash({ someting: true })).toBe(false); expect(StringTypeCheck.isValidHash(undefined)).toBe(false); + expect(StringTypeCheck.isValidHash(null)).toBe(false); + expect(StringTypeCheck.isValidHash('')).toBe(false); expect( StringTypeCheck.isValidHash('1CE80FF3298223CDF8BE80BF007A857F24C09843FCA24359DFA3E035D5C021889'), ).toBe(false); @@ -137,9 +141,23 @@ describe('Utils.String', () => { // @ts-ignore expect(StringTypeCheck.isValidXAppIdentifier({ someting: true })).toBe(false); expect(StringTypeCheck.isValidXAppIdentifier(undefined)).toBe(false); + expect(StringTypeCheck.isValidXAppIdentifier(null)).toBe(false); + expect(StringTypeCheck.isValidXAppIdentifier('')).toBe(false); expect(StringTypeCheck.isValidXAppIdentifier('something.@test')).toBe(false); expect(StringTypeCheck.isValidXAppIdentifier('somethings_.test/')).toBe(false); expect(StringTypeCheck.isValidXAppIdentifier('xumm.app_TEST28-z_identifier')).toBe(true); }); + + it('should check if string is valid destination tag', () => { + expect(StringTypeCheck.isValidDestinationTag('42')).toBe(true); + expect(StringTypeCheck.isValidDestinationTag('0')).toBe(true); + expect(StringTypeCheck.isValidDestinationTag('4294967297')).toBe(false); // 2^32 + 1 + expect(StringTypeCheck.isValidDestinationTag('4294967296')).toBe(true); // 2^32 + expect(StringTypeCheck.isValidDestinationTag('')).toBe(false); + expect(StringTypeCheck.isValidDestinationTag('-5')).toBe(false); + expect(StringTypeCheck.isValidDestinationTag('3.14')).toBe(false); + expect(StringTypeCheck.isValidDestinationTag(' 42 ')).toBe(false); + expect(StringTypeCheck.isValidDestinationTag('4 2')).toBe(false); + }); }); }); diff --git a/src/common/utils/amount.ts b/src/common/utils/amount.ts index 76767bf41..5552fba8f 100644 --- a/src/common/utils/amount.ts +++ b/src/common/utils/amount.ts @@ -1,77 +1,8 @@ import BigNumber from 'bignumber.js'; -import { HexEncoding } from './string'; +import NetworkService from '@services/NetworkService'; -/** - * Convert XRPL value to NFT value - * @param value number - * @returns number in NFT value or false if XRPL value is not NFT - */ -const XRPLValueToNFT = (value: number | string): number | boolean => { - const data = String(Number(value)).split(/e/i); - - const finish = (returnValue: string) => { - const unsignedReturnValue = returnValue.replace(/^-/, ''); - if (unsignedReturnValue.length > 83) { - // Too many tokens to be NFT-like as per XLS14d proposal - return false; - } - if (data.length > 1 && unsignedReturnValue.slice(0, 2) === '0.' && Number(data[1]) < -70) { - // Positive below zero amount, could be NFT - return ( - // eslint-disable-next-line @typescript-eslint/no-use-before-define - (sign === '-' ? -1 : 1) * - Number((unsignedReturnValue.slice(2) + '0'.repeat(83 - unsignedReturnValue.length)).replace(/^0+/, '')) - ); - } - return false; - }; - - if (data.length === 1) { - // Regular (non-exponent) - return false; - } - - let z = ''; - const sign = value < 0 ? '-' : ''; - const str = data[0].replace('.', ''); - let mag = Number(data[1]) + 1; - - if (mag < 0) { - z = `${sign}0.`; - while (mag++) { - z += '0'; - } - return finish(z + str.replace(/^-/, '')); - } - mag -= str.length; - - while (mag--) { - z += '0'; - } - return finish(str + z); -}; - -/** - * Convert NFT value to XRPL value - * @param value string - * @param balance number XRPL string notation, optional, if intention to force NFT check - * @returns string in XRPL value - */ -const NFTValueToXRPL = (value: string, balance?: number): string => { - const unsignedValue = String(value).replace(/^-/, ''); - const sign = unsignedValue.length < String(value).length ? '-' : ''; - - // accountBalance: xrpl string notation, optional, if intention to force NFT check - if (typeof balance !== 'undefined' && XRPLValueToNFT(balance) === false) { - throw new Error('Source balance is not NFT-like'); - } - if (!unsignedValue.match(/^[0-9]+$/)) { - throw new Error('Only non-float & non-scientific notation values accepted'); - } - - return `${sign}0.${'0'.repeat(81 - unsignedValue.length)}${unsignedValue}`; -}; +import { HexEncoding } from './string'; /** * normalize value to IOU value @@ -102,14 +33,10 @@ const ValueToIOU = (value: string): string => { /** * normalize amount - * @returns string 1333.855222 + * @returns number normalized value of amount * @param amount */ const NormalizeAmount = (amount: number | string): number => { - const nftValue = XRPLValueToNFT(amount); - if (nftValue) { - return Number(nftValue); - } return new BigNumber(amount).decimalPlaces(8).toNumber(); }; @@ -121,14 +48,14 @@ const NormalizeAmount = (amount: number | string): number => { const NormalizeCurrencyCode = (currencyCode: string): string => { if (!currencyCode || typeof currencyCode !== 'string') return ''; - // Native XRP - if (currencyCode === 'XRP') { + // Native currency + if (currencyCode === NetworkService.getNativeAsset()) { return currencyCode; } - // IOU claims as XRP which consider as fake XRP - if (currencyCode.toLowerCase() === 'xrp') { - return 'FakeXRP'; + // IOU claims as native currency which consider as fake + if (currencyCode.toLowerCase() === NetworkService.getNativeAsset().toLowerCase()) { + return `Fake${NetworkService.getNativeAsset()}`; } // IOU @@ -152,9 +79,9 @@ const NormalizeCurrencyCode = (currencyCode: string): string => { // cleanup break lines and null bytes const clean = decoded.replace(/\0/g, '').replace(/(\r\n|\n|\r)/gm, ' '); - // check if decoded contains xrp - if (clean.toLowerCase().trim() === 'xrp') { - return 'FakeXRP'; + // check if decoded contains native currency + if (clean.toLowerCase().trim() === NetworkService.getNativeAsset().toLowerCase()) { + return `Fake${NetworkService.getNativeAsset()}`; } return clean; } @@ -167,4 +94,4 @@ const NormalizeCurrencyCode = (currencyCode: string): string => { }; /* Export ==================================================================== */ -export { NormalizeAmount, NormalizeCurrencyCode, XRPLValueToNFT, NFTValueToXRPL, ValueToIOU }; +export { NormalizeAmount, NormalizeCurrencyCode, ValueToIOU }; diff --git a/src/common/utils/balance.ts b/src/common/utils/balance.ts index fa014bd17..cfb978517 100644 --- a/src/common/utils/balance.ts +++ b/src/common/utils/balance.ts @@ -1,19 +1,19 @@ import BigNumber from 'bignumber.js'; -import LedgerService from '@services/LedgerService'; +import NetworkService from '@services/NetworkService'; -import { AccountSchema } from '@store/schemas/latest'; +import { AccountModel } from '@store/models'; /** * calculate account available balance base on base/owner reserve */ -const CalculateAvailableBalance = (account: AccountSchema, allowNegative = false): number => { +const CalculateAvailableBalance = (account: AccountModel, allowNegative = false): number => { // account is not activated if (account.balance === 0) { return 0; } - const { BaseReserve, OwnerReserve } = LedgerService.getNetworkReserve(); + const { BaseReserve, OwnerReserve } = NetworkService.getNetworkReserve(); // calculate the spendable amount const spendable = account.balance - BaseReserve - account.ownerCount * OwnerReserve; @@ -28,15 +28,15 @@ const CalculateAvailableBalance = (account: AccountSchema, allowNegative = false }; /** - * get account total reserve in XRP + * get account total reserve in native currency */ -const CalculateTotalReserve = (account: AccountSchema): number => { +const CalculateTotalReserve = (account: AccountModel): number => { // account is not activated if (account.balance === 0) { return 0; } - const { BaseReserve, OwnerReserve } = LedgerService.getNetworkReserve(); + const { BaseReserve, OwnerReserve } = NetworkService.getNetworkReserve(); // calculate the spendable amount return account.ownerCount * OwnerReserve + BaseReserve; }; diff --git a/src/common/utils/codec.ts b/src/common/utils/codec.ts index 6f020a642..8c46fc83c 100644 --- a/src/common/utils/codec.ts +++ b/src/common/utils/codec.ts @@ -46,7 +46,15 @@ const EncodeNFTokenID = ( tokenTaxon: number, ): string => { const issuer = decodeAccountID(account); - const cipheredTaxon = tokenTaxon ^ (384160001 * tokenSequence + 2459); + + const unscrambleTaxon = new BigNumber(384160001) + .multipliedBy(tokenSequence) + .modulo(4294967296) + .plus(2459) + .modulo(4294967296) + .toNumber(); + + const cipheredTaxon = (tokenTaxon ^ unscrambleTaxon) >>> 0; const tokenID = Buffer.concat([ Buffer.from([(flags >> 8) & 0xff, flags & 0xff]), @@ -86,7 +94,11 @@ const DecodeNFTokenID = (nfTokenID: string) => { const scrambledTaxon = new BigNumber(nfTokenID.substring(48, 56), 16).toNumber(); const sequence = new BigNumber(nfTokenID.substring(56, 64), 16).toNumber(); - const taxon = (scrambledTaxon ^ (384160001 * sequence + 2459)) % 4294967296; + const unscrambleTaxon = new BigNumber(384160001).multipliedBy(sequence).modulo(4294967296).plus(2459).toNumber(); + + const cipheredTaxon = (scrambledTaxon ^ unscrambleTaxon) >>> 0; + + const taxon = new BigNumber(cipheredTaxon).modulo(4294967296).toNumber(); return { NFTokenID: nfTokenID, @@ -98,6 +110,41 @@ const DecodeNFTokenID = (nfTokenID: string) => { }; }; +/** + * Encode CTID + * @param ledgerSeq number + * @param txnIndex number + * @param networkId number + * @returns encoded CTID + */ +const EncodeCTID = (ledgerSeq: number, txnIndex: number, networkId: number): string => { + if (typeof ledgerSeq !== 'number') { + throw new Error('ledgerSeq must be a number.'); + } + if (ledgerSeq > 0xfffffff || ledgerSeq < 0) { + throw new Error('ledgerSeq must not be greater than 268435455 or less than 0.'); + } + + if (typeof txnIndex !== 'number') { + throw new Error('txnIndex must be a number.'); + } + if (txnIndex > 0xffff || txnIndex < 0) { + throw new Error('txnIndex must not be greater than 65535 or less than 0.'); + } + + if (typeof networkId !== 'number') { + throw new Error('networkId must be a number.'); + } + if (networkId > 0xffff || networkId < 0) { + throw new Error('networkId must not be greater than 65535 or less than 0.'); + } + + // @ts-ignore + return (((BigInt(0xc0000000) + BigInt(ledgerSeq)) << 32n) + (BigInt(txnIndex) << 16n) + BigInt(networkId)) + .toString(16) + .toUpperCase(); +}; + /** * Convert seed/address to another alphabet * @param value string @@ -158,4 +205,5 @@ export { EncodeNFTokenID, DecodeNFTokenID, DecodeAccountId, + EncodeCTID, }; diff --git a/src/common/utils/color.ts b/src/common/utils/color.ts index 0f99814bd..69283787f 100644 --- a/src/common/utils/color.ts +++ b/src/common/utils/color.ts @@ -30,8 +30,31 @@ const HexToRgbA = (hex: string, opacity: number) => { // @ts-ignore return `rgba(${[(c >> 16) & 255, (c >> 8) & 255, c & 255].join(',')},${opacity})`; } - throw new Error('Bad Hex'); + throw new Error(`HexToRgbA: ${hex} is not a valid hex value!`); +}; + +const TextContrast = (hex: string): string => { + if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)) { + const hexColor = hex.replace('#', ''); + // convert hex to rgb + const rgb = [] as number[]; + const bigint = parseInt(hexColor, 16); + rgb[0] = (bigint >> 16) & 255; + rgb[1] = (bigint >> 8) & 255; + rgb[2] = bigint & 255; + + const brightness = Math.round( + (parseInt(String(rgb[0]), 10) * 299 + + parseInt(String(rgb[1]), 10) * 587 + + parseInt(String(rgb[2]), 10) * 114) / + 1000, + ); + + return brightness > 125 ? 'dark' : 'light'; + } + + throw new Error(`TextContrast: ${hex} is not a valid hex value!`); }; /* Export ==================================================================== */ -export { ColorLuminance, HexToRgbA }; +export { ColorLuminance, HexToRgbA, TextContrast }; diff --git a/src/common/utils/date.ts b/src/common/utils/date.ts index 0f79f3467..e61519fed 100644 --- a/src/common/utils/date.ts +++ b/src/common/utils/date.ts @@ -9,5 +9,14 @@ const FormatDate = (date: string): string => { return moment(date).format('lll'); }; +/** + * format the date + * @param date + * @returns string 22:30:00 + */ +const FormatTime = (time: string): string => { + return moment(time).format('LTS'); +}; + /* Export ==================================================================== */ -export { FormatDate }; +export { FormatDate, FormatTime }; diff --git a/src/common/utils/explorer.ts b/src/common/utils/explorer.ts index 8efa15174..fb2a54581 100644 --- a/src/common/utils/explorer.ts +++ b/src/common/utils/explorer.ts @@ -1,63 +1,13 @@ -import { get, find } from 'lodash'; - +import NetworkService from '@services/NetworkService'; import { AppConfig } from '@common/constants'; -import { CoreRepository, CustomNodeRepository } from '@store/repositories'; - -import SocketService from '@services/SocketService'; - -import { NodeChain } from '@store/types'; - -export type ExplorerDetails = { - title: string; - tx: string; - account: string; -}; - -const GetExplorer = (): ExplorerDetails => { - const connectedChain = SocketService.chain; - const connectedNode = SocketService.node; - - // if connected to custom node - if (connectedChain === NodeChain.Custom) { - return CustomNodeRepository.getNodeExplorer(connectedNode); - } - - const coreSettings = CoreRepository.getSettings(); - - // main,test,dev - const net = connectedChain.replace('net', '').toLowerCase(); - - // get explorer object - let explorer = find(AppConfig.explorer, { value: coreSettings.defaultExplorer }); - - // if no explorer found then fallback to bithomp - if (!explorer) { - explorer = find(AppConfig.explorer, { value: AppConfig.fallbackExplorer }); - } - - return { - title: get(explorer, 'title', 'Explorer'), - tx: get(explorer.tx, net, '#'), - account: get(explorer.account, net, '#'), - }; -}; - -const GetTransactionLink = (hash: string, explorer?: ExplorerDetails) => { - if (!explorer) { - explorer = GetExplorer(); - } - const { tx } = explorer; - return `${tx || '#'}${hash}`; +const GetTransactionLink = (ctid: string): string => { + return `${AppConfig.explorerProxy}/${NetworkService.getNetworkId()}/${ctid}`; }; -const GetAccountLink = (address: string, explorer?: ExplorerDetails) => { - if (!explorer) { - explorer = GetExplorer(); - } - const { account } = explorer; - return `${account || '#'}${address}`; +const GetAccountLink = (address: string): string => { + return `${AppConfig.explorerProxy}/${NetworkService.getNetworkId()}/${address}`; }; /* Export ==================================================================== */ -export { GetExplorer, GetAccountLink, GetTransactionLink }; +export { GetAccountLink, GetTransactionLink }; diff --git a/src/common/utils/fee.ts b/src/common/utils/fee.ts new file mode 100644 index 000000000..8a36721b0 --- /dev/null +++ b/src/common/utils/fee.ts @@ -0,0 +1,113 @@ +import BigNumber from 'bignumber.js'; + +import { sign, derive, XrplDefinitions } from 'xrpl-accountlib'; + +/** + * Prepare transaction for getting hook tx fee + * @param txJson + * @param definitions + * @returns string + */ +const PrepareTxForHookFee = (txJson: any, definitions: any): string => { + if (!txJson || typeof txJson !== 'object') { + throw new Error('PrepareTxForHookFee requires a json transaction to calculate the fee for'); + } + + // normalize the transaction + // Fee and SigningPubKey should be empty + const transaction = { + ...txJson, + Fee: '0', + SigningPubKey: '', + }; + + // check if we need to populate the transaction with dummy details + // set the Sequence if not set + if (!Object.prototype.hasOwnProperty.call(txJson, 'Sequence')) { + Object.assign(transaction, { + Sequence: 0, + }); + } + + // Payment payloads can have no amount set + if (txJson.TransactionType === 'Payment' && !txJson.Amount) { + Object.assign(transaction, { + Amount: '0', + }); + } + + // set the definitions if exist + let xrplDefinitions; + if (typeof definitions === 'object') { + xrplDefinitions = new XrplDefinitions(definitions); + } + + // sign the transaction with a dummy account + return sign(transaction, derive.passphrase(''), xrplDefinitions).signedTransaction; +}; + +/** + * Calculate the available fees base on current network fee data set + * @param feeDataSet + * @returns object + */ +const NormalizeFeeDataSet = (feeDataSet: { + drops: { base_fee: number }; + fee_hooks_feeunits: number; +}): { + availableFees: { + type: 'LOW' | 'MEDIUM' | 'HIGH'; + value: string; + }[]; + feeHooks: number; + suggested: 'LOW'; +} => { + if (!feeDataSet || typeof feeDataSet !== 'object') { + throw new Error('NormalizeFeeDataSet required a valid fee data set!'); + } + const { drops: { base_fee } = { base_fee: 12 }, fee_hooks_feeunits = 0 } = feeDataSet; + + const baseFee = BigNumber.maximum(12, base_fee); + const feeHooks = BigNumber.maximum(new BigNumber(fee_hooks_feeunits).minus(baseFee), 0).toNumber(); + + const feeCalc = (level: number) => { + let nearest = new BigNumber(1); + let multiplier = new BigNumber(100); + + if (level > 0) { + nearest = new BigNumber(0.5).multipliedBy(10 ** (baseFee.toString(10).length - 1)); + multiplier = new BigNumber(100).plus( + level ** new BigNumber(2.1).minus(baseFee.multipliedBy(0.000005)).toNumber(), + ); + } + + return baseFee + .dividedBy(100) + .multipliedBy(multiplier) + .dividedBy(nearest) + .integerValue(BigNumber.ROUND_CEIL) + .multipliedBy(nearest) + .toFixed(0, BigNumber.ROUND_UP); + }; + + return { + availableFees: [ + { + type: 'LOW', + value: feeCalc(0), + }, + { + type: 'MEDIUM', + value: feeCalc(4), + }, + { + type: 'HIGH', + value: feeCalc(8), + }, + ], + feeHooks, + suggested: 'LOW', + }; +}; + +export { NormalizeFeeDataSet, PrepareTxForHookFee }; diff --git a/src/common/utils/string.ts b/src/common/utils/string.ts index 2fb85855f..e72da6b2f 100644 --- a/src/common/utils/string.ts +++ b/src/common/utils/string.ts @@ -60,22 +60,22 @@ const HexEncoding = { /** * Truncate string * @param fullString string - * @param string_length number expected output length + * @param stringLength number expected output length * @returns stringTruncate text ABC...EFG */ -const Truncate = (fullString: string, string_length: number): string => { - if (fullString.length <= string_length) { +const Truncate = (fullString: string, stringLength: number): string => { + if (fullString.length <= stringLength) { return fullString; } const separator = '...'; - const separator_length = separator.length; - const charsToShow = string_length - separator_length; + const separatorLength = separator.length; + const charsToShow = stringLength - separatorLength; const frontChars = Math.ceil(charsToShow / 2); const backChars = Math.floor(charsToShow / 2); - return fullString.substr(0, frontChars) + separator + fullString.substr(fullString.length - backChars); + return fullString.substring(0, frontChars) + separator + fullString.substring(fullString.length - backChars); }; /** @@ -147,6 +147,20 @@ const StringTypeCheck = { const identifier = new RegExp('^[A-Z0-9._-]+$', 'i'); return identifier.test(input); }, + + isValidDestinationTag: (input: string): boolean => { + if (typeof input !== 'string') { + return false; + } + + // not a valid number + if (!input.match(/^[+-]?\d+(?:[.]*\d*(?:[eE][+-]?\d+)?)?$/)) { + return false; + } + + // valid positive 32 bits integer integer + return !(input === '' || Number(input) > 2 ** 32 || Number(input) < 0 || input.includes('.')); + }, }; /** diff --git a/src/components/General/ActionPanel/ActionPanel.tsx b/src/components/General/ActionPanel/ActionPanel.tsx index 1151d5536..539e17d4c 100644 --- a/src/components/General/ActionPanel/ActionPanel.tsx +++ b/src/components/General/ActionPanel/ActionPanel.tsx @@ -11,8 +11,7 @@ import { AppStyles, AppSizes } from '@theme'; import styles from './styles'; /* types ==================================================================== */ -interface Props { - children: React.ReactNode; +interface Props extends React.PropsWithChildren { height: number; offset?: number; extraBottomInset?: boolean; diff --git a/src/components/General/AmountInput/AmountInput.tsx b/src/components/General/AmountInput/AmountInput.tsx index 5e1d1119c..cf6b67fe8 100644 --- a/src/components/General/AmountInput/AmountInput.tsx +++ b/src/components/General/AmountInput/AmountInput.tsx @@ -12,7 +12,7 @@ import Localize from '@locale'; /* Types ==================================================================== */ export enum AmountValueType { - XRP = 'XRP', + Native = 'Native', IOU = 'IOU', } @@ -34,7 +34,7 @@ interface State { value: string; } /* Constants ==================================================================== */ -const MAX_XRP_DECIMAL_PLACES = 6; +const MAX_NATIVE_DECIMAL_PLACES = 6; const MAX_IOU_DECIMAL_PLACES = 8; const MAX_IOU_PRECISION = 16; @@ -42,7 +42,7 @@ const MAX_IOU_PRECISION = 16; class AmountInput extends PureComponent { static defaultProps = { fractional: true, - valueType: AmountValueType.XRP, + valueType: AmountValueType.Native, }; constructor(props: Props) { @@ -90,8 +90,8 @@ class AmountInput extends PureComponent { return ''; } - // 6 decimal places for XRP input - let decimalPlaces = MAX_XRP_DECIMAL_PLACES; + // 6 decimal places for native input + let decimalPlaces = MAX_NATIVE_DECIMAL_PLACES; if (valueType === AmountValueType.IOU) { decimalPlaces = MAX_IOU_DECIMAL_PLACES; } diff --git a/src/components/General/AmountText/AmountText.tsx b/src/components/General/AmountText/AmountText.tsx index 18a71b707..38bf2e47e 100644 --- a/src/components/General/AmountText/AmountText.tsx +++ b/src/components/General/AmountText/AmountText.tsx @@ -11,7 +11,7 @@ import React, { Component } from 'react'; import { Text, Pressable, Alert, TextStyle, ViewStyle, View, InteractionManager, Animated } from 'react-native'; import BigNumber from 'bignumber.js'; -import { NormalizeCurrencyCode, XRPLValueToNFT } from '@common/utils/amount'; +import { NormalizeCurrencyCode } from '@common/utils/amount'; import Localize from '@locale'; @@ -21,7 +21,7 @@ import styles from './styles'; interface Props { testID?: string; isLoading?: boolean; - prefix?: string | (() => React.ReactNode); + prefix?: string | (() => React.ReactNode) | React.ReactNode; value: number | string; currency?: string; truncateCurrency?: boolean; @@ -131,19 +131,6 @@ class AmountText extends Component { }; } - // check if value is NFT - const NFT = XRPLValueToNFT(value); - - // just show value as NFT - if (NFT) { - return { - originalValue: String(value), - value: NFT, - currency: normalizedCurrency, - localSettings: newLocalSettings, - }; - } - // if immutable show original value with formatting // without any rounding etc ... if (immutable) { @@ -281,6 +268,7 @@ class AmountText extends Component { return ( {typeof prefix === 'function' && prefix()} + {typeof prefix === 'object' && prefix} {typeof prefix === 'string' && prefix} {`${showValue}`} diff --git a/src/components/General/AnimatedDialog/AnimatedDialog.tsx b/src/components/General/AnimatedDialog/AnimatedDialog.tsx new file mode 100644 index 000000000..e37b9ce5f --- /dev/null +++ b/src/components/General/AnimatedDialog/AnimatedDialog.tsx @@ -0,0 +1,114 @@ +/** + * Animated Dialog component + */ +import React, { PureComponent } from 'react'; +import { Animated, InteractionManager, ViewStyle } from 'react-native'; +import { GestureResponderEvent } from 'react-native/Libraries/Types/CoreEventTypes'; + +// style +import styles from './styles'; + +/* types ==================================================================== */ +interface Props extends React.PropsWithChildren { + testID?: string; + height?: number; + containerStyle?: ViewStyle | ViewStyle[]; + onDismiss?: () => void; + onStartShouldSetResponder?: ((event: GestureResponderEvent) => boolean) | undefined; +} + +interface State {} + +/* Component ==================================================================== */ +class AnimatedDialog extends PureComponent { + private animatedHeight: Animated.Value; + private animatedColor: Animated.Value; + private animatedOpacity: Animated.Value; + + constructor(props: Props) { + super(props); + + this.animatedHeight = new Animated.Value(props.height ?? 0); + this.animatedColor = new Animated.Value(0); + this.animatedOpacity = new Animated.Value(1); + } + + componentDidMount() { + InteractionManager.runAfterInteractions(this.show); + } + + componentDidUpdate(prevProps: Readonly) { + const { height } = this.props; + + if (height && height !== prevProps.height) { + this.updateHeight(); + } + } + + updateHeight = () => { + const { height } = this.props; + + Animated.spring(this.animatedHeight, { + toValue: height, + useNativeDriver: false, + }).start(); + }; + + show = () => { + Animated.timing(this.animatedColor, { + toValue: 150, + duration: 350, + useNativeDriver: false, + }).start(); + }; + + public dismiss = () => { + const { onDismiss } = this.props; + + Animated.parallel([ + Animated.timing(this.animatedOpacity, { + toValue: 0, + duration: 200, + useNativeDriver: false, + }), + Animated.timing(this.animatedColor, { + toValue: 0, + duration: 200, + useNativeDriver: false, + }), + ]).start(() => { + if (typeof onDismiss === 'function') { + onDismiss(); + } + }); + }; + + render() { + const { children, containerStyle, onStartShouldSetResponder, height } = this.props; + + const interpolateColor = this.animatedColor.interpolate({ + inputRange: [0, 150], + outputRange: ['rgba(0,0,0,0)', 'rgba(0,0,0,0.7)'], + }); + + return ( + + + {children} + + + ); + } +} + +/* Export Component ==================================================================== */ +export default AnimatedDialog; diff --git a/src/components/General/AnimatedDialog/index.ts b/src/components/General/AnimatedDialog/index.ts new file mode 100644 index 000000000..8433e62d2 --- /dev/null +++ b/src/components/General/AnimatedDialog/index.ts @@ -0,0 +1 @@ +export { default as AnimatedDialog } from './AnimatedDialog'; diff --git a/src/components/General/AnimatedDialog/styles.ts b/src/components/General/AnimatedDialog/styles.ts new file mode 100644 index 000000000..90cfb7d46 --- /dev/null +++ b/src/components/General/AnimatedDialog/styles.ts @@ -0,0 +1,25 @@ +import StyleService from '@services/StyleService'; + +import { AppSizes } from '@theme'; +/* Styles ==================================================================== */ +const styles = StyleService.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + visibleContent: { + width: AppSizes.screen.width * 0.9, + alignItems: 'center', + backgroundColor: '$background', + borderColor: '$tint', + borderWidth: 1, + borderRadius: AppSizes.screen.width * 0.07, + shadowColor: '$grey', + shadowOffset: { width: 0, height: 0 }, + shadowRadius: 1, + shadowOpacity: 0.4, + }, +}); + +export default styles; diff --git a/src/components/General/Avatar/Avatar.tsx b/src/components/General/Avatar/Avatar.tsx index 79c82b44b..52c6a28ec 100644 --- a/src/components/General/Avatar/Avatar.tsx +++ b/src/components/General/Avatar/Avatar.tsx @@ -6,7 +6,7 @@ */ import React, { PureComponent } from 'react'; -import { View, Image, ImageSourcePropType, ViewStyle } from 'react-native'; +import { Animated, View, Image, ImageSourcePropType, ViewStyle, InteractionManager } from 'react-native'; import { Images } from '@common/helpers/images'; @@ -19,6 +19,7 @@ import styles from './styles'; export interface Props { source: ImageSourcePropType; size?: number; + isLoading?: boolean; imageScale?: number; border?: boolean; badge?: (() => React.ReactNode) | Extract; @@ -29,6 +30,9 @@ export interface Props { /* Component ==================================================================== */ class Avatar extends PureComponent { + private readonly animatedPulse: Animated.Value; + private readonly animatedFadeIn: Animated.Value; + static defaultProps = { size: 40, imageScale: 1, @@ -36,6 +40,59 @@ class Avatar extends PureComponent { badgeBorder: true, }; + constructor(props: Props) { + super(props); + + this.animatedPulse = new Animated.Value(0.3); + this.animatedFadeIn = new Animated.Value(props.isLoading ? 0.3 : 1); + } + + componentDidMount() { + InteractionManager.runAfterInteractions(this.startPlaceholderAnimation); + } + + componentDidUpdate(prevProps: Readonly) { + const { isLoading } = this.props; + + if (!prevProps.isLoading && isLoading) { + InteractionManager.runAfterInteractions(this.startPlaceholderAnimation); + } + + // start the pulse animation + if (prevProps.isLoading && !isLoading) { + InteractionManager.runAfterInteractions(this.startFadeInAnimation); + } + } + + startPlaceholderAnimation = () => { + const { isLoading } = this.props; + + if (!isLoading) { + return; + } + + Animated.sequence([ + Animated.timing(this.animatedPulse, { + toValue: 0.1, + duration: 1000, + useNativeDriver: true, + }), + Animated.timing(this.animatedPulse, { + toValue: 0.3, + duration: 1000, + useNativeDriver: true, + }), + ]).start(this.startPlaceholderAnimation); + }; + + startFadeInAnimation = () => { + Animated.timing(this.animatedFadeIn, { + toValue: 1, + duration: 250, + useNativeDriver: true, + }).start(); + }; + renderBadge = () => { const { badge, badgeColor, size } = this.props; @@ -83,13 +140,14 @@ class Avatar extends PureComponent { const { source, size, imageScale, border, containerStyle } = this.props; return ( - { { height: AppSizes.scale(size) * imageScale, width: AppSizes.scale(size) * imageScale }, ]} /> - + + ); + }; + + renderLoading = () => { + const { size, border, containerStyle } = this.props; + + return ( + ); }; render() { + const { isLoading } = this.props; + + if (isLoading) { + return this.renderLoading(); + } + return ( {this.renderAvatar()} diff --git a/src/components/General/Avatar/styles.ts b/src/components/General/Avatar/styles.ts index 0d0a5b153..aa0edaad2 100644 --- a/src/components/General/Avatar/styles.ts +++ b/src/components/General/Avatar/styles.ts @@ -8,6 +8,9 @@ export default StyleService.create({ alignItems: 'center', justifyContent: 'center', }, + placeholder: { + backgroundColor: '$grey', + }, image: { borderRadius: 10, }, diff --git a/src/components/General/Button/Button.tsx b/src/components/General/Button/Button.tsx index bfe7a66df..2154a12f5 100644 --- a/src/components/General/Button/Button.tsx +++ b/src/components/General/Button/Button.tsx @@ -1,5 +1,5 @@ /* eslint-disable react/jsx-props-no-spreading */ -import React, { Component } from 'react'; +import React, { Component, PropsWithChildren } from 'react'; import { isEqual } from 'lodash'; import { View, Text, TextStyle, ViewStyle, ImageStyle } from 'react-native'; @@ -13,7 +13,7 @@ import { LoadingIndicator } from '@components/General/LoadingIndicator'; import styles from './styles'; /* Types ==================================================================== */ -interface Props { +interface Props extends PropsWithChildren { style?: ViewStyle | ViewStyle[]; textStyle?: TextStyle | TextStyle[]; disabledStyle?: TextStyle | TextStyle[]; @@ -40,7 +40,6 @@ interface Props { icon?: Extract; iconPosition?: 'right' | 'left'; iconSize?: number; - extraComponent?: React.ReactNode; hitSlop?: any; } @@ -55,8 +54,14 @@ export default class Button extends Component { numberOfLines: 2, }; - renderChildren() { + shouldComponentUpdate(nextProps: Props) { + return !isEqual(nextProps, this.props); + } + + renderInnerContent() { const { + children, + isLoading, label, icon, iconPosition, @@ -74,11 +79,27 @@ export default class Button extends Component { iconStyle, iconSize, isDisabled, - extraComponent, + loadingIndicatorStyle, } = this.props; + // loading indicator + if (isLoading) { + return ( + + ); + } + + // if children provided + if (children) { + return children; + } + return ( - + {icon && iconPosition === 'left' && ( { ]} /> )} - {extraComponent && extraComponent} ); } - shouldComponentUpdate(nextProps: Props) { - return !isEqual(nextProps, this.props); - } - - renderInnerContent() { - const { isLoading, light, loadingIndicatorStyle } = this.props; - - if (isLoading) { - return ( - - ); - } - - return this.renderChildren(); - } - onPress = () => { const { onPress, isLoading } = this.props; diff --git a/src/components/General/CheckBox/CheckBox.tsx b/src/components/General/CheckBox/CheckBox.tsx index b597fa662..1b82bdc47 100644 --- a/src/components/General/CheckBox/CheckBox.tsx +++ b/src/components/General/CheckBox/CheckBox.tsx @@ -43,7 +43,7 @@ class CheckBox extends PureComponent { > - {checked && } + {checked && } diff --git a/src/components/General/Header/Header.tsx b/src/components/General/Header/Header.tsx index fcd8b8fcf..ba3bcf6be 100644 --- a/src/components/General/Header/Header.tsx +++ b/src/components/General/Header/Header.tsx @@ -22,12 +22,14 @@ interface ChildrenProps { iconStyle?: ImageStyle; render?: any; onPress?: () => void; + extraComponent?: React.ReactNode; } interface Props { placement: placementType; leftComponent?: ChildrenProps; centerComponent?: ChildrenProps; + subComponent?: ChildrenProps; rightComponent?: ChildrenProps; backgroundColor?: string; containerStyle?: ViewStyle; @@ -86,9 +88,10 @@ const Children = ({ ]} activeOpacity={children.onPress ? 0.8 : 1} onPress={onPress} + hitSlop={{ right: 20, left: 20 }} > {children.text && children.icon && ( - + {(placement === 'left' || placement === 'center') && ( )} @@ -115,6 +118,8 @@ const Children = ({ style={[styles.iconStyle, children.iconStyle]} /> )} + + {children.extraComponent && children.extraComponent} ); }; @@ -167,7 +172,7 @@ class Header extends PureComponent { {centerComponent} - + {rightComponent} diff --git a/src/components/General/PulseAnimation/PulseAnimation.tsx b/src/components/General/HeartBeatAnimation/HeartBeatAnimation.tsx similarity index 91% rename from src/components/General/PulseAnimation/PulseAnimation.tsx rename to src/components/General/HeartBeatAnimation/HeartBeatAnimation.tsx index ff5febb22..6e15d12ac 100644 --- a/src/components/General/PulseAnimation/PulseAnimation.tsx +++ b/src/components/General/HeartBeatAnimation/HeartBeatAnimation.tsx @@ -1,7 +1,7 @@ /** - * Pulse Animation + * Heart beat Animation * - {children} + {children} * */ import React, { PureComponent } from 'react'; @@ -14,7 +14,7 @@ interface Props { } /* Component ==================================================================== */ -class PulseAnimation extends PureComponent { +class HeartBeatAnimation extends PureComponent { private scaleAnimation: Animated.Value; constructor(props: Props) { @@ -69,4 +69,4 @@ class PulseAnimation extends PureComponent { } /* Export Component ==================================================================== */ -export default PulseAnimation; +export default HeartBeatAnimation; diff --git a/src/components/General/HeartBeatAnimation/index.ts b/src/components/General/HeartBeatAnimation/index.ts new file mode 100644 index 000000000..6cd5e40c3 --- /dev/null +++ b/src/components/General/HeartBeatAnimation/index.ts @@ -0,0 +1 @@ +export { default as HeartBeatAnimation } from './HeartBeatAnimation'; diff --git a/src/components/General/HorizontalLine/HorizontalLine.tsx b/src/components/General/HorizontalLine/HorizontalLine.tsx index f75179a18..b2352d507 100644 --- a/src/components/General/HorizontalLine/HorizontalLine.tsx +++ b/src/components/General/HorizontalLine/HorizontalLine.tsx @@ -6,12 +6,12 @@ */ import React from 'react'; -import { View, ViewStyle } from 'react-native'; +import { View, ViewStyle, DimensionValue } from 'react-native'; import StyleService from '@services/StyleService'; /* Types ==================================================================== */ interface Props { - width?: number; + width?: DimensionValue; height?: number; color?: string; style?: ViewStyle | ViewStyle[]; diff --git a/src/components/General/InfoMessage/InfoMessage.tsx b/src/components/General/InfoMessage/InfoMessage.tsx index f3b2d0104..bfb9cfac7 100644 --- a/src/components/General/InfoMessage/InfoMessage.tsx +++ b/src/components/General/InfoMessage/InfoMessage.tsx @@ -12,8 +12,6 @@ import { Images } from '@common/helpers/images'; import { Button } from '@components/General/Button'; import { Icon } from '@components/General/Icon'; -import Localize from '@locale'; - import { AppStyles } from '@theme'; import styles from './styles'; @@ -28,10 +26,12 @@ interface Props { label?: string; type: 'info' | 'warning' | 'error' | 'success' | 'neutral'; flat?: boolean; - moreButtonLabel?: string; - moreButtonIcon?: Extract; - onMoreButtonPress?: () => void; - isMoreButtonLoading?: boolean; + hideActionButton?: boolean; + actionButtonLabel?: string; + actionButtonIcon?: Extract; + actionButtonIconSize?: number; + onActionButtonPress?: () => void; + isActionButtonLoading?: boolean; } /* Component ==================================================================== */ @@ -40,25 +40,39 @@ class InfoMessage extends PureComponent { iconSize: 20, }; + onActionButtonPress = () => { + const { onActionButtonPress } = this.props; + + if (typeof onActionButtonPress === 'function') { + onActionButtonPress(); + } + }; + getContainerStyle = () => { const { type, containerStyle } = this.props; - if (containerStyle) return containerStyle; + let baseStyle = null; switch (type) { case 'info': - return styles.info; + baseStyle = styles.info; + break; case 'warning': - return styles.warning; + baseStyle = styles.warning; + break; case 'error': - return styles.error; + baseStyle = styles.error; + break; case 'success': - return styles.success; + baseStyle = styles.success; + break; case 'neutral': - return styles.neutral; + baseStyle = styles.neutral; + break; default: - return null; + return containerStyle; } + return { ...baseStyle, ...containerStyle }; }; renderIcon = () => { @@ -133,23 +147,25 @@ class InfoMessage extends PureComponent { style.push({ textAlign: icon ? 'left' : 'center' }); return ( - - {label} + + {label} ); }; renderFooter = () => { - const { onMoreButtonPress, moreButtonLabel, moreButtonIcon, isMoreButtonLoading } = this.props; + const { hideActionButton, actionButtonLabel, actionButtonIcon, actionButtonIconSize, isActionButtonLoading } = + this.props; - if (typeof onMoreButtonPress === 'function') { + if (typeof actionButtonLabel === 'string' && !hideActionButton) { return ( +