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 extends Badger> 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 extends Badger> 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 (
diff --git a/src/components/General/LoadingIndicator/LoadingIndicator.tsx b/src/components/General/LoadingIndicator/LoadingIndicator.tsx
index cd6ca1ffb..e9d15938e 100644
--- a/src/components/General/LoadingIndicator/LoadingIndicator.tsx
+++ b/src/components/General/LoadingIndicator/LoadingIndicator.tsx
@@ -14,13 +14,14 @@ interface Props {
color?: 'dark' | 'light' | 'default';
size?: number | 'small' | 'large';
style?: ViewStyle | ViewStyle[];
+ animating?: boolean;
}
/* Component ==================================================================== */
-const LoadingIndicator: React.FC = ({ color = 'default', size = 'small', style }) => (
+const LoadingIndicator: React.FC = ({ color = 'default', size = 'small', style, animating = true }) => (
{
switch (color) {
case 'light':
diff --git a/src/components/General/PinInput/PinInput.tsx b/src/components/General/PinInput/PinInput.tsx
index ec54fef93..632e2bc37 100644
--- a/src/components/General/PinInput/PinInput.tsx
+++ b/src/components/General/PinInput/PinInput.tsx
@@ -31,7 +31,13 @@ interface State {
/* Component ==================================================================== */
class PinInput extends Component {
- private textInput: TextInput = undefined;
+ private readonly textInputRef: React.RefObject;
+
+ public static defaultProps = {
+ codeLength: 4,
+ autoFocus: true,
+ checkStrength: false,
+ };
constructor(props: Props) {
super(props);
@@ -39,18 +45,14 @@ class PinInput extends Component {
this.state = {
code: '',
};
- }
- public static defaultProps = {
- codeLength: 4,
- autoFocus: true,
- checkStrength: false,
- };
+ this.textInputRef = React.createRef();
+ }
public blur = () => {
setTimeout(() => {
- if (this.textInput) {
- this.textInput.blur();
+ if (this.textInputRef?.current) {
+ this.textInputRef?.current.blur();
}
}, 100);
};
@@ -59,10 +61,13 @@ class PinInput extends Component {
// this is a quick fix for android bug
// Android: Calling TextInput instance's focus() after keyboard
// is closed via back button/submit doesn't bring up keyboard
- this.textInput.blur();
+ if (this.textInputRef?.current) {
+ this.textInputRef?.current.blur();
+ }
+
setTimeout(() => {
- if (this.textInput) {
- this.textInput.focus();
+ if (this.textInputRef?.current) {
+ this.textInputRef?.current.focus();
}
}, 100);
};
@@ -193,27 +198,37 @@ class PinInput extends Component {
}
};
- handleEdit = (code: string) => {
+ handleEdit = (str: string) => {
+ const { code } = this.state;
const { codeLength, checkStrength, onFinish } = this.props;
+ // nothing changed
+ if (str === code) {
+ return;
+ }
+
// remove any non digits
- const cleanCode = code.replace(/[^0-9]/g, '');
+ const cleanCode = str.replace(/[^0-9]/g, '');
- if (cleanCode) {
- // limit the input for not more than the requested code length
- if (cleanCode.length <= codeLength) {
- this.setPinCode(cleanCode);
+ if (!cleanCode) {
+ this.setPinCode('');
+ return;
+ }
+
+ // limit the input for not more than the requested code length
+ if (cleanCode.length <= codeLength) {
+ this.setPinCode(cleanCode);
+ }
+
+ // User filling the last pin ?
+ if (cleanCode.length === codeLength) {
+ if (this.textInputRef?.current) {
+ this.textInputRef?.current.blur();
}
- // User filling the last pin ?
- if (cleanCode.length === codeLength) {
- this.textInput.blur();
- if (onFinish) {
- onFinish(cleanCode, checkStrength ? this.isStrong(cleanCode) : undefined);
- }
+ if (onFinish) {
+ onFinish(cleanCode, checkStrength ? this.isStrong(cleanCode) : undefined);
}
- } else {
- this.setPinCode('');
}
};
@@ -249,11 +264,9 @@ class PinInput extends Component {
}
return (
-
+
{
- this.textInput = r;
- }}
+ ref={this.textInputRef}
testID="pin-input"
keyboardType="number-pad"
returnKeyType="done"
@@ -270,7 +283,7 @@ class PinInput extends Component {
// eslint-disable-next-line
{...props}
/>
- {pins}
+ {pins}
);
}
diff --git a/src/components/General/PulseAnimation/index.ts b/src/components/General/PulseAnimation/index.ts
deleted file mode 100644
index a66cc30c1..000000000
--- a/src/components/General/PulseAnimation/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default as PulseAnimation } from './PulseAnimation';
diff --git a/src/components/General/RadioButton/RadioButton.tsx b/src/components/General/RadioButton/RadioButton.tsx
index 9ffb94b82..69ae648d2 100644
--- a/src/components/General/RadioButton/RadioButton.tsx
+++ b/src/components/General/RadioButton/RadioButton.tsx
@@ -5,7 +5,7 @@
*
*/
import React, { PureComponent } from 'react';
-import { View, Text } from 'react-native';
+import { View, Text, ViewStyle } from 'react-native';
import { TouchableDebounce } from '@components/General/TouchableDebounce';
@@ -22,6 +22,7 @@ interface Props {
description?: string;
disabled?: boolean;
testID?: string;
+ style?: ViewStyle | ViewStyle[];
}
/* Component ==================================================================== */
@@ -35,7 +36,7 @@ class RadioButton extends PureComponent {
};
render() {
- const { checked, label, labelSmall, description, disabled, testID } = this.props;
+ const { checked, label, labelSmall, description, disabled, testID, style } = this.props;
return (
{
checked && styles.selected,
checked && disabled && styles.selectedDisabled,
!checked && disabled && styles.disabled,
+ style,
]}
>
diff --git a/src/components/General/RadioButton/styles.ts b/src/components/General/RadioButton/styles.ts
index 6557c9272..c4408a618 100644
--- a/src/components/General/RadioButton/styles.ts
+++ b/src/components/General/RadioButton/styles.ts
@@ -1,13 +1,13 @@
import StyleService from '@services/StyleService';
-import { AppFonts } from '@theme';
+import { AppFonts, AppSizes } from '@theme';
/* Styles ==================================================================== */
export default StyleService.create({
content: {
width: '100%',
borderRadius: 20,
- padding: 20,
+ padding: AppSizes.paddingSml,
left: 0,
right: 0,
flexDirection: 'row',
diff --git a/src/components/General/ReadMore/ReadMore.tsx b/src/components/General/ReadMore/ReadMore.tsx
index dd0265694..1700ce4e5 100644
--- a/src/components/General/ReadMore/ReadMore.tsx
+++ b/src/components/General/ReadMore/ReadMore.tsx
@@ -94,27 +94,31 @@ class ReadMore extends Component {
return {};
};
- renderViewMore = () => (
-
- {Localize.t('global.readMore')}
-
-
- );
-
- renderViewLess = () => (
-
- {Localize.t('global.readLess')}
-
-
- );
+ renderViewMore = () => {
+ return (
+
+ {Localize.t('global.readMore')}
+
+
+ );
+ };
+
+ renderViewLess = () => {
+ return (
+
+ {Localize.t('global.readLess')}
+
+
+ );
+ };
renderFooter = () => {
const { numberOfLines } = this.state;
@@ -135,7 +139,9 @@ class ReadMore extends Component {
if (isFullTextShown) {
return (
- {children}
+
+ {children}
+
);
}
diff --git a/src/components/General/SecurePinInput/SecurePinInput.tsx b/src/components/General/SecurePinInput/SecurePinInput.tsx
index a31576263..3f143de7e 100644
--- a/src/components/General/SecurePinInput/SecurePinInput.tsx
+++ b/src/components/General/SecurePinInput/SecurePinInput.tsx
@@ -41,12 +41,13 @@ interface State {
digits: string;
}
-const BUTTONS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 'Y', 0, 'X'];
+const BUTTONS = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'Y', '0', 'X'];
/* Component ==================================================================== */
class SecurePinInput extends Component {
currentIndex: number;
inputRef: React.RefObject;
private clearInputTimeout: any;
+ private lastKeyEventTimestamp: number;
public static defaultProps = {
virtualKeyboard: false,
@@ -98,83 +99,69 @@ class SecurePinInput extends Component {
}
};
- onDigitInput = (digit: any) => {
+ onFinish = (digits: string) => {
+ const { clearOnFinish, onInputFinish } = this.props;
+
+ // blur the input
+ this.blur();
+
+ // callback
+ if (onInputFinish) {
+ onInputFinish(digits);
+ }
+
+ // clear the input if necessary
+ if (clearOnFinish) {
+ this.clearInputTimeout = setTimeout(() => this.clearInput(), 1000);
+ }
+ };
+
+ onInput = (key: string) => {
+ const { enableHapticFeedback, length } = this.props;
const { digits } = this.state;
- const { length, enableHapticFeedback } = this.props;
if (enableHapticFeedback) {
VibrateHapticFeedback('impactLight');
}
- if (digit === 'Backspace') {
- const arrayCode = digits.split('');
- arrayCode.pop();
+ // BackSpace
+ if (key === 'Backspace') {
this.setState({
- digits: arrayCode.join(''),
+ digits: digits.slice(0, -1),
});
- } else {
- const newDigits = digits + digit;
-
- if (newDigits.length <= length) {
- this.setState({
- digits: newDigits,
- });
- }
- // User filling the last pin ?
- if (newDigits.length === length) {
- this.onFinish(newDigits);
- }
+ return;
}
- };
- handleEdit = (code: string) => {
- const { length } = this.props;
-
- // remove any non digits
- const cleanCode = code.replace(/[^0-9]/g, '');
+ const newDigits = `${digits}${key}`;
- if (cleanCode) {
- // limit the input for not more than the requested code length
- if (cleanCode.length <= length) {
- this.setState({
- digits: cleanCode,
- });
- }
- // User filling the last pin ?
- if (cleanCode.length === length) {
- this.onFinish(cleanCode);
- }
- } else {
+ // not finished yet
+ if (newDigits.length <= length) {
this.setState({
- digits: '',
+ digits: newDigits,
});
}
- };
- onKeyPress = (e: NativeSyntheticEvent) => {
- const { digits } = this.state;
- if (e.nativeEvent.key === 'Backspace' && Platform.OS === 'android') {
- const arrayCode = digits.split('');
- arrayCode.pop();
- this.setState({
- digits: arrayCode.join(''),
- });
+ // User filling the last pin ?
+ if (newDigits.length === length) {
+ this.onFinish(newDigits);
}
};
- onFinish = (digits: string) => {
- const { clearOnFinish, onInputFinish } = this.props;
+ onKeyPress = (event: NativeSyntheticEvent) => {
+ // debounce
+ if (Math.abs(this.lastKeyEventTimestamp - event.timeStamp) < 20) {
+ return;
+ }
- // blur the input
- this.blur();
+ this.lastKeyEventTimestamp = event.timeStamp;
- if (onInputFinish) {
- onInputFinish(digits);
+ // filter keys
+ if (!event.nativeEvent.key.match(/^([0-9]+|Backspace)$/i)) {
+ return;
}
- if (clearOnFinish) {
- this.clearInputTimeout = setTimeout(() => this.clearInput(), 1000);
- }
+ // trigger onChange
+ this.onInput(event.nativeEvent.key);
};
clearInput = () => {
@@ -195,7 +182,7 @@ class SecurePinInput extends Component {
style={styles.line}
key="x-key"
onPress={() => {
- this.onDigitInput('Backspace');
+ this.onInput('Backspace');
}}
onLongPress={this.clearInput}
>
@@ -225,18 +212,18 @@ class SecurePinInput extends Component {
return ;
}
- const alpha = (n: string | number): string => {
+ const alpha = (n: string): string => {
const alphabet = 'ABC.DEF.GHI.JKL.MNO.PQRS.TUV.WXYZ';
switch (n) {
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- return alphabet.split('.')[n - 2];
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ return alphabet.split('.')[Number(n) - 2];
default:
return '';
}
@@ -250,7 +237,7 @@ class SecurePinInput extends Component {
activeOpacity={0.7}
key={`${item}-key`}
onPress={() => {
- this.onDigitInput(item);
+ this.onInput(item);
}}
>
<>
@@ -297,7 +284,7 @@ class SecurePinInput extends Component {
};
render() {
- const { virtualKeyboard, isLoading } = this.props;
+ const { virtualKeyboard, length, isLoading } = this.props;
const { digits } = this.state;
let props = {};
@@ -320,13 +307,13 @@ class SecurePinInput extends Component {
returnKeyType="done"
keyboardType="number-pad"
onKeyPress={this.onKeyPress}
- onChangeText={this.handleEdit}
autoCorrect={false}
spellCheck={false}
disableFullscreenUI
secureTextEntry
caretHidden
value={digits}
+ maxLength={length}
// eslint-disable-next-line
{...props}
/>
diff --git a/src/components/General/SegmentButton/SegmentButton.tsx b/src/components/General/SegmentButton/SegmentButton.tsx
index 2edbe4310..a2f8e80d9 100644
--- a/src/components/General/SegmentButton/SegmentButton.tsx
+++ b/src/components/General/SegmentButton/SegmentButton.tsx
@@ -1,7 +1,7 @@
import React, { PureComponent } from 'react';
-import { Text, View, ViewStyle } from 'react-native';
+import { View, ViewStyle } from 'react-native';
-import { TouchableDebounce } from '@components/General/TouchableDebounce';
+import { Button } from '@components/General/Button';
import styles from './styles';
/* Types ==================================================================== */
@@ -13,7 +13,7 @@ interface State {
interface Props {
buttons: Array;
selectedIndex?: number;
- containerStyle?: ViewStyle;
+ containerStyle?: ViewStyle | ViewStyle[];
onPress: (index: number) => void;
}
@@ -68,23 +68,17 @@ class SegmentButton extends PureComponent {
return (
{buttons.map((button, i) => (
- {
- this.onButtonPress(i);
- }}
- key={i}
- style={[styles.button, selectedIndex === i && styles.selectedButton]}
- >
-