Repository: ripple/explorer Branch: main Commit: 7909df7110a6 Files: 1187 Total size: 6.0 MB Directory structure: gitextract_lpsosmay/ ├── .eslintignore ├── .eslintrc.js ├── .github/ │ ├── dependabot.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── copilot-setup-steps.yml │ └── nodejs.yml ├── .gitignore ├── .npmrc ├── .nvmrc ├── .pre-commit-config.yaml ├── .prettierignore ├── .stylelintrc.js ├── .vscode/ │ ├── extensions.json │ └── settings.json ├── @types/ │ ├── env.d.ts │ ├── i18next.d.ts │ ├── index.d.ts │ ├── react-i18next.d.ts │ └── svgr.d.ts ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── babel.config.js ├── docs/ │ ├── analytics.md │ ├── routing.md │ └── translating.md ├── entrypoint.sh ├── jest.config.js ├── package.json ├── public/ │ ├── .htaccess │ ├── countries.json │ ├── locales/ │ │ ├── ca-CA/ │ │ │ └── translations.json │ │ ├── en-US/ │ │ │ └── translations.json │ │ ├── es-ES/ │ │ │ └── translations.json │ │ ├── fr-FR/ │ │ │ └── translations.json │ │ ├── ja-JP/ │ │ │ └── translations.json │ │ ├── ko-KR/ │ │ │ └── translations.json │ │ └── my-MM/ │ │ └── translations.json │ ├── manifest.json │ └── robots.txt ├── server/ │ ├── index.js │ ├── lib/ │ │ ├── logger.js │ │ ├── rippled.js │ │ ├── streams.js │ │ └── utils.js │ └── routes/ │ └── v1/ │ ├── amms.js │ ├── currentMetrics.js │ ├── health.js │ ├── index.js │ ├── tokens.js │ └── vaults.js ├── src/ │ ├── containers/ │ │ ├── AMMPool/ │ │ │ ├── AMMPoolHeader.tsx │ │ │ ├── InfoCards/ │ │ │ │ ├── AuctionCard.tsx │ │ │ │ ├── BasicInfoCard.tsx │ │ │ │ ├── MarketDataCard.tsx │ │ │ │ └── test/ │ │ │ │ ├── AuctionCard.test.tsx │ │ │ │ ├── BasicInfoCard.test.tsx │ │ │ │ └── MarketDataCard.test.tsx │ │ │ ├── TablePicker/ │ │ │ │ ├── AMMDepositWithdrawTable.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── test/ │ │ │ │ ├── AMMDepositWithdrawTable.test.tsx │ │ │ │ └── index.test.tsx │ │ │ ├── api.ts │ │ │ ├── index.tsx │ │ │ ├── styles.scss │ │ │ ├── test/ │ │ │ │ ├── AMMPoolHeader.test.tsx │ │ │ │ ├── index.test.tsx │ │ │ │ ├── mockDeletedAMMTransaction.json │ │ │ │ └── utils.test.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ ├── AMMRankings/ │ │ │ ├── AMMRankingsTable.tsx │ │ │ ├── GeneralInfoCard.tsx │ │ │ ├── ammRankings.scss │ │ │ ├── api.ts │ │ │ ├── index.tsx │ │ │ ├── svg.d.ts │ │ │ └── test/ │ │ │ └── AMMRankingsTable.test.tsx │ │ ├── Accounts/ │ │ │ ├── AccountAsset/ │ │ │ │ ├── FutureDataIcon.scss │ │ │ │ ├── FutureDataIcon.tsx │ │ │ │ ├── assetTables/ │ │ │ │ │ ├── HeldIOUs.tsx │ │ │ │ │ ├── HeldLPTokens.tsx │ │ │ │ │ ├── HeldMPTs.tsx │ │ │ │ │ ├── HeldNFTs.tsx │ │ │ │ │ ├── IssuedIOUs.tsx │ │ │ │ │ ├── IssuedMPTs.tsx │ │ │ │ │ ├── IssuedNFTs.tsx │ │ │ │ │ └── NFTTable.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ ├── AccountAsset.test.tsx │ │ │ │ ├── FutureDataIcon.test.tsx │ │ │ │ ├── HeldIOUs.test.tsx │ │ │ │ ├── HeldLPTokens.test.tsx │ │ │ │ ├── HeldMPTs.test.tsx │ │ │ │ ├── HeldNFTs.test.tsx │ │ │ │ ├── IssuedIOUs.test.tsx │ │ │ │ ├── IssuedMPTs.test.tsx │ │ │ │ └── IssuedNFTs.test.tsx │ │ │ ├── AccountHeader/ │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ └── AccountHeader.test.tsx │ │ │ ├── AccountSummary/ │ │ │ │ ├── Balances.tsx │ │ │ │ ├── DetailsCard.tsx │ │ │ │ ├── FlagsCard.tsx │ │ │ │ ├── SignersCard.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ ├── AccountSummary.test.tsx │ │ │ │ ├── Balances.test.tsx │ │ │ │ ├── DetailsCard.test.tsx │ │ │ │ ├── FlagsCard.test.tsx │ │ │ │ └── SignersCard.test.tsx │ │ │ ├── AccountTransactionTable/ │ │ │ │ ├── AccountTransactionTable.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ ├── AccountTransactionTable.test.tsx │ │ │ │ ├── mockTransactions.json │ │ │ │ └── successfulAccountTx.json │ │ │ ├── AccountsRouter.tsx │ │ │ ├── Errors.tsx │ │ │ ├── index.tsx │ │ │ ├── styles.scss │ │ │ └── test/ │ │ │ ├── AccountsRouter.test.tsx │ │ │ ├── index.test.tsx │ │ │ └── mockAccountState.json │ │ ├── Amendment/ │ │ │ ├── BarChartVoting.tsx │ │ │ ├── Simple.tsx │ │ │ ├── Votes.tsx │ │ │ ├── amendment.scss │ │ │ ├── index.tsx │ │ │ └── test/ │ │ │ ├── AmendmentSummary.test.js │ │ │ ├── mockValidatorsList.json │ │ │ └── mockVotingAmendment.json │ │ ├── Amendments/ │ │ │ ├── AmendmentsTable.tsx │ │ │ ├── amendmentsTable.scss │ │ │ ├── index.tsx │ │ │ └── test/ │ │ │ ├── amendments.test.js │ │ │ ├── amendmentsTable.test.js │ │ │ └── mockAmendments.json │ │ ├── App/ │ │ │ ├── App.tsx │ │ │ ├── AppErrorBoundary.tsx │ │ │ ├── app.scss │ │ │ ├── featureFlags.ts │ │ │ ├── index.tsx │ │ │ ├── legacyRedirects.tsx │ │ │ ├── navigation.ts │ │ │ ├── routes.ts │ │ │ └── test/ │ │ │ ├── App.test.jsx │ │ │ └── AppErrorBoundary.test.tsx │ │ ├── CustomNetworkHome/ │ │ │ ├── index.scss │ │ │ ├── index.tsx │ │ │ └── test/ │ │ │ └── CustomNetworkHome.test.js │ │ ├── Footer/ │ │ │ ├── footer.scss │ │ │ ├── index.tsx │ │ │ └── test/ │ │ │ └── Footer.test.tsx │ │ ├── Header/ │ │ │ ├── LanguagePicker/ │ │ │ │ ├── LanguagePicker.scss │ │ │ │ ├── LanguagePicker.tsx │ │ │ │ └── test/ │ │ │ │ └── LanguagePicker.test.tsx │ │ │ ├── NavigationMenu/ │ │ │ │ ├── NavigationMenu.scss │ │ │ │ ├── NavigationMenu.tsx │ │ │ │ └── index.ts │ │ │ ├── NetworkPicker/ │ │ │ │ ├── NetworkPicker.scss │ │ │ │ ├── NetworkPicker.tsx │ │ │ │ └── test/ │ │ │ │ └── NetworkPicker.test.tsx │ │ │ ├── Search.tsx │ │ │ ├── header.scss │ │ │ ├── index.tsx │ │ │ ├── search.scss │ │ │ └── test/ │ │ │ ├── Header.test.tsx │ │ │ └── Search.test.js │ │ ├── Ledger/ │ │ │ ├── LedgerTransactionTable.tsx │ │ │ ├── LedgerTransactionTableRow.tsx │ │ │ ├── index.tsx │ │ │ ├── ledger.scss │ │ │ └── test/ │ │ │ ├── Ledger.test.js │ │ │ ├── ledgerNotFound.json │ │ │ ├── mockLedger.json │ │ │ └── storedLedger.json │ │ ├── Ledgers/ │ │ │ ├── LedgerEntryHash.tsx │ │ │ ├── LedgerEntryHashTrustedCount.tsx │ │ │ ├── LedgerEntryTransaction.tsx │ │ │ ├── LedgerEntryTransactions.tsx │ │ │ ├── LedgerEntryValidator.tsx │ │ │ ├── LedgerListEntry.tsx │ │ │ ├── LedgerMetrics.tsx │ │ │ ├── Ledgers.tsx │ │ │ ├── Legend.tsx │ │ │ ├── css/ │ │ │ │ ├── ledgerMetrics.scss │ │ │ │ ├── ledgers.scss │ │ │ │ └── legend.scss │ │ │ ├── index.tsx │ │ │ ├── test/ │ │ │ │ ├── LedgersPage.test.js │ │ │ │ ├── Legend.test.tsx │ │ │ │ └── mock/ │ │ │ │ ├── ledger.json │ │ │ │ ├── prevLedger.json │ │ │ │ ├── rippled.json │ │ │ │ └── validation.json │ │ │ └── useSelectedValidator.tsx │ │ ├── NFT/ │ │ │ ├── NFT.tsx │ │ │ ├── NFTHeader/ │ │ │ │ ├── Details.tsx │ │ │ │ ├── NFTHeader.tsx │ │ │ │ ├── Settings.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ ├── Details.test.js │ │ │ │ ├── NFTHeader.test.js │ │ │ │ └── Settings.test.js │ │ │ ├── NFTTabs/ │ │ │ │ ├── NFTTabs.tsx │ │ │ │ ├── Offers.tsx │ │ │ │ ├── Transactions.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ ├── NFTTabs.test.js │ │ │ │ ├── Offers.test.js │ │ │ │ └── Transactions.test.js │ │ │ ├── styles.scss │ │ │ └── test/ │ │ │ └── NFT.test.js │ │ ├── Network/ │ │ │ ├── BarChartVersion.tsx │ │ │ ├── Hexagons.tsx │ │ │ ├── Map.tsx │ │ │ ├── Nodes.tsx │ │ │ ├── NodesTable.tsx │ │ │ ├── UpgradeStatus.tsx │ │ │ ├── Validators.tsx │ │ │ ├── ValidatorsTable.tsx │ │ │ ├── ValidatorsTabs.tsx │ │ │ ├── css/ │ │ │ │ ├── barchart.scss │ │ │ │ ├── hexagons.scss │ │ │ │ ├── map.scss │ │ │ │ ├── nodesTable.scss │ │ │ │ ├── style.scss │ │ │ │ └── validatorsTable.scss │ │ │ └── test/ │ │ │ ├── metrics.json │ │ │ ├── mockNodes.json │ │ │ ├── mockValidation.json │ │ │ ├── mockValidators.json │ │ │ ├── nodes.test.js │ │ │ ├── nodesTable.test.js │ │ │ ├── upgradeStatus.test.js │ │ │ ├── validators.test.js │ │ │ └── validatorsTable.test.js │ │ ├── NoMatch/ │ │ │ ├── index.tsx │ │ │ ├── nomatch.scss │ │ │ └── test/ │ │ │ └── NoMatch.test.tsx │ │ ├── SearchResult/ │ │ │ └── index.tsx │ │ ├── Token/ │ │ │ ├── IOU/ │ │ │ │ ├── Header/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── test/ │ │ │ │ │ ├── actNotFound.json │ │ │ │ │ └── rippledResponses.json │ │ │ │ ├── TablePicker/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── api/ │ │ │ │ │ ├── holders.ts │ │ │ │ │ └── token.ts │ │ │ │ ├── components/ │ │ │ │ │ └── HeaderBoxes.tsx │ │ │ │ ├── hooks/ │ │ │ │ │ └── useMarketCalculations.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── services/ │ │ │ │ │ └── dexTradesPagination.ts │ │ │ │ ├── styles.scss │ │ │ │ ├── test/ │ │ │ │ │ ├── Header/ │ │ │ │ │ │ └── Header.test.tsx │ │ │ │ │ ├── TablePicker/ │ │ │ │ │ │ └── TablePicker.test.tsx │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── holders.test.ts │ │ │ │ │ │ └── token.test.ts │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── HeaderBoxes.test.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ └── useMarketCalculations.test.ts │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── services/ │ │ │ │ │ │ └── dexTradesPagination.test.ts │ │ │ │ │ └── utils/ │ │ │ │ │ └── tokenCalculations.test.ts │ │ │ │ └── utils/ │ │ │ │ └── tokenCalculations.ts │ │ │ ├── MPT/ │ │ │ │ ├── Header/ │ │ │ │ │ ├── GeneralOverview.tsx │ │ │ │ │ ├── MarketData.tsx │ │ │ │ │ ├── Metadata.tsx │ │ │ │ │ ├── Settings.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ ├── TablePicker/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── api/ │ │ │ │ │ └── holders.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ ├── Header/ │ │ │ │ │ ├── GeneralOverview.test.tsx │ │ │ │ │ ├── Header.test.tsx │ │ │ │ │ ├── MarketData.test.tsx │ │ │ │ │ ├── Metadata.test.tsx │ │ │ │ │ └── Settings.test.tsx │ │ │ │ ├── TablePicker/ │ │ │ │ │ └── TablePicker.test.tsx │ │ │ │ ├── api/ │ │ │ │ │ └── holders.test.ts │ │ │ │ └── index.test.tsx │ │ │ └── shared/ │ │ │ ├── api/ │ │ │ │ └── tokenTx.ts │ │ │ ├── components/ │ │ │ │ └── TransfersTable/ │ │ │ │ ├── TransfersTable.tsx │ │ │ │ └── styles.scss │ │ │ ├── constants.ts │ │ │ ├── hooks/ │ │ │ │ ├── useAccountTransactions.ts │ │ │ │ ├── usePaginationState.ts │ │ │ │ └── useSortingState.ts │ │ │ ├── services/ │ │ │ │ └── transfersPagination.ts │ │ │ ├── styles.scss │ │ │ └── test/ │ │ │ ├── api/ │ │ │ │ └── tokenTx.test.ts │ │ │ ├── components/ │ │ │ │ ├── ResponsiveTimestamp/ │ │ │ │ │ └── ResponsiveTimestamp.test.tsx │ │ │ │ └── TransfersTable/ │ │ │ │ └── TransfersTable.test.tsx │ │ │ ├── constants.test.ts │ │ │ ├── hooks/ │ │ │ │ ├── useAccountTransactions.test.tsx │ │ │ │ ├── usePaginationState.test.ts │ │ │ │ └── useSortingState.test.ts │ │ │ └── services/ │ │ │ └── transfersPagination.test.ts │ │ ├── TokenNonMain/ │ │ │ ├── TokenHeader/ │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ ├── actNotFound.json │ │ │ │ └── rippledResponses.json │ │ │ ├── TokenTransactionTable/ │ │ │ │ ├── TokenTransactionTable.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── test/ │ │ │ │ ├── TokenTransactionTable.test.tsx │ │ │ │ └── successfulAccountTx.json │ │ │ ├── index.tsx │ │ │ ├── styles.scss │ │ │ └── test/ │ │ │ └── index.test.tsx │ │ ├── Tokens/ │ │ │ ├── TokensTable.tsx │ │ │ ├── index.tsx │ │ │ ├── test/ │ │ │ │ ├── index.test.tsx │ │ │ │ └── mock_data/ │ │ │ │ └── tokens.json │ │ │ └── tokens.scss │ │ ├── Transactions/ │ │ │ ├── DetailTab/ │ │ │ │ ├── Description.tsx │ │ │ │ ├── HookDetails.tsx │ │ │ │ ├── Meta/ │ │ │ │ │ ├── AccountRoot.tsx │ │ │ │ │ ├── DirectoryNode.tsx │ │ │ │ │ ├── MPToken.tsx │ │ │ │ │ ├── MPTokenIssuance.tsx │ │ │ │ │ ├── Offer.tsx │ │ │ │ │ ├── PayChannel.tsx │ │ │ │ │ ├── RippleState.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── detailTab.scss │ │ │ │ └── index.tsx │ │ │ ├── Simple/ │ │ │ │ └── index.tsx │ │ │ ├── SimpleTab.tsx │ │ │ ├── index.tsx │ │ │ ├── simpleTab.scss │ │ │ ├── test/ │ │ │ │ ├── Description.test.tsx │ │ │ │ ├── DetailTab.test.tsx │ │ │ │ ├── Meta.test.tsx │ │ │ │ ├── SimpleTab.test.tsx │ │ │ │ ├── Transaction.test.tsx │ │ │ │ └── mock_data/ │ │ │ │ ├── DelegatePayment.json │ │ │ │ ├── DirectMPTPayment.json │ │ │ │ ├── EmittedPayment.json │ │ │ │ ├── EnableAmendment.json │ │ │ │ ├── EscrowCreate.json │ │ │ │ ├── HookPayment.json │ │ │ │ ├── OfferCreateTicket.json │ │ │ │ ├── Transaction.json │ │ │ │ ├── TransactionSummary.json │ │ │ │ ├── TrustSet.json │ │ │ │ └── rippledOfferCreate.json │ │ │ └── transaction.scss │ │ ├── Validators/ │ │ │ ├── HistoryTab.tsx │ │ │ ├── Simple/ │ │ │ │ └── index.tsx │ │ │ ├── SimpleTab.tsx │ │ │ ├── VotingTab.tsx │ │ │ ├── historyTab.scss │ │ │ ├── index.tsx │ │ │ ├── simpleTab.scss │ │ │ ├── test/ │ │ │ │ ├── HistoryTab.test.tsx │ │ │ │ ├── SimpleTab.test.tsx │ │ │ │ ├── Validator.test.js │ │ │ │ ├── VotingTab.test.tsx │ │ │ │ └── mock_data/ │ │ │ │ ├── amendments.json │ │ │ │ ├── history.json │ │ │ │ └── validator.json │ │ │ ├── types.ts │ │ │ ├── validator.scss │ │ │ └── votingTab.scss │ │ ├── Vault/ │ │ │ ├── CurrencyToggle.tsx │ │ │ ├── VaultDepositors/ │ │ │ │ ├── api/ │ │ │ │ │ └── depositors.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ └── VaultDepositors.test.tsx │ │ │ ├── VaultHeader/ │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ └── VaultHeader.test.tsx │ │ │ ├── VaultLoans/ │ │ │ │ ├── BrokerDetails.tsx │ │ │ │ ├── BrokerLoansTable.tsx │ │ │ │ ├── BrokerTabs.tsx │ │ │ │ ├── LoanRow.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ ├── test/ │ │ │ │ │ ├── BrokerLoansTable.test.tsx │ │ │ │ │ ├── VaultLoans.test.tsx │ │ │ │ │ └── utils.test.ts │ │ │ │ └── utils.ts │ │ │ ├── VaultTransactions/ │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── test/ │ │ │ │ └── VaultTransactions.test.tsx │ │ │ ├── index.tsx │ │ │ ├── styles.scss │ │ │ ├── test/ │ │ │ │ ├── CurrencyToggle.test.tsx │ │ │ │ ├── Vault.test.tsx │ │ │ │ └── utils.test.ts │ │ │ └── utils.tsx │ │ ├── Vaults/ │ │ │ ├── VaultsTable.tsx │ │ │ ├── api.ts │ │ │ ├── index.tsx │ │ │ ├── test/ │ │ │ │ ├── api/ │ │ │ │ │ └── vaults.test.ts │ │ │ │ ├── index.test.tsx │ │ │ │ └── mock_data/ │ │ │ │ ├── aggregate_stats.json │ │ │ │ └── vaults.json │ │ │ ├── types.ts │ │ │ └── vaults.scss │ │ ├── shared/ │ │ │ ├── EmptyMessageTableRow.tsx │ │ │ ├── Interfaces.tsx │ │ │ ├── LoadMoreButton.tsx │ │ │ ├── NetworkContext.tsx │ │ │ ├── NumberFormattingUtils.ts │ │ │ ├── QueryClient.tsx │ │ │ ├── SocketContext.tsx │ │ │ ├── amendmentUtils.ts │ │ │ ├── analytics.ts │ │ │ ├── components/ │ │ │ │ ├── Account.tsx │ │ │ │ ├── Amount.tsx │ │ │ │ ├── CopyableText/ │ │ │ │ │ ├── CopyableText.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── test/ │ │ │ │ │ └── CopyableText.test.tsx │ │ │ │ ├── Currency.tsx │ │ │ │ ├── CurrencySwitch/ │ │ │ │ │ ├── CurrencySwitch.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── test/ │ │ │ │ │ └── CurrencySwitch.test.tsx │ │ │ │ ├── DexTradeTable/ │ │ │ │ │ ├── DexTradeTable.tsx │ │ │ │ │ ├── formatDexTrade.ts │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── test/ │ │ │ │ │ └── DexTradeTable.test.tsx │ │ │ │ ├── DomainLink.tsx │ │ │ │ ├── Dropdown/ │ │ │ │ │ ├── Dropdown.tsx │ │ │ │ │ ├── DropdownItem.tsx │ │ │ │ │ ├── dropdown.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ └── test/ │ │ │ │ │ ├── Dropdown.test.tsx │ │ │ │ │ └── DropdownItem.test.tsx │ │ │ │ ├── DualAxisAreaChart/ │ │ │ │ │ ├── DualAxisAreaChart.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── EmptyStateMessage/ │ │ │ │ │ ├── emptyStateMessage.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── tests/ │ │ │ │ │ └── index.test.tsx │ │ │ │ ├── HoldersTable/ │ │ │ │ │ ├── HoldersTable.tsx │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── test/ │ │ │ │ │ └── HoldersTable.test.tsx │ │ │ │ ├── JsonView/ │ │ │ │ │ ├── JsonView.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── json-view.scss │ │ │ │ │ └── test/ │ │ │ │ │ └── JsonView.test.tsx │ │ │ │ ├── Loader.tsx │ │ │ │ ├── MPTokenLink.tsx │ │ │ │ ├── NFTokenLink.tsx │ │ │ │ ├── Notification/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── tests/ │ │ │ │ │ └── index.test.tsx │ │ │ │ ├── PaginatedTable/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── test/ │ │ │ │ │ └── PaginatedTable.test.tsx │ │ │ │ ├── Pagination/ │ │ │ │ │ ├── Pagination.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── pagination.scss │ │ │ │ ├── ResponsiveTimestamp/ │ │ │ │ │ ├── ResponsiveTimestamp.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── styles.scss │ │ │ │ ├── Sequence.tsx │ │ │ │ ├── SortColumn.tsx │ │ │ │ ├── Streams/ │ │ │ │ │ ├── StreamsContext.tsx │ │ │ │ │ ├── StreamsProvider.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── TVLVolumeChart/ │ │ │ │ │ ├── TVLVolumeChart.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── test/ │ │ │ │ │ └── TVLVolumeChart.test.tsx │ │ │ │ ├── Tabs.tsx │ │ │ │ ├── TokenSearchResults/ │ │ │ │ │ ├── TokenSearchResults.tsx │ │ │ │ │ ├── TokenSearchRow.tsx │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── test/ │ │ │ │ │ ├── TokenSearchResults.test.js │ │ │ │ │ └── mock_data/ │ │ │ │ │ └── tokens.json │ │ │ │ ├── TokenTableRow.tsx │ │ │ │ ├── Tooltip/ │ │ │ │ │ ├── Tooltip.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useTooltip.tsx │ │ │ │ ├── Transaction/ │ │ │ │ │ ├── AMMBid/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── AMMBid.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── amm_bid.json │ │ │ │ │ ├── AMMClawback/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── AMMClawbackSimple.test.tsx │ │ │ │ │ │ ├── AMMClawbackTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── withAmount.json │ │ │ │ │ │ ├── withFlag.json │ │ │ │ │ │ └── withoutFlag.json │ │ │ │ │ ├── AMMCreate/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── AMMCreate.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── amm_create.json │ │ │ │ │ ├── AMMDelete/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── AMMDeleteDescription.test.tsx │ │ │ │ │ │ ├── AMMDeleteSimple.test.tsx │ │ │ │ │ │ ├── AMMDeleteTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── AMMDelete.json │ │ │ │ │ ├── AMMDeposit/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── AMMDeposit.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── deposit_both.json │ │ │ │ │ │ ├── deposit_eprice.json │ │ │ │ │ │ ├── deposit_fail.json │ │ │ │ │ │ ├── deposit_lptoken.json │ │ │ │ │ │ ├── deposit_nonxrp.json │ │ │ │ │ │ ├── deposit_usd.json │ │ │ │ │ │ └── deposit_xrp.json │ │ │ │ │ ├── AMMVote/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── AMMVote.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── amm_vote.json │ │ │ │ │ ├── AMMWithdraw/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── AMMWithdraw.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── withdraw.json │ │ │ │ │ │ ├── withdraw_all.json │ │ │ │ │ │ ├── withdraw_eprice.json │ │ │ │ │ │ ├── withdraw_usd.json │ │ │ │ │ │ └── withdraw_xrp.json │ │ │ │ │ ├── AccountDelete/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── AccountDeleteSimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── AccountDelete.json │ │ │ │ │ │ ├── AccountDeleteWithCredentialIDs.json │ │ │ │ │ │ └── AccountDeleteWithDestinationTag.json │ │ │ │ │ ├── AccountSet/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── AccountSetDescription.test.tsx │ │ │ │ │ │ ├── AccountSetSimple.test.tsx │ │ │ │ │ │ ├── AccountSetTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── AccountSetWithClearFlag.json │ │ │ │ │ │ ├── AccountSetWithDomain.json │ │ │ │ │ │ ├── AccountSetWithMessageKey.json │ │ │ │ │ │ ├── AccountSetWithNFTokenMinter.json │ │ │ │ │ │ └── AccountSetWithSetFlag.json │ │ │ │ │ ├── Batch/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── BatchDescription.test.tsx │ │ │ │ │ │ │ ├── BatchSimple.test.tsx │ │ │ │ │ │ │ ├── BatchTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── Batch.json │ │ │ │ │ │ │ ├── InnerTxFailed.json │ │ │ │ │ │ │ └── InnerTxSuccessful.json │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── Clawback/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── ClawbackDescription.test.tsx │ │ │ │ │ │ │ ├── ClawbackSimple.test.tsx │ │ │ │ │ │ │ ├── ClawbackTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── Clawback.json │ │ │ │ │ │ │ ├── ClawbackMPT.json │ │ │ │ │ │ │ ├── ClawbackMPT_Failure.json │ │ │ │ │ │ │ └── Clawback_Failure.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── CredentialAccept/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── CredentialAcceptSimple.test.tsx │ │ │ │ │ │ ├── CredentialAcceptTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── CredentialAccept.json │ │ │ │ │ ├── CredentialCreate/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── CredentialCreateSimple.test.tsx │ │ │ │ │ │ ├── CredentialCreateTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── CredentialCreate.json │ │ │ │ │ ├── CredentialDelete/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── CredentialDeleteSimple.test.tsx │ │ │ │ │ │ ├── CredentialDeleteTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── CredentialDelete.json │ │ │ │ │ ├── CredentialIDs.tsx │ │ │ │ │ ├── DIDDelete/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── DIDDeleteSimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── DIDDelete.json │ │ │ │ │ ├── DIDSet/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── DIDSetSimple.test.tsx │ │ │ │ │ │ ├── DIDSetTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── DIDSet.json │ │ │ │ │ ├── DefaultSimple.tsx │ │ │ │ │ ├── DelegateSet/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── DelegateSetDescription.test.tsx │ │ │ │ │ │ │ ├── DelegateSetSimple.test.tsx │ │ │ │ │ │ │ ├── DelegateSetTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ └── DelegateSet.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── DepositPreauth/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── DepositPreauthDescription.test.tsx │ │ │ │ │ │ │ ├── DepositPreauthSimple.test.tsx │ │ │ │ │ │ │ ├── DepositPreauthTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── DepositPreauth.json │ │ │ │ │ │ │ ├── DepositPreauthAuthorizeCredentials.json │ │ │ │ │ │ │ ├── DepositPreauthUnauthorize.json │ │ │ │ │ │ │ └── DepositPreauthUnauthorizeCredentials.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── EnableAmendment/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── EnableAmendmentSimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── EnableAmendmentWithEnabled.json │ │ │ │ │ │ ├── EnableAmendmentWithMajority.json │ │ │ │ │ │ ├── EnableAmendmentWithMinority.json │ │ │ │ │ │ ├── FeatureExpandedSignerList.json │ │ │ │ │ │ └── FeatureNegativeUNL.json │ │ │ │ │ ├── EscrowCancel/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── EscrowCancelDescription.test.tsx │ │ │ │ │ │ ├── EscrowCancelSimple.test.tsx │ │ │ │ │ │ ├── EscrowCancelTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── EscrowCancel.json │ │ │ │ │ ├── EscrowCreate/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── EscrowCreateDescription.test.tsx │ │ │ │ │ │ ├── EscrowCreateSimple.test.tsx │ │ │ │ │ │ ├── EscrowCreateTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── EscrowCreate.json │ │ │ │ │ │ └── EscrowCreateFinishFunction.json │ │ │ │ │ ├── EscrowFinish/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── EscrowFinishDescription.test.tsx │ │ │ │ │ │ ├── EscrowFinishSimple.test.tsx │ │ │ │ │ │ ├── EscrowFinishTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── EscrowFinish.json │ │ │ │ │ │ ├── EscrowFinishComputationAllowance.json │ │ │ │ │ │ └── EscrowFinishWithCredentialIDs.json │ │ │ │ │ ├── LoanBrokerCoverClawback/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── LoanBrokerCoverClawbackSimple.test.tsx │ │ │ │ │ │ │ ├── LoanBrokerCoverClawbackTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── LoanBrokerCoverClawback.json │ │ │ │ │ │ │ ├── LoanBrokerCoverClawbackMPT.json │ │ │ │ │ │ │ ├── LoanBrokerCoverClawbackNoAmount.json │ │ │ │ │ │ │ └── LoanBrokerCoverClawbackZeroAmount.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── LoanBrokerCoverDeposit/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── LoanBrokerCoverDepositSimple.test.tsx │ │ │ │ │ │ │ ├── LoanBrokerCoverDepositTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ └── LoanBrokerCoverDeposit.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── LoanBrokerCoverWithdraw/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── LoanBrokerCoverWithdrawSimple.test.tsx │ │ │ │ │ │ │ ├── LoanBrokerCoverWithdrawTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ └── LoanBrokerCoverWithdraw.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── LoanBrokerDelete/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── LoanBrokerDeleteSimple.test.tsx │ │ │ │ │ │ │ ├── LoanBrokerDeleteTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ └── LoanBrokerDelete.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── LoanBrokerSet/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── LoanBrokerSetSimple.test.tsx │ │ │ │ │ │ │ ├── LoanBrokerSetTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── LoanBrokerSet.json │ │ │ │ │ │ │ ├── LoanBrokerSetPartialUpdate.json │ │ │ │ │ │ │ └── LoanBrokerSetZeroDebt.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── LoanDelete/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── LoanDeleteSimple.test.tsx │ │ │ │ │ │ │ ├── LoanDeleteTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ └── LoanDelete.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── LoanManage/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── LoanManageSimple.test.tsx │ │ │ │ │ │ │ ├── LoanManageTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ └── LoanManage.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── LoanPay/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── LoanPaySimple.test.tsx │ │ │ │ │ │ │ ├── LoanPayTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ └── LoanPay.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── LoanSet/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── LoanSetSimple.test.tsx │ │ │ │ │ │ │ ├── LoanSetTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ └── LoanSet.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── MPTokenAuthorize/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── MPTokenAuthorizeSimple.test.jsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── MPTokenAuthorize.json │ │ │ │ │ │ ├── MPTokenAuthorize_Fail.json │ │ │ │ │ │ ├── MPTokenAuthorize_WithHolder.json │ │ │ │ │ │ └── MPTokenAuthorize_WithHolderFail.json │ │ │ │ │ ├── MPTokenIssuanceCreate/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── styles.scss │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── MPTokenIssuanceCreateSimple.test.jsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ └── MPTokenIssuanceCreate.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── MPTokenIssuanceDestroy/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── MPTokenIssuanceDestroySimple.test.jsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── MPTokenIssuanceDestroy.json │ │ │ │ │ │ └── MPTokenIssuanceDestroy_Fail.json │ │ │ │ │ ├── MPTokenIssuanceSet/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── MPTokenIssuanceSetSimple.test.jsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── MPTokenIssuanceSet.json │ │ │ │ │ │ ├── MPTokenIssuanceSet_Fail.json │ │ │ │ │ │ └── MPTokenIssuanceSet_NoHolder.json │ │ │ │ │ ├── NFTokenAcceptOffer/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── NFTokenAcceptOfferSimple.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── NFTokenAcceptOffer_Broker.json │ │ │ │ │ │ │ ├── NFTokenAcceptOffer_Buy.json │ │ │ │ │ │ │ ├── NFTokenAcceptOffer_Failure.json │ │ │ │ │ │ │ └── NFTokenAcceptOffer_Sell.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── NFTokenBurn/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── NFTokenBurnSimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── NFTokenBurn.json │ │ │ │ │ │ └── NFTokenBurnByIssuer.json │ │ │ │ │ ├── NFTokenCancelOffer/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── NFTokenCancelOfferSimple.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ └── NFTokenCancelOffer.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── NFTokenCreateOffer/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── NFTokenCreateOfferSimple.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── NFTokenCreateOfferDestination.json │ │ │ │ │ │ │ ├── NFTokenCreateOfferFailed.json │ │ │ │ │ │ │ ├── NFTokenCreateOffer_Buy.json │ │ │ │ │ │ │ └── NFTokenCreateOffer_Sell.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── NFTokenMint/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── NFTokenMintSimple.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── NFTokenMintFailed.json │ │ │ │ │ │ │ ├── NFTokenMintModified1Created1.json │ │ │ │ │ │ │ ├── NFTokenMintModified2.json │ │ │ │ │ │ │ ├── NFTokenMintModified4Created1.json │ │ │ │ │ │ │ ├── NFTokenMintMostModified2Created1.json │ │ │ │ │ │ │ ├── NFTokenMintNullURI.json │ │ │ │ │ │ │ └── NFTokenMintWithIssuer.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── OfferCancel/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── OfferCancelDescription.test.tsx │ │ │ │ │ │ ├── OfferCancelSimple.test.tsx │ │ │ │ │ │ ├── OfferCancelTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── OfferCancel.json │ │ │ │ │ ├── OfferCreate/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── OfferCreateDescription.test.tsx │ │ │ │ │ │ ├── OfferCreateSimple.test.tsx │ │ │ │ │ │ ├── OfferCreateTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── OfferCreate.json │ │ │ │ │ │ ├── OfferCreateInvertedCurrencies.json │ │ │ │ │ │ ├── OfferCreateWithExpiration.json │ │ │ │ │ │ ├── OfferCreateWithExpirationAndCancel.json │ │ │ │ │ │ ├── OfferCreateWithMissingPreviousFields.json │ │ │ │ │ │ └── OfferCreateWithPermissionedDomainID.json │ │ │ │ │ ├── OracleDelete/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── OracleDeleteSimple.test.tsx │ │ │ │ │ │ ├── OracleDeleteTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── OracleDelete.json │ │ │ │ │ ├── OracleSet/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── ConvertScalePrice.test.ts │ │ │ │ │ │ ├── OracleSetSimple.test.tsx │ │ │ │ │ │ ├── OracleSetTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── OracleSet.json │ │ │ │ │ ├── Payment/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── PaymentDescription.test.tsx │ │ │ │ │ │ │ ├── PaymentSimple.test.tsx │ │ │ │ │ │ │ ├── PaymentTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── Payment.json │ │ │ │ │ │ │ ├── PaymentMPT.json │ │ │ │ │ │ │ ├── PaymentWithConvert.json │ │ │ │ │ │ │ ├── PaymentWithCredentialIDs.json │ │ │ │ │ │ │ ├── PaymentWithDestinationTag.json │ │ │ │ │ │ │ ├── PaymentWithPartial.json │ │ │ │ │ │ │ ├── PaymentWithPermDomainID.json │ │ │ │ │ │ │ ├── PaymentWithSendMax.json │ │ │ │ │ │ │ └── PaymentWithSourceTag.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── PaymentChannelClaim/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── PaymentChannelClaimDescription.test.tsx │ │ │ │ │ │ │ ├── PaymentChannelClaimSimple.test.tsx │ │ │ │ │ │ │ ├── PaymentChannelClaimTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── PaymentChannelClaim.json │ │ │ │ │ │ │ ├── PaymentChannelClaimCloseDenied.json │ │ │ │ │ │ │ ├── PaymentChannelClaimClosed.json │ │ │ │ │ │ │ ├── PaymentChannelClaimWithCredentialIDs.json │ │ │ │ │ │ │ └── PaymentChannelClaimWithDestinationTag.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── PaymentChannelCreate/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── PaymentChannelCreateDescription.test.tsx │ │ │ │ │ │ │ ├── PaymentChannelCreateSimple.test.tsx │ │ │ │ │ │ │ ├── PaymentChannelCreateTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── PaymentChannelCreate.json │ │ │ │ │ │ │ ├── PaymentChannelCreateFailed.json │ │ │ │ │ │ │ └── PaymentChannelCreateWithDestinationTag.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── PaymentChannelFund/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── PaymentChannelFundDescription.test.tsx │ │ │ │ │ │ │ ├── PaymentChannelFundSimple.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── PaymentChannelFund.json │ │ │ │ │ │ │ └── PaymentChannelFundFailed.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── PermissionedDomainDelete/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── PermissionedDomainDeleteSimple.test.tsx │ │ │ │ │ │ ├── PermissionedDomainDeleteTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── PermissionedDomainDelete.json │ │ │ │ │ ├── PermissionedDomainSet/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── PermissionedDomainSetSimple.test.tsx │ │ │ │ │ │ ├── PermissionedDomainSetTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── PermissionedDomainSet.json │ │ │ │ │ ├── README.md │ │ │ │ │ ├── SetFee/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── SetFeeDescription.test.tsx │ │ │ │ │ │ │ ├── SetFeeSimple.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── SetFee_PostAmendment.json │ │ │ │ │ │ │ └── SetFee_PreAmendment.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── SetHook/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── SetHookSimple.test.tsx │ │ │ │ │ │ │ ├── mock_data/ │ │ │ │ │ │ │ │ ├── SetHook.json │ │ │ │ │ │ │ │ ├── SetHook2.json │ │ │ │ │ │ │ │ └── SetHookFailure.json │ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── SetRegularKey/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── SetRegularKeyDescription.test.tsx │ │ │ │ │ │ ├── SetRegularKeySimple.test.tsx │ │ │ │ │ │ ├── SetRegularKeyTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── SetRegularKey.json │ │ │ │ │ │ └── SetRegularKeyUnsetKey.json │ │ │ │ │ ├── SignerListSet/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── SignerListSetDescription.test.tsx │ │ │ │ │ │ │ ├── SignerListSetSimple.test.tsx │ │ │ │ │ │ │ ├── SignerListSetTableDetail.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── SignerListSet.json │ │ │ │ │ │ │ └── SignerListSetClear.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── SimpleGroup.tsx │ │ │ │ │ ├── SimpleRow.tsx │ │ │ │ │ ├── TicketCreate/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── TicketCreateSimple.test.tsx │ │ │ │ │ │ ├── TicketCreateTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── TicketCreate.json │ │ │ │ │ ├── TrustSet/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── TrustSetDescription.test.tsx │ │ │ │ │ │ ├── TrustSetSimple.test.tsx │ │ │ │ │ │ ├── TrustSetTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── TrustSet.json │ │ │ │ │ ├── UNLModify/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── UNLModifySimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── UNLModifyDisable.json │ │ │ │ │ │ └── UNLModifyEnable.json │ │ │ │ │ ├── VaultClawback/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── VaultClawbackDescription.test.tsx │ │ │ │ │ │ ├── VaultClawbackSimple.test.tsx │ │ │ │ │ │ ├── VaultClawbackTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── VaultClawback.json │ │ │ │ │ ├── VaultCreate/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── VaultCreateDescription.test.tsx │ │ │ │ │ │ ├── VaultCreateSimple.test.tsx │ │ │ │ │ │ ├── VaultCreateTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── VaultCreate.json │ │ │ │ │ ├── VaultDelete/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── VaultDeleteDescription.test.tsx │ │ │ │ │ │ ├── VaultDeleteSimple.test.tsx │ │ │ │ │ │ ├── VaultDeleteTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── VaultDelete.json │ │ │ │ │ ├── VaultDeposit/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── VaultDepositDescription.test.tsx │ │ │ │ │ │ ├── VaultDepositSimple.test.tsx │ │ │ │ │ │ ├── VaultDepositTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── VaultDeposit.json │ │ │ │ │ ├── VaultSet/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── VaultSetDescription.test.tsx │ │ │ │ │ │ ├── VaultSetSimple.test.tsx │ │ │ │ │ │ ├── VaultSetTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── VaultSet.json │ │ │ │ │ ├── VaultWithdraw/ │ │ │ │ │ │ ├── Description.tsx │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── TableDetail.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── VaultWithdrawDescription.test.tsx │ │ │ │ │ │ ├── VaultWithdrawSimple.test.tsx │ │ │ │ │ │ ├── VaultWithdrawTableDetail.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ └── VaultWithdraw.json │ │ │ │ │ ├── XChainAccountCreateCommit/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── XChainAccountCreateCommitSimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── XChainAccountCreateCommit.json │ │ │ │ │ │ └── XChainAccountCreateCommitInsufficientFunds.json │ │ │ │ │ ├── XChainAddAccountCreateAttestation/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── XChainAddAccountCreateAttestationSimple.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── XChainAddAccountCreateAttestation.json │ │ │ │ │ │ │ └── XChainAddAccountCreateAttestationFailed.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── XChainAddClaimAttestation/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── XChainAddClaimAttestationSimple.test.tsx │ │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ │ ├── XChainAddClaimAttestation.json │ │ │ │ │ │ │ └── XChainAddClaimAttestationFailed.json │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── XChainBridge.tsx │ │ │ │ │ ├── XChainClaim/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── XChainClaimSimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── XChainClaim.json │ │ │ │ │ │ └── XChainClaimNoQuorum.json │ │ │ │ │ ├── XChainCommit/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── XChainCommitSimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── XChainCommit.json │ │ │ │ │ │ └── XChainCommitInsufficientFunds.json │ │ │ │ │ ├── XChainCreateBridge/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── XChainCreateBridgeSimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── XChainCreateBridge.json │ │ │ │ │ │ ├── XChainCreateBridgeFailed.json │ │ │ │ │ │ └── XChainCreateBridgeIOU.json │ │ │ │ │ ├── XChainCreateClaimID/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── XChainCreateClaimIDSimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── XChainCreateClaimID.json │ │ │ │ │ │ └── XChainCreateClaimIDFailed.json │ │ │ │ │ ├── XChainModifyBridge/ │ │ │ │ │ │ ├── Simple.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── parser.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── XChainModifyBridgeSimple.test.tsx │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── XChainModifyBridge.json │ │ │ │ │ │ ├── XChainModifyBridgeMinAccountCreateAmount.json │ │ │ │ │ │ └── XChainModifyBridgeNoEntry.json │ │ │ │ │ ├── defaultParser.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── DefaultSimple.test.tsx │ │ │ │ │ │ ├── createWrapperFactory.tsx │ │ │ │ │ │ ├── expectations.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── mock_data/ │ │ │ │ │ │ ├── NewEscrowCreate.json │ │ │ │ │ │ ├── SetHook.json │ │ │ │ │ │ ├── SetHook2.json │ │ │ │ │ │ └── TokenSwapPropose.json │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils/ │ │ │ │ │ └── vaultUtils.ts │ │ │ │ ├── TransactionActionIcon/ │ │ │ │ │ ├── TransactionActionIcon.tsx │ │ │ │ │ └── test/ │ │ │ │ │ └── TransactionActionIcon.test.tsx │ │ │ │ ├── TransactionTable/ │ │ │ │ │ ├── TransactionTable.tsx │ │ │ │ │ ├── TransactionTableRow.tsx │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── test/ │ │ │ │ │ ├── TransactionTable.test.js │ │ │ │ │ └── mockTransactions.json │ │ │ │ ├── TxDetails.tsx │ │ │ │ ├── TxLabel.tsx │ │ │ │ ├── TxStatus.tsx │ │ │ │ ├── TxToken.tsx │ │ │ │ ├── VHSValidators/ │ │ │ │ │ ├── VHSValidatorsContext.tsx │ │ │ │ │ ├── VHSValidatorsProvider.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ └── test/ │ │ │ │ ├── Account.test.tsx │ │ │ │ ├── Amount.test.tsx │ │ │ │ ├── Currency.test.tsx │ │ │ │ ├── DomainLink.test.tsx │ │ │ │ ├── Loader.test.tsx │ │ │ │ ├── NFTokenLink.test.tsx │ │ │ │ ├── TxLabel.test.tsx │ │ │ │ ├── TxStatus.test.tsx │ │ │ │ └── TxToken.test.tsx │ │ │ ├── css/ │ │ │ │ ├── box.scss │ │ │ │ ├── data-tables-mobile.scss │ │ │ │ ├── data-tables-notice.scss │ │ │ │ ├── form.scss │ │ │ │ ├── global.scss │ │ │ │ ├── info-card.scss │ │ │ │ ├── loader.scss │ │ │ │ ├── simpleTab.scss │ │ │ │ ├── sort.scss │ │ │ │ ├── table.scss │ │ │ │ ├── tabs.scss │ │ │ │ ├── tooltip.scss │ │ │ │ ├── txlabel.scss │ │ │ │ ├── txstatus.scss │ │ │ │ └── variables.scss │ │ │ ├── helpers/ │ │ │ │ ├── contextFactory.ts │ │ │ │ └── index.ts │ │ │ ├── hooks/ │ │ │ │ ├── index.ts │ │ │ │ ├── test/ │ │ │ │ │ ├── useCursorPaginatedQuery.test.tsx │ │ │ │ │ ├── useTokenToUSDRate.test.tsx │ │ │ │ │ └── useXRPToUSDRate.test.tsx │ │ │ │ ├── useCursorPaginatedQuery.ts │ │ │ │ ├── useLocalStorage.ts │ │ │ │ ├── usePreviousWithPausing.tsx │ │ │ │ ├── useTokenToUSDRate.ts │ │ │ │ └── useXRPToUSDRate.ts │ │ │ ├── log.ts │ │ │ ├── losTypes.ts │ │ │ ├── metaParser.tsx │ │ │ ├── mptUtils.ts │ │ │ ├── navigate.ts │ │ │ ├── routing.tsx │ │ │ ├── services/ │ │ │ │ └── CursorPaginationService.ts │ │ │ ├── test/ │ │ │ │ ├── NumberFormattingUtils.test.ts │ │ │ │ ├── SocketContext.test.ts │ │ │ │ ├── amendmentUtils.test.ts │ │ │ │ ├── notification.test.tsx │ │ │ │ ├── txDetails.test.js │ │ │ │ └── utils.test.ts │ │ │ ├── transactionUtils.ts │ │ │ ├── types.ts │ │ │ ├── utils.js │ │ │ └── vhsTypes.ts │ │ └── test/ │ │ ├── QueryClient.ts │ │ ├── mockWsClient.js │ │ └── utils.tsx │ ├── i18n/ │ │ ├── baseConfig.ts │ │ ├── formatters.ts │ │ ├── index.ts │ │ ├── test/ │ │ │ └── formatters.test.ts │ │ ├── testConfig.ts │ │ └── testConfigEnglish.ts │ ├── index.html │ ├── index.tsx │ ├── registerServiceWorker.js │ ├── rippled/ │ │ ├── NFTTransactions.ts │ │ ├── accountState.ts │ │ ├── accountTransactions.ts │ │ ├── index.ts │ │ ├── ledgers.ts │ │ ├── lib/ │ │ │ ├── convertRippleDate.ts │ │ │ ├── formatSignerList.ts │ │ │ ├── logger.ts │ │ │ ├── rippled.ts │ │ │ ├── summarizeLedger.ts │ │ │ ├── test/ │ │ │ │ ├── rippled.test.ts │ │ │ │ └── utils.test.ts │ │ │ ├── txSummary/ │ │ │ │ ├── formatAmount.ts │ │ │ │ └── index.ts │ │ │ └── utils.ts │ │ ├── nUNL.ts │ │ ├── offers.ts │ │ ├── quorum.ts │ │ ├── test/ │ │ │ └── accountTransactions.test.ts │ │ ├── token.ts │ │ └── transactions.ts │ └── setupTests.ts ├── testUtils/ │ ├── cssTransform.js │ ├── imageTransform.js │ ├── svgTransform.js │ └── svgUrlTransform.js ├── tsconfig.json └── vite.config.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .eslintignore ================================================ build/ coverage/ node_modules/ src/registerServiceWorker.js ================================================ FILE: .eslintrc.js ================================================ module.exports = { extends: [ 'airbnb', 'react-app', 'plugin:jsx-a11y/recommended', 'plugin:import/typescript', 'prettier', ], plugins: ['jsx-a11y', 'prettier', 'import'], settings: { 'import/resolver': { typescript: { alwaysTryTypes: true, project: './tsconfig.json', }, node: { extensions: ['.js', '.jsx', '.ts', '.tsx'], }, }, }, env: { browser: true, node: true, jest: true, es6: true, }, rules: { 'prettier/prettier': [ 'error', { endOfLine: 'auto', }, ], 'react/jsx-filename-extension': [ 1, { extensions: ['.ts', '.tsx', '.js', '.jsx'], }, ], 'jsx-a11y/anchor-is-valid': [ 'warn', { aspects: ['invalidHref'], }, ], 'no-bitwise': 'off', 'import/extensions': [ 'error', 'ignorePackages', { js: 'never', jsx: 'never', ts: 'never', tsx: 'never', }, ], 'react/jsx-uses-react': 'off', 'react/react-in-jsx-scope': 'off', 'react/require-default-props': 'off', 'import/prefer-default-export': 'off', 'no-use-before-define': 'off', '@typescript-eslint/no-use-before-define': ['error'], 'import/no-extraneous-dependencies': [ 'error', { devDependencies: [ '**/*.test.{js,jsx,ts,tsx}', '**/test/**', '**/setupTests.ts', '**/svgTransform.js', ], }, ], 'no-shadow': 'off', '@typescript-eslint/no-shadow': 'error', 'no-promise-executor-return': 'off', 'react/function-component-definition': 'off', }, parser: '@typescript-eslint/parser', parserOptions: { allowImportExportEverywhere: true, }, globals: { ga: true, }, } ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: npm directory: '/' schedule: interval: quarterly time: '15:00' open-pull-requests-limit: 30 ================================================ FILE: .github/pull_request_template.md ================================================ ## High Level Overview of Change ### Context of Change ### Type of Change - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] Refactor (non-breaking change that only restructures code) - [ ] Tests (You added tests for code that already exists, or your new feature included in this PR) - [ ] Documentation Updates - [ ] Translation Updates - [ ] Release ### Codebase Modernization - [ ] Updated files to React Hooks - [ ] Updated files to TypeScript ## Before / After ## Test Plan ================================================ FILE: .github/workflows/copilot-setup-steps.yml ================================================ name: Copilot Setup Steps env: NODE_VERSION: 22.x VITE_VALIDATOR: vl.ripple.com VITE_RIPPLED_WS_PORT: 51233 VITE_RIPPLED_HOST: fake.rippled.example.com VITE_MAINNET_LINK: mainnet.example.com VITE_TESTNET_LINK: testnet.example.com VITE_CUSTOMNETWORK_LINK: custom.example.com VITE_DATA_URL: https://data.xrpl.org/v1/network on: workflow_dispatch: push: branches: [main] pull_request: branches: [main] jobs: copilot-setup: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Cache node modules id: cache-nodemodules uses: actions/cache@v4 env: cache-name: cache-node-modules with: # caching node_modules path: node_modules key: ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}- ${{ env.NODE_VERSION }}-build- - name: Install Dependencies if: steps.cache-nodemodules.outputs.cache-hit != 'true' run: npm ci ================================================ FILE: .github/workflows/nodejs.yml ================================================ name: Explorer CI on: push: branches: [main] pull_request: workflow_dispatch: env: NODE_VERSION: 22.x jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Cache node modules id: cache-nodemodules uses: actions/cache@v4 env: cache-name: cache-node-modules with: # caching node_modules path: node_modules key: ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}- ${{ env.NODE_VERSION }}-build- - name: Install Dependencies if: steps.cache-nodemodules.outputs.cache-hit != 'true' run: npm ci - run: | npm run lint:ci # This runs the pre-commit hooks defined in .pre-commit-config.yaml - uses: pre-commit/action@v3.0.1 test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Cache node modules id: cache-nodemodules uses: actions/cache@v4 env: cache-name: cache-node-modules with: # caching node_modules path: node_modules key: ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}- ${{ env.NODE_VERSION }}-build- - name: Install Dependencies if: steps.cache-nodemodules.outputs.cache-hit != 'true' run: npm ci - run: npm run test:ci env: VITE_VALIDATOR: vl.ripple.com VITE_RIPPLED_WS_PORT: 51233 VITE_RIPPLED_HOST: fake.rippled.example.com VITE_MAINNET_LINK: mainnet.example.com VITE_TESTNET_LINK: testnet.example.com VITE_CUSTOMNETWORK_LINK: custom.example.com VITE_DATA_URL: https://data.xrpl.org/v1/network build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Cache node modules id: cache-nodemodules uses: actions/cache@v4 env: cache-name: cache-node-modules with: # caching node_modules path: node_modules key: ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}- ${{ env.NODE_VERSION }}-build- - name: Install Dependencies if: steps.cache-nodemodules.outputs.cache-hit != 'true' run: npm ci - run: npm run build typescript-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Cache node modules id: cache-nodemodules uses: actions/cache@v4 env: cache-name: cache-node-modules with: # caching node_modules path: node_modules key: ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ env.NODE_VERSION }}-build-${{ env.cache-name }}- ${{ env.NODE_VERSION }}-build- - name: Install Dependencies if: steps.cache-nodemodules.outputs.cache-hit != 'true' run: npm ci - run: npm run build-ts ================================================ FILE: .gitignore ================================================ # Dependency directories node_modules/ # testing /coverage # production /build src/**/*.css src/**/*.css.map # misc .DS_Store .env.local .env.development.local .env.test.local .env.production.local .env .node-version .claude/ # Logs npm-debug.log* # Runtime data pids *.pid *.seed *.pid.lock # Optional npm cache directory .npm # Optional eslint cache .eslintcache # Output of 'npm pack' *.tgz # FACEBOOK GITIGNORE (https://github.com/facebook/react/blob/master/.gitignore) .DS_STORE node_modules *~ *.pyc static .grunt _SpecRunner.html __benchmarks__ build/ remote-repo/ coverage/ .module-cache *.gem docs/.bundle docs/code docs/_site docs/.sass-cache docs/js/* docs/downloads/*.zip docs/vendor/bundle fixtures/dom/public/react-dom.js fixtures/dom/public/react.js test/the-files-to-test.generated.js *.log* chrome-user-data *.sublime-project *.sublime-workspace .idea *.iml *.swp *.swo *react*min*.js #DEV deployment deploy.sh #ENV .env ================================================ FILE: .npmrc ================================================ engine-strict=true ================================================ FILE: .nvmrc ================================================ v22.14.0 ================================================ FILE: .pre-commit-config.yaml ================================================ # .pre-commit-config.yaml repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - id: check-case-conflict - id: check-illegal-windows-names - id: check-json - id: check-merge-conflict - id: check-symlinks - id: check-yaml - id: detect-private-key - id: end-of-file-fixer - id: fix-byte-order-marker - id: forbid-submodules - id: mixed-line-ending - id: trailing-whitespace - repo: https://github.com/rbubley/mirrors-prettier rev: 5ba47274f9b181bce26a5150a725577f3c336011 # frozen: v3.6.2 hooks: - id: prettier args: [--no-semi] ================================================ FILE: .prettierignore ================================================ build/ coverage/ node_modules/ ================================================ FILE: .stylelintrc.js ================================================ module.exports = { plugins: ['stylelint-scss'], extends: [ 'stylelint-config-standard', 'stylelint-config-recommended-scss', 'stylelint-config-idiomatic-order', ], rules: { 'at-rule-empty-line-before': null, 'import-notation': 'string', 'length-zero-no-unit': null, }, } ================================================ FILE: .vscode/extensions.json ================================================ { "recommendations": [ "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "stylelint.vscode-stylelint", "vespa-dev-works.jestrunit" ] } ================================================ FILE: .vscode/settings.json ================================================ { "editor.tabSize": 2, "[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }, "[javascriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }, "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }, "[typescriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }, "javascript.preferences.importModuleSpecifier": "relative", "typescript.preferences.importModuleSpecifier": "relative", "eslint.alwaysShowStatus": true, "eslint.lintTask.enable": true, "eslint.codeAction.showDocumentation": { "enable": true }, "eslint.workingDirectories": [ { "directory": "./server", "changeProcessCWD": true }, { "directory": "./src", "changeProcessCWD": true } ], "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", "source.fixAll.stylelint": "explicit" }, "files.insertFinalNewline": true, "files.trimFinalNewlines": true, "files.trimTrailingWhitespace": true, "jestRunIt.jestPath": "./backend/node_modules/.bin/jest", "jestRunIt.jestConfigPath": "./backend/jest.config.js", "css.validate": false, "scss.validate": false, "stylelint.validate": ["css", "scss"], "search.exclude": { "**/node_modules": true, "**/*.code-search": true, "**/*.svg": true, "**/test/mock_data": true, "package-lock.json": true, "**/test/*.json": true }, "cSpell.words": [ "camelcase", "chopa", "chopb", "cimode", "clawback", "clsx", "ctid", "CUSTOMNETWORK", "Decomp", "esbuild", "fakenode", "Hant", "healthz", "hexbin", "middlewares", "MILLIS", "moxios", "mptoken", "mpts", "nftoken", "nodemodules", "pageview", "paychannel", "paychannels", "permissioned", "setfee", "stylelint", "svgr", "topojson", "trustlines", "Txns", "unauth", "VITE", "Xahau", "xchain", "xchainbridge" ] } ================================================ FILE: @types/env.d.ts ================================================ declare module '*.png' declare module '*.svg' declare module '*.jpeg' declare module '*.jpg' ================================================ FILE: @types/i18next.d.ts ================================================ // import the original type declarations import 'i18next' import defaultTranslations from '../public/locales/en-US/translations.json' export type defaultTranslationsKey = keyof typeof defaultTranslations export interface I18nextCustomTypeOptions { returnNull: false // custom namespace type if you changed it defaultNS: 'translations' // custom resources type resources: { translations: typeof defaultTranslations } } // react-i18next versions higher than 11.11.0 declare module 'i18next' { // and extend them! interface CustomTypeOptions extends I18nextCustomTypeOptions {} } ================================================ FILE: @types/index.d.ts ================================================ export {} // ensure types are picked up externally declare global { interface Window { dataLayer: any[] } } ================================================ FILE: @types/react-i18next.d.ts ================================================ // import the original type declarations import 'react-i18next' // react-i18next versions higher than 11.11.0 declare module 'react-i18next' { // and extend them! interface CustomTypeOptions extends I18nextCustomTypeOptions {} } ================================================ FILE: @types/svgr.d.ts ================================================ /// ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of, but not limited to characteristics like age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: - Using welcoming and inclusive language - Being respectful of differing viewpoints and experiences - Gracefully accepting constructive criticism - Focusing on what is best for the community - Showing empathy towards other community members Examples of behavior that does not contribute to creating a positive environment include: - Using sexualized language or imagery and unwelcome sexual attention or advances - Trolling, insulting/derogatory comments, and personal or political attacks - Public or private harassment - Publishing others' private information, such as a physical or electronic address, without explicit permission - Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, harmful, or otherwise in violation of this Code of Conduct. ## Scope This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at . All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing Thanks for contributing to the explorer! We're thrilled you're interested and your help is greatly appreciated. Contributing is a great way to learn about the XRP Ledger (XRPL). ## Repository Layout - [server/](server/) - Backend code lives here - [src](src/) - Frontend code lives here - [public](public/) - Translations, fonts, and other misc files live here - [.env](.env.example) - Environment variables ## Git setup You need only to do this once and you have probably already done this if you already use git. 1. Download git. 2. Set your email address and name: 3. git config --global user.email your@some-email.com 4. git config --global user.name “Your Name Here” ### Fork the repository 1. Create a GitHub account if you haven’t already. Let’s assume your git account name is username. 2. Go to https://github.com/ripple/explorer. 3. Click on the “Watch”, “Star” and “Fork” buttons in the top right. 4. That last command will fork a new copy of the repo in your personal git area at https://github.com/username/explorer ### Clone the repository on your local machine. ``` $ git clone git@github.com:username/explorer.git --branch main $ cd explorer $ git remote add upstream git@github.com:ripple/explorer.git ``` ### Start work in a new branch. ``` $ git fetch upstream main $ git checkout main $ git checkout -b your-branch-name $ git push --set-upstream origin your-branch-name ``` Bring in recent changes to the “main” branch into your own branch ``` $ git fetch upstream main $ git pull upstream main ``` ### Ask to submit code from a branch of your GitHub fork. You must submit a pushed branch of your GitHub fork. 1. Go to your fork of the code at https://github.com/username/explorer. 2. Select the branch you want reviewed from the grey “branch” menu on the left of the page. 3. Click on the green button marked “Compare & pull request” on the right of the page. 4. Fill in the PR template, then press the green “Send pull request” button on the right side. ## Requirements for a Successful Pull Request Before being considered for review or merging, each pull request must: - Pass tests and linter locally - running `$ npm run test` and `$ npm run lint` should show no errors or create additional warnings. - Be [marked as drafts](https://github.blog/2019-02-14-introducing-draft-pull-requests/) until they are ready for review. - Adhere to the [code of conduct](CODE_OF_CONDUCT.md) for this repository. All new react components must be [function components](https://reactjs.org/docs/components-and-props.html) unless there is good reason to use classes. ## CSS linting rules are extended from 1. [stylelint-config-standard](https://github.com/stylelint/stylelint-config-standard) 1. [stylelint-config-recommended-scss](https://github.com/kristerkari/stylelint-config-recommended-scss) 1. [stylelint-config-idiomatic-order](https://github.com/ream88/stylelint-config-idiomatic-order) ## JSON viewer We are using [react18-json-view](https://github.com/YYsuni/react18-json-view) ## Analytics We are using Google Analytics. For more info read the [documentation](https://developers.google.com/analytics/devguides/collection/analyticsjs/) ## Visual Studio Code IDE [VSC](https://code.visualstudio.com/) is fast and reliable IDE if you choose to use it please do a following configurations ### Install Extensions 1. DotENV 1. ESLint 1. Prettier - Code formatter ### User Settings ``` { "explorer.confirmDelete": false, "editor.formatOnSave": true, "stylelint.enable": true, "files.exclude": { "node_modules/": true, "coverage/": true, "build/": true, "src/**/*.css": true } } ``` ## Useful Chrome add-on - [Dom listener](https://chrome.google.com/webstore/detail/domlistener/jlfdgnlpibogjanomigieemaembjeolj?hl=en) - [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi/related?hl=en) - [Postman](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop/related?hl=en) ## Basic security ### Update module dependencies 1. `npm install -g npm-check-updates` 1. to see the available updates `ncu` 1. to update the package.json `ncu -u` 1. [documentation](https://www.npmjs.com/package/npm-check-updates) ### Clean your package.json 1. `npm install -g fixpack` 1. to re-write package.json run `fixpack` 1. [documentation](https://www.npmjs.com/package/fixpack) ### Node Security (nsp) 1. `npm install -g nsp` 1. to check for security issues run `nsp check --output summary` 1. [documentation](https://www.npmjs.com/package/nsp) ## bash_profile 1. `vim ~/.bash_profile` 1. paste the following config ``` ## Show branch name in color function parse_git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } RED="\[\033[0;31m\]" YELLOW="\[\033[0;33m\]" GREEN="\[\033[0;32m\]" NO_COLOR="\[\033[0m\]" PS1="$GREEN\u@\h$NO_COLOR:\w$YELLOW\$(parse_git_branch)$NO_COLOR\$ " ``` ## .gitconfig 1. `vim ~/.gitconfig` 1. paste the following config ``` ## This is Git's per-user configuration file. [user] name = %YOUR_NAME% email = %YOUR_EMAIL% [alias] co = checkout ci = commit st = status br = branch hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short type = cat-file -t dump = cat-file -p unstage = reset HEAD -- last = log -1 HEAD ``` ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2018 Ripple Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ [![Release](https://img.shields.io/github/v/release/ripple/explorer.svg)](https://github.com/ripple/explorer/releases) [![Build](https://github.com/ripple/explorer/actions/workflows/nodejs.yml/badge.svg)](https://github.com/ripple/explorer/actions) [![License](https://img.shields.io/github/license/ripple/explorer)](https://github.com/ripple/explorer/blob/main/LICENSE) # XRPL Explorer This repo contains the source code for the block explorer of the XRP Ledger hosted at livenet.xrpl.org. This project uses [Vite](https://vitejs.dev/). You can find information about how to use it [here](https://vitejs.dev/guide/cli.html). ## Basic requirements ### Install Node and NPM The project requires node@22. Follow installation instructions on [nodejs.org](https://nodejs.org/en/). (Recommended) Install using [nvm](https://github.com/nvm-sh/nvm). Make sure to use npm version 8+ by running `npm install -g npm@latest` after you install Node. ### Copy example env `cp .env.example .env` ## Install, compile, and run - `npm install` then - `npm start` for development mode, or - `npm run build` then `npm run prod-server` for production mode ### Installing on Apple Silicon Since `canvas` does not provide pre-built binaries for Apple chips during `npm install` it will try to compile it manually. To get this to succeed you need to install several dependencies by following the instructions [here](https://github.com/Automattic/node-canvas#compiling). ## Running on Parallel Networks ### Testnet mode 1. Replace `VITE_RIPPLED_HOST=s2.ripple.com` with `VITE_RIPPLED_HOST=s.altnet.rippletest.net` in the `.env` file 1. Add `VITE_ENVIRONMENT=testnet` to `.env` to enable TESTNET banner ### Devnet mode 1. Replace `VITE_RIPPLED_HOST=s2.ripple.com` with `VITE_RIPPLED_HOST=s.devnet.rippletest.net` in the `.env` file 1. Add `VITE_ENVIRONMENT=devnet` to `.env` to enable TESTNET banner ## Testing ### Run unit tests - Run tests in watch mode `npm test` - Run test to produce coverage `npm run test:coverage` - To open coverage HTML report in app root do `open coverage/index.html` ### Debugging Unit Tests in Chrome 1. Place `debugger;` in your unit test 1. Do `npm run test:debug` 1. Open `about:inspect` in Chrome 1. Click on `inspect` link 1. Chrome Developer Tools will be open, click `play` button 1. Now test will start running and will stop on your `debugger;` 1. You know the rest ;) ## Targeted view sizes 1. phone-only: 0px - 375px 1. tablet-portrait-up: 375px - 600px 1. tablet-landscape-up: 600px - 900px 1. desktop-up: 900px - 1200px 1. big-desktop-up: 1200px and up ## Targeted languages 1. US English (default) 1. Spanish 1. French 1. Japanese 1. Korean When updating translation entires or adding new languages consult the guide [Translating](./docs/translating.md). ## Additional Documentation - [How to define transactions](./src/containers/shared/components/Transaction/README.md) - [Routing](./docs/routing.md) ## React Documentation - Latest news in [react blog](https://reactjs.org/blog) - [React documentation](https://react.dev) - [How to think in react](https://reactjs.org/docs/thinking-in-react.html) and break down components ================================================ FILE: babel.config.js ================================================ module.exports = { presets: ['@babel/react', '@babel/env'], plugins: [ [ '@babel/plugin-transform-react-jsx', { runtime: 'automatic', }, ], ], } ================================================ FILE: docs/analytics.md ================================================ ## Variables | Name | Description | Values | Page | | -------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------ | | network | Which named network we are viewing | `mainnet`, `testnet`, `devnet`, `amm-devnet`, `custom` , or more in the future | All pages | | entrypoint | The URI the explorer connects to for data | | All pages | | transaction_type | The `TransactionType` field on a transaction | | `/transactions/*` | | transaction_category | An explorer specific grouping of transactions | `PAYMENT`, `DEX`, `NFT`, `ACCOUNT`, `PSEUDO`, `OTHER`, or `XCHAIN` | `/transactions/*` | | transaction_action | An explorer specific grouping of transactions | `CREATE`, `MODIFY`, `FINISH`, `CANCEL`, or `SEND` | `/transactions/*` | | tec_code | The failure code for a transaction | | `/transactions/*` | | account_id | | | `/accounts/*` | | issuer | The issuer of a token | The accountId of the issuer | `/tokens/*`, `/nft` | | currency_code | | Ex. USD or SOLO | `/tokens/*` | | asset1 | The first asset of an AMM | Formatted {currencyCode}.{issuer} | `/accounts/*` for an AMM | | asset2 | The first second asset of an AMM | Formatted {currencyCode}.{issuer} | `/accounts/*` for an AMM | | nftoken_id | | | `/nft` | | search_term | The search term | | All pages | | search_category | The parsed category searched by as determined by parsing the value | Ex `accounts`, `transactions` | All pages | | validator | Public key of the validator viewed | | `/validator` | ## Events | Name | Description | Variables | Page | | -------------- | --------------------------------------------------------- | ----------------------------------- | -------------------------------------------------------------- | | search | User used the global search | `search_term` and `search_category` | All pages | | mobile_menu | User opens the menu | | All pages | | network_switch | User switches networks | network, endpoint | All pages | | load_more | User chooses to load more data | | `/accounts/*/transactions`, `/nft/transactions/*`, `/tokens/*` | | not_found | When showing a soft 404. Previously used a path of `/404` | | | ## Techniques - Use the `screen_view` event once the data is available to make the call. For example on the transaction page wait until we get the transaction back to know the `transactionType` instead of sending an event to say the page was visited and then to say we have all information needed. - Send entire url path for page view events. The details can be parsed out later. - Use the AdSwerve browser plugin to debug analytics. - It is okay to use the tracking id on all servers including local, dev, and staging servers. The data can be trimmed down on Google's side. ## Tracking Code Paste this code as high in the of the page as possible: ``` ``` Additionally, paste this code immediately after the opening **** tag: ``` ``` ================================================ FILE: docs/routing.md ================================================ ## Typed Routes The explorer uses some enhancements to `react-router` to provide type checking to routes. ### `RouteDefinition` `useRouteParams` and `RouteLink` take these objects to provide type checking for params. In the future these objects can provide a common way to support legacy routes. ex. ``` export const ACCOUNT_ROUTE: RouteDefinition<{ id?: string tab?: 'assets' | 'transactions' assetType?: 'issued' | 'nfts' }> = { path: '/accounts/:id?/:tab?/:assetType?', } ``` ### `useRouteParams` A new hook which takes a `RouteDefinition` and wraps `react-router`'s `useRouteParams`. This will derive the type of the params from the definition. ex. `const { id = '', assetType = 'issued' } = useRouteParams(ACCOUNT_ROUTE)` ### `RouteLink` A wrapper for `react-router`'s `Link` that takes a `RouteDefinition` and an object of params that will be type checked. Ex. `{owner}` Example that will fail to compile `{owner}` ================================================ FILE: docs/translating.md ================================================ # Translating the Application ## How Languages Are Defined 1. Add the new language code and language name to the map `supportedLanguages` in [/src/i18n/baseConfig.ts](../src/i18n/baseConfig.ts) 2. Create a folder in [/public/locales/](../public/locales) with the language code as its name. 3. Add a new file, `translations.json`, to the new folder. 4. Translate all the entries. If you prefer to use the English version just set the value to `null`. Example file: [/public/locales/ja-JP/translations.json](../public/locales/ja-JP/translations.json) ## Updating Existing Translations When making changes to the base (English) language file follow the guide based on the type and scope of the change. ### New Entry 1. Create entry in `en-US/translations.json` 2. Add an entry to all other `translation.json` files. Set the value to be `null` (which means it will default to using the English version). ## Existing Entry 1. Update the entry in `en-US/translations.json` 2. If the meaning does **NOT** change materially, you can leave them as is. Ex. "Please check your transaction hash" => "Please check your transaction hash or CTID." 3. If the entry has a new meaning than before, set the value to `null` in all other `translation.json` files. _Note that changing a translation to `null` causes it to fall back to the English version, and is a signal to language contributors that they may want to provide a fresh localization._ ================================================ FILE: entrypoint.sh ================================================ #!/bin/sh set -e cd /explorer # we build on container startup because react needs the env variables present /usr/local/bin/node server ================================================ FILE: jest.config.js ================================================ module.exports = { roots: ['/src'], setupFilesAfterEnv: ['/src/setupTests.ts'], testMatch: [ '/src/**/__tests__/**/*.{js,jsx,ts,tsx}', '/src/**/*.{spec,test}.{js,jsx,ts,tsx}', ], testEnvironment: 'jsdom', transform: { '^.+\\.(ts|tsx)?$': ['ts-jest', { diagnostics: { warnOnly: true } }], '^.+\\.(js|jsx)$': 'babel-jest', '^.+\\.(svg)$': '/testUtils/svgTransform.js', '^.+\\.(css|scss)$': '/testUtils/cssTransform.js', '^.+\\.(png)$': '/testUtils/imageTransform.js', }, transformIgnorePatterns: ['node_modules/(?!arc)/(?!d3)'], moduleNameMapper: { '\\.svg\\?url$': '/testUtils/svgUrlTransform.js', 'd3-hexbin': '/node_modules/d3-hexbin/build/d3-hexbin.min.js', d3: '/node_modules/d3/dist/d3.min.js', }, clearMocks: true, resetMocks: true, collectCoverageFrom: [ 'src/**/*.{js,jsx,ts,tsx}', '!/node_modules/', '!src/index.js', '!src/i18n/*', '!src/setupTests.js', '!src/setupProxy.js', '!src/registerServiceWorker.js', '!src/containers/shared/images/*', '!src/containers/test/*', '!src/coverage/*', '!testUtils/*', ], coverageThreshold: { global: { branches: 70, functions: 80, lines: 80, statements: 80 }, }, coverageReporters: ['text', 'text-summary', 'html'], verbatimModuleSyntax: false, } ================================================ FILE: package.json ================================================ { "name": "explorer", "description": "XRPL Data Visualization", "version": "1.5.0", "overrides": { "stylelint-order": "^8.1.1" }, "dependencies": { "@rollup/plugin-inject": "^5.0.5", "@vitejs/plugin-react": "^5.1.1", "@xrplf/isomorphic": "^1.0.0-beta.1", "assert": "^2.1.0", "autoprefixer": "^10.4.20", "axios": "^1.13.5", "body-parser": "^1.20.3", "buffer": "^6.0.3", "bunyan": "^1.8.15", "classnames": "^2.5.1", "compression": "^1.7.4", "d3": "^7.9.0", "d3-geo": "^3.1.0", "d3-hexbin": "^0.2.2", "d3-scale": "^4.0.2", "debug": "^4.4.1", "dotenv": "^17.2.3", "esbuild": "^0.25.9", "events": "^3.3.0", "express": "^4.21.2", "i18next": "^23.9.0", "i18next-browser-languagedetector": "^7.2.1", "i18next-http-backend": "^3.0.2", "jest-environment-jsdom": "^30.3.0", "prop-types": "^15.8.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-error-boundary": "^4.0.13", "react-helmet-async": "^2.0.4", "react-i18next": "15.4.1", "react-query": "^3.39.3", "react-router": "^7.9.5", "react18-json-view": "^0.2.8", "recharts": "^2.15.3", "ripple-address-codec": "^5.0.0", "ripple-binary-codec": "^2.4.1", "topojson-client": "^3.0.0", "usehooks-ts": "^3.1.0", "vite": "^7.3.2", "vite-plugin-environment": "^1.1.3", "vite-plugin-html": "^3.2.2", "vite-plugin-svgr": "^4.5.0", "vite-tsconfig-paths": "^5.1.4", "xrpl-client": "^2.4.0" }, "devDependencies": { "@babel/eslint-parser": "^7.22.6", "@babel/preset-env": "^7.25.7", "@babel/preset-react": "^7.27.1", "@testing-library/jest-dom": "^6.7.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.6.1", "@types/create-hash": "^1.2.6", "@types/jest": "^30.0.0", "@types/lodash": "^4.17.20", "@types/node": "^22.14.0", "@types/react": "^18.3.28", "@types/react-dom": "^18.3.7", "@typescript-eslint/eslint-plugin": "^8.32.1", "@typescript-eslint/parser": "^8.32.1", "@xrplf/prettier-config": "^1.9.1", "babel-jest": "^29.7.0", "eslint": "^8.57.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.1.0", "eslint-config-react-app": "^7.0.1", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.9.0", "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.34.2", "eslint-plugin-react-hooks": "^4.6.2", "jest-websocket-mock": "^2.5.0", "lint-staged": "^15.2.10", "mock-socket": "^9.1.5", "moxios": "^0.4.0", "nodemon": "^3.1.4", "npm-run-all": "^4.1.5", "prettier": "3.6.2", "react-error-overlay": "6.0.11", "sass": "^1.80.5", "source-map-explorer": "^2.5.3", "stylelint": "^17.8.0", "stylelint-config-idiomatic-order": "^10.0.0", "stylelint-config-recommended-scss": "^17.0.0", "stylelint-config-standard": "^40.0.0", "stylelint-order": "^8.1.1", "stylelint-prettier": "^5.0.3", "stylelint-scss": "^7.0.0", "ts-jest": "^29.4.1", "ts-node": "^10.9.2", "typescript": "^5.9.3", "xrpl": "^4.5.0" }, "resolutions": { "jest-environment-jsdom": "29.3.1", "rollup": "npm:@rollup/wasm-node@^4.59.0" }, "lint-staged": { "src/**/*.{js,jsx,json,scss}": [ "prettier --write", "git add" ] }, "main": "index", "private": true, "scripts": { "analyze": "source-map-explorer build/static/js/main.*", "build": "vite build", "build-ts": "tsc --build", "dev-client": "vite serve", "dev-server": "NODE_ENV=development PORT=5001 nodemon --watch server --watch build server|bunyan || true", "lint": "run-s \"lint:js -- --fix\" \"lint:css -- --fix\" \"format -- --log-level error\"", "lint:ci": "run-s lint:js lint:css \"format:check -- --log-level error\"", "lint:css": "node_modules/.bin/stylelint src/**/*.scss", "lint:js": "node_modules/.bin/eslint --ext=js --ext=jsx --ext=ts --ext=tsx --color --max-warnings 0 .", "format": "prettier --write .", "format:check": "prettier --check .", "precommit": "lint-staged", "prod-server": "node server|bunyan", "start": "run-p dev-server dev-client", "test": "jest --env=jsdom --watch", "test:all": "run-s lint:ci test:ci", "test:ci": "jest --coverage --ci --color --env=jsdom --no-cache --runInBand", "test:debug": "jest --inspect-brk --runInBand --env=jsdom", "test:coverage": "npm run test -- --coverage --watchAll=false" }, "browserslist": [ ">0.2%", "not dead", "not ie <= 11", "not op_mini all" ], "prettier": "@xrplf/prettier-config", "engines": { "node": ">=22.0.0 <23", "npm": ">=9.0.0 <11.0.0" } } ================================================ FILE: public/.htaccess ================================================ Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.html [QSA,L] ================================================ FILE: public/countries.json ================================================ { "type": "Topology", "objects": { "countries": { "type": "GeometryCollection", "geometries": [ { "type": "Polygon", "arcs": [[0, 1, 2, 3, 4, 5]], "id": "004" }, { "type": "MultiPolygon", "arcs": [[[6, 7, 8, 9]], [[10, 11, 12]]], "id": "024" }, { "type": "Polygon", "arcs": [[13, 14, 15, 16, 17]], "id": "008" }, { "type": "Polygon", "arcs": [[18, 19, 20, 21, 22]], "id": "784" }, { "type": "MultiPolygon", "arcs": [[[23, 24]], [[25, 26, 27, 28, 29, 30]]], "id": "032" }, { "type": "Polygon", "arcs": [[31, 32, 33, 34, 35]], "id": "051" }, { "type": "MultiPolygon", "arcs": [ [[36]], [[37]], [[38]], [[39]], [[40]], [[41]], [[42]], [[43]] ], "id": "010" }, { "type": "Polygon", "arcs": [[44]], "id": "260" }, { "type": "MultiPolygon", "arcs": [[[45]], [[46]]], "id": "036" }, { "type": "Polygon", "arcs": [[47, 48, 49, 50, 51, 52, 53]], "id": "040" }, { "type": "MultiPolygon", "arcs": [[[54, -35]], [[55, 56, -33, 57, 58]]], "id": "031" }, { "type": "Polygon", "arcs": [[59, 60, 61]], "id": "108" }, { "type": "Polygon", "arcs": [[62, 63, 64, 65, 66]], "id": "056" }, { "type": "Polygon", "arcs": [[67, 68, 69, 70, 71]], "id": "204" }, { "type": "Polygon", "arcs": [[72, 73, 74, -70, 75, 76]], "id": "854" }, { "type": "Polygon", "arcs": [[77, 78, 79]], "id": "050" }, { "type": "Polygon", "arcs": [[80, 81, 82, 83, 84, 85]], "id": "100" }, { "type": "MultiPolygon", "arcs": [[[86]], [[87]], [[88]]], "id": "044" }, { "type": "Polygon", "arcs": [[89, 90, 91]], "id": "070" }, { "type": "Polygon", "arcs": [[92, 93, 94, 95, 96]], "id": "112" }, { "type": "Polygon", "arcs": [[97, 98, 99]], "id": "084" }, { "type": "Polygon", "arcs": [[100, 101, 102, 103, -31]], "id": "068" }, { "type": "Polygon", "arcs": [[-27, 104, -103, 105, 106, 107, 108, 109, 110, 111, 112]], "id": "076" }, { "type": "Polygon", "arcs": [[113, 114]], "id": "096" }, { "type": "Polygon", "arcs": [[115, 116]], "id": "064" }, { "type": "Polygon", "arcs": [[117, 118, 119, 120]], "id": "072" }, { "type": "Polygon", "arcs": [[121, 122, 123, 124, 125, 126, 127]], "id": "140" }, { "type": "MultiPolygon", "arcs": [ [[128]], [[129]], [[130]], [[131]], [[132]], [[133]], [[134]], [[135]], [[136]], [[137]], [[138, 139, 140, 141]], [[142]], [[143]], [[144]], [[145]], [[146]], [[147]], [[148]], [[149]], [[150]], [[151]], [[152]], [[153]], [[154]], [[155]], [[156]], [[157]], [[158]], [[159]], [[160]] ], "id": "124" }, { "type": "Polygon", "arcs": [[-51, 161, 162, 163]], "id": "756" }, { "type": "MultiPolygon", "arcs": [[[-24, 164]], [[-30, 165, 166, -101]]], "id": "152" }, { "type": "MultiPolygon", "arcs": [ [[167]], [ [ 168, 169, 170, 171, 172, 173, -117, 174, 175, 176, 177, -4, 178, 179, 180, 181, 182, 183 ] ] ], "id": "156" }, { "type": "Polygon", "arcs": [[184, 185, 186, 187, -73, 188]], "id": "384" }, { "type": "Polygon", "arcs": [[189, 190, 191, 192, 193, 194, -128, 195]], "id": "120" }, { "type": "Polygon", "arcs": [ [196, 197, -60, 198, 199, 200, 201, -10, 202, -13, 203, -126, 204] ], "id": "180" }, { "type": "Polygon", "arcs": [[-12, 205, 206, -196, -127, -204]], "id": "178" }, { "type": "Polygon", "arcs": [[207, 208, 209, 210, 211, -107, 212]], "id": "170" }, { "type": "Polygon", "arcs": [[213, 214, 215, 216]], "id": "188" }, { "type": "Polygon", "arcs": [[217]], "id": "192" }, { "type": "Polygon", "arcs": [[218, 219]], "id": "-99" }, { "type": "Polygon", "arcs": [[220, -220]], "id": "196" }, { "type": "Polygon", "arcs": [[-53, 221, 222, 223]], "id": "203" }, { "type": "Polygon", "arcs": [[224, 225, -222, -52, -164, 226, 227, -64, 228, 229, 230]], "id": "276" }, { "type": "Polygon", "arcs": [[231, 232, 233, 234]], "id": "262" }, { "type": "MultiPolygon", "arcs": [[[235]], [[-231, 236]]], "id": "208" }, { "type": "Polygon", "arcs": [[237, 238]], "id": "214" }, { "type": "Polygon", "arcs": [[239, 240, 241, 242, 243, 244, 245, 246]], "id": "012" }, { "type": "Polygon", "arcs": [[247, -208, 248]], "id": "218" }, { "type": "Polygon", "arcs": [[249, 250, 251, 252, 253]], "id": "818" }, { "type": "Polygon", "arcs": [[254, 255, 256, -235]], "id": "232" }, { "type": "Polygon", "arcs": [[257, 258, 259, 260]], "id": "724" }, { "type": "Polygon", "arcs": [[261, 262, 263]], "id": "233" }, { "type": "Polygon", "arcs": [[-234, 264, 265, 266, 267, 268, 269, -255]], "id": "231" }, { "type": "Polygon", "arcs": [[270, 271, 272, 273]], "id": "246" }, { "type": "MultiPolygon", "arcs": [[[274]], [[275]]], "id": "242" }, { "type": "Polygon", "arcs": [[276]], "id": "238" }, { "type": "MultiPolygon", "arcs": [ [[277, 278, 279, -111]], [[280]], [[281, -227, -163, 282, 283, -259, 284, -66]] ], "id": "250" }, { "type": "Polygon", "arcs": [[285, 286, -190, -207]], "id": "266" }, { "type": "MultiPolygon", "arcs": [[[287, 288]], [[289]]], "id": "826" }, { "type": "Polygon", "arcs": [[290, 291, -58, -32, 292]], "id": "268" }, { "type": "Polygon", "arcs": [[293, -189, -77, 294]], "id": "288" }, { "type": "Polygon", "arcs": [[295, 296, 297, 298, 299, 300, -187]], "id": "324" }, { "type": "Polygon", "arcs": [[301, 302]], "id": "270" }, { "type": "Polygon", "arcs": [[303, 304, -299]], "id": "624" }, { "type": "Polygon", "arcs": [[305, -191, -287]], "id": "226" }, { "type": "MultiPolygon", "arcs": [[[306]], [[307, -15, 308, -84, 309]]], "id": "300" }, { "type": "Polygon", "arcs": [[310]], "id": "304" }, { "type": "Polygon", "arcs": [[311, 312, -100, 313, 314, 315]], "id": "320" }, { "type": "Polygon", "arcs": [[316, 317, -109, 318]], "id": "328" }, { "type": "Polygon", "arcs": [[319, 320, -315, 321, 322]], "id": "340" }, { "type": "Polygon", "arcs": [[323, -92, 324, 325, 326, 327]], "id": "191" }, { "type": "Polygon", "arcs": [[-239, 328]], "id": "332" }, { "type": "Polygon", "arcs": [[-48, 329, 330, 331, 332, -328, 333]], "id": "348" }, { "type": "MultiPolygon", "arcs": [ [[334]], [[335, 336]], [[337]], [[338]], [[339]], [[340]], [[341]], [[342]], [[343, 344]], [[345]], [[346]], [[347, 348]], [[349]] ], "id": "360" }, { "type": "Polygon", "arcs": [[-177, 350, -175, -116, -174, 351, -80, 352, 353]], "id": "356" }, { "type": "Polygon", "arcs": [[354, -288]], "id": "372" }, { "type": "Polygon", "arcs": [[355, -6, 356, 357, 358, 359, -55, -34, -57, 360]], "id": "364" }, { "type": "Polygon", "arcs": [[361, 362, 363, 364, 365, 366, -359]], "id": "368" }, { "type": "Polygon", "arcs": [[367]], "id": "352" }, { "type": "Polygon", "arcs": [[368, 369, 370, -254, 371, 372, 373]], "id": "376" }, { "type": "MultiPolygon", "arcs": [[[374]], [[375]], [[376, 377, -283, -162, -50]]], "id": "380" }, { "type": "Polygon", "arcs": [[378]], "id": "388" }, { "type": "Polygon", "arcs": [[-369, 379, -365, 380, 381, -371, 382]], "id": "400" }, { "type": "MultiPolygon", "arcs": [[[383]], [[384]], [[385]]], "id": "392" }, { "type": "Polygon", "arcs": [[386, 387, 388, 389, -181, 390]], "id": "398" }, { "type": "Polygon", "arcs": [[391, 392, 393, 394, -267, 395]], "id": "404" }, { "type": "Polygon", "arcs": [[-391, -180, 396, 397]], "id": "417" }, { "type": "Polygon", "arcs": [[398, 399, 400, 401]], "id": "116" }, { "type": "Polygon", "arcs": [[402, 403]], "id": "410" }, { "type": "Polygon", "arcs": [[-18, 404, 405, 406]], "id": "-99" }, { "type": "Polygon", "arcs": [[407, 408, -363]], "id": "414" }, { "type": "Polygon", "arcs": [[409, 410, -172, 411, -400]], "id": "418" }, { "type": "Polygon", "arcs": [[-373, 412, 413]], "id": "422" }, { "type": "Polygon", "arcs": [[414, 415, -296, -186]], "id": "430" }, { "type": "Polygon", "arcs": [[416, -247, 417, 418, -252, 419, 420]], "id": "434" }, { "type": "Polygon", "arcs": [[421]], "id": "144" }, { "type": "Polygon", "arcs": [[422]], "id": "426" }, { "type": "Polygon", "arcs": [[423, 424, 425, -93, 426]], "id": "440" }, { "type": "Polygon", "arcs": [[-228, -282, -65]], "id": "442" }, { "type": "Polygon", "arcs": [[427, -264, 428, -94, -426]], "id": "428" }, { "type": "Polygon", "arcs": [[-244, 429, 430]], "id": "504" }, { "type": "Polygon", "arcs": [[431, 432]], "id": "498" }, { "type": "Polygon", "arcs": [[433]], "id": "450" }, { "type": "Polygon", "arcs": [[434, -98, -313, 435, 436]], "id": "484" }, { "type": "Polygon", "arcs": [[-407, 437, -85, -309, -14]], "id": "807" }, { "type": "Polygon", "arcs": [[438, -241, 439, -74, -188, -301, 440]], "id": "466" }, { "type": "Polygon", "arcs": [[441, -78, -352, -173, -411, 442]], "id": "104" }, { "type": "Polygon", "arcs": [[443, -325, -91, 444, -405, -17]], "id": "499" }, { "type": "Polygon", "arcs": [[445, -183]], "id": "496" }, { "type": "Polygon", "arcs": [[446, 447, 448, 449, 450, 451, 452, 453]], "id": "508" }, { "type": "Polygon", "arcs": [[454, 455, 456, -242, -439]], "id": "478" }, { "type": "Polygon", "arcs": [[-454, 457, 458]], "id": "454" }, { "type": "MultiPolygon", "arcs": [[[459, 460]], [[-348, 461, -115, 462]]], "id": "458" }, { "type": "Polygon", "arcs": [[463, -8, 464, -119, 465]], "id": "516" }, { "type": "Polygon", "arcs": [[466]], "id": "540" }, { "type": "Polygon", "arcs": [[-75, -440, -240, -417, 467, -194, 468, -71]], "id": "562" }, { "type": "Polygon", "arcs": [[469, -72, -469, -193]], "id": "566" }, { "type": "Polygon", "arcs": [[470, -323, 471, -215]], "id": "558" }, { "type": "Polygon", "arcs": [[-229, -63, 472]], "id": "528" }, { "type": "MultiPolygon", "arcs": [[[473, -274, 474, 475]], [[476]], [[477]], [[478]]], "id": "578" }, { "type": "Polygon", "arcs": [[-351, -176]], "id": "524" }, { "type": "MultiPolygon", "arcs": [[[479]], [[480]]], "id": "554" }, { "type": "MultiPolygon", "arcs": [[[481, 482, -22, 483]], [[-20, 484]]], "id": "512" }, { "type": "Polygon", "arcs": [[-178, -354, 485, -357, -5]], "id": "586" }, { "type": "Polygon", "arcs": [[486, -217, 487, -210]], "id": "591" }, { "type": "Polygon", "arcs": [[-167, 488, -249, -213, -106, -102]], "id": "604" }, { "type": "MultiPolygon", "arcs": [ [[489]], [[490]], [[491]], [[492]], [[493]], [[494]], [[495]] ], "id": "608" }, { "type": "MultiPolygon", "arcs": [[[496]], [[497]], [[-344, 498]], [[499]]], "id": "598" }, { "type": "Polygon", "arcs": [[-226, 500, 501, -427, -97, 502, 503, -223]], "id": "616" }, { "type": "Polygon", "arcs": [[504]], "id": "630" }, { "type": "Polygon", "arcs": [[505, 506, -404, 507, -169]], "id": "408" }, { "type": "Polygon", "arcs": [[-261, 508]], "id": "620" }, { "type": "Polygon", "arcs": [[-104, -105, -26]], "id": "600" }, { "type": "Polygon", "arcs": [[-383, -370]], "id": "275" }, { "type": "Polygon", "arcs": [[509, 510]], "id": "634" }, { "type": "Polygon", "arcs": [[511, -433, 512, 513, -81, 514, -332]], "id": "642" }, { "type": "MultiPolygon", "arcs": [ [[515]], [[-502, 516, -424]], [[517]], [[518]], [[519]], [[520]], [[521]], [ [ -506, -184, -446, -182, -390, 522, -59, -292, 523, 524, -95, -429, -263, 525, -271, -474, 526 ] ], [[527]], [[528]], [[529]] ], "id": "643" }, { "type": "Polygon", "arcs": [[530, -61, -198, 531]], "id": "646" }, { "type": "Polygon", "arcs": [[-243, -457, 532, -430]], "id": "732" }, { "type": "Polygon", "arcs": [[533, -381, -364, -409, 534, -511, 535, -23, -483, 536]], "id": "682" }, { "type": "Polygon", "arcs": [[537, 538, -123, 539, -420, -251, 540, -256, -270, 541]], "id": "729" }, { "type": "Polygon", "arcs": [[542, -268, -395, 543, -205, -125, 544, -538]], "id": "728" }, { "type": "Polygon", "arcs": [[545, -455, -441, -300, -305, 546, -303]], "id": "686" }, { "type": "MultiPolygon", "arcs": [[[547]], [[548]], [[549]], [[550]], [[551]]], "id": "090" }, { "type": "Polygon", "arcs": [[552, -297, -416]], "id": "694" }, { "type": "Polygon", "arcs": [[553, -316, -321]], "id": "222" }, { "type": "Polygon", "arcs": [[-265, -233, 554, 555]], "id": "-99" }, { "type": "Polygon", "arcs": [[-396, -266, -556, 556]], "id": "706" }, { "type": "Polygon", "arcs": [[-86, -438, -406, -445, -90, -324, -333, -515]], "id": "688" }, { "type": "Polygon", "arcs": [[557, -279, 558, -110, -318]], "id": "740" }, { "type": "Polygon", "arcs": [[-504, 559, -330, -54, -224]], "id": "703" }, { "type": "Polygon", "arcs": [[-49, -334, -327, 560, -377]], "id": "705" }, { "type": "Polygon", "arcs": [[-475, -273, 561]], "id": "752" }, { "type": "Polygon", "arcs": [[562, -450]], "id": "748" }, { "type": "Polygon", "arcs": [[-380, -374, -414, 563, 564, -366]], "id": "760" }, { "type": "Polygon", "arcs": [[-468, -421, -540, -122, -195]], "id": "148" }, { "type": "Polygon", "arcs": [[565, -295, -76, -69]], "id": "768" }, { "type": "Polygon", "arcs": [[566, -461, 567, -443, -410, -399]], "id": "764" }, { "type": "Polygon", "arcs": [[-397, -179, -3, 568]], "id": "762" }, { "type": "Polygon", "arcs": [[-356, 569, -388, 570, -1]], "id": "795" }, { "type": "Polygon", "arcs": [[571, -336]], "id": "626" }, { "type": "Polygon", "arcs": [[572]], "id": "780" }, { "type": "Polygon", "arcs": [[-246, 573, -418]], "id": "788" }, { "type": "MultiPolygon", "arcs": [[[-293, -36, -360, -367, -565, 574]], [[-310, -83, 575]]], "id": "792" }, { "type": "Polygon", "arcs": [[576]], "id": "158" }, { "type": "Polygon", "arcs": [ [-393, 577, -447, -459, 578, -201, 579, -199, -62, -531, 580] ], "id": "834" }, { "type": "Polygon", "arcs": [[-532, -197, -544, -394, -581]], "id": "800" }, { "type": "Polygon", "arcs": [[-525, 581, -513, -432, -512, -331, -560, -503, -96]], "id": "804" }, { "type": "Polygon", "arcs": [[-113, 582, -28]], "id": "858" }, { "type": "MultiPolygon", "arcs": [ [[583]], [[584]], [[585]], [[586]], [[587]], [[588, -437, 589, -139]], [[590]], [[591]], [[592]], [[-141, 593]] ], "id": "840" }, { "type": "Polygon", "arcs": [[-571, -387, -398, -569, -2]], "id": "860" }, { "type": "Polygon", "arcs": [[594, -319, -108, -212]], "id": "862" }, { "type": "Polygon", "arcs": [[595, -401, -412, -171]], "id": "704" }, { "type": "MultiPolygon", "arcs": [[[596]], [[597]]], "id": "548" }, { "type": "Polygon", "arcs": [[598, -537, -482]], "id": "887" }, { "type": "Polygon", "arcs": [[-466, -118, 599, -451, -563, -449, 600], [-423]], "id": "710" }, { "type": "Polygon", "arcs": [[-458, -453, 601, -120, -465, -7, -202, -579]], "id": "894" }, { "type": "Polygon", "arcs": [[-600, -121, -602, -452]], "id": "716" } ] }, "land": { "type": "GeometryCollection", "geometries": [ { "type": "MultiPolygon", "arcs": [ [ [ 595, 401, 566, 459, 567, 441, 78, 352, 485, 357, 361, 407, 534, 509, 535, 18, 484, 20, 483, 598, 533, 381, 249, 540, 256, 231, 554, 556, 391, 577, 447, 600, 463, 8, 202, 10, 205, 285, 305, 191, 469, 67, 565, 293, 184, 414, 552, 297, 303, 546, 301, 545, 455, 532, 430, 244, 573, 418, 252, 371, 412, 563, 574, 290, 523, 581, 513, 81, 575, 307, 15, 443, 325, 560, 377, 283, 259, 508, 257, 284, 66, 472, 229, 236, 224, 500, 516, 424, 427, 261, 525, 271, 561, 475, 526, 506, 402, 507, 169 ], [123, 544, 538], [199, 579], [542, 268, 541], [388, 522, 55, 360, 569] ], [[24, 164]], [ [ 582, 28, 165, 488, 247, 208, 486, 213, 470, 319, 553, 311, 435, 589, 139, 593, 141, 588, 434, 98, 313, 321, 471, 215, 487, 210, 594, 316, 557, 279, 111 ], [558, 277] ], [[36]], [[37]], [[38]], [[39]], [[40]], [[41]], [[42]], [[43]], [[44]], [[45]], [[46]], [[86]], [[87]], [[88]], [[461, 113, 462, 348]], [[128]], [[129]], [[130]], [[131]], [[132]], [[133]], [[134]], [[135]], [[136]], [[137]], [[142]], [[143]], [[144]], [[145]], [[146]], [[147]], [[148]], [[149]], [[150]], [[151]], [[152]], [[153]], [[154]], [[155]], [[156]], [[157]], [[158]], [[159]], [[160]], [[167]], [[217]], [[218, 220]], [[235]], [[237, 328]], [[274]], [[275]], [[276]], [[280]], [[288, 354]], [[289]], [[306]], [[310]], [[334]], [[336, 571]], [[337]], [[338]], [[339]], [[340]], [[341]], [[342]], [[344, 498]], [[345]], [[346]], [[349]], [[367]], [[374]], [[375]], [[378]], [[383]], [[384]], [[385]], [[421]], [[433]], [[466]], [[476]], [[477]], [[478]], [[479]], [[480]], [[489]], [[490]], [[491]], [[492]], [[493]], [[494]], [[495]], [[496]], [[497]], [[499]], [[504]], [[515]], [[517]], [[518]], [[519]], [[520]], [[521]], [[527]], [[528]], [[529]], [[547]], [[548]], [[549]], [[550]], [[551]], [[572]], [[576]], [[583]], [[584]], [[585]], [[586]], [[587]], [[590]], [[591]], [[592]], [[596]], [[597]] ] } ] } }, "arcs": [ [ [67002, 71642], [284, -224], [209, 79], [58, 268], [219, 89], [157, 180], [55, 472], [234, 114], [44, 211], [131, -158], [84, -19] ], [ [68477, 72654], [154, -4], [210, -124] ], [ [68841, 72526], [85, -72], [201, 189], [93, -114], [90, 271], [166, -12], [43, 86], [29, 239], [120, 205], [150, -134], [-30, -181], [84, -28], [-26, -496], [110, -194], [97, 125], [123, 58], [173, 265], [192, -44], [286, -1] ], [ [70827, 72688], [50, -169] ], [ [70877, 72519], [-162, -67], [-141, -109], [-319, -68], [-298, -124], [-163, -258], [66, -250], [32, -294], [-139, -248], [12, -227], [-76, -213], [-265, 18], [110, -390], [-177, -150], [-118, -356], [15, -355], [-108, -166], [-103, 55], [-212, -77], [-31, -166], [-207, 1], [-154, -334], [-10, -503], [-361, -246], [-194, 52], [-56, -129], [-166, 75], [-278, -88], [-465, 301] ], [ [66909, 68203], [252, 536], [-23, 380], [-210, 100], [-22, 375], [-91, 472], [119, 323], [-121, 87], [76, 430], [113, 736] ], [ [56642, 44124], [29, -184], [-32, -286], [49, -277], [-41, -222], [24, -203], [-579, 7], [-13, -1880], [188, -483], [181, -369] ], [ [56448, 40227], [-510, -241], [-673, 83], [-192, 284], [-1126, -26], [-42, -41], [-166, 267], [-180, 17], [-166, -100], [-134, -113] ], [ [53259, 40357], [-26, 372], [38, 519], [96, 541], [15, 254], [90, 532], [66, 243], [159, 386], [90, 263], [29, 438], [-15, 335], [-83, 211], [-74, 358], [-68, 355], [15, 122], [85, 235], [-84, 570], [-57, 396], [-139, 374], [26, 115] ], [ [53422, 46976], [115, 79], [80, -11], [98, 71], [820, -8], [68, -440], [80, -354], [64, -191], [106, -309], [184, 47], [91, 83], [154, -83], [42, 148], [69, 344], [172, 23], [15, 103], [142, 2], [-24, -213], [337, 5], [5, -372], [56, -228], [-41, -356], [21, -363], [93, -219], [-15, -703], [68, 54], [121, -15], [172, 89], [127, -35] ], [ [53383, 47159], [-74, 444] ], [ [53309, 47603], [112, 255], [84, 100], [104, -203] ], [ [53609, 47755], [-101, -124], [-45, -152], [-9, -258], [-71, -62] ], [ [55719, 75309], [-35, -201], [39, -254], [115, -144] ], [ [55838, 74710], [-5, -155], [-91, -85], [-16, -192], [-129, -287] ], [ [55597, 73991], [-48, 41], [-5, 130], [-154, 199], [-24, 281], [23, 403], [38, 184], [-47, 93] ], [ [55380, 75322], [-18, 188], [120, 291], [18, -111], [75, 52] ], [ [55575, 75742], [59, -159], [66, -60], [19, -214] ], [ [64327, 64904], [49, 29], [11, -162], [217, 93], [230, -15], [168, -18], [190, 400], [207, 379], [176, 364] ], [ [65575, 65974], [52, -202] ], [ [65627, 65772], [38, -466] ], [ [65665, 65306], [-142, -3], [-23, -384], [50, -82], [-126, -117], [-1, -241], [-81, -245], [-7, -238] ], [ [65335, 63996], [-56, -125], [-835, 298], [-106, 599], [-11, 136] ], [ [31400, 18145], [-168, 16], [-297, 1], [0, 1319] ], [ [30935, 19481], [106, -274], [139, -443], [361, -355], [389, -147], [-125, -296], [-264, -29], [-141, 208] ], [ [32587, 37434], [511, -964], [227, -89], [339, -437], [286, -231], [40, -261], [-273, -898], [280, -160], [312, -91], [220, 95], [252, 453], [45, 521] ], [ [34826, 35372], [138, 114], [139, -341], [-6, -472], [-234, -326], [-186, -241], [-314, -573], [-370, -806] ], [ [33993, 32727], [-70, -473], [-74, -607], [3, -588], [-61, -132], [-21, -382] ], [ [33770, 30545], [-19, -308], [353, -506], [-38, -408], [173, -257], [-14, -289], [-267, -757], [-412, -317], [-557, -123], [-305, 59], [59, -352], [-57, -442], [51, -298], [-167, -208], [-284, -82], [-267, 216], [-108, -155], [39, -587], [188, -178], [152, 186], [82, -307], [-255, -183], [-223, -367], [-41, -595], [-66, -316], [-262, -2], [-218, -302], [-80, -443], [273, -433], [266, -119], [-96, -531], [-328, -333], [-180, -692], [-254, -234], [-113, -276], [89, -614], [185, -342], [-117, 30] ], [ [30952, 19680], [-257, 93], [-672, 79], [-115, 344], [6, 443], [-185, -38], [-98, 214], [-24, 626], [213, 260], [88, 375], [-33, 299], [148, 504], [101, 782], [-30, 347], [122, 112], [-30, 223], [-129, 118], [92, 248], [-126, 224], [-65, 682], [112, 120], [-47, 720], [65, 605], [75, 527], [166, 215], [-84, 576], [-1, 543], [210, 386], [-7, 494], [159, 576], [1, 544], [-72, 108], [-128, 1020], [171, 607], [-27, 572], [100, 537], [182, 555], [196, 367], [-83, 232], [58, 190], [-9, 985], [302, 291], [96, 614], [-34, 148] ], [ [31359, 37147], [231, 534], [364, -144], [163, -427], [109, 475], [316, -24], [45, -127] ], [ [62106, 74858], [386, 92] ], [ [62492, 74950], [57, -155], [106, -103], [-56, -148], [148, -202], [-78, -189], [118, -160], [124, -97], [7, -410] ], [ [62918, 73486], [-101, -17] ], [ [62817, 73469], [-113, 342], [1, 91], [-123, -2], [-82, 159], [-58, -16] ], [ [62442, 74043], [-109, 172], [-207, 147], [27, 288], [-47, 208] ], [ [33452, 3290], [-82, -301], [-81, -266], [-582, 81], [-621, -35], [-348, 197], [0, 23], [-152, 174], [625, -23], [599, -58], [207, 243], [147, 208], [288, -243] ], [ [5775, 3611], [-533, -81], [-364, 208], [-163, 209], [-11, 35], [-180, 162], [169, 220], [517, -93], [277, -185], [212, -209], [76, -266] ], [ [37457, 4468], [342, -255], [120, -359], [33, -254], [11, -301], [-430, -186], [-452, -150], [-522, -139], [-582, -116], [-658, 35], [-365, 197], [49, 243], [593, 162], [239, 197], [174, 254], [126, 220], [168, 209], [180, 243], [141, 0], [414, 127], [419, -127] ], [ [16330, 7154], [359, -93], [332, 104], [-158, -208], [-261, -151], [-386, 47], [-278, 208], [60, 197], [332, -104] ], [ [15122, 7165], [425, -231], [-164, 23], [-359, 58], [-381, 162], [202, 127], [277, -139] ], [ [22505, 8080], [305, -81], [304, 69], [163, -335], [-217, 46], [-337, -23], [-343, 23], [-376, -35], [-283, 116], [-146, 243], [174, 104], [353, -81], [403, -46] ], [ [30985, 8657], [33, -266], [-49, -231], [-76, -220], [-326, -81], [-311, -116], [-364, 11], [136, 232], [-327, -81], [-310, -81], [-212, 174], [-16, 243], [305, 231], [190, 70], [321, -23], [82, 301], [16, 219], [-6, 475], [158, 278], [256, 93], [147, -220], [65, -220], [120, -267], [92, -254], [76, -267] ], [ [0, 529], [16, -5], [245, 344], [501, -185], [32, 21], [294, 188], [38, -7], [32, -4], [402, -246], [352, 246], [63, 34], [816, 104], [265, -138], [130, -71], [419, -196], [789, -151], [625, -185], [1072, -139], [800, 162], [1181, -116], [669, -185], [734, 174], [773, 162], [60, 278], [-1094, 23], [-898, 139], [-234, 231], [-745, 128], [49, 266], [103, 243], [104, 220], [-55, 243], [-462, 162], [-212, 209], [-430, 185], [675, -35], [642, 93], [402, -197], [495, 173], [457, 220], [223, 197], [-98, 243], [-359, 162], [-408, 174], [-571, 35], [-500, 81], [-539, 58], [-180, 220], [-359, 185], [-217, 208], [-87, 672], [136, -58], [250, -185], [457, 58], [441, 81], [228, -255], [441, 58], [370, 127], [348, 162], [315, 197], [419, 58], [-11, 220], [-97, 220], [81, 208], [359, 104], [163, -196], [425, 115], [321, 151], [397, 12], [375, 57], [376, 139], [299, 128], [337, 127], [218, -35], [190, -46], [414, 81], [370, -104], [381, 11], [364, 81], [375, -57], [414, -58], [386, 23], [403, -12], [413, -11], [381, 23], [283, 174], [337, 92], [349, -127], [331, 104], [300, 208], [179, -185], [98, -208], [180, -197], [288, 174], [332, -220], [375, -70], [321, -162], [392, 35], [354, 104], [418, -23], [376, -81], [381, -104], [147, 254], [-180, 197], [-136, 209], [-359, 46], [-158, 220], [-60, 220], [-98, 440], [213, -81], [364, -35], [359, 35], [327, -93], [283, -174], [119, -208], [376, -35], [359, 81], [381, 116], [342, 70], [283, -139], [370, 46], [239, 451], [224, -266], [321, -104], [348, 58], [228, -232], [365, -23], [337, -69], [332, -128], [218, 220], [108, 209], [278, -232], [381, 58], [283, -127], [190, -197], [370, 58], [288, 127], [283, 151], [337, 81], [392, 69], [354, 81], [272, 127], [163, 186], [65, 254], [-32, 244], [-87, 231], [-98, 232], [-87, 231], [-71, 209], [-16, 231], [27, 232], [130, 220], [109, 243], [44, 231], [-55, 255], [-32, 232], [136, 266], [152, 173], [180, 220], [190, 186], [223, 173], [109, 255], [152, 162], [174, 151], [267, 34], [174, 186], [196, 115], [228, 70], [202, 150], [157, 186], [218, 69], [163, -151], [-103, -196], [-283, -174], [-120, -127], [-206, 92], [-229, -58], [-190, -139], [-202, -150], [-136, -174], [-38, -231], [17, -220], [130, -197], [-190, -139], [-261, -46], [-153, -197], [-163, -185], [-174, -255], [-44, -220], [98, -243], [147, -185], [229, -139], [212, -185], [114, -232], [60, -220], [82, -232], [130, -196], [82, -220], [38, -544], [81, -220], [22, -232], [87, -231], [-38, -313], [-152, -243], [-163, -197], [-370, -81], [-125, -208], [-169, -197], [-419, -220], [-370, -93], [-348, -127], [-376, -128], [-223, -243], [-446, -23], [-489, 23], [-441, -46], [-468, 0], [87, -232], [424, -104], [311, -162], [174, -208], [-310, -185], [-479, 58], [-397, -151], [-17, -243], [-11, -232], [327, -196], [60, -220], [353, -220], [588, -93], [500, -162], [398, -185], [506, -186], [690, -92], [681, -162], [473, -174], [517, -197], [272, -278], [136, -220], [337, 209], [457, 173], [484, 186], [577, 150], [495, 162], [691, 12], [680, -81], [560, -139], [180, 255], [386, 173], [702, 12], [550, 127], [522, 128], [577, 81], [614, 104], [430, 150], [-196, 209], [-119, 208], [0, 220], [-539, -23], [-571, -93], [-544, 0], [-77, 220], [39, 440], [125, 128], [397, 138], [468, 139], [337, 174], [337, 174], [251, 231], [380, 104], [376, 81], [190, 47], [430, 23], [408, 81], [343, 116], [337, 139], [305, 139], [386, 185], [245, 197], [261, 173], [82, 232], [-294, 139], [98, 243], [185, 185], [288, 116], [305, 139], [283, 185], [217, 232], [136, 277], [202, 163], [331, -35], [136, -197], [332, -23], [11, 220], [142, 231], [299, -58], [71, -220], [331, -34], [360, 104], [348, 69], [315, -34], [120, -243], [305, 196], [283, 105], [315, 81], [310, 81], [283, 139], [310, 92], [240, 128], [168, 208], [207, -151], [288, 81], [202, -277], [157, -209], [316, 116], [125, 232], [283, 162], [365, -35], [108, -220], [229, 220], [299, 69], [326, 23], [294, -11], [310, -70], [300, -34], [130, -197], [180, -174], [304, 104], [327, 24], [315, 0], [310, 11], [278, 81], [294, 70], [245, 162], [261, 104], [283, 58], [212, 162], [152, 324], [158, 197], [288, -93], [109, -208], [239, -139], [289, 46], [196, -208], [206, -151], [283, 139], [98, 255], [250, 104], [289, 197], [272, 81], [326, 116], [218, 127], [228, 139], [218, 127], [261, -69], [250, 208], [180, 162], [261, -11], [229, 139], [54, 208], [234, 162], [228, 116], [278, 93], [256, 46], [244, -35], [262, -58], [223, -162], [27, -254], [245, -197], [168, -162], [332, -70], [185, -162], [229, -162], [266, -35], [223, 116], [240, 243], [261, -127], [272, -70], [261, -69], [272, -46], [277, 0], [229, -614], [-11, -150], [-33, -267], [-266, -150], [-218, -220], [38, -232], [310, 12], [-38, -232], [-141, -220], [-131, -243], [212, -185], [321, -58], [321, 104], [153, 232], [92, 220], [153, 185], [174, 174], [70, 208], [147, 289], [174, 58], [316, 24], [277, 69], [283, 93], [136, 231], [82, 220], [190, 220], [272, 151], [234, 115], [153, 197], [157, 104], [202, 93], [277, -58], [250, 58], [272, 69], [305, -34], [201, 162], [142, 393], [103, -162], [131, -278], [234, -115], [266, -47], [267, 70], [283, -46], [261, -12], [174, 58], [234, -35], [212, -127], [250, 81], [300, 0], [255, 81], [289, -81], [185, 197], [141, 196], [191, 163], [348, 439], [179, -81], [212, -162], [185, -208], [354, -359], [272, -12], [256, 0], [299, 70], [299, 81], [229, 162], [190, 174], [310, 23], [207, 127], [218, -116], [141, -185], [196, -185], [305, 23], [190, -150], [332, -151], [348, -58], [288, 47], [218, 185], [185, 185], [250, 46], [251, -81], [288, -58], [261, 93], [250, 0], [245, -58], [256, -58], [250, 104], [299, 93], [283, 23], [316, 0], [255, 58], [251, 46], [76, 290], [11, 243], [174, -162], [49, -266], [92, -244], [115, -196], [234, -105], [315, 35], [365, 12], [250, 35], [364, 0], [262, 11], [364, -23], [310, -46], [196, -186], [-54, -220], [179, -173], [299, -139], [310, -151], [360, -104], [375, -92], [283, -93], [315, -12], [180, 197], [245, -162], [212, -185], [245, -139], [337, -58], [321, -69], [136, -232], [316, -139], [212, -208], [310, -93], [321, 12], [299, -35], [332, 12], [332, -47], [310, -81], [288, -139], [289, -116], [195, -173], [-32, -232], [-147, -208], [-125, -266], [-98, -209], [-131, -243], [-364, -93], [-163, -208], [-360, -127], [-125, -232], [-190, -220], [-201, -185], [-115, -243], [-70, -220], [-28, -266], [6, -220], [158, -232], [60, -220], [130, -208], [517, -81], [109, -255], [-501, -93], [-424, -127], [-528, -23], [-234, -336], [-49, -278], [-119, -220], [-147, -220], [370, -196], [141, -244], [239, -219], [338, -197], [386, -186], [419, -185], [636, -185], [142, -289], [800, -128], [53, -45], [208, -175], [767, 151], [636, -186], [-99520, -142] ], [ [69148, 21851], [179, -186], [263, -74], [9, -112], [-77, -269], [-427, -38], [-7, 314], [41, 244], [19, 121] ], [ [90387, 26479], [269, -204], [151, 81], [217, 113], [166, -39], [20, -702], [-95, -203], [-29, -476], [-97, 162], [-193, -412], [-57, 32], [-171, 19], [-171, 505], [-38, 390], [-160, 515], [7, 271], [181, -52] ], [ [89877, 42448], [100, -464], [179, 223], [92, -250], [133, -231], [-29, -262], [60, -506], [42, -295], [70, -72], [75, -505], [-27, -307], [90, -400], [301, -309], [197, -281], [186, -257], [-37, -143], [159, -371], [108, -639], [111, 130], [113, -256], [68, 91], [48, -626], [197, -363], [129, -226], [217, -478], [78, -475], [7, -337], [-19, -365], [132, -502], [-16, -523], [-48, -274], [-75, -527], [6, -339], [-55, -423], [-123, -538], [-205, -290], [-102, -458], [-93, -292], [-82, -510], [-107, -294], [-70, -442], [-36, -407], [14, -187], [-159, -205], [-311, -22], [-257, -242], [-127, -229], [-168, -254], [-230, 262], [-170, 104], [43, 308], [-152, -112], [-243, -428], [-240, 160], [-158, 94], [-159, 42], [-269, 171], [-179, 364], [-52, 449], [-64, 298], [-137, 240], [-267, 71], [91, 287], [-67, 438], [-136, -408], [-247, -109], [146, 327], [42, 341], [107, 289], [-22, 438], [-226, -504], [-174, -202], [-106, -470], [-217, 243], [9, 313], [-174, 429], [-147, 221], [52, 137], [-356, 358], [-195, 17], [-267, 287], [-498, -56], [-359, -211], [-317, -197], [-265, 39], [-294, -303], [-241, -137], [-53, -309], [-103, -240], [-236, -15], [-174, -52], [-246, 107], [-199, -64], [-191, -27], [-165, -315], [-81, 26], [-140, -167], [-133, -187], [-203, 23], [-186, 0], [-295, 377], [-149, 113], [6, 338], [138, 81], [47, 134], [-10, 212], [34, 411], [-31, 350], [-147, 598], [-45, 337], [12, 336], [-111, 385], [-7, 174], [-123, 235], [-35, 463], [-158, 467], [-39, 252], [122, -255], [-93, 548], [137, -171], [83, -229], [-5, 303], [-138, 465], [-26, 186], [-65, 177], [31, 341], [56, 146], [38, 295], [-29, 346], [114, 425], [21, -450], [118, 406], [225, 198], [136, 252], [212, 217], [126, 46], [77, -73], [219, 220], [168, 66], [42, 129], [74, 54], [153, -14], [292, 173], [151, 262], [71, 316], [163, 300], [13, 236], [7, 321], [194, 502], [117, -510], [119, 118], [-99, 279], [87, 287], [122, -128], [34, 449], [152, 291], [67, 233], [140, 101], [4, 165], [122, -69], [5, 148], [122, 85], [134, 80], [205, -271], [155, -350], [173, -4], [177, -56], [-59, 325], [133, 473], [126, 155], [-44, 147], [121, 338], [168, 208], [142, -70], [234, 111], [-5, 302], [-204, 195], [148, 86], [184, -147], [148, -242], [234, -151], [79, 60], [172, -182], [162, 169], [105, -51], [65, 113], [127, -292], [-74, -316], [-105, -239], [-96, -20], [32, -236], [-81, -295], [-99, -291], [20, -166], [221, -327], [214, -189], [143, -204], [201, -350], [78, 1], [145, -151], [43, -183], [265, -200], [183, 202], [55, 317], [56, 262], [34, 324], [85, 470], [-39, 286], [20, 171], [-32, 339], [37, 445], [53, 120], [-43, 197], [67, 313], [52, 325], [7, 168], [104, 222], [78, -289], [19, -371], [70, -71], [11, -249], [101, -300], [21, -335], [-10, -214] ], [ [54716, 79012], [-21, -241], [-156, -2], [53, -128], [-92, -380] ], [ [54500, 78261], [-53, -100], [-243, -14], [-140, -134], [-229, 45] ], [ [53835, 78058], [-398, 153], [-62, 205], [-274, -102], [-32, -113], [-169, 84] ], [ [52900, 78285], [-142, 16], [-125, 108], [42, 145], [-10, 104] ], [ [52665, 78658], [83, 33], [141, -164], [39, 156], [245, -25], [199, 106], [133, -18], [87, -121], [26, 100], [-40, 385], [100, 75], [98, 272] ], [ [53776, 79457], [206, -190], [157, 242], [98, 44], [215, -180], [131, 30], [128, -111] ], [ [54711, 79292], [-23, -75], [28, -205] ], [ [62817, 73469], [-190, 78], [-141, 273], [-44, 223] ], [ [63495, 75281], [146, -311], [141, -419], [130, -28], [85, -159], [-228, -47], [-49, -459], [-48, -207], [-101, -138], [7, -293] ], [ [63578, 73220], [-69, -29], [-173, 309], [95, 292], [-82, 174], [-104, -44], [-327, -436] ], [ [62492, 74950], [68, 96], [207, -169], [149, -36], [38, 70], [-136, 319], [72, 82] ], [ [62890, 75312], [78, -20], [191, -359], [122, -40], [48, 150], [166, 238] ], [ [58149, 47921], [-17, 713], [-70, 268] ], [ [58062, 48902], [169, -46], [85, 336], [147, -38] ], [ [58463, 49154], [16, -233], [60, -134], [3, -192], [-69, -124], [-108, -308], [-101, -214], [-115, -28] ], [ [50920, 80916], [204, -47], [257, 123], [176, -258], [153, -138] ], [ [51710, 80596], [-32, -400] ], [ [51678, 80196], [-72, -22], [-30, -331] ], [ [51576, 79843], [-243, 269], [-143, -46], [-194, 279], [-129, 237], [-129, 10], [-40, 207] ], [ [50698, 80799], [222, 117] ], [ [50747, 54278], [-229, -69] ], [ [50518, 54209], [-69, 407], [13, 1357], [-56, 122], [-11, 290], [-96, 207], [-85, 174], [35, 311] ], [ [50249, 57077], [96, 67], [56, 258], [136, 56], [61, 176] ], [ [50598, 57634], [93, 173], [100, 2], [212, -340] ], [ [51003, 57469], [-11, -197], [62, -350], [-54, -238], [29, -159], [-135, -366], [-86, -181], [-52, -372], [7, -376], [-16, -952] ], [ [49214, 56277], [-190, 152], [-130, -22], [-97, -149], [-125, 125], [-49, 195], [-125, 129] ], [ [48498, 56707], [-18, 343], [76, 250], [-7, 200], [221, 490], [41, 405], [76, 144], [134, -79], [116, 120], [38, 152], [216, 265], [53, 184], [259, 246], [153, 84], [70, -114], [178, 3] ], [ [50104, 59400], [-22, -286], [37, -269], [156, -386], [9, -286], [320, -134], [-6, -405] ], [ [50249, 57077], [-243, 13] ], [ [50006, 57090], [-128, 47], [-90, -96], [-123, 43], [-482, -27], [-7, -336], [38, -444] ], [ [75742, 63602], [-6, -424], [-97, 90], [18, -476] ], [ [75657, 62792], [-79, 308], [-16, 301], [-53, 285], [-116, 344], [-256, 23], [25, -243], [-87, -329], [-118, 120], [-41, -108], [-78, 65], [-108, 53] ], [ [74730, 63611], [-43, 486], [-96, 444], [47, 356], [-171, 159], [62, 215], [173, 220], [-200, 313], [98, 401], [220, -255], [133, -30], [24, -410], [265, -81], [257, 8], [160, -101], [-128, -500], [-124, -34], [-86, -336], [152, -306], [46, 377], [76, 2], [147, -937] ], [ [56293, 76715], [80, -243], [108, 43], [213, -92], [408, -31], [138, 150], [327, 138], [202, -215], [163, -62] ], [ [57932, 76403], [-144, -245], [-101, -422], [89, -337] ], [ [57776, 75399], [-239, 79], [-283, -186] ], [ [57254, 75292], [-3, -294], [-252, -56], [-196, 206], [-222, -162], [-206, 17] ], [ [56375, 75003], [-20, 391], [-139, 189] ], [ [56216, 75583], [46, 84], [-30, 70], [47, 188], [105, 185], [-135, 255], [-24, 216], [68, 134] ], [ [28462, 64617], [-68, -29], [-70, 340], [-104, 171], [60, 375], [84, -23], [97, -491], [1, -343] ], [ [28383, 66284], [-303, -95], [-19, 219], [130, 47], [184, -18], [8, -153] ], [ [28611, 66290], [-48, -420], [-51, 75], [4, 309], [-124, 234], [-1, 67], [220, -265] ], [ [55279, 77084], [100, 2], [-69, -260], [134, -227], [-41, -278], [-65, -27] ], [ [55338, 76294], [-52, -53], [-90, -138], [-41, -325] ], [ [55155, 75778], [-246, 224], [-105, 247], [-106, 130], [-127, 221], [-61, 183], [-136, 277], [59, 245], [99, -136], [60, 123], [130, 13], [239, -98], [192, 8], [126, -131] ], [ [56523, 82432], [268, -4], [302, 223], [64, 333], [228, 190], [-26, 264] ], [ [57359, 83438], [169, 100], [298, 228] ], [ [57826, 83766], [293, -149], [39, -146], [146, 70], [272, -141], [27, -277], [-60, -159], [174, -387], [113, -108], [-16, -107], [187, -104], [80, -157], [-108, -129], [-224, 20], [-54, -55], [66, -196], [68, -379] ], [ [58829, 81362], [-239, -35], [-85, -129], [-18, -298], [-111, 57], [-250, -28], [-73, 138], [-104, -103], [-105, 86], [-218, 12], [-310, 141], [-281, 47], [-215, -14], [-152, -160], [-133, -23] ], [ [56535, 81053], [-6, 263], [-85, 274], [166, 121], [2, 235], [-77, 225], [-12, 261] ], [ [25238, 61101], [-2, 87], [33, 27], [51, -70], [99, 357], [53, 8] ], [ [25472, 61510], [1, -87], [53, -3], [-5, -160], [-45, -256], [24, -91], [-29, -212], [18, -56], [-32, -299], [-55, -156], [-50, -19], [-55, -205] ], [ [25297, 59966], [-83, 0], [22, 667], [2, 468] ], [ [31359, 37147], [-200, -81], [-109, 814], [-150, 663], [88, 572], [-146, 250], [-37, 426], [-136, 402] ], [ [30669, 40193], [175, 638], [-119, 496], [63, 199], [-49, 219], [108, 295], [6, 503], [13, 415], [60, 200], [-240, 951] ], [ [30686, 44109], [206, -50], [143, 13], [62, 179], [243, 239], [147, 222], [363, 100], [-29, -443], [34, -227], [-23, -396], [302, -529], [311, -98], [109, -220], [188, -117], [115, -172], [175, 6], [161, -175], [12, -342], [55, -172], [3, -255], [-81, -10], [107, -688], [533, -24], [-41, -342], [30, -233], [151, -166], [66, -367], [-49, -465], [-77, -259], [27, -337], [-87, -122] ], [ [33842, 38659], [-4, 182], [-259, 302], [-258, 9], [-484, -172], [-133, -520], [-7, -318], [-110, -708] ], [ [34826, 35372], [54, 341], [38, 350], [0, 325], [-100, 107], [-104, -96], [-103, 26], [-33, 228], [-26, 541], [-52, 177], [-187, 160], [-114, -116], [-293, 113], [18, 802], [-82, 329] ], [ [30686, 44109], [-157, -102], [-126, 68], [18, 898], [-228, -348], [-245, 15], [-105, 315], [-184, 34], [59, 254], [-155, 359], [-115, 532], [73, 108], [0, 250], [168, 171], [-28, 319], [71, 206], [20, 275], [318, 402], [227, 114], [37, 89], [251, -28] ], [ [30585, 48040], [125, 1620], [6, 256], [-43, 339], [-123, 215], [1, 430], [156, 97], [56, -61], [9, 226], [-162, 61], [-4, 370], [541, -13], [92, 203], [77, -187], [55, -349], [52, 73] ], [ [31423, 51320], [153, -312], [216, 38], [54, 181], [206, 138], [115, 97], [32, 250], [198, 168], [-15, 124], [-235, 51], [-39, 372], [12, 396], [-125, 153], [52, 55], [206, -76], [221, -148], [80, 140], [200, 92], [310, 221], [102, 225], [-37, 167] ], [ [33129, 53652], [145, 26], [64, -136], [-36, -259], [96, -90], [63, -274], [-77, -209], [-44, -502], [71, -299], [20, -274], [171, -277], [137, -29], [30, 116], [88, 25], [126, 104], [90, 157], [154, -50], [67, 21] ], [ [34294, 51702], [151, -48], [25, 120], [-46, 118], [28, 171], [112, -53], [131, 61], [159, -125] ], [ [34854, 51946], [121, -122], [86, 160], [62, -25], [38, -166], [133, 42], [107, 224], [85, 436], [164, 540] ], [ [35650, 53035], [95, 28], [69, -327], [155, -1033], [149, -97], [7, -408], [-208, -487], [86, -178], [491, -92], [10, -593], [211, 388], [349, -212], [462, -361], [135, -346], [-45, -327], [323, 182], [540, -313], [415, 23], [411, -489], [355, -662], [214, -170], [237, -24], [101, -186], [94, -752], [46, -358], [-110, -977], [-142, -385], [-391, -822], [-177, -668], [-206, -513], [-69, -11], [-78, -435], [20, -1107], [-77, -910], [-30, -390], [-88, -233], [-49, -790], [-282, -771], [-47, -610], [-225, -256], [-65, -355], [-302, 2], [-437, -227], [-195, -263], [-311, -173], [-327, -470], [-235, -586], [-41, -441], [46, -326], [-51, -597], [-63, -289], [-195, -325], [-308, -1040], [-244, -468], [-189, -277], [-127, -562], [-183, -337] ], [ [35174, 30629], [-77, 334], [122, 280], [-160, 402], [-218, 327], [-286, 379], [-103, -18], [-279, 457], [-180, -63] ], [ [81723, 53254], [110, 221], [236, 323] ], [ [82069, 53798], [-13, -291], [-16, -377], [-133, 19], [-58, -202], [-126, 307] ], [ [75471, 66988], [113, -189], [-20, -363], [-227, -17], [-234, 39], [-175, -92], [-252, 224], [-6, 119] ], [ [74670, 66709], [184, 439], [150, 150], [198, -137], [147, -14], [122, -159] ], [ [58175, 37528], [-393, -435], [-249, -442], [-93, -393], [-83, -222], [-152, -47], [-48, -283], [-28, -184], [-178, -138], [-226, 29], [-133, 166], [-117, 71], [-135, -137], [-68, -283], [-132, -177], [-139, -264], [-199, -60], [-62, 207], [26, 360], [-165, 562], [-75, 88] ], [ [55526, 35946], [0, 1725], [274, 20], [8, 2105], [207, 19], [428, 207], [106, -243], [177, 231], [85, 2], [156, 133] ], [ [56967, 40145], [50, -44] ], [ [57017, 40101], [107, -473], [56, -105], [87, -342], [315, -649], [119, -64], [0, -208], [82, -375], [215, -90], [177, -267] ], [ [54244, 54965], [229, 44], [52, 152], [46, -11], [69, -134], [350, 226], [118, 230], [145, 207], [-28, 208], [78, 54], [269, -36], [261, 273], [201, 645], [141, 239], [176, 101] ], [ [56351, 57163], [31, -253], [160, -369], [1, -241], [-45, -246], [18, -184], [96, -170] ], [ [56612, 55700], [212, -258] ], [ [56824, 55442], [152, -239], [2, -192], [187, -308], [116, -255], [70, -355], [208, -234], [44, -187] ], [ [57603, 53672], [-91, -63], [-178, 14], [-209, 62], [-104, -51], [-41, -143], [-90, -18], [-110, 125], [-309, -295], [-127, 60], [-38, -46], [-83, -357], [-207, 115], [-203, 59], [-177, 218], [-229, 200], [-149, -190], [-108, -300], [-25, -412] ], [ [55125, 52650], [-178, 33], [-188, 99], [-166, -313], [-146, -550] ], [ [54447, 51919], [-29, 172], [-12, 269], [-127, 190], [-103, 305], [-23, 212], [-132, 309], [23, 176], [-28, 249], [21, 458], [67, 107], [140, 599] ], [ [32315, 78082], [202, -79], [257, 16], [-137, -242], [-102, -38], [-353, 250], [-69, 198], [105, 183], [97, -288] ], [ [32831, 79592], [-135, -11], [-360, 186], [-258, 279], [96, 49], [365, -148], [284, -247], [8, -108] ], [ [15692, 79240], [-140, -82], [-456, 269], [-84, 209], [-248, 207], [-50, 168], [-286, 107], [-107, 321], [24, 137], [291, -129], [171, -89], [261, -63], [94, -204], [138, -280], [277, -244], [115, -327] ], [ [34407, 80527], [-184, -517], [181, 199], [187, -126], [-98, -206], [247, -162], [128, 144], [277, -182], [-86, -433], [194, 101], [36, -313], [86, -367], [-117, -520], [-125, -22], [-183, 111], [60, 484], [-77, 75], [-322, -513], [-166, 21], [196, 277], [-267, 144], [-298, -35], [-539, 18], [-43, 175], [173, 208], [-121, 160], [234, 356], [287, 941], [172, 336], [241, 204], [129, -26], [-54, -160], [-148, -372] ], [ [13005, 82584], [131, -76], [267, 47], [-84, -671], [242, -475], [-111, 1], [-167, 270], [-103, 272], [-140, 184], [-51, 260], [16, 188] ], [ [27981, 87304], [-108, -310], [-123, 50], [-73, 176], [13, 41], [107, 177], [114, -13], [70, -121] ], [ [27250, 87631], [-325, -326], [-196, 13], [-61, 160], [207, 273], [381, -6], [-6, -114] ], [ [26344, 89371], [51, -259], [143, 91], [161, -155], [304, -203], [318, -184], [25, -281], [204, 46], [199, -196], [-247, -186], [-432, 142], [-156, 266], [-275, -314], [-396, -306], [-95, 346], [-377, -57], [242, 292], [35, 465], [95, 542], [201, -49] ], [ [28926, 90253], [-312, -30], [-69, 289], [118, 331], [255, 82], [217, -163], [3, -253], [-32, -82], [-180, -174] ], [ [23431, 91410], [-173, -207], [-374, 179], [-226, -65], [-380, 266], [245, 183], [194, 256], [295, -168], [166, -106], [84, -112], [169, -226] ], [ [31350, 77248], [-181, 334], [0, 805], [-123, 171], [-187, -100], [-92, 155], [-212, -446], [-84, -460], [-99, -269], [-118, -91], [-89, -30], [-28, -146], [-512, 0], [-422, -4], [-125, -109], [-294, -425], [-34, -46], [-89, -231], [-255, 1], [-273, -3], [-125, -93], [44, -116], [25, -181], [-5, -60], [-363, -293], [-286, -93], [-323, -316], [-70, 0], [-94, 93], [-31, 85], [6, 61], [61, 207], [131, 325], [81, 349], [-56, 514], [-59, 536], [-290, 277], [35, 105], [-41, 73], [-76, 0], [-56, 93], [-14, 140], [-54, -61], [-75, 18], [17, 59], [-65, 58], [-27, 155], [-216, 189], [-224, 197], [-272, 229], [-261, 214], [-248, -167], [-91, -6], [-342, 154], [-225, -77], [-269, 183], [-284, 94], [-194, 36], [-86, 100], [-49, 325], [-94, -3], [-1, -227], [-575, 0], [-951, 0], [-944, 0], [-833, 0], [-834, 0], [-819, 0], [-847, 0], [-273, 0], [-825, 0], [-788, 0] ], [ [15878, 79530], [-38, 1], [-537, 581], [-199, 255], [-503, 244], [-155, 523], [40, 363], [-356, 252], [-48, 476], [-336, 429], [-6, 304] ], [ [13740, 82958], [154, 285], [-7, 373], [-473, 376], [-284, 674], [-173, 424], [-255, 266], [-187, 242], [-147, 306], [-279, -192], [-270, -330], [-247, 388], [-194, 259], [-271, 164], [-273, 17], [1, 3364], [2, 2193] ], [ [10837, 91767], [518, -142], [438, -285], [289, -54], [244, 247], [336, 184], [413, -72], [416, 259], [455, 148], [191, -245], [207, 138], [62, 278], [192, -63], [470, -530], [369, 401], [38, -449], [341, 97], [105, 173], [337, -34], [424, -248], [650, -217], [383, -100], [272, 38], [374, -300], [-390, -293], [502, -127], [750, 70], [236, 103], [296, -354], [302, 299], [-283, 251], [179, 202], [338, 27], [223, 59], [224, -141], [279, -321], [310, 47], [491, -266], [431, 94], [405, -14], [-32, 367], [247, 103], [431, -200], [-2, -559], [177, 471], [223, -16], [126, 594], [-298, 364], [-324, 239], [22, 653], [329, 429], [366, -95], [281, -261], [378, -666], [-247, -290], [517, -120], [-1, -604], [371, 463], [332, -380], [-83, -438], [269, -399], [290, 427], [202, 510], [16, 649], [394, -46], [411, -87], [373, -293], [17, -293], [-207, -315], [196, -316], [-36, -288], [-544, -413], [-386, -91], [-287, 178], [-83, -297], [-268, -498], [-81, -259], [-322, -399], [-397, -39], [-220, -250], [-18, -384], [-323, -74], [-340, -479], [-301, -665], [-108, -466], [-16, -686], [409, -99], [125, -553], [130, -448], [388, 117], [517, -256], [277, -225], [199, -279], [348, -163], [294, -248], [459, -34], [302, -58], [-45, -511], [86, -594], [201, -661], [414, -561], [214, 192], [150, 607], [-145, 934], [-196, 311], [445, 276], [314, 415], [154, 411], [-23, 395], [-188, 502], [-338, 445], [328, 619], [-121, 535], [-93, 922], [194, 137], [476, -161], [286, -57], [230, 155], [258, -200], [342, -343], [85, -229], [495, -45], [-8, -496], [92, -747], [254, -92], [201, -348], [402, 328], [266, 652], [184, 274], [216, -527], [362, -754], [307, -709], [-112, -371], [370, -333], [250, -338], [442, -152], [179, -189], [110, -500], [216, -78], [112, -223], [20, -664], [-202, -222], [-199, -207], [-458, -210], [-349, -486], [-470, -96], [-594, 125], [-417, 4], [-287, -41], [-233, -424], [-354, -262], [-401, -782], [-320, -545], [236, 97], [446, 776], [583, 493], [415, 58], [246, -289], [-262, -397], [88, -637], [91, -446], [361, -295], [459, 86], [278, 664], [19, -429], [180, -214], [-344, -387], [-615, -351], [-276, -239], [-310, -426], [-211, 44], [-11, 500], [483, 488], [-445, -19], [-309, -72] ], [ [18287, 93781], [-139, -277], [618, 179], [386, -298], [314, 302], [254, -194], [227, -580], [140, 244], [-197, 606], [244, 86], [276, -94], [311, -239], [175, -575], [86, -417], [466, -293], [502, -279], [-31, -260], [-456, -48], [178, -227], [-94, -217], [-503, 93], [-478, 160], [-322, -36], [-522, -201], [-704, -88], [-494, -56], [-151, 279], [-379, 161], [-246, -66], [-343, 468], [185, 62], [429, 101], [392, -26], [362, 103], [-537, 138], [-594, -47], [-394, 12], [-146, 217], [644, 237], [-428, -9], [-485, 156], [233, 443], [193, 235], [744, 359], [284, -114] ], [ [20972, 93958], [-244, -390], [-434, 413], [95, 83], [372, 24], [211, -130] ], [ [28794, 93770], [25, -163], [-296, 17], [-299, 13], [-304, -80], [-80, 36], [-306, 313], [12, 213], [133, 39], [636, -63], [479, -325] ], [ [25955, 93803], [219, -369], [256, 477], [704, 242], [477, -611], [-42, -387], [550, 172], [263, 235], [616, -299], [383, -282], [36, -258], [515, 134], [290, -376], [670, -234], [242, -238], [263, -553], [-510, -275], [654, -386], [441, -130], [400, -543], [437, -39], [-87, -414], [-487, -687], [-342, 253], [-437, 568], [-359, -74], [-35, -338], [292, -344], [377, -272], [114, -157], [181, -584], [-96, -425], [-350, 160], [-697, 473], [393, -509], [289, -357], [45, -206], [-753, 236], [-596, 343], [-337, 287], [97, 167], [-414, 304], [-405, 286], [5, -171], [-803, -94], [-235, 203], [183, 435], [522, 10], [571, 76], [-92, 211], [96, 294], [360, 576], [-77, 261], [-107, 203], [-425, 286], [-563, 201], [178, 150], [-294, 367], [-245, 34], [-219, 201], [-149, -175], [-503, -76], [-1011, 132], [-588, 174], [-450, 89], [-231, 207], [290, 270], [-394, 2], [-88, 599], [213, 528], [286, 241], [717, 158], [-204, -382] ], [ [22123, 94208], [331, -124], [496, 75], [72, -172], [-259, -283], [420, -254], [-50, -532], [-455, -229], [-268, 50], [-192, 225], [-690, 456], [5, 189], [567, -73], [-306, 386], [329, 286] ], [ [24112, 93575], [-298, -442], [-317, 22], [-173, 519], [4, 294], [145, 251], [276, 161], [579, -20], [530, -144], [-415, -526], [-331, -115] ], [ [16539, 92755], [-731, -285], [-147, 259], [-641, 312], [119, 250], [192, 432], [241, 388], [-272, 362], [939, 93], [397, -123], [709, -33], [270, -171], [298, -249], [-349, -149], [-681, -415], [-344, -414], [0, -257] ], [ [23996, 94879], [-151, -229], [-403, 44], [-337, 155], [148, 266], [399, 159], [243, -208], [101, -187] ], [ [22639, 95907], [212, -273], [9, -303], [-127, -440], [-458, -60], [-298, 94], [5, 345], [-455, -46], [-18, 457], [299, -18], [419, 201], [390, -34], [22, 77] ], [ [19941, 95601], [109, -210], [247, 99], [291, -26], [49, -289], [-169, -281], [-940, -91], [-701, -256], [-423, -14], [-35, 193], [577, 261], [-1255, -70], [-389, 106], [379, 577], [262, 165], [782, -199], [493, -350], [485, -45], [-397, 565], [255, 215], [286, -68], [94, -282] ], [ [23699, 96131], [308, -190], [547, 1], [240, -194], [-64, -222], [319, -134], [177, -140], [374, -26], [406, -50], [441, 128], [566, 51], [451, -42], [298, -223], [62, -244], [-174, -157], [-414, -127], [-355, 72], [-797, -91], [-570, -11], [-449, 73], [-738, 190], [-96, 325], [-34, 293], [-279, 258], [-574, 72], [-322, 183], [104, 242], [573, -37] ], [ [17722, 96454], [-38, -454], [-214, -205], [-259, -29], [-517, -252], [-444, -91], [-377, 128], [472, 442], [570, 383], [426, -9], [381, 87] ], [ [23933, 96380], [-126, -17], [-521, 38], [-74, 165], [559, -9], [195, -109], [-33, -68] ], [ [19392, 96485], [-518, -170], [-411, 191], [224, 188], [406, 60], [392, -92], [-93, -177] ], [ [19538, 97019], [-339, -115], [-461, 1], [5, 84], [285, 177], [149, -27], [361, -120] ], [ [23380, 96697], [-411, -122], [-226, 138], [-119, 221], [-22, 245], [360, -24], [162, -39], [332, -205], [-76, -214] ], [ [22205, 96856], [108, -247], [-453, 66], [-457, 192], [-619, 21], [268, 176], [-335, 142], [-21, 227], [546, -81], [751, -215], [212, -281] ], [ [25828, 97644], [334, -190], [-381, -176], [-513, -445], [-492, -42], [-575, 76], [-299, 240], [4, 215], [220, 157], [-508, -4], [-306, 196], [-176, 268], [193, 262], [192, 180], [285, 42], [-122, 135], [646, 30], [355, -315], [468, -127], [455, -112], [220, -390] ], [ [30972, 99681], [742, -47], [597, -75], [508, -161], [-12, -157], [-678, -257], [-672, -119], [-251, -133], [605, 3], [-656, -358], [-452, -167], [-476, -483], [-573, -98], [-177, -120], [-841, -64], [383, -74], [-192, -105], [230, -292], [-264, -202], [-429, -167], [-132, -232], [-388, -176], [39, -134], [475, 23], [6, -144], [-742, -355], [-726, 163], [-816, -91], [-414, 71], [-525, 31], [-35, 284], [514, 133], [-137, 427], [170, 41], [742, -255], [-379, 379], [-450, 113], [225, 229], [492, 141], [79, 206], [-392, 231], [-118, 304], [759, -26], [220, -64], [433, 216], [-625, 68], [-972, -38], [-491, 201], [-232, 239], [-324, 173], [-61, 202], [413, 112], [324, 19], [545, 96], [409, 220], [344, -30], [300, -166], [211, 319], [367, 95], [498, 65], [849, 24], [148, -63], [802, 100], [601, -38], [602, -37] ], [ [52900, 78285], [-22, -242], [-122, -100], [-206, 75], [-60, -239], [-132, -19], [-48, 94], [-156, -200], [-134, -28], [-120, 126] ], [ [51900, 77752], [-95, 259], [-133, -92], [5, 267], [203, 332], [-9, 150], [126, -54], [77, 101] ], [ [52074, 78715], [236, -4], [57, 128], [298, -181] ], [ [31400, 18145], [-92, -239], [-238, -183], [-137, 19], [-164, 48], [-202, 177], [-291, 86], [-350, 330], [-283, 317], [-383, 662], [229, -124], [390, -395], [369, -212], [143, 271], [90, 405], [256, 244], [198, -70] ], [ [30952, 19680], [-247, 4], [-134, -145], [-250, -213], [-45, -552], [-118, -14], [-313, 192], [-318, 412], [-346, 338], [-87, 374], [79, 346], [-140, 393], [-36, 1007], [119, 568], [293, 457], [-422, 172], [265, 522], [94, 982], [309, -208], [145, 1224], [-186, 157], [-87, -738], [-175, 83], [87, 845], [95, 1095], [127, 404], [-80, 576], [-22, 666], [117, 19], [170, 954], [192, 945], [118, 881], [-64, 885], [83, 487], [-34, 730], [163, 721], [50, 1143], [89, 1227], [87, 1321], [-20, 967], [-58, 832] ], [ [30452, 39739], [143, 151], [74, 303] ], [ [80649, 61615], [-240, -284], [-228, 183], [-8, 509], [137, 267], [304, 166], [159, -14], [62, -226], [-122, -260], [-64, -341] ], [ [86288, 75628], [-179, 348], [-111, -331], [-429, -254], [44, -312], [-241, 22], [-131, 185], [-191, -419], [-306, -318], [-227, -379] ], [ [84517, 74170], [-388, -171], [-204, -277], [-300, -161], [148, 274], [-58, 230], [220, 397], [-147, 310], [-242, -209], [-314, -411], [-171, -381], [-272, -29], [-142, -275], [147, -400], [227, -97], [9, -265], [220, -173], [311, 422], [247, -230], [179, -15], [45, -310], [-393, -165], [-130, -319], [-270, -296], [-142, -414], [299, -325], [109, -581], [169, -541], [189, -454], [-5, -439], [-174, -161], [66, -315], [164, -184], [-43, -481], [-71, -468], [-155, -53], [-203, -640], [-225, -775], [-258, -705], [-382, -545], [-386, -498], [-313, -68], [-170, -262], [-96, 192], [-157, -294], [-388, -296], [-294, -90], [-95, -624], [-154, -35], [-73, 429], [66, 228], [-373, 189], [-131, -96] ], [ [80013, 63313], [-280, 154], [-132, 240], [44, 340], [-254, 108], [-134, 222], [-236, -315], [-271, -68], [-221, 3], [-149, -145] ], [ [78380, 63852], [-144, -86], [42, -676], [-148, 16], [-25, 139] ], [ [78105, 63245], [-9, 244], [-203, -172], [-121, 109], [-206, 222], [81, 490], [-176, 115], [-66, 544], [-293, -98], [33, 701], [263, 493], [11, 487], [-8, 452], [-121, 141], [-93, 348], [-162, -44] ], [ [77035, 67277], [-300, 89], [94, 248], [-130, 367], [-198, -249], [-233, 145], [-321, -376], [-252, -439], [-224, -74] ], [ [74670, 66709], [-23, 465], [-170, -124] ], [ [74477, 67050], [-324, 57], [-314, 136], [-225, 259], [-216, 117], [-93, 284], [-157, 84], [-280, 385], [-223, 182], [-115, -141] ], [ [72530, 68413], [-386, 413], [-273, 374], [-78, 651], [200, -79], [9, 301], [-111, 303], [28, 482], [-298, 692] ], [ [71621, 71550], [-457, 239], [-82, 454], [-205, 276] ], [ [70827, 72688], [-42, 337], [10, 230], [-169, 134], [-91, -59], [-70, 546] ], [ [70465, 73876], [79, 136], [-39, 138], [266, 279], [192, 116], [294, -80], [105, 378], [356, 70], [99, 234], [438, 320], [39, 134] ], [ [72294, 75601], [-22, 337], [190, 154], [-250, 1026], [550, 236], [143, 131], [200, 1058], [551, -194], [155, 267], [13, 592], [230, 56], [212, 393] ], [ [74266, 79657], [109, 49] ], [ [74375, 79706], [73, -413], [233, -313], [396, -222], [192, -476], [-107, -690], [100, -256], [330, -101], [374, -83], [336, -368], [171, -66], [127, -544], [163, -351], [306, 14], [574, -133], [369, 82], [274, -88], [411, -359], [336, 1], [123, -184], [324, 318], [448, 205], [417, 22], [324, 208], [200, 316], [194, 199], [-45, 195], [-89, 227], [146, 381], [156, -53], [286, -120], [277, 313], [423, 229], [204, 391], [195, 168], [404, 78], [219, -66], [30, 210], [-251, 413], [-223, 189], [-214, -219], [-274, 92], [-157, -74], [-72, 241], [197, 590], [135, 446] ], [ [82410, 80055], [333, -223], [392, 373], [-3, 260], [251, 627], [155, 189], [-4, 326], [-152, 141], [229, 294], [345, 106], [369, 16], [415, -176], [244, -217], [172, -596], [104, -254], [97, -363], [103, -579], [483, -189], [329, -420], [112, -555], [423, -1], [240, 233], [459, 175], [-146, -532], [-107, -216], [-96, -647], [-186, -575], [-338, 104], [-238, -208], [73, -506], [-40, -698], [-142, -16], [2, -300] ], [ [49206, 53531], [-126, -7], [-194, 116], [-178, -7], [-329, -103], [-193, -170], [-275, -217], [-54, 15] ], [ [47857, 53158], [22, 487], [26, 74], [-8, 233], [-118, 247], [-88, 40], [-81, 162], [60, 262], [-28, 286], [13, 172] ], [ [47655, 55121], [44, 0], [17, 258], [-22, 114], [27, 82], [103, 71], [-69, 473], [-64, 245], [23, 200], [55, 46] ], [ [47769, 56610], [36, 54], [77, -89], [215, -5], [51, 172], [48, -11], [80, 67], [43, -253], [65, 74], [114, 88] ], [ [49214, 56277], [74, -841], [-117, -496], [-73, -667], [121, -509], [-13, -233] ], [ [53632, 51919], [-35, 32], [-164, -76], [-169, 79], [-132, -38] ], [ [53132, 51916], [-452, 13] ], [ [52680, 51929], [40, 466], [-108, 391], [-127, 100], [-56, 265], [-72, 85], [4, 163] ], [ [52361, 53399], [71, 418], [132, 570], [81, 6], [165, 345], [105, 10], [156, -243], [191, 199], [26, 246], [63, 238], [43, 299], [148, 243], [56, 414], [59, 132], [39, 307], [74, 377], [234, 457], [14, 196], [31, 107], [-110, 235] ], [ [53939, 57955], [9, 188], [78, 34] ], [ [54026, 58177], [111, -378], [18, -392], [-10, -393], [151, -537], [-155, 6], [-78, -42], [-127, 60], [-60, -279], [164, -345], [121, -100], [39, -245], [87, -407], [-43, -160] ], [ [54447, 51919], [-20, -319], [-220, 140], [-225, 156], [-350, 23] ], [ [58564, 52653], [-16, -691], [111, -80], [-89, -210], [-107, -157], [-106, -308], [-59, -274], [-15, -475], [-65, -225], [-2, -446] ], [ [58216, 49787], [-80, -165], [-10, -351], [-38, -46], [-26, -323] ], [ [58149, 47921], [50, -544], [-27, -307] ], [ [58172, 47070], [55, -343], [161, -330] ], [ [58388, 46397], [150, -745] ], [ [58538, 45652], [-109, 60], [-373, -99], [-75, -71], [-79, -377], [62, -261], [-49, -699], [-34, -593], [75, -105], [194, -230], [76, 107], [23, -637], [-212, 5], [-114, 325], [-103, 252], [-213, 82], [-62, 310], [-170, -187], [-222, 83], [-93, 268], [-176, 55], [-131, -15], [-15, 184], [-96, 15] ], [ [53422, 46976], [-39, 183] ], [ [53609, 47755], [73, -60], [95, 226], [152, -6], [17, -167], [104, -105], [164, 370], [161, 289], [71, 189], [-10, 486], [121, 574], [127, 304], [183, 285], [32, 189], [7, 216], [45, 205], [-14, 335], [34, 524], [55, 368], [83, 316], [16, 357] ], [ [57603, 53672], [169, -488], [124, -71], [75, 99], [128, -39], [155, 125], [66, -252], [244, -393] ], [ [53309, 47603], [-228, 626] ], [ [53081, 48229], [212, 326], [-105, 391], [95, 148], [187, 73], [23, 261], [148, -283], [245, -25], [85, 279], [36, 393], [-31, 461], [-131, 350], [120, 684], [-69, 117], [-207, -48], [-78, 305], [21, 258] ], [ [29063, 50490], [-119, 140], [-137, 195], [-79, -94], [-235, 82], [-68, 255], [-52, -10], [-278, 338] ], [ [28095, 51396], [-37, 183], [103, 44], [-12, 296], [65, 214], [138, 40], [117, 371], [106, 310], [-102, 141], [52, 343], [-62, 540], [59, 155], [-44, 500], [-112, 315] ], [ [28366, 54848], [36, 287], [89, -43], [52, 176], [-64, 348], [34, 86] ], [ [28513, 55702], [143, -18], [209, 412], [114, 63], [3, 195], [51, 500], [159, 274], [175, 11], [22, 123], [218, -49], [218, 298], [109, 132], [134, 285], [98, -36], [73, -156], [-54, -199] ], [ [30185, 57537], [-178, -99], [-71, -295], [-107, -169], [-81, -220], [-34, -422], [-77, -345], [144, -40], [35, -271], [62, -130], [21, -238], [-33, -219], [10, -123], [69, -49], [66, -207], [357, 57], [161, -75], [196, -508], [112, 63], [200, -32], [158, 68], [99, -102], [-50, -318], [-62, -199], [-22, -423], [56, -393], [79, -175], [9, -133], [-140, -294], [100, -130], [74, -207], [85, -589] ], [ [30585, 48040], [-139, 314], [-83, 14], [179, 602], [-213, 276], [-166, -51], [-101, 103], [-153, -157], [-207, 74], [-163, 620], [-129, 152], [-89, 279], [-184, 280], [-74, -56] ], [ [26954, 55439], [-151, 131], [-56, 124], [32, 103], [-11, 130], [-77, 142], [-109, 116], [-95, 76], [-19, 173], [-73, 105], [18, -172], [-55, -141], [-64, 164], [-89, 58], [-38, 120], [2, 179], [36, 187], [-78, 83], [64, 114] ], [ [26191, 57131], [42, 76], [183, -156], [63, 77], [89, -50], [46, -121], [82, -40], [66, 126] ], [ [26762, 57043], [70, -321], [108, -238], [130, -252] ], [ [27070, 56232], [-107, -53], [1, -238], [58, -88], [-41, -70], [10, -107], [-23, -120], [-14, -117] ], [ [27147, 64280], [240, -42], [219, -7], [261, -201], [110, -216], [260, 66], [98, -138], [235, -366], [173, -267], [92, 8], [165, -120], [-20, -167], [205, -24], [210, -242], [-33, -138], [-185, -75], [-187, -29], [-191, 46], [-398, -57], [186, 329], [-113, 154], [-179, 39], [-96, 171], [-66, 336], [-157, -23], [-259, 159], [-83, 124], [-362, 91], [-97, 115], [104, 148], [-273, 30], [-199, -307], [-115, -8], [-40, -144], [-138, -65], [-118, 56], [146, 183], [60, 213], [126, 131], [142, 116], [210, 56], [67, 65] ], [ [59092, 71341], [19, 3], [40, 143], [200, -8], [253, 176], [-188, -251], [21, -111] ], [ [59437, 71293], [-30, 21], [-53, -45], [-42, 12], [-14, -22], [-5, 59], [-20, 37], [-54, 6], [-75, -51], [-52, 31] ], [ [59437, 71293], [8, -48], [-285, -240], [-136, 77], [-64, 237], [132, 22] ], [ [53776, 79457], [-157, 254], [-141, 142], [-30, 249], [-49, 176], [202, 129], [103, 147], [200, 114], [70, 113], [73, -68], [124, 62] ], [ [54171, 80775], [132, -191], [207, -51], [-17, -163], [151, -122], [41, 153], [191, -66], [26, -185], [207, -36], [127, -291] ], [ [55236, 79823], [-82, -1], [-43, -106], [-64, -26], [-18, -134], [-54, -28], [-7, -55], [-95, -61], [-123, 10], [-39, -130] ], [ [52756, 83065], [4, -228], [281, -138], [-3, -210], [283, 111], [156, 162], [313, -233], [132, -189] ], [ [53922, 82340], [64, -300], [-77, -158], [101, -210], [69, -316], [-22, -204], [114, -377] ], [ [52074, 78715], [35, 421], [140, 404], [-400, 109], [-131, 155] ], [ [51718, 79804], [16, 259], [-56, 133] ], [ [51710, 80596], [-47, 619], [167, 0], [70, 222], [69, 541], [-51, 200] ], [ [51918, 82178], [54, 125], [232, 32], [52, -130], [188, 291], [-63, 222], [-13, 335] ], [ [52368, 83053], [210, -78], [178, 90] ], [ [61966, 58083], [66, -183], [-9, -245], [-158, -142], [119, -161] ], [ [61984, 57352], [-102, -317] ], [ [61882, 57035], [-62, 106], [-67, -42], [-155, 10], [-4, 180], [-22, 163], [94, 277], [98, 261] ], [ [61764, 57990], [119, -51], [83, 144] ], [ [53524, 83435], [-166, -478], [-291, 333], [-39, 246], [408, 195], [88, -296] ], [ [52368, 83053], [-113, 328], [-8, 604], [46, 159], [80, 177], [244, 37], [98, 163], [223, 167], [-9, -304], [-82, -192], [33, -166], [151, -89], [-68, -223], [-83, 64], [-200, -425], [76, -288] ], [ [30080, 62227], [34, 101], [217, -3], [165, -152], [73, 15], [50, -209], [152, 11], [-9, -176], [124, -21], [136, -217], [-103, -240], [-132, 128], [-127, -25], [-92, 28], [-50, -107], [-106, -37], [-43, 144], [-92, -85], [-111, -405], [-71, 94], [-14, 170] ], [ [30081, 61241], [5, 161], [-71, 177], [68, 99], [21, 228], [-24, 321] ], [ [53333, 64447], [-952, -1126], [-804, -1161], [-392, -263] ], [ [51185, 61897], [-308, -58], [-3, 376], [-129, 96], [-173, 169], [-66, 277], [-937, 1289], [-937, 1289] ], [ [48632, 65335], [-1045, 1431] ], [ [47587, 66766], [6, 114], [-1, 40] ], [ [47592, 66920], [-2, 700], [449, 436], [277, 90], [227, 159], [107, 295], [324, 234], [12, 438], [161, 51], [126, 219], [363, 99], [51, 230], [-73, 125], [-96, 624], [-17, 359], [-104, 379] ], [ [49397, 71358], [267, 323], [300, 102], [175, 244], [268, 180], [471, 105], [459, 48], [140, -87], [262, 232], [297, 5], [113, -137], [190, 35] ], [ [52339, 72408], [-57, -303], [44, -563], [-65, -487], [-171, -330], [24, -445], [227, -352], [3, -143], [171, -238], [118, -1061] ], [ [52633, 68486], [90, -522], [15, -274], [-49, -482], [21, -270], [-36, -323], [24, -371], [-110, -247], [164, -431], [11, -253], [99, -330], [130, 109], [219, -275], [122, -370] ], [ [27693, 48568], [148, 442], [-60, 258], [-106, -275], [-166, 259], [56, 167], [-47, 536], [97, 89], [52, 368], [105, 381], [-20, 241], [153, 126], [190, 236] ], [ [29063, 50490], [38, -449], [-86, -384], [-303, -619], [-334, -233], [-170, -514], [-53, -398], [-157, -243], [-116, 298], [-113, 64], [-114, -47], [-8, 216], [79, 141], [-33, 246] ], [ [59700, 68010], [-78, -238], [-60, -446], [-75, -308], [-65, -103], [-93, 191], [-125, 263], [-198, 847], [-29, -53], [115, -624], [171, -594], [210, -920], [102, -321], [90, -334], [249, -654], [-55, -103], [9, -384], [323, -530], [49, -121] ], [ [60240, 63578], [-1102, 0], [-1077, 0], [-1117, 0] ], [ [56944, 63578], [0, 2175], [0, 2101], [-83, 476], [71, 365], [-43, 253], [101, 283] ], [ [56990, 69231], [369, 10], [268, -156], [275, -175], [129, -92], [214, 188], [114, 169], [245, 49], [198, -75], [75, -293], [65, 193], [222, -140], [217, -33], [137, 149] ], [ [59518, 69025], [182, -1015] ], [ [61764, 57990], [-95, 191], [-114, 346], [-124, 190], [-71, 204], [-242, 237], [-191, 7], [-67, 124], [-163, -139], [-168, 268], [-87, -441], [-323, 124] ], [ [60119, 59101], [-30, 236], [120, 868], [27, 393], [88, 181], [204, 97], [141, 337] ], [ [60669, 61213], [161, -684], [77, -542], [152, -288], [379, -558], [154, -336], [151, -341], [87, -203], [136, -178] ], [ [47490, 75324], [14, 420], [-114, 257], [393, 426], [340, -106], [373, 3], [296, -101], [230, 31], [449, -19] ], [ [49471, 76235], [111, -230], [511, -268], [101, 127], [313, -267], [322, 77] ], [ [50829, 75674], [15, -344], [-263, -393], [-356, -125], [-25, -199], [-171, -327], [-107, -481], [108, -338], [-160, -263], [-60, -384], [-210, -118], [-197, -454], [-352, -9], [-265, 11], [-174, -209], [-106, -223], [-136, 49], [-103, 199], [-79, 340], [-259, 92] ], [ [47929, 72498], [-23, 195], [103, 222], [38, 161], [-96, 175], [77, 388], [-111, 355], [120, 48], [11, 280], [45, 86], [3, 461], [129, 160], [-78, 296], [-162, 21], [-47, -75], [-164, 0], [-70, 289], [-113, -86], [-101, -150] ], [ [56753, 84725], [32, 349], [-102, -75], [-176, 210], [-24, 340], [351, 164], [350, 86], [301, -97], [287, 17] ], [ [57772, 85719], [42, -103], [-198, -341], [83, -551], [-120, -187] ], [ [57579, 84537], [-229, 1], [-239, 219], [-121, 73], [-237, -105] ], [ [61882, 57035], [-61, -209], [103, -325], [102, -285], [106, -210], [909, -702], [233, 4] ], [ [63274, 55308], [-785, -1773], [-362, -26], [-247, -417], [-178, -11], [-76, -186] ], [ [61626, 52895], [-190, 0], [-112, 200], [-254, -247], [-82, -247], [-185, 47], [-62, 68], [-65, -16], [-87, 6], [-352, 502], [-193, 0], [-95, 194], [0, 332], [-145, 99] ], [ [59804, 53833], [-164, 643], [-127, 137], [-48, 236], [-141, 288], [-171, 42], [95, 337], [147, 14], [42, 181] ], [ [59437, 55711], [-4, 531] ], [ [59433, 56242], [82, 618], [132, 166], [28, 241], [119, 451], [168, 293], [112, 582], [45, 508] ], [ [57942, 91385], [-41, -414], [425, -394], [-256, -445], [323, -673], [-187, -506], [250, -440], [-113, -385], [411, -405], [-105, -301], [-258, -341], [-594, -755] ], [ [57797, 86326], [-504, -47], [-489, -216], [-452, -125], [-161, 323], [-269, 193], [62, 582], [-135, 533], [133, 345], [252, 371], [635, 640], [185, 124], [-28, 250], [-387, 279] ], [ [56639, 89578], [-93, 230], [-8, 910], [-433, 402], [-371, 289] ], [ [55734, 91409], [167, 156], [309, -312], [362, 29], [298, -143], [265, 262], [137, 433], [431, 200], [356, -235], [-117, -414] ], [ [99547, 40335], [96, -171], [-46, -308], [-172, -81], [-153, 73], [-27, 260], [107, 203], [126, -74], [69, 98] ], [ [0, 41087], [57, 27], [-34, -284], [-23, -32], [99822, -145], [-177, -124], [-36, 220], [139, 121], [88, 33], [-99836, 184] ], [ [33000, 19946], [333, 354], [236, -148], [167, 237], [222, -266], [-83, -207], [-375, -177], [-125, 207], [-236, -266], [-139, 266] ], [ [34854, 51946], [70, 252], [24, 269], [48, 253], [-107, 349] ], [ [34889, 53069], [-22, 404], [144, 508] ], [ [35011, 53981], [95, -65], [204, -140], [294, -499], [46, -242] ], [ [52655, 75484], [-92, -456], [-126, 120], [-64, 398], [56, 219], [179, 226], [47, -507] ], [ [51576, 79843], [62, -52], [80, 13] ], [ [51900, 77752], [-11, -167], [82, -222], [-97, -180], [72, -457], [151, -75], [-32, -256] ], [ [52065, 76395], [-252, -334], [-548, 160], [-404, -192], [-32, -355] ], [ [49471, 76235], [144, 354], [53, 1177], [-287, 620], [-205, 299], [-424, 227], [-28, 431], [360, 129], [466, -152], [-88, 669], [263, -254], [646, 461], [84, 484], [243, 119] ], [ [53081, 48229], [-285, 596], [-184, 488], [-169, 610], [9, 196], [61, 189], [67, 430], [56, 438] ], [ [52636, 51176], [94, 35], [404, -6], [-2, 711] ], [ [48278, 82406], [-210, 122], [-172, -9], [57, 317], [-57, 317] ], [ [47896, 83153], [233, 24], [298, -365], [-149, -406] ], [ [49165, 85222], [-297, -639], [283, 81], [304, -3], [-72, -481], [-250, -530], [287, -38], [22, -62], [248, -697], [190, -95], [171, -673], [79, -233], [337, -113], [-34, -378], [-142, -173], [111, -305], [-250, -310], [-371, 6], [-473, -163], [-130, 116], [-183, -276], [-257, 67], [-195, -226], [-148, 118], [407, 621], [249, 127], [-2, 1], [-434, 98], [-79, 235], [291, 183], [-152, 319], [52, 387], [413, -54], [1, 0], [40, 343], [-186, 364], [-4, 8], [-337, 104], [-66, 160], [101, 264], [-92, 163], [-149, -279], [-17, 569], [-140, 301], [101, 611], [216, 480], [222, -47], [335, 49] ], [ [61542, 75120], [42, 252], [-70, 403], [-160, 218], [-154, 68], [-102, 181] ], [ [61098, 76242], [34, 70], [235, -101], [409, -96], [378, -283], [48, -110], [169, 93], [259, -124], [85, -242], [175, -137] ], [ [62106, 74858], [-268, 290], [-296, -28] ], [ [50294, 54083], [-436, -346], [-154, -203], [-250, -171], [-248, 168] ], [ [50006, 57090], [-20, -184], [116, -305], [-1, -429], [27, -466], [69, -215], [-61, -532], [22, -294], [74, -375], [62, -207] ], [ [47655, 55121], [-78, 15], [-57, -238], [-78, 3], [-55, 126], [19, 237], [-116, 362], [-73, -67], [-59, -13] ], [ [47158, 55546], [-77, -34], [3, 217], [-44, 155], [9, 171], [-60, 249], [-78, 211], [-222, 1], [-65, -112], [-76, -13], [-48, -128], [-32, -163], [-148, -260] ], [ [46320, 55840], [-122, 349], [-108, 232], [-71, 76], [-69, 118], [-32, 261], [-41, 130], [-80, 97] ], [ [45797, 57103], [123, 288], [84, -11], [73, 99], [61, 1], [44, 78], [-24, 196], [31, 62], [5, 200] ], [ [46194, 58016], [134, -6], [200, -144], [61, 13], [21, 66], [151, -47], [40, 33] ], [ [46801, 57931], [16, -216], [44, 1], [73, 78], [46, -19], [77, -150], [119, -48], [76, 128], [90, 79], [67, 83], [55, -15], [62, -130], [33, -163], [114, -248], [-57, -152], [-11, -192], [59, 58], [35, -69], [-15, -176], [85, -170] ], [ [45321, 58350], [36, 262] ], [ [45357, 58612], [302, 17], [63, 140], [88, 9], [110, -145], [86, -3], [92, 99], [56, -170], [-120, -133], [-121, 11], [-119, 124], [-103, -136], [-50, -5], [-67, -83], [-253, 13] ], [ [45797, 57103], [-149, 247], [-117, 39], [-63, 166], [1, 90], [-84, 125], [-18, 127] ], [ [45367, 57897], [147, 96], [92, -19], [75, 67], [513, -25] ], [ [52636, 51176], [-52, 90], [96, 663] ], [ [56583, 71675], [152, -199], [216, 34], [207, -42], [-7, -103], [151, 71], [-35, -175], [-400, -50], [3, 98], [-339, 115], [52, 251] ], [ [57237, 74699], [-169, 17], [-145, 56], [-336, -154], [192, -332], [-141, -96], [-154, -1], [-147, 305], [-52, -130], [62, -353], [139, -277], [-105, -129], [155, -273], [137, -171], [4, -334], [-257, 157], [82, -302], [-176, -62], [105, -521], [-184, -8], [-228, 257], [-104, 473], [-49, 393], [-108, 272], [-143, 337], [-18, 168] ], [ [55838, 74710], [182, 53], [106, 129], [150, -12], [46, 103], [53, 20] ], [ [57254, 75292], [135, -157], [-86, -369], [-66, -67] ], [ [37010, 99398], [932, 353], [975, -27], [354, 218], [982, 57], [2219, -74], [1737, -469], [-513, -227], [-1062, -26], [-1496, -58], [140, -105], [984, 65], [836, -204], [540, 181], [231, -212], [-305, -344], [707, 220], [1348, 229], [833, -114], [156, -253], [-1132, -420], [-157, -136], [-888, -102], [643, -28], [-324, -431], [-224, -383], [9, -658], [333, -386], [-434, -24], [-457, -187], [513, -313], [65, -502], [-297, -55], [360, -508], [-617, -42], [322, -241], [-91, -208], [-391, -91], [-388, -2], [348, -400], [4, -263], [-549, 244], [-143, -158], [375, -148], [364, -361], [105, -476], [-495, -114], [-214, 228], [-344, 340], [95, -401], [-322, -311], [732, -25], [383, -32], [-745, -515], [-755, -466], [-813, -204], [-306, -2], [-288, -228], [-386, -624], [-597, -414], [-192, -24], [-370, -145], [-399, -138], [-238, -365], [-4, -415], [-141, -388], [-453, -472], [112, -462], [-125, -488], [-142, -577], [-391, -36], [-410, 482], [-556, 3], [-269, 324], [-186, 577], [-481, 735], [-141, 385], [-38, 530], [-384, 546], [100, 435], [-186, 208], [275, 691], [418, 220], [110, 247], [58, 461], [-318, -209], [-151, -88], [-249, -84], [-341, 193], [-19, 401], [109, 314], [258, 9], [567, -157], [-478, 375], [-249, 202], [-276, -83], [-232, 147], [310, 550], [-169, 220], [-220, 409], [-335, 626], [-353, 230], [3, 247], [-745, 346], [-590, 43], [-743, -24], [-677, -44], [-323, 188], [-482, 372], [729, 186], [559, 31], [-1188, 154], [-627, 241], [39, 229], [1051, 285], [1018, 284], [107, 214], [-750, 213], [243, 235], [961, 413], [404, 63], [-115, 265], [658, 156], [854, 93], [853, 5], [303, -184], [737, 325], [663, -221], [390, -46], [577, -192], [-660, 318], [38, 253] ], [ [24973, 58695], [-142, 103], [-174, 11], [-127, 117], [-149, 244] ], [ [24381, 59170], [7, 172], [32, 138], [-39, 111], [133, 481], [357, 2], [7, 201], [-45, 36], [-31, 128], [-103, 136], [-103, 198], [125, 1], [1, 333], [259, 1], [257, -7] ], [ [25297, 59966], [90, -107], [24, 88], [82, -75] ], [ [25493, 59872], [-127, -225], [-131, -166], [-20, -113], [22, -116], [-58, -150] ], [ [25179, 59102], [-65, -37], [15, -69], [-52, -66], [-95, -149], [-9, -86] ], [ [33400, 55523], [183, -217], [171, -385], [8, -304], [105, -14], [149, -289], [109, -205] ], [ [34125, 54109], [-44, -532], [-169, -154], [15, -139], [-51, -305], [123, -429], [89, -1], [37, -333], [169, -514] ], [ [33129, 53652], [-188, 448], [75, 163], [-5, 273], [171, 95], [69, 110], [-95, 220], [24, 215], [220, 347] ], [ [25745, 58251], [-48, 185], [-84, 51] ], [ [25613, 58487], [19, 237], [-38, 64], [-57, 42], [-122, -70], [-10, 79], [-84, 95], [-60, 118], [-82, 50] ], [ [25493, 59872], [29, -23], [61, 104], [79, 8], [26, -48], [43, 29], [129, -53], [128, 15], [90, 66], [32, 66], [89, -31], [66, -40], [73, 14], [55, 51], [127, -82], [44, -13], [85, -110], [80, -132], [101, -91], [73, -162] ], [ [26903, 59440], [-95, 12], [-38, -81], [-97, -77], [-70, 0], [-61, -76], [-56, 27], [-47, 90], [-29, -17], [-36, -141], [-27, 5], [-4, -121], [-97, -163], [-51, -70], [-29, -74], [-82, 120], [-60, -158], [-58, 4], [-65, -14], [6, -290], [-41, -5], [-35, -135], [-86, -25] ], [ [55230, 77704], [67, -229], [89, -169], [-107, -222] ], [ [55155, 75778], [-31, -100] ], [ [55124, 75678], [-261, 218], [-161, 213], [-254, 176], [-233, 434], [56, 45], [-127, 248], [-5, 200], [-179, 93], [-85, -255], [-82, 198], [6, 205], [10, 9] ], [ [53809, 77462], [194, -20], [51, 100], [94, -97], [109, -11], [-1, 165], [97, 60], [27, 239], [221, 157] ], [ [54601, 78055], [88, -73], [208, -253], [229, -114], [104, 89] ], [ [30081, 61241], [-185, 100], [-131, -41], [-169, 43], [-130, -110], [-149, 184], [24, 190], [256, -82], [210, -47], [100, 131], [-127, 256], [2, 226], [-175, 92], [62, 163], [170, -26], [241, -93] ], [ [54716, 79012], [141, -151], [103, -65], [233, 73], [22, 118], [111, 18], [135, 92], [30, -38], [130, 74], [66, 139], [91, 36], [297, -180], [59, 61] ], [ [56134, 79189], [155, -161], [19, -159] ], [ [56308, 78869], [-170, -123], [-131, -401], [-168, -401], [-223, -111] ], [ [55616, 77833], [-173, 26], [-213, -155] ], [ [54601, 78055], [-54, 200], [-47, 6] ], [ [83531, 44530], [-117, -11], [-368, 414], [259, 116], [146, -180], [97, -180], [-17, -159] ], [ [84713, 45326], [28, -117], [5, -179] ], [ [84746, 45030], [-181, -441], [-238, -130], [-33, 71], [25, 201], [119, 360], [275, 235] ], [ [82749, 45797], [100, -158], [172, 48], [69, -251], [-321, -119], [-193, -79], [-149, 5], [95, 340], [153, 5], [74, 209] ], [ [84139, 45797], [-41, -328], [-417, -168], [-370, 73], [0, 216], [220, 123], [174, -177], [185, 45], [249, 216] ], [ [80172, 46575], [533, -59], [61, 244], [515, -284], [101, -383], [417, -108], [341, -351], [-317, -225], [-306, 238], [-251, -16], [-288, 44], [-260, 106], [-322, 225], [-204, 59], [-116, -74], [-506, 243], [-48, 254], [-255, 44], [191, 564], [337, -35], [224, -231], [115, -45], [38, -210] ], [ [87423, 46908], [-143, -402], [-27, 445], [49, 212], [58, 200], [63, -173], [0, -282] ], [ [85346, 48536], [-104, -196], [-192, 108], [-54, 254], [281, 29], [69, -195] ], [ [86241, 48752], [101, -452], [-234, 244], [-232, 49], [-157, -39], [-192, 21], [65, 325], [344, 24], [305, -172] ], [ [89166, 49043], [5, -1925], [4, -1925] ], [ [89175, 45193], [-247, 485], [-282, 118], [-69, -168], [-352, -18], [118, 481], [175, 164], [-72, 642], [-134, 496], [-538, 500], [-229, 50], [-417, 546], [-82, -287], [-107, -52], [-63, 216], [-1, 257], [-212, 290], [299, 213], [198, -11], [-23, 156], [-407, 1], [-110, 352], [-248, 109], [-117, 293], [374, 143], [142, 192], [446, -242], [44, -220], [78, -955], [287, -354], [232, 627], [319, 356], [247, 1], [238, -206], [206, -212], [298, -113] ], [ [84788, 51419], [-223, -587], [-209, -113], [-267, 115], [-463, -29], [-243, -85], [-39, -447], [248, -526], [150, 268], [518, 201], [-22, -272], [-121, 86], [-121, -347], [-245, -229], [263, -757], [-50, -203], [249, -682], [-2, -388], [-148, -173], [-109, 207], [134, 484], [-273, -229], [-69, 164], [36, 228], [-200, 346], [21, 576], [-186, -179], [24, -689], [11, -846], [-176, -85], [-119, 173], [79, 544], [-43, 570], [-117, 4], [-86, 405], [115, 387], [40, 469], [139, 891], [58, 243], [237, 439], [217, -174], [350, -82], [319, 25], [275, 429], [48, -132] ], [ [85746, 51249], [-15, -517], [-143, 58], [-42, -359], [114, -312], [-78, -71], [-112, 374], [-82, 755], [56, 472], [92, 215], [20, -322], [164, -52], [26, -241] ], [ [80461, 51765], [47, -395], [190, -334], [179, 121], [177, -43], [162, 299], [133, 52], [263, -166], [226, 126], [143, 822], [107, 205], [96, 672], [319, 0], [241, -100] ], [ [82744, 53024], [-158, -533], [204, -560], [-48, -272], [312, -546], [-329, -70], [-93, -403], [12, -535], [-267, -404], [-7, -589], [-107, -903], [-41, 210], [-316, -266], [-110, 361], [-198, 34], [-139, 189], [-330, -212], [-101, 285], [-182, -32], [-229, 68], [-43, 793], [-138, 164], [-134, 505], [-38, 517], [32, 548], [165, 392] ], [ [79393, 47122], [-308, -12], [-234, 494], [-356, 482], [-119, 358], [-210, 481], [-138, 443], [-212, 827], [-244, 493], [-81, 508], [-103, 461], [-250, 372], [-145, 506], [-209, 330], [-290, 652], [-24, 300], [178, -24], [430, -114], [246, -577], [215, -401], [153, -246], [263, -635], [283, -9], [233, -405], [161, -495], [211, -270], [-111, -482], [159, -205], [100, -15], [47, -412], [97, -330], [204, -52], [135, -374], [-70, -735], [-11, -914] ], [ [72530, 68413], [-176, -268], [-108, -553], [269, -224], [262, -289], [362, -332], [381, -76], [160, -301], [215, -56], [334, -138], [231, 10], [32, 234], [-36, 375], [21, 255] ], [ [77035, 67277], [20, -224], [-97, -108], [23, -364], [-199, 107], [-359, -408], [8, -338], [-153, -496], [-14, -288], [-124, -487], [-217, 135], [-11, -612], [-63, -201], [30, -251], [-137, -140] ], [ [74730, 63611], [-39, -216], [-189, 7], [-343, -122], [16, -445], [-148, -349], [-400, -398], [-311, -695], [-209, -373], [-276, -387], [-1, -271], [-138, -146], [-251, -212], [-129, -31], [-84, -450], [58, -769], [15, -490], [-118, -561], [-1, -1004], [-144, -29], [-126, -450], [84, -195], [-253, -168], [-93, -401], [-112, -170], [-263, 552], [-128, 827], [-107, 596], [-97, 279], [-148, 568], [-69, 739], [-48, 369], [-253, 811], [-115, 1145], [-83, 756], [1, 716], [-54, 553], [-404, -353], [-196, 70], [-362, 716], [133, 214], [-82, 232], [-326, 501] ], [ [68937, 64577], [185, 395], [612, -2], [-56, 507], [-156, 300], [-31, 455], [-182, 265], [306, 619], [323, -45], [290, 620], [174, 599], [270, 593], [-4, 421], [236, 342], [-224, 292], [-96, 400], [-99, 517], [137, 255], [421, -144], [310, 88], [268, 496] ], [ [48278, 82406], [46, -422], [-210, -528], [-493, -349], [-393, 89], [225, 617], [-145, 601], [378, 463], [210, 276] ], [ [64978, 72558], [244, 114], [197, 338], [186, -17], [122, 110], [197, -55], [308, -299], [221, -65], [318, -523], [207, -21], [24, -498] ], [ [66909, 68203], [137, -310], [112, -357], [266, -260], [7, -520], [133, -96], [23, -272], [-400, -305], [-105, -687] ], [ [67082, 65396], [-523, 179], [-303, 136], [-313, 76], [-118, 725], [-133, 105], [-214, -106], [-280, -286], [-339, 196], [-281, 454], [-267, 168], [-186, 561], [-205, 788], [-149, -96], [-177, 196], [-104, -231] ], [ [63490, 68261], [-153, 311], [-3, 314], [-89, 0], [46, 428], [-143, 449], [-340, 324], [-193, 562], [65, 461], [139, 204], [-21, 345], [-182, 177], [-180, 705] ], [ [62436, 72541], [-152, 473], [55, 183], [-87, 678], [190, 168] ], [ [63578, 73220], [88, -436], [263, -123], [193, -296], [395, -102], [434, 156], [27, 139] ], [ [63490, 68261], [-164, 29] ], [ [63326, 68290], [-187, 49], [-204, -567] ], [ [62935, 67772], [-516, 47], [-784, 1188], [-413, 414], [-335, 160] ], [ [60887, 69581], [-112, 720] ], [ [60775, 70301], [615, 614], [105, 715], [-26, 431], [152, 146], [142, 369] ], [ [61763, 72576], [119, 92], [324, -77], [97, -150], [133, 100] ], [ [45969, 89843], [-64, -382], [314, -403], [-361, -451], [-801, -405], [-240, -107], [-365, 87], [-775, 187], [273, 261], [-605, 289], [492, 114], [-12, 174], [-583, 137], [188, 385], [421, 87], [433, -400], [422, 321], [349, -167], [453, 315], [461, -42] ], [ [59922, 69905], [-49, -186] ], [ [59873, 69719], [-100, 82], [-58, -394], [69, -66], [-71, -81], [-12, -156], [131, 80] ], [ [59832, 69184], [7, -230], [-139, -944] ], [ [59518, 69025], [80, 194], [-19, 34], [74, 276], [56, 446], [40, 149], [8, 6] ], [ [59757, 70130], [93, -1], [25, 104], [75, 8] ], [ [59950, 70241], [4, -242], [-38, -90], [6, -4] ], [ [54311, 73167], [-100, -465], [41, -183], [-58, -303], [-213, 222], [-141, 64], [-387, 300], [38, 304], [325, -54], [284, 64], [211, 51] ], [ [52558, 74927], [166, -419], [-39, -782], [-126, 38], [-113, -197], [-105, 156], [-11, 713], [-64, 338], [153, -30], [139, 183] ], [ [53835, 78058], [-31, -291], [67, -251] ], [ [53871, 77516], [-221, 86], [-226, -210], [15, -293], [-34, -168], [91, -301], [261, -298], [140, -488], [309, -476], [217, 3], [68, -130], [-78, -118], [249, -214], [204, -178], [238, -308], [29, -111], [-52, -211], [-154, 276], [-242, 97], [-116, -382], [200, -219], [-33, -309], [-116, -35], [-148, -506], [-116, -46], [1, 181], [57, 317], [60, 126], [-108, 342], [-85, 298], [-115, 74], [-82, 255], [-179, 107], [-120, 238], [-206, 38], [-217, 267], [-254, 384], [-189, 340], [-86, 585], [-138, 68], [-226, 195], [-128, -80], [-161, -274], [-115, -43] ], [ [28453, 61504], [187, -53], [147, -142], [46, -161], [-195, -11], [-84, -99], [-156, 95], [-159, 215], [34, 135], [116, 41], [64, -20] ], [ [59922, 69905], [309, -234], [544, 630] ], [ [60887, 69581], [-53, -89], [-556, -296], [277, -591], [-92, -101], [-46, -197], [-212, -82], [-66, -213], [-120, -182], [-310, 94] ], [ [59709, 67924], [-9, 86] ], [ [59832, 69184], [41, 173], [0, 362] ], [ [87399, 70756], [35, -203], [-156, -357], [-114, 189], [-143, -137], [-73, -346], [-181, 168], [2, 281], [154, 352], [158, -68], [114, 248], [204, -127] ], [ [89159, 72524], [-104, -472], [48, -296], [-145, -416], [-355, -278], [-488, -36], [-396, -675], [-186, 227], [-12, 442], [-483, -130], [-329, -279], [-325, -11], [282, -435], [-186, -1004], [-179, -248], [-135, 229], [69, 533], [-176, 172], [-113, 405], [263, 182], [145, 371], [280, 306], [203, 403], [553, 177], [297, -121], [291, 1050], [185, -282], [408, 591], [158, 229], [174, 723], [-47, 664], [117, 374], [295, 108], [152, -819], [-9, -479], [-256, -595], [4, -610] ], [ [89974, 76679], [195, -126], [197, 250], [62, -663], [-412, -162], [-244, -587], [-436, 404], [-152, -646], [-308, -9], [-39, 587], [138, 455], [296, 33], [81, 817], [83, 460], [326, -615], [213, -198] ], [ [69711, 75551], [-159, -109], [-367, -412], [-121, -422], [-104, -4], [-76, 280], [-353, 19], [-57, 484], [-135, 4], [21, 593], [-333, 431], [-476, -46], [-326, -86], [-265, 533], [-227, 223], [-431, 423], [-52, 51], [-715, -349], [11, -2178] ], [ [65546, 74986], [-142, -29], [-195, 463], [-188, 166], [-315, -123], [-123, -197] ], [ [64583, 75266], [-15, 144], [68, 246], [-53, 206], [-322, 202], [-125, 530], [-154, 150], [-9, 192], [270, -56], [11, 432], [236, 96], [243, -88], [50, 576], [-50, 365], [-278, -28], [-236, 144], [-321, -260], [-259, -124] ], [ [63639, 77993], [-142, 96], [29, 304], [-177, 395], [-207, -17], [-235, 401], [160, 448], [-81, 120], [222, 649], [285, -342], [35, 431], [573, 643], [434, 15], [612, -409], [329, -239], [295, 249], [440, 12], [356, -306], [80, 175], [391, -25], [69, 280], [-450, 406], [267, 288], [-52, 161], [266, 153], [-200, 405], [127, 202], [1039, 205], [136, 146], [695, 218], [250, 245], [499, -127], [88, -612], [290, 144], [356, -202], [-23, -322], [267, 33], [696, 558], [-102, -185], [355, -457], [620, -1500], [148, 309], [383, -340], [399, 151], [154, -106], [133, -341], [194, -115], [119, -251], [358, 79], [147, -361] ], [ [72294, 75601], [-171, 87], [-140, 212], [-412, 62], [-461, 16], [-100, -65], [-396, 248], [-158, -122], [-43, -349], [-457, 204], [-183, -84], [-62, -259] ], [ [61551, 49585], [-195, -236], [-68, -246], [-104, -44], [-40, -416], [-89, -238], [-54, -393], [-112, -195] ], [ [60889, 47817], [-399, 590], [-19, 343], [-1007, 1203], [-47, 65] ], [ [59417, 50018], [-3, 627], [80, 239], [137, 391], [101, 431], [-123, 678], [-32, 296], [-132, 411] ], [ [59445, 53091], [171, 352], [188, 390] ], [ [61626, 52895], [-243, -670], [3, -2152], [165, -488] ], [ [70465, 73876], [-526, -89], [-343, 192], [-301, -46], [26, 340], [303, -98], [101, 182] ], [ [69725, 74357], [212, -58], [355, 425], [-329, 311], [-198, -147], [-205, 223], [234, 382], [-83, 58] ], [ [78495, 57780], [-66, 713], [178, 492], [359, 112], [261, -84] ], [ [79227, 59013], [229, -232], [126, 407], [246, -217] ], [ [79828, 58971], [64, -394], [-34, -708], [-467, -455], [122, -358], [-292, -43], [-240, -238] ], [ [78981, 56775], [-233, 87], [-112, 307], [-141, 611] ], [ [85652, 73393], [240, -697], [68, -383], [3, -681], [-105, -325], [-252, -113], [-222, -245], [-250, -51], [-31, 322], [51, 443], [-122, 615], [206, 99], [-190, 506] ], [ [85048, 72883], [17, 54], [124, -21], [108, 266], [197, 29], [118, 39], [40, 143] ], [ [55575, 75742], [52, 132] ], [ [55627, 75874], [66, 43], [38, 196], [50, 33], [40, -84], [52, -36], [36, -94], [46, -28], [54, -110], [39, 4], [-31, -144], [-33, -71], [9, -44] ], [ [55993, 75539], [-62, -23], [-164, -91], [-13, -121], [-35, 5] ], [ [63326, 68290], [58, -261], [-25, -135], [89, -445] ], [ [63448, 67449], [-196, -16], [-69, 282], [-248, 57] ], [ [79227, 59013], [90, 266], [12, 500], [-224, 515], [-18, 583], [-211, 480], [-210, 40], [-56, -205], [-163, -17], [-83, 104], [-293, -353], [-6, 530], [68, 623], [-188, 27], [-16, 355], [-120, 182] ], [ [77809, 62643], [59, 218], [237, 384] ], [ [78380, 63852], [162, -466], [125, -537], [342, -5], [108, -515], [-178, -155], [-80, -212], [333, -353], [231, -699], [175, -520], [210, -411], [70, -418], [-50, -590] ], [ [59757, 70130], [99, 482], [138, 416], [5, 21] ], [ [59999, 71049], [125, -31], [45, -231], [-151, -223], [-68, -323] ], [ [47857, 53158], [-73, -5], [-286, 282], [-252, 449], [-237, 324], [-187, 381] ], [ [46822, 54589], [66, 189], [15, 172], [126, 320], [129, 276] ], [ [54125, 64088], [-197, -220], [-156, 324], [-439, 255] ], [ [52633, 68486], [136, 137], [24, 250], [-30, 244], [191, 228], [86, 189], [135, 170], [16, 454] ], [ [53191, 70158], [326, -204], [117, 51], [232, -98], [368, -264], [130, -526], [250, -114], [391, -248], [296, -293], [136, 153], [133, 272], [-65, 452], [87, 288], [200, 277], [192, 80], [375, -121], [95, -264], [104, -2], [88, -101], [276, -70], [68, -195] ], [ [56944, 63578], [0, -1180], [-320, -2], [-3, -248] ], [ [56621, 62148], [-1108, 1131], [-1108, 1132], [-280, -323] ], [ [72718, 55024], [-42, -615], [-116, -168], [-242, -135], [-132, 470], [-49, 849], [126, 959], [192, -328], [129, -416], [134, -616] ], [ [58049, 33472], [96, -178], [-85, -288], [-47, -192], [-155, -93], [-51, -188], [-99, -59], [-209, 454], [148, 374], [151, 232], [130, 120], [121, -182] ], [ [56314, 82678], [-23, 150], [30, 162], [-123, 94], [-291, 103] ], [ [55907, 83187], [-59, 497] ], [ [55848, 83684], [318, 181], [466, -38], [273, 59], [39, -123], [148, -38], [267, -287] ], [ [56523, 82432], [-67, 182], [-142, 64] ], [ [55848, 83684], [10, 445], [136, 371], [262, 202], [221, -442], [223, 12], [53, 453] ], [ [57579, 84537], [134, -136], [24, -287], [89, -348] ], [ [47592, 66920], [-42, 0], [7, -317], [-172, -19], [-90, -134], [-126, 0], [-100, 76], [-234, -63], [-91, -460], [-86, -44], [-131, -745], [-386, -637], [-92, -816], [-114, -265], [-33, -213], [-625, -48], [-5, 1] ], [ [45272, 63236], [13, 274], [106, 161], [91, 308], [-18, 200], [96, 417], [155, 376], [93, 95], [74, 344], [6, 315], [100, 365], [185, 216], [177, 603], [5, 8], [139, 227], [259, 65], [218, 404], [140, 158], [232, 493], [-70, 735], [106, 508], [37, 312], [179, 399], [278, 270], [206, 244], [186, 612], [87, 362], [205, -2], [167, -251], [264, 41], [288, -131], [121, -6] ], [ [57394, 79070], [66, 87], [185, 58], [204, -184], [115, -22], [125, -159], [-20, -200], [101, -97], [40, -247], [97, -150], [-19, -88], [52, -60], [-74, -44], [-164, 18], [-27, 81], [-58, -47], [20, -106], [-76, -188], [-49, -203], [-70, -64] ], [ [57842, 77455], [-50, 270], [30, 252], [-9, 259], [-160, 352], [-89, 249], [-86, 175], [-84, 58] ], [ [63761, 43212], [74, -251], [69, -390], [45, -711], [72, -276], [-28, -284], [-49, -174], [-94, 347], [-53, -175], [53, -438], [-24, -250], [-77, -137], [-18, -500], [-109, -689], [-137, -814], [-172, -1120], [-106, -821], [-125, -685], [-226, -140], [-243, -250], [-160, 151], [-220, 211], [-77, 312], [-18, 524], [-98, 471], [-26, 425], [50, 426], [128, 102], [1, 197], [133, 447], [25, 377], [-65, 280], [-52, 372], [-23, 544], [97, 331], [38, 375], [138, 22], [155, 121], [103, 107], [122, 7], [158, 337], [229, 364], [83, 297], [-38, 253], [118, -71], [153, 410], [6, 356], [92, 264], [96, -254] ], [ [23016, 65864], [-107, -518], [-49, -426], [-20, -791], [-27, -289], [48, -322], [86, -288], [56, -458], [184, -440], [65, -337], [109, -291], [295, -157], [114, -247], [244, 165], [212, 60], [208, 106], [175, 101], [176, 241], [67, 345], [22, 496], [48, 173], [188, 155], [294, 137], [246, -21], [169, 50], [66, -125], [-9, -285], [-149, -351], [-66, -360], [51, -103], [-42, -255], [-69, -461], [-71, 152], [-58, -10] ], [ [24381, 59170], [-314, 636], [-144, 191], [-226, 155], [-156, -43], [-223, -223], [-140, -58], [-196, 156], [-208, 112], [-260, 271], [-208, 83], [-314, 275], [-233, 282], [-70, 158], [-155, 35], [-284, 187], [-116, 270], [-299, 335], [-139, 373], [-66, 288], [93, 57], [-29, 169], [64, 153], [1, 204], [-93, 266], [-25, 235], [-94, 298], [-244, 587], [-280, 462], [-135, 368], [-238, 241], [-51, 145], [42, 365], [-142, 138], [-164, 287], [-69, 412], [-149, 48], [-162, 311], [-130, 288], [-12, 184], [-149, 446], [-99, 452], [5, 227], [-201, 234], [-93, -25], [-159, 163], [-44, -240], [46, -284], [27, -444], [95, -243], [206, -407], [46, -139], [42, -42], [37, -203], [49, 8], [56, -381], [85, -150], [59, -210], [174, -300], [92, -550], [83, -259], [77, -277], [15, -311], [134, -20], [112, -268], [100, -264], [-6, -106], [-117, -217], [-49, 3], [-74, 359], [-181, 337], [-201, 286], [-142, 150], [9, 432], [-42, 320], [-132, 183], [-191, 264], [-37, -76], [-70, 154], [-171, 143], [-164, 343], [20, 44], [115, -33], [103, 221], [10, 266], [-214, 422], [-163, 163], [-102, 369], [-103, 388], [-129, 472], [-113, 531] ], [ [17464, 69802], [316, 46], [353, 64], [-26, -116], [419, -287], [634, -416], [552, 4], [221, 0], [0, 244], [481, 0], [102, -210], [142, -186], [165, -260], [92, -309], [69, -325], [144, -178], [230, -177], [175, 467], [227, 11], [196, -236], [139, -404], [96, -346], [164, -337], [61, -414], [78, -277], [217, -184], [197, -130], [108, 18] ], [ [55993, 75539], [95, 35], [128, 9] ], [ [46619, 59216], [93, 107], [47, 348], [88, 14], [194, -165], [157, 117], [107, -39], [42, 131], [1114, 9], [62, 414], [-48, 73], [-134, 2550], [-134, 2550], [425, 10] ], [ [51185, 61897], [1, -1361], [-152, -394], [-24, -364], [-247, -94], [-379, -51], [-102, -210], [-178, -23] ], [ [46801, 57931], [13, 184], [-24, 229], [-104, 166], [-54, 338], [-13, 368] ], [ [77375, 56448], [-27, 439], [86, 452], [-94, 350], [23, 644], [-113, 306], [-90, 707], [-50, 746], [-121, 490], [-183, -297], [-315, -421], [-156, 53], [-172, 138], [96, 732], [-58, 554], [-218, 681], [34, 213], [-163, 76], [-197, 481] ], [ [77809, 62643], [-159, -137], [-162, -256], [-196, -26], [-127, -639], [-117, -107], [134, -519], [177, -431], [113, -390], [-101, -514], [-96, -109], [66, -296], [185, -470], [32, -330], [-4, -274], [108, -539], [-152, -551], [-135, -607] ], [ [55380, 75322], [-58, 46], [-78, 192], [-120, 118] ], [ [55338, 76294], [74, -101], [40, -82], [91, -63], [106, -123], [-22, -51] ], [ [74375, 79706], [292, 102], [530, 509], [423, 278], [242, -182], [289, -8], [186, -276], [277, -22], [402, -148], [270, 411], [-113, 348], [288, 612], [311, -244], [252, -69], [327, -152], [53, -443], [394, -248], [263, 109], [351, 78], [279, -78], [272, -284], [168, -302], [258, 6], [350, -96], [255, 146], [366, 98], [407, 416], [166, -63], [146, -198], [331, 49] ], [ [59599, 43773], [209, 48], [334, -166], [73, 74], [193, 16], [99, 177], [167, -10], [303, 230], [221, 342] ], [ [61198, 44484], [45, -265], [-11, -588], [34, -519], [11, -923], [49, -290], [-83, -422], [-108, -410], [-177, -366], [-254, -225], [-313, -287], [-313, -634], [-107, -108], [-194, -420], [-115, -136], [-23, -421], [132, -448], [54, -346], [4, -177], [49, 29], [-8, -579], [-45, -275], [65, -101], [-41, -245], [-116, -211], [-229, -199], [-334, -320], [-122, -219], [24, -248], [71, -40], [-24, -311] ], [ [59119, 34780], [-211, 5] ], [ [58908, 34785], [-24, 261], [-41, 265] ], [ [58843, 35311], [-23, 212], [49, 659], [-72, 419], [-133, 832] ], [ [58664, 37433], [292, 671], [74, 426], [42, 53], [31, 348], [-45, 175], [12, 442], [54, 409], [0, 748], [-145, 190], [-132, 43], [-60, 146], [-128, 125], [-232, -12], [-18, 220] ], [ [58409, 41417], [-26, 421], [843, 487] ], [ [59226, 42325], [159, -284], [77, 54], [110, -149], [16, -237], [-59, -274], [21, -417], [181, -365], [85, 410], [120, 124], [-24, 760], [-116, 427], [-100, 191], [-97, -9], [-77, 768], [77, 449] ], [ [46619, 59216], [-184, 405], [-168, 435], [-184, 157], [-133, 173], [-155, -6], [-135, -129], [-138, 51], [-96, -189] ], [ [45426, 60113], [-24, 318], [78, 291], [34, 557], [-30, 583], [-34, 294], [28, 295], [-72, 281], [-146, 255] ], [ [45260, 62987], [60, 197], [1088, -4], [-53, 853], [68, 304], [261, 53], [-9, 1512], [911, -31], [1, 895] ], [ [59226, 42325], [-147, 153], [85, 549], [87, 205], [-53, 490], [56, 479], [47, 160], [-71, 501], [-131, 264] ], [ [59099, 45126], [273, -110], [55, -164], [95, -275], [77, -804] ], [ [78372, 54256], [64, -56], [164, -356], [116, -396], [16, -398], [-29, -269], [27, -203], [20, -349], [98, -163], [109, -523], [-5, -199], [-197, -40], [-263, 438], [-329, 469], [-32, 301], [-161, 395], [-38, 489], [-100, 322], [30, 431], [-61, 250] ], [ [77801, 54399], [48, 105], [227, -258], [22, -304], [183, 71], [91, 243] ], [ [80461, 51765], [204, -202], [214, 110], [56, 500], [119, 112], [333, 128], [199, 467], [137, 374] ], [ [82069, 53798], [214, 411], [140, 462], [112, 2], [143, -299], [13, -257], [183, -165], [231, -177], [-20, -232], [-186, -29], [50, -289], [-205, -201] ], [ [54540, 33696], [-207, 446], [-108, 432], [-62, 575], [-68, 428], [-93, 910], [-7, 707], [-35, 322], [-108, 243], [-144, 489], [-146, 708], [-60, 371], [-226, 577], [-17, 453] ], [ [56448, 40227], [228, 134], [180, -34], [109, -133], [2, -49] ], [ [55526, 35946], [0, -2182], [-248, -302], [-149, -43], [-175, 112], [-125, 43], [-47, 252], [-109, 162], [-133, -292] ], [ [96049, 38125], [228, -366], [144, -272], [-105, -142], [-153, 160], [-199, 266], [-179, 313], [-184, 416], [-38, 201], [119, -9], [156, -201], [122, -200], [89, -166] ], [ [54125, 64088], [68, -919], [104, -153], [4, -188], [116, -203], [-60, -254], [-107, -1199], [-15, -769], [-354, -557], [-120, -778], [115, -219], [0, -380], [178, -13], [-28, -279] ], [ [53939, 57955], [-52, -13], [-188, 647], [-65, 24], [-217, -331], [-215, 173], [-150, 34], [-80, -83], [-163, 18], [-164, -252], [-141, -14], [-337, 305], [-131, -145], [-142, 10], [-104, 223], [-279, 221], [-298, -70], [-72, -128], [-39, -340], [-80, -238], [-19, -527] ], [ [52361, 53399], [-289, -213], [-105, 31], [-107, -132], [-222, 13], [-149, 370], [-91, 427], [-197, 389], [-209, -7], [-245, 1] ], [ [26191, 57131], [-96, 186], [-130, 238], [-61, 200], [-117, 185], [-140, 267], [31, 91], [46, -88], [21, 41] ], [ [26903, 59440], [-24, -57], [-14, -132], [29, -216], [-64, -202], [-30, -237], [-9, -261], [15, -152], [7, -266], [-43, -58], [-26, -253], [19, -156], [-56, -151], [12, -159], [43, -97] ], [ [50920, 80916], [143, 162], [244, 869], [380, 248], [231, -17] ], [ [58639, 91676], [-473, -237], [-224, -54] ], [ [55734, 91409], [-172, -24], [-41, -389], [-523, 95], [-74, -329], [-267, 2], [-183, -421], [-278, -655], [-431, -831], [101, -202], [-97, -234], [-275, 10], [-180, -554], [17, -784], [177, -300], [-92, -694], [-231, -405], [-122, -341] ], [ [53063, 85353], [-187, 363], [-548, -684], [-371, -138], [-384, 301], [-99, 635], [-88, 1363], [256, 381], [733, 496], [549, 609], [508, 824], [668, 1141], [465, 444], [763, 741], [610, 259], [457, -31], [423, 489], [506, -26], [499, 118], [869, -433], [-358, -158], [305, -371] ], [ [56867, 96577], [-620, -241], [-490, 137], [191, 152], [-167, 189], [575, 119], [110, -222], [401, -134] ], [ [55069, 97669], [915, -440], [-699, -233], [-155, -435], [-243, -111], [-132, -490], [-335, -23], [-598, 361], [252, 210], [-416, 170], [-541, 499], [-216, 463], [757, 212], [152, -207], [396, 8], [105, 202], [408, 20], [350, -206] ], [ [57068, 98086], [545, -207], [-412, -318], [-806, -70], [-819, 98], [-50, 163], [-398, 11], [-304, 271], [858, 165], [403, -142], [281, 177], [702, -148] ], [ [98060, 26404], [63, -244], [198, 239], [80, -249], [0, -249], [-103, -274], [-182, -435], [-142, -238], [103, -284], [-214, -7], [-238, -223], [-75, -387], [-157, -597], [-219, -264], [-138, -169], [-256, 13], [-180, 194], [-302, 42], [-46, 217], [149, 438], [349, 583], [179, 111], [200, 225], [238, 310], [167, 306], [123, 441], [106, 149], [41, 330], [195, 273], [61, -251] ], [ [98502, 29218], [202, -622], [5, 403], [126, -161], [41, -447], [224, -192], [188, -48], [158, 226], [141, -69], [-67, -524], [-85, -345], [-212, 12], [-74, -179], [26, -254], [-41, -110], [-105, -319], [-138, -404], [-214, -236], [-48, 155], [-116, 85], [160, 486], [-91, 326], [-299, 236], [8, 214], [201, 206], [47, 455], [-13, 382], [-113, 396], [8, 104], [-133, 244], [-218, 523], [-117, 418], [104, 46], [151, -328], [216, -153], [78, -526] ], [ [64752, 60417], [-91, 413], [-217, 975] ], [ [64444, 61805], [833, 591], [185, 1182], [-127, 418] ], [ [65665, 65306], [125, -404], [155, -214], [203, -78], [165, -107], [125, -339], [75, -196], [100, -75], [-1, -132], [-101, -352], [-44, -166], [-117, -189], [-104, -404], [-126, 31], [-58, -141], [-44, -300], [34, -395], [-26, -72], [-128, 2], [-174, -221], [-27, -288], [-63, -125], [-173, 5], [-109, -149], [1, -238], [-134, -165], [-153, 56], [-186, -199], [-128, -34] ], [ [65575, 65974], [80, 201], [35, -51], [-26, -244], [-37, -108] ], [ [68937, 64577], [-203, 150], [-83, 424], [-215, 450], [-512, -111], [-451, -11], [-391, -83] ], [ [28366, 54848], [-93, 170], [-59, 319], [68, 158], [-70, 40], [-52, 196], [-138, 164], [-122, -38], [-56, -205], [-112, -149], [-61, -20], [-27, -123], [132, -321], [-75, -76], [-40, -87], [-130, -30], [-48, 353], [-36, -101], [-92, 35], [-56, 238], [-114, 39], [-72, 69], [-119, -1], [-8, -128], [-32, 89] ], [ [27070, 56232], [100, -212], [-6, -126], [111, -26], [26, 48], [77, -145], [136, 42], [119, 150], [168, 119], [95, 176], [153, -34], [-10, -58], [155, -21], [124, -102], [90, -177], [105, -164] ], [ [30452, 39739], [-279, 340], [-24, 242], [-551, 593], [-498, 646], [-214, 365], [-115, 488], [46, 170], [-236, 775], [-274, 1090], [-262, 1177], [-114, 269], [-87, 435], [-216, 386], [-198, 239], [90, 264], [-134, 563], [86, 414], [221, 373] ], [ [85104, 55551], [28, -392], [16, -332], [-94, -540], [-102, 602], [-130, -300], [89, -435], [-79, -277], [-327, 343], [-78, 428], [84, 280], [-176, 280], [-87, -245], [-131, 23], [-205, -330], [-46, 173], [109, 498], [175, 166], [151, 223], [98, -268], [212, 162], [45, 264], [196, 15], [-16, 457], [225, -280], [23, -297], [20, -218] ], [ [84439, 56653], [-100, -195], [-87, -373], [-87, -175], [-171, 409], [57, 158], [70, 165], [30, 367], [153, 35], [-44, -398], [205, 570], [-26, -563] ], [ [82917, 56084], [-369, -561], [136, 414], [200, 364], [167, 409], [146, 587], [49, -482], [-183, -325], [-146, -406] ], [ [83856, 57606], [166, -183], [177, 1], [-5, -247], [-129, -251], [-176, -178], [-10, 275], [20, 301], [-43, 282] ], [ [84861, 57766], [78, -660], [-214, 157], [5, -199], [68, -364], [-132, -133], [-11, 416], [-84, 31], [-43, 357], [163, -47], [-4, 224], [-169, 451], [266, -13], [77, -220] ], [ [83757, 58301], [-74, -510], [-119, 295], [-142, 450], [238, -22], [97, -213] ], [ [83700, 61512], [171, -168], [85, 153], [26, -150], [-46, -245], [95, -423], [-73, -491], [-164, -196], [-43, -476], [62, -471], [147, -65], [123, 70], [347, -328], [-27, -321], [91, -142], [-29, -272], [-216, 290], [-103, 310], [-71, -217], [-177, 354], [-253, -87], [-138, 130], [14, 244], [87, 151], [-83, 136], [-36, -213], [-137, 340], [-41, 257], [-11, 566], [112, -195], [29, 925], [90, 535], [169, -1] ], [ [93299, 46550], [-78, -59], [-120, 227], [-122, 375], [-59, 450], [38, 57], [30, -175], [84, -134], [135, -375], [131, -200], [-39, -166] ], [ [92217, 47343], [-146, -48], [-44, -166], [-152, -144], [-142, -138], [-148, 1], [-228, 171], [-158, 165], [23, 183], [249, -86], [152, 46], [42, 283], [40, 15], [27, -314], [158, 45], [78, 202], [155, 211], [-30, 348], [166, 11], [56, -97], [-5, -327], [-93, -361] ], [ [89166, 49043], [482, -407], [513, -338], [192, -302], [154, -297], [43, -349], [462, -365], [68, -313], [-256, -64], [62, -393], [248, -388], [180, -627], [159, 20], [-11, -262], [215, -100], [-84, -111], [295, -249], [-30, -171], [-184, -41], [-69, 153], [-238, 66], [-281, 89], [-216, 377], [-158, 325], [-144, 517], [-362, 259], [-235, -169], [-170, -195], [35, -436], [-218, -203], [-155, 99], [-288, 25] ], [ [92538, 47921], [-87, -157], [-52, 348], [-65, 229], [-126, 193], [-158, 252], [-200, 174], [77, 143], [150, -166], [94, -130], [117, -142], [111, -248], [106, -189], [33, -307] ], [ [53922, 82340], [189, 174], [434, 273], [350, 200], [277, -100], [21, -144], [268, -7] ], [ [55461, 82736], [342, -67], [511, 9] ], [ [56535, 81053], [139, -515], [-29, -166], [-138, -69], [-252, -491], [71, -266], [-60, 35] ], [ [56266, 79581], [-264, 227], [-200, -84], [-131, 61], [-165, -127], [-140, 210], [-114, -81], [-16, 36] ], [ [31588, 61519], [142, -52], [50, -118], [-71, -149], [-209, 4], [-163, -21], [-16, 253], [40, 86], [227, -3] ], [ [86288, 75628], [39, -104] ], [ [86327, 75524], [-106, 36], [-120, -200], [-83, -202], [10, -424], [-143, -130], [-50, -105], [-104, -174], [-185, -97], [-121, -159], [-9, -256], [-32, -65], [111, -96], [157, -259] ], [ [85048, 72883], [-135, 112], [-34, -111], [-81, -49], [-10, 112], [-72, 54], [-75, 94], [76, 260], [66, 69], [-25, 108], [71, 319], [-18, 96], [-163, 65], [-131, 158] ], [ [47929, 72498], [-112, -153], [-146, 83], [-143, -65], [42, 462], [-26, 363], [-124, 55], [-67, 224], [22, 386], [111, 215], [20, 239], [58, 355], [-6, 250], [-56, 212], [-12, 200] ], [ [64113, 65205], [-18, 430], [75, 310], [76, 64], [84, -185], [5, -346], [-61, -348] ], [ [64274, 65130], [-77, -42], [-84, 117] ], [ [56308, 78869], [120, 127], [172, -65], [178, -3], [129, -144], [95, 91], [205, 56], [69, 139], [118, 0] ], [ [57842, 77455], [124, -109], [131, 95], [126, -101] ], [ [58223, 77340], [6, -152], [-135, -128], [-84, 56], [-78, -713] ], [ [56293, 76715], [-51, 103], [65, 99], [-69, 74], [-87, -133], [-162, 172], [-22, 244], [-169, 139], [-31, 188], [-151, 232] ], [ [89901, 80562], [280, -1046], [-411, 195], [-171, -854], [271, -605], [-8, -413], [-211, 356], [-182, -457], [-51, 496], [31, 575], [-32, 638], [64, 446], [13, 790], [-163, 581], [24, 808], [257, 271], [-110, 274], [123, 83], [73, -391], [96, -569], [-7, -581], [114, -597] ], [ [55461, 82736], [63, 260], [383, 191] ], [ [99999, 92429], [-305, -30], [-49, 187], [-99645, 247], [36, 24], [235, -1], [402, -169], [-24, -81], [-286, -141], [-363, -36], [99999, 0] ], [ [89889, 93835], [-421, -4], [-569, 66], [-49, 31], [263, 234], [348, 54], [394, -226], [34, -155] ], [ [91869, 94941], [-321, -234], [-444, 53], [-516, 233], [66, 192], [518, -89], [697, -155] ], [ [90301, 95224], [-219, -439], [-1023, 16], [-461, -139], [-550, 384], [149, 406], [366, 111], [734, -26], [1004, -313] ], [ [65981, 92363], [-164, -52], [-907, 77], [-74, 262], [-503, 158], [-40, 320], [284, 126], [-10, 323], [551, 503], [-255, 73], [665, 518], [-75, 268], [621, 312], [917, 380], [925, 110], [475, 220], [541, 76], [193, -233], [-187, -184], [-984, -293], [-848, -282], [-863, -562], [-414, -577], [-435, -568], [56, -491], [531, -484] ], [ [63639, 77993], [-127, -350], [-269, -97], [-276, -610], [252, -561], [-27, -398], [303, -696] ], [ [61098, 76242], [-354, 499], [-317, 223], [-240, 347], [202, 95], [231, 494], [-156, 234], [410, 241], [-8, 129], [-249, -95] ], [ [60617, 78409], [9, 262], [143, 165], [269, 43], [44, 197], [-62, 326], [113, 310], [-3, 173], [-410, 192], [-162, -6], [-172, 277], [-213, -94], [-352, 208], [6, 116], [-99, 256], [-222, 29], [-23, 183], [70, 120], [-178, 334], [-288, -57], [-84, 30], [-70, -134], [-104, 23] ], [ [57772, 85719], [316, 327], [-291, 280] ], [ [58639, 91676], [286, 206], [456, -358], [761, -140], [1050, -668], [213, -281], [18, -393], [-308, -311], [-454, -157], [-1240, 449], [-204, -75], [453, -433], [18, -274], [18, -604], [358, -180], [217, -153], [36, 286], [-168, 254], [177, 224], [672, -368], [233, 144], [-186, 433], [647, 578], [256, -34], [260, -206], [161, 406], [-231, 352], [136, 353], [-204, 367], [777, -190], [158, -331], [-351, -73], [1, -328], [219, -203], [429, 128], [68, 377], [580, 282], [970, 507], [209, -29], [-273, -359], [344, -61], [199, 202], [521, 16], [412, 245], [317, -356], [315, 391], [-291, 343], [145, 195], [820, -179], [385, -185], [1006, -675], [186, 309], [-282, 313], [-8, 125], [-335, 58], [92, 280], [-149, 461], [-8, 189], [512, 535], [183, 537], [206, 116], [736, -156], [57, -328], [-263, -479], [173, -189], [89, -413], [-63, -809], [307, -362], [-120, -395], [-544, -839], [318, -87], [110, 213], [306, 151], [74, 293], [240, 281], [-162, 336], [130, 390], [-304, 49], [-67, 328], [222, 593], [-361, 482], [497, 398], [-64, 421], [139, 13], [145, -328], [-109, -570], [297, -108], [-127, 426], [465, 233], [577, 31], [513, -337], [-247, 492], [-28, 630], [483, 119], [669, -26], [602, 77], [-226, 309], [321, 388], [319, 16], [540, 293], [734, 79], [93, 162], [729, 55], [227, -133], [624, 314], [510, -10], [77, 255], [265, 252], [656, 242], [476, -191], [-378, -146], [629, -90], [75, -292], [254, 143], [812, -7], [626, -289], [223, -221], [-69, -307], [-307, -175], [-730, -328], [-209, -175], [345, -83], [410, -149], [251, 112], [141, -379], [122, 153], [444, 93], [892, -97], [67, -276], [1162, -88], [15, 451], [590, -104], [443, 4], [449, -312], [128, -378], [-165, -247], [349, -465], [437, -240], [268, 620], [446, -266], [473, 159], [538, -182], [204, 166], [455, -83], [-201, 549], [367, 256], [2509, -384], [236, -351], [727, -451], [1122, 112], [553, -98], [231, -244], [-33, -432], [342, -168], [372, 121], [492, 15], [525, -116], [526, 66], [484, -526], [344, 189], [-224, 378], [123, 262], [886, -165], [578, 36], [799, -282], [-99610, -258], [681, -451], [728, -588], [-24, -367], [187, -147], [-64, 429], [754, -88], [544, -553], [-276, -257], [-455, -61], [-7, -578], [-111, -122], [-260, 17], [-212, 206], [-369, 172], [-62, 257], [-283, 96], [-315, -76], [-151, 207], [60, 219], [-333, -140], [126, -278], [-158, -251], [99997, -3], [-357, -260], [-360, 44], [250, -315], [166, -487], [128, -159], [32, -244], [-71, -157], [-518, 129], [-777, -445], [-247, -69], [-425, -415], [-403, -362], [-102, -269], [-397, 409], [-724, -464], [-126, 219], [-268, -253], [-371, 81], [-90, -388], [-333, -572], [10, -239], [316, -132], [-37, -860], [-258, -22], [-119, -494], [116, -255], [-486, -302], [-96, -674], [-415, -144], [-83, -600], [-400, -551], [-103, 407], [-119, 862], [-155, 1313], [134, 819], [234, 353], [14, 276], [432, 132], [496, 744], [479, 608], [499, 471], [223, 833], [-337, -50], [-167, -487], [-705, -649], [-227, 727], [-717, -201], [-696, -990], [230, -362], [-620, -154], [-430, -61], [20, 427], [-431, 90], [-344, -291], [-850, 102], [-914, -175], [-899, -1153], [-1065, -1394], [438, -74], [136, -370], [270, -132], [178, 295], [305, -38], [401, -650], [9, -503], [-217, -590], [-23, -705], [-126, -945], [-418, -855], [-94, -409], [-377, -688], [-374, -682], [-179, -349], [-370, -346], [-175, -8], [-175, 287], [-373, -432], [-43, -197] ], [ [79187, 96845], [-1566, -228], [507, 776], [229, 66], [208, -38], [704, -336], [-82, -240] ], [ [64204, 98169], [-373, -78], [-250, -45], [-39, -97], [-324, -98], [-301, 140], [158, 185], [-618, 18], [542, 107], [422, 8], [57, -160], [159, 142], [262, 97], [412, -129], [-107, -90] ], [ [77760, 97184], [-606, -73], [-773, 170], [-462, 226], [-213, 423], [-379, 117], [722, 404], [600, 133], [540, -297], [640, -572], [-69, -531] ], [ [58449, 49909], [110, -333], [-16, -348], [-80, -74] ], [ [58216, 49787], [67, -60], [166, 182] ], [ [45260, 62987], [12, 249] ], [ [61883, 60238], [-37, 252], [-83, 178], [-22, 236], [-143, 212], [-148, 495], [-79, 482], [-192, 406], [-124, 97], [-184, 563], [-32, 411], [12, 350], [-159, 655], [-130, 231], [-150, 122], [-92, 339], [15, 133], [-77, 306], [-81, 132], [-108, 440], [-170, 476], [-141, 406], [-139, -3], [44, 325], [12, 206], [34, 236] ], [ [63448, 67449], [109, -510], [137, -135], [47, -207], [190, -249], [16, -243], [-27, -197], [35, -199], [80, -165], [37, -194], [41, -145] ], [ [64274, 65130], [53, -226] ], [ [64444, 61805], [-801, -226], [-259, -266], [-199, -620], [-130, -99], [-70, 197], [-106, -30], [-269, 60], [-50, 59], [-321, -14], [-75, -53], [-114, 153], [-74, -290], [28, -249], [-121, -189] ], [ [59434, 56171], [-39, 12], [5, 294], [-33, 203], [-143, 233], [-34, 426], [34, 436], [-129, 41], [-19, -132], [-167, -30], [67, -173], [23, -355], [-152, -324], [-138, -426], [-144, -61], [-233, 345], [-105, -122], [-29, -172], [-143, -112], [-9, -122], [-277, 0], [-38, 122], [-200, 20], [-100, -101], [-77, 51], [-143, 344], [-48, 163], [-200, -81], [-76, -274], [-72, -528], [-95, -111], [-85, -65] ], [ [56635, 55672], [-23, 28] ], [ [56351, 57163], [3, 143], [-102, 174], [-3, 343], [-58, 228], [-98, -34], [28, 217], [72, 246], [-32, 245], [92, 181], [-58, 138], [73, 365], [127, 435], [240, -41], [-14, 2345] ], [ [60240, 63578], [90, -580], [-61, -107], [40, -608], [102, -706], [106, -145], [152, -219] ], [ [59433, 56242], [1, -71] ], [ [59434, 56171], [3, -460] ], [ [59445, 53091], [-171, -272], [-195, 1], [-224, -138], [-176, 132], [-115, -161] ], [ [56824, 55442], [-189, 230] ], [ [45357, 58612], [-115, 460], [-138, 210], [122, 112], [134, 415], [66, 304] ], [ [45367, 57897], [-46, 453] ], [ [95032, 44386], [78, -203], [-194, 4], [-106, 363], [166, -142], [56, -22] ], [ [94680, 44747], [-108, -14], [-170, 60], [-58, 91], [17, 235], [183, -93], [91, -124], [45, -155] ], [ [94910, 44908], [-42, -109], [-206, 512], [-57, 353], [94, 0], [100, -473], [111, -283] ], [ [94409, 45654], [12, -119], [-218, 251], [-152, 212], [-104, 197], [41, 60], [128, -142], [228, -272], [65, -187] ], [ [93760, 46238], [-56, -33], [-121, 134], [-114, 243], [14, 99], [166, -250], [111, -193] ], [ [46822, 54589], [-75, 44], [-200, 238], [-144, 316], [-49, 216], [-34, 437] ], [ [25613, 58487], [-31, -139], [-161, 9], [-100, 57], [-115, 117], [-154, 37], [-79, 127] ], [ [61984, 57352], [91, -109], [54, -245], [125, -247], [138, -2], [262, 151], [302, 70], [245, 184], [138, 39], [99, 108], [158, 20] ], [ [63596, 57321], [-2, -9], [-1, -244], [0, -596], [0, -308], [-125, -363], [-194, -493] ], [ [63596, 57321], [89, 12], [128, 88], [147, 59], [132, 202], [105, 2], [6, -163], [-25, -344], [1, -310], [-59, -214], [-78, -639], [-134, -659], [-172, -755], [-238, -866], [-237, -661], [-327, -806], [-278, -479], [-415, -586], [-259, -450], [-304, -715], [-64, -312], [-63, -140] ], [ [34125, 54109], [333, -119], [30, 107], [225, 43], [298, -159] ], [ [34889, 53069], [109, -351], [-49, -254], [-24, -270], [-71, -248] ], [ [56266, 79581], [-77, -154], [-55, -238] ], [ [53809, 77462], [62, 54] ], [ [56639, 89578], [-478, -167], [-269, -413], [43, -361], [-441, -475], [-537, -509], [-202, -832], [198, -416], [265, -328], [-255, -666], [-289, -138], [-106, -992], [-157, -554], [-337, 57], [-158, -468], [-321, -27], [-89, 558], [-232, 671], [-211, 835] ], [ [58908, 34785], [-56, -263], [-163, -63], [-166, 320], [-2, 204], [76, 222], [26, 172], [80, 42], [140, -108] ], [ [59999, 71049], [-26, 452], [68, 243] ], [ [60041, 71744], [74, 129], [75, 130], [15, 329], [91, -115], [306, 165], [147, -112], [229, 2], [320, 222], [149, -10], [316, 92] ], [ [50518, 54209], [-224, -126] ], [ [78495, 57780], [-249, 271], [-238, -11], [41, 464], [-245, -3], [-22, -650], [-150, -863], [-90, -522], [19, -428], [181, -18], [113, -539], [50, -512], [155, -338], [168, -69], [144, -306] ], [ [77801, 54399], [-110, 227], [-47, 292], [-148, 334], [-135, 280], [-45, -347], [-53, 328], [30, 369], [82, 566] ], [ [68841, 72526], [156, 598], [-60, 440], [-204, 140], [72, 261], [232, -28], [132, 326], [89, 380], [371, 137], [-58, -274], [40, -164], [114, 15] ], [ [64978, 72558], [-52, 417], [40, 618], [-216, 200], [71, 405], [-184, 34], [61, 498], [262, -145], [244, 189], [-202, 355], [-80, 338], [-224, -151], [-28, -433], [-87, 383] ], [ [65546, 74986], [313, 8], [-45, 297], [237, 204], [234, 343], [374, -312], [30, -471], [106, -121], [301, 27], [93, -108], [137, -609], [317, -408], [181, -278], [291, -289], [369, -253], [-7, -362] ], [ [84713, 45326], [32, 139], [239, 133], [194, 20], [87, 74], [105, -74], [-102, -160], [-289, -258], [-233, -170] ], [ [32866, 56937], [160, 77], [58, -21], [-11, -440], [-232, -65], [-50, 53], [81, 163], [-6, 233] ], [ [52339, 72408], [302, 239], [195, -71], [-9, -299], [236, 217], [20, -113], [-139, -290], [-2, -273], [96, -147], [-36, -511], [-183, -297], [53, -322], [143, -10], [70, -281], [106, -92] ], [ [60041, 71744], [-102, 268], [105, 222], [-169, -51], [-233, 136], [-191, -340], [-421, -66], [-225, 317], [-300, 20], [-64, -245], [-192, -70], [-268, 314], [-303, -11], [-165, 588], [-203, 328], [135, 459], [-176, 283], [308, 565], [428, 23], [117, 449], [529, -78], [334, 383], [324, 167], [459, 13], [485, -417], [399, -228], [323, 91], [239, -53], [328, 309] ], [ [57776, 75399], [33, -228], [243, -190], [-51, -145], [-330, -33], [-118, -182], [-232, -319], [-87, 276], [3, 121] ], [ [83826, 64992], [-167, -947], [-119, -485], [-146, 499], [-32, 438], [163, 581], [223, 447], [127, -176], [-49, -357] ], [ [60889, 47817], [-128, -728], [16, -335], [178, -216], [8, -153], [-76, -357], [16, -180], [-18, -282], [97, -370], [115, -583], [101, -129] ], [ [59099, 45126], [-157, 177], [-177, 100], [-111, 99], [-116, 150] ], [ [58388, 46397], [-161, 331], [-55, 342] ], [ [58449, 49909], [98, 71], [304, -7], [566, 45] ], [ [60617, 78409], [-222, -48], [-185, -191], [-260, -31], [-239, -220], [16, -368], [136, -142], [284, 35], [-55, -210], [-304, -103], [-377, -342], [-154, 121], [61, 277], [-304, 173], [50, 113], [265, 197], [-80, 135], [-432, 149], [-19, 221], [-257, -73], [-103, -325], [-215, -437] ], [ [35174, 30629], [-121, -372], [-313, -328], [-205, 118], [-151, -63], [-256, 253], [-189, -19], [-169, 327] ], [ [6794, 61855], [-41, -99], [-69, 84], [8, 165], [-46, 216], [14, 65], [48, 97], [-19, 116], [16, 55], [21, -11], [107, -100], [49, -51], [45, -79], [71, -207], [-7, -33], [-108, -126], [-89, -92] ], [ [6645, 62777], [-94, -43], [-47, 125], [-32, 48], [-3, 37], [27, 50], [99, -56], [73, -90], [-23, -71] ], [ [6456, 63091], [-9, -63], [-149, 17], [21, 72], [137, -26] ], [ [6207, 63177], [-15, -34], [-19, 8], [-97, 21], [-35, 133], [-11, 24], [74, 82], [23, -38], [80, -196] ], [ [5737, 63567], [-33, -58], [-93, 107], [14, 43], [43, 58], [64, -12], [5, -138] ], [ [31350, 77248], [48, -194], [-296, -286], [-286, -204], [-293, -175], [-147, -351], [-47, -133], [-3, -313], [92, -313], [115, -15], [-29, 216], [83, -131], [-22, -169], [-188, -96], [-133, 11], [-205, -103], [-121, -29], [-162, -29], [-231, -171], [408, 111], [82, -112], [-389, -177], [-177, -1], [8, 72], [-84, -164], [82, -27], [-60, -424], [-203, -455], [-20, 152], [-61, 30], [-91, 148], [57, -318], [69, -105], [5, -223], [-89, -230], [-157, -472], [-25, 24], [86, 402], [-142, 225], [-33, 491], [-53, -255], [59, -375], [-183, 93], [191, -191], [12, -562], [79, -41], [29, -204], [39, -591], [-176, -439], [-288, -175], [-182, -346], [-139, -38], [-141, -217], [-39, -199], [-305, -383], [-157, -281], [-131, -351], [-43, -419], [50, -411], [92, -505], [124, -418], [1, -256], [132, -685], [-9, -398], [-12, -230], [-69, -361], [-83, -75], [-137, 72], [-44, 259], [-105, 136], [-148, 508], [-129, 452], [-42, 231], [57, 393], [-77, 325], [-217, 494], [-108, 90], [-281, -268], [-49, 30], [-135, 275], [-174, 147], [-314, -75], [-247, 66], [-212, -41], [-114, -92], [50, -157], [-5, -240], [59, -117], [-53, -77], [-103, 87], [-104, -112], [-202, 18], [-207, 312], [-242, -73], [-202, 137], [-173, -42], [-234, -138], [-253, -438], [-276, -255], [-152, -282], [-63, -266], [-3, -407], [14, -284], [52, -201] ], [ [17464, 69802], [-46, 302], [-180, 340], [-130, 71], [-30, 169], [-156, 30], [-100, 159], [-258, 59], [-71, 95], [-33, 324], [-270, 594], [-231, 821], [10, 137], [-123, 195], [-215, 495], [-38, 482], [-148, 323], [61, 489], [-10, 507], [-89, 453], [109, 557], [34, 536], [33, 536], [-50, 792], [-88, 506], [-80, 274], [33, 115], [402, -200], [148, -558], [69, 156], [-45, 484], [-94, 485] ], [ [7498, 84325], [-277, -225], [-142, 152], [-43, 277], [252, 210], [148, 90], [185, -40], [117, -183], [-240, -281] ], [ [4006, 85976], [-171, -92], [-182, 110], [-168, 161], [274, 101], [220, -54], [27, -226] ], [ [2297, 88264], [171, -113], [173, 61], [225, -156], [276, -79], [-23, -64], [-211, -125], [-211, 128], [-106, 107], [-245, -34], [-66, 52], [17, 223] ], [ [13740, 82958], [-153, 223], [-245, 188], [-78, 515], [-358, 478], [-150, 558], [-267, 38], [-441, 15], [-326, 170], [-574, 613], [-266, 112], [-486, 211], [-385, -51], [-546, 272], [-330, 252], [-309, -125], [58, -411], [-154, -38], [-321, -123], [-245, -199], [-308, -126], [-39, 348], [125, 580], [295, 182], [-76, 148], [-354, -329], [-190, -394], [-400, -420], [203, -287], [-262, -424], [-299, -248], [-278, -180], [-69, -261], [-434, -305], [-87, -278], [-325, -252], [-191, 45], [-259, -165], [-282, -201], [-231, -197], [-477, -169], [-43, 99], [304, 276], [271, 182], [296, 324], [345, 66], [137, 243], [385, 353], [62, 119], [205, 208], [48, 448], [141, 349], [-320, -179], [-90, 102], [-150, -215], [-181, 300], [-75, -212], [-104, 294], [-278, -236], [-170, 0], [-24, 352], [50, 216], [-179, 211], [-361, -113], [-235, 277], [-190, 142], [-1, 334], [-214, 252], [108, 340], [226, 330], [99, 303], [225, 43], [191, -94], [224, 285], [201, -51], [212, 183], [-52, 270], [-155, 106], [205, 228], [-170, -7], [-295, -128], [-85, -131], [-219, 131], [-392, -67], [-407, 142], [-117, 238], [-351, 343], [390, 247], [620, 289], [228, 0], [-38, -296], [586, 23], [-225, 366], [-342, 225], [-197, 296], [-267, 252], [-381, 187], [155, 309], [493, 19], [350, 270], [66, 287], [284, 281], [271, 68], [526, 262], [256, -40], [427, 315], [421, -124], [201, -266], [123, 114], [469, -35], [-16, -136], [425, -101], [283, 59], [585, -186], [534, -56], [214, -77], [370, 96], [421, -177], [302, -83] ], [ [30185, 57537], [-8, -139], [-163, -69], [91, -268], [-3, -309], [-123, -344], [105, -468], [120, 38], [62, 427], [-86, 208], [-14, 447], [346, 241], [-38, 278], [97, 186], [100, -415], [195, -9], [180, -330], [11, -195], [249, -6], [297, 61], [159, -264], [213, -74], [155, 185], [4, 149], [344, 35], [333, 9], [-236, -175], [95, -279], [222, -44], [210, -291], [45, -473], [144, 13], [109, -139] ], [ [80013, 63313], [-371, -505], [-231, -558], [-61, -410], [212, -623], [260, -772], [252, -365], [169, -475], [127, -1093], [-37, -1039], [-232, -389], [-318, -381], [-227, -492], [-346, -550], [-101, 378], [78, 401], [-206, 335] ], [ [96623, 40851], [-92, -78], [-93, 259], [10, 158], [175, -339] ], [ [96418, 41756], [45, -476], [-75, 74], [-58, -32], [-39, 163], [-6, 453], [133, -182] ], [ [64752, 60417], [-201, -158], [-54, -263], [-6, -201], [-277, -249], [-444, -276], [-249, -417], [-122, -33], [-83, 35], [-163, -245], [-177, -114], [-233, -30], [-70, -34], [-61, -156], [-73, -43], [-43, -150], [-137, 13], [-89, -80], [-192, 30], [-72, 345], [8, 323], [-46, 174], [-54, 437], [-80, 243], [56, 29], [-29, 270], [34, 114], [-12, 257] ], [ [58175, 37528], [113, -7], [134, -100], [94, 71], [148, -59] ], [ [59119, 34780], [-70, -430], [-32, -491], [-72, -267], [-190, -298], [-54, -86], [-118, -300], [-77, -303], [-158, -424], [-314, -609], [-196, -355], [-210, -269], [-290, -229], [-141, -31], [-36, -164], [-169, 88], [-138, -113], [-301, 114], [-168, -72], [-115, 31], [-286, -233], [-238, -94], [-171, -223], [-127, -14], [-117, 210], [-94, 11], [-120, 264], [-13, -82], [-37, 159], [2, 346], [-90, 396], [89, 108], [-7, 453], [-182, 553], [-139, 501], [-1, 1], [-199, 768] ], [ [58409, 41417], [-210, -81], [-159, -235], [-33, -205], [-100, -46], [-241, -486], [-154, -383], [-94, -13], [-90, 68], [-311, 65] ] ], "bbox": [-180, -85.60903777459767, 180, 83.64513000000001], "transform": { "scale": [0.0036000360003600037, 0.00169255860333201], "translate": [-180, -85.60903777459767] } } ================================================ FILE: public/locales/ca-CA/translations.json ================================================ { "action": "acció", "assets": "Actius", "assets.no_nfts_message": "No s'han trobat NFTs", "assets.no_mpts_message": null, "network": "Xarxa", "amendments": "Amendments", "network_name": "Xarxa desconeguda", "network_name_testnet": "Testnet", "network_name_mainnet": "Mainnet", "network_name_devnet": "Devnet", "network_name_xahau_mainnet": "Xahau Mainnet", "network_name_xahau_testnet": "Xahau Testnet", "network_name_custom": "Custom", "app.meta.description": "Explorador de l'XRPL", "app.meta.author": "Ripple", "explorer": "Explorador", "xrpl_org": "XRPL.org", "github": "GitHub", "header.search.placeholder": "Cerca per adreça, ledger o Txn", "xrp": "XRP", "xrpl_explorer": "Explorador XRPL", "ledgers": "Ledgers", "ledger": "Ledger", "taxon": "Taxon", "token_id": "ID del Token", "token_transactions": "Transaccions de Tokens", "transactions": "Transaccions", "transaction_short": "TX", "nodes": "Nodes", "validator": "Validador", "validators": "Validadors", "upgrade_status": "Estat de l'actualització", "version": "v{{number}}", "component_error": "Alguna cosa no ha anat bé!", "1H": "1H", "24H": "24H", "30D": "30D", "total_transactions": "# de Txns", "total_fees": "Total de comissions", "async_component_failed": "Error en carregar el component", "account_not_found": "No s'ha trobat el compte", "account_empty_title": "No s'ha proporcionat l'ID del compte", "account_empty_hint": "Introdueix l'ID d'un compte en el requadre de cerca", "check_account_id": "Si us plau, comproba l'ID del teu compte", "accounts.xrp_balance": "Saldo d'XRP", "accounts.other_balances": "Altres saldos", "accounts.other_balances_short": "Alt. Sal.", "amount": "Quantitat", "currency_code": "Codi de la Moneda", "currency_balance": "<0>{{currency}} Saldo", "load_more_action": "Carrega'n més...", "account_transactions": "Transaccions del compte", "transaction_type": "Tipus de transacció", "transaction_action_CANCEL": "Cancel·lar", "transaction_action_CREATE": "Crear", "transaction_action_FINISH": "Acabar", "transaction_action_MODIFY": "Modificar", "transaction_action_SEND": "Enviar", "transaction_category_ACCOUNT": "Compte", "transaction_category_DEX": "Dex (AMM, Ofertes, Trust Sets, Tokens)", "transaction_category_NFT": "NFT", "transaction_category_PAYMENT": "Pagament", "transaction_category_PSUEDO": "Pseudo-Tx", "transaction_category_OTHER": null, "transaction_legend_toggle_hide": "Amaga la llegenda", "transaction_legend_toggle_show": "Mostra la llegenda", "transactions.date_header": "Data/hora (UTC)", "no_transactions_message": "No s'han trobat transaccions", "get_vault_transactions_failed": null, "retry_action": "Reintenta...", "uh_oh": "Òndia!", "not_found_default_title": "No s'ha trobat la pàgina", "not_found_check_url": "Si us plau, comproba l'URL", "not_found": "No s'ha trobat", "hash_not_found": null, "buy": "Compra", "sell": "Ven", "price": "Preu", "ledger_index": "Index del Ledger", "to": "a", "from": "de", "request": null, "terms": null, "send": "Enviar", "delivered": "Entregat", "cancel_offer": "Cancel·la Oferta", "convert_maximum": "Converteix tot", "convert_to": "Converteix a", "using_at_most": "Utilitzar com a màxim", "partial_payment_allowed": "pagament parcial permès", "set_limit": "Estableix el límit de confiança", "escrow": "escrow", "cancel_escrow": "cancel·la escrow", "finish_escrow": "finalitza escrow", "escrow_amount": "quantitat d'escrow", "escrow_destination": "destinació de l'escrow", "escrow_transaction": "txn d'escrow", "escrow_condition_short": "condició de l'escrow", "escrow_fulfillment": "execució de l'escrow", "condition": "condició", "fulfillment": "execució", "cancel_after": "cancel·lar després de", "finish_after": "finalitzar després de", "settle_delay": "Endarrariment en l'assentament", "channel_id": "ID del canal", "seconds": "segons", "seconds_short": "seg.", "regular_key": "clau regular", "unset_regular_key": "Desactiva la clau regular", "unset_signer_list": "Desactiva la llista de signants", "set_flag": "Establir flag", "clear_flag": "Desactivar flag", "email_hash": "email hash", "message_key": "Camp Message Key", "out_of": "de", "weight": "pes", "the_account": "El compte", "create_payment_channel": "creará un canal de pagament a", "destination_tag": "etiqueta de destinació", "source_tag": "etiqueta d'origen", "channel_settle_delay": "El canal té un endarreriment d'assentament de", "the_channel_id_is": "L'ID del canal és", "the_channel_amount_is": "La quantitat del canal és", "update_payment_channel": "Actualitzará el canal de pagament", "the_channel_balance_is": "El saldo demanat del canal és", "amm_delete_description": "Ha intentat eliminar l'AMM per i .", "amm_delete_description_caveat": "Si hi hagués més de 512 trustlines, això només n'elimina 512", "payment_channel_closed_description": "El canal de pagament es tancarà, qualsevol saldo restant s'enviarà al seu compte d'origen", "set_signer_list_description": "Estableix el mínim quòrum de signants en {{quorum}} amb la següent llista de signants", "unset_signer_list_description": "Ha eliminat tots els signants del compte", "transaction_initiated_by": "La transacció va ser iniciada per", "increase_channel_amount_by": "Incrementarà la quantitat del canal en", "channel_amount_increase": "increment de la quantitat del canal", "channel_amount": "quantitat del canal", "total_claimed": "total reclamat", "amount_claimed": "quantitat reclamada", "close_request": "tanca la sol·licitud", "renew_channel": "renova el canal", "payment_channel_closed": "Canal de pagament tancat", "paychannel_node_line1": "<1><0>{{action}} un PayChannel node de <3><0>{{account}} a <5><0>{{counterAccount}}", "paychannel_amount_changed": "Quantitat canviada en <1><0>{{difference}}<1><0>{{currency}} de <3><0>{{previous}}<1><0>{{currency}} to <5><0>{{final}}<1><0>{{currency}}", "paychannel_balance_changed": "Saldo canviat en <1><0>{{difference}}<1><0>{{currency}} de <3><0>{{previous}}<1><0>{{currency}} to <5><0>{{final}}<1><0>{{currency}}", "setfee_fees_description": "Futures transaccions requeriran una comissió de com a mínim .", "setfee_reserves_description": "Els comptes ara han de tenir una comissió base de i un addicional de la reserva per cada objecte afegit al compte", "setfee_docs_description": "Visita la documentació: <0>Comissions", "setfee_base_fee": "Comissió base", "setfee_reserve": "Reserva", "setfee_reserve_increment": "Increment de la reserva", "formatted_date": "Data/Hora ({{timeZone}})", "transaction_type_name_AMMCreate": "Crear AMM", "transaction_type_name_AMMDelete": "Eliminar AMM", "transaction_type_name_AMMDeposit": "Dipositar AMM", "transaction_type_name_AMMWithdraw": "Treure AMM", "transaction_type_name_AMMVote": "Votar AMM", "transaction_type_name_AMMBid": "Pujar AMM", "transaction_type_name_AMMClawback": null, "transaction_type_name_AccountSet": "Account Set", "transaction_type_name_Batch": null, "transaction_type_name_CheckCancel": "Cancel·lar Check", "transaction_type_name_CheckCash": "Cobrar Check", "transaction_type_name_CheckCreate": "Crear de Check", "transaction_type_name_CredentialAccept": null, "transaction_type_name_CredentialCreate": null, "transaction_type_name_CredentialDelete": null, "transaction_type_name_DelegateSet": null, "transaction_type_name_DIDDelete": "Eliminar DID", "transaction_type_name_DIDSet": "Establir DID", "transaction_type_name_DepositPreauth": "Preautoritzar Diposit", "transaction_type_name_Error_Cases": "Casos d'error", "transaction_type_name_EscrowCancel": "Cancel·lar Escrow", "transaction_type_name_EscrowCreate": "Crear Escrow", "transaction_type_name_EscrowFinish": "Finalitzar Escrow", "transaction_type_name_Invoke": "Invocar", "transaction_type_name_LoanBrokerSet": null, "transaction_type_name_LoanBrokerDelete": null, "transaction_type_name_LoanBrokerCoverDeposit": null, "transaction_type_name_LoanBrokerCoverWithdraw": null, "transaction_type_name_LoanBrokerCoverClawback": null, "transaction_type_name_LoanSet": null, "transaction_type_name_LoanDelete": null, "transaction_type_name_LoanManage": null, "transaction_type_name_LoanPay": null, "transaction_type_name_MPTokenIssuanceCreate": null, "transaction_type_name_MPTokenIssuanceDestroy": null, "transaction_type_name_MPTokenIssuanceSet": null, "transaction_type_name_MPTokenAuthorize": null, "transaction_type_name_NFTokenAcceptOffer": "Acceptar oferta NFT", "transaction_type_name_NFTokenBurn": "Cremar NFT", "transaction_type_name_NFTokenCancelOffer": "Cancel·lar oferta NFT", "transaction_type_name_NFTokenCreateOffer": "Crear oferta NFT", "transaction_type_name_NFTokenMint": "Encunyar NFT", "transaction_type_name_OfferCancel": "Cancel·lar Oferta", "transaction_type_name_OfferCreate": "Crear Ofertae", "transaction_type_name_OracleDelete": null, "transaction_type_name_OracleSet": null, "transaction_type_name_Payment": "Pagament", "transaction_type_name_PaymentChannelClaim": "Reclamar al Canal de Pagament", "transaction_type_name_PaymentChannelCreate": "Crear Canal de Pagament", "transaction_type_name_PaymentChannelFund": "Dipositar en Canal de Pagament", "transaction_type_name_PermissionedDomainDelete": null, "transaction_type_name_PermissionedDomainSet": null, "transaction_type_name_SetHook": "Establir Hook", "transaction_type_name_SetRegularKey": "Establir Clau Regular", "transaction_type_name_SignerListSet": "Etablir Llista de Signantst", "transaction_type_name_TicketCreate": "Crear tiquet", "transaction_type_name_TrustSet": "Establir Confiança", "transaction_type_name_VaultCreate": null, "transaction_type_name_VaultSet": null, "transaction_type_name_VaultDeposit": null, "transaction_type_name_VaultWithdraw": null, "transaction_type_name_VaultClawback": null, "transaction_type_name_VaultDelete": null, "transaction_type_name_XChainAccountCreateCommit": "Compromís de creació de compte XChain", "transaction_type_name_XChainAddAccountCreateAttestation": "Afegir confirmació de creació de compte XChain", "transaction_type_name_XChainAddClaimAttestation": "Afegir petició de confirmació XChain", "transaction_type_name_XChainClaim": "Reclamar XChain", "transaction_type_name_XChainCommit": "Compromís XChain", "transaction_type_name_XChainCreateBridge": "Crear pont XChain", "transaction_type_name_XChainCreateClaimID": "Crear reclamació d'ID XChain", "transaction_type_name_XChainModifyBridge": "Modificar pont XChain", "transaction_type_name_EnableAmendment": "Activar Amendment", "transaction_type_name_SetFee": "Establir comissió", "transaction_type_name_UNLModify": "Modificar UNL", "transaction_type_name_AccountDelete": "Eliminar Compte", "generic_error": "Alguna cosa no ha anat bé...", "not_your_fault": "Probablement no és culpa teva", "come_back_later": "Estarà disponible aviat", "invalid_ledger_id": "L'ID del ledger no és vàlid", "invalid_transaction_hash": "El hash de la transacció no és vàlid", "ledger_not_found": "No s'ha tobat el Ledger", "check_ledger_id": "Si us plau, comprova l'ID del ledger", "server_ledgers_hint": "Aquest node ({{connection.server.publicKey, truncate(length: 10)}}) només conté els ledgers {{connection.ledger.validated}}", "use_search": "Si us plau, utilitza la cerca", "ledger_has_no_trans": "Aquest ledger no té transaccions", "less_than": "Menys que", "transaction_not_found": "No s'ha trobat la transacció", "transaction_empty_title": "No s'ha proporcionat el hash de la transacció", "transaction_empty_hint": "Introdueix el hash de la transacció en el requadre de cerca", "validator_not_found": "No s'ha trobat el validador", "check_transaction_hash": "Si us plau, comprova el hash de la transacció o el CTID", "wrong_network": "Aquest CTID correspon a una xarxa different", "check_validator_key": "Si us plau, comprova la teva clau de validador", "transaction": "Transacció", "success": "Ha tingut èxit", "fail": "Ha fallat", "simple": "Simple", "detailed": "Detallada", "details": "Detalls", "history": "Història", "voting": "Votant", "raw": "Raw", "expand": "Expandir", "collapse": "Contraure", "try_detailed_raw": "Intenta visió `Detallada` o `Raw`", "account": "Compte", "transaction_cost": "Cost de transacció", "transaction_cost_short": "Cost Txn.", "sequence_number": "Número de seqüència", "sequence_number_short": "Seqüència #", "serial": "Serial", "n_a": "N/A", "memos": "Memos", "flags": "Flags", "status": "Estat", "successful_transaction": "La transacció ha tingut èxit", "fail_transaction": "La transacció ha fallat amb un codi d'estat de <0>{{code}}", "transaction_validated": ", i validada al ledger ", "on": " en ", "description": "Descripció", "signers": "Signants", "decoded_hex": "hex descodificat", "transaction_consumed_fee": "Enviar aquesta transacció ha consumit", "meta": "Meta", "number_of_affected_node": "Ha afectat {{count}} nodes en el ledger:", "nodes_type": "{{action}} nodes", "node_meta_type": "{{action}} un node amb el tipus", "transaction_balance_line_one": "<1><0>{{action}} un <3><0>{{currency}} RippleState node entre <5><0>{{account}} i <7><0>{{counterAccount}}", "transaction_balance_line_two": "El saldo ha canviat en <1><0>{{change}} de <3><0>{{previousBalance}} a <5><0>{{finalBalance}}", "transaction_outstanding_balance_line_two": null, "transaction_owned_directory": "{{action}} un node DirectoryNode propietat de", "transaction_unowned_directory": "{{action}} un node DirectoryNode", "transaction_mptoken_line_one": null, "transaction_mpt_issuance_line_one": null, "owned_account_root": "{{action}} el node AccountRoot de", "unowned_account_root": "{{action}} el node AccountRoot", "account_balance_increased": "El saldo ha incrementat en <1><0>{{difference}}<1><0>{{currency}} de <3><0>{{previous}}<1><0>{{currency}} a <5><0>{{final}}<1><0>{{currency}}", "account_balance_decreased": "El saldo ha disminuït en <1><0>{{difference}}<1><0>{{currency}} de <3><0>{{previous}}<1><0>{{currency}} a <5><0>{{final}}<1><0>{{currency}}", "decreased_from_to": "disminuït en <1><0>{{change}} de <3><0>{{previous}} a <5><0>{{final}}", "offer_node_meta": "<1><0>{{action}} un <3><0>{{pair}} node d'oferta propietat de <5><0>{{account}} amb seqüència # <7><0>{{sequence}}", "offer_replaces": "Aquesta oferta substitueix l'oferta existent #", "offer_partially_filled": "S'ha satisfet l'oferta parcialment", "offer_filled": "S'ha satisfet l'oferta", "offer_cancelled": "S'ha cancel·lat l'oferta", "offer_replaced": "L'oferta s'ha substituït per la nova oferta #", "offer_lack_of_funds": "L'oferta s'ha satisfet parcialment i després cancel·lada per manca de fons", "transaction_sequence": "El número de seqüència és", "trust_set_description": "Estableix <1><0>{{amount}} com la màxima quantitat de <3><0>{{currency}} de <5><0>{{issuer}} que <7><0>{{account}} vol tenir", "payment_desc_line_1": "El pagament és de a ", "the_source_tag_is": "L'etiqueta d'origen és ", "the_destination_tag_is": "L'etiqueta de destinació és", "payment_desc_line_4": "S'ha ordenat que enviés", "payment_desc_line_5": "gastant un màxim de", "payment_desc_line_6": "La quantitat de fet enviada ha estat", "offer_cancel_description": "La transacció cancel·larà del compte l'oferta #", "offer_create_desc_line_1": "El compte <1><0>{{account}} ha ofert pagar <3><0>{{takerGets}}<1><0>{{currency}} per rebre <5><0>{{takerPays}}<1><0>{{currency}}", "offer_create_desc_line_2": "El tipus de canvi per aquesta oferta és", "offer_create_desc_line_3": "La transacció també cancel·larà del compte l'oferta existent #", "offer_create_desc_line_5": "Aquesta oferta és aplicable al domini permès", "offer_will_expire_desc": "L'oferta expira el <1><0>{{date}} llevat que es cancel·li o es consumeixi abans del", "offer_did_expire_desc": "L'oferta va expirar el <1><0>{{date}} llevat que es cancel·lés o es consumís abans d'aquell moment", "escrow_is_from": "L'escrow és de <1><0>{{account}} a <3><0>{{destination}}", "escrow_is_created_by": "L'escrow va ser creat per <1><0>{{account}} i els fons seran retornats al mateix compte", "escrowed_amount": "Ha posat en escrow", "escrow_condition": "L'escrow the úna condició de compliment de", "describe_cancel_after": "Pot ser cancel·la després de", "describe_finish_after": "Pot ser finalitzat després de", "escrow_completion_desc": "L'acompliment wa ser executat per", "escrow_completion_desc_2": "La quantitat posada en escrow de <1><0>{{amount}} ha estat enviada a <3><0>{{destination}}", "escrow_finish_fulfillment_desc": "La condició de l'escrow és satisfeta per", "escrow_cancellation_desc": "La cancel·lació va ser executada per", "escrow_cancellation_desc_2": "La quantitat en escrow de <1><0>{{amount}} ha estat retornada a <3><0>{{owner}}", "escrow_after_transaction_cost": "després dels costos de transacció", "escrow_created_by_desc": "L'escrow va ser creat per <1><0>{{account}} amb la transacció <3><0>{{transaction}}", "set_regular_key_description": "Estableix la Clau Regular del compte a", "unset_regular_key_description": "Elimina la Claur Regular del compte", "set_flag_description": "Estableix flag del compte", "clear_flag_description": "Elimina flag del compte", "set_domain_description": "Estableix el domini del compte en", "set_email_description": "Estableix el hash del correu electrònic del compte en", "set_message_key_description": "Estableix el camp Message Key del compte en", "set_nftoken_minter_description": "Estableix <0>{{account}} com l'encunyador autoritzat per aquest compte", "deposit_auth": "Autoritza <1><0>{{account}} a enviar pagaments a aquest compte", "deposit_unauth": "Elimina l'autorització de <1><0>{{account}} per enviar pagaments a aquest compte", "deposit_auth_credentials": null, "deposit_unauth_credentials": null, "invalid_xrpl_address": "Adreça de l'XRPL no vàlida", "loading": "Carregant", "get_ledger_failed": "Incapaç de carregar el ledger", "get_transaction_failed": "Incapaç de carregar la transacció", "get_validator_failed": "Incapaç de carregar el validador", "get_account_state_failed": "Incapaç de carregar l'estat del compte", "get_account_transactions_failed": "Incapaç de carregar les transaccions del compte", "get_account_transactions_try": "Intenta carregar més transaccions", "pubkey": "pubkey", "node_pubkey": "node pubkey", "ip": "ip", "state": "estat", "rippled_version": "versió", "last_ledger": "últim ledger", "uptime": "període de funcionament", "peers": "peers", "in_out": "(in:out)", "ledger_history": "història de ledgers", "quorum": "quòrum", "load": "carrega", "latency": "latència", "amendment_id": "id", "amendment_name": "nom", "voters": "votants", "threshold": "llindar", "consensus": "consens", "enabled": "activat", "disabled": null, "on_tx": "en la (tx)", "yes": "Sí", "no": "No", "deprecated": "obsolet", "domain": "domini", "unl": "unl", "fee": "comissió", "ledger_interval": "mitjana d'interval dels ledgers", "load_fee": "comissió de c+arrega", "txn_sec": "txn/seg.", "txn_ledger": "mitjana txn/ledger", "avg_fee": "mitjana comissió Txn", "txn_count": "compte de txn", "nUnlCol": "nUNL", "nUnl": "VALIDADORS a la nUNL", "fees": "comissions", "total": "total", "missing": "absent", "authorize": "autoritza", "unauthorize": "desautoritza", "missed_validations": "{{count}} validacions perdudes", "incomplete": "incomplet", "base_fee": "Comissío Base", "account_reserve": "Reserva de Compte", "object_reserve": "Reserva d'Objectes", "vote": "Vota", "no_amendment_in_voting": "No hi ha amendments en votació en aquest moment per aquesta xarxa.", "required": "requerit", "source": "fount", "destination": "destinació", "claimed": "reclamat", "remaining": "restant", "inbound_total": "total entrant", "outbound_total": "total sortint", "payment_channels": "Canals de pagament", "available_in": "Disponible en", "channels": "canals", "account_info": "Informació del compte", "reserve": "reserva", "current_sequence": "seqüència actual", "escrows": "escrows", "nodes_found": "nodes trobats", "unmapped": "no mapejat", "validators_found": "validadors trobats", "pause": "pausa", "resume": "reprèn", "flag_ledger": "Flag Ledger", "ticket": "Tiquet", "ticket_sequence": "Seqüència del tiquet", "ticket_count": "Comptador del tiquet", "ticket_used": "un tiquet ha estat utilitzat per aquesta transacció", "token": "Token", "tokens": "Tokens", "total_issuers": "Total Encunyadors", "total_tokens": "Total Tokens", "top_trading_pairs": "Parells d'intercanvi TOP", "issuer_address": "Adreça d'encunyador", "obligations": "Obligació", "settings": "Configuració", "rank": "Classificació", "market_cap": "Market Cap", "volume_24h": "Volum (24H)", "no_tokens_message": "No s'han trobat tokens.", "no_pairs_message": "No s'han trobat parells d'intercanvi", "high": "Alt", "low": "Baix", "rank_message": "Els tokens estan classificats pel nombre de trustlines.", "obligations_message": "Les obligacions són el nombre total de cada token encunyat a les adreces destinatarias que l'han rebut", "issuer": "Encunyador", "pair": "Parell", "asset_pair": null, "offer_range": "Rang de l'oferta", "custom_network": "Xarxa personalitzada", "custom_network_input_help": "Introdueix l'URL d'una xarxa personalitzada per accedir a la informació de la xarxa.", "custom_network_input": "Escriu l'URL de la xarxa personalitzada", "custom_networks": "Xarxes personalitzades", "no_network_selected": "No s'ha seleccionat cap xarxa personalitzada", "locking_chain_door": "Locking Chain Door", "locking_chain_issue": "Locking Chain Issue", "issuing_chain_door": "Issuing Chain Door", "issuing_chain_issue": "Issuing Chain Issue", "signature_reward": "Recompensa de signatura", "min_account_create_amount": "Quantiat mínima de creació de compte", "other_chain_source": "Una altra font de la cadena", "xchain_claim_id": "Reclamació d'ID XChain", "check_nft_id": "Si us plau, comprova l'ID de l'NFT", "get_nft_state_failed": "No és possible carregar l'NFT", "minted": "Encunyat", "taxon_id": "ID del Taxon", "transfer_fee": "Comissió de transferència", "burnable": "Destruïble", "only_xrp": "Només XRP", "transferable": "Transferible", "buy_offers": "Ofertes de Compra", "sell_offers": "Ofertes de Venda", "offer_index": "ID de l'Oferta", "no_sell_offers": "No hi ha Ofertes de venda", "no_buy_offers": "No hi ha ofertes de compra", "validator_history.chain": "Xarxa", "validator_history.date": "Data", "validator_history.missed": "Perduda", "validator_history.score": "Puntuació", "seller": "Venedor", "buyer": "Comprador", "offerer": "Ofertador", "token_taxon": "Taxon del Token", "uri": "URI", "owner": "Propietari", "other_chain_destination": "Destinació a una altra xarxa", "%_of_total_nodes_validators": "% total de nodes i validadors", "version_display": "Versió: {{version}}", "validator_count": "# de Validadors: {{val_count}}", "node_count": "# de Nodes: {{node_count}}", "current_stable_version": "Versió estable actual", "stable_version": "{{stableVersion}}", "nftoken_minter": "Encunyador NFT", "is_burned": "Destruït", "fee_rate": "taxa de comissió", "last_affecting_transaction": "Última transacció afectada tx", "Version": "Versió", "increased_by": "incrementat en", "trading_fee": "Comissió d'intercanvi", "tvl": "TVL", "account_address": "Adreça del Comtpe", "asset1": "Actiu 1", "asset2": "Actiu 2", "asset1out": "Actiu 1 fora", "asset2out": "Actiu 2 fora", "asset1in": "Actiu 1 dins", "asset2in": "Actiu 2 dins", "effective_price": "Preu real", "amm_account_id": "ID de Comtpe AMM", "lp_tokens": "Tokens LP", "min_slot_price": "Preu mínim de l'obertura", "max_slot_price": " Preu màxim de l'obertura", "auth_accounts": "Comtpes autoritzats", "network_cannot_be_crawled": "Aquesta xarxa no pot ser indexada", "check_crawl_existed": "Si us plau, contacta l'operador per assegurar-te que tenen l'indexació accessible o un seient vl.", "peer_crawled_context": "Per més context, visita https://xrpl.org/peer-crawler.html", "xchainbridge": "XChainBridge", "xchain_account_claim_count": "XChain Account Claim Count", "xchain_account_create_count": "XChain Account Create Count", "min_signer_quorum": "Pes mínim <0>{{quorum}} requerit", "holder": "Holder", "action_from": "<0><0>{{action}} <1><0>{{amount}} de <3><0>{{destination}}", "action_from_and": null, "claws_back": "Recuperar", "claws_back_from": " recuperar-se de ", "instruct_to_claw": "L'import màxim recuperable és ", "hook": "Hook", "hooks": "Hooks", "hook_emitted": "aquesta transacció ha estat emesa per un Hook", "emit_details": "Emet detalls", "hook_parameters": "Paràmetres del Hook", "hook_executions": "Execucions del Hook", "emit_generation": "Número <0>{{emit}} en la línia de transaccions generades", "emit_hook_hash": "Emesa pel hook <0>{{hash}}", "emit_parent": "Emesa per un hook executat per <0>{{hash}}", "emit_callback": "L'assumpte de la recuperació és <0>{{callback}}<0>", "hook_exec_hash": "Ha executat el hook <0>{{hash}}", "hook_exec_account": "Al compte <0>{{account}}", "hook_exec_return": "Ha retornat el codi <0>{{code}} amb string \"<1>{{string}}\"", "hook_exec_emit_count": "Emès <0>{{count}} transaccions", "hash": "Hash", "grant": "Subvenció", "namespace": "Namespace", "api_version": "Versió API", "triggered_on": "Executat en", "name": "nom", "introduced_in": "Introduït en", "yeas": "Sís", "nays": "Nos", "eta": "Temps d'arribada prevista", "amendment_summary": "Resum de l'Amendment", "not": "no", "enable_tx": "Activa tx", "all": "Tot", "yeas_count": "# vots pel sí: {{yeas_count}}", "nays_count": "# vots pel no: {{nays_count}}", "yeas_percent": "% de vots pel sí: {{yeas_percent}}%", "nays_percent": "% de vots pel no: {{nays_percent}}%", "%_of_validators": "% de validadors", "amendment_not_found": "No s'ha trobat l'amendment", "check_amendment_key": "Si us plau, comprova la clau del teu amendment", "did_document": "Document DID", "attestation": "Declaració", "note": "Nota", "indicate_unl": "indica un validador en una UNL", "transaction_tokens_involved": " i ", "transaction_tokens_swapped": " per ", "oracle_document_id": null, "provider": null, "last_update_time": null, "asset_class": null, "trading_pairs": null, "deleted": null, "holders_count": null, "trustlines": null, "website": null, "mpt_issuance_id": null, "asset_scale": null, "metadata": null, "max_amount": null, "mpt_holder": null, "check_mpt_id": null, "outstanding_amount": null, "locked": null, "can_lock": null, "require_auth": null, "can_escrow": null, "can_trade": null, "can_transfer": null, "can_clawback": null, "enable_amendment_name": null, "amendment_status": null, "expected_date": null, "base": null, "credential_type": null, "credential_issuer": null, "subject": null, "expiration": null, "domain_id": null, "accepted_credentials": null, "credential_ids": null, "data": null, "finish_function": null, "quorum_description": null, "avg_fee_description": null, "ledger_interval_description": null, "txn_ledger_description": null, "txn_sec_description": null, "load_fee_description": null, "nUnl_description": null, "computation_allowance": null, "gas": null, "delegate": null, "permissions": null, "pertaining_to_the_Permissioned_Domain": null, "tx_delegated_to": null, "account_delegates_to": null, "delegate_to": null, "volume": null, "holders": null, "trades": null, "no_of_tokens": null, "volume_24h_total": null, "volume_24h_total_description": null, "market_cap_metric_description": null, "market_cap_description": null, "24h_description": null, "volume_description": null, "trades_description": null, "tvl_description": null, "stablecoin_description": null, "stablecoin": null, "wrapped": null, "tokens_footnote": null, "xrplmeta_guidelines": null, "inner_transaction": null, "batch_table_detail_count": null, "batch_table_detail_list": null, "batch_description": null, "batch": null, "successful": null, "failed": null, "not-validated": null, "asset": null, "assets_maximum": null, "mptoken_metadata": null, "withdrawal_policy": null, "account_creates_vault": null, "vault_id": null, "single_asset_vault": null, "loan_broker_id": null, "loan_id": null, "management_fee_rate": null, "debt_maximum": null, "cover_rate_minimum": null, "cover_rate_liquidation": null, "counterparty": null, "principal_requested": null, "payment_total": null, "payment_interval": null, "grace_period": null, "loan_origination_fee": null, "loan_service_fee": null, "late_payment_fee": null, "close_payment_fee": null, "full_payment_fee": null, "overpayment_fee": null, "interest_rate": null, "late_interest_rate": null, "close_interest_rate": null, "overpayment_interest_rate": null, "set_vault_data": null, "set_vault_assets_maximum": null, "set_vault_domain_id": null, "account_deposits_into_vault": null, "account_withdraws_from_vault": null, "account_clawbacks_from_vault": null, "account_clawbacks_from_vault_amount_omitted": null, "account_deletes_vault": null, "vault_create_table_detail": null, "withdraws": null, "deletes": null, "vault_delete_table_detail": null, "account_flag_title_lsf_global_freeze": null, "account_flag_title_lsf_disable_master": null, "account_flag_title_lsf_default_ripple": null, "account_flag_title_lsf_allow_trustline_clawback": null, "account_flag_title_lsf_allow_trustline_locking": null, "account_flag_title_lsf_require_destination_tag": null, "account_flag_title_lsf_no_freeze": null, "account_flag_title_lsf_require_auth": null, "account_flag_title_lsf_disallow_xrp": null, "account_flag_title_lsf_disallow_incoming_trustline": null, "account_flag_title_lsf_disallow_incoming_pay_chan": null, "account_flag_title_lsf_disallow_incoming_nft_token_offer": null, "account_flag_title_asf_authorized_nft_token_minter": null, "account_flag_title_lsf_disallow_incoming_check": null, "account_flag_title_lsf_deposit_auth": null, "account_flag_title_asf_account_txn_id": null, "account_flag_description_lsf_global_freeze": null, "account_flag_description_lsf_disable_master": null, "account_flag_description_lsf_default_ripple": null, "account_flag_description_lsf_allow_trustline_clawback": null, "account_flag_description_lsf_allow_trustline_locking": null, "account_flag_description_lsf_require_destination_tag": null, "account_flag_description_lsf_no_freeze": null, "account_flag_description_lsf_require_auth": null, "account_flag_description_lsf_disallow_xrp": null, "account_flag_description_lsf_disallow_incoming_trustline": null, "account_flag_description_lsf_disallow_incoming_pay_chan": null, "account_flag_description_lsf_disallow_incoming_nft_token_offer": null, "account_flag_description_asf_authorized_nft_token_minter": null, "account_flag_description_lsf_disallow_incoming_check": null, "account_flag_description_lsf_deposit_auth": null, "account_flag_description_asf_account_txn_id": null, "account_page_address": null, "account_page_address_tag": null, "account_page_classic_address": null, "account_page_deleted_account_label": null, "account_page_deleted_account_warning": null, "account_page_extended_address": null, "account_page_domain": null, "account_page_reserve_balance": null, "account_page_xrp_balance": null, "account_page_xrp_balance_in_usd": null, "account_page_account_properties": null, "account_page_flags": null, "account_page_flag_status_enabled": null, "account_page_flag_status_disabled": null, "account_page_signers": null, "account_page_signer_weight": null, "account_page_details": null, "account_page_current_sequence": null, "account_page_ticket_count": null, "account_page_email_hash": null, "account_page_payment_channels": null, "account_page_payment_channels_text": null, "account_page_nft_minter": null, "account_page_asset_held_title": null, "account_page_asset_issued_title": null, "account_page_asset_tab_iou": null, "account_page_asset_tab_lptoken": null, "account_page_asset_tab_mpt": null, "account_page_asset_tab_nft": null, "account_page_asset_table_column_amm_instance": null, "account_page_asset_table_column_amm_pair": null, "account_page_asset_table_column_asset_class": null, "account_page_asset_table_column_balance": null, "account_page_asset_table_column_balance_usd": null, "account_page_asset_table_column_circulating_supply": null, "account_page_asset_table_column_currency_code": null, "account_page_asset_table_column_frozen": null, "account_page_asset_table_column_highest_bid": null, "account_page_asset_table_column_holders": null, "account_page_asset_table_column_issuer": null, "account_page_asset_table_column_locked": null, "account_page_asset_table_column_lowest_ask": null, "account_page_asset_table_column_price_usd": null, "account_page_asset_table_column_share": null, "account_page_asset_table_column_supply": null, "account_page_asset_table_column_ticker": null, "account_page_asset_table_column_token_id": null, "account_page_asset_table_column_transfer_fee": null, "account_page_asset_table_column_trustlines": null, "account_page_asset_table_column_url": null, "account_page_asset_table_mpt_locked_global": null, "account_page_asset_table_mpt_locked_individual": null, "account_page_asset_table_no_iou": null, "account_page_asset_table_no_lptoken": null, "account_page_asset_table_no_mpt": null, "account_page_asset_table_no_nft": null, "tx_hash": null, "timestamp": null, "amount_in": null, "amount_out": null, "rate": null, "refresh_data": null, "token_page.general_overview": null, "token_page.market_data": null, "token_page.all_tx": null, "token_page.dex_tx": null, "token_page.transfers_tx": null, "token_page.holders_table": null, "token_page.issuer": null, "token_page.price": null, "token_page.holders": null, "token_page.supply": null, "token_page.market_cap": null, "token_page.volume_24h": null, "token_page.trades_24h": null, "token_page.amm_tvl": null, "token_page.transfer_fee": null, "token_page.holders_rank": null, "token_page.holders_num_tokens": null, "token_page.holders_percent_supply": null, "token_page.holders_no_holders": null, "token_page.holders_usd_value": null, "token_page.transfers_no_transfers": null, "token_page.circulating_supply": null, "token_page.dex_type": null, "token_page.dex_amount_in_tooltip": null, "token_page.dex_amount_out_tooltip": null, "token_page.dex_rate_tooltip": null, "token_page.dex_no_trades": null, "token_page.token_label": null, "token_page.category_text": null, "token_type.iou": null, "token_type.mpt": null, "iou_page.trustlines": null, "mpt_page.metadata_warning": null, "data_available_from_notice": null, "copied": null, "click_to_copy": null, "withdraw": null, "delete": null, "rates": null, "loan_broker_rates_detail": null, "loan_rates_detail": null, "loan_fees_detail": null, "loan_terms_detail": null, "no_limit": null, "first_loss_capital": null, "vault": null, "vault_not_found": null, "invalid_vault_id": null, "check_vault_id": null, "get_vault_failed": null, "private_vault": null, "perm_domain_id": null, "total_value_locked": null, "shares": null, "assets_available": null, "unrealized_loss": null, "other_data": null, "max_total_supply": null, "available_to_borrow": null, "not_available": null, "first_come_first_served": null, "loans": null, "loan_broker": null, "total_debt": null, "maximum_debt": null, "management_fee": null, "borrower": null, "amount_requested": null, "outstanding_balance": null, "loan_status_current": null, "loan_status_default": null, "all_loans": null, "loan_status_impaired": null, "loan_status_paid_off": null, "next_due_date": null, "origination_date": null, "frequency": null, "installments": null, "prepayment_fee": null, "no_loans_message": null, "loan_default_detected": null, "no_loan_brokers_message": null, "depositors_fetch_error": null, "no_depositors_message": null, "depositors": null, "percent_of_supply": null, "value": null, "currency_toggle_help": null, "currency_toggle_description": null, "currency_toggle_loading": null, "currency_toggle_loading_description": null, "currency_toggle_unavailable": null, "currency_toggle_unavailable_description": null, "vaults": null, "vaults_tvl": null, "vaults_tvl_description": null, "vaults_outstanding_loans": null, "vaults_outstanding_loans_description": null, "vaults_loans_originated": null, "vaults_loans_originated_description": null, "vaults_avg_interest_rate": null, "vaults_avg_interest_rate_description": null, "vaults_num_vaults": null, "vaults_num_vaults_description": null, "vaults_utilization_ratio": null, "vaults_utilization_ratio_description": null, "vaults_filter_all_assets": null, "vaults_filter_stablecoins": null, "vaults_search_placeholder": null, "vaults_table_vault_id": null, "vaults_table_asset": null, "vaults_table_tvl": null, "vaults_table_outstanding_loans": null, "vaults_table_utilization_ratio": null, "vaults_table_avg_interest_rate": null, "vaults_table_website": null, "vaults_no_results": null, "vaults_disclaimer": null, "amm_pool": null, "basic_info": null, "market_data": null, "auction": null, "created_on": null, "volume_24h_tooltip": null, "fees_24h": null, "fees_24h_tooltip": null, "apr_24h": null, "apr_24h_tooltip": null, "current_holder": null, "discounted_fee": null, "price_paid": null, "replacement_cost": null, "all_transactions": null, "dex_trades": null, "deposits": null, "withdrawals": null, "lp_tokens_received": null, "lp_tokens_redeemed": null, "tvl_and_volume": null, "no_deposits": null, "no_withdrawals": null, "liquidity_providers": null, "balance": null, "lp_token_currency_code": null, "asset_2": null, "usd_value": null, "amm_pool_deleted_label": null, "amm_pool_deleted_text": null, "amms": null, "top_1000_amms": null, "general_info": null, "number_of_amms": null, "number_of_lps": null, "number_of_amms_tooltip": null, "number_of_lps_tooltip": null, "search_amms": null, "tvl_tooltip": null, "volume_24h_all_tooltip": null } ================================================ FILE: public/locales/en-US/translations.json ================================================ { "action": "action", "assets": "Assets", "assets.no_nfts_message": "No NFTs found.", "assets.no_mpts_message": "No MPTs found.", "network": "Network", "amendments": "Amendments", "network_name": "Unknown Network", "network_name_testnet": "Testnet", "network_name_mainnet": "Mainnet", "network_name_devnet": "Devnet", "network_name_xahau_mainnet": "Xahau Mainnet", "network_name_xahau_testnet": "Xahau Testnet", "network_name_custom": "Custom", "app.meta.description": "XRPL Network Explorer", "app.meta.author": "Ripple", "explorer": "Explorer", "xrpl_org": "XRPL.org", "github": "GitHub", "header.search.placeholder": "Search by Token, Address, Ledger, Txn, VaultID or LedgerHash", "xrp": "XRP", "xrpl_explorer": "XRPL Explorer", "ledgers": "Ledgers", "ledger": "Ledger", "taxon": "Taxon", "token_id": "Token ID", "token_transactions": "Token Transactions", "transactions": "Transactions", "transaction_short": "TX", "nodes": "Nodes", "validator": "Validator", "validators": "Validators", "upgrade_status": "Upgrade Status", "version": "v{{number}}", "component_error": "Something bad happened!", "1H": "1H", "24H": "24H", "30D": "30D", "total_transactions": "# of Txns", "total_fees": "Total Fees", "async_component_failed": "Failed to load Component", "account_not_found": "Account not found", "account_empty_title": "No account ID was supplied", "account_empty_hint": "Enter an account ID in the search box", "check_account_id": "Please check your account ID", "accounts.xrp_balance": "XRP Balance", "accounts.other_balances": "Other Balances", "accounts.other_balances_short": "Other Bal.", "amount": "Amount", "currency_code": "Currency Code", "currency_balance": "<0>{{currency}} Balance", "load_more_action": "Load more...", "account_transactions": "Account Transactions", "transaction_type": "Transaction Type", "transaction_action_CANCEL": "Cancel", "transaction_action_CREATE": "Create", "transaction_action_FINISH": "Finish", "transaction_action_MODIFY": "Modify", "transaction_action_SEND": "Send", "transaction_category_ACCOUNT": "Account", "transaction_category_DEX": "Dex (AMM, Offers, Trust Sets, Tokens)", "transaction_category_NFT": "NFT", "transaction_category_PAYMENT": "Payment", "transaction_category_PSEUDO": "Pseudo-Tx", "transaction_category_XCHAIN": "XChain", "transaction_category_OTHER": "Other", "transaction_legend_toggle_hide": "Hide Legend", "transaction_legend_toggle_show": "Show Legend", "transactions.date_header": "Date/time (UTC)", "no_transactions_message": "No transactions found.", "get_vault_transactions_failed": "Unable to load vault transactions at this time.", "retry_action": "Retry...", "uh_oh": "UH-OH!", "not_found_default_title": "Page Not Found", "not_found_check_url": "Please double check your URL", "not_found": "Not found", "hash_not_found": "Could not find any Transactions, Vaults, Ledgers or NFTs that match the specified ID", "buy": "Buy", "sell": "Sell", "price": "Price", "ledger_index": "Ledger Index", "to": "to", "from": "from", "request": "Request", "terms": "Terms", "send": "Send", "delivered": "Delivered", "cancel_offer": "Cancel Offer", "convert_maximum": "Convert Max", "convert_to": "Convert to", "using_at_most": "Using at most", "partial_payment_allowed": "partial payment allowed", "set_limit": "Set Trust Limit", "escrow": "escrow", "cancel_escrow": "cancel escrow", "finish_escrow": "finish escrow", "escrow_amount": "escrow amount", "escrow_destination": "escrow destination", "escrow_transaction": "escrow txn", "escrow_condition_short": "escrow condition", "escrow_fulfillment": "escrow fulfillment", "condition": "condition", "fulfillment": "fulfillment", "cancel_after": "cancel after", "finish_after": "finish after", "settle_delay": "Settlement Delay", "channel_id": "Channel ID", "seconds": "seconds", "seconds_short": "sec.", "regular_key": "regular key", "unset_regular_key": "unset regular key", "unset_signer_list": "unset signer list", "set_flag": "set flag", "clear_flag": "clear flag", "email_hash": "email hash", "message_key": "message key", "out_of": "of", "weight": "weight", "the_account": "The account", "create_payment_channel": "will create a payment channel to", "destination_tag": "destination tag", "source_tag": "source tag", "channel_settle_delay": "The channel has a settlement delay of", "the_channel_id_is": "The channel ID is", "the_channel_amount_is": "The channel amount is", "update_payment_channel": "It will update the payment channel", "the_channel_balance_is": "The channel balance claimed is", "amm_delete_description": "Attempted to delete the AMM for and .", "amm_delete_description_caveat": "If there were more than 512 trustlines, this only removes 512 trustlines instead.", "payment_channel_closed_description": "The payment channel will be closed, any remaining balance will be returned to the source account", "set_signer_list_description": "It sets the minimum signer quorum at {{quorum}} with the following list of signers", "unset_signer_list_description": "It removed all signers from the account", "transaction_initiated_by": "The transaction was initiated by", "increase_channel_amount_by": "It will increase the channel amount by", "channel_amount_increase": "channel amount increase", "channel_amount": "channel amount", "total_claimed": "total claimed", "amount_claimed": "amount claimed", "close_request": "close channel request", "renew_channel": "renew chanel", "payment_channel_closed": "payment channel closed", "paychannel_node_line1": "It <1><0>{{action}} a PayChannel node from <3><0>{{account}} to <5><0>{{counterAccount}}", "paychannel_amount_changed": "Amount changed by <1><0>{{difference}}<1><0>{{currency}} from <3><0>{{previous}}<1><0>{{currency}} to <5><0>{{final}}<1><0>{{currency}}", "paychannel_balance_changed": "Balance changed by <1><0>{{difference}}<1><0>{{currency}} from <3><0>{{previous}}<1><0>{{currency}} to <5><0>{{final}}<1><0>{{currency}}", "setfee_fees_description": "Future transactions will require a minimum fee of .", "setfee_reserves_description": "Accounts must now hold a base of and an additional for each additional object that account owns.", "setfee_docs_description": "Visit the docs: <0>Fees", "setfee_base_fee": "Base Fee", "setfee_reserve": "Reserve", "setfee_reserve_increment": "Reserve Increment", "formatted_date": "Date/Time ({{timeZone}})", "transaction_type_name_AMMCreate": "AMM Create", "transaction_type_name_AMMDelete": "AMM Delete", "transaction_type_name_AMMDeposit": "AMM Deposit", "transaction_type_name_AMMWithdraw": "AMM Withdraw", "transaction_type_name_AMMVote": "AMM Vote", "transaction_type_name_AMMBid": "AMM Bid", "transaction_type_name_AMMClawback": "AMMClawback", "transaction_type_name_AccountSet": "Account Set", "transaction_type_name_Batch": "Batch", "transaction_type_name_CheckCancel": "Check Cancel", "transaction_type_name_CheckCash": "Check Cash", "transaction_type_name_CheckCreate": "Check Create", "transaction_type_name_CredentialAccept": "Credential Accept", "transaction_type_name_CredentialCreate": "Credential Create", "transaction_type_name_CredentialDelete": "Credential Delete", "transaction_type_name_DelegateSet": "Delegate Set", "transaction_type_name_DIDDelete": "DID Delete", "transaction_type_name_DIDSet": "DID Set", "transaction_type_name_DepositPreauth": "Deposit Preauth", "transaction_type_name_Error_Cases": "Error Cases", "transaction_type_name_EscrowCancel": "Escrow Cancel", "transaction_type_name_EscrowCreate": "Escrow Create", "transaction_type_name_EscrowFinish": "Escrow Finish", "transaction_type_name_Invoke": "Invoke", "transaction_type_name_LoanBrokerSet": "Loan Broker Set", "transaction_type_name_LoanBrokerDelete": "Loan Broker Delete", "transaction_type_name_LoanBrokerCoverDeposit": "Loan Broker Cover Deposit", "transaction_type_name_LoanBrokerCoverWithdraw": "Loan Broker Cover Withdraw", "transaction_type_name_LoanBrokerCoverClawback": "Loan Broker Cover Clawback", "transaction_type_name_LoanSet": "Loan Set", "transaction_type_name_LoanDelete": "Loan Delete", "transaction_type_name_LoanManage": "Loan Manage", "transaction_type_name_LoanPay": "Loan Pay", "transaction_type_name_MPTokenIssuanceCreate": "MPT Issuance Create", "transaction_type_name_MPTokenIssuanceDestroy": "MPT Issuance Destroy", "transaction_type_name_MPTokenIssuanceSet": "MPT Issuance Set", "transaction_type_name_MPTokenAuthorize": "MPT Authorize", "transaction_type_name_NFTokenAcceptOffer": "NFT Accept Offer", "transaction_type_name_NFTokenBurn": "NFT Burn", "transaction_type_name_NFTokenCancelOffer": "NFT Cancel Offer", "transaction_type_name_NFTokenCreateOffer": "NFT Create Offer", "transaction_type_name_NFTokenMint": "NFT Mint", "transaction_type_name_OfferCancel": "Offer Cancel", "transaction_type_name_OfferCreate": "Offer Create", "transaction_type_name_OracleDelete": "Oracle Delete", "transaction_type_name_OracleSet": "Oracle Set", "transaction_type_name_Payment": "Payment", "transaction_type_name_PaymentChannelClaim": "Payment Channel Claim", "transaction_type_name_PaymentChannelCreate": "Payment Channel Create", "transaction_type_name_PaymentChannelFund": "Payment Channel Fund", "transaction_type_name_PermissionedDomainDelete": "Permissioned Domain Delete", "transaction_type_name_PermissionedDomainSet": "Permissioned Domain Set", "transaction_type_name_SetHook": "Set Hook", "transaction_type_name_SetRegularKey": "Set Regular Key", "transaction_type_name_SignerListSet": "Signer List Set", "transaction_type_name_TicketCreate": "Ticket Create", "transaction_type_name_TrustSet": "Trust Set", "transaction_type_name_VaultCreate": "Vault Create", "transaction_type_name_VaultSet": "Vault Set", "transaction_type_name_VaultDeposit": "Vault Deposit", "transaction_type_name_VaultWithdraw": "Vault Withdraw", "transaction_type_name_VaultClawback": "Vault Clawback", "transaction_type_name_VaultDelete": "Vault Delete", "transaction_type_name_XChainAccountCreateCommit": "XChain Account Create Commit", "transaction_type_name_XChainAddAccountCreateAttestation": "XChain Add Account Create Attestation", "transaction_type_name_XChainAddClaimAttestation": "XChain Add Claim Attestation", "transaction_type_name_XChainClaim": "XChain Claim", "transaction_type_name_XChainCommit": "XChain Commit", "transaction_type_name_XChainCreateBridge": "XChain Create Bridge", "transaction_type_name_XChainCreateClaimID": "XChain Create Claim ID", "transaction_type_name_XChainModifyBridge": "XChain Modify Bridge", "transaction_type_name_EnableAmendment": "Enable Amendment", "transaction_type_name_SetFee": "Set Fee", "transaction_type_name_UNLModify": "UNL Modify", "transaction_type_name_AccountDelete": "Account Delete", "generic_error": "Something bad happened", "not_your_fault": "It's probably not your fault", "come_back_later": "It will be available soon", "invalid_ledger_id": "The ledger id is invalid", "invalid_transaction_hash": "The transaction hash is invalid", "ledger_not_found": "Ledger not Found", "check_ledger_id": "Please check your ledger id", "server_ledgers_hint": "This node ({{connection.server.publicKey, truncate(length: 10)}}) only contains ledgers {{connection.ledger.validated}}", "use_search": "Please use our search", "ledger_has_no_trans": "This ledger does not have any transactions", "less_than": "Less than", "transaction_not_found": "Transaction not found", "transaction_empty_title": "No transaction hash supplied", "transaction_empty_hint": "Enter a transaction hash in the search box", "validator_not_found": "Validator not found", "check_transaction_hash": "Please check your transaction hash or CTID.", "wrong_network": "This CTID applies to a different network.", "check_validator_key": "Please check your validator key", "transaction": "Transaction", "success": "Success", "fail": "Fail", "simple": "Simple", "detailed": "Detailed", "details": "Details", "history": "History", "voting": "Voting", "raw": "Raw", "expand": "Expand", "collapse": "Collapse", "try_detailed_raw": "Try `Detailed` or `Raw` view", "account": "Account", "transaction_cost": "Transaction Cost", "transaction_cost_short": "Txn. Cost", "sequence_number": "Sequence Number", "sequence_number_short": "Sequence #", "serial": "Serial", "n_a": "N/A", "memos": "Memos", "flags": "Flags", "status": "Status", "successful_transaction": "This transaction was successful", "fail_transaction": "This transaction failed with a status code of <0>{{code}}", "transaction_validated": ", and validated in ledger ", "on": " on ", "description": "Description", "signers": "Signers", "decoded_hex": "decoded hex", "transaction_consumed_fee": "Sending this transaction consumed", "meta": "Meta", "number_of_affected_node": "It affected {{count}} nodes in the ledger:", "nodes_type": "{{action}} nodes", "node_meta_type": "It {{action}} a node with type", "transaction_balance_line_one": "It <1><0>{{action}} a <4><0>{{currency}} RippleState node between <6><0>{{account}} and <8><0>{{counterAccount}}", "transaction_balance_line_two": "Balance changed by <1><0>{{change}} from <3><0>{{previousBalance}} to <5><0>{{finalBalance}}", "transaction_outstanding_balance_line_two": "Outstanding balance changed by <1><0>{{change}} from <3><0>{{previousBalance}} to <5><0>{{finalBalance}}", "transaction_owned_directory": "It {{action}} a DirectoryNode node owned by", "transaction_unowned_directory": "It {{action}} a DirectoryNode node", "transaction_mptoken_line_one": "It <1><0>{{action}} an MPToken node of <3><0>{{account}}", "transaction_mpt_issuance_line_one": "It <1><0>{{action}} an MPTokenIssuance node of <3><0>{{account}}", "owned_account_root": "It {{action}} the AccountRoot node of", "unowned_account_root": "It {{action}} the AccountRoot node", "account_balance_increased": "Balance increased by <1><0>{{difference}}<1><0>{{currency}} from <3><0>{{previous}}<1><0>{{currency}} to <5><0>{{final}}<1><0>{{currency}}", "account_balance_decreased": "Balance decreased by <1><0>{{difference}}<1><0>{{currency}} from <3><0>{{previous}}<1><0>{{currency}} to <5><0>{{final}}<1><0>{{currency}}", "decreased_from_to": "decreased by <1><0>{{change}} from <3><0>{{previous}} to <5><0>{{final}}", "offer_node_meta": "It {{action}} a / offer node owned by with sequence # {{sequence}}", "offer_replaces": "This offer replaces the existing offer #", "offer_partially_filled": "The offer was partially filled.", "offer_filled": "The offer was filled.", "offer_cancelled": "The offer was cancelled.", "offer_replaced": "This offer was replaced by the new offer #", "offer_lack_of_funds": "The offer was partially filled, then cancelled due to lack of funds.", "transaction_sequence": "The transaction's sequence number is", "trust_set_description": "It establishes <1><0>{{amount}} as the maximum amount of <3><0>{{currency}} from <5><0>{{issuer}} that <7><0>{{account}} is willing to hold", "payment_desc_line_1": "The payment is from to ", "the_source_tag_is": "The source tag is ", "the_destination_tag_is": "The destination tag is", "payment_desc_line_4": "It was instructed to deliver", "payment_desc_line_5": "by spending up to", "payment_desc_line_6": "The actual amount delivered was", "offer_cancel_description": "The transaction will cancel the account's existing offer #", "offer_create_desc_line_1": "The account <1><0>{{account}} offered to pay <3><0>{{takerGets}}<1><0>{{currency}} in order to receive <5><0>{{takerPays}}<1><0>{{currency}}", "offer_create_desc_line_2": "The exchange rate for this offer is", "offer_create_desc_line_3": "The transaction will also cancel the account's existing offer #", "offer_create_desc_line_5": "This Offer is applicable to the Permissioned Domain", "offer_will_expire_desc": "The offer expires on <1><0>{{date}} unless canceled or consumed before then", "offer_did_expire_desc": "The offer expired on <1><0>{{date}} unless cancelled or consumed before then", "escrow_is_from": "The escrow is from <1><0>{{account}} to <3><0>{{destination}}", "escrow_is_created_by": "The escrow was created by <1><0>{{account}} and the funds will be returned to the same account", "escrowed_amount": "It escrowed", "escrow_condition": "The escrow has a fulfillment condition of", "describe_cancel_after": "It can be cancelled after", "describe_finish_after": "It can be finished after", "escrow_completion_desc": "Completion was triggered by", "escrow_completion_desc_2": "The escrowed amount of <1><0>{{amount}} was delivered to <3><0>{{destination}}", "escrow_finish_fulfillment_desc": "The escrow condition is fulfilled by", "escrow_cancellation_desc": "Cancellation was triggered by", "escrow_cancellation_desc_2": "The escrowed amount of <1><0>{{amount}} was returned to <3><0>{{owner}}", "escrow_after_transaction_cost": "after transaction cost", "escrow_created_by_desc": "The escrow was created by <1><0>{{account}} with transaction <3><0>{{transaction}}", "set_regular_key_description": "It sets the account's regular key to", "unset_regular_key_description": "It removes the account's regular key", "set_flag_description": "It sets the account flag", "clear_flag_description": "It clears the account flag", "set_domain_description": "It sets the account domain as", "set_email_description": "It sets the account email hash as", "set_message_key_description": "It sets the account message key as", "set_nftoken_minter_description": "It sets <0>{{account}} as the authorized minter for this account", "deposit_auth": "It authorizes <1><0>{{account}} to send payments to this account", "deposit_unauth": "It removes the authorization for <1><0>{{account}} to send payments to this account", "deposit_auth_credentials": "It authorizes the following credentials:", "deposit_unauth_credentials": "It removes the authorization for the following credentials:", "invalid_xrpl_address": "Invalid XRPL address", "loading": "Loading", "get_ledger_failed": "Unable to load ledger", "get_transaction_failed": "Unable to load transaction", "get_validator_failed": "Unable to load validator", "get_account_state_failed": "Unable to load account state", "get_account_transactions_failed": "Unable to load account transactions", "get_account_transactions_try": "Try loading more transactions", "pubkey": "pubkey", "node_pubkey": "node pubkey", "ip": "ip", "state": "state", "rippled_version": "version", "last_ledger": "last ledger", "uptime": "uptime", "peers": "peers", "in_out": "(in:out)", "ledger_history": "ledger history", "quorum": "quorum", "load": "load", "latency": "latency", "amendment_id": "id", "amendment_name": "name", "voters": "voters", "threshold": "threshold", "consensus": "consensus", "enabled": "enabled", "disabled": "disabled", "on_tx": "on (tx)", "yes": "Yes", "no": "No", "deprecated": "deprecated", "domain": "domain", "unl": "unl", "fee": "fee", "ledger_interval": "avg. ledger interval", "load_fee": "load fee", "txn_sec": "txn/sec.", "txn_ledger": "avg. txn/ledger", "avg_fee": "Avg. Txn Fee", "txn_count": "txn count", "nUnlCol": "nUNL", "nUnl": "VALIDATORS ON nUNL", "fees": "fees", "total": "total", "missing": "missing", "authorize": "authorize", "unauthorize": "unauthorize", "missed_validations": "{{count}} missed validations", "incomplete": "incomplete", "base_fee": "Base Fee", "account_reserve": "Account Reserve", "object_reserve": "Object Reserve", "vote": "Vote", "no_amendment_in_voting": "There is no amendment in voting for this network at the moment.", "required": "required", "source": "source", "destination": "destination", "claimed": "claimed", "remaining": "remaining", "inbound_total": "inbound total", "outbound_total": "outbound total", "payment_channels": "payment channels", "available_in": "available in", "channels": "channels", "account_info": "account info", "reserve": "reserve", "current_sequence": "current sequence", "escrows": "escrows", "nodes_found": "nodes found", "unmapped": "unmapped", "validators_found": "validators found", "pause": "pause", "resume": "resume", "flag_ledger": "Flag Ledger", "ticket": "Ticket", "ticket_sequence": "Ticket Sequence", "ticket_count": "Ticket Count", "ticket_used": "a Ticket was used for this Transaction", "token": "Token", "tokens": "Tokens", "total_issuers": "Total Issuers", "total_tokens": "Total Tokens", "top_trading_pairs": "Top Trading Pairs", "issuer_address": "Issuer Address", "obligations": "Obligations", "settings": "Settings", "rank": "Rank", "market_cap": "Market Cap", "volume_24h": "Volume (24H)", "no_tokens_message": "No tokens found.", "no_pairs_message": "No trading pairs found", "high": "High", "low": "Low", "rank_message": "Tokens are ranked by number of trustlines.", "obligations_message": "Obligations are the total amounts of each token issued to addresses", "issuer": "Issuer", "pair": "Pair", "asset_pair": "Asset Pair", "offer_range": "Offer Range", "custom_network": "Custom Network", "custom_network_input_help": "Enter custom network URL to access network's data.", "custom_network_input": "Type in URL of custom network", "custom_networks": "Custom Networks", "no_network_selected": "No Custom Network Selected", "locking_chain_door": "Locking Chain Door", "locking_chain_issue": "Locking Chain Issue", "issuing_chain_door": "Issuing Chain Door", "issuing_chain_issue": "Issuing Chain Issue", "signature_reward": "Signature Reward", "min_account_create_amount": "Minimum Account Creation Amount", "other_chain_source": "Other Chain Source", "xchain_claim_id": "XChain Claim ID", "check_nft_id": "Please check your NFT ID", "get_nft_state_failed": "Unable to load NFT", "minted": "Minted", "taxon_id": "Taxon ID", "transfer_fee": "Transfer Fee", "burnable": "Burnable", "only_xrp": "Only XRP", "transferable": "Transferable", "buy_offers": "Buy Offers", "sell_offers": "Sell Offers", "offer_index": "Offer ID", "no_sell_offers": "No sell offers", "no_buy_offers": "No buy offers", "validator_history.chain": "Chain", "validator_history.date": "Date (UTC)", "validator_history.missed": "Missed", "validator_history.score": "Score", "seller": "Seller", "buyer": "Buyer", "offerer": "Offerer", "token_taxon": "Token Taxon", "uri": "URI", "owner": "Owner", "other_chain_destination": "Other Chain Destination", "%_of_total_nodes_validators": "% of Total Nodes & Validators", "version_display": "Version: {{version}}", "validator_count": "# of Validators: {{val_count}}", "node_count": "# of Nodes: {{node_count}}", "current_stable_version": "Current Stable Version", "stable_version": "{{stableVersion}}", "nftoken_minter": "NFT Minter", "is_burned": "Burned", "fee_rate": "Fee Rate", "last_affecting_transaction": "Last affecting tx", "Version": "Version", "increased_by": "increased by", "trading_fee": "Trading Fee", "tvl": "TVL", "account_address": "Account Address", "asset1": "Asset 1", "asset2": "Asset 2", "asset1out": "Asset 1 Out", "asset2out": "Asset 2 Out", "asset1in": "Asset 1 In", "asset2in": "Asset 2 In", "effective_price": "Effective Price", "amm_account_id": "AMM Account ID", "lp_tokens": "LP Tokens", "min_slot_price": "Minimum Slot Price", "max_slot_price": " Maximum Slot Price", "auth_accounts": "Authorized Accounts", "network_cannot_be_crawled": "This network cannot be crawled", "check_crawl_existed": "Please contact the operator to make sure they have /crawl accessible or a vl set.", "peer_crawled_context": "For more context, see https://xrpl.org/peer-crawler.html", "xchainbridge": "XChainBridge", "xchain_account_claim_count": "XChain Account Claim Count", "xchain_account_create_count": "XChain Account Create Count", "min_signer_quorum": "Minimum weight <0>{{quorum}} required", "holder": "Holder", "action_from": "<0><0>{{action}} <1><0>{{amount}} from <3><0>{{destination}}", "action_from_and": "<0><0>{{action}} <1><0>{{amount1}} and <3><0>{{amount2}} from <5><0>{{destination}}", "claws_back": "Claws back", "claws_back_from": " claws back from ", "instruct_to_claw": "The max clawback amount is ", "hook": "Hook", "hooks": "Hooks", "hook_emitted": "this Transaction was emitted by a Hook", "emit_details": "Emit Details", "hook_parameters": "Hook Parameters", "hook_executions": "Hook Executions", "emit_generation": "Number {{emit}} in the line of generated transactions", "emit_hook_hash": "Emitted by the hook {{hash}}", "emit_parent": "Emitted by a hook triggered by <0>{{hash}}", "emit_callback": "The emit callback is <0>{{callback}}<0>", "hook_exec_hash": "It triggered the hook {{hash}}", "hook_exec_account": "On the account <0>{{account}}", "hook_exec_return": "Returned the code {{code}} with string \"{{string}}\"", "hook_exec_emit_count": "Emitted {{count}} transactions", "hash": "Hash", "grant": "Grant", "namespace": "Namespace", "api_version": "API Version", "triggered_on": "Triggered On", "name": "name", "introduced_in": "Introduced In", "yeas": "yeas", "nays": "nays", "eta": "eta", "amendment_summary": "Amendment Summary", "not": "not", "enable_tx": "Enable tx", "all": "all", "yeas_count": "# of Yea Votes: {{yeas_count}}", "nays_count": "# of Nay Votes: {{nays_count}}", "yeas_percent": "% of Yea Votes: {{yeas_percent}}%", "nays_percent": "% of Nay Votes: {{nays_percent}}%", "%_of_validators": "% of Validators", "amendment_not_found": "Amendment not found", "check_amendment_key": "Please check your amendment key", "did_document": "DID Document", "attestation": "Attestation", "note": "Note", "indicate_unl": "indicates a validator on an UNL", "transaction_tokens_involved": " and ", "transaction_tokens_swapped": " for ", "oracle_document_id": "Oracle Document ID", "provider": "Provider", "last_update_time": "Last Update Time", "asset_class": "Asset Class", "trading_pairs": "Trading Pairs", "deleted": "Deleted", "holders_count": "HOLDERS: {{holders}}", "trustlines": " TRUSTLINES: {{trustlines}}", "website": "Website", "mpt_issuance_id": "MPT Issuance ID", "asset_scale": "Asset Scale", "metadata": "Metadata", "max_amount": "Max Amount", "mpt_holder": "MPT Holder", "check_mpt_id": "Please check your MPT Issuance ID", "outstanding_amount": "Issued Amount", "locked": "Locked", "can_lock": "Can Lock", "require_auth": "Require Auth", "can_escrow": "Can Escrow", "can_trade": "Can Trade", "can_transfer": "Can Transfer", "can_clawback": "Can Clawback", "enable_amendment_name": "Amendment Name", "amendment_status": "Amendment Status", "expected_date": "Expected Date", "base": "Base", "credential_type": "Credential Type", "credential_issuer": "Credential Issuer", "subject": "Subject", "expiration": "Expiration", "domain_id": "Domain ID", "accepted_credentials": "Accepted Credentials", "credential_ids": "Credential IDs", "data": "Data", "finish_function": "Finish Function", "quorum_description": "Min. number of trusted validations needed to confirm a ledger", "avg_fee_description": "Avg. transaction fee across the past 50 ledgers", "ledger_interval_description": "Avg. time between ledger closures over the past 50 ledgers", "txn_ledger_description": "Avg. number of transactions per ledger over the past 50 ledgers", "txn_sec_description": "Total transactions over the past 50 ledgers divided by the time it took to close them", "load_fee_description": "Current reference transaction cost (base fee) for this ledger version", "nUnl_description": "No. of validators in NegativeUNL (nUNL)", "computation_allowance": "Computation Allowance", "gas": "Gas", "delegate": "Delegate", "permissions": "Permissions", "pertaining_to_the_Permissioned_Domain": "pertaining to the Permissioned Domain", "tx_delegated_to": "The transaction is delegated to ", "account_delegates_to": " delegates permissions to ", "delegate_to": " permissions to ", "volume": "Volume", "holders": "Holders", "trades": "Trades", "no_of_tokens": "# of Tokens", "volume_24h_total": "DEX Traded Volume (24H)", "volume_24h_total_description": "Total USD value of trades on the DEX in the past 24h", "market_cap_metric_description": "Circulating supply multiplied by price of all tokens", "market_cap_description": "Circulating supply multiplied by price", "24h_description": "Price change over the past 24h", "volume_description": "Total USD value of all DEX trades in the past 24h", "trades_description": "Number of DEX trades executed in the past 24h", "tvl_description": "USD value of token in AMMs", "stablecoin_description": "Market cap of all tokens classified as stablecoins", "stablecoin": "Stablecoin", "wrapped": "Wrapped", "tokens_footnote": "*This table includes only tokens with XRPL Meta trust levels 1-3. Learn more in .", "xrplmeta_guidelines": "XRPL Meta's guidelines", "inner_transaction": "Inner Transaction", "batch_table_detail_count": " {{batch_count}} transactions", "batch_table_detail_list": "Applied Inner Transactions: ", "batch_description": "Batch Signers: ", "batch": "Batch", "successful": "Successful", "failed": "Failed ()", "not-validated": "Not Validated", "asset": "Asset", "assets_maximum": "Assets Maximum", "mptoken_metadata": "MPToken Metadata", "withdrawal_policy": "Withdrawal Policy", "account_creates_vault": " created a vault for ", "vault_id": "Vault ID", "single_asset_vault": "Single Asset Vault", "loan_broker_id": "Loan Broker ID", "loan_id": "Loan ID", "management_fee_rate": "Management Fee Rate", "debt_maximum": "Debt Maximum", "cover_rate_minimum": "Cover Rate Minimum", "cover_rate_liquidation": "Cover Rate Liquidation", "counterparty": "Counterparty", "principal_requested": "Principal Requested", "payment_total": "Payment Total", "payment_interval": "Payment Interval", "grace_period": "Grace Period", "loan_origination_fee": "Loan Origination Fee", "loan_service_fee": "Loan Service Fee", "late_payment_fee": "Late Payment Fee", "close_payment_fee": "Close Payment Fee", "full_payment_fee": "Full Payment Fee", "overpayment_fee": "Overpayment Fee", "interest_rate": "Interest Rate", "late_interest_rate": "Late Interest Rate", "close_interest_rate": "Close Interest Rate", "overpayment_interest_rate": "Overpayment Interest Rate", "set_vault_data": "It sets the Vault Data to ", "set_vault_assets_maximum": "It sets the Vault Assets Maximum to ", "set_vault_domain_id": "It sets the Vault DomainID to ", "account_deposits_into_vault": " deposits into Vault ID ", "account_withdraws_from_vault": " withdraws from Vault ID ", "account_clawbacks_from_vault": " clawbacks from ", "account_clawbacks_from_vault_amount_omitted": " clawbacks all remaining funds from ", "account_deletes_vault": " deleted a vault with ID ", "vault_create_table_detail": "vault for ", "withdraws": "withdraws", "deletes": "deletes", "vault_delete_table_detail": "vault with id", "account_flag_title_lsf_global_freeze": "Global Freeze", "account_flag_title_lsf_disable_master": "Master Key Disabled", "account_flag_title_lsf_default_ripple": "Rippling", "account_flag_title_lsf_allow_trustline_clawback": "Clawback", "account_flag_title_lsf_allow_trustline_locking": "Escrow", "account_flag_title_lsf_require_destination_tag": "Require Destination Tag", "account_flag_title_lsf_no_freeze": "No Freeze", "account_flag_title_lsf_require_auth": "Require Authorization", "account_flag_title_lsf_disallow_xrp": "No XRP Allowed", "account_flag_title_lsf_disallow_incoming_trustline": "Block Trustlines", "account_flag_title_lsf_disallow_incoming_pay_chan": "Block Payment Channels", "account_flag_title_lsf_disallow_incoming_nft_token_offer": "Block NFT Offers", "account_flag_title_asf_authorized_nft_token_minter": "NFT Minter", "account_flag_title_lsf_disallow_incoming_check": "Block Checks", "account_flag_title_lsf_deposit_auth": "Deposit Authorization", "account_flag_title_asf_account_txn_id": "Track Account Latest Transaction", "account_flag_description_lsf_global_freeze": "Freeze all assets issued by this account.", "account_flag_description_lsf_disable_master": "Disable the account's master key pair.", "account_flag_description_lsf_default_ripple": "Enable rippling on this account's trust lines by default.", "account_flag_description_lsf_allow_trustline_clawback": "Allow account to claw back tokens it has issued.", "account_flag_description_lsf_allow_trustline_locking": "Allow Trust Line tokens (IOUs) issued by this account to be held in escrow.", "account_flag_description_lsf_require_destination_tag": "Require a destination tag to send transactions to this account.", "account_flag_description_lsf_no_freeze": "Permanently give up the ability to freeze individual trust lines or disable Global Freeze. This flag can never be disabled after being enabled.", "account_flag_description_lsf_require_auth": "Require authorization for users to hold balances issued by this address.", "account_flag_description_lsf_disallow_xrp": "XRP should not be sent to this account.", "account_flag_description_lsf_disallow_incoming_trustline": "Block incoming trust lines.", "account_flag_description_lsf_disallow_incoming_pay_chan": "Block incoming Payment Channels.", "account_flag_description_lsf_disallow_incoming_nft_token_offer": "Block incoming NFTokenOffers.", "account_flag_description_asf_authorized_nft_token_minter": "Enable to allow another account to mint non-fungible tokens (NFTokens) on this account's behalf.", "account_flag_description_lsf_disallow_incoming_check": "Block incoming Checks.", "account_flag_description_lsf_deposit_auth": "Enable Deposit Authorization on this account.", "account_flag_description_asf_account_txn_id": "Track the ID of this account's most recent transaction.", "account_page_address": "Address", "account_page_address_tag": "Tag", "account_page_classic_address": "Classic Address", "account_page_deleted_account_label": "Account Deleted", "account_page_deleted_account_warning": "This account has been deleted from the XRP Ledger. Historical data is shown for reference only.", "account_page_extended_address": "Extended Address (X-Address)", "account_page_domain": "Domain", "account_page_reserve_balance": "Reserve Balance", "account_page_xrp_balance": "XRP Balance", "account_page_xrp_balance_in_usd": "XRP Balance (USD)", "account_page_account_properties": "Account Properties", "account_page_flags": "Flags", "account_page_flag_status_enabled": "Enabled", "account_page_flag_status_disabled": "Disabled", "account_page_signers": "Signers", "account_page_signer_weight": "Weight", "account_page_details": "Details", "account_page_current_sequence": "Current Sequence", "account_page_ticket_count": "Ticket Count", "account_page_email_hash": "Email Hash", "account_page_payment_channels": "Payment Channels", "account_page_payment_channels_text": "{{currency}} available in {{number}} channel(s)", "account_page_nft_minter": "NFT Minter", "account_page_asset_held_title": "Assets Held", "account_page_asset_issued_title": "Assets Issued", "account_page_asset_tab_iou": "IOUs ({{count}})", "account_page_asset_tab_lptoken": "LP Tokens ({{count}})", "account_page_asset_tab_mpt": "MPTs ({{count}})", "account_page_asset_tab_nft": "NFTs ({{count}})", "account_page_asset_table_column_amm_instance": "AMM Instance", "account_page_asset_table_column_amm_pair": "AMM Pair", "account_page_asset_table_column_asset_class": "Asset Class", "account_page_asset_table_column_balance": "Balance", "account_page_asset_table_column_balance_usd": "Balance (USD)", "account_page_asset_table_column_circulating_supply": "Circ Supply", "account_page_asset_table_column_currency_code": "Currency Code", "account_page_asset_table_column_frozen": "Frozen", "account_page_asset_table_column_highest_bid": "Highest Bid", "account_page_asset_table_column_holders": "Holders", "account_page_asset_table_column_issuer": "Issuer", "account_page_asset_table_column_locked": "Locked", "account_page_asset_table_column_lowest_ask": "Lowest Ask", "account_page_asset_table_column_price_usd": "Price (USD)", "account_page_asset_table_column_share": "Share (%)", "account_page_asset_table_column_supply": "Supply", "account_page_asset_table_column_ticker": "Ticker", "account_page_asset_table_column_token_id": "Token ID", "account_page_asset_table_column_transfer_fee": "Transfer Fee", "account_page_asset_table_column_trustlines": "Trustlines", "account_page_asset_table_column_url": "URL", "account_page_asset_table_mpt_locked_global": "Global", "account_page_asset_table_mpt_locked_individual": "Individual", "account_page_asset_table_no_iou": "No IOUs found", "account_page_asset_table_no_lptoken": "No LP Tokens found", "account_page_asset_table_no_mpt": "No MPTs found", "account_page_asset_table_no_nft": "No NFTs found", "tx_hash": "Tx Hash", "timestamp": "Timestamp (UTC)", "amount_in": "Amount In", "amount_out": "Amount Out", "rate": "Rate", "refresh_data": "Refresh data", "token_page.general_overview": "General Overview", "token_page.market_data": "Market Data", "token_page.all_tx": "All Token Transactions", "token_page.dex_tx": "DEX Trades", "token_page.transfers_tx": "Transfers", "token_page.holders_table": "Holders", "token_page.issuer": "Issuer", "token_page.price": "Price", "token_page.holders": "# of Holders", "token_page.supply": "Supply", "token_page.market_cap": "Market Cap", "token_page.volume_24h": "Traded Volume (24H)", "token_page.trades_24h": "# of Trades (24H)", "token_page.amm_tvl": "AMM TVL", "token_page.transfer_fee": "Transfer Fee", "token_page.holders_rank": "Rank", "token_page.holders_num_tokens": "# of Tokens", "token_page.holders_percent_supply": "% of Supply", "token_page.holders_no_holders": "No holders found", "token_page.holders_usd_value": "USD Value", "token_page.transfers_no_transfers": "No transfers found", "token_page.circulating_supply": "Circ Supply", "token_page.dex_type": "Type", "token_page.dex_amount_in_tooltip": "The amount of tokens sent by the \"FROM\" account in the trade", "token_page.dex_amount_out_tooltip": "The amount of tokens sent out by the \"TO\" account in the trade", "token_page.dex_rate_tooltip": "Amount Out / Amount In", "token_page.dex_no_trades": "No dex trades found", "token_page.token_label": "Token", "token_page.category_text": "IOU", "token_type.iou": "IOU", "token_type.mpt": "MPT", "iou_page.trustlines": "# of Trustlines", "mpt_page.metadata_warning": "This MPT does not have metadata, or its metadata does not follow the recommended metadata standards. As a result, general overview and market data will be limited.", "data_available_from_notice": "Data displayed is from 3/22/2024, 08:11:41 PM UTC onwards", "copied": "Copied", "click_to_copy": "Click to copy", "withdraw": "withdraw", "delete": "delete", "rates": "rates", "loan_broker_rates_detail": "", "loan_rates_detail": "", "loan_fees_detail": "", "loan_terms_detail": "", "no_limit": "No Limit", "first_loss_capital": "first-loss capital", "vault": "Vault", "vault_not_found": "Vault not found", "invalid_vault_id": "Invalid vault ID", "check_vault_id": "Please check the vault ID", "get_vault_failed": "Unable to load vault information at this time. Please try again later.", "private_vault": "Private Vault", "perm_domain_id": "Permissioned Domain ID", "total_value_locked": "Total Value Locked (TVL)", "shares": "Shares", "assets_available": "Assets Available", "unrealized_loss": "Unrealized Loss", "other_data": "Other Data", "max_total_supply": "Max Total Supply", "available_to_borrow": "Available to Borrow", "not_available": "Not available", "first_come_first_served": "First Come First Served", "loans": "Loans", "loan_broker": "Loan Broker", "total_debt": "Total Debt", "maximum_debt": "Maximum Debt", "management_fee": "Management Fee", "borrower": "Borrower", "amount_requested": "Amount Requested", "outstanding_balance": "Outstanding Balance", "loan_status_current": "Current", "loan_status_default": "Default", "all_loans": "All Loans", "loan_status_impaired": "Impaired", "loan_status_paid_off": "Paid Off", "next_due_date": "Next Due Date", "origination_date": "Origination Date", "frequency": "Frequency", "installments": "Installments", "prepayment_fee": "Prepayment Fee", "no_loans_message": "No loans found for this broker.", "loan_default_detected": "Loan default detected in this broker.", "no_loan_brokers_message": "No loan brokers have been set up for this vault.", "depositors_fetch_error": "Unable to fetch depositors information", "no_depositors_message": "No depositors found for this vault.", "depositors": "Depositors", "percent_of_supply": "% of Supply", "value": "Value", "currency_toggle_help": "Toggle to view values in native-currency or USD", "currency_toggle_description": "Toggle to view values in native-currency or USD", "currency_toggle_loading": "Loading USD conversion rate...", "currency_toggle_loading_description": "Loading USD conversion rate...", "currency_toggle_unavailable": "USD conversion not available for this token", "currency_toggle_unavailable_description": "USD conversion not available for this token", "vaults": "Vaults", "vaults_tvl": "Total Value Locked (TVL)", "vaults_tvl_description": "USD value of tokens deposited in all vaults", "vaults_outstanding_loans": "Outstanding Loans", "vaults_outstanding_loans_description": "USD value of all outstanding loans", "vaults_loans_originated": "Loans Originated", "vaults_loans_originated_description": "USD value of all originated loans since protocol launch", "vaults_avg_interest_rate": "Avg. Interest Rate", "vaults_avg_interest_rate_description": "Weighted average interest rate of outstanding loans", "vaults_num_vaults": "# of Vaults", "vaults_num_vaults_description": "Number of vaults with transactions in the last 30 days", "vaults_utilization_ratio": "Utilization Ratio", "vaults_utilization_ratio_description": "Outstanding loans / total value locked", "vaults_filter_all_assets": "All Assets", "vaults_filter_stablecoins": "Stablecoins", "vaults_search_placeholder": "Search Accounts, Vault Names, Assets, Websites", "vaults_table_vault_id": "Vault ID", "vaults_table_asset": "Asset", "vaults_table_tvl": "TVL (USD)", "vaults_table_outstanding_loans": "Outstanding Loans", "vaults_table_utilization_ratio": "Utilization Ratio", "vaults_table_avg_interest_rate": "Avg. Interest Rate", "vaults_table_website": "Website", "vaults_no_results": "No vaults found.", "vaults_disclaimer": "*Only vaults utilizing XRP and assets with a Trust Level ≥1 (per <0>XRPL Meta) within the stablecoin asset class are displayed.", "amm_pool": "AMM Pool", "basic_info": "Basic Info", "market_data": "Market Data", "auction": "Auction", "created_on": "Created On", "volume_24h_tooltip": "Total DEX trade volume on this AMM from 00:00–23:59 UTC of the previous day", "fees_24h": "Fees (24H)", "fees_24h_tooltip": "Total trading fees earned by this AMM from 00:00–23:59 UTC of the previous day", "apr_24h": "APR (24H)", "apr_24h_tooltip": "Annualized return based on fees from 00:00–23:59 UTC of the previous day relative to TVL", "current_holder": "Current Holder", "discounted_fee": "Discounted Trading Fee", "price_paid": "Price Paid", "replacement_cost": "Replacement Cost", "all_transactions": "All Transactions", "dex_trades": "DEX Trades", "deposits": "Deposits", "withdrawals": "Withdrawals", "lp_tokens_received": "LP Tokens Received", "lp_tokens_redeemed": "LP Tokens Redeemed", "tvl_and_volume": "Total Value Locked and Volume", "no_deposits": "No deposits found.", "no_withdrawals": "No withdrawals found.", "liquidity_providers": "Liquidity Providers", "balance": "Balance", "lp_token_currency_code": "LP Token", "asset_2": "Asset 2", "usd_value": "USD Value", "amm_pool_deleted_label": "AMM Pool Deleted", "amm_pool_deleted_text": "This AMM pool has been deleted. All assets have been withdrawn and the pool is no longer active. Historical data is still available below.", "amms": "AMMs", "top_1000_amms": "Top 1,000 AMMs", "general_info": "General Info", "number_of_amms": "# of AMMs", "number_of_lps": "# of LPs", "number_of_amms_tooltip": "Number of active AMM pools with deposit/withdrawal activity", "number_of_lps_tooltip": "Number of unique liquidity providers across all AMM pools", "search_amms": "Search AMMs", "tvl_tooltip": "Total value locked across all active AMM pools", "volume_24h_all_tooltip": "Total DEX trading volume across all active AMM pools from 00:00–23:59 UTC of the previous day" } ================================================ FILE: public/locales/es-ES/translations.json ================================================ { "action": "acción", "assets": "Activos", "assets.no_nfts_message": "NFTs no encontrados.", "assets.no_mpts_message": null, "network": "Red", "amendments": null, "network_name": "Red Desconocida", "network_name_testnet": "Testnet", "network_name_mainnet": "Mainnet", "network_name_devnet": "Devnet", "network_name_xahau_mainnet": "Xahau Mainnet", "network_name_xahau_testnet": "Xahau Testnet", "network_name_custom": "Personalizada", "app.meta.description": "Explorador de la Red XRPL", "app.meta.author": "Ripple", "explorer": "Explorador", "xrpl_org": "XRPL.org", "github": "GitHub", "header.search.placeholder": "Buscar por Dirección, Libro Contable o Transacción", "xrp": "XRP", "xrpl_explorer": "Explorador XRPL", "ledgers": "Registros", "ledger": "Registro", "taxon": "Taxón", "token_id": "ID del Token", "token_transactions": "Transacciones de Token", "transactions": "Transacciones", "transaction_short": "TX", "nodes": "Nodos", "validator": "Validador", "validators": "Validadores", "upgrade_status": "Estado de Actualización", "version": "v{{number}}", "component_error": "¡Algo malo ha ocurrido!", "1H": "1H", "24H": "24H", "30D": "30D", "total_transactions": "# de Txs", "total_fees": "Comisiones Totales", "async_component_failed": "Fallo al cargar Componente", "account_not_found": "Cuenta no encontrada", "account_empty_title": "El ID de la cuenta no fue facilitado", "account_empty_hint": "Introduce un ID de cuenta en la caja de búsqueda", "check_account_id": "Por favor, comprueba el ID de tu cuenta", "accounts.xrp_balance": "Balance XRP", "accounts.other_balances": "Otros Balances", "accounts.other_balances_short": "Otros Bal.", "amount": "Cantidad", "currency_code": "Código de Divisa", "currency_balance": "Balance <0>{{currency}}", "load_more_action": "Cargar más...", "account_transactions": "Transacciones de la Cuenta", "transaction_type": "Tipo de Transacción", "transaction_action_CANCEL": "Cancelación", "transaction_action_CREATE": "Creación", "transaction_action_FINISH": "Finalización", "transaction_action_MODIFY": "Modificación", "transaction_action_SEND": "Envío", "transaction_category_ACCOUNT": "Cuenta", "transaction_category_DEX": "Dex (AMM, Ofertas, Trust Sets, Tokens)", "transaction_category_NFT": "NFT", "transaction_category_PAYMENT": "Pago", "transaction_category_PSEUDO": "Pseudo-Tx", "transaction_category_XCHAIN": null, "transaction_category_OTHER": null, "transaction_legend_toggle_hide": "Ocultar Leyenda", "transaction_legend_toggle_show": "Mostrar Leyenda", "transactions.date_header": "Fecha/hora (UTC)", "no_transactions_message": "No se han encontrado transacciones.", "get_vault_transactions_failed": null, "retry_action": "Volver a intentar...", "uh_oh": "¡UH-OH!", "not_found_default_title": "Página No Encontrada", "not_found_check_url": "Por favor, comprueba tu URL", "not_found": "No encontrado", "hash_not_found": null, "buy": "Comprar", "sell": "Vender", "price": "Precio", "ledger_index": "Índice del Libro Contable", "to": "a", "from": "desde", "request": null, "terms": null, "send": "Enviar", "delivered": "Enviado", "cancel_offer": "Cancelar Oferta", "convert_maximum": "Convertir Máx", "convert_to": "Convertir a", "using_at_most": "Utilizando como mucho", "partial_payment_allowed": "pago parcial permitido", "set_limit": "Añadir Límite de Confianza", "escrow": "depósito", "cancel_escrow": "cancelar depósito", "finish_escrow": "finalizar depósito", "escrow_amount": "cantidad del depósito", "escrow_destination": "destino del depósito", "escrow_transaction": "tx del depósito", "escrow_condition_short": "condición del depósito", "escrow_fulfillment": "cumplimiento del depósito", "condition": "condición", "fulfillment": "cumplimiento", "cancel_after": "cancelar después", "finish_after": "finalizado después de", "settle_delay": "Retraso del Acuerdo", "channel_id": "ID del canal", "seconds": "segundos", "seconds_short": "seg.", "regular_key": "clave normal", "unset_regular_key": "Desconfigurar clave normal", "unset_signer_list": "Desconfigurar lista de firmantes", "set_flag": "establecer bandera", "clear_flag": "borrar bandera", "email_hash": "hash de email", "message_key": "clave de mensaje", "out_of": "de", "weight": "peso", "the_account": "La cuenta", "create_payment_channel": "creará un canal de pago para", "destination_tag": "etiqueta de destino", "source_tag": "etiqueta de origen", "channel_settle_delay": "El canal tiene un retraso de acuerdo de", "the_channel_id_is": "El ID del canal es", "the_channel_amount_is": "La cantidad del canal es", "update_payment_channel": "Se actualizará el canal de pago", "the_channel_balance_is": "El balance reclamado del canal es", "amm_delete_description": "Se intentó eliminar el AMM para y .", "amm_delete_description_caveat": "Si hubiese más de 512 líneas de confianza, esto solo borrará 512 líneas de confianza.", "payment_channel_closed_description": "El canal de pago será cerrado, cualquier balance restante será devuelto a la cuenta de origen", "set_signer_list_description": "Se añade un acuerdo mínimo de firmantes de {{quorum}} con la siguiente lista de firmantes", "unset_signer_list_description": "Eliminó todos los firmantes de la cuenta", "transaction_initiated_by": "La transacción fue iniciada por", "increase_channel_amount_by": "Incrementará la cantidad del canal en", "channel_amount_increase": "cantidad del canal aumentada", "channel_amount": "cantidad de canal", "total_claimed": "total reclamado", "amount_claimed": "cantidad reclamada", "close_request": "petición de cierre de canal", "renew_channel": "renovar el canal", "payment_channel_closed": "canal de pago cerrado", "paychannel_node_line1": "Se <1><0>{{action}} a un nodo PayChannel desde <3><0>{{account}} a <5><0>{{counterAccount}}", "paychannel_amount_changed": "Cantidad cambiada por <1><0>{{difference}}<1><0>{{currency}} desde <3><0>{{previous}}<1><0>{{currency}} a <5><0>{{final}}<1><0>{{currency}}", "paychannel_balance_changed": "Balance cambiado por <1><0>{{difference}}<1><0>{{currency}} desde <3><0>{{previous}}<1><0>{{currency}} a <5><0>{{final}}<1><0>{{currency}}", "setfee_fees_description": "Transacciones futuras necesitarán una comisión mínima de .", "setfee_reserves_description": "Las cuentas necesitan ahora tener una base de y un adicional por cada objecto adicional que la cuenta sea dueña.", "setfee_docs_description": "Visita la documentación: <0>Fees", "setfee_base_fee": "Comisión base", "setfee_reserve": "Reserva", "setfee_reserve_increment": "Incremento de la Reserva", "formatted_date": "Fecha/Hora ({{timeZone}})", "transaction_type_name_AMMCreate": "Crear AMM", "transaction_type_name_AMMDelete": null, "transaction_type_name_AMMDeposit": "Depositar AMM", "transaction_type_name_AMMWithdraw": "Retirar AMM ", "transaction_type_name_AMMVote": "Votar AMM", "transaction_type_name_AMMBid": "Puja AMM", "transaction_type_name_AMMClawback": null, "transaction_type_name_AccountSet": "Configurar Cuenta", "transaction_type_name_Batch": null, "transaction_type_name_CheckCancel": "Cancelar Cheque", "transaction_type_name_CheckCash": "Cobrar Cheque", "transaction_type_name_CheckCreate": "Crear Cheque", "transaction_type_name_CredentialAccept": null, "transaction_type_name_CredentialCreate": null, "transaction_type_name_CredentialDelete": null, "transaction_type_name_DelegateSet": null, "transaction_type_name_DIDDelete": null, "transaction_type_name_DIDSet": null, "transaction_type_name_DepositPreauth": "Preautorizar Depósito", "transaction_type_name_Error_Cases": "Casos de Error", "transaction_type_name_EscrowCancel": "Cancelar Depósito", "transaction_type_name_EscrowCreate": "Crear Depósito", "transaction_type_name_EscrowFinish": "Finalizar Depósito", "transaction_type_name_Invoke": null, "transaction_type_name_LoanBrokerSet": null, "transaction_type_name_LoanBrokerDelete": null, "transaction_type_name_LoanBrokerCoverDeposit": null, "transaction_type_name_LoanBrokerCoverWithdraw": null, "transaction_type_name_LoanBrokerCoverClawback": null, "transaction_type_name_LoanSet": null, "transaction_type_name_LoanDelete": null, "transaction_type_name_LoanManage": null, "transaction_type_name_LoanPay": null, "transaction_type_name_MPTokenIssuanceCreate": null, "transaction_type_name_MPTokenIssuanceDestroy": null, "transaction_type_name_MPTokenIssuanceSet": null, "transaction_type_name_MPTokenAuthorize": null, "transaction_type_name_NFTokenAcceptOffer": "Aceptar Oferta NFT", "transaction_type_name_NFTokenBurn": "Quemar NFT", "transaction_type_name_NFTokenCancelOffer": "Cancelar Oferta NFT", "transaction_type_name_NFTokenCreateOffer": "Crear Oferta NFT", "transaction_type_name_NFTokenMint": "Acuñar NFT", "transaction_type_name_OfferCancel": "Cancelar Oferta", "transaction_type_name_OfferCreate": "Crear Oferta", "transaction_type_name_OracleDelete": null, "transaction_type_name_OracleSet": null, "transaction_type_name_Payment": "Pago", "transaction_type_name_PaymentChannelClaim": "Reclamar Canal de Pago", "transaction_type_name_PaymentChannelCreate": "Crear Canal de Pago", "transaction_type_name_PaymentChannelFund": "Añadir Fondos a Canal de Pago", "transaction_type_name_PermissionedDomainDelete": null, "transaction_type_name_PermissionedDomainSet": null, "transaction_type_name_SetHook": "Añadir Hook", "transaction_type_name_SetRegularKey": "Configurar Clave Normal", "transaction_type_name_SignerListSet": "Configurar Lista de Firmantes", "transaction_type_name_TicketCreate": "Creación de Ticket", "transaction_type_name_TrustSet": "Configurar Confianza", "transaction_type_name_VaultCreate": null, "transaction_type_name_VaultSet": null, "transaction_type_name_VaultDeposit": null, "transaction_type_name_VaultWithdraw": null, "transaction_type_name_VaultClawback": null, "transaction_type_name_VaultDelete": null, "transaction_type_name_XChainAccountCreateCommit": "Commit de Creación de Cuenta XChain", "transaction_type_name_XChainAddAccountCreateAttestation": "Añadir Atestado de Creación de Cuenta XChain", "transaction_type_name_XChainAddClaimAttestation": "Añadir Atestado de Reclamo XChain", "transaction_type_name_XChainClaim": "Reclamar XChain", "transaction_type_name_XChainCommit": "Commit XChain", "transaction_type_name_XChainCreateBridge": "Crear Puente XChain", "transaction_type_name_XChainCreateClaimID": "Crear ID de Reclamo XChain", "transaction_type_name_XChainModifyBridge": "Modificar Puente XChain", "transaction_type_name_EnableAmendment": "Habilitar Enmienda", "transaction_type_name_SetFee": "Modificar Comisión", "transaction_type_name_UNLModify": "Modificar UNL", "transaction_type_name_AccountDelete": "Borrar Cuenta", "generic_error": "Algo malo ocurrió", "not_your_fault": "Es probable que no sea culpa tuya", "come_back_later": "Estará disponible pronto", "invalid_ledger_id": "El id del libro contable es inválido", "invalid_transaction_hash": "El hash de la transacción es inválido", "ledger_not_found": "Libro Contable no Encontrado", "check_ledger_id": "Por favor, comprueba el id de tu libro contable", "server_ledgers_hint": "Este nodo ({{connection.server.publicKey, truncate(length: 10)}}) solo contiene libros contables {{connection.ledger.validated}}", "use_search": "Por favor, utiliza nuestra búsqueda", "ledger_has_no_trans": "Este libro contable no tiene ninguna transacción", "less_than": "Menos que", "transaction_not_found": "Transacción no encontrada", "transaction_empty_title": "No se han facilitado hashes de transacciones", "transaction_empty_hint": "Introduce un hash de transacción en la caja de búsqueda", "validator_not_found": "Validador no encontrado", "check_transaction_hash": "Por favor, comprueba tu hash de transacción", "wrong_network": null, "check_validator_key": "Por favor, comprueba la clave de tu validador", "transaction": "Transacción", "success": "Éxito", "fail": "Fallo", "simple": "Simple", "detailed": "Detallado", "details": "Detalles", "history": "Histórico", "voting": null, "raw": "En Bruto", "expand": "Expandir", "collapse": "Contraer", "try_detailed_raw": "Prueba las vistas `Detallado` o `En Bruto`", "account": "Cuenta", "transaction_cost": "Coste de la Transacción", "transaction_cost_short": "Coste Tx.", "sequence_number": "Número de Secuencia", "sequence_number_short": "Secuencia #", "serial": "Serial", "n_a": "N/A", "memos": "Notas", "flags": "Banderas", "status": "Estado", "successful_transaction": "La transacción fue exitosa", "fail_transaction": "Esta transacción ha fallado con un código de estado de <0>{{code}}", "transaction_validated": ", y validada en el libro contable ", "on": " el ", "description": "Descripción", "signers": "Firmantes", "decoded_hex": "hex descodificado", "transaction_consumed_fee": "Enviar esta transacción consumió", "meta": "Meta", "number_of_affected_node": "Afectó a {{count}} nodos en el libro contable:", "nodes_type": "{{action}} nodos", "node_meta_type": "Se {{action}} un nodo de tipo", "transaction_balance_line_one": "Se <1><0>{{action}} un nodo RippleState <3><0>{{currency}} entre <5><0>{{account}} y <7><0>{{counterAccount}}", "transaction_balance_line_two": "Balance modificado por <1><0>{{change}} de <3><0>{{previousBalance}} a <5><0>{{finalBalance}}", "transaction_outstanding_balance_line_two": null, "transaction_owned_directory": "Se {{action}} un nodo DirectoryNode propiedad de", "transaction_unowned_directory": "Se {{action}} un nodo DirectoryNode", "transaction_mptoken_line_one": null, "transaction_mpt_issuance_line_one": null, "owned_account_root": "Se {{action}} el nodo AccountRoot de", "unowned_account_root": "Se {{action}} el nodo AccountRoot", "account_balance_increased": "Balance incrementado en <1><0>{{difference}}<1><0>{{currency}} de <3><0>{{previous}}<1><0>{{currency}} a <5><0>{{final}}<1><0>{{currency}}", "account_balance_decreased": "Balance disminuido en <1><0>{{difference}}<1><0>{{currency}} de <3><0>{{previous}}<1><0>{{currency}} a <5><0>{{final}}<1><0>{{currency}}", "decreased_from_to": "disminuido por <1><0>{{change}} de <3><0>{{previous}} a <5><0>{{final}}", "offer_node_meta": "Se <1><0>{{action}} el nodo de oferta <3><0>{{pair}} perteneciente a <5><0>{{account}} con secuencia # <7><0>{{sequence}}", "offer_replaces": "Esta oferta reemplaza la oferta existente #", "offer_partially_filled": "La oferta fue parcialmente completada", "offer_filled": "La oferta fue completada", "offer_cancelled": "La oferta fue cancelada", "offer_replaced": "Esta oferta fue reemplazada por una nueva oferta #", "offer_lack_of_funds": "La oferta fue parcialmente completada, después cancelada por la falta de fondos", "transaction_sequence": "El número de secuencia de la transacción es", "trust_set_description": "Se establece <1><0>{{amount}} como la cantidad máxima de <3><0>{{currency}} de <5><0>{{issuer}} que <7><0>{{account}} está dispuesta a tener", "payment_desc_line_1": "El pago es desde a ", "the_source_tag_is": "La etiqueta de origen es ", "the_destination_tag_is": "La etiqueta de destino es", "payment_desc_line_4": "Se dieron instrucciones de enviar", "payment_desc_line_5": "gastando hasta", "payment_desc_line_6": "La cantidad real enviada fue", "offer_cancel_description": "La transacción cancelará la oferta existente de la cuenta #", "offer_create_desc_line_1": "La cuenta <1><0>{{account}} se ofrece a pagar <3><0>{{takerGets}}<1><0>{{currency}} a cambio de recibir <5><0>{{takerPays}}<1><0>{{currency}}", "offer_create_desc_line_2": "El tipo de cambio de esta oferta es", "offer_create_desc_line_3": "La transacción cancelará también la oferta existente de la cuenta #", "offer_create_desc_line_5": "Esta oferta es aplicable al dominio permiso", "offer_will_expire_desc": "La oferta expirará el <1><0>{{date}} a no ser que se cancele o se consuma antes", "offer_did_expire_desc": "La oferta expiró el <1><0>{{date}} a no ser que se cancelase o se consumiese antes", "escrow_is_from": "El depósito es desde <1><0>{{account}} a <3><0>{{destination}}", "escrow_is_created_by": "El depósito fue creado por <1><0>{{account}} y los fondos serán devueltos a la misma cuenta", "escrowed_amount": "Se depositó", "escrow_condition": "El depósito tiene una condición de cumplimiento de", "describe_cancel_after": "Se puede cancelar tras", "describe_finish_after": "Se puede finalizar tras", "escrow_completion_desc": "La finalización se descencadenó por", "escrow_completion_desc_2": "La cantidad depositada de <1><0>{{amount}} fue enviada a <3><0>{{destination}}", "escrow_finish_fulfillment_desc": "La condición del depósito fue completada por", "escrow_cancellation_desc": "La cancelación fue producida por", "escrow_cancellation_desc_2": "La cantidad depositada de <1><0>{{amount}} fue devuelta a <3><0>{{owner}}", "escrow_after_transaction_cost": "tras el coste de transacción", "escrow_created_by_desc": "El depósito fue creado por <1><0>{{account}} con la transacción <3><0>{{transaction}}", "set_regular_key_description": "Establece la clave normal de cuenta a", "unset_regular_key_description": "Elimina la clave normal de la cuenta", "set_flag_description": "Establece la bandera de cuenta", "clear_flag_description": "Limpia la bandera de cuenta", "set_domain_description": "Establece el dominio de cuenta como", "set_email_description": "Establece el hash de email de cuenta como", "set_message_key_description": "Establece la clave de mensaje de cuenta como", "set_nftoken_minter_description": "Se establece a <0>{{account}} como el acuñador autorizado para esta cuenta", "deposit_auth": "Se autoriza a <1><0>{{account}} a enviar pagos a esta cuenta", "deposit_unauth": "Se elimina la autorización a <1><0>{{account}} para enviar pagos a esta cuenta", "deposit_auth_credentials": null, "deposit_unauth_credentials": null, "invalid_xrpl_address": "Dirección XRPL inválida", "loading": "Cargando", "get_ledger_failed": "No ha sido posible cargar el libro contable", "get_transaction_failed": "No ha sido posible cargar la transacción", "get_validator_failed": "No ha sido posible cargar el validador", "get_account_state_failed": "No ha sido posible cargar el estado de la cuenta", "get_account_transactions_failed": "No ha sido posible cargar las transacciones de la cuenta", "get_account_transactions_try": "Intentando cargar más transacciones", "pubkey": "clave pública", "node_pubkey": "clave pública del nodo", "ip": "ip", "state": "estado", "rippled_version": "versión", "last_ledger": "último libro contable", "uptime": "activo", "peers": "pares", "in_out": "(entrada:salida)", "ledger_history": "histórico contable", "quorum": "cuórum", "load": "carga", "latency": "latencia", "amendment_id": null, "amendment_name": null, "voters": null, "threshold": null, "consensus": null, "enabled": null, "disabled": null, "on_tx": null, "yes": null, "no": null, "deprecated": null, "domain": "dominio", "unl": "unl", "fee": "comisión", "ledger_interval": "lapso entre libros prom.", "load_fee": "comisión de carga", "txn_sec": "txs/seg.", "txn_ledger": "Txs/libro prom.", "avg_fee": "Comisión Tx Prom.", "txn_count": "núm de txs", "nUnlCol": "nUNL", "nUnl": "VALIDADORES EN nUNL", "fees": "comisiones", "total": "total", "missing": "perdidos", "authorize": "autorizar", "unauthorize": "desautorizar", "missed_validations": "{{count}} validaciones perdidas", "incomplete": "incompleto", "base_fee": null, "account_reserve": null, "object_reserve": null, "vote": null, "no_amendment_in_voting": null, "required": "requerido", "source": "fuente", "destination": "destino", "claimed": "reclamado", "remaining": "restante", "inbound_total": "entrante total", "outbound_total": "saliente total", "payment_channels": "canales de pago", "available_in": "disponible en", "channels": "canales", "account_info": "info de la cuenta", "reserve": "reserva", "current_sequence": "secuencia actual", "escrows": "depósitos", "nodes_found": "nodos encontrados", "unmapped": "no mapeados", "validators_found": "validadores encontrados", "pause": "pausar", "resume": "continuar", "flag_ledger": "Bandera Libro Contable", "ticket": "Ticket", "ticket_sequence": "Secuencia de Ticket", "ticket_count": "Número de Tickets", "ticket_used": "un Ticket fue utilizado para esta Transacción", "token": "Token", "tokens": "Tokens", "total_issuers": "Emisores Totales", "total_tokens": "Tokens Totales", "top_trading_pairs": "Top Pares de Cambio", "issuer_address": "Dirección del Emisor", "obligations": "Obligaciones", "settings": "Ajustes", "rank": "Rank", "market_cap": "Cap. Mercado", "volume_24h": "Volumen (24H)", "no_tokens_message": "No se han encontrado tokens.", "no_pairs_message": "No trading pairs found", "high": "Álto", "low": "Bajo", "rank_message": "Tokens ordenados por número de líneas de confianza.", "obligations_message": "Obligaciones son las cantidades totales de cada token emitido a direcciones", "issuer": "Emisor", "pair": "Par", "asset_pair": null, "offer_range": "Rango de Oferta", "custom_network": "Red Personalizada", "custom_network_input_help": "Introduce la URL de la red personalizada para acceder a la información de la red.", "custom_network_input": "Introduce la URL de la red personalizada", "custom_networks": "Redes Personalizadas", "no_network_selected": "Red Personalizada No Seleccionada", "locking_chain_door": "Bloqueando Puerta de la Cadena", "locking_chain_issue": "Bloqueando Cadena Emisora", "issuing_chain_door": "Emitiendo Puerta de la Cadena", "issuing_chain_issue": "Emitiendo Cadena Emisora", "signature_reward": "Recompensa de Firma", "min_account_create_amount": "Cantidad Mínima de Creación de Cuenta", "other_chain_source": "Otra Fuente de Cadena", "xchain_claim_id": "ID del Reclamo XChain", "check_nft_id": "Por favor, comprueba el ID de tu NFT", "get_nft_state_failed": "No es posible cargar el NFT", "minted": "Acuñado", "taxon_id": "ID Taxón", "transfer_fee": "Comisión de Transferencia", "burnable": "Quemable", "only_xrp": "Sólo XRP", "transferable": "Transferible", "buy_offers": "Ofertas de Compra", "sell_offers": "Ofertas de Venta", "offer_index": "ID de la Oferta", "no_sell_offers": "Sin ofertas de venta", "no_buy_offers": "Sin ofertas de compra", "validator_history.chain": "Cadena", "validator_history.date": "Fecha (UTC)", "validator_history.missed": "Perdidos", "validator_history.score": "Puntuación", "seller": "Vendedor", "buyer": "Comprador", "offerer": "Offerer", "token_taxon": "Taxón Token", "uri": "URI", "owner": "Dueño", "other_chain_destination": "Otro Destino de Cadena", "%_of_total_nodes_validators": "% Total de Nodos y Validadores", "version_display": "Versión: {{version}}", "validator_count": "# de Validadores: {{val_count}}", "node_count": "# de Nodos: {{node_count}}", "current_stable_version": "Versión Estable Actual", "stable_version": "{{stableVersion}}", "nftoken_minter": "Acuñador NFT", "is_burned": "Quemado", "fee_rate": "Tarifa", "last_affecting_transaction": "Última tx afectada", "Version": "Versión", "increased_by": "incrementado por", "trading_fee": "Comisión de Cambio", "tvl": "TVL", "account_address": "Dirección de la Cuenta", "asset1": "Activo 1", "asset2": "Activo 2", "asset1out": "Activo 1 Saliente", "asset2out": "Activo 2 Saliente", "asset1in": "Activo 1 Entrante", "asset2in": "Activo 2 Entrante", "effective_price": "Precio Efectivo", "amm_account_id": "ID de Cuenta AMM", "lp_tokens": "Tokens LP", "min_slot_price": "Precio Mínimo de Puja", "max_slot_price": " Precio Máximo de Puja", "auth_accounts": "Cuentas Autorizadas", "network_cannot_be_crawled": "Esta red no se puede rastrear", "check_crawl_existed": "Por favor, contacta con el operador para asegurarte de que tienen acceso a /crawl o un vl incluido.", "peer_crawled_context": "Para más contexto, mira https://xrpl.org/peer-crawler.html", "xchainbridge": "XChainBridge", "xchain_account_claim_count": "Contador de Reclamación de Cuentas XChain", "xchain_account_create_count": "Contador de Creación de Cuentas XChain", "min_signer_quorum": "Peso mínimo <0>{{quorum}} requerido", "holder": "Titular", "action_from": "<0><0>{{action}} <1><0>{{amount}} desde <3><0>{{destination}}", "action_from_and": null, "claws_back": "Recupera", "claws_back_from": " recupera desde ", "instruct_to_claw": "La cantidad máx recuperada es ", "hook": "Hook", "hooks": "Hooks", "hook_emitted": "esta Transacción fue emitida por un Hook", "emit_details": "Detalles de la Emisión", "hook_parameters": "Parámetros del Hook", "hook_executions": "Ejecuciones del Hook", "emit_generation": "Número <0>{{emit}} en la línea de transacciones generadas", "emit_hook_hash": "Emitido por el hook <0>{{hash}}", "emit_parent": "Emitido por un hook disparado por <0>{{hash}}", "emit_callback": "La llamada de vuelta emitida es <0>{{callback}}<0>", "hook_exec_hash": "Ha disparado el hook <0>{{hash}}", "hook_exec_account": "En la cuenta <0>{{account}}", "hook_exec_return": "Devuelto el código <0>{{code}} con la cadena \"<1>{{string}}\"", "hook_exec_emit_count": "Emitida/s <0>{{count}} transacción/es", "hash": "Hash", "grant": "Subvención", "namespace": "Espacio de Nombres", "api_version": "Versión API", "triggered_on": "Activado En", "name": "Nombre", "introduced_in": "Introducido en", "yeas": "síes", "nays": "noes", "eta": "eta", "amendment_summary": "Resumen de la enmienda", "not": "no", "enable_tx": "TX de activación", "all": "todos", "yeas_count": "# de votos Sí: {{yeas_count}}", "nays_count": "# de votos No: {{nays_count}}", "yeas_percent": "% de votos Sí: {{yeas_percent}}%", "nays_percent": "% de votos No: {{nays_percent}}%", "%_of_validators": "% de validadores", "amendment_not_found": "Enmienda no encontrada", "check_amendment_key": "Por favor, comprueba tu llave de enmienda", "did_document": "Documento DID", "attestation": "Atestado", "note": "Nota", "indicate_unl": "indica a un validador en una UNL", "transaction_tokens_involved": " y ", "transaction_tokens_swapped": " por ", "oracle_document_id": "ID del Documento de Oracle", "provider": "Proveedor", "last_update_time": "Última Hora de Actualización", "asset_class": "Clase de Activo", "trading_pairs": "Pares de Comercio", "deleted": "Eliminado", "holders_count": "Titulares: {{holders}}", "trustlines": "LÍNEAS DE CONFIANZA: {{trustlines}}", "website": "Sitio Web", "mpt_issuance_id": "ID de Emisión MPT", "asset_scale": "Escala del Activo", "metadata": "Metadatos", "max_amount": "Cantidad Máxima", "mpt_holder": "Titular MPT", "check_mpt_id": "Por favor, verifica tu ID de Emisión MPT", "outstanding_amount": "Cantidad Emitida", "locked": "Bloqueado", "can_lock": "Se Puede Bloquear", "require_auth": "Requiere Autenticación", "can_escrow": "Puede Hacer Escrow", "can_trade": "Puede Comerciar", "can_transfer": "Puede Transferir", "can_clawback": "Puede Recuperar", "enable_amendment_name": null, "amendment_status": null, "expected_date": null, "base": null, "credential_type": null, "credential_issuer": null, "subject": null, "expiration": null, "domain_id": null, "accepted_credentials": null, "credential_ids": null, "data": null, "finish_function": null, "quorum_description": null, "avg_fee_description": null, "ledger_interval_description": null, "txn_ledger_description": null, "txn_sec_description": null, "load_fee_description": null, "nUnl_description": null, "computation_allowance": null, "gas": null, "delegate": null, "permissions": null, "pertaining_to_the_Permissioned_Domain": null, "tx_delegated_to": null, "account_delegates_to": null, "delegate_to": null, "volume": null, "holders": null, "trades": null, "no_of_tokens": null, "volume_24h_total": null, "volume_24h_total_description": null, "market_cap_metric_description": null, "market_cap_description": null, "24h_description": null, "volume_description": null, "trades_description": null, "tvl_description": null, "stablecoin_description": null, "stablecoin": null, "wrapped": null, "tokens_footnote": null, "xrplmeta_guidelines": null, "inner_transaction": null, "batch_table_detail_count": null, "batch_table_detail_list": null, "batch_description": null, "batch": null, "successful": null, "failed": null, "not-validated": null, "asset": null, "assets_maximum": null, "mptoken_metadata": null, "withdrawal_policy": null, "account_creates_vault": null, "vault_id": null, "single_asset_vault": null, "loan_broker_id": null, "loan_id": null, "management_fee_rate": null, "debt_maximum": null, "cover_rate_minimum": null, "cover_rate_liquidation": null, "counterparty": null, "principal_requested": null, "payment_total": null, "payment_interval": null, "grace_period": null, "loan_origination_fee": null, "loan_service_fee": null, "late_payment_fee": null, "close_payment_fee": null, "full_payment_fee": null, "overpayment_fee": null, "interest_rate": null, "late_interest_rate": null, "close_interest_rate": null, "overpayment_interest_rate": null, "set_vault_data": null, "set_vault_assets_maximum": null, "set_vault_domain_id": null, "account_deposits_into_vault": null, "account_withdraws_from_vault": null, "account_clawbacks_from_vault": null, "account_clawbacks_from_vault_amount_omitted": null, "account_deletes_vault": null, "vault_create_table_detail": null, "withdraws": null, "deletes": null, "vault_delete_table_detail": null, "account_flag_title_lsf_global_freeze": null, "account_flag_title_lsf_disable_master": null, "account_flag_title_lsf_default_ripple": null, "account_flag_title_lsf_allow_trustline_clawback": null, "account_flag_title_lsf_allow_trustline_locking": null, "account_flag_title_lsf_require_destination_tag": null, "account_flag_title_lsf_no_freeze": null, "account_flag_title_lsf_require_auth": null, "account_flag_title_lsf_disallow_xrp": null, "account_flag_title_lsf_disallow_incoming_trustline": null, "account_flag_title_lsf_disallow_incoming_pay_chan": null, "account_flag_title_lsf_disallow_incoming_nft_token_offer": null, "account_flag_title_asf_authorized_nft_token_minter": null, "account_flag_title_lsf_disallow_incoming_check": null, "account_flag_title_lsf_deposit_auth": null, "account_flag_title_asf_account_txn_id": null, "account_flag_description_lsf_global_freeze": null, "account_flag_description_lsf_disable_master": null, "account_flag_description_lsf_default_ripple": null, "account_flag_description_lsf_allow_trustline_clawback": null, "account_flag_description_lsf_allow_trustline_locking": null, "account_flag_description_lsf_require_destination_tag": null, "account_flag_description_lsf_no_freeze": null, "account_flag_description_lsf_require_auth": null, "account_flag_description_lsf_disallow_xrp": null, "account_flag_description_lsf_disallow_incoming_trustline": null, "account_flag_description_lsf_disallow_incoming_pay_chan": null, "account_flag_description_lsf_disallow_incoming_nft_token_offer": null, "account_flag_description_asf_authorized_nft_token_minter": null, "account_flag_description_lsf_disallow_incoming_check": null, "account_flag_description_lsf_deposit_auth": null, "account_flag_description_asf_account_txn_id": null, "account_page_address": null, "account_page_address_tag": null, "account_page_classic_address": null, "account_page_deleted_account_label": null, "account_page_deleted_account_warning": null, "account_page_extended_address": null, "account_page_domain": null, "account_page_reserve_balance": null, "account_page_xrp_balance": null, "account_page_xrp_balance_in_usd": null, "account_page_account_properties": null, "account_page_flags": null, "account_page_flag_status_enabled": null, "account_page_flag_status_disabled": null, "account_page_signers": null, "account_page_signer_weight": null, "account_page_details": null, "account_page_current_sequence": null, "account_page_ticket_count": null, "account_page_email_hash": null, "account_page_payment_channels": null, "account_page_payment_channels_text": null, "account_page_nft_minter": null, "account_page_asset_held_title": null, "account_page_asset_issued_title": null, "account_page_asset_tab_iou": null, "account_page_asset_tab_lptoken": null, "account_page_asset_tab_mpt": null, "account_page_asset_tab_nft": null, "account_page_asset_table_column_amm_instance": null, "account_page_asset_table_column_amm_pair": null, "account_page_asset_table_column_asset_class": null, "account_page_asset_table_column_balance": null, "account_page_asset_table_column_balance_usd": null, "account_page_asset_table_column_circulating_supply": null, "account_page_asset_table_column_currency_code": null, "account_page_asset_table_column_frozen": null, "account_page_asset_table_column_highest_bid": null, "account_page_asset_table_column_holders": null, "account_page_asset_table_column_issuer": null, "account_page_asset_table_column_locked": null, "account_page_asset_table_column_lowest_ask": null, "account_page_asset_table_column_price_usd": null, "account_page_asset_table_column_share": null, "account_page_asset_table_column_supply": null, "account_page_asset_table_column_ticker": null, "account_page_asset_table_column_token_id": null, "account_page_asset_table_column_transfer_fee": null, "account_page_asset_table_column_trustlines": null, "account_page_asset_table_column_url": null, "account_page_asset_table_mpt_locked_global": null, "account_page_asset_table_mpt_locked_individual": null, "account_page_asset_table_no_iou": null, "account_page_asset_table_no_lptoken": null, "account_page_asset_table_no_mpt": null, "account_page_asset_table_no_nft": null, "tx_hash": null, "timestamp": null, "amount_in": null, "amount_out": null, "rate": null, "refresh_data": null, "token_page.general_overview": null, "token_page.market_data": null, "token_page.all_tx": null, "token_page.dex_tx": null, "token_page.transfers_tx": null, "token_page.holders_table": null, "token_page.issuer": null, "token_page.price": null, "token_page.holders": null, "token_page.supply": null, "token_page.market_cap": null, "token_page.volume_24h": null, "token_page.trades_24h": null, "token_page.amm_tvl": null, "token_page.transfer_fee": null, "token_page.holders_rank": null, "token_page.holders_num_tokens": null, "token_page.holders_percent_supply": null, "token_page.holders_no_holders": null, "token_page.holders_usd_value": null, "token_page.transfers_no_transfers": null, "token_page.circulating_supply": null, "token_page.dex_type": null, "token_page.dex_amount_in_tooltip": null, "token_page.dex_amount_out_tooltip": null, "token_page.dex_rate_tooltip": null, "token_page.dex_no_trades": null, "token_page.token_label": null, "token_page.category_text": null, "token_type.iou": null, "token_type.mpt": null, "iou_page.trustlines": null, "mpt_page.metadata_warning": null, "data_available_from_notice": null, "copied": null, "click_to_copy": null, "withdraw": null, "delete": null, "rates": null, "loan_broker_rates_detail": null, "loan_rates_detail": null, "loan_fees_detail": null, "loan_terms_detail": null, "no_limit": null, "first_loss_capital": null, "vault": null, "vault_not_found": null, "invalid_vault_id": null, "check_vault_id": null, "get_vault_failed": null, "private_vault": null, "perm_domain_id": null, "total_value_locked": null, "shares": null, "assets_available": null, "unrealized_loss": null, "other_data": null, "max_total_supply": null, "available_to_borrow": null, "not_available": null, "first_come_first_served": null, "loans": null, "loan_broker": null, "total_debt": null, "maximum_debt": null, "management_fee": null, "borrower": null, "amount_requested": null, "outstanding_balance": null, "loan_status_current": null, "loan_status_default": null, "all_loans": null, "loan_status_impaired": null, "loan_status_paid_off": null, "next_due_date": null, "origination_date": null, "frequency": null, "installments": null, "prepayment_fee": null, "no_loans_message": null, "loan_default_detected": null, "no_loan_brokers_message": null, "depositors_fetch_error": null, "no_depositors_message": null, "depositors": null, "percent_of_supply": null, "value": null, "currency_toggle_help": null, "currency_toggle_description": null, "currency_toggle_loading": null, "currency_toggle_loading_description": null, "currency_toggle_unavailable": null, "currency_toggle_unavailable_description": null, "vaults": null, "vaults_tvl": null, "vaults_tvl_description": null, "vaults_outstanding_loans": null, "vaults_outstanding_loans_description": null, "vaults_loans_originated": null, "vaults_loans_originated_description": null, "vaults_avg_interest_rate": null, "vaults_avg_interest_rate_description": null, "vaults_num_vaults": null, "vaults_num_vaults_description": null, "vaults_utilization_ratio": null, "vaults_utilization_ratio_description": null, "vaults_filter_all_assets": null, "vaults_filter_stablecoins": null, "vaults_search_placeholder": null, "vaults_table_vault_id": null, "vaults_table_asset": null, "vaults_table_tvl": null, "vaults_table_outstanding_loans": null, "vaults_table_utilization_ratio": null, "vaults_table_avg_interest_rate": null, "vaults_table_website": null, "vaults_no_results": null, "vaults_disclaimer": null, "amm_pool": null, "basic_info": null, "market_data": null, "auction": null, "created_on": null, "volume_24h_tooltip": null, "fees_24h": null, "fees_24h_tooltip": null, "apr_24h": null, "apr_24h_tooltip": null, "current_holder": null, "discounted_fee": null, "price_paid": null, "replacement_cost": null, "all_transactions": null, "dex_trades": null, "deposits": null, "withdrawals": null, "lp_tokens_received": null, "lp_tokens_redeemed": null, "tvl_and_volume": null, "no_deposits": null, "no_withdrawals": null, "liquidity_providers": null, "balance": null, "lp_token_currency_code": null, "asset_2": null, "usd_value": null, "amm_pool_deleted_label": null, "amm_pool_deleted_text": null, "amms": null, "top_1000_amms": null, "general_info": null, "number_of_amms": null, "number_of_lps": null, "number_of_amms_tooltip": null, "number_of_lps_tooltip": null, "search_amms": null, "tvl_tooltip": null, "volume_24h_all_tooltip": null } ================================================ FILE: public/locales/fr-FR/translations.json ================================================ { "action": "action", "assets": "Actifs", "assets.no_nfts_message": "Aucun NFT trouvé.", "assets.no_mpts_message": null, "network": "Réseau", "amendments": null, "network_name": "Réseau inconnu", "network_name_testnet": "Testnet", "network_name_mainnet": "Mainnet", "network_name_devnet": "Devnet", "network_name_xahau_mainnet": "Xahau Mainnet", "network_name_xahau_testnet": "Xahau Testnet", "network_name_custom": "Personnalisé", "app.meta.description": "Explorateur XRPL", "app.meta.author": "Ripple", "explorer": "Explorateur", "xrpl_org": "XRPL.org", "github": "GitHub", "header.search.placeholder": "Rechercher par adresse, registre ou transaction", "xrp": "XRP", "xrpl_explorer": "Explorateur XRPL", "ledgers": "Registres", "ledger": "Registre", "taxon": "Taxon", "token_id": "Token ID", "token_transactions": "Transactions du token", "transactions": "Transactions", "transaction_short": "TX", "nodes": "Noeuds", "validator": "Validateur", "validators": "Validateurs", "upgrade_status": "Statut des versions", "version": "v{{number}}", "component_error": "Une erreur s'est produite!", "1H": "1H", "24H": "24H", "30D": "30J", "total_transactions": "# de Txns", "total_fees": "Frais Totaux", "async_component_failed": "Impossible de charger le composant", "account_not_found": "Compte non trouvé", "account_empty_title": "Aucun id de compte n'a été fourni", "account_empty_hint": "Saisissez un id de compte dans le champs de recherche", "check_account_id": "Vérifiez votre ID de compte", "accounts.xrp_balance": "Solde XRP", "accounts.other_balances": "Autres soldes", "accounts.other_balances_short": "Soldes", "amount": "Montant", "currency_code": "Code FX", "currency_balance": "Solde <0>{{currency}}", "load_more_action": "Charger plus...", "account_transactions": "Transactions", "transaction_type": "Type de transaction", "transaction_action_CANCEL": "Annulé", "transaction_action_CREATE": "Créé", "transaction_action_FINISH": "Confirmé", "transaction_action_MODIFY": "Modifié", "transaction_action_SEND": "Transféré", "transaction_category_ACCOUNT": "Compte", "transaction_category_DEX": "Dex (AMM, Offres, Trust Sets, Tokens)", "transaction_category_NFT": "NFT", "transaction_category_PAYMENT": "Paiement", "transaction_category_PSEUDO": "Pseudo-Tx", "transaction_category_XCHAIN": null, "transaction_category_OTHER": null, "transaction_legend_toggle_hide": "Masquer la légende", "transaction_legend_toggle_show": "Afficher la légende", "transactions.date_header": "Date/heure (UTC)", "no_transactions_message": "Aucune transaction trouvée", "get_vault_transactions_failed": null, "retry_action": "Réessayer...", "uh_oh": "Oups!", "not_found_default_title": "Page non trouvée", "not_found_check_url": "Veuillez vérifier l'URL", "not_found": "Non trouvé", "hash_not_found": null, "buy": "Acheter", "sell": "Vendre", "price": "Prix", "ledger_index": "Index du ledger", "to": "à", "from": "de", "request": null, "terms": null, "send": "Envoyer", "delivered": "Livré", "cancel_offer": "Annuler l'offre", "convert_maximum": "Convertir le Max", "convert_to": "Convertir en", "using_at_most": "Utiliser au maximum", "partial_payment_allowed": "paiement partiel autorisé", "set_limit": "Limite de confiance", "escrow": "séquestre", "cancel_escrow": "annuler le séquestre", "finish_escrow": "terminez le séquestre", "escrow_amount": "montant du séquestre", "escrow_destination": "destination du séquestre", "escrow_transaction": "transaction de séquestre", "escrow_condition_short": "condition de séquestre", "escrow_fulfillment": "exécution du séquestre", "condition": "état", "fulfillment": "execution", "cancel_after": "annuler ensuite", "finish_after": "finir ensuite", "settle_delay": "Délai de règlement", "channel_id": "Identifiant du canal", "seconds": "secondes", "seconds_short": "sec.", "regular_key": "clé", "unset_regular_key": "clé non définie", "unset_signer_list": "liste de signataires non définie", "set_flag": "définir un tag", "clear_flag": "supprimer le tag", "email_hash": "hash du mail", "message_key": "clé du message", "out_of": "de", "weight": "poids", "the_account": "Le compte", "create_payment_channel": "créera un canal de paiement à", "destination_tag": "tag de destination", "source_tag": "tag de la source", "channel_settle_delay": "Le canal a un délai de confirmation de", "the_channel_id_is": "L'ID de la chaîne est", "the_channel_amount_is": "Le montant du canal est", "update_payment_channel": "Le canal de paiement sera mis à jour", "the_channel_balance_is": "Le solde du canal récupéré est de", "amm_delete_description": "Tentative de suppression de l'AMM pour er .", "amm_delete_description_caveat": "Si il y a plus de 512 trustlines, seules 512 trustlines seront supprimées.", "payment_channel_closed_description": "Le canal de paiement sera fermé, tout solde restant sera retourné au compte source", "set_signer_list_description": "Fixe le quorum minimum de signataires à {{quorum}} avec la liste suivante de signataires", "unset_signer_list_description": "Tous les signataires du compte ont été supprimés", "transaction_initiated_by": "La transaction a été initiée par", "increase_channel_amount_by": "Le montant du canal sera augmenté de", "channel_amount_increase": "augmenter le montant du canal", "channel_amount": "montant du canal", "total_claimed": "total réclamé", "amount_claimed": "montant réclamé", "close_request": "demande de fermeture de canal", "renew_channel": "renouveler le canal", "payment_channel_closed": "Le canal de paiement est fermé", "paychannel_node_line1": "Il <1><0>{{action}} un nœud PayChannel de <3><0>{{account}} à <5><0>{{counterAccount}}", "paychannel_amount_changed": "Montant modifié de <1><0>{{difference}}<1><0>{{currency}} de <3><0>{{previous}}<1><0>{{currency}} à <5><0>{{final}}<1><0>{{currency}}", "paychannel_balance_changed": "Le solde a changé de <1><0>{{différence}}<1><0>{{devise}} de <3><0>{{précédent}}<1><0>{{devise}} à <5><0>{{final}}<1><0>{{devise}}", "setfee_fees_description": "Les futures transactions nécessiteront des frais minimum de .", "setfee_reserves_description": "Les comptes doivent désormais détenir une base de et un supplément de pour chaque objet supplémentaire dont le compte est propriétaire.", "setfee_docs_description": "Voir la documentation : <0>Frais", "setfee_base_fee": "Frais de base", "setfee_reserve": "Réserve", "setfee_reserve_increment": "Incrément de réserve", "formatted_date": "Date/Heure ({{timeZone}})", "transaction_type_name_AMMCreate": "AMM créé", "transaction_type_name_AMMDelete": "AMM supprimé", "transaction_type_name_AMMDeposit": "Dépôt sur un AMM", "transaction_type_name_AMMWithdraw": "Retrait depuis un AMM", "transaction_type_name_AMMVote": "Vote AMM", "transaction_type_name_AMMBid": "Offre AMM créée", "transaction_type_name_AMMClawback": null, "transaction_type_name_AccountSet": "Compte défini", "transaction_type_name_Batch": null, "transaction_type_name_CheckCancel": "Chèque annulé", "transaction_type_name_CheckCash": "Chèque remis", "transaction_type_name_CheckCreate": "Chèque créé", "transaction_type_name_CredentialAccept": null, "transaction_type_name_CredentialCreate": null, "transaction_type_name_CredentialDelete": null, "transaction_type_name_DelegateSet": null, "transaction_type_name_DIDDelete": null, "transaction_type_name_DIDSet": null, "transaction_type_name_DepositPreauth": "Dépôt préautorisé", "transaction_type_name_Error_Cases": "Cas d'erreur", "transaction_type_name_EscrowCancel": "séquestre annulé", "transaction_type_name_EscrowCreate": "séquestre créé", "transaction_type_name_EscrowFinish": "Séquestre finalisé", "transaction_type_name_Invoke": "Invocation", "transaction_type_name_LoanBrokerSet": null, "transaction_type_name_LoanBrokerDelete": null, "transaction_type_name_LoanBrokerCoverDeposit": null, "transaction_type_name_LoanBrokerCoverWithdraw": null, "transaction_type_name_LoanBrokerCoverClawback": null, "transaction_type_name_LoanSet": null, "transaction_type_name_LoanDelete": null, "transaction_type_name_LoanManage": null, "transaction_type_name_LoanPay": null, "transaction_type_name_MPTokenIssuanceCreate": null, "transaction_type_name_MPTokenIssuanceDestroy": null, "transaction_type_name_MPTokenIssuanceSet": null, "transaction_type_name_MPTokenAuthorize": null, "transaction_type_name_NFTokenAcceptOffer": "Offre NFT acceptée", "transaction_type_name_NFTokenBurn": "NFT détruit", "transaction_type_name_NFTokenCancelOffer": "Offre NFT annulée", "transaction_type_name_NFTokenCreateOffer": "Offre NFT créée", "transaction_type_name_NFTokenMint": "NFT forgé", "transaction_type_name_OfferCancel": "Offre annulée", "transaction_type_name_OfferCreate": "Offre créée", "transaction_type_name_OracleDelete": null, "transaction_type_name_OracleSet": null, "transaction_type_name_Payment": "Paiement effectué", "transaction_type_name_PaymentChannelClaim": "Canal de paiement réclamé", "transaction_type_name_PaymentChannelCreate": "Canal de paiement créé", "transaction_type_name_PaymentChannelFund": "Canal provisionné", "transaction_type_name_PermissionedDomainDelete": null, "transaction_type_name_PermissionedDomainSet": null, "transaction_type_name_SetHook": "Crochet enregistré", "transaction_type_name_SetRegularKey": "Clé régulière définie", "transaction_type_name_SignerListSet": "Liste de signataires établie", "transaction_type_name_TicketCreate": "Ticket créé", "transaction_type_name_TrustSet": "Ligne de confiance créée", "transaction_type_name_VaultCreate": null, "transaction_type_name_VaultSet": null, "transaction_type_name_VaultDeposit": null, "transaction_type_name_VaultWithdraw": null, "transaction_type_name_VaultClawback": null, "transaction_type_name_VaultDelete": null, "transaction_type_name_XChainAccountCreateCommit": "Compte XChain créé", "transaction_type_name_XChainAddAccountCreateAttestation": "Attestation de compte xChain créée", "transaction_type_name_XChainAddClaimAttestation": "Attestation de Réclamation XChain créée", "transaction_type_name_XChainClaim": "Réclamation XChain effectuée", "transaction_type_name_XChainCommit": "Enregistrement XChain créé", "transaction_type_name_XChainCreateBridge": "Pont XChain créé", "transaction_type_name_XChainCreateClaimID": "ID de réclamation XChain créé", "transaction_type_name_XChainModifyBridge": "Pont XChain modifié", "transaction_type_name_EnableAmendment": "Amendement activé", "transaction_type_name_SetFee": "Frais définis", "transaction_type_name_UNLModify": "UNL modifié", "transaction_type_name_AccountDelete": "Compte supprimé", "generic_error": "Une erreur s'est produite", "not_your_fault": "Ce n'est probablement pas de votre faute", "come_back_later": "L'action sera bientôt disponible", "invalid_ledger_id": "L'identifiant du registre est invalide", "invalid_transaction_hash": "Le hash de la transaction est invalide", "ledger_not_found": "Registre introuvable", "check_ledger_id": "Veuillez vérifier votre id de registre", "server_ledgers_hint": "Ce nœud ({{connection.server.publicKey, truncate(length: 10)}}) ne contient que les registres {{connection.ledger.validated}}.", "use_search": "Merci d'utiliser notre outil de recherche", "ledger_has_no_trans": "Ce registre n'a aucune transaction.", "less_than": "Moins de", "transaction_not_found": "Transaction non trouvée.", "transaction_empty_title": "Aucun hash de transaction fourni", "transaction_empty_hint": "Entrez un hash de transaction dans la zone de recherche", "validator_not_found": "Validateur non trouvé", "check_transaction_hash": "Veuillez vérifier le hash de la transaction", "wrong_network": null, "check_validator_key": "Veuillez vérifier la clé du validateur", "transaction": "Transaction", "success": "Succès", "fail": "Échec", "simple": "Simple", "detailed": "Détailé", "details": "Détails", "history": "Histoire", "voting": null, "raw": "Brut", "expand": "Développer", "collapse": "Réduire", "try_detailed_raw": "Essayez la \"Vue détaillée\" ou la \"Vue brute\"", "account": "Compte", "transaction_cost": "Coût de transaction", "transaction_cost_short": "Coût de Tx.", "sequence_number": "Numéro de séquence", "sequence_number_short": "Séquence #", "serial": "Numéro de série", "n_a": "ND", "memos": "Mémos", "flags": "Etiquettes", "status": "Statut", "successful_transaction": "Cette transaction est confirmée", "fail_transaction": "Cette transaction a échoué avec un code de statut de <0>{{code}}", "transaction_validated": " et inscrite dans le registre ", "on": " en date du ", "description": "Description", "signers": "Signataires", "decoded_hex": "hexadécimal décodé", "transaction_consumed_fee": "L'envoi de cette transaction a consommé ", "meta": "Métadonnées", "number_of_affected_node": "La transaction a affecté {{count}} nœuds dans le registre.", "nodes_type": "{{action}} nodes", "node_meta_type": "It {{action}} a node with type", "transaction_balance_line_one": "It <1><0>{{action}} a <3><0>{{currency}} RippleState node between <5><0>{{account}} and <7><0>{{counterAccount}}", "transaction_balance_line_two": "Solde modifié de <1><0>{{change}}: de <3><0>{{previousBalance}} à <5><0>{{finalBalance}}", "transaction_outstanding_balance_line_two": null, "transaction_owned_directory": "It {{action}} a DirectoryNode node owned by", "transaction_unowned_directory": "It {{action}} a DirectoryNode node", "transaction_mptoken_line_one": null, "transaction_mpt_issuance_line_one": null, "owned_account_root": "It {{action}} the AccountRoot node of", "unowned_account_root": "It {{action}} the AccountRoot node", "account_balance_increased": "Solde augmenté de <1><0>{{difference}}<1><0>{{currency}}: de <3><0>{{previous}}<1><0>{{currency}} à <5><0>{{final}}<1><0>{{currency}}", "account_balance_decreased": "Solde diminué de <1><0>{{différence}}<1><0>{{devise}}: de <3><0>{{précédent}}<1><0>{{devise}} à <5><0>{{final}}<1><0>{{devise}}", "decreased_from_to": "diminué de <1><0>{{change}}: de <3><0>{{previous}} à <5><0>{{final}}", "offer_node_meta": "It <1><0>{{action}} a <3><0>{{pair}} offer node owned by <5><0>{{account}} with sequence # <7><0>{{sequence}}", "offer_replaces": "Cette offre remplace l'offre existante #", "offer_partially_filled": "L'offre a été partiellement remplie.", "offer_filled": "L'offre a été comblée.", "offer_cancelled": "L'offre a été annulée.", "offer_replaced": "Cette offre a été remplacée par la nouvelle offre #", "offer_lack_of_funds": "L'offre a été partiellement remplie, puis annulée en raison d'un manque de fonds.", "transaction_sequence": "Le numéro de séquence de la transaction est le", "trust_set_description": "Établit que le montant maximum que <7><0>{{account}} est prêt à détenir en provenance de <5><0>{{issuer}} est de <1><0>{{amount}}<3><0>{{currency}}.", "payment_desc_line_1": "Le paiement est de à .", "the_source_tag_is": "L'étiquette source est", "the_destination_tag_is": "L'étiquette de destination est", "payment_desc_line_4": "Il a été instruit de livrer", "payment_desc_line_5": "en dépensant jusqu'à", "payment_desc_line_6": "La quantité réelle livrée était de", "offer_cancel_description": "La transaction annulera l'offre existante du compte #", "offer_create_desc_line_1": "Le compte <1><0>{{account}} offre de payer <3><0>{{takerGets}}<1><0>{{currency}} pour recevoir <5><0>{{takerPays}}<1><0>{{currency}}", "offer_create_desc_line_2": "Le taux de change pour cette offre est de ", "offer_create_desc_line_3": "La transaction annulera également l'offre existante du compte #", "offer_create_desc_line_5": "Cette offre est applicable au domaine permis", "offer_will_expire_desc": "L'offre expire le {{date}} sauf annulation ou consommation préalable.", "offer_did_expire_desc": "L'offre expire le <1><0>{{date}} sauf annulation ou consommation préalable.", "escrow_is_from": "Le séquestre est de <1><0>{{account}} à <3><0>{{destination}}", "escrow_is_created_by": "Le séquestre a été créé par <1><0>{{account}} et les fonds seront retournés au même compte.", "escrowed_amount": "Mis en séquestre", "escrow_condition": "Le séquestre a une condition de réalisation", "describe_cancel_after": "Peur être annulé après", "describe_finish_after": "Peut être terminé après", "escrow_completion_desc": "La finalisation a été déclenchée par", "escrow_completion_desc_2": "Le montant en séquestre de <1><0>{{amount}} a été remis à <3><0>{{destination}}", "escrow_finish_fulfillment_desc": "La condition de séquestre est remplie par", "escrow_cancellation_desc": "L'annulation a été déclenchée par", "escrow_cancellation_desc_2": "Le montant placé en séquestre de <1><0>{{amount}} a été restitué à <3><0>{{owner}}", "escrow_after_transaction_cost": "frais après transaction", "escrow_created_by_desc": "Le séquestre a été créé par <1><0>{{account}} avec la transaction <3><0>{{transaction}}", "set_regular_key_description": "Définit la clé régulière du compte en tant que", "unset_regular_key_description": "Supprime la clé régulière du compte.", "set_flag_description": "Définit l'étiquette du compte", "clear_flag_description": "Efface l'étiquette du compte", "set_domain_description": "Définit le domaine du compte en tant que", "set_email_description": "Définit le hash de l'email du compte.", "set_message_key_description": "Définit la clé du message du compte en tant que", "set_nftoken_minter_description": "Définit <0>{{account}} comme le forgeur autorisé pour ce compte.", "deposit_auth": "Autorise <1><0>{{account}} à envoyer des paiements vers ce compte.", "deposit_unauth": "Supprime l'autorisation pour <1><0>{{account}} d'envoyer des paiements à ce compte.", "deposit_auth_credentials": null, "deposit_unauth_credentials": null, "invalid_xrpl_address": "Adresse XRPL invalide", "loading": "Chargement en cours", "get_ledger_failed": "Impossible de charger le registre", "get_transaction_failed": "Impossible de charger la transaction", "get_validator_failed": "Impossible de charger le validateur.", "get_account_state_failed": "Impossible de charger l'état du compte", "get_account_transactions_failed": "Impossible de charger les transactions du compte", "get_account_transactions_try": "Essayer de charger plus de transactions", "pubkey": "clé publique", "node_pubkey": "clé publique de nœud", "ip": "adresse IP", "state": "état", "rippled_version": "version", "last_ledger": "dernier registre", "uptime": "disponibilité", "peers": "pairs", "in_out": "(entrée:sortie)", "ledger_history": "historique", "quorum": "quorum", "load": "charger", "latency": "latence", "amendment_id": null, "amendment_name": null, "voters": null, "threshold": null, "consensus": null, "enabled": null, "disabled": null, "on_tx": null, "yes": null, "no": null, "deprecated": null, "domain": "domaine", "unl": "unl", "fee": "frais", "ledger_interval": "registre toutes les", "load_fee": "frais d'initialisation", "txn_sec": "txn/sec.", "txn_ledger": "moy. txn/compte", "avg_fee": "Frais moyen", "txn_count": "Transactions", "nUnlCol": "nUNL", "nUnl": "VALIDATEURS SUR nUNL", "fees": "frais", "total": "total", "missing": "manquant", "authorize": "autoriser", "unauthorize": "non autorisé", "missed_validations": "{{count}} validations manquées", "incomplete": "incomplet", "base_fee": null, "account_reserve": null, "object_reserve": null, "vote": null, "no_amendment_in_voting": null, "required": "requis", "source": "source", "destination": "destination", "claimed": "revendiqué", "remaining": "reste", "inbound_total": "total entrant", "outbound_total": "total sortant", "payment_channels": "canaux de paiement", "available_in": "disponible dans", "channels": "canaux", "account_info": "informations du compte", "reserve": "réserve", "current_sequence": "séquence actuelle", "escrows": "séquestres", "nodes_found": "nœuds trouvés", "unmapped": "non répertoriés", "validators_found": "validateurs trouvés", "pause": "mettre en pause", "resume": "reprendre", "flag_ledger": "Marquer le ledger", "ticket": "Ticket", "ticket_sequence": "Séquence de tickets", "ticket_count": "Nombre de tickets", "ticket_used": "Un ticket a été utilisé pour cette transaction.", "token": "Jeton", "tokens": "Jetons", "total_issuers": "Émetteurs totaux", "total_tokens": "Total des jetons", "top_trading_pairs": "Principales paires", "issuer_address": "Adresse de l'émetteur", "obligations": "Obligations", "settings": "Paramètres", "rank": "Rang", "market_cap": "Capitalisation", "volume_24h": "Volume (24H)", "no_tokens_message": "Aucun jeton trouvé.", "no_pairs_message": "Aucune paire trouvée", "high": "Élevé", "low": "Bas", "rank_message": "Les jetons sont classés par nombre de lignes de confiance.", "obligations_message": "Les obligations sont les montants totaux de chaque jeton émis aux adresses.", "issuer": "Émetteur", "pair": "Paire", "asset_pair": null, "offer_range": "Plage d'offre", "custom_network": "Réseau personnalisé", "custom_network_input_help": "Entrez l'URL personnalisée du réseau pour accéder aux données du réseau.", "custom_network_input": "Tapez l'URL du réseau personnalisé", "custom_networks": "Réseaux personnalisés", "no_network_selected": "Aucun réseau personnalisé sélectionné", "locking_chain_door": "Point d'accès à la chaîne séquestre", "locking_chain_issue": "Problème sur la chaine séquestre", "issuing_chain_door": "Point d'accès à la chaîne d'origine", "issuing_chain_issue": "Chaîne d'émission", "signature_reward": "Frais de signature", "min_account_create_amount": "Montant minimum pour la création de compte", "other_chain_source": "Autre source de chaîne.", "xchain_claim_id": "XChain Claim ID: Identifiant de réclamation XChain", "check_nft_id": "Veuillez vérifier votre identifiant NFT.", "get_nft_state_failed": "Impossible de charger le NFT.", "minted": "Forgé", "taxon_id": "Identifiant de taxon", "transfer_fee": "Frais de transfert", "burnable": "Destructible", "only_xrp": "Uniquement XRP", "transferable": "Transférable", "buy_offers": "Offres d'achat", "sell_offers": "Offres de vente", "offer_index": "ID de l'offre", "no_sell_offers": "Aucune offre de vente", "no_buy_offers": "Aucune offre d'achat", "validator_history.chain": "Chaîne", "validator_history.date": "Date (UTC)", "validator_history.missed": "Manqué", "validator_history.score": "Score", "seller": "Vendeur", "buyer": "Acheteur", "offerer": "Offrant", "token_taxon": "Taxon du jeton", "uri": "URI", "owner": "Propriétaire", "other_chain_destination": "Autre destination de chaîne", "%_of_total_nodes_validators": "% des nœuds et des validateurs", "version_display": "Version: {{version}}", "validator_count": "nb de Validateurs: {{val_count}}", "node_count": "nb de Nœuds: {{node_count}}", "current_stable_version": "Version Stable Actuelle", "stable_version": "{{stableVersion}}", "nftoken_minter": "Créateur du NFT", "is_burned": "Détruit", "fee_rate": "Frais", "last_affecting_transaction": "Dernière transaction affectée", "Version": "Version", "increased_by": "augmenté de", "trading_fee": "Commission", "tvl": "TVL", "account_address": "Adresse du compte", "asset1": "Actif 1", "asset2": "Actif 2", "asset1out": "Actif 1 Sortant", "asset2out": "Actif 2 Sortant", "asset1in": "Actif 1 Entrant", "asset2in": "Actif 2 Entrant", "effective_price": "Prix effectif", "amm_account_id": "Identifiant du compte AMM", "lp_tokens": "Jetons LP", "min_slot_price": "Prix minimum de l'emplacement", "max_slot_price": "Prix maximum de l'emplacement", "auth_accounts": "Comptes autorisés", "network_cannot_be_crawled": "Ce réseau ne peut pas être exploré.", "check_crawl_existed": "Veuillez contacter l'opérateur pour vous assurer qu'il dispose d'un accès /crawl accessible ou d'un ensemble vl.", "peer_crawled_context": "Pour plus de contexte, voir https://xrpl.org/peer-crawler.html", "xchainbridge": "Pont XChain", "xchain_account_claim_count": "Nombre de réclamations de compte XChain", "xchain_account_create_count": "Nombre de compte XChain créés", "min_signer_quorum": "Poids minimum <0>{{quorum}} requis.", "holder": "Titulaire", "action_from": "<0><0>{{action}} <1><0>{{amount}} de <3><0>{{destination}}", "action_from_and": null, "claws_back": "Recouvrement", "claws_back_from": "Recouvrement de ", "instruct_to_claw": "Le montant maximum récupérable est de .", "hook": "Hook", "hooks": "Hooks", "hook_emitted": "Cette transaction a été émise par un hook.", "emit_details": "Détails de l'émission", "hook_parameters": "Paramètres du hook", "hook_executions": "Exécutions de crochet", "emit_generation": "Nombre <0>{{emit}} dans la ligne des transactions générées.", "emit_hook_hash": "Émis par le crochet <0>{{hash}}", "emit_parent": "Émis par un crochet déclenché par <0>{{hash}}", "emit_callback": "Le rappel d'émission est <0>{{callback}}<0>", "hook_exec_hash": "Le hook <0>{{hash}} a été déclenché", "hook_exec_account": "Sur le compte <0>{{account}}", "hook_exec_return": "Le code retourné est <0>{{code}} avec la valeur \"<1>{{string}}\".", "hook_exec_emit_count": "<0>{{count}} transactions émises", "hash": "Hash", "grant": "Allocation", "namespace": "Espace de noms", "api_version": "Version API", "triggered_on": "Déclenché Par", "name": null, "introduced_in": null, "yeas": null, "nays": null, "eta": null, "amendment_summary": null, "not": null, "enable_tx": null, "all": null, "yeas_count": null, "nays_count": null, "yeas_percent": null, "nays_percent": null, "%_of_validators": null, "amendment_not_found": null, "check_amendment_key": null, "did_document": null, "attestation": null, "note": null, "indicate_unl": null, "transaction_tokens_involved": null, "transaction_tokens_swapped": null, "oracle_document_id": null, "provider": null, "last_update_time": null, "asset_class": null, "trading_pairs": null, "deleted": null, "holders_count": null, "trustlines": null, "website": null, "mpt_issuance_id": null, "asset_scale": null, "metadata": null, "max_amount": null, "mpt_holder": null, "check_mpt_id": null, "outstanding_amount": null, "locked": null, "can_lock": null, "require_auth": null, "can_escrow": null, "can_trade": null, "can_transfer": null, "can_clawback": null, "enable_amendment_name": null, "amendment_status": null, "expected_date": null, "base": null, "credential_type": null, "credential_issuer": null, "subject": null, "expiration": null, "domain_id": null, "accepted_credentials": null, "credential_ids": null, "data": null, "finish_function": null, "quorum_description": null, "avg_fee_description": null, "ledger_interval_description": null, "txn_ledger_description": null, "txn_sec_description": null, "load_fee_description": null, "nUnl_description": null, "computation_allowance": null, "gas": null, "delegate": null, "permissions": null, "pertaining_to_the_Permissioned_Domain": null, "tx_delegated_to": null, "account_delegates_to": null, "delegate_to": null, "volume": null, "holders": null, "trades": null, "no_of_tokens": null, "volume_24h_total": null, "volume_24h_total_description": null, "market_cap_metric_description": null, "market_cap_description": null, "24h_description": null, "volume_description": null, "trades_description": null, "tvl_description": null, "stablecoin_description": null, "stablecoin": null, "wrapped": null, "tokens_footnote": null, "xrplmeta_guidelines": null, "inner_transaction": null, "batch_table_detail_count": null, "batch_table_detail_list": null, "batch_description": null, "batch": null, "successful": null, "failed": null, "not-validated": null, "asset": null, "assets_maximum": null, "mptoken_metadata": null, "withdrawal_policy": null, "account_creates_vault": null, "vault_id": null, "single_asset_vault": null, "loan_broker_id": null, "loan_id": null, "management_fee_rate": null, "debt_maximum": null, "cover_rate_minimum": null, "cover_rate_liquidation": null, "counterparty": null, "principal_requested": null, "payment_total": null, "payment_interval": null, "grace_period": null, "loan_origination_fee": null, "loan_service_fee": null, "late_payment_fee": null, "close_payment_fee": null, "full_payment_fee": null, "overpayment_fee": null, "interest_rate": null, "late_interest_rate": null, "close_interest_rate": null, "overpayment_interest_rate": null, "set_vault_data": null, "set_vault_assets_maximum": null, "set_vault_domain_id": null, "account_deposits_into_vault": null, "account_withdraws_from_vault": null, "account_clawbacks_from_vault": null, "account_clawbacks_from_vault_amount_omitted": null, "account_deletes_vault": null, "vault_create_table_detail": null, "withdraws": null, "deletes": null, "vault_delete_table_detail": null, "account_flag_title_lsf_global_freeze": null, "account_flag_title_lsf_disable_master": null, "account_flag_title_lsf_default_ripple": null, "account_flag_title_lsf_allow_trustline_clawback": null, "account_flag_title_lsf_allow_trustline_locking": null, "account_flag_title_lsf_require_destination_tag": null, "account_flag_title_lsf_no_freeze": null, "account_flag_title_lsf_require_auth": null, "account_flag_title_lsf_disallow_xrp": null, "account_flag_title_lsf_disallow_incoming_trustline": null, "account_flag_title_lsf_disallow_incoming_pay_chan": null, "account_flag_title_lsf_disallow_incoming_nft_token_offer": null, "account_flag_title_asf_authorized_nft_token_minter": null, "account_flag_title_lsf_disallow_incoming_check": null, "account_flag_title_lsf_deposit_auth": null, "account_flag_title_asf_account_txn_id": null, "account_flag_description_lsf_global_freeze": null, "account_flag_description_lsf_disable_master": null, "account_flag_description_lsf_default_ripple": null, "account_flag_description_lsf_allow_trustline_clawback": null, "account_flag_description_lsf_allow_trustline_locking": null, "account_flag_description_lsf_require_destination_tag": null, "account_flag_description_lsf_no_freeze": null, "account_flag_description_lsf_require_auth": null, "account_flag_description_lsf_disallow_xrp": null, "account_flag_description_lsf_disallow_incoming_trustline": null, "account_flag_description_lsf_disallow_incoming_pay_chan": null, "account_flag_description_lsf_disallow_incoming_nft_token_offer": null, "account_flag_description_asf_authorized_nft_token_minter": null, "account_flag_description_lsf_disallow_incoming_check": null, "account_flag_description_lsf_deposit_auth": null, "account_flag_description_asf_account_txn_id": null, "account_page_address": null, "account_page_address_tag": null, "account_page_classic_address": null, "account_page_deleted_account_label": null, "account_page_deleted_account_warning": null, "account_page_extended_address": null, "account_page_domain": null, "account_page_reserve_balance": null, "account_page_xrp_balance": null, "account_page_xrp_balance_in_usd": null, "account_page_account_properties": null, "account_page_flags": null, "account_page_flag_status_enabled": null, "account_page_flag_status_disabled": null, "account_page_signers": null, "account_page_signer_weight": null, "account_page_details": null, "account_page_current_sequence": null, "account_page_ticket_count": null, "account_page_email_hash": null, "account_page_payment_channels": null, "account_page_payment_channels_text": null, "account_page_nft_minter": null, "account_page_asset_held_title": null, "account_page_asset_issued_title": null, "account_page_asset_tab_iou": null, "account_page_asset_tab_lptoken": null, "account_page_asset_tab_mpt": null, "account_page_asset_tab_nft": null, "account_page_asset_table_column_amm_instance": null, "account_page_asset_table_column_amm_pair": null, "account_page_asset_table_column_asset_class": null, "account_page_asset_table_column_balance": null, "account_page_asset_table_column_balance_usd": null, "account_page_asset_table_column_circulating_supply": null, "account_page_asset_table_column_currency_code": null, "account_page_asset_table_column_frozen": null, "account_page_asset_table_column_highest_bid": null, "account_page_asset_table_column_holders": null, "account_page_asset_table_column_issuer": null, "account_page_asset_table_column_locked": null, "account_page_asset_table_column_lowest_ask": null, "account_page_asset_table_column_price_usd": null, "account_page_asset_table_column_share": null, "account_page_asset_table_column_supply": null, "account_page_asset_table_column_ticker": null, "account_page_asset_table_column_token_id": null, "account_page_asset_table_column_transfer_fee": null, "account_page_asset_table_column_trustlines": null, "account_page_asset_table_column_url": null, "account_page_asset_table_mpt_locked_global": null, "account_page_asset_table_mpt_locked_individual": null, "account_page_asset_table_no_iou": null, "account_page_asset_table_no_lptoken": null, "account_page_asset_table_no_mpt": null, "account_page_asset_table_no_nft": null, "tx_hash": null, "timestamp": null, "amount_in": null, "amount_out": null, "rate": null, "refresh_data": null, "token_page.general_overview": null, "token_page.market_data": null, "token_page.all_tx": null, "token_page.dex_tx": null, "token_page.transfers_tx": null, "token_page.holders_table": null, "token_page.issuer": null, "token_page.price": null, "token_page.holders": null, "token_page.supply": null, "token_page.market_cap": null, "token_page.volume_24h": null, "token_page.trades_24h": null, "token_page.amm_tvl": null, "token_page.transfer_fee": null, "token_page.holders_rank": null, "token_page.holders_num_tokens": null, "token_page.holders_percent_supply": null, "token_page.holders_no_holders": null, "token_page.holders_usd_value": null, "token_page.transfers_no_transfers": null, "token_page.circulating_supply": null, "token_page.dex_type": null, "token_page.dex_amount_in_tooltip": null, "token_page.dex_amount_out_tooltip": null, "token_page.dex_rate_tooltip": null, "token_page.dex_no_trades": null, "token_page.token_label": null, "token_page.category_text": null, "token_type.iou": null, "token_type.mpt": null, "iou_page.trustlines": null, "mpt_page.metadata_warning": null, "data_available_from_notice": null, "copied": null, "click_to_copy": null, "withdraw": null, "delete": null, "rates": null, "loan_broker_rates_detail": null, "loan_rates_detail": null, "loan_fees_detail": null, "loan_terms_detail": null, "no_limit": null, "first_loss_capital": null, "vault": null, "vault_not_found": null, "invalid_vault_id": null, "check_vault_id": null, "get_vault_failed": null, "private_vault": null, "perm_domain_id": null, "total_value_locked": null, "shares": null, "assets_available": null, "unrealized_loss": null, "other_data": null, "max_total_supply": null, "available_to_borrow": null, "not_available": null, "first_come_first_served": null, "loans": null, "loan_broker": null, "total_debt": null, "maximum_debt": null, "management_fee": null, "borrower": null, "amount_requested": null, "outstanding_balance": null, "loan_status_current": null, "loan_status_default": null, "all_loans": null, "loan_status_impaired": null, "loan_status_paid_off": null, "next_due_date": null, "origination_date": null, "frequency": null, "installments": null, "prepayment_fee": null, "no_loans_message": null, "loan_default_detected": null, "no_loan_brokers_message": null, "depositors_fetch_error": null, "no_depositors_message": null, "depositors": null, "percent_of_supply": null, "value": null, "currency_toggle_help": null, "currency_toggle_description": null, "currency_toggle_loading": null, "currency_toggle_loading_description": null, "currency_toggle_unavailable": null, "currency_toggle_unavailable_description": null, "vaults": null, "vaults_tvl": null, "vaults_tvl_description": null, "vaults_outstanding_loans": null, "vaults_outstanding_loans_description": null, "vaults_loans_originated": null, "vaults_loans_originated_description": null, "vaults_avg_interest_rate": null, "vaults_avg_interest_rate_description": null, "vaults_num_vaults": null, "vaults_num_vaults_description": null, "vaults_utilization_ratio": null, "vaults_utilization_ratio_description": null, "vaults_filter_all_assets": null, "vaults_filter_stablecoins": null, "vaults_search_placeholder": null, "vaults_table_vault_id": null, "vaults_table_asset": null, "vaults_table_tvl": null, "vaults_table_outstanding_loans": null, "vaults_table_utilization_ratio": null, "vaults_table_avg_interest_rate": null, "vaults_table_website": null, "vaults_no_results": null, "vaults_disclaimer": null, "amm_pool": null, "basic_info": null, "market_data": null, "auction": null, "created_on": null, "volume_24h_tooltip": null, "fees_24h": null, "fees_24h_tooltip": null, "apr_24h": null, "apr_24h_tooltip": null, "current_holder": null, "discounted_fee": null, "price_paid": null, "replacement_cost": null, "all_transactions": null, "dex_trades": null, "deposits": null, "withdrawals": null, "lp_tokens_received": null, "lp_tokens_redeemed": null, "tvl_and_volume": null, "no_deposits": null, "no_withdrawals": null, "liquidity_providers": null, "balance": null, "lp_token_currency_code": null, "asset_2": null, "usd_value": null, "amm_pool_deleted_label": null, "amm_pool_deleted_text": null, "amms": null, "top_1000_amms": null, "general_info": null, "number_of_amms": null, "number_of_lps": null, "number_of_amms_tooltip": null, "number_of_lps_tooltip": null, "search_amms": null, "tvl_tooltip": null, "volume_24h_all_tooltip": null } ================================================ FILE: public/locales/ja-JP/translations.json ================================================ { "action": "アクション", "assets": "資産", "assets.no_nfts_message": "NFTが見つかりません。", "assets.no_mpts_message": null, "network": "ネットワーク", "amendments": "Amendment", "network_name": "不明なネットワーク", "network_name_testnet": "Testnet", "network_name_mainnet": "Mainnet", "network_name_devnet": "Devnet", "network_name_xahau_mainnet": "Xahau Mainnet", "network_name_xahau_testnet": "Xahau Testnet", "network_name_custom": "Custom", "app.meta.description": "XRPLネットワークエクスプローラ", "app.meta.author": "Ripple", "explorer": "エクスプローラ", "xrpl_org": "XRPL.org", "github": "GitHub", "header.search.placeholder": "トークン、アドレス、Ledger、トランザクションで検索", "xrp": "XRP", "xrpl_explorer": "XRPL エクスプローラ", "ledgers": null, "ledger": null, "taxon": null, "token_id": null, "token_transactions": "Tokenトランザクション", "transactions": "トランザクション", "transaction_short": "TX", "nodes": "ノード", "validator": "バリデータ", "validators": "バリデータ", "upgrade_status": "アップグレード情報", "version": null, "component_error": "不具合が発生しました!", "1H": "1時間", "24H": "24時間", "30D": "30日", "total_transactions": "トランザクション数", "total_fees": "合計トランザクション手数料", "async_component_failed": "コンポーネントの読み込みに失敗しました", "account_not_found": "アカウントが見つかりません", "account_empty_title": "アカウントIDが入力されていません", "account_empty_hint": "検索欄にアカウントIDを入力してください", "check_account_id": "アカウント IDを確認してください", "accounts.xrp_balance": "XRP 残高", "accounts.other_balances": "その他の残高", "accounts.other_balances_short": "その他残高", "amount": "金額", "currency_code": "通貨名", "currency_balance": "<0>{{currency}} 残高", "load_more_action": "さらに読み込む...", "account_transactions": "アカウントのトランザクション", "transaction_type": "タイプ", "transaction_action_CANCEL": "キャンセル", "transaction_action_CREATE": "作成", "transaction_action_FINISH": "終了", "transaction_action_MODIFY": "変更", "transaction_action_SEND": "送信", "transaction_category_ACCOUNT": "アカウント", "transaction_category_DEX": "Dex (AMM, オファー, トラストライン, トークン)", "transaction_category_NFT": "NFT", "transaction_category_PAYMENT": "支払い", "transaction_category_PSEUDO": "擬似Tx", "transaction_category_XCHAIN": null, "transaction_category_OTHER": null, "transaction_legend_toggle_hide": "凡例を閉じる", "transaction_legend_toggle_show": "凡例を開く", "transactions.date_header": "日付/時刻 (UTC)", "no_transactions_message": "該当するトランザクションはありません。", "get_vault_transactions_failed": null, "retry_action": "再試行...", "uh_oh": "うわっ!", "not_found_default_title": "ページが見つかりません", "not_found_check_url": "URLを再確認してください", "not_found": "見つかりません", "hash_not_found": null, "buy": "買い", "sell": "売り", "price": "価格", "ledger_index": "Ledgerインデックス", "to": "送信先", "from": "送信元", "request": null, "terms": null, "send": "送金", "delivered": "送金済み", "cancel_offer": "オファー取消", "convert_maximum": "最大変換量", "convert_to": "変換先", "using_at_most": "最大送信量", "partial_payment_allowed": "部分支払いが許可されています", "set_limit": "トラスト制限額の設定", "escrow": "エスクロー", "cancel_escrow": "エスクローのキャンセル", "finish_escrow": "エスクローの終了", "escrow_amount": "エスクローの金額", "escrow_destination": "エスクローの宛先", "escrow_transaction": "エスクロートランザクション", "escrow_condition_short": "エスクローの条件", "escrow_fulfillment": "エスクローの履行", "condition": "条件", "fulfillment": "履行", "cancel_after": "キャンセル可能日時", "finish_after": "終了可能日時", "settle_delay": "決済待機時間", "channel_id": "チャンネルID", "seconds": "秒", "seconds_short": "秒", "regular_key": "レギュラーキー", "unset_regular_key": "レギュラーキーの解除", "unset_signer_list": "署名者リストの解除", "set_flag": "フラグの設定", "clear_flag": "フラグの解除", "email_hash": "メールアドレスのハッシュ", "message_key": "メッセージキー", "out_of": "of", "weight": "定足数", "the_account": null, "create_payment_channel": null, "destination_tag": "宛先タグ", "source_tag": "送信元タグ", "channel_settle_delay": null, "the_channel_id_is": null, "the_channel_amount_is": null, "update_payment_channel": null, "the_channel_balance_is": null, "amm_delete_description": null, "amm_delete_description_caveat": null, "payment_channel_closed_description": null, "set_signer_list_description": "アカウントの署名者の最小定足数を {{quorum}} に設定します", "unset_signer_list_description": "アカウントからすべての署名者を削除します", "transaction_initiated_by": null, "increase_channel_amount_by": null, "channel_amount_increase": null, "channel_amount": null, "total_claimed": null, "amount_claimed": null, "close_request": null, "renew_channel": null, "payment_channel_closed": null, "paychannel_node_line1": null, "paychannel_amount_changed": null, "paychannel_balance_changed": null, "setfee_fees_description": "今後のトランザクションは手数料として最低 が必要となります。", "setfee_reserves_description": "アカウントは、 の基本準備金と、そのアカウントが所有する追加のオブジェクトごとに、追加の を保持する必要が生じました。", "setfee_docs_description": "ドキュメントをご覧ください: <0>Fees", "setfee_base_fee": "基本手数料", "setfee_reserve": "アカウント準備金", "setfee_reserve_increment": "オブジェクト準備金", "formatted_date": "日付/時間 ({{timeZone}})", "transaction_type_name_AMMCreate": "AMMの作成", "transaction_type_name_AMMDelete": "AMMの削除", "transaction_type_name_AMMDeposit": "AMMへの預入", "transaction_type_name_AMMWithdraw": "AMMからの引出", "transaction_type_name_AMMVote": "AMMへの投票", "transaction_type_name_AMMBid": "AMMへの入札", "transaction_type_name_AMMClawback": null, "transaction_type_name_AccountSet": "アカウント設定", "transaction_type_name_Batch": null, "transaction_type_name_CheckCancel": "チェックの取消", "transaction_type_name_CheckCash": "チェックの現金化", "transaction_type_name_CheckCreate": "チェックの作成", "transaction_type_name_CredentialAccept": null, "transaction_type_name_CredentialCreate": null, "transaction_type_name_CredentialDelete": null, "transaction_type_name_DelegateSet": null, "transaction_type_name_DIDDelete": null, "transaction_type_name_DIDSet": null, "transaction_type_name_DepositPreauth": "入金の事前承認", "transaction_type_name_Error_Cases": "エラーケース", "transaction_type_name_EscrowCancel": "エスクローの取消", "transaction_type_name_EscrowCreate": "エスクローの作成", "transaction_type_name_EscrowFinish": "エスクロー終了", "transaction_type_name_Invoke": "呼び出し", "transaction_type_name_LoanBrokerSet": null, "transaction_type_name_LoanBrokerDelete": null, "transaction_type_name_LoanBrokerCoverDeposit": null, "transaction_type_name_LoanBrokerCoverWithdraw": null, "transaction_type_name_LoanBrokerCoverClawback": null, "transaction_type_name_LoanSet": null, "transaction_type_name_LoanDelete": null, "transaction_type_name_LoanManage": null, "transaction_type_name_LoanPay": null, "transaction_type_name_MPTokenIssuanceCreate": null, "transaction_type_name_MPTokenIssuanceDestroy": null, "transaction_type_name_MPTokenIssuanceSet": null, "transaction_type_name_MPTokenAuthorize": null, "transaction_type_name_NFTokenAcceptOffer": "NFTオファーの承認", "transaction_type_name_NFTokenBurn": "NFTのバーン", "transaction_type_name_NFTokenCancelOffer": "NFTオファーの取り消し", "transaction_type_name_NFTokenCreateOffer": "NFTオファーの作成", "transaction_type_name_NFTokenMint": "NFTのミント", "transaction_type_name_OfferCancel": "オファーの取消", "transaction_type_name_OfferCreate": "オファーの作成", "transaction_type_name_OracleDelete": "オラクルの削除", "transaction_type_name_OracleSet": "オラクルの設定", "transaction_type_name_Payment": "支払い", "transaction_type_name_PaymentChannelClaim": "ペイメントチャネル請求", "transaction_type_name_PaymentChannelCreate": "ペイメントチャネル作成", "transaction_type_name_PaymentChannelFund": "ペイメントチャネル資金", "transaction_type_name_PermissionedDomainDelete": null, "transaction_type_name_PermissionedDomainSet": null, "transaction_type_name_SetHook": "Hookの設定", "transaction_type_name_SetRegularKey": "レギュラーキーの設定", "transaction_type_name_SignerListSet": "署名者リスト設定", "transaction_type_name_TicketCreate": "チケットの作成", "transaction_type_name_TrustSet": "トラスト設定", "transaction_type_name_VaultCreate": null, "transaction_type_name_VaultSet": null, "transaction_type_name_VaultDeposit": null, "transaction_type_name_VaultWithdraw": null, "transaction_type_name_VaultClawback": null, "transaction_type_name_VaultDelete": null, "transaction_type_name_XChainAccountCreateCommit": null, "transaction_type_name_XChainAddAccountCreateAttestation": null, "transaction_type_name_XChainAddClaimAttestation": null, "transaction_type_name_XChainClaim": null, "transaction_type_name_XChainCommit": null, "transaction_type_name_XChainCreateBridge": null, "transaction_type_name_XChainCreateClaimID": null, "transaction_type_name_XChainModifyBridge": null, "transaction_type_name_EnableAmendment": "Amendmentの有効化", "transaction_type_name_SetFee": "手数料設定", "transaction_type_name_UNLModify": "UNLの変更", "transaction_type_name_AccountDelete": "アカウントの削除", "generic_error": "不具合が発生しました", "not_your_fault": "システム側のエラーの可能性があります", "come_back_later": "今後利用可能になる予定です", "invalid_ledger_id": "Ledger IDが無効です", "invalid_transaction_hash": "トランザクションのハッシュ値が無効です", "ledger_not_found": "Ledgerが見つかりません", "check_ledger_id": "Ledger IDを確認してください", "server_ledgers_hint": null, "use_search": "検索機能をご利用ください", "ledger_has_no_trans": "Ledgerにはトランザクションがありません", "less_than": "未満", "transaction_not_found": "トランザクションが見つかりません", "transaction_empty_title": "トランザクションハッシュが指定されていません", "transaction_empty_hint": "検索欄にトランザクションハッシュを入力してください", "validator_not_found": "バリデータが見つかりません", "check_transaction_hash": "トランザクションのハッシュ値を確認してください", "wrong_network": null, "check_validator_key": "バリデータのキーを確認してください", "transaction": "トランザクション", "success": "成功", "fail": "失敗", "simple": "シンプル", "detailed": "詳細", "details": "詳細", "history": "履歴", "voting": "投票中", "raw": "生データ", "expand": "展開", "collapse": "折りたたみ", "try_detailed_raw": "`詳細`または`生データ`をご覧ください。", "account": "アカウント", "transaction_cost": "トランザクション手数料", "transaction_cost_short": "手数料", "sequence_number": "シーケンス番号", "sequence_number_short": "シーケンス番号", "serial": "シリアル", "n_a": "該当なし", "memos": "メモ", "flags": "フラグ", "status": "ステータス", "successful_transaction": "このトランザクションは正常に終了しました。", "fail_transaction": "このトランザクションの処理に失敗しました。ステータスコードは <0>{{code}} です", "transaction_validated": "次のLedgerで検証済です :", "on": null, "description": "説明", "signers": "署名者", "decoded_hex": "デコード済16進数", "transaction_consumed_fee": "このトランザクションでの消費XRP量: ", "meta": "メタデータ", "number_of_affected_node": "次の {{count}} のノードが変更されました。", "nodes_type": "{{action}} ノード", "node_meta_type": "ノードを {{action}} します: ", "transaction_balance_line_one": "<5><0>{{account}} と <7><0>{{counterAccount}} の間の <3><0>{{currency}} RippleState ノードを <1><0>{{action}} しました。", "transaction_balance_line_two": "残高が <1><0>{{change}} 変更され、<3><0>{{previousBalance}} から <5><0>{{finalBalance}} になりました。", "transaction_outstanding_balance_line_two": null, "transaction_owned_directory": "次の所有者のDirectoryNodeノードを {{action}} しました :", "transaction_unowned_directory": "DirectoryNodeノードを {{action}} しました。", "transaction_mptoken_line_one": null, "transaction_mpt_issuance_line_one": null, "owned_account_root": "次のアカウントのAccountRootノードを {{action}} しました: ", "unowned_account_root": "AccountRootノードを {{action}} しました。", "account_balance_increased": "残高が <1><0>{{diffrence}}<1><0>{{currency}} 増加し、<3><0>{{previous}}<1><0>{{currency}} から <5><0>{{final}}<1><0>{{currency}} になりました。", "account_balance_decreased": "残高が <1><0>{{difference}}<1><0>{{currency}} 減少し、<3><0>{{previous}}<1><0>{{currency}} から <5><0>{{final}}<1><0>{{currency}} になりました。", "decreased_from_to": "は <1><0>{{change}} 減少させ、<3><0>{{previous}} から <5><0>{{final}} になりました。", "offer_node_meta": "シーケンス番号 <7><0>{{sequence}} の <5><0>{{account}} の <3><0>{{pair}} オファーノードを <1><0>{{action}} しました。", "offer_replaces": "このオファーは次のオファー番号を置換します: ", "offer_partially_filled": "オファーの一部が約定しました。", "offer_filled": "オファーが約定しました。", "offer_cancelled": "オファーは取り消されました。", "offer_replaced": "このオファーは次の新しいオファー番号に置換されました: ", "offer_lack_of_funds": "オファーの一部は約定しましたが、資金不足のため取り消されました。", "transaction_sequence": "トランザクションのシーケンス番号: ", "trust_set_description": "<7><0>{{account}} が保持可能な <5><0>{{issuer}} からの <3><0>{{currency}} の最大額は、<1><0>{{amount}} に設定されました。", "payment_desc_line_1": "支払いは、 から に対して行われます", "the_source_tag_is": "支払い元のタグは", "the_destination_tag_is": "支払い先のタグは", "payment_desc_line_4": "支払い指示の額は", "payment_desc_line_5": "、許容する支払い限度額は", "payment_desc_line_6": "実際に支払われた額は", "offer_cancel_description": "トランザクションによって、アカウントの次のオファー番号が取り消されました: ", "offer_create_desc_line_1": "<1><0>{{account}} は、<5><0>{{takerPays}}<1><0>{{currency}} を取得するために、<3><0>{{takerGets}}<1><0>{{currency}} を支払うオファーを作成しました。", "offer_create_desc_line_2": "このオファーの変換レートは", "offer_create_desc_line_3": "トランザクションによって、アカウントの次のオファー番号も取り消されます :", "offer_create_desc_line_5": "このオファーは許可ドメインに適用されます", "offer_will_expire_desc": "オファーは、それまでに取り消されるか約定しない限り、<1><0>{{date}} に失効します。", "offer_did_expire_desc": "オファーは <1><0>{{date}} に失効しました。", "escrow_is_from": "エスクローは、<1><0>{{account}} から <3><0>{{destination}} に行われます。", "escrow_is_created_by": "エスクローは <1><0>{{account}} によって作成されており、資金は同じアカウントに返金されます。", "escrowed_amount": "次の金額がエスクローされました:", "escrow_condition": "エスクローの履行条件: ", "describe_cancel_after": "次の日時以降にキャンセル可能です: ", "describe_finish_after": "次の日時以降に終了可能です: ", "escrow_completion_desc": "次のアカウントにより執行が発動されました: ", "escrow_completion_desc_2": "エスクローされた <1><0>{{amount}} は <3><0>{{destination}} へ送金されました。", "escrow_finish_fulfillment_desc": "次のアカウントにより履行されました: ", "escrow_cancellation_desc": "次のアカウントにり取り消しが執行されました: ", "escrow_cancellation_desc_2": "エスクローされた <1><0>{{amount}} は <3><0>{{owner}} へ返金されました。", "escrow_after_transaction_cost": null, "escrow_created_by_desc": "エスクローは <1><0>{{account}} のトランザクション <3><0>{{transaction}} によって作成されました。", "set_regular_key_description": "このアカウントのレギュラーキーを次のアカウントに設定しました: ", "unset_regular_key_description": "このアカウントのレギュラーキーを削除しました。", "set_flag_description": "アカウントのフラグを設定しました: ", "clear_flag_description": "アカウントのフラグを削除しました: ", "set_domain_description": "アカウントのドメインを設定しました: ", "set_email_description": "アカウントのメールアドレスハッシュを設定しました: ", "set_message_key_description": "アカウントのメッセージキーを設定しました: ", "set_nftoken_minter_description": "<0>{{account}} をNFTの認可発行者として設定しました。", "deposit_auth": "<1><0>{{account}} からの送金を許可しました", "deposit_unauth": "<1><0>{{account}} からの送金の許可を削除しました", "deposit_auth_credentials": null, "deposit_unauth_credentials": null, "invalid_xrpl_address": "不正なXRPLアドレスです", "loading": "読み込み中", "get_ledger_failed": "レジャ情報ーを取得することができません", "get_transaction_failed": "トランザクション情報を取得することができません", "get_validator_failed": "バリデータ情報を取得することができません", "get_account_state_failed": "アカウント情報を取得することができません", "get_account_transactions_failed": "アカウントのトランザクションを取得することができません", "get_account_transactions_try": null, "pubkey": "公開鍵", "node_pubkey": "ノードの公開鍵", "ip": "IPアドレス", "state": "状態", "rippled_version": "バージョン", "last_ledger": "最新レジャー", "uptime": "稼働時間", "peers": "ピア", "in_out": "(in:out)", "ledger_history": "レジャー履歴", "quorum": "定足数", "load": "読み込み", "latency": "遅延", "amendment_id": null, "amendment_name": "Amendment名", "voters": "投票", "threshold": "閾値", "consensus": "合意", "enabled": "有効", "disabled": null, "on_tx": null, "yes": "はい", "no": "いいえ", "deprecated": "非推奨", "domain": "ドメイン", "unl": "unl", "fee": "手数料", "ledger_interval": "平均レジャーインターバル", "load_fee": "トランザクション手数料", "txn_sec": "txn/秒", "txn_ledger": "平均トランザクション数/レジャー", "avg_fee": "平均トランザクション手数料", "txn_count": "txn数", "nUnlCol": "nUNL", "nUnl": "nUNLバリデータ", "fees": "手数料", "total": "合計", "missing": "欠落", "authorize": null, "unauthorize": null, "missed_validations": "バリデーション失敗数:{{count}}", "incomplete": null, "base_fee": "基本手数料", "account_reserve": "アカウント準備金", "object_reserve": "オブジェクト準備金", "vote": "投票", "no_amendment_in_voting": "投票中のAmendmentはありません", "required": "必須", "source": "送金元", "destination": "宛先", "claimed": "請求済み", "remaining": "残り", "inbound_total": "受信合計", "outbound_total": "送信合計", "payment_channels": "ペイメントチャンネル", "available_in": null, "channels": "チャンネル", "account_info": "アカウント情報", "reserve": "準備金", "current_sequence": "現在のシーケンス", "escrows": "エスクロー", "nodes_found": "検出されたノード", "unmapped": "マッピングなし", "validators_found": "検出されたバリデータ", "pause": "停止", "resume": "再開", "flag_ledger": "フラグレジャー", "ticket": "チケット", "ticket_sequence": "チケットシーケンス番号", "ticket_count": "チケット数", "ticket_used": "このトランザクションではチケットが使用されました", "token": "トークン", "tokens": "トークン", "total_issuers": "総発行者数", "total_tokens": "トークン総計", "top_trading_pairs": "上位の取引ペア", "issuer_address": "発行者アドレス", "obligations": "負債", "settings": "設定", "rank": "ランク", "market_cap": "時価総額", "volume_24h": "取引高 (24H)", "no_tokens_message": "トークンが見つかりません", "no_pairs_message": "売買ペアが見つかりません", "high": "高", "low": "安", "rank_message": "トークンはトラストラインの数でランク付けされています。", "obligations_message": "負債とは、アドレスに対して発行された各トークンの総額のことです", "issuer": "発行者", "pair": "ペア", "asset_pair": null, "offer_range": "オファーの範囲", "custom_network": "カスタムネットワーク", "custom_network_input_help": "ネットワークのデータにアクセスするためのカスタムネットワークURLを入力してください。", "custom_network_input": "カスタムネットワークのURLを入力してください", "custom_networks": "カスタムネットワーク", "no_network_selected": "カスタムネットワークが選択されていません", "locking_chain_door": null, "locking_chain_issue": null, "issuing_chain_door": null, "issuing_chain_issue": null, "signature_reward": null, "min_account_create_amount": null, "other_chain_source": null, "xchain_claim_id": null, "check_nft_id": "NFT IDを確認してください", "get_nft_state_failed": "NFTの情報を取得することができません", "minted": "ミント", "taxon_id": null, "transfer_fee": "ロイヤリティ", "burnable": null, "only_xrp": null, "transferable": null, "buy_offers": "購入オファー", "sell_offers": "売却オファー", "offer_index": "オファーID", "no_sell_offers": "売却オファーがありません", "no_buy_offers": "購入オファーがありません", "validator_history.chain": "チェーン", "validator_history.date": "日付 (UTC)", "validator_history.missed": "失敗", "validator_history.score": "スコア", "seller": "売却者", "buyer": "購入者", "offerer": "オファー所有者", "token_taxon": null, "uri": "URI", "owner": "所有者", "other_chain_destination": null, "%_of_total_nodes_validators": null, "version_display": "バージョン: {{version}}", "validator_count": "バリデータの数: {{val_count}}", "node_count": "ノードの数: {{node_count}}", "current_stable_version": "現在の安定バージョン", "stable_version": null, "nftoken_minter": "NFT発行者", "is_burned": "バーン済み", "fee_rate": "手数料レート", "last_affecting_transaction": "最新の関連トランザクション", "Version": "バージョン", "increased_by": null, "trading_fee": "取引手数料", "tvl": "TVM", "account_address": "アカウントアドレス", "asset1": "資産1", "asset2": "資産2", "asset1out": "資産1 出金", "asset2out": "資産2 出金", "asset1in": "資産1 入金", "asset2in": "資産2 入金", "effective_price": null, "amm_account_id": "AMMアカウント", "lp_tokens": "LPトークン", "min_slot_price": "最小スロット価格", "max_slot_price": "最大スロット価格", "auth_accounts": "認可されたアカウント", "network_cannot_be_crawled": null, "check_crawl_existed": null, "peer_crawled_context": null, "xchainbridge": null, "xchain_account_claim_count": null, "xchain_account_create_count": null, "min_signer_quorum": null, "holder": null, "action_from": null, "action_from_and": null, "claws_back": null, "claws_back_from": null, "instruct_to_claw": null, "hook": "Hook", "hooks": "Hooks", "hook_emitted": "このトランザクションはHookによって作成されました", "emit_details": "Emitの詳細", "hook_parameters": "Hookパラメータ", "hook_executions": "Hookの実行", "emit_generation": "作成されたトランザクションのNumber <0>{{emit}}", "emit_hook_hash": "Hook {{hash}} によって作成されました", "emit_parent": "トランザクション <0>{{hash}} にトリガーされたHookによって作成されました", "emit_callback": "Emitコールバックは <0>{{callback}}<0>", "hook_exec_hash": "Hook {{hash}} がトリガーされました", "hook_exec_account": "アカウント: <0>{{account}}", "hook_exec_return": "結果: \"{{string}}\" ,コード: {{code}}", "hook_exec_emit_count": "このHookから{{count}}トランザクションが作成されました", "hash": "Hash", "grant": null, "namespace": "ネームスペース", "api_version": "APIバージョン", "triggered_on": "次のトランザクションによってトリガー", "name": "名称", "introduced_in": "導入されたバージョン", "yeas": "賛成", "nays": "反対", "eta": "予定時刻", "amendment_summary": "Amendmentの概要", "not": null, "enable_tx": null, "all": null, "yeas_count": "賛成票: {{yeas_count}}", "nays_count": "反対票: {{nays_count}}", "yeas_percent": "賛成票の割合: {{yeas_percent}}%", "nays_percent": "反対票の割合: {{nays_percent}}%", "%_of_validators": "バリデータ(%)", "amendment_not_found": "Amendmentが見つかりません", "check_amendment_key": "AmendmentIDを確認してください", "did_document": null, "attestation": null, "note": null, "indicate_unl": null, "transaction_tokens_involved": null, "transaction_tokens_swapped": null, "oracle_document_id": "オラクルドキュメントID", "provider": "プロバイダ", "last_update_time": "最終更新時刻", "asset_class": "資産クラス", "trading_pairs": "取引ペア", "deleted": "削除", "holders_count": "保有者: {{holders}}", "trustlines": "トラストライン: {{trustlines}}", "website": "Webサイト", "mpt_issuance_id": null, "asset_scale": null, "metadata": null, "max_amount": null, "mpt_holder": null, "check_mpt_id": null, "outstanding_amount": null, "locked": null, "can_lock": null, "require_auth": null, "can_escrow": null, "can_trade": null, "can_transfer": null, "can_clawback": null, "enable_amendment_name": null, "amendment_status": null, "expected_date": null, "base": null, "credential_type": null, "credential_issuer": null, "subject": null, "expiration": null, "domain_id": null, "accepted_credentials": null, "credential_ids": null, "data": null, "finish_function": null, "quorum_description": null, "avg_fee_description": null, "ledger_interval_description": null, "txn_ledger_description": null, "txn_sec_description": null, "load_fee_description": null, "nUnl_description": null, "computation_allowance": null, "gas": null, "delegate": null, "permissions": null, "pertaining_to_the_Permissioned_Domain": null, "tx_delegated_to": null, "account_delegates_to": null, "delegate_to": null, "volume": null, "holders": null, "trades": null, "no_of_tokens": null, "volume_24h_total": null, "volume_24h_total_description": null, "market_cap_metric_description": null, "market_cap_description": null, "24h_description": null, "volume_description": null, "trades_description": null, "tvl_description": null, "stablecoin_description": null, "stablecoin": null, "wrapped": null, "tokens_footnote": null, "xrplmeta_guidelines": null, "inner_transaction": null, "batch_table_detail_count": null, "batch_table_detail_list": null, "batch_description": null, "batch": null, "successful": null, "failed": null, "not-validated": null, "asset": null, "assets_maximum": null, "mptoken_metadata": null, "withdrawal_policy": null, "account_creates_vault": null, "vault_id": null, "single_asset_vault": null, "loan_broker_id": null, "loan_id": null, "management_fee_rate": null, "debt_maximum": null, "cover_rate_minimum": null, "cover_rate_liquidation": null, "counterparty": null, "principal_requested": null, "payment_total": null, "payment_interval": null, "grace_period": null, "loan_origination_fee": null, "loan_service_fee": null, "late_payment_fee": null, "close_payment_fee": null, "full_payment_fee": null, "overpayment_fee": null, "interest_rate": null, "late_interest_rate": null, "close_interest_rate": null, "overpayment_interest_rate": null, "set_vault_data": null, "set_vault_assets_maximum": null, "set_vault_domain_id": null, "account_deposits_into_vault": null, "account_withdraws_from_vault": null, "account_clawbacks_from_vault": null, "account_clawbacks_from_vault_amount_omitted": null, "account_deletes_vault": null, "vault_create_table_detail": null, "withdraws": null, "deletes": null, "vault_delete_table_detail": null, "account_flag_title_lsf_global_freeze": null, "account_flag_title_lsf_disable_master": null, "account_flag_title_lsf_default_ripple": null, "account_flag_title_lsf_allow_trustline_clawback": null, "account_flag_title_lsf_allow_trustline_locking": null, "account_flag_title_lsf_require_destination_tag": null, "account_flag_title_lsf_no_freeze": null, "account_flag_title_lsf_require_auth": null, "account_flag_title_lsf_disallow_xrp": null, "account_flag_title_lsf_disallow_incoming_trustline": null, "account_flag_title_lsf_disallow_incoming_pay_chan": null, "account_flag_title_lsf_disallow_incoming_nft_token_offer": null, "account_flag_title_asf_authorized_nft_token_minter": null, "account_flag_title_lsf_disallow_incoming_check": null, "account_flag_title_lsf_deposit_auth": null, "account_flag_title_asf_account_txn_id": null, "account_flag_description_lsf_global_freeze": null, "account_flag_description_lsf_disable_master": null, "account_flag_description_lsf_default_ripple": null, "account_flag_description_lsf_allow_trustline_clawback": null, "account_flag_description_lsf_allow_trustline_locking": null, "account_flag_description_lsf_require_destination_tag": null, "account_flag_description_lsf_no_freeze": null, "account_flag_description_lsf_require_auth": null, "account_flag_description_lsf_disallow_xrp": null, "account_flag_description_lsf_disallow_incoming_trustline": null, "account_flag_description_lsf_disallow_incoming_pay_chan": null, "account_flag_description_lsf_disallow_incoming_nft_token_offer": null, "account_flag_description_asf_authorized_nft_token_minter": null, "account_flag_description_lsf_disallow_incoming_check": null, "account_flag_description_lsf_deposit_auth": null, "account_flag_description_asf_account_txn_id": null, "account_page_address": null, "account_page_address_tag": null, "account_page_classic_address": null, "account_page_deleted_account_label": null, "account_page_deleted_account_warning": null, "account_page_extended_address": null, "account_page_domain": null, "account_page_reserve_balance": null, "account_page_xrp_balance": null, "account_page_xrp_balance_in_usd": null, "account_page_account_properties": null, "account_page_flags": null, "account_page_flag_status_enabled": null, "account_page_flag_status_disabled": null, "account_page_signers": null, "account_page_signer_weight": null, "account_page_details": null, "account_page_current_sequence": null, "account_page_ticket_count": null, "account_page_email_hash": null, "account_page_payment_channels": null, "account_page_payment_channels_text": null, "account_page_nft_minter": null, "account_page_asset_held_title": null, "account_page_asset_issued_title": null, "account_page_asset_tab_iou": null, "account_page_asset_tab_lptoken": null, "account_page_asset_tab_mpt": null, "account_page_asset_tab_nft": null, "account_page_asset_table_column_amm_instance": null, "account_page_asset_table_column_amm_pair": null, "account_page_asset_table_column_asset_class": null, "account_page_asset_table_column_balance": null, "account_page_asset_table_column_balance_usd": null, "account_page_asset_table_column_circulating_supply": null, "account_page_asset_table_column_currency_code": null, "account_page_asset_table_column_frozen": null, "account_page_asset_table_column_highest_bid": null, "account_page_asset_table_column_holders": null, "account_page_asset_table_column_issuer": null, "account_page_asset_table_column_locked": null, "account_page_asset_table_column_lowest_ask": null, "account_page_asset_table_column_price_usd": null, "account_page_asset_table_column_share": null, "account_page_asset_table_column_supply": null, "account_page_asset_table_column_ticker": null, "account_page_asset_table_column_token_id": null, "account_page_asset_table_column_transfer_fee": null, "account_page_asset_table_column_trustlines": null, "account_page_asset_table_column_url": null, "account_page_asset_table_mpt_locked_global": null, "account_page_asset_table_mpt_locked_individual": null, "account_page_asset_table_no_iou": null, "account_page_asset_table_no_lptoken": null, "account_page_asset_table_no_mpt": null, "account_page_asset_table_no_nft": null, "tx_hash": null, "timestamp": null, "amount_in": null, "amount_out": null, "rate": null, "refresh_data": null, "token_page.general_overview": null, "token_page.market_data": null, "token_page.all_tx": null, "token_page.dex_tx": null, "token_page.transfers_tx": null, "token_page.holders_table": null, "token_page.issuer": null, "token_page.price": null, "token_page.holders": null, "token_page.supply": null, "token_page.market_cap": null, "token_page.volume_24h": null, "token_page.trades_24h": null, "token_page.amm_tvl": null, "token_page.transfer_fee": null, "token_page.holders_rank": null, "token_page.holders_num_tokens": null, "token_page.holders_percent_supply": null, "token_page.holders_no_holders": null, "token_page.holders_usd_value": null, "token_page.transfers_no_transfers": null, "token_page.circulating_supply": null, "token_page.dex_type": null, "token_page.dex_amount_in_tooltip": null, "token_page.dex_amount_out_tooltip": null, "token_page.dex_rate_tooltip": null, "token_page.dex_no_trades": null, "token_page.token_label": null, "token_page.category_text": null, "token_type.iou": null, "token_type.mpt": null, "iou_page.trustlines": null, "mpt_page.metadata_warning": null, "data_available_from_notice": null, "copied": null, "click_to_copy": null, "withdraw": null, "delete": null, "rates": null, "loan_broker_rates_detail": null, "loan_rates_detail": null, "loan_fees_detail": null, "loan_terms_detail": null, "no_limit": null, "first_loss_capital": null, "vault": null, "vault_not_found": null, "invalid_vault_id": null, "check_vault_id": null, "get_vault_failed": null, "private_vault": null, "perm_domain_id": null, "total_value_locked": null, "shares": null, "assets_available": null, "unrealized_loss": null, "other_data": null, "max_total_supply": null, "available_to_borrow": null, "not_available": null, "first_come_first_served": null, "loans": null, "loan_broker": null, "total_debt": null, "maximum_debt": null, "management_fee": null, "borrower": null, "amount_requested": null, "outstanding_balance": null, "loan_status_current": null, "loan_status_default": null, "all_loans": null, "loan_status_impaired": null, "loan_status_paid_off": null, "next_due_date": null, "origination_date": null, "frequency": null, "installments": null, "prepayment_fee": null, "no_loans_message": null, "loan_default_detected": null, "no_loan_brokers_message": null, "depositors_fetch_error": null, "no_depositors_message": null, "depositors": null, "percent_of_supply": null, "value": null, "currency_toggle_help": null, "currency_toggle_description": null, "currency_toggle_loading": null, "currency_toggle_loading_description": null, "currency_toggle_unavailable": null, "currency_toggle_unavailable_description": null, "vaults": null, "vaults_tvl": null, "vaults_tvl_description": null, "vaults_outstanding_loans": null, "vaults_outstanding_loans_description": null, "vaults_loans_originated": null, "vaults_loans_originated_description": null, "vaults_avg_interest_rate": null, "vaults_avg_interest_rate_description": null, "vaults_num_vaults": null, "vaults_num_vaults_description": null, "vaults_utilization_ratio": null, "vaults_utilization_ratio_description": null, "vaults_filter_all_assets": null, "vaults_filter_stablecoins": null, "vaults_search_placeholder": null, "vaults_table_vault_id": null, "vaults_table_asset": null, "vaults_table_tvl": null, "vaults_table_outstanding_loans": null, "vaults_table_utilization_ratio": null, "vaults_table_avg_interest_rate": null, "vaults_table_website": null, "vaults_no_results": null, "vaults_disclaimer": null, "amm_pool": null, "basic_info": null, "market_data": null, "auction": null, "created_on": null, "volume_24h_tooltip": null, "fees_24h": null, "fees_24h_tooltip": null, "apr_24h": null, "apr_24h_tooltip": null, "current_holder": null, "discounted_fee": null, "price_paid": null, "replacement_cost": null, "all_transactions": null, "dex_trades": null, "deposits": null, "withdrawals": null, "lp_tokens_received": null, "lp_tokens_redeemed": null, "tvl_and_volume": null, "no_deposits": null, "no_withdrawals": null, "liquidity_providers": null, "balance": null, "lp_token_currency_code": null, "asset_2": null, "usd_value": null, "amm_pool_deleted_label": null, "amm_pool_deleted_text": null, "amms": null, "top_1000_amms": null, "general_info": null, "number_of_amms": null, "number_of_lps": null, "number_of_amms_tooltip": null, "number_of_lps_tooltip": null, "search_amms": null, "tvl_tooltip": null, "volume_24h_all_tooltip": null } ================================================ FILE: public/locales/ko-KR/translations.json ================================================ { "action": "action", "assets": "자산", "assets.no_nfts_message": "NFT를 찾을 수 없습니다.", "assets.no_mpts_message": null, "network": "네트워크", "amendments": null, "network_name": "알 수 없는 네트워크", "network_name_testnet": "Testnet", "network_name_mainnet": "Mainnet", "network_name_devnet": "Devnet", "network_name_xahau_mainnet": "Xahau Mainnet", "network_name_xahau_testnet": "Xahau Testnet", "network_name_custom": "Custom", "app.meta.description": "XRPL 네트워크 탐색기", "app.meta.author": "리플", "explorer": "탐색기", "xrpl_org": "XRPL.org", "github": "GitHub", "header.search.placeholder": "주소, 원장 또는 트랜잭션으로 검색", "xrp": "XRP", "xrpl_explorer": "XRPL 네트워크 탐색기", "ledgers": "원장", "ledger": "원장", "taxon": "분류", "token_id": "토큰 ID", "token_transactions": "토큰 관련 트랜잭션", "transactions": "트랜잭션", "transaction_short": "TX", "nodes": "노드", "validator": "검증자", "validators": "검증자", "upgrade_status": "업그레이드 상태", "version": "v{{number}}", "component_error": "문제가 발생했습니다!", "1H": "1시간", "24H": "24시간", "30D": "30일", "total_transactions": "트랜잭션 수", "total_fees": "총 수수료", "async_component_failed": "컴포넌트 로드 실패", "account_not_found": "계정을 찾을 수 없습니다", "account_empty_title": "계정 ID가 제공되지 않았습니다", "account_empty_hint": "검색 창에 계정 ID를 입력하세요", "check_account_id": "계정 ID를 확인하세요", "accounts.xrp_balance": "XRP 잔고", "accounts.other_balances": "기타 잔고", "accounts.other_balances_short": "기타 잔액", "amount": "금액", "currency_code": "통화 코드", "currency_balance": "<0>{{currency}} 잔고", "load_more_action": "더 보기...", "account_transactions": "계정 트랜잭션 내역", "transaction_type": "트랜잭션 유형", "transaction_action_CANCEL": "취소", "transaction_action_CREATE": "생성", "transaction_action_FINISH": "완료", "transaction_action_MODIFY": "수정", "transaction_action_SEND": "전송", "transaction_category_ACCOUNT": "계정", "transaction_category_DEX": "Dex (AMM, Offers, Trust Sets, 토큰)", "transaction_category_NFT": "NFT", "transaction_category_PAYMENT": "결제", "transaction_category_PSEUDO": "유사 트랜잭션", "transaction_category_XCHAIN": null, "transaction_category_OTHER": null, "transaction_legend_toggle_hide": "범례 숨기기", "transaction_legend_toggle_show": "범례 보이기", "transactions.date_header": "날짜/시간 (UTC)", "no_transactions_message": "트랜잭션 내역이 없습니다.", "get_vault_transactions_failed": null, "retry_action": "다시 시도해주세요", "uh_oh": "문제가 발생했습니다!", "not_found_default_title": "페이지를 찾을 수 없습니다", "not_found_check_url": "URL을 다시 확인해주세요", "not_found": "찾을 수 없습니다", "hash_not_found": null, "buy": "구매", "sell": "판매", "price": "가격", "ledger_index": "원장 인덱스", "to": "까지", "from": "로부터", "request": null, "terms": null, "send": "전송", "delivered": "전달 완료", "cancel_offer": "제안 취소", "convert_maximum": "최대로 변환", "convert_to": "로 변환", "using_at_most": "최대한 사용", "partial_payment_allowed": "부분 결제 허용", "set_limit": "신뢰 한도 설정", "escrow": "에스크로", "cancel_escrow": "에스크로 취소", "finish_escrow": "에스크로 완료", "escrow_amount": "에스크로 금액", "escrow_destination": "에스크로 목적지", "escrow_transaction": "에스크로 트랜잭션", "escrow_condition_short": "에스크로 조건", "escrow_fulfillment": "에스크로 이행", "condition": "조건", "fulfillment": "이행", "cancel_after": " 후 취소", "finish_after": " 후 완료", "settle_delay": "결제 지연", "channel_id": "채널 ID", "seconds": "초", "seconds_short": "초", "regular_key": "정규 키", "unset_regular_key": "정규 키 해제", "unset_signer_list": "서명자 목록 해제", "set_flag": "플래그 설정", "clear_flag": "플래그 해제", "email_hash": "이메일 해시", "message_key": "메시지 키", "out_of": "of", "weight": "가중치", "the_account": "해당 계정은", "create_payment_channel": "결제 채널을 생성할 것입니다", "destination_tag": "목적지 태그", "source_tag": "소스 태그", "channel_settle_delay": "이 채널은 결제 지연 기간이 있습니다", "the_channel_id_is": "채널 ID는", "the_channel_amount_is": "채널 금액은", "update_payment_channel": "결제 채널이 업데이트 될 것입니다", "the_channel_balance_is": "청구된 채널 잔액은", "amm_delete_description": null, "amm_delete_description_caveat": null, "payment_channel_closed_description": "결제 채널이 닫히며, 남은 잔액은 원래 계정으로 반환됩니다", "set_signer_list_description": "서명자 목록으로 최소 서명자 수를 {{quorum}}로 설정합니다", "unset_signer_list_description": "모든 서명자가 계정에서 제거되었습니다", "transaction_initiated_by": "트랜잭션을 시작한 계정은", "increase_channel_amount_by": "채널 금액을 증가시킬 것입니다", "channel_amount_increase": "채널 금액 증가", "channel_amount": "채널 금액", "total_claimed": "총 청구액", "amount_claimed": "청구액", "close_request": "채널 종료 요청", "renew_channel": "채널 갱신", "payment_channel_closed": "결제 채널이 종료되었습니다", "paychannel_node_line1": "<1><0>{{action}}가 페이채널 노드를 <3><0>{{account}}에서 <5><0>{{counterAccount}}로 변경하였습니다", "paychannel_amount_changed": "금액이 <1><0>{{difference}}<1><0>{{currency}} 만큼, <3><0>{{previous}}<1><0>{{currency}}에서 <5><0>{{final}}<1><0>{{currency}}로 변경되었습니다", "paychannel_balance_changed": "잔액이 <1><0>{{difference}}<1><0>{{currency}}만큼, <3><0>{{previous}}<1><0>{{currency}}에서 <5><0>{{final}}<1><0>{{currency}}로 변경되었습니다", "setfee_fees_description": "향후 트랜잭션에는 최소한 의 수수료가 필요합니다.", "setfee_reserves_description": "계정은 이제 기본으로 를 보유하며, 해당 계정이 소유한 추가적인 객체마다 를 더 보유해야 합니다.", "setfee_docs_description": "문서를 참조하세요: <0>수수료", "setfee_base_fee": "기본 수수료", "setfee_reserve": "보유자산", "setfee_reserve_increment": "보유자산 증가량", "formatted_date": "날짜/시간 ({{timeZone}})", "transaction_type_name_AMMCreate": "AMM 생성", "transaction_type_name_AMMDelete": null, "transaction_type_name_AMMDeposit": "AMM 입금", "transaction_type_name_AMMWithdraw": "AMM 출금", "transaction_type_name_AMMVote": "AMM 투표", "transaction_type_name_AMMBid": "AMM 입찰", "transaction_type_name_AMMClawback": null, "transaction_type_name_AccountSet": "계정 설정", "transaction_type_name_Batch": null, "transaction_type_name_CheckCancel": "수표 취소", "transaction_type_name_CheckCash": "수표 현금화", "transaction_type_name_CheckCreate": "수표 생성", "transaction_type_name_CredentialAccept": null, "transaction_type_name_CredentialCreate": null, "transaction_type_name_CredentialDelete": null, "transaction_type_name_DelegateSet": null, "transaction_type_name_DIDDelete": null, "transaction_type_name_DIDSet": null, "transaction_type_name_DepositPreauth": "예치 인증", "transaction_type_name_Error_Cases": "오류 사례", "transaction_type_name_EscrowCancel": "에스크로 취소", "transaction_type_name_EscrowCreate": "에스크로 생성", "transaction_type_name_EscrowFinish": "에스크로 완료", "transaction_type_name_Invoke": null, "transaction_type_name_LoanBrokerSet": null, "transaction_type_name_LoanBrokerDelete": null, "transaction_type_name_LoanBrokerCoverDeposit": null, "transaction_type_name_LoanBrokerCoverWithdraw": null, "transaction_type_name_LoanBrokerCoverClawback": null, "transaction_type_name_LoanSet": null, "transaction_type_name_LoanDelete": null, "transaction_type_name_LoanManage": null, "transaction_type_name_LoanPay": null, "transaction_type_name_MPTokenIssuanceCreate": null, "transaction_type_name_MPTokenIssuanceDestroy": null, "transaction_type_name_MPTokenIssuanceSet": null, "transaction_type_name_MPTokenAuthorize": null, "transaction_type_name_NFTokenAcceptOffer": "NFT 제안 수락", "transaction_type_name_NFTokenBurn": "NFT 소각", "transaction_type_name_NFTokenCancelOffer": "NFT 제안 취소", "transaction_type_name_NFTokenCreateOffer": "NFT 제안 생성", "transaction_type_name_NFTokenMint": "NFT 발행", "transaction_type_name_OfferCancel": "제안 취소", "transaction_type_name_OfferCreate": "제안 생성", "transaction_type_name_OracleDelete": null, "transaction_type_name_OracleSet": null, "transaction_type_name_Payment": "결제", "transaction_type_name_PaymentChannelClaim": "결제 채널 청구", "transaction_type_name_PaymentChannelCreate": "결제 채널 생성", "transaction_type_name_PaymentChannelFund": "결제 채널 펀딩", "transaction_type_name_PermissionedDomainDelete": null, "transaction_type_name_PermissionedDomainSet": null, "transaction_type_name_SetHook": "Hook 설정", "transaction_type_name_SetRegularKey": "일반 키 설정", "transaction_type_name_SignerListSet": "서명자 목록 설정", "transaction_type_name_TicketCreate": "티켓 생성", "transaction_type_name_TrustSet": "신뢰 설정", "transaction_type_name_VaultCreate": null, "transaction_type_name_VaultSet": null, "transaction_type_name_VaultDeposit": null, "transaction_type_name_VaultWithdraw": null, "transaction_type_name_VaultClawback": null, "transaction_type_name_VaultDelete": null, "transaction_type_name_XChainAccountCreateCommit": "XChain 계정 생성 커밋", "transaction_type_name_XChainAddAccountCreateAttestation": "XChain 계정 생성 인증 추가", "transaction_type_name_XChainAddClaimAttestation": "XChain 청구 인증 추가", "transaction_type_name_XChainClaim": "XChain 청구", "transaction_type_name_XChainCommit": "XChain 커밋", "transaction_type_name_XChainCreateBridge": "XChain 브리지 생성", "transaction_type_name_XChainCreateClaimID": "XChain 청구 ID 생성", "transaction_type_name_XChainModifyBridge": "XChain 브리지 수정", "transaction_type_name_EnableAmendment": "수정 활성화", "transaction_type_name_SetFee": "수수료 설정", "transaction_type_name_UNLModify": "UNL 수정", "transaction_type_name_AccountDelete": "계정 삭제", "generic_error": "문제가 발생했습니다", "not_your_fault": "본인의 잘못이 아닐 것입니다", "come_back_later": "곧 사용 가능합니다", "invalid_ledger_id": "원장 ID가 유효하지 않습니다", "invalid_transaction_hash": "트랜잭션 해시가 유효하지 않습니다", "ledger_not_found": "원장을 찾을 수 없습니다", "check_ledger_id": "원장 ID를 확인해주세요", "server_ledgers_hint": "이 노드 ({{connection.server.publicKey, truncate(length: 10)}})는 {{connection.ledger.validated}} 원장만 포함하고 있습니다", "use_search": "검색을 이용해 주세요", "ledger_has_no_trans": "이 원장에는 어떠한 트랜잭션도 없습니다", "less_than": "미만", "transaction_not_found": "트랜잭션을 찾을 수 없습니다", "transaction_empty_title": "트랜잭션 해시가 제공되지 않았습니다", "transaction_empty_hint": "검색창에 트랜잭션 해시를 입력해 주세요", "validator_not_found": "검증자를 찾을 수 없습니다", "check_transaction_hash": "트랜잭션 해시를 확인해 주세요", "wrong_network": null, "check_validator_key": "검증자 키를 확인해주세요", "transaction": "트랜잭션", "success": "성공", "fail": "실패", "simple": "간단히", "detailed": "상세히", "details": "세부사항", "history": "기록", "voting": null, "raw": "원문", "expand": "확장", "collapse": "축소", "try_detailed_raw": "'상세히' 또는 '원문' 보기를 시도해보세요", "account": "계정", "transaction_cost": "트랜잭션 비용", "transaction_cost_short": "트랜잭션 비용", "sequence_number": "시퀀스", "sequence_number_short": "시퀀스 #", "serial": "일련번호", "n_a": "해당 없음", "memos": "메모", "flags": "플래그", "status": "상태", "successful_transaction": "이 트랜잭션은 성공적으로 이루어졌습니다", "fail_transaction": "이 트랜잭션은 <0>{{code}}의 상태 코드로 실패했습니다", "transaction_validated": ", 이 트랜잭션은 원장에서 검증되었습니다", "on": " 에 ", "description": "설명", "signers": "서명자", "decoded_hex": "디코드된 16진수", "transaction_consumed_fee": "이 트랜잭션을 수행하는 데에 소모된 비용은", "meta": "메타 데이터", "number_of_affected_node": "이 트랜잭션은 원장의 {{count}}개 노드에 영향을 미쳤습니다:", "nodes_type": "{{action}} 노드", "node_meta_type": "{{action}}로 노드의 타입을 변경했습니다", "transaction_balance_line_one": "<1><0>{{action}}로 <5><0>{{account}}와 <7><0>{{counterAccount}} 사이의 <3><0>{{currency}} RippleState 노드를 처리했습니다", "transaction_balance_line_two": "잔액이 <3><0>{{previousBalance}}에서 <5><0>{{finalBalance}}로 <1><0>{{change}}만큼 변경되었습니다", "transaction_outstanding_balance_line_two": null, "transaction_owned_directory": "{{action}}로 소유한 DirectoryNode 노드를 처리했습니다", "transaction_unowned_directory": "{{action}}로 DirectoryNode 노드를 처리했습니다", "transaction_mptoken_line_one": null, "transaction_mpt_issuance_line_one": null, "owned_account_root": "{{action}}로 AccountRoot 노드를 처리했습니다", "unowned_account_root": "{{action}}로 AccountRoot 노드를 처리했습니다", "account_balance_increased": "잔액이 <3><0>{{previous}}<1><0>{{currency}}에서 <5><0>{{final}}<1><0>{{currency}}로 <1><0>{{difference}}<1><0>{{currency}} 증가하였습니다", "account_balance_decreased": "잔액이 <3><0>{{previous}}<1><0>{{currency}}에서 <5><0>{{final}}<1><0>{{currency}}로 <1><0>{{difference}}<1><0>{{currency}} 감소하였습니다", "decreased_from_to": "<3><0>{{previous}}에서 <5><0>{{final}}로 <1><0>{{change}} 감소하였습니다.", "offer_node_meta": "<1><0>{{action}}로, 시퀀스 #<7><0>{{sequence}}을 가진, <5><0>{{account}}이(가) 소유한 <3><0>{{pair}} 오퍼 노드를 처리하였습니다", "offer_replaces": "이 트랜잭션 제안은 기존의 트랜잭션 제안을 대체합니다 #", "offer_partially_filled": "이 트랜잭션 제안은 부분적으로 체결되었습니다", "offer_filled": "이 트랜잭션 제안은 완전히 체결되었습니다", "offer_cancelled": "이 트랜잭션 제안은 취소되었습니다", "offer_replaced": "이 트랜잭션 제안은 새로운 트랜잭션 제안으로 대체되었습니다 #", "offer_lack_of_funds": "트랜잭션 제안이 일부 체결된 후, 잔액 부족으로 인해 취소되었습니다", "transaction_sequence": "트랜잭션의 시퀀스 번호는 다음과 같습니다", "trust_set_description": "<7><0>{{account}}가 <5><0>{{issuer}}로부터 받을 수 있는 <3><0>{{currency}}의 최대 금액을 <1><0>{{amount}}로 설정합니다", "payment_desc_line_1": "결제는 에서 로 이루어집니다", "the_source_tag_is": "소스 태그는 다음과 같습니다 ", "the_destination_tag_is": "목적지 태그는 다음과 같습니다", "payment_desc_line_4": "전달이 지시되었습니다", "payment_desc_line_5": "최대 다음 금액까지 소비합니다", "payment_desc_line_6": "실제로 전달된 금액은 다음과 같습니다", "offer_cancel_description": "이 트랜잭션은 계정의 기존 트랜잭션 제안을 취소할 것입니다", "offer_create_desc_line_1": "<1><0>{{account}} 계정은 <5><0>{{takerPays}}<1><0>{{currency}}를 받기 위해 <3><0>{{takerGets}}<1><0>{{currency}}를 지불하려 합니다", "offer_create_desc_line_2": "이 트랜잭션 제안의 환율은 다음과 같습니다", "offer_create_desc_line_3": "이 트랜잭션은 계정의 기존 트랜잭션 제안도 취소할 것입니다", "offer_create_desc_line_5": "이 트랜잭션 제안은 허가된 도메인에 적용됩니다", "offer_will_expire_desc": "트랜잭션 제안은 <1><0>{{date}}에 만료되며, 그 전에 취소되거나 체결되지 않으면 만료됩니다", "offer_did_expire_desc": "트랜잭션 제안은 <1><0>{{date}}에 만료되었습니다. 이는 그 전에 취소되거나 체결되지 않았기 때문입니다", "escrow_is_from": "에스크로는 <1><0>{{account}}에서 <3><0>{{destination}}로 이루어집니다", "escrow_is_created_by": "에스크로는 <1><0>{{account}}에 의해 생성되었으며, 이체되는 자금은 동일한 계정으로 반환됩니다", "escrowed_amount": "에스크로 처리되었습니다", "escrow_condition": "에스크로는 다음과 같은 이행 조건을 가지고 있습니다", "describe_cancel_after": "다음 시점 이후에 취소할 수 있습니다", "describe_finish_after": "다음 시점 이후에 완료할 수 있습니다", "escrow_completion_desc": "완료는 다음에 의해 발동되었습니다", "escrow_completion_desc_2": "에스크로에 보관된 <1><0>{{amount}}이 <3><0>{{destination}}에게 전달되었습니다", "escrow_finish_fulfillment_desc": "에스크로의 조건은 다음에 의해 충족되었습니다.", "escrow_cancellation_desc": "취소는 다음에 의해 발동되었습니다.", "escrow_cancellation_desc_2": "에스크로에 보관된 <1><0>{{amount}}이 <3><0>{{destination}}에게 반환되었습니다", "escrow_after_transaction_cost": "트랜잭션 비용을 제외한 금액", "escrow_created_by_desc": "에스크로는 <1><0>{{account}}에 의해 생성되었고, 트랜잭션은 <3><0>{{transaction}}입니다", "set_regular_key_description": "계정의 정규 키를 설정합니다", "unset_regular_key_description": "계정의 정규 키를 제거합니다", "set_flag_description": "계정 플래그를 설정합니다", "clear_flag_description": "계정 플래그를 제거합니다", "set_domain_description": "계정 도메인을 다음으로 설정합니다", "set_email_description": "계정의 이메일 해시를 다음으로 설정합니다", "set_message_key_description": "계정의 메시지 키를 다음으로 설정합니다", "set_nftoken_minter_description": "<0>{{account}}을 이 계정의 공인 발행인으로 설정합니다", "deposit_auth": "<1><0>{{account}}을 이 계정으로 결제를 보낼 수 있도록 승인합니다", "deposit_unauth": "<1><0>{{account}}의 이 계정으로의 결제 권한을 삭제합니다", "deposit_auth_credentials": null, "deposit_unauth_credentials": null, "invalid_xrpl_address": "유효하지 않은 XRPL 주소", "loading": "불러오는 중", "get_ledger_failed": "원장을 불러올 수 없습니다", "get_transaction_failed": "트랜잭션을 불러올 수 없습니다", "get_validator_failed": "검증자를 불러올 수 없습니다", "get_account_state_failed": "계정 상태를 불러올 수 없습니다", "get_account_transactions_failed": "계정 트랜잭션을 불러올 수 없습니다", "get_account_transactions_try": "더 많은 트랜잭션을 불러와 보세요", "pubkey": "공개키", "node_pubkey": "노드 공개키", "ip": "IP", "state": "상태", "rippled_version": "버전", "last_ledger": "마지막 원장", "uptime": "업타임", "peers": "피어", "in_out": "(입력:출력)", "ledger_history": "원장 히스토리", "quorum": "쿼럼", "load": "로드", "latency": "레이턴시", "amendment_id": null, "amendment_name": null, "voters": null, "threshold": null, "consensus": null, "enabled": null, "disabled": null, "on_tx": null, "yes": null, "no": null, "deprecated": null, "domain": "도메인", "unl": "unl", "fee": "수수료", "ledger_interval": "평균 원장 간격", "load_fee": "로드 수수료", "txn_sec": "txn/초", "txn_ledger": "평균 트랜잭션/원장", "avg_fee": "평균 트랜잭션 수수료", "txn_count": "txn 수", "nUnlCol": "nUNL", "nUnl": "nUNL 내 검증자", "fees": "수수료", "total": "총계", "missing": "누락", "authorize": "인증", "unauthorize": "인증 취소", "missed_validations": "{{count}}회의 유효성 검증이 누락되었습니다", "incomplete": "미완료", "base_fee": null, "account_reserve": null, "object_reserve": null, "vote": null, "no_amendment_in_voting": null, "required": "필요", "source": "소스", "destination": "목적지", "claimed": "청구됨", "remaining": "남음", "inbound_total": "총 수신량", "outbound_total": "총 송신량", "payment_channels": "결제 채널", "available_in": "사용 가능한", "channels": "채널", "account_info": "계정 정보", "reserve": "예약금", "current_sequence": "현재 시퀀스", "escrows": "에스크로", "nodes_found": "찾은 노드 수", "unmapped": "매핑되지 않음", "validators_found": "찾은 검증자 수", "pause": "일시정지", "resume": "재개", "flag_ledger": "원장에 플래그 설정", "ticket": "티켓", "ticket_sequence": "티켓 시퀀스", "ticket_count": "티켓 수량", "ticket_used": "이 트랜잭션에는 티켓이 사용되었습니다", "token": "토큰", "tokens": "토큰", "total_issuers": "전체 발행자 수", "total_tokens": "전체 토큰 수", "top_trading_pairs": "상위 트랜잭션 쌍", "issuer_address": "발행자 주소", "obligations": "채무", "settings": "설정", "rank": "순위", "market_cap": "시가 총액", "volume_24h": "24시간 트랜잭션량", "no_tokens_message": "토큰을 찾을 수 없습니다", "no_pairs_message": "토큰을 찾을 수 없습니다", "high": "최고가", "low": "최저가", "rank_message": "토큰은 신뢰선의 수에 따라 순위가 결정됩니다.", "obligations_message": "채무란, 각 토큰이 주소로 발행된 총액을 의미합니다", "issuer": "발행자", "pair": "제안 쌍", "asset_pair": null, "offer_range": "제안 범위", "custom_network": "사용자 지정 네트워크", "custom_network_input_help": "네트워크 데이터에 접근하기 위해 사용자 지정 네트워크 URL을 입력하세요.", "custom_network_input": "사용자 지정 네트워크의 URL을 입력하세요", "custom_networks": "사용자 지정 네트워크", "no_network_selected": "선택된 사용자 지정 네트워크가 없습니다", "locking_chain_door": "체인 잠금 문제", "locking_chain_issue": "체인 잠금 이슈", "issuing_chain_door": "발행 체인 문제", "issuing_chain_issue": "발행 체인 이슈", "signature_reward": "서명 보상", "min_account_create_amount": "최소 계정 생성 금액", "other_chain_source": "다른 체인 소스", "xchain_claim_id": "XChain 클레임 ID", "check_nft_id": "NFT ID를 확인해주세요", "get_nft_state_failed": "NFT를 불러올 수 없습니다", "minted": "발행됨", "taxon_id": "분류 ID", "transfer_fee": "이체 수수료", "burnable": "소각 가능", "only_xrp": "XRP만 가능", "transferable": "전송 가능", "buy_offers": "구매 제안", "sell_offers": "판매 제안", "offer_index": "제안 ID", "no_sell_offers": "판매 제안 없음", "no_buy_offers": "구매 제안 없음", "validator_history.chain": "체인", "validator_history.date": "날짜 (UTC)", "validator_history.missed": "누락", "validator_history.score": "점수", "seller": "판매자", "buyer": "구매자", "offerer": "제안자", "token_taxon": "토큰 분류", "uri": "URI", "owner": "소유자", "other_chain_destination": "다른 체인의 목적지", "%_of_total_nodes_validators": "노드와 검증자의 총 비율", "version_display": "버전: {{version}}", "validator_count": "검증자 수: {{val_count}}", "node_count": "노드 수: {{node_count}}", "current_stable_version": "현재 안정적인 버전", "stable_version": "{{stableVersion}}", "nftoken_minter": "NFT 발행자", "is_burned": "소각됨", "fee_rate": "수수료 비율", "last_affecting_transaction": "최종 트랜잭션에 영향을 미친 항목", "Version": "버전", "increased_by": "증가량", "trading_fee": "트랜잭션 수수료", "tvl": "총 잠긴 가치(TVL)", "account_address": "계정 주소", "asset1": "자산 1", "asset2": "자산 2", "asset1out": "자산 1 출금", "asset2out": "자산 2 출금", "asset1in": "자산 1 입금", "asset2in": "자산 2 입금", "effective_price": "실질적인 가격", "amm_account_id": "AMM 계정 ID", "lp_tokens": "유동성 공급 토큰", "min_slot_price": "최소 슬롯 가격", "max_slot_price": " 최대 슬롯 가격", "auth_accounts": "인증된 계정", "network_cannot_be_crawled": "이 네트워크는 크롤링이 불가능합니다", "check_crawl_existed": "운영자에게 연락하여 /crawl이 접근 가능하거나 vl 세트가 있는지 확인하세요", "peer_crawled_context": "더 자세한 정보는 https://xrpl.org/peer-crawler.html 를 참조하세요", "xchainbridge": "XChain 브리지", "xchain_account_claim_count": "XChain 계정 요구 수", "xchain_account_create_count": "XChain 계정 생성 수", "min_signer_quorum": "최소 가중치 <0>{{quorum}}가 필요합니다", "holder": "보유자", "action_from": "<0><0>{{action}} <1><0>{{amount}}을 <3><0>{{destination}}으로부터", "action_from_and": null, "claws_back": "회수", "claws_back_from": "에서 로 회수", "instruct_to_claw": "최대 회수 가능 금액은 입니다", "hook": "Hook", "hooks": "Hooks", "hook_emitted": "이 트랜잭션은 Hook에 의해 발생되었습니다", "emit_details": "발생 상세정보", "hook_parameters": "Hook 파라미터", "hook_executions": "Hook 실행", "emit_generation": "생성된 트랜잭션 순서 중 <0>{{emit}}번째", "emit_hook_hash": "Hook <0>{{hash}}에 의해 발생됨", "emit_parent": "<0>{{hash}}에 의해 발동 된 Hook에 의해 발생됩니다", "emit_callback": "발생 콜백은 <0>{{callback}}<0>입니다.", "hook_exec_hash": "Hook <0>{{hash}}를 발동 함", "hook_exec_account": "계정 <0>{{account}}에서", "hook_exec_return": "코드 <0>{{code}}와 문자열 \"<1>{{string}}\"을 반환", "hook_exec_emit_count": "<0>{{count}} 건의 트랜잭션 발생", "hash": "해시", "grant": "그랜트", "namespace": "Namespace", "api_version": "API 버전", "triggered_on": "Triggered On", "name": null, "introduced_in": null, "yeas": null, "nays": null, "eta": null, "amendment_summary": null, "not": null, "enable_tx": null, "all": null, "yeas_count": null, "nays_count": null, "yeas_percent": null, "nays_percent": null, "%_of_validators": null, "amendment_not_found": null, "check_amendment_key": null, "did_document": null, "attestation": null, "note": null, "indicate_unl": null, "transaction_tokens_involved": null, "transaction_tokens_swapped": null, "oracle_document_id": null, "provider": null, "last_update_time": null, "asset_class": null, "trading_pairs": null, "deleted": null, "holders_count": null, "trustlines": null, "website": null, "mpt_issuance_id": null, "asset_scale": null, "metadata": null, "max_amount": null, "mpt_holder": null, "check_mpt_id": null, "outstanding_amount": null, "locked": null, "can_lock": null, "require_auth": null, "can_escrow": null, "can_trade": null, "can_transfer": null, "can_clawback": null, "enable_amendment_name": null, "amendment_status": null, "expected_date": null, "base": null, "credential_type": null, "credential_issuer": null, "subject": null, "expiration": null, "domain_id": null, "accepted_credentials": null, "credential_ids": null, "data": null, "finish_function": null, "quorum_description": null, "avg_fee_description": null, "ledger_interval_description": null, "txn_ledger_description": null, "txn_sec_description": null, "load_fee_description": null, "nUnl_description": null, "computation_allowance": null, "gas": null, "delegate": null, "permissions": null, "pertaining_to_the_Permissioned_Domain": null, "tx_delegated_to": null, "account_delegates_to": null, "delegate_to": null, "volume": null, "holders": null, "trades": null, "no_of_tokens": null, "volume_24h_total": null, "volume_24h_total_description": null, "market_cap_metric_description": null, "market_cap_description": null, "24h_description": null, "volume_description": null, "trades_description": null, "tvl_description": null, "stablecoin_description": null, "stablecoin": null, "wrapped": null, "tokens_footnote": null, "xrplmeta_guidelines": null, "inner_transaction": null, "batch_table_detail_count": null, "batch_table_detail_list": null, "batch_description": null, "batch": null, "successful": null, "failed": null, "not-validated": null, "asset": null, "assets_maximum": null, "mptoken_metadata": null, "withdrawal_policy": null, "account_creates_vault": null, "vault_id": null, "single_asset_vault": null, "loan_broker_id": null, "loan_id": null, "management_fee_rate": null, "debt_maximum": null, "cover_rate_minimum": null, "cover_rate_liquidation": null, "counterparty": null, "principal_requested": null, "payment_total": null, "payment_interval": null, "grace_period": null, "loan_origination_fee": null, "loan_service_fee": null, "late_payment_fee": null, "close_payment_fee": null, "full_payment_fee": null, "overpayment_fee": null, "interest_rate": null, "late_interest_rate": null, "close_interest_rate": null, "overpayment_interest_rate": null, "set_vault_data": null, "set_vault_assets_maximum": null, "set_vault_domain_id": null, "account_deposits_into_vault": null, "account_withdraws_from_vault": null, "account_clawbacks_from_vault": null, "account_clawbacks_from_vault_amount_omitted": null, "account_deletes_vault": null, "vault_create_table_detail": null, "withdraws": null, "deletes": null, "vault_delete_table_detail": null, "account_flag_title_lsf_global_freeze": null, "account_flag_title_lsf_disable_master": null, "account_flag_title_lsf_default_ripple": null, "account_flag_title_lsf_allow_trustline_clawback": null, "account_flag_title_lsf_allow_trustline_locking": null, "account_flag_title_lsf_require_destination_tag": null, "account_flag_title_lsf_no_freeze": null, "account_flag_title_lsf_require_auth": null, "account_flag_title_lsf_disallow_xrp": null, "account_flag_title_lsf_disallow_incoming_trustline": null, "account_flag_title_lsf_disallow_incoming_pay_chan": null, "account_flag_title_lsf_disallow_incoming_nft_token_offer": null, "account_flag_title_asf_authorized_nft_token_minter": null, "account_flag_title_lsf_disallow_incoming_check": null, "account_flag_title_lsf_deposit_auth": null, "account_flag_title_asf_account_txn_id": null, "account_flag_description_lsf_global_freeze": null, "account_flag_description_lsf_disable_master": null, "account_flag_description_lsf_default_ripple": null, "account_flag_description_lsf_allow_trustline_clawback": null, "account_flag_description_lsf_allow_trustline_locking": null, "account_flag_description_lsf_require_destination_tag": null, "account_flag_description_lsf_no_freeze": null, "account_flag_description_lsf_require_auth": null, "account_flag_description_lsf_disallow_xrp": null, "account_flag_description_lsf_disallow_incoming_trustline": null, "account_flag_description_lsf_disallow_incoming_pay_chan": null, "account_flag_description_lsf_disallow_incoming_nft_token_offer": null, "account_flag_description_asf_authorized_nft_token_minter": null, "account_flag_description_lsf_disallow_incoming_check": null, "account_flag_description_lsf_deposit_auth": null, "account_flag_description_asf_account_txn_id": null, "account_page_address": null, "account_page_address_tag": null, "account_page_classic_address": null, "account_page_deleted_account_label": null, "account_page_deleted_account_warning": null, "account_page_extended_address": null, "account_page_domain": null, "account_page_reserve_balance": null, "account_page_xrp_balance": null, "account_page_xrp_balance_in_usd": null, "account_page_account_properties": null, "account_page_flags": null, "account_page_flag_status_enabled": null, "account_page_flag_status_disabled": null, "account_page_signers": null, "account_page_signer_weight": null, "account_page_details": null, "account_page_current_sequence": null, "account_page_ticket_count": null, "account_page_email_hash": null, "account_page_payment_channels": null, "account_page_payment_channels_text": null, "account_page_nft_minter": null, "account_page_asset_held_title": null, "account_page_asset_issued_title": null, "account_page_asset_tab_iou": null, "account_page_asset_tab_lptoken": null, "account_page_asset_tab_mpt": null, "account_page_asset_tab_nft": null, "account_page_asset_table_column_amm_instance": null, "account_page_asset_table_column_amm_pair": null, "account_page_asset_table_column_asset_class": null, "account_page_asset_table_column_balance": null, "account_page_asset_table_column_balance_usd": null, "account_page_asset_table_column_circulating_supply": null, "account_page_asset_table_column_currency_code": null, "account_page_asset_table_column_frozen": null, "account_page_asset_table_column_highest_bid": null, "account_page_asset_table_column_holders": null, "account_page_asset_table_column_issuer": null, "account_page_asset_table_column_locked": null, "account_page_asset_table_column_lowest_ask": null, "account_page_asset_table_column_price_usd": null, "account_page_asset_table_column_share": null, "account_page_asset_table_column_supply": null, "account_page_asset_table_column_ticker": null, "account_page_asset_table_column_token_id": null, "account_page_asset_table_column_transfer_fee": null, "account_page_asset_table_column_trustlines": null, "account_page_asset_table_column_url": null, "account_page_asset_table_mpt_locked_global": null, "account_page_asset_table_mpt_locked_individual": null, "account_page_asset_table_no_iou": null, "account_page_asset_table_no_lptoken": null, "account_page_asset_table_no_mpt": null, "account_page_asset_table_no_nft": null, "tx_hash": null, "timestamp": null, "amount_in": null, "amount_out": null, "rate": null, "refresh_data": null, "token_page.general_overview": null, "token_page.market_data": null, "token_page.all_tx": null, "token_page.dex_tx": null, "token_page.transfers_tx": null, "token_page.holders_table": null, "token_page.issuer": null, "token_page.price": null, "token_page.holders": null, "token_page.supply": null, "token_page.market_cap": null, "token_page.volume_24h": null, "token_page.trades_24h": null, "token_page.amm_tvl": null, "token_page.transfer_fee": null, "token_page.holders_rank": null, "token_page.holders_num_tokens": null, "token_page.holders_percent_supply": null, "token_page.holders_no_holders": null, "token_page.holders_usd_value": null, "token_page.transfers_no_transfers": null, "token_page.circulating_supply": null, "token_page.dex_type": null, "token_page.dex_amount_in_tooltip": null, "token_page.dex_amount_out_tooltip": null, "token_page.dex_rate_tooltip": null, "token_page.dex_no_trades": null, "token_page.token_label": null, "token_page.category_text": null, "token_type.iou": null, "token_type.mpt": null, "iou_page.trustlines": null, "mpt_page.metadata_warning": null, "data_available_from_notice": null, "copied": null, "click_to_copy": null, "withdraw": null, "delete": null, "rates": null, "loan_broker_rates_detail": null, "loan_rates_detail": null, "loan_fees_detail": null, "loan_terms_detail": null, "no_limit": null, "first_loss_capital": null, "vault": null, "vault_not_found": null, "invalid_vault_id": null, "check_vault_id": null, "get_vault_failed": null, "private_vault": null, "perm_domain_id": null, "total_value_locked": null, "shares": null, "assets_available": null, "unrealized_loss": null, "other_data": null, "max_total_supply": null, "available_to_borrow": null, "not_available": null, "first_come_first_served": null, "loans": null, "loan_broker": null, "total_debt": null, "maximum_debt": null, "management_fee": null, "borrower": null, "amount_requested": null, "outstanding_balance": null, "loan_status_current": null, "loan_status_default": null, "all_loans": null, "loan_status_impaired": null, "loan_status_paid_off": null, "next_due_date": null, "origination_date": null, "frequency": null, "installments": null, "prepayment_fee": null, "no_loans_message": null, "loan_default_detected": null, "no_loan_brokers_message": null, "depositors_fetch_error": null, "no_depositors_message": null, "depositors": null, "percent_of_supply": null, "value": null, "currency_toggle_help": null, "currency_toggle_description": null, "currency_toggle_loading": null, "currency_toggle_loading_description": null, "currency_toggle_unavailable": null, "currency_toggle_unavailable_description": null, "vaults": null, "vaults_tvl": null, "vaults_tvl_description": null, "vaults_outstanding_loans": null, "vaults_outstanding_loans_description": null, "vaults_loans_originated": null, "vaults_loans_originated_description": null, "vaults_avg_interest_rate": null, "vaults_avg_interest_rate_description": null, "vaults_num_vaults": null, "vaults_num_vaults_description": null, "vaults_utilization_ratio": null, "vaults_utilization_ratio_description": null, "vaults_filter_all_assets": null, "vaults_filter_stablecoins": null, "vaults_search_placeholder": null, "vaults_table_vault_id": null, "vaults_table_asset": null, "vaults_table_tvl": null, "vaults_table_outstanding_loans": null, "vaults_table_utilization_ratio": null, "vaults_table_avg_interest_rate": null, "vaults_table_website": null, "vaults_no_results": null, "vaults_disclaimer": null, "amm_pool": null, "basic_info": null, "market_data": null, "auction": null, "created_on": null, "volume_24h_tooltip": null, "fees_24h": null, "fees_24h_tooltip": null, "apr_24h": null, "apr_24h_tooltip": null, "current_holder": null, "discounted_fee": null, "price_paid": null, "replacement_cost": null, "all_transactions": null, "dex_trades": null, "deposits": null, "withdrawals": null, "lp_tokens_received": null, "lp_tokens_redeemed": null, "tvl_and_volume": null, "no_deposits": null, "no_withdrawals": null, "liquidity_providers": null, "balance": null, "lp_token_currency_code": null, "asset_2": null, "usd_value": null, "amm_pool_deleted_label": null, "amm_pool_deleted_text": null, "amms": null, "top_1000_amms": null, "general_info": null, "number_of_amms": null, "number_of_lps": null, "number_of_amms_tooltip": null, "number_of_lps_tooltip": null, "search_amms": null, "tvl_tooltip": null, "volume_24h_all_tooltip": null } ================================================ FILE: public/locales/my-MM/translations.json ================================================ { "action": "လုပ်ဆောင်ချက်", "assets": "ပိုင်ဆိုင်မှုများ", "assets.no_nfts_message": "NFT များ မတွေ့ရှိပါ။", "assets.no_mpts_message": "MPT များ မတွေ့ရှိပါ။", "network": "ကွန်ယက်", "amendments": "ပြင်ဆင်ချက်များ", "network_name": "အမည်မသိ ကွန်ယက်", "network_name_testnet": "Testnet", "network_name_mainnet": "Mainnet", "network_name_devnet": "Devnet", "network_name_xahau_mainnet": "Xahau Mainnet", "network_name_xahau_testnet": "Xahau Testnet", "network_name_custom": "စိတ်ကြိုက်", "app.meta.description": "XRPL ကွန်ယက် စူးစမ်းရှာဖွေရေး", "app.meta.author": "Ripple", "explorer": "စူးစမ်းရှာဖွေရန်", "xrpl_org": "XRPL.org", "github": "GitHub", "header.search.placeholder": "Token, လိပ်စာ, Ledger သို့မဟုတ် ငွေလွှဲမှု ဖြင့် ရှာဖွေရန်", "xrp": "XRP", "xrpl_explorer": "XRPL Explorer", "ledgers": "Ledgers", "ledger": "Ledger", "taxon": "Taxon", "token_id": "Token ID", "token_transactions": "Token ငွေလွှဲမှုများ", "transactions": "ငွေလွှဲမှုများ", "transaction_short": "TX", "nodes": "Nodes", "validator": "အတည်ပြုသူ", "validators": "အတည်ပြုသူများ", "upgrade_status": "အဆင့်မြှင့်တင်မှု အခြေအနေ", "version": "ဗားရှင်း {{number}}", "component_error": "တစ်ခုခု မှားယွင်းနေပါသည်!", "1H": "၁နာရီ", "24H": "၂၄နာရီ", "30D": "၃၀ရက်", "total_transactions": "ငွေလွှဲမှု အရေအတွက်", "total_fees": "စုစုပေါင်း အခကြေးငွေ", "async_component_failed": "ကော်မပိုနင့် ဖွင့်၍မရပါ", "account_not_found": "အကောင့် မတွေ့ရှိပါ", "account_empty_title": "အကောင့် ID ထည့်သွင်းထားခြင်း မရှိပါ", "account_empty_hint": "ရှာဖွေရန် နေရာတွင် အကောင့် ID ထည့်ပါ", "check_account_id": "သင့်အကောင့် ID ကို စစ်ဆေးပါ", "accounts.xrp_balance": "XRP လက်ကျန်", "accounts.other_balances": "အခြား လက်ကျန်များ", "accounts.other_balances_short": "အခြား လက်ကျန်", "amount": "ပမာဏ", "currency_code": "ငွေကြေး ကုဒ်", "currency_balance": "<0>{{currency}} လက်ကျန်", "load_more_action": "နောက်ထပ် ကြည့်ရန်...", "account_transactions": "အကောင့် ငွေလွှဲမှုများ", "transaction_type": "ငွေလွှဲမှု အမျိုးအစား", "transaction_action_CANCEL": "ပယ်ဖျက်ရန်", "transaction_action_CREATE": "ဖန်တီးရန်", "transaction_action_FINISH": "ပြီးဆုံးရန်", "transaction_action_MODIFY": "ပြင်ဆင်ရန်", "transaction_action_SEND": "ပို့ရန်", "transaction_category_ACCOUNT": "အကောင့်", "transaction_category_DEX": "Dex (AMM, Offers, Trust Sets, Tokens)", "transaction_category_NFT": "NFT", "transaction_category_PAYMENT": "ငွေပေးချေမှု", "transaction_category_PSEUDO": "Pseudo-Tx", "transaction_category_XCHAIN": "XChain", "transaction_category_OTHER": null, "transaction_legend_toggle_hide": "ရှင်းလင်းချက် ဖျောက်ရန်", "transaction_legend_toggle_show": "ရှင်းလင်းချက် ပြရန်", "transactions.date_header": "ရက်စွဲ/အချိန် (UTC)", "no_transactions_message": "ငွေလွှဲမှုများ မတွေ့ရှိပါ။", "get_vault_transactions_failed": null, "retry_action": "ပြန်လည်ကြိုးစားရန်...", "uh_oh": "အိုး!", "not_found_default_title": "စာမျက်နှာ မတွေ့ရှိပါ", "not_found_check_url": "URL ကို ပြန်လည်စစ်ဆေးပါ", "not_found": "မတွေ့ရှိပါ", "hash_not_found": null, "buy": "ဝယ်ယူရန်", "sell": "ရောင်းချရန်", "price": "စျေးနှုန်း", "ledger_index": "Ledger အညွှန်း", "to": "သို့", "from": "မှ", "request": null, "terms": null, "send": "ပို့ရန်", "delivered": "ပို့ဆောင်ပြီး", "cancel_offer": "ကမ်းလှမ်းမှု ပယ်ဖျက်ရန်", "convert_maximum": "အများဆုံး ပြောင်းလဲရန်", "convert_to": "သို့ ပြောင်းလဲရန်", "using_at_most": "အများဆုံး အသုံးပြုမှု", "partial_payment_allowed": "တစ်စိတ်တစ်ပိုင်း ငွေပေးချေမှု ခွင့်ပြုသည်", "set_limit": "ယုံကြည်မှု ကန့်သတ်ချက် သတ်မှတ်ရန်", "escrow": "escrow", "cancel_escrow": "escrow ပယ်ဖျက်ရန်", "finish_escrow": "escrow ပြီးဆုံးရန်", "escrow_amount": "escrow ပမာဏ", "escrow_destination": "escrow လက်ခံမည့်သူ", "escrow_transaction": "escrow ငွေလွှဲမှု", "escrow_condition_short": "escrow စည်းကမ်းချက်", "escrow_fulfillment": "escrow ဖြည့်ဆည်းမှု", "condition": "စည်းကမ်းချက်", "fulfillment": "ဖြည့်ဆည်းမှု", "cancel_after": "ပယ်ဖျက်နိုင်သည့် အချိန်", "finish_after": "ပြီးဆုံးနိုင်သည့် အချိန်", "settle_delay": "ငွေပေးချေမှု နှောင့်နှေးချိန်", "channel_id": "Channel ID", "seconds": "စက္ကန့်", "seconds_short": "စက္ကန့်", "regular_key": "ပုံမှန် သော့", "unset_regular_key": "ပုံမှန် သော့ ဖယ်ရှားရန်", "unset_signer_list": "လက်မှတ်ထိုးသူ စာရင်း ဖယ်ရှားရန်", "set_flag": "အလံ သတ်မှတ်ရန်", "clear_flag": "အလံ ရှင်းလင်းရန်", "email_hash": "အီးမေးလ် hash", "message_key": "မက်ဆေ့ခ်ျ သော့", "out_of": "မှ", "weight": "အလေးချိန်", "the_account": "အကောင့်", "create_payment_channel": "ငွေပေးချေမှု လမ်းကြောင်း ဖန်တီးမည်", "destination_tag": "လက်ခံမည့်သူ tag", "source_tag": "ပေးပို့သူ tag", "channel_settle_delay": "လမ်းကြောင်းတွင် ငွေပေးချေမှု နှောင့်နှေးချိန်", "the_channel_id_is": "Channel ID မှာ", "the_channel_amount_is": "လမ်းကြောင်း ပမာဏမှာ", "update_payment_channel": "ငွေပေးချေမှု လမ်းကြောင်းကို အပ်ဒိတ်လုပ်မည်", "the_channel_balance_is": "တောင်းဆိုထားသော လမ်းကြောင်း လက်ကျန်မှာ", "amm_delete_description": " နှင့် အတွက် AMM ကို ဖျက်ရန် ကြိုးစားခဲ့သည်။", "amm_delete_description_caveat": "ယုံကြည်မှု လမ်းကြောင်း ၅၁၂ ထက်ပိုရှိပါက ၅၁၂ ခုကိုသာ ဖျက်ပေးမည်။", "payment_channel_closed_description": "ငွေပေးချေမှု လမ်းကြောင်းကို ပိတ်မည်ဖြစ်ပြီး၊ ကျန်ရှိသော လက်ကျန်များကို မူရင်းအကောင့်သို့ ပြန်လည်ပေးပို့မည်", "set_signer_list_description": "အောက်ပါ လက်မှတ်ထိုးသူများစာရင်းဖြင့် အနည်းဆုံး လက်မှတ်ထိုးသူ ကိုတာကို {{quorum}} သို့ သတ်မှတ်သည်", "unset_signer_list_description": "အကောင့်မှ လက်မှတ်ထိုးသူအားလုံးကို ဖယ်ရှားလိုက်သည်", "transaction_initiated_by": "ငွေလွှဲမှုကို စတင်သူမှာ", "increase_channel_amount_by": "လမ်းကြောင်း ပမာဏကို တိုးမြှင့်မည်", "channel_amount_increase": "လမ်းကြောင်း ပမာဏ တိုးမြှင့်မှု", "channel_amount": "လမ်းကြောင်း ပမာဏ", "total_claimed": "စုစုပေါင်း တောင်းဆိုထား", "amount_claimed": "တောင်းဆိုထားသော ပမာဏ", "close_request": "လမ်းကြောင်း ပိတ်သိမ်းရန် တောင်းဆိုချက်", "renew_channel": "လမ်းကြောင်း သက်တမ်းတိုး", "payment_channel_closed": "ငွေပေးချေမှု လမ်းကြောင်း ပိတ်သိမ်းပြီး", "paychannel_node_line1": "၎င်းသည် <3><0>{{account}} မှ <5><0>{{counterAccount}} သို့ PayChannel node ကို <1><0>{{action}}", "paychannel_amount_changed": "ပမာဏ <3><0>{{previous}}<1><0>{{currency}} မှ <5><0>{{final}}<1><0>{{currency}} သို့ <1><0>{{difference}}<1><0>{{currency}} ပြောင်းလဲသွားသည်", "paychannel_balance_changed": "လက်ကျန် <3><0>{{previous}}<1><0>{{currency}} မှ <5><0>{{final}}<1><0>{{currency}} သို့ <1><0>{{difference}}<1><0>{{currency}} ပြောင်းလဲသွားသည်", "setfee_fees_description": "နောင်လာမည့် ငွေလွှဲမှုများတွင် အနည်းဆုံး အခကြေးငွေ လိုအပ်မည်။", "setfee_reserves_description": "အကောင့်များသည် အခြေခံ နှင့် ထပ်တိုးပစ္စည်းတစ်ခုစီအတွက် နောက်ထပ် ထားရှိရမည်။", "setfee_docs_description": "စာရွက်စာတမ်းများကို ကြည့်ရှုရန်: <0>အခကြေးငွေများ", "setfee_base_fee": "အခြေခံ အခကြေးငွေ", "setfee_reserve": "သီးသန့်ငွေ", "setfee_reserve_increment": "သီးသန့်ငွေ တိုးမြှင့်မှု", "formatted_date": "ရက်စွဲ/အချိန် ({{timeZone}})", "transaction_type_name_AMMCreate": "AMM ဖန်တီးရန်", "transaction_type_name_AMMDelete": "AMM ဖျက်ရန်", "transaction_type_name_AMMDeposit": "AMM အပ်နှံရန်", "transaction_type_name_AMMWithdraw": "AMM ထုတ်ယူရန်", "transaction_type_name_AMMVote": "AMM မဲပေးရန်", "transaction_type_name_AMMBid": "AMM လေလံဆွဲရန်", "transaction_type_name_AMMClawback": null, "transaction_type_name_AccountSet": "အကောင့် သတ်မှတ်ရန်", "transaction_type_name_Batch": null, "transaction_type_name_CheckCancel": "ချက် ပယ်ဖျက်ရန်", "transaction_type_name_CheckCash": "ချက် ငွေထုတ်ရန်", "transaction_type_name_CheckCreate": "ချက် ဖန်တီးရန်", "transaction_type_name_CredentialAccept": null, "transaction_type_name_CredentialCreate": null, "transaction_type_name_CredentialDelete": null, "transaction_type_name_DelegateSet": null, "transaction_type_name_DIDDelete": "DID ဖျက်ရန်", "transaction_type_name_DIDSet": "DID သတ်မှတ်ရန်", "transaction_type_name_DepositPreauth": "အပ်နှံမှု ကြိုခွင့်ပြုချက်", "transaction_type_name_Error_Cases": "အမှားဖြစ်စဉ်များ", "transaction_type_name_EscrowCancel": "Escrow ပယ်ဖျက်ရန်", "transaction_type_name_EscrowCreate": "Escrow ဖန်တီးရန်", "transaction_type_name_EscrowFinish": "Escrow ပြီးဆုံးရန်", "transaction_type_name_Invoke": "ခေါ်ယူရန်", "transaction_type_name_LoanBrokerSet": null, "transaction_type_name_LoanBrokerDelete": null, "transaction_type_name_LoanBrokerCoverDeposit": null, "transaction_type_name_LoanBrokerCoverWithdraw": null, "transaction_type_name_LoanBrokerCoverClawback": null, "transaction_type_name_LoanSet": null, "transaction_type_name_LoanDelete": null, "transaction_type_name_LoanManage": null, "transaction_type_name_LoanPay": null, "transaction_type_name_MPTokenIssuanceCreate": "MPT ထုတ်ပေးမှု ဖန်တီးရန်", "transaction_type_name_MPTokenIssuanceDestroy": "MPT ထုတ်ပေးမှု ဖျက်ရန်", "transaction_type_name_MPTokenIssuanceSet": "MPT ထုတ်ပေးမှု သတ်မှတ်ရန်", "transaction_type_name_MPTokenAuthorize": "MPT ခွင့်ပြုရန်", "transaction_type_name_NFTokenAcceptOffer": "NFT ကမ်းလှမ်းမှု လက်ခံရန်", "transaction_type_name_NFTokenBurn": "NFT ဖျက်ဆီးရန်", "transaction_type_name_NFTokenCancelOffer": "NFT ကမ်းလှမ်းမှု ပယ်ဖျက်ရန်", "transaction_type_name_NFTokenCreateOffer": "NFT ကမ်းလှမ်းမှု ဖန်တီးရန်", "transaction_type_name_NFTokenMint": "NFT ထုတ်လုပ်ရန်", "transaction_type_name_OfferCancel": "ကမ်းလှမ်းမှု ပယ်ဖျက်ရန်", "transaction_type_name_OfferCreate": "ကမ်းလှမ်းမှု ဖန်တီးရန်", "transaction_type_name_OracleDelete": "Oracle ဖျက်ရန်", "transaction_type_name_OracleSet": "Oracle သတ်မှတ်ရန်", "transaction_type_name_Payment": "ငွေပေးချေမှု", "transaction_type_name_PaymentChannelClaim": "ငွေပေးချေမှု လမ်းကြောင်း တောင်းဆိုရန်", "transaction_type_name_PaymentChannelCreate": "ငွေပေးချေမှု လမ်းကြောင်း ဖန်တီးရန်", "transaction_type_name_PaymentChannelFund": "ငွေပေးချေမှု လမ်းကြောင်း ရန်ပုံငွေ", "transaction_type_name_PermissionedDomainDelete": null, "transaction_type_name_PermissionedDomainSet": null, "transaction_type_name_SetHook": "Hook သတ်မှတ်ရန်", "transaction_type_name_SetRegularKey": "ပုံမှန်သော့ သတ်မှတ်ရန်", "transaction_type_name_SignerListSet": "လက်မှတ်ထိုးသူစာရင်း သတ်မှတ်ရန်", "transaction_type_name_TicketCreate": "လက်မှတ် ဖန်တီးရန်", "transaction_type_name_TrustSet": "ယုံကြည်မှု သတ်မှတ်ရန်", "transaction_type_name_VaultCreate": null, "transaction_type_name_VaultSet": null, "transaction_type_name_VaultDeposit": null, "transaction_type_name_VaultWithdraw": null, "transaction_type_name_VaultClawback": null, "transaction_type_name_VaultDelete": null, "transaction_type_name_XChainAccountCreateCommit": "XChain အကောင့်ဖန်တီးမှု အတည်ပြုရန်", "transaction_type_name_XChainAddAccountCreateAttestation": "XChain အကောင့်ဖန်တီးမှု အထောက်အထား ထည့်ရန်", "transaction_type_name_XChainAddClaimAttestation": "XChain တောင်းဆိုမှု အထောက်အထား ထည့်ရန်", "transaction_type_name_XChainClaim": "XChain တောင်းဆိုရန်", "transaction_type_name_XChainCommit": "XChain အတည်ပြုရန်", "transaction_type_name_XChainCreateBridge": "XChain တံတား ဖန်တီးရန်", "transaction_type_name_XChainCreateClaimID": "XChain တောင်းဆိုမှု ID ဖန်တီးရန်", "transaction_type_name_XChainModifyBridge": "XChain တံတား ပြင်ဆင်ရန်", "transaction_type_name_EnableAmendment": "ပြင်ဆင်ချက် ဖွင့်ရန်", "transaction_type_name_SetFee": "အခကြေးငွေ သတ်မှတ်ရန်", "transaction_type_name_UNLModify": "UNL ပြင်ဆင်ရန်", "transaction_type_name_AccountDelete": "အကောင့် ဖျက်ရန်", "generic_error": "တစ်ခုခု မှားယွင်းနေပါသည်", "not_your_fault": "သင့်အမှား မဟုတ်နိုင်ပါ", "come_back_later": "မကြာမီ ရရှိနိုင်ပါမည်", "invalid_ledger_id": "Ledger ID မှားယွင်းနေပါသည်", "invalid_transaction_hash": "ငွေလွှဲမှု hash မှားယွင်းနေပါသည်", "ledger_not_found": "Ledger မတွေ့ရှိပါ", "check_ledger_id": "ကျေးဇူးပြု၍ သင့် ledger ID ကို စစ်ဆေးပါ", "server_ledgers_hint": "ဤ node ({{connection.server.publicKey, truncate(length: 10)}}) တွင် ledgers {{connection.ledger.validated}} သာ ပါဝင်သည်", "use_search": "ကျေးဇူးပြု၍ ကျွန်ုပ်တို့၏ ရှာဖွေမှုကို အသုံးပြုပါ", "ledger_has_no_trans": "ဤ ledger တွင် ငွေလွှဲမှုများ မရှိပါ", "less_than": "အောက်လျော့နည်း", "transaction_not_found": "ငွေလွှဲမှု မတွေ့ရှိပါ", "transaction_empty_title": "ငွေလွှဲမှု hash ထည့်သွင်းထားခြင်း မရှိပါ", "transaction_empty_hint": "ရှာဖွေရန် နေရာတွင် ငွေလွှဲမှု hash ထည့်ပါ", "validator_not_found": "အတည်ပြုသူ မတွေ့ရှိပါ", "check_transaction_hash": "ကျေးဇူးပြု၍ သင့် ငွေလွှဲမှု hash သို့မဟုတ် CTID ကို စစ်ဆေးပါ။", "wrong_network": "ဤ CTID သည် အခြားကွန်ယက်တစ်ခုအတွက် ဖြစ်သည်။", "check_validator_key": "ကျေးဇူးပြု၍ သင့် အတည်ပြုသူ key ကို စစ်ဆေးပါ", "transaction": "Transaction", "success": "အောင်မြင်သည်", "fail": "မအောင်မြင်ပါ", "simple": "Simple", "detailed": "Detailed", "details": "အသေးစိတ်", "history": "မှတ်တမ်း", "voting": "Voting", "raw": "Raw", "expand": "ချဲ့ရန်", "collapse": "ခေါက်ရန်", "try_detailed_raw": "Try `Detailed` or `Raw` view", "account": "Account", "transaction_cost": "Transaction Cost", "transaction_cost_short": "Txn. Cost", "sequence_number": "Sequence Number", "sequence_number_short": "Sequence #", "serial": "Serial", "n_a": "N/A", "memos": "Memos", "flags": "Flags", "status": "အခြေအနေ", "successful_transaction": "ဤငွေလွှဲမှု အောင်မြင်ပါသည်", "fail_transaction": "ဤငွေလွှဲမှု အခြေအနေ ကုဒ် <0>{{code}} ဖြင့် မအောင်မြင်ပါ", "transaction_validated": "၊ နှင့် ledger တွင် အတည်ပြုပြီး ", "on": " တွင် ", "description": "ဖော်ပြချက်", "signers": "လက်မှတ်ထိုးသူများ", "decoded_hex": "ဖြေထုတ်ထားသော hex", "transaction_consumed_fee": "ဤငွေလွှဲမှု ပြုလုပ်ရန် သုံးစွဲခဲ့သော အခကြေးငွေ", "meta": "Meta", "number_of_affected_node": "၎င်းသည် ledger ထဲရှိ node {{count}} ခုကို သက်ရောက်မှု ရှိခဲ့သည်", "nodes_type": "{{action}} nodes များ", "node_meta_type": "၎င်းသည် {{action}} node အမျိုးအစားဖြင့်", "transaction_balance_line_one": "၎င်းသည် <5><0>{{account}} နှင့် <7><0>{{counterAccount}} ကြား <3><0>{{currency}} RippleState node ကို <1><0>{{action}}", "transaction_balance_line_two": "လက်ကျန် <3><0>{{previousBalance}} မှ <5><0>{{finalBalance}} သို့ <1><0>{{change}} ပြောင်းလဲသွားသည်", "transaction_outstanding_balance_line_two": "ကျန်ရှိနေသော လက်ကျန် <3><0>{{previousBalance}} မှ <5><0>{{finalBalance}} သို့ <1><0>{{change}} ပြောင်းလဲသွားသည်", "transaction_owned_directory": "၎င်းသည် ပိုင်ဆိုင်သူ {{action}} DirectoryNode node", "transaction_unowned_directory": "၎င်းသည် DirectoryNode node ကို {{action}}", "transaction_mptoken_line_one": "၎င်းသည် <3><0>{{account}} ၏ MPToken node ကို <1><0>{{action}}", "transaction_mpt_issuance_line_one": "၎င်းသည် <3><0>{{account}} ၏ MPTokenIssuance node ကို <1><0>{{action}}", "owned_account_root": "၎င်းသည် {{action}} AccountRoot node ၏", "unowned_account_root": "၎င်းသည် AccountRoot node ကို {{action}}", "account_balance_increased": "လက်ကျန် <3><0>{{previous}}<1><0>{{currency}} မှ <5><0>{{final}}<1><0>{{currency}} သို့ <1><0>{{difference}}<1><0>{{currency}} တိုးလာသည်", "account_balance_decreased": "လက်ကျန် <3><0>{{previous}}<1><0>{{currency}} မှ <5><0>{{final}}<1><0>{{currency}} သို့ <1><0>{{difference}}<1><0>{{currency}} လျော့သွားသည်", "decreased_from_to": "<3><0>{{previous}} မှ <5><0>{{final}} သို့ <1><0>{{change}} လျော့သွားသည်", "offer_node_meta": "၎င်းသည် sequence # <7><0>{{sequence}} ဖြင့် <5><0>{{account}} ပိုင်ဆိုင်သော <3><0>{{pair}} ကမ်းလှမ်းမှု node ကို <1><0>{{action}}", "offer_replaces": "ဤကမ်းလှမ်းမှုသည် ရှိပြီးသား ကမ်းလှမ်းမှု #", "offer_partially_filled": "ကမ်းလှမ်းမှု တစ်စိတ်တစ်ပိုင်း ဖြည့်စွက်ပြီး", "offer_filled": "ကမ်းလှမ်းမှု ဖြည့်စွက်ပြီး", "offer_cancelled": "ကမ်းလှမ်းမှု ပယ်ဖျက်ပြီး", "offer_replaced": "ဤကမ်းလှမ်းမှုကို ကမ်းလှမ်းမှုအသစ် # ဖြင့် အစားထိုးပြီး", "offer_lack_of_funds": "ကမ်းလှမ်းမှု တစ်စိတ်တစ်ပိုင်း ဖြည့်စွက်ပြီး၊ ထို့နောက် ငွေကြေးမလုံလောက်သောကြောင့် ပယ်ဖျက်ခဲ့သည်", "transaction_sequence": "ငွေလွှဲမှု၏ sequence နံပါတ်မှာ", "trust_set_description": "၎င်းသည် <7><0>{{account}} က လက်ခံရန် ဆန္ဒရှိသော <5><0>{{issuer}} မှ <3><0>{{currency}} ၏ အများဆုံးပမာဏအဖြစ် <1><0>{{amount}} ကို သတ်မှတ်သည်", "payment_desc_line_1": "ငွေပေးချေမှုသည် မှ သို့ ဖြစ်သည်", "the_source_tag_is": "ပေးပို့သူ tag မှာ ", "the_destination_tag_is": "လက်ခံမည့်သူ tag မှာ", "payment_desc_line_4": "ပို့ဆောင်ရန် ညွှန်ကြားထားသည်မှာ", "payment_desc_line_5": "အများဆုံး သုံးစွဲမှုဖြင့်", "payment_desc_line_6": "အမှန်တကယ် ပို့ဆောင်ခဲ့သော ပမာဏမှာ", "offer_cancel_description": "ဤငွေလွှဲမှုသည် အကောင့်၏ ရှိပြီးသား ကမ်းလှမ်းမှု #", "offer_create_desc_line_1": "အကောင့် <1><0>{{account}} သည် <5><0>{{takerPays}}<1><0>{{currency}} ရရှိရန်အတွက် <3><0>{{takerGets}}<1><0>{{currency}} ပေးချေရန် ကမ်းလှမ်းသည်", "offer_create_desc_line_2": "ဤကမ်းလှမ်းမှုအတွက် လဲလှယ်နှုန်းမှာ", "offer_create_desc_line_3": "ဤငွေလွှဲမှုသည် အကောင့်၏ ရှိပြီးသား ကမ်းလှမ်းမှု # ကိုလည်း ပယ်ဖျက်မည်", "offer_create_desc_line_5": null, "offer_will_expire_desc": "ဤကမ်းလှမ်းမှုသည် <1><0>{{date}} တွင် သက်တမ်းကုန်ဆုံးမည်၊ ထိုအချိန်မတိုင်မီ ပယ်ဖျက်ခြင်း သို့မဟုတ် အသုံးပြုခြင်း မရှိပါက", "offer_did_expire_desc": "ဤကမ်းလှမ်းမှုသည် <1><0>{{date}} တွင် သက်တမ်းကုန်ဆုံးခဲ့သည်၊ ထိုအချိန်မတိုင်မီ ပယ်ဖျက်ခြင်း သို့မဟုတ် အသုံးပြုခြင်း မရှိခဲ့ပါက", "escrow_is_from": "Escrow သည် <1><0>{{account}} မှ <3><0>{{destination}} သို့ ဖြစ်သည်", "escrow_is_created_by": "Escrow ကို <1><0>{{account}} မှ ဖန်တီးခဲ့ပြီး ငွေကြေးများကို အကောင့်တူသို့ ပြန်လည်ပေးပို့မည်", "escrowed_amount": "Escrow ထားသော ပမာဏမှာ", "escrow_condition": "Escrow တွင် ဖြည့်ဆည်းရမည့် စည်းကမ်းချက်မှာ", "describe_cancel_after": "၎င်းကို ပယ်ဖျက်နိုင်သည့် အချိန်မှာ", "describe_finish_after": "၎င်းကို ပြီးဆုံးနိုင်သည့် အချိန်မှာ", "escrow_completion_desc": "ပြီးဆုံးခြင်းကို စတင်သူမှာ", "escrow_completion_desc_2": "Escrow ထားသော ပမာဏ <1><0>{{amount}} ကို <3><0>{{destination}} သို့ ပို့ဆောင်ခဲ့သည်", "escrow_finish_fulfillment_desc": "Escrow စည်းကမ်းချက်ကို ဖြည့်ဆည်းသူမှာ", "escrow_cancellation_desc": "ပယ်ဖျက်ခြင်းကို စတင်သူမှာ", "escrow_cancellation_desc_2": "Escrow ထားသော ပမာဏ <1><0>{{amount}} ကို <3><0>{{owner}} သို့ ပြန်လည်ပေးပို့ခဲ့သည်", "escrow_after_transaction_cost": "ငွေလွှဲမှု ကုန်ကျစရိတ် နုတ်ပြီးနောက်", "escrow_created_by_desc": "Escrow ကို <1><0>{{account}} မှ ငွေလွှဲမှု <3><0>{{transaction}} ဖြင့် ဖန်တီးခဲ့သည်", "set_regular_key_description": "၎င်းသည် အကောင့်၏ ပုံမှန်သော့ကို သတ်မှတ်သည်", "unset_regular_key_description": "၎င်းသည် အကောင့်၏ ပုံမှန်သော့ကို ဖယ်ရှားသည်", "set_flag_description": "၎င်းသည် အကောင့် အလံကို သတ်မှတ်သည်", "clear_flag_description": "၎င်းသည် အကောင့် အလံကို ရှင်းလင်းသည်", "set_domain_description": "၎င်းသည် အကောင့် domain အဖြစ် သတ်မှတ်သည်", "set_email_description": "၎င်းသည် အကောင့် အီးမေးလ် hash အဖြစ် သတ်မှတ်သည်", "set_message_key_description": "၎င်းသည် အကောင့် မက်ဆေ့ခ်ျ သော့အဖြစ် သတ်မှတ်သည်", "set_nftoken_minter_description": "၎င်းသည် <0>{{account}} ကို ဤအကောင့်အတွက် ခွင့်ပြုချက်ရ NFT ထုတ်လုပ်သူအဖြစ် သတ်မှတ်သည်", "deposit_auth": "၎င်းသည် <1><0>{{account}} အား ဤအကောင့်သို့ ငွေပေးချေရန် ခွင့်ပြုသည်", "deposit_unauth": "၎င်းသည် <1><0>{{account}} ၏ ဤအကောင့်သို့ ငွေပေးချေခွင့်ကို ပယ်ဖျက်သည်", "deposit_auth_credentials": null, "deposit_unauth_credentials": null, "invalid_xrpl_address": "XRPL လိပ်စာ မှားယွင်းနေပါသည်", "loading": "ဖွင့်နေသည်", "get_ledger_failed": "Ledger ကို ဖွင့်၍မရပါ", "get_transaction_failed": "ငွေလွှဲမှုကို ဖွင့်၍မရပါ", "get_validator_failed": "အတည်ပြုသူကို ဖွင့်၍မရပါ", "get_account_state_failed": "အကောင့်အခြေအနေကို ဖွင့်၍မရပါ", "get_account_transactions_failed": "အကောင့်ငွေလွှဲမှုများကို ဖွင့်၍မရပါ", "get_account_transactions_try": "ငွေလွှဲမှုများ ထပ်မံဖွင့်ကြည့်ပါ", "pubkey": "အများသုံး သော့", "node_pubkey": "node အများသုံး သော့", "ip": "ip လိပ်စာ", "state": "အခြေအနေ", "rippled_version": "version", "last_ledger": "နောက်ဆုံး ledger", "uptime": "အချိန်ကာလ", "peers": "peers", "in_out": "(in:out)", "ledger_history": "ledger မှတ်တမ်း", "quorum": "quorum", "load": "ဝန်", "latency": "နှောင့်နှေးချိန်", "amendment_id": "ID", "amendment_name": "အမည်", "voters": "မဲပေးသူများ", "threshold": "သတ်မှတ်ချက်", "consensus": "သဘောတူညီမှု", "enabled": "ဖွင့်ထား", "disabled": null, "on_tx": "on (tx)", "yes": "Yes", "no": "No", "deprecated": "မသုံးတော့", "domain": "domain", "unl": "unl", "fee": "အခကြေးငွေ", "ledger_interval": "ပျမ်းမျှ ledger ကြားချိန်", "load_fee": "load fee", "txn_sec": "txn/sec.", "txn_ledger": "avg. txn/ledger", "avg_fee": "Avg. Txn Fee", "txn_count": "txn count", "nUnlCol": "nUNL", "nUnl": "VALIDATORS ON nUNL", "fees": "အခကြေးငွေများ", "total": "စုစုပေါင်း", "missing": "ပျောက်ဆုံး", "authorize": "ခွင့်ပြုရန်", "unauthorize": "ခွင့်ပြုချက်ပယ်ဖျက်ရန်", "missed_validations": "{{count}} ခု အတည်ပြုမှု လွဲချော်", "incomplete": "မပြီးပြည့်စုံ", "base_fee": "အခြေခံ အခကြေးငွေ", "account_reserve": "အကောင့် သီးသန့်ငွေ", "object_reserve": "အရာဝတ္ထု သီးသန့်ငွေ", "vote": "မဲပေးရန်", "no_amendment_in_voting": "ယခုအချိန်တွင် ဤကွန်ယက်၌ မဲပေးရန် ပြင်ဆင်ချက် မရှိသေးပါ။", "required": "လိုအပ်သည်", "source": "ရင်းမြစ်", "destination": "ဦးတည်ရာ", "claimed": "တောင်းဆိုပြီး", "remaining": "ကျန်ရှိသည်", "inbound_total": "အဝင် စုစုပေါင်း", "outbound_total": "အထွက် စုစုပေါင်း", "payment_channels": "ငွေပေးချေမှု လမ်းကြောင်းများ", "available_in": "ရရှိနိုင်မည့် အချိန်", "channels": "လမ်းကြောင်းများ", "account_info": "အကောင့် အချက်အလက်", "reserve": "သီးသန့်ငွေ", "current_sequence": "လက်ရှိ sequence", "escrows": "escrows", "nodes_found": "nodes တွေ့ရှိ", "unmapped": "မြေပုံမပြုရသေး", "validators_found": "အတည်ပြုသူများ တွေ့ရှိ", "pause": "ခဏရပ်", "resume": "ဆက်လက်", "flag_ledger": "အမှတ်အသား Ledger", "ticket": "လက်မှတ်", "ticket_sequence": "လက်မှတ် Sequence", "ticket_count": "လက်မှတ် အရေအတွက်", "ticket_used": "ဤငွေလွှဲမှုအတွက် လက်မှတ်တစ်ခု အသုံးပြုခဲ့သည်", "token": "Token", "tokens": "Tokens များ", "total_issuers": "ထုတ်ဝေသူ စုစုပေါင်း", "total_tokens": "Token စုစုပေါင်း", "top_trading_pairs": "ထိပ်တန်း ရောင်းဝယ်မှု အတွဲများ", "issuer_address": "ထုတ်ဝေသူ လိပ်စာ", "obligations": "တာဝန်ဝတ္တရားများ", "settings": "ဆက်တင်များ", "rank": "အဆင့်", "market_cap": "ဈေးကွက် တန်ဖိုး", "volume_24h": "၂၄နာရီ ရောင်းဝယ်မှု ပမာဏ", "no_tokens_message": "Token များ မတွေ့ရှိပါ။", "no_pairs_message": "ရောင်းဝယ်မှု အတွဲများ မတွေ့ရှိပါ", "high": "အမြင့်ဆုံး", "low": "အနိမ့်ဆုံး", "rank_message": "Token များကို ယုံကြည်မှု လမ်းကြောင်း အရေအတွက်ဖြင့် အဆင့်သတ်မှတ်သည်။", "obligations_message": "တာဝန်ဝတ္တရားများသည် လိပ်စာများသို့ ထုတ်ပေးထားသော token တစ်ခုချင်းစီ၏ စုစုပေါင်း ပမာဏဖြစ်သည်", "issuer": "ထုတ်ဝေသူ", "pair": "အတွဲ", "asset_pair": null, "offer_range": "ကမ်းလှမ်းမှု အပိုင်းအခြား", "custom_network": "စိတ်ကြိုက် ကွန်ယက်", "custom_network_input_help": "ကွန်ယက်၏ အချက်အလက်များကို ရယူရန် စိတ်ကြိုက် ကွန်ယက် URL ထည့်သွင်းပါ။", "custom_network_input": "စိတ်ကြိုက် ကွန်ယက် URL ထည့်သွင်းပါ", "custom_networks": "စိတ်ကြိုက် ကွန်ယက်များ", "no_network_selected": "စိတ်ကြိုက် ကွန်ယက် ရွေးချယ်ထားခြင်း မရှိပါ", "locking_chain_door": "သော့ခတ် ချိန်းတံခါး", "locking_chain_issue": "သော့ခတ် ချိန်းပြဿနာ", "issuing_chain_door": "ထုတ်ပေးသော ချိန်းတံခါး", "issuing_chain_issue": "ထုတ်ပေးသော ချိန်းပြဿနာ", "signature_reward": "လက်မှတ်ထိုး ဆုကြေး", "min_account_create_amount": "အကောင့်ဖွင့်ရန် အနည်းဆုံး ပမာဏ", "other_chain_source": "အခြား ချိန်း ရင်းမြစ်", "xchain_claim_id": "XChain တောင်းဆိုမှု ID", "check_nft_id": "သင့် NFT ID ကို စစ်ဆေးပါ", "get_nft_state_failed": "NFT ကို ဖွင့်၍မရပါ", "minted": "ထုတ်လုပ်ပြီး", "taxon_id": "Taxon ID", "transfer_fee": "လွှဲပြောင်းခ", "burnable": "ဖျက်ဆီးနိုင်သော", "only_xrp": "XRP သာ", "transferable": "လွှဲပြောင်းနိုင်သော", "buy_offers": "ဝယ်ယူရန် ကမ်းလှမ်းချက်များ", "sell_offers": "ရောင်းချရန် ကမ်းလှမ်းချက်များ", "offer_index": "ကမ်းလှမ်းမှု ID", "no_sell_offers": "ရောင်းချရန် ကမ်းလှမ်းချက်များ မရှိပါ", "no_buy_offers": "ဝယ်ယူရန် ကမ်းလှမ်းချက်များ မရှိပါ", "validator_history.chain": "ချိန်း", "validator_history.date": "ရက်စွဲ (UTC)", "validator_history.missed": "လွဲချော်", "validator_history.score": "ရမှတ်", "seller": "ရောင်းချသူ", "buyer": "ဝယ်ယူသူ", "offerer": "ကမ်းလှမ်းသူ", "token_taxon": "Token Taxon", "uri": "URI", "owner": "ပိုင်ရှင်", "other_chain_destination": "အခြား ချိန်း ဦးတည်ရာ", "%_of_total_nodes_validators": "Nodes နှင့် အတည်ပြုသူများ စုစုပေါင်း %", "version_display": "ဗားရှင်း: {{version}}", "validator_count": "အတည်ပြုသူ အရေအတွက်: {{val_count}}", "node_count": "Node အရေအတွက်: {{node_count}}", "current_stable_version": "လက်ရှိ တည်ငြိမ်သော ဗားရှင်း", "stable_version": "{{stableVersion}}", "nftoken_minter": "NFT ထုတ်လုပ်သူ", "is_burned": "ဖျက်ဆီးပြီး", "fee_rate": "အခကြေးငွေ နှုန်းထား", "last_affecting_transaction": "နောက်ဆုံး သက်ရောက်မှုရှိသော ငွေလွှဲမှု", "Version": "ဗားရှင်း", "increased_by": "တိုးလာသည်", "trading_fee": "ရောင်းဝယ်မှု အခကြေးငွေ", "tvl": "TVL", "account_address": "အကောင့် လိပ်စာ", "asset1": "ပိုင်ဆိုင်မှု ၁", "asset2": "ပိုင်ဆိုင်မှု ၂", "asset1out": "ပိုင်ဆိုင်မှု ၁ ထွက်", "asset2out": "ပိုင်ဆိုင်မှု ၂ ထွက်", "asset1in": "ပိုင်ဆိုင်မှု ၁ ဝင်", "asset2in": "ပိုင်ဆိုင်မှု ၂ ဝင်", "effective_price": "အမှန်တကယ် စျေးနှုန်း", "amm_account_id": "AMM အကောင့် ID", "lp_tokens": "LP Tokens", "min_slot_price": "အနိမ့်ဆုံး နေရာ စျေးနှုန်း", "max_slot_price": "အမြင့်ဆုံး နေရာ စျေးနှုန်း", "auth_accounts": "ခွင့်ပြုထားသော အကောင့်များ", "network_cannot_be_crawled": "ဤကွန်ယက်ကို ရှာဖွေ၍မရပါ", "check_crawl_existed": "ကျေးဇူးပြု၍ /crawl သို့မဟုတ် vl set ရရှိနိုင်ကြောင်း သေချာစေရန် အော်ပရေတာကို ဆက်သွယ်ပါ။", "peer_crawled_context": "နောက်ထပ် အချက်အလက်များအတွက် https://xrpl.org/peer-crawler.html ကို ကြည့်ပါ", "xchainbridge": "XChainBridge", "xchain_account_claim_count": "XChain အကောင့် တောင်းဆိုမှု အရေအတွက်", "xchain_account_create_count": "XChain အကောင့် ဖန်တီးမှု အရေအတွက်", "min_signer_quorum": "အနည်းဆုံး အလေးချိန် <0>{{quorum}} လိုအပ်သည်", "holder": "ကိုင်ဆောင်သူ", "action_from": "<0><0>{{action}} <1><0>{{amount}} မှ <3><0>{{destination}}", "action_from_and": null, "claws_back": "ပြန်လည်ရယူ", "claws_back_from": " မှ ထံမှ ပြန်လည်ရယူ", "instruct_to_claw": "အများဆုံး ပြန်လည်ရယူနိုင်သော ပမာဏမှာ ", "hook": "Hook", "hooks": "Hooks", "hook_emitted": "ဤငွေလွှဲမှုကို Hook မှ ထုတ်လွှတ်ခဲ့သည်", "emit_details": "ထုတ်လွှတ်မှု အသေးစိတ်", "hook_parameters": "Hook Parameters", "hook_executions": "Hook အကောင်အထည်ဖော်မှုများ", "emit_generation": "ထုတ်လုပ်ထားသော ငွေလွှဲမှုများတွင် နံပါတ် <0>{{emit}}", "emit_hook_hash": "Hook <0>{{hash}} မှ ထုတ်လွှတ်သည်", "emit_parent": "Hook <0>{{hash}} မှ စတင်သော hook မှ ထုတ်လွှတ်သည်", "emit_callback": "ထုတ်လွှတ်မှု callback မှာ <0>{{callback}}<0>", "hook_exec_hash": "Hook <0>{{hash}} ကို စတင်သည်", "hook_exec_account": "အကောင့် <0>{{account}} ပေါ်တွင်", "hook_exec_return": "ကုဒ် <0>{{code}} နှင့် စာသား \"<1>{{string}}\" ကို ပြန်လည်ပေးပို့သည်", "hook_exec_emit_count": "ငွေလွှဲမှု <0>{{count}} ခု ထုတ်လွှတ်သည်", "hash": "Hash", "grant": "ခွင့်ပြုချက်", "namespace": "Namespace", "api_version": "API ဗားရှင်း", "triggered_on": "စတင်သည့်အချိန်", "name": "အမည်", "introduced_in": "မိတ်ဆက်သည့်အချိန်", "yeas": "ထောက်ခံမဲများ", "nays": "ကန့်ကွက်မဲများ", "eta": "ခန့်မှန်းချိန်", "amendment_summary": "ပြင်ဆင်ချက် အကျဉ်းချုပ်", "not": "မဟုတ်", "enable_tx": "ငွေလွှဲမှု ဖွင့်ရန်", "all": "အားလုံး", "yeas_count": "ထောက်ခံမဲ အရေအတွက်: {{yeas_count}}", "nays_count": "ကန့်ကွက်မဲ အရေအတွက်: {{nays_count}}", "yeas_percent": "ထောက်ခံမဲ ရာခိုင်နှုန်း: {{yeas_percent}}%", "nays_percent": "ကန့်ကွက်မဲ ရာခိုင်နှုန်း: {{nays_percent}}%", "%_of_validators": "အတည်ပြုသူများ၏ %", "amendment_not_found": "ပြင်ဆင်ချက် မတွေ့ရှိပါ", "check_amendment_key": "ကျေးဇူးပြု၍ သင့် ပြင်ဆင်ချက် key ကို စစ်ဆေးပါ", "did_document": "DID စာရွက်စာတမ်း", "attestation": "သက်သေခံချက်", "note": "မှတ်ချက်", "indicate_unl": "UNL ပေါ်ရှိ အတည်ပြုသူတစ်ဦးကို ညွှန်ပြသည်", "transaction_tokens_involved": " နှင့် ", "transaction_tokens_swapped": " မှ သို့", "oracle_document_id": "Oracle စာရွက်စာတမ်း ID", "provider": "ပံ့ပိုးသူ", "last_update_time": "နောက်ဆုံး အပ်ဒိတ် အချိန်", "asset_class": "ပိုင်ဆိုင်မှု အမျိုးအစား", "trading_pairs": "ရောင်းဝယ်မှု အတွဲများ", "deleted": "ဖျက်ထားသည်", "holders_count": "ကိုင်ဆောင်သူများ: {{holders}}", "trustlines": "ယုံကြည်မှု လမ်းကြောင်းများ: {{trustlines}}", "website": "ဝဘ်ဆိုဒ်", "mpt_issuance_id": "MPT ထုတ်ဝေမှု ID", "asset_scale": "ပိုင်ဆိုင်မှု အတိုင်းအတာ", "metadata": "Metadata", "max_amount": "အများဆုံး ပမာဏ", "mpt_holder": "MPT ကိုင်ဆောင်သူ", "check_mpt_id": "ကျေးဇူးပြု၍ သင့် MPT ထုတ်ဝေမှု ID ကို စစ်ဆေးပါ", "outstanding_amount": "ထုတ်ပေးထားသော ပမာဏ", "locked": "သော့ခတ်ထား", "can_lock": "သော့ခတ်နိုင်", "require_auth": "ခွင့်ပြုချက် လိုအပ်", "can_escrow": "Escrow လုပ်နိုင်", "can_trade": "ရောင်းဝယ်နိုင်", "can_transfer": "လွှဲပြောင်းနိုင်", "can_clawback": "ပြန်လည်ရယူနိုင်", "enable_amendment_name": "ပြင်ဆင်ချက် အမည်", "amendment_status": "ပြင်ဆင်ချက် အခြေအနေ", "expected_date": "မျှော်မှန်းရက်စွဲ", "base": null, "credential_type": null, "credential_issuer": null, "subject": null, "expiration": null, "domain_id": null, "accepted_credentials": null, "credential_ids": null, "data": null, "finish_function": null, "quorum_description": null, "avg_fee_description": null, "ledger_interval_description": null, "txn_ledger_description": null, "txn_sec_description": null, "load_fee_description": null, "nUnl_description": null, "computation_allowance": null, "gas": null, "delegate": null, "permissions": null, "pertaining_to_the_Permissioned_Domain": null, "tx_delegated_to": null, "account_delegates_to": null, "delegate_to": null, "volume": null, "holders": null, "trades": null, "no_of_tokens": null, "volume_24h_total": null, "volume_24h_total_description": null, "market_cap_metric_description": null, "market_cap_description": null, "24h_description": null, "volume_description": null, "trades_description": null, "tvl_description": null, "stablecoin_description": null, "stablecoin": null, "wrapped": null, "tokens_footnote": null, "xrplmeta_guidelines": null, "inner_transaction": null, "batch_table_detail_count": null, "batch_table_detail_list": null, "batch_description": null, "batch": null, "successful": null, "failed": null, "not-validated": null, "asset": null, "assets_maximum": null, "mptoken_metadata": null, "withdrawal_policy": null, "account_creates_vault": null, "vault_id": null, "single_asset_vault": null, "loan_broker_id": null, "loan_id": null, "management_fee_rate": null, "debt_maximum": null, "cover_rate_minimum": null, "cover_rate_liquidation": null, "counterparty": null, "principal_requested": null, "payment_total": null, "payment_interval": null, "grace_period": null, "loan_origination_fee": null, "loan_service_fee": null, "late_payment_fee": null, "close_payment_fee": null, "full_payment_fee": null, "overpayment_fee": null, "interest_rate": null, "late_interest_rate": null, "close_interest_rate": null, "overpayment_interest_rate": null, "set_vault_data": null, "set_vault_assets_maximum": null, "set_vault_domain_id": null, "account_deposits_into_vault": null, "account_withdraws_from_vault": null, "account_clawbacks_from_vault": null, "account_clawbacks_from_vault_amount_omitted": null, "account_deletes_vault": null, "vault_create_table_detail": null, "withdraws": null, "deletes": null, "vault_delete_table_detail": null, "account_flag_title_lsf_global_freeze": null, "account_flag_title_lsf_disable_master": null, "account_flag_title_lsf_default_ripple": null, "account_flag_title_lsf_allow_trustline_clawback": null, "account_flag_title_lsf_allow_trustline_locking": null, "account_flag_title_lsf_require_destination_tag": null, "account_flag_title_lsf_no_freeze": null, "account_flag_title_lsf_require_auth": null, "account_flag_title_lsf_disallow_xrp": null, "account_flag_title_lsf_disallow_incoming_trustline": null, "account_flag_title_lsf_disallow_incoming_pay_chan": null, "account_flag_title_lsf_disallow_incoming_nft_token_offer": null, "account_flag_title_asf_authorized_nft_token_minter": null, "account_flag_title_lsf_disallow_incoming_check": null, "account_flag_title_lsf_deposit_auth": null, "account_flag_title_asf_account_txn_id": null, "account_flag_description_lsf_global_freeze": null, "account_flag_description_lsf_disable_master": null, "account_flag_description_lsf_default_ripple": null, "account_flag_description_lsf_allow_trustline_clawback": null, "account_flag_description_lsf_allow_trustline_locking": null, "account_flag_description_lsf_require_destination_tag": null, "account_flag_description_lsf_no_freeze": null, "account_flag_description_lsf_require_auth": null, "account_flag_description_lsf_disallow_xrp": null, "account_flag_description_lsf_disallow_incoming_trustline": null, "account_flag_description_lsf_disallow_incoming_pay_chan": null, "account_flag_description_lsf_disallow_incoming_nft_token_offer": null, "account_flag_description_asf_authorized_nft_token_minter": null, "account_flag_description_lsf_disallow_incoming_check": null, "account_flag_description_lsf_deposit_auth": null, "account_flag_description_asf_account_txn_id": null, "account_page_address": null, "account_page_address_tag": null, "account_page_classic_address": null, "account_page_deleted_account_label": null, "account_page_deleted_account_warning": null, "account_page_extended_address": null, "account_page_domain": null, "account_page_reserve_balance": null, "account_page_xrp_balance": null, "account_page_xrp_balance_in_usd": null, "account_page_account_properties": null, "account_page_flags": null, "account_page_flag_status_enabled": null, "account_page_flag_status_disabled": null, "account_page_signers": null, "account_page_signer_weight": null, "account_page_details": null, "account_page_current_sequence": null, "account_page_ticket_count": null, "account_page_email_hash": null, "account_page_payment_channels": null, "account_page_payment_channels_text": null, "account_page_nft_minter": null, "account_page_asset_held_title": null, "account_page_asset_issued_title": null, "account_page_asset_tab_iou": null, "account_page_asset_tab_lptoken": null, "account_page_asset_tab_mpt": null, "account_page_asset_tab_nft": null, "account_page_asset_table_column_amm_instance": null, "account_page_asset_table_column_amm_pair": null, "account_page_asset_table_column_asset_class": null, "account_page_asset_table_column_balance": null, "account_page_asset_table_column_balance_usd": null, "account_page_asset_table_column_circulating_supply": null, "account_page_asset_table_column_currency_code": null, "account_page_asset_table_column_frozen": null, "account_page_asset_table_column_highest_bid": null, "account_page_asset_table_column_holders": null, "account_page_asset_table_column_issuer": null, "account_page_asset_table_column_locked": null, "account_page_asset_table_column_lowest_ask": null, "account_page_asset_table_column_price_usd": null, "account_page_asset_table_column_share": null, "account_page_asset_table_column_supply": null, "account_page_asset_table_column_ticker": null, "account_page_asset_table_column_token_id": null, "account_page_asset_table_column_transfer_fee": null, "account_page_asset_table_column_trustlines": null, "account_page_asset_table_column_url": null, "account_page_asset_table_mpt_locked_global": null, "account_page_asset_table_mpt_locked_individual": null, "account_page_asset_table_no_iou": null, "account_page_asset_table_no_lptoken": null, "account_page_asset_table_no_mpt": null, "account_page_asset_table_no_nft": null, "tx_hash": null, "timestamp": null, "amount_in": null, "amount_out": null, "rate": null, "refresh_data": null, "token_page.general_overview": null, "token_page.market_data": null, "token_page.all_tx": null, "token_page.dex_tx": null, "token_page.transfers_tx": null, "token_page.holders_table": null, "token_page.issuer": null, "token_page.price": null, "token_page.holders": null, "token_page.supply": null, "token_page.market_cap": null, "token_page.volume_24h": null, "token_page.trades_24h": null, "token_page.amm_tvl": null, "token_page.transfer_fee": null, "token_page.holders_rank": null, "token_page.holders_num_tokens": null, "token_page.holders_percent_supply": null, "token_page.holders_no_holders": null, "token_page.holders_usd_value": null, "token_page.transfers_no_transfers": null, "token_page.circulating_supply": null, "token_page.dex_type": null, "token_page.dex_amount_in_tooltip": null, "token_page.dex_amount_out_tooltip": null, "token_page.dex_rate_tooltip": null, "token_page.dex_no_trades": null, "token_page.token_label": null, "token_page.category_text": null, "token_type.iou": null, "token_type.mpt": null, "iou_page.trustlines": null, "mpt_page.metadata_warning": null, "data_available_from_notice": null, "copied": null, "click_to_copy": null, "withdraw": null, "delete": null, "rates": null, "loan_broker_rates_detail": null, "loan_rates_detail": null, "loan_fees_detail": null, "loan_terms_detail": null, "no_limit": null, "first_loss_capital": null, "vault": null, "vault_not_found": null, "invalid_vault_id": null, "check_vault_id": null, "get_vault_failed": null, "private_vault": null, "perm_domain_id": null, "total_value_locked": null, "shares": null, "assets_available": null, "unrealized_loss": null, "other_data": null, "max_total_supply": null, "available_to_borrow": null, "not_available": null, "first_come_first_served": null, "loans": null, "loan_broker": null, "total_debt": null, "maximum_debt": null, "management_fee": null, "borrower": null, "amount_requested": null, "outstanding_balance": null, "loan_status_current": null, "loan_status_default": null, "all_loans": null, "loan_status_impaired": null, "loan_status_paid_off": null, "next_due_date": null, "origination_date": null, "frequency": null, "installments": null, "prepayment_fee": null, "no_loans_message": null, "loan_default_detected": null, "no_loan_brokers_message": null, "depositors_fetch_error": null, "no_depositors_message": null, "depositors": null, "percent_of_supply": null, "value": null, "currency_toggle_help": null, "currency_toggle_description": null, "currency_toggle_loading": null, "currency_toggle_loading_description": null, "currency_toggle_unavailable": null, "currency_toggle_unavailable_description": null, "vaults": null, "vaults_tvl": null, "vaults_tvl_description": null, "vaults_outstanding_loans": null, "vaults_outstanding_loans_description": null, "vaults_loans_originated": null, "vaults_loans_originated_description": null, "vaults_avg_interest_rate": null, "vaults_avg_interest_rate_description": null, "vaults_num_vaults": null, "vaults_num_vaults_description": null, "vaults_utilization_ratio": null, "vaults_utilization_ratio_description": null, "vaults_filter_all_assets": null, "vaults_filter_stablecoins": null, "vaults_search_placeholder": null, "vaults_table_vault_id": null, "vaults_table_asset": null, "vaults_table_tvl": null, "vaults_table_outstanding_loans": null, "vaults_table_utilization_ratio": null, "vaults_table_avg_interest_rate": null, "vaults_table_website": null, "vaults_no_results": null, "vaults_disclaimer": null, "amm_pool": null, "basic_info": null, "market_data": null, "auction": null, "created_on": null, "volume_24h_tooltip": null, "fees_24h": null, "fees_24h_tooltip": null, "apr_24h": null, "apr_24h_tooltip": null, "current_holder": null, "discounted_fee": null, "price_paid": null, "replacement_cost": null, "all_transactions": null, "dex_trades": null, "deposits": null, "withdrawals": null, "lp_tokens_received": null, "lp_tokens_redeemed": null, "tvl_and_volume": null, "no_deposits": null, "no_withdrawals": null, "liquidity_providers": null, "balance": null, "lp_token_currency_code": null, "asset_2": null, "usd_value": null, "amm_pool_deleted_label": null, "amm_pool_deleted_text": null, "amms": null, "top_1000_amms": null, "general_info": null, "number_of_amms": null, "number_of_lps": null, "number_of_amms_tooltip": null, "number_of_lps_tooltip": null, "search_amms": null, "tvl_tooltip": null, "volume_24h_all_tooltip": null } ================================================ FILE: public/manifest.json ================================================ { "short_name": "XRPL Explorer", "name": "XRPL Explorer", "icons": [ { "src": "favicon.ico", "sizes": "64x64 32x32 24x24 16x16", "type": "image/x-icon" }, { "src": "android-icon.png", "sizes": "192x192", "type": "image/png", "density": 4.0 } ], "start_url": "./index.html", "display": "standalone", "theme_color": "#000000", "background_color": "#ffffff" } ================================================ FILE: public/robots.txt ================================================ User-agent: * Allow: /$ Allow: /network Allow: /validators Disallow: /* ================================================ FILE: server/index.js ================================================ require('dotenv').config() const path = require('path') const express = require('express') const bodyParser = require('body-parser') const compression = require('compression') const routes = require('./routes/v1') const log = require('./lib/logger')({ name: 'server' }) const PORT = process.env.PORT || 5001 const ADDR = process.env.ADDR || 'localhost' const app = express() const cacheBustRegExp = /\.[0-9a-f]{20}\./ const files = express.static(path.join(__dirname, '/../build'), { etag: true, // Just being explicit about the default. lastModified: true, // Just being explicit about the default. setHeaders: (res, filePath) => { if (filePath.endsWith('.html')) { // All the project's HTML files end in .html res.setHeader('Cache-Control', 'no-cache') } else if (cacheBustRegExp.test(filePath)) { // If the RegExp matched, then we have a versioned URL. res.setHeader('Cache-Control', 'max-age=31536000') } }, }) app.use(compression()) app.use(bodyParser.json()) app.use(files) app.use('/api/v1', routes) if (process.env.NODE_ENV === 'production') { app.get('*', (_req, res) => { res.sendFile(path.join(__dirname, '/../build/index.html')) }) } app.use('*', (req, res) => { log.error('not found:', req.originalUrl) res.status(404).send({ error: 'route not found' }) }) app.listen(PORT, ADDR) log.info(`server listening on ${ADDR}:${PORT}`) ================================================ FILE: server/lib/logger.js ================================================ const bunyan = require('bunyan') module.exports = (options) => { const logger = bunyan.createLogger(options) return { info: (...args) => { logger.info(...args) }, warn: (...args) => { logger.warn(...args) }, error: (...args) => { logger.error(...args) }, debug: (...args) => { logger.debug(...args) }, } } ================================================ FILE: server/lib/rippled.js ================================================ const axios = require('axios') const { XrplClient } = require('xrpl-client') const log = require('./logger')({ name: 'rippled' }) const utils = require('./utils') const streams = require('./streams') const RIPPLEDS = [] process.env.VITE_RIPPLED_HOST?.split(',').forEach((host) => { if (host?.includes(':')) { RIPPLEDS.push(`wss://${host}`) } else if (process.env.VITE_RIPPLED_WS_PORT) { RIPPLEDS.push(`wss://${host}:${process.env.VITE_RIPPLED_WS_PORT}`) } else { RIPPLEDS.push(`wss://${host}`) } }) const RIPPLED_CLIENT = new XrplClient(RIPPLEDS, { tryAllNodes: true }) // If there is a separate peer to peer server for admin requests, use it. Otherwise use the default url for everything. const HAS_P2P_SOCKET = process.env.VITE_P2P_RIPPLED_HOST != null && process.env.VITE_P2P_RIPPLED_HOST !== '' const P2P_RIPPLED_CLIENT = HAS_P2P_SOCKET ? new XrplClient([ `wss://${process.env.VITE_P2P_RIPPLED_HOST}:${process.env.VITE_RIPPLED_WS_PORT}`, ]) : undefined const P2P_URL_BASE = process.env.VITE_P2P_RIPPLED_HOST ? process.env.VITE_P2P_RIPPLED_HOST : process.env.VITE_RIPPLED_HOST const URL_HEALTH = `https://${P2P_URL_BASE}:${process.env.VITE_RIPPLED_PEER_PORT}/health` RIPPLED_CLIENT.on('ledger', (data) => { log.info(`Received ${data?.type} message`) if (data.type === 'ledgerClosed') { streams.handleLedger(data) } }) setInterval(() => { log.info('Rippled client:', { state: RIPPLED_CLIENT.getState?.() || 'unknown', }) }, 60_000) // Log rippled client state every 60 seconds const executeQuery = async (rippledSocket, params) => rippledSocket.send(params).catch((error) => { const message = error.response && error.response.error_message ? error.response.error_message : error.toString() const code = error.response && error.response.status ? error.response.status : 500 throw new Error(`URL: ${rippledSocket.endpoint} - ${message}`, code) }) // generic RPC query function query(...options) { return executeQuery(RIPPLED_CLIENT, ...options) } function queryP2P(...options) { return executeQuery(P2P_RIPPLED_CLIENT ?? RIPPLED_CLIENT, ...options) } // get account info module.exports.getAccountInfo = (account, ledgerIndex = 'validated') => query({ command: 'account_info', account, ledger_index: ledgerIndex, signer_lists: true, }).then((resp) => { if (resp.error === 'actNotFound') { throw new utils.Error('account not found', 404) } if (resp.error_message) { throw new utils.Error(resp.error_message, 500) } return Object.assign(resp.account_data, { ledger_index: resp.ledger_index, }) }) // get Token balance summary module.exports.getBalances = (account, ledgerIndex = 'validated') => queryP2P({ command: 'gateway_balances', account, ledger_index: ledgerIndex, }).then((resp) => { if (resp.error === 'actNotFound') { throw new utils.Error('account not found', 404) } if (resp.error_message) { throw new utils.Error(resp.error_message, 500) } return resp }) module.exports.getOffers = ( currencyCode, issuerAddress, pairCurrencyCode, pairIssuerAddress, ) => query({ command: 'book_offers', taker_gets: { currency: `${currencyCode.toUpperCase()}`, issuer: currencyCode.toUpperCase() === 'XRP' ? undefined : `${issuerAddress}`, }, taker_pays: { currency: `${pairCurrencyCode.toUpperCase()}`, issuer: pairCurrencyCode.toUpperCase() === 'XRP' ? undefined : `${pairIssuerAddress}`, }, }).then((resp) => { if (resp.error !== undefined || resp.error_message !== undefined) { throw new utils.Error(resp.error_message || resp.error, 500) } return resp }) module.exports.getHealth = async () => axios.get(URL_HEALTH).catch((error) => { if (error.response) { throw new utils.Error(error.response.data, error.response.status) } else if (error.request) { throw new utils.Error('rippled unreachable', 500) } else { throw new utils.Error('rippled unreachable', 500) } }) module.exports.getLedger = (parameters) => { const request = { command: 'ledger', ...parameters, transactions: true, expand: true, } return query(request).then((resp) => { if (resp.error_message === 'ledgerNotFound') { throw new utils.Error('ledger not found', 404) } if (resp.error_message === 'ledgerIndexMalformed') { throw new utils.Error('invalid ledger index/hash', 400) } if (resp.error_message) { throw new utils.Error(resp.error_message, 500) } if (!resp.validated) { throw new utils.Error('ledger not validated', 404) } return resp.ledger }) } // get AMM info by AMM account ID module.exports.getAMMInfo = (ammAccountId) => query({ command: 'amm_info', amm_account: ammAccountId, ledger_index: 'validated', }).then((resp) => { if (resp.error_message) { throw new utils.Error(resp.error_message, 500) } return resp }) ================================================ FILE: server/lib/streams.js ================================================ const rippled = require('./rippled') const utils = require('./utils') const log = require('./logger')({ name: 'streams' }) const PURGE_INTERVAL = 10 * 1000 const MAX_AGE = 5 * 60 * 1000 const ledgers = {} const currentMetric = { base_fee: undefined, txn_sec: undefined, txn_ledger: undefined, ledger_interval: undefined, avg_fee: undefined, } module.exports.getCurrentMetrics = () => currentMetric // add the ledger to the cache const addLedger = (data) => { const { ledger_index: ledgerIndex } = data if (!ledgers[ledgerIndex]) { ledgers[ledgerIndex] = { ledger_index: Number(ledgerIndex), seen: Date.now(), ledger_hash: data.ledger_hash, txn_count: Number(data.txn_count), } } return ledgers[ledgerIndex] } const getTotalFees = (ledger) => { let totalFees = 0 ledger.transactions.forEach((tx) => { totalFees += Number(tx.Fee) }) return totalFees / utils.XRP_BASE } // fetch full ledger const fetchLedger = (ledger, attempts = 0) => { rippled .getLedger({ ledger_hash: ledger.ledger_hash }) .then(getTotalFees) .then((totalFees) => { Object.assign(ledger, { total_fees: totalFees }) }) .catch((error) => { log.error(error.toString()) if (error.code === 404 && attempts < 5) { log.info( `retry ledger ${ledger.ledger_index} (attempt:${attempts + 1})`, ) setTimeout(fetchLedger, 500, ledger, attempts + 1) } }) } // convert to array and sort const organizeChain = () => Object.entries(ledgers) .map((d) => d[1]) .sort((a, b) => a.ledger_index - b.ledger_index) // purge old data const purge = () => { const now = Date.now() Object.keys(ledgers).forEach((key) => { if (now - ledgers[key].seen > MAX_AGE) { delete ledgers[key] } }) } // update rolling metrics const updateMetrics = (baseFee) => { const chain = organizeChain().slice(-50) let time = 0 let fees = 0 let timeCount = 0 let txCount = 0 let ledgerCount = 0 chain.forEach((d, i) => { const next = chain[i + 1] if (next && next.seen && d.seen) { time += next.seen - d.seen timeCount += 1 } if (d.total_fees) { fees += d.total_fees txCount += d.txn_count ?? 0 } ledgerCount += 1 }) currentMetric.base_fee = Number(baseFee.toPrecision(4)).toString() currentMetric.txn_sec = time ? ((txCount / time) * 1000).toFixed(2) : undefined currentMetric.txn_ledger = ledgerCount ? (txCount / ledgerCount).toFixed(2) : undefined currentMetric.ledger_interval = timeCount ? (time / timeCount / 1000).toFixed(3) : undefined currentMetric.avg_fee = txCount ? (fees / txCount).toPrecision(4) : undefined } // handle ledger messages module.exports.handleLedger = (data) => { const ledger = addLedger(data) log.info('new ledger', data.ledger_index) ledger.close_time = (data.ledger_time + utils.EPOCH_OFFSET) * 1000 updateMetrics(data.fee_base / utils.XRP_BASE) fetchLedger(ledger) } setInterval(purge, PURGE_INTERVAL) ================================================ FILE: server/lib/utils.js ================================================ const EPOCH_OFFSET = 946684800 module.exports.EPOCH_OFFSET = EPOCH_OFFSET module.exports.XRP_BASE = 1000000 function CustomError(message, code) { Error.captureStackTrace(this, this.constructor) this.name = this.constructor.name this.message = message this.code = code } require('util').inherits(CustomError, Error) module.exports.Error = CustomError ================================================ FILE: server/routes/v1/amms.js ================================================ const axios = require('axios') const log = require('../../lib/logger')({ name: 'amms' }) const rippled = require('../../lib/rippled') const REFETCH_INTERVAL = 10 * 60 * 1000 // 10 minutes const LOS_TOKEN_API_BATCH_SIZE = 100 const AMM_INFO_CONCURRENCY = 2 // Max concurrent amm_info RPC calls const AMM_INFO_DELAY_MS = 200 // Delay between each amm_info RPC call per worker const cachedAMMsList = { results: [], last_updated: null } const cachedAggregatedStats = { data: null, last_updated: null } const cachedHistoricalTrends = new Map() // key: `${amm_account_id}:${time_range}` -> { data, last_updated } async function fetchAMMs() { const url = `${process.env.VITE_LOS_URL}/amms` log.info(`Fetching AMMs from: ${url}`) return axios .get(url, { params: { size: 1000, sort_field: 'tvl_usd', sort_order: 'desc', }, timeout: 30000, }) .then((resp) => { log.info( `Successfully fetched AMMs, status: ${resp.status}, count: ${resp.data?.results?.length || 0}`, ) return resp.data }) .catch((e) => { if (e.code === 'ECONNABORTED') { log.error(`Request timeout after 30 seconds for ${url}`) } else if (e.response) { log.error(`Failed to fetch AMMs from ${url}:`, { status: e.response.status, statusText: e.response.statusText, data: e.response.data, }) } else if (e.request) { log.error(`No response received from ${url}:`, { message: e.message, code: e.code, }) } else { log.error(`Error setting up request to ${url}:`, { message: e.message, }) } return { results: [] } }) } /** * Fetch token data (icon, asset_class, asset_subclass) from LOS /tokens/batch-get * for all unique non-XRP tokens across the AMM pools. * Returns a map of "CURRENCY.ISSUER" -> { icon, asset_class, asset_subclass } */ async function fetchTokenData(amms) { const tokenIds = new Set() amms.forEach((amm) => { if (amm.currency_1 && amm.issuer_1 && amm.currency_1 !== 'XRP') { tokenIds.add(`${amm.currency_1}.${amm.issuer_1}`) } if (amm.currency_2 && amm.issuer_2 && amm.currency_2 !== 'XRP') { tokenIds.add(`${amm.currency_2}.${amm.issuer_2}`) } }) const uniqueTokenIds = Array.from(tokenIds) if (uniqueTokenIds.length === 0) return {} log.info( `Fetching token data for ${uniqueTokenIds.length} unique tokens from LOS`, ) const tokenDataMap = {} const url = `${process.env.VITE_LOS_URL}/tokens/batch-get` // Batch in groups of LOS_TOKEN_API_BATCH_SIZE (DynamoDB BatchGetItem limit is 100) for (let i = 0; i < uniqueTokenIds.length; i += LOS_TOKEN_API_BATCH_SIZE) { const batch = uniqueTokenIds.slice(i, i + LOS_TOKEN_API_BATCH_SIZE) try { // eslint-disable-next-line no-await-in-loop const resp = await axios.post( url, { tokenIds: batch }, { timeout: 30000 }, ) const tokens = resp.data?.tokens || [] tokens.forEach((token) => { if (token.currency && token.issuer_account) { const key = `${token.currency}.${token.issuer_account}` tokenDataMap[key] = { icon: token.icon || undefined, asset_class: token.asset_class || undefined, asset_subclass: token.asset_subclass || undefined, } } }) } catch (e) { log.error(`Failed to batch-get tokens from LOS: ${e.message}`) } } log.info(`Fetched token data for ${Object.keys(tokenDataMap).length} tokens`) return tokenDataMap } /** * Fetch trading fees for AMM pools via amm_info RPC, called concurrently * with controlled concurrency to avoid overwhelming the rippled node. * Returns a map of amm_account_id -> trading_fee (raw value, 0-1000) */ async function fetchTradingFees(amms) { log.info(`Fetching trading fees for ${amms.length} AMMs via amm_info RPC`) const tradingFeeMap = {} const queue = [...amms] let completed = 0 const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) // Process AMMs with controlled concurrency and delays async function processNext() { while (queue.length > 0) { const amm = queue.shift() try { // eslint-disable-next-line no-await-in-loop const resp = await rippled.getAMMInfo(amm.amm_account_id) if (resp?.amm?.trading_fee !== undefined) { tradingFeeMap[amm.amm_account_id] = resp.amm.trading_fee } } catch (e) { // Silently skip — trading fee is non-critical log.warn( `Failed to fetch amm_info for ${amm.amm_account_id}: ${e.message}`, ) } completed += 1 if (completed % 100 === 0) { log.info(`Trading fee progress: ${completed}/${amms.length}`) } // eslint-disable-next-line no-await-in-loop await delay(AMM_INFO_DELAY_MS) } } // Launch AMM_INFO_CONCURRENCY workers const workers = [] for (let i = 0; i < Math.min(AMM_INFO_CONCURRENCY, amms.length); i += 1) { workers.push(processNext()) } await Promise.all(workers) log.info( `Fetched trading fees for ${Object.keys(tradingFeeMap).length}/${amms.length} AMMs`, ) return tradingFeeMap } async function fetchAggregatedStats() { const url = `${process.env.VITE_LOS_URL}/amms/aggregated` log.info(`Fetching aggregated stats from: ${url}`) return axios .get(url, { timeout: 30000, }) .then((resp) => { log.info(`Successfully fetched aggregated stats, status: ${resp.status}`) return resp.data }) .catch((e) => { if (e.code === 'ECONNABORTED') { log.error(`Request timeout after 30 seconds for ${url}`) } else if (e.response) { log.error(`Failed to fetch aggregated stats from ${url}:`, { status: e.response.status, statusText: e.response.statusText, data: e.response.data, }) } else if (e.request) { log.error(`No response received from ${url}:`, { message: e.message, code: e.code, }) } else { log.error(`Error setting up request to ${url}:`, { message: e.message, }) } return null }) } function enrichAMMs(amms, tokenDataMap) { return amms.map((amm) => { const token1Key = amm.currency_1 && amm.issuer_1 ? `${amm.currency_1}.${amm.issuer_1}` : null const token2Key = amm.currency_2 && amm.issuer_2 ? `${amm.currency_2}.${amm.issuer_2}` : null const token1Data = token1Key ? tokenDataMap[token1Key] : undefined const token2Data = token2Key ? tokenDataMap[token2Key] : undefined return { ...amm, icon_1: token1Data?.icon, icon_2: token2Data?.icon, asset_class_1: token1Data?.asset_class || amm.asset_class_1, asset_class_2: token2Data?.asset_class || amm.asset_class_2, asset_subclass_1: token1Data?.asset_subclass, asset_subclass_2: token2Data?.asset_subclass, } }) } async function cacheAMMs() { const losAMMs = await fetchAMMs() if (losAMMs.results && losAMMs.results.length > 0) { log.info(`Fetched ${losAMMs.results.length} AMMs from LOS...`) // Build a map of previously cached trading fees + token data so they // survive across cache refreshes while fetchTradingFees re-fetches (~100s). // Only carry over fields that have defined values to avoid overwriting // fresh LOS data with undefined. const previousDataMap = {} cachedAMMsList.results.forEach((amm) => { if (amm.amm_account_id) { const prev = {} if (amm.trading_fee !== undefined) prev.trading_fee = amm.trading_fee if (amm.icon_1 !== undefined) prev.icon_1 = amm.icon_1 if (amm.icon_2 !== undefined) prev.icon_2 = amm.icon_2 if (amm.asset_class_1 !== undefined) prev.asset_class_1 = amm.asset_class_1 if (amm.asset_class_2 !== undefined) prev.asset_class_2 = amm.asset_class_2 if (amm.asset_subclass_1 !== undefined) prev.asset_subclass_1 = amm.asset_subclass_1 if (amm.asset_subclass_2 !== undefined) prev.asset_subclass_2 = amm.asset_subclass_2 if (Object.keys(prev).length > 0) { previousDataMap[amm.amm_account_id] = prev } } }) // Cache AMMs immediately, carrying over previously enriched data cachedAMMsList.results = losAMMs.results.map((amm) => ({ ...amm, ...(previousDataMap[amm.amm_account_id] || {}), })) cachedAMMsList.last_updated = Date.now() log.info( `Cached ${cachedAMMsList.results.length} AMMs (enriching with token data and trading fees in background)`, ) // Fetch token data in the background — updates the cache when ready fetchTokenData(losAMMs.results) .then((tokenDataMap) => { cachedAMMsList.results = enrichAMMs( cachedAMMsList.results, tokenDataMap, ) log.info( `Updated cache with token data for ${Object.keys(tokenDataMap).length} tokens`, ) }) .catch((e) => { log.error(`Failed to fetch token data: ${e.message}`) }) // Fetch trading fees in the background — updates the cache when ready fetchTradingFees(losAMMs.results) .then((tradingFeeMap) => { cachedAMMsList.results = cachedAMMsList.results.map((amm) => ({ ...amm, trading_fee: tradingFeeMap[amm.amm_account_id] !== undefined ? tradingFeeMap[amm.amm_account_id] : amm.trading_fee, })) log.info( `Updated cache with trading fees for ${Object.keys(tradingFeeMap).length} AMMs`, ) }) .catch((e) => { log.error(`Failed to fetch trading fees: ${e.message}`) }) } else if (cachedAMMsList.results.length > 0) { log.warn( `Failed to fetch AMMs from LOS, using stale cached data ` + `(${cachedAMMsList.results.length} AMMs from ` + `${new Date(cachedAMMsList.last_updated).toISOString()})`, ) } else { log.error('Failed to fetch AMMs from LOS and no cached data available') } } async function cacheAggregatedStats() { const stats = await fetchAggregatedStats() if (stats) { log.info('Fetched aggregated stats from LOS...') cachedAggregatedStats.data = stats cachedAggregatedStats.last_updated = Date.now() log.info('Cached aggregated stats') } else if (cachedAggregatedStats.data) { log.warn( `Failed to fetch aggregated stats from LOS, using stale cached data ` + `(from ${new Date(cachedAggregatedStats.last_updated).toISOString()})`, ) } else { log.error( 'Failed to fetch aggregated stats from LOS and no cached data available', ) } } function startCaching() { if (process.env.VITE_ENVIRONMENT !== 'mainnet') { return } cacheAMMs() cacheAggregatedStats() setInterval(() => cacheAMMs(), REFETCH_INTERVAL) setInterval(() => cacheAggregatedStats(), REFETCH_INTERVAL) } startCaching() function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)) } function sortAMMs(amms, sortField, sortOrder) { const sorted = [...amms] sorted.sort((a, b) => { const aVal = Number(a[sortField]) || 0 const bVal = Number(b[sortField]) || 0 return sortOrder === 'desc' ? bVal - aVal : aVal - bVal }) return sorted } /** * GET /api/v1/amms * Fetch top AMMs with sorting (from cache) */ const getAMMs = async (req, res) => { try { const { size = 1000, sort_field: sortField = 'tvl_usd', sort_order: sortOrder = 'desc', } = req.query log.info( `Fetching AMMs from cache: size=${size}, sort_field=${sortField}, sort_order=${sortOrder}`, ) // Wait for cache to be populated (with timeout) let timeoutLimit = 10 while (cachedAMMsList.results.length === 0 && timeoutLimit > 0) { // eslint-disable-next-line no-await-in-loop -- necessary here to wait for cache to be filled await sleep(1000) timeoutLimit -= 1 } // Sort and limit results let results = sortAMMs(cachedAMMsList.results, sortField, sortOrder) results = results.slice(0, Number(size)) log.info(`Returning ${results.length} AMMs from cache`) return res.status(200).json({ results, updated: cachedAMMsList.last_updated, }) } catch (error) { log.error(error) return res.status(error.code || 500).json({ message: error.message }) } } /** * GET /api/v1/amms/aggregated * Fetch aggregated AMM statistics * This fetches the special "aggregated" document from the amms index */ const getAggregatedStats = async (req, res) => { try { log.info('Fetching aggregated AMM stats from cache') // Wait for cache to be populated (with timeout) let timeoutLimit = 10 while (!cachedAggregatedStats.data && timeoutLimit > 0) { // eslint-disable-next-line no-await-in-loop -- necessary here to wait for cache to be filled await sleep(1000) timeoutLimit -= 1 } return res.status(200).json({ ...cachedAggregatedStats.data, updated: cachedAggregatedStats.last_updated, }) } catch (error) { log.error(error) return res.status(error.code || 500).json({ message: error.message }) } } /** * GET /api/v1/amms/historical-trends * Fetch historical trends for AMM data */ async function fetchHistoricalTrends(ammAccountId, timeRange) { const url = `${process.env.VITE_LOS_URL}/amms/historical-trends` log.info( `Fetching historical trends from: ${url} (amm_account_id=${ammAccountId}, time_range=${timeRange})`, ) return axios .get(url, { params: { amm_account_id: ammAccountId, time_range: timeRange, }, timeout: 30000, }) .then((resp) => { log.info( `Successfully fetched historical trends, ` + `status: ${resp.status}, ` + `data_points: ${resp.data?.total_data_points || 0}`, ) return resp.data }) .catch((e) => { if (e.code === 'ECONNABORTED') { log.error(`Request timeout after 30 seconds for ${url}`) } else if (e.response) { log.error(`Failed to fetch historical trends from ${url}:`, { status: e.response.status, statusText: e.response.statusText, data: e.response.data, }) } else if (e.request) { log.error(`No response received from ${url}:`, { message: e.message, code: e.code, }) } else { log.error(`Error setting up request to ${url}:`, { message: e.message, }) } return null }) } function getCachedTrends(ammAccountId, timeRange) { const cacheKey = `${ammAccountId}:${timeRange}` return cachedHistoricalTrends.get(cacheKey) || null } async function cacheTrends(ammAccountId, timeRange) { const cacheKey = `${ammAccountId}:${timeRange}` const trends = await fetchHistoricalTrends(ammAccountId, timeRange) if (trends) { log.info(`Fetched historical trends from LOS for ${cacheKey}...`) cachedHistoricalTrends.set(cacheKey, { data: trends, last_updated: Date.now(), }) log.info(`Cached historical trends for ${cacheKey}`) } else { const existing = cachedHistoricalTrends.get(cacheKey) if (existing) { log.warn( `Failed to fetch historical trends from LOS for ${cacheKey}, ` + `using stale cached data ` + `(from ${new Date(existing.last_updated).toISOString()})`, ) } else { log.error( `Failed to fetch historical trends from LOS for ${cacheKey} and no cached data available`, ) } } } const getHistoricalTrends = async (req, res) => { try { const { amm_account_id: ammAccountId = 'aggregated', time_range: timeRange = '6M', } = req.query log.info( `Fetching historical trends from cache: amm_account_id=${ammAccountId}, time_range=${timeRange}`, ) const cached = getCachedTrends(ammAccountId, timeRange) // If cached and fresh (within REFETCH_INTERVAL), return it if (cached && Date.now() - cached.last_updated < REFETCH_INTERVAL) { log.info('Returning historical trends from cache') return res.status(200).json({ ...cached.data, updated: cached.last_updated, }) } // Cache miss or stale — fetch fresh data await cacheTrends(ammAccountId, timeRange) const updated = getCachedTrends(ammAccountId, timeRange) return res.status(200).json({ ...updated?.data, updated: updated?.last_updated, }) } catch (error) { log.error(error) return res.status(error.code || 500).json({ message: error.message }) } } module.exports = { getAMMs, getAggregatedStats, getHistoricalTrends, } ================================================ FILE: server/routes/v1/currentMetrics.js ================================================ const log = require('../../lib/logger')({ name: 'metrics' }) const streams = require('../../lib/streams') module.exports = async (req, res) => { try { log.info('get current metrics') const metrics = await streams.getCurrentMetrics() return res.status(200).json(metrics) } catch (error) { log.error(`Failed metrics fetch w/ code ${error.code}: ${error.message}`) return res.status(error.code || 500).json({ message: error.message }) } } ================================================ FILE: server/routes/v1/health.js ================================================ const rippled = require('../../lib/rippled') const log = require('../../lib/logger')({ name: 'health' }) module.exports = async (req, res) => { try { const health = await rippled.getHealth() return res.status(200).json({ message: health.data }) } catch (error) { log.error(`Failed healthcheck w/ code ${error.code}: ${error.message}`) return res.status(error.code || 500).json({ message: error.message }) } } ================================================ FILE: server/routes/v1/index.js ================================================ const api = require('express').Router() const getHealth = require('./health') const getCurrentMetrics = require('./currentMetrics') const { getTokensSearch, getAllTokens } = require('./tokens') const { getVaults, getVaultsAggregateStats, getVaultAssetPrices, } = require('./vaults') const { getAMMs, getAggregatedStats, getHistoricalTrends } = require('./amms') api.use('/healthz', (_req, res) => { res.status(200).send('success') }) if (process.env.VITE_ENVIRONMENT !== 'custom') { // these require a single hardcoded rippled node to connect to api.use('/health', getHealth) api.use('/metrics', getCurrentMetrics) api.use('/tokens/search/:query', getTokensSearch) api.use('/tokens', getAllTokens) api.get('/vaults/aggregate-statistics', getVaultsAggregateStats) api.get('/vaults/asset-prices', getVaultAssetPrices) api.get('/vaults', getVaults) api.get('/amms/aggregated', getAggregatedStats) api.get('/amms/historical-trends', getHistoricalTrends) api.get('/amms', getAMMs) } module.exports = api ================================================ FILE: server/routes/v1/tokens.js ================================================ const axios = require('axios') const log = require('../../lib/logger')({ name: 'tokens search' }) const REFETCH_INTERVAL = 10 * 60 * 1000 // 10 minutes const cachedTokenList = { tokens: [], last_updated: null, metrics: null } const parseCurrency = (currency) => { const NON_STANDARD_CODE_LENGTH = 40 const LP_TOKEN_IDENTIFIER = '03' const hexToString = (hex) => { let string = '' for (let i = 0; i < hex.length; i += 2) { const part = hex.substring(i, i + 2) const code = parseInt(part, 16) if (!isNaN(code) && code !== 0) { string += String.fromCharCode(code) } } return string } return currency.length === NON_STANDARD_CODE_LENGTH && currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER ? hexToString(currency) : currency } const calculateMetrics = (tokens) => ({ count: tokens.length, market_cap: tokens .reduce((sum, token) => { const cap = Number(token.market_cap_usd) || 0 return cap > 0 ? sum + cap : sum }, 0) .toFixed(6), volume_24h: tokens .reduce((sum, token) => sum + Number(token.daily_volume_usd || 0), 0) .toFixed(6), stablecoin: tokens .reduce((sum, token) => { const cap = Number(token.market_cap_usd) || 0 return token.asset_subclass === 'stablecoin' && cap > 0 ? sum + cap : sum }, 0) .toFixed(6), }) async function fetchTokens() { const url = `${process.env.VITE_LOS_URL}/trusted-tokens` log.info(`Fetching tokens from: ${url}`) return axios .get(url, { timeout: 30000, }) .then((resp) => { log.info( `Successfully fetched tokens, status: ${resp.status}, count: ${resp.data?.tokens?.length || 0}`, ) return resp.data }) .catch((e) => { if (e.code === 'ECONNABORTED') { log.error(`Request timeout after 30 seconds for ${url}`) } else if (e.response) { log.error(`Failed to fetch tokens from ${url}:`, { status: e.response.status, statusText: e.response.statusText, data: e.response.data, }) } else if (e.request) { log.error(`No response received from ${url}:`, { message: e.message, code: e.code, }) } else { log.error(`Error setting up request to ${url}:`, { message: e.message, }) } return { count: 0 } }) } async function cacheTokens() { const losTokens = await fetchTokens() if (losTokens.tokens) { log.info(`Fetched ${losTokens.tokens.length} tokens from LOS...`) cachedTokenList.tokens = losTokens.tokens.sort( (a, b) => Number(b.holders ?? 0) - Number(a.holders ?? 0), ) cachedTokenList.last_updated = Date.now() // nonstandard from XRPLMeta, check for hex codes in currencies and store parsed cachedTokenList.tokens = cachedTokenList.tokens.map((token) => ({ ...token, parsedCurrency: parseCurrency(token.currency), })) // Calculate and cache metrics cachedTokenList.metrics = calculateMetrics(cachedTokenList.tokens) log.info(`Cached metrics for ${cachedTokenList.metrics.count} tokens`) } else { log.warn('Failed to fetch tokens from LOS, using stale cached data') } } function startCaching() { if (process.env.VITE_ENVIRONMENT !== 'mainnet') { return } cacheTokens() setInterval(() => cacheTokens(), REFETCH_INTERVAL) } startCaching() function queryTokens(tokenList, query) { if (!tokenList || !Array.isArray(tokenList) || !query) { return [] } const sanitizedQuery = query.toLowerCase().trim() if (!sanitizedQuery) { return [] } return tokenList.filter((token) => { try { const currencyMatch = token.currency ?.toLowerCase() .includes(sanitizedQuery) const parsedCurrencyMatch = token.parsedCurrency ?.toLowerCase() .includes(sanitizedQuery) const nameMatch = token.name?.toLowerCase().includes(sanitizedQuery) const issuerNameMatch = token.issuer_name ?.toLowerCase() .includes(sanitizedQuery) const issuerAccountStartsMatch = token.issuer_account ?.toLowerCase() .startsWith(sanitizedQuery) return ( currencyMatch || parsedCurrencyMatch || nameMatch || issuerNameMatch || issuerAccountStartsMatch ) } catch (error) { log.error(`Error filtering token: ${error.message}`, { token }) return false } }) } function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)) } const getTokensSearch = async (req, res) => { try { log.info('getting tokens list for search') const { query } = req.params let timeoutLimit = 10 while (cachedTokenList.tokens.length === 0 && timeoutLimit > 0) { // eslint-disable-next-line no-await-in-loop -- necessary here to wait for cache to be filled await sleep(1000) timeoutLimit -= 1 } const queriedTokens = await queryTokens(cachedTokenList.tokens, query) return res.status(200).json({ result: 'success', updated: cachedTokenList.last_updated, tokens: queriedTokens, }) } catch (error) { log.error(error) return res.status(error.code || 500).json({ message: error.message }) } } const getAllTokens = async (req, res) => { try { log.info('getting tokens list for search') while (cachedTokenList.tokens.length === 0) { // eslint-disable-next-line no-await-in-loop -- necessary here to wait for cache to be filled await sleep(1000) } log.info(cachedTokenList.tokens.length) return res.status(200).json({ result: 'success', updated: cachedTokenList.last_updated, tokens: cachedTokenList.tokens, metrics: cachedTokenList.metrics, }) } catch (error) { log.error(error) return res.status(error.code || 500).json({ message: error.message }) } } module.exports = { getTokensSearch, getAllTokens, } ================================================ FILE: server/routes/v1/vaults.js ================================================ const axios = require('axios') const log = require('../../lib/logger')({ name: 'vaults' }) const PRICE_REFETCH_INTERVAL = 5 * 60 * 1000 // 5 minutes const VAULTS_REFETCH_INTERVAL = 2 * 60 * 1000 // 2 minutes const AGG_STATS_REFETCH_INTERVAL = 10 * 60 * 1000 // 10 minutes const cachedPrices = { prices: {}, lastUpdated: null } const cachedAggStats = { data: null, lastUpdated: null } const cachedVaults = new Map() // key: query string, value: { data, lastUpdated } async function fetchAssetPrices() { try { const losUrl = `${process.env.VITE_LOS_URL}/trusted-tokens` log.info(`Fetching trusted tokens for vault prices from: ${losUrl}`) const resp = await axios.get(losUrl, { timeout: 30000 }) const tokens = resp.data?.tokens || [] // Filter to RWA asset class (stablecoins used by vaults) const rwaTokens = tokens.filter((t) => t.asset_class === 'rwa') log.info(`Found ${rwaTokens.length} RWA tokens for vault price lookup`) const prices = {} await Promise.all( rwaTokens.map(async (token) => { try { const losTokenUrl = `${process.env.VITE_LOS_URL}/tokens/${token.currency}.${token.issuer_account}` const tokenResp = await axios.get(losTokenUrl, { timeout: 10000 }) const xrpPrice = Number(tokenResp.data?.price) || 0 if (xrpPrice > 0) { const key = `${token.currency}.${token.issuer_account}` prices[key] = xrpPrice log.info( `Price for ${token.name || token.currency}: ${xrpPrice} XRP`, ) } } catch (e) { log.error(`Failed to fetch price for ${token.currency}: ${e.message}`) } }), ) cachedPrices.prices = prices cachedPrices.lastUpdated = Date.now() log.info(`Cached prices for ${Object.keys(prices).length} vault assets`) } catch (e) { log.error(`Failed to fetch asset prices: ${e.message}`) } } async function fetchAggregateStats() { try { const url = `${process.env.VITE_LOS_URL}/vaults/aggregate-statistics` log.info(`Fetching vault aggregate stats from: ${url}`) const resp = await axios.get(url, { timeout: 30000 }) cachedAggStats.data = resp.data cachedAggStats.lastUpdated = Date.now() log.info('Cached vault aggregate stats') } catch (e) { log.error(`Failed to fetch vault aggregate stats: ${e.message}`) } } async function fetchVaultsList() { try { // Fetch the default view (first page, sorted by TVL desc) to warm the cache const url = `${process.env.VITE_LOS_URL}/vaults?page=1&size=20&sort_by=assets_total&sort_order=desc` log.info(`Refreshing vaults list cache from: ${url}`) const resp = await axios.get(url, { timeout: 30000 }) const cacheKey = 'page=1&size=20&sort_by=assets_total&sort_order=desc' cachedVaults.set(cacheKey, { data: resp.data, lastUpdated: Date.now() }) log.info('Cached default vaults list') } catch (e) { log.error(`Failed to refresh vaults list cache: ${e.message}`) } } function startCaching() { if (process.env.VITE_ENVIRONMENT !== 'mainnet') { return } fetchAssetPrices() fetchAggregateStats() fetchVaultsList() setInterval(() => fetchAssetPrices(), PRICE_REFETCH_INTERVAL) setInterval(() => fetchAggregateStats(), AGG_STATS_REFETCH_INTERVAL) setInterval(() => fetchVaultsList(), VAULTS_REFETCH_INTERVAL) } startCaching() const getVaultAssetPrices = async (_req, res) => { try { return res.status(200).json({ prices: cachedPrices.prices, lastUpdated: cachedPrices.lastUpdated, }) } catch (error) { log.error('Failed to get vault asset prices:', error.message) return res .status(error.response?.status || 500) .json({ message: error.message }) } } const getVaults = async (req, res) => { try { const { page, size, sort_by: sortBy, sort_order: sortOrder, asset_type: assetType, name_like: nameLike, } = req.query const params = new URLSearchParams() if (page) params.set('page', page) if (size) params.set('size', size) if (sortBy) params.set('sort_by', sortBy) if (sortOrder) params.set('sort_order', sortOrder) if (assetType) params.set('asset_type', assetType) if (nameLike) params.set('name_like', nameLike) const cacheKey = params.toString() const cached = cachedVaults.get(cacheKey) if (cached && Date.now() - cached.lastUpdated < VAULTS_REFETCH_INTERVAL) { return res.status(200).json(cached.data) } const url = `${process.env.VITE_LOS_URL}/vaults?${cacheKey}` log.info(`Fetching vaults from: ${url}`) const resp = await axios.get(url, { timeout: 30000 }) cachedVaults.set(cacheKey, { data: resp.data, lastUpdated: Date.now() }) return res.status(200).json(resp.data) } catch (error) { log.error('Failed to fetch vaults:', error.message) return res .status(error.response?.status || 500) .json({ message: error.message }) } } const getVaultsAggregateStats = async (_req, res) => { try { if (cachedAggStats.data) { return res.status(200).json(cachedAggStats.data) } // Cache not yet populated (e.g. first request before background fetch completes) const url = `${process.env.VITE_LOS_URL}/vaults/aggregate-statistics` log.info(`Fetching vault aggregate stats from: ${url}`) const resp = await axios.get(url, { timeout: 30000 }) cachedAggStats.data = resp.data cachedAggStats.lastUpdated = Date.now() return res.status(200).json(resp.data) } catch (error) { log.error('Failed to fetch vault aggregate stats:', error.message) return res .status(error.response?.status || 500) .json({ message: error.message }) } } module.exports = { getVaults, getVaultsAggregateStats, getVaultAssetPrices, } ================================================ FILE: src/containers/AMMPool/AMMPoolHeader.tsx ================================================ import { FC } from 'react' import { useTranslation } from 'react-i18next' import Currency from '../shared/components/Currency' import { FormattedBalance } from './types' interface AMMPoolHeaderProps { asset1: FormattedBalance | null asset2: FormattedBalance | null } export const AMMPoolHeader: FC = ({ asset1, asset2 }) => { const { t } = useTranslation() return (

{t('amm_pool')}

{asset1 && asset2 && ( / )}
) } ================================================ FILE: src/containers/AMMPool/InfoCards/AuctionCard.tsx ================================================ import { FC } from 'react' import { useTranslation } from 'react-i18next' import { Account } from '../../shared/components/Account' import { shortenAccount, formatTradingFee, localizeDate, DATE_OPTIONS_NUMERIC, TRADING_FEE_BASE, } from '../../shared/utils' import { parseAmount, parseCurrencyAmount, } from '../../shared/NumberFormattingUtils' import AuctionIcon from '../../shared/images/auction_icon.svg' import { AuctionSlot } from '../types' interface AuctionCardProps { auctionSlot?: AuctionSlot tvlUsd?: number lpTokenBalance?: string tradingFee: number } /** * Calculate the minimum bid to replace the current auction slot holder. * * From XRPL docs (AMMBid - Auction Slot Price): * * Minimum bid (M): M = L * F / 25 * L = total LP tokens issued, F = trading fee as decimal * * Empty/expired/last interval: P = M * * First interval (time_interval=0): P = B * 1.05 + M * * Otherwise: P = B * 1.05 * (1 - t^60) + M * B = current bid price in LP tokens * t = fraction of time elapsed, rounded down to multiples of 0.05 * (time_interval / 20, where time_interval is 0-19) */ const calcReplacementCost = ( auctionSlot: AuctionSlot | undefined, lpTokenBalance: string | undefined, tradingFee: number, ): number | null => { if (!lpTokenBalance) { return null } // XRPL stores trading fees as integers in units of 1/100,000 (e.g. 1000 = 1%) const tradingFeeAsDecimal = tradingFee / TRADING_FEE_BASE const M = (Number(lpTokenBalance) * tradingFeeAsDecimal) / 25 const hasHolder = !!auctionSlot?.account // time_interval: 0-19 = active intervals, 20 = expired const interval = auctionSlot?.time_interval ?? 20 // Empty, expired (20), or last interval (19): just the minimum bid if (!hasHolder || interval >= 19) { return M } const B = Number(auctionSlot?.price?.value ?? 0) // First interval: B * 1.05 + M if (interval === 0) { return B * 1.05 + M } // Otherwise: B * 1.05 * (1 - t^60) + M const t = interval / 20 return B * 1.05 * (1 - t ** 60) + M } export const AuctionCard: FC = ({ auctionSlot, tvlUsd, lpTokenBalance, tradingFee, }) => { const { t } = useTranslation() const hasAuctionData = !!auctionSlot?.account const discountedFee = hasAuctionData ? `${formatTradingFee(auctionSlot?.discounted_fee ?? 0)}%` : '--' const getLPTokenUSD = (lpValue: number | string | undefined) => { if (lpValue == null) { return null } const num = Number(lpValue) if (num === 0) { return 0 } if (!lpTokenBalance || tvlUsd == null) { return null } return (num / Number(lpTokenBalance)) * tvlUsd } // Price Paid: directly from amm_info auction_slot.price const pricePaidLP = hasAuctionData && auctionSlot?.price ? parseAmount(auctionSlot.price.value) : null const pricePaidUSD = hasAuctionData && auctionSlot?.price ? getLPTokenUSD(auctionSlot.price.value) : null // Replacement Cost: formula-based on slot state and time_interval const replacementCostRaw = calcReplacementCost( auctionSlot, lpTokenBalance, tradingFee, ) const replacementLP = replacementCostRaw != null ? replacementCostRaw.toFixed(4) : null const replacementUSD = replacementCostRaw != null ? getLPTokenUSD(replacementCostRaw) : null return (

{t('auction')}

{t('current_holder')} {hasAuctionData && auctionSlot?.account ? ( ) : ( '--' )}
{t('expiration')} {auctionSlot?.expiration ? localizeDate( new Date(auctionSlot.expiration), 'en-US', DATE_OPTIONS_NUMERIC, ) : '--'}
{t('discounted_fee')} {discountedFee}
{t('price_paid')} {pricePaidLP ? ( <>
{pricePaidLP} {t('lp_tokens')}
{pricePaidUSD != null && (
≈ {parseCurrencyAmount(pricePaidUSD)}
)} ) : ( '--' )}
{t('replacement_cost')} {replacementLP ? ( <>
{parseAmount(replacementLP)} {t('lp_tokens')}
{replacementUSD != null && (
≈ {parseCurrencyAmount(replacementUSD)}
)} ) : ( '--' )}
) } ================================================ FILE: src/containers/AMMPool/InfoCards/BasicInfoCard.tsx ================================================ import { FC } from 'react' import { useTranslation } from 'react-i18next' import { CopyableText } from '../../shared/components/CopyableText' import { convertRippleDate } from '../../../rippled/lib/convertRippleDate' import { formatTradingFee, shortenAccount, shortenLPToken, } from '../../shared/utils' import BasicInfoIcon from '../../shared/images/info_book_icon.svg' interface BasicInfoCardProps { ammAccountId: string tradingFee: number createdTimestamp: number | null | undefined lpTokenCurrency?: string } export const BasicInfoCard: FC = ({ ammAccountId, tradingFee, createdTimestamp, lpTokenCurrency, }) => { const { t } = useTranslation() const tradingFeePercent = formatTradingFee(tradingFee) const createdDate = createdTimestamp ? new Date(convertRippleDate(createdTimestamp)).toLocaleDateString( 'en-US', { year: 'numeric', month: '2-digit', day: '2-digit', }, ) : '--' return (

{t('basic_info')}

{t('amm_account_id')}
{lpTokenCurrency && (
{t('lp_token_currency_code')}
)}
{t('trading_fee')} {tradingFeePercent}%
{t('created_on')} {createdDate}
) } ================================================ FILE: src/containers/AMMPool/InfoCards/MarketDataCard.tsx ================================================ import { FC } from 'react' import { useTranslation } from 'react-i18next' import { useTooltip } from '../../shared/components/Tooltip' import HoverIcon from '../../shared/images/hover.svg' import MarketDataIcon from '../../shared/images/market_data_icon.svg' import { parseCurrencyAmount, parsePercent, parseAmount, parseIntegerAmount, } from '../../shared/NumberFormattingUtils' import Currency from '../../shared/components/Currency' import { LOSAMMPoolData, FormattedBalance } from '../types' /** Renders "BALANCE (XRP)" or "BALANCE (CRYPTO)" with no extra whitespace */ const BalanceLabel = ({ currency, issuer, }: { currency: string issuer?: string }) => { const { t } = useTranslation() return ( {`${t('balance').toUpperCase()} (`} {/* eslint-disable-next-line react/jsx-curly-brace-presence */} {')'} ) } interface MarketDataCardProps { losData?: LOSAMMPoolData balance1: FormattedBalance | null balance2: FormattedBalance | null lpTokenBalance: string | undefined } export const MarketDataCard: FC = ({ losData, balance1, balance2, lpTokenBalance, }) => { const { t } = useTranslation() const { showTooltip, hideTooltip } = useTooltip() const renderTooltipIcon = (text: string) => ( ) => { const rect = e.currentTarget.getBoundingClientRect() showTooltip('text', e, text, { x: rect.left + rect.width, y: rect.top - 85, }) }} onMouseLeave={() => hideTooltip()} /> ) return (

{t('market_data')}

{losData && ( <>
{t('tvl')} {losData.tvl_usd != null ? parseCurrencyAmount(losData.tvl_usd) : '--'}
{t('volume_24h')} {renderTooltipIcon(t('volume_24h_tooltip'))} {losData.trading_volume_usd != null ? parseCurrencyAmount(losData.trading_volume_usd) : '--'}
{t('fees_24h')} {renderTooltipIcon(t('fees_24h_tooltip'))} {losData.fees_collected_usd != null ? parseCurrencyAmount(losData.fees_collected_usd) : '--'}
{t('apr_24h')} {renderTooltipIcon(t('apr_24h_tooltip'))} {losData.annual_percentage_return != null ? parsePercent(losData.annual_percentage_return, 3, 0.001) : '--'}
)} {balance1 && (
{parseAmount(balance1.amount)}
)} {balance2 && (
{parseAmount(balance2.amount)}
)} {lpTokenBalance && (
{t('lp_tokens')}
{parseAmount(lpTokenBalance)}
{losData && (
{parseIntegerAmount(losData.liquidity_provider_count)}{' '} {t('liquidity_providers')}
)}
)}
) } ================================================ FILE: src/containers/AMMPool/InfoCards/test/AuctionCard.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../i18n/testConfig' import { AuctionCard } from '../AuctionCard' jest.mock('../../../shared/images/auction_icon.svg', () => ({ __esModule: true, default: () => , })) interface RenderProps { auctionSlot?: { account?: string expiration?: string | number discounted_fee?: number price?: { value: string; currency: string; issuer?: string } time_interval?: number } tvlUsd?: number lpTokenBalance?: string tradingFee: number } const renderComponent = ({ auctionSlot, tvlUsd, lpTokenBalance, tradingFee, }: RenderProps) => render( , ) describe('AuctionCard', () => { const defaultAuctionSlot = { account: 'rsWRnby4f9QzarQQs3MpRhBncUgKUC56Ff', expiration: '2026-03-28T14:30:00+0000', discounted_fee: 86, price: { value: '50000', currency: '03930D02208264E2E40EC1B0C09E4DB96EE197B1', issuer: 'rJbt6ryq1TzikBuvVQDaxVLqL77eJeibsj', }, time_interval: 5, } const fullProps: RenderProps = { auctionSlot: defaultAuctionSlot, tvlUsd: 1000000, lpTokenBalance: '5000000', tradingFee: 500, } it('renders Auction title', () => { renderComponent(fullProps) expect(screen.getByText('auction')).toBeInTheDocument() }) it('renders all field labels', () => { renderComponent(fullProps) expect(screen.getByText('current_holder')).toBeInTheDocument() expect(screen.getByText('expiration')).toBeInTheDocument() expect(screen.getByText('discounted_fee')).toBeInTheDocument() expect(screen.getByText('price_paid')).toBeInTheDocument() expect(screen.getByText('replacement_cost')).toBeInTheDocument() }) it('renders discounted fee without truncation', () => { renderComponent(fullProps) // 86 / 1000 = 0.086, should show 0.086% expect(screen.getByText('0.086%')).toBeInTheDocument() }) it('shows -- for all fields when auctionSlot is undefined', () => { renderComponent({ tradingFee: 500 }) const values = document.querySelectorAll('.info-card-value') const dashValues = Array.from(values).filter((v) => v.textContent === '--') expect(dashValues.length).toBe(5) }) it('shows -- for expiration when not provided', () => { renderComponent({ auctionSlot: { account: 'rTest' }, tradingFee: 500, }) const rows = document.querySelectorAll('.info-card-row') const expirationRow = Array.from(rows).find((r) => r.textContent?.includes('expiration'), ) expect(expirationRow).toHaveTextContent('--') }) it('renders Price Paid with LP token amount', () => { renderComponent(fullProps) expect(screen.getByText(/50\.0K/)).toBeInTheDocument() }) describe('Replacement Cost calculation', () => { const withTimeInterval = (interval: number): RenderProps => ({ ...fullProps, auctionSlot: { ...defaultAuctionSlot, time_interval: interval }, }) it('uses minimum bid formula for expired slot (time_interval=20)', () => { renderComponent(withTimeInterval(20)) // M = TotalLP * (TradingFee/100000) / 25 // M = 5000000 * 0.005 / 25 = 1000 expect(screen.getByText(/1,000/)).toBeInTheDocument() }) it('uses minimum bid for last interval (time_interval=19)', () => { renderComponent(withTimeInterval(19)) // Same as expired: M = 1000 expect(screen.getByText(/1,000/)).toBeInTheDocument() }) it('uses first interval formula (time_interval=0)', () => { renderComponent(withTimeInterval(0)) // P = B * 1.05 + M = 50000 * 1.05 + 1000 = 53500 → "53.5K" expect(screen.getByText(/53\.5K/)).toBeInTheDocument() }) it('uses decay formula for middle intervals', () => { renderComponent(withTimeInterval(18)) // t = 18/20 = 0.9, t^60 ≈ 0.0018 // P = 50000 * 1.05 * (1 - 0.0018) + 1000 ≈ 53405.66 → "53.4K" expect(screen.getByText(/53\.4K/)).toBeInTheDocument() }) }) }) ================================================ FILE: src/containers/AMMPool/InfoCards/test/BasicInfoCard.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../i18n/testConfig' import { BasicInfoCard } from '../BasicInfoCard' const defaults = { ammAccountId: 'rLjUKpwUVmz3vCTmFkXungxwzdoyrWRsFG', tradingFee: 864, createdTimestamp: 827617760 as number | null | undefined, lpTokenCurrency: '03CE60C3DB22CF7F7157810936F27A5B485C8DB9' as | string | undefined, } const renderComponent = (overrides: Partial = {}) => { const props = { ...defaults, ...overrides } return render( , ) } describe('BasicInfoCard', () => { it('renders Basic Info title', () => { renderComponent() expect(screen.getByText('basic_info')).toBeInTheDocument() }) it('renders AMM Account ID label', () => { renderComponent() expect(screen.getByText('amm_account_id')).toBeInTheDocument() }) it('renders trading fee without truncation', () => { renderComponent() // 864 / 1000 = 0.864, should show 0.864% not 0.86% expect(screen.getByText('0.864%')).toBeInTheDocument() }) it('renders trading fee of 1000 as 1%', () => { renderComponent({ tradingFee: 1000 }) expect(screen.getByText('1%')).toBeInTheDocument() }) it('renders LP Token label', () => { renderComponent() expect(screen.getByText('lp_token_currency_code')).toBeInTheDocument() }) it('shows LP Token as second row after AMM Account ID', () => { const { container } = renderComponent() const rows = container.querySelectorAll('.info-card-row') expect(rows.length).toBe(4) // Order: AMM Account ID, LP Token, Trading Fee, Created On expect(rows[0]).toHaveTextContent('amm_account_id') expect(rows[1]).toHaveTextContent('lp_token_currency_code') expect(rows[2]).toHaveTextContent('trading_fee') expect(rows[3]).toHaveTextContent('created_on') }) it('shows -- for created date when timestamp is null', () => { renderComponent({ createdTimestamp: null }) const rows = Array.from(document.querySelectorAll('.info-card-row')) const createdRow = rows.find((r) => r.textContent?.includes('created_on')) expect(createdRow).toHaveTextContent('--') }) it('does not render LP Token row when lpTokenCurrency is undefined', () => { renderComponent({ lpTokenCurrency: undefined }) const rows = document.querySelectorAll('.info-card-row') expect(rows.length).toBe(3) }) }) ================================================ FILE: src/containers/AMMPool/InfoCards/test/MarketDataCard.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { MemoryRouter } from 'react-router' import i18n from '../../../../i18n/testConfig' import { MarketDataCard } from '../MarketDataCard' import { TooltipProvider } from '../../../shared/components/Tooltip' import { LOSAMMPoolData, FormattedBalance } from '../../types' interface RenderProps { losData?: LOSAMMPoolData balance1?: FormattedBalance | null balance2?: FormattedBalance | null lpTokenBalance?: string } const defaultLosData: LOSAMMPoolData = { tvl_usd: 1234567.89, tvl_xrp: 5000000, trading_volume_usd: 50000, trading_volume_xrp: 200000, fees_collected_usd: 150, fees_collected_xrp: 600, annual_percentage_return: 0.0456, liquidity_provider_count: 747, issuer_1: 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De', currency_1: '524C555344000000000000000000000000000000', issuer_2: null, currency_2: 'XRP', last_updated_timestamp: '2026-03-27T12:00:00Z', } const defaultBalance1: FormattedBalance = { currency: '524C555344000000000000000000000000000000', issuer: 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De', amount: 100000, } const defaultBalance2: FormattedBalance = { currency: 'XRP', amount: 50000 } const renderComponent = ({ losData = defaultLosData, balance1 = defaultBalance1, balance2 = defaultBalance2, lpTokenBalance = '1000000', }: RenderProps = {}) => render( , ) describe('MarketDataCard', () => { it('renders Market Data title', () => { renderComponent() expect(screen.getByText('market_data')).toBeInTheDocument() }) it('renders LOS fields with correct formatted values', () => { const { container } = renderComponent() const rows = container.querySelectorAll('.info-card-row') const getRowValue = (label: string) => { const row = Array.from(rows).find((r) => r.querySelector('.info-card-label')?.textContent?.includes(label), ) return row?.querySelector('.info-card-value')?.textContent } expect(screen.getByText('tvl')).toBeInTheDocument() expect(getRowValue('tvl')).toBe('$1.2M') expect(screen.getByText('volume_24h')).toBeInTheDocument() expect(getRowValue('volume_24h')).toBe('$50.0K') expect(screen.getByText('fees_24h')).toBeInTheDocument() expect(getRowValue('fees_24h')).toBe('$150.00') expect(screen.getByText('apr_24h')).toBeInTheDocument() expect(getRowValue('apr_24h')).toBe('0.046%') }) it('renders balances with correct formatted values', () => { const { container } = renderComponent() const labels = container.querySelectorAll('.info-card-label') const balanceLabels = Array.from(labels).filter((l) => l.textContent?.includes('BALANCE'), ) expect(balanceLabels.length).toBe(2) const xrpLabel = balanceLabels.find((l) => l.textContent?.includes('XRP')) expect(xrpLabel).toBeTruthy() expect( xrpLabel?.closest('.info-card-row')?.querySelector('.info-card-value') ?.textContent, ).toBe('50.0K') const otherLabel = balanceLabels.find( (l) => !l.textContent?.includes('XRP'), ) expect(otherLabel).toBeTruthy() expect( otherLabel?.closest('.info-card-row')?.querySelector('.info-card-value') ?.textContent, ).toBe('100.0K') }) it('renders LP Tokens with formatted value and liquidity provider count', () => { const { container } = renderComponent() const rows = container.querySelectorAll('.info-card-row') const lpRow = Array.from(rows).find((r) => r.querySelector('.info-card-label')?.textContent?.includes('lp_tokens'), ) expect(lpRow).toBeTruthy() expect(lpRow?.querySelector('.info-card-value')?.textContent).toContain( '1.0M', ) expect(lpRow?.querySelector('.info-card-subtitle')?.textContent).toContain( '747', ) }) it('does not render balance or LP rows when balances and LP are absent', () => { render( , ) const labels = document.querySelectorAll('.info-card-label') const balanceLabels = Array.from(labels).filter((l) => l.textContent?.includes('BALANCE'), ) expect(balanceLabels.length).toBe(0) expect(screen.queryByText('lp_tokens')).not.toBeInTheDocument() }) it('renders only balances and LP tokens when losData is undefined', () => { const { container } = render( , ) // LOS fields hidden expect(screen.queryByText('tvl')).not.toBeInTheDocument() expect(screen.queryByText('volume_24h')).not.toBeInTheDocument() expect(screen.queryByText('fees_24h')).not.toBeInTheDocument() expect(screen.queryByText('apr_24h')).not.toBeInTheDocument() expect(screen.queryByText(/liquidity_providers/)).not.toBeInTheDocument() // Balances still shown with correct values const labels = container.querySelectorAll('.info-card-label') const balanceLabels = Array.from(labels).filter((l) => l.textContent?.includes('BALANCE'), ) expect(balanceLabels.length).toBe(2) expect(screen.getByText('100.0K')).toBeInTheDocument() expect(screen.getByText('50.0K')).toBeInTheDocument() // LP tokens still shown expect(screen.getByText('lp_tokens')).toBeInTheDocument() expect(screen.getByText('1.0M')).toBeInTheDocument() }) }) ================================================ FILE: src/containers/AMMPool/TablePicker/AMMDepositWithdrawTable.tsx ================================================ import { FC, useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' import { Link } from 'react-router' import { Account } from '../../shared/components/Account' import { Amount } from '../../shared/components/Amount' import { Loader } from '../../shared/components/Loader' import { EmptyStateMessage } from '../../shared/components/EmptyStateMessage' import { Pagination } from '../../shared/components/Pagination' import { ResponsiveTimestamp } from '../../shared/components/ResponsiveTimestamp' import { parseAmount, parseCurrencyAmount, } from '../../shared/NumberFormattingUtils' import { shortenAccount, shortenTxHash } from '../../shared/utils' import { useLanguage } from '../../shared/hooks' import { AMMDepositWithdrawFormatted } from '../types' interface AMMDepositWithdrawTableProps { transactions: AMMDepositWithdrawFormatted[] isLoading: boolean totalItems: number currentPage: number onPageChange: (page: number) => void pageSize: number hasMore: boolean type: 'deposit' | 'withdraw' } export const AMMDepositWithdrawTable: FC = ({ transactions, isLoading, totalItems, currentPage, onPageChange, pageSize, hasMore, type, }) => { const { t } = useTranslation() const language = useLanguage() const tableRef = useRef(null) useEffect(() => { if (!isLoading) { requestAnimationFrame(() => { requestAnimationFrame(() => { const tableContainer = tableRef.current?.closest( '.amm-deposit-withdraw-table', ) if (tableContainer) { const rect = tableContainer.getBoundingClientRect() const scrollTop = window.scrollY + rect.top - 200 window.scrollTo({ top: scrollTop, behavior: 'smooth' }) } }) }) } }, [currentPage, isLoading]) const lpTokenLabel = type === 'deposit' ? t('lp_tokens_received') : t('lp_tokens_redeemed') const renderAssetAmount = (asset: AMMDepositWithdrawFormatted['asset']) => { if (!asset || Number(asset.amount) === 0) { return '--' } return } const renderTransaction = (tx: AMMDepositWithdrawFormatted) => ( {shortenTxHash(tx.hash)} {tx.ledger} {renderAssetAmount(tx.asset)} {renderAssetAmount(tx.asset2)} {tx.lpTokens ? parseAmount(tx.lpTokens) : '--'} {tx.valueUsd != null ? parseCurrencyAmount(tx.valueUsd) : '--'} ) return (
{isLoading && } {!isLoading && transactions.length > 0 && ( <>
{t('data_available_from_notice')}
{transactions.map(renderTransaction)}
{t('tx_hash')} {t('ledger')} {t('timestamp')} {t('account')} {t('asset')} {t('asset_2')} {lpTokenLabel} {t('usd_value')}
{(hasMore || currentPage > 1) && ( )} )} {!isLoading && transactions.length === 0 && ( )}
) } ================================================ FILE: src/containers/AMMPool/TablePicker/index.tsx ================================================ import { FC, useState, useCallback, useContext } from 'react' import { useTranslation } from 'react-i18next' import { useQuery, useInfiniteQuery } from 'react-query' import { Tabs } from '../../shared/components/Tabs' import { TransactionTable } from '../../shared/components/TransactionTable/TransactionTable' import SocketContext from '../../shared/SocketContext' import { useAnalytics } from '../../shared/analytics' import { getAccountTransactions } from '../../../rippled' import { DexTradeTable, DexTradeFormatted, } from '../../shared/components/DexTradeTable/DexTradeTable' import { formatDexTrade } from '../../shared/components/DexTradeTable/formatDexTrade' import { HoldersTable, XRPLHolder, } from '../../shared/components/HoldersTable/HoldersTable' import { CursorPaginationService } from '../../shared/services/CursorPaginationService' import { useCursorPaginatedQuery } from '../../shared/hooks/useCursorPaginatedQuery' import { fetchAMMDexTrades, fetchAMMTransactions } from '../api' import { AMMDepositWithdrawTable } from './AMMDepositWithdrawTable' import { AMMDepositWithdrawFormatted } from '../types' import { formatDepositWithdraw } from '../utils' import getTokenHolders from '../../Token/IOU/api/holders' const BATCH_SIZE = 200 const PAGE_SIZE = 10 // DEX trades pagination — format function doesn't depend on pool assets const dexTradesPagination = new CursorPaginationService({ fetchFn: (id, size, cursor, direction, sortField, sortOrder) => fetchAMMDexTrades(id, size, cursor, direction, sortField, sortOrder), formatFn: formatDexTrade, batchSize: BATCH_SIZE, pageSize: PAGE_SIZE, }) const depositsPagination = new CursorPaginationService({ fetchFn: (id, size, cursor, direction) => fetchAMMTransactions(id, 'AMMDeposit', size, cursor, direction), formatFn: formatDepositWithdraw, batchSize: BATCH_SIZE, pageSize: PAGE_SIZE, }) const withdrawalsPagination = new CursorPaginationService({ fetchFn: (id, size, cursor, direction) => fetchAMMTransactions(id, 'AMMWithdraw', size, cursor, direction), formatFn: formatDepositWithdraw, batchSize: BATCH_SIZE, pageSize: PAGE_SIZE, }) interface AMMPoolTablePickerProps { ammAccountId: string tab: string isMainnet: boolean lpToken?: { currency: string; issuer: string; value: string } tvlUsd?: number isDeleted?: boolean } export const AMMPoolTablePicker: FC = ({ ammAccountId, tab, isMainnet, lpToken, tvlUsd, isDeleted = false, }) => { const { t } = useTranslation() const { trackException } = useAnalytics() const rippledSocket = useContext(SocketContext) const [activeTab, setActiveTab] = useState(tab || 'transactions') // All Transactions — fetch via rippled account_tx const { data: txData, error: txError, isFetching: txLoading, fetchNextPage: txFetchNextPage, hasNextPage: txHasNextPage, } = useInfiniteQuery( ['fetchTransactions', ammAccountId], ({ pageParam = '' }) => getAccountTransactions( ammAccountId, undefined, pageParam, undefined, rippledSocket, ).catch((err) => { trackException( `account transactions ${ammAccountId} at ${pageParam} --- ${JSON.stringify(err)}`, ) throw new Error('get_account_transactions_failed') }), { getNextPageParam: (lastPage) => lastPage.marker }, ) const allTransactions = txData?.pages?.reduce( (acc: any[], page: any) => page.transactions ? acc.concat(page.transactions) : acc, [], ) || [] const getTxEmptyMessage = () => { if (allTransactions.length === 0 && txData?.pages[0]?.transactions) { return t('get_account_transactions_try' as any) } return txError?.message ? t(txError.message as any) : '' } const txEmptyMessage = getTxEmptyMessage() // DEX Trades — using shared hook const dexTrades = useCursorPaginatedQuery({ service: dexTradesPagination, id: ammAccountId, pageSize: PAGE_SIZE, enabled: isMainnet, }) // Deposits — using shared hook const deposits = useCursorPaginatedQuery({ service: depositsPagination, id: ammAccountId, pageSize: PAGE_SIZE, enabled: isMainnet, }) // Withdrawals — using shared hook const withdrawals = useCursorPaginatedQuery({ service: withdrawalsPagination!, id: ammAccountId, pageSize: PAGE_SIZE, enabled: isMainnet, }) // Holders const holdersPageSize = 20 const [holdersPage, setHoldersPage] = useState(1) const { data: holdersData, isLoading: holdersLoading } = useQuery( ['ammHolders', lpToken?.currency, lpToken?.issuer, holdersPage], () => getTokenHolders( lpToken!.currency, lpToken!.issuer, holdersPageSize, (holdersPage - 1) * holdersPageSize, ), { enabled: isMainnet && !!lpToken?.currency }, ) // Calculate USD value for each holder based on their LP token share of TVL const holdersFormatted: XRPLHolder[] = (holdersData?.holders || []).map( (holder: any, index: number) => { let holderUsd: number | null = null if (tvlUsd != null && lpToken?.value) { const totalLP = Number(lpToken.value) if (totalLP > 0) { holderUsd = (Number(holder.balance) / totalLP) * tvlUsd } } return { ...holder, rank: (holdersPage - 1) * holdersPageSize + index + 1, value_usd: holderUsd, } }, ) const handleTabChange = useCallback((tabId: string) => { setActiveTab(tabId) }, []) const tabs = [ { id: 'transactions', labelKey: 'all_transactions' }, ...(isMainnet ? [ { id: 'dex-trades', labelKey: 'dex_trades' }, { id: 'deposits', labelKey: 'deposits' }, { id: 'withdrawals', labelKey: 'withdrawals' }, ...(!isDeleted ? [{ id: 'holders', labelKey: 'holders' }] : []), ] : []), ] return (

{activeTab === 'transactions' && ( txFetchNextPage()} hasAdditionalResults={txHasNextPage} /> )} {activeTab === 'dex-trades' && isMainnet && ( 1} hideType sortField={dexTrades.sortField} setSortField={dexTrades.setSortField} sortOrder={dexTrades.sortOrder} setSortOrder={dexTrades.setSortOrder} onRefresh={dexTrades.refresh} /> )} {activeTab === 'deposits' && isMainnet && ( )} {activeTab === 'withdrawals' && isMainnet && ( )} {activeTab === 'holders' && isMainnet && ( )}
) } ================================================ FILE: src/containers/AMMPool/TablePicker/test/AMMDepositWithdrawTable.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router' import { I18nextProvider } from 'react-i18next' import { QueryClient, QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfig' import { AMMDepositWithdrawTable } from '../AMMDepositWithdrawTable' import { AMMDepositWithdrawFormatted } from '../../types' const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } }, }) interface RenderProps { transactions?: AMMDepositWithdrawFormatted[] isLoading?: boolean totalItems?: number currentPage?: number onPageChange?: (page: number) => void pageSize?: number hasMore?: boolean type?: 'deposit' | 'withdraw' } const renderComponent = ({ transactions = [], isLoading = false, totalItems = 20, currentPage = 1, onPageChange = jest.fn(), pageSize = 10, hasMore = true, type = 'deposit', }: RenderProps = {}) => render( , ) describe('AMMDepositWithdrawTable', () => { const mockTransactions: AMMDepositWithdrawFormatted[] = [ { hash: 'ABC123DEF456ABC123DEF456ABC123DEF456ABC123DEF456ABC123DEF456ABCD', ledger: 100141108, timestamp: 827617760, account: 'rP9f2dDqH7zX1234567890123456789012', asset: { currency: '524C555344000000000000000000000000000000', issuer: 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De', amount: 246, }, asset2: { currency: 'XRP', amount: 113.73 }, lpTokens: '12845', valueUsd: 362500, }, { hash: 'DEF789GHI012DEF789GHI012DEF789GHI012DEF789GHI012DEF789GHI012DEFG', ledger: 100141109, timestamp: 827617800, account: 'rMeP9RditJ3j1234567890123456789012', asset: null, asset2: { currency: 'XRP', amount: 88.63 }, lpTokens: '5912', valueUsd: null, }, ] it('renders column headers', () => { renderComponent({ transactions: mockTransactions }) expect(screen.getByText('tx_hash')).toBeInTheDocument() expect(screen.getByText('ledger')).toBeInTheDocument() expect(screen.getByText('timestamp')).toBeInTheDocument() expect(screen.getByText('account')).toBeInTheDocument() expect(screen.getByText('asset')).toBeInTheDocument() expect(screen.getByText('asset_2')).toBeInTheDocument() expect(screen.getByText('lp_tokens_received')).toBeInTheDocument() expect(screen.getByText('usd_value')).toBeInTheDocument() }) it('shows lp_tokens_redeemed for withdraw type', () => { renderComponent({ transactions: mockTransactions, type: 'withdraw' }) expect(screen.getByText('lp_tokens_redeemed')).toBeInTheDocument() }) it('renders transaction rows', () => { const { container } = renderComponent({ transactions: mockTransactions }) const rows = container.querySelectorAll('tbody tr') expect(rows.length).toBe(2) }) it('shows -- for missing asset (single-asset deposit)', () => { renderComponent({ transactions: mockTransactions }) const rows = document.querySelectorAll('tbody tr') expect(rows[1].querySelector('.tx-asset')).toHaveTextContent('--') }) it('shows -- for missing USD value', () => { renderComponent({ transactions: mockTransactions }) const rows = document.querySelectorAll('tbody tr') expect(rows[1].querySelector('.tx-usd-value')).toHaveTextContent('--') }) it('renders data notice banner', () => { renderComponent({ transactions: mockTransactions }) expect(document.querySelector('.data-notice')).toBeInTheDocument() }) it('shows loader when loading', () => { const { container } = renderComponent({ isLoading: true }) expect(container.querySelector('.loader')).toBeInTheDocument() }) it('shows empty message when no deposit transactions', () => { renderComponent() expect(screen.getByText('no_deposits')).toBeInTheDocument() }) it('shows withdrawal empty message for withdraw type', () => { renderComponent({ type: 'withdraw' }) expect(screen.getByText('no_withdrawals')).toBeInTheDocument() }) it('renders ledger as a link', () => { renderComponent({ transactions: mockTransactions }) const ledgerLink = screen.getByText('100141108') expect(ledgerLink.closest('a')).toHaveAttribute( 'href', '/ledgers/100141108', ) }) }) ================================================ FILE: src/containers/AMMPool/TablePicker/test/index.test.tsx ================================================ import { render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { MemoryRouter } from 'react-router' import { I18nextProvider } from 'react-i18next' import { QueryClient, QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfig' import { AMMPoolTablePicker } from '../index' const mockGetAccountTransactions = jest.fn().mockResolvedValue({ transactions: [], }) jest.mock('../../../../rippled', () => ({ getAccountTransactions: (...args: any[]) => mockGetAccountTransactions(...args), })) jest.mock('../../api', () => ({ fetchAMMDexTrades: jest.fn().mockResolvedValue({ data: [], total: 0 }), fetchAMMTransactions: jest.fn().mockResolvedValue({ data: [], total: 0 }), })) jest.mock('../../../Token/IOU/api/holders', () => jest.fn().mockResolvedValue({ holders: [], totalHolders: 0 }), ) jest.mock('../../../shared/SocketContext', () => ({ __esModule: true, default: { _currentValue: { send: jest.fn() }, }, })) jest.mock('../../../shared/analytics', () => ({ useAnalytics: () => ({ trackException: jest.fn(), trackScreenLoaded: jest.fn(), }), })) const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } }, }) interface RenderProps { ammAccountId?: string tab?: string isMainnet?: boolean lpToken?: { currency: string; issuer: string; value: string } tvlUsd?: number isDeleted?: boolean } const renderComponent = ({ ammAccountId = 'rLjUKpwUVmz3vCTmFkXungxwzdoyrWRsFG', tab = 'transactions', isMainnet = true, lpToken = { currency: '03CE60C3DB22CF7F7157810936F27A5B485C8DB9', issuer: 'rJbt6ryq1TzikBuvVQDaxVLqL77eJeibsj', value: '5000000', }, tvlUsd = 1000000, isDeleted = false, }: RenderProps = {}) => render( , ) describe('AMMPoolTablePicker', () => { beforeEach(() => { jest.clearAllMocks() queryClient.clear() }) it('renders all tabs on mainnet', () => { renderComponent() expect(screen.getByText('all_transactions')).toBeInTheDocument() expect(screen.getByText('dex_trades')).toBeInTheDocument() expect(screen.getByText('deposits')).toBeInTheDocument() expect(screen.getByText('withdrawals')).toBeInTheDocument() expect(screen.getByText('holders')).toBeInTheDocument() }) it('renders only transactions tab on non-mainnet', () => { renderComponent({ isMainnet: false }) expect(screen.getByText('all_transactions')).toBeInTheDocument() expect(screen.queryByText('dex_trades')).toBeNull() expect(screen.queryByText('deposits')).toBeNull() expect(screen.queryByText('withdrawals')).toBeNull() expect(screen.queryByText('holders')).toBeNull() }) it('hides holders tab when pool is deleted', () => { renderComponent({ isDeleted: true }) expect(screen.getByText('all_transactions')).toBeInTheDocument() expect(screen.getByText('dex_trades')).toBeInTheDocument() expect(screen.queryByText('holders')).toBeNull() }) it('defaults to transactions tab', () => { renderComponent() const tabsContainer = document.querySelector('.tx-table-picker') expect(tabsContainer).toBeInTheDocument() }) it('switches tab when clicked', async () => { renderComponent() await userEvent.click(screen.getByText('dex_trades')) // After clicking dex_trades, the DexTradeTable should render // (it will show empty state since mock returns no data) }) it('uses provided tab as initial active tab', () => { renderComponent({ tab: 'dex-trades' }) // The dex-trades tab should be active (component renders its content) }) it('shows error message when account transactions fail', async () => { mockGetAccountTransactions.mockRejectedValueOnce( new Error('get_account_transactions_failed'), ) renderComponent() await waitFor(() => { expect( screen.getByText('get_account_transactions_failed'), ).toBeInTheDocument() }) }) }) ================================================ FILE: src/containers/AMMPool/api.ts ================================================ import axios from 'axios' import type { ExplorerXrplClient } from '../shared/SocketContext' import { LOSAMMPoolData, HistoricalTrendsResponse, LOSAMMDepositWithdrawRaw, LOSCursor, LOSCursorResponse, } from './types' import { LOSDexTradeRaw } from '../shared/components/DexTradeTable/formatDexTrade' const LOS_URL = process.env.VITE_LOS_URL /** Fetch AMM pool market data from LOS (mainnet only) */ export const fetchAMMPoolData = async ( ammAccountId: string, ): Promise => { const response = await axios.get(`${LOS_URL}/amms/${ammAccountId}`) return response.data } /** Fetch historical trends for a specific AMM pool from LOS */ export const fetchAMMHistoricalTrends = async ( ammAccountId: string, timeRange: string = '6M', ): Promise => { const response = await axios.get(`${LOS_URL}/amms/historical-trends`, { params: { amm_account_id: ammAccountId, time_range: timeRange, }, }) return response.data } /** Fetch DEX trades for an AMM pool from LOS */ export const fetchAMMDexTrades = async ( ammAccountId: string, size?: number, searchAfter?: LOSCursor, direction?: string, sortField?: string, sortOrder?: string, ): Promise> => { const params = new URLSearchParams({ account: ammAccountId, size: (size ?? 100).toString(), type: 'amm', }) if (searchAfter) { params.append('search_after', JSON.stringify(searchAfter)) } if (direction) { params.append('direction', direction) } if (sortField) { params.append('sort_field', sortField) } if (sortOrder) { params.append('sort_order', sortOrder) } const response = await axios.get(`${LOS_URL}/dex-trades?${params.toString()}`) return response.data } /** Fetch AMMDeposit or AMMWithdraw transactions from LOS */ export const fetchAMMTransactions = async ( ammAccountId: string, type: 'AMMDeposit' | 'AMMWithdraw', size?: number, searchAfter?: LOSCursor, direction?: string, ): Promise> => { const params = new URLSearchParams({ account: ammAccountId, type, size: (size ?? 100).toString(), }) if (searchAfter) { params.append('search_after', JSON.stringify(searchAfter)) } if (direction) { params.append('direction', direction) } const response = await axios.get( `${LOS_URL}/v2/transactions?${params.toString()}`, ) return response.data } /** * Fetch the creation timestamp of an AMM pool. * Gets the first transaction (AMMCreate) via account_tx with forward=true. */ export const fetchAMMCreatedTimestamp = async ( rippledSocket: ExplorerXrplClient, ammAccountId: string, ): Promise => { const resp = await rippledSocket.send({ command: 'account_tx', account: ammAccountId, limit: 1, forward: true, ledger_index_min: -1, ledger_index_max: -1, }) if (resp?.transactions?.[0]?.tx) { return resp.transactions[0].tx.date } return null } ================================================ FILE: src/containers/AMMPool/index.tsx ================================================ import { FC, PropsWithChildren, useContext, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useParams } from 'react-router' import { Helmet } from 'react-helmet-async' import { useQuery } from 'react-query' import NoMatch from '../NoMatch' import { Loader } from '../shared/components/Loader' import SocketContext from '../shared/SocketContext' import { useAnalytics } from '../shared/analytics' import { getAMMInfoByAMMAccount } from '../../rippled/lib/rippled' import { NOT_FOUND, BAD_REQUEST } from '../shared/utils' import { ErrorMessage } from '../shared/Interfaces' import { formatAmount } from '../../rippled/lib/txSummary/formatAmount' import { Tooltip, useTooltip } from '../shared/components/Tooltip' import { AMMPoolHeader } from './AMMPoolHeader' import { BasicInfoCard } from './InfoCards/BasicInfoCard' import { MarketDataCard } from './InfoCards/MarketDataCard' import { AuctionCard } from './InfoCards/AuctionCard' import { AMMPoolTablePicker } from './TablePicker' import { TVLVolumeChart } from '../shared/components/TVLVolumeChart' import { fetchAMMPoolData, fetchAMMCreatedTimestamp, fetchAMMHistoricalTrends, } from './api' import { getDeletedAMMData, DeletedAMMData } from './utils' import { AuctionSlot, FormattedBalance, HistoricalDataPoint } from './types' import InfoIcon from '../shared/images/info-duotone.svg' import './styles.scss' const ERROR_MESSAGES: { [code: number]: ErrorMessage } = { [NOT_FOUND]: { title: 'amm_not_found', hints: ['check_amm_id'], }, [BAD_REQUEST]: { title: 'invalid_amm_id', hints: ['check_amm_id'], }, } const DEFAULT_ERROR: ErrorMessage = { title: 'get_amm_failed', hints: ['not_your_fault'], } const getErrorMessage = (error: number | null) => error ? (ERROR_MESSAGES[error] ?? DEFAULT_ERROR) : DEFAULT_ERROR const Page: FC> = ({ ammAccountId, children, }) => (
{children}
) /** Order assets: non-XRP first, XRP second (for header display) */ const orderAssets = ( b1: FormattedBalance | null, b2: FormattedBalance | null, ): [FormattedBalance | null, FormattedBalance | null] => { if (b1 && b2 && b1.currency === 'XRP') { return [b2, b1] } return [b1, b2] } /** * Build FormattedBalance objects from deleted AMM data. * Deleted pools have no live balances, so amount is 0. */ const buildDeletedBalances = ( data: DeletedAMMData, ): [FormattedBalance, FormattedBalance] => [ { currency: data.asset.currency, issuer: data.asset.issuer, amount: 0, }, { currency: data.asset2.currency, issuer: data.asset2.issuer, amount: 0, }, ] export const AMMPool = () => { const { t } = useTranslation() const { trackScreenLoaded, trackException } = useAnalytics() const { id: ammAccountId = '', tab = 'transactions' } = useParams<{ id: string tab: string }>() const [error, setError] = useState(null) const [displayCurrency, setDisplayCurrency] = useState<'usd' | 'xrp'>('usd') const rippledSocket = useContext(SocketContext) const isMainnet = process.env.VITE_ENVIRONMENT === 'mainnet' const { tooltip } = useTooltip() // Fetch on-ledger AMM data from Clio (balances, auction slot, trading fee) const { data: ammInfo, isFetching: ammInfoLoading } = useQuery( ['ammInfo', ammAccountId], async () => getAMMInfoByAMMAccount(rippledSocket, ammAccountId), { enabled: !!ammAccountId, retry: false, onError: (e: any) => { trackException( `Error fetching AMM info for ${ammAccountId} --- ${JSON.stringify(e)}`, ) // Don't set error yet — we'll try deleted detection }, }, ) // If amm_info failed, try to detect a deleted AMM pool const ammInfoFailed = !ammInfoLoading && !ammInfo && !!ammAccountId const { data: deletedData, isFetching: deletedLoading } = useQuery( ['ammDeleted', ammAccountId], () => getDeletedAMMData(rippledSocket, ammAccountId), { enabled: ammInfoFailed, onError: () => { // Both amm_info and deletion detection failed setError(NOT_FOUND) }, }, ) // If amm_info failed, deletion check finished, and it's not a deleted pool → show error useEffect(() => { if (ammInfoFailed && !deletedLoading && !deletedData) { setError(NOT_FOUND) } }, [ammInfoFailed, deletedLoading, deletedData]) const isDeleted = !!deletedData const isLoading = ammInfoLoading || (ammInfoFailed && deletedLoading) // Fetch LOS market data (mainnet only) const { data: losData } = useQuery( ['ammLosData', ammAccountId], () => fetchAMMPoolData(ammAccountId), { enabled: !!ammAccountId && isMainnet, onError: (e: any) => { trackException( `Error fetching AMM LOS data for ${ammAccountId} --- ${JSON.stringify(e)}`, ) }, }, ) // Fetch first transaction to get Created On timestamp const { data: createdTimestamp } = useQuery( ['ammCreatedOn', ammAccountId], () => fetchAMMCreatedTimestamp(rippledSocket, ammAccountId), { enabled: !!ammAccountId }, ) // Fetch data per time range from the API (each range may include different latest data) const [chartTimeRange, setChartTimeRange] = useState('6M') const { data: trendsData, isLoading: trendsLoading } = useQuery( ['ammHistoricalTrends', ammAccountId, chartTimeRange], () => fetchAMMHistoricalTrends(ammAccountId, chartTimeRange), { enabled: !!ammAccountId, staleTime: 5 * 60 * 1000 }, ) useEffect(() => { trackScreenLoaded({ account_id: ammAccountId }) return () => { window.scrollTo(0, 0) } }, [ammAccountId, trackScreenLoaded]) if (error) { const message = getErrorMessage(error) return ( ) } // Build unified data from either live amm_info or deleted pool metadata const ammData = ammInfo?.amm let balance1: FormattedBalance | null = null let balance2: FormattedBalance | null = null let tradingFee = 0 let lpToken: { currency: string; issuer: string; value: string } | undefined let auctionSlot: AuctionSlot | undefined if (ammData) { balance1 = formatAmount(ammData.amount) balance2 = formatAmount(ammData.amount2) tradingFee = ammData.trading_fee lpToken = ammData.lp_token auctionSlot = ammData.auction_slot } else if (deletedData) { const [lb1, lb2] = buildDeletedBalances(deletedData) balance1 = lb1 balance2 = lb2 tradingFee = 0 // Not available in deleted AMM node lpToken = { currency: deletedData.lpToken.currency, issuer: deletedData.lpToken.issuer, value: deletedData.lpToken.value, } } const [asset1, asset2] = orderAssets(balance1, balance2) const hasData = !!ammData || !!deletedData return ( {ammAccountId && isLoading && } {ammAccountId && !isLoading && hasData && ( <> {isDeleted && (
{t('amm_pool_deleted_text')}
)}
{!isDeleted && ( )} {!isDeleted && ( )}
{isMainnet && ( ({ date: point.date, tvl: displayCurrency === 'usd' ? point.tvl_usd : point.tvl_xrp, volume: displayCurrency === 'usd' ? point.trading_volume_usd : point.trading_volume_xrp, }), )} isLoading={trendsLoading} displayCurrency={displayCurrency} setDisplayCurrency={setDisplayCurrency} onTimeRangeChange={setChartTimeRange} /> )} )}
) } export default AMMPool ================================================ FILE: src/containers/AMMPool/styles.scss ================================================ @use '../shared/css/variables' as *; @use '../shared/css/table'; @use '../shared/css/data-tables-notice'; @use '../shared/css/info-card'; .amm-pool-page { .loader { min-height: 100px; } } // ============================================================ // Header: "AMM Pool [CRYPTO.rRbi/XRP]" .amm-deleted-banner { display: flex; flex-direction: column; padding: 25px; border: 1px solid $orange-50; border-radius: 8px; margin-bottom: 30px; background: $black-90; gap: 12px; .deleted-label { display: flex; align-items: center; align-self: flex-start; padding: 3px 12px; border: 1px solid $orange-50; border-radius: 100px; background: $orange-80; color: $black-0; font-size: 12px; gap: 10px; text-transform: uppercase; @include semibold; .deleted-info-icon { width: 16px; height: 16px; margin-right: 3px; } } .deleted-message { margin: 0; color: $black-0; font-size: 16px; line-height: 1.5; } } // ============================================================ .amm-pool-header { display: flex; align-items: center; padding-top: 50px; margin-bottom: 32px; .amm-pool-header-left { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; @include for-size(desktop-up) { gap: 16px; } } .amm-pool-title { margin: 0; color: $white; font-size: 24px; @include bold; @include for-size(tablet-portrait-up) { font-size: 30px; } @include for-size(desktop-up) { font-size: 36px; } } .amm-pool-token-badge { display: flex; align-items: center; padding: 6px; border: 1px solid $black-70; border-radius: 8px; color: $white; font-size: 14px; gap: 4px; @include bold; @include for-size(tablet-portrait-up) { padding: 8px; font-size: 16px; gap: 6px; } @include for-size(desktop-up) { font-size: 18px; gap: 8px; } } .badge-separator { margin: 0 2px; color: $black-40; } .asset-link { color: $green-30; text-decoration: none; &:hover { color: $green; } } } // ============================================================ // Info Cards: three-column grid // ============================================================ .amm-pool-info-cards { display: grid; margin-bottom: 50px; gap: 16px; grid-template-columns: 1fr; @include for-size(tablet-portrait-up) { gap: 24px; } @include for-size(desktop-up) { gap: 32px; grid-template-columns: repeat(3, 1fr); } } // ============================================================ // Tables section (matching IOU Token page tab style) // ============================================================ .amm-pool-tables { .full-width-line { width: 100%; border: none; border-top: 1px solid $black-70; margin-bottom: 0; color: $black-70; } .tx-table-picker { display: flex; flex-direction: row; margin-bottom: 16px; gap: 8px; -webkit-overflow-scrolling: touch; overflow-x: auto; @include for-size(tablet-portrait-up) { margin-bottom: 20px; gap: 12px; } @include for-size(desktop-up) { margin-bottom: 24px; gap: 16px; } .tabs { display: flex; flex-direction: row; border-top: none; margin: 0; font-size: 14px; gap: inherit; button, a { all: unset; padding-top: 16px; border: none; border-top: 3px solid transparent; margin-right: 8px; color: $black-40; cursor: pointer; font-size: 12px; font-style: normal; line-height: 150%; white-space: nowrap; @include regular; @include for-size(tablet-portrait-up) { padding-top: 18px; margin-right: 12px; font-size: 13px; } @include for-size(desktop-up) { padding-top: 21px; margin-right: 16px; font-size: 14px; } &.selected { padding-top: 16px; border-top: 3px solid $white; color: $white; @include for-size(tablet-portrait-up) { padding-top: 18px; } @include for-size(desktop-up) { padding-top: 21px; } } &.selected, &:hover { color: $white; @include regular; } } } } } .amm-deposit-withdraw-table { .table-wrap { overflow-x: auto; } .text-truncate { @extend %truncate; } } ================================================ FILE: src/containers/AMMPool/test/AMMPoolHeader.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { MemoryRouter } from 'react-router' import { I18nextProvider } from 'react-i18next' import i18n from '../../../i18n/testConfig' import { AMMPoolHeader } from '../AMMPoolHeader' import { FormattedBalance } from '../types' const renderComponent = ( asset1: FormattedBalance | null = null, asset2: FormattedBalance | null = null, ) => render( , ) describe('AMMPoolHeader', () => { const asset1 = { currency: '524C555344000000000000000000000000000000', issuer: 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De', amount: 1000, } const asset2 = { currency: 'XRP', amount: 5000 } it('renders AMM Pool title', () => { renderComponent() expect(screen.getByText('amm_pool')).toBeInTheDocument() }) it('renders token pair badge with Currency components', () => { const { container } = renderComponent(asset1, asset2) expect(container.querySelector('.amm-pool-token-badge')).toBeInTheDocument() expect(container.querySelector('.badge-separator')).toBeInTheDocument() }) it('does not render badge when assets are null', () => { const { container } = renderComponent() expect( container.querySelector('.amm-pool-token-badge'), ).not.toBeInTheDocument() }) it('renders clickable link for non-XRP assets', () => { const { container } = renderComponent(asset1, asset2) const links = container.querySelectorAll('.amm-pool-token-badge a') expect(links.length).toBeGreaterThan(0) }) }) ================================================ FILE: src/containers/AMMPool/test/index.test.tsx ================================================ import { render, screen, waitFor } from '@testing-library/react' import { Route } from 'react-router' import i18n from '../../../i18n/testConfig' import { AMMPool } from '../index' import { QuickHarness } from '../../test/utils' import { AMM_POOL_ROUTE } from '../../App/routes' import * as rippled from '../../../rippled/lib/rippled' import * as ammUtils from '../utils' jest.mock('../../../rippled/lib/rippled') jest.mock('../utils') jest.mock('../api', () => ({ fetchAMMPoolData: jest.fn().mockRejectedValue(new Error('not available')), fetchAMMCreatedTimestamp: jest.fn().mockResolvedValue(827000000), fetchAMMHistoricalTrends: jest.fn().mockResolvedValue({ data_points: [] }), fetchAMMDexTrades: jest.fn().mockResolvedValue({ data: [], total: 0 }), fetchAMMTransactions: jest.fn().mockResolvedValue({ data: [], total: 0 }), })) // TVLVolumeChart must be mocked — it uses useQuery() + recharts (won't render in jsdom) jest.mock('../../shared/components/TVLVolumeChart', () => ({ TVLVolumeChart: () =>
Chart
, })) // AMMPoolTablePicker must be mocked — it uses useQuery(), useInfiniteQuery(), SocketContext, useAnalytics() jest.mock('../TablePicker', () => ({ AMMPoolTablePicker: () =>
Table Picker
, })) const mockGetAMMInfo = rippled.getAMMInfoByAMMAccount as jest.Mock const mockDetectDeleted = ammUtils.getDeletedAMMData as jest.Mock const TEST_AMM_ID = 'rLjUKpwUVmz3vCTmFkXungxwzdoyrWRsFG' const mockAmmInfoResponse = { amm: { amount: '500000000', // XRP in drops amount2: { currency: '524C555344000000000000000000000000000000', issuer: 'rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De', value: '1000', }, trading_fee: 500, lp_token: { currency: '03CE60C3DB22CF7F7157810936F27A5B485C8DB9', issuer: TEST_AMM_ID, value: '10000', }, auction_slot: { account: 'rSomeAccount', expiration: '2026-12-31T00:00:00+0000', discounted_fee: 100, price: { value: '50', currency: 'LP', issuer: TEST_AMM_ID }, time_interval: 3, }, }, } describe('AMMPool Page', () => { const renderComponent = (ammAccountId = TEST_AMM_ID) => render( } /> , ) beforeEach(() => { jest.clearAllMocks() process.env.VITE_ENVIRONMENT = 'mainnet' mockDetectDeleted.mockResolvedValue(null) }) it('renders header and cards for an active AMM pool', async () => { mockGetAMMInfo.mockResolvedValue(mockAmmInfoResponse) renderComponent() await waitFor(() => { expect(document.querySelector('.amm-pool-header')).toBeInTheDocument() expect(screen.getByText('basic_info')).toBeInTheDocument() expect(screen.getByText('auction')).toBeInTheDocument() expect(screen.getByTestId('table-picker')).toBeInTheDocument() }) }) it('renders token pair in header with XRP on the right', async () => { mockGetAMMInfo.mockResolvedValue(mockAmmInfoResponse) renderComponent() await waitFor(() => { const header = document.querySelector('.amm-pool-header') expect(header).toBeInTheDocument() // XRP should be asset2 (right side) expect(header!.textContent).toContain('/XRP') }) }) it('shows deleted banner for a deleted AMM pool', async () => { mockGetAMMInfo.mockRejectedValue({ code: 35 }) mockDetectDeleted.mockResolvedValue({ account: 'rDeletedAMM', asset: { currency: 'XRP' }, asset2: { currency: '504958454C530000000000000000000000000000', issuer: 'rNEQb5e4DZUJG48xKPstDWjmm1PQ4fcUfZ', }, lpToken: { currency: '0370963F20A61AF3C6E5D674EAAEE3E65C0BDC9F', issuer: 'rDeletedAMM', value: '0', }, deletionDate: 827617760, }) renderComponent('rDeletedAMM') await waitFor(() => { expect(document.querySelector('.amm-pool-header')).toBeInTheDocument() expect(screen.getByText('basic_info')).toBeInTheDocument() expect(screen.getByTestId('table-picker')).toBeInTheDocument() }) // Liquidated banner should be shown await waitFor(() => { const banner = document.querySelector('.amm-deleted-banner') expect(banner).toBeInTheDocument() }) }) it('hides auction card for deleted pools', async () => { mockGetAMMInfo.mockRejectedValue({ code: 35 }) mockDetectDeleted.mockResolvedValue({ account: 'rDeletedAMM', asset: { currency: 'XRP' }, asset2: { currency: '504958454C530000000000000000000000000000', issuer: 'rNEQb5e4DZUJG48xKPstDWjmm1PQ4fcUfZ', }, lpToken: { currency: '0370963F20A61AF3C6E5D674EAAEE3E65C0BDC9F', issuer: 'rDeletedAMM', value: '0', }, deletionDate: 827617760, }) renderComponent('rDeletedAMM') await waitFor(() => { expect(screen.getByText('basic_info')).toBeInTheDocument() }) // Auction card should not be rendered for deleted pools expect(screen.queryByText('auction')).not.toBeInTheDocument() }) it('shows error when both amm_info and deletion detection fail', async () => { mockGetAMMInfo.mockRejectedValue({ code: 404 }) mockDetectDeleted.mockResolvedValue(null) renderComponent('rNonExistentAMM') await waitFor(() => { expect(document.querySelector('.amm-pool-header')).not.toBeInTheDocument() }) }) }) ================================================ FILE: src/containers/AMMPool/test/mockDeletedAMMTransaction.json ================================================ { "transactions": [ { "tx": { "Account": "rsWRnby4f9QzarQQs3MpRhBncUgKUC56Ff", "TransactionType": "AMMWithdraw", "hash": "E9D07AA35B1C37ACE4D7D3235619243ACAD612754F824AAE253C36F13BF17DFC" }, "meta": { "AffectedNodes": [ { "DeletedNode": { "FinalFields": { "Account": "rQhuJV3eVEm6D6YreeisJkvfyBBA3qAXrL", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "504958454C530000000000000000000000000000", "issuer": "rNEQb5e4DZUJG48xKPstDWjmm1PQ4fcUfZ" }, "AuctionSlot": { "Account": "rsWRnby4f9QzarQQs3MpRhBncUgKUC56Ff", "Expiration": 827698230, "Price": { "currency": "0370963F20A61AF3C6E5D674EAAEE3E65C0BDC9F", "issuer": "rQhuJV3eVEm6D6YreeisJkvfyBBA3qAXrL", "value": "0" } }, "Flags": 0, "LPTokenBalance": { "currency": "0370963F20A61AF3C6E5D674EAAEE3E65C0BDC9F", "issuer": "rQhuJV3eVEm6D6YreeisJkvfyBBA3qAXrL", "value": "2764439179.245265" }, "VoteSlots": [ { "VoteEntry": { "Account": "rsWRnby4f9QzarQQs3MpRhBncUgKUC56Ff", "VoteWeight": 100000 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "0422F98444F7B068C7EC6EEDAF11380E6A146F091639A29E09B3399C1F8A5341" } }, { "ModifiedNode": { "FinalFields": { "Account": "rsWRnby4f9QzarQQs3MpRhBncUgKUC56Ff", "Balance": "171889002" }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8CCDDB1D59E72EBD937C297CC9487F0FCDCA146C8CFE9EB360788594E72649B9" } } ], "TransactionResult": "tesSUCCESS" }, "validated": true, "date": 827617760, "ledger_index": 103072853 } ] } ================================================ FILE: src/containers/AMMPool/test/utils.test.ts ================================================ import { getDeletedAMMData, formatDepositWithdraw } from '../utils' import { LOSAMMDepositWithdrawRaw } from '../types' import mockDeletedTx from './mockDeletedAMMTransaction.json' jest.mock('../../../rippled/lib/rippled', () => ({ getAccountTransactions: jest.fn(), })) // eslint-disable-next-line @typescript-eslint/no-var-requires const { getAccountTransactions } = require('../../../rippled/lib/rippled') describe('getDeletedAMMData', () => { const mockSocket = {} as any beforeEach(() => { jest.clearAllMocks() }) it('returns deleted AMM data when last tx has DeletedNode with LedgerEntryType AMM', async () => { getAccountTransactions.mockResolvedValue(mockDeletedTx) const result = await getDeletedAMMData( mockSocket, 'rQhuJV3eVEm6D6YreeisJkvfyBBA3qAXrL', ) expect(result).not.toBeNull() expect(result!.account).toBe('rQhuJV3eVEm6D6YreeisJkvfyBBA3qAXrL') expect(result!.asset).toEqual({ currency: 'XRP' }) expect(result!.asset2).toEqual({ currency: '504958454C530000000000000000000000000000', issuer: 'rNEQb5e4DZUJG48xKPstDWjmm1PQ4fcUfZ', }) expect(result!.lpToken).toEqual({ currency: '0370963F20A61AF3C6E5D674EAAEE3E65C0BDC9F', issuer: 'rQhuJV3eVEm6D6YreeisJkvfyBBA3qAXrL', value: '2764439179.245265', }) expect(result!.deletionDate).toBe(827617760) }) it('calls getAccountTransactions with limit=1', async () => { getAccountTransactions.mockResolvedValue(mockDeletedTx) await getDeletedAMMData(mockSocket, 'rQhuJV3eVEm6D6YreeisJkvfyBBA3qAXrL') expect(getAccountTransactions).toHaveBeenCalledWith( mockSocket, 'rQhuJV3eVEm6D6YreeisJkvfyBBA3qAXrL', 1, '', ) }) it('returns null when last tx has no DeletedNode with AMM type', async () => { getAccountTransactions.mockResolvedValue({ transactions: [ { tx: { TransactionType: 'Payment' }, meta: { AffectedNodes: [ { ModifiedNode: { LedgerEntryType: 'AccountRoot', FinalFields: { Balance: '1000000' }, }, }, ], }, date: 827617760, }, ], }) const result = await getDeletedAMMData(mockSocket, 'rSomeAccount') expect(result).toBeNull() }) it('returns null when account_tx returns no transactions', async () => { getAccountTransactions.mockResolvedValue({ transactions: [] }) const result = await getDeletedAMMData(mockSocket, 'rSomeAccount') expect(result).toBeNull() }) it('returns null when account_tx returns undefined', async () => { getAccountTransactions.mockResolvedValue(undefined) const result = await getDeletedAMMData(mockSocket, 'rSomeAccount') expect(result).toBeNull() }) it('returns null when meta has no AffectedNodes', async () => { getAccountTransactions.mockResolvedValue({ transactions: [ { tx: { TransactionType: 'AMMWithdraw' }, meta: {}, date: 827617760, }, ], }) const result = await getDeletedAMMData(mockSocket, 'rSomeAccount') expect(result).toBeNull() }) it('returns null when AccountDelete (not AMM deletion)', async () => { getAccountTransactions.mockResolvedValue({ transactions: [ { tx: { TransactionType: 'AccountDelete' }, meta: { AffectedNodes: [ { DeletedNode: { LedgerEntryType: 'AccountRoot', FinalFields: { Account: 'rDeletedAccount' }, }, }, ], }, date: 827617760, }, ], }) const result = await getDeletedAMMData(mockSocket, 'rDeletedAccount') expect(result).toBeNull() }) }) describe('formatDepositWithdraw', () => { const baseTx: LOSAMMDepositWithdrawRaw = { hash: 'ABC123', ledger_index: 100, timestamp: 1000000, account: 'rAccount1', amm: { asset1: { currency: 'USD', issuer: 'rIssuer1', value: '500' }, asset2: { currency: 'XRP', issuer: null, value: '250' }, lp_tokens_received: '1000', value_usd: 750, }, } it('formats both assets preserving response order', () => { const result = formatDepositWithdraw(baseTx) expect(result.hash).toBe('ABC123') expect(result.ledger).toBe(100) expect(result.timestamp).toBe(1000000) expect(result.account).toBe('rAccount1') expect(result.asset).toEqual({ currency: 'USD', issuer: 'rIssuer1', amount: 500, }) expect(result.asset2).toEqual({ currency: 'XRP', issuer: undefined, amount: 250, }) expect(result.lpTokens).toBe('1000') expect(result.valueUsd).toBe(750) }) it('returns null for missing asset2 (single-asset deposit)', () => { const singleAssetTx: LOSAMMDepositWithdrawRaw = { ...baseTx, amm: { asset1: { currency: 'USD', issuer: 'rIssuer1', value: '500' }, lp_tokens_received: '1000', }, } const result = formatDepositWithdraw(singleAssetTx) expect(result.asset).toEqual({ currency: 'USD', issuer: 'rIssuer1', amount: 500, }) expect(result.asset2).toBeNull() }) it('returns null for asset with zero value', () => { const zeroAssetTx: LOSAMMDepositWithdrawRaw = { ...baseTx, amm: { asset1: { currency: 'USD', issuer: 'rIssuer1', value: '500' }, asset2: { currency: 'XRP', issuer: null, value: '0' }, lp_tokens_received: '1000', }, } const result = formatDepositWithdraw(zeroAssetTx) expect(result.asset).toEqual({ currency: 'USD', issuer: 'rIssuer1', amount: 500, }) expect(result.asset2).toBeNull() }) it('uses lp_tokens_redeemed for withdrawals', () => { const withdrawTx: LOSAMMDepositWithdrawRaw = { ...baseTx, amm: { asset1: { currency: 'USD', issuer: 'rIssuer1', value: '500' }, lp_tokens_redeemed: '800', }, } const result = formatDepositWithdraw(withdrawTx) expect(result.lpTokens).toBe('800') }) it('returns null for lpTokens and valueUsd when amm data is missing', () => { const noAmmTx: LOSAMMDepositWithdrawRaw = { ...baseTx, amm: undefined, } const result = formatDepositWithdraw(noAmmTx) expect(result.asset).toBeNull() expect(result.asset2).toBeNull() expect(result.lpTokens).toBeNull() expect(result.valueUsd).toBeNull() }) }) ================================================ FILE: src/containers/AMMPool/types.ts ================================================ import { ExplorerAmount } from '../shared/types' /** LOS /amms/{id} response */ export interface LOSAMMPoolData { tvl_xrp: number tvl_usd: number trading_volume_xrp: number trading_volume_usd: number fees_collected_xrp: number fees_collected_usd: number annual_percentage_return: number liquidity_provider_count: number issuer_1: string | null currency_1: string issuer_2: string | null currency_2: string last_updated_timestamp: string } /** Single data point from LOS /amms/historical-trends response */ export interface HistoricalDataPoint { date: string tvl_usd: number tvl_xrp: number trading_volume_usd: number trading_volume_xrp: number } /** LOS /amms/historical-trends response */ export interface HistoricalTrendsResponse { data_points: HistoricalDataPoint[] } /** Raw AMMDeposit/AMMWithdraw transaction as returned by LOS /v2/transactions API */ export interface LOSAMMDepositWithdrawRaw { hash: string ledger_index: number timestamp: number account: string amm?: { asset1?: { currency: string; issuer?: string | null; value: string } asset2?: { currency: string; issuer?: string | null; value: string } lp_tokens_received?: string lp_tokens_redeemed?: string value_usd?: number } } /** LOS cursor: [timestamp, tx_hash] */ export type LOSCursor = [number, string] /** Cursor-paginated response from LOS API endpoints */ export interface LOSCursorResponse { results: T[] next_cursor?: LOSCursor prev_cursor?: LOSCursor } /** Auction slot data from amm_info response */ export interface AuctionSlot { account?: string expiration?: string | number discounted_fee?: number price?: { value: string; currency: string; issuer?: string } time_interval?: number } /** Formatted balance from amm_info (via formatAmount) */ export interface FormattedBalance { currency: string amount: string | number issuer?: string } /** Formatted AMMDeposit/AMMWithdraw transaction for table display */ export interface AMMDepositWithdrawFormatted { hash: string ledger: number timestamp: number account: string asset: ExplorerAmount | null asset2: ExplorerAmount | null lpTokens: string | null valueUsd: number | null } ================================================ FILE: src/containers/AMMPool/utils.ts ================================================ import type { ExplorerXrplClient } from '../shared/SocketContext' import { getAccountTransactions } from '../../rippled/lib/rippled' import { AMMDepositWithdrawFormatted, LOSAMMDepositWithdrawRaw } from './types' /** * Data extracted from a deleted AMM pool's last transaction metadata. * The DeletedNode with LedgerEntryType "AMM" contains the pool's final state. */ export interface DeletedAMMData { account: string asset: { currency: string; issuer?: string } asset2: { currency: string; issuer?: string } lpToken: { currency: string; issuer: string; value: string } deletionDate: number // ripple epoch timestamp } /** * Find the DeletedNode with LedgerEntryType "AMM" in a transaction's metadata. */ const findDeletedAMMNode = (meta: any): any | null => { if (!meta?.AffectedNodes) { return null } for (const node of meta.AffectedNodes) { if ( node.DeletedNode?.LedgerEntryType === 'AMM' && node.DeletedNode?.FinalFields ) { return node.DeletedNode.FinalFields } } return null } /** * Fetch the last transaction of a deleted account and, if it was an AMMWithdraw * that removed a DeletedNode with LedgerEntryType "AMM", return the pool's * final state. * * Returns the extracted AMM data if it's a deleted pool, or null otherwise. */ export const getDeletedAMMData = async ( rippledSocket: ExplorerXrplClient, accountId: string, ): Promise => { const resp = await getAccountTransactions(rippledSocket, accountId, 1, '') const lastTx = resp?.transactions?.[0] if (!lastTx) { return null } if (lastTx.tx?.TransactionType !== 'AMMWithdraw') { return null } const ammFields = findDeletedAMMNode(lastTx.meta) if (!ammFields) { return null } return { account: ammFields.Account ?? accountId, asset: ammFields.Asset ?? { currency: 'XRP' }, asset2: ammFields.Asset2 ?? { currency: 'XRP' }, lpToken: ammFields.LPTokenBalance ?? { currency: '', issuer: accountId, value: '0', }, deletionDate: lastTx.date ?? lastTx.tx?.date, } } /** * Format AMMDeposit/AMMWithdraw from LOS /v2/transactions response. * Preserves the asset order from the transaction data. */ export const formatDepositWithdraw = ( tx: LOSAMMDepositWithdrawRaw, ): AMMDepositWithdrawFormatted => { const formatAsset = ( raw: | { currency: string; issuer?: string | null; value: string } | undefined, ) => { if (!raw || Number(raw.value) === 0) { return null } return { currency: raw.currency, issuer: raw.issuer ?? undefined, amount: Number(raw.value), } } return { hash: tx.hash, ledger: tx.ledger_index, timestamp: tx.timestamp, account: tx.account, asset: formatAsset(tx.amm?.asset1), asset2: formatAsset(tx.amm?.asset2), lpTokens: tx.amm?.lp_tokens_received ?? tx.amm?.lp_tokens_redeemed ?? null, valueUsd: tx.amm?.value_usd ?? null, } } ================================================ FILE: src/containers/AMMRankings/AMMRankingsTable.tsx ================================================ import { FC, useState, useMemo, useRef, useCallback } from 'react' import { useTranslation } from 'react-i18next' import { AMMPool } from './api' import Currency, { hexToString } from '../shared/components/Currency' import { Account } from '../shared/components/Account' import { CurrencySwitch } from '../shared/components/CurrencySwitch' import { parseAmount, parseCurrencyAmount, parsePercent, parseIntegerAmount, } from '../shared/NumberFormattingUtils' import { shortenAccount, formatTradingFee } from '../shared/utils' import { useTooltip } from '../shared/components/Tooltip' import HoverIcon from '../shared/images/hover.svg' import xrpIconSvg from '../shared/images/xrp_icon.svg?url' import DefaultTokenIcon from '../shared/images/default_token_icon.svg' import { Pagination } from '../shared/components/Pagination' interface AMMRankingsTableProps { amms: AMMPool[] currencyMode: 'usd' | 'xrp' } type CategoryFilter = 'rwa' | 'stablecoin' | 'memes' | 'defi' const DEFAULT_EMPTY_VALUE = '--' const CATEGORIES: CategoryFilter[] = ['rwa', 'stablecoin', 'memes', 'defi'] const CATEGORY_LABELS: Record = { rwa: 'RWA', stablecoin: 'Stablecoins', memes: 'Memes', defi: 'DeFi', } const TokenIcon: FC<{ currency: string iconUrl?: string }> = ({ currency, iconUrl }) => { // Safety check for currency if (!currency) { return } // Fallback content (default token icon) const fallbackContent = // Icon content (image or fallback) const iconContent = iconUrl ? ( {`${currency} { // If image fails to load, replace with fallback e.currentTarget.style.display = 'none' e.currentTarget.parentElement?.classList.add('fallback-mode') }} /> ) : ( fallbackContent ) return (
{iconContent} {iconUrl && ( )}
) } const PoolDisplay: FC<{ amm: AMMPool }> = ({ amm }) => (
/
) export const AMMRankingsTable: FC = ({ amms, currencyMode, }) => { const { t } = useTranslation() const { showTooltip, hideTooltip } = useTooltip() const [filterField, setFilterField] = useState('') const [searchQuery, setSearchQuery] = useState('') const [tableCurrency, setTableCurrency] = useState<'usd' | 'xrp'>( currencyMode, ) const [currentPage, setCurrentPage] = useState(1) const tableRef = useRef(null) const pageSize = 15 const handlePageChange = useCallback((page: number) => { setCurrentPage(page) tableRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' }) }, []) const renderTooltip = (key: string, yOffset = 60) => ( { const rect = e.currentTarget.getBoundingClientRect() showTooltip('text', e, t(`${key}_tooltip` as any), { x: rect.left + rect.width / 2, y: rect.top - yOffset, }) }} onMouseLeave={() => hideTooltip()} /> ) const handleFilterClick = (cat: CategoryFilter) => { setFilterField(filterField === cat ? '' : cat) setCurrentPage(1) // Reset to first page when filter changes } const filteredAmms = useMemo(() => { let result = amms if (filterField) { result = result.filter( (amm) => amm.asset_class_1 === filterField || amm.asset_class_2 === filterField || amm.asset_subclass_1 === filterField || amm.asset_subclass_2 === filterField, ) } if (searchQuery.trim()) { const q = searchQuery.trim().toLowerCase() const decodeCurrency = (code: string): string => { if (code.length === 40 && !code.startsWith('03')) { return hexToString(code) } return code } result = result.filter((amm) => { const currency1 = (amm.currency_1 || '').toLowerCase() const currency2 = (amm.currency_2 || '').toLowerCase() const decoded1 = decodeCurrency(amm.currency_1 || '').toLowerCase() const decoded2 = decodeCurrency(amm.currency_2 || '').toLowerCase() const accountId = (amm.amm_account_id || '').toLowerCase() return ( currency1.includes(q) || currency2.includes(q) || decoded1.includes(q) || decoded2.includes(q) || accountId.includes(q) ) }) } return result }, [amms, filterField, searchQuery]) // Paginate the filtered results const paginatedAmms = useMemo(() => { const startIndex = (currentPage - 1) * pageSize return filteredAmms.slice(startIndex, startIndex + pageSize) }, [filteredAmms, currentPage, pageSize]) // Enrich paginated AMMs with XRP icon (local SVG) for XRP currencies // Non-XRP token icons come from the server cache (icon_1, icon_2 fields) const enrichedPaginatedAmms = useMemo( () => paginatedAmms.map((amm) => ({ ...amm, icon_1: amm.currency_1 === 'XRP' ? xrpIconSvg : amm.icon_1, icon_2: amm.currency_2 === 'XRP' ? xrpIconSvg : amm.icon_2, })), [paginatedAmms], ) const getTVL = (amm: AMMPool) => tableCurrency === 'usd' ? amm.tvl_usd : amm.tvl_xrp const getVolume = (amm: AMMPool) => tableCurrency === 'usd' ? amm.trading_volume_usd : amm.trading_volume_xrp const getFees24h = (amm: AMMPool) => tableCurrency === 'usd' ? amm.fees_collected_usd : amm.fees_collected_xrp const formatCurrencyAmount = (value: number): string => { if (tableCurrency === 'xrp') { return `${parseAmount(value)} XRP` } return parseCurrencyAmount(value) } const renderAMM = (amm: AMMPool, index: number) => ( {index + 1} {getTVL(amm) != null ? formatCurrencyAmount(getTVL(amm)) : DEFAULT_EMPTY_VALUE} {amm.liquidity_provider_count != null ? parseIntegerAmount(amm.liquidity_provider_count.toString()) : DEFAULT_EMPTY_VALUE} {amm.trading_fee != null ? `${formatTradingFee(amm.trading_fee)}%` : DEFAULT_EMPTY_VALUE} {getVolume(amm) != null ? formatCurrencyAmount(getVolume(amm)) : DEFAULT_EMPTY_VALUE} {getFees24h(amm) != null ? formatCurrencyAmount(getFees24h(amm)) : DEFAULT_EMPTY_VALUE} {amm.annual_percentage_return != null ? parsePercent(amm.annual_percentage_return, 3, 0.001) : DEFAULT_EMPTY_VALUE} ) return (

{t('top_1000_amms')}

{CATEGORIES.map((cat) => ( ))}
{ setSearchQuery(e.target.value) setCurrentPage(1) // Reset to first page when search changes }} />
setTableCurrency(value === 'USD' ? 'usd' : 'xrp') } />
{enrichedPaginatedAmms.map((amm, index) => { const globalIndex = (currentPage - 1) * pageSize + index return renderAMM(amm, globalIndex) })}
# {t('asset_pair')} {t('amm_account_id')} {t('tvl')} {t('number_of_lps')} {t('trading_fee')} {t('volume_24h')} {renderTooltip('volume_24h')} {t('fees_24h')} {renderTooltip('fees_24h')} {t('apr_24h')} {renderTooltip('apr_24h')}
) } ================================================ FILE: src/containers/AMMRankings/GeneralInfoCard.tsx ================================================ import { FC } from 'react' import { useTranslation } from 'react-i18next' import { AggregatedStats } from './api' import { parseAmount, parseCurrencyAmount, } from '../shared/NumberFormattingUtils' import InfoIcon from '../shared/images/info_book_icon.svg' import HoverIcon from '../shared/images/hover.svg' import { useTooltip } from '../shared/components/Tooltip' interface GeneralInfoCardProps { stats: AggregatedStats | undefined currencyMode: 'usd' | 'xrp' } const DEFAULT_EMPTY_VALUE = '--' export const GeneralInfoCard: FC = ({ stats, currencyMode, }) => { const { t } = useTranslation() const { showTooltip, hideTooltip } = useTooltip() if (!stats) { return null } const tvl = currencyMode === 'usd' ? stats.tvl_usd : stats.tvl_xrp const volume24h = currencyMode === 'usd' ? stats.trading_volume_usd : stats.trading_volume_xrp const formatCurrencyAmount = (value: number): string => { if (currencyMode === 'xrp') { return `${parseAmount(value)} XRP` } return parseCurrencyAmount(value) } const renderTooltip = (key: string) => ( { const rect = e.currentTarget.getBoundingClientRect() showTooltip('text', e, t(`${key}_tooltip` as any), { x: rect.left + rect.width / 2, y: rect.top - 60, }) }} onMouseLeave={() => hideTooltip()} /> ) return (

{t('general_info')}

{t('tvl')} {renderTooltip('tvl')} {tvl ? formatCurrencyAmount(tvl) : DEFAULT_EMPTY_VALUE}
{t('number_of_amms')} {renderTooltip('number_of_amms')} {stats.amm_pool_count ? stats.amm_pool_count.toLocaleString() : DEFAULT_EMPTY_VALUE}
{t('number_of_lps')} {renderTooltip('number_of_lps')} {stats.liquidity_provider_count ? stats.liquidity_provider_count.toLocaleString() : DEFAULT_EMPTY_VALUE}
{t('volume_24h' as any)} {renderTooltip('volume_24h_all')} {volume24h ? formatCurrencyAmount(volume24h) : DEFAULT_EMPTY_VALUE}
) } ================================================ FILE: src/containers/AMMRankings/ammRankings.scss ================================================ @use '../shared/css/variables' as *; @use '../shared/css/table'; @use '../shared/css/info-card'; .amm-rankings-page { overflow: visible; width: 100%; max-width: 1500px; min-height: 150px; padding: 0 24px; margin: 40px auto 0; color: $white; // ─── Page header ─────────────────────────────────────────────── .page-header { margin-bottom: 16px; .page-title { margin: 0; color: $white; font-size: 36px; @include bold; } } // ─── Chart + General Info side-by-side ──────────────────────── .chart-and-info-container { display: flex; flex-direction: column-reverse; align-items: stretch; margin-bottom: 64px; gap: 32px; @include for-size(desktop-up) { flex-direction: row; align-items: flex-start; } } // The shared TVLVolumeChart wraps everything in .tvl-volume-section, // which is the direct flex child of .chart-and-info-container. .tvl-volume-section { min-width: 0; margin-bottom: 0; // Override shared component's 50px margin @include for-size(desktop-up) { flex: 3; } } // ─── General Info Card ──────────────────────────────────────── // Align the top of the card with the top of the chart container, // accounting for the section title + controls above the chart. .info-card { @include for-size(desktop-up) { min-width: 200px; max-width: 320px; flex: 1; // Offset = chart-section-title height + margin + controls height + margin margin-top: 84px; } } // ─── Table section ──────────────────────────────────────────── .amm-rankings-table-container { .table-title { padding-bottom: 0; border-bottom: none; margin: 0 0 40px; color: $white; font-size: 20px; @include bold; } } .table-controls { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-start; margin-bottom: 16px; gap: 12px; .currency-switch { margin-left: auto; } } .search-wrapper { position: relative; max-width: 400px; flex: 1; &::before { position: absolute; top: 50%; left: 12px; width: 16px; height: 16px; background-image: url('../shared/images/search.svg'); background-repeat: no-repeat; background-size: contain; content: ''; pointer-events: none; transform: translateY(-50%); } .amm-search { width: 100%; box-sizing: border-box; padding: 7px 12px 7px 36px; border: 1px solid $black-50; border-radius: $border-radius; background-color: $black; color: $white; font-size: 13px; outline: none; transition: border-color 0.15s; &::placeholder { color: $black-50; } &:focus { border-color: $blue-50; } } } .table-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; .filter-icon-btn { width: 24px; height: 24px; flex-shrink: 0; background-image: url('../shared/images/group.svg'); background-repeat: no-repeat; background-size: contain; } .category-filter { display: flex; align-items: center; padding: 6px 12px; border: 1px solid $black-50; border-radius: $border-radius; background-color: $black; color: $white; cursor: pointer; font-size: 14px; gap: 6px; transition: background-color 0.15s; @include medium; &:hover { background-color: $black-70; } &.selected { background-color: $white; color: $black; .item-icon { filter: invert(1); } } /* stylelint-disable-next-line no-descending-specificity */ .item-icon { width: 18px; height: 18px; background-position: center; background-repeat: no-repeat; background-size: contain; &.icon-rwa { background-image: url('../shared/images/rwa.svg'); } &.icon-stablecoin { background-image: url('../shared/images/stablecoin.svg'); } &.icon-memes { background-image: url('../shared/images/memes.svg'); } &.icon-defi { background-image: url('../shared/images/decentralized.svg'); } } } } // ─── Table Wrapper ──────────────────────────────────────────── .table-wrap { -webkit-overflow-scrolling: touch; overflow-x: auto; } // ─── AMM Rankings Table ─────────────────────────────────────── .amm-rankings-table { width: 100%; min-width: 1000px; // Ensure horizontal scroll on smaller viewports // Table headers - match explorer standard th { padding: 12px 8px; color: $black-40; // Match standard explorer table headers font-size: 12px; font-weight: 600; // Figma: Semi Bold line-height: 1.5em; // Figma: 18px (1.5 * 12px) text-align: left; text-transform: uppercase; } td { padding: 12px 8px; // Reduced horizontal padding for tighter columns } th.rank, td.rank { width: 50px; padding-right: 4px; padding-left: 12px; } // Rank column text color td.rank { color: $white; // Figma: XRPL/Primary/White } td.pool { .pool-display { display: flex; align-items: center; gap: 10px; .token-pair { position: relative; display: flex; width: 48px; // Fixed width: 28px (first icon) + 20px (second icon visible after -8px overlap) flex-shrink: 0; align-items: center; // Apply overlap only to the wrapper/link level, not the icon itself .token-icon-link, .token-icon-wrapper { position: relative; display: inline-block; &:nth-child(2) { z-index: 1; margin-left: -8px; // Overlap per Figma: 24px icon offset at 16px → 8px overlap } &:first-child { z-index: 2; // Keep first icon on top } } /* stylelint-disable-next-line no-descending-specificity */ .token-icon-link { text-decoration: none; transition: transform 0.2s ease; &:hover { z-index: 10; transform: scale(1.1); } } /* stylelint-disable-next-line no-descending-specificity */ .token-icon-wrapper { &.fallback-mode { .token-icon:not(.fallback) { display: none; } .token-icon.fallback { display: flex !important; } } } /* stylelint-disable-next-line no-descending-specificity */ .token-icon { display: flex; width: 28px; height: 28px; flex-shrink: 0; align-items: center; justify-content: center; border: 2px solid $black-90; border-radius: 50%; background-color: $black-90; // Ensure solid background color: $white; font-size: 9px; object-fit: cover; @include bold; /* stylelint-disable-next-line no-descending-specificity */ &.fallback { background: linear-gradient(135deg, $blue-50, $blue-purple-50); } } } .pool-name { min-width: 0; // Allow text to shrink if needed flex: 1; color: $white; font-size: 14px; white-space: nowrap; @include regular; .currency { font: inherit; } } } } td.amm-account-id { font-size: 13px; .account { color: $green-30; &:hover { color: $green-50; } } } td.apr { color: $white; } } // ─── Responsive ─────────────────────────────────────────────── @include for-size(phone-only) { padding: 0 12px; .page-header { flex-direction: column; align-items: flex-start; } } @include for-size(desktop-up) { padding: 0 80px; margin-top: 60px; .page-header { .page-title { font-size: 36px; } } // On larger viewports, reduce spacing to fit all columns without scrolling .amm-rankings-table { min-width: auto; // Remove min-width constraint th, td { padding: 12px 6px; // Further reduced horizontal padding } th.rank, td.rank { padding-right: 4px; padding-left: 12px; } } } } ================================================ FILE: src/containers/AMMRankings/api.ts ================================================ import axios from 'axios' export interface AMMPool { amm_account_id: string currency_1: string issuer_1?: string currency_2: string issuer_2?: string tvl_xrp: number tvl_usd: number trading_volume_xrp: number trading_volume_usd: number fees_collected_xrp: number fees_collected_usd: number annual_percentage_return: number liquidity_provider_count: number amm_created_timestamp: string // Trading fee from amm_info RPC (0-1000, where 1000 = 1%) trading_fee?: number // Token data from LOS /tokens/batch-get (server-cached) icon_1?: string icon_2?: string asset_class_1?: string asset_class_2?: string asset_subclass_1?: string asset_subclass_2?: string } export interface AMMRankingsResponse { size: number sort_field: string sort_order: string count: number results: AMMPool[] } export interface AggregatedStats { tvl_xrp: number tvl_usd: number amm_pool_count: number liquidity_provider_count: number trading_volume_xrp: number trading_volume_usd: number } export interface HistoricalDataPoint { date: string tvl_xrp: number tvl_usd: number trading_volume_xrp: number trading_volume_usd: number } export interface HistoricalTrendsResponse { amm_account_id: string time_range?: string start_date?: string total_data_points: number data_points: HistoricalDataPoint[] } /** * Fetch AMM rankings (top 1000 AMMs) * Icons, asset_class/asset_subclass, and trading_fee are included from server cache */ export const fetchAMMRankings = async ( sortField: string = 'tvl_usd', sortOrder: 'asc' | 'desc' = 'desc', ): Promise => { const response = await axios.get('/api/v1/amms', { params: { size: 1000, sort_field: sortField, sort_order: sortOrder, }, }) return response.data } /** * Fetch aggregated AMM statistics */ export const fetchAggregatedStats = async (): Promise => { const response = await axios.get('/api/v1/amms/aggregated') return response.data } /** * Fetch historical trends for aggregated AMM data */ export const fetchHistoricalTrends = async ( timeRange: string = '6M', ): Promise => { const response = await axios.get('/api/v1/amms/historical-trends', { params: { amm_account_id: 'aggregated', time_range: timeRange, }, }) return response.data } /** * Fetch historical trends for a specific AMM pool */ export const fetchAMMHistoricalTrends = async ( ammAccountId: string, timeRange: string = '6M', ): Promise => { const response = await axios.get('/api/v1/amms/historical-trends', { params: { amm_account_id: ammAccountId, time_range: timeRange, }, }) return response.data } ================================================ FILE: src/containers/AMMRankings/index.tsx ================================================ import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { Loader } from '../shared/components/Loader' import { Tooltip, useTooltip } from '../shared/components/Tooltip' import { TVLVolumeChart } from '../shared/components/TVLVolumeChart' import { useAnalytics } from '../shared/analytics' import Log from '../shared/log' import { AMMRankingsTable } from './AMMRankingsTable' import { GeneralInfoCard } from './GeneralInfoCard' import { fetchAMMRankings, fetchAggregatedStats, fetchHistoricalTrends, } from './api' import './ammRankings.scss' type CurrencyMode = 'usd' | 'xrp' type TimeRange = '1W' | '1M' | '6M' | '1Y' | '5Y' const REFETCH_INTERVAL = 60 * 1000 // 1 minute export const AMMRankings: FC = () => { const { t } = useTranslation() const { trackScreenLoaded, trackException } = useAnalytics() const { tooltip } = useTooltip() const [currencyMode, setCurrencyMode] = useState('usd') const [timeRange, setTimeRange] = useState('6M') const [sortField] = useState('tvl_usd') const [sortOrder] = useState<'asc' | 'desc'>('desc') useEffect(() => { trackScreenLoaded() }, [trackScreenLoaded]) const { data: ammRankingsData, isLoading: isLoadingRankings } = useQuery( ['ammRankings', sortField, sortOrder], () => fetchAMMRankings(sortField, sortOrder), { refetchInterval: REFETCH_INTERVAL, onError: (error) => { Log.error(error) trackException(`AMM rankings fetch --- ${JSON.stringify(error)}`) }, }, ) const { data: aggregatedStats, isLoading: isLoadingStats } = useQuery( ['ammAggregatedStats'], () => fetchAggregatedStats(), { refetchInterval: REFETCH_INTERVAL, onError: (error) => { Log.error(error) trackException( `AMM aggregated stats fetch --- ${JSON.stringify(error)}`, ) }, }, ) const { data: historicalData, isLoading: isLoadingHistory } = useQuery( ['ammHistoricalTrends', timeRange], () => fetchHistoricalTrends(timeRange), { refetchInterval: REFETCH_INTERVAL, keepPreviousData: true, onError: (error) => { Log.error(error) trackException( `AMM historical trends fetch --- ${JSON.stringify(error)}`, ) }, }, ) // Only show full-page loader on initial load. // Subsequent refetches (e.g. time range changes) should not unmount the chart, // otherwise its internal state (selected time range) resets. const isInitialLoading = (isLoadingRankings && !ammRankingsData) || (isLoadingStats && !aggregatedStats) || (isLoadingHistory && !historicalData) return (

{t('amms')}

{isInitialLoading ? ( ) : ( <>
({ date: point.date, tvl: currencyMode === 'usd' ? point.tvl_usd : point.tvl_xrp, volume: currencyMode === 'usd' ? point.trading_volume_usd : point.trading_volume_xrp, }))} isLoading={isLoadingHistory} displayCurrency={currencyMode} setDisplayCurrency={setCurrencyMode} onTimeRangeChange={(range) => setTimeRange(range as TimeRange)} />
)}
) } ================================================ FILE: src/containers/AMMRankings/svg.d.ts ================================================ declare module '*.svg?url' { const content: string export default content } ================================================ FILE: src/containers/AMMRankings/test/AMMRankingsTable.test.tsx ================================================ import { render, screen, fireEvent } from '@testing-library/react' import { AMMRankingsTable } from '../AMMRankingsTable' import { AMMPool } from '../api' import i18n from '../../../i18n/testConfigEnglish' import { QuickHarness } from '../../test/utils' // Mock SVG imports jest.mock('../../shared/images/hover.svg', () => 'svg') jest.mock('../../shared/images/xrp_icon.svg?url', () => 'xrp_icon.svg') jest.mock('../../shared/images/default_token_icon.svg', () => 'svg') const createAMM = (overrides: Partial = {}): AMMPool => ({ amm_account_id: 'rDefaultAMMAccountId1234567890', currency_1: 'XRP', currency_2: 'USD', issuer_2: 'rIssuer123', tvl_xrp: 100000, tvl_usd: 50000, trading_volume_xrp: 20000, trading_volume_usd: 10000, fees_collected_xrp: 200, fees_collected_usd: 100, annual_percentage_return: 0.12345, liquidity_provider_count: 42, amm_created_timestamp: '2025-01-01T00:00:00Z', trading_fee: 500, ...overrides, }) const renderComponent = ( amms: AMMPool[] = [], currencyMode: 'usd' | 'xrp' = 'usd', ) => render( , ) describe('AMMRankingsTable', () => { it('renders table headers', () => { renderComponent() expect(screen.getByText('#')).toBeInTheDocument() expect(screen.getByText('Asset Pair')).toBeInTheDocument() expect(screen.getByText('AMM Account ID')).toBeInTheDocument() expect(screen.getByText('TVL')).toBeInTheDocument() expect(screen.getByText('# of LPs')).toBeInTheDocument() expect(screen.getByText('Fees (24H)')).toBeInTheDocument() expect(screen.getByText('Trading Fee')).toBeInTheDocument() expect(screen.getByText('APR (24H)')).toBeInTheDocument() }) it('renders category filter buttons', () => { renderComponent() expect(screen.getByText('RWA')).toBeInTheDocument() expect(screen.getByText('Stablecoins')).toBeInTheDocument() expect(screen.getByText('Memes')).toBeInTheDocument() expect(screen.getByText('DeFi')).toBeInTheDocument() }) it('renders AMM row with USD values', () => { const amm = createAMM() const { container } = renderComponent([amm]) // Rank expect(container.querySelector('td.rank')).toHaveTextContent('1') // TVL in USD expect(container.querySelector('td.tvl')).toBeInTheDocument() // LP count expect(container.querySelector('td.lp-count')).toHaveTextContent('42') // Trading fee: 500/1000 = 0.5 expect(container.querySelector('td.trading-fee')).toHaveTextContent('0.5') }) it('renders trading fee correctly for different values', () => { const amms = [ createAMM({ amm_account_id: 'rAMM1', trading_fee: 1000 }), createAMM({ amm_account_id: 'rAMM2', trading_fee: 100 }), createAMM({ amm_account_id: 'rAMM3', trading_fee: 1 }), ] const { container } = renderComponent(amms) const tradingFeeCells = container.querySelectorAll('td.trading-fee') // 1000/1000 = 1 expect(tradingFeeCells[0]).toHaveTextContent('1') // 100/1000 = 0.1 expect(tradingFeeCells[1]).toHaveTextContent('0.1') // 1/1000 = 0.001 expect(tradingFeeCells[2]).toHaveTextContent('0.001') }) it('renders -- when trading_fee is undefined', () => { const amm = createAMM({ trading_fee: undefined }) const { container } = renderComponent([amm]) expect(container.querySelector('td.trading-fee')).toHaveTextContent('--') }) it('renders -- for null numeric fields', () => { const amm = createAMM({ tvl_usd: null as any, trading_volume_usd: null as any, fees_collected_usd: null as any, annual_percentage_return: null as any, liquidity_provider_count: null as any, trading_fee: undefined, }) const { container } = renderComponent([amm]) expect(container.querySelector('td.tvl')).toHaveTextContent('--') expect(container.querySelector('td.volume')).toHaveTextContent('--') expect(container.querySelector('td.fees-24h')).toHaveTextContent('--') expect(container.querySelector('td.trading-fee')).toHaveTextContent('--') expect(container.querySelector('td.apr')).toHaveTextContent('--') expect(container.querySelector('td.lp-count')).toHaveTextContent('--') }) it('switches currency to XRP and displays XRP values', () => { const amm = createAMM() const { container } = renderComponent([amm], 'usd') // Toggle to XRP const toggle = container.querySelector( '.toggle-switch input', ) as HTMLInputElement fireEvent.click(toggle) // After toggle, values should contain "XRP" expect(container.querySelector('td.tvl')?.textContent).toContain('XRP') }) it('filters AMMs by category', () => { const amms = [ createAMM({ amm_account_id: 'rRWA1', asset_class_1: 'rwa', currency_1: 'RLUSD', }), createAMM({ amm_account_id: 'rDEFI1', asset_class_1: 'defi', currency_1: 'DFI', }), ] const { container } = renderComponent(amms) // Both rows visible initially expect(container.querySelectorAll('tbody tr')).toHaveLength(2) // Click RWA filter fireEvent.click(screen.getByText('RWA')) expect(container.querySelectorAll('tbody tr')).toHaveLength(1) // Click RWA again to deselect fireEvent.click(screen.getByText('RWA')) expect(container.querySelectorAll('tbody tr')).toHaveLength(2) }) it('searches AMMs by currency name', () => { const amms = [ createAMM({ amm_account_id: 'rAMM1', currency_1: 'XRP', currency_2: 'USD', }), createAMM({ amm_account_id: 'rAMM2', currency_1: 'BTC', currency_2: 'ETH', }), ] const { container } = renderComponent(amms) const searchInput = container.querySelector( '.amm-search', ) as HTMLInputElement fireEvent.change(searchInput, { target: { value: 'BTC' } }) expect(container.querySelectorAll('tbody tr')).toHaveLength(1) }) it('searches AMMs by account ID', () => { const amms = [ createAMM({ amm_account_id: 'rUniqueAccount111111111111111' }), createAMM({ amm_account_id: 'rOtherAccount2222222222222222' }), ] const { container } = renderComponent(amms) const searchInput = container.querySelector( '.amm-search', ) as HTMLInputElement fireEvent.change(searchInput, { target: { value: 'rUniqueAccount' } }) expect(container.querySelectorAll('tbody tr')).toHaveLength(1) }) it('paginates results (15 per page)', () => { // Create 20 AMMs const amms = Array.from({ length: 20 }, (_, i) => createAMM({ amm_account_id: `rAMM${String(i).padStart(30, '0')}` }), ) const { container } = renderComponent(amms) // Page 1: 15 rows expect(container.querySelectorAll('tbody tr')).toHaveLength(15) // First row rank should be 1 const firstRank = container.querySelector('tbody tr td.rank') expect(firstRank).toHaveTextContent('1') }) it('renders with XRP currency mode by default when passed', () => { const amm = createAMM() const { container } = renderComponent([amm], 'xrp') // Values should contain "XRP" expect(container.querySelector('td.tvl')?.textContent).toContain('XRP') }) it('renders empty table when no AMMs provided', () => { const { container } = renderComponent([]) expect(container.querySelectorAll('tbody tr')).toHaveLength(0) }) }) ================================================ FILE: src/containers/Accounts/AccountAsset/FutureDataIcon.scss ================================================ @use '../../shared/css/variables' as *; .future-data { display: inline-flex; align-items: center; justify-content: center; cursor: default; .clock-icon { width: 16px; height: 16px; color: $black-50; } } ================================================ FILE: src/containers/Accounts/AccountAsset/FutureDataIcon.tsx ================================================ import ClockIcon from '../../shared/images/clock-icon.svg' import { useTooltip } from '../../shared/components/Tooltip' import './FutureDataIcon.scss' const TOOLTIP_X_OFFSET = 10 const TOOLTIP_Y_OFFSET = -120 interface FutureDataIconProps { message?: string } /** * Displays an icon with a tooltip indicating that the associated data will be available in a future release. * * Note: For the tooltip functionality to work, ensure that a `` * component is rendered within the component tree. The TooltipProvider is available globally * from the App component. */ export const FutureDataIcon = ({ message = 'This data will be provided in a future release.', }: FutureDataIconProps) => { const { showTooltip, hideTooltip } = useTooltip() const handleShow = (e: React.MouseEvent | React.FocusEvent) => { const rect = e.currentTarget.getBoundingClientRect() showTooltip('text', e as any, message, { // The tooltip position is adjusted to appear below and slightly to the right of the icon x: rect.left + window.scrollX + TOOLTIP_X_OFFSET, y: rect.top + window.scrollY + TOOLTIP_Y_OFFSET, }) } return ( hideTooltip()} onFocus={handleShow} onBlur={() => hideTooltip()} tabIndex={0} role="button" > ) } ================================================ FILE: src/containers/Accounts/AccountAsset/assetTables/HeldIOUs.tsx ================================================ import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { useEffect, useContext, useState, useCallback, useMemo } from 'react' import Currency, { LP_TOKEN_IDENTIFIER, } from '../../../shared/components/Currency' import { Loader } from '../../../shared/components/Loader' import { Account } from '../../../shared/components/Account' import { ACCOUNT_FLAGS, buildFlags, formatTransferFee, } from '../../../../rippled/lib/utils' import { EmptyMessageTableRow } from '../../../shared/EmptyMessageTableRow' import { RouteLink } from '../../../shared/routing' import { TOKEN_ROUTE } from '../../../App/routes' import SocketContext from '../../../shared/SocketContext' import { shortenAccount } from '../../../shared/utils' import { getBalances, getAccountLines, getAccountInfo, } from '../../../../rippled/lib/rippled' import logger from '../../../../rippled/lib/logger' import DefaultTokenIcon from '../../../shared/images/default_token_icon.svg' import { useLanguage } from '../../../shared/hooks' import { calculateFormattedUsdBalance } from '../../../shared/NumberFormattingUtils' const log = logger({ name: 'HeldIOUs' }) // The LOS Token API has a batch size limit of 100; larger requests will be rejected. const LOS_TOKEN_API_BATCH_SIZE = 100 interface HeldIOUsProps { accountId: string onChange?: (data: { count: number; isLoading: boolean }) => void } interface IOU { tokenCode: string tokenIcon?: string issuer: string issuerName: string balance: number priceInUSD: number assetClass: string transferFee?: string frozen?: string } const fetchAccountHeldIOUs = async ( rippledSocket: any, accountId: string, ): Promise => { let balancesResponse try { balancesResponse = await getBalances(rippledSocket, accountId) } catch (error) { log.error( `Error calling 'gatewayBalances' for account ${accountId}: ${JSON.stringify(error)}`, ) return [] } // Collect all tokens, whether they are LP Tokens or IOUs const assetTokens: any[] = [] for (const assets of Object.values(balancesResponse?.assets ?? {})) { for (const asset of assets as any[]) { if (asset.currency) { assetTokens.push(asset.currency) } } } if (assetTokens.length === 0) { // No tokens held, return empty array return [] } // Get all trust lines using account_lines with pagination const allTrustLines: any[] = [] let marker = '' do { try { // eslint-disable-next-line no-await-in-loop const accountLinesResponse = await getAccountLines( rippledSocket, accountId, 400, marker, ) if (accountLinesResponse?.lines) { allTrustLines.push(...accountLinesResponse.lines) } marker = accountLinesResponse?.marker || '' } catch (error) { log.error( `Error fetching account lines for account ${accountId}: ${JSON.stringify(error)}`, ) // Break the loop on error to avoid infinite retry break } } while (marker) // Keep positive balances only (no LP token filtering at this stage) const positiveBalanceLines = allTrustLines.filter( (line: any) => parseFloat(line.balance) > 0, ) if (positiveBalanceLines.length === 0) { return [] } // Batch get token data from LOS Token API const allTokenIds = positiveBalanceLines.map( (line: any) => `${line.currency}.${line.account}`, ) let allTokensFromLOS: Record = {} for (let i = 0; i < allTokenIds.length; i += LOS_TOKEN_API_BATCH_SIZE) { const tokenIds = allTokenIds.slice(i, i + LOS_TOKEN_API_BATCH_SIZE) try { // eslint-disable-next-line no-await-in-loop const apiResponse = await fetch( `${process.env.VITE_LOS_URL}/tokens/batch-get`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ tokenIds }), }, ) if (apiResponse.ok) { // eslint-disable-next-line no-await-in-loop const responseBody = await apiResponse.json() const tokensFromLOS = responseBody.tokens?.reduce((acc: any, token: any) => { acc[`${token.currency}.${token.issuer_account}`] = { ...token, } return acc }, {}) || {} allTokensFromLOS = { ...allTokensFromLOS, ...tokensFromLOS } } } catch (error) { log.error( `Error batch-get tokens[${tokenIds.join(', ')}]. Error: ${JSON.stringify(error)}`, ) } } // Combine all data (without transfer fees and Global freeze status for now) const tokens: IOU[] = positiveBalanceLines.map((line: any) => { const tokenId = `${line.currency}.${line.account}` const token = allTokensFromLOS[tokenId] return { tokenCode: line.currency, tokenIcon: token?.icon, issuer: line.account, issuerName: token?.issuer_name, balance: parseFloat(line.balance), priceInUSD: token?.price_usd ? parseFloat(token.price_usd) : 0, assetClass: token?.asset_class || '--', transferFee: '--', frozen: line.freeze || line.freeze_peer ? 'Trustline' : '--', } }) return tokens } /** * Held IOUs rendering flow: * 1. Initially display all tokens whose currency codes don't start with `03` (since `03` may indicate LP tokens). * 2. After confirming a `03` token is not an LP token, add it to the table. * 3. Progressively enrich each token row with transfer fee and account-level freeze status as that data loads. */ export const HeldIOUs = ({ accountId, onChange }: HeldIOUsProps) => { const lang = useLanguage() const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const [progressiveUpdates, setProgressiveUpdates] = useState< Record >({}) const [confirmedNonLPTokens, setConfirmedNonLPTokens] = useState>( new Set(), ) const [lpTokenCheckComplete, setLpTokenCheckComplete] = useState(false) const heldIOUsQuery = useQuery(['heldIOUs', accountId], () => fetchAccountHeldIOUs(rippledSocket, accountId), ) // Filter out ALL '03' tokens initially, then add back confirmed non-LP tokens const sortedIOUs = useMemo(() => { const data = heldIOUsQuery.data || [] const filteredData = data.filter((token) => { // If it starts with '03', only include if confirmed as non-LP if (token.tokenCode.startsWith(LP_TOKEN_IDENTIFIER)) { return confirmedNonLPTokens.has(token.tokenCode) } // Include all non-'03' tokens return true }) return [...filteredData].sort( (a, b) => b.priceInUSD * b.balance - a.priceInUSD * a.balance, ) }, [heldIOUsQuery.data, confirmedNonLPTokens]) // Apply progressive updates to the base IOU token data const iouTokens = sortedIOUs.map((token) => { const progressiveUpdate = progressiveUpdates[token.issuer] return { ...token, transferFee: progressiveUpdate?.transferFee || token.transferFee, frozen: progressiveUpdate?.accountGlobalFrozen ? 'Global' : token.frozen, } }) // Progressive fetching of account info with transfer fee and Global freeze status const fetchAccountInfoProgressively = useCallback(async () => { if (sortedIOUs.length === 0) { return } const uniqueIssuers = [...new Set(sortedIOUs.map((line) => line.issuer))] for (const issuer of uniqueIssuers) { try { // eslint-disable-next-line no-await-in-loop const accountInfo = await getAccountInfo(rippledSocket, issuer, false) const transferFee = formatTransferFee(accountInfo?.TransferRate, 'IOU') const accountGlobalFrozen = buildFlags( accountInfo?.Flags, ACCOUNT_FLAGS, ).includes('lsfGlobalFreeze') setProgressiveUpdates((prev) => ({ ...prev, [issuer]: { transferFee: `${transferFee}%`, accountGlobalFrozen, }, })) } catch (error) { log.error( `Error fetching account information: ${JSON.stringify(error)}`, ) } } }, [sortedIOUs, rippledSocket]) // Identify non-LP tokens - check which '03' tokens are regular IOUs (not LP tokens) const identifyNonLPTokensProgressively = useCallback(async () => { if (!heldIOUsQuery.data || heldIOUsQuery.data.length === 0) { setLpTokenCheckComplete(true) return } // Group tokens by issuer to minimize getAccountInfo calls const tokensByIssuer = new Map() for (const token of heldIOUsQuery.data) { if (token.tokenCode.startsWith(LP_TOKEN_IDENTIFIER)) { const tokens = tokensByIssuer.get(token.issuer) || [] tokens.push(token.tokenCode) tokensByIssuer.set(token.issuer, tokens) } } for (const [issuer, tokenCodes] of tokensByIssuer.entries()) { try { // eslint-disable-next-line no-await-in-loop const accountInfo = await getAccountInfo(rippledSocket, issuer, false) // If the issuer does NOT have an AMMID, these are regular IOUs (non-LP tokens) if (!accountInfo.AMMID) { setConfirmedNonLPTokens((prev) => { const newSet = new Set(prev) for (const tokenCode of tokenCodes) { newSet.add(tokenCode) } return newSet }) } } catch (error) { log.warn( `Error checking if issuer ${issuer} is AMM account: ${JSON.stringify(error)}`, ) // If we can't fetch account info, assume it's not an AMM to be safe // Add these tokens to the confirmed non-LP list setConfirmedNonLPTokens((prev) => { const newSet = new Set(prev) for (const tokenCode of tokenCodes) { newSet.add(tokenCode) } return newSet }) } } setLpTokenCheckComplete(true) }, [heldIOUsQuery.data, rippledSocket]) // Start identifying non-LP tokens immediately after initial data loads useEffect(() => { if (heldIOUsQuery.data && heldIOUsQuery.data.length > 0) { identifyNonLPTokensProgressively() } else if (heldIOUsQuery.data && heldIOUsQuery.data.length === 0) { setLpTokenCheckComplete(true) } }, [heldIOUsQuery.data, identifyNonLPTokensProgressively]) // Begin progressive updates once the LP token check is complete (we now have the final IOU list) useEffect(() => { if (lpTokenCheckComplete && sortedIOUs.length > 0) { fetchAccountInfoProgressively() } }, [lpTokenCheckComplete, sortedIOUs.length, fetchAccountInfoProgressively]) // Communicate count and loading state back to parent // Keep loading state true until LP token checks are complete useEffect(() => { if (onChange) { onChange({ count: iouTokens.length, isLoading: heldIOUsQuery.isLoading || !lpTokenCheckComplete, }) } }, [ iouTokens.length, heldIOUsQuery.isLoading, lpTokenCheckComplete, onChange, ]) if (heldIOUsQuery.isLoading) { return } return (
{iouTokens.length === 0 ? ( {t('account_page_asset_table_no_iou')} ) : ( iouTokens.map((token) => { const { formattedUsdPrice, formattedBalance, formattedBalanceUsd, } = calculateFormattedUsdBalance( token.balance, token.priceInUSD, lang, ) return ( ) }) )}
{t('account_page_asset_table_column_currency_code')} {t('account_page_asset_table_column_issuer')} {t('account_page_asset_table_column_price_usd')} {t('account_page_asset_table_column_balance')} {t('account_page_asset_table_column_balance_usd')} {t('account_page_asset_table_column_asset_class')} {t('account_page_asset_table_column_transfer_fee')} {t('account_page_asset_table_column_frozen')}
{token.tokenIcon ? ( {token.tokenCode} ) : ( )}
{formattedUsdPrice} {formattedBalance} {formattedBalanceUsd} {token.assetClass} {token.transferFee || '--'} {token.frozen}
) } ================================================ FILE: src/containers/Accounts/AccountAsset/assetTables/HeldLPTokens.tsx ================================================ import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { useEffect, useContext, useMemo } from 'react' import { Loader } from '../../../shared/components/Loader' import SocketContext from '../../../shared/SocketContext' import Currency, { LP_TOKEN_IDENTIFIER, } from '../../../shared/components/Currency' import { Account } from '../../../shared/components/Account' import { formatUsdValue, formatTokenBalance, } from '../../../shared/NumberFormattingUtils' import { useLanguage } from '../../../shared/hooks' import { shortenAccount } from '../../../shared/utils' import { getBalances, getAMMInfoByAMMAccount, } from '../../../../rippled/lib/rippled' import { XRP_BASE } from '../../../shared/transactionUtils' import { EmptyMessageTableRow } from '../../../shared/EmptyMessageTableRow' import logger from '../../../../rippled/lib/logger' const log = logger({ name: 'HeldLPTokens' }) const fetchAccountHeldLPTokens = async (rippledSocket, accountId) => { let balancesResponse try { balancesResponse = await getBalances(rippledSocket, accountId) } catch (error) { log.error( `Error calling gatewayBalances for account ${accountId}: ${JSON.stringify(error)}`, ) return [] } const lpTokens: any[] = [] for (const [issuerAccount, assets] of Object.entries( balancesResponse?.assets ?? {}, )) { for (const asset of assets as any[]) { if (asset.currency && asset.currency.startsWith(LP_TOKEN_IDENTIFIER)) { // eslint-disable-next-line no-await-in-loop const result = await processLPTokenAsset( rippledSocket, issuerAccount, asset, ) // The currency code of an IOU could start with `LP_TOKEN_IDENTIFIER` as well, // but `result` will be null since getAMMInfoByAMMAccount will throw an exception if (result) { lpTokens.push(result) } } } } return lpTokens } const processLPTokenAsset = async (rippledSocket, issuerAccount, asset) => { let ammInfoResponse try { ammInfoResponse = await getAMMInfoByAMMAccount(rippledSocket, issuerAccount) } catch (error) { log.error(`Error fetching AMM pool: ${JSON.stringify(error)}`) return null } if (!ammInfoResponse.amm) { return null } const ammData = ammInfoResponse.amm // Calculate share percentage const accountLPTokenBalance = parseFloat(asset.value) const ammLPTokenBalance = parseFloat(ammData.lp_token?.value || 0) const sharePercentage = ammLPTokenBalance > 0 ? (100 * accountLPTokenBalance) / ammLPTokenBalance : 0 const isAmount1XRP = typeof ammData.amount === 'string' const isAmount2XRP = typeof ammData.amount2 === 'string' // Calculate LP Token price in XRP only when one of the assets is XRP let lpTokenPriceInXRP = 0 if (isAmount1XRP || isAmount2XRP) { const xrpAmount = isAmount1XRP ? parseFloat(ammData.amount) / XRP_BASE : parseFloat(ammData.amount2) / XRP_BASE if (ammLPTokenBalance > 0 && xrpAmount > 0) { // Price per LP token = (XRP in pool * 2) / total LP tokens // We multiply by 2 because LP token represents share of both assets lpTokenPriceInXRP = (xrpAmount * 2) / ammLPTokenBalance } } let currency1 let currency2 if (isAmount1XRP && !isAmount2XRP) { currency1 = 'XRP' currency2 = ammData.amount2.currency } else if (!isAmount1XRP && isAmount2XRP) { currency1 = 'XRP' currency2 = ammData.amount.currency } else { // Both are tokens (no XRP) currency1 = ammData.amount.currency currency2 = ammData.amount2.currency } return { ammInstance: issuerAccount, currency1, currency2, lpTokenBalance: accountLPTokenBalance, lpTokenPriceInXRP, share: sharePercentage, } } interface HeldLPTokensProps { accountId: string xrpToUSDRate: number onChange?: (data: { count: number; isLoading: boolean }) => void } export const HeldLPTokens = ({ accountId, xrpToUSDRate, onChange, }: HeldLPTokensProps) => { const lang = useLanguage() const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const heldLPTokensQuery = useQuery(['heldLPTokens', accountId], () => fetchAccountHeldLPTokens(rippledSocket, accountId), ) const lpTokenData = useMemo( () => heldLPTokensQuery.data ?? [], [heldLPTokensQuery.data], ) // Two-tier sort: 1) XRP pairs first, 2) within XRP pairs, sort by USD value descending const rows = lpTokenData.sort((a, b) => { const aHasXRP = a.currency1 === 'XRP' || a.currency2 === 'XRP' const bHasXRP = b.currency1 === 'XRP' || b.currency2 === 'XRP' // First, prioritize XRP pairs if (aHasXRP && !bHasXRP) { return -1 } if (!aHasXRP && bHasXRP) { return 1 } // Then sort by Balance USD descending (only for XRP pairs) if (aHasXRP && bHasXRP) { const aBalanceUSD = a.lpTokenBalance * a.lpTokenPriceInXRP * xrpToUSDRate const bBalanceUSD = b.lpTokenBalance * b.lpTokenPriceInXRP * xrpToUSDRate return bBalanceUSD - aBalanceUSD } // For non-XRP pairs, maintain original order return 0 }) // Communicate count and loading state back to parent useEffect(() => { if (onChange) { onChange({ count: rows.length, isLoading: heldLPTokensQuery.isLoading }) } }, [rows.length, heldLPTokensQuery.isLoading, onChange]) if (heldLPTokensQuery.isLoading) { return } const cols = [ t('account_page_asset_table_column_amm_instance'), t('account_page_asset_table_column_amm_pair'), t('account_page_asset_table_column_balance'), t('account_page_asset_table_column_balance_usd'), t('account_page_asset_table_column_share'), ] return (
{cols.map((c) => ( ))} {rows.length === 0 ? ( {t('account_page_asset_table_no_lptoken')} ) : ( rows.map((row) => { // Calculate display values using utility functions const formattedBalance = formatTokenBalance( row.lpTokenBalance, lang, ) // Format USD Balance (only for XRP pairs) let formattedBalanceUsd = '--' if (row.currency1 === 'XRP' || row.currency2 === 'XRP') { const balanceUSD = row.lpTokenBalance * row.lpTokenPriceInXRP * xrpToUSDRate formattedBalanceUsd = formatUsdValue(balanceUSD, lang) } return ( ) }) )}
{c}
/ {formattedBalance} {formattedBalanceUsd} {row.share < 1 ? row.share.toFixed(4) : row.share.toFixed(2)} %
) } ================================================ FILE: src/containers/Accounts/AccountAsset/assetTables/HeldMPTs.tsx ================================================ import { useQuery } from 'react-query' import { useEffect, useContext } from 'react' import { useTranslation } from 'react-i18next' import { RouteLink } from '../../../shared/routing' import { MPT_ROUTE } from '../../../App/routes' import { Loader } from '../../../shared/components/Loader' import { EmptyMessageTableRow } from '../../../shared/EmptyMessageTableRow' import { Account } from '../../../shared/components/Account' import { Tooltip, useTooltip } from '../../../shared/components/Tooltip' import { formatMPTIssuance, formatMPToken, formatTransferFee, } from '../../../../rippled/lib/utils' import { getAccountMPTs, getMPTIssuance } from '../../../../rippled/lib/rippled' import SocketContext from '../../../shared/SocketContext' import { shortenAccount, shortenMPTID, convertScaledPrice, } from '../../../shared/utils' import { useLanguage } from '../../../shared/hooks' import logger from '../../../../rippled/lib/logger' import { FutureDataIcon } from '../FutureDataIcon' import { parseAmount } from '../../../shared/NumberFormattingUtils' const log = logger({ name: 'HeldMPTs' }) interface HeldMPTsProps { accountId: string onChange?: (data: { count: number; isLoading: boolean }) => void } const fetchAccountHeldMPTs = async (accountId: string, rippledSocket: any) => { const mpts: any[] = [] let marker = '' do { try { // eslint-disable-next-line no-await-in-loop const response = await getAccountMPTs(rippledSocket, accountId, marker) if (!response?.account_objects) { break } mpts.push(...response.account_objects) marker = response.marker || '' } catch (error) { log.error(`Error fetching MPTs: ${JSON.stringify(error)}`) // Break the loop on error to avoid infinite retry break } } while (marker) // Format and filter MPTs const positiveBalanceMPTs = mpts .map((mpToken: any) => formatMPToken(mpToken)) .filter((mpToken: any) => parseInt(mpToken.mptAmount || '0', 10) > 0) // For each MPTokenIssuanceID, call getMPTIssuance and format the response const mptIssuancePromises = positiveBalanceMPTs.map(async (mpToken: any) => { try { const mptIssuanceResponse = await getMPTIssuance( rippledSocket, mpToken.mptIssuanceID, ) const formattedMPTIssuance = formatMPTIssuance(mptIssuanceResponse.node) return { mptIssuanceId: mpToken.mptIssuanceID, mptIssuance: formattedMPTIssuance, } } catch (error) { log.error( `Error fetching MPT issuance for token ${mpToken.mptIssuanceID}: ${JSON.stringify(error)}`, ) return { mptIssuanceId: mpToken.mptIssuanceID, mptIssuance: null } } }) const mptIssuanceResults = await Promise.all(mptIssuancePromises) const mptIssuanceIdToIssuance = new Map() mptIssuanceResults.forEach((result) => { if (result && result.mptIssuance) { mptIssuanceIdToIssuance.set(result.mptIssuanceId, result.mptIssuance) } }) // Combine MPToken and MPTIssuance data const combinedMPTs = positiveBalanceMPTs.map((mpToken: any) => { const mptIssuance = mptIssuanceIdToIssuance.get(mpToken.mptIssuanceID) const { parsedMPTMetadata } = mptIssuance ?? {} return { tokenId: mpToken.mptIssuanceID, balance: convertScaledPrice( BigInt(mpToken.mptAmount), mptIssuance?.assetScale ?? 0, ), ticker: (parsedMPTMetadata?.ticker as string) || null, issuer: mptIssuance?.issuer || '', issuerName: (parsedMPTMetadata?.issuer_name as string) || null, assetClass: (parsedMPTMetadata?.asset_class as string) || null, transferFee: formatTransferFee(mptIssuance?.transferFee, 'MPT'), locked: (() => { if (mptIssuance?.flags?.includes('lsfMPTLocked')) { return 'Global' } if (mpToken.flags?.includes('lsfMPTLocked')) { return 'Individual' } return '' })(), } }) return combinedMPTs } const HeldMPTsContent = ({ accountId, onChange }: HeldMPTsProps) => { const lang = useLanguage() const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const { tooltip } = useTooltip() const heldMPTsQuery = useQuery(['heldMPTs', accountId], () => fetchAccountHeldMPTs(accountId, rippledSocket), ) // TODO: When MPT Dex is live, sort MPTs based on USD balances const rows = heldMPTsQuery.data ?? [] // Communicate count and loading state back to parent useEffect(() => { if (onChange) { onChange({ count: rows.length, isLoading: heldMPTsQuery.isLoading }) } }, [rows.length, heldMPTsQuery.isLoading, onChange]) if (heldMPTsQuery.isLoading) { return } return (
{rows.length === 0 ? ( {t('account_page_asset_table_no_mpt')} ) : ( rows.map((token) => ( )) )}
{t('account_page_asset_table_column_token_id')} {t('account_page_asset_table_column_ticker')} {t('account_page_asset_table_column_issuer')} {t('account_page_asset_table_column_price_usd')} {t('account_page_asset_table_column_balance')} {t('account_page_asset_table_column_balance_usd')} {t('account_page_asset_table_column_asset_class')} {t('account_page_asset_table_column_transfer_fee')} {t('account_page_asset_table_column_locked')}
{shortenMPTID(token.tokenId)} {token.ticker ? token.ticker : '--'} {parseAmount(token.balance, 1, lang)} {token.assetClass ? token.assetClass.toUpperCase() : '--'} {token.transferFee}% {(() => { if (token.locked === '') { return '--' } if (token.locked === 'Global') { return t('account_page_asset_table_mpt_locked_global') } if (token.locked === 'Individual') { return t('account_page_asset_table_mpt_locked_individual') } return token.locked })()}
) } export const HeldMPTs = ({ accountId, onChange }: HeldMPTsProps) => ( ) ================================================ FILE: src/containers/Accounts/AccountAsset/assetTables/HeldNFTs.tsx ================================================ import { getAccountNFTs } from '../../../../rippled/lib/rippled' import { formatTransferFee } from '../../../../rippled/lib/utils' import { NFTTable, NFT } from './NFTTable' import logger from '../../../../rippled/lib/logger' const log = logger({ name: 'HeldNFTs' }) interface HeldNFTsProps { accountId: string onChange?: (data: { count: number; isLoading: boolean }) => void } const fetchAccountHeldNFTs = async ( accountId: string, rippledSocket: any, ): Promise => { try { const allNFTs: any[] = [] let marker = '' do { // eslint-disable-next-line no-await-in-loop const response = await getAccountNFTs( rippledSocket, accountId, marker, 10, // Not 10 NFTs, but 10 pages of NFTs ) if (response.account_nfts) { allNFTs.push(...response.account_nfts) } marker = response.marker || '' } while (marker) return allNFTs.map((nft) => ({ nftId: nft.NFTokenID, issuer: nft.Issuer, url: nft.URI ? Buffer.from(nft.URI, 'hex').toString('utf8') : '', transferFee: formatTransferFee(nft.TransferFee, 'NFT'), })) } catch (error) { log.error(`Error fetching held NFTs: ${JSON.stringify(error)}`) return [] } } export const HeldNFTs = ({ accountId, onChange }: HeldNFTsProps) => ( ) ================================================ FILE: src/containers/Accounts/AccountAsset/assetTables/IssuedIOUs.tsx ================================================ import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { useEffect, useContext, useMemo } from 'react' import Currency from '../../../shared/components/Currency' import { Loader } from '../../../shared/components/Loader' import { EmptyMessageTableRow } from '../../../shared/EmptyMessageTableRow' import { RouteLink } from '../../../shared/routing' import { TOKEN_ROUTE } from '../../../App/routes' import SocketContext from '../../../shared/SocketContext' import { getBalances } from '../../../../rippled/lib/rippled' import logger from '../../../../rippled/lib/logger' import DefaultTokenIcon from '../../../shared/images/default_token_icon.svg' import { localizeNumber } from '../../../shared/utils' import { useLanguage } from '../../../shared/hooks' import { formatUsdValue, formatTokenBalance, } from '../../../shared/NumberFormattingUtils' const log = logger({ name: 'IssuedIOUs' }) const LOS_TOKEN_API_BATCH_SIZE = 100 interface IssuedIOUsProps { accountId: string account: any onChange?: (data: { count: number; isLoading: boolean }) => void } interface IOU { tokenCode: string tokenIcon?: string priceInUSD: number trustlines: number holders: number supply: number assetClass: string transferFee: string frozen: string } const fetchAccountIssuedIOUs = async ( rippledSocket: any, accountId: string, account: any, ): Promise => { let balancesResponse try { balancesResponse = await getBalances(rippledSocket, accountId) } catch (error) { log.error( `Error calling gatewayBalances for account ${accountId}: ${JSON.stringify(error)}`, ) return [] } // We don't need to filter out LP tokens because if an account issued an LP token, // it would be an AMM account and would be displayed on the AMM account page // instead of a regular account page const iouTokens: string[] = Object.keys(balancesResponse?.obligations ?? {}) if (iouTokens.length === 0) { // No IOUs issued by this account, return empty array return [] } // Batch get token data from LOS Token API const allTokenIds = iouTokens.map((currency) => `${currency}.${accountId}`) let allTokens: Record = {} for (let i = 0; i < allTokenIds.length; i += LOS_TOKEN_API_BATCH_SIZE) { const tokenIds = allTokenIds.slice(i, i + LOS_TOKEN_API_BATCH_SIZE) try { // eslint-disable-next-line no-await-in-loop const apiResponse = await fetch( `${process.env.VITE_LOS_URL}/tokens/batch-get`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ tokenIds }), }, ) if (apiResponse.ok) { // eslint-disable-next-line no-await-in-loop const responseBody = await apiResponse.json() const tokens = responseBody.tokens?.reduce((acc: any, token: any) => { acc[`${token.currency}.${token.issuer_account}`] = { ...token, } return acc }, {}) || {} allTokens = { ...allTokens, ...tokens } } } catch (error) { log.error( `Error batch-get tokens[${tokenIds.join(', ')}]. Error: ${JSON.stringify(error)}`, ) } } const transferFee = account?.info?.rate const accountGlobalFreeze = account?.info?.flags?.includes('lsfGlobalFreeze') const iouData: IOU[] = iouTokens.map((currency: string) => { const tokenId = `${currency}.${accountId}` const token = allTokens[tokenId] // Use obligation value from gateway balance as supply since it excludes frozen balances const obligationSupply = balancesResponse?.obligations?.[currency] ? parseFloat(balancesResponse.obligations[currency]) : 0 const apiSupply = token?.supply ? parseFloat(token.supply) : 0 if (apiSupply > obligationSupply) { const diff = apiSupply - obligationSupply log.warn( `Supply for ${currency}: GatewayBalance=${obligationSupply}, API=${apiSupply}, Likely Frozen=${diff}`, ) } return { tokenCode: currency, tokenIcon: token?.icon, priceInUSD: token?.price_usd ? parseFloat(token.price_usd) : 0, trustlines: token?.number_of_trustlines || 0, holders: token?.number_of_holders || 0, supply: obligationSupply, assetClass: token?.asset_class || '--', transferFee: `${transferFee}%`, frozen: accountGlobalFreeze ? 'Global' : '--', } }) return iouData } export const IssuedIOUs = ({ accountId, account, onChange, }: IssuedIOUsProps) => { const lang = useLanguage() const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const issuedIOUsQuery = useQuery(['issuedIOUs', accountId], () => fetchAccountIssuedIOUs(rippledSocket, accountId, account), ) // Sort by USD price const sortedIOUs = useMemo(() => { const data = issuedIOUsQuery.data || [] return [...data].sort((a, b) => b.priceInUSD - a.priceInUSD) }, [issuedIOUsQuery.data]) // Communicate count and loading state back to parent useEffect(() => { if (onChange) { onChange({ count: sortedIOUs.length, isLoading: issuedIOUsQuery.isLoading, }) } }, [sortedIOUs.length, issuedIOUsQuery.isLoading, onChange]) if (issuedIOUsQuery.isLoading) { return } return (
{sortedIOUs.length === 0 ? ( {t('account_page_asset_table_no_iou')} ) : ( sortedIOUs.map((token) => ( )) )}
{t('account_page_asset_table_column_currency_code')} {t('account_page_asset_table_column_price_usd')} {t('account_page_asset_table_column_trustlines')} {t('account_page_asset_table_column_holders')} {t('account_page_asset_table_column_supply')} {t('account_page_asset_table_column_asset_class')} {t('account_page_asset_table_column_transfer_fee')} {t('account_page_asset_table_column_frozen')}
{token.tokenIcon ? ( {token.tokenCode} ) : ( )}
{formatUsdValue(token.priceInUSD, lang)} {localizeNumber(token.trustlines, lang)} {localizeNumber(token.holders, lang)} {formatTokenBalance(token.supply, lang)} {token.assetClass} {token.transferFee} {token.frozen}
) } ================================================ FILE: src/containers/Accounts/AccountAsset/assetTables/IssuedMPTs.tsx ================================================ import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { useEffect, useContext } from 'react' import { RouteLink } from '../../../shared/routing' import { MPT_ROUTE } from '../../../App/routes' import { Loader } from '../../../shared/components/Loader' import { EmptyMessageTableRow } from '../../../shared/EmptyMessageTableRow' import { FutureDataIcon } from '../FutureDataIcon' import { Tooltip, useTooltip } from '../../../shared/components/Tooltip' import { getAccountObjects } from '../../../../rippled/lib/rippled' import SocketContext from '../../../shared/SocketContext' import { formatMPTIssuance, formatTransferFee, } from '../../../../rippled/lib/utils' import { shortenMPTID, convertScaledPrice } from '../../../shared/utils' import { useLanguage } from '../../../shared/hooks' import logger from '../../../../rippled/lib/logger' import { parseAmount } from '../../../shared/NumberFormattingUtils' const log = logger({ name: 'IssuedMPTs' }) interface IssuedMPTsProps { accountId: string onChange?: (data: { count: number; isLoading: boolean }) => void } const fetchAccountIssuedMPTs = async ( accountId: string, rippledSocket: any, ) => { const mptIssuances: any[] = [] let marker = '' do { try { // eslint-disable-next-line no-await-in-loop const response = await getAccountObjects( rippledSocket, accountId, 'mpt_issuance', marker, ) if (!response?.account_objects) { break } mptIssuances.push(...response.account_objects) marker = response.marker || '' } catch (error) { log.error(`Error fetching MPT issuances: ${JSON.stringify(error)}`) // Break the loop on error to avoid infinite retry break } } while (marker) // Format the MPT issuances const issuedMPTs = mptIssuances.map((mptIssuance: any) => { const formattedIssuance = formatMPTIssuance(mptIssuance) const { parsedMPTMetadata } = formattedIssuance return { tokenId: mptIssuance.mpt_issuance_id, ticker: (parsedMPTMetadata?.ticker as string) || null, supply: convertScaledPrice( BigInt(formattedIssuance?.outstandingAmt) || 0, formattedIssuance?.assetScale || 0, ), assetClass: (parsedMPTMetadata?.asset_class as string) || null, transferFee: formatTransferFee(formattedIssuance?.transferFee, 'MPT'), locked: formattedIssuance?.flags?.includes('lsfMPTLocked') ? 'Global' : '', } }) return issuedMPTs } const IssuedMPTsContent = ({ accountId, onChange }: IssuedMPTsProps) => { const lang = useLanguage() const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const { tooltip } = useTooltip() const issuedMPTsQuery = useQuery(['issuedMPTs', accountId], () => fetchAccountIssuedMPTs(accountId, rippledSocket), ) // TODO: When MPT Dex is live, sort MPTs based on USD price const rows = issuedMPTsQuery.data ?? [] // Communicate count and loading state back to parent useEffect(() => { if (onChange) { onChange({ count: rows.length, isLoading: issuedMPTsQuery.isLoading }) } }, [rows.length, issuedMPTsQuery.isLoading, onChange]) if (issuedMPTsQuery.isLoading) { return } return (
{rows.length === 0 ? ( {t('account_page_asset_table_no_mpt')} ) : ( rows.map((token) => ( )) )}
{t('account_page_asset_table_column_token_id')} {t('account_page_asset_table_column_ticker')} {t('account_page_asset_table_column_price_usd')} {t('account_page_asset_table_column_circulating_supply')} {t('account_page_asset_table_column_asset_class')} {t('account_page_asset_table_column_transfer_fee')} {t('account_page_asset_table_column_locked')}
{shortenMPTID(token.tokenId)} {token.ticker ? token.ticker : '--'} {parseAmount(token.supply, 1, lang)} {token.assetClass ? token.assetClass.toUpperCase() : '--'} {token.transferFee}% {token.locked === '' ? '--' : t('account_page_asset_table_mpt_locked_global')}
) } export const IssuedMPTs = ({ accountId, onChange }: IssuedMPTsProps) => ( ) ================================================ FILE: src/containers/Accounts/AccountAsset/assetTables/IssuedNFTs.tsx ================================================ import { getNFTsIssuedByAccount } from '../../../../rippled/lib/rippled' import { formatTransferFee } from '../../../../rippled/lib/utils' import { NFTTable, NFT } from './NFTTable' import logger from '../../../../rippled/lib/logger' const log = logger({ name: 'IssuedNFTs' }) interface IssuedNFTsProps { accountId: string onChange?: (data: { count: number; isLoading: boolean }) => void } const fetchAccountIssuedNFTs = async ( accountId: string, rippledSocket: any, ): Promise => { try { const allNFTs: any[] = [] let marker = '' do { // eslint-disable-next-line no-await-in-loop const response = await getNFTsIssuedByAccount( rippledSocket, accountId, marker, 50, ) if (response.nfts) { allNFTs.push(...response.nfts) } marker = response.marker || '' } while (marker) return allNFTs.map((nft) => ({ nftId: nft.nft_id, url: nft.uri ? Buffer.from(nft.uri, 'hex').toString('utf8') : '', transferFee: formatTransferFee(nft.transfer_fee, 'NFT'), })) } catch (error) { log.error(`Error fetching issued NFTs: ${JSON.stringify(error)}`) return [] } } export const IssuedNFTs = ({ accountId, onChange }: IssuedNFTsProps) => ( ) ================================================ FILE: src/containers/Accounts/AccountAsset/assetTables/NFTTable.tsx ================================================ import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { useEffect, useMemo, useContext, useState, useCallback } from 'react' import { Account } from '../../../shared/components/Account' import { PaginatedTable } from '../../../shared/components/PaginatedTable' import { Loader } from '../../../shared/components/Loader' import SocketContext from '../../../shared/SocketContext' import { getBuyNFToffers, getSellNFToffers, } from '../../../../rippled/lib/rippled' import { EmptyMessageTableRow } from '../../../shared/EmptyMessageTableRow' import { NFTokenLink } from '../../../shared/components/NFTokenLink' import DomainLink from '../../../shared/components/DomainLink' import { XRP_BASE } from '../../../shared/transactionUtils' import { localizeNumber, shortenAccount, shortenDomain, shortenNFTTokenID, } from '../../../shared/utils' import { XRP_SMALL_BALANCE_CURRENCY_OPTIONS } from '../../../shared/NumberFormattingUtils' import { useLanguage } from '../../../shared/hooks' import logger from '../../../../rippled/lib/logger' const log = logger({ name: 'NFTTable' }) const PAGE_SIZE = 10 interface NFTTableProps { accountId: string onChange?: (data: { count: number; isLoading: boolean }) => void fetchNFTs: (accountId: string, rippledSocket: any) => Promise queryKey: string showIssuer?: boolean } export interface NFT { nftId: string issuer?: string url: string transferFee: string lowestAsk?: number highestBid?: number } export const NFTTable = ({ accountId, onChange, fetchNFTs, queryKey, showIssuer = false, }: NFTTableProps) => { const { t } = useTranslation() const lang = useLanguage() const rippledSocket = useContext(SocketContext) const [nfts, setNFTs] = useState([]) const [fetchedNFTs, setFetchedNFTs] = useState>(new Set()) const [isLoadingOffers, setIsLoadingOffers] = useState(false) // Fetch and show basic NFT data first const nftsQuery = useQuery([queryKey, accountId], () => fetchNFTs(accountId, rippledSocket), ) const basicNFTs = useMemo(() => nftsQuery.data ?? [], [nftsQuery.data]) const processXRPOffers = useCallback( (offers: any[], sortAscending: boolean) => { const xrpOffers = offers.filter( (offer: any) => typeof offer.amount === 'string', ) if (xrpOffers.length === 0) { return undefined } const sortedOffers = xrpOffers.sort((a: any, b: any) => { const amountA = parseInt(a.amount, 10) const amountB = parseInt(b.amount, 10) return sortAscending ? amountA - amountB : amountB - amountA }) const bestOffer = sortedOffers[0] return parseInt(bestOffer.amount, 10) / XRP_BASE }, [], ) const fetchOffers = useCallback( async (fetchFn: Function, nftId: string) => { try { const response = await fetchFn(rippledSocket, nftId, 50) return response.offers && response.offers.length > 0 ? response.offers : [] } catch (error: any) { if (error.code === 404 && error.message === 'notFound') { // This means there is no offer for the given NFT } else { log.error(error) } return [] } }, [rippledSocket], ) const fetchOffersForNFT = useCallback( async (nft: NFT): Promise => { // Get sell offers to calculate lowest ask (XRP only) const sellOffers = await fetchOffers(getSellNFToffers, nft.nftId) const lowestAsk = processXRPOffers(sellOffers, true) // ascending for lowest // Get buy offers to calculate highest bid (XRP only) const buyOffers = await fetchOffers(getBuyNFToffers, nft.nftId) const highestBid = processXRPOffers(buyOffers, false) // descending for highest return { ...nft, lowestAsk, highestBid } }, [processXRPOffers, fetchOffers], ) const batchProcessNFTOffers = useCallback( async (nftsToFetch: NFT[]) => { if (nftsToFetch.length === 0) { return } setIsLoadingOffers(true) // Fetch NFT offers sequentially to avoid being throttled for (const nft of nftsToFetch) { try { // eslint-disable-next-line no-await-in-loop const nftWithOffers = await fetchOffersForNFT(nft) // Update NFT immediately as offers are fetched setNFTs((prev) => prev.map((prevNft) => prevNft.nftId === nftWithOffers.nftId ? nftWithOffers : prevNft, ), ) // Mark as fetched setFetchedNFTs((prev) => new Set([...prev, nft.nftId])) } catch (error) { // Handle individual NFT errors, continue with others log.error( `Error fetching offers for NFT ${nft.nftId}: ${JSON.stringify(error)}`, ) } } setIsLoadingOffers(false) }, [fetchOffersForNFT], ) // Initialize NFTs when basic data loads useEffect(() => { if (basicNFTs.length > 0) { // Initialize all NFTs with undefined lowest ask and highest bid const initialNFTs = basicNFTs.map((nft) => ({ ...nft, lowestAsk: undefined, highestBid: undefined, })) setNFTs(initialNFTs) // Reset for new account setFetchedNFTs(new Set()) setIsLoadingOffers(false) // Fetch offers for first page NFTs immediately const firstPageNFTs = basicNFTs.slice(0, PAGE_SIZE) // Fetch offers for first page NFTs immediately batchProcessNFTOffers(firstPageNFTs) } }, [basicNFTs, batchProcessNFTOffers]) // Communicate count and loading state back to parent useEffect(() => { if (onChange) { onChange({ count: nfts.length, isLoading: nftsQuery.isLoading }) } }, [nfts.length, nftsQuery.isLoading, onChange]) if (nftsQuery.isLoading) { return } const tableStructure = (paginatedRows: any[]) => { // Fetch offers for visible NFTs when page changes // Only fetch if there are NFTs, for which we haven't fetched offers yet if (paginatedRows.length > 0) { const unfetchedNFTs = paginatedRows.filter( (nft) => !fetchedNFTs.has(nft.nftId), ) if (unfetchedNFTs.length > 0 && !isLoadingOffers) { // Use setTimeout to avoid calling setState during render setTimeout(() => { batchProcessNFTOffers(unfetchedNFTs) }, 0) } } const colSpan = showIssuer ? 6 : 5 return (
{showIssuer && ( )} {paginatedRows.length === 0 ? ( {t('account_page_asset_table_no_nft')} ) : ( paginatedRows.map((nft, index) => ( {showIssuer && nft.issuer && ( )} )) )}
{t('account_page_asset_table_column_token_id')}{t('account_page_asset_table_column_issuer')}{t('account_page_asset_table_column_url')} {t('account_page_asset_table_column_transfer_fee')} {t('account_page_asset_table_column_lowest_ask')} {t('account_page_asset_table_column_highest_bid')}
{nft.url ? ( ) : ( '--' )} {nft.transferFee}% {nft.lowestAsk ? localizeNumber( nft.lowestAsk, lang, XRP_SMALL_BALANCE_CURRENCY_OPTIONS, ) : '--'} {nft.highestBid ? localizeNumber( nft.highestBid, lang, XRP_SMALL_BALANCE_CURRENCY_OPTIONS, ) : '--'}
) } return ( ) } ================================================ FILE: src/containers/Accounts/AccountAsset/index.tsx ================================================ import { useState, useCallback } from 'react' import './styles.scss' import { useTranslation } from 'react-i18next' import { localizeNumber } from '../../shared/utils' import { useLanguage } from '../../shared/hooks' import ArrowIcon from '../../shared/images/down_arrow.svg' import { HeldIOUs } from './assetTables/HeldIOUs' import { HeldMPTs } from './assetTables/HeldMPTs' import { HeldLPTokens } from './assetTables/HeldLPTokens' import { HeldNFTs } from './assetTables/HeldNFTs' import { IssuedIOUs } from './assetTables/IssuedIOUs' import { IssuedMPTs } from './assetTables/IssuedMPTs' import { IssuedNFTs } from './assetTables/IssuedNFTs' type HeldAssetTabKey = 'iou' | 'mpt' | 'lptoken' | 'nft' type IssuedAssetTabKey = 'iou' | 'mpt' | 'nft' function TabButton({ label, active, onClick, loading = false, }: { label: string active?: boolean onClick?: () => void loading?: boolean }) { return ( ) } interface AccountAssetProps { accountId: string account?: any xrpToUSDRate: number } export default function AccountAsset({ accountId, account, xrpToUSDRate, }: AccountAssetProps) { const lang = useLanguage() const { t } = useTranslation() // Counts managed by individual table components const [counts, setCounts] = useState({ heldIou: 0, heldMpt: 0, heldLptoken: 0, heldNft: 0, issuedIou: 0, issuedMpt: 0, issuedNft: 0, }) // Loading states - start as true, set to false when we get data const [loading, setLoading] = useState({ heldIou: true, heldMpt: true, heldLptoken: true, heldNft: true, issuedIou: true, issuedMpt: true, issuedNft: true, }) // Stable update functions for each asset type const updateHeldIOUs = useCallback( ({ count, isLoading }: { count: number; isLoading: boolean }) => { setCounts((prev) => ({ ...prev, heldIou: count })) setLoading((prev) => ({ ...prev, heldIou: isLoading })) }, [], ) const updateHeldMPTs = useCallback( ({ count, isLoading }: { count: number; isLoading: boolean }) => { setCounts((prev) => ({ ...prev, heldMpt: count })) setLoading((prev) => ({ ...prev, heldMpt: isLoading })) }, [], ) const updateHeldLPTokens = useCallback( ({ count, isLoading }: { count: number; isLoading: boolean }) => { setCounts((prev) => ({ ...prev, heldLptoken: count })) setLoading((prev) => ({ ...prev, heldLptoken: isLoading })) }, [], ) const updateHeldNFTs = useCallback( ({ count, isLoading }: { count: number; isLoading: boolean }) => { setCounts((prev) => ({ ...prev, heldNft: count })) setLoading((prev) => ({ ...prev, heldNft: isLoading })) }, [], ) const updateIssuedIOUs = useCallback( ({ count, isLoading }: { count: number; isLoading: boolean }) => { setCounts((prev) => ({ ...prev, issuedIou: count })) setLoading((prev) => ({ ...prev, issuedIou: isLoading })) }, [], ) const updateIssuedMPTs = useCallback( ({ count, isLoading }: { count: number; isLoading: boolean }) => { setCounts((prev) => ({ ...prev, issuedMpt: count })) setLoading((prev) => ({ ...prev, issuedMpt: isLoading })) }, [], ) const updateIssuedNFTs = useCallback( ({ count, isLoading }: { count: number; isLoading: boolean }) => { setCounts((prev) => ({ ...prev, issuedNft: count })) setLoading((prev) => ({ ...prev, issuedNft: isLoading })) }, [], ) // Tabs state const [heldTab, setHeldTab] = useState('iou') const [issuedTab, setIssuedTab] = useState('iou') // Collapse state - default to expanded (true means open) const [heldSectionOpen, setHeldSectionOpen] = useState(true) const [issuedSectionOpen, setIssuedSectionOpen] = useState(true) return (
{/* Assets Held */}

{t('account_page_asset_held_title')}

setHeldTab('iou')} loading={loading.heldIou} /> setHeldTab('mpt')} loading={loading.heldMpt} /> setHeldTab('lptoken')} loading={loading.heldLptoken} /> setHeldTab('nft')} loading={loading.heldNft} />
{/* Render all components to fetch data, but only show active tab */}
{/* Assets Issued */}

{t('account_page_asset_issued_title')}

setIssuedTab('iou')} loading={loading.issuedIou} /> setIssuedTab('mpt')} loading={loading.issuedMpt} /> setIssuedTab('nft')} loading={loading.issuedNft} />
{/* Render all components to fetch data, but only show active tab */}
) } ================================================ FILE: src/containers/Accounts/AccountAsset/styles.scss ================================================ @use '../../shared/css/variables' as *; .account-asset { padding: 24px 0px; } .account-asset-title { @include bold; font-size: 20px; } .asset-section-header { display: flex; align-items: center; justify-content: flex-start; margin: 24px 0 20px; gap: 2px; &:first-child { margin-top: 0; } .account-asset-title { margin: 0; } .asset-section-toggle { display: inline-flex; align-items: center; justify-content: center; padding: 6px; border: 0; background: transparent; color: inherit; cursor: pointer; } .asset-section-arrow { display: inline-block; width: 18px; height: 18px; transform-origin: center; transition: transform 180ms ease; } .asset-section-arrow.open { transform: rotate(180deg); } } .account-asset-tabs { display: flex; height: 30px; flex-wrap: wrap; align-items: flex-start; border-radius: 100px; margin-bottom: 15px; background: $black-80; gap: 10px; } .account-asset-tab { padding: 4px 10px; border: 1px solid transparent; border-radius: 100px; background: transparent; color: var(--text); cursor: pointer; font-size: 14px; white-space: nowrap; } .account-asset-tab:hover { border-color: rgb(255 255 255 / 3%); background: rgb(255 255 255 / 2%); } .account-asset-tab.is-active { @include bold; padding: 4px 14px; border: 1px solid $green-50; background: $black-90; color: $black-0; } // Loading spinner for tab buttons @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .loading-spinner { display: inline-block; width: 10px; height: 10px; border: 1px solid rgb(255 255 255 / 30%); border-radius: 50%; border-top-color: #fff; animation: spin 1s ease-in-out infinite; } .account-asset-table { background: transparent; /* Allow horizontal scrolling if the table is wider than its parent */ -webkit-overflow-scrolling: touch; overflow-x: auto; } .account-asset-table-wrapper-fixed .account-asset-table { overflow: auto; /* Vertical scroll when overflowing, keep horizontal if needed */ max-height: 255px; /* Fixed viewport height for the table area */ background: transparent; -webkit-overflow-scrolling: touch; /* Custom scroll bars */ scrollbar-color: rgb(255 255 255 / 20%) transparent; scrollbar-width: thin; /* Firefox */ /* WebKit */ &::-webkit-scrollbar { width: 10px; height: 10px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { border: 2px solid transparent; /* create padding effect */ border-radius: 6px; background: rgb(255 255 255 / 20%); background-clip: padding-box; } &::-webkit-scrollbar-thumb:hover { background: rgb(255 255 255 / 12%); } } .account-asset-table table { width: 100%; min-width: 980px; border-collapse: separate; color: var(--text); } .account-asset-table thead th { @include semibold; /* Make header sticky for scrollable tables */ position: sticky; z-index: 2; top: 0; padding: 10px 12px; backdrop-filter: blur( 100px ); /* As table rows scroll under the header, they appear blurred behind it */ color: $black-50; font-size: 12px; text-align: left; text-transform: uppercase; } .account-asset-table tbody td { padding: 10px 12px; border-bottom: 1px solid $black-80; /* Table row separator */ color: $black-0; font-size: 14px; text-align: left; &.empty-message { padding: 16px; color: $black-40; font-size: 16px; text-align: center; @media (max-width: $tablet-portrait-upper-boundary) { padding: 12px 14px; font-size: 14px; } } } /* Add border-top to the first row to separate header from body */ .account-asset-table tbody tr:first-child td { border-top: 1px solid $black-80; } /* Fee column in orange */ .account-asset-table tbody td.transfer-fee, .account-asset-table tbody td.transfer-fee * { color: $orange-50; } .account-asset-table tbody td.asset-class { text-transform: uppercase; } /* Token icon styling */ .token { display: flex; align-items: center; gap: 8px; .token-icon { width: 20px; height: 20px; } } /* Token link styling */ .account-asset-table tbody td a { text-decoration: none; &:hover { text-decoration: none; } } @media (max-width: $phone-upper-boundary) { .account-asset-tabs { display: grid; height: auto; align-items: stretch; padding: 4px; border-radius: 12px; gap: 4px; grid-template-columns: 1fr 1fr; /* Two columns */ } .account-asset-tab { display: inline-flex; align-items: center; justify-content: center; padding: 6px 10px; border-radius: 100px; background: transparent; font-size: 13px; white-space: nowrap; } /* Allow more height for scrollable tables on small screen */ .account-asset-table-wrapper-fixed .account-asset-table { max-height: 400px; } } @media (max-width: $tablet-portrait-upper-boundary) { .account-asset-title { font-size: 18px; } } ================================================ FILE: src/containers/Accounts/AccountAsset/test/AccountAsset.test.tsx ================================================ import { render, screen, waitFor, cleanup, fireEvent, } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import AccountAsset from '../index' import { queryClient } from '../../../shared/QueryClient' import { getBalances, getAccountLines, getAccountInfo, getAccountNFTs, getAccountMPTs, getAccountObjects, getNFTsIssuedByAccount, } from '../../../../rippled/lib/rippled' import Mock = jest.Mock jest.mock('../../../../rippled/lib/rippled') jest.mock('../../../../rippled/NFTTransactions') jest.mock('../../../../rippled/lib/utils', () => ({ formatTransferFee: jest.fn().mockReturnValue('1.00%'), })) jest.mock('../../../../rippled/lib/logger', () => ({ __esModule: true, default: () => ({ error: jest.fn(), warn: jest.fn(), info: jest.fn(), }), })) global.fetch = jest.fn() as jest.Mock const mockedGetBalances = getBalances as Mock const mockedGetAccountLines = getAccountLines as Mock const mockedGetAccountInfo = getAccountInfo as Mock const mockedGetAccountNFTs = getAccountNFTs as Mock const mockedGetAccountMPTs = getAccountMPTs as Mock const mockedGetAccountObjects = getAccountObjects as Mock const mockedGetNFTsIssuedByAccount = getNFTsIssuedByAccount as Mock const mockedFetch = fetch as Mock // Mock socket client const mockSocket = {} as any // Test wrapper component const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) describe('AccountAsset Component', () => { beforeEach(() => { jest.clearAllMocks() queryClient.clear() cleanup() // Default mock implementations - empty data mockedGetBalances.mockResolvedValue([]) mockedGetAccountLines.mockResolvedValue({ lines: [] }) mockedGetAccountInfo.mockResolvedValue({ account_data: { Account: 'rTest123', Flags: 0 }, }) mockedGetAccountNFTs.mockResolvedValue({ account_nfts: [] }) mockedGetAccountMPTs.mockResolvedValue({ account_objects: [] }) mockedGetAccountObjects.mockResolvedValue({ account_objects: [] }) mockedGetNFTsIssuedByAccount.mockResolvedValue({ nfts: [] }) mockedFetch.mockResolvedValue({ ok: true, json: async () => ({ holders: [] }), } as Response) }) describe('Rendering and Layout', () => { it('renders both Assets Held and Assets Issued sections', async () => { render( , ) expect(screen.getByText('Assets Held')).toBeInTheDocument() expect(screen.getByText('Assets Issued')).toBeInTheDocument() }) it('renders all held asset tabs', async () => { render( , ) // Wait for tabs to render - use getAllByRole since there are multiple tabs with IOU/MPT/NFT await waitFor(() => { const allTabs = screen.getAllByRole('tab') expect(allTabs.length).toBeGreaterThan(0) }) // Check that the held tabs list contains expected tabs const heldTabList = screen.getAllByRole('tablist')[0] expect(heldTabList).toHaveTextContent('IOUs') expect(heldTabList).toHaveTextContent('MPTs') expect(heldTabList).toHaveTextContent('LP Tokens') expect(heldTabList).toHaveTextContent('NFTs') }) it('renders all issued asset tabs', async () => { render( , ) // Wait for tabs to render await waitFor(() => { const allTabs = screen.getAllByRole('tab') expect(allTabs.length).toBeGreaterThan(0) }) // Check that the issued tabs list contains expected tabs const issuedTabList = screen.getAllByRole('tablist')[1] expect(issuedTabList).toHaveTextContent('IOUs') expect(issuedTabList).toHaveTextContent('MPTs') expect(issuedTabList).toHaveTextContent('NFTs') }) }) describe('Tab Navigation', () => { it('switches between held asset tabs', async () => { render( , ) await waitFor(() => { expect(screen.getAllByRole('tablist').length).toBe(2) }) // Find tabs using more specific queries const heldTabList = screen.getAllByRole('tablist')[0] const iouTab = heldTabList.querySelector('[aria-selected="true"]') expect(iouTab).toHaveTextContent('IOUs') // Click MPT tab const mptTab = heldTabList.querySelector('[title*="MPTs"]') as HTMLElement fireEvent.click(mptTab) await waitFor(() => { expect(mptTab).toHaveAttribute('aria-selected', 'true') }) }) it('switches between issued asset tabs', async () => { render( , ) await waitFor(() => { expect(screen.getAllByRole('tablist').length).toBe(2) }) const issuedTabList = screen.getAllByRole('tablist')[1] const iouTab = issuedTabList.querySelector('[aria-selected="true"]') expect(iouTab).toHaveTextContent('IOUs') // Click NFT tab const nftTab = issuedTabList.querySelector( '[title*="NFTs"]', ) as HTMLElement fireEvent.click(nftTab) await waitFor(() => { expect(nftTab).toHaveAttribute('aria-selected', 'true') }) }) }) describe('Section Collapse/Expand', () => { it('collapses and expands held section', async () => { render( , ) // Find the collapse button for held section const toggleButtons = screen.getAllByLabelText(/Toggle assets/i) const heldToggle = toggleButtons[0] expect(heldToggle).toHaveAttribute('aria-expanded', 'true') // Collapse fireEvent.click(heldToggle) await waitFor(() => { expect(heldToggle).toHaveAttribute('aria-expanded', 'false') }) // Expand fireEvent.click(heldToggle) await waitFor(() => { expect(heldToggle).toHaveAttribute('aria-expanded', 'true') }) }) it('collapses and expands issued section', async () => { render( , ) const toggleButtons = screen.getAllByLabelText(/Toggle assets/i) const issuedToggle = toggleButtons[1] expect(issuedToggle).toHaveAttribute('aria-expanded', 'true') // Collapse fireEvent.click(issuedToggle) await waitFor(() => { expect(issuedToggle).toHaveAttribute('aria-expanded', 'false') }) // Expand fireEvent.click(issuedToggle) await waitFor(() => { expect(issuedToggle).toHaveAttribute('aria-expanded', 'true') }) }) }) describe('Loading States', () => { it('shows loading spinner in tabs while data is being fetched', async () => { // Mock delayed responses mockedGetBalances.mockImplementation( () => new Promise((resolve) => setTimeout(() => resolve([]), 100)), ) render( , ) // Check for loading spinner await waitFor(() => { const loadingSpinners = screen.getAllByRole('tab') const hasSpinner = loadingSpinners.some((tab) => tab.querySelector('.loading-spinner'), ) expect(hasSpinner).toBe(true) }) // Wait for loading to complete await waitFor( () => { const tabs = screen.getAllByRole('tab') const hasSpinner = tabs.some((tab) => tab.querySelector('.loading-spinner'), ) expect(hasSpinner).toBe(false) }, { timeout: 3000 }, ) }) }) describe('Asset Counts', () => { // Note: Asset count tests are covered in individual component tests // Here we just verify that counts are displayed in tabs it('displays asset counts in tab labels', async () => { render( , ) await waitFor(() => { const allTabs = screen.getAllByRole('tab') // Each tab should have a count in parentheses allTabs.forEach((tab) => { expect(tab.textContent).toMatch(/\(\d+\)/) }) }) }) }) describe('Component Integration', () => { it('renders all held asset components simultaneously', async () => { const { container } = render( , ) // All components should call their APIs even if not visible await waitFor(() => { expect(mockedGetBalances).toHaveBeenCalled() expect(mockedGetAccountMPTs).toHaveBeenCalled() expect(mockedGetAccountNFTs).toHaveBeenCalled() }) // Verify all 4 held asset table wrappers and asset tables are rendered const allSections = container.querySelectorAll('.account-asset-content') const heldSection = allSections[0] // First section (Held) await waitFor(() => { const heldTables = heldSection.querySelectorAll('.account-asset-table') expect(heldTables.length).toBe(4) }) const heldWrappers = heldSection.querySelectorAll( '.account-asset-table-wrapper', ) expect(heldWrappers.length).toBe(4) }) it('renders all issued asset components simultaneously', async () => { const { container } = render( , ) // All issued components should call their APIs even if not visible await waitFor(() => { expect(mockedGetAccountObjects).toHaveBeenCalled() expect(mockedGetNFTsIssuedByAccount).toHaveBeenCalled() }) // Verify all 3 issued asset table wrappers and asset tables are rendered const allSections = container.querySelectorAll('.account-asset-content') const issuedSection = allSections[1] // Second section (Issued) await waitFor(() => { const issuedTables = issuedSection.querySelectorAll( '.account-asset-table', ) expect(issuedTables.length).toBe(3) }) const issuedWrappers = issuedSection.querySelectorAll( '.account-asset-table-wrapper', ) expect(issuedWrappers.length).toBe(3) }) it('passes accountId to all child components', async () => { const accountId = 'rTestAccount123' render( , ) await waitFor(() => { // getBalances is called by child components with socket as first param expect(mockedGetBalances).toHaveBeenCalled() expect(mockedGetAccountMPTs).toHaveBeenCalled() expect(mockedGetAccountNFTs).toHaveBeenCalled() }) }) it('passes xrpToUSDRate to HeldLPTokens component', async () => { const xrpToUSDRate = 1.25 render( , ) // The component should render with the rate await waitFor(() => { expect(mockedGetBalances).toHaveBeenCalled() }) }) it('passes account data to IssuedIOUs component', async () => { const mockAccount = { Account: 'rTest123', Balance: '1000000', Flags: 0, } render( , ) await waitFor(() => { expect(mockedGetBalances).toHaveBeenCalled() }) }) }) describe('Tab Active States', () => { it('has IOU tab active by default in held section', async () => { render( , ) await waitFor(() => { const heldTabList = screen.getAllByRole('tablist')[0] const activeTab = heldTabList.querySelector('[aria-selected="true"]') expect(activeTab).toHaveTextContent('IOUs') }) }) it('has IOU tab active by default in issued section', async () => { render( , ) await waitFor(() => { expect(screen.getAllByRole('tablist').length).toBe(2) }) const issuedTabList = screen.getAllByRole('tablist')[1] const activeTab = issuedTabList.querySelector('[aria-selected="true"]') expect(activeTab).toHaveTextContent('IOUs') }) }) describe('Accessibility', () => { it('has proper ARIA labels for tab lists', async () => { render( , ) await waitFor(() => { expect(screen.getAllByRole('tablist').length).toBe(2) }) const tabLists = screen.getAllByRole('tablist') expect(tabLists[0]).toHaveAttribute('aria-label', 'Assets Held Tabs') expect(tabLists[1]).toHaveAttribute('aria-label', 'Assets Issued Tabs') }) it('has proper ARIA attributes on tabs', async () => { render( , ) await waitFor(() => { const tabs = screen.getAllByRole('tab') expect(tabs.length).toBeGreaterThan(0) }) const tabs = screen.getAllByRole('tab') tabs.forEach((tab) => { expect(tab).toHaveAttribute('aria-selected') expect(tab).toHaveAttribute('role', 'tab') }) }) it('has proper aria-expanded on toggle buttons', async () => { render( , ) const toggleButtons = screen.getAllByLabelText(/Toggle assets/i) expect(toggleButtons).toHaveLength(2) toggleButtons.forEach((button) => { expect(button).toHaveAttribute('aria-expanded') }) }) }) describe('Number Localization', () => { it('displays counts with proper formatting', async () => { render( , ) // Check that counts appear in a consistent format await waitFor(() => { const allTabs = screen.getAllByRole('tab') // All tabs should show count in format: "Label (N)" allTabs.forEach((tab) => { expect(tab.textContent).toMatch(/^.+\s+\(\d+\)$/) }) }) }) }) }) ================================================ FILE: src/containers/Accounts/AccountAsset/test/FutureDataIcon.test.tsx ================================================ import { render, screen, fireEvent } from '@testing-library/react' import { FutureDataIcon } from '../FutureDataIcon' import { TooltipProvider } from '../../../shared/components/Tooltip' // Mock the SVG import jest.mock('../../../shared/images/clock-icon.svg', () => ({ __esModule: true, default: ({ className }: { className?: string }) => ( ), })) // Mock the useTooltip hook const mockShowTooltip = jest.fn() const mockHideTooltip = jest.fn() jest.mock('../../../shared/components/Tooltip', () => ({ ...jest.requireActual('../../../shared/components/Tooltip'), useTooltip: () => ({ showTooltip: mockShowTooltip, hideTooltip: mockHideTooltip, }), })) // Helper to render component with TooltipProvider const renderWithTooltipProvider = (component: React.ReactElement) => render({component}) describe('FutureDataIcon', () => { beforeEach(() => { jest.clearAllMocks() // Mock getBoundingClientRect Element.prototype.getBoundingClientRect = jest.fn(() => ({ left: 100, top: 200, right: 120, bottom: 220, width: 20, height: 20, x: 100, y: 200, toJSON: () => {}, })) // Mock window.scrollX and window.scrollY Object.defineProperty(window, 'scrollX', { value: 0, writable: true }) Object.defineProperty(window, 'scrollY', { value: 0, writable: true }) }) afterEach(() => { jest.restoreAllMocks() }) describe('Rendering', () => { it('renders the clock icon', () => { renderWithTooltipProvider() expect(screen.getByTestId('clock-icon')).toBeInTheDocument() expect(screen.getByTestId('clock-icon')).toHaveClass('clock-icon') }) it('renders with default message when no message prop provided', () => { renderWithTooltipProvider() const futureDataSpan = screen.getByRole('button') fireEvent.mouseOver(futureDataSpan) expect(mockShowTooltip).toHaveBeenCalledWith( 'text', expect.any(Object), 'This data will be provided in a future release.', expect.objectContaining({ x: 110, // 100 + 10 (TOOLTIP_X_OFFSET) y: 80, // 200 + 0 - 120 (TOOLTIP_Y_OFFSET) }), ) }) it('renders with custom message when message prop provided', () => { const customMessage = 'Custom future data message' renderWithTooltipProvider() const futureDataSpan = screen.getByRole('button') fireEvent.mouseOver(futureDataSpan) expect(mockShowTooltip).toHaveBeenCalledWith( 'text', expect.any(Object), customMessage, expect.any(Object), ) }) }) describe('Mouse Interactions', () => { it('shows tooltip on mouse over', () => { renderWithTooltipProvider() const futureDataSpan = screen.getByRole('button') fireEvent.mouseOver(futureDataSpan) expect(mockShowTooltip).toHaveBeenCalledTimes(1) expect(mockShowTooltip).toHaveBeenCalledWith( 'text', expect.any(Object), 'This data will be provided in a future release.', expect.objectContaining({ x: expect.any(Number), y: expect.any(Number), }), ) }) it('hides tooltip on mouse leave', () => { renderWithTooltipProvider() const futureDataSpan = screen.getByRole('button') fireEvent.mouseLeave(futureDataSpan) expect(mockHideTooltip).toHaveBeenCalledTimes(1) }) it('shows and hides tooltip on mouse over and leave sequence', () => { renderWithTooltipProvider() const futureDataSpan = screen.getByRole('button') fireEvent.mouseOver(futureDataSpan) expect(mockShowTooltip).toHaveBeenCalledTimes(1) fireEvent.mouseLeave(futureDataSpan) expect(mockHideTooltip).toHaveBeenCalledTimes(1) }) }) describe('Tooltip Positioning', () => { it('calculates correct tooltip position with scroll offset', () => { // Set scroll values Object.defineProperty(window, 'scrollX', { value: 50, writable: true }) Object.defineProperty(window, 'scrollY', { value: 100, writable: true }) renderWithTooltipProvider() const futureDataSpan = screen.getByRole('button') fireEvent.mouseOver(futureDataSpan) expect(mockShowTooltip).toHaveBeenCalledWith( 'text', expect.any(Object), 'This data will be provided in a future release.', { x: 160, // 100 (left) + 50 (scrollX) + 10 (TOOLTIP_X_OFFSET) y: 180, // 200 (top) + 100 (scrollY) - 120 (TOOLTIP_Y_OFFSET) }, ) }) it('uses correct offset constants', () => { renderWithTooltipProvider() const futureDataSpan = screen.getByRole('button') fireEvent.mouseOver(futureDataSpan) expect(mockShowTooltip).toHaveBeenCalledWith( 'text', expect.any(Object), expect.any(String), { x: 110, // Confirms TOOLTIP_X_OFFSET = 10 y: 80, // Confirms TOOLTIP_Y_OFFSET = -120 }, ) }) }) describe('Edge Cases', () => { it('handles multiple rapid mouse events', () => { renderWithTooltipProvider() const futureDataSpan = screen.getByRole('button') // Rapid mouse events fireEvent.mouseOver(futureDataSpan) fireEvent.mouseOver(futureDataSpan) fireEvent.mouseLeave(futureDataSpan) fireEvent.mouseOver(futureDataSpan) fireEvent.mouseLeave(futureDataSpan) expect(mockShowTooltip).toHaveBeenCalledTimes(3) expect(mockHideTooltip).toHaveBeenCalledTimes(2) }) it('handles empty message prop', () => { renderWithTooltipProvider() const futureDataSpan = screen.getByRole('button') fireEvent.mouseOver(futureDataSpan) expect(mockShowTooltip).toHaveBeenCalledWith( 'text', expect.any(Object), '', expect.any(Object), ) }) }) }) ================================================ FILE: src/containers/Accounts/AccountAsset/test/HeldIOUs.test.tsx ================================================ import { render, screen, cleanup, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { HeldIOUs } from '../assetTables/HeldIOUs' import { getBalances, getAccountLines, getAccountInfo, } from '../../../../rippled/lib/rippled' import { formatTransferFee } from '../../../../rippled/lib/utils' import { queryClient } from '../../../shared/QueryClient' import Mock = jest.Mock jest.mock('../../../../rippled/lib/rippled') jest.mock('../../../../rippled/lib/utils') jest.mock('../../../../rippled/lib/logger', () => ({ __esModule: true, default: () => ({ error: jest.fn(), warn: jest.fn(), info: jest.fn(), }), })) global.fetch = jest.fn() as jest.Mock const mockedGetBalances = getBalances as Mock const mockedGetAccountLines = getAccountLines as Mock const mockedGetAccountInfo = getAccountInfo as Mock const mockedFormatTransferFee = formatTransferFee as Mock const mockedFetch = fetch as Mock // Mock socket client const mockSocket = {} as any // Test wrapper component const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) const mockBalancesResponse = { assets: { rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH: [ { currency: 'USD', value: '100' }, { currency: 'EUR', value: '50' }, ], rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B: [{ currency: 'BTC', value: '0.001' }], rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w: [ { currency: '03AD8B0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C999999', value: '1000', }, ], }, } const mockAccountLinesResponse = { lines: [ { currency: 'USD', account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', balance: '100.50', freeze: false, freeze_peer: false, }, { currency: 'EUR', account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', balance: '50.25', freeze: false, freeze_peer: false, }, { currency: 'BTC', account: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', balance: '0.001', freeze: true, freeze_peer: false, }, { currency: '03AD8B0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C999999', account: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', balance: '1000', freeze: false, freeze_peer: false, }, ], marker: '', } const mockLOSTokenResponse = { tokens: [ { currency: 'USD', issuer_account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', icon: 'https://example.com/usd-icon.png', issuer_name: 'Gatehub', price_usd: '1.00', asset_class: 'Currency', }, { currency: 'EUR', issuer_account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', icon: 'https://example.com/eur-icon.png', issuer_name: 'Gatehub', price_usd: '1.10', asset_class: 'Currency', }, { currency: 'BTC', issuer_account: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', issuer_name: 'Bitstamp', price_usd: '45000.00', asset_class: 'Cryptocurrency', }, { currency: '03AD8B0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C999999', issuer_account: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', price_usd: '1.00', asset_class: 'RWA', }, ], } const mockAccountInfo = { TransferRate: 1010000000, // 1% transfer fee Flags: 0, AMMID: undefined, } describe('HeldIOUs', () => { afterEach(() => { cleanup() queryClient.clear() // Clear React Query cache between tests }) // Helper function to verify column headers const verifyColumnHeaders = async () => { await waitFor(() => { expect(screen.getByText('Currency Code')).toBeInTheDocument() }) expect(screen.getByText('Issuer')).toBeInTheDocument() expect(screen.getByText('Price (USD)')).toBeInTheDocument() expect(screen.getByText('Balance')).toBeInTheDocument() expect(screen.getByText('Balance (USD)')).toBeInTheDocument() expect(screen.getByText('Asset Class')).toBeInTheDocument() expect(screen.getByText('Transfer Fee')).toBeInTheDocument() expect(screen.getByText('Frozen')).toBeInTheDocument() } it('renders empty state when no IOUs are held', async () => { // Override the default mocks to return truly empty data mockedGetBalances.mockResolvedValueOnce({ assets: {} }) mockedGetAccountLines.mockResolvedValueOnce({ lines: [], marker: '' }) // Also mock the LOS token fetch to return empty tokens mockedFetch.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve({ tokens: [] }), } as Response) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Check that the empty message is displayed (this is the translated text) await waitFor(() => { expect(screen.getByText('No IOUs found')).toBeInTheDocument() }) }) beforeEach(() => { jest.clearAllMocks() process.env.VITE_LOS_URL = 'https://api.los.example.com' mockedFormatTransferFee.mockReturnValue('1.0%') mockedGetBalances.mockResolvedValue(mockBalancesResponse) mockedGetAccountLines.mockResolvedValue(mockAccountLinesResponse) // Set up getAccountInfo mock to handle different account types mockedGetAccountInfo.mockImplementation((_, accountId) => { if (accountId === 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w') { // LP token issuer - make it an AMM account by default make tokens starting with `03` LP tokens return Promise.resolve({ TransferRate: undefined, Flags: 0, AMMID: 'AMMID123456', }) } // Regular accounts return Promise.resolve(mockAccountInfo) }) mockedFetch.mockResolvedValue({ ok: true, json: () => Promise.resolve(mockLOSTokenResponse), } as Response) }) it('shows all tokens including token starting with `03` whose issuer is not an AMM account', async () => { // Override the mock to make `03` token issuer NOT an AMM account // Add a delay to simulate async checking and test progressive reveal mockedGetAccountInfo.mockImplementation((_, accountId): Promise => { if (accountId === 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w') { return new Promise((resolve) => { setTimeout(() => { resolve({ TransferRate: 1020000000, // 2% transfer fee Flags: 0x00400000, // lsfGlobalFreeze AMMID: undefined, // This makes it NOT an AMM account }) }, 100) // 100ms delay to simulate network request }) } // Regular accounts - immediate response return Promise.resolve(mockAccountInfo) }) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Wait for initial tokens to load (non-03 tokens) await waitFor(() => { expect(screen.getByText('USD')).toBeInTheDocument() }) // Get initial table rows (excluding header) let rows = screen.getAllByRole('row') let dataRows = rows.slice(1) // Initially, we should only have 3 tokens (USD, EUR, BTC) // The `03` token should be hidden until confirmed as non-LP expect(dataRows).toHaveLength(3) expect( screen.queryByText( '03AD8B0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C999999', ), ).not.toBeInTheDocument() // Now wait for the `03` token to appear after confirmation await waitFor( () => { expect( screen.getByText( '03AD8B0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C999999', ), ).toBeInTheDocument() }, { timeout: 5000 }, ) // Get all table rows again (should now include the `03` token) rows = screen.getAllByRole('row') dataRows = rows.slice(1) // Skip header row // Verify we have 4 token rows (sorted by Balance USD descending) expect(dataRows).toHaveLength(4) // / Verify `03` non-lp token data in first row (highest balance USD: $1,000.00) const nonLPTokenRow = dataRows[0] expect(nonLPTokenRow).toHaveTextContent( '03AD8B0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C999999', ) expect(nonLPTokenRow).toHaveTextContent('rLNaPoK...4dc6w') expect(nonLPTokenRow).toHaveTextContent('$1.00') expect(nonLPTokenRow).toHaveTextContent('1,000') expect(nonLPTokenRow).toHaveTextContent('$1,000.00') expect(nonLPTokenRow).toHaveTextContent('RWA') // Initial state shows -- for both transfer fee and frozen (no trustline freeze) const nonLPTokenPlaceholders = nonLPTokenRow.textContent?.match(/--/g) || [] expect(nonLPTokenPlaceholders.length).toBe(2) // Verify USD token data in second row (highest balance USD: $100.50) const usdRow = dataRows[1] expect(usdRow).toHaveTextContent('USD') expect(usdRow).toHaveTextContent('Gatehub') expect(usdRow).toHaveTextContent('$1.00') expect(usdRow).toHaveTextContent('100.5') expect(usdRow).toHaveTextContent('$100.50') // Initial state shows -- for both transfer fee and frozen (no trustline freeze) const usdPlaceholders = usdRow.textContent?.match(/--/g) || [] expect(usdPlaceholders.length).toBe(2) // Verify EUR token data in third row (second highest: $55.28) const eurRow = dataRows[2] expect(eurRow).toHaveTextContent('EUR') expect(eurRow).toHaveTextContent('Gatehub') expect(eurRow).toHaveTextContent('$1.10') expect(eurRow).toHaveTextContent('50.25') expect(eurRow).toHaveTextContent('$55.28') expect(eurRow).toHaveTextContent('Currency') // Initial state shows -- for both transfer fee and frozen (no trustline freeze) const eurPlaceholders = eurRow.textContent?.match(/--/g) || [] expect(eurPlaceholders.length).toBe(2) // Verify BTC token data in fourth row (third highest: $45.00) const btcRow = dataRows[3] expect(btcRow).toHaveTextContent('BTC') expect(btcRow).toHaveTextContent('Bitstamp') expect(btcRow).toHaveTextContent('$45,000.00') expect(btcRow).toHaveTextContent('0.001') expect(btcRow).toHaveTextContent('$45.00') expect(btcRow).toHaveTextContent('Cryptocurrency') // BTC has trustline freeze in the account lines expect(btcRow).toHaveTextContent('Trustline') // Only 1 placeholder for transfer fee (frozen shows Trustline, not --) const btcPlaceholders = btcRow.textContent?.match(/--/g) || [] expect(btcPlaceholders.length).toBe(1) }) it('excludes LP tokens whose issuer is an AMM account', async () => { // Use the default mock setup where LP token issuer IS an AMM account (from beforeEach) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Wait for tokens to load await waitFor(() => { expect(screen.getByText('USD')).toBeInTheDocument() }) // Get all table rows (excluding header) const rows = screen.getAllByRole('row') const dataRows = rows.slice(1) // Skip header row // Verify we have 3 token rows (LP token excluded) expect(dataRows).toHaveLength(3) // Verify USD token data in first row (highest balance USD: $100.50) const usdRow = dataRows[0] expect(usdRow).toHaveTextContent('USD') expect(usdRow).toHaveTextContent('Gatehub') expect(usdRow).toHaveTextContent('$1.00') expect(usdRow).toHaveTextContent('100.5') expect(usdRow).toHaveTextContent('$100.50') expect(usdRow).toHaveTextContent('Currency') const usdPlaceholders = usdRow.textContent?.match(/--/g) || [] expect(usdPlaceholders.length).toBe(2) // Verify EUR token data in second row (second highest: $55.28) const eurRow = dataRows[1] expect(eurRow).toHaveTextContent('EUR') expect(eurRow).toHaveTextContent('Gatehub') expect(eurRow).toHaveTextContent('$1.10') expect(eurRow).toHaveTextContent('50.25') expect(eurRow).toHaveTextContent('$55.28') expect(eurRow).toHaveTextContent('Currency') const eurPlaceholders = eurRow.textContent?.match(/--/g) || [] expect(eurPlaceholders.length).toBe(2) // Verify BTC token data in third row (third highest: $45.00) const btcRow = dataRows[2] expect(btcRow).toHaveTextContent('BTC') expect(btcRow).toHaveTextContent('Bitstamp') expect(btcRow).toHaveTextContent('$45,000.00') expect(btcRow).toHaveTextContent('0.001') expect(btcRow).toHaveTextContent('$45.00') expect(btcRow).toHaveTextContent('Cryptocurrency') expect(btcRow).toHaveTextContent('Trustline') const btcPlaceholders = btcRow.textContent?.match(/--/g) || [] expect(btcPlaceholders.length).toBe(1) // Verify LP token is NOT displayed expect( screen.queryByText( '03AD8B0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C999999', ), ).not.toBeInTheDocument() expect(screen.queryByText('rLNaPoK...4dc6w')).not.toBeInTheDocument() expect(screen.queryByText('1,000')).not.toBeInTheDocument() }) }) ================================================ FILE: src/containers/Accounts/AccountAsset/test/HeldLPTokens.test.tsx ================================================ import { render, screen, cleanup, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { HeldLPTokens } from '../assetTables/HeldLPTokens' import { getBalances, getAMMInfoByAMMAccount, } from '../../../../rippled/lib/rippled' import { queryClient } from '../../../shared/QueryClient' import Mock = jest.Mock jest.mock('../../../../rippled/lib/rippled') jest.mock('../../../../rippled/lib/logger', () => ({ __esModule: true, default: () => ({ error: jest.fn(), warn: jest.fn(), info: jest.fn(), }), })) const mockedGetBalances = getBalances as Mock const mockedGetAMMInfoByAMMAccount = getAMMInfoByAMMAccount as Mock // Mock socket client const mockSocket = {} as any // Test wrapper component const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) // Mock data for LP token balances (with LP token identifier prefix '03') const mockBalancesResponseWithLPTokens = { assets: { rp9E3FN9YAJjc7xrr8eTTYVpBheop35uoxu8vM: [ { currency: '03AD8B0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C999999', value: '1000.5', }, ], rDMNE7xaqxZ6YqPMJJV6sJ7Bw5UjT3nT6vd4XW: [ { currency: '03BD9C0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C888888', value: '500.25', }, ], }, } // Mock empty balances response const mockEmptyBalancesResponse = { assets: {}, } // Mock AMM info responses const mockAMMInfoXRP = { amm: { amount: '50000000000', // 50,000 XRP (in drops) amount2: { currency: 'USD', issuer: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', value: '50000', }, lp_token: { currency: '03AD8B0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C999999', issuer: 'rp9E3FN9YAJjc7xrr8eTTYVpBheop35uoxu8vM', value: '10000', }, }, } const mockAMMInfoTokens = { amm: { amount: { currency: 'USD', issuer: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', value: '25000', }, amount2: { currency: 'EUR', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', value: '22727.27', }, lp_token: { currency: '03BD9C0558D3C1FC1E7B1C0A0DB0C88D904D500FFE68DE154997F9CC9C888888', issuer: 'rDMNE7xaqxZ6YqPMJJV6sJ7Bw5UjT3nT6vd4XW', value: '5000', }, }, } describe('HeldLPTokens', () => { const mockXRPToUSDRate = 0.5 // 1 XRP = $0.50 // Helper function to verify column headers const verifyColumnHeaders = async () => { await waitFor(() => { expect(screen.getByText('AMM Instance')).toBeInTheDocument() }) expect(screen.getByText('AMM Pair')).toBeInTheDocument() expect(screen.getByText('Balance')).toBeInTheDocument() expect(screen.getByText('Balance (USD)')).toBeInTheDocument() expect(screen.getByText('Share (%)')).toBeInTheDocument() } afterEach(() => { cleanup() queryClient.clear() // Clear React Query cache between tests }) beforeEach(() => { jest.clearAllMocks() mockedGetBalances.mockResolvedValue(mockBalancesResponseWithLPTokens) // Set up getAMMInfoByAMMAccount mock to handle different AMM accounts mockedGetAMMInfoByAMMAccount.mockImplementation((_, ammAccount) => { if (ammAccount === 'rp9E3FN9YAJjc7xrr8eTTYVpBheop35uoxu8vM') { return Promise.resolve(mockAMMInfoXRP) } if (ammAccount === 'rDMNE7xaqxZ6YqPMJJV6sJ7Bw5UjT3nT6vd4XW') { return Promise.resolve(mockAMMInfoTokens) } return Promise.reject(new Error('AMM not found')) }) }) it('renders empty state when no LP tokens are held', async () => { // Override the default mock to return empty assets mockedGetBalances.mockResolvedValueOnce(mockEmptyBalancesResponse) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Check that the empty message is displayed (this is the translated text) await waitFor(() => { expect(screen.getByText('No LP Tokens found')).toBeInTheDocument() }) }) it('handles error when getBalances fails', async () => { // Mock getBalances to throw an error mockedGetBalances.mockRejectedValueOnce(new Error('Network error')) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Should show empty state when error occurs await waitFor(() => { expect(screen.getByText('No LP Tokens found')).toBeInTheDocument() }) }) it('shows two LP tokens with XRP pair and token pair', async () => { render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Wait for LP tokens to load await waitFor(() => { expect(screen.getByText('rp9E3FN...xu8vM')).toBeInTheDocument() }) // Get all table rows (excluding header) const rows = screen.getAllByRole('row') const dataRows = rows.slice(1) // Skip header row // Verify we have 2 LP token rows (XRP pair first, then token pair) expect(dataRows).toHaveLength(2) // Verify first LP token (XRP/USD pair) const xrpUsdRow = dataRows[0] expect(xrpUsdRow).toHaveTextContent('rp9E3FN...xu8vM') // AMM instance expect(xrpUsdRow.textContent).toMatch(/XRP\/USD/) // AMM pair expect(xrpUsdRow).toHaveTextContent('1,000.5') // Balance expect(xrpUsdRow).toHaveTextContent('$5,002.50') // Balance USD expect(xrpUsdRow.textContent).toMatch(/10\.01/) // Share % // Verify second LP token (USD/EUR pair) const usdEurRow = dataRows[1] expect(usdEurRow).toHaveTextContent('rDMNE7x...vd4XW') // AMM instance expect(usdEurRow.textContent).toMatch(/USD\/EUR/) // AMM pair expect(usdEurRow).toHaveTextContent('500.25') // Balance expect(usdEurRow).toHaveTextContent('--') // Balance USD (no XRP in pair) expect(usdEurRow.textContent).toMatch(/10\.01/) // Share % }) }) ================================================ FILE: src/containers/Accounts/AccountAsset/test/HeldMPTs.test.tsx ================================================ import { render, screen, cleanup, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { HeldMPTs } from '../assetTables/HeldMPTs' import { getAccountMPTs, getMPTIssuance } from '../../../../rippled/lib/rippled' import { queryClient } from '../../../shared/QueryClient' import Mock = jest.Mock jest.mock('../../../../rippled/lib/rippled') jest.mock('../../../../rippled/lib/logger', () => ({ __esModule: true, default: () => ({ error: jest.fn(), warn: jest.fn(), info: jest.fn(), }), })) const mockedGetAccountMPTs = getAccountMPTs as Mock const mockedGetMPTIssuance = getMPTIssuance as Mock // Mock socket client const mockSocket = {} as any // Test wrapper component const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) const mockMPTsResponse = { account_objects: [ { MPTokenIssuanceID: '000004C463C52827307480341125DA65C267105D00000001', MPTAmount: '1000000', Flags: 1, // lsfMPTLocked }, { MPTokenIssuanceID: '000004C463C52827307480341125DA65C267105D00000002', MPTAmount: '500000', Flags: 0, }, { MPTokenIssuanceID: '000004C463C52827307480341125DA65C267105D00000003', MPTAmount: '250000', Flags: 0, }, ], marker: '', } const mockMPTIssuanceResponses = { '000004C463C52827307480341125DA65C267105D00000001': { node: { Issuer: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', TransferFee: 5000, Flags: 0, AssetScale: 2, // Hex-encoded JSON: {"ticker":"USD","issuer_name":"Gatehub","asset_class":"other","name":"USD Token","icon":"https://example.com/usd.png"} MPTokenMetadata: '7B227469636B6572223A22555344222C22697373756572' + '5F6E616D65223A22476174656875622' + '22C2261737365745F636C617373223A226F74686572222C226E616D65223A22555344' + '20546F6B656E222C2269636F6E223A2268747470733A2F2F6578616D706C652E636F6D2F7573642E706E67227D', }, }, '000004C463C52827307480341125DA65C267105D00000002': { node: { Issuer: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', TransferFee: 10000, Flags: 1, // lsfMPTLocked (Global) AssetScale: 0, // Hex-encoded JSON: {"ticker":"EUR","issuer_name":"Bitstamp","asset_class":"other","name":"EUR Token","icon":"https://example.com/eur.png"} MPTokenMetadata: '7B227469636B6572223A22455552222C22697373756572' + '5F6E616D65223A2242697473' + '74616D70222C2261737365745F636C617373223A226F74686572222C226E616D65223A22455552' + '20546F6B656E222C2269636F6E223A2268747470733A2F2F6578616D706C652E636F6D2F6575722E706E67227D', }, }, '000004C463C52827307480341125DA65C267105D00000003': { node: { Issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', TransferFee: 15000, Flags: 0, AssetScale: 0, // Hex-encoded JSON: {"ticker":"BTC","issuer_name":"Kraken","asset_class":"other","name":"BTC Token","icon":"https://example.com/btc.png"} MPTokenMetadata: '7B227469636B6572223A22425443222C22697373756572' + '5F6E616D65223A224B72616B' + '656E222C2261737365745F636C617373223A226F74686572222C226E616D65223A22425443' + '20546F6B656E222C2269636F6E223A2268747470733A2F2F6578616D706C652E636F6D2F6274632E706E67227D', }, }, } describe('HeldMPTs', () => { // Helper function to verify all column headers are displayed const verifyColumnHeaders = async () => { await waitFor(() => { expect(screen.getByText('Token ID')).toBeInTheDocument() }) expect(screen.getByText('Ticker')).toBeInTheDocument() expect(screen.getByText('Issuer')).toBeInTheDocument() expect(screen.getByText('Price (USD)')).toBeInTheDocument() expect(screen.getByText('Balance')).toBeInTheDocument() expect(screen.getByText('Balance (USD)')).toBeInTheDocument() expect(screen.getByText('Asset Class')).toBeInTheDocument() expect(screen.getByText('Transfer Fee')).toBeInTheDocument() expect(screen.getByText('Locked')).toBeInTheDocument() } afterEach(() => { cleanup() queryClient.clear() }) beforeEach(() => { jest.clearAllMocks() mockedGetAccountMPTs.mockResolvedValue(mockMPTsResponse) mockedGetMPTIssuance.mockImplementation((_, mptIssuanceId) => { const response = mockMPTIssuanceResponses[ mptIssuanceId as keyof typeof mockMPTIssuanceResponses ] return Promise.resolve(response) }) }) it('renders empty state when no MPTs are held', async () => { mockedGetAccountMPTs.mockResolvedValueOnce({ account_objects: [] }) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Check that the empty message is displayed await waitFor(() => { expect(screen.getByText('No MPTs found')).toBeInTheDocument() }) }) it('handles error when getAccountMPTs fails', async () => { mockedGetAccountMPTs.mockRejectedValueOnce(new Error('Network error')) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Should show empty state when error occurs await waitFor(() => { expect(screen.getByText('No MPTs found')).toBeInTheDocument() }) }) it('shows 3 held MPTs with all column values', async () => { render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Wait for MPTs to load await waitFor(() => { expect(screen.getByText('000004C463...5D00000001')).toBeInTheDocument() }) // Get all table rows (excluding header) const rows = screen.getAllByRole('row') const dataRows = rows.slice(1) // Skip header row // Verify we have 3 MPT rows expect(dataRows).toHaveLength(3) // Verify USD MPT data in first row const usdRow = dataRows[0] expect(usdRow).toHaveTextContent('000004C463...5D00000001') expect(usdRow).toHaveTextContent('USD') // ticker expect(usdRow).toHaveTextContent('Gatehub') // issuer name // Note: The MPT balance is scaled by the appropriate (10 ^ -asset_scale) multiplicative factor. expect(usdRow).toHaveTextContent('10.0K') // balance (formatted with parseAmount) expect(usdRow).toHaveTextContent('OTHER') // asset class (uppercase) expect(usdRow).toHaveTextContent('5%') // transfer fee expect(usdRow).toHaveTextContent('Individual') // locked status // Verify EUR MPT data in second row const eurRow = dataRows[1] expect(eurRow).toHaveTextContent('000004C463...5D00000002') expect(eurRow).toHaveTextContent('EUR') // ticker expect(eurRow).toHaveTextContent('Bitstamp') // issuer name expect(eurRow).toHaveTextContent('500.0K') // balance (formatted with parseAmount) expect(eurRow).toHaveTextContent('OTHER') // asset class (uppercase) expect(eurRow).toHaveTextContent('10%') // transfer fee expect(eurRow).toHaveTextContent('Global') // locked status // Verify BTC MPT data in third row const btcRow = dataRows[2] expect(btcRow).toHaveTextContent('000004C463...5D00000003') expect(btcRow).toHaveTextContent('BTC') // ticker expect(btcRow).toHaveTextContent('Kraken') // issuer name expect(btcRow).toHaveTextContent('250.0K') // balance (formatted with parseAmount) expect(btcRow).toHaveTextContent('OTHER') // asset class (uppercase) expect(btcRow).toHaveTextContent('15%') // transfer fee expect(btcRow).toHaveTextContent('--') // not locked // Verify FutureDataIcon appears for Price (USD) and Balance (USD) columns only // Each MPT has 2 FutureDataIcons (price USD, balance USD) = 3 MPTs * 2 icons = 6 total const futureDataIcons = document.querySelectorAll('.future-data') expect(futureDataIcons).toHaveLength(6) }) }) ================================================ FILE: src/containers/Accounts/AccountAsset/test/HeldNFTs.test.tsx ================================================ import { render, screen, cleanup, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { HeldNFTs } from '../assetTables/HeldNFTs' import { getAccountNFTs, getBuyNFToffers, getSellNFToffers, } from '../../../../rippled/lib/rippled' import { queryClient } from '../../../shared/QueryClient' import Mock = jest.Mock jest.mock('../../../../rippled/lib/rippled') jest.mock('../../../../rippled/lib/logger', () => ({ __esModule: true, default: () => ({ error: jest.fn(), warn: jest.fn(), info: jest.fn(), }), })) const mockedGetAccountNFTs = getAccountNFTs as Mock const mockedGetBuyNFToffers = getBuyNFToffers as Mock const mockedGetSellNFToffers = getSellNFToffers as Mock // Mock socket client const mockSocket = {} as any // Test wrapper component const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) // Mock NFT data const mockNFTsResponse = { account_nfts: [ { NFTokenID: '00081388F2C3F5B05AD6C8C0F5C0F5C0F5C0F5C0F5C0F5C0F5C0F5C000000001', Issuer: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', URI: Buffer.from('https://example.com/nft1').toString('hex'), TransferFee: 5000, // 5% }, { NFTokenID: '00081388F2C3F5B05AD6C8C0F5C0F5C0F5C0F5C0F5C0F5C0F5C0F5C000000002', Issuer: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', URI: Buffer.from('https://example.com/nft2').toString('hex'), TransferFee: 10000, // 10% }, { NFTokenID: '00081388F2C3F5B05AD6C8C0F5C0F5C0F5C0F5C0F5C0F5C0F5C0F5C000000003', Issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', URI: '', // No URI TransferFee: 15000, // 15% }, ], marker: '', } // Mock offer data (XRP only - in drops, 1 XRP = 1,000,000 drops) const mockSellOffersNFT1 = { offers: [ { amount: '5000000' }, // 5 XRP { amount: '6000000' }, // 6 XRP ], } const mockBuyOffersNFT1 = { offers: [ { amount: '4500000' }, // 4.5 XRP { amount: '4000000' }, // 4 XRP ], } const mockSellOffersNFT2 = { offers: [ { amount: '10000000' }, // 10 XRP ], } const mockBuyOffersNFT2 = { offers: [ { amount: '9500000' }, // 9.5 XRP ], } // NFT3 has no offers const mockNoOffers = { offers: [], } describe('HeldNFTs', () => { // Helper function to verify all column headers are displayed const verifyColumnHeaders = async () => { await waitFor(() => { expect(screen.getByText('Token ID')).toBeInTheDocument() }) expect(screen.getByText('Issuer')).toBeInTheDocument() expect(screen.getByText('URL')).toBeInTheDocument() expect(screen.getByText('Transfer Fee')).toBeInTheDocument() expect(screen.getByText('Lowest Ask')).toBeInTheDocument() expect(screen.getByText('Highest Bid')).toBeInTheDocument() } afterEach(() => { cleanup() queryClient.clear() }) beforeEach(() => { jest.clearAllMocks() mockedGetAccountNFTs.mockResolvedValue(mockNFTsResponse) mockedGetBuyNFToffers.mockImplementation( (_rippledSocket: any, nftId: string) => { if (nftId === mockNFTsResponse.account_nfts[0].NFTokenID) { return Promise.resolve(mockBuyOffersNFT1) } if (nftId === mockNFTsResponse.account_nfts[1].NFTokenID) { return Promise.resolve(mockBuyOffersNFT2) } return Promise.resolve(mockNoOffers) }, ) mockedGetSellNFToffers.mockImplementation( (_rippledSocket: any, nftId: string) => { if (nftId === mockNFTsResponse.account_nfts[0].NFTokenID) { return Promise.resolve(mockSellOffersNFT1) } if (nftId === mockNFTsResponse.account_nfts[1].NFTokenID) { return Promise.resolve(mockSellOffersNFT2) } return Promise.resolve(mockNoOffers) }, ) }) it('renders empty state when no NFTs are held', async () => { mockedGetAccountNFTs.mockResolvedValueOnce({ account_nfts: [] }) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Check that the empty message is displayed await waitFor(() => { expect(screen.getByText('No NFTs found')).toBeInTheDocument() }) }) it('handles error when getAccountNFTs fails', async () => { mockedGetAccountNFTs.mockRejectedValueOnce(new Error('Network error')) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Should show empty state when error occurs await waitFor(() => { expect(screen.getByText('No NFTs found')).toBeInTheDocument() }) }) it('shows 3 held NFTs with all column values', async () => { render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Wait for NFTs to load await waitFor(() => { expect(screen.getByText('00081388F2...C000000001')).toBeInTheDocument() }) // Get all table rows (excluding header) const rows = screen.getAllByRole('row') const dataRows = rows.slice(1) // Skip header row // Verify we have 3 NFT rows expect(dataRows).toHaveLength(3) // Verify NFT1 data in first row const nft1Row = dataRows[0] expect(nft1Row).toHaveTextContent('00081388F2...C000000001') expect(nft1Row).toHaveTextContent('rN7n7ot...6fzRH') expect(nft1Row).toHaveTextContent('https://example.com/nft1') expect(nft1Row).toHaveTextContent('5%') // Verify NFT2 data in second row const nft2Row = dataRows[1] expect(nft2Row).toHaveTextContent('00081388F2...C000000002') expect(nft2Row).toHaveTextContent('rLNaPoK...4dc6w') expect(nft2Row).toHaveTextContent('https://example.com/nft2') expect(nft2Row).toHaveTextContent('10%') // Verify NFT3 data in third row const nft3Row = dataRows[2] expect(nft3Row).toHaveTextContent('00081388F2...C000000003') expect(nft3Row).toHaveTextContent('rvYAfWj...bs59B') expect(nft3Row).toHaveTextContent('15%') // Verify offer data (async loaded) // XRP symbol is \uE900, offers are formatted with localizeNumber with currency: 'XRP' await waitFor(() => { expect(nft1Row.textContent).toContain('\uE9005.00') // Lowest Ask for NFT1 }) expect(nft1Row.textContent).toContain('\uE9004.50') // Highest Bid for NFT1 // NFT2 offers expect(nft2Row.textContent).toContain('\uE90010.00') // Lowest Ask for NFT2 expect(nft2Row.textContent).toContain('\uE9009.50') // Highest Bid for NFT2 // NFT3: No offers, should show -- const nft3Placeholders = nft3Row.textContent?.match(/--/g) || [] expect(nft3Placeholders.length).toBeGreaterThanOrEqual(2) // At least 2: Lowest Ask and Highest Bid (no URL is also --) }) }) ================================================ FILE: src/containers/Accounts/AccountAsset/test/IssuedIOUs.test.tsx ================================================ import { render, screen, cleanup, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { IssuedIOUs } from '../assetTables/IssuedIOUs' import { getBalances } from '../../../../rippled/lib/rippled' import { queryClient } from '../../../shared/QueryClient' import Mock = jest.Mock jest.mock('../../../../rippled/lib/rippled') jest.mock('../../../../rippled/lib/logger', () => ({ __esModule: true, default: () => ({ error: jest.fn(), warn: jest.fn(), info: jest.fn(), }), })) global.fetch = jest.fn() as jest.Mock const mockedGetBalances = getBalances as Mock const mockedFetch = fetch as Mock // Mock socket client const mockSocket = {} as any // Test wrapper component const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) // Mock data for issued tokens (obligations) const mockBalancesResponse = { obligations: { USD: '1000000.50', EUR: '500000.25', BTC: '50.001', }, } // Mock LOS Token API response for issued tokens const mockLOSTokenResponse = { tokens: [ { currency: 'USD', issuer_account: 'rTest123', icon: 'https://example.com/usd-icon.png', price_usd: '1.00', number_of_trustlines: 15000, number_of_holders: 12500, supply: '1000000.50', // Missing asset_class to test placeholder }, { currency: 'EUR', issuer_account: 'rTest123', icon: 'https://example.com/eur-icon.png', price_usd: '1.10', number_of_trustlines: 8500, number_of_holders: 7200, supply: '500000.25', asset_class: 'Currency', }, { currency: 'BTC', issuer_account: 'rTest123', price_usd: '45000.00', number_of_trustlines: 2500, number_of_holders: 2100, supply: '50.001', asset_class: 'Cryptocurrency', }, ], } // Mock account with transfer fee and global freeze const mockAccount = { info: { rate: 1.5, // 1.5% transfer fee flags: ['lsfGlobalFreeze'], }, } describe('IssuedIOUs', () => { // Helper function to verify all column headers are displayed const verifyColumnHeaders = async () => { await waitFor(() => { expect(screen.getByText('Currency Code')).toBeInTheDocument() }) expect(screen.getByText('Price (USD)')).toBeInTheDocument() expect(screen.getByText('Trustlines')).toBeInTheDocument() expect(screen.getByText('Holders')).toBeInTheDocument() expect(screen.getByText('Supply')).toBeInTheDocument() expect(screen.getByText('Asset Class')).toBeInTheDocument() expect(screen.getByText('Transfer Fee')).toBeInTheDocument() expect(screen.getByText('Frozen')).toBeInTheDocument() } afterEach(() => { cleanup() queryClient.clear() // Clear React Query cache between tests }) beforeEach(() => { jest.clearAllMocks() process.env.VITE_LOS_URL = 'https://api.los.example.com' mockedGetBalances.mockResolvedValue(mockBalancesResponse) mockedFetch.mockResolvedValue({ ok: true, json: () => Promise.resolve(mockLOSTokenResponse), } as Response) }) it('handles error when getBalances fails', async () => { // Mock getBalances to throw an error mockedGetBalances.mockRejectedValueOnce(new Error('Network error')) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Should show empty state when error occurs await waitFor(() => { expect(screen.getByText('No IOUs found')).toBeInTheDocument() }) }) it('renders empty state when no IOUs are issued', async () => { // Override the default mocks to return empty obligations mockedGetBalances.mockResolvedValueOnce({ obligations: {} }) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Check that the empty message is displayed (this is the translated text) await waitFor(() => { expect(screen.getByText('No IOUs found')).toBeInTheDocument() }) }) it('shows 3 issued tokens with all column values', async () => { render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Wait for tokens to load await waitFor(() => { expect(screen.getByText('BTC')).toBeInTheDocument() }) // Get all table rows (excluding header) const rows = screen.getAllByRole('row') const dataRows = rows.slice(1) // Skip header row // Verify we have 3 token rows (sorted by Price USD descending) expect(dataRows).toHaveLength(3) // Verify BTC token data in first row (highest price: $45,000.00) const btcRow = dataRows[0] expect(btcRow).toHaveTextContent('BTC') expect(btcRow).toHaveTextContent('$45,000.00') // price expect(btcRow).toHaveTextContent('2,500') // trustlines expect(btcRow).toHaveTextContent('2,100') // holders expect(btcRow).toHaveTextContent('50.001') // supply expect(btcRow).toHaveTextContent('Cryptocurrency') // asset class expect(btcRow).toHaveTextContent('1.5%') // transfer fee expect(btcRow).toHaveTextContent('Global') // frozen // Verify EUR token data in second row (second highest: $1.10) const eurRow = dataRows[1] expect(eurRow).toHaveTextContent('EUR') expect(eurRow).toHaveTextContent('$1.10') // price expect(eurRow).toHaveTextContent('8,500') // trustlines expect(eurRow).toHaveTextContent('7,200') // holders expect(eurRow).toHaveTextContent('500,000.25') // supply expect(eurRow).toHaveTextContent('Currency') // asset class expect(eurRow).toHaveTextContent('1.5%') // transfer fee expect(eurRow).toHaveTextContent('Global') // frozen // Verify USD token data in third row (lowest price: $1.00) const usdRow = dataRows[2] expect(usdRow).toHaveTextContent('USD') expect(usdRow).toHaveTextContent('$1.00') // price expect(usdRow).toHaveTextContent('15,000') // trustlines expect(usdRow).toHaveTextContent('12,500') // holders expect(usdRow).toHaveTextContent('1,000,000.5') // supply expect(usdRow).toHaveTextContent('--') // asset class expect(usdRow).toHaveTextContent('1.5%') // transfer fee expect(usdRow).toHaveTextContent('Global') // frozen }) }) ================================================ FILE: src/containers/Accounts/AccountAsset/test/IssuedMPTs.test.tsx ================================================ import { render, screen, cleanup, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { IssuedMPTs } from '../assetTables/IssuedMPTs' import { getAccountObjects } from '../../../../rippled/lib/rippled' import { queryClient } from '../../../shared/QueryClient' import Mock = jest.Mock jest.mock('../../../../rippled/lib/rippled') jest.mock('../../../../rippled/lib/logger', () => ({ __esModule: true, default: () => ({ error: jest.fn(), warn: jest.fn(), info: jest.fn(), }), })) const mockedGetAccountObjects = getAccountObjects as Mock // Mock socket client const mockSocket = {} as any // Test wrapper component const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) const mockMPTIssuancesResponse = { account_objects: [ { mpt_issuance_id: '000004C463C52827307480341125DA65C267105D00000001', OutstandingAmount: '1000000', TransferFee: 5000, Flags: 0, AssetScale: 2, // Hex-encoded JSON: {"ticker":"USD","issuer_name":"Gatehub","asset_class":"other","name":"USD Token","icon":"https://example.com/usd.png"} MPTokenMetadata: '7B227469636B6572223A22555344222C22697373756572' + '5F6E616D65223A22476174656875622' + '22C2261737365745F636C617373223A226F74686572222C226E616D65223A22555344' + '20546F6B656E222C2269636F6E223A2268747470733A2F2F6578616D706C652E636F6D2F7573642E706E67227D', }, { mpt_issuance_id: '000004C463C52827307480341125DA65C267105D00000002', OutstandingAmount: '500000', TransferFee: 10000, Flags: 1, // lsfMPTLocked AssetScale: 0, // Hex-encoded JSON: {"ticker":"EUR","issuer_name":"Bitstamp","asset_class":"other","name":"EUR Token","icon":"https://example.com/eur.png"} MPTokenMetadata: '7B227469636B6572223A22455552222C22697373756572' + '5F6E616D65223A2242697473' + '74616D70222C2261737365745F636C617373223A226F74686572222C226E616D65223A22455552' + '20546F6B656E222C2269636F6E223A2268747470733A2F2F6578616D706C652E636F6D2F6575722E706E67227D', }, { mpt_issuance_id: '000004C463C52827307480341125DA65C267105D00000003', OutstandingAmount: '250000', TransferFee: 15000, Flags: 0, AssetScale: 0, // Hex-encoded JSON: {"ticker":"BTC","issuer_name":"Kraken","asset_class":"other","name":"BTC Token","icon":"https://example.com/btc.png"} MPTokenMetadata: '7B227469636B6572223A22425443222C22697373756572' + '5F6E616D65223A224B72616B' + '656E222C2261737365745F636C617373223A226F74686572222C226E616D65223A22425443' + '20546F6B656E222C2269636F6E223A2268747470733A2F2F6578616D706C652E636F6D2F6274632E706E67227D', }, ], marker: '', } describe('IssuedMPTs', () => { // Helper function to verify all column headers are displayed const verifyColumnHeaders = async () => { await waitFor(() => { expect(screen.getByText('Token ID')).toBeInTheDocument() }) expect(screen.getByText('Ticker')).toBeInTheDocument() expect(screen.getByText('Price (USD)')).toBeInTheDocument() expect(screen.getByText('Circ Supply')).toBeInTheDocument() expect(screen.getByText('Asset Class')).toBeInTheDocument() expect(screen.getByText('Transfer Fee')).toBeInTheDocument() expect(screen.getByText('Locked')).toBeInTheDocument() } afterEach(() => { cleanup() queryClient.clear() }) beforeEach(() => { jest.clearAllMocks() mockedGetAccountObjects.mockResolvedValue(mockMPTIssuancesResponse) }) it('renders empty state when no MPTs are issued', async () => { mockedGetAccountObjects.mockResolvedValueOnce({ account_objects: [] }) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Check that the empty message is displayed await waitFor(() => { expect(screen.getByText('No MPTs found')).toBeInTheDocument() }) }) it('handles error when getAccountObjects fails', async () => { mockedGetAccountObjects.mockRejectedValueOnce(new Error('Network error')) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Should show empty state when error occurs await waitFor(() => { expect(screen.getByText('No MPTs found')).toBeInTheDocument() }) }) it('shows 3 issued MPTs with all column values', async () => { render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Wait for MPTs to load await waitFor(() => { expect(screen.getByText('000004C463...5D00000001')).toBeInTheDocument() }) // Get all table rows (excluding header) const rows = screen.getAllByRole('row') const dataRows = rows.slice(1) // Skip header row // Verify we have 3 MPT rows expect(dataRows).toHaveLength(3) // Verify USD MPT data in first row const usdRow = dataRows[0] expect(usdRow).toHaveTextContent('000004C463...5D00000001') expect(usdRow).toHaveTextContent('USD') // ticker expect(usdRow).toHaveTextContent('10.0K') // supply (formatted with parseAmount) expect(usdRow).toHaveTextContent('OTHER') // asset class (uppercase) expect(usdRow).toHaveTextContent('5%') // transfer fee expect(usdRow).toHaveTextContent('--') // not locked // Verify EUR MPT data in second row const eurRow = dataRows[1] expect(eurRow).toHaveTextContent('000004C463...5D00000002') expect(eurRow).toHaveTextContent('EUR') // ticker expect(eurRow).toHaveTextContent('500.0K') // supply (formatted with parseAmount) expect(eurRow).toHaveTextContent('OTHER') // asset class (uppercase) expect(eurRow).toHaveTextContent('10%') // transfer fee expect(eurRow).toHaveTextContent('Global') // locked // Verify BTC MPT data in third row const btcRow = dataRows[2] expect(btcRow).toHaveTextContent('000004C463...5D00000003') expect(btcRow).toHaveTextContent('BTC') // ticker expect(btcRow).toHaveTextContent('250.0K') // supply (formatted with parseAmount) expect(btcRow).toHaveTextContent('OTHER') // asset class (uppercase) expect(btcRow).toHaveTextContent('15%') // transfer fee expect(btcRow).toHaveTextContent('--') // not locked // Verify FutureDataIcon appears for Price (USD) column only // Each MPT has 1 FutureDataIcon (price USD) = 3 MPTs * 1 icon = 3 total const futureDataIcons = document.querySelectorAll('.future-data') expect(futureDataIcons).toHaveLength(3) }) }) ================================================ FILE: src/containers/Accounts/AccountAsset/test/IssuedNFTs.test.tsx ================================================ import { render, screen, cleanup, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { IssuedNFTs } from '../assetTables/IssuedNFTs' import { getNFTsIssuedByAccount, getBuyNFToffers, getSellNFToffers, } from '../../../../rippled/lib/rippled' import { queryClient } from '../../../shared/QueryClient' import Mock = jest.Mock jest.mock('../../../../rippled/lib/rippled') jest.mock('../../../../rippled/lib/logger', () => ({ __esModule: true, default: () => ({ error: jest.fn(), warn: jest.fn(), info: jest.fn(), }), })) const mockedGetNFTsIssuedByAccount = getNFTsIssuedByAccount as Mock const mockedGetBuyNFToffers = getBuyNFToffers as Mock const mockedGetSellNFToffers = getSellNFToffers as Mock // Mock socket client const mockSocket = {} as any // Test wrapper component const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) // Mock NFT data const mockIssuedNFTsResponse = { nfts: [ { nft_id: '00081388F2C3F5B05AD6C8C0F5C0F5C0F5C0F5C0F5C0F5C0F5C0F5C000000001', uri: Buffer.from('https://example.com/issued-nft1').toString('hex'), transfer_fee: 2500, // 2.5% }, { nft_id: '00081388F2C3F5B05AD6C8C0F5C0F5C0F5C0F5C0F5C0F5C0F5C0F5C000000002', uri: Buffer.from('https://example.com/issued-nft2').toString('hex'), transfer_fee: 7500, // 7.5% }, { nft_id: '00081388F2C3F5B05AD6C8C0F5C0F5C0F5C0F5C0F5C0F5C0F5C0F5C000000003', uri: '', // No URI transfer_fee: 12500, // 12.5% }, ], marker: '', } // Mock offer data (XRP only - in drops, 1 XRP = 1,000,000 drops) const mockSellOffersNFT1 = { offers: [ { amount: '3000000' }, // 3 XRP { amount: '3500000' }, // 3.5 XRP ], } const mockBuyOffersNFT1 = { offers: [ { amount: '2800000' }, // 2.8 XRP { amount: '2500000' }, // 2.5 XRP ], } const mockSellOffersNFT2 = { offers: [ { amount: '8000000' }, // 8 XRP ], } const mockBuyOffersNFT2 = { offers: [ { amount: '7500000' }, // 7.5 XRP ], } // NFT3 has no offers const mockNoOffers = { offers: [], } describe('IssuedNFTs', () => { // Helper function to verify all column headers are displayed const verifyColumnHeaders = async () => { await waitFor(() => { expect(screen.getByText('Token ID')).toBeInTheDocument() }) expect(screen.getByText('URL')).toBeInTheDocument() expect(screen.getByText('Transfer Fee')).toBeInTheDocument() expect(screen.getByText('Lowest Ask')).toBeInTheDocument() expect(screen.getByText('Highest Bid')).toBeInTheDocument() } afterEach(() => { cleanup() queryClient.clear() }) beforeEach(() => { jest.clearAllMocks() mockedGetNFTsIssuedByAccount.mockResolvedValue(mockIssuedNFTsResponse) mockedGetBuyNFToffers.mockImplementation( (_rippledSocket: any, nftId: string) => { if (nftId === mockIssuedNFTsResponse.nfts[0].nft_id) { return Promise.resolve(mockBuyOffersNFT1) } if (nftId === mockIssuedNFTsResponse.nfts[1].nft_id) { return Promise.resolve(mockBuyOffersNFT2) } return Promise.resolve(mockNoOffers) }, ) mockedGetSellNFToffers.mockImplementation( (_rippledSocket: any, nftId: string) => { if (nftId === mockIssuedNFTsResponse.nfts[0].nft_id) { return Promise.resolve(mockSellOffersNFT1) } if (nftId === mockIssuedNFTsResponse.nfts[1].nft_id) { return Promise.resolve(mockSellOffersNFT2) } return Promise.resolve(mockNoOffers) }, ) }) it('renders empty state when no NFTs are issued', async () => { mockedGetNFTsIssuedByAccount.mockResolvedValueOnce({ nfts: [] }) render( , ) // Verify all column headers are displayed (no Issuer column for issued NFTs) await verifyColumnHeaders() // Check that the empty message is displayed await waitFor(() => { expect(screen.getByText('No NFTs found')).toBeInTheDocument() }) }) it('handles error when getNFTsIssuedByAccount fails', async () => { mockedGetNFTsIssuedByAccount.mockRejectedValueOnce( new Error('Network error'), ) render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Should show empty state when error occurs await waitFor(() => { expect(screen.getByText('No NFTs found')).toBeInTheDocument() }) }) it('shows 3 issued NFTs with all column values', async () => { render( , ) // Verify all column headers are displayed await verifyColumnHeaders() // Verify "Issuer" column is NOT displayed for issued NFTs (showIssuer=false) expect(screen.queryByText('Issuer')).not.toBeInTheDocument() // Wait for NFTs to load await waitFor(() => { expect(screen.getByText('00081388F2...C000000001')).toBeInTheDocument() }) // Get all table rows (excluding header) const rows = screen.getAllByRole('row') const dataRows = rows.slice(1) // Skip header row // Verify we have 3 NFT rows expect(dataRows).toHaveLength(3) // Verify NFT1 data in first row const nft1Row = dataRows[0] expect(nft1Row).toHaveTextContent('00081388F2...C000000001') expect(nft1Row).toHaveTextContent('https://example...issued-nft1') expect(nft1Row).toHaveTextContent('2.5%') // Verify NFT2 data in second row const nft2Row = dataRows[1] expect(nft2Row).toHaveTextContent('00081388F2...C000000002') expect(nft2Row).toHaveTextContent('https://example...issued-nft2') expect(nft2Row).toHaveTextContent('7.5%') // Verify NFT3 data in third row const nft3Row = dataRows[2] expect(nft3Row).toHaveTextContent('00081388F2...C000000003') expect(nft3Row).toHaveTextContent('12.5%') // Verify offer data (async loaded) // XRP symbol is \uE900, offers are formatted with localizeNumber with currency: 'XRP' await waitFor(() => { expect(nft1Row.textContent).toContain('\uE9003.00') // Lowest Ask for NFT1 }) expect(nft1Row.textContent).toContain('\uE9002.80') // Highest Bid for NFT1 // NFT2 offers expect(nft2Row.textContent).toContain('\uE9008.00') // Lowest Ask for NFT2 expect(nft2Row.textContent).toContain('\uE9007.50') // Highest Bid for NFT2 // NFT3: No offers, should show -- const nft3Placeholders = nft3Row.textContent?.match(/--/g) || [] expect(nft3Placeholders.length).toBeGreaterThanOrEqual(2) // At least 2: Lowest Ask and Highest Bid (no URL is also --) }) }) ================================================ FILE: src/containers/Accounts/AccountHeader/index.tsx ================================================ import { useTranslation } from 'react-i18next' import InfoIcon from '../../shared/images/info-duotone.svg' import DomainLink from '../../shared/components/DomainLink' import './styles.scss' import { Account } from '../../shared/components/Account' interface AccountHeaderProps { isAccountDeleted: boolean accountId: string account?: any } const AccountHeader = ({ isAccountDeleted, accountId, account, }: AccountHeaderProps) => { const { t } = useTranslation() const xAddress = account?.xAddress return (
{isAccountDeleted && (
{t('account_page_deleted_account_warning')}
)}
{xAddress ? t('account_page_extended_address') : t('account_page_address')}
{accountId}
{xAddress?.classicAddress && (
{t('account_page_classic_address')}:
)} {xAddress?.tag && (
{t('account_page_address_tag')}:
{xAddress.tag}
)} {account?.info?.domain && (
{t('account_page_domain')}:
)}
) } export default AccountHeader ================================================ FILE: src/containers/Accounts/AccountHeader/styles.scss ================================================ @use '../../shared/css/variables' as *; .account-header { padding: 50px 0 30px; .deleted-banner { display: flex; flex-direction: column; padding: 25px; border: 1px solid $orange-50; border-radius: 8px; margin-bottom: 30px; background: $black-90; gap: 12px; .deleted-label { display: flex; max-width: 180px; align-items: center; padding: 3px 12px; border: 1px solid $orange-50; border-radius: 100px; margin-bottom: 8px; background: $orange-80; color: $black-0; font-size: 12px; @include semibold; gap: 10px; text-transform: uppercase; .deleted-info-icon { width: 16px; height: 16px; margin-right: 3px; } } .deleted-message { margin: 0; color: $black-0; font-size: 16px; } } .address-panel { display: flex; height: auto; box-sizing: border-box; flex: none; flex-direction: column; flex-grow: 0; align-items: flex-start; align-self: stretch; order: 0; padding: 25px; border: 1px solid $black-70; border-radius: 8px; background: $black-90; gap: 10px; .address-label { color: $black-40; font-size: 14px; @include semibold; line-height: 1; text-transform: uppercase; } .address-value { display: inline-flex; align-items: center; color: $black-0; font-size: 24px; @include bold; line-height: 1; word-break: break-all; } .domain { display: flex; .domain-label { margin-right: 8px; color: $black-40; font-size: 14px; line-height: 1; } a { font-size: 14px; line-height: 1; word-break: break-all; } } .classic-address { display: flex; .classic-address-label { margin-right: 8px; color: $black-40; font-size: 14px; line-height: 1; } a { font-size: 14px; line-height: 1; word-break: break-all; } } .address-tag { display: flex; .address-tag-label { margin-right: 8px; color: $black-40; font-size: 14px; line-height: 1; } .address-tag-value { color: $black-0; font-size: 14px; line-height: 1; word-break: break-all; } } } .info-container { display: flex; flex-direction: column; justify-content: space-between; margin-top: 68px; @include for-size(desktop-up) { flex-direction: row; margin-top: 80px; } .values { display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 18px; color: $white; @include for-size(desktop-up) { flex-direction: column; margin-bottom: 0; } .title { padding-bottom: 4px; margin-bottom: 4.5px; color: $black-40; font-size: 14px; text-transform: uppercase; @include semibold; } .value { color: $white; font-size: 18px; line-height: 22.5px; text-decoration: none; @include bold; } } } } ================================================ FILE: src/containers/Accounts/AccountHeader/test/AccountHeader.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import i18n from '../../../../i18n/testConfigEnglish' import AccountHeader from '../index' // Mock the DomainLink component jest.mock('../../../shared/components/DomainLink', () => ({ __esModule: true, default: ({ domain }: { domain: string }) => ( {domain} ), })) // Mock the Account component jest.mock('../../../shared/components/Account', () => ({ Account: ({ account }: { account: string }) => ( {account} ), })) // Mock the SVG import jest.mock('../../../shared/images/info-duotone.svg', () => ({ __esModule: true, default: ({ className }: { className?: string }) => ( ), })) // Test wrapper component const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) describe('AccountHeader', () => { const mockAccountId = 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH' describe('Basic rendering', () => { it('renders regular account address', () => { render( , ) expect(screen.getByText('Address')).toBeInTheDocument() expect(screen.getByText(mockAccountId)).toBeInTheDocument() // No deleted banner expect(screen.queryByTestId('info-icon')).not.toBeInTheDocument() expect(screen.queryByText('Account Deleted')).not.toBeInTheDocument() }) }) describe('Deleted account banner', () => { it('shows deleted banner when account is deleted', () => { render( , ) expect(screen.getByTestId('info-icon')).toBeInTheDocument() expect(screen.getByText('Account Deleted')).toBeInTheDocument() expect( screen.getByText( 'This account has been deleted from the XRP Ledger. Historical data is shown for reference only.', ), ).toBeInTheDocument() }) }) describe('X-Address support', () => { it('renders extended address label when xAddress is provided', () => { const mockAccount = { xAddress: { classicAddress: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', tag: 12345, }, } render( , ) expect( screen.getByText('Extended Address (X-Address)'), ).toBeInTheDocument() expect( screen.getByText('X7AcgcsBL6XDcUb289X4mJ8djcdyKaB5hJDWMArnXr61cqZ'), ).toBeInTheDocument() // Classic address and tag should also be shown expect(screen.getByText('Classic Address:')).toBeInTheDocument() expect(screen.getByTestId('classic-address')).toBeInTheDocument() expect( screen.getByText('rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH'), ).toBeInTheDocument() expect(screen.getByText('Tag:')).toBeInTheDocument() expect(screen.getByText('12345')).toBeInTheDocument() }) it('does not render classic address when xAddress classicAddress is missing', () => { const mockAccount = { xAddress: { tag: 12345, }, } render( , ) expect(screen.queryByText('Classic Address:')).not.toBeInTheDocument() }) it('does not render address tag when xAddress tag is missing', () => { const mockAccount = { xAddress: { classicAddress: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', }, } render( , ) expect(screen.queryByText('Tag:')).not.toBeInTheDocument() }) }) describe('Domain display', () => { it('renders domain when account info has domain', () => { const mockAccount = { info: { domain: 'ripple.com', }, } render( , ) expect(screen.getByText('Domain:')).toBeInTheDocument() expect(screen.getByTestId('domain-link')).toBeInTheDocument() expect(screen.getByText('ripple.com')).toBeInTheDocument() }) it('does not render domain when account info is missing', () => { render( , ) expect(screen.queryByText('Domain:')).not.toBeInTheDocument() expect(screen.queryByTestId('domain-link')).not.toBeInTheDocument() }) it('does not render domain when domain field is missing', () => { const mockAccount = { info: {}, } render( , ) expect(screen.queryByText('Domain:')).not.toBeInTheDocument() expect(screen.queryByTestId('domain-link')).not.toBeInTheDocument() }) it('renders with all optional fields missing', () => { render( , ) // Only address should be shown expect(screen.getByText('Address')).toBeInTheDocument() expect(screen.getByText(mockAccountId)).toBeInTheDocument() // No optional fields expect(screen.queryByText(/Classic Address/)).not.toBeInTheDocument() expect(screen.queryByText(/Tag/)).not.toBeInTheDocument() expect(screen.queryByText(/Domain/)).not.toBeInTheDocument() expect(screen.queryByText('Account Deleted')).not.toBeInTheDocument() }) }) describe('Address title attribute', () => { it('sets title attribute on address value for tooltip', () => { render( , ) const addressValue = screen.getByTitle(mockAccountId) expect(addressValue).toBeInTheDocument() expect(addressValue).toHaveTextContent(mockAccountId) }) }) }) ================================================ FILE: src/containers/Accounts/AccountSummary/Balances.tsx ================================================ import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useLanguage } from '../../shared/hooks' import { localizeNumber } from '../../shared/utils' import { XRP_BASE } from '../../shared/transactionUtils' import UsdIcon from '../../shared/images/usd_icon.svg' import XrpIcon from '../../shared/images/xrp_balance_icon.svg' import ReserveIcon from '../../shared/images/xrp_reserve_balance_icon.svg' import { XRP_CURRENCY_OPTIONS, USD_CURRENCY_OPTIONS, } from '../../shared/NumberFormattingUtils' interface BalancesProps { account: any xrpToUSDRate: number } const Balances = ({ account, xrpToUSDRate }: BalancesProps) => { const { t } = useTranslation() const lang = useLanguage() const { xrpBalance, xrpBalanceInUSD } = useMemo(() => { const balance = (account.info?.balance ?? 0) / XRP_BASE return { xrpBalance: balance, xrpBalanceInUSD: balance * xrpToUSDRate, } }, [account.info?.balance, xrpToUSDRate]) return (
{typeof XrpIcon === 'string' ? ( XRP ) : ( )} {t('account_page_xrp_balance')}
{localizeNumber(xrpBalance, lang, XRP_CURRENCY_OPTIONS)}
{t('account_page_xrp_balance_in_usd')}
{localizeNumber(xrpBalanceInUSD, lang, USD_CURRENCY_OPTIONS)}
{typeof ReserveIcon === 'string' ? ( Reserve ) : ( )} {t('account_page_reserve_balance')}
{localizeNumber( account.info?.reserve ?? 0, lang, XRP_CURRENCY_OPTIONS, )}
) } export default Balances ================================================ FILE: src/containers/Accounts/AccountSummary/DetailsCard.tsx ================================================ import { useTranslation } from 'react-i18next' import { localizeNumber } from '../../shared/utils' import { XRP_SMALL_BALANCE_CURRENCY_OPTIONS } from '../../shared/NumberFormattingUtils' import { Account } from '../../shared/components/Account' interface DetailsCardProps { account: any lang: string } const DetailsCard = ({ account, lang }: DetailsCardProps) => { const { t } = useTranslation() return (
{t('account_page_details')}
{t('account_page_current_sequence')}
{localizeNumber(account.info?.sequence, lang)}
{t('account_page_ticket_count')}
{localizeNumber(account.info?.ticketCount, lang)}
{account.info?.emailHash && (
{t('account_page_email_hash')}
{account.info.emailHash}
)} {account.paychannels?.total_available && (
{t('account_page_payment_channels')}
{t('account_page_payment_channels_text', { currency: localizeNumber( account.paychannels.total_available, lang, XRP_SMALL_BALANCE_CURRENCY_OPTIONS, ), number: account.paychannels.channels.length, })}
)} {account.info?.nftMinter && (
{t('account_page_nft_minter')}
)}
) } export default DetailsCard ================================================ FILE: src/containers/Accounts/AccountSummary/FlagsCard.tsx ================================================ import { useMemo } from 'react' import { useTranslation } from 'react-i18next' interface FlagsCardProps { account: any } const FlagsCard = ({ account }: FlagsCardProps) => { const { t } = useTranslation() const flags = useMemo< Array<{ key: string title: string description: string enabled: boolean }> >(() => { const accountFlags: string[] = account.info?.flags ?? [] return [ { key: 'lsfGlobalFreeze', title: t('account_flag_title_lsf_global_freeze'), description: t('account_flag_description_lsf_global_freeze'), enabled: accountFlags.includes('lsfGlobalFreeze'), }, { key: 'lsfDisableMaster', title: t('account_flag_title_lsf_disable_master'), description: t('account_flag_description_lsf_disable_master'), enabled: accountFlags.includes('lsfDisableMaster'), }, { key: 'lsfDefaultRipple', title: t('account_flag_title_lsf_default_ripple'), description: t('account_flag_description_lsf_default_ripple'), enabled: accountFlags.includes('lsfDefaultRipple'), }, { key: 'lsfAllowTrustLineClawback', title: t('account_flag_title_lsf_allow_trustline_clawback'), description: t('account_flag_description_lsf_allow_trustline_clawback'), enabled: accountFlags.includes('lsfAllowTrustLineClawback'), }, { key: 'lsfAllowTrustLineLocking', title: t('account_flag_title_lsf_allow_trustline_locking'), description: t('account_flag_description_lsf_allow_trustline_locking'), enabled: accountFlags.includes('lsfAllowTrustLineLocking'), }, { key: 'lsfRequireDestTag', title: t('account_flag_title_lsf_require_destination_tag'), description: t('account_flag_description_lsf_require_destination_tag'), enabled: accountFlags.includes('lsfRequireDestTag'), }, { key: 'lsfNoFreeze', title: t('account_flag_title_lsf_no_freeze'), description: t('account_flag_description_lsf_no_freeze'), enabled: accountFlags.includes('lsfNoFreeze'), }, { key: 'lsfRequireAuth', title: t('account_flag_title_lsf_require_auth'), description: t('account_flag_description_lsf_require_auth'), enabled: accountFlags.includes('lsfRequireAuth'), }, { key: 'lsfDisallowXRP', title: t('account_flag_title_lsf_disallow_xrp'), description: t('account_flag_description_lsf_disallow_xrp'), enabled: accountFlags.includes('lsfDisallowXRP'), }, { key: 'lsfDisallowIncomingTrustline', title: t('account_flag_title_lsf_disallow_incoming_trustline'), description: t( 'account_flag_description_lsf_disallow_incoming_trustline', ), enabled: accountFlags.includes('lsfDisallowIncomingTrustline'), }, { key: 'lsfDisallowIncomingPayChannel', title: t('account_flag_title_lsf_disallow_incoming_pay_chan'), description: t( 'account_flag_description_lsf_disallow_incoming_pay_chan', ), enabled: accountFlags.includes('lsfDisallowIncomingPayChannel'), }, { key: 'lsfDisallowIncomingNFTokenOffer', title: t('account_flag_title_lsf_disallow_incoming_nft_token_offer'), description: t( 'account_flag_description_lsf_disallow_incoming_nft_token_offer', ), enabled: accountFlags.includes('lsfDisallowIncomingNFTokenOffer'), }, { key: 'asfAuthorizedNFTokenMinter', title: t('account_flag_title_asf_authorized_nft_token_minter'), description: t( 'account_flag_description_asf_authorized_nft_token_minter', ), // No ledger flag exists for the AccountSet flag `asfAuthorizedNFTokenMinter`. // The NFTokenMinter field's presence or absence is sufficient to determine the flag's status. enabled: !!account.info?.nftMinter, }, { key: 'lsfDisallowIncomingCheck', title: t('account_flag_title_lsf_disallow_incoming_check'), description: t('account_flag_description_lsf_disallow_incoming_check'), enabled: accountFlags.includes('lsfDisallowIncomingCheck'), }, { key: 'lsfDepositAuth', title: t('account_flag_title_lsf_deposit_auth'), description: t('account_flag_description_lsf_deposit_auth'), enabled: accountFlags.includes('lsfDepositAuth'), }, { key: 'asfAccountTxnID', title: t('account_flag_title_asf_account_txn_id'), description: t('account_flag_description_asf_account_txn_id'), // No ledger flag exists for the AccountSet flag `asfAccountTxnID`. // The AccountTxnID field's presence or absence is sufficient to determine the flag's status. enabled: !!account.info?.accountTransactionID, }, ] }, [account.info, t]) return (
{t('account_page_flags')}
{flags.map((flag, i) => (
{flag.title}
{flag.description}
{(() => { if (flag.key === 'lsfDisableMaster') { return flag.enabled ? t('yes') : t('no') } return flag.enabled ? t('account_page_flag_status_enabled') : t('account_page_flag_status_disabled') })()}
))}
) } export default FlagsCard ================================================ FILE: src/containers/Accounts/AccountSummary/SignersCard.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../shared/components/Account' import { localizeNumber, shortenAccount } from '../../shared/utils' interface Signer { account: string weight?: number // Individual weight values cannot exceed 2^16-1. } interface SignersCardProps { signers: Signer[] } const SignersCard = ({ signers }: SignersCardProps) => { const { t } = useTranslation() return (
{t('account_page_signers')}
{signers.map((signer, i) => (
{signer.weight !== undefined && (
{t('account_page_signer_weight')}{' '} {localizeNumber(signer.weight)}
)}
))}
) } export default SignersCard ================================================ FILE: src/containers/Accounts/AccountSummary/index.tsx ================================================ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useLanguage } from '../../shared/hooks' import ArrowIcon from '../../shared/images/down_arrow.svg' import Balances from './Balances' import DetailsCard from './DetailsCard' import FlagsCard from './FlagsCard' import SignersCard from './SignersCard' import './styles.scss' interface AccountSummaryProps { account: any xrpToUSDRate: number } export const AccountSummary = ({ account = {}, xrpToUSDRate, }: AccountSummaryProps) => { const { t } = useTranslation() const lang = useLanguage() const [propertiesOpen, setPropertiesOpen] = useState(false) return (

{t('account_page_account_properties')}

{propertiesOpen && (
{account.signerList?.signers && ( )}
)}
) } export default AccountSummary ================================================ FILE: src/containers/Accounts/AccountSummary/styles.scss ================================================ @use '../../shared/css/variables' as *; .account-summary { .card { padding: 18px; border: 1px solid $black-70; border-radius: 8px; background: $black-90; } .balances { /* Frame that encompasses the 3 balance boxes */ display: flex; /* Inside auto layout */ flex: none; flex-direction: row; flex-grow: 0; align-items: center; align-self: stretch; order: 1; padding: 0; gap: 28px; /* common base for all balance cards (markup uses .balance-card and modifier classes) */ .balance-card { display: flex; min-width: 0; /* allow shrinking for long content */ flex: 1 1 0; flex-direction: column; justify-content: center; gap: 12px; } .balance-title { display: flex; align-items: center; color: $black-40; font-size: 14px; gap: 6px; text-transform: uppercase; @include semibold; } .balance-icon { display: inline-block; width: 24px; height: 24px; flex: 0 0 auto; } .balance-value { color: $black-0; font-size: 24px; @include bold; } /* shared visual box properties for the three balance tiles */ .xrp, .usd, .reserve { display: flex; min-width: 0; height: 130px; box-sizing: border-box; flex: 1 1 0; flex-direction: column; align-items: flex-start; padding: 38px; border-radius: 8px; gap: 12px; } /* individual visuals only set border/background/order */ .xrp { order: 0; border: 1px solid #145c35; background: rgb(20 92 53 / 40%); } .usd { order: 1; border: 1px solid #6b0080; background: rgb(64 0 76 / 50%); } .reserve { order: 2; border: 1px solid #004d80; background: rgb(0 77 128 / 40%); } } .properties { /* layout for header and the chevron toggle */ .properties-header { display: flex; align-items: center; justify-content: flex-start; margin: 24px 0; gap: 2px; h3 { margin: 0; color: $black-0; font-size: 20px; } .properties-toggle { display: inline-flex; align-items: center; justify-content: center; padding: 6px; border: 0; background: transparent; color: inherit; cursor: pointer; } .properties-arrow { display: inline-block; width: 18px; height: 18px; transform-origin: center; transition: transform 180ms ease; } .properties-arrow.open { transform: rotate(180deg); } } .properties-grid { display: grid; align-items: start; gap: 28px; grid-template-columns: repeat(3, 1fr); /* Custom scrollbars for Flags and Signers lists */ .flags-list, .signers-list { scrollbar-color: rgb(255 255 255 / 20%) transparent; /* Firefox */ scrollbar-width: thin; /* WebKit */ &::-webkit-scrollbar { width: 10px; height: 10px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { border: 2px solid transparent; /* create padding effect */ border-radius: 6px; background: rgb(255 255 255 / 20%); background-clip: padding-box; } &::-webkit-scrollbar-thumb:hover { background: rgb(255 255 255 / 12%); } } /* Shared visuals for both cards */ .flags-card, .signers-card { display: flex; min-width: 0; min-height: 0; box-sizing: border-box; flex: none; flex-direction: column; flex-grow: 0; align-items: stretch; padding: 20px; gap: 15px; isolation: isolate; } /* shared header styles to avoid duplicates */ .card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; .header-title { color: $black-0; font-size: 20px; @include bold; } } .flags-card { grid-column: 1 / span 2; .flags-list { display: flex; max-height: calc(5 * 70px); flex-direction: column; padding-right: 6px; gap: 8px; overflow-y: auto; } .flag-item { display: flex; align-items: center; justify-content: space-between; padding: 12px; border-radius: 8px; background: $black-80; .flag-meta { display: flex; flex-direction: column; .flag-title { margin-bottom: 6px; color: $black-0; font-size: 14px; @include semibold; text-transform: uppercase; } .flag-desc { color: $black-0; font-size: 14px; } } .flag-status { min-width: 85px; // Ensures YES/NO and ENABLED/DISABLED have the same width padding: 6px 10px; border-radius: 999px; font-size: 12px; letter-spacing: 0.06em; text-align: center; text-transform: uppercase; white-space: nowrap; @include semibold; } .flag-status.enabled { background: $green-50; color: $black-100; } .flag-status.disabled { background: $black-50; color: $black-0; } } } .signers-card { grid-column: 3 / 4; .signers-list { display: flex; width: 100%; max-height: calc(5 * 44px); flex-direction: column; align-self: stretch; padding-right: 6px; /* match flags-list spacing to keep scrollbar offset consistent */ gap: 8px; overflow-y: auto; } .signer-item { display: flex; align-items: center; justify-content: space-between; padding: 10px; border-radius: 8px; background: $black-80; .signer-address { font-size: 14px; } .signer-weight { color: $blue-50; font-size: 14px; } } } } /* Details card styles */ @media (min-width: $tablet-landscape-upper-boundary) { .details-card { /* Ensure Details card matches Flags card width in properties grid (desktop only) */ grid-column: 1 / span 2; } } .details-card { display: flex; flex-direction: column; padding: 20px; background: $black-90; gap: 16px; /* Only first two details side by side, rest full width */ .details-box { display: flex; min-width: 0; flex: 1 1 180px; flex-direction: row; align-items: center; padding: 10px; border: 1px solid $black-70; border-radius: 8px; background: $black-80; gap: 12px; } .details-list { display: grid; gap: 8px; grid-template-columns: repeat(2, 1fr); /* Only the first two direct .details-box children are side by side on desktop */ > .details-box:nth-child(1) { grid-column: 1; grid-row: 1; } > .details-box:nth-child(2) { grid-column: 2; grid-row: 1; } > .details-box:nth-child(n + 3) { grid-column: 1 / span 2; } } .details-label { color: $black-0; font-size: 14px; @include medium; text-transform: none; } .details-value { margin-left: auto; color: $black-0; font-size: 14px; text-align: right; } } /* Force vertical stacking for tablet portrait and smaller */ @media (max-width: $tablet-portrait-upper-boundary) { .details-card .details-list { grid-template-columns: 1fr; /* Keep grid but force 1 column */ > .details-box:nth-child(1), > .details-box:nth-child(2) { grid-column: 1; grid-row: auto; } /* Ensure all boxes span full width in grid */ > .details-box:nth-child(n + 3) { grid-column: 1; } } } @media (max-width: $tablet-landscape-upper-boundary) { .details-card { padding: 16px; } .details-list { /* Keep as grid instead of flex to maintain alignment */ display: grid; gap: 10px; grid-template-columns: 1fr; } .details-box { width: 100%; flex: none; flex-direction: column; align-items: flex-start; padding: 12px; gap: 8px; } .details-label { font-size: 12px; } .details-value { font-size: 14px; } } /* Extra narrow screens - force better text wrapping */ @media (max-width: $tablet-portrait-upper-boundary) { .details-card { padding: 12px; .details-list { gap: 8px; } .details-box { overflow: hidden; /* Prevent box expansion */ min-height: auto; padding: 10px; } .details-label { line-height: 1.2; } .details-value { max-width: 100%; hyphens: auto; /* Allow hyphenation if supported */ line-height: 1.3; overflow-wrap: anywhere; /* More aggressive wrapping */ word-break: break-all; } } } } @media (max-width: $tablet-landscape-upper-boundary) { .balances { flex-direction: column; margin-bottom: 24px; /* preserve spacing on mobile */ gap: 12px; .balance-card { width: 100%; flex: none; } .xrp, .usd, .reserve { height: auto; padding: 20px; } .balance-value { font-size: 18px; } .balance-icon { width: 20px; height: 20px; } } .properties { .properties-header { gap: 8px; .properties-toggle { padding: 4px; } .properties-arrow { width: 16px; height: 16px; } } .properties-grid { margin-top: 12px; gap: 12px; grid-template-columns: 1fr; .flags-card, .signers-card { padding: 16px; } .flags-card { grid-column: auto; } .signers-card { grid-column: auto; } .flags-list, .signers-list { max-height: calc(5 * 64px); padding-inline: 4px; } .flag-item, .signer-item { padding: 10px; } } } } @media (max-width: $tablet-portrait-upper-boundary) { .properties { .properties-header { h3 { font-size: 18px; } } .properties-grid .card-header .header-title { font-size: 18px; } } } } ================================================ FILE: src/containers/Accounts/AccountSummary/test/AccountSummary.test.tsx ================================================ import { render, screen, fireEvent } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../i18n/testConfigEnglish' import { AccountSummary } from '../index' // Mock the child components and SVG imports jest.mock('../Balances', () => ({ __esModule: true, default: ({ account, xrpToUSDRate }: any) => (
Balance: {account.info?.balance} Rate: {xrpToUSDRate}
), })) jest.mock('../DetailsCard', () => ({ __esModule: true, default: ({ account, lang }: any) => (
Sequence: {account.info?.sequence} Lang: {lang}
), })) jest.mock('../FlagsCard', () => ({ __esModule: true, default: ({ account }: any) => (
Flags: {account.info?.flags?.length || 0}
), })) jest.mock('../SignersCard', () => ({ __esModule: true, default: ({ signers }: any) => (
Signers: {signers.length}
), })) jest.mock('../../../shared/images/down_arrow.svg', () => ({ __esModule: true, default: () => , })) const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) describe('AccountSummary Component', () => { const mockAccount = { info: { balance: 1000000000, sequence: 123, flags: ['lsfGlobalFreeze'], }, } describe('Rendering and Toggle Behavior', () => { it('renders balances and collapsed properties by default, then expands/collapses on toggle', () => { render( , ) // Renders balances and properties header expect(screen.getByTestId('balances-mock')).toBeInTheDocument() expect(screen.getByText('Account Properties')).toBeInTheDocument() // Properties are collapsed by default const toggleButton = screen.getByLabelText('Toggle account properties') expect(toggleButton).toBeInTheDocument() expect(toggleButton).toHaveAttribute('aria-expanded', 'false') expect(screen.queryByTestId('flags-card-mock')).not.toBeInTheDocument() expect(screen.queryByTestId('details-card-mock')).not.toBeInTheDocument() // Expand properties fireEvent.click(toggleButton) expect(toggleButton).toHaveAttribute('aria-expanded', 'true') expect(screen.getByTestId('flags-card-mock')).toBeInTheDocument() expect(screen.getByTestId('details-card-mock')).toBeInTheDocument() // Collapse again fireEvent.click(toggleButton) expect(toggleButton).toHaveAttribute('aria-expanded', 'false') expect(screen.queryByTestId('flags-card-mock')).not.toBeInTheDocument() }) }) describe('Props and Content', () => { it('passes correct props to child components', () => { render( , ) // Balances receives account and rate expect(screen.getByText(/Balance: 1000000000/)).toBeInTheDocument() expect(screen.getByText(/Rate: 0.5/)).toBeInTheDocument() // FlagsCard receives account const toggleButton = screen.getByLabelText('Toggle account properties') fireEvent.click(toggleButton) expect(screen.getByText('Flags: 1')).toBeInTheDocument() }) it('renders SignersCard when signers exist, hides when none', () => { // Without signers render( , ) const toggleButton = screen.getByLabelText('Toggle account properties') fireEvent.click(toggleButton) expect(screen.queryByTestId('signers-card-mock')).not.toBeInTheDocument() }) it('renders SignersCard when account has signers', () => { const accountWithSigners = { ...mockAccount, signerList: { signers: [ { account: 'rSigner1', weight: 1 }, { account: 'rSigner2', weight: 2 }, ], }, } render( , ) const toggleButton = screen.getByLabelText('Toggle account properties') fireEvent.click(toggleButton) expect(screen.getByTestId('signers-card-mock')).toBeInTheDocument() expect(screen.getByText('Signers: 2')).toBeInTheDocument() }) it('handles empty account gracefully', () => { render( , ) expect(screen.getByTestId('balances-mock')).toBeInTheDocument() const toggleButton = screen.getByLabelText('Toggle account properties') fireEvent.click(toggleButton) expect(screen.getByTestId('flags-card-mock')).toBeInTheDocument() expect(screen.getByTestId('details-card-mock')).toBeInTheDocument() }) it('handles undefined account with default value', () => { render( , ) expect(screen.getByTestId('balances-mock')).toBeInTheDocument() const toggleButton = screen.getByLabelText('Toggle account properties') fireEvent.click(toggleButton) expect(screen.getByTestId('flags-card-mock')).toBeInTheDocument() expect(screen.getByTestId('details-card-mock')).toBeInTheDocument() }) }) }) ================================================ FILE: src/containers/Accounts/AccountSummary/test/Balances.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../i18n/testConfigEnglish' import Balances from '../Balances' // Mock SVG imports jest.mock('../../../shared/images/usd_icon.svg', () => ({ __esModule: true, default: () => , })) jest.mock('../../../shared/images/xrp_balance_icon.svg', () => ({ __esModule: true, default: () => , })) jest.mock('../../../shared/images/xrp_reserve_balance_icon.svg', () => ({ __esModule: true, default: () => , })) const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) describe('Balances Component', () => { describe('Rendering', () => { it('renders all three balance cards with icons', () => { const account = { info: { balance: 1000000000, // 1000 XRP (in drops) reserve: 10000000, // 10 XRP }, } const { container } = render( , ) // Verify three balance cards exist const balanceCards = container.querySelectorAll('.balance-card') expect(balanceCards.length).toBe(3) // Verify XRP balance card and icon expect(screen.getByText('XRP Balance')).toBeInTheDocument() expect(screen.getByTestId('xrp-icon')).toBeInTheDocument() // Verify USD balance card and icon expect(screen.getByText('XRP Balance (USD)')).toBeInTheDocument() expect(screen.getByTestId('usd-icon')).toBeInTheDocument() // Verify Reserve balance card and icon expect(screen.getByText('Reserve Balance')).toBeInTheDocument() expect(screen.getByTestId('reserve-icon')).toBeInTheDocument() }) }) describe('Balance Calculations', () => { it('converts drops to XRP correctly (1000 XRP)', () => { const account = { info: { balance: 1000000000, // 1000 XRP in drops reserve: 0, }, } const { container } = render( , ) // XRP balance should show 1000 const xrpCard = container.querySelector('.balance-card.xrp') expect(xrpCard?.textContent).toContain('1,000') }) it('calculates USD value correctly', () => { const account = { info: { balance: 2000000000, // 2000 XRP reserve: 0, }, } const { container } = render( , ) // USD should be 2000 * 0.5 = 1000 const usdCard = container.querySelector('.balance-card.usd') expect(usdCard?.textContent).toContain('$1,000') }) it('handles zero balance', () => { const account = { info: { balance: 0, reserve: 0, }, } const { container } = render( , ) const xrpCard = container.querySelector('.balance-card.xrp') expect(xrpCard?.textContent).toContain('0') }) it('handles missing balance (defaults to 0)', () => { const account = { info: {}, } const { container } = render( , ) const xrpCard = container.querySelector('.balance-card.xrp') expect(xrpCard?.textContent).toContain('0') }) it('displays reserve balance', () => { const account = { info: { balance: 1000000000, reserve: 20, // 20 XRP (already in XRP, not drops) }, } const { container } = render( , ) const reserveCard = container.querySelector('.balance-card.reserve') expect(reserveCard?.textContent).toContain('20') }) }) describe('XRP to USD Rate', () => { it('updates USD value when rate changes', () => { const account = { info: { balance: 1000000000, // 1000 XRP reserve: 0, }, } const { container, rerender } = render( , ) // Initial: 1000 XRP * $0.5 = $500 let usdCard = container.querySelector('.balance-card.usd') expect(usdCard?.textContent).toContain('$500') // Update rate: 1000 XRP * $2 = $2000 rerender( , ) usdCard = container.querySelector('.balance-card.usd') expect(usdCard?.textContent).toContain('2,000') }) it('handles zero USD rate', () => { const account = { info: { balance: 1000000000, reserve: 0, }, } const { container } = render( , ) const usdCard = container.querySelector('.balance-card.usd') expect(usdCard?.textContent).toContain('$0') }) }) describe('Number Formatting', () => { it('formats all three balances with proper formatting', () => { const account = { info: { balance: 5545000, // 5.545 XRP reserve: 20.538, // 20.54 XRP }, } const { container } = render( , ) // XRP balance with decimal const xrpCard = container.querySelector('.balance-card.xrp') expect(xrpCard?.textContent).toContain('5.55') // USD balance calculated and formatted const usdCard = container.querySelector('.balance-card.usd') expect(usdCard?.textContent).toContain('$2.77') // 5.545 * 0.5 = 2.7725 // Reserve balance with decimal const reserveCard = container.querySelector('.balance-card.reserve') expect(reserveCard?.textContent).toContain('20.54') }) }) describe('Edge Cases', () => { it('handles missing info property', () => { const account = {} const { container } = render( , ) const xrpCard = container.querySelector('.balance-card.xrp') expect(xrpCard).toBeInTheDocument() }) }) }) ================================================ FILE: src/containers/Accounts/AccountSummary/test/DetailsCard.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import i18n from '../../../../i18n/testConfigEnglish' import DetailsCard from '../DetailsCard' // Mock the Account component jest.mock('../../../shared/components/Account', () => ({ Account: ({ account }: { account: string }) => ( {account} ), })) const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) describe('DetailsCard Component', () => { describe('Rendering', () => { it('renders card header and required fields', () => { const account = { info: { sequence: 123, ticketCount: 5, }, } render( , ) // Verify card header expect(screen.getByText('Details')).toBeInTheDocument() // Verify current sequence field expect(screen.getByText('Current Sequence')).toBeInTheDocument() expect(screen.getByText('123')).toBeInTheDocument() // Verify ticket count field expect(screen.getByText('Ticket Count')).toBeInTheDocument() expect(screen.getByText('5')).toBeInTheDocument() }) }) describe('Optional Fields', () => { it('renders email hash when present', () => { const account = { info: { sequence: 123, ticketCount: 0, emailHash: 'ABC123DEF456', }, } render( , ) expect(screen.getByText('Email Hash')).toBeInTheDocument() expect(screen.getByText('ABC123DEF456')).toBeInTheDocument() }) it('does not render email hash when not present', () => { const account = { info: { sequence: 123, ticketCount: 0, }, } render( , ) expect(screen.queryByText('Email Hash')).not.toBeInTheDocument() }) it('renders payment channels when present', () => { const account = { info: { sequence: 123, ticketCount: 0, }, paychannels: { total_available: 100, channels: [{ id: '1' }, { id: '2' }, { id: '3' }], }, } render( , ) expect(screen.getByText('Payment Channels')).toBeInTheDocument() // Should show formatted text with both amount and number of channels expect(screen.getByText(/100\.00.*3 channel\(s\)/i)).toBeInTheDocument() }) it('does not render payment channels when not present', () => { const account = { info: { sequence: 123, ticketCount: 0, }, } render( , ) expect(screen.queryByText('Payment Channels')).not.toBeInTheDocument() }) it('renders NFT minter when present', () => { const account = { info: { sequence: 123, ticketCount: 0, nftMinter: 'rNFTMinterAccount123', }, } render( , ) expect(screen.getByText('NFT Minter')).toBeInTheDocument() expect(screen.getByTestId('account-component')).toHaveTextContent( 'rNFTMinterAccount123', ) }) it('does not render NFT minter when not present', () => { const account = { info: { sequence: 123, ticketCount: 0, }, } render( , ) expect(screen.queryByText('NFT Minter')).not.toBeInTheDocument() }) }) describe('Number Formatting', () => { it('formats sequence and ticket count with commas for large numbers', () => { const account = { info: { sequence: 1234567, ticketCount: 1000, }, } render( , ) expect(screen.getByText('1,234,567')).toBeInTheDocument() expect(screen.getByText('1,000')).toBeInTheDocument() }) it('handles zero values', () => { const account = { info: { sequence: 0, ticketCount: 0, }, } render( , ) const zeroElements = screen.getAllByText('0') expect(zeroElements.length).toBe(2) }) }) describe('Combined Optional Fields', () => { it('renders all optional fields when present', () => { const account = { info: { sequence: 123, ticketCount: 5, emailHash: 'ABC123', nftMinter: 'rMinter123', }, paychannels: { total_available: 100, channels: [{ id: '1' }, { id: '2' }], }, } render( , ) expect(screen.getByText('Email Hash')).toBeInTheDocument() expect(screen.getByText('Payment Channels')).toBeInTheDocument() expect(screen.getByText('NFT Minter')).toBeInTheDocument() }) }) describe('Edge Cases', () => { it('handles undefined sequence', () => { const account = { info: { ticketCount: 0, }, } render( , ) expect(screen.getByText('Current Sequence')).toBeInTheDocument() }) it('handles undefined ticket count', () => { const account = { info: { sequence: 123, }, } render( , ) expect(screen.getByText('Ticket Count')).toBeInTheDocument() }) it('handles empty paychannels array', () => { const account = { info: { sequence: 123, ticketCount: 0, }, paychannels: { total_available: 0, channels: [], }, } render( , ) // Should not render payment channels if total_available is 0 (falsy) expect(screen.queryByText('Payment Channels')).not.toBeInTheDocument() }) }) describe('Language Support', () => { it('accepts different language codes', () => { const account = { info: { sequence: 1234567, ticketCount: 0, }, } render( , ) expect(screen.getByText('Details')).toBeInTheDocument() }) }) }) ================================================ FILE: src/containers/Accounts/AccountSummary/test/FlagsCard.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../i18n/testConfigEnglish' import FlagsCard from '../FlagsCard' const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) describe('FlagsCard Component', () => { describe('Rendering', () => { it('renders the card with header', () => { const account = { info: { flags: [], }, } render( , ) expect(screen.getByText('Flags')).toBeInTheDocument() }) it('renders all 16 flag items', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flagItems = container.querySelectorAll('.flag-item') expect(flagItems.length).toBe(16) }) }) describe('Flag Status - Enabled(Yes)/Disabled(No)', () => { it('shows lsfGlobalFreeze as enabled when flag is present', () => { const account = { info: { flags: ['lsfGlobalFreeze'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Global Freeze'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfGlobalFreeze as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Global Freeze'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfDisableMaster as enabled with "Yes" when flag is present', () => { const account = { info: { flags: ['lsfDisableMaster'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Master Key'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Yes') }) it('shows lsfDisableMaster as disabled with "No" when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Master Key'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('No') }) it('shows lsfDefaultRipple as enabled when flag is present', () => { const account = { info: { flags: ['lsfDefaultRipple'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Rippling'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfDefaultRipple as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Rippling'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfAllowTrustLineClawback as enabled when flag is present', () => { const account = { info: { flags: ['lsfAllowTrustLineClawback'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Clawback'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfAllowTrustLineClawback as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Clawback'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfRequireDestTag as enabled when flag is present', () => { const account = { info: { flags: ['lsfRequireDestTag'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Require Destination Tag'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfRequireDestTag as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Require Destination Tag'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfNoFreeze as enabled when flag is present', () => { const account = { info: { flags: ['lsfNoFreeze'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('No Freeze'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfNoFreeze as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('No Freeze'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfRequireAuth as enabled when flag is present', () => { const account = { info: { flags: ['lsfRequireAuth'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.querySelector('.flag-title')?.textContent === 'Require Authorization', ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfRequireAuth as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.querySelector('.flag-title')?.textContent === 'Require Authorization', ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfDisallowXRP as enabled when flag is present', () => { const account = { info: { flags: ['lsfDisallowXRP'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('No XRP Allowed'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfDisallowXRP as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('No XRP Allowed'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfDisallowIncomingTrustline as enabled when flag is present', () => { const account = { info: { flags: ['lsfDisallowIncomingTrustline'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Block Trustlines'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfDisallowIncomingTrustline as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Block Trustlines'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfDisallowIncomingPayChannel as enabled when flag is present', () => { const account = { info: { flags: ['lsfDisallowIncomingPayChannel'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Block Payment Channels'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfDisallowIncomingPayChannel as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Block Payment Channels'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfDisallowIncomingNFTokenOffer as enabled when flag is present', () => { const account = { info: { flags: ['lsfDisallowIncomingNFTokenOffer'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Block NFT Offers'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfDisallowIncomingNFTokenOffer as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Block NFT Offers'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows asfAuthorizedNFTokenMinter as enabled when nftMinter field is present', () => { const account = { info: { flags: [], nftMinter: 'rMinterAccount123', }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('NFT Minter'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows asfAuthorizedNFTokenMinter as disabled when nftMinter field is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('NFT Minter'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfDisallowIncomingCheck as enabled when flag is present', () => { const account = { info: { flags: ['lsfDisallowIncomingCheck'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Block Checks'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfDisallowIncomingCheck as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Block Checks'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows lsfDepositAuth as enabled when flag is present', () => { const account = { info: { flags: ['lsfDepositAuth'], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.querySelector('.flag-title')?.textContent === 'Deposit Authorization', ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows lsfDepositAuth as disabled when flag is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.querySelector('.flag-title')?.textContent === 'Deposit Authorization', ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) it('shows asfAccountTxnID as enabled when accountTransactionID field is present', () => { const account = { info: { flags: [], accountTransactionID: 'ABCD1234', }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Track Account Latest Transaction'), ) expect(flag?.querySelector('.flag-status.enabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Enabled') }) it('shows asfAccountTxnID as disabled when accountTransactionID field is not present', () => { const account = { info: { flags: [], }, } const { container } = render( , ) const flag = Array.from(container.querySelectorAll('.flag-item')).find( (item) => item.textContent?.includes('Track Account Latest Transaction'), ) expect(flag?.querySelector('.flag-status.disabled')).toBeInTheDocument() expect(flag?.querySelector('.flag-status')).toHaveTextContent('Disabled') }) }) describe('Multiple Flags', () => { it('handles multiple flags enabled simultaneously', () => { const account = { info: { flags: [ 'lsfGlobalFreeze', 'lsfDefaultRipple', 'lsfRequireDestTag', 'lsfNoFreeze', ], }, } const { container } = render( , ) const enabledFlags = container.querySelectorAll('.flag-status.enabled') // At least 4 should be enabled (the ones we set) // Note: Some inverted flags might also be enabled by default expect(enabledFlags.length).toBeGreaterThanOrEqual(4) }) }) describe('Flag Structure', () => { it('each flag has non-empty title, description, and status', () => { const account = { info: { flags: ['lsfGlobalFreeze'], }, } const { container } = render( , ) const flagItems = container.querySelectorAll('.flag-item') flagItems.forEach((item) => { // Each flag must have all three elements const title = item.querySelector('.flag-title') const desc = item.querySelector('.flag-desc') const status = item.querySelector('.flag-status') expect(title).toBeInTheDocument() expect(desc).toBeInTheDocument() expect(status).toBeInTheDocument() // And none should be empty expect(title?.textContent).not.toBe('') expect(desc?.textContent).not.toBe('') expect(status?.textContent).not.toBe('') }) }) }) describe('Edge Cases', () => { it('handles undefined flags array', () => { const account = { info: {}, } const { container } = render( , ) expect(screen.getByText('Flags')).toBeInTheDocument() const flagItems = container.querySelectorAll('.flag-item') expect(flagItems.length).toBe(16) }) it('handles missing info object', () => { const account = {} const { container } = render( , ) expect(screen.getByText('Flags')).toBeInTheDocument() const flagItems = container.querySelectorAll('.flag-item') expect(flagItems.length).toBe(16) }) it('handles empty account object', () => { const account = { info: { flags: [], }, } const { container } = render( , ) expect(screen.getByText('Flags')).toBeInTheDocument() const flagItems = container.querySelectorAll('.flag-item') expect(flagItems.length).toBe(16) }) }) }) ================================================ FILE: src/containers/Accounts/AccountSummary/test/SignersCard.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import i18n from '../../../../i18n/testConfigEnglish' import SignersCard from '../SignersCard' // Mock the Account component jest.mock('../../../shared/components/Account', () => ({ Account: ({ account, displayText }: any) => ( {displayText || account} ), })) const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) describe('SignersCard Component', () => { describe('Rendering', () => { it('renders the card with header', () => { const signers = [{ account: 'rSigner1', weight: 1 }] const { container } = render( , ) expect(screen.getByText('Signers')).toBeInTheDocument() expect(container.querySelector('.card-header')).toBeInTheDocument() expect(container.querySelector('.header-title')).toBeInTheDocument() }) it('renders a single signer', () => { const signers = [{ account: 'rSigner', weight: 1 }] const { container } = render( , ) expect(screen.getByTestId('account-rSigner')).toBeInTheDocument() const signerItems = container.querySelectorAll('.signer-item') expect(signerItems.length).toBe(1) }) it('renders multiple signers', () => { const signers = [ { account: 'rSigner1', weight: 1 }, { account: 'rSigner2', weight: 2 }, { account: 'rSigner3', weight: 3 }, ] const { container } = render( , ) expect(screen.getByTestId('account-rSigner1')).toBeInTheDocument() expect(screen.getByTestId('account-rSigner2')).toBeInTheDocument() expect(screen.getByTestId('account-rSigner3')).toBeInTheDocument() const signerItems = container.querySelectorAll('.signer-item') expect(signerItems.length).toBe(3) }) }) describe('Signer Weight', () => { it('displays signer weight when present', () => { const signers = [{ account: 'rSigner1', weight: 5 }] render( , ) expect(screen.getByText(/Weight/i)).toBeInTheDocument() expect(screen.getByText(/5/)).toBeInTheDocument() }) it('displays different weights for different signers', () => { const signers = [ { account: 'rSigner1', weight: 1 }, { account: 'rSigner2', weight: 3 }, { account: 'rSigner3', weight: 5 }, ] render( , ) expect(screen.getByText(/Weight.*1/)).toBeInTheDocument() expect(screen.getByText(/Weight.*3/)).toBeInTheDocument() expect(screen.getByText(/Weight.*5/)).toBeInTheDocument() }) it('does not display weight when undefined', () => { const signers = [{ account: 'rSigner1' }] const { container } = render( , ) expect(container.querySelector('.signer-weight')).not.toBeInTheDocument() }) it('displays weight of zero', () => { const signers = [{ account: 'rSigner1', weight: 0 }] render( , ) expect(screen.getByText(/Weight.*0/)).toBeInTheDocument() }) }) describe('Account Display', () => { it('uses shortened account address for display', () => { const longAccount = 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH' const signers = [{ account: longAccount, weight: 1 }] render( , ) // Should show shortened version: 7 chars...5 chars expect(screen.getByText(/rN7n7ot.*6fzRH/)).toBeInTheDocument() }) }) describe('Edge Cases', () => { it('handles empty signers array', () => { const signers: any[] = [] const { container } = render( , ) const signerItems = container.querySelectorAll('.signer-item') expect(signerItems.length).toBe(0) }) it('uses index as key when account is missing', () => { const signers = [{ weight: 1 } as any, { weight: 2 } as any] const { container } = render( , ) const signerItems = container.querySelectorAll('.signer-item') expect(signerItems.length).toBe(2) }) it('handles very large weights', () => { const signers = [{ account: 'rSigner1', weight: 999999 }] render( , ) expect(screen.getByText(/999,999/)).toBeInTheDocument() }) it('handles mix of signers with and without weights', () => { const signers = [ { account: 'rSigner1', weight: 1 }, { account: 'rSigner2' }, { account: 'rSigner3', weight: 3 }, ] const { container } = render( , ) const weights = container.querySelectorAll('.signer-weight') expect(weights.length).toBe(2) // Only two signers have weights }) }) describe('List Structure', () => { it('contains signers-list container', () => { const signers = [{ account: 'rSigner1', weight: 1 }] const { container } = render( , ) expect(container.querySelector('.signers-list')).toBeInTheDocument() }) it('each signer has signer-address element', () => { const signers = [ { account: 'rSigner1', weight: 1 }, { account: 'rSigner2', weight: 2 }, ] const { container } = render( , ) const addresses = container.querySelectorAll('.signer-address') expect(addresses.length).toBe(2) }) }) }) ================================================ FILE: src/containers/Accounts/AccountTransactionTable/AccountTransactionTable.tsx ================================================ import { useContext } from 'react' import { useTranslation } from 'react-i18next' import { useInfiniteQuery } from 'react-query' import { TransactionTable } from '../../shared/components/TransactionTable/TransactionTable' import { useAnalytics } from '../../shared/analytics' import SocketContext from '../../shared/SocketContext' import { getAccountTransactions } from '../../../rippled' import './styles.scss' export interface AccountTransactionsTableProps { accountId: string hasTokensColumn: boolean } export const AccountTransactionTable = ({ accountId, hasTokensColumn, }: AccountTransactionsTableProps) => { const { t } = useTranslation() const { trackException } = useAnalytics() const rippledSocket = useContext(SocketContext) const { data, error, isFetching: loading, fetchNextPage, hasNextPage, } = useInfiniteQuery( ['fetchTransactions', accountId], ({ pageParam = '' }) => getAccountTransactions( accountId, undefined, pageParam, undefined, rippledSocket, ).catch((errorResponse) => { const errorLocation = `account transactions ${accountId} at ${pageParam}` trackException(`${errorLocation} --- ${JSON.stringify(errorResponse)}`) throw new Error('get_account_transactions_failed') }), { getNextPageParam: (lastPage) => lastPage.marker, }, ) const transactions = data?.pages?.reduce( (allTransactions: any[], page: any) => page.transactions ? allTransactions.concat(page.transactions) : allTransactions, [], ) || [] const tryLoading = transactions.length === 0 && data?.pages[0]?.transactions const emptyMessage = tryLoading ? 'get_account_transactions_try' : error?.message return (

{t('transactions')}

fetchNextPage()} hasAdditionalResults={hasNextPage} />
) } ================================================ FILE: src/containers/Accounts/AccountTransactionTable/index.ts ================================================ export * from './AccountTransactionTable' ================================================ FILE: src/containers/Accounts/AccountTransactionTable/styles.scss ================================================ @use '../../shared/css/variables' as *; .transactions-header { @include bold; font-size: 20px; } @media (max-width: $tablet-portrait-upper-boundary) { .transactions-header { font-size: 18px; } } ================================================ FILE: src/containers/Accounts/AccountTransactionTable/test/AccountTransactionTable.test.tsx ================================================ import { render, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import i18n from '../../../../i18n/testConfig' import { AccountTransactionTable } from '../index' import TEST_TRANSACTIONS_DATA from './mockTransactions.json' import { getAccountTransactions } from '../../../../rippled' import { flushPromises, QuickHarness } from '../../../test/utils' import Mock = jest.Mock jest.mock('../../../../rippled', () => ({ __esModule: true, getAccountTransactions: jest.fn(), })) const TEST_ACCOUNT_ID = 'rTEST_ACCOUNT' describe('AccountTransactionsTable container', () => { beforeEach(() => { jest.resetModules() }) const renderComponent = ( getAccountTransactionsImpl: () => Promise = () => new Promise(() => {}), state = { hasToken: false }, ) => { ;(getAccountTransactions as Mock).mockImplementation( getAccountTransactionsImpl, ) return render( , ) } it('renders static parts', () => { const { container } = renderComponent() expect(container.querySelector('.transaction-table')).toBeInTheDocument() }) it('renders loader when fetching data', () => { const { container } = renderComponent() expect(container.querySelector('.loader')).toBeInTheDocument() }) it('renders dynamic content with transaction data', async () => { const { container } = renderComponent(() => Promise.resolve(TEST_TRANSACTIONS_DATA), ) await flushPromises() await waitFor(() => { expect(container.querySelector('.load-more-btn')).toBeInTheDocument() }) expect(container.querySelector('.col-token')).not.toBeInTheDocument() expect(container.querySelector('.transaction-table')).toBeInTheDocument() expect( container.querySelector('.transaction-li.transaction-li-header'), ).toBeInTheDocument() expect(container.querySelectorAll('a')).toHaveLength(60) await userEvent.click(container.querySelector('.load-more-btn')!) expect(getAccountTransactions).toHaveBeenCalledWith( TEST_ACCOUNT_ID, undefined, '44922483.5', undefined, undefined, ) }) it('renders error message when request fails', async () => { const { container } = renderComponent(() => Promise.reject()) await flushPromises() await waitFor(() => { expect(container.querySelector('.transaction-table')).toBeInTheDocument() expect( container.querySelector('.empty-transactions-message'), ).toHaveTextContent('get_account_transactions_failed') expect(container.querySelectorAll('a')).toHaveLength(0) }) }) it('renders dynamic content with transaction data and token column', async () => { const { container } = renderComponent( () => Promise.resolve(TEST_TRANSACTIONS_DATA), { hasToken: true }, ) await flushPromises() await waitFor(() => { expect(container.querySelectorAll('.col-token').length).toBeGreaterThan(0) expect(container.querySelector('.load-more-btn')).toBeInTheDocument() }) expect(container.querySelector('.transaction-table')).toBeInTheDocument() expect( container.querySelector('.transaction-li.transaction-li-header'), ).toBeInTheDocument() expect(container.querySelectorAll('a')).toHaveLength(60) await userEvent.click(container.querySelector('.load-more-btn')!) expect(getAccountTransactions).toHaveBeenCalledWith( TEST_ACCOUNT_ID, undefined, '44922483.5', undefined, undefined, ) }) it('renders error message when request fails with token column', async () => { const { container } = renderComponent(() => Promise.reject()) await flushPromises() await waitFor(() => { expect(container.querySelector('.transaction-table')).toBeInTheDocument() expect( container.querySelector('.empty-transactions-message'), ).toHaveTextContent('get_account_transactions_failed') expect(container.querySelectorAll('a')).toHaveLength(0) }) }) }) ================================================ FILE: src/containers/Accounts/AccountTransactionTable/test/mockTransactions.json ================================================ { "transactions": [ { "hash": "3247F0D70D9F241E58AA354B18B58175A466D16937CB3FE30FCD8D4027FAD850", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rENDnFwR3CPvrsPjD9XXeqVoXeVt2CpPWX", "index": 11, "fee": 0.0105, "sequence": 23906569, "date": "2019-02-08T15:42:11Z", "details": { "instructions": { "gets": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 3865.40088 }, "pays": { "currency": "XRP", "amount": 13450 }, "price": "0.287390", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" } } } }, { "hash": "3A23B3813BC69287085E2E617AD7647FE2ECD21D1965DFE559E286EAFD946F5F", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 4, "fee": 0.000012, "sequence": 2068714, "date": "2019-02-05T21:37:12Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.878992 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1878.6976023515 }, "price": "0.299973", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068713 } } }, { "hash": "14B9395AEEE9E852643F594CB2A2EBEFEB8AA30F6BBC56BA5032F25E493A16F4", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 4, "fee": 0.000012, "sequence": 2068713, "date": "2019-02-05T21:36:50Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879004 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.10009047646 }, "price": "0.300038", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068712 } } }, { "hash": "4EA4B4E19F094639A1B3A3BCCB0081798454A2467C88CC3E922543A5705D0E5B", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 10, "fee": 0.000012, "sequence": 2068712, "date": "2019-02-05T21:36:12Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879016 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.10009407692 }, "price": "0.300038", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068711 } } }, { "hash": "59A73A07268CFDAE15203BE2511C1E335BF25B2AC0FCB8B9038FBBB1C8D86F98", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 12, "fee": 0.000012, "sequence": 2068711, "date": "2019-02-05T21:35:50Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879028 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.10009767737 }, "price": "0.300038", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068710 } } }, { "hash": "A6344944C618693BAC684C022F5031746277E48C433E0286358F5FC7F8AFB217", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 5, "fee": 0.000012, "sequence": 2068710, "date": "2019-02-05T21:35:12Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.87904 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.10010127782 }, "price": "0.300038", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068709 } } }, { "hash": "CC65AE898497B495A79C28820AEED4D2FC31B7B3C8D0BE497976F05E24A132C3", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 0, "fee": 0.000012, "sequence": 2068709, "date": "2019-02-05T21:34:50Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879052 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.13179564093 }, "price": "0.300043", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068708 } } }, { "hash": "7BCD225D2887AFCC2BD21DFC6B47129B0AE259B4F1D39C5EB9BB53D56CF8E8B8", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 12, "fee": 0.000012, "sequence": 2068708, "date": "2019-02-05T21:34:12Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879064 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.54361824799 }, "price": "0.300109", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068707 } } }, { "hash": "4EA62D0D6EBFB79218590403F4C3DA218FB3B69F4E5FFBC836267F3E630FC0D1", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 6, "fee": 0.000012, "sequence": 2068707, "date": "2019-02-05T21:33:42Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879076 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.54362184929 }, "price": "0.300109", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068706 } } }, { "hash": "EA0361D428BB7596599E628ED63763A067A92CADC059DA53EDA8596CBA2103BF", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 9, "fee": 0.000012, "sequence": 2068706, "date": "2019-02-05T21:33:11Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879088 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.54362545059 }, "price": "0.300109", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068705 } } }, { "hash": "A5B54247D1A23EC0BB806FFFCE955491CBE5B4C9B3EB64813AD7B882588221D7", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 1, "fee": 0.000012, "sequence": 2068705, "date": "2019-02-05T21:32:50Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.8791 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.5436290519 }, "price": "0.300109", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068704 } } }, { "hash": "DCB4396B1BC5DF518D0039FD652E4A7E21E9B3BE14B902223BBFAA286BC9E1D4", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 6, "fee": 0.000012, "sequence": 2068704, "date": "2019-02-05T21:32:20Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879112 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.95574978003 }, "price": "0.300174", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068703 } } }, { "hash": "7650430669A544735AA241B51329C9F83F8345BD1A30A919CF7F1DC07896C86B", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 0, "fee": 0.000012, "sequence": 2068703, "date": "2019-02-05T21:31:42Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879124 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.54377656814 }, "price": "0.300109", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068702 } } }, { "hash": "78B5AA069348685F905B2CE9F7C7C442BADA49809F0F9DE0B733106702037B73", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 10, "fee": 0.000012, "sequence": 2068702, "date": "2019-02-05T21:31:12Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879136 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1879.53443693073 }, "price": "0.300107", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068701 } } }, { "hash": "B7BFFB364EF40F73505AEC9A46FCB6F17E758356CD0F35C728AF76882B9B46C7", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 7, "fee": 0.000012, "sequence": 2068701, "date": "2019-02-05T21:30:42Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879148 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1876.9546384819 }, "price": "0.299695", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068700 } } }, { "hash": "F9C475EE71EC3E0F9B44670E081CBCEE8FDDCB0E931904A3A9AB2183CE3B358F", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 11, "fee": 0.000012, "sequence": 2068700, "date": "2019-02-05T21:30:12Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.87916 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1876.94521140099 }, "price": "0.299694", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068699 } } }, { "hash": "DBB403BDB3C03EF8BC4182611B37372D81D94C28F7D05D4B455099135A8ABCBE", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 11, "fee": 0.000012, "sequence": 2068699, "date": "2019-02-05T21:29:42Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879172 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1876.94521499731 }, "price": "0.299694", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068698 } } }, { "hash": "80F5F46F46E647BBCF0CB17C2C733BF23CF0ACF5FD2A218AC75B10245F65FAC9", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 12, "fee": 0.000012, "sequence": 2068698, "date": "2019-02-05T21:29:20Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879184 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1876.94521859364 }, "price": "0.299694", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068697 } } }, { "hash": "1E38285ED0FE67CED7D2065D532A1EA42E62C57E2CF4E99204406596E6A5BB29", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 10, "fee": 0.000012, "sequence": 2068697, "date": "2019-02-05T21:28:42Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879196 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1876.91353188456 }, "price": "0.299689", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068696 } } }, { "hash": "EBAE468672FB083DC6A49EDCE853A9F65903FB2B3E7AC0498378C3B6BB542811", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 2, "fee": 0.000012, "sequence": 2068696, "date": "2019-02-05T21:28:20Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.879208 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1876.91353548082 }, "price": "0.299689", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068695 } } } ], "marker": "44922483.5" } ================================================ FILE: src/containers/Accounts/AccountTransactionTable/test/successfulAccountTx.json ================================================ { "result": { "account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "limit": 0, "transactions": [ { "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rPPbi1iNXmvY9HmJ9sH9g4gxvgVEfN4NaZ", "Balance": "316010893320", "Flags": 0, "OwnerCount": 0, "Sequence": 57083165 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1991E4EF8C9693AFFC9E200D112DFAD12449444CD8685FF859199B63B7C22341", "PreviousFields": { "Balance": "316014663320", "Sequence": 57083164 }, "PreviousTxnID": "ADD23A6189E86A345821A1FBC7A076A677E08947D9D09856E2BD2A8B5D2CF751", "PreviousTxnLgrSeq": 68995185 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBWpYJhuJWBPAkzJ4kYQqHShSkkF3rgeD", "Balance": "23750000", "Flags": 131072, "OwnerCount": 0, "Sequence": 199377 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "96F9BDDED4A0E0F33AD1B28CC202B0E8FA357F3FC8EB2F716FE25B49B9BBA7FA", "PreviousFields": { "Balance": "20000000" }, "PreviousTxnID": "3832CD380B8EF414B3504FC63B5B3A28EC24284183E8E759985A657710559847", "PreviousTxnLgrSeq": 68995265 } } ], "TransactionIndex": 54, "TransactionResult": "tesSUCCESS", "delivered_amount": "3750000" }, "tx": { "Account": "rPPbi1iNXmvY9HmJ9sH9g4gxvgVEfN4NaZ", "Amount": "3750000", "Destination": "rBWpYJhuJWBPAkzJ4kYQqHShSkkF3rgeD", "DestinationTag": 2471596944, "Fee": "20000", "Flags": 2147483648, "LastLedgerSequence": 68995327, "Sequence": 57083164, "SigningPubKey": "02CA41BA17A2CDE0E5B7BEA8FC97CA0E9A196DCD5F524E4CA44F1C38B610F4A054", "TransactionType": "Payment", "TxnSignature": "304402200478EDD72D70A452C72EEA4AA9F3A72E6E706A594A373C54AC31810B351ADC2502200E4F4D0960AE6AF7ED93878FD35582507ACAD38CF5509DFD2BE1C67CA3C93C46", "date": 695430982, "hash": "7D150D03E799748425B45B59CF2511ACA58795EEC393663702C302A57460C53D", "inLedger": 68995325, "ledger_index": 68995325 }, "validated": true } ], "used_postgres": true, "validated": true }, "status": "success", "type": "response" } ================================================ FILE: src/containers/Accounts/AccountsRouter.tsx ================================================ import { useContext } from 'react' import { Navigate, useParams } from 'react-router' import { useQuery } from 'react-query' import { isValidClassicAddress, isValidXAddress, xAddressToClassicAddress, } from 'ripple-address-codec' import SocketContext from '../shared/SocketContext' import { getAccountInfo } from '../../rippled/lib/rippled' import NoMatch from '../NoMatch' import { Accounts } from './index' import { ERROR_MESSAGES } from './Errors' import { Loader } from '../shared/components/Loader' import { Error } from '../../rippled/lib/utils' import { BAD_REQUEST } from '../shared/utils' import { buildPath } from '../shared/routing' import { AMM_POOL_ROUTE } from '../App/routes' import { getDeletedAMMData } from '../AMMPool/utils' const getErrorMessage = (error: any) => ERROR_MESSAGES[error] || ERROR_MESSAGES.default function renderError(error: any) { const message = getErrorMessage(error.code) return (
) } export const AccountsRouter = () => { const { id: accountId = '' } = useParams<{ id: string }>() const rippledSocket = useContext(SocketContext) const { data: comp, error } = useQuery([accountId], async () => { let classicAddress = accountId if (isValidXAddress(accountId)) { classicAddress = xAddressToClassicAddress(accountId).classicAddress } if (!isValidClassicAddress(classicAddress)) { throw new Error('account malformed', BAD_REQUEST) } try { const data = await getAccountInfo(rippledSocket, classicAddress) if (data.AMMID) { return ( ) } return } catch (responseError: any) { // Even if account info fails it might be a deleted account or deleted AMM if (responseError?.code === 404) { try { const deletedAmm = await getDeletedAMMData( rippledSocket, classicAddress, ) if (deletedAmm) { return ( ) } } catch (e) { // eslint-disable-next-line no-console console.error('Failed to check for deleted AMM pool:', e) } return } throw responseError } }) if (!accountId) { return ( ) } if (error) { return renderError(error) } return comp || } ================================================ FILE: src/containers/Accounts/Errors.tsx ================================================ import { BAD_REQUEST, NOT_FOUND } from '../shared/utils' export const ERROR_MESSAGES: { [index: string]: any } = {} ERROR_MESSAGES[NOT_FOUND] = { title: 'account_not_found', hints: ['check_account_id'], } ERROR_MESSAGES[BAD_REQUEST] = { title: 'invalid_xrpl_address', hints: ['check_account_id'], } ERROR_MESSAGES.default = { title: 'generic_error', hints: ['not_your_fault'], } ================================================ FILE: src/containers/Accounts/index.tsx ================================================ import { useContext, useEffect } from 'react' import { Helmet } from 'react-helmet-async' import { useQuery } from 'react-query' import { isValidClassicAddress, isValidXAddress } from 'ripple-address-codec' import { AccountTransactionTable } from './AccountTransactionTable' import './styles.scss' import { useAnalytics } from '../shared/analytics' import { useRouteParams } from '../shared/routing' import { ACCOUNT_ROUTE } from '../App/routes' import { BAD_REQUEST } from '../shared/utils' import { getAccountState } from '../../rippled' import SocketContext from '../shared/SocketContext' import { Loader } from '../shared/components/Loader' import { AccountSummary } from './AccountSummary' import { useXRPToUSDRate } from '../shared/hooks/useXRPToUSDRate' import AccountAsset from './AccountAsset' import AccountHeader from './AccountHeader' export const Accounts = () => { const { trackScreenLoaded, trackException } = useAnalytics() const { id: accountId = '' } = useRouteParams(ACCOUNT_ROUTE) const rippledSocket = useContext(SocketContext) const { data: account, isLoading } = useQuery( ['accountState', accountId], () => { if (!isValidClassicAddress(accountId) && !isValidXAddress(accountId)) { return Promise.reject(BAD_REQUEST) } return getAccountState(accountId, rippledSocket).catch((requestError) => { const status = requestError.code trackException( `ledger ${accountId} --- ${JSON.stringify(requestError)}`, ) return Promise.reject(status) }) }, ) useEffect(() => { trackScreenLoaded() return () => { window.scrollTo(0, 0) } }, [trackScreenLoaded]) const xrpToUSDRate = useXRPToUSDRate() const isAccountDeleted = account?.deleted === true // Show account data only after account.info is loaded and account isn't deleted const showAccount = !!account?.info && !isAccountDeleted return (
{accountId && ( <> {showAccount && ( <> )} {/* Show account transactions regardless of account delete status */} )} {isLoading && }
) } ================================================ FILE: src/containers/Accounts/styles.scss ================================================ @use '../shared/css/variables'; .accounts-page { .loader { min-height: 100px; } } ================================================ FILE: src/containers/Accounts/test/AccountsRouter.test.tsx ================================================ import { render, screen, waitFor } from '@testing-library/react' import { Route } from 'react-router' import i18n from '../../../i18n/testConfig' import { AccountsRouter } from '../AccountsRouter' import { QuickHarness } from '../../test/utils' import { ACCOUNT_ROUTE } from '../../App/routes' import * as rippled from '../../../rippled/lib/rippled' import * as ammUtils from '../../AMMPool/utils' import { Error as RippledError } from '../../../rippled/lib/utils' jest.mock('../../../rippled/lib/rippled') jest.mock('../../AMMPool/utils') jest.mock('../index', () => ({ __esModule: true, Accounts: () =>
Accounts Page
, })) const mockGetAccountInfo = rippled.getAccountInfo as jest.Mock const mockDetectDeletedAMM = ammUtils.getDeletedAMMData as jest.Mock describe('AccountsRouter', () => { const ACTIVE_AMM_ACCOUNT = 'rLjUKpwUVmz3vCTmFkXungxwzdoyrWRsFG' const DELETED_AMM_ACCOUNT = 'raxKnsu4ea6xoehws1tyvc7W2XPM5VcmJp' const REGULAR_ACCOUNT = 'rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM' const DELETED_ACCOUNT = 'rwGBCTYmPQ8NrfDVL5DdzS3aBbiXtbwngA' const renderRouter = (accountId: string) => render( } /> , ) beforeEach(() => { jest.clearAllMocks() }) it('redirects to /amm/:id when account has AMMID', async () => { mockGetAccountInfo.mockResolvedValue({ AMMID: '0422F98444F7B068C7EC6EEDAF11380E6A146F091639A29E09B3399C1F8A5341', Account: ACTIVE_AMM_ACCOUNT, }) renderRouter(ACTIVE_AMM_ACCOUNT) await waitFor(() => { // Navigate component redirects, so the Accounts page should NOT render expect(screen.queryByTestId('accounts-page')).not.toBeInTheDocument() }) }) it('renders Accounts page for a regular account', async () => { mockGetAccountInfo.mockResolvedValue({ Account: REGULAR_ACCOUNT, Balance: '1000000000', }) renderRouter(REGULAR_ACCOUNT) await waitFor(() => { expect(screen.getByTestId('accounts-page')).toBeInTheDocument() }) }) it('renders Accounts page for a deleted non-AMM account', async () => { const error = new RippledError('Account not found', 404) mockGetAccountInfo.mockRejectedValue(error) mockDetectDeletedAMM.mockResolvedValue(null) renderRouter(DELETED_ACCOUNT) await waitFor(() => { expect(screen.getByTestId('accounts-page')).toBeInTheDocument() }) }) it('redirects to /amm/:id for a deleted AMM pool', async () => { const error = new RippledError('Account not found', 404) mockGetAccountInfo.mockRejectedValue(error) mockDetectDeletedAMM.mockResolvedValue({ account: DELETED_AMM_ACCOUNT, asset: { currency: 'XRP' }, asset2: { currency: '504958454C530000000000000000000000000000', issuer: 'rNEQb5e4DZUJG48xKPstDWjmm1PQ4fcUfZ', }, lpToken: { currency: '0370963F20A61AF3C6E5D674EAAEE3E65C0BDC9F', issuer: DELETED_AMM_ACCOUNT, value: '2764439179.245265', }, deletionDate: 827617760, }) renderRouter(DELETED_AMM_ACCOUNT) await waitFor(() => { expect(mockDetectDeletedAMM).toHaveBeenCalled() // Navigate component redirects, so Accounts page should NOT render expect(screen.queryByTestId('accounts-page')).not.toBeInTheDocument() }) }) it('calls getDeletedAMMData only when account_info returns 404', async () => { mockGetAccountInfo.mockResolvedValue({ Account: REGULAR_ACCOUNT, Balance: '1000000000', }) renderRouter(REGULAR_ACCOUNT) await waitFor(() => { expect(screen.getByTestId('accounts-page')).toBeInTheDocument() }) expect(mockDetectDeletedAMM).not.toHaveBeenCalled() }) it('shows error for invalid account ID', async () => { renderRouter('not-a-valid-address') await waitFor(() => { // Should show NoMatch error for malformed address expect(screen.queryByTestId('accounts-page')).not.toBeInTheDocument() }) }) }) ================================================ FILE: src/containers/Accounts/test/index.test.tsx ================================================ import { render, screen, waitFor } from '@testing-library/react' import { Route } from 'react-router' import i18n from '../../../i18n/testConfig' import { Accounts } from '../index' import mockAccountState from './mockAccountState.json' import { QuickHarness } from '../../test/utils' import { ACCOUNT_ROUTE } from '../../App/routes' import { getAccountState } from '../../../rippled' import Mock = jest.Mock jest.mock('../../../rippled', () => ({ __esModule: true, getAccountState: jest.fn(), getAccountTransactions: jest.fn(() => []), })) jest.mock('../AccountHeader', () => ({ __esModule: true, default: () =>
Account Header
, })) jest.mock('../AccountSummary', () => ({ __esModule: true, AccountSummary: () => (
Account Summary
), })) jest.mock('../AccountAsset', () => ({ __esModule: true, default: () =>
Account Asset
, })) jest.mock('../AccountTransactionTable', () => ({ __esModule: true, AccountTransactionTable: () => (
Account Transaction Table
), })) const mockedGetAccountState = getAccountState as Mock describe('Account container', () => { const TEST_ACCOUNT_ID = 'rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM' const renderComponent = () => render( } /> , ) beforeEach(() => { jest.clearAllMocks() }) it('renders without crashing', () => { const { unmount } = renderComponent() unmount() }) it('renders static parts', async () => { mockedGetAccountState.mockImplementation(() => Promise.resolve(mockAccountState), ) renderComponent() await waitFor(() => { expect(screen.getByTestId('account-header')).toBeInTheDocument() expect(screen.getByTestId('account-summary')).toBeInTheDocument() expect(screen.getByTestId('account-asset')).toBeInTheDocument() expect( screen.getByTestId('account-transaction-table'), ).toBeInTheDocument() }) }) }) ================================================ FILE: src/containers/Accounts/test/mockAccountState.json ================================================ { "ledger_index": 46635258, "balances": { "XRP": 199.8175, "USD": 1234.56 }, "info": { "reserve": 20, "sequence": 12345, "domain": "example.com", "email_hash": "ABCDE1234", "flags": ["accountFlag1", "accountFlag2"] }, "paychannels": { "channels": [ { "id": "56E13047B746FC01101D377DE9E685F8695B2F41CAF910A0D5A672765EB4083F", "account": "rDqLfYdAdUQwTAZbybJVBiXRU7PQQYix2R", "destination": "rnbKqVFYk9Cnzj4q6VmY88hJR4cSmc9xGt", "amount": 10, "balance": 0, "settleDelay": 3600 }, { "id": "961241B79351346C8C4A49BFF02D3E5031A22E1F4DD1160C5964A9EB16772A53", "account": "rDqLfYdAdUQwTAZbybJVBiXRU7PQQYix2R", "destination": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN", "amount": 10, "balance": 0.05, "settleDelay": 3600 }, { "id": "9BC25651E7CE6766863A9CEB67B295CA4DD98E58E9CA91A09D8B36E43DFDE84C", "account": "rDqLfYdAdUQwTAZbybJVBiXRU7PQQYix2R", "destination": "rnbKqVFYk9Cnzj4q6VmY88hJR4cSmc9xGt", "amount": 10, "balance": 0, "settleDelay": 3600 }, { "id": "B1ADE97B75C4A5FBBDF99A97B91C6E74343AB36033B943E287BD344E9DBE1CED", "account": "rDqLfYdAdUQwTAZbybJVBiXRU7PQQYix2R", "destination": "rDy4ZNRAokcmHvD7fPazisKQsE7iq3tCQF", "amount": 10, "balance": 0.06, "settleDelay": 3600 } ], "total_available": 39.89 }, "signerList": { "quorum": 4, "max": 8, "signers": [ { "account": "re3LGjhrCvthtWWwrfKbVJjXN9PYDeQDJ", "weight": 1 }, { "account": "rkPA5RwLVPnJgpcsrzYvHwx1HVfDb6zD3", "weight": 1 }, { "account": "r9oLueGJ78wpDtx5R5Xtfx5P2fjFppcCuS", "weight": 1 }, { "account": "rGSxFjoqmWz54PycrgQBQ5dB6e7TUpMxzq", "weight": 1 }, { "account": "rHH2gS6XikKoEt9i1xAxEBvXLHKFr7oLn8", "weight": 1 }, { "account": "rLW75SfEdnGVsa3fTFkSaDTzXuFapwNYtf", "weight": 1 }, { "account": "rMY6Wm2RWQLN4d3Jjz15MKP74GJWVQE2pb", "weight": 1 }, { "account": "rP5xpZ5KzPih69fLhG3NYvZEDfLmSEViUk", "weight": 1 } ], "ledger_index": 46635258 }, "escrows": { "in": [ { "id": "04F57D5C7F5B660C187BB55227DFC703AEFE482AEA8EEAF4C7FA5ED9BFF3403E", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 200000000, "finishAfter": "2023-04-01T00:00:00Z" }, { "id": "05C1D23635030E7749CD6A1FB0ACE8F48A155313145397363B677254567F0051", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 100000000, "finishAfter": "2022-11-01T00:00:00Z" }, { "id": "18727F780D876DF637561802D38C97AA6C7BF9DA9266F9B95E0B9872808E4863", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 400000000, "finishAfter": "2023-03-01T00:00:00Z" }, { "id": "323ED5FADF59D6EB60E133D8AC630F56373A94A828FBCA40D8D2919F13EA6356", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 100000000, "finishAfter": "2023-03-01T00:00:00Z" }, { "id": "425D1D1DB7992B2F4D31DC3FA2598C09BE1527256F68E35CEB46FEEA53479F8A", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 200000000, "finishAfter": "2022-10-01T00:00:00Z" }, { "id": "4479E64BE345AFC083343800CEDEA82D1CAC3DEE0658E38E3972164654DFEA97", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 300000000, "finishAfter": "2022-10-01T00:00:00Z" }, { "id": "4C664D50C9C0F347947F9CEF3F9698F96660946E7118152579B1EFAC98D0DBCD", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 500000000, "finishAfter": "2023-05-01T00:00:00Z" }, { "id": "52458FA712939951ED53B3A8AA3EBBCDBC9FC50566E585457425214BD2799E73", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 300000000, "finishAfter": "2023-04-01T00:00:00Z" }, { "id": "66F054B5EF2DCA2B823837701E7D54387DE2EF71119A5663C3449A5E976BE484", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 100000000, "finishAfter": "2022-08-01T00:00:02Z" }, { "id": "94408416635DB67DC31DE418F13931F44A9B75C2FB5DCD4944AD5F267B6C4827", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 200000000, "finishAfter": "2022-09-01T00:00:00Z" }, { "id": "985CBFA00D2152052DE0C5058C276461D4D96363B1C1783488A070D7D579D889", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 300000000, "finishAfter": "2022-09-01T00:00:02Z" }, { "id": "9871AA7B5A34E98AA5207B637EFDDEDCA6DC39B8041A82FE9C1A2E2D2DD89AB6", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 400000000, "finishAfter": "2022-11-01T00:00:00Z" }, { "id": "987779E4922312332B021EF76422C6A10B6FA0BF2CDD610AF0DBE3ABA58D12CD", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 500000000, "finishAfter": "2023-02-01T00:00:00Z" }, { "id": "AE269A4700787F4519F13D54C1091613CF0CAC5E64AF4590CA779A680457B34B", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 500000000, "finishAfter": "2022-12-01T00:00:00Z" }, { "id": "E5FDC1D1E7BDB140B6F954074692546F1D7C95F780DDCE083B92E05CEC0EF471", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 500000000, "finishAfter": "2023-01-01T00:00:00Z" }, { "id": "F933D56AA2BBBB9F8E25961A495F2242813D04D73F89B3E0E7B56C333AEA4C3B", "account": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "destination": "rncKvRcdDq9hVJpdLdTcKoxsS3NSkXsvfM", "amount": 400000000, "finishAfter": "2022-08-01T00:00:00Z" } ], "out": [], "total": 5000000000, "totalIn": 5000000000, "totalOut": 0 } } ================================================ FILE: src/containers/Amendment/BarChartVoting.tsx ================================================ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { BarChart, Bar, XAxis, YAxis, Tooltip, TooltipProps, Label, ResponsiveContainer, // Text, // Cell, } from 'recharts' import { BLACK_600, GREEN_400, GREY_0, GREY_600, GREY_800, MAGENTA_700, } from '../shared/utils' interface Props { data: any } type ValueType = number | string | Array type NameType = number | string const CustomTooltip = ({ active, payload, label, }: TooltipProps) => { const { t } = useTranslation() if (active) { return (

{label}

{t('yeas_count', { yeas_count: payload ? payload[0].payload.yeas : 0, })}

{t('yeas_percent', { yeas_percent: payload ? payload[0].payload.yeas_percent.toFixed(2) : 0, })}

{t('nays_count', { nays_count: payload ? payload[0].payload.nays : 0, })}

{t('nays_percent', { nays_percent: payload ? payload[0].payload.nays_percent.toFixed(2) : 0, })}

) } return null } const CustomLegend = () => { const { t } = useTranslation() return (
{t('yeas')}
{t('nays')}
) } export const BarChartVoting = ({ data }: Props) => { const { t } = useTranslation() const [showTooltips, setShowTooltips] = useState(false) return (
setShowTooltips(true)} onMouseLeave={() => setShowTooltips(false)} /> setShowTooltips(true)} onMouseLeave={() => setShowTooltips(false)} />
) } ================================================ FILE: src/containers/Amendment/Simple.tsx ================================================ /* eslint-disable no-nested-ternary -- Disabled for this file */ import { useTranslation } from 'react-i18next' import { Link } from 'react-router' import { TRANSACTION_ROUTE } from '../App/routes' import { SimpleRow } from '../shared/components/Transaction/SimpleRow' import { useLanguage } from '../shared/hooks' import { RouteLink } from '../shared/routing' import { BREAKPOINTS, localizeDate } from '../shared/utils' import { AmendmentData, Voter } from '../shared/vhsTypes' interface validatorUNL { signing_key: string domain: string unl: string | false } interface SimpleProps { data: AmendmentData validators: Array width: number } const DATE_OPTIONS_AMENDMENT = { hour: 'numeric', minute: 'numeric', second: 'numeric', year: 'numeric', month: 'numeric', day: 'numeric', hour12: true, timeZone: 'UTC', } const DEFAULT_EMPTY_VALUE = '--' export const Simple = ({ data, validators, width }: SimpleProps) => { const { t } = useTranslation() const language = useLanguage() const voting = data.voted !== undefined const calculateUNLNays = (voted: Voter, all: Array): number => all.filter((val) => val.unl !== false).length - voted.validators.filter((val) => val.unl !== false).length const renderStatus = () => voting ? (
{`${t('not')} ${t('enabled')}`}
) : (
{t('enabled')}
) const renderDate = (date: string | null) => date ? localizeDate(new Date(date), language, DATE_OPTIONS_AMENDMENT) : DEFAULT_EMPTY_VALUE const renderRowIndex = () => voting ? ( <> {data.voted !== undefined && ( <> {data.voted.validators.length} {validators.length - data.voted.validators.length} { data.voted.validators.filter((voted) => voted.unl !== false) .length } {calculateUNLNays(data.voted, validators)} )} {data.eta ? ( {localizeDate(new Date(data.eta), language, DATE_OPTIONS_AMENDMENT)} ) : ( {t('voting')} )} {data.consensus} ) : data.tx_hash ? ( {' '} {renderDate(data.date)} ) : ( {renderDate(data.date)} ) const rowIndex = renderRowIndex() const details = `https://xrpl.org/known-amendments.html#${data.name.toLowerCase()}` return ( <>
{data.name} {data.id} {data.rippled_version ? ( {`v${data.rippled_version}`} ) : ( t('n_a') )} {voting ? ( {data.threshold} ) : ( data.tx_hash && ( {' '} {data.tx_hash} ) )} {details} {renderStatus()} {width < BREAKPOINTS.landscape && rowIndex}
{width >= BREAKPOINTS.landscape && (
{rowIndex}
)} ) } ================================================ FILE: src/containers/Amendment/Votes.tsx ================================================ import { useTranslation } from 'react-i18next' import { AmendmentData } from '../shared/vhsTypes' import SuccessIcon from '../shared/images/success.svg' import { RouteLink } from '../shared/routing' import { VALIDATOR_ROUTE } from '../App/routes' import { BarChartVoting } from './BarChartVoting' interface VotesProps { data: AmendmentData validators: Array } interface validatorUNL { pubkey: string signing_key: string domain: string unl: string | false } function compareValidators(a: validatorUNL, b: validatorUNL) { if (a.unl === false && b.unl !== false) { return 1 } if (a.unl !== false && b.unl === false) { return -1 } if (a.domain === null && b.domain !== null) { return 1 } if (a.domain !== null && b.domain === null) { return -1 } if (a.domain === null && b.domain === null) { return a.pubkey.localeCompare(b.pubkey) } // Compare non-null values by the 'name' field return a.domain.localeCompare(b.domain) } export const Votes = ({ data, validators }: VotesProps) => { const { t } = useTranslation() const voting = data.voted !== undefined const renderColumn = ( label: 'yeas' | 'nays', validatorsList: Array, ) => (
{t(label)}
{validatorsList.map((validator, index) => (
{index + 1} {validator.domain ? validator.domain : validator.pubkey} {validator.unl && ( )}
))}
) const getNays = () => validators .filter( (validator) => !data.voted?.validators.some( (voted) => voted.signing_key === validator.signing_key, ), ) .sort(compareValidators) const getYeas = () => validators .filter((validator) => data.voted?.validators.some( (voted) => voted.signing_key === validator.signing_key, ), ) .sort(compareValidators) const yeas = getYeas() const nays = getNays() const validatorsUNLCount = validators.filter( (val) => val.unl !== false, ).length const validatorsNonUNLCount = validators.filter( (val) => val.unl === false, ).length const aggregateVoting = () => [ { label: 'UNL', yeas: yeas.filter((val) => val.unl !== false).length, nays: nays.filter((val) => val.unl !== false).length, yeas_percent: (yeas.filter((val) => val.unl !== false).length / validatorsUNLCount) * 100, nays_percent: (nays.filter((val) => val.unl !== false).length / validatorsUNLCount) * 100, }, { label: 'non-UNL', yeas: yeas.filter((val) => val.unl === false).length, nays: nays.filter((val) => val.unl === false).length, yeas_percent: (yeas.filter((val) => val.unl === false).length / validatorsNonUNLCount) * 100, nays_percent: (nays.filter((val) => val.unl === false).length / validatorsNonUNLCount) * 100, }, ] const aggregate = aggregateVoting() return voting ? (
{aggregate && }
{renderColumn('yeas', yeas)} {renderColumn('nays', nays)}
{t('note')}: {t('indicate_unl')}
) : null } ================================================ FILE: src/containers/Amendment/amendment.scss ================================================ @use '../shared/css/variables' as *; @use '../shared/css/table'; .amendment-summary { width: 80%; max-width: 1200px; margin: auto; .simple-body { max-width: 1100px; } .type { display: inline-block; margin-top: 80px; margin-bottom: 32px; color: $white; font-size: 32px; @include for-size(tablet-portrait-up) { margin-top: 120px; margin-bottom: 64px; font-size: 42px; } @include bold; } .rows { padding-left: 0; } .label { margin-bottom: 0; font-weight: 600; } .index { width: 220px; } .badge { max-width: fit-content; margin: 0; color: $black-100 !important; text-transform: capitalize; &.voting { background-color: $black-30; } &.enabled { background-color: $green-60; } &.consensus { margin-top: 6px; background-color: $yellow-50; font-weight: 700 !important; } } .value { &.eta { &.no { color: $yellow-50 !important; } } } .note { .unl { display: inline-block; margin: 0 10px; color: $green-40; vertical-align: middle; } } .votes { max-width: 1200px; margin: 48px 0; .votes-columns { margin: 48px 0; @include for-size(desktop-up) { display: grid; gap: 48px; grid-template-columns: repeat(2, 1fr); } .label { @include bold; margin-bottom: 24px; font-size: 24px; text-transform: capitalize; } .votes-column { min-width: 0; max-width: 100%; flex: 1 1 0px; margin-top: 24px; .vals { background: $black-80; .row { display: flex; overflow: hidden; padding: 16px; border-bottom: 1px solid $black-70; white-space: nowrap; .val { overflow: hidden; max-width: fit-content; flex: 1; font-size: 14px; text-overflow: ellipsis; } .unl { margin-left: 8px; color: $green-40; } .index { max-width: 16px; margin-right: 24px; } } } } } } } ================================================ FILE: src/containers/Amendment/index.tsx ================================================ import { useContext } from 'react' import axios from 'axios' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { useWindowSize } from 'usehooks-ts' import { useRouteParams } from '../shared/routing' import { AMENDMENT_ROUTE } from '../App/routes' import NetworkContext from '../shared/NetworkContext' import { FETCH_INTERVAL_ERROR_MILLIS, FETCH_INTERVAL_VHS_MILLIS, NOT_FOUND, SERVER_ERROR, } from '../shared/utils' import { Simple } from './Simple' import { AmendmentData } from '../shared/vhsTypes' import Log from '../shared/log' import { Votes } from './Votes' import './amendment.scss' import NoMatch from '../NoMatch' import { useAnalytics } from '../shared/analytics' import { Loader } from '../shared/components/Loader' export const Amendment = () => { const network = useContext(NetworkContext) const { identifier = '' } = useRouteParams(AMENDMENT_ROUTE) const { width } = useWindowSize() const { t } = useTranslation() const { trackException } = useAnalytics() const ERROR_MESSAGES = { [NOT_FOUND]: { title: 'amendment_not_found', hints: ['check_amendment_key'], }, default: { title: 'generic_error', hints: ['not_your_fault'], }, } const getErrorMessage = (error: keyof typeof ERROR_MESSAGES | null) => (error && ERROR_MESSAGES[error]) || ERROR_MESSAGES.default const { data, error, isLoading: isAmendmentLoading, } = useQuery( ['fetchAmendmentData', identifier, network], async () => fetchAmendmentData(), { refetchInterval: (_) => FETCH_INTERVAL_VHS_MILLIS, refetchOnMount: true, enabled: !!network, }, ) const { data: validators, isLoading: isValidatorsLoading } = useQuery( ['fetchValidatorsData'], () => fetchValidatorsData(), { refetchInterval: (returnedData, _) => returnedData == null ? FETCH_INTERVAL_ERROR_MILLIS : FETCH_INTERVAL_VHS_MILLIS, refetchOnMount: true, enabled: process.env.VITE_ENVIRONMENT !== 'custom' || !!network, }, ) const fetchAmendmentData = async (): Promise => { const url = `${process.env.VITE_DATA_URL}/amendment/vote/${network}/${identifier}` return axios .get(url) .then((resp) => resp.data.amendment) .catch((axiosError) => { const status = axiosError.response && axiosError.response.status ? axiosError.response.status : SERVER_ERROR trackException(`${url} --- ${JSON.stringify(axiosError)}`) return Promise.reject(status) }) } const fetchValidatorsData = () => { const url = `${process.env.VITE_DATA_URL}/validators/${network}` return axios .get(url) .then((resp) => resp.data.validators) .then((vals) => vals.map((val) => ({ pubkey: val.validation_public_key, signing_key: val.signing_key, domain: val.domain, unl: val.unl, })), ) .catch((e) => Log.error(e)) } let body if (error) { const message = getErrorMessage(error) body = } else if (data?.id && validators instanceof Array) { body = ( <>
{t('amendment_summary')}
{data && validators && ( )}
{data && validators && } ) } return (
{(isValidatorsLoading || isAmendmentLoading) && } {body}
) } ================================================ FILE: src/containers/Amendment/test/AmendmentSummary.test.js ================================================ import { render, waitFor } from '@testing-library/react' import moxios from 'moxios' import { Route } from 'react-router' import { Amendment } from '..' import i18n from '../../../i18n/testConfig' import NetworkContext from '../../shared/NetworkContext' import { QuickHarness } from '../../test/utils' import { AMENDMENT_ROUTE } from '../../App/routes' import votingAmendment from './mockVotingAmendment.json' import validators from './mockValidatorsList.json' import { NOT_FOUND } from '../../shared/utils' jest.mock('usehooks-ts', () => ({ useWindowSize: () => ({ width: 375, height: 600, }), })) const MOCK_IDENTIFIER = votingAmendment.amendment.id describe('Amendments Page container', () => { const renderAmendment = () => render( } /> , ) const oldEnvs = process.env const { ResizeObserver } = window beforeEach(() => { moxios.install() process.env = { ...oldEnvs, VITE_ENVIRONMENT: 'mainnet' } window.ResizeObserver = jest.fn().mockImplementation(() => ({ observe: jest.fn(), unobserve: jest.fn(), disconnect: jest.fn(), })) }) afterEach(() => { moxios.uninstall() process.env = oldEnvs window.ResizeObserver = ResizeObserver }) it('renders without crashing', () => { renderAmendment() }) it('renders all parts for a voting amendment', async () => { moxios.stubRequest( `${process.env.VITE_DATA_URL}/amendment/vote/main/${MOCK_IDENTIFIER}`, { status: 200, response: votingAmendment, }, ) moxios.stubRequest(`${process.env.VITE_DATA_URL}/validators/main`, { status: 200, response: validators, }) const { container } = renderAmendment() await waitFor(() => { expect( container.querySelector('.amendment-summary .summary .type'), ).toBeInTheDocument() }) const rows = container.querySelectorAll( '.amendment-summary .simple-body .rows .row', ) expect(rows[0].querySelector('.value').outerHTML).toBe( '
mock-name
', ) expect(rows[1].querySelector('.value').outerHTML).toBe( '
mock-amendment-id
', ) expect(rows[2].querySelector('.value').outerHTML).toBe( '', ) expect(rows[3].querySelector('.value').outerHTML).toBe( '
3/4
', ) expect(rows[4].querySelector('.value a').outerHTML).toBe( 'https://xrpl.org/known-amendments.html#mock-name', ) expect(rows[5].querySelector('.value .badge').outerHTML).toBe( '
not enabled
', ) expect(rows[6].querySelector('.value').outerHTML).toBe( '
2
', ) expect(rows[7].querySelector('.value').outerHTML).toBe( '
4
', ) expect(rows[8].querySelector('.value').outerHTML).toBe( '
1
', ) expect(rows[9].querySelector('.value').outerHTML).toBe( '
3
', ) expect(rows[10].querySelector('.value').outerHTML).toBe( '
voting
', ) expect(rows[11].querySelector('.value').outerHTML).toBe( '
25%
', ) expect( container.querySelectorAll('.amendment-summary .barchart').length, ).toBe(1) expect( container.querySelectorAll( '.amendment-summary .votes .votes-columns .votes-column', ).length, ).toBe(2) const votesColumns = container.querySelectorAll( '.amendment-summary .votes .votes-columns .votes-column', ) expect(votesColumns[0].querySelectorAll('.vals .row').length).toBe(2) expect(votesColumns[1].querySelectorAll('.vals .row').length).toBe(4) }) it('renders 404 page on no match', async () => { moxios.stubRequest( `${process.env.VITE_DATA_URL}/amendment/vote/main/${MOCK_IDENTIFIER}`, { status: NOT_FOUND, response: votingAmendment, }, ) moxios.stubRequest(`${process.env.VITE_DATA_URL}/validators/main`, { status: 200, response: validators, }) const { container } = renderAmendment() await waitFor(() => { expect(container.querySelector('.no-match')).toBeInTheDocument() }) }) }) ================================================ FILE: src/containers/Amendment/test/mockValidatorsList.json ================================================ { "count": 6, "validators": [ { "validation_public_key": "pub1", "signing_key": "sign1", "domain": "domain1.com", "unl": "vl.ripple.com" }, { "validation_public_key": "pub2", "signing_key": "sign2", "domain": "domain2.com", "unl": false }, { "validation_public_key": "pub3", "signing_key": "sign3", "domain": "domain3.com", "unl": "vl.ripple.com" }, { "validation_public_key": "pub4", "signing_key": "sign4", "domain": "domain4.com", "unl": "vl.ripple.com" }, { "validation_public_key": "pub5", "signing_key": "sign5", "domain": "domain5.com", "unl": false }, { "validation_public_key": "pub6", "signing_key": "sign6", "domain": "domain6.com", "unl": "vl.ripple.com" } ] } ================================================ FILE: src/containers/Amendment/test/mockVotingAmendment.json ================================================ { "amendment": { "id": "mock-amendment-id", "name": "mock-name", "rippled_version": "1.12.0", "deprecated": false, "threshold": "3/4", "consensus": "25%", "voted": { "count": 2, "validators": [ { "signing_key": "sign1", "ledger_index": "index1", "unl": "vl.ripple.com" }, { "signing_key": "sign2", "ledger_index": "82658047", "unl": false } ] } } } ================================================ FILE: src/containers/Amendments/AmendmentsTable.tsx ================================================ import { FC } from 'react' import { useTranslation } from 'react-i18next' import { Link } from 'react-router' import { AMENDMENT_ROUTE, TRANSACTION_ROUTE } from '../App/routes' import { Loader } from '../shared/components/Loader' import { useLanguage } from '../shared/hooks' import { RouteLink } from '../shared/routing' import { localizeDate } from '../shared/utils' import { AmendmentData, Voter } from '../shared/vhsTypes' const DATE_OPTIONS_AMENDMENTS = { year: 'numeric', month: 'numeric', day: 'numeric', timeZone: 'UTC', } const DEFAULT_EMPTY_VALUE = '--' export const AmendmentsTable: FC<{ amendments: AmendmentData[] | undefined }> = ({ amendments }) => { const { t } = useTranslation() const language = useLanguage() const renderEnabled = (enabled: boolean) => enabled ? ( {t('yes')} ) : ( {t('no')} ) const renderOnTx = (amendment) => { if (amendment.voted) { if (amendment.eta) { const etaLocalized = localizeDate( new Date(amendment.eta), language, DATE_OPTIONS_AMENDMENTS, ) return (
{t('eta')}
{etaLocalized}
) } return {t('voting')} } if (amendment.date) { const dateLocalized = localizeDate( new Date(amendment.date), language, DATE_OPTIONS_AMENDMENTS, ) return amendment.tx_hash ? ( {dateLocalized} ) : ( {dateLocalized} ) } return DEFAULT_EMPTY_VALUE } const renderName = (name: string, id: string, deprecated: boolean) => deprecated ? (
{name} {t('deprecated')}
) : ( {name} ) const getVoter = (voted: Voter | undefined) => { if (!voted) return DEFAULT_EMPTY_VALUE return voted.validators.filter((val) => val.unl !== false).length } const renderAmendment = (amendment, index) => ( {index + 1} {amendment.rippled_version ? ( {amendment.rippled_version} ) : ( DEFAULT_EMPTY_VALUE )} {amendment.id} {renderName(amendment.name, amendment.id, amendment.deprecated)} {getVoter(amendment.voted)} {amendment.threshold ?? DEFAULT_EMPTY_VALUE} {amendment.consensus ?? DEFAULT_EMPTY_VALUE} {renderEnabled(!amendment.deprecated && amendment.voted === undefined)} {renderOnTx(amendment)} ) const content = amendments ? ( {amendments.map(renderAmendment)}
# {t('Version')} {t('amendment_id')} {t('amendment_name')} {`${t('unl')} ${t('voters')}`} {t('threshold')} {t('consensus')} {t('enabled')} {t('on_tx')}
) : ( ) return
{content}
} ================================================ FILE: src/containers/Amendments/amendmentsTable.scss ================================================ @use '../shared/css/variables' as *; @use '../shared/css/table'; .amendments-page { .summary { padding: 0 16px; margin-top: 100px; @include for-size(tablet-portrait-up) { padding: 0; } .type { display: inline-block; padding-bottom: 24px; color: $white; font-size: 32px; @include for-size(tablet-portrait-up) { font-size: 42px; } @include bold; } } .wrap { overflow: auto; width: 100%; max-width: 1500px; min-height: 150px; margin: auto; } } .amendments-table { position: relative; table { .incoming { background: rgba($green-90, 0.7); } .eta-label { font-weight: 700; text-transform: uppercase; } .name { max-width: 120px; @include for-size(tablet-portrait-up) { max-width: 180px; } @include for-size(desktop-up) { max-width: 280px; } } .amendment-id { display: none; max-width: 120px; @include for-size(desktop-up) { display: table-cell; padding-right: 3%; } } .name-deprecated { display: flex; overflow: hidden; align-items: center; gap: 6px; @include for-size(tablet-portrait-up) { gap: 12px; } .name-text { overflow: hidden; max-width: fit-content; flex: 1; text-overflow: ellipsis; } .deprecated { overflow: hidden; max-width: 60%; font-size: 12px; text-overflow: ellipsis; text-transform: uppercase; &.badge { border: 1px solid $black-30; background-color: $black-80; color: $black-30; } } } .version, .enabled, .consensus { max-width: 70px; overflow-wrap: break-word; @include for-size(tablet-portrait-up) { max-width: 100px; } } } .badge { margin: 0; color: $black-100; text-transform: uppercase; &.yes { background-color: $green-60; } &.no { background-color: $black-30; } } .voting { margin-left: 0; color: $yellow-50; } .voters, .threshold { display: none; max-width: 70px; @include for-size(desktop-up) { display: table-cell; } } .count { display: none; @include for-size(tablet-portrait-up) { display: table-cell; } } } ================================================ FILE: src/containers/Amendments/index.tsx ================================================ import axios from 'axios' import { useContext } from 'react' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import Log from '../shared/log' import NetworkContext from '../shared/NetworkContext' import { FETCH_INTERVAL_ERROR_MILLIS, FETCH_INTERVAL_VHS_MILLIS, } from '../shared/utils' import { AmendmentsTable } from './AmendmentsTable' import './amendmentsTable.scss' export const Amendments = () => { const network = useContext(NetworkContext) const { t } = useTranslation() const { data } = useQuery( ['fetchNetworkAmendmentsData'], async () => fetchData(), { refetchInterval: (returnedData, _) => returnedData == null ? FETCH_INTERVAL_ERROR_MILLIS : FETCH_INTERVAL_VHS_MILLIS, refetchOnMount: true, enabled: !!network, }, ) const fetchData = async () => axios .get(`${process.env.VITE_DATA_URL}/amendments/vote/${network}`) .then((resp) => resp.data.amendments) .then((amendments) => amendments.sort((a, b) => { if (a.eta && !b.eta) return -1 if (!a.eta && b.eta) return 1 if (a.voted && !b.voted) return -1 if (!a.voted && b.voted) return 1 return 0 }), ) .catch((e) => Log.error(e)) return (
{t('amendments')}
) } ================================================ FILE: src/containers/Amendments/test/amendments.test.js ================================================ import { render, waitFor } from '@testing-library/react' import moxios from 'moxios' import { Route } from 'react-router' import i18n from '../../../i18n/testConfig' import { Amendments } from '../index' import NetworkContext from '../../shared/NetworkContext' import { QuickHarness } from '../../test/utils' import { AMENDMENTS_ROUTE } from '../../App/routes' import amendmentsRaw from './mockAmendments.json' jest.mock('usehooks-ts', () => ({ useWindowSize: () => ({ width: 375, height: 600, }), })) describe('Amendments Page container', () => { const renderAmendments = () => render( } /> , ) const oldEnvs = process.env beforeEach(() => { moxios.install() process.env = { ...oldEnvs, VITE_ENVIRONMENT: 'mainnet' } }) afterEach(() => { moxios.uninstall() process.env = oldEnvs }) it('renders without crashing', () => { renderAmendments() }) it('renders all parts', async () => { moxios.stubRequest(`${process.env.VITE_DATA_URL}/amendments/vote/main`, { status: 200, response: amendmentsRaw, }) const { container } = renderAmendments() expect(container.querySelectorAll('.amendments-table').length).toBe(1) expect(container.querySelector('.type').outerHTML).toBe( '
amendments
', ) await waitFor(() => { expect( container.querySelectorAll('.amendments-table table tr').length, ).toBe(amendmentsRaw.amendments.length + 1) }) const rows = container.querySelectorAll('.amendments-table table tr') // Test voting amendment row. expect(rows[2].querySelector('.version').outerHTML).toBe( '1.12.0', ) expect(rows[2].querySelector('.count').outerHTML).toBe( '2', ) expect(rows[2].querySelector('.amendment-id').outerHTML).toBe( '56B241D7A43D40354D02A9DC4C8DF5C7A1F930D92A9035C4E12291B3CA3E1C2B', ) expect(rows[2].querySelector('.name .name-text').outerHTML).toBe( 'Clawback', ) expect(rows[2].querySelector('.voters').outerHTML).toBe( '4', ) expect(rows[2].querySelector('.enabled').outerHTML).toBe( 'no', ) expect(rows[2].querySelector('.on_tx').outerHTML).toBe( 'voting', ) // Test enabled amendment row. expect(rows[4].querySelector('.version').outerHTML).toBe( '1.10.0', ) expect(rows[4].querySelector('.count').outerHTML).toBe( '4', ) expect(rows[4].querySelector('.amendment-id').outerHTML).toBe( '75A7E01C505DD5A179DFE3E000A9B6F1EDDEB55A12F95579A23E15B15DC8BE5A', ) expect(rows[4].querySelector('.name .name-text').outerHTML).toBe( 'ImmediateOfferKilled', ) expect(rows[4].querySelector('.enabled').outerHTML).toBe( 'yes', ) expect(rows[4].querySelector('.on_tx').outerHTML).toBe( '8/21/2023', ) }) }) ================================================ FILE: src/containers/Amendments/test/amendmentsTable.test.js ================================================ import { render } from '@testing-library/react' import { BrowserRouter as Router } from 'react-router' import { I18nextProvider } from 'react-i18next' import i18n from '../../../i18n/testConfig' import { AmendmentsTable } from '../AmendmentsTable' import amendmentsRaw from './mockAmendments.json' /* eslint-disable react/jsx-props-no-spreading */ const renderAmendmentsTable = (props = {}) => render( , ) describe('Amendments table', () => { it('renders without crashing', () => { renderAmendmentsTable() }) it('renders all parts', () => { const { container } = renderAmendmentsTable({ amendments: amendmentsRaw.amendments, }) expect(container.querySelectorAll('tr').length).toBe( amendmentsRaw.amendments.length + 1, ) }) }) ================================================ FILE: src/containers/Amendments/test/mockAmendments.json ================================================ { "amendments": [ { "id": "2E2FB9CF8A44EB80F4694D38AADAE9B8B7ADAFD2F092E10068E61C98C4F092B0", "ledger_index": 81986305, "tx_hash": "EFE82B7155CE5B766AF343D98DAE6662C2713C99E760D610370D02338881B2F3", "date": "2023-08-21T05:59:11.000Z", "name": "fixUniversalNumber", "rippled_version": "1.10.0", "deprecated": false }, { "id": "75A7E01C505DD5A179DFE3E000A9B6F1EDDEB55A12F95579A23E15B15DC8BE5A", "ledger_index": 81986305, "tx_hash": "65B8A4068B20696A866A07E5668B2AEB0451564E13B79421356FB962EC9A536B", "date": "2023-08-21T05:59:11.000Z", "name": "ImmediateOfferKilled", "rippled_version": "1.10.0", "deprecated": false }, { "id": "8CC0774A3BF66D1D22E76BBDA8E8A232E6B6313834301B3B23E8601196AE6455", "name": "AMM", "rippled_version": "1.12.0", "deprecated": false, "threshold": "28/35", "consensus": "2.86%", "voted": { "count": 10, "validators": [ { "signing_key": "n9J2qUgyFNvhmCQTh6vDe6rhtwAregTnP3SZbSFaUamdBH3X1RMw", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9L7m2qvpDm4Jc7vBpW2gb5TJEbj1UNDxWyiYX91c2wBCWHknnA5", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9LbM9S5jeGopF5J1vBDoGxzV6rNS8K1T5DzhNynkFLqR9N2fywX", "ledger_index": "83151615", "unl": "vl.ripple.com" }, { "signing_key": "n94NK1FSM9d6wkMsUhzPVPPGPzNxcEJNV5LguNoFRAa7V2o4Vmpf", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9JiUqAXcHFzNFtdJ9uYeNZsdJTs1LGf4zr98bN7mWHxdtDpijAB", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9MvZFp2pmgNrNffcVF2YLnFi6W3SjXcgeei7PqggfB94UUkxcFC", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9L8gNy4bXu8P8hR4wCPFvpomr6rtTRMUT5nX8jiYUVZD1oQ1dx5", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9JebyUXwBa5GoYJQ6AbupoMKyE2zaiR3FTfDTMkxpMMv1KPmQEn", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9LkKWDtnHvmauvBXC3xqaG2G8QMcFAAvRFbJLT5maBv7SwQnd9p", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9MxDjQMr1DkzW3Z5X1guKJq4QNDEeYFPgqGgHfpzerGbHWGZvj4", "ledger_index": "83151615", "unl": false } ] } }, { "id": "56B241D7A43D40354D02A9DC4C8DF5C7A1F930D92A9035C4E12291B3CA3E1C2B", "name": "Clawback", "rippled_version": "1.12.0", "deprecated": false, "threshold": "28/35", "consensus": "11.43%", "voted": { "count": 17, "validators": [ { "signing_key": "n94aSAP9QcYtmKxgCTxcv3xeD2cB6tuwH3mNDQzrjAQ5DTu7SfZi", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9Kto4YT6BqYbz5CYDqU8pqmw7k1dZD9eUrTt3CppAh5Vo2HmUct", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9LHt3x8EhVWatBKuEWYNBas1jxiAdsxtP5QtohtcPZgRUan4Jgi", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9LoWo183FhqjMznQ6aLNhWZ1gJvQdrnFq2QQn7wPgeZtvuPm68j", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9L7m2qvpDm4Jc7vBpW2gb5TJEbj1UNDxWyiYX91c2wBCWHknnA5", "ledger_index": "83151615", "unl": false }, { "signing_key": "n94a894ARPe5RdcaRgdMBB9gG9ukS5mqsd7q2oNmC1NKqtZqEJnb", "ledger_index": "83151615", "unl": "vl.ripple.com" }, { "signing_key": "n94NK1FSM9d6wkMsUhzPVPPGPzNxcEJNV5LguNoFRAa7V2o4Vmpf", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9JiUqAXcHFzNFtdJ9uYeNZsdJTs1LGf4zr98bN7mWHxdtDpijAB", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9LkAv98aaGupypuLMH5ogjJ3rTEX178s9EnmRvmySL9k3cVuxTu", "ledger_index": "83151615", "unl": "vl.ripple.com" }, { "signing_key": "n9MvZFp2pmgNrNffcVF2YLnFi6W3SjXcgeei7PqggfB94UUkxcFC", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9L8gNy4bXu8P8hR4wCPFvpomr6rtTRMUT5nX8jiYUVZD1oQ1dx5", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9LkKWDtnHvmauvBXC3xqaG2G8QMcFAAvRFbJLT5maBv7SwQnd9p", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9MaaevqYJSUezZuqSmVps7NeDrs6TEbRFcm3ZG2tjJHNCY6gv4p", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9MxDjQMr1DkzW3Z5X1guKJq4QNDEeYFPgqGgHfpzerGbHWGZvj4", "ledger_index": "83151615", "unl": false }, { "signing_key": "n9KaxgJv69FucW5kkiaMhCqS6sAR1wUVxpZaZmLGVXxAcAse9YhR", "ledger_index": "83151615", "unl": "vl.ripple.com" }, { "signing_key": "n9JvsY3yhCdsHe3JsVTwvCtvKnchg2eridHLWdBdWf8VkpZSqqS9", "ledger_index": "83151615", "unl": "vl.ripple.com" }, { "signing_key": "n94rGrfuwvYTS1HEeWboW2nGvAQgVDpiD8id2pLWSHFVggBRpQRE", "ledger_index": "83151615", "unl": false } ] } } ] } ================================================ FILE: src/containers/App/App.tsx ================================================ import { Outlet } from 'react-router' import { FC, memo } from 'react' import './app.scss' import { SocketProvider } from '../shared/SocketContext' import { NetworkProvider } from '../shared/NetworkContext' import { Header } from '../Header' import { TooltipProvider } from '../shared/components/Tooltip' // memoize to prevent react-router from creating a new socket ever single time a rew route is loaded export const App: FC<{ rippledUrl: string }> = memo( ({ rippledUrl }: { rippledUrl: string }) => (
), ) ================================================ FILE: src/containers/App/AppErrorBoundary.tsx ================================================ import { Component, ErrorInfo, PropsWithChildren } from 'react' import { analytics } from '../shared/analytics' export type AppErrorBoundaryProps = PropsWithChildren<{}> /** * Needs to be a class due to React not having a componentDidCatch hook equivalent. */ class AppErrorBoundary extends Component { componentDidCatch(error: Error, info: ErrorInfo) { analytics.trackException( `${error.toString()} -------->>>>> ${info.componentStack}`, ) } render() { const { children } = this.props return children } } export default AppErrorBoundary ================================================ FILE: src/containers/App/app.scss ================================================ @use '../shared/css/variables' as *; .app { flex-grow: 1; .content { position: relative; display: flex; width: 100%; min-height: 100%; flex-direction: column; justify-content: center; margin-bottom: 50px; @include for-size(desktop-up) { min-height: $min-height; } } .content, .footer { min-width: $min-width; } } ================================================ FILE: src/containers/App/featureFlags.ts ================================================ export const FEATURE_VAULTS_PAGE = false ================================================ FILE: src/containers/App/index.tsx ================================================ import { Route, useLocation, Routes, Navigate } from 'react-router' import { Helmet, HelmetProvider } from 'react-helmet-async' import { QueryClientProvider } from 'react-query' import { useTranslation } from 'react-i18next' import Footer from '../Footer' import './app.scss' import { App } from './App' import CustomNetworkHome from '../CustomNetworkHome' import AppErrorBoundary from './AppErrorBoundary' import NoMatch from '../NoMatch' import { queryClient } from '../shared/QueryClient' import { AnalyticsSetPath, useAnalytics } from '../shared/analytics' import { RouteDefinition } from '../shared/routing' import { ACCOUNT_ROUTE, LEDGER_ROUTE, LEDGERS_ROUTE, NFT_ROUTE, TOKEN_ROUTE, TRANSACTION_ROUTE, VALIDATOR_ROUTE, AMENDMENTS_ROUTE, AMENDMENT_ROUTE, MPT_ROUTE, VAULT_ROUTE, NODES_ROUTE, VALIDATORS_ROUTE, UPGRADE_STATUS_ROUTE, TOKENS_ROUTE, VAULTS_ROUTE, AMM_RANKINGS_ROUTE, AMM_POOL_ROUTE, SEARCH_RESULT_ROUTE, } from './routes' import { LedgersPage as Ledgers } from '../Ledgers' import { Ledger } from '../Ledger' import { AccountsRouter } from '../Accounts/AccountsRouter' import { Transaction } from '../Transactions' import { Validator } from '../Validators' import { IOU } from '../Token/IOU' import { NFT } from '../NFT/NFT' import { legacyRedirect } from './legacyRedirects' import { useCustomNetworks } from '../shared/hooks' import { Amendments } from '../Amendments' import { Amendment } from '../Amendment' import { MPT } from '../Token/MPT' import { Nodes } from '../Network/Nodes' import { Validators } from '../Network/Validators' import { UpgradeStatus } from '../Network/UpgradeStatus' import { Tokens } from '../Tokens' import { TokenNonMain } from '../TokenNonMain' import { Vault } from '../Vault' import { Vaults } from '../Vaults' import { AMMPool } from '../AMMPool' import { AMMRankings } from '../AMMRankings' import SearchResult from '../SearchResult' import { FEATURE_VAULTS_PAGE } from './featureFlags' export const AppWrapper = () => { const mode = process.env.VITE_ENVIRONMENT const { setGlobals } = useAnalytics() const [customNetworks = [], setCustomNetworks] = useCustomNetworks() const { t } = useTranslation() const location = useLocation() setGlobals({ network: mode, }) const rippledUrl = mode === 'custom' ? location.pathname.split('/')[1] : '' const basename = mode === 'custom' ? `/${rippledUrl}` : '' const updatePath = (path) => `${basename}${path}` if (rippledUrl && !customNetworks.includes(rippledUrl)) { setCustomNetworks(customNetworks.concat([rippledUrl]).sort()) } // Defined here rather than ./routes to avoid circular dependencies when using RouteDefinitions with . const routes = ( [ [LEDGERS_ROUTE, Ledgers], [LEDGER_ROUTE, Ledger], [ACCOUNT_ROUTE, AccountsRouter], [TRANSACTION_ROUTE, Transaction], [NODES_ROUTE, Nodes], [VALIDATORS_ROUTE, Validators], [UPGRADE_STATUS_ROUTE, UpgradeStatus], [AMENDMENTS_ROUTE, Amendments], [VALIDATOR_ROUTE, Validator], [TOKEN_ROUTE, mode === 'mainnet' ? IOU : TokenNonMain], [TOKENS_ROUTE, Tokens], [NFT_ROUTE, NFT], [AMENDMENT_ROUTE, Amendment], [MPT_ROUTE, MPT], [VAULT_ROUTE, Vault], [AMM_POOL_ROUTE, AMMPool], mode === 'mainnet' && [AMM_RANKINGS_ROUTE, AMMRankings], FEATURE_VAULTS_PAGE && [VAULTS_ROUTE, Vaults], [SEARCH_RESULT_ROUTE, SearchResult], ] as (false | [RouteDefinition, any])[] ).filter(Boolean) as [RouteDefinition, any][] const redirect = legacyRedirect(basename, location) return (
{/* Start: Redirects */} {/* Ensures redirects happen without loading other routes. Specifically for hash routes */} {redirect && ( } /> )} } /> } /> } /> } /> {/* End: Redirects */} {mode === 'custom' && ( } /> )} }> {routes.map(([route, Component]) => ( } /> ))} } />
) } ================================================ FILE: src/containers/App/legacyRedirects.tsx ================================================ import { useLocation } from 'react-router' export const legacyRedirect = ( basename, location: ReturnType, ): string | null => { if (location.hash && location.pathname === `${basename}/`) { if (location.hash.indexOf('#/transactions/') === 0) { const identifier = location.hash.split('#/transactions/')[1] return `${basename}/transactions/${identifier}` } if (location.hash.indexOf('#/graph') === 0) { const identifier = location.hash.split('#/graph/')[1] if (identifier) { return `${basename}/accounts/${identifier}` } return `${basename}/` } } return null } ================================================ FILE: src/containers/App/navigation.ts ================================================ import { buildPath } from '../shared/routing' import { NavigationMenuAnyRoute } from '../Header/NavigationMenu' import { AMENDMENTS_ROUTE, LEDGERS_ROUTE, NODES_ROUTE, TOKENS_ROUTE, UPGRADE_STATUS_ROUTE, VALIDATORS_ROUTE, VAULTS_ROUTE, AMM_RANKINGS_ROUTE, } from './routes' import { FEATURE_VAULTS_PAGE } from './featureFlags' const isNetwork = (path) => path.indexOf(buildPath(VALIDATORS_ROUTE, {})) === 0 || path.indexOf(buildPath(NODES_ROUTE, {})) === 0 || path.indexOf(buildPath(UPGRADE_STATUS_ROUTE, {})) === 0 || path.indexOf(buildPath(AMENDMENTS_ROUTE, {})) === 0 const isLedgers = (path: string) => path === '/' const isTokens = (path) => path.indexOf(buildPath(TOKENS_ROUTE, {})) === 0 const isVaults = (path) => path.indexOf(buildPath(VAULTS_ROUTE, {})) === 0 const isAMMs = (path) => path.indexOf(buildPath(AMM_RANKINGS_ROUTE, {})) === 0 // NOTE: for submenus, remove `path` field and add `children` array of objects export const navigationConfig: NavigationMenuAnyRoute[] = [ { route: LEDGERS_ROUTE, title: 'explorer', current: (path: string) => isLedgers(path), }, process.env.VITE_ENVIRONMENT === 'mainnet' && { route: TOKENS_ROUTE, title: 'tokens', current: (path: string) => isTokens(path), }, FEATURE_VAULTS_PAGE && process.env.VITE_ENVIRONMENT === 'mainnet' && { route: VAULTS_ROUTE, title: 'vaults', current: (path: string) => isVaults(path), }, process.env.VITE_ENVIRONMENT === 'mainnet' && { route: AMM_RANKINGS_ROUTE, title: 'amms', current: (path: string) => isAMMs(path), }, { title: 'network', current: (path: string) => isNetwork(path), children: [ { route: NODES_ROUTE, title: 'nodes', current: (path: string) => isNetwork(path), }, { route: VALIDATORS_ROUTE, title: 'validators', current: (path: string) => isNetwork(path), }, { route: UPGRADE_STATUS_ROUTE, title: 'upgrade_status', current: (path: string) => isNetwork(path), }, { route: AMENDMENTS_ROUTE, title: 'amendments', current: (path: string) => isNetwork(path), }, ], }, { link: 'https://xrpl.org', title: 'xrpl_org', }, { link: 'https://github.com/ripple/explorer', title: 'github', }, ].filter(Boolean) as NavigationMenuAnyRoute[] ================================================ FILE: src/containers/App/routes.ts ================================================ import { RouteDefinition } from '../shared/routing' export const ACCOUNT_ROUTE: RouteDefinition<{ id?: string tab?: 'assets' | 'transactions' assetType?: 'issued' | 'nfts' | 'mpts' }> = { path: '/accounts/:id?/:tab?/:assetType?', } export const LEDGERS_ROUTE: RouteDefinition = { path: '/', } export const LEDGER_ROUTE: RouteDefinition<{ identifier: number | string }> = { path: `/ledgers/:identifier`, } export const NODES_ROUTE: RouteDefinition = { path: '/network/nodes', } export const VALIDATORS_ROUTE: RouteDefinition<{ tab?: 'uptime' | 'voting' }> = { path: '/network/validators/:tab?', } export const UPGRADE_STATUS_ROUTE: RouteDefinition = { path: '/network/upgrade-status', } export const NFT_ROUTE: RouteDefinition<{ id: string tab?: 'transactions' | 'buy-offers' | 'sell-offers' }> = { path: '/nft/:id/:tab?', } export const TOKEN_ROUTE: RouteDefinition<{ token: string }> = { path: `/token/:token`, } export const TRANSACTION_ROUTE: RouteDefinition<{ identifier: string tab?: 'simple' | 'detailed' | 'raw' }> = { path: `/transactions/:identifier?/:tab?`, } export const VALIDATOR_ROUTE: RouteDefinition<{ identifier: string tab?: 'details' | 'history' | 'voting' }> = { path: `/validators/:identifier/:tab?`, } export const AMENDMENTS_ROUTE: RouteDefinition = { path: '/amendments', } export const TOKENS_ROUTE: RouteDefinition = { path: '/tokens', } export const AMENDMENT_ROUTE: RouteDefinition<{ identifier: string }> = { path: `/amendment/:identifier`, } export const MPT_ROUTE: RouteDefinition<{ id: string }> = { path: '/mpt/:id', } export const VAULT_ROUTE: RouteDefinition<{ id: string }> = { path: '/vault/:id', } export const VAULTS_ROUTE: RouteDefinition = { path: '/vaults', } export const AMM_RANKINGS_ROUTE: RouteDefinition = { path: '/amms', } export const AMM_POOL_ROUTE: RouteDefinition<{ id: string tab?: 'transactions' | 'dex-trades' | 'deposits' | 'withdrawals' | 'holders' }> = { path: '/amm/:id/:tab?', } export const SEARCH_RESULT_ROUTE: RouteDefinition<{ id: string }> = { path: '/search/:id', } ================================================ FILE: src/containers/App/test/App.test.jsx ================================================ import { render, cleanup, waitFor } from '@testing-library/react' import moxios from 'moxios' import { MemoryRouter } from 'react-router' import { I18nextProvider } from 'react-i18next' import { XrplClient } from 'xrpl-client' import i18n from '../../../i18n/testConfig' import { AppWrapper } from '../index' import MockWsClient from '../../test/mockWsClient' import { getAccountInfo } from '../../../rippled/lib/rippled' import { flushPromises } from '../../test/utils' import { CUSTOM_NETWORKS_STORAGE_KEY } from '../../shared/hooks' import { Error } from '../../../rippled/lib/utils' jest.mock('../../Ledgers/LedgerMetrics', () => ({ __esModule: true, LedgerMetrics: () => null, })) jest.mock('xrpl-client', () => ({ XrplClient: jest.fn(), })) jest.mock('../../../rippled/lib/rippled', () => { const originalModule = jest.requireActual('../../../rippled/lib/rippled') return { __esModule: true, ...originalModule, getAccountInfo: jest.fn(), } }) jest.mock('../../../rippled', () => { const originalModule = jest.requireActual('../../../rippled') const { formatTransaction } = jest.requireActual('../../../rippled/lib/utils') return { __esModule: true, ...originalModule, getTransaction: () => Promise.resolve({ processed: formatTransaction({ TransactionType: 'OfferCreate', meta: { TransactionResult: 'tecKILLED', }, }), }), getAccountTransactions: () => Promise.resolve({}), getAccountState: () => Promise.resolve({}), getLedger: () => Promise.resolve({}), } }) jest.mock('../../../rippled/lib/rippled', () => { const originalModule = jest.requireActual('../../../rippled/lib/rippled') return { __esModule: true, ...originalModule, getAccountInfo: jest.fn(), } }) const mockXrplClient = XrplClient const mockGetAccountInfo = getAccountInfo describe('App container', () => { const renderApp = ( path = '/', localNetworks = [], accountInfoMock = () => Promise.resolve({ flags: 0, }), ) => { mockGetAccountInfo.mockImplementation(accountInfoMock) localStorage.removeItem(CUSTOM_NETWORKS_STORAGE_KEY) if (localNetworks) { localStorage.setItem( CUSTOM_NETWORKS_STORAGE_KEY, JSON.stringify(localNetworks), ) } return render( , ) } const oldEnvs = process.env beforeEach(() => { moxios.install() moxios.stubRequest( `${process.env.VITE_DATA_URL}/get_network/s2.ripple.com`, { status: 200, response: { result: 'success', network: '3' } }, ) mockXrplClient.mockImplementation(() => new MockWsClient()) process.env = { ...oldEnvs, VITE_ENVIRONMENT: 'mainnet' } }) afterEach(() => { cleanup() process.env = oldEnvs }) it('renders main parts', () => { const { container } = renderApp() expect(container.querySelectorAll('.header').length).toBe(1) expect(container.querySelectorAll('.content').length).toBe(1) expect(container.querySelectorAll('.footer').length).toBe(1) }) it('renders home', async () => { const { container } = renderApp() await waitFor(() => { expect(document.title).toEqual('xrpl_explorer | ledgers') expect(window.dataLayer).toEqual([ { page_path: '/', page_title: `xrpl_explorer | ledgers`, event: 'screen_view', network: 'mainnet', }, ]) }) expect(container.querySelector('header')).not.toHaveClass( 'header-no-network', ) expect(container.querySelectorAll('.ledgers').length).toBe(1) }) it('renders ledger explorer page', async () => { renderApp('/ledgers') await flushPromises() await flushPromises() expect(document.title).toEqual('xrpl_explorer | ledgers') expect(window.dataLayer).toEqual([ { page_path: '/', page_title: `xrpl_explorer | ledgers`, event: 'screen_view', network: 'mainnet', }, ]) }) it('renders ledger explorer page from index.html redirect', async () => { renderApp('/index.html') await flushPromises() await flushPromises() expect(document.title).toEqual('xrpl_explorer | ledgers') expect(window.dataLayer).toEqual([ { page_path: '/', page_title: `xrpl_explorer | ledgers`, event: 'screen_view', network: 'mainnet', }, ]) }) it('renders ledger explorer page from index.htm redirect', async () => { renderApp('/index.html') await flushPromises() await flushPromises() expect(document.title).toEqual('xrpl_explorer | ledgers') expect(window.dataLayer).toEqual([ { page_path: '/', page_title: `xrpl_explorer | ledgers`, event: 'screen_view', network: 'mainnet', }, ]) }) it('renders not found page', async () => { renderApp('/zzz') await waitFor(() => { expect(document.title).toEqual('xrpl_explorer | not_found_default_title') expect(window.dataLayer).toEqual([ { description: 'not_found_default_title -- not_found_check_url', event: 'not_found', network: 'mainnet', page_path: '/zzz', }, ]) }) }) it('renders ledger page', async () => { const id = 12345 renderApp(`/ledgers/${id}`) await flushPromises() await flushPromises() expect(document.title).toEqual(`xrpl_explorer | ledger ${id}`) expect(window.dataLayer).toEqual([ { page_path: '/ledgers/12345', page_title: `xrpl_explorer | ledger ${id}`, event: 'screen_view', network: 'mainnet', }, ]) }) it('renders transaction page', async () => { const id = '50BB0CC6EFC4F5EF9954E654D3230D4480DC83907A843C736B28420C7F02F774' renderApp(`/transactions/${id}`) await flushPromises() await flushPromises() expect(document.title).toEqual( `xrpl_explorer | transaction_short 50BB0CC6...`, ) expect(window.dataLayer).toEqual([ { page_path: '/transactions/50BB0CC6EFC4F5EF9954E654D3230D4480DC83907A843C736B28420C7F02F774', page_title: 'xrpl_explorer | transaction_short 50BB0CC6...', event: 'screen_view', network: 'mainnet', tec_code: 'tecKILLED', transaction_action: 'CREATE', transaction_category: 'DEX', transaction_type: 'OfferCreate', }, ]) }) it('renders transaction page with invalid hash', async () => { const id = '12345' renderApp(`/transactions/${id}`) await waitFor(() => { expect(document.title).toEqual(`xrpl_explorer | invalid_transaction_hash`) expect(window.dataLayer).toEqual([ { page_path: '/transactions/12345', event: 'not_found', network: 'mainnet', description: 'invalid_transaction_hash -- check_transaction_hash', }, ]) }) }) it('renders transaction page with no hash', async () => { const { container } = renderApp(`/transactions/`) await waitFor(() => { expect(container.querySelector('.no-match .title')).toBeInTheDocument() }) expect(container.querySelector('.no-match .title').textContent).toBe( 'transaction_empty_title', ) expect(container.querySelector('.no-match .hint').textContent).toBe( 'transaction_empty_hint', ) await waitFor(() => { expect(window.dataLayer).toEqual([ { page_path: '/transactions/', event: 'not_found', network: 'mainnet', description: 'transaction_empty_title -- transaction_empty_hint', }, ]) }) }) it('renders account page for classic address', async () => { const id = 'rKV8HEL3vLc6q9waTiJcewdRdSFyx67QFb' renderApp(`/accounts/${id}#ssss`) await flushPromises() await flushPromises() await waitFor(() => { expect(document.title).toEqual(`xrpl_explorer | rKV8HEL3vLc6...`) expect(window.dataLayer).toEqual([ { page_path: '/accounts/rKV8HEL3vLc6q9waTiJcewdRdSFyx67QFb#ssss', page_title: 'xrpl_explorer | rKV8HEL3vLc6...', event: 'screen_view', network: 'mainnet', }, ]) }) }) it('renders account page for malformed', async () => { const id = 'rZaChweF5oXn' renderApp(`/accounts/${id}#ssss`, [], () => Promise.reject(new Error('account not found', 404)), ) await waitFor(() => { expect(document.title).toEqual(`xrpl_explorer | invalid_xrpl_address`) expect(window.dataLayer).toEqual([ { page_path: '/accounts/rZaChweF5oXn#ssss', description: 'invalid_xrpl_address -- check_account_id', event: 'not_found', network: 'mainnet', }, ]) }) }) it('renders account page for a deleted account', async () => { const id = 'r35jYntLwkrbc3edisgavDbEdNRSKgcQE6' renderApp(`/accounts/${id}#ssss`, [], () => Promise.reject(new Error('account not found', 404)), ) await waitFor(() => { expect(document.title).toEqual(`xrpl_explorer | r35jYntLwkrb...`) expect(window.dataLayer).toEqual([ { page_path: '/accounts/r35jYntLwkrbc3edisgavDbEdNRSKgcQE6#ssss', page_title: `xrpl_explorer | r35jYntLwkrb...`, event: 'screen_view', network: 'mainnet', }, ]) }) expect(mockGetAccountInfo).toHaveBeenCalledWith( expect.anything(), 'r35jYntLwkrbc3edisgavDbEdNRSKgcQE6', ) }) it('renders account page for x-address', async () => { const id = 'XVVFXHFdehYhofb7XRWeJYV6kjTEwboaHpB9S1ruYMsuXcG' renderApp(`/accounts/${id}#ssss`) await waitFor(() => { expect(document.title).toEqual(`xrpl_explorer | XVVFXHFdehYh...`) expect(window.dataLayer).toEqual([ { page_path: '/accounts/XVVFXHFdehYhofb7XRWeJYV6kjTEwboaHpB9S1ruYMsuXcG#ssss', page_title: `xrpl_explorer | XVVFXHFdehYh...`, event: 'screen_view', network: 'mainnet', }, ]) }) expect(mockGetAccountInfo).toHaveBeenCalledWith( expect.anything(), 'rKV8HEL3vLc6q9waTiJcewdRdSFyx67QFb', ) }) it('renders account page with no id', async () => { const { container } = renderApp(`/accounts/`) await waitFor(() => { expect(container.querySelector('.no-match .title')).toBeInTheDocument() }) expect(container.querySelector('.no-match .title').textContent).toBe( 'account_empty_title', ) expect(container.querySelector('.no-match .hint').textContent).toBe( 'account_empty_hint', ) await waitFor(() => { expect(window.dataLayer).toEqual([ { page_path: '/accounts/', event: 'not_found', network: 'mainnet', description: 'account_empty_title -- account_empty_hint', }, ]) }) }) it('redirects legacy transactions page', async () => { const id = '50BB0CC6EFC4F5EF9954E654D3230D4480DC83907A843C736B28420C7F02F774' renderApp(`/#/transactions/${id}`) await waitFor(() => { expect(document.title).toEqual( `xrpl_explorer | transaction_short 50BB0CC6...`, ) expect(window.dataLayer).toEqual([ { page_path: '/transactions/50BB0CC6EFC4F5EF9954E654D3230D4480DC83907A843C736B28420C7F02F774', event: 'screen_view', network: 'mainnet', page_title: 'xrpl_explorer | transaction_short 50BB0CC6...', tec_code: 'tecKILLED', transaction_action: 'CREATE', transaction_category: 'DEX', transaction_type: 'OfferCreate', }, ]) }) }) it('redirects legacy account page', async () => { const id = 'rKV8HEL3vLc6q9waTiJcewdRdSFyx67QFb' renderApp(`/#/graph/${id}#ssss`) await waitFor(() => { expect(document.title).toEqual(`xrpl_explorer | rKV8HEL3vLc6...`) expect(window.dataLayer).toEqual([ { page_path: '/accounts/rKV8HEL3vLc6q9waTiJcewdRdSFyx67QFb#ssss', page_title: 'xrpl_explorer | rKV8HEL3vLc6...', event: 'screen_view', network: 'mainnet', }, ]) }) }) it('redirects legacy account page with no account', async () => { renderApp(`/#/graph/`) await waitFor(() => { expect(document.title).toEqual(`xrpl_explorer | ledgers`) expect(window.dataLayer).toEqual([ { page_path: '/', page_title: 'xrpl_explorer | ledgers', event: 'screen_view', network: 'mainnet', }, ]) }) }) it('renders custom mode homepage', async () => { process.env.VITE_ENVIRONMENT = 'custom' delete process.env.VITE_P2P_RIPPLED_HOST const { container } = renderApp('/') await flushPromises() expect(container.querySelector('header')).toHaveClass('header-no-network') expect(XrplClient).toHaveBeenCalledTimes(0) expect(document.title).toEqual(`xrpl_explorer`) }) it('renders custom mode ledgers without trailing slash', async () => { process.env.VITE_ENVIRONMENT = 'custom' delete process.env.VITE_P2P_RIPPLED_HOST delete process.env.VITE_CUSTOMNETWORK_LINK process.env.VITE_CUSTOMNETWORK_LINK = 'https://custom.xrpl.org' const network = 's2.ripple.com' const { container } = renderApp(`/${network}/`) await flushPromises() expect(container.querySelector('header')).not.toHaveClass( 'header-no-network', ) expect(XrplClient).toHaveBeenCalledTimes(1) expect(document.title).toEqual(`xrpl_explorer | ledgers`) }) it('renders custom mode ledgers with trailing slash', async () => { process.env.VITE_ENVIRONMENT = 'custom' delete process.env.VITE_P2P_RIPPLED_HOST delete process.env.VITE_CUSTOMNETWORK_LINK process.env.VITE_CUSTOMNETWORK_LINK = 'https://custom.xrpl.org/' const network = 's2.ripple.com' const { container } = renderApp(`/${network}/`) await flushPromises() expect(container.querySelector('header')).not.toHaveClass( 'header-no-network', ) expect(XrplClient).toHaveBeenCalledTimes(1) expect(document.title).toEqual(`xrpl_explorer | ledgers`) }) }) ================================================ FILE: src/containers/App/test/AppErrorBoundary.test.tsx ================================================ import { render } from '@testing-library/react' import { analytics } from '../../shared/analytics' import AppErrorBoundary from '../AppErrorBoundary' jest.mock('../../shared/analytics', () => { const { analytics: originalAnalytics } = jest.requireActual( '../../shared/analytics', ) jest.spyOn(originalAnalytics, 'trackException') return { __esModule: true, analytics: originalAnalytics, } }) const ProblemChild = () => { throw new Error('Error thrown from problem child') } describe(' component', () => { it('calls analytics with exception', () => { render( , ) expect(analytics.trackException).toHaveBeenCalledWith(expect.anything()) }) }) ================================================ FILE: src/containers/CustomNetworkHome/index.scss ================================================ @use '../shared/css/variables' as *; .app { position: relative; .custom-network-main-page { position: relative; min-height: 600px; color: $white; .logo-content { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: auto; margin-top: -20px; text-align: center; .custom-network-logo { display: none; @include for-size(tablet-landscape-up) { display: inherit; height: auto; } @include for-size(desktop-up) { width: 280px; } @media (height >= 800px) { width: 350px; } } .page-header { margin-top: -20px; font-size: 20px; @include bold; @include for-size(tablet-landscape-up) { font-size: 24px; } @include for-size(desktop-up) { font-size: 42px; } } .input-help { margin: 16px 0; font-size: 14px; } input { width: 50%; min-width: 300px; height: 40px; padding: 8px 16px; border: none; border-radius: 100px; margin: 10px 16px; background-color: $black-80; color: $white; font-size: 16px; letter-spacing: 0.01em; line-height: 24px; &::placeholder { overflow: visible; color: $black-40; } } .custom-network-input-button { box-sizing: border-box; padding: 8px 16px; border: 1px solid $custom; border-radius: 100px; margin: 16px; color: $custom; font-size: 14px; &:hover, &:focus { border: 1px solid $white; color: $white; cursor: pointer; } } } .custom-network-list { display: flex; flex-direction: column; align-items: normal; margin: 0% 10%; margin-top: 40px; margin-bottom: 70px; font-size: 16px; text-align: left; .custom-network-header { padding-bottom: 24px; border-bottom: 1px solid $black-80; font-size: 20px; @include bold; } .custom-network-item { display: flex; flex-direction: row; justify-content: space-between; padding: 24px 0; border-bottom: 1px solid $black-80; color: inherit; font-size: 16px; text-decoration: none; &:hover, &:focus { color: $custom; cursor: pointer; } .custom-network-arrow { text-align: right; } } } } } ================================================ FILE: src/containers/CustomNetworkHome/index.tsx ================================================ import { KeyboardEvent, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { Link } from 'react-router' import CustomNetworkLogo from '../shared/images/custom_network_logo.svg' import RightArrow from '../shared/images/side_arrow_green.svg' import { useAnalytics } from '../shared/analytics' import './index.scss' import { useCustomNetworks } from '../shared/hooks' import { Header } from '../Header' import { locationAssign } from '../shared/navigate' const CustomNetworkHome = () => { const { track, trackScreenLoaded } = useAnalytics() const { t } = useTranslation() const [networkText, setNetworkText] = useState('') const [customNetworks = []] = useCustomNetworks() useEffect(() => { trackScreenLoaded() }, [trackScreenLoaded]) function switchMode(desiredLink: string) { // Remove trailing slash from custom network link const customNetworkUrl = process.env.VITE_CUSTOMNETWORK_LINK?.charAt( process.env.VITE_CUSTOMNETWORK_LINK.length - 1, ) === '/' ? process.env.VITE_CUSTOMNETWORK_LINK?.slice(0, -1) : process.env.VITE_CUSTOMNETWORK_LINK const url = `${customNetworkUrl}/${desiredLink}` track('network_switch', { network: 'custom', entrypoint: desiredLink, }) // TODO: do some validation on this?? locationAssign(url) } function customNetworkOnKeyDown(event: KeyboardEvent) { if (event.key === 'Enter' && networkText != null) { switchMode(networkText) } } function renderCustomNetwork(network: string) { return (
{network}
) } return ( <>
{t('custom_network')}
{t('custom_network_input_help')}
setNetworkText(event.target.value)} />
{customNetworks.length > 0 && (
{t('custom_networks')}
{customNetworks.map(renderCustomNetwork)}
)}
) } export default CustomNetworkHome ================================================ FILE: src/containers/CustomNetworkHome/test/CustomNetworkHome.test.js ================================================ import { render, fireEvent } from '@testing-library/react' import i18n from '../../../i18n/testConfig' import CustomNetworkHome from '../index' import MockWsClient from '../../test/mockWsClient' import { CUSTOM_NETWORKS_STORAGE_KEY } from '../../shared/hooks' import { QuickHarness } from '../../test/utils' import { locationAssign } from '../../shared/navigate' jest.mock('../../shared/navigate', () => ({ locationAssign: jest.fn(), })) describe('CustomNetworkHome page', () => { let client const renderCustomNetworkHome = (localNetworks = null) => { localStorage.removeItem(CUSTOM_NETWORKS_STORAGE_KEY) if (localNetworks) { localStorage.setItem( CUSTOM_NETWORKS_STORAGE_KEY, JSON.stringify(localNetworks), ) } return render( , ) } beforeEach(async () => { client = new MockWsClient() }) afterEach(() => { client.close() }) it('renders without crashing', () => { const { container } = renderCustomNetworkHome() const pageNode = container.querySelectorAll('.custom-network-main-page') expect(pageNode.length).toEqual(1) }) it('renders with saved networks', () => { const { container } = renderCustomNetworkHome(['custom_url', 'custom_url2']) const networkTexts = container.querySelectorAll('.custom-network-text') expect(networkTexts.length).toEqual(2) expect(networkTexts[0].textContent).toBe('custom_url') expect(networkTexts[1].textContent).toBe('custom_url2') }) describe('test redirects', () => { const oldEnvs = process.env beforeEach(() => { locationAssign.mockClear() process.env = { ...oldEnvs, VITE_ENVIRONMENT: 'mainnet' } }) afterEach(() => { process.env = oldEnvs }) it('redirect works on `enter` in textbox', () => { const { container } = renderCustomNetworkHome() const input = container.querySelector('.custom-network-input') expect(input).toBeInTheDocument() fireEvent.change(input, { target: { value: 'custom_url' } }) fireEvent.keyDown(input, { key: 'Enter', currentTarget: { value: 'custom_url' }, }) expect(locationAssign).toHaveBeenCalledWith( `${process.env.VITE_CUSTOMNETWORK_LINK}/custom_url`, ) }) }) }) ================================================ FILE: src/containers/Footer/footer.scss ================================================ @use '../shared/css/variables' as *; .footer { position: relative; display: flex; flex-direction: column; justify-content: space-around; border-top: 1px solid $black-80; margin: 0 10%; .footer-links { display: flex; flex-direction: column; justify-content: space-around; @include for-size(tablet-landscape-up) { flex-direction: row; } } .footer-link-section { padding-top: 40px; } .footer-section-header { margin-bottom: 24px; color: $white; font-size: 16px; font-style: normal; font-weight: 700; letter-spacing: 0em; line-height: 20px; text-align: left; } .footer-link { display: block; font-size: 14px; font-style: normal; font-weight: 400; letter-spacing: 0em; line-height: 21px; text-align: left; text-decoration: none; // Hide external link icon for footer &::after { content: none; } } .footer-branding { margin-top: 40px; } .logo { margin-bottom: 11px; color: $white; font-size: 14px; @include regular; @include for-size(desktop-up) { display: inline-block; } .text { display: inline-block; padding: 7px 0px; } .image { width: 130px; margin: 0px 8px -1px 0px; vertical-align: bottom; } } .copyright { margin-top: 20px; color: $black-40; font-size: 12px; @include medium; @include for-size(desktop-up) { width: 320px; margin-top: 8px; clear: right; float: right; text-align: right; } .link { color: inherit; text-decoration: none; } } } ================================================ FILE: src/containers/Footer/index.tsx ================================================ import type { FC } from 'react' import { useTranslation } from 'react-i18next' import Logo from '../shared/images/XRPLedger.svg' import './footer.scss' const Footer: FC = () => { const { t } = useTranslation() return (
{t('explorer')} {' '} {t('version', { number: process.env.VITE_APP_VERSION })}
©  XRP Ledger Project  2012-{new Date().getFullYear()}
) } export default Footer ================================================ FILE: src/containers/Footer/test/Footer.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../i18n/testConfig' import Footer from '../index' describe('Footer component', () => { const renderFooter = () => render(
, ) it('renders without crashing', () => { renderFooter() }) it('renders all parts', () => { const { container } = renderFooter() expect(container.querySelectorAll('.logo')).toHaveLength(1) expect(container.querySelectorAll('.copyright')).toHaveLength(1) expect(container.querySelectorAll('.footer-link')).toHaveLength(12) expect(container.querySelectorAll('.footer-section-header')).toHaveLength(3) }) }) ================================================ FILE: src/containers/Header/LanguagePicker/LanguagePicker.scss ================================================ @use '../../shared/css/variables' as *; .language-picker { margin-left: auto; .dropdown-toggle { border-color: transparent; } .arrow { color: $blue-purple-40; } } ================================================ FILE: src/containers/Header/LanguagePicker/LanguagePicker.tsx ================================================ import { useTranslation } from 'react-i18next' import { useLanguage } from '../../shared/hooks' import { Dropdown, DropdownItem } from '../../shared/components/Dropdown' import './LanguagePicker.scss' import { supportedLanguages } from '../../../i18n/baseConfig' export const LanguagePicker = () => { const { i18n } = useTranslation() const currentLanguage = useLanguage() const handleLanguageClick = (language: string) => () => { i18n.changeLanguage(language) } return (
{Object.entries(supportedLanguages) .filter(([language]) => language !== currentLanguage) .map(([language, languageName]) => ( {languageName} ))}
) } ================================================ FILE: src/containers/Header/LanguagePicker/test/LanguagePicker.test.tsx ================================================ import { render, fireEvent } from '@testing-library/react' import i18next from 'i18next' import { I18nextProvider } from 'react-i18next' import { LanguagePicker } from '../LanguagePicker' import testConfigEnglish from '../../../../i18n/testConfigEnglish' describe('LanguagePicker component', () => { it('should switch language', () => { const { container } = render( , ) fireEvent.click(container.querySelector('.dropdown-toggle')!) fireEvent.click( container.querySelector('.dropdown-item.language-picker-ja-JP')!, ) expect(i18next.language).toEqual('ja-JP') }) }) ================================================ FILE: src/containers/Header/NavigationMenu/NavigationMenu.scss ================================================ @use 'sass:math'; @use '../../shared/css/variables' as *; $menu-toggle-size: 25px; $menu-toggle-line-spacing: math.div($menu-toggle-size, 4); $menu-toggle-line-length: $menu-toggle-size - $menu-toggle-line-spacing; .topbar, .navbar { display: flex; width: 100%; } .navbar { flex-wrap: wrap; align-items: center; margin: 0 auto; gap: 0 16px; .navbar-nav a { display: block; } } .navbar-brand { display: flex; align-items: center; svg { height: 26px; color: #fff; } } .navbar-collapse { display: none; width: 100%; height: 100%; flex-basis: 100%; margin-left: auto; } .nav-search { flex-grow: 1; } .nav-link { color: $white; font-size: 14px; } /* Nav menu */ .navbar-nav { display: block; padding: 0; margin: 0 auto 0 0; list-style: none; .btn { padding: 0; border: none; font-weight: normal; } .dropdown-toggle { gap: 8px; &:hover { background: transparent; } } } /* Menu Icon */ .navbar-toggle { display: flex; width: $menu-toggle-size; height: $menu-toggle-size; align-items: center; justify-content: center; margin-left: auto; cursor: pointer; } .navbar-toggle-line { position: relative; display: block; width: $menu-toggle-line-length; height: 2px; background: white; &::before, &::after { position: absolute; display: block; width: 100%; height: 100%; background: white; content: ''; transition: all 0.2s ease-out; } &::before { top: $menu-toggle-line-spacing; } &::after { top: -$menu-toggle-line-spacing; } } /* Open Mobile Menu */ .navbar-toggle-state:checked ~ .navbar-toggle { .navbar-toggle-line { width: 51px; // sqrt(($menu-toggle-line-length)^2 * 2) background: transparent; &::before { top: 0; transform: rotate(-45deg); } &::after { top: 0; transform: rotate(45deg); } } } // Prevents navigation from keeping styles when menu is opened on mobile sizes and then resized larger @media (max-width: $tablet-landscape-upper-boundary) { .navbar-collapse { max-height: 100%; margin-top: 24px; .navbar-toggle-state:checked ~ & { display: block; } .nav-item { margin-bottom: 10px; } .nav-link, .dropdown-toggle { padding: 15px 1px 16px 8px; border-left: 8px solid transparent; background-position: center center; background-size: cover; } .selected .nav-link { border-left-color: #32e685; } .dropdown { display: block; } .dropdown-menu { position: static; padding-left: 15px; border: none; margin: 0; } } .dropdown-item:hover { background: transparent !important; } .dot { display: none; } } /* Responsiveness */ @media (min-width: $tablet-landscape-upper-boundary) { .navbar { flex-wrap: nowrap; margin: 0 auto; .navbar-collapse { position: relative; top: 0; display: block; width: fit-content; max-height: none; background-color: transparent; } } .navbar-toggle { display: none; } .navbar-nav { display: flex !important; align-items: center; gap: 0 28px; .nav-item { position: relative; } } } .selected { .dot { position: absolute; top: calc(100% + 6px); width: 6px; height: 6px; border-radius: 100%; margin-left: 50%; background-color: $green; } :hover { color: $white; } :focus { color: $white; } } ================================================ FILE: src/containers/Header/NavigationMenu/NavigationMenu.tsx ================================================ import classnames from 'classnames' import { useRef } from 'react' import { useTranslation } from 'react-i18next' import { useLocation, Link } from 'react-router' import Logo from '../../shared/images/XRPLedger.svg' import { Search } from '../Search' import { Dropdown, DropdownItem } from '../../shared/components/Dropdown' import type { defaultTranslationsKey } from '../../../../@types/i18next' import { useAnalytics } from '../../shared/analytics' import { buildPath, RouteLink, RouteDefinition } from '../../shared/routing' import './NavigationMenu.scss' export interface NavigationMenuRoute { title: defaultTranslationsKey current?: (path: string) => boolean } export interface NavigationMenuParentRoute extends NavigationMenuRoute { children: NavigationMenuInternalRoute[] } export interface NavigationMenuExternalRoute extends NavigationMenuRoute { link: string } export interface NavigationMenuInternalRoute extends NavigationMenuRoute { route: RouteDefinition params?: any } export type NavigationMenuAnyRoute = | NavigationMenuParentRoute | NavigationMenuExternalRoute | NavigationMenuInternalRoute export const NavigationMenu = ({ routes, }: { routes: NavigationMenuAnyRoute[] }) => { const { track } = useAnalytics() const location = useLocation() const { t } = useTranslation() const toggle = useRef(null) // manually set toggle to false because the component will `preventDefault` breaking the
) } ================================================ FILE: src/containers/Ledgers/css/ledgerMetrics.scss ================================================ @use '../../shared/css/variables' as *; .metrics { overflow: hidden; align-items: center; justify-content: center; padding: 16px 16px 0; border: 1px solid $black-60; margin: 16px; background-color: $black-80; text-align: center; @include for-size(tablet-landscape-up) { display: flex; width: calc(100% - 64px); flex-wrap: wrap; justify-content: space-between; padding: 0; border-bottom: none; margin: 12px auto 0; } .cell { position: relative; display: flex; width: 100%; flex: 1; justify-content: space-between; margin-bottom: 16px; color: $white; font-size: 16px; text-align: center; @include for-size(tablet-landscape-up) { display: inline-block; width: auto; min-width: 160px; padding: 24px; border-bottom: 1px solid $black-60; margin-bottom: 0; &::before { position: absolute; top: 50%; left: -1px; width: 1px; height: 80%; background-color: $black-60; content: ''; transform: translateY(-50%); } // Hacky way to get rid of the double border when breaking to second row. TODO: cleanup // 3 columns per row @media (width >= 544px) and (width <= 703px) { &:nth-child(3n + 1)::before { content: none; } } // 4 columns per row @media (width >= 704px) and (width <= 863px) { &:nth-child(4n + 1)::before { content: none; } } // 5 columns per row @media (width >= 864px) and (width <= 1023px) { &:nth-child(5n + 1)::before { content: none; } } // 6 columns per row @media (width >= 1024px) and (width <= 1183px) { &:nth-child(6n + 1)::before { content: none; } } // 7 columns per row @media (width >= 1184px) { &:nth-child(7n + 1)::before { content: none; } } } @include for-size(desktop-up) { min-width: 160px; font-size: 18px; line-height: 22px; } .label-wrapper { display: flex; align-items: center; justify-content: flex-start; gap: 8px; @include for-size(tablet-landscape-up) { flex-direction: column; align-items: center; gap: 0; } } .metrics-icon { width: 24px; height: 24px; margin-bottom: 0; @include for-size(tablet-landscape-up) { margin-bottom: 12px; } } .label { display: flex; overflow: hidden; align-items: center; margin-bottom: 0; color: $black-40; float: left; font-size: 12px; gap: 4px; line-height: 25px; text-overflow: ellipsis; text-transform: uppercase; white-space: nowrap; @include semibold; @include for-size(tablet-landscape-up) { margin-bottom: 12px; float: none; font-size: 10px; line-height: 12px; } .hover { width: 14px; height: 14px; } } .n-unl-metric { color: $black-40; text-transform: none; } span { display: inline-block; float: right; letter-spacing: 0px; @include bold; @include for-size(tablet-landscape-up) { display: block; float: none; } } } } .control { display: flex; min-height: 30px; align-items: center; padding: 0px 14px 0px 32px; line-height: 14px; text-align: right; .pause-resume { display: flex; height: 40px; flex-direction: row; align-items: center; color: $white; cursor: pointer; float: left; font-size: 10px; text-align: left; text-transform: uppercase; @include medium; .icon { width: 40px; height: 40px; margin-right: 16px; vertical-align: middle; } &:hover { color: $black-30; } } } .metrics-control { align-content: center; } ================================================ FILE: src/containers/Ledgers/css/ledgers.scss ================================================ @use '../../shared/css/variables' as *; $ledgers-margin-large: 32px; $ledgers-border: 1px solid $black-70; $ledger-width: 196px; .ledgers-page { display: flex; width: 100%; flex-direction: column; justify-content: center; margin: 1% 0 auto; .loader { position: absolute; } } .ledgers { margin-top: $ledgers-margin-large; justify-self: space-between; .control { overflow: hidden; width: calc(100% - 28px); min-height: 30px; padding: 4px 14px; line-height: 14px; text-align: right; @include for-size(desktop-up) { width: calc(100% - 80px); padding: 4px 40px; } .selected-validator { display: inline-block; width: calc(100% - 100px); a { display: inline-block; overflow: hidden; margin: 1px 2px; line-height: 20px; text-overflow: ellipsis; vertical-align: top; white-space: nowrap; &.domain { max-width: calc(70% - 5px); font-size: 14px; @include medium; } &.pubkey { max-width: calc(30% - 5px); padding-top: 1.5px; font-size: 11px; letter-spacing: 0; } @include for-size(tablet-landscape-up) { &.domain { max-width: calc(50% - 5px); } &.pubkey { max-width: calc(50% - 5px); } } } } } .legend { padding: 16px 24px; border: $ledgers-border; margin: 0 $ledgers-margin-large; } .ledger-list { position: relative; display: flex; padding-left: $ledgers-margin-large; /* Did not use margin as that would chop off the scrolling */ overflow-x: scroll; scrollbar-width: none; /* Firefox */ &::-webkit-scrollbar { /* WebKit */ width: 0; height: 0; } .loader { position: relative; padding: 32px; } } .ledger { width: $ledger-width; flex-grow: 0; flex-shrink: 0; margin-right: $ledgers-margin-large; animation-duration: 0.4s; animation-name: ledger-enter; white-space: normal; &:first-child { margin-left: 0; } } @keyframes ledger-enter { from { margin-left: -$ledger-width; } to { margin-left: 0; } } .ledger-head { min-height: 170px; padding: $ledgers-margin-large; border: $ledgers-border; border-bottom: 0; color: $black-40; font-size: 10px; line-height: 12px; text-align: center; text-transform: uppercase; @include bold; .close-time { padding-bottom: 24px; color: $black-40; font-size: 10px; } .txn-count { display: flex; justify-content: space-between; } .fees { display: flex; justify-content: space-between; } b { color: $white; font-size: 10px; text-align: end; @include medium; } .ledger-index { padding-bottom: 3px; color: $white; font-size: 14px; font-weight: 700; line-height: 16px; a { display: inline-block; padding: 2px 4px; border-radius: 2px; margin-right: -4px; } a:hover { background: $black-70; } &.flag-ledger a { background: $black-70; color: $white; } } .transactions { display: grid; padding-top: $ledgers-margin-large; gap: 4px 6px; grid-template-columns: repeat(8, 1fr); } @keyframes tx-enter { from { width: 0; height: 0; } to { width: 11px; height: 11px; } } .txn { display: inline-block; width: 11px; height: 11px; align-content: center; align-items: center; opacity: 0.35; /* stylelint-disable-next-line selector-class-pattern -- Name comes from server */ &.tesSUCCESS { opacity: 1; } span { display: none; } svg { animation-duration: 0.3s; animation-name: tx-enter; } } } .hash { overflow: hidden; padding: 0 32px 32px; border: 1px solid $black-60; border-top: 0; background: rgba($black-80, 0.7); color: $white; font-size: 15px; text-align: left; .bar { height: 2px; margin: 0 -32px; } &.unselected { opacity: 0.5; .bar { background: $black-20 !important; } } .ledger-hash { text-align: center; } .hash-concat { padding-top: 32px; color: $white; font-size: 14px; @include bold; } .subtitle { display: flex; overflow: hidden; flex-direction: column; padding-top: 24px; padding-bottom: 32px; color: $black-40; font-size: 10px; line-height: 14px; text-transform: uppercase; @include bold; } .validation-total { display: flex; justify-content: space-between; } .subtitle b { color: $white; font-size: 11px; } .subtitle span { display: flex; justify-content: space-between; padding: 0 2px; } .subtitle span.missed { color: white; cursor: pointer; } .subtitle span.missed b { border-radius: 2px; background: $orange-50; color: white; } .validated { display: inline-block; height: 26px; color: $green; text-align: center; vertical-align: middle; } @keyframes validation-enter { from { opacity: 0; } to { opacity: 0.85; } } .validations { display: grid; gap: 4px 8px; grid-template-columns: repeat(5, 1fr); } .validation { height: 4px; border-radius: 4px; background: $black-50; cursor: pointer; opacity: 0.85; } .validation:hover { opacity: 1; } .validation.trusted { background: $white; } .validation.selected { background: $green; opacity: 1; } .validation.unselected:not(.selected) { opacity: 0.4; } .partial { width: 50%; height: 100%; background: $red; } } } ================================================ FILE: src/containers/Ledgers/css/legend.scss ================================================ @use '../../shared/css/variables' as *; .legend { display: flex; flex-direction: column; gap: 18px; text-transform: uppercase; } .legend-category { display: inline-block; width: 12px; height: 2px; background: currentcolor; } .legend-item { display: flex; align-items: center; font-size: 14px; font-weight: 600; gap: 8px; } .legend-heading { color: #a2a2a4; font-size: 12px; font-weight: 600; } .legend-section { display: flex; flex-flow: column wrap; gap: 16px; @include for-size(desktop-up) { flex-direction: row; } } .legend-toggle { padding: 0; } ================================================ FILE: src/containers/Ledgers/index.tsx ================================================ import { useEffect, useState } from 'react' import { Helmet } from 'react-helmet-async' import { useTranslation } from 'react-i18next' import { LedgerMetrics } from './LedgerMetrics' import { Ledgers } from './Ledgers' import { useAnalytics } from '../shared/analytics' import { SelectedValidatorProvider } from './useSelectedValidator' import { StreamsProvider } from '../shared/components/Streams' import { VHSValidatorsProvider } from '../shared/components/VHSValidators' export const LedgersPage = () => { const { trackScreenLoaded } = useAnalytics() const [paused, setPaused] = useState(false) useEffect(() => { trackScreenLoaded() return () => { window.scrollTo(0, 0) } }, [trackScreenLoaded]) const pause = () => setPaused(!paused) const { t } = useTranslation() return (
pause()} paused={paused} />
) } ================================================ FILE: src/containers/Ledgers/test/LedgersPage.test.js ================================================ import { render, fireEvent, waitFor, cleanup } from '@testing-library/react' import moxios from 'moxios' import WS from 'jest-websocket-mock' import i18n from '../../../i18n/testConfig' import { LedgersPage } from '../index' import SocketContext from '../../shared/SocketContext' import NetworkContext from '../../shared/NetworkContext' import BaseMockWsClient from '../../test/mockWsClient' import prevLedgerMessage from './mock/prevLedger.json' import ledgerMessage from './mock/ledger.json' import validationMessage from './mock/validation.json' import rippledResponses from './mock/rippled.json' import { QuickHarness } from '../../test/utils' import { SelectedValidatorProvider } from '../useSelectedValidator' function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)) } const LEDGER_HASH_MAP = new Map([ [ 'A5F887A191348B69129B168EDA5BC8EEE9EAC60E2599A8034742199471C70604', 68992561, ], [ '0C12B30677B3D8D6ADC7DCC8528694E2FD1515950FB2AAD621D9E9B31833B444', 68992560, ], ]) const MOCK_VALIDATORS = [ { signing_key: 'n9M2anhK2HzFFiJZRoGKhyLpkh55ZdeWw8YyGgvkzY7AkBvz5Vyj', master_key: 'nHUfPizyJyhAJZzeq3duRVrZmsTZfcLn7yLF5s2adzHdcHMb9HmQ', unl: process.env.VITE_VALIDATOR, }, { signing_key: 'n9KaxgJv69FucW5kkiaMhCqS6sAR1wUVxpZaZmLGVXxAcAse9YhR', master_key: 'nHBidG3pZK11zQD6kpNDoAhDxH6WLGui6ZxSbUx7LSqLHsgzMPec', unl: process.env.VITE_VALIDATOR, }, { signing_key: 'n9K7Wfxgyqw4XSQ1BaiKPHKxw2D9BiBiseyn7Ldg7KieQZJfrPf4', master_key: 'nHUkhmyFPr3vEN3C8yfhKp4pu4t3wkTCi2KEDBWhyMNpsMj2HbnD', unl: null, }, ] class MockWsClient extends BaseMockWsClient { send(message) { if (this.debug) { // eslint-disable-next-line no-console -- For debugging purposes console.log(message) } if (this.returnError) { return Promise.reject(new Error({})) } const { command } = message if (command === 'ledger') { const response = JSON.parse(JSON.stringify(this.responses[command])) response.result.ledger_hash = message.ledger_hash response.result.ledger.hash = message.ledger_hash response.result.ledger.ledger_hash = message.ledger_hash response.result.ledger.ledger_index = LEDGER_HASH_MAP.get( message.ledger_hash, ) response.result.ledger_index = LEDGER_HASH_MAP.get(message.ledger_hash) return Promise.resolve(response.result) } return Promise.resolve(this.responses[command]?.result) } } const WS_URL = 'wss://fakenode.ripple.com:51233' describe('Ledgers Page container', () => { let server let client const renderLedgersPage = (props = { network: 'main', path: '/' }) => render( , ) const oldEnvs = process.env beforeEach(async () => { process.env = { ...oldEnvs, VITE_ENVIRONMENT: 'mainnet' } server = new WS(WS_URL, { jsonProtocol: true }) client = new MockWsClient(WS_URL) await server.connected moxios.install() }) afterEach(() => { cleanup() process.env = oldEnvs moxios.uninstall() client.close() server.close() WS.clean() }) it('renders without crashing', () => { renderLedgersPage() }) it('renders all parts', () => { moxios.stubRequest(`${process.env.VITE_DATA_URL}/validators/main`, { status: 200, response: [], }) const { container } = renderLedgersPage() expect(container.querySelectorAll('.ledgers').length).toBe(1) }) it('receives messages from streams', async () => { client.addResponses(rippledResponses) moxios.stubRequest(`${process.env.VITE_DATA_URL}/validators/main`, { status: 200, response: { validators: MOCK_VALIDATORS, }, }) moxios.stubRequest('/api/v1/metrics', { base_fee: '0.00001', txn_sec: '12.19', txn_ledger: '46.94', ledger_interval: '3.850', avg_fee: '0.001882', }) const { container, unmount } = renderLedgersPage() expect(container.querySelectorAll('.ledger').length).toBe(0) expect(container.querySelectorAll('.validation').length).toBe(0) expect(container.querySelectorAll('.txn').length).toBe(0) server.send(prevLedgerMessage) await sleep(260) expect(container.querySelectorAll('.ledgers').length).toBe(1) expect(container.querySelectorAll('.ledger-list').length).toBe(1) expect(container.querySelectorAll('.ledger').length).toBe(2) server.send(validationMessage) await sleep(200 * 2) expect(container.querySelectorAll('.validation').length).toBe(1) server.send(ledgerMessage) expect(container.querySelectorAll('.ledger').length).toBe(2) server.send({ type: 'invalid' }) server.send(null) expect(container.querySelectorAll('.ledger').length).toBe(2) expect( container.querySelectorAll('.selected-validator .pubkey').length, ).toBe(0) expect(container.querySelectorAll('.tooltip').length).toBe(0) const unlCounter = container.querySelector('.ledger .hash .missed') expect(unlCounter.textContent).toBe('unl:1/2') fireEvent.mouseMove(unlCounter) await waitFor(() => { expect( container.querySelectorAll('.tooltip').length, ).toBeGreaterThanOrEqual(1) }) expect(container.querySelector('.tooltip .pubkey').textContent).toBe( 'nHUfPizyJyhAJZzeq3duRVrZmsTZfcLn7yLF5s2adzHdcHMb9HmQ', ) fireEvent.mouseLeave(unlCounter) const validations = container.querySelectorAll('div.validation') const txn = container.querySelectorAll('a.txn') expect(txn.length).toBe(12) fireEvent.focus(txn[0]) fireEvent.mouseOver(txn[0]) expect(validations.length).toBe(1) fireEvent.mouseOver(validations[0]) await waitFor(() => { expect( container.querySelectorAll('.tooltip').length, ).toBeGreaterThanOrEqual(1) }) fireEvent.mouseLeave(validations[0]) await waitFor(() => { expect(container.querySelectorAll('.tooltip').length).toBe(0) }) fireEvent.focus(validations[0]) expect( container.querySelectorAll('.selected-validator a.pubkey').length, ).toBe(0) fireEvent.click(validations[0]) await waitFor(() => { expect( container.querySelectorAll('.selected-validator a.pubkey').length, ).toBe(1) }) fireEvent.click(validations[0]) await waitFor(() => { expect( container.querySelectorAll('.selected-validator a.pubkey').length, ).toBe(0) }) unmount() await sleep(100) expect(client.listenerCount('ledger')).toBe(0) expect(client.listenerCount('validation')).toBe(0) }, 8000) describe('Custom network tests', () => { beforeEach(() => { process.env = { ...oldEnvs, VITE_ENVIRONMENT: 'custom' } }) afterEach(() => { process.env = oldEnvs }) it('receives messages from streams', async () => { client.addResponses(rippledResponses) const customNetwork = 'custom_network' moxios.stubRequest( `${process.env.VITE_DATA_URL}/validators/${customNetwork}`, { status: 200, response: { validators: MOCK_VALIDATORS, }, }, ) const { container, unmount } = renderLedgersPage({ network: customNetwork, path: '/my.custom.com', }) await sleep(100) expect(container.querySelectorAll('.validation').length).toBe(0) expect(container.querySelectorAll('.ledger').length).toBe(1) expect(container.querySelectorAll('.txn').length).toBe(6) server.send(prevLedgerMessage) await sleep(260) expect(container.querySelectorAll('.ledger').length).toBe(2) server.send(validationMessage) await sleep(200 * 2) expect(container.querySelectorAll('.validation').length).toBe(1) server.send(ledgerMessage) await sleep(250) expect(container.querySelectorAll('.ledger').length).toBe(2) server.send({ type: 'invalid' }) server.send(null) expect(container.querySelectorAll('.ledger').length).toBe(2) expect( container.querySelectorAll('.selected-validator .pubkey').length, ).toBe(0) expect(container.querySelectorAll('.tooltip').length).toBe(0) const unlCounter = container.querySelector('.ledger .hash .missed') expect(unlCounter.textContent).toBe('unl:1/2') fireEvent.mouseMove(unlCounter) await waitFor(() => { expect( container.querySelectorAll('.tooltip').length, ).toBeGreaterThanOrEqual(1) }) expect(container.querySelector('.tooltip .pubkey').textContent).toBe( 'nHUfPizyJyhAJZzeq3duRVrZmsTZfcLn7yLF5s2adzHdcHMb9HmQ', ) fireEvent.mouseLeave(unlCounter) const validations = container.querySelectorAll('div.validation') const txn = container.querySelectorAll('a.txn') expect(txn.length).toBe(12) fireEvent.focus(txn[0]) fireEvent.mouseOver(txn[0]) expect(validations.length).toBe(1) fireEvent.mouseOver(validations[0]) await waitFor(() => { expect( container.querySelectorAll('.tooltip').length, ).toBeGreaterThanOrEqual(1) }) fireEvent.mouseLeave(validations[0]) await waitFor(() => { expect(container.querySelectorAll('.tooltip').length).toBe(0) }) fireEvent.focus(validations[0]) expect( container.querySelectorAll('.selected-validator .pubkey').length, ).toBe(0) fireEvent.click(validations[0]) await waitFor(() => { expect( container.querySelectorAll('.selected-validator a.pubkey').length, ).toBe(1) }) expect( container .querySelector('.selected-validator a.pubkey') .getAttribute('href'), ).toBe('/validators/n9KaxgJv69FucW5kkiaMhCqS6sAR1wUVxpZaZmLGVXxAcAse9YhR') fireEvent.click(validations[0]) await waitFor(() => { expect( container.querySelectorAll('.selected-validator .pubkey').length, ).toBe(0) }) unmount() }, 8000) }) }) ================================================ FILE: src/containers/Ledgers/test/Legend.test.tsx ================================================ import { render } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { I18nextProvider } from 'react-i18next' import { Legend, LEGEND_STORAGE_KEY } from '../Legend' import i18n from '../../../i18n/testConfigEnglish' describe(`Legend`, () => { const setupTest = (localStorageValue?: boolean) => { localStorage.removeItem(LEGEND_STORAGE_KEY) if (localStorageValue) { localStorage.setItem( LEGEND_STORAGE_KEY, JSON.stringify(localStorageValue), ) } return render( , ) } it(`renders open when localStorage entry 'explorer-legend-previous-interaction' is not defined`, () => { const { container } = setupTest() expect(container.querySelectorAll('.legend-heading')).toHaveLength(2) expect(container.querySelectorAll('.legend-section')).toHaveLength(2) // TransactionActionIcon renders SVGs directly without a wrapper class expect(container.querySelectorAll('.legend-item svg')).toHaveLength(5) expect(container.querySelectorAll('.legend-category')).toHaveLength(6) }) it(`renders open when localStorage entry 'explorer-legend-previous-interaction' is set to false`, () => { const { container } = setupTest(false) expect(container.querySelectorAll('.legend-heading')).toHaveLength(2) expect(container.querySelectorAll('.legend-section')).toHaveLength(2) }) it(`renders closed when localStorage entry 'explorer-legend-previous-interaction' is set to true`, () => { const { container } = setupTest(true) expect(container.querySelector('.legend-heading')).not.toBeInTheDocument() expect(container.querySelector('.legend-section')).not.toBeInTheDocument() }) it(`sets 'explorer-legend-previous-interaction' when the toggle is clicked`, async () => { const { container } = setupTest(false) const toggle = container.querySelector('.legend-toggle')! await userEvent.click(toggle) expect(localStorage.getItem(LEGEND_STORAGE_KEY)).toEqual('true') await userEvent.click(toggle) expect(localStorage.getItem(LEGEND_STORAGE_KEY)).toEqual('true') // keeps it true }) }) ================================================ FILE: src/containers/Ledgers/test/mock/ledger.json ================================================ { "fee_base": 10, "fee_ref": 10, "ledger_hash": "A5F887A191348B69129B168EDA5BC8EEE9EAC60E2599A8034742199471C70604", "ledger_index": 68992561, "ledger_time": 695420130, "reserve_base": 10000000, "reserve_inc": 2000000, "txn_count": 6, "type": "ledgerClosed", "validated_ledgers": "22865937-24405095" } ================================================ FILE: src/containers/Ledgers/test/mock/prevLedger.json ================================================ { "fee_base": 10, "fee_ref": 10, "ledger_hash": "0C12B30677B3D8D6ADC7DCC8528694E2FD1515950FB2AAD621D9E9B31833B444", "ledger_index": 68992560, "ledger_time": 695420130, "reserve_base": 10000000, "reserve_inc": 2000000, "txn_count": 6, "type": "ledgerClosed", "validated_ledgers": "22865937-24405095" } ================================================ FILE: src/containers/Ledgers/test/mock/rippled.json ================================================ { "server_info": { "result": { "info": { "load_factor": 1, "pubkey_node": "n9McviCgS1MCatDQRmezqorM2ErYwyspAgx8Y8RBKSRPensyaZHp", "published_ledger": "none", "time": "2022-Jan-13 20:40:18.473782 UTC", "uptime": 1820444, "validated_ledger": { "age": 6, "base_fee_xrp": 0.00001, "hash": "A5F887A191348B69129B168EDA5BC8EEE9EAC60E2599A8034742199471C70604", "reserve_base_xrp": 10, "reserve_inc_xrp": 2, "seq": 68992561 }, "validation_quorum": 1 } }, "status": "success", "type": "response" }, "ledger_entry": { "result": { "node": { "DisabledValidators": [ { "DisabledValidator": { "FirstLedgerSequence": 1609728, "PublicKey": "ED6629D456285AE3613B285F65BBFF168D695BA3921F309949AFCD2CA7AFEC16FE" } } ], "Flags": 0, "LedgerEntryType": "NegativeUNL", "index": "2E8A59AA9D3B5B186B0B9E0F62E6C02587CA74A4D778938E957B6357D364B244" } } }, "ledger": { "result": { "ledger": { "closed": true, "hash": "A5F887A191348B69129B168EDA5BC8EEE9EAC60E2599A8034742199471C70604", "ledger_hash": "A5F887A191348B69129B168EDA5BC8EEE9EAC60E2599A8034742199471C70604", "ledger_index": "68992561", "parent_close_time": 410459110, "parent_hash": "CDFD329A6E418591770695D0FB859113641AC20CB3A1F39AB3D721CEA2685EFE", "seqNum": "68992561", "totalCoins": "99999999999996310", "total_coins": "99999999999996310", "transaction_hash": "0000000000000000000000000000000000000000000000000000000000000000", "transactions": [ { "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "Fee": "10", "Flags": 0, "LastLedgerSequence": 71273384, "OfferSequence": 54681324, "Sequence": 54681459, "SigningPubKey": "03C48299E57F5AE7C2BE1391B581D313F1967EA2301628C07AC412092FDC15BA22", "TransactionType": "OfferCancel", "TxnSignature": "30440220216DBEDCA747465AC638CA942FC0A15F4426F31342892D9481F8749BE72BB93B02201855A304190833ED94D52D40EA15F9C91728013373508F7C02F0AA87EB78139F", "hash": "0A9FF30C6ADC165002425F764A3D87743F1674853D0D32DC123DF55D6438DEE0", "metaData": { "TransactionResult": "tesSUCCESS" } }, { "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "Fee": "10", "Flags": 0, "LastLedgerSequence": 71273384, "OfferSequence": 54681324, "Sequence": 54681459, "SigningPubKey": "03C48299E57F5AE7C2BE1391B581D313F1967EA2301628C07AC412092FDC15BA22", "TransactionType": "OfferCancel", "TxnSignature": "30440220216DBEDCA747465AC638CA942FC0A15F4426F31342892D9481F8749BE72BB93B02201855A304190833ED94D52D40EA15F9C91728013373508F7C02F0AA87EB78139F", "hash": "1A9FF30C6ADC165002425F764A3D87743F1674853D0D32DC123DF55D6438DEE0", "metaData": { "TransactionResult": "tesSUCCESS" } }, { "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "Fee": "10", "Flags": 0, "LastLedgerSequence": 71273384, "OfferSequence": 54681324, "Sequence": 54681459, "SigningPubKey": "03C48299E57F5AE7C2BE1391B581D313F1967EA2301628C07AC412092FDC15BA22", "TransactionType": "OfferCancel", "TxnSignature": "30440220216DBEDCA747465AC638CA942FC0A15F4426F31342892D9481F8749BE72BB93B02201855A304190833ED94D52D40EA15F9C91728013373508F7C02F0AA87EB78139F", "hash": "2A9FF30C6ADC165002425F764A3D87743F1674853D0D32DC123DF55D6438DEE0", "metaData": { "TransactionResult": "tesSUCCESS" } }, { "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "Fee": "10", "Flags": 0, "LastLedgerSequence": 71273384, "OfferSequence": 54681324, "Sequence": 54681459, "SigningPubKey": "03C48299E57F5AE7C2BE1391B581D313F1967EA2301628C07AC412092FDC15BA22", "TransactionType": "OfferCancel", "TxnSignature": "30440220216DBEDCA747465AC638CA942FC0A15F4426F31342892D9481F8749BE72BB93B02201855A304190833ED94D52D40EA15F9C91728013373508F7C02F0AA87EB78139F", "hash": "3A9FF30C6ADC165002425F764A3D87743F1674853D0D32DC123DF55D6438DEE0", "metaData": { "TransactionResult": "tesSUCCESS" } }, { "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "Fee": "10", "Flags": 0, "LastLedgerSequence": 71273384, "OfferSequence": 54681324, "Sequence": 54681459, "SigningPubKey": "03C48299E57F5AE7C2BE1391B581D313F1967EA2301628C07AC412092FDC15BA22", "TransactionType": "OfferCancel", "TxnSignature": "30440220216DBEDCA747465AC638CA942FC0A15F4426F31342892D9481F8749BE72BB93B02201855A304190833ED94D52D40EA15F9C91728013373508F7C02F0AA87EB78139F", "hash": "4A9FF30C6ADC165002425F764A3D87743F1674853D0D32DC123DF55D6438DEE0", "metaData": { "TransactionResult": "tesSUCCESS" } }, { "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "Fee": "10", "Flags": 0, "LastLedgerSequence": 71273384, "OfferSequence": 54681324, "Sequence": 54681459, "SigningPubKey": "03C48299E57F5AE7C2BE1391B581D313F1967EA2301628C07AC412092FDC15BA22", "TransactionType": "OfferCancel", "TxnSignature": "30440220216DBEDCA747465AC638CA942FC0A15F4426F31342892D9481F8749BE72BB93B02201855A304190833ED94D52D40EA15F9C91728013373508F7C02F0AA87EB78139F", "hash": "5A9FF30C6ADC165002425F764A3D87743F1674853D0D32DC123DF55D6438DEE0", "metaData": { "TransactionResult": "tesSUCCESS" } } ] }, "validated": true, "ledger_hash": "A5F887A191348B69129B168EDA5BC8EEE9EAC60E2599A8034742199471C70604", "ledger_index": 68992561 }, "status": "success", "type": "response" } } ================================================ FILE: src/containers/Ledgers/test/mock/validation.json ================================================ { "cookie": "14152263757286605278", "data": "228000000126041CBE3129297345043AC466F0E7C4B401DE51A5F887A191348B69129B168EDA5BC8EEE9EAC60E2599A8034742199471C706045017BAE56CBDEAAFD73CBDEBE8BCF1CDDE879D327430F8A47BB9B787DA6D0A5E91F450190C12B30677B3D8D6ADC7DCC8528694E2FD1515950FB2AAD621D9E9B31833B4447321032CE084DEC33CF6FA0D093E0BC8C3E95C6702DBEB30FDF06F87545AF8A43B26FA76463044022023EDCAEE7C6812A418F51AB044974AD35B33D9B147C0A3417833E8F0D406CCEE022026AB3CF6BC52B94B43EC64EC6731304483630DB43BE7720CBCF93E71CF66AEC9", "flags": 2147483649, "full": true, "ledger_hash": "A5F887A191348B69129B168EDA5BC8EEE9EAC60E2599A8034742199471C70604", "ledger_index": "68992561", "master_key": "nHUFCyRCrUjvtZmKiLeF8ReopzKuUoKeDeXo3wEUBVSaawzcSBpW", "signature": "3044022023EDCAEE7C6812A418F51AB044974AD35B33D9B147C0A3417833E8F0D406CCEE022026AB3CF6BC52B94B43EC64EC6731304483630DB43BE7720CBCF93E71CF66AEC9", "signing_time": 695420164, "type": "validationReceived", "validated_hash": "0C12B30677B3D8D6ADC7DCC8528694E2FD1515950FB2AAD621D9E9B31833B444", "validation_public_key": "n9KaxgJv69FucW5kkiaMhCqS6sAR1wUVxpZaZmLGVXxAcAse9YhR" } ================================================ FILE: src/containers/Ledgers/useSelectedValidator.tsx ================================================ import { createContext, Dispatch, FC, PropsWithChildren, SetStateAction, useContext, useMemo, useState, } from 'react' export interface SelectedValidatorContextType { selectedValidator?: string setSelectedValidator: Dispatch> } export const SelectedValidatorContext = createContext({ selectedValidator: undefined, setSelectedValidator: (validator: SetStateAction) => validator, }) export const SelectedValidatorProvider: FC = ({ children, }) => { const [selectedValidator, setSelectedValidator] = useState() const selectedValidatorValues = useMemo( () => ({ selectedValidator, setSelectedValidator, }), [selectedValidator], ) return ( {children} ) } export const useSelectedValidator = (): SelectedValidatorContextType => useContext(SelectedValidatorContext) ================================================ FILE: src/containers/NFT/NFT.tsx ================================================ import { FC, PropsWithChildren, useEffect, useState } from 'react' import { useParams } from 'react-router' import { Helmet } from 'react-helmet-async' import NoMatch from '../NoMatch' import { NFTHeader } from './NFTHeader/NFTHeader' import { NFTTabs } from './NFTTabs/NFTTabs' import { useAnalytics } from '../shared/analytics' import { NOT_FOUND, BAD_REQUEST } from '../shared/utils' import { ErrorMessage } from '../shared/Interfaces' import { parseIssuerFromNFTokenID } from '../../rippled/NFTTransactions' import './styles.scss' const ERROR_MESSAGES: { [code: number]: ErrorMessage } = { [NOT_FOUND]: { title: 'assets.no_nfts_message', hints: ['check_nft_id'], }, [BAD_REQUEST]: { title: 'invalid_xrpl_address', hints: ['check_nft_id'], }, } const DEFAULT_ERROR: ErrorMessage = { title: 'generic_error', hints: ['not_your_fault'], } const getErrorMessage = (error: any) => ERROR_MESSAGES[error] ?? DEFAULT_ERROR const Page: FC> = ({ tokenId, children, }) => (
{children}
) export const NFT = () => { const { trackScreenLoaded } = useAnalytics() const { id: tokenId = '' } = useParams<{ id: string }>() const [error, setError] = useState(null) useEffect(() => { trackScreenLoaded({ nftoken_id: tokenId, issuer: parseIssuerFromNFTokenID(tokenId), }) return () => { window.scrollTo(0, 0) } }, [tokenId, trackScreenLoaded]) const renderError = () => { const message = getErrorMessage(error) return (
) } if (error) { return {renderError()} } return ( {tokenId && } {tokenId && } {!tokenId && (

Enter a NFT ID in the search box

)}
) } ================================================ FILE: src/containers/NFT/NFTHeader/Details.tsx ================================================ import { useTranslation } from 'react-i18next' import './styles.scss' import { useLanguage } from '../../shared/hooks' import { localizeNumber } from '../../shared/utils' import { NFTFormattedInfo, AccountFormattedInfo } from '../../shared/Interfaces' import { Account } from '../../shared/components/Account' import { TokenTableRow } from '../../shared/components/TokenTableRow' interface MintedProps { minted?: string } interface Props { data: NFTFormattedInfo & AccountFormattedInfo & MintedProps } export const Details = ({ data }: Props) => { const { minted, domain, NFTTaxon: nftTaxon, uri, transferFee, owner, isBurned, NFTSerial: nftSerial, } = data const { t } = useTranslation() const language = useLanguage() const formattedFee = transferFee && `${localizeNumber((transferFee / 1000).toPrecision(5), language, { minimumFractionDigits: 3, })}%` return ( {minted && } {domain && } {uri && } {isBurned && } {owner && ( } /> )}
) } ================================================ FILE: src/containers/NFT/NFTHeader/NFTHeader.tsx ================================================ import { useEffect, useContext, useState } from 'react' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { Loader } from '../../shared/components/Loader' import './styles.scss' import SocketContext from '../../shared/SocketContext' import { Tooltip, TooltipInstance } from '../../shared/components/Tooltip' import { getNFTInfo, getAccountInfo } from '../../../rippled/lib/rippled' import { formatNFTInfo, formatAccountInfo } from '../../../rippled/lib/utils' import { localizeDate, BAD_REQUEST, HASH256_REGEX } from '../../shared/utils' import { Details } from './Details' import { Settings } from './Settings' import { Account } from '../../shared/components/Account' import { getOldestNFTTransaction } from '../../../rippled/NFTTransactions' import { useAnalytics } from '../../shared/analytics' import { useLanguage } from '../../shared/hooks' import { NFTFormattedInfo, AccountFormattedInfo } from '../../shared/Interfaces' const TIME_ZONE = 'UTC' const DATE_OPTIONS = { hour: 'numeric', minute: 'numeric', second: 'numeric', year: 'numeric', month: 'numeric', day: 'numeric', hour12: true, timeZone: TIME_ZONE, } interface Props { tokenId: string setError: (error: number | null) => void } export const NFTHeader = (props: Props) => { const { t } = useTranslation() const language = useLanguage() const { tokenId, setError } = props const rippledSocket = useContext(SocketContext) const { trackException } = useAnalytics() const [tooltip, setTooltip] = useState(undefined) const { data, isFetching: loading } = useQuery( ['getNFTInfo', tokenId], async () => { const info = await getNFTInfo(rippledSocket, tokenId) return formatNFTInfo(info) }, { onError: (e: any) => { trackException(`NFT ${tokenId} --- ${JSON.stringify(e)}`) setError(e.code) }, }, ) useEffect(() => { if (!HASH256_REGEX.test(tokenId)) { setError(BAD_REQUEST) } }, [setError, tokenId]) // fetch the oldest NFT transaction to get its minted data const { data: firstTransaction } = useQuery( ['getFirstTransaction', tokenId], () => getOldestNFTTransaction(rippledSocket, tokenId), { enabled: !!data, }, ) // fetch account from issuer to get the domain const { data: accountData } = useQuery( ['getAccountInfo'], async () => { const info = await getAccountInfo(rippledSocket, data?.issuer) return formatAccountInfo(info, {}) }, { enabled: !!data }, ) const mintedDate = firstTransaction?.transaction?.type === 'NFTokenMint' ? `${localizeDate( new Date(firstTransaction.transaction.date), language, DATE_OPTIONS, )} ${TIME_ZONE}` : undefined const showTooltip = (event: any, d: any) => { setTooltip({ data: d, mode: 'nftId', x: event.currentTarget.offsetLeft, y: event.currentTarget.offsetTop, }) } const hideTooltip = () => { setTooltip(undefined) } const renderHeaderContent = () => { const { issuer } = data! return (
{t('issuer_address')}

{t('details')}

{t('settings')}

) } return (
{!loading && (
NFT ID
NFT
showTooltip(e, { tokenId })} onFocus={() => {}} onMouseLeave={hideTooltip} > {tokenId}
)}
{loading ? : renderHeaderContent()}
) } ================================================ FILE: src/containers/NFT/NFTHeader/Settings.tsx ================================================ import './styles.scss' import { useTranslation } from 'react-i18next' import { TokenTableRow } from '../../shared/components/TokenTableRow' interface Props { flags: string[] } export const Settings = ({ flags }: Props) => { const { t } = useTranslation() const burnable = flags.includes('lsfBurnable') ? 'enabled' : 'disabled' const onlyXRP = flags.includes('lsfOnlyXRP') ? 'enabled' : 'disabled' const transferable = flags.includes('lsfTransferable') ? 'enabled' : 'disabled' return (
) } ================================================ FILE: src/containers/NFT/NFTHeader/styles.scss ================================================ @use '../../shared/css/variables' as *; @use '../../shared/css/table'; .nft-header-container { .nft-bottom-container { display: flex; flex-direction: column; padding-top: 64px; @include for-size(desktop-up) { flex-direction: row; padding-top: 80px; } .details { width: 100%; @include for-size(desktop-up) { width: 490px; } } .settings { width: 100%; @include for-size(desktop-up) { width: 650px; } } } .nft-info-container { display: flex; flex-direction: column; justify-content: space-between; margin-top: 68px; @include for-size(desktop-up) { flex-direction: row; margin-top: 80px; } .values { display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 18px; color: $white; @include for-size(desktop-up) { flex-direction: column; margin-bottom: 0; } .title { padding-bottom: 4px; margin-bottom: 4.5px; color: $black-40; font-size: 14px; text-transform: uppercase; @include semibold; } .value { display: flex; .nft-issuer { margin: auto; color: $white; font-size: 18px; font-style: normal; line-height: 125%; text-align: right; text-decoration: none; @include bold; } .copy { width: 24px; height: 24px; flex: none; flex-grow: 0; order: 1; margin-left: 10px; } } } } } .nft-token-header { width: 100%; margin-bottom: 16px; .nft-box-header { display: flex; flex-direction: column; align-items: flex-start; margin-top: 0; text-align: left; .title-content { overflow: hidden; width: 100%; min-width: 0; min-height: 0; padding-top: 0; margin-top: 0; margin-bottom: 0; color: $white; font-size: 24px; text-overflow: ellipsis; white-space: nowrap; @include bold; } .token-title { display: flex; flex-direction: row; align-items: center; padding-bottom: 4px; color: $black-40; font-size: 14px; text-transform: uppercase; @include semibold; .badge { background: $nft; color: $white; } } img { width: 24px; height: 24px; margin-left: 16px; object-fit: contain; } } .box-content { min-height: 100px; padding-bottom: 20px; } } ================================================ FILE: src/containers/NFT/NFTHeader/test/Details.test.js ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router' import { Details } from '../Details' import i18n from '../../../../i18n/testConfig' describe('NFT Details container', () => { const dataDefault = { NFTId: '0000000025CC40A6A240DB42512BA22826B903A785EE2FA512C5D5A70000000C', ledgerIndex: 2436210, owner: 'rhSigFwZ9UnbiKbpaco8aSQUsNFXJVz51W', isBurned: true, flags: ['lsfBurnable', 'lsfOnlyXRP'], transferFee: 0, issuer: 'rhSigFwZ9UnbiKbpaco8aSQUsNFXJVz51W', NFTTaxon: 0, NFTSerial: 12, uri: 'ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf4dfuylqabf3oclgtqy55fbzdi', validated: true, status: 'success', warnings: [ "This is a clio server. clio only serves validated data. If you want to talk to rippled, include 'ledger_index':'current' in your request", ], minted: undefined, domain: '123456', } const renderDetails = (data = dataDefault) => render(
, ) it('renders without crashing', () => { renderDetails() }) it('renders defined fields', () => { const { container } = renderDetails() expect(container.querySelectorAll('.row').length).toEqual(7) expect(container.textContent).toEqual( expect.stringContaining( 'ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf4dfuylqabf3oclgtqy55fbzdi', ), ) expect(container.textContent).toEqual( expect.stringContaining('rhSigFwZ9UnbiKbpaco8aSQUsNFXJVz51W'), ) }) }) ================================================ FILE: src/containers/NFT/NFTHeader/test/NFTHeader.test.js ================================================ import { render, fireEvent, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router' import { useQuery, QueryClientProvider } from 'react-query' import { NFTHeader } from '../NFTHeader' import i18n from '../../../../i18n/testConfig' import { queryClient } from '../../../shared/QueryClient' const data = { NFTId: '0000000025CC40A6A240DB42512BA22826B903A785EE2FA512C5D5A70000000C', ledgerIndex: 2436210, owner: 'rhSigFwZ9UnbiKbpaco8aSQUsNFXJVz51W', isBurned: false, flags: ['lsfBurnable', 'lsfOnlyXRP'], transferFee: 0, issuer: 'rhSigFwZ9UnbiKbpaco8aSQUsNFXJVz51W', NFTTaxon: 0, NFTSerial: 12, uri: 'ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf4dfuylqabf3oclgtqy55fbzdi', validated: true, status: 'success', warnings: [ "This is a clio server. clio only serves validated data. If you want to talk to rippled, include 'ledger_index':'current' in your request", ], } jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const setError = jest.fn() describe('NFT header container', () => { const renderNFTHeader = () => render( , ) it('renders without crashing', async () => { useQuery.mockImplementation(() => ({ data, isFetching: false, })) renderNFTHeader() }) it('renders NFT content', async () => { useQuery.mockImplementation(() => ({ data, isFetching: false, })) const { container } = renderNFTHeader() expect( container.textContent.includes( '0000000025CC40A6A240DB42512BA22826B903A785EE2FA512C5D5A70000000C', ), ).toBe(true) expect( container.textContent.includes('rhSigFwZ9UnbiKbpaco8aSQUsNFXJVz51W'), ).toBe(true) expect(container.querySelectorAll('.settings').length).toBe(1) expect(container.querySelectorAll('.details').length).toBe(1) fireEvent.mouseOver(container.querySelector('.title-content')) await waitFor(() => { expect(container.querySelectorAll('.tooltip').length).toBe(1) }) }) it('renders loader', async () => { useQuery.mockImplementation(() => ({ data, isFetching: true, error: {}, })) const { container } = renderNFTHeader() expect(container.querySelectorAll('.loader').length).toEqual(1) }) }) ================================================ FILE: src/containers/NFT/NFTHeader/test/Settings.test.js ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { Settings } from '../Settings' import i18n from '../../../../i18n/testConfig' describe('NFT Setttings container', () => { const flags = ['lsfBurnable', 'lsfOnlyXRP'] const renderSettings = () => render( , ) it('renders without crashing', () => { renderSettings() }) it('renders defined fields', () => { const { container } = renderSettings() expect(container.querySelectorAll('.row').length).toEqual(3) expect((container.textContent.match(/enabled/g) || []).length).toEqual(2) expect((container.textContent.match(/disabled/g) || []).length).toEqual(1) }) }) ================================================ FILE: src/containers/NFT/NFTTabs/NFTTabs.tsx ================================================ import './styles.scss' import { Tabs } from '../../shared/components/Tabs' import { getBuyNFToffers, getSellNFToffers } from '../../../rippled/lib/rippled' import { Offers } from './Offers' import { Transactions } from './Transactions' import { NFT_ROUTE } from '../../App/routes' import { buildPath, useRouteParams } from '../../shared/routing' interface Props { tokenId: string } export const NFTTabs = (props: Props) => { const { id = '', tab = 'transactions' } = useRouteParams(NFT_ROUTE) const { tokenId } = props function renderTabs() { const tabs = ['transactions', 'buy-offers', 'sell-offers'] const mainPath = buildPath(NFT_ROUTE, { id }) return } function renderTransactions() { switch (tab) { case 'sell-offers': return ( ) case 'buy-offers': return ( ) default: return } } return (
{renderTabs()}
{renderTransactions()}
) } ================================================ FILE: src/containers/NFT/NFTTabs/Offers.tsx ================================================ import { useContext } from 'react' import { useTranslation } from 'react-i18next' import { useInfiniteQuery } from 'react-query' import { Loader } from '../../shared/components/Loader' import './styles.scss' import NoInfo from '../../shared/images/no_info.svg' import { useAnalytics } from '../../shared/analytics' import SocketContext from '../../shared/SocketContext' import { Amount } from '../../shared/components/Amount' import '../../shared/components/TransactionTable/styles.scss' // Reuse load-more-btn import { formatAmount } from '../../../rippled/lib/txSummary/formatAmount' import { LoadMoreButton } from '../../shared/LoadMoreButton' import { ACCOUNT_ROUTE } from '../../App/routes' import { RouteLink } from '../../shared/routing' interface Props { tokenId: string offerType: string fetchOffers: ( socket: any, id: string, limit: number | undefined, marker: any, ) => Promise } export const Offers = (props: Props) => { const { t } = useTranslation() const { tokenId, fetchOffers, offerType } = props const { trackException } = useAnalytics() const rippledSocket = useContext(SocketContext) const { data, isFetching: loading, fetchNextPage, hasNextPage, } = useInfiniteQuery( [offerType, tokenId], ({ pageParam = '' }) => fetchOffers(rippledSocket, tokenId, undefined, pageParam), { getNextPageParam: (lastPage) => lastPage.marker, onError: (_e: any) => { trackException(`Cannot find ${offerType} for NFT ${tokenId}`) }, }, ) const renderLoadMoreButton = () => hasNextPage && fetchNextPage()} /> const renderOffer = (d: any) => { const { amount, owner, nft_offer_index: offerIndex } = d return ( {offerIndex} {owner} ) } const renderOffers = () => (
{data ? ( data.pages.map((page: any) => page.offers.map(renderOffer)) ) : ( )}
{t('offer_index')} {t('owner')} {t('amount')}
{offerType === 'BuyOffers' ? t('no_buy_offers') : t('no_sell_offers')}
{loading ? : renderLoadMoreButton()}
) return
{loading ? : renderOffers()}
} ================================================ FILE: src/containers/NFT/NFTTabs/Transactions.tsx ================================================ import { useContext } from 'react' import { useInfiniteQuery } from 'react-query' import './styles.scss' import SocketContext from '../../shared/SocketContext' import { getNFTTransactions } from '../../../rippled/NFTTransactions' import { TransactionTable } from '../../shared/components/TransactionTable/TransactionTable' interface Props { tokenId: string } export const Transactions = (props: Props) => { const { tokenId } = props const rippledSocket = useContext(SocketContext) const { data, isFetching: loading, fetchNextPage, hasNextPage, } = useInfiniteQuery( ['fetchTransactions', tokenId], ({ pageParam = '' }) => getNFTTransactions(rippledSocket, tokenId, undefined, pageParam), { getNextPageParam: (lastPage) => lastPage.marker, }, ) const renderListContents = () => { const flatData = data?.pages?.map((page: any) => page.transactions).flat() return ( fetchNextPage()} transactions={flatData} hasAdditionalResults={hasNextPage} /> ) } return renderListContents() } ================================================ FILE: src/containers/NFT/NFTTabs/styles.scss ================================================ @use '../../shared/css/variables' as *; @use '../../shared/css/table'; .nft-tabs { margin-top: 60px; } .offers-table { position: relative; min-height: 150px; table { .no-info-panel { color: $black-40; font-size: 14px; font-weight: 400; line-height: 150%; text-align: center; .no-info-content { display: flex; flex-direction: column; .no-info-img { max-width: 100%; height: auto; margin: 10px auto; } } } .offer-id { width: 55%; padding-left: 32px; @include for-size(tablet-portrait-up) { max-width: 140px; } @include for-size(big-desktop-up) { max-width: 180px; } } .amount { display: table-cell; width: 15%; padding-right: 32px; @include medium; span.amount { padding: 0; } } .owner { display: table-cell; width: 30%; min-width: 0; @include for-size(tablet-portrait-up) { max-width: 80px; } @include for-size(big-desktop-up) { max-width: 120px; } @include medium; } @include for-size(tablet-landscape-up) { .offer-id { display: table-cell; } } } } ================================================ FILE: src/containers/NFT/NFTTabs/test/NFTTabs.test.js ================================================ import { render } from '@testing-library/react' import { Route } from 'react-router' import { NFTTabs } from '../NFTTabs' import i18n from '../../../../i18n/testConfig' import { QuickHarness } from '../../../test/utils' import { NFT_ROUTE } from '../../../App/routes' describe('NFT Transactions tab container', () => { const nftId = '000800011C7D8ED1D715A0017E41BF9499ECC17E7FB666320000099B00000000' const renderNFTTabs = (tab = 'transactions') => render( } /> , ) it('renders without crashing', () => { renderNFTTabs() }) it('renders transactions tab', () => { const { container } = renderNFTTabs() expect(container.querySelectorAll('.tabs').length).toBe(1) const tabs = container.querySelectorAll('a.tab') expect(tabs.length).toBe(3) expect(tabs[0].getAttribute('title')).toBe('transactions') expect(tabs[1].getAttribute('title')).toBe('buy_offers') expect(tabs[2].getAttribute('title')).toBe('sell_offers') expect(container.querySelector('a.tab.selected').textContent).toEqual( 'transactions', ) }) it('renders buy offers tab', () => { const { container } = renderNFTTabs('buy-offers') expect(container.querySelector('a.tab.selected').textContent).toEqual( 'buy_offers', ) }) it('renders sell offers tab', () => { const { container } = renderNFTTabs('sell-offers') expect(container.querySelector('a.tab.selected').textContent).toEqual( 'sell_offers', ) }) }) ================================================ FILE: src/containers/NFT/NFTTabs/test/Offers.test.js ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router' import { useInfiniteQuery, QueryClientProvider } from 'react-query' import { Offers } from '../Offers' import i18n from '../../../../i18n/testConfig' import { queryClient } from '../../../shared/QueryClient' const data = { pages: [ { limit: 50, marker: '99511000B8DD99BC26E4EAF4950A4D3828154C32FF87E488CDF97090FF50C7E3', nft_id: '000800011C7D8ED1D715A0017E41BF9499ECC17E7FB666320000099B00000000', offers: [ { amount: '43', flags: 1, nft_offer_index: '04A971FB801C8EDD9B839F5814A7996441303C1E9BB112BFC239A803D614AA23', owner: 'rsbeLHcGyFjt2oQsgoao9s3p5BLhP4CdMo', }, { amount: '43', flags: 1, nft_offer_index: '0758BE16FBC30B823F4C80E46378F7FEA4CCE3115EB9637F73211ADD1E17C298', owner: 'rsbeLHcGyFjt2oQsgoao9s3p5BLhP4CdMo', }, ], }, ], pageParams: [null], } jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useInfiniteQuery: jest.fn(), })) const fetchOffers = jest.fn() describe('NFT Offers container', () => { const renderOffers = () => render( , ) it('renders without crashing', () => { useInfiniteQuery.mockImplementation(() => ({ data, isFetching: false, error: {}, })) renderOffers() }) it('renders table content', () => { useInfiniteQuery.mockImplementation(() => ({ data, isFetching: false, error: {}, })) const { container } = renderOffers() expect(container.querySelectorAll('tr').length).toEqual(3) expect(container.querySelectorAll('a').length).toEqual(2) expect(container.textContent.includes('0.000043')).toBe(true) expect( container.textContent.includes( '04A971FB801C8EDD9B839F5814A7996441303C1E9BB112BFC239A803D614AA23', ), ).toBe(true) expect( container.textContent.includes( '0758BE16FBC30B823F4C80E46378F7FEA4CCE3115EB9637F73211ADD1E17C298', ), ).toBe(true) expect(container.querySelectorAll('.load-more-btn').length).toEqual(0) }) it('renders loader', () => { useInfiniteQuery.mockImplementation(() => ({ data, isFetching: true, error: {}, })) const { container } = renderOffers() expect(container.querySelectorAll('.loader').length).toEqual(1) }) it('renders no information warning when there is no data', () => { useInfiniteQuery.mockImplementation(() => ({ data: undefined, isFetching: false, error: {}, })) const { container } = renderOffers() expect(container.querySelectorAll('.no-info-content').length).toEqual(1) }) it('renders load more button', () => { useInfiniteQuery.mockImplementation(() => ({ data: undefined, isFetching: false, error: {}, hasNextPage: true, })) const { container } = renderOffers() expect(container.querySelectorAll('.load-more-btn').length).toEqual(1) }) }) ================================================ FILE: src/containers/NFT/NFTTabs/test/Transactions.test.js ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router' import { useInfiniteQuery, QueryClientProvider } from 'react-query' import { Transactions } from '../Transactions' import i18n from '../../../../i18n/testConfig' import { queryClient } from '../../../shared/QueryClient' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useInfiniteQuery: jest.fn(), })) describe('NFT Offers container', () => { const renderTransactions = () => render( , ) it('renders without crashing', () => { useInfiniteQuery.mockImplementation(() => ({ data: {}, isFetching: false, error: {}, })) const { container } = renderTransactions() expect(container.querySelectorAll('.transaction-table').length).toEqual(1) }) }) ================================================ FILE: src/containers/NFT/styles.scss ================================================ @use '../shared/css/variables' as *; .nft-page { width: 100%; margin-top: 100px; .loader { min-height: 100px; } } .nft-warning { font-size: 14px; text-align: center; } ================================================ FILE: src/containers/NFT/test/NFT.test.js ================================================ import * as React from 'react' import { render } from '@testing-library/react' import { Route } from 'react-router' import { NFT } from '../NFT' import i18n from '../../../i18n/testConfig' import { QuickHarness } from '../../test/utils' import { NFT_ROUTE } from '../../App/routes' describe('NFT container', () => { const nftId = '000800011C7D8ED1D715A0017E41BF9499ECC17E7FB666320000099B00000000' const renderNFT = (nft = undefined) => render( } /> , ) it('renders without crashing', () => { renderNFT(nftId) }) it('renders children', () => { const { container } = renderNFT(nftId) // NFTHeader and NFTTabs wrapper elements are rendered as part of the component tree // Note: .nft-header-container is only rendered when data is loaded, not during loading state expect(container.querySelector('.nft-token-header')).toBeInTheDocument() expect(container.querySelector('.nft-tabs')).toBeInTheDocument() }) it('does not render when no nft provided', () => { const { container } = renderNFT() expect( container.querySelector('.nft-header-container'), ).not.toBeInTheDocument() expect(container.querySelector('.nft-tabs')).not.toBeInTheDocument() }) it('renders error', () => { jest.mock('../NFTHeader/NFTHeader', () => ({ NFTHeader: ({ setError }) => { setError(404) }, })) const { container } = renderNFT('something') expect(container.querySelector('.no-match')).toBeInTheDocument() }) }) ================================================ FILE: src/containers/Network/BarChartVersion.tsx ================================================ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { BarChart, Bar, XAxis, YAxis, Tooltip, TooltipProps, Label, ResponsiveContainer, Text, Cell, } from 'recharts' import { Loader } from '../shared/components/Loader' import { PURPLE, GREY_600, GREY_800, GREEN_500, PURPLE_500, GREEN_800, PURPLE_700, GREY_0, GREY_400, } from '../shared/utils' import './css/barchart.scss' interface Props { data: any[] stableVersion: string | null } interface LegendProps { stableVersion: string | null } // TODO: figure out a better way to import this from recharts // copied from https://github.com/recharts/recharts/blob/master/src/component/DefaultTooltipContent.tsx type ValueType = number | string | Array type NameType = number | string const CustomTooltip = ({ active, payload, label, }: TooltipProps) => { const { t } = useTranslation() if (active) { const valCount = payload?.[0]?.payload?.validatorCount ?? 0 const valPercent = payload?.[0]?.payload?.validatorPercent.toFixed(2) ?? 0 const nodeCount = payload?.[0]?.payload?.nodeCount ?? 0 const nodePercent = payload?.[0]?.payload?.nodePercent.toFixed(2) ?? 0 return (

{t('version_display', { version: label })}

{t('validator_count', { val_count: `${valCount} (${valPercent}%)`, })}

{t('node_count', { node_count: `${nodeCount} (${nodePercent}%)`, })}

) } return null } const CustomLegend = (props: LegendProps) => { const { stableVersion } = props const { t } = useTranslation() return (
{t('validators')}
{t('nodes')}
{t('current_stable_version')}: {' '} {t('stable_version', { stableVersion })}{' '}
) } const stableColorCode = ( type: string, dataLabel: string, stableVersion: string, ) => { if (dataLabel === stableVersion) { if (type === 'validators') return GREEN_500 return PURPLE_500 } if (type === 'validators') return GREEN_800 return PURPLE_700 } const BarChartVersion = (props: Props) => { const { data, stableVersion } = props const { t } = useTranslation() const [showTooltips, setShowTooltips] = useState(false) const customTick = (e) => { const { payload: { value }, } = e const color = value === stableVersion ? GREY_0 : GREY_400 e.fill = color if (value === stableVersion) /* eslint-disable react/jsx-props-no-spreading */ return ( {value} ) return {value} } return (
`${tick}%`} stroke={GREY_400} > setShowTooltips(true)} onMouseLeave={() => setShowTooltips(false)} > {stableVersion && data.map((_entry, index) => ( ))} setShowTooltips(true)} onMouseLeave={() => setShowTooltips(false)} > {stableVersion && data.map((_entry, index) => ( ))} } cursor={false} offset={-10} wrapperStyle={{ backgroundColor: GREY_600, borderRadius: 8, border: `1px solid ${GREY_800}`, opacity: showTooltips ? '100%' : '0', }} /> {!(data !== null && data.length > 0 && stableVersion) && }
) } export default BarChartVersion ================================================ FILE: src/containers/Network/Hexagons.tsx ================================================ import { useEffect, useState } from 'react' import { useWindowSize } from 'usehooks-ts' import { hexbin } from 'd3-hexbin' import { Loader } from '../shared/components/Loader' import { Tooltip, useTooltip } from '../shared/components/Tooltip' import './css/hexagons.scss' import { ValidatorResponse } from '../shared/vhsTypes' const MAX_WIDTH = 1200 const getDimensions = (width) => ({ width, height: Math.min(width, MAX_WIDTH) / 2.4, radius: Math.min(width, MAX_WIDTH) / 25, }) type Hexagon = { cookie?: string pubkey?: string ledger_hash: string x: number y: number } const prepareHexagons = ( data, list: Record, height: number, radius: number, prev: Hexagon[] = [], ) => { const maxRows = Math.ceil(height / ((radius * 3) / 2)) const hexWidth = radius * Math.sqrt(3) let row = 0 let column = 0 let max = 0 return data.map((d, i) => { const pos = { x: column * hexWidth + (row % 2 ? hexWidth / 2 : 0), y: (row * radius * 3) / 2, } if (row === maxRows || (column === 0 && row === max)) { max += 1 row = 0 column = max } else { column -= 1 row += 1 } return { ...d, ...pos, ...list[d.pubkey], prev: prev[i] && prev[i]?.ledger_hash !== d.ledger_hash ? prev[i]?.ledger_hash.substr(0, 6) : undefined, } }) } export const Hexagons = ({ list, data, }: { data: any list?: Record }) => { const { width } = useWindowSize() const [hexagons, setHexagons] = useState([]) const { width: gridWidth, height: gridHeight, radius } = getDimensions(width) const { tooltip, showTooltip, hideTooltip } = useTooltip() const bin = hexbin() .extent([ [0, 0], [gridWidth, gridHeight], ]) .radius(radius) useEffect(() => { if (width > 0 && list) { setHexagons((prevHexagons) => prepareHexagons( Object.values(data), list, gridHeight, radius, prevHexagons, ), ) } }, [data, list, width, gridHeight, radius]) const renderHexagon = (d, theHex) => { const { cookie, pubkey, ledger_hash: ledgerHash } = d const fill = `#${ledgerHash.substr(0, 6)}` const strokeWidth = theHex.radius() / 16 return ( showTooltip('validator', e, { ...d, v: list?.[d.pubkey] }) } onFocus={() => {}} onMouseLeave={hideTooltip} > ) } return (
{hexagons.map((hexagon) => renderHexagon(hexagon, bin))} {hexagons?.length === 0 && }
) } ================================================ FILE: src/containers/Network/Map.tsx ================================================ import axios from 'axios' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { geoPath, geoNaturalEarth1 } from 'd3-geo' import { scaleLinear } from 'd3-scale' import { hexbin } from 'd3-hexbin' import { feature } from 'topojson-client' import { useWindowSize } from 'usehooks-ts' import { Loader } from '../shared/components/Loader' import './css/map.scss' const MAX_WIDTH = 1200 const BAR_COUNT = 30 const HEX_RADIUS_FACTOR = 40 export interface MapProps { locations?: any[] } export const Map = ({ locations = undefined }: MapProps) => { const [tooltip, setTooltip] = useState<{ count: number x: number y: number } | null>(null) const { t } = useTranslation() const { width: propsWidth } = useWindowSize() const { data: countries } = useQuery('countries', () => axios .get('/countries.json') .then( (response) => feature(response.data, response.data.objects.countries).features, ), ) const getProjection = (width, height) => geoNaturalEarth1() .scale(width / 4.8) .translate([width / 2.2, height / 1.7]) const getHexbin = (offset, width, height) => hexbin() .extent([ [0, 0], [offset * 2 + width, height], ]) .radius(Math.sqrt(width / HEX_RADIUS_FACTOR)) const getDimensions = () => { const pageWidth = propsWidth const width = Math.min(pageWidth, MAX_WIDTH) return { width, height: width / 2, } } const renderMap = (width, height) => { const offset = (propsWidth - width) / 2 const projection = getProjection(width, height) const hex = getHexbin(offset, width, height) const bins = hex( locations?.map((node) => projection([node.long, node.lat])), ) const counts = bins.map((bin) => bin.length) const max = counts.length ? Math.max(...counts) : 0 // @ts-ignore -- d3-color allows strings to be returned const color: Function = scaleLinear() .domain([1, max]) // @ts-ignore -- d3-color allows strings to be passed in .range(['#FF6719', '#7919FF']) const bars: { index: number; color: any }[] = [] let i = 0 const BAR_WIDTH = Math.ceil(width / (BAR_COUNT * 8)) const BAR_HEIGHT = BAR_WIDTH / 1.5 const LEGEND_OFFSET_X = BAR_WIDTH * 2 + offset const LEGEND_OFFSET_Y = BAR_WIDTH * 2 const tooltipText = tooltip ? `${tooltip.count} ${t('nodes')}` : '' while (i < BAR_COUNT) { const increment = (max / BAR_COUNT) * i + 1 bars.push({ index: i, color: color(increment), }) i += 1 } return ( <> {countries?.map((d) => ( ))} {max && ( {bars.map((bar) => ( ))} 1 {max} )} {bins.map((bin) => ( { setTooltip({ count: bin.length, x: bin.x, y: bin.y, }) }} onFocus={() => {}} onKeyUp={() => {}} onMouseLeave={() => { setTooltip(null) }} /> ))} {tooltip && ( {tooltipText} )} ) } const { width, height } = getDimensions() return (
{!locations && } {locations && renderMap(width, height)}
) } ================================================ FILE: src/containers/Network/Nodes.tsx ================================================ import { useContext } from 'react' import axios from 'axios' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { Map } from './Map' import { NodesTable } from './NodesTable' import Log from '../shared/log' import { FETCH_INTERVAL_ERROR_MILLIS, FETCH_INTERVAL_NODES_MILLIS, isEarlierVersion, localizeNumber, } from '../shared/utils' import { useLanguage } from '../shared/hooks' import { NodeData, NodeResponse } from '../shared/vhsTypes' import NetworkContext from '../shared/NetworkContext' import './css/style.scss' export const ledgerCompare = (a: NodeData, b: NodeData) => { const aLedger = a.validated_ledger.ledger_index const bLedger = b.validated_ledger.ledger_index const compareVersion = isEarlierVersion(b.version, a.version) ? -1 : 1 return bLedger === aLedger ? compareVersion : bLedger - aLedger } export const Nodes = () => { const language = useLanguage() const { t } = useTranslation() const network = useContext(NetworkContext) const { data } = useQuery(['fetchNodesData'], async () => fetchData(), { refetchInterval: (returnedData, _) => returnedData == null ? FETCH_INTERVAL_ERROR_MILLIS : FETCH_INTERVAL_NODES_MILLIS, enabled: !!network, }) const fetchData = async () => axios .get(`${process.env.VITE_DATA_URL}/topology/nodes/${network}`) .then((resp) => resp.data.nodes) .then((allNodes) => { const nodes: NodeData[] = allNodes.map((node: NodeResponse) => ({ ...node, version: node.version?.startsWith('rippled') ? node.version.split('-').slice(1).join('-') : node.version, validated_ledger: { ledger_index: node.complete_ledgers ? Number(node.complete_ledgers.split('-')[1]) : 0, }, load_factor: node.load_factor_server ? Number(node.load_factor_server) : null, })) nodes.sort((a: NodeData, b: NodeData) => { if (a.server_state === b.server_state) { return ledgerCompare(a, b) } if (a.server_state && !b.server_state) { return -1 } return 1 }) const nodesWithLocations = nodes.filter( (node: any) => 'lat' in node && 'long' in node, ) return { nodes, unmapped: nodes.length - nodesWithLocations.length, locations: nodesWithLocations, } }) .catch((e) => Log.error(e)) return (
{t('nodes')}
{ // @ts-ignore - Work around for complex type assignment issues }
{data?.nodes && ( <> {t('nodes_found')}: {localizeNumber(data?.nodes.length, language)} {data?.unmapped ? ( {' '} ({data?.unmapped} {t('unmapped')}) ) : null} )}
) } ================================================ FILE: src/containers/Network/NodesTable.tsx ================================================ import { FC } from 'react' import { useTranslation } from 'react-i18next' import { Loader } from '../shared/components/Loader' import { durationToHuman } from '../shared/utils' import { NodeData } from '../shared/vhsTypes' import './css/nodesTable.scss' import { LEDGER_ROUTE } from '../App/routes' import { RouteLink } from '../shared/routing' const renderLastLedger = (ledger) => ledger && ledger.ledger_index ? ( {ledger.ledger_index} ) : ( unknown ) const renderLedgerHistory = (ledgers, range) => { let count = 0 const MAX_WIDTH = 160 const min = Math.max(range[1] - 10000000, range[0]) const diff = range[1] - min if (ledgers) { const boxes = ledgers.map((l) => { const [low, high] = l const width = Math.min((high - low + 1) / diff, 1) * MAX_WIDTH const left = Math.max((low - min) / diff, 0) * MAX_WIDTH count += high - low return
}) if (count < 0) { return null } return ( <>
{boxes}
{`~${durationToHuman(count * 3.55, 0)}`} ) } return null } const formatLedgerHistory = (nodes) => nodes.map((d) => { if (d.complete_ledgers != null && typeof d.complete_ledgers === 'string') { const ranges = d.complete_ledgers.split(',') const ledgers = ranges .map((l) => { const local = l.split('-') const low = Number(local[0]) return isNaN(low) ? undefined : [low, Number(local[1] || local[0])] }) .filter((l) => Boolean(l)) return { ...d, ledgers } } return { ...d } }) const getLedgerRange = (data) => { let min = Infinity let max = 0 data.forEach((d) => { if (d.ledgers) { d.ledgers.forEach((l) => { const [low, high] = l if (low < min) { min = low } if (high > max) { max = high } }) } }) return [min, max] } const getVersion = (version) => { if (version && version.includes('+')) { return `${version.split('+')[0]}*` } return version } export const NodesTable: FC<{ nodes: NodeData[] }> = ({ nodes: unformattedNodes, }) => { const nodes = unformattedNodes ? formatLedgerHistory(unformattedNodes) : null const ledgerRange = nodes && getLedgerRange(nodes) const { t } = useTranslation() const renderNode = (node) => ( {node.node_public_key} {node.ip} {node.server_state} {getVersion(node.version)} {renderLastLedger(node.validated_ledger)} {durationToHuman(node.uptime)} {node.inbound_count + node.outbound_count} ({node.inbound_count}:{node.outbound_count}) {renderLedgerHistory(node.ledgers, ledgerRange)} {node.quorum} {node.load_factor && node.load_factor > 1 ? node.load_factor.toFixed(2) : ''} {node.io_latency_ms && node.io_latency_ms > 1} ) const content = nodes ? ( {nodes.map(renderNode)}
{t('node_pubkey')} {t('ip')} {t('state')} {t('rippled_version')} {t('last_ledger')} {t('uptime')} {t('peers')} {t('in_out')} {t('ledger_history')} {t('quorum')} {t('load')} {t('latency')}
) : ( ) return
{content}
} ================================================ FILE: src/containers/Network/UpgradeStatus.tsx ================================================ import { useState, useContext } from 'react' import axios from 'axios' import { useQuery } from 'react-query' import { useTranslation } from 'react-i18next' import BarChartVersion from './BarChartVersion' import { FETCH_INTERVAL_MILLIS, FETCH_INTERVAL_ERROR_MILLIS, isEarlierVersion, } from '../shared/utils' import Log from '../shared/log' import { NodeData, NodeResponse, ValidatorResponse } from '../shared/vhsTypes' import NetworkContext from '../shared/NetworkContext' import { ledgerCompare } from './Nodes' import { Loader } from '../shared/components/Loader' import './css/style.scss' interface NodeStats { nodePercent: number nodeCount: number } interface ValidatorStats { validatorPercent: number validatorCount: number } interface ValidatorAggregation { [label: string]: ValidatorStats } interface NodeAggregation { [label: string]: NodeStats } interface DataAggregation extends ValidatorStats, NodeStats { label: string } export const aggregateValidators = (validators: ValidatorResponse[]) => { let totalVals = 0 const aggregation: ValidatorAggregation = {} validators?.forEach((validator) => { if (!validator.signing_key) return const version = validator.server_version totalVals += 1 if (version) { if (!aggregation[version]) { aggregation[version] = { validatorCount: 0, validatorPercent: 0 } } aggregation[version].validatorCount += 1 } }) for (const label of Object.keys(aggregation)) { aggregation[label].validatorPercent = totalVals > 0 ? (aggregation[label].validatorCount / totalVals) * 100 : 0 } return aggregation } export const aggregateNodes = (nodes: NodeResponse[]) => { let totalNodes = 0 const aggregation: NodeAggregation = {} nodes?.forEach((node) => { const { version } = node if (!node.node_public_key) return totalNodes += 1 if (version) { if (!aggregation[version]) { aggregation[version] = { nodeCount: 0, nodePercent: 0 } } aggregation[version].nodeCount += 1 } }) for (const label of Object.keys(aggregation)) { aggregation[label].nodePercent = totalNodes > 0 ? (aggregation[label].nodeCount / totalNodes) * 100 : 0 } return aggregation } export const aggregateData = ( validatorAggregation: ValidatorAggregation, nodeAggregation: NodeAggregation, ): DataAggregation[] => { const combinedAggregation: { [label: string]: ValidatorStats & NodeStats } = {} for (const label of Object.keys(validatorAggregation)) { combinedAggregation[label] = { validatorPercent: validatorAggregation[label].validatorPercent, validatorCount: validatorAggregation[label].validatorCount, nodePercent: 0, nodeCount: 0, } } for (const label of Object.keys(nodeAggregation)) { if (!combinedAggregation[label]) { combinedAggregation[label] = { validatorPercent: 0, validatorCount: 0, nodePercent: nodeAggregation[label].nodePercent, nodeCount: nodeAggregation[label].nodeCount, } } else { combinedAggregation[label].nodePercent = nodeAggregation[label].nodePercent combinedAggregation[label].nodeCount = nodeAggregation[label].nodeCount } } return Object.entries(combinedAggregation) .map(([label, stats]) => ({ label, ...stats, })) .sort((a, b) => (isEarlierVersion(a.label, b.label) ? -1 : 1)) } /** * Extracts the correct node version format from the source data. * (https://data.xrpl.org/v1/network/topology/nodes) * * Node versions often come in in this format: * rippled-[version]-[release (optional)]+[rippled hash (optional)] * Output format: * [version]-[release (optional)] * e.g. rippled-1.9.4+ba3c0e51455a88d76d90b996f20c0f102ac3f5a0.DEBUG should returns 1.9.4 * rippled-1.9.4-b1 should returns 1.9.4-b1 * * @param version - The version retrieved from source data. * @returns - The correct version format. */ const handleNodeVersion = (version: string | undefined) => { let cleanedVersion = version if (version?.startsWith('rippled')) cleanedVersion = `${version.split('-').slice(1).join('-')}` if (version?.includes('+')) cleanedVersion = `${cleanedVersion?.split('+')[0]}` return cleanedVersion } export const UpgradeStatus = () => { const { t } = useTranslation() const [validatorAggregation, setValidatorAggregation] = useState({}) const [nodeAggregation, setNodeAggregation] = useState({}) const network = useContext(NetworkContext) useQuery( ['fetchUpgradeStatusData'], () => { fetchData() }, { refetchInterval: (returnedData, _) => returnedData == null ? FETCH_INTERVAL_ERROR_MILLIS : FETCH_INTERVAL_MILLIS, refetchOnMount: true, enabled: process.env.VITE_ENVIRONMENT !== 'custom' || !!network, }, ) const { data: stableVersion } = useQuery( ['stableVersion'], () => fetchStableVersion(), { placeholderData: null, retryDelay: (returnedData, _) => returnedData == null ? FETCH_INTERVAL_ERROR_MILLIS : FETCH_INTERVAL_MILLIS, refetchOnMount: true, enabled: process.env.VITE_ENVIRONMENT !== 'custom' || !!network, }, ) const fetchData = () => { axios .get(`${process.env.VITE_DATA_URL}/validators/${network}`) .then((resp) => resp.data.validators) .then((validators: ValidatorResponse[]) => { const newValidatorList: Record = {} validators.forEach((validator) => { newValidatorList[validator.signing_key] = validator }) setValidatorAggregation(aggregateValidators(validators)) return Object.values(newValidatorList) }) .catch((e) => Log.error(e)) axios .get(`${process.env.VITE_DATA_URL}/topology/nodes/${network}`) .then((resp) => resp.data.nodes) .then((allNodes) => { const nodes: NodeData[] = allNodes.map((node: NodeResponse) => ({ ...node, version: handleNodeVersion(node.version), validated_ledger: { ledger_index: node.complete_ledgers ? Number(node.complete_ledgers.split('-')[1]) : 0, }, load_factor: node.load_factor_server ? Number(node.load_factor_server) : null, })) nodes.sort((a: NodeData, b: NodeData) => { if (a.server_state === b.server_state) { return ledgerCompare(a, b) } if (a.server_state && !b.server_state) { return -1 } return 1 }) setNodeAggregation(aggregateNodes(nodes)) return nodes }) .catch((e) => Log.error(e)) } const fetchStableVersion = () => { const url = 'https://api.github.com/repos/XRPLF/rippled/releases' return axios .get(url) .then( (resp) => resp.data.find( (release: any) => release.tag_name && !release.prerelease, )?.tag_name || null, ) } return (
{t('upgrade_status')}
{Object.keys(validatorAggregation).length > 0 || Object.keys(nodeAggregation).length > 0 ? (
) : ( )}
) } ================================================ FILE: src/containers/Network/Validators.tsx ================================================ import './css/style.scss' import { useContext, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { Helmet } from 'react-helmet-async' import { useQuery } from 'react-query' import { getServerState } from '../../rippled/lib/rippled' import { ValidatorsTable } from './ValidatorsTable' import { FETCH_INTERVAL_ERROR_MILLIS, FETCH_INTERVAL_FEE_SETTINGS_MILLIS, localizeNumber, } from '../shared/utils' import { useLanguage } from '../shared/hooks' import { Hexagons } from './Hexagons' import { FeeSettings, StreamValidator } from '../shared/vhsTypes' import { VALIDATORS_ROUTE } from '../App/routes' import { useRouteParams } from '../shared/routing' import ValidatorsTabs from './ValidatorsTabs' import { useStreams, StreamsProvider } from '../shared/components/Streams' import { VHSValidatorsProvider, useVHSValidators, } from '../shared/components/VHSValidators' import SocketContext from '../shared/SocketContext' import NetworkContext from '../shared/NetworkContext' export const ValidatorsData = () => { const rippledSocket = useContext(SocketContext) const network = useContext(NetworkContext) const language = useLanguage() const { t } = useTranslation() const { validators: validatorsFromValidations, metrics } = useStreams() const { validators: validatorsFromVHS, unl } = useVHSValidators() const [feeSettings, setFeeSettings] = useState() const merged = useMemo(() => { const fromVHS = validatorsFromVHS ?? {} const fromStream = validatorsFromValidations ?? {} if ( Object.keys(fromVHS).length === 0 && Object.keys(fromStream).length === 0 ) { return [] } const updated: Record = {} const keys = new Set(Object.keys(fromVHS).concat(Object.keys(fromStream))) keys.forEach((d: string) => { const newData: StreamValidator = fromVHS[d] ?? fromStream[d] if ( newData.ledger_index == null && fromStream[d] && fromStream[d].ledger_index ) { // VHS uses `current_index` instead of `ledger_index` // If `ledger_index` isn't defined, then we're still using the VHS data, // instead of the Streams data newData.ledger_index = fromStream[d].ledger_index newData.ledger_hash = fromStream[d].ledger_hash } updated[d] = newData }) return Object.values(updated) }, [validatorsFromVHS, validatorsFromValidations]) const validatorCount = useMemo( () => merged && Object.keys(merged).length, [merged], ) const { tab = 'uptime' } = useRouteParams(VALIDATORS_ROUTE) useQuery(['fetchFeeSettingsData'], () => fetchFeeSettingsData(), { refetchInterval: (returnedData, _) => returnedData == null ? FETCH_INTERVAL_ERROR_MILLIS : FETCH_INTERVAL_FEE_SETTINGS_MILLIS, refetchOnMount: true, enabled: (process.env.VITE_ENVIRONMENT !== 'custom' || !!network) && tab === 'voting', }) function fetchFeeSettingsData() { getServerState(rippledSocket).then((res) => { setFeeSettings({ base_fee: res.state.validated_ledger.base_fee, reserve_base: res.state.validated_ledger.reserve_base, reserve_inc: res.state.validated_ledger.reserve_inc, }) }) } const Body = { uptime: ( ), voting: ( ), }[tab] return (
{t('validators')}
{ // @ts-ignore - Work around for complex type assignment issues }
{t('validators_found')}: {localizeNumber(validatorCount, language)} {unl?.length !== 0 && ( {' '} ({t('unl')}: {unl?.length}) )}
{Body}
) } export const Validators = () => ( ) ================================================ FILE: src/containers/Network/ValidatorsTable.tsx ================================================ import { useTranslation } from 'react-i18next' import { FeeSettings, StreamValidator } from '../shared/vhsTypes' import { RouteLink } from '../shared/routing' import { VALIDATOR_ROUTE, LEDGER_ROUTE } from '../App/routes' import SuccessIcon from '../shared/images/success.svg' import UpIcon from '../shared/images/ic_up.svg' import DownIcon from '../shared/images/ic_down.svg' import DomainLink from '../shared/components/DomainLink' import InfoIcon from '../shared/images/info.svg' import { Loader } from '../shared/components/Loader' import './css/validatorsTable.scss' import { useLanguage } from '../shared/hooks' import { DROPS_TO_XRP_FACTOR, renderXRP } from '../shared/utils' interface ValidatorsTableProps { validators?: StreamValidator[] metrics: any tab: string feeSettings?: FeeSettings } const sortValidators = (data) => { data.sort((a, b) => { const aUnl = a.unl || 'zzz' const bUnl = b.unl || 'zzz' const aDomain = a.domain || 'zzz' const bDomain = b.domain || 'zzz' const aScore = a.agreement_30day ? a.agreement_30day.score : -1 const bScore = b.agreement_30day ? b.agreement_30day.score : -1 const aPubkey = a.master_key || a.signing_key const bPubkey = b.master_key || b.signing_key // 1. Sort by whether the validator is on the UNL if (aUnl > bUnl) return 1 if (aUnl < bUnl) return -1 // 2. Sort by the 30 day score (descending) if (aScore < bScore) return 1 if (aScore > bScore) return -1 // 3. Sort alphabetically by the domain if (aDomain > bDomain) return 1 if (aDomain < bDomain) return -1 // 4. Sort alphabetically by the public key if (aPubkey > bPubkey) return 1 if (aPubkey < bPubkey) return -1 return 0 }) return data } export const ValidatorsTable = (props: ValidatorsTableProps) => { const { validators: rawValidators, metrics, tab, feeSettings } = props const validators = rawValidators ? sortValidators( rawValidators.filter((v) => v.master_key || v.signing_key || v.pubkey), ) : undefined const { t } = useTranslation() const language = useLanguage() const renderDomain = (domain) => domain && const renderAgreement = (className, agreement) => agreement ? ( {Number.parseFloat(agreement.score).toFixed(5)} {agreement.incomplete && *} ) : ( ) const renderFeeVoting = (className, data, currentFee, pubkey) => data ? ( {currentFee && data !== currentFee && (data > currentFee ? ( ) : ( ))} {renderXRP(data / DROPS_TO_XRP_FACTOR, language)} ) : ( ) const renderValidator = (d) => { const color = d.ledger_hash ? `#${d.ledger_hash.substring(0, 6)}` : '' const trusted = d.unl ? 'yes' : 'no' // Note: Validator information is obtained from VHS and subscription Stream. The latter type uses pubkey as an alias for validation_public_key field (which is the signing key of the validator) const pubkey = d.master_key || d.signing_key || d.pubkey const onNegativeUnl = metrics.nUnl && metrics.nUnl.includes(pubkey) const nUnl = onNegativeUnl ? 'yes' : 'no' const ledgerIndex = d.ledger_index ?? d.current_index return ( {pubkey} {renderDomain(d.domain)} {d.unl && } {onNegativeUnl && } {d.server_version} {tab === 'uptime' ? ( <> {renderAgreement('h1', d.agreement_1h)} {renderAgreement('h24', d.agreement_24h)} {renderAgreement('d30', d.agreement_30day)} ) : ( <> {renderFeeVoting( 'base', d.reserve_base, feeSettings?.reserve_base, pubkey, )} {renderFeeVoting( 'owner', d.reserve_inc, feeSettings?.reserve_inc, pubkey, )} {renderFeeVoting( 'base_fee', d.base_fee, feeSettings?.base_fee, pubkey, )} )} {ledgerIndex} {d.partial && '*'} ) } const content = validators ? ( {tab === 'uptime' ? ( <> ) : ( <> {' '} )} {validators.map(renderValidator)}
{t('pubkey')} {t('domain')} {t('unl')} {t('nUnlCol')} {t('Version')}{t('1H')} {t('24H')} {t('30D')} {t('base')} {t('owner')} {t('base_fee')}{t('ledger')}
) : ( ) return
{content}
} ================================================ FILE: src/containers/Network/ValidatorsTabs.tsx ================================================ import { Tabs } from '../shared/components/Tabs' import { buildPath } from '../shared/routing' import { VALIDATORS_ROUTE } from '../App/routes' interface Props { selected: string } const ValidatorsTabs = (props: Props) => { const { selected } = props const tabs = ['uptime', 'voting'] return ( ) } export default ValidatorsTabs ================================================ FILE: src/containers/Network/css/barchart.scss ================================================ @use '../../shared/css/variables' as *; .y-label { fill: $black-40; } .barchart { position: relative; overflow: hidden; width: 100%; height: 100%; p, span { color: $black-40; line-height: 70%; } } .custom-tooltip { margin: 10px; p { color: $white; } } .custom-legend { display: flex; margin: 0 16px 40px; .legend-color { display: flex; align-items: center; gap: 0 16px; .segment { display: flex; align-items: center; gap: 0 16px; .icon { &.vals { background-color: $green-50; } &.nodes { background-color: $blue-purple-50; } &.yea { background-color: $green-50; } &.nay { background-color: $magenta-70; } width: 16px; height: 16px; border-radius: 4px; } .text { color: $white; text-transform: capitalize; } } } .legend-stable { padding: 16px; border-radius: $border-radius; margin-left: auto; background-color: $black-70; .stable { color: $black-0; font-weight: 700; } } } ================================================ FILE: src/containers/Network/css/hexagons.scss ================================================ @use '../../shared/css/variables' as *; .validators-container { .validators { position: relative; background: $black-80; svg { display: block; filter: drop-shadow(0px 0px 2px $black-70); } .mesh path { fill: none; stroke: $black; } .hexagons { display: block; margin: auto; .hexagon path { cursor: pointer; fill-opacity: 0.8; stroke-opacity: 1; @include for-size(tablet-landscape-up) { cursor: auto; } } .hexagon.updated path { animation-duration: 0.7s; animation-name: hex-update; animation-timing-function: ease-in-out; } .hexagon.selected path { fill-opacity: 1; stroke: black !important; } @keyframes hex-update { 0% { transform: scale(1); } 20% { transform: scale(1.15); } 100% { transform: scale(1); } } } } } ================================================ FILE: src/containers/Network/css/map.scss ================================================ @use '../../shared/css/variables' as *; .nodes-map { position: relative; svg { display: block; margin: auto; .country { fill: $black-40; opacity: 0.2; } .tooltip { font-size: 12px; rect { fill: white; fill-opacity: 0.5; } } .legend { text { fill: $black-40; font-size: 10px; @include regular; } } } } ================================================ FILE: src/containers/Network/css/nodesTable.scss ================================================ @use '../../shared/css/variables' as *; @use '../../shared/css/table'; .nodes-table { position: relative; min-height: 150px; table { .pubkey { max-width: 70px; @include for-size(tablet-portrait-up) { max-width: 100px; } @include for-size(big-desktop-up) { max-width: 180px; } @media (width >= 1300px) { max-width: 280px; } @media (width >= 1400px) { max-width: 350px; } } .state { min-width: 60px; text-transform: uppercase; @include semibold; } .state span { display: inline-block; padding: 4px 12px; border-radius: 100px; margin: 1px 0; } .state .full { background-color: $green; color: black; } .state .proposing { background-color: $orange; color: white; } .state .connected { background-color: $yellow; color: $black-60; } .version { max-width: 60px; } .uptime { text-align: right; @include for-size(tablet-landscape-up) { text-align: left; } } .last-ledger { i { color: $black-30; } } .in-out small { color: $black-50; font-weight: bold; } .ledgers { text-align: right; @include for-size(big-desktop-up) { text-align: left; } } .ledgers .boxes { position: relative; display: none; height: 12px; margin: 3px 5px; vertical-align: middle; @include for-size(big-desktop-up) { display: inline-block; } } .ledgers .boxes div { position: absolute; height: 100%; border-radius: 2px; background: $black-50; } .ledgers span { color: $black-50; font-weight: bold; vertical-align: middle; } .quorum, .load-factor, .latency { display: none; @include for-size(desktop-up) { display: table-cell; } } .last-ledger, .ledgers { display: none; @media (width >= 750px) { display: table-cell; } } .peers, .version, .in-out { display: none; @include for-size(tablet-landscape-up) { display: table-cell; } } } } ================================================ FILE: src/containers/Network/css/style.scss ================================================ @use '../../shared/css/variables' as *; .network-page { // Needs additional bottom margin to break up table from the horizontal // rule that delineates the footer margin: 0 0 50px; .loader { position: absolute; top: 1px; min-height: 100px; } .stat { min-height: 15px; padding: 2px; color: $black-40; font-size: 11px; text-align: center; text-transform: uppercase; i { font-size: 10px; } @include for-size(tablet-landscape-up) { padding: 4px 10px; font-size: 12px; i { font-size: 11px; } } } .wrap { overflow: auto; width: 100%; max-width: 1500px; margin: auto; } .type { display: inline-block; margin-top: 80px; margin-bottom: 32px; margin-left: 16px; margin-left: calc((100vw - 1500px) / 2); margin-left: clamp( 16px, calc((100vw - 1500px) / 2), calc((100vw - 1500px) / 2) ); // Adjust based on wrap margin with min 16px color: $white; font-size: 32px; @include for-size(tablet-portrait-up) { font-size: 42px; } @include bold; } } ================================================ FILE: src/containers/Network/css/validatorsTable.scss ================================================ @use '../../shared/css/variables' as *; .validators-table { position: relative; min-height: 150px; table { .pubkey { max-width: 70px; @include for-size(tablet-portrait-up) { max-width: 100px; } @include for-size(big-desktop-up) { max-width: 180px; } @media (width >= 1300px) { max-width: 280px; } @media (width >= 1400px) { max-width: 350px; } } .fee { min-width: 90px; color: $orange-50; } .missed { color: $orange-50; } .domain { max-width: 140px; @include medium; } .last-ledger { min-width: 55px; @include bold; // When a validation comes in we update the color to use the ledgers hash. Until that occurs the table's default // text color is used. a { color: inherit; } } .unl, .n-unl { max-width: 40px; } .unl { text-align: center; } .unl.yes { color: $green; } .n-unl { text-align: center; text-transform: none; img { height: 16px; transform: rotate(180deg); } } .n-unl.yes { color: $orange-40; } .fee-icon { position: relative; top: 1.5px; margin-right: 4px; } .vote { white-space: nowrap; } } &.uptime-tab { .pubkey, .score.h1, .score.d30, .fee { display: none; } @include for-size(tablet-portrait-up) { .score.d30 { display: table-cell; } } @include for-size(tablet-landscape-up) { .pubkey { display: table-cell; } } @include for-size(desktop-up) { .score.h1, .fee { display: table-cell; } } } &.voting-tab { .pubkey, .last-ledger, .n-unl, .version { display: none; } @include for-size(tablet-portrait-up) { .n-unl, .version { display: table-cell; } } @include for-size(tablet-landscape-up) { .pubkey { display: table-cell; } } @include for-size(desktop-up) { .last-ledger { display: table-cell; } } } } ================================================ FILE: src/containers/Network/test/metrics.json ================================================ [ { "type": "metric", "data": { "base_fee": "0.00001", "txn_sec": "4.54", "txn_ledger": "17.20", "ledger_interval": "3.788", "avg_fee": "0.00001185", "quorum": 7, "nUNL": [] } }, { "type": "metric", "data": { "base_fee": "0.00001", "txn_sec": "4.54", "txn_ledger": "17.20", "ledger_interval": "3.788", "avg_fee": "0.00001185", "quorum": 7, "nUNL": ["nHUroc3Q1ErBXs689SEi3nWEeM759Pn1LsZk27jMHJtiemHXVmJb"] } }, { "type": "metric", "data": { "base_fee": "0.00001", "txn_sec": "4.54", "txn_ledger": "17.20", "ledger_interval": "3.788", "avg_fee": "0.00001185", "quorum": 7, "nUNL": [ "nHUigfqnuuNAzcppLjb33mquLVnxU6jGQHvEo47XRjaHHE6pZUUY", "nHUACtV4UJoQjA6eR7Nj5sc5hKwXFrzXKz8H3qxD5ksjt3ihgf4c" ] } } ] ================================================ FILE: src/containers/Network/test/mockNodes.json ================================================ [ { "ip": "169.44.60.105", "inbound_count": 21, "outbound_count": 50, "node_public_key": "n9KDJqdL5pebR35tkE4pRuZ7MhTvQGid8YqwjJajwrZUN5fEDxsZ", "hostid": "LILY", "server_state": "full", "last_close": { "converge_time_s": 3.002, "proposers": 26 }, "state_accounting": { "connected": { "duration": 382.5318, "transitions": 1 }, "disconnected": { "duration": 1.132517, "transitions": 1 }, "full": { "duration": 4964702.486372, "transitions": 1 }, "syncing": { "duration": 3.070643, "transitions": 1 }, "tracking": { "duration": 0.000009, "transitions": 1 } }, "complete_ledgers": "32570-44989400", "io_latency_ms": 1, "load_factor_server": 1, "peers": 71, "peer_disconnects": 280, "peer_disconnects_resources": 55, "validated_ledger": { "ledger_index": 44989400, "ledger_hash": "F316CE01C93F763C9A831A0708E107C367D82DC9D93DF71619571D826EF6EDB5", "age": 5 }, "quorum": 21, "version": "1.1.2", "uptime": 4965089, "lat": "42.36", "long": "-71.10" }, { "node_public_key": "n9LkwyXNWRjYv7sR1Ks9D8XbEhabeNPH9nCNViYmV7ouFCj1mdAd", "version": "1.2.0-rc2", "uptime": 318727, "inbound_count": 47, "outbound_count": 8, "lat": "42.27", "long": "-83.71" }, { "ip": "54.218.232.1", "port": 51235, "node_public_key": "n9Kt2gdtxsYV6h4SAfHkRFUMU8gB6rDQ3MktiB3MMEDS9s9obu9b", "version": "rippled-1.2.0-rc2", "uptime": 322409, "inbound_count": 106, "outbound_count": 88, "hostid": "ABUT", "server_state": "full", "last_close": { "converge_time_s": 3.002, "proposers": 26 }, "state_accounting": { "connected": { "duration": 189.370719, "transitions": 1 }, "disconnected": { "duration": 1.095056, "transitions": 1 }, "full": { "duration": 322216.468535, "transitions": 1 }, "syncing": { "duration": 2.139793, "transitions": 1 }, "tracking": { "duration": 0.002662, "transitions": 1 } }, "complete_ledgers": "44110988-44989400", "latency": 1, "load_factor": 1, "peers": 195, "peer_disconnects": 33855, "peer_disconnects_resources": 73, "validated_ledger": { "ledger_index": 44989400, "ledger_hash": "F316CE01C93F763C9A831A0708E107C367D82DC9D93DF71619571D826EF6EDB5", "age": 6 }, "quorum": 21 } ] ================================================ FILE: src/containers/Network/test/mockValidation.json ================================================ { "cookie": "14152263757286605278", "data": "228000000126041CBE3129297345043AC466F0E7C4B401DE51A5F887A191348B69129B168EDA5BC8EEE9EAC60E2599A8034742199471C706045017BAE56CBDEAAFD73CBDEBE8BCF1CDDE879D327430F8A47BB9B787DA6D0A5E91F450190C12B30677B3D8D6ADC7DCC8528694E2FD1515950FB2AAD621D9E9B31833B4447321032CE084DEC33CF6FA0D093E0BC8C3E95C6702DBEB30FDF06F87545AF8A43B26FA76463044022023EDCAEE7C6812A418F51AB044974AD35B33D9B147C0A3417833E8F0D406CCEE022026AB3CF6BC52B94B43EC64EC6731304483630DB43BE7720CBCF93E71CF66AEC9", "flags": 2147483649, "full": true, "ledger_hash": "A1689E0CDA6523C82D5D848202DAB2FD458D715EED9DB11A3B7088A56681D588", "ledger_index": "44921927", "master_key": "nHUFCyRCrUjvtZmKiLeF8ReopzKuUoKeDeXo3wEUBVSaawzcSBpW", "signature": "3044022023EDCAEE7C6812A418F51AB044974AD35B33D9B147C0A3417833E8F0D406CCEE022026AB3CF6BC52B94B43EC64EC6731304483630DB43BE7720CBCF93E71CF66AEC9", "signing_time": 1549400032000, "type": "validationReceived", "validated_hash": "0C12B30677B3D8D6ADC7DCC8528694E2FD1515950FB2AAD621D9E9B31833B444", "validation_public_key": "n9KaxgJv69FucW5kkiaMhCqS6sAR1wUVxpZaZmLGVXxAcAse9YhR" } ================================================ FILE: src/containers/Network/test/mockValidators.json ================================================ [ { "master_key": "nHUtXf1nPkE4YuVTurzCJjSWKpmET3orqgfSFXWiQD31fMhf4Sf1", "signing_key": "n9MLBvEW5cNsF4kzjKfF8eaLSg3fKDay4EpkG4pNxoYemmWz926y", "ledger_hash": "0FF09638B2F02577ABB916E20E99F94B1D159FC0F4A6E233B0029F6211A28B32", "current_index": 44993868, "partial": false, "chain": null, "unl": "vl.ripple.com", "last_ledger_time": "2019-02-08T22:44:56.000Z", "agreement_1h": { "score": 1, "missed": 0, "incomplete": false }, "agreement_24h": { "score": 0.91729, "missed": 17, "incomplete": true }, "agreement_30day": { "score": 0.98468, "missed": 120, "incomplete": true }, "base_fee": 10, "reserve_base": 1000000, "reserve_inc": 200000 }, { "master_key": "nHDaxUL87HiVszvCamVu4A3Gecq6LTxKkUVNdzf3nqmuSywgRqu4", "signing_key": "n9KP4hb94gXC5Sq8Kay4ibXmaxcHWyGDB4RX4AxxgzsQZq1YJ3Co", "ledger_hash": "0FF09638B2F02577ABB916E20E99F94B1D159FC0F4A6E233B0029F6211A28B32", "current_index": 44993868, "partial": false, "chain": null, "unl": "vl.ripple.com", "last_ledger_time": "2019-02-08T22:44:56.000Z", "agreement_1h": { "score": 1, "missed": 0, "incomplete": false }, "agreement_24h": { "score": 1, "missed": 0, "incomplete": true }, "agreement_30day": { "score": 0.98, "missed": 1, "incomplete": true }, "base_fee": 200, "reserve_base": 1000000, "reserve_inc": 200000 }, { "master_key": "nHUroc3Q1ErBXs689SEi3nWEeM759Pn1LsZk27jMHJtiemHXVmJb", "signing_key": "n9MvNaY8mc9zjp5FfkWNG86medDQe3KSGdovyTnhj1w5x1eqFo7F", "ledger_hash": "0FF09638B2F02577ABB916E20E99F94B1D159FC0F4A6E233B0029F6211A28B32", "current_index": 44993868, "partial": false, "chain": null, "unl": null, "last_ledger_time": "2019-02-08T22:44:56.000Z", "agreement_1h": { "score": 1, "missed": 0, "incomplete": false }, "agreement_24h": { "score": 1, "missed": 0, "incomplete": true }, "agreement_30day": { "score": 0.99947, "missed": 33, "incomplete": true } }, { "master_key": null, "signing_key": "n9Jq65bCFdcPzC6Fca6RrXmvu9jwgVo9rPJ3UZv6y9Kihnt2Xfd8", "ledger_hash": "0FF09638B2F02577ABB916E20E99F94B1D159FC0F4A6E233B0029F6211A28B32", "current_index": 44993868, "partial": false, "chain": null, "unl": null, "last_ledger_time": "2019-02-08T22:44:56.000Z", "agreement_1h": { "score": 1, "missed": 0, "incomplete": false }, "agreement_24h": { "score": 0.99942, "missed": 7, "incomplete": true }, "agreement_30day": { "score": 0.99964, "missed": 15, "incomplete": true }, "base_fee": 12, "reserve_base": 1000000, "reserve_inc": 100000 } ] ================================================ FILE: src/containers/Network/test/nodes.test.js ================================================ import { render, fireEvent, waitFor } from '@testing-library/react' import moxios from 'moxios' import { Route } from 'react-router' import i18n from '../../../i18n/testConfig' import mockNodes from './mockNodes.json' import NetworkContext from '../../shared/NetworkContext' import countries from '../../../../public/countries.json' import { QuickHarness } from '../../test/utils' import { NODES_ROUTE } from '../../App/routes' import { Nodes } from '../Nodes' jest.mock('usehooks-ts', () => ({ useWindowSize: () => ({ width: 375, height: 600, }), })) describe('Nodes Page container', () => { const renderNodes = () => render( } /> , ) const oldEnvs = process.env beforeEach(() => { moxios.install() process.env = { ...oldEnvs, VITE_ENVIRONMENT: 'mainnet' } }) afterEach(() => { moxios.uninstall() process.env = oldEnvs }) it('renders without crashing', () => { renderNodes() }) it('renders all parts', async () => { moxios.stubRequest(`${process.env.VITE_DATA_URL}/topology/nodes/main`, { status: 200, response: { nodes: mockNodes }, }) moxios.stubRequest(`/countries.json`, { status: 200, response: countries, }) const { container } = renderNodes() expect(container.querySelectorAll('.nodes-map').length).toBe(1) expect(container.querySelector('.stat').outerHTML).toBe( '
', ) expect(container.querySelectorAll('.nodes-table').length).toBe(1) await waitFor(() => { expect(container.querySelector('.stat').outerHTML).toBe( '
nodes_found: 3 (1 unmapped)
', ) }) expect(container.querySelectorAll('.nodes-map .tooltip').length).toBe(0) const nodeElement = container.querySelector('.nodes-map path.node') fireEvent.mouseOver(nodeElement) await waitFor(() => { expect(container.querySelectorAll('.nodes-map .tooltip').length).toBe(1) }) expect(container.querySelector('.nodes-map .tooltip').outerHTML).toBe( '1 nodes', ) fireEvent.mouseLeave(nodeElement) await waitFor(() => { expect(container.querySelectorAll('.nodes-map .tooltip').length).toBe(0) }) expect(container.querySelectorAll('.nodes-map path.node').length).toBe(2) expect(container.querySelectorAll('.nodes-table table tr').length).toBe(4) }) }) ================================================ FILE: src/containers/Network/test/nodesTable.test.js ================================================ import { render } from '@testing-library/react' import { BrowserRouter as Router } from 'react-router' import { I18nextProvider } from 'react-i18next' import i18n from '../../../i18n/testConfig' import { NodesTable } from '../NodesTable' import nodes from './mockNodes.json' /* eslint-disable react/jsx-props-no-spreading */ const renderNodesTable = (props = {}) => render( , ) describe('Nodes table', () => { it('renders without crashing', () => { renderNodesTable() }) it('renders all parts', () => { const { container } = renderNodesTable({ nodes }) expect(container.querySelectorAll('tr').length).toBe(nodes.length + 1) }) }) ================================================ FILE: src/containers/Network/test/upgradeStatus.test.js ================================================ import { render, waitFor } from '@testing-library/react' import moxios from 'moxios' import WS from 'jest-websocket-mock' import { Route } from 'react-router' import i18n from '../../../i18n/testConfig' import SocketContext from '../../shared/SocketContext' import NetworkContext from '../../shared/NetworkContext' import MockWsClient from '../../test/mockWsClient' import { QuickHarness } from '../../test/utils' import { UpgradeStatus, aggregateData, aggregateNodes, aggregateValidators, } from '../UpgradeStatus' import { UPGRADE_STATUS_ROUTE } from '../../App/routes' const undefinedValidatorsData = [ { ledger_index: 74661353, ledger_hash: '613E298A8C0AEB816D16AA61952E0834BBD9B5E5677EA3E9A2413118EE074363', }, { master_key: 'nHUakYHufAvdx5XqTS2F4Pu7i8fQqDqpKqXN2kUGHhBFcG38GNqL', signing_key: 'n9M38x7Sf7epp3gaxgcFxEtwkSc4w2ePb1SgfLiz9bVCr5Lvzrm8', unl: false, domain: 'gerty.one', ledger_index: 74554449, server_version: '1.9.4', agreement_1hour: { missed: 936, total: 936, score: '0.00000', incomplete: false, }, agreement_24hour: { missed: 22338, total: 22338, score: '0.00000', incomplete: false, }, agreement_30day: { missed: 263139, total: 535427, score: '0.50854', incomplete: false, }, chain: 'chain.4', partial: false, }, ] const nodesData = [ { node_public_key: 'n9JoeT8XKeBSR8y4D9aDz2PL1DD1j6LQwkRTbH2eFqeRmWYHj2Nw', networks: 'dev', complete_ledgers: '22085270-29882772', ip: '34.208.12.148', port: 2459, uptime: 1257336, version: '1.11.0-rc3', server_state: 'full', io_latency_ms: 1, load_factor_server: '256', inbound_count: 4, outbound_count: 9, lat: '45.82', long: '-119.73', country_code: 'US', country: 'United States', region: 'Oregon', region_code: 'OR', city: 'Boardman', postal_code: '97818', timezone: 'America/Los_Angeles', }, ] describe('UpgradeStatus test functions', () => { it('aggregate data works with validators without keys', () => { const validatorAggregate = aggregateValidators(undefinedValidatorsData) expect(validatorAggregate).toEqual({ '1.9.4': { validatorCount: 1, validatorPercent: 100 }, }) const nodeAggregate = aggregateNodes(nodesData) expect(nodeAggregate).toEqual({ '1.11.0-rc3': { nodeCount: 1, nodePercent: 100 }, }) expect(aggregateData(validatorAggregate, nodeAggregate)).toEqual([ { label: '1.9.4', validatorCount: 1, validatorPercent: 100, nodeCount: 0, nodePercent: 0, }, { label: '1.11.0-rc3', validatorCount: 0, validatorPercent: 0, nodeCount: 1, nodePercent: 100, }, ]) }) }) describe('UpgradeStatus renders', () => { let server let client const WS_URL = 'ws://localhost:1234' const renderUpgradeStatus = () => render( } /> , ) beforeEach(async () => { window.ResizeObserver = jest.fn().mockImplementation(() => ({ observe: jest.fn(), unobserve: jest.fn(), disconnect: jest.fn(), })) server = new WS(WS_URL, { jsonProtocol: true }) client = new MockWsClient(WS_URL) await server.connected moxios.install() }) afterEach(async () => { moxios.uninstall() server.close() client.close() WS.clean() }) it('renders without crashing', async () => { renderUpgradeStatus() }) it('renders when nodes request errors', async () => { moxios.stubRequest(`${process.env.VITE_DATA_URL}/validators/main`, { status: 200, response: { validators: undefinedValidatorsData }, }) moxios.stubRequest(`${process.env.VITE_DATA_URL}/topology/nodes/main`, { status: 502, }) const { container } = renderUpgradeStatus() await waitFor(() => { expect(container.querySelectorAll('.barchart').length).toEqual(1) }) }) }) ================================================ FILE: src/containers/Network/test/validators.test.js ================================================ import { render, waitFor, screen } from '@testing-library/react' import moxios from 'moxios' import WS from 'jest-websocket-mock' import { Route } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../i18n/testConfig' import mockValidators from './mockValidators.json' import validationMessage from './mockValidation.json' import SocketContext from '../../shared/SocketContext' import NetworkContext from '../../shared/NetworkContext' import MockWsClient from '../../test/mockWsClient' import { QuickHarness } from '../../test/utils' import { VALIDATORS_ROUTE } from '../../App/routes' import { Validators } from '../Validators' import { queryClient } from '../../shared/QueryClient' const WS_URL = 'ws://localhost:1234' describe('Validators Tab container', () => { let server let client const renderValidators = () => render( } /> , ) beforeEach(async () => { server = new WS(WS_URL, { jsonProtocol: true }) client = new MockWsClient(WS_URL) await server.connected moxios.install() }) afterEach(() => { moxios.uninstall() server.close() client.close() WS.clean() }) it('renders without crashing', async () => { renderValidators() }) it('displays validators from VHS API', async () => { moxios.stubRequest(`${process.env.VITE_DATA_URL}/validators/main`, { status: 200, response: { validators: mockValidators }, }) const { container } = renderValidators() await waitFor(() => { expect(container.querySelector('.stat').textContent).toEqual( 'validators_found: 4 (unl: 2)', ) }) expect(container.querySelectorAll('.hexagons').length).toBe(1) }) it('merges validators from both VHS API and WebSocket stream', async () => { moxios.stubRequest(`${process.env.VITE_DATA_URL}/validators/main`, { status: 200, response: { validators: mockValidators }, }) const { container } = renderValidators() server.send(validationMessage) await waitFor(() => { expect(container.querySelector('.stat').textContent).toEqual( 'validators_found: 5 (unl: 2)', ) }) expect(container.querySelectorAll('.hexagons').length).toBe(1) expect(container.querySelectorAll('.validators-table').length).toBe(1) const tableRows = container.querySelectorAll( '.validators-table table tbody tr', ) expect(tableRows.length).toBe(5) expect( screen.getByText('n9KaxgJv69FucW5kkiaMhCqS6sAR1wUVxpZaZmLGVXxAcAse9YhR'), ).toBeInTheDocument() }) }) ================================================ FILE: src/containers/Network/test/validatorsTable.test.js ================================================ import { render } from '@testing-library/react' import { BrowserRouter as Router } from 'react-router' import { I18nextProvider } from 'react-i18next' import i18n from '../../../i18n/testConfig' import { ValidatorsTable } from '../ValidatorsTable' import validators from './mockValidators.json' import metrics from './metrics.json' /* eslint-disable react/jsx-props-no-spreading */ const renderValidatorsTable = (props = {}) => render( , ) describe('Validators table', () => { it('renders without crashing', () => { renderValidatorsTable() }) it('renders all parts', () => { const tab = 'uptime' const { container } = renderValidatorsTable({ validators, metrics, tab }) expect(container.querySelectorAll('tr').length).toBe(validators.length + 1) }) it('renders uptime tab', () => { const tab = 'uptime' const { container } = renderValidatorsTable({ validators, metrics, tab }) expect(container.querySelectorAll('.uptime-tab').length).toBe(1) expect(container.querySelector('td.h1').textContent.trim()).toBe('1.00000') expect(container.querySelector('td.h24').textContent.trim()).toBe( '0.91729*', ) expect(container.querySelector('td.d30').textContent.trim()).toBe( '0.98468*', ) }) it('renders voting tab', () => { const tab = 'voting' const { container } = renderValidatorsTable({ validators, metrics, tab }) expect(container.querySelectorAll('.voting-tab').length).toBe(1) expect(container.querySelector('td.base').textContent.trim()).toContain( '1.00', ) expect(container.querySelector('td.owner').textContent.trim()).toContain( '0.20', ) expect(container.querySelector('td.base_fee').textContent.trim()).toContain( '0.00001', ) }) }) ================================================ FILE: src/containers/NoMatch/index.tsx ================================================ import { useContext, useEffect } from 'react' import { Helmet } from 'react-helmet-async' import { useTranslation } from 'react-i18next' import { useAnalytics } from '../shared/analytics' import SocketContext from '../shared/SocketContext' import InfoIcon from '../shared/images/info.svg' import './nomatch.scss' export interface NoMatchProps { /** The i18n key to use for the title. If the key contains "not_found" it is treated as a 404 type page */ title?: string /** An array of i18n keys to use for hints */ hints?: string[] /** Treat the message as an error. Adds "Uh Oh". */ isError?: boolean /** Custom warning message to display next to info icon */ warning?: string } /** * Provides messaging for not found. I18n values have access to XrplClient's ConnectionState through the variable `connection`. * @constructor */ const NoMatch = ({ title = 'not_found_default_title', hints = ['not_found_check_url'], isError = true, warning = undefined, }: NoMatchProps) => { const { track } = useAnalytics() const { t } = useTranslation() const socket = useContext(SocketContext) const values = { connection: socket?.getState() } useEffect(() => { track('not_found', { description: `${title} -- ${hints.join(', ')}`, }) // eslint-disable-next-line react-hooks/exhaustive-deps -- hints has to be spread to prevent this from running multiple times }, [...hints, title, track]) const notFound = title.includes('not_found') const hintMsg = hints.map((hint) => (
{t(hint as any, values)}
)) const derivedWarning = warning ?? (notFound && t('not_found')) return (
{isError &&
{t('uh_oh')}
}
{t(title as any, values)}
{hintMsg} {(derivedWarning || isError) && (
  {derivedWarning}
)}
) } export default NoMatch ================================================ FILE: src/containers/NoMatch/nomatch.scss ================================================ @use '../shared/css/variables' as *; .no-match { margin: 10% auto; text-align: center; .uh-oh { display: inline-block; padding: 2px 8px; border: 1px solid $black-80; border-radius: 4px; margin-bottom: 24px; color: $black-20; font-size: 12px; line-height: 20px; @include bold; } .title { margin-bottom: 16px; color: $black-20; font-size: 40px; line-height: 48px; @include bold; } .hint { margin-bottom: 16px; color: $black-50; font-size: 16px; line-height: 24px; @include bold; } .warning { justify-content: center; } } ================================================ FILE: src/containers/NoMatch/test/NoMatch.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { HelmetProvider } from 'react-helmet-async' import MockWsClient from '../../test/mockWsClient' import SocketContext, { ExplorerXrplClient } from '../../shared/SocketContext' import i18n from '../../../i18n/testConfigEnglish' import NoMatch from '../index' /* eslint-disable react/jsx-props-no-spreading */ describe('NoMatch container', () => { const renderNoMatch = (props = {}) => { const client = new MockWsClient() as unknown as ExplorerXrplClient return render( , ) } it('renders without crashing', () => { renderNoMatch() }) it('renders default messages and parts', () => { const { container } = renderNoMatch() expect(screen.getByText('UH-OH!')).toBeInTheDocument() expect(screen.getByText('Page Not Found')).toBeInTheDocument() expect(screen.getByText('Please double check your URL')).toBeInTheDocument() expect(container.querySelector('.warning')).toBeInTheDocument() }) it('renders correct messages from props', () => { const params = { title: 'props_title', hints: ['props_hint_1', 'props_hint_2'], } const { container } = renderNoMatch(params) expect(screen.getByText('UH-OH!')).toBeInTheDocument() expect(screen.getByText('props_title')).toBeInTheDocument() const hints = container.querySelectorAll('.hint') expect(hints).toHaveLength(2) expect(hints[0]).toHaveTextContent('props_hint_1') expect(hints[1]).toHaveTextContent('props_hint_2') expect(container.querySelector('.warning')).toBeInTheDocument() }) it('does not render warning or uhoh when not an error', () => { const params = { title: 'props_title', hints: ['props_hint_1', 'props_hint_2'], isError: false, } const { container } = renderNoMatch(params) expect(container.querySelector('.uh-oh')).not.toBeInTheDocument() expect(screen.getByText('props_title')).toBeInTheDocument() const hints = container.querySelectorAll('.hint') expect(hints).toHaveLength(2) expect(hints[0]).toHaveTextContent('props_hint_1') expect(hints[1]).toHaveTextContent('props_hint_2') expect(container.querySelector('.warning')).not.toBeInTheDocument() }) it('renders custom warning', () => { const params = { title: 'props_title', hints: ['props_hint_1', 'props_hint_2'], warning: 'be_warned', } renderNoMatch(params) expect(screen.getByText('be_warned')).toBeInTheDocument() }) it('renders connection state', () => { i18n.addResource( 'en-US', 'test', 'hint_test', 'Version: {{connection.server.version}}', ) const params = { title: 'props_title', hints: ['test:hint_test'], } renderNoMatch(params) expect(screen.getByText('Version: 1.9.4')).toBeInTheDocument() }) }) ================================================ FILE: src/containers/SearchResult/index.tsx ================================================ import NoMatch from '../NoMatch' const SearchResult = () => export default SearchResult ================================================ FILE: src/containers/Token/IOU/Header/index.tsx ================================================ import { useTranslation } from 'react-i18next' import { useMemo } from 'react' import './styles.scss' import Currency from '../../../shared/components/Currency' import { HeaderBoxes, MarketData, OverviewData, } from '../components/HeaderBoxes' import { LOSToken } from '../../../shared/losTypes' import { TokenHoldersData } from '../api/holders' import DomainLink from '../../../shared/components/DomainLink' import GlobeSvg from '../../../shared/images/globe.svg' import { parseAmount, parseCurrencyAmount, parseIntegerAmount, parsePercent, parsePrice, } from '../../../shared/NumberFormattingUtils' import { shortenDomain, stripHttpProtocol } from '../../../shared/utils' interface HeaderProps { currency: string tokenData: LOSToken xrpUSDRate: string holdersData?: TokenHoldersData isHoldersDataLoading: boolean ammTvlData?: { tvl: number; account: string } isAmmTvlLoading: boolean } const calculateCirculatingSupply = ( tokenData: LOSToken, holdersData: TokenHoldersData | undefined, ): number => { if (tokenData.circ_supply) { return Number(tokenData.circ_supply) } let circSupply = Number(tokenData.supply) || holdersData?.totalSupply || 0 // For stablecoins, don't subtract large percentage holders from circulating supply if (tokenData.asset_subclass !== 'stablecoin' && holdersData) { holdersData.holders.forEach((holder) => { if (holder.percent >= 20) { circSupply -= holder.balance } }) } return circSupply } export const Header = ({ currency, tokenData, xrpUSDRate, holdersData, isHoldersDataLoading, ammTvlData, isAmmTvlLoading, }: HeaderProps) => { const { t } = useTranslation() const circSupply = calculateCirculatingSupply(tokenData, holdersData) const xrpRate = Number(xrpUSDRate) || 0 // Memoized formatted overview data const overviewData: OverviewData = useMemo(() => { const priceNum = Number(tokenData.price) || 0 const normPrice = priceNum * xrpRate const formattedPrice = parsePrice(normPrice) const formattedHolders = parseIntegerAmount(tokenData.holders || 0) const formattedTrustlines = parseIntegerAmount(tokenData.trustlines || 0) const formattedTransferFee = parsePercent(tokenData.transfer_fee || 0) !== '0.00%' ? parsePercent(tokenData.transfer_fee || 0) : '--' return { issuer: tokenData.issuer_name || tokenData.issuer_account, issuer_account: tokenData.issuer_account, price: formattedPrice, holders: formattedHolders, trustlines: formattedTrustlines, transfer_fee: formattedTransferFee, } }, [tokenData, xrpRate]) // Memoized formatted market data const marketData: MarketData = useMemo(() => { const circSupplyNum = Number(circSupply) || 0 const priceNum = Number(tokenData.price) || 0 const volume24hNum = Number(tokenData.daily_volume) || 0 const trades24hNum = Number(tokenData.daily_trades) || 0 // Format supply values const formattedSupply = parseAmount( holdersData?.totalSupply?.toString() || tokenData.supply || '0', ) const formattedCircSupply = parseAmount(circSupplyNum) // Calculate market cap let marketCap: string | null = null if (tokenData.market_cap_usd) { marketCap = parseCurrencyAmount(tokenData.market_cap_usd) } else if (circSupplyNum && priceNum && xrpRate) { marketCap = parseCurrencyAmount(circSupplyNum * priceNum * xrpRate) } // Format volume and trades const parsedVolume = parseCurrencyAmount(volume24hNum * xrpRate) const formattedVolume = parsedVolume !== '$0.00' ? parsedVolume : '--' const formattedTrades = parseIntegerAmount(trades24hNum) !== '0' ? parseIntegerAmount(trades24hNum) : '--' // Format AMM TVL const formattedAmmTvl = ammTvlData?.tvl ? parseCurrencyAmount(ammTvlData.tvl) : '' const formattedTvlUsd = tokenData.tvl_usd ? parseCurrencyAmount(tokenData.tvl_usd) : '' return { supply: formattedSupply, circ_supply: formattedCircSupply, market_cap: marketCap || '', market_cap_usd: tokenData.market_cap_usd, volume_24h: formattedVolume, trades_24h: formattedTrades, amm_tvl: formattedAmmTvl, amm_account: ammTvlData?.account || '', tvl_usd: formattedTvlUsd, } }, [circSupply, tokenData, xrpRate, ammTvlData, holdersData]) return (
{t('token')}
{t('token_type.iou')}
{tokenData.icon ? ( {`${currency} ) : (
)} {tokenData.issuer_name && (
( {tokenData.issuer_name .trim() .toUpperCase() .replace(/\(/g, '') .replace(/\)/g, '')} )
)}
{tokenData.issuer_domain && (
)}
) } ================================================ FILE: src/containers/Token/IOU/Header/styles.scss ================================================ @use '../../../shared/css/variables' as *; // IOU-specific category pill variant (white border) .token-header.iou { .token-indicator { .category-pill { border: 1px solid $white; background: $black-80; } } } ================================================ FILE: src/containers/Token/IOU/Header/test/actNotFound.json ================================================ { "account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "error": "actNotFound", "error_code": 19, "error_message": "Account not found.", "ledger_hash": "97992DBB4ED350B572B39D0026604943ACC84A3E5967454147253CB317551891", "ledger_index": 68989958, "request": { "account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "command": "account_info", "ledger_index": "validated", "queue": false, "signer_lists": false, "strict": false }, "validated": true } ================================================ FILE: src/containers/Token/IOU/Header/test/rippledResponses.json ================================================ { "account_info": { "result": { "account_data": { "Account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "Balance": "123456000", "Flags": 0, "LedgerEntryType": "AccountRoot", "OwnerCount": 0, "PreviousTxnID": "6B6F2CA1633A22247058E988372BA9EFFFC5BF10212230B67341CA32DC9D4A82", "PreviousTxnLgrSeq": 68990183, "Sequence": 2148991, "index": "C3B625B296E95A21D7BBBB7E3D343AF423B463B87B5D56EE7F79C8E16A47A6F5", "signer_lists": [] }, "ledger_hash": "43C4195B2C90423771E6C5DF4AED11BF3D77FFD1E8A153A489E5B00C96318FCA", "ledger_index": 68990183, "validated": true }, "status": "success", "type": "response" }, "account_objects": { "result": { "account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "account_objects": [], "ledger_current_index": 24402380, "validated": false }, "status": "success", "type": "response" }, "gateway_balances": { "result": { "account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "ledger_hash": "F4023C801B8B4D05F16EFE5D8C4C3C14D02354AABBB94151F581A6BF0E04C20B", "ledger_index": 24402706, "obligations": { "ABC": "100" }, "validated": true }, "status": "success", "type": "response" }, "server_info": { "result": { "info": { "validated_ledger": { "age": 1, "base_fee_xrp": 0.00001, "hash": "EA01E248FCA5CFD33A3393DA5EBCCD9219BA8DB6AF6DC28A3B0A968604F46A76", "reserve_base_xrp": 10, "reserve_inc_xrp": 2, "seq": 24402729 }, "validation_quorum": 5 } }, "status": "success", "type": "response" } } ================================================ FILE: src/containers/Token/IOU/TablePicker/index.tsx ================================================ import { useState, useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { TransactionTable } from '../../../shared/components/TransactionTable/TransactionTable' import { Tabs } from '../../../shared/components/Tabs' import { useAccountTransactions } from '../../shared/hooks/useAccountTransactions' import { DexTradeTable, DexTradeFormatted, } from '../../../shared/components/DexTradeTable/DexTradeTable' import { HoldersTable, XRPLHolder, } from '../../../shared/components/HoldersTable/HoldersTable' import { LOSTransfer, TransfersTable, } from '../../shared/components/TransfersTable/TransfersTable' import { TokenHoldersData } from '../api/holders' import { LOSToken } from '../../../shared/losTypes' import { TablePaginationState } from '../../shared/hooks/usePaginationState' import { TableSortingState } from '../../shared/hooks/useSortingState' // Re-export for backward compatibility export type { TablePaginationState, TableSortingState } /** * Data and loading state for a single table */ export interface TableDataState { data: any isLoading: boolean } export interface TablePickerProps { accountId: string currency: string xrpUSDRate: string tokenData: LOSToken // Holders table state holdersData?: TokenHoldersData holdersPagination: TablePaginationState holdersLoading: boolean // Dex trades table state dexTradesData?: DexTradeFormatted[] dexTradesPagination: TablePaginationState dexTradesSorting: TableSortingState dexTradesLoading: boolean onRefreshDexTrades?: () => void // Transfers table state transfersData?: LOSTransfer[] transfersPagination: TablePaginationState transfersSorting: TableSortingState transfersLoading: boolean onRefreshTransfers?: () => void } export const TablePicker = ({ accountId, currency, xrpUSDRate, tokenData, holdersData, holdersPagination, holdersLoading, dexTradesData, dexTradesPagination, dexTradesSorting, dexTradesLoading, onRefreshDexTrades, transfersData, transfersPagination, transfersSorting, transfersLoading, onRefreshTransfers, }: TablePickerProps) => { const { t } = useTranslation() const { data, error, loading, fetchNextPage, hasNextPage } = useAccountTransactions({ account: accountId, tokenId: currency, }) const [tablePickerState, setTablePickerState] = useState< 'all' | 'dex' | 'transfers' | 'holders' >('all') // Reset table picker state when token changes useEffect(() => { setTablePickerState('all') }, [currency, accountId]) // Format data for tables const XRPUSDPrice = Number(xrpUSDRate) || 0 const holdersFormatted: XRPLHolder[] = useMemo( () => holdersData?.holders?.map((holder, index) => ({ ...holder, rank: (holdersPagination.currentPage - 1) * holdersPagination.pageSize + index + 1, value_usd: holder.balance * Number(tokenData?.price) * XRPUSDPrice, })) || [], [ holdersData, holdersPagination.currentPage, holdersPagination.pageSize, tokenData?.price, XRPUSDPrice, ], ) // transfers is already formatted array from pagination service const transfersFormatted: LOSTransfer[] = transfersData || [] // dexTrades is already formatted array from pagination service const dexTradesFormatted: DexTradeFormatted[] = dexTradesData || [] // Helper to reset pagination to page 1 const resetTablePagination = (setCurrentPage: (page: number) => void) => { setCurrentPage(1) } // Helper to render transaction table const renderTransactionTable = () => ( page.transactions).flat()} loading={loading} emptyMessage={error?.message ? t(error.message as any) : ''} onLoadMore={() => fetchNextPage()} hasAdditionalResults={hasNextPage} /> ) // Helper to render dex trades table const renderDexTradesTable = () => ( ) // Helper to render transfers table const renderTransfersTable = () => ( ) // Helper to render holders table const renderHoldersTable = () => ( ) const tabs = [ { id: 'all', labelKey: 'token_page.all_tx' }, { id: 'dex', labelKey: 'token_page.dex_tx', onTabClick: () => resetTablePagination(dexTradesPagination.setCurrentPage), }, { id: 'transfers', labelKey: 'token_page.transfers_tx', onTabClick: () => resetTablePagination(transfersPagination.setCurrentPage), }, { id: 'holders', labelKey: 'token_page.holders_table', onTabClick: () => resetTablePagination(holdersPagination.setCurrentPage), }, ] return (

setTablePickerState( tabId as 'all' | 'dex' | 'transfers' | 'holders', ) } />
{tablePickerState === 'all' && renderTransactionTable()} {tablePickerState === 'dex' && renderDexTradesTable()} {tablePickerState === 'transfers' && renderTransfersTable()} {tablePickerState === 'holders' && renderHoldersTable()}
) } ================================================ FILE: src/containers/Token/IOU/api/holders.ts ================================================ import axios from 'axios' import logger from '../../../../rippled/lib/logger' const log = logger({ name: 'iou' }) export interface TokenHoldersData { totalSupply: number totalHolders: number holders: Array<{ account: string balance: number percent: number }> } const fetchTokenHoldersInfo = ( currency: string, issuer: string, limit: number, offset: number, ): Promise => axios .get( `https://${process.env.XRPL_META_URL}/token/${currency}:${issuer}/holders?limit=${limit}&offset=${offset}`, ) .then((resp) => resp.data) async function getTokenHolders( currencyCode: string, issuer: string, limit: number = 100, offset: number = 0, ): Promise { try { log.info('fetching holders data from XRPLMeta') return await fetchTokenHoldersInfo(currencyCode, issuer, limit, offset) } catch (error) { log.error( `Failed to fetch token holders ${currencyCode}.${issuer}: ${error}`, ) throw error } } export default getTokenHolders ================================================ FILE: src/containers/Token/IOU/api/token.ts ================================================ import axios from 'axios' import logger from '../../../../rippled/lib/logger' import { LOSToken } from '../../../shared/losTypes' const log = logger({ name: 'iou-token' }) export interface TokenData { balance: string reserve: number sequence: number rate?: string obligations?: string domain?: string emailHash?: string previousLedger: number previousTxn: string flags: string[] } const fetchTokenInfo = (currency: string, issuer: string): Promise => axios.get(`${process.env.VITE_LOS_URL}/tokens/${currency}.${issuer}`) const mapTokenResponse = (response: any): LOSToken => ({ currency: response.currency, issuer_account: response.issuer_account, name: response.token_name || undefined, asset_class: response.asset_class, asset_subclass: response.asset_subclass, daily_trades: response.number_of_trades ? String(response.number_of_trades) : undefined, icon: response.icon, ttl: response.ttl, social_links: response.social_links, trustlines: response.number_of_trustlines || undefined, transfer_fee: response.transfer_fee, issuer_domain: response.issuer_domain, issuer_name: response.issuer_name, market_cap: response.market_cap, market_cap_usd: response.market_cap_usd, holders: response.number_of_holders || undefined, daily_volume: response.daily_volume, supply: response.supply, trust_level: response.trust_level, price: response.price, tvl_usd: response.tvl_usd, index: response.index ?? -1, circ_supply: response.circ_supply, }) async function getToken( currencyCode: string, issuer: string, ): Promise { try { log.info('fetching token data from LOS') const response = await fetchTokenInfo(currencyCode, issuer) return mapTokenResponse(response.data) } catch (error) { log.error(`Failed to fetch token ${currencyCode}.${issuer}: ${error}`) throw error } } export default getToken ================================================ FILE: src/containers/Token/IOU/components/HeaderBoxes.tsx ================================================ import { useTranslation } from 'react-i18next' import { shortenAccount } from '../../../shared/utils' import { Account } from '../../../shared/components/Account' export interface OverviewData { issuer: string issuer_account: string price: string // Pre-formatted price string holders: string // Pre-formatted holders count trustlines: string // Pre-formatted trustlines count transfer_fee: string // Pre-formatted transfer fee or '--' } export interface MarketData { supply: string // Pre-formatted supply circ_supply: string // Pre-formatted circulating supply market_cap: string // Pre-formatted market cap or empty string market_cap_usd?: string // Raw USD value (for reference) volume_24h: string // Pre-formatted volume or '--' trades_24h: string // Pre-formatted trades count or '--' amm_tvl: string // Pre-formatted AMM TVL or empty string amm_account: string // AMM account address tvl_usd?: string // Pre-formatted TVL USD or empty string } interface HeaderBoxesProps { overviewData: OverviewData marketData: MarketData isHoldersDataLoading?: boolean isAmmTvlLoading?: boolean } export const HeaderBoxes = ({ overviewData, marketData, isHoldersDataLoading = false, isAmmTvlLoading = false, }: HeaderBoxesProps): JSX.Element => { const { t } = useTranslation() const { issuer, issuer_account: issuerAccount, price, holders, trustlines, transfer_fee: transferFee, } = overviewData const { supply, circ_supply: circSupply, volume_24h: volume24h, trades_24h: trades24h, amm_tvl: ammTvl, amm_account: ammAccount, tvl_usd: tvlUsd, } = marketData const shouldShowAccountLink = !!(tvlUsd || ammTvl) && ammAccount return (
{t('token_page.general_overview')}
{t('token_page.issuer')}
{t('token_page.price')}
{price}
{t('token_page.holders')}
{holders}
{t('iou_page.trustlines')}
{trustlines}
{t('token_page.transfer_fee')}
{transferFee}
{t('token_page.market_data')}
{t('token_page.supply')}
{supply}
{t('token_page.circulating_supply')}
{isHoldersDataLoading ? ( ) : ( circSupply )}
{t('token_page.market_cap')}
{isHoldersDataLoading ? ( ) : ( marketData.market_cap )}
{t('token_page.volume_24h')}
{volume24h}
{t('token_page.trades_24h')}
{trades24h}
{t('token_page.amm_tvl')}
{isAmmTvlLoading && } {!isAmmTvlLoading && (shouldShowAccountLink ? ( ) : ( '--' ))}
) } ================================================ FILE: src/containers/Token/IOU/hooks/useMarketCalculations.ts ================================================ import { useMemo } from 'react' import { formatPrice } from '../../../shared/utils' import { TokenHoldersData } from '../api/holders' import { LOSToken } from '../../../shared/losTypes' import { calculateCirculatingSupply, formatCirculatingSupply, } from '../utils/tokenCalculations' interface MarketCalculations { marketCap: string | null circSupply: number formattedCircSupply: string } interface UseMarketCalculationsProps { holdersData: TokenHoldersData | undefined tokenData: LOSToken price: string xrpUSDRate: string isHoldersDataLoading: boolean } export const useMarketCalculations = ({ holdersData, tokenData, price, xrpUSDRate, isHoldersDataLoading, }: UseMarketCalculationsProps): MarketCalculations => useMemo(() => { const circSupply = calculateCirculatingSupply(holdersData, tokenData) const marketCap = !isHoldersDataLoading && circSupply && price && xrpUSDRate ? formatPrice( Number(circSupply) * Number(price) * Number(xrpUSDRate), ) || null : null const formattedCircSupply = formatCirculatingSupply(circSupply) return { marketCap, circSupply, formattedCircSupply, } }, [holdersData, tokenData, price, xrpUSDRate, isHoldersDataLoading]) ================================================ FILE: src/containers/Token/IOU/index.tsx ================================================ import { FC, PropsWithChildren, useState, useContext, useEffect } from 'react' import { Helmet } from 'react-helmet-async' import { useQuery } from 'react-query' import { Header } from './Header' import { TablePicker } from './TablePicker' import NoMatch from '../../NoMatch' import './styles.scss' import '../shared/styles.scss' import { NOT_FOUND, BAD_REQUEST, DROPS_TO_XRP_FACTOR } from '../../shared/utils' import { useAnalytics } from '../../shared/analytics' import { ErrorMessages } from '../../shared/Interfaces' import { TOKEN_ROUTE } from '../../App/routes' import { useRouteParams } from '../../shared/routing' import { Loader } from '../../shared/components/Loader' import { Tooltip, useTooltip } from '../../shared/components/Tooltip' import SocketContext from '../../shared/SocketContext' import { getAMMInfoByAssets } from '../../../rippled/lib/rippled' import getTokenHolders from './api/holders' import { paginationService as dexTradesPaginationService } from './services/dexTradesPagination' import { paginationService as transfersPaginationService } from '../shared/services/transfersPagination' import { useCursorPaginatedQuery } from '../../shared/hooks/useCursorPaginatedQuery' import { PAGINATION_CONFIG, INITIAL_PAGE } from '../shared/constants' import { useXRPToUSDRate } from '../../shared/hooks/useXRPToUSDRate' import getToken from './api/token' const ERROR_MESSAGES: ErrorMessages = { default: { title: 'generic_error', hints: ['not_your_fault'], }, [NOT_FOUND]: { title: 'account_not_found', hints: ['check_account_id'], }, [BAD_REQUEST]: { title: 'invalid_xrpl_address', hints: ['check_account_id'], }, } const getErrorMessage = (error: unknown) => ERROR_MESSAGES[error as string | number] || ERROR_MESSAGES.default const Page: FC> = ({ accountId, children, }) => (
{children}
) export const IOU = () => { const { trackScreenLoaded, trackException } = useAnalytics() const { tooltip } = useTooltip() const { token = '' } = useRouteParams(TOKEN_ROUTE) const [currency, accountId] = token.split('.') // Holders pagination const [holdersPage, setHoldersPage] = useState(INITIAL_PAGE) // get basic token stats and info const { data: tokenData, error: tokenDataError, isLoading: isTokenDataLoading, } = useQuery({ queryKey: ['token', currency, accountId], queryFn: () => getToken(currency, accountId), }) // Track token data API errors useEffect(() => { if (tokenDataError) { trackException( `token ${currency}.${accountId} --- ${JSON.stringify(tokenDataError)}`, ) } }, [tokenDataError, currency, accountId, trackException]) // get top holders information for calculations and holders table const { data: holdersData, isLoading: isHoldersDataLoading } = useQuery({ queryKey: ['holders', currency, accountId, holdersPage], queryFn: () => { const offset = (holdersPage - 1) * PAGINATION_CONFIG.HOLDERS_PAGE_SIZE return getTokenHolders( currency, accountId, PAGINATION_CONFIG.HOLDERS_PAGE_SIZE, offset, ) }, }) // get XRP to USD rate const XRPUSDPrice = useXRPToUSDRate() // get rippled socket for AMM info const rippledSocket = useContext(SocketContext) // DEX Trades — using shared hook const tokenId = `${currency}.${accountId}` const dexTrades = useCursorPaginatedQuery({ service: dexTradesPaginationService, id: tokenId, pageSize: PAGINATION_CONFIG.DEX_TRADES_PAGE_SIZE, enabled: !!currency && !!accountId, }) // Transfers — using shared hook const transfers = useCursorPaginatedQuery({ service: transfersPaginationService, id: tokenId, pageSize: PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE, enabled: !!currency && !!accountId, }) // get amm info for TVL calculation // note: only fetch xrp- amm info to simplify API calls for most tokens const fetchAmmInfo = () => getAMMInfoByAssets( rippledSocket, { currency: 'XRP' }, { currency, issuer: accountId }, ).then((data) => ({ tvl: (Number(data.amm.amount) / DROPS_TO_XRP_FACTOR) * XRPUSDPrice * 2, account: data.amm.account, })) const { data: ammTvlData, isLoading: isAmmTvlLoading } = useQuery({ queryKey: ['ammTvl', currency, accountId], queryFn: fetchAmmInfo, enabled: !!XRPUSDPrice, // only fetch if we have a valid XRP to USD price }) // Reset pagination when token changes useEffect(() => { setHoldersPage(INITIAL_PAGE) }, [currency, accountId]) useEffect(() => { trackScreenLoaded({ issuer: accountId, currency_code: currency, }) return () => { window.scrollTo(0, 0) } }, [accountId, currency, trackScreenLoaded]) const renderError = () => { const message = getErrorMessage(tokenDataError) return } if (tokenDataError) { return {renderError()} } return ( {isTokenDataLoading ? ( ) : ( tokenData && (
) )} {accountId && tokenData && (
1, }} dexTradesSorting={{ sortField: dexTrades.sortField, setSortField: dexTrades.setSortField, sortOrder: dexTrades.sortOrder, setSortOrder: dexTrades.setSortOrder, }} dexTradesLoading={dexTrades.isLoading} onRefreshDexTrades={dexTrades.refresh} transfersData={transfers.data?.items || []} transfersPagination={{ currentPage: transfers.page, setCurrentPage: transfers.setPage, pageSize: PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE, total: transfers.data?.totalItems || 0, hasMore: transfers.data?.hasMore || false, hasPrevPage: transfers.page > 1, }} transfersSorting={{ sortField: transfers.sortField, setSortField: transfers.setSortField, sortOrder: transfers.sortOrder, setSortOrder: transfers.setSortOrder, }} transfersLoading={transfers.isLoading} onRefreshTransfers={transfers.refresh} />
)} ) } ================================================ FILE: src/containers/Token/IOU/services/dexTradesPagination.ts ================================================ import { getDexTrades } from '../../shared/api/tokenTx' import { DexTradeFormatted } from '../../../shared/components/DexTradeTable/DexTradeTable' import { formatDexTrade } from '../../../shared/components/DexTradeTable/formatDexTrade' import { CursorPaginationService, PaginationResult, } from '../../../shared/services/CursorPaginationService' export interface DexTradesPaginationResult { trades: DexTradeFormatted[] totalTrades: number hasMore: boolean isLoading: boolean } export const paginationService = new CursorPaginationService( { fetchFn: getDexTrades, formatFn: formatDexTrade, batchSize: 200, pageSize: 10, }, ) function toResult( result: PaginationResult, ): DexTradesPaginationResult { return { trades: result.items, totalTrades: result.totalItems, hasMore: result.hasMore, isLoading: result.isLoading, } } export const dexTradesPaginationService = { async getDexTradesPage( tokenId: string, page: number, pageSize?: number, sortField?: string, sortOrder?: string, ): Promise { const result = await paginationService.getPage( tokenId, page, pageSize, sortField, sortOrder, ) return toResult(result) }, clearCache(tokenId?: string, sortField?: string, sortOrder?: string): void { paginationService.clearCache(tokenId, sortField, sortOrder) }, getCachedTradesCount(tokenId: string): number { return paginationService.getCachedItemCount(tokenId) }, } ================================================ FILE: src/containers/Token/IOU/styles.scss ================================================ @import '../shared/styles'; @import '../../shared/css/data-tables-mobile'; ================================================ FILE: src/containers/Token/IOU/test/Header/Header.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import moxios from 'moxios' import i18n from '../../../../../i18n/testConfigEnglish' import { Header } from '../../Header' import { LOSToken } from '../../../../shared/losTypes' import { TokenHoldersData } from '../../api/holders' jest.mock('../../../../shared/components/Currency', () => ({ __esModule: true, default: ({ currency }: { currency: string }) =>
{currency}
, })) jest.mock('../../components/HeaderBoxes', () => ({ HeaderBoxes: () =>
HeaderBoxes
, })) jest.mock('../../../../shared/components/Account', () => ({ Account: ({ displayText }: { displayText: string }) => (
{displayText}
), })) jest.mock('../../../../shared/utils', () => ({ shortenAccount: (account: string) => account.substring(0, 10), localizeNumber: (num: number) => num.toString(), formatLargeNumber: (d: number, digits: number = 1) => { if (d >= 1000000) return { num: (d / 1000000).toFixed(digits), unit: 'M' } if (d >= 1000) return { num: (d / 1000).toFixed(digits), unit: 'K' } return { num: d.toString(), unit: '' } }, formatSmallNumber: (value: number) => value.toFixed(4), shortenDomain: (domain: string) => domain, stripHttpProtocol: (url: string) => url.replace(/^https?:\/\//, ''), })) const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) const mockTokenData: LOSToken = { issuer_account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', issuer_name: 'Test Issuer', issuer_domain: 'https://example.com', icon: 'https://example.com/icon.png', price: '0.50', holders: 1000, trustlines: 5000, transfer_fee: 0.5, supply: '1000000', circ_supply: '800000', currency: 'USD', index: 0, daily_volume: '50000', daily_trades: '1234', market_cap_usd: '400000', tvl_usd: '100000', asset_subclass: 'stablecoin', } const mockHoldersData: TokenHoldersData = { totalHolders: 2, holders: [ { account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', balance: 250000, percent: 25, }, { account: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', balance: 150000, percent: 15, }, ], totalSupply: 1000000, } describe('Header Component', () => { beforeEach(() => { moxios.install() }) afterEach(() => { moxios.uninstall() }) it('renders without crashing', () => { render(
, ) expect(screen.getByText('USD')).toBeInTheDocument() }) it('displays token currency', () => { render(
, ) expect(screen.getByText('EUR')).toBeInTheDocument() }) it('displays issuer name when available', () => { const { container } = render(
, ) const issuerNameSpan = container.querySelector('.issuer-name') expect(issuerNameSpan).toBeInTheDocument() expect(issuerNameSpan?.textContent).toBe('TEST ISSUER') }) it('displays issuer domain link when available', () => { render(
, ) expect(screen.getByText('example.com')).toBeInTheDocument() }) it('renders HeaderBoxes component', () => { render(
, ) expect(screen.getByText('HeaderBoxes')).toBeInTheDocument() }) it('displays token logo when available', () => { const { container } = render(
, ) const logo = container.querySelector('img.token-logo') expect(logo).toBeInTheDocument() expect(logo).toHaveAttribute('src', 'https://example.com/icon.png') }) it('displays placeholder when token logo is not available', () => { const tokenDataWithoutIcon = { ...mockTokenData, icon: '' } const { container } = render(
, ) const placeholder = container.querySelector('.token-logo.no-logo') expect(placeholder).toBeInTheDocument() }) it('handles issuer domain without protocol', () => { const tokenDataWithoutProtocol = { ...mockTokenData, issuer_domain: 'example.com', } render(
, ) const link = screen.getByText('example.com').closest('a') expect(link).toHaveAttribute('href', 'https://example.com') }) it('handles issuer domain with protocol', () => { const tokenDataWithProtocol = { ...mockTokenData, issuer_domain: 'https://example.com', } render(
, ) const link = screen.getByText('example.com').closest('a') expect(link).toHaveAttribute('href', 'https://example.com') }) it('passes holders data to HeaderBoxes', () => { render(
, ) expect(screen.getByText('HeaderBoxes')).toBeInTheDocument() }) it('passes AMM TVL data to HeaderBoxes', () => { const ammTvlData = { tvl: 100000, account: 'rAMMAccount123456789' } render(
, ) expect(screen.getByText('HeaderBoxes')).toBeInTheDocument() }) it('passes loading states to HeaderBoxes', () => { render(
, ) expect(screen.getByText('HeaderBoxes')).toBeInTheDocument() }) it('handles zero XRP USD rate', () => { render(
, ) expect(screen.getByText('USD')).toBeInTheDocument() }) it('handles non-stablecoin asset subclass', () => { const tokenDataNonStablecoin = { ...mockTokenData, asset_subclass: 'utility', } render(
, ) expect(screen.getByText('USD')).toBeInTheDocument() }) it('renders token label and category pill', () => { const { container } = render(
, ) expect(container.querySelector('.token-indicator')).toBeInTheDocument() expect(container.querySelector('.category-pill')).toBeInTheDocument() }) it('handles issuer name with special characters', () => { const tokenDataWithSpecialChars = { ...mockTokenData, issuer_name: '(Test) Issuer (Name)', } const { container } = render(
, ) const issuerNameSpan = container.querySelector('.issuer-name') expect(issuerNameSpan).toBeInTheDocument() expect(issuerNameSpan?.textContent).toBe('TEST ISSUER NAME') }) it('handles missing issuer name', () => { const tokenDataWithoutIssuerName = { ...mockTokenData, issuer_name: '', } render(
, ) expect(screen.getByText('USD')).toBeInTheDocument() }) }) ================================================ FILE: src/containers/Token/IOU/test/TablePicker/TablePicker.test.tsx ================================================ import { render, fireEvent, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import moxios from 'moxios' import i18n from '../../../../../i18n/testConfig' import { TablePicker } from '../../TablePicker' import TEST_TRANSACTIONS_DATA from '../../../../Accounts/AccountTransactionTable/test/mockTransactions.json' import { getAccountTransactions } from '../../../../../rippled' import { testQueryClient } from '../../../../test/QueryClient' import { flushPromises } from '../../../../test/utils' import Mock = jest.Mock jest.mock('../../../../../rippled', () => ({ __esModule: true, getAccountTransactions: jest.fn(), })) const TEST_ACCOUNT_ID = 'rTEST_ACCOUNT' const TEST_CURRENCY = 'abc' const TEST_TOKEN_DATA = { currency: TEST_CURRENCY, issuer_account: TEST_ACCOUNT_ID, trustlines: 100, index: 0, price: '1.0', } const mockHoldersData = { holders: [ { account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', balance: 250000, percent: 25, }, ], totalSupply: 1000000, } const mockDexTrades = [ { hash: 'E3FE6EA3D48F0C2B639448020EA4F03D4F4F8FFDB243A852A0F59177921B4879', ledger: 12345, timestamp: 1609459200, from: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', to: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', amount_in: { currency: 'USD', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', amount: '100', }, amount_out: { currency: 'XRP', issuer: '', amount: '500', }, rate: 5, type: 'orderBook', }, ] const mockTransfers = [ { hash: 'E3FE6EA3D48F0C2B639448020EA4F03D4F4F8FFDB243A852A0F59177921B4879', ledger: 12345, action: 'send', timestamp: 1609459200, from: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', to: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', amount: { currency: 'USD', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', value: '100', }, }, ] describe('TablePicker container', () => { beforeEach(() => { moxios.install() }) afterEach(() => { moxios.uninstall() }) const renderTablePicker = ( getAccountTransactionsImpl = () => new Promise(() => {}), overrides: any = {}, ) => { ;(getAccountTransactions as Mock).mockImplementation( getAccountTransactionsImpl, ) return render( , ) } it('renders static parts', () => { const { container } = renderTablePicker() expect(container.querySelectorAll('.transaction-table').length).toBe(1) }) it('renders loader when fetching data', () => { const { container } = renderTablePicker() expect(container.querySelectorAll('.loader').length).toBe(1) }) it('renders dynamic content with transaction data', async () => { const { container } = renderTablePicker(() => Promise.resolve(TEST_TRANSACTIONS_DATA), ) await flushPromises() await waitFor(() => { expect(container.querySelector('.load-more-btn')).toBeInTheDocument() }) expect(container.querySelector('.transaction-table')).toBeInTheDocument() expect( container.querySelectorAll('.transaction-li.transaction-li-header') .length, ).toBe(1) expect(container.querySelectorAll('a').length).toBe(60) fireEvent.click(container.querySelector('.load-more-btn')!) expect(getAccountTransactions).toHaveBeenCalledWith( TEST_ACCOUNT_ID, TEST_CURRENCY, '44922483.5', undefined, undefined, ) }) it('renders error message when request fails', async () => { const { container } = renderTablePicker(() => Promise.reject()) await flushPromises() await waitFor(() => { expect( container.querySelector('.empty-transactions-message'), ).toBeInTheDocument() }) expect(container.querySelector('.load-more-btn')).not.toBeInTheDocument() expect(container.querySelector('.transaction-table')).toBeInTheDocument() expect( container.querySelector('.empty-transactions-message'), ).toHaveTextContent('get_account_transactions_failed') expect(container.querySelectorAll('a').length).toBe(0) }) it('renders with holders data', () => { const setCurrentPage = jest.fn() const { container } = renderTablePicker(() => new Promise(() => {}), { holdersData: mockHoldersData, holdersPagination: { currentPage: 1, setCurrentPage, pageSize: 20, total: 100, }, }) expect(container.querySelectorAll('.transaction-table').length).toBe(1) }) it('renders with dex trades data', () => { const setSortField = jest.fn() const setSortOrder = jest.fn() const { container } = renderTablePicker(() => new Promise(() => {}), { dexTradesData: mockDexTrades, dexTradesPagination: { currentPage: 1, setCurrentPage: jest.fn(), pageSize: 10, total: 100, hasMore: true, hasPrevPage: false, }, dexTradesSorting: { sortField: 'timestamp', setSortField, sortOrder: 'desc', setSortOrder, }, }) expect(container.querySelectorAll('.transaction-table').length).toBe(1) }) it('renders with transfers data', () => { const setSortField = jest.fn() const setSortOrder = jest.fn() const { container } = renderTablePicker(() => new Promise(() => {}), { transfersData: mockTransfers, transfersPagination: { currentPage: 1, setCurrentPage: jest.fn(), pageSize: 10, total: 100, hasMore: true, hasPrevPage: false, }, transfersSorting: { sortField: 'timestamp', setSortField, sortOrder: 'desc', setSortOrder, }, }) expect(container.querySelectorAll('.transaction-table').length).toBe(1) }) it('renders with all data populated', () => { const { container } = renderTablePicker(() => new Promise(() => {}), { holdersData: mockHoldersData, dexTradesData: mockDexTrades, transfersData: mockTransfers, holdersPagination: { currentPage: 1, setCurrentPage: jest.fn(), pageSize: 20, total: 100, }, dexTradesPagination: { currentPage: 1, setCurrentPage: jest.fn(), pageSize: 10, total: 100, hasMore: true, hasPrevPage: false, }, transfersPagination: { currentPage: 1, setCurrentPage: jest.fn(), pageSize: 10, total: 100, hasMore: true, hasPrevPage: false, }, }) expect(container.querySelectorAll('.transaction-table').length).toBe(1) }) it('renders with loading states', () => { const { container } = renderTablePicker(() => new Promise(() => {}), { holdersLoading: true, dexTradesLoading: true, transfersLoading: true, }) expect(container.querySelectorAll('.transaction-table').length).toBe(1) }) it('renders with refresh callbacks', () => { const onRefreshDexTrades = jest.fn() const onRefreshTransfers = jest.fn() const { container } = renderTablePicker(() => new Promise(() => {}), { onRefreshDexTrades, onRefreshTransfers, }) expect(container.querySelectorAll('.transaction-table').length).toBe(1) }) }) ================================================ FILE: src/containers/Token/IOU/test/api/holders.test.ts ================================================ import axios from 'axios' import getTokenHolders, { TokenHoldersData } from '../../api/holders' jest.mock('axios') describe('Token Holders API', () => { const mockAxios = axios as jest.Mocked beforeAll(() => { jest.spyOn(console, 'error').mockImplementation(() => {}) }) afterAll(() => { jest.restoreAllMocks() }) beforeEach(() => { jest.clearAllMocks() }) describe('getTokenHolders', () => { const mockHoldersData: TokenHoldersData = { totalSupply: 1000000, totalHolders: 100, holders: [ { account: 'rHolder1', balance: 100000, percent: 10 }, { account: 'rHolder2', balance: 50000, percent: 5 }, { account: 'rHolder3', balance: 25000, percent: 2.5 }, ], } it('should fetch token holders successfully with default parameters', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockHoldersData }) const result = await getTokenHolders('USD', 'rIssuer123') expect(result).toEqual(mockHoldersData) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('USD:rIssuer123'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('limit=100'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('offset=0'), ) }) it('should fetch token holders with custom limit and offset', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockHoldersData }) const result = await getTokenHolders('USD', 'rIssuer123', 50, 100) expect(result).toEqual(mockHoldersData) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('limit=50'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('offset=100'), ) }) it('should construct correct URL with currency and issuer', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockHoldersData }) await getTokenHolders('EUR', 'rEURIssuer', 20, 0) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('EUR:rEURIssuer'), ) }) it('should handle empty holders list', async () => { const emptyData: TokenHoldersData = { totalSupply: 0, totalHolders: 0, holders: [], } mockAxios.get.mockResolvedValueOnce({ data: emptyData }) const result = await getTokenHolders('TEST', 'rTest') expect(result.holders).toEqual([]) expect(result.totalHolders).toBe(0) }) it('should handle large holder lists', async () => { const largeHoldersList: TokenHoldersData = { totalSupply: 10000000, totalHolders: 1000, holders: Array.from({ length: 100 }, (_, i) => ({ account: `rHolder${i}`, balance: 100000, percent: 1, })), } mockAxios.get.mockResolvedValueOnce({ data: largeHoldersList }) const result = await getTokenHolders('LARGE', 'rLarge', 100, 0) expect(result.holders.length).toBe(100) expect(result.totalHolders).toBe(1000) }) it('should throw error on API failure', async () => { const error = new Error('Network error') mockAxios.get.mockRejectedValueOnce(error) await expect(getTokenHolders('USD', 'rIssuer123')).rejects.toThrow( 'Network error', ) }) it('should throw error on 404 response', async () => { const error = new Error('Not found') mockAxios.get.mockRejectedValueOnce(error) await expect(getTokenHolders('INVALID', 'rInvalid')).rejects.toThrow() }) it('should handle pagination correctly', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockHoldersData }) mockAxios.get.mockResolvedValueOnce({ data: mockHoldersData }) // First page await getTokenHolders('USD', 'rIssuer123', 20, 0) expect(mockAxios.get).toHaveBeenLastCalledWith( expect.stringContaining('offset=0'), ) // Second page await getTokenHolders('USD', 'rIssuer123', 20, 20) expect(mockAxios.get).toHaveBeenLastCalledWith( expect.stringContaining('offset=20'), ) }) it('should handle holders with different percentages', async () => { const diverseHolders: TokenHoldersData = { totalSupply: 1000000, totalHolders: 5, holders: [ { account: 'rHolder1', balance: 500000, percent: 50 }, { account: 'rHolder2', balance: 300000, percent: 30 }, { account: 'rHolder3', balance: 150000, percent: 15 }, { account: 'rHolder4', balance: 40000, percent: 4 }, { account: 'rHolder5', balance: 10000, percent: 1 }, ], } mockAxios.get.mockResolvedValueOnce({ data: diverseHolders }) const result = await getTokenHolders('USD', 'rIssuer123') expect(result.holders[0].percent).toBe(50) expect(result.holders[4].percent).toBe(1) }) it('should handle very small balances', async () => { const smallBalances: TokenHoldersData = { totalSupply: 1000000, totalHolders: 3, holders: [ { account: 'rHolder1', balance: 0.0001, percent: 0.00001 }, { account: 'rHolder2', balance: 0.00001, percent: 0.000001 }, { account: 'rHolder3', balance: 0.000001, percent: 0.0000001 }, ], } mockAxios.get.mockResolvedValueOnce({ data: smallBalances }) const result = await getTokenHolders('SMALL', 'rSmall') expect(result.holders[0].balance).toBe(0.0001) expect(result.totalSupply).toBe(1000000) }) it('should handle very large balances', async () => { const largeBalances: TokenHoldersData = { totalSupply: 999999999999, totalHolders: 2, holders: [{ account: 'rHolder1', balance: 999999999999, percent: 100 }], } mockAxios.get.mockResolvedValueOnce({ data: largeBalances }) const result = await getTokenHolders('LARGE', 'rLarge') expect(result.totalSupply).toBe(999999999999) expect(result.holders[0].balance).toBe(999999999999) }) it('should handle timeout errors', async () => { const timeoutError = new Error('timeout of 5000ms exceeded') mockAxios.get.mockRejectedValueOnce(timeoutError) await expect(getTokenHolders('USD', 'rIssuer123')).rejects.toThrow( 'timeout', ) }) it('should handle server errors', async () => { const serverError = new Error('500 Internal Server Error') mockAxios.get.mockRejectedValueOnce(serverError) await expect(getTokenHolders('USD', 'rIssuer123')).rejects.toThrow() }) it('should handle zero offset correctly', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockHoldersData }) await getTokenHolders('USD', 'rIssuer123', 100, 0) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('offset=0'), ) }) it('should handle large offset values', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockHoldersData }) await getTokenHolders('USD', 'rIssuer123', 20, 10000) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('offset=10000'), ) }) }) }) ================================================ FILE: src/containers/Token/IOU/test/api/token.test.ts ================================================ import axios from 'axios' import getToken from '../../api/token' import { LOSToken } from '../../../../shared/losTypes' jest.mock('axios') describe('Token API', () => { const mockAxios = axios as jest.Mocked beforeAll(() => { jest.spyOn(console, 'error').mockImplementation(() => {}) }) afterAll(() => { jest.restoreAllMocks() }) beforeEach(() => { jest.clearAllMocks() }) describe('getToken', () => { const mockResponse: LOSToken = { currency: 'USD', issuer_account: 'rIssuer123', name: 'US Dollar', asset_class: 'currency', asset_subclass: 'stablecoin', daily_trades: '1000', icon: 'https://example.com/icon.png', ttl: 3600, social_links: [], trustlines: 5000, transfer_fee: 0.5, issuer_domain: 'https://example.com', issuer_name: 'Example Issuer', market_cap: '1000000', market_cap_usd: '1000000', holders: 500, daily_volume: '50000', supply: '1000000', trust_level: 1, price: '1.00', tvl_usd: '100000', index: 0, circ_supply: '800000', } it('should fetch token data successfully', async () => { const apiResponse = { currency: 'USD', issuer_account: 'rIssuer123', token_name: 'US Dollar', asset_class: 'currency', asset_subclass: 'stablecoin', number_of_trades: 1000, icon: 'https://example.com/icon.png', ttl: 3600, social_links: [], number_of_trustlines: 5000, transfer_fee: 0.5, issuer_domain: 'https://example.com', issuer_name: 'Example Issuer', market_cap: '1000000', market_cap_usd: '1000000', number_of_holders: 500, daily_volume: '50000', supply: '1000000', trust_level: 1, price: '1.00', tvl_usd: '100000', index: 0, circ_supply: '800000', } mockAxios.get.mockResolvedValueOnce({ data: apiResponse }) const result = await getToken('USD', 'rIssuer123') expect(result).toEqual(mockResponse) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('/tokens/USD.rIssuer123'), ) }) it('should map response data correctly', async () => { const apiResponse = { currency: 'EUR', issuer_account: 'rEURIssuer', token_name: 'Euro', asset_class: 'currency', asset_subclass: 'fiat', number_of_trades: 500, icon: 'https://example.com/eur.png', ttl: 7200, social_links: ['https://twitter.com/example'], number_of_trustlines: 2000, transfer_fee: 0.25, issuer_domain: 'https://euro.example.com', issuer_name: 'Euro Issuer', market_cap: '500000', market_cap_usd: '500000', number_of_holders: 250, daily_volume: '25000', supply: '500000', trust_level: 1, price: '1.10', tvl_usd: '50000', circ_supply: '400000', } mockAxios.get.mockResolvedValueOnce({ data: apiResponse }) const result = await getToken('EUR', 'rEURIssuer') expect(result.currency).toBe('EUR') expect(result.issuer_account).toBe('rEURIssuer') expect(result.name).toBe('Euro') expect(result.holders).toBe(250) expect(result.trustlines).toBe(2000) }) it('should handle missing optional fields', async () => { const minimalResponse = { currency: 'TEST', issuer_account: 'rTest', token_name: 'Test Token', asset_class: 'token', } mockAxios.get.mockResolvedValueOnce({ data: minimalResponse }) const result = await getToken('TEST', 'rTest') expect(result.currency).toBe('TEST') expect(result.index).toBe(-1) }) it('should throw error on API failure', async () => { const error = new Error('Network error') mockAxios.get.mockRejectedValueOnce(error) await expect(getToken('USD', 'rIssuer123')).rejects.toThrow( 'Network error', ) }) it('should throw error on 404 response', async () => { const error = new Error('Not found') mockAxios.get.mockRejectedValueOnce(error) await expect(getToken('INVALID', 'rInvalid')).rejects.toThrow() }) it('should construct correct URL with currency and issuer', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockResponse }) await getToken('XRP', 'rXRPIssuer') expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('XRP.rXRPIssuer'), ) }) it('should handle response with all optional fields', async () => { const fullResponse = { currency: 'FULL', issuer_account: 'rFull', token_name: 'Full Token', asset_class: 'token', asset_subclass: 'utility', number_of_trades: 5000, icon: 'https://example.com/full.png', ttl: 86400, social_links: ['https://twitter.com/full', 'https://discord.gg/full'], number_of_trustlines: 10000, transfer_fee: 1.5, issuer_domain: 'https://full.example.com', issuer_name: 'Full Issuer', market_cap: '5000000', market_cap_usd: '5000000', number_of_holders: 5000, daily_volume: '500000', supply: '5000000', trust_level: 1, price: '1.50', tvl_usd: '1000000', index: 1, circ_supply: '4000000', } mockAxios.get.mockResolvedValueOnce({ data: fullResponse }) const result = await getToken('FULL', 'rFull') expect(result.currency).toBe('FULL') expect(result.name).toBe('Full Token') expect(result.social_links).toEqual([ 'https://twitter.com/full', 'https://discord.gg/full', ]) expect(result.index).toBe(1) }) it('should handle timeout errors', async () => { const timeoutError = new Error('timeout of 5000ms exceeded') mockAxios.get.mockRejectedValueOnce(timeoutError) await expect(getToken('USD', 'rIssuer123')).rejects.toThrow('timeout') }) it('should handle server errors', async () => { const serverError = new Error('500 Internal Server Error') mockAxios.get.mockRejectedValueOnce(serverError) await expect(getToken('USD', 'rIssuer123')).rejects.toThrow() }) }) }) ================================================ FILE: src/containers/Token/IOU/test/components/HeaderBoxes.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import i18n from '../../../../../i18n/testConfigEnglish' import { HeaderBoxes, OverviewData, MarketData, } from '../../components/HeaderBoxes' jest.mock('../../../../shared/components/Account', () => ({ Account: ({ displayText }: { displayText: string }) => (
{displayText}
), })) jest.mock('../../../../shared/utils', () => ({ shortenAccount: (account: string) => account.substring(0, 10), })) const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) const mockOverviewData: OverviewData = { issuer: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', issuer_account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', price: '$0.50', holders: '1,234', trustlines: '5,678', transfer_fee: '0.50%', } const mockMarketData: MarketData = { supply: '1,000,000', circ_supply: '800,000', market_cap: '$400,000', market_cap_usd: '400000', volume_24h: '$50,000', trades_24h: '9,999', amm_tvl: '$100,000', amm_account: 'rAMMAccount123456789', tvl_usd: '$100,000', } describe('HeaderBoxes Component', () => { it('renders without crashing', () => { render( , ) expect(screen.getByText('$0.50')).toBeInTheDocument() }) it('displays overview data correctly', () => { render( , ) expect(screen.getByText('1,234')).toBeInTheDocument() expect(screen.getByText('5,678')).toBeInTheDocument() expect(screen.getByText('0.50%')).toBeInTheDocument() }) it('displays market data correctly', () => { render( , ) expect(screen.getByText('1,000,000')).toBeInTheDocument() expect(screen.getByText('800,000')).toBeInTheDocument() expect(screen.getByText('$400,000')).toBeInTheDocument() expect(screen.getByText('$50,000')).toBeInTheDocument() }) it('shows loading spinner for circulating supply when isHoldersDataLoading is true', () => { const { container } = render( , ) const spinners = container.querySelectorAll('.loading-spinner') expect(spinners.length).toBeGreaterThan(0) }) it('shows loading spinner for market cap when isHoldersDataLoading is true', () => { const { container } = render( , ) const spinners = container.querySelectorAll('.loading-spinner') expect(spinners.length).toBeGreaterThan(0) }) it('shows loading spinner for AMM TVL when isAmmTvlLoading is true', () => { const { container } = render( , ) const spinners = container.querySelectorAll('.loading-spinner') expect(spinners.length).toBeGreaterThan(0) }) it('displays circulating supply when not loading', () => { render( , ) expect(screen.getByText('800,000')).toBeInTheDocument() }) it('displays market cap when not loading', () => { render( , ) expect(screen.getByText('$400,000')).toBeInTheDocument() }) it('handles empty market cap gracefully', () => { const dataWithoutMarketCap: MarketData = { ...mockMarketData, market_cap: '', } render( , ) expect(screen.getByText('$50,000')).toBeInTheDocument() }) it('handles transfer fee as dash when not applicable', () => { const dataWithoutFee: OverviewData = { ...mockOverviewData, transfer_fee: '--', } render( , ) expect(screen.getByText('--')).toBeInTheDocument() }) it('displays volume and trades data', () => { render( , ) expect(screen.getByText('$50,000')).toBeInTheDocument() }) it('renders both header boxes', () => { const { container } = render( , ) const boxes = container.querySelectorAll('.header-box') expect(boxes.length).toBe(2) }) it('renders all overview items', () => { const { container } = render( , ) const overviewItems = container.querySelectorAll('.header-box-item') expect(overviewItems.length).toBeGreaterThanOrEqual(5) }) it('handles zero values correctly', () => { const zeroData: OverviewData = { issuer: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', issuer_account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', price: '$0.00', holders: '0', trustlines: '0', transfer_fee: '--', } const zeroMarketData: MarketData = { supply: '0', circ_supply: '0', market_cap: '', volume_24h: '--', trades_24h: '--', amm_tvl: '', amm_account: '', } render( , ) expect(screen.getByText('$0.00')).toBeInTheDocument() }) it('displays -- when both amm_tvl and tvl_usd are empty', () => { const dataWithoutTvl: MarketData = { ...mockMarketData, amm_tvl: '', tvl_usd: '', } render( , ) expect(screen.getByText('--')).toBeInTheDocument() }) it('displays tvl_usd when available', () => { const dataWithTvlUsd: MarketData = { ...mockMarketData, amm_tvl: '', tvl_usd: '$50,000', } render( , ) const tvlElements = screen.getAllByText('$50,000') expect(tvlElements.length).toBeGreaterThan(0) }) it('displays amm_tvl when tvl_usd is not available', () => { const dataWithAmmTvl: MarketData = { ...mockMarketData, amm_tvl: '$75,000', tvl_usd: '', } render( , ) expect(screen.getByText('$75,000')).toBeInTheDocument() }) }) ================================================ FILE: src/containers/Token/IOU/test/hooks/useMarketCalculations.test.ts ================================================ import { renderHook } from '@testing-library/react' import { useMarketCalculations } from '../../hooks/useMarketCalculations' import { TokenHoldersData } from '../../api/holders' import { LOSToken } from '../../../../shared/losTypes' describe('useMarketCalculations', () => { const mockTokenData: LOSToken = { currency: 'USD', issuer_account: 'rIssuer', trustlines: 100, index: 0, } const mockHoldersData: TokenHoldersData = { totalSupply: 1000000, totalHolders: 100, holders: [], } it('returns market calculations with valid data', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) expect(result.current.circSupply).toBe(1000000) expect(result.current.formattedCircSupply).toBeDefined() expect(result.current.marketCap).toBeDefined() }) it('returns null marketCap when isHoldersDataLoading is true', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: true, }), ) expect(result.current.marketCap).toBeNull() }) it('returns null marketCap when circSupply is 0', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: undefined, tokenData: mockTokenData, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) expect(result.current.marketCap).toBeNull() }) it('returns null marketCap when price is empty', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) expect(result.current.marketCap).toBeNull() }) it('returns null marketCap when xrpUSDRate is empty', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.5', xrpUSDRate: '', isHoldersDataLoading: false, }), ) expect(result.current.marketCap).toBeNull() }) it('calculates marketCap correctly with valid inputs', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '1', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) // 1000000 * 1 * 2 = 2000000 expect(result.current.marketCap).toBeDefined() }) it('handles zero price', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) expect(result.current.marketCap).toBeNull() }) it('handles zero xrpUSDRate', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.5', xrpUSDRate: '0', isHoldersDataLoading: false, }), ) expect(result.current.marketCap).toBeNull() }) it('handles very small price values', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.0001', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) expect(result.current.marketCap).toBeDefined() }) it('handles very large price values', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '1000000', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) expect(result.current.marketCap).toBeDefined() }) it('formats circulating supply', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) expect(result.current.formattedCircSupply).toBeDefined() expect(typeof result.current.formattedCircSupply).toBe('string') }) it('returns circSupply as number', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) expect(typeof result.current.circSupply).toBe('number') }) it('handles undefined holdersData', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: undefined, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) expect(result.current.circSupply).toBe(1000000) }) it('handles circ_supply in tokenData', () => { const { result } = renderHook(() => useMarketCalculations({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, circ_supply: '500000' }, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: false, }), ) expect(result.current.circSupply).toBe(500000) }) it('memoizes results correctly', () => { const { result, rerender } = renderHook( (props) => useMarketCalculations(props), { initialProps: { holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: false, }, }, ) const firstResult = result.current rerender({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: false, }) expect(result.current).toEqual(firstResult) }) it('updates when dependencies change', () => { const { result, rerender } = renderHook( (props) => useMarketCalculations(props), { initialProps: { holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '1000000' }, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: false, }, }, ) const firstResult = result.current rerender({ holdersData: mockHoldersData, tokenData: { ...mockTokenData, supply: '2000000' }, price: '0.5', xrpUSDRate: '2', isHoldersDataLoading: false, }) expect(result.current.circSupply).not.toEqual(firstResult.circSupply) }) }) ================================================ FILE: src/containers/Token/IOU/test/index.test.tsx ================================================ import { IOU } from '../index' jest.mock('../api/token', () => ({ __esModule: true, default: jest.fn(), })) describe('IOU container', () => { it('exports IOU component', () => { expect(IOU).toBeDefined() expect(typeof IOU).toBe('function') }) it('IOU component is a valid React component', () => { expect(IOU.length >= 0).toBe(true) }) }) ================================================ FILE: src/containers/Token/IOU/test/services/dexTradesPagination.test.ts ================================================ import { dexTradesPaginationService } from '../../services/dexTradesPagination' import { getDexTrades } from '../../../shared/api/tokenTx' jest.mock('../../../shared/api/tokenTx', () => ({ getDexTrades: jest.fn(), })) const mockGetDexTrades = getDexTrades as jest.Mock describe('DexTradesPaginationService', () => { beforeEach(() => { jest.clearAllMocks() dexTradesPaginationService.clearCache() }) describe('getDexTradesPage', () => { it('returns empty trades on first call with no data', async () => { mockGetDexTrades.mockResolvedValue({ results: [], next_cursor: null, }) const result = await dexTradesPaginationService.getDexTradesPage( 'USD.rIssuer', 1, ) expect(result.trades).toEqual([]) expect(result.totalTrades).toBe(0) expect(result.hasMore).toBe(false) }) it('fetches and returns trades on first page', async () => { const mockTrades = [ { tx_hash: 'hash1', ledger_index: 100, timestamp: 1000, from: 'rFrom1', to: 'rTo1', amount_in: { currency: 'USD', issuer: 'rIssuer', value: '100' }, amount_out: { currency: 'XRP', issuer: '', value: '50' }, }, ] mockGetDexTrades.mockResolvedValue({ results: mockTrades, next_cursor: 'cursor1', }) const result = await dexTradesPaginationService.getDexTradesPage( 'USD.rIssuer', 1, ) expect(result.trades.length).toBe(1) expect(result.totalTrades).toBe(1) expect(result.hasMore).toBe(false) }) it('uses default page size when not provided', async () => { mockGetDexTrades.mockResolvedValue({ results: [], next_cursor: null, }) await dexTradesPaginationService.getDexTradesPage('USD.rIssuer', 1) expect(mockGetDexTrades).toHaveBeenCalledWith( 'USD.rIssuer', 200, undefined, 'next', undefined, undefined, ) }) it('uses custom page size when provided', async () => { mockGetDexTrades.mockResolvedValue({ results: [], next_cursor: null, }) await dexTradesPaginationService.getDexTradesPage('USD.rIssuer', 1, 20) expect(mockGetDexTrades).toHaveBeenCalled() }) it('handles multiple pages correctly', async () => { const mockTrades = Array.from({ length: 200 }, (_, i) => ({ tx_hash: `hash${i}`, ledger_index: 100 + i, timestamp: 1000 + i, from: `rFrom${i}`, to: `rTo${i}`, amount_in: { currency: 'USD', issuer: 'rIssuer', value: '100' }, amount_out: { currency: 'XRP', issuer: '', value: '50' }, })) mockGetDexTrades.mockResolvedValue({ results: mockTrades, next_cursor: 'cursor1', }) const result1 = await dexTradesPaginationService.getDexTradesPage( 'USD.rIssuer', 1, 10, ) expect(result1.trades.length).toBe(10) expect(result1.hasMore).toBe(true) }) it('caches trades between calls', async () => { const mockTrades = [ { tx_hash: 'hash1', ledger_index: 100, timestamp: 1000, from: 'rFrom1', to: 'rTo1', amount_in: { currency: 'USD', issuer: 'rIssuer', value: '100' }, amount_out: { currency: 'XRP', issuer: '', value: '50' }, }, ] mockGetDexTrades.mockResolvedValue({ results: mockTrades, next_cursor: null, }) await dexTradesPaginationService.getDexTradesPage('USD.rIssuer', 1) const callCount1 = mockGetDexTrades.mock.calls.length await dexTradesPaginationService.getDexTradesPage('USD.rIssuer', 1) const callCount2 = mockGetDexTrades.mock.calls.length // Should not fetch again for same page expect(callCount2).toBe(callCount1) }) it('handles sorting parameters', async () => { mockGetDexTrades.mockResolvedValue({ results: [], next_cursor: null, }) await dexTradesPaginationService.getDexTradesPage( 'USD.rIssuer', 1, 10, 'timestamp', 'asc', ) expect(mockGetDexTrades).toHaveBeenCalledWith( 'USD.rIssuer', 200, undefined, 'next', 'timestamp', 'asc', ) }) it('returns correct hasMore flag', async () => { const mockTrades = Array.from({ length: 200 }, (_, i) => ({ tx_hash: `hash${i}`, ledger_index: 100 + i, timestamp: 1000 + i, from: `rFrom${i}`, to: `rTo${i}`, amount_in: { currency: 'USD', issuer: 'rIssuer', value: '100' }, amount_out: { currency: 'XRP', issuer: '', value: '50' }, })) mockGetDexTrades.mockResolvedValue({ results: mockTrades, next_cursor: 'cursor1', }) const result = await dexTradesPaginationService.getDexTradesPage( 'USD.rIssuer', 1, 10, ) expect(result.hasMore).toBe(true) }) it('awaits in-flight prefetch when page exceeds cache', async () => { // First batch: 100 trades with a next_cursor const batch1 = Array.from({ length: 100 }, (_, i) => ({ tx_hash: `hash${i}`, ledger_index: 100 + i, timestamp: 1000 + i, from: `rFrom${i}`, to: `rTo${i}`, amount_in: { currency: 'USD', issuer: 'rIssuer', value: '100' }, amount_out: { currency: 'XRP', issuer: '', value: '50' }, })) // Second batch: 100 more trades const batch2 = Array.from({ length: 100 }, (_, i) => ({ tx_hash: `hash${100 + i}`, ledger_index: 200 + i, timestamp: 2000 + i, from: `rFrom${100 + i}`, to: `rTo${100 + i}`, amount_in: { currency: 'USD', issuer: 'rIssuer', value: '100' }, amount_out: { currency: 'XRP', issuer: '', value: '50' }, })) mockGetDexTrades .mockResolvedValueOnce({ results: batch1, next_cursor: 'cursor1' }) .mockResolvedValueOnce({ results: batch2, next_cursor: null }) // Page 8 triggers initial fetch (batch1) and prefetch at 70% threshold // (endIndex 80 > 100 * 0.7 = 70) await dexTradesPaginationService.getDexTradesPage('USD.rIssuer', 8, 10) // Page 11 is beyond cache (100 items), should await prefetch and return data const result = await dexTradesPaginationService.getDexTradesPage( 'USD.rIssuer', 11, 10, ) // Page 11 returned a full page, not empty — prefetch was awaited expect(result.trades.length).toBe(10) // First item is from batch2 (hash100–hash199), confirming data came from the prefetched batch expect(result.trades[0].hash).toBe('hash100') }) }) describe('clearCache', () => { it('clears cache for specific tokenId', async () => { mockGetDexTrades.mockResolvedValue({ results: [], next_cursor: null, }) await dexTradesPaginationService.getDexTradesPage('USD.rIssuer', 1) dexTradesPaginationService.clearCache('USD.rIssuer') const count1 = mockGetDexTrades.mock.calls.length await dexTradesPaginationService.getDexTradesPage('USD.rIssuer', 1) const count2 = mockGetDexTrades.mock.calls.length expect(count2).toBeGreaterThan(count1) }) it('clears all caches when no parameters provided', async () => { mockGetDexTrades.mockResolvedValue({ results: [], next_cursor: null, }) await dexTradesPaginationService.getDexTradesPage('USD.rIssuer', 1) dexTradesPaginationService.clearCache() const count1 = mockGetDexTrades.mock.calls.length await dexTradesPaginationService.getDexTradesPage('USD.rIssuer', 1) const count2 = mockGetDexTrades.mock.calls.length expect(count2).toBeGreaterThan(count1) }) }) describe('getCachedTradesCount', () => { it('returns 0 for uncached tokenId', () => { const count = dexTradesPaginationService.getCachedTradesCount('USD.rIssuer') expect(count).toBe(0) }) it('returns correct count after fetching', async () => { const mockTrades = Array.from({ length: 5 }, (_, i) => ({ tx_hash: `hash${i}`, ledger_index: 100 + i, timestamp: 1000 + i, from: `rFrom${i}`, to: `rTo${i}`, amount_in: { currency: 'USD', issuer: 'rIssuer', value: '100' }, amount_out: { currency: 'XRP', issuer: '', value: '50' }, })) mockGetDexTrades.mockResolvedValue({ results: mockTrades, next_cursor: null, }) await dexTradesPaginationService.getDexTradesPage('USD.rIssuer', 1) const count = dexTradesPaginationService.getCachedTradesCount('USD.rIssuer') expect(count).toBe(5) }) }) describe('edge cases', () => { it('handles invalid page size gracefully', async () => { mockGetDexTrades.mockResolvedValue({ results: [], next_cursor: null, }) const result = await dexTradesPaginationService.getDexTradesPage( 'USD.rIssuer', 1, 0, ) expect(result).toBeDefined() }) it('handles negative page number', async () => { mockGetDexTrades.mockResolvedValue({ results: [], next_cursor: null, }) const result = await dexTradesPaginationService.getDexTradesPage( 'USD.rIssuer', -1, ) expect(result).toBeDefined() }) it('handles empty tokenId', async () => { mockGetDexTrades.mockResolvedValue({ results: [], next_cursor: null, }) const result = await dexTradesPaginationService.getDexTradesPage('', 1) expect(result).toBeDefined() }) }) }) ================================================ FILE: src/containers/Token/IOU/test/utils/tokenCalculations.test.ts ================================================ import { calculateCirculatingSupply, formatCirculatingSupply, } from '../../utils/tokenCalculations' import { TokenHoldersData } from '../../api/holders' import { LOSToken } from '../../../../shared/losTypes' describe('tokenCalculations', () => { describe('calculateCirculatingSupply', () => { const mockTokenData: LOSToken = { currency: 'USD', issuer_account: 'rIssuer', trustlines: 100, index: 0, } it('returns circ_supply from tokenData if available', () => { const tokenData = { ...mockTokenData, circ_supply: '1000000', } const result = calculateCirculatingSupply(undefined, tokenData) expect(result).toBe(1000000) }) it('returns supply from tokenData when circ_supply is not available', () => { const tokenData = { ...mockTokenData, supply: '5000000', } const result = calculateCirculatingSupply(undefined, tokenData) expect(result).toBe(5000000) }) it('returns totalSupply from holdersData when tokenData supply is not available', () => { const holdersData: TokenHoldersData = { totalSupply: 3000000, totalHolders: 100, holders: [], } const tokenData = { ...mockTokenData, } const result = calculateCirculatingSupply(holdersData, tokenData) expect(result).toBe(3000000) }) it('returns 0 when no supply data is available', () => { const tokenData = { ...mockTokenData, } const result = calculateCirculatingSupply(undefined, tokenData) expect(result).toBe(0) }) it('subtracts large holders (>= 20%) for non-stablecoin tokens', () => { const holdersData: TokenHoldersData = { totalSupply: 1000000, totalHolders: 5, holders: [ { account: 'rHolder1', balance: 300000, percent: 30 }, { account: 'rHolder2', balance: 200000, percent: 20 }, { account: 'rHolder3', balance: 100000, percent: 10 }, ], } const tokenData = { ...mockTokenData, supply: '1000000', asset_subclass: 'token', } const result = calculateCirculatingSupply(holdersData, tokenData) // 1000000 - 300000 (30%) - 200000 (20%) = 500000 expect(result).toBe(500000) }) it('does not subtract large holders for stablecoin tokens', () => { const holdersData: TokenHoldersData = { totalSupply: 1000000, totalHolders: 5, holders: [ { account: 'rHolder1', balance: 300000, percent: 30 }, { account: 'rHolder2', balance: 200000, percent: 20 }, { account: 'rHolder3', balance: 100000, percent: 10 }, ], } const tokenData = { ...mockTokenData, supply: '1000000', asset_subclass: 'stablecoin', } const result = calculateCirculatingSupply(holdersData, tokenData) // For stablecoins, no subtraction: 1000000 expect(result).toBe(1000000) }) it('handles holders with exactly 20% threshold', () => { const holdersData: TokenHoldersData = { totalSupply: 1000000, totalHolders: 5, holders: [ { account: 'rHolder1', balance: 200000, percent: 20 }, { account: 'rHolder2', balance: 100000, percent: 10 }, ], } const tokenData = { ...mockTokenData, supply: '1000000', asset_subclass: 'token', } const result = calculateCirculatingSupply(holdersData, tokenData) // 1000000 - 200000 (20%) = 800000 expect(result).toBe(800000) }) it('handles holders with less than 20% threshold', () => { const holdersData: TokenHoldersData = { totalSupply: 1000000, totalHolders: 5, holders: [ { account: 'rHolder1', balance: 190000, percent: 19 }, { account: 'rHolder2', balance: 100000, percent: 10 }, ], } const tokenData = { ...mockTokenData, supply: '1000000', asset_subclass: 'token', } const result = calculateCirculatingSupply(holdersData, tokenData) // No subtraction: 1000000 expect(result).toBe(1000000) }) it('handles empty holders array', () => { const holdersData: TokenHoldersData = { totalSupply: 1000000, totalHolders: 0, holders: [], } const tokenData = { ...mockTokenData, supply: '1000000', asset_subclass: 'token', } const result = calculateCirculatingSupply(holdersData, tokenData) expect(result).toBe(1000000) }) it('handles multiple large holders', () => { const holdersData: TokenHoldersData = { totalSupply: 1000000, totalHolders: 10, holders: [ { account: 'rHolder1', balance: 250000, percent: 25 }, { account: 'rHolder2', balance: 250000, percent: 25 }, { account: 'rHolder3', balance: 250000, percent: 25 }, { account: 'rHolder4', balance: 250000, percent: 25 }, ], } const tokenData = { ...mockTokenData, supply: '1000000', asset_subclass: 'token', } const result = calculateCirculatingSupply(holdersData, tokenData) // 1000000 - (250000 * 4) = 0 expect(result).toBe(0) }) it('prioritizes circ_supply over supply', () => { const holdersData: TokenHoldersData = { totalSupply: 5000000, totalHolders: 100, holders: [], } const tokenData = { ...mockTokenData, circ_supply: '2000000', supply: '3000000', } const result = calculateCirculatingSupply(holdersData, tokenData) expect(result).toBe(2000000) }) }) describe('formatCirculatingSupply', () => { it('formats small numbers with full precision', () => { const result = formatCirculatingSupply(100) expect(result).toBe('100') }) it('formats large numbers with abbreviation', () => { const result = formatCirculatingSupply(1000000) expect(result).toMatch(/1\.0M|1M/) }) it('formats very large numbers with abbreviation', () => { const result = formatCirculatingSupply(1000000000) expect(result).toMatch(/1\.0B|1B/) }) it('formats zero', () => { const result = formatCirculatingSupply(0) expect(result).toBe('0') }) it('formats decimal numbers', () => { const result = formatCirculatingSupply(1234.5678) expect(result).toBeDefined() }) it('handles very small numbers', () => { const result = formatCirculatingSupply(0.0001) expect(result).toBeDefined() }) }) }) ================================================ FILE: src/containers/Token/IOU/utils/tokenCalculations.ts ================================================ import { parseIntegerAmount } from '../../../shared/NumberFormattingUtils' import { TokenHoldersData } from '../api/holders' import { LOSToken } from '../../../shared/losTypes' /** * Calculates the circulating supply for a token * @param holdersData - Token holders data * @param tokenData - Token data * @returns Calculated circulating supply */ export const calculateCirculatingSupply = ( holdersData: TokenHoldersData | undefined, tokenData: LOSToken, ): number => { if (tokenData.circ_supply) { return Number(tokenData.circ_supply) } let circSupply = Number(tokenData.supply) || holdersData?.totalSupply || 0 // For stablecoins, don't subtract large percentage holders from circulating supply if (tokenData.asset_subclass !== 'stablecoin' && holdersData) { holdersData.holders.forEach((holder) => { if (holder.percent >= 20) { circSupply -= holder.balance } }) } return circSupply } /** * Formats the circulating supply for display * @param circSupply - The circulating supply number * @returns Formatted circulating supply string */ export const formatCirculatingSupply = (circSupply: number): string => parseIntegerAmount(circSupply) ================================================ FILE: src/containers/Token/MPT/Header/GeneralOverview.tsx ================================================ import { useTranslation } from 'react-i18next' import { shortenAccount, shortenMPTID } from '../../../shared/utils' import { Account } from '../../../shared/components/Account' import { CopyableText } from '../../../shared/components/CopyableText' import { parseIntegerAmount, parsePercent, } from '../../../shared/NumberFormattingUtils' interface GeneralOverviewProps { issuer: string issuerName?: string transferFee?: number assetScale?: number mptIssuanceId: string showMptId: boolean holdersCount?: number holdersLoading?: boolean } export const GeneralOverview = ({ issuer, issuerName, transferFee, assetScale, mptIssuanceId, showMptId: showMptIssuanceId, holdersCount, holdersLoading, }: GeneralOverviewProps): JSX.Element => { const { t } = useTranslation() return (
{t('token_page.general_overview')}
{t('token_page.issuer')}
{t('token_page.price')}
--
{t('token_page.holders')}
{holdersLoading ? ( ) : ( parseIntegerAmount(holdersCount ?? 0) )}
{t('token_page.transfer_fee')}
{(transferFee && parsePercent(transferFee / 1000, 3)) ?? '--'}
{t('asset_scale')}
{assetScale ?? 0}
{showMptIssuanceId && (
{t('mpt_issuance_id')}
)}
) } ================================================ FILE: src/containers/Token/MPT/Header/MarketData.tsx ================================================ import { useTranslation } from 'react-i18next' import { convertScaledPrice } from '../../../shared/utils' import { parseAmount } from '../../../shared/NumberFormattingUtils' interface MarketDataProps { maxAmt?: string outstandingAmt?: string assetScale?: number } export const MarketData = ({ maxAmt, outstandingAmt, assetScale, }: MarketDataProps): JSX.Element => { const { t } = useTranslation() const formattedSupply = parseAmount( convertScaledPrice(BigInt(maxAmt || '0'), assetScale ?? 0), ) const formattedCircSupply = parseAmount( convertScaledPrice(BigInt(outstandingAmt || '0'), assetScale ?? 0), ) return (
{t('token_page.market_data')}
{t('token_page.supply')}
{formattedSupply}
{t('token_page.circulating_supply')}
{formattedCircSupply}
{t('token_page.market_cap')}
--
{t('token_page.volume_24h')}
--
{t('token_page.trades_24h')}
--
{t('token_page.amm_tvl')}
--
) } ================================================ FILE: src/containers/Token/MPT/Header/Metadata.tsx ================================================ import { useTranslation } from 'react-i18next' import { JsonView } from '../../../shared/components/JsonView' interface MetadataProps { decodedMPTMetadata: Record | string displayMetadataTitle?: boolean } export const Metadata = ({ decodedMPTMetadata, displayMetadataTitle = true, }: MetadataProps): JSX.Element => { const { t } = useTranslation() const isString = typeof decodedMPTMetadata === 'string' return (
{displayMetadataTitle && (
{t('metadata')}
)}
{isString ? (
{decodedMPTMetadata}
) : ( )}
) } ================================================ FILE: src/containers/Token/MPT/Header/Settings.tsx ================================================ import { useTranslation } from 'react-i18next' interface Props { flags?: string[] } interface FlagItem { key: string label: string enabled: boolean } export const Settings = ({ flags = [] }: Props): JSX.Element => { const { t } = useTranslation() const flagItems: FlagItem[] = [ { key: 'locked', label: t('locked'), enabled: flags.includes('lsfMPTLocked'), }, { key: 'canLock', label: t('can_lock'), enabled: flags.includes('lsfMPTCanLock'), }, { key: 'requireAuth', label: t('require_auth'), enabled: flags.includes('lsfMPTRequireAuth'), }, { key: 'canEscrow', label: t('can_escrow'), enabled: flags.includes('lsfMPTCanEscrow'), }, { key: 'canTrade', label: t('can_trade'), enabled: flags.includes('lsfMPTCanTrade'), }, { key: 'canTransfer', label: t('can_transfer'), enabled: flags.includes('lsfMPTCanTransfer'), }, { key: 'canClawback', label: t('can_clawback'), enabled: flags.includes('lsfMPTCanClawback'), }, ] return (
{t('settings')}
{flagItems.map((flag) => (
{flag.label}
{flag.enabled ? t('enabled') : t('disabled')}
))}
) } ================================================ FILE: src/containers/Token/MPT/Header/index.tsx ================================================ import { useEffect, useState, useRef } from 'react' import { useTranslation, Trans } from 'react-i18next' import { Loader } from '../../../shared/components/Loader' import './styles.scss' import { BAD_REQUEST, HASH192_REGEX, shortenDomain, shortenMPTID, stripHttpProtocol, convertToHttpURL, shortenAccount, } from '../../../shared/utils' import { CopyableText } from '../../../shared/components/CopyableText' import DomainLink from '../../../shared/components/DomainLink' import { FormattedMPTIssuance } from '../../../shared/Interfaces' import { GeneralOverview } from './GeneralOverview' import { MarketData } from './MarketData' import { Settings } from './Settings' import { Metadata } from './Metadata' import GlobeSvg from '../../../shared/images/globe.svg' import DefaultTokenIcon from '../../../shared/images/default_token_icon.svg' import DownArrow from '../../../shared/images/down_arrow.svg' import InfoIcon from '../../../shared/images/info-duotone.svg' interface MetadataUri { uri: string category: string title: string } interface Props { mptIssuanceId: string data?: FormattedMPTIssuance loading?: boolean setError: (error: number | null) => void holdersCount?: number holdersLoading?: boolean } export const Header = (props: Props) => { const { t } = useTranslation() const { mptIssuanceId, data, loading, setError, holdersCount, holdersLoading, } = props const [showURLDropdown, setShowURLDropdown] = useState(false) const dropdownRef = useRef(null) useEffect(() => { if (!HASH192_REGEX.test(mptIssuanceId)) { setError(BAD_REQUEST) } }, [setError, mptIssuanceId]) // Close dropdown when clicking outside useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) ) { setShowURLDropdown(false) } } document.addEventListener('mousedown', handleClickOutside) return () => document.removeEventListener('mousedown', handleClickOutside) }, []) if (loading) { return (
) } if (!data) { return null } const { issuer, assetScale, maxAmt, outstandingAmt, transferFee, flags, rawMPTMetadata, parsedMPTMetadata, isMPTMetadataCompliant, } = data const ticker = parsedMPTMetadata?.ticker as string | undefined const logoUrl = parsedMPTMetadata?.icon as string | undefined const issuerName = parsedMPTMetadata?.issuer_name as string | undefined const uris = parsedMPTMetadata?.uris as MetadataUri[] | undefined const showMPTMetadataWarning = !isMPTMetadataCompliant // Only show MPT issuance ID if ticker exists (since we show ticker in header, need to show ID somewhere) const showMPTIssuanceId = !!ticker // Convert logo URL to HTTP/HTTPS format (handles IPFS URLs) const RenderedLogoUrl = logoUrl ? convertToHttpURL(logoUrl) : undefined // Get all URIs for dropdown, filtering out items without uri const allUris = (uris || []).filter((u) => u.uri) return (
{showMPTMetadataWarning && (
)}
{t('token')}
{t('token_type.mpt')}
{RenderedLogoUrl ? ( {`${ticker ) : ( )} {ticker ? ( {ticker.toUpperCase()} ) : ( )} {/* Show issuer name if available */} {issuerName && (
({shortenAccount(issuerName)} )
)}
{allUris.length > 0 && (
{allUris.length > 1 && ( )} {showURLDropdown && allUris.length > 1 && (
{allUris.slice(1).map((uriItem) => ( ))}
)}
)}
{(parsedMPTMetadata || rawMPTMetadata) && ( )}
) } ================================================ FILE: src/containers/Token/MPT/Header/styles.scss ================================================ @use '../../../shared/css/variables' as *; // ============================================================================= // MPT HEADER - MPT-specific header styles only // All shared styles are in src/containers/Token/shared/styles.scss // ============================================================================= .token-header.mpt { // MPT-specific category pill variant ($mpt color) .token-indicator { .category-pill { border: 1px solid $mpt; background: $mpt; } } // MPT metadata warning banner .metadata-warning { display: flex; align-items: center; padding: 25px; border: 1px solid $orange-50; border-radius: 8px; margin-bottom: 30px; background: $orange-90; gap: 12px; .warning-icon { width: 16px; min-width: 16px; height: 16px; min-height: 16px; flex-shrink: 0; margin-top: 2px; } .warning-message { margin: 0; color: $black-0; font-size: 16px; line-height: 1.5; a { color: $black-0; text-decoration: underline; &:hover { color: $orange-30; } } } } .mpt-id { word-break: break-all; } // MPT-specific dropdown styles (base styles are in shared/styles.scss) .links-dropdown-container { position: relative; } .dropdown-toggle-button { display: flex; align-items: center; padding: 0; border: none; background: transparent; cursor: pointer; .dropdown-arrow { width: 12px; height: 12px; path { fill: $green-30; transition: fill 0.2s ease; } } } .domain-link-container:hover { .dropdown-arrow path { fill: $green-50; } } .links-dropdown-menu { position: absolute; z-index: 100; top: 100%; right: 0; left: 0; display: flex; flex-direction: column; padding: 8px 0; border: 1px solid $green-30; border-radius: 8px; margin-top: 4px; background: $black-80; box-shadow: 0 4px 12px rgb(0 0 0 / 30%); .links-dropdown-item { padding: 8px 16px; color: $green-30; font-size: 14px; text-decoration: none; transition: background-color 0.2s ease; &:hover { background-color: rgba($green-30, 0.1); color: $green-50; } } } // MPT-specific description value styling .description-value { max-width: 300px; overflow-wrap: break-word; } // Settings box flag status styling .settings-box { .flag-status { min-width: 85px; padding: 4px 10px; border-radius: 999px; font-size: 12px; letter-spacing: 0.06em; text-align: center; text-transform: uppercase; white-space: nowrap; @include semibold; &.enabled { background: $green-50; color: $black-100; } &.disabled { background: $black-50; color: $black-0; } } } // Metadata box takes full width .metadata-box { @include for-size(tablet-landscape-up) { width: 100%; max-width: 100%; flex: 0 0 100%; } .metadata-json { max-height: 250px; overflow-y: auto; scrollbar-color: rgb(255 255 255 / 20%) transparent; /* Firefox */ scrollbar-width: thin; /* WebKit */ &::-webkit-scrollbar { width: 10px; height: 10px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { border: 2px solid transparent; /* create padding effect */ border-radius: 6px; background: rgb(255 255 255 / 20%); background-clip: padding-box; } &::-webkit-scrollbar-thumb:hover { background: rgb(255 255 255 / 12%); } .json-view { padding: 16px; margin-bottom: 0; } .json-view-controls { top: 16px; right: 16px; @include for-size(phone-only) { top: 16px; left: 16px; } } .metadata-string { padding: 16px; font-family: monospace; font-size: 14px; line-height: 1.5; overflow-wrap: break-word; white-space: pre-wrap; } } } } ================================================ FILE: src/containers/Token/MPT/TablePicker/index.tsx ================================================ import { useState, useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { TransactionTable } from '../../../shared/components/TransactionTable/TransactionTable' import { Tabs } from '../../../shared/components/Tabs' import { useAccountTransactions } from '../../shared/hooks/useAccountTransactions' import { HoldersTable, XRPLHolder, } from '../../../shared/components/HoldersTable/HoldersTable' import { TransfersTable, LOSTransfer, } from '../../shared/components/TransfersTable/TransfersTable' import { TablePaginationState } from '../../shared/hooks/usePaginationState' import { TableSortingState } from '../../shared/hooks/useSortingState' import { convertScaledPrice } from '../../../shared/utils' export interface TablePickerProps { mptIssuanceId: string issuer: string assetScale?: number // Holders table state holdersData?: XRPLHolder[] holdersPagination: TablePaginationState holdersLoading: boolean // Transfers table state transfersData?: LOSTransfer[] transfersPagination: TablePaginationState transfersSorting: TableSortingState transfersLoading: boolean onRefreshTransfers?: () => void } export const TablePicker = ({ mptIssuanceId, issuer, assetScale, holdersData, holdersPagination, holdersLoading, transfersData, transfersPagination, transfersSorting, transfersLoading, onRefreshTransfers, }: TablePickerProps) => { const { t } = useTranslation() const { data, error, loading, fetchNextPage, hasNextPage } = useAccountTransactions({ account: issuer, tokenId: mptIssuanceId, limit: 50, }) const [tablePickerState, setTablePickerState] = useState< 'all' | 'transfers' | 'holders' >('all') // Reset table picker state when token changes useEffect(() => { setTablePickerState('all') }, [mptIssuanceId]) // Helper to reset pagination to page 1 const resetTablePagination = (setCurrentPage: (page: number) => void) => { setCurrentPage(1) } // Helper to render transaction table const renderTransactionTable = () => ( page.transactions).flat()} loading={loading} emptyMessage={error?.message ? t(error.message as any) : ''} onLoadMore={() => fetchNextPage()} hasAdditionalResults={hasNextPage} /> ) // Transform transfer amount.value using assetScale const transfersFormatted: LOSTransfer[] = useMemo(() => { if (!transfersData) { return [] } return transfersData.map((transfer) => ({ ...transfer, amount: { ...transfer.amount, value: convertScaledPrice( BigInt(transfer.amount.value), assetScale ?? 0, ), }, })) }, [transfersData, assetScale]) // Helper to render transfers table const renderTransfersTable = () => ( ) // Helper to render holders table const renderHoldersTable = () => ( ) const tabs = [ { id: 'all', labelKey: 'token_page.all_tx' }, { id: 'transfers', labelKey: 'token_page.transfers_tx', onTabClick: () => resetTablePagination(transfersPagination.setCurrentPage), }, { id: 'holders', labelKey: 'token_page.holders_table', onTabClick: () => resetTablePagination(holdersPagination.setCurrentPage), }, ] return (

setTablePickerState(tabId as 'all' | 'transfers' | 'holders') } />
{tablePickerState === 'all' && renderTransactionTable()} {tablePickerState === 'transfers' && renderTransfersTable()} {tablePickerState === 'holders' && renderHoldersTable()}
) } ================================================ FILE: src/containers/Token/MPT/api/holders.ts ================================================ import { getMPTHolders } from '../../../../rippled/lib/rippled' import { convertScaledPrice } from '../../../shared/utils' interface MPTHolderFromClio { account: string flags: number mpt_amount: string mptoken_index: string } interface MPTHolder { rank: number account: string balance: string percent: number value_usd: number | null } export interface MPTHolderSummary { holders: MPTHolder[] totalHolders: number } export async function fetchAllMPTHolders( rippledSocket: any, tokenId: string, outstandingAmount: string, assetScale: number, ): Promise { const allHolders: MPTHolderFromClio[] = [] let marker: string | undefined do { // eslint-disable-next-line no-await-in-loop const response = await getMPTHolders( rippledSocket, tokenId, 100, // Fetch 100 at a time for efficiency marker || '', ) if (response.mptokens) { allHolders.push(...response.mptokens) } marker = response.marker } while (marker) const totalOutstanding = BigInt(outstandingAmount || '0') // Filter out zero balances and sort by balance in descending order const sortedHolders = allHolders .filter((h) => BigInt(h.mpt_amount || 0) > 0n) .sort((a, b) => { const diff = BigInt(b.mpt_amount || 0) - BigInt(a.mpt_amount || 0) if (diff > 0n) { return 1 } if (diff < 0n) { return -1 } return 0 }) // Format holders with rank and percentage const holders: MPTHolder[] = sortedHolders.map( (token: MPTHolderFromClio, index: number) => { const balance = BigInt(token.mpt_amount || '0') const percent = totalOutstanding > 0n ? Number((balance * 10000n) / totalOutstanding) / 100 : 0 return { rank: index + 1, account: token.account, balance: convertScaledPrice(BigInt(token.mpt_amount || 0), assetScale), percent, value_usd: null, // MPT doesn't have USD value yet } }, ) return { holders, totalHolders: holders.length, } } ================================================ FILE: src/containers/Token/MPT/index.tsx ================================================ import { FC, PropsWithChildren, useContext, useEffect, useMemo, useState, } from 'react' import { Helmet } from 'react-helmet-async' import { useQuery } from 'react-query' import { useRouteParams } from '../../shared/routing' import { MPT_ROUTE } from '../../App/routes' import { Header } from './Header' import { TablePicker } from './TablePicker' import NoMatch from '../../NoMatch' import './styles.scss' import '../shared/styles.scss' import { NOT_FOUND, BAD_REQUEST, shortenMPTID } from '../../shared/utils' import { useAnalytics } from '../../shared/analytics' import { ErrorMessages, FormattedMPTIssuance } from '../../shared/Interfaces' import { Loader } from '../../shared/components/Loader' import SocketContext from '../../shared/SocketContext' import { getMPTIssuance } from '../../../rippled/lib/rippled' import { formatMPTIssuance } from '../../../rippled/lib/utils' import { fetchAllMPTHolders } from './api/holders' import { paginationService as transfersPaginationService } from '../shared/services/transfersPagination' import { useCursorPaginatedQuery } from '../../shared/hooks/useCursorPaginatedQuery' import { PAGINATION_CONFIG, INITIAL_PAGE } from '../shared/constants' const ERROR_MESSAGES: ErrorMessages = { default: { title: 'generic_error', hints: ['not_your_fault'], }, [NOT_FOUND]: { title: 'assets.no_mpts_message', hints: ['check_mpt_id'], }, [BAD_REQUEST]: { title: 'invalid_xrpl_address', hints: ['check_mpt_id'], }, } const getErrorMessage = (error: unknown) => ERROR_MESSAGES[error as string | number] || ERROR_MESSAGES.default const Page: FC> = ({ mptIssuanceId, children, }) => (
{children}
) export const MPT = () => { const { trackScreenLoaded, trackException } = useAnalytics() const { id: mptIssuanceId = '' } = useRouteParams(MPT_ROUTE) const [error, setError] = useState(null) const rippledSocket = useContext(SocketContext) // Holders pagination state const [holdersPage, setHoldersPage] = useState(INITIAL_PAGE) const holdersPageSize = PAGINATION_CONFIG.HOLDERS_PAGE_SIZE // Fetch MPT issuance data const { data: mptokenIssuance, isFetching: mptLoading } = useQuery( ['getMPTIssuance', mptIssuanceId], async () => { const info = await getMPTIssuance(rippledSocket, mptIssuanceId) return formatMPTIssuance(info.node) }, { enabled: !!mptIssuanceId, onError: (e: any) => { trackException( `mptIssuance ${mptIssuanceId} --- ${JSON.stringify(e)}`, ) setError(e.code || NOT_FOUND) }, }, ) // Fetch ALL holders data at once using mpt_holders Clio method const { data: holdersData, isFetching: holdersLoading } = useQuery( ['getMPTHolders', mptIssuanceId], async () => fetchAllMPTHolders( rippledSocket, mptIssuanceId, mptokenIssuance?.outstandingAmt || '0', mptokenIssuance?.assetScale ?? 0, ), { enabled: !!mptokenIssuance?.issuer, }, ) // Client-side pagination: slice the holders array for the current page const paginatedHolders = useMemo(() => { if (!holdersData?.holders) { return [] } const start = (holdersPage - 1) * holdersPageSize const end = start + holdersPageSize return holdersData.holders.slice(start, end) }, [holdersData?.holders, holdersPage, holdersPageSize]) // Transfers — using shared hook const transfers = useCursorPaginatedQuery({ service: transfersPaginationService, id: mptIssuanceId, pageSize: PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE, enabled: !!mptIssuanceId, }) // Track page view useEffect(() => { trackScreenLoaded({ mpt_issuance_id: mptIssuanceId, }) return () => { window.scrollTo(0, 0) } }, [mptIssuanceId, trackScreenLoaded]) const renderError = () => { const message = getErrorMessage(error) return (
) } if (error) { return {renderError()} } return ( {mptLoading ? ( ) : ( mptokenIssuance && (
) )} {mptIssuanceId && mptokenIssuance && (
1, }} transfersSorting={{ sortField: transfers.sortField, setSortField: transfers.setSortField, sortOrder: transfers.sortOrder, setSortOrder: transfers.setSortOrder, }} transfersLoading={transfers.isLoading} onRefreshTransfers={transfers.refresh} />
)} ) } ================================================ FILE: src/containers/Token/MPT/styles.scss ================================================ @import '../shared/styles'; @import '../../shared/css/data-tables-mobile'; ================================================ FILE: src/containers/Token/MPT/test/Header/GeneralOverview.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import i18n from '../../../../../i18n/testConfig' import { GeneralOverview } from '../../Header/GeneralOverview' const TEST_MPT_ID = '00000004A407AF5856CCF3C42619DAA925813FC955C72983' const TEST_ISSUER = 'rTestIssuer123456789012345678901234' describe('GeneralOverview component', () => { const renderComponent = (props: any = {}) => render( , ) it('renders header box', () => { const { container } = renderComponent() expect(container.querySelectorAll('.header-box')).toHaveLength(1) expect(container.querySelector('.header-box-title')).toHaveTextContent( 'token_page.general_overview', ) }) it('displays issuer account', () => { const { container } = renderComponent() expect(container.querySelectorAll('.account-link')).toHaveLength(1) }) it('displays issuer name when provided', () => { const { container } = renderComponent({ issuerName: 'Test Issuer' }) expect(container).toHaveTextContent('Test Issuer') }) it('displays transfer fee when provided', () => { const { container } = renderComponent({ transferFee: 1000 }) // transferFee 1000 / 1000 = 1, formatted as percent = 1.000% expect(container).toHaveTextContent('1.000%') }) it('displays -- when no transfer fee', () => { const { container } = renderComponent({ transferFee: undefined }) expect(container).toHaveTextContent('--') }) it('displays asset scale', () => { const { container } = renderComponent({ assetScale: 6 }) expect(container).toHaveTextContent('6') }) it('displays 0 for undefined asset scale', () => { const { container } = renderComponent({ assetScale: undefined }) expect(container).toHaveTextContent('0') }) it('displays holders count', () => { const { container } = renderComponent({ holdersCount: 1234 }) expect(container).toHaveTextContent('1,234') }) it('shows loading spinner when holdersLoading', () => { const { container } = renderComponent({ holdersLoading: true }) expect(container.querySelectorAll('.loading-spinner')).toHaveLength(1) }) it('shows MPT issuance ID when showMptId is true', () => { const { container } = renderComponent({ showMptId: true }) expect(container).toHaveTextContent('mpt_issuance_id') }) it('hides MPT issuance ID when showMptId is false', () => { const { container } = renderComponent({ showMptId: false }) expect(container).not.toHaveTextContent('mpt_issuance_id') }) }) ================================================ FILE: src/containers/Token/MPT/test/Header/Header.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import i18n from '../../../../../i18n/testConfig' import { Header } from '../../Header' const TEST_MPT_ID = '00000004A407AF5856CCF3C42619DAA925813FC955C72983' const mockMPTData = { issuer: 'rTestIssuer123456789012345678901234', assetScale: 2, maxAmt: '1000000', outstandingAmt: '500000', transferFee: 1000, sequence: 1, flags: ['lsfMPTCanTransfer', 'lsfMPTCanTrade'], rawMPTMetadata: '{"ticker":"TEST","issuer_name":"Test Issuer"}', parsedMPTMetadata: { ticker: 'TEST', issuer_name: 'Test Issuer', icon: 'https://example.com/icon.png', uris: [ { uri: 'https://example.com', category: 'website', title: 'Website' }, ], }, isMPTMetadataCompliant: true, } const mockMPTDataNoMetadata = { issuer: 'rTestIssuer123456789012345678901234', assetScale: 0, maxAmt: '1000000', outstandingAmt: '500000', transferFee: undefined, sequence: 1, flags: [], rawMPTMetadata: undefined, parsedMPTMetadata: undefined, isMPTMetadataCompliant: false, } describe('MPT Header component', () => { const renderComponent = (props: any = {}) => render(
, ) it('renders loader when loading', () => { const { container } = renderComponent({ loading: true }) expect(container.querySelectorAll('.loader')).toHaveLength(1) }) it('returns null when no data and not loading', () => { const { container } = renderComponent({ data: undefined, loading: false }) expect(container.querySelectorAll('.token-header')).toHaveLength(0) }) it('renders header with MPT data', () => { const { container } = renderComponent({ data: mockMPTData }) expect(container.querySelectorAll('.token-header.mpt')).toHaveLength(1) expect(container.querySelectorAll('.token-indicator')).toHaveLength(1) expect(container.querySelectorAll('.box-header')).toHaveLength(1) }) it('displays ticker when available', () => { const { container } = renderComponent({ data: mockMPTData }) expect(container).toHaveTextContent('TEST') }) it('displays issuer name when available', () => { const { container } = renderComponent({ data: mockMPTData }) expect(container).toHaveTextContent('Test Issuer') }) it('displays shortened MPT ID when no ticker', () => { const { container } = renderComponent({ data: mockMPTDataNoMetadata }) expect(container.querySelectorAll('.mpt-id')).toHaveLength(1) }) it('shows metadata warning when not compliant', () => { const { container } = renderComponent({ data: mockMPTDataNoMetadata }) expect(container.querySelectorAll('.metadata-warning')).toHaveLength(1) }) it('does not show metadata warning when compliant', () => { const { container } = renderComponent({ data: mockMPTData }) expect(container.querySelectorAll('.metadata-warning')).toHaveLength(0) }) it('displays logo when available', () => { const { container } = renderComponent({ data: mockMPTData }) const logo = container.querySelector('img.token-logo') expect(logo).not.toBeNull() expect(logo).toHaveAttribute('src', 'https://example.com/icon.png') }) it('displays logo URL without protocol by prefixing https', () => { const dataWithNoProtocolUrl = { ...mockMPTData, parsedMPTMetadata: { ...mockMPTData.parsedMPTMetadata, icon: 'example.com/logo.png', }, } const { container } = renderComponent({ data: dataWithNoProtocolUrl }) const logo = container.querySelector('img.token-logo') expect(logo).not.toBeNull() expect(logo).toHaveAttribute('src', 'https://example.com/logo.png') }) it('displays default logo when no icon', () => { const { container } = renderComponent({ data: mockMPTDataNoMetadata }) expect( container.querySelectorAll('.token-logo.no-logo').length, ).toBeGreaterThanOrEqual(1) }) it('renders domain link when URIs available', () => { const { container } = renderComponent({ data: mockMPTData }) expect(container.querySelectorAll('.domain-link-container')).toHaveLength(1) }) it('calls setError for invalid MPT ID', () => { const setError = jest.fn() renderComponent({ data: mockMPTData, setError, }) // Valid ID, setError should not be called with BAD_REQUEST // No setProps equivalent in RTL, just verify render doesn't throw }) it('renders GeneralOverview component', () => { const { container } = renderComponent({ data: mockMPTData, holdersCount: 100, }) expect(container.querySelectorAll('.header-box').length).toBeGreaterThan(0) }) it('renders Settings component with flags', () => { const { container } = renderComponent({ data: mockMPTData }) expect(container).toHaveTextContent('can_transfer') }) it('renders Metadata component when metadata exists', () => { const { container } = renderComponent({ data: mockMPTData }) expect(container.querySelectorAll('.metadata-box')).toHaveLength(1) }) }) ================================================ FILE: src/containers/Token/MPT/test/Header/MarketData.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../../i18n/testConfig' import { MarketData } from '../../Header/MarketData' describe('MarketData component', () => { const renderComponent = (props: any = {}) => render( , ) it('renders header box', () => { const { container } = renderComponent() expect(container.querySelectorAll('.header-box')).toHaveLength(1) expect(container.querySelector('.header-box-title')).toHaveTextContent( 'token_page.market_data', ) }) it('displays supply label', () => { const { container } = renderComponent() expect(container).toHaveTextContent('token_page.supply') }) it('displays circulating supply label', () => { const { container } = renderComponent() expect(container).toHaveTextContent('token_page.circulating_supply') }) it('displays formatted max amount with scale 0', () => { const { container } = renderComponent({ maxAmt: '1000000', assetScale: 0, }) // parseAmount abbreviates large numbers expect(container).toHaveTextContent('1.0M') }) it('displays formatted max amount with scale 2', () => { const { container } = renderComponent({ maxAmt: '100000000', assetScale: 2, }) // 100000000 with scale 2 = 1000000, formatted as 1.0M expect(container).toHaveTextContent('1.0M') }) it('displays formatted outstanding amount', () => { const { container } = renderComponent({ outstandingAmt: '5000000', assetScale: 0, }) // parseAmount abbreviates large numbers expect(container).toHaveTextContent('5.0M') }) it('displays 0 for undefined amounts', () => { const { container } = renderComponent({ maxAmt: undefined, outstandingAmt: undefined, assetScale: undefined, }) expect(container).toHaveTextContent('0') }) it('displays market cap placeholder', () => { const { container } = renderComponent() expect(container).toHaveTextContent('token_page.market_cap') expect(container).toHaveTextContent('--') }) it('displays volume 24h placeholder', () => { const { container } = renderComponent() expect(container).toHaveTextContent('token_page.volume_24h') }) it('displays trades 24h placeholder', () => { const { container } = renderComponent() expect(container).toHaveTextContent('token_page.trades_24h') }) it('displays AMM TVL placeholder', () => { const { container } = renderComponent() expect(container).toHaveTextContent('token_page.amm_tvl') }) }) ================================================ FILE: src/containers/Token/MPT/test/Header/Metadata.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../../i18n/testConfig' import { Metadata } from '../../Header/Metadata' describe('Metadata component', () => { const renderComponent = (props: any) => render( , ) it('renders header box with metadata title', () => { const { container } = renderComponent({ decodedMPTMetadata: {} }) expect(container.querySelectorAll('.header-box.metadata-box')).toHaveLength( 1, ) expect(container.querySelector('.header-box-title')).toHaveTextContent( 'metadata', ) }) it('renders JSON view for object metadata', () => { const metadata = { ticker: 'TEST', issuer_name: 'Test Issuer', description: 'A test token', } const { container } = renderComponent({ decodedMPTMetadata: metadata }) expect(container.querySelectorAll('.metadata-json')).toHaveLength(1) expect(container.querySelectorAll('.metadata-string')).toHaveLength(0) }) it('renders string for string metadata', () => { const metadata = 'This is raw metadata string' const { container } = renderComponent({ decodedMPTMetadata: metadata }) expect(container.querySelectorAll('.metadata-string')).toHaveLength(1) expect(container.querySelector('.metadata-string')).toHaveTextContent( metadata, ) }) it('handles empty object metadata', () => { const { container } = renderComponent({ decodedMPTMetadata: {} }) expect(container.querySelectorAll('.metadata-json')).toHaveLength(1) }) it('handles complex nested metadata', () => { const metadata = { ticker: 'TEST', uris: [ { uri: 'https://example.com', category: 'website' }, { uri: 'https://docs.example.com', category: 'documentation' }, ], nested: { level1: { level2: 'deep value', }, }, } const { container } = renderComponent({ decodedMPTMetadata: metadata }) expect(container.querySelectorAll('.metadata-json')).toHaveLength(1) }) }) ================================================ FILE: src/containers/Token/MPT/test/Header/Settings.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../../i18n/testConfig' import { Settings } from '../../Header/Settings' describe('Settings component', () => { const renderComponent = (props: any = {}) => render( , ) it('renders header box with settings title', () => { const { container } = renderComponent() expect(container.querySelectorAll('.header-box.settings-box')).toHaveLength( 1, ) expect(container.querySelector('.header-box-title')).toHaveTextContent( 'settings', ) }) it('renders all 7 flag items', () => { const { container } = renderComponent() expect(container.querySelectorAll('.header-box-item')).toHaveLength(7) }) it('shows locked flag as disabled by default', () => { const { container } = renderComponent({ flags: [] }) expect(container).toHaveTextContent('locked') expect(container).toHaveTextContent('disabled') }) it('shows locked flag as enabled when present', () => { const { container } = renderComponent({ flags: ['lsfMPTLocked'] }) const flagItems = container.querySelectorAll('.header-box-item') const lockedItem = flagItems[0] expect(lockedItem.querySelectorAll('.flag-status.enabled')).toHaveLength(1) }) it('shows can_lock flag status', () => { const { container } = renderComponent({ flags: ['lsfMPTCanLock'] }) expect(container).toHaveTextContent('can_lock') expect(container.querySelectorAll('.flag-status.enabled')).toHaveLength(1) }) it('shows require_auth flag status', () => { const { container } = renderComponent({ flags: ['lsfMPTRequireAuth'] }) expect(container).toHaveTextContent('require_auth') expect(container.querySelectorAll('.flag-status.enabled')).toHaveLength(1) }) it('shows can_escrow flag status', () => { const { container } = renderComponent({ flags: ['lsfMPTCanEscrow'] }) expect(container).toHaveTextContent('can_escrow') expect(container.querySelectorAll('.flag-status.enabled')).toHaveLength(1) }) it('shows can_trade flag status', () => { const { container } = renderComponent({ flags: ['lsfMPTCanTrade'] }) expect(container).toHaveTextContent('can_trade') expect(container.querySelectorAll('.flag-status.enabled')).toHaveLength(1) }) it('shows can_transfer flag status', () => { const { container } = renderComponent({ flags: ['lsfMPTCanTransfer'] }) expect(container).toHaveTextContent('can_transfer') expect(container.querySelectorAll('.flag-status.enabled')).toHaveLength(1) }) it('shows can_clawback flag status', () => { const { container } = renderComponent({ flags: ['lsfMPTCanClawback'] }) expect(container).toHaveTextContent('can_clawback') expect(container.querySelectorAll('.flag-status.enabled')).toHaveLength(1) }) it('handles multiple flags enabled', () => { const { container } = renderComponent({ flags: ['lsfMPTCanTransfer', 'lsfMPTCanTrade', 'lsfMPTCanLock'], }) expect(container.querySelectorAll('.flag-status.enabled')).toHaveLength(3) expect(container.querySelectorAll('.flag-status.disabled')).toHaveLength(4) }) it('handles empty flags array', () => { const { container } = renderComponent({ flags: [] }) expect(container.querySelectorAll('.flag-status.enabled')).toHaveLength(0) expect(container.querySelectorAll('.flag-status.disabled')).toHaveLength(7) }) it('handles undefined flags', () => { const { container } = renderComponent({ flags: undefined }) expect(container.querySelectorAll('.flag-status.disabled')).toHaveLength(7) }) }) ================================================ FILE: src/containers/Token/MPT/test/TablePicker/TablePicker.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import moxios from 'moxios' import i18n from '../../../../../i18n/testConfig' import { TablePicker } from '../../TablePicker' import { testQueryClient } from '../../../../test/QueryClient' import { getAccountTransactions } from '../../../../../rippled' jest.mock('../../../../../rippled', () => ({ __esModule: true, getAccountTransactions: jest.fn(), })) const TEST_MPT_ID = '00000004A407AF5856CCF3C42619DAA925813FC955C72983' const TEST_ISSUER = 'rTestIssuer123456789012345678901234' const mockHolders = [ { rank: 1, account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', balance: '250000', percent: 25, value_usd: null, }, ] const mockTransfers = [ { hash: 'E3FE6EA3D48F0C2B639448020EA4F03D4F4F8FFDB243A852A0F59177921B4879', ledger: 12345, action: 'send', timestamp: 1609459200, from: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', to: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', amount: { currency: TEST_MPT_ID, issuer: TEST_ISSUER, value: '100', }, }, ] describe('MPT TablePicker container', () => { beforeEach(() => { moxios.install() jest.clearAllMocks() }) afterEach(() => { moxios.uninstall() }) const renderComponent = ( getAccountTransactionsImpl = () => new Promise(() => {}), overrides: any = {}, ) => { ;(getAccountTransactions as jest.Mock).mockImplementation( getAccountTransactionsImpl, ) return render( , ) } it('renders transaction table container', () => { const { container } = renderComponent() expect( container.querySelectorAll('.token-transaction-table-container'), ).toHaveLength(1) }) it('renders loader when fetching data', () => { const { container } = renderComponent() expect(container.querySelectorAll('.loader')).toHaveLength(1) }) it('renders with holders data', () => { const setCurrentPage = jest.fn() const { container } = renderComponent(() => new Promise(() => {}), { holdersData: mockHolders, holdersPagination: { currentPage: 1, setCurrentPage, pageSize: 20, total: 100, }, }) expect( container.querySelectorAll('.token-transaction-table-container'), ).toHaveLength(1) }) it('renders with transfers data', () => { const setSortField = jest.fn() const setSortOrder = jest.fn() const { container } = renderComponent(() => new Promise(() => {}), { transfersData: mockTransfers, transfersPagination: { currentPage: 1, setCurrentPage: jest.fn(), pageSize: 10, total: 100, hasMore: true, hasPrevPage: false, }, transfersSorting: { sortField: 'timestamp', setSortField, sortOrder: 'desc', setSortOrder, }, }) expect( container.querySelectorAll('.token-transaction-table-container'), ).toHaveLength(1) }) it('renders with loading states', () => { const { container } = renderComponent(() => new Promise(() => {}), { holdersLoading: true, transfersLoading: true, }) expect( container.querySelectorAll('.token-transaction-table-container'), ).toHaveLength(1) }) }) ================================================ FILE: src/containers/Token/MPT/test/api/holders.test.ts ================================================ import { getMPTHolders } from '../../../../../rippled/lib/rippled' import { fetchAllMPTHolders } from '../../api/holders' jest.mock('../../../../../rippled/lib/rippled') jest.mock('../../../../shared/utils', () => ({ convertScaledPrice: (value: bigint, scale: number) => { const str = value.toString() if (scale === 0) return str const paddedStr = str.padStart(scale + 1, '0') const intPart = paddedStr.slice(0, -scale) || '0' const decPart = paddedStr.slice(-scale) return `${intPart}.${decPart}` }, })) const mockGetMPTHolders = getMPTHolders as jest.Mock describe('MPT Holders API', () => { const mockSocket = {} const tokenId = '00000004A407AF5856CCF3C42619DAA925813FC955C72983' beforeEach(() => { jest.clearAllMocks() }) describe('fetchAllMPTHolders', () => { it('should fetch and format holders correctly', async () => { mockGetMPTHolders.mockResolvedValueOnce({ mptokens: [ { account: 'rAccount1', flags: 0, mpt_amount: '5000000', mptoken_index: 'index1', }, { account: 'rAccount2', flags: 0, mpt_amount: '3000000', mptoken_index: 'index2', }, ], marker: undefined, }) const result = await fetchAllMPTHolders( mockSocket, tokenId, '10000000', 6, ) expect(result.totalHolders).toBe(2) expect(result.holders).toHaveLength(2) expect(result.holders[0].rank).toBe(1) expect(result.holders[0].account).toBe('rAccount1') expect(result.holders[0].balance).toBe('5.000000') expect(result.holders[0].percent).toBe(50) expect(result.holders[1].rank).toBe(2) expect(result.holders[1].account).toBe('rAccount2') expect(result.holders[1].percent).toBe(30) }) it('should handle pagination with marker', async () => { mockGetMPTHolders .mockResolvedValueOnce({ mptokens: [ { account: 'rAccount1', flags: 0, mpt_amount: '1000', mptoken_index: 'index1', }, ], marker: 'page2', }) .mockResolvedValueOnce({ mptokens: [ { account: 'rAccount2', flags: 0, mpt_amount: '2000', mptoken_index: 'index2', }, ], marker: undefined, }) const result = await fetchAllMPTHolders(mockSocket, tokenId, '3000', 0) expect(mockGetMPTHolders).toHaveBeenCalledTimes(2) expect(result.totalHolders).toBe(2) // Sorted by balance descending expect(result.holders[0].account).toBe('rAccount2') expect(result.holders[1].account).toBe('rAccount1') }) it('should filter out zero balance holders', async () => { mockGetMPTHolders.mockResolvedValueOnce({ mptokens: [ { account: 'rAccount1', flags: 0, mpt_amount: '1000', mptoken_index: 'index1', }, { account: 'rAccount2', flags: 0, mpt_amount: '0', mptoken_index: 'index2', }, ], marker: undefined, }) const result = await fetchAllMPTHolders(mockSocket, tokenId, '1000', 0) expect(result.totalHolders).toBe(1) expect(result.holders[0].account).toBe('rAccount1') }) it('should handle empty response', async () => { mockGetMPTHolders.mockResolvedValueOnce({ mptokens: [], marker: undefined, }) const result = await fetchAllMPTHolders(mockSocket, tokenId, '0', 0) expect(result.totalHolders).toBe(0) expect(result.holders).toEqual([]) }) it('should handle zero outstanding amount', async () => { mockGetMPTHolders.mockResolvedValueOnce({ mptokens: [ { account: 'rAccount1', flags: 0, mpt_amount: '1000', mptoken_index: 'index1', }, ], marker: undefined, }) const result = await fetchAllMPTHolders(mockSocket, tokenId, '0', 0) expect(result.holders[0].percent).toBe(0) }) }) }) ================================================ FILE: src/containers/Token/MPT/test/index.test.tsx ================================================ import { MPT } from '../index' jest.mock('../api/holders', () => ({ fetchAllMPTHolders: jest.fn(), })) jest.mock('../../../../rippled/lib/rippled', () => ({ getMPTIssuance: jest.fn(), })) jest.mock('../../shared/services/transfersPagination', () => ({ transfersPaginationService: { getTransfersPage: jest.fn(), clearCache: jest.fn(), }, })) describe('MPT container', () => { it('exports MPT component', () => { expect(MPT).toBeDefined() expect(typeof MPT).toBe('function') }) it('MPT component is a valid React component', () => { expect(MPT.length >= 0).toBe(true) }) }) ================================================ FILE: src/containers/Token/shared/api/tokenTx.ts ================================================ import axios from 'axios' import logger from '../../../../rippled/lib/logger' const log = logger({ name: 'tokenTx' }) const buildPaginationAndSortParams = ( searchAfter?: any, direction?: string, sortField?: string, sortOrder?: string, ): URLSearchParams => { const params = new URLSearchParams() // Add search_after (cursor) if provided if (searchAfter) { params.append('search_after', JSON.stringify(searchAfter)) } // Add direction if provided (e.g., 'prev' for backwards pagination) if (direction) { params.append('direction', direction) } // Add sort parameters if provided if (sortField) { params.append('sort_field', sortField) } if (sortOrder) { params.append('sort_order', sortOrder) } return params } export async function getDexTrades( tokenId: string, size?: number, searchAfter?: any, direction?: string, sortField?: string, sortOrder?: string, ): Promise { try { log.info('Fetching dex trades data from LOS') const params = new URLSearchParams({ token: tokenId, size: (size ?? 10).toString(), }) const paginationParams = buildPaginationAndSortParams( searchAfter, direction, sortField, sortOrder, ) paginationParams.forEach((value, key) => params.append(key, value)) return axios .get(`${process.env.VITE_LOS_URL}/dex-trades?${params.toString()}`) .then((resp) => resp.data) } catch (error) { log.error(`Failed to fetch dex trades for ${tokenId}: ${error}`) throw error } } export async function getTransfers( tokenId: string, size?: number, searchAfter?: any, direction?: string, sortField?: string, sortOrder?: string, ): Promise { try { log.info('Fetching transfers data from LOS') const params = new URLSearchParams({ token: tokenId, is_transfer: 'true', size: (size ?? 10).toString(), }) const paginationParams = buildPaginationAndSortParams( searchAfter, direction, sortField, sortOrder, ) paginationParams.forEach((value, key) => params.append(key, value)) return axios .get(`${process.env.VITE_LOS_URL}/v2/transactions?${params.toString()}`) .then((resp) => resp.data) } catch (error) { log.error(`Failed to fetch transfers for ${tokenId}: ${error}`) throw error } } ================================================ FILE: src/containers/Token/shared/components/TransfersTable/TransfersTable.tsx ================================================ import { useTranslation } from 'react-i18next' import { useEffect, useRef } from 'react' import { Link } from 'react-router' import { Account } from '../../../../shared/components/Account' import { Loader } from '../../../../shared/components/Loader' import { EmptyStateMessage } from '../../../../shared/components/EmptyStateMessage' import ArrowIcon from '../../../../shared/images/down_arrow.svg' import './styles.scss' import '../../../../shared/css/data-tables-mobile.scss' import { Pagination } from '../../../../shared/components/Pagination' import { ResponsiveTimestamp } from '../../../../shared/components/ResponsiveTimestamp' import { shortenAccount, shortenTxHash } from '../../../../shared/utils' import { parseAmount } from '../../../../shared/NumberFormattingUtils' import { useLanguage } from '../../../../shared/hooks' export interface LOSTransfer { hash: string ledger: number action: string timestamp: number from: string to: string amount: { currency: string issuer: string value: string } } interface TransfersTableProps { transactions: LOSTransfer[] isTransfersLoading?: boolean totalTransfers: number currentPage: number onPageChange: (page: number) => void pageSize: number hasMore?: boolean hasPrevPage?: boolean sortField?: string setSortField?: (field: string) => void sortOrder?: 'asc' | 'desc' setSortOrder?: (order: 'asc' | 'desc') => void onRefresh?: () => void } export const TransfersTable = ({ transactions, isTransfersLoading = false, totalTransfers, currentPage, onPageChange, pageSize, hasMore = false, hasPrevPage = false, sortField, setSortField, sortOrder, setSortOrder, onRefresh, }: TransfersTableProps) => { const { t } = useTranslation() const language = useLanguage() const tableRef = useRef(null) // Scroll to top of table when page changes useEffect(() => { if (!isTransfersLoading) { // Use double requestAnimationFrame to ensure scroll happens after DOM updates requestAnimationFrame(() => { requestAnimationFrame(() => { const tableContainer = tableRef.current?.closest('.tokens-table') if (tableContainer) { const rect = tableContainer.getBoundingClientRect() const scrollTop = window.scrollY + rect.top - 200 // Scroll higher to show tabs and table headers window.scrollTo({ top: scrollTop, behavior: 'smooth' }) } }) }) } }, [currentPage, isTransfersLoading]) const handleTimestampSort = () => { if (setSortField && setSortOrder) { if (sortField === 'timestamp') { // Toggle sort order setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc') } else { // Set to timestamp field with desc order by default setSortField('timestamp') setSortOrder('desc') } } } const renderTransaction = (tx: LOSTransfer) => { // Safely handle missing fields const fromAddress = tx.from || '--' const toAddress = tx.to || '--' const hasValidAmount = tx.amount && tx.amount.currency && tx.amount.issuer return ( {shortenTxHash(tx.hash)} {tx.ledger}
{tx.action}
{fromAddress !== '--' ? ( ) : ( '--' )} {toAddress !== '--' ? ( ) : ( '--' )} {hasValidAmount ? parseAmount(tx.amount.value) : '--'} ) } return (
{isTransfersLoading && } {!isTransfersLoading && transactions && transactions.length > 0 && ( <>
{t('data_available_from_notice')}
{transactions.map(renderTransaction)}
{t('tx_hash')} {t('ledger')} {t('action')} {t('timestamp')} {sortField === 'timestamp' && ( )} {t('from')} {t('to')} {t('amount')}
{(hasMore || hasPrevPage) && ( )} )} {!isTransfersLoading && (!transactions || transactions.length === 0) && ( )}
) } ================================================ FILE: src/containers/Token/shared/components/TransfersTable/styles.scss ================================================ @use '../../../../shared/css/variables' as *; @use '../../../../shared/css/table'; @use '../../../../shared/css/data-tables-notice'; // ============================================================================= // TRANSFERS TABLE - Component-specific styles // ============================================================================= // Add spacing between action and timestamp columns .tx-action { padding-right: 16px; @include for-size(phone-only) { padding-right: 12px; } } // Scoped styles for transfers table to prevent conflicts with other tables .tokens-table { table.basic { // Fix column widths for transfers table with equal spacing .tx-hash { width: 130px; min-width: 130px; } .tx-ledger { width: 110px; min-width: 110px; } .tx-action { width: 110px; min-width: 110px; } .tx-timestamp { width: 160px; min-width: 160px; } .tx-from, .tx-to { width: 130px; min-width: 130px; } .tx-amount { width: 130px; min-width: 130px; } } } ================================================ FILE: src/containers/Token/shared/constants.ts ================================================ /** * Pagination configuration for Token page tables */ export const PAGINATION_CONFIG = { HOLDERS_PAGE_SIZE: 20, TRANSFERS_PAGE_SIZE: 10, DEX_TRADES_PAGE_SIZE: 10, } as const /** * Initial pagination state */ export const INITIAL_PAGE = 1 ================================================ FILE: src/containers/Token/shared/hooks/useAccountTransactions.ts ================================================ import { useContext, useEffect, useMemo, useState } from 'react' import { useInfiniteQuery } from 'react-query' import { useAnalytics } from '../../../shared/analytics' import SocketContext from '../../../shared/SocketContext' import { getAccountTransactions } from '../../../../rippled' /** * Maximum number of automatic page fetches when no transactions match the filter. * This prevents excessive API calls for accounts with many non-matching transactions. */ const MAX_AUTO_FETCH_ATTEMPTS = 10 /** * Delay between automatic fetch attempts in milliseconds. */ const AUTO_FETCH_DELAY_MS = 200 interface UseAccountTransactionsOptions { account: string /** Token identifier: currency code for IOU, MPT issuance ID for MPT */ tokenId: string limit?: number } /** * Hook to fetch paginated account transactions filtered by token. * * Transactions are filtered client-side after fetching from rippled. * If a fetched page contains no matching transactions but more pages exist, * automatically fetches additional pages (up to MAX_AUTO_FETCH_ATTEMPTS) * to find matching transactions. */ export function useAccountTransactions({ account, tokenId, limit, }: UseAccountTransactionsOptions) { const { trackException } = useAnalytics() const rippledSocket = useContext(SocketContext) const { data, error, isFetching: isLoading, fetchNextPage, hasNextPage, } = useInfiniteQuery( ['fetchTransactions', account, tokenId], ({ pageParam = '' }) => getAccountTransactions( account, tokenId, pageParam, limit, rippledSocket, ).catch((errorResponse: Error) => { const errorLocation = `transactions ${account}.${tokenId} at ${pageParam}` trackException(`${errorLocation} --- ${JSON.stringify(errorResponse)}`) throw new Error('get_account_transactions_failed') }), { getNextPageParam: (lastPage) => lastPage.marker, }, ) // Check if the last fetched page returned 0 matching transactions const lastPageTransactionCount = useMemo(() => { const pages = data?.pages if (!pages || pages.length === 0) { return 0 } return pages[pages.length - 1]?.transactions?.length || 0 }, [data]) const lastPageWasEmpty = lastPageTransactionCount === 0 const canAutoFetch = hasNextPage === true && !isLoading const [autoFetchAttempts, setAutoFetchAttempts] = useState(0) const hasRemainingAttempts = autoFetchAttempts < MAX_AUTO_FETCH_ATTEMPTS // Auto-fetch if the last page returned no matching transactions const shouldAutoFetch = lastPageWasEmpty && canAutoFetch && hasRemainingAttempts useEffect(() => { if (!shouldAutoFetch) { return undefined } const timer = setTimeout(() => { setAutoFetchAttempts((prev) => prev + 1) fetchNextPage() }, AUTO_FETCH_DELAY_MS) return () => clearTimeout(timer) }, [shouldAutoFetch, fetchNextPage]) // Keep loading true while auto-fetch is pending to prevent UI flickering // between "Load More" button and loading spinner const loading = isLoading || shouldAutoFetch return { data, error, loading, fetchNextPage, hasNextPage: hasNextPage ?? false, } } ================================================ FILE: src/containers/Token/shared/hooks/usePaginationState.ts ================================================ import { useState } from 'react' /** * Pagination state for a single table */ export interface TablePaginationState { currentPage: number setCurrentPage: (page: number) => void pageSize: number total: number hasMore?: boolean hasPrevPage?: boolean } /** * Custom hook to manage pagination state for a table */ export const usePaginationState = ( pageSize: number, total: number = 0, hasMore: boolean | undefined = undefined, hasPrevPage: boolean | undefined = undefined, ): TablePaginationState => { const [currentPage, setCurrentPage] = useState(1) return { currentPage, setCurrentPage, pageSize, total, hasMore, hasPrevPage, } } ================================================ FILE: src/containers/Token/shared/hooks/useSortingState.ts ================================================ import { useState } from 'react' /** * Sorting state for a single table */ export interface TableSortingState { sortField?: string setSortField?: (field: string) => void sortOrder?: 'asc' | 'desc' setSortOrder?: (order: 'asc' | 'desc') => void } /** * Custom hook to manage sorting state for a table */ export const useSortingState = ( initialSortField: string = 'timestamp', initialSortOrder: 'asc' | 'desc' = 'desc', ): TableSortingState => { const [sortField, setSortField] = useState(initialSortField) const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>(initialSortOrder) return { sortField, setSortField, sortOrder, setSortOrder, } } ================================================ FILE: src/containers/Token/shared/services/transfersPagination.ts ================================================ import { getTransfers } from '../api/tokenTx' import { LOSTransfer } from '../components/TransfersTable/TransfersTable' import { CursorPaginationService, PaginationResult, } from '../../../shared/services/CursorPaginationService' export interface TransfersPaginationResult { transfers: LOSTransfer[] totalTransfers: number hasMore: boolean isLoading: boolean } const formatTransfer = (transaction: any): LOSTransfer => ({ hash: transaction.hash, ledger: transaction.ledger_index, action: transaction.type, timestamp: transaction.timestamp, from: transaction.account, to: transaction.destination, amount: transaction.amount, }) export const paginationService = new CursorPaginationService({ fetchFn: getTransfers, formatFn: formatTransfer, batchSize: 200, pageSize: 10, }) function toResult( result: PaginationResult, ): TransfersPaginationResult { return { transfers: result.items, totalTransfers: result.totalItems, hasMore: result.hasMore, isLoading: result.isLoading, } } export const transfersPaginationService = { async getTransfersPage( tokenId: string, page: number, pageSize?: number, sortField?: string, sortOrder?: string, ): Promise { const result = await paginationService.getPage( tokenId, page, pageSize, sortField, sortOrder, ) return toResult(result) }, clearCache(tokenId?: string, sortField?: string, sortOrder?: string): void { paginationService.clearCache(tokenId, sortField, sortOrder) }, getCachedTransfersCount( tokenId: string, sortField?: string, sortOrder?: string, ): number { return paginationService.getCachedItemCount(tokenId, sortField, sortOrder) }, } ================================================ FILE: src/containers/Token/shared/styles.scss ================================================ @use '../../shared/css/variables' as *; // ============================================================================= // TOKEN PAGE - Shared styles for IOU and MPT token pages // ============================================================================= // Page container - used by both IOU and MPT token pages .token-page { width: 100%; padding: 0 16px; @include for-size(tablet-portrait-up) { padding: 0 24px; } @include for-size(desktop-up) { padding: 0 32px; } @include for-size(big-desktop-up) { padding: 0 48px; } .loader { min-height: 100px; } .section { margin-top: 24px; @include for-size(tablet-portrait-up) { margin-top: 32px; } @include for-size(desktop-up) { margin-top: 40px; } } // Issuer name styling (scoped here to avoid conflicts with /tokens list page) .issuer-name { margin: 0; font-size: 24px; font-style: normal; line-height: 112.5%; text-transform: lowercase; @include bold; @include for-size(tablet-portrait-up) { font-size: 32px; } @include for-size(tablet-landscape-up) { font-size: 42px; } &::first-letter { text-transform: uppercase; } } } // ============================================================================= // TOKEN HEADER - Shared header styles // ============================================================================= // Base header wrapper .token-header { margin-top: 40px; margin-bottom: 16px; @include for-size(tablet-portrait-up) { margin-top: 60px; } @include for-size(desktop-up) { margin-top: 80px; } } // Token indicator and category pill .token-indicator { display: flex; flex-direction: row; align-items: center; margin-bottom: 12px; gap: 12px; .token-label { color: $black-40; font-size: 14px; font-style: normal; font-weight: 600; line-height: 150%; text-transform: uppercase; } .category-pill { border-radius: 100px; .category-text { padding: 4px 12px; color: $white; font-size: 12px; font-style: normal; line-height: 150%; text-transform: uppercase; @include semibold; } } } // Box header layout .box-header { display: flex; flex-direction: column; align-items: flex-start; gap: 16px; text-align: left; @include for-size(tablet-portrait-up) { flex-direction: row; align-items: center; justify-content: space-between; gap: 16px; } @include for-size(desktop-up) { gap: 24px; } } // Token info group (logo + name/ticker + issuer) .token-info-group { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; @include for-size(tablet-portrait-up) { flex-flow: row wrap; align-items: center; gap: 1px; } @include for-size(desktop-up) { gap: 1px; } span { margin: 0; color: $white; font-size: 24px; @include bold; @include for-size(tablet-portrait-up) { font-size: 32px; } @include for-size(tablet-landscape-up) { font-size: 42px; } } img { width: 24px; height: 24px; object-fit: contain; } } // Token logo .token-logo { width: 32px; min-width: 32px; height: 32px; min-height: 32px; border-radius: 32px; margin-right: 8px; margin-left: 0; @include for-size(tablet-portrait-up) { width: 40px; min-width: 40px; height: 40px; min-height: 40px; border-radius: 40px; margin-right: 10px; } @include for-size(tablet-landscape-up) { width: 48px; min-width: 48px; height: 48px; min-height: 48px; border-radius: 48px; } &.no-logo { background-color: $black-50; } } // Token issuer wrapper .token-issuer-wrap { display: flex; align-items: center; margin-left: 2px; font-size: 24px; font-style: normal; line-height: 112.5%; @include bold; @include for-size(tablet-portrait-up) { margin-left: 3px; font-size: 32px; } @include for-size(tablet-landscape-up) { margin-left: 5px; font-size: 42px; } } // Box content area .box-content { min-height: 100px; padding-bottom: 20px; } // ============================================================================= // HEADER BOXES - Info boxes in header area // ============================================================================= .header-boxes { display: flex; width: 100%; flex-direction: column; margin-top: 32px; gap: 24px; @include for-size(tablet-landscape-up) { flex-flow: row wrap; justify-content: flex-start; margin-top: 48px; gap: 24px; } @include for-size(desktop-up) { margin-top: 64px; gap: 24px; } } .header-box { display: flex; overflow: visible; width: 100%; min-height: 0; flex-direction: column; flex-shrink: 0; align-items: flex-start; gap: 8px; @include for-size(tablet-landscape-up) { width: calc(50% - 12px); max-width: 382px; flex: 0 0 calc(50% - 12px); } @include for-size(desktop-up) { width: 382px; max-width: 382px; flex: 0 0 382px; } } .header-box-title { margin-bottom: 21px; color: $white; font-size: 20px; line-height: 125%; @include bold; } .header-box-contents { width: 100%; box-sizing: border-box; padding: 16px; border: 1px solid $black-70; border-radius: 8px; } .header-box-item { display: flex; flex-direction: column; margin-bottom: 12px; gap: 4px; &:last-child { margin-bottom: 0; } @include for-size(tablet-portrait-up) { flex-direction: row; margin-bottom: 8px; gap: 16px; } @include for-size(desktop-up) { gap: 32px; } .item-name { width: 100%; color: $black-40; font-size: 12px; font-style: normal; line-height: 150%; text-transform: uppercase; @include semibold; @include for-size(tablet-portrait-up) { width: 140px; font-size: 13px; } @include for-size(desktop-up) { width: 180px; font-size: 14px; } } .item-value { width: 100%; color: $white; font-size: 14px; font-style: normal; line-height: 150%; @include regular; @include for-size(tablet-portrait-up) { width: 120px; } @include for-size(desktop-up) { width: 130px; } } .account-link { color: $green-30; text-decoration: none; &:hover { color: $green-50; } } } // ============================================================================= // LOADING SPINNER // ============================================================================= @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .loading-spinner { display: inline-block; width: 10px; height: 10px; border: 1px solid rgb(255 255 255 / 30%); border-radius: 50%; border-top-color: #fff; animation: spin 1s ease-in-out infinite; } // ============================================================================= // HEADER ACTIONS - Container for domain links // ============================================================================= .header-actions { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; @include for-size(tablet-portrait-up) { flex-direction: row; align-items: center; gap: 12px; } } .domain-link-container { position: relative; display: flex; width: fit-content; align-items: center; justify-content: space-between; padding: 8px 12px; border: 1px solid $green-30; border-radius: 8px; background: transparent; color: $green-30; font-size: 12px; gap: 8px; transition: all 0.2s ease; @include for-size(tablet-portrait-up) { padding: 8px 16px; font-size: 14px; } &:hover { border-color: $green-50; background-color: rgba($green-30, 0.1); } } .domain-link-icon { width: 24px; height: 24px; flex-shrink: 0; color: $green-30; } .domain-link { display: flex; align-items: center; color: $green-30; font-size: inherit; gap: 4px; text-decoration: none; transition: color 0.2s ease; &:hover { color: $green-50; } } // ============================================================================= // TABLE PICKER - Tabs for switching between tables // ============================================================================= .tx-table-picker { display: flex; flex-direction: row; margin-bottom: 16px; gap: 8px; -webkit-overflow-scrolling: touch; overflow-x: auto; // Custom scrollbar styling for mobile &::-webkit-scrollbar { height: 4px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { border-radius: 2px; background: $black-60; } &::-webkit-scrollbar-thumb:hover { background: $black-50; } // Hide scrollbar on mobile for cleaner look @include for-size(phone-only) { -ms-overflow-style: none; scrollbar-width: none; &::-webkit-scrollbar { display: none; } } @include for-size(tablet-portrait-up) { margin-bottom: 20px; gap: 12px; } @include for-size(desktop-up) { margin-bottom: 24px; gap: 16px; } // Override shared tabs styles for tx-table-picker .tabs { display: flex; flex-direction: row; border-top: none; margin: 0; font-size: 14px; gap: inherit; button, a { all: unset; padding-top: 16px; border: none; border-top: 3px solid transparent; margin-right: 8px; background-color: none; color: $black-40; cursor: pointer; font-size: 12px; font-style: normal; font-weight: 500; line-height: 150%; white-space: nowrap; @include regular; @include for-size(tablet-portrait-up) { padding-top: 18px; margin-right: 12px; font-size: 13px; } @include for-size(desktop-up) { padding-top: 21px; margin-right: 16px; font-size: 14px; } &.selected { padding-top: 16px; border-top: 3px solid $white; color: $white; @include for-size(tablet-portrait-up) { padding-top: 18px; } @include for-size(desktop-up) { padding-top: 21px; } } &.selected, &:hover { color: $white; @include regular; } } } } .full-width-line { width: 100%; border: none; border-top: 1px solid $black-70; margin-bottom: 0; color: $black-70; } // ============================================================================= // ACTION PILL - Used in tables for action labels // ============================================================================= .action-pill { display: flex; width: fit-content; align-items: center; justify-content: center; padding: 3px 8px; border: 1px solid $green-60; border-radius: 100px; background-color: $green-70; color: $white; font-size: 12px; text-transform: uppercase; white-space: nowrap; @include semibold; } ================================================ FILE: src/containers/Token/shared/test/api/tokenTx.test.ts ================================================ import axios from 'axios' import { getDexTrades, getTransfers } from '../../api/tokenTx' jest.mock('axios') describe('Token Transactions API', () => { const mockAxios = axios as jest.Mocked beforeAll(() => { jest.spyOn(console, 'error').mockImplementation(() => {}) }) afterAll(() => { jest.restoreAllMocks() }) beforeEach(() => { jest.clearAllMocks() }) describe('getDexTrades', () => { const mockDexTradesResponse = { results: [ { tx_hash: 'tx1', timestamp: 1234567890, from: 'rABC', to: 'rDEF', type: 'orderBook', amount_in: { currency: 'USD', issuer: 'rIssuer', value: '100' }, amount_out: { currency: 'XRP', issuer: null, value: '50' }, }, ], next_cursor: [1234567890, 'tx1'], } it('should fetch dex trades from /dex-trades endpoint with default parameters', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockDexTradesResponse }) const result = await getDexTrades('USD.rIssuer123') expect(result).toEqual(mockDexTradesResponse) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('/dex-trades?'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('token=USD.rIssuer123'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('size=10'), ) }) it('should fetch dex trades with custom size', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockDexTradesResponse }) await getDexTrades('USD.rIssuer123', 50) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('size=50'), ) }) it('should include search_after parameter when provided', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockDexTradesResponse }) const searchAfter = ['value1', 'value2'] await getDexTrades('USD.rIssuer123', 10, searchAfter) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('search_after='), ) }) it('should include direction parameter when provided', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockDexTradesResponse }) await getDexTrades('USD.rIssuer123', 10, undefined, 'prev') expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('direction=prev'), ) }) it('should include sort parameters when provided', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockDexTradesResponse }) await getDexTrades( 'USD.rIssuer123', 10, undefined, undefined, 'timestamp', 'desc', ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('sort_field=timestamp'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('sort_order=desc'), ) }) it('should throw error on API failure', async () => { const error = new Error('Network error') mockAxios.get.mockRejectedValueOnce(error) await expect(getDexTrades('USD.rIssuer123')).rejects.toThrow( 'Network error', ) }) it('should handle empty results list', async () => { const emptyResponse = { results: [], next_cursor: null, } mockAxios.get.mockResolvedValueOnce({ data: emptyResponse }) const result = await getDexTrades('USD.rIssuer123') expect(result.results).toEqual([]) }) }) describe('getTransfers', () => { const mockTransfersResponse = { results: [ { hash: 'tx1', type: 'Payment', timestamp: 1234567890, account: 'rABC', destination: 'rDEF', amount: { currency: 'USD', issuer: 'rIssuer', value: '100' }, is_transfer: true, }, ], next_cursor: [1234567890, 'tx1'], } it('should fetch transfers from /v2/transactions endpoint with default parameters', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockTransfersResponse }) const result = await getTransfers('USD.rIssuer123') expect(result).toEqual(mockTransfersResponse) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('/v2/transactions?'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('token=USD.rIssuer123'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('is_transfer=true'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('size=10'), ) }) it('should fetch transfers with custom size', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockTransfersResponse }) await getTransfers('USD.rIssuer123', 25) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('size=25'), ) }) it('should include all optional parameters', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockTransfersResponse }) const searchAfter = ['val1', 'val2'] await getTransfers('EUR.rEUR', 20, searchAfter, 'next', 'amount', 'asc') expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('token=EUR.rEUR'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('is_transfer=true'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('size=20'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('direction=next'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('sort_field=amount'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('sort_order=asc'), ) }) it('should throw error on API failure', async () => { const error = new Error('Network error') mockAxios.get.mockRejectedValueOnce(error) await expect(getTransfers('USD.rIssuer123')).rejects.toThrow( 'Network error', ) }) it('should handle empty results list', async () => { const emptyResponse = { results: [], next_cursor: null, } mockAxios.get.mockResolvedValueOnce({ data: emptyResponse }) const result = await getTransfers('USD.rIssuer123') expect(result.results).toEqual([]) }) it('should handle timeout errors for dex trades', async () => { const timeoutError = new Error('timeout of 5000ms exceeded') mockAxios.get.mockRejectedValueOnce(timeoutError) await expect(getDexTrades('USD.rIssuer123')).rejects.toThrow('timeout') }) it('should handle timeout errors for transfers', async () => { const timeoutError = new Error('timeout of 5000ms exceeded') mockAxios.get.mockRejectedValueOnce(timeoutError) await expect(getTransfers('USD.rIssuer123')).rejects.toThrow('timeout') }) it('should handle server errors for dex trades', async () => { const serverError = new Error('500 Internal Server Error') mockAxios.get.mockRejectedValueOnce(serverError) await expect(getDexTrades('USD.rIssuer123')).rejects.toThrow() }) it('should handle server errors for transfers', async () => { const serverError = new Error('500 Internal Server Error') mockAxios.get.mockRejectedValueOnce(serverError) await expect(getTransfers('USD.rIssuer123')).rejects.toThrow() }) it('should handle large results lists', async () => { const largeResponse = { results: Array.from({ length: 1000 }, (_, i) => ({ hash: `tx${i}`, type: 'Payment', timestamp: 1234567890 + i, account: 'rABC', destination: 'rDEF', amount: { currency: 'USD', issuer: 'rIssuer', value: '100' }, is_transfer: true, })), next_cursor: ['value1', 'value2'], } mockAxios.get.mockResolvedValueOnce({ data: largeResponse }) const result = await getTransfers('USD.rIssuer123') expect(result.results.length).toBe(1000) }) it('should handle all optional parameters together', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockTransfersResponse }) const searchAfter = ['val1', 'val2'] await getTransfers('EUR.rEUR', 50, searchAfter, 'prev', 'amount', 'asc') expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('token=EUR.rEUR'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('size=50'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('direction=prev'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('sort_field=amount'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('sort_order=asc'), ) }) it('should handle null search_after parameter', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockTransfersResponse }) await getTransfers('USD.rIssuer123', 10, null) expect(mockAxios.get).toHaveBeenCalled() }) it('should handle undefined optional parameters', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockTransfersResponse }) await getTransfers( 'USD.rIssuer123', 10, undefined, undefined, undefined, undefined, ) expect(mockAxios.get).toHaveBeenCalled() }) }) }) ================================================ FILE: src/containers/Token/shared/test/components/ResponsiveTimestamp/ResponsiveTimestamp.test.tsx ================================================ import { render } from '@testing-library/react' import { ResponsiveTimestamp } from '../../../../../shared/components/ResponsiveTimestamp/ResponsiveTimestamp' describe('ResponsiveTimestamp Component', () => { it('should render without crashing', () => { const { container } = render( , ) const desktopTimestamp = container.querySelector('.desktop-timestamp') const mobileTimestamp = container.querySelector('.mobile-timestamp') expect(desktopTimestamp).toBeInTheDocument() expect(mobileTimestamp).toBeInTheDocument() expect(desktopTimestamp?.textContent).toMatch( /\d{1,2}\/\d{1,2}\/\d{4}.*\d{2}:\d{2}:\d{2}/, ) expect(mobileTimestamp?.textContent).toMatch( /\d{1,2}\/\d{1,2}\/\d{4}.*\d{2}:\d{2}/, ) }) it('should render both desktop and mobile formats', () => { const { container } = render( , ) const desktopSpan = container.querySelector('.desktop-timestamp') const mobileSpan = container.querySelector('.mobile-timestamp') expect(desktopSpan).toBeInTheDocument() expect(mobileSpan).toBeInTheDocument() }) it('should display desktop format with seconds', () => { const { container } = render( , ) const desktopSpan = container.querySelector('.desktop-timestamp') // Desktop format should include seconds expect(desktopSpan?.textContent).toMatch(/\d{2}:\d{2}:\d{2}/) }) it('should display mobile format without seconds', () => { const { container } = render( , ) const mobileSpan = container.querySelector('.mobile-timestamp') // Mobile format should not include seconds (24-hour format) expect(mobileSpan?.textContent).toMatch(/\d{2}:\d{2}/) }) it('should handle different timestamps', () => { const { container: container1 } = render( , ) const { container: container2 } = render( , ) const desktop1 = container1.querySelector('.desktop-timestamp')?.textContent const desktop2 = container2.querySelector('.desktop-timestamp')?.textContent expect(desktop1).not.toBe(desktop2) }) it('should support different languages', () => { const { container: containerUS } = render( , ) const { container: containerDE } = render( , ) const desktopUS = containerUS.querySelector('.desktop-timestamp')?.textContent const desktopDE = containerDE.querySelector('.desktop-timestamp')?.textContent // Different locales should produce different formatting expect(desktopUS).toBeDefined() expect(desktopDE).toBeDefined() }) it('should render with responsive-timestamp class', () => { const { container } = render( , ) const wrapper = container.querySelector('.responsive-timestamp') expect(wrapper).toBeInTheDocument() }) it('should handle large timestamps', () => { const largeTimestamp = 1000000000 // Far in the future const { container } = render( , ) const desktopSpan = container.querySelector('.desktop-timestamp') expect(desktopSpan?.textContent).toBeDefined() }) it('should format date with 2-digit month and day', () => { const { container } = render( , ) const desktopSpan = container.querySelector('.desktop-timestamp') // Should contain date in format with 2-digit month and day expect(desktopSpan?.textContent).toMatch(/\d{2}\/\d{2}\/\d{4}/) }) it('should format time with 2-digit hours and minutes', () => { const { container } = render( , ) const mobileSpan = container.querySelector('.mobile-timestamp') // Should contain time in 24-hour format with 2-digit hours and minutes expect(mobileSpan?.textContent).toMatch(/\d{2}:\d{2}/) }) it('should handle en-GB locale', () => { const { container } = render( , ) const desktopSpan = container.querySelector('.desktop-timestamp') expect(desktopSpan?.textContent).toBeDefined() }) it('should handle fr-FR locale', () => { const { container } = render( , ) const desktopSpan = container.querySelector('.desktop-timestamp') expect(desktopSpan?.textContent).toBeDefined() }) it('should render both spans with content', () => { const { container } = render( , ) const desktopSpan = container.querySelector('.desktop-timestamp') const mobileSpan = container.querySelector('.mobile-timestamp') expect(desktopSpan?.textContent).toBeTruthy() expect(mobileSpan?.textContent).toBeTruthy() }) }) ================================================ FILE: src/containers/Token/shared/test/components/TransfersTable/TransfersTable.test.tsx ================================================ import { render, screen, fireEvent } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import i18n from '../../../../../../i18n/testConfigEnglish' import { TransfersTable, LOSTransfer, } from '../../../components/TransfersTable/TransfersTable' jest.mock('../../../../../shared/components/Account', () => ({ Account: ({ displayText }: { displayText: string }) => ( {displayText} ), })) jest.mock('../../../../../shared/utils', () => ({ shortenAccount: (account: string) => account.length > 12 ? `${account.slice(0, 7)}...${account.slice(-5)}` : account, shortenTxHash: (hash: string) => hash.length > 12 ? `${hash.slice(0, 6)}...${hash.slice(-6)}` : hash, })) jest.mock('../../../../../shared/hooks', () => ({ useLanguage: () => 'en', })) jest.mock('../../../../../shared/components/ResponsiveTimestamp', () => ({ ResponsiveTimestamp: ({ timestamp }: { timestamp: number }) => (
{new Date(timestamp * 1000).toISOString()}
), })) jest.mock('../../../../../shared/components/Pagination', () => ({ Pagination: ({ onPageChange, totalItems, pageSize = 15, }: { onPageChange: (page: number) => void totalItems: number pageSize?: number }) => { const totalPages = Math.max(1, Math.ceil(totalItems / pageSize)) if (totalPages <= 1) return null return (
) }, })) jest.mock('../../../../../shared/components/Loader', () => ({ Loader: () =>
Loading...
, })) jest.mock('../../../../../shared/NumberFormattingUtils', () => ({ parseAmount: (amount: any) => String(amount), })) const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) const mockTransfers: LOSTransfer[] = [ { hash: 'E3FE6EA3D48F0C2B639448020EA4F03D4F4F8FFDB243A852A0F59177921B4879', ledger: 12345, action: 'send', timestamp: 1609459200, from: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', to: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', amount: { currency: 'USD', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', value: '100', }, }, { hash: 'F4GF7FB4E49F1D3C740559131FB5G04E4G5G9GGEC354B963B1G60288C32C5980', ledger: 12346, action: 'receive', timestamp: 1609545600, from: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', to: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', amount: { currency: 'EUR', issuer: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', value: '200', }, }, ] describe('TransfersTable Component', () => { const mockOnPageChange = jest.fn() const mockOnRefresh = jest.fn() beforeEach(() => { jest.clearAllMocks() }) it('renders without crashing', () => { render( , ) // Verify tx hash is rendered (shortened to first 6 + last 6 chars with ... in between) expect(screen.getByText('E3FE6E...1B4879')).toBeInTheDocument() }) it('displays all transfers in the table', () => { render( , ) // Verify accounts are rendered (they are shortened to first 7 + last 5 chars with ... in between) const accounts = screen.getAllByTestId('account') expect(accounts.length).toBeGreaterThanOrEqual(2) expect(accounts[0]).toHaveTextContent('rN7n7ot...6fzRH') expect(accounts[1]).toHaveTextContent('rLNaPoK...4dc6w') }) it('shows loading state when isTransfersLoading is true', () => { render( , ) expect(screen.getByText('Loading...')).toBeInTheDocument() }) it('shows no transfers message when empty and not loading', () => { render( , ) expect(screen.getByText(/no transfers/i)).toBeInTheDocument() expect(screen.getByText('no_info.svg')).toBeInTheDocument() }) it('calls onPageChange when pagination is triggered', () => { render( , ) const nextButton = screen.getByText('Next Page') fireEvent.click(nextButton) expect(mockOnPageChange).toHaveBeenCalledWith(2) }) it('displays action pill for each transfer', () => { render( , ) expect(screen.getByText('send')).toBeInTheDocument() expect(screen.getByText('receive')).toBeInTheDocument() }) it('renders table headers correctly', () => { const { container } = render( , ) const headers = container.querySelectorAll('thead th') expect(headers.length).toBe(7) }) it('displays refresh button when transfers exist', () => { render( , ) const refreshButton = screen.getByTitle(/refresh/i) expect(refreshButton).toBeInTheDocument() }) it('calls onRefresh when refresh button is clicked', () => { render( , ) const refreshButton = screen.getByTitle(/refresh/i) fireEvent.click(refreshButton) expect(mockOnRefresh).toHaveBeenCalled() }) it('handles transfers with missing from address', () => { const transferWithoutFrom: LOSTransfer[] = [ { ...mockTransfers[0], from: '', }, ] render( , ) expect(screen.getByText('--')).toBeInTheDocument() }) it('handles transfers with missing to address', () => { const transferWithoutTo: LOSTransfer[] = [ { ...mockTransfers[0], to: '', }, ] render( , ) expect(screen.getByText('--')).toBeInTheDocument() }) it('handles transfers with missing amount', () => { const transferWithoutAmount: LOSTransfer[] = [ { ...mockTransfers[0], amount: { currency: '', issuer: '', value: '', }, }, ] render( , ) expect(screen.getByText('--')).toBeInTheDocument() }) it('displays pagination when hasMore is true', () => { render( , ) expect(screen.getByText('Next Page')).toBeInTheDocument() }) it('displays pagination when hasPrevPage is true', () => { render( , ) expect(screen.getByText('Next Page')).toBeInTheDocument() }) it('renders correct number of rows', () => { const { container } = render( , ) const rows = container.querySelectorAll('tbody tr') expect(rows.length).toBe(mockTransfers.length) }) it('handles single transfer', () => { const singleTransfer: LOSTransfer[] = [mockTransfers[0]] render( , ) // Verify accounts are rendered (shortened to first 7 + last 5 chars with ... in between) const accounts = screen.getAllByTestId('account') expect(accounts[0]).toHaveTextContent('rN7n7ot...6fzRH') expect(accounts[1]).toHaveTextContent('rLNaPoK...4dc6w') }) it('renders table with correct CSS classes', () => { const { container } = render( , ) expect(container.querySelector('.tokens-table')).toBeInTheDocument() expect(container.querySelector('table.basic')).toBeInTheDocument() }) }) ================================================ FILE: src/containers/Token/shared/test/constants.test.ts ================================================ import { PAGINATION_CONFIG, INITIAL_PAGE } from '../constants' describe('Token Constants', () => { describe('PAGINATION_CONFIG', () => { it('should have HOLDERS_PAGE_SIZE defined', () => { expect(PAGINATION_CONFIG.HOLDERS_PAGE_SIZE).toBeDefined() }) it('should have TRANSFERS_PAGE_SIZE defined', () => { expect(PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE).toBeDefined() }) it('should have DEX_TRADES_PAGE_SIZE defined', () => { expect(PAGINATION_CONFIG.DEX_TRADES_PAGE_SIZE).toBeDefined() }) it('should have correct HOLDERS_PAGE_SIZE value', () => { expect(PAGINATION_CONFIG.HOLDERS_PAGE_SIZE).toBe(20) }) it('should have correct TRANSFERS_PAGE_SIZE value', () => { expect(PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE).toBe(10) }) it('should have correct DEX_TRADES_PAGE_SIZE value', () => { expect(PAGINATION_CONFIG.DEX_TRADES_PAGE_SIZE).toBe(10) }) it('should have consistent values', () => { // Verify the object exists and has the expected structure expect(PAGINATION_CONFIG).toBeDefined() expect(typeof PAGINATION_CONFIG.HOLDERS_PAGE_SIZE).toBe('number') expect(typeof PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE).toBe('number') expect(typeof PAGINATION_CONFIG.DEX_TRADES_PAGE_SIZE).toBe('number') }) it('should have all values as positive numbers', () => { expect(PAGINATION_CONFIG.HOLDERS_PAGE_SIZE).toBeGreaterThan(0) expect(PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE).toBeGreaterThan(0) expect(PAGINATION_CONFIG.DEX_TRADES_PAGE_SIZE).toBeGreaterThan(0) }) it('should have all values as integers', () => { expect(Number.isInteger(PAGINATION_CONFIG.HOLDERS_PAGE_SIZE)).toBe(true) expect(Number.isInteger(PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE)).toBe(true) expect(Number.isInteger(PAGINATION_CONFIG.DEX_TRADES_PAGE_SIZE)).toBe( true, ) }) it('HOLDERS_PAGE_SIZE should be larger than TRANSFERS_PAGE_SIZE', () => { expect(PAGINATION_CONFIG.HOLDERS_PAGE_SIZE).toBeGreaterThan( PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE, ) }) it('TRANSFERS_PAGE_SIZE should equal DEX_TRADES_PAGE_SIZE', () => { expect(PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE).toBe( PAGINATION_CONFIG.DEX_TRADES_PAGE_SIZE, ) }) }) describe('INITIAL_PAGE', () => { it('should be defined', () => { expect(INITIAL_PAGE).toBeDefined() }) it('should equal 1', () => { expect(INITIAL_PAGE).toBe(1) }) it('should be a positive number', () => { expect(INITIAL_PAGE).toBeGreaterThan(0) }) it('should be an integer', () => { expect(Number.isInteger(INITIAL_PAGE)).toBe(true) }) it('should be the first page', () => { expect(INITIAL_PAGE).toBe(1) }) }) describe('Constants consistency', () => { it('should have consistent pagination config structure', () => { const keys = Object.keys(PAGINATION_CONFIG) expect(keys).toContain('HOLDERS_PAGE_SIZE') expect(keys).toContain('TRANSFERS_PAGE_SIZE') expect(keys).toContain('DEX_TRADES_PAGE_SIZE') }) it('should have exactly 3 pagination config keys', () => { const keys = Object.keys(PAGINATION_CONFIG) expect(keys.length).toBe(3) }) it('all pagination sizes should be reasonable values', () => { expect(PAGINATION_CONFIG.HOLDERS_PAGE_SIZE).toBeLessThanOrEqual(100) expect(PAGINATION_CONFIG.TRANSFERS_PAGE_SIZE).toBeLessThanOrEqual(100) expect(PAGINATION_CONFIG.DEX_TRADES_PAGE_SIZE).toBeLessThanOrEqual(100) }) }) }) ================================================ FILE: src/containers/Token/shared/test/hooks/useAccountTransactions.test.tsx ================================================ import { renderHook, waitFor } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { useAccountTransactions } from '../../hooks/useAccountTransactions' import SocketContext from '../../../../shared/SocketContext' import * as rippled from '../../../../../rippled' jest.mock('../../../../../rippled') jest.mock('../../../../shared/analytics', () => ({ useAnalytics: () => ({ trackException: jest.fn(), }), })) const mockedGetAccountTransactions = rippled.getAccountTransactions as jest.Mock const createWrapper = (socket: any = {}, queryClient = new QueryClient()) => ({ children }: { children: React.ReactNode }) => ( {children} ) describe('useAccountTransactions', () => { beforeEach(() => { jest.clearAllMocks() jest.useFakeTimers() }) afterEach(() => { jest.useRealTimers() }) it('fetches transactions successfully', async () => { const mockTransactions = [ { hash: 'tx1', type: 'Payment' }, { hash: 'tx2', type: 'Payment' }, ] mockedGetAccountTransactions.mockResolvedValue({ transactions: mockTransactions, marker: undefined, }) const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } }, }) const { result } = renderHook( () => useAccountTransactions({ account: 'rAccount123', tokenId: 'USD', }), { wrapper: createWrapper({}, queryClient) }, ) await waitFor(() => expect(result.current.loading).toBe(false)) expect(result.current.data?.pages[0].transactions).toEqual(mockTransactions) expect(result.current.hasNextPage).toBe(false) expect(result.current.error).toBeNull() }) it('returns hasNextPage true when marker exists', async () => { mockedGetAccountTransactions.mockResolvedValue({ transactions: [{ hash: 'tx1' }], marker: 'next-page-marker', }) const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } }, }) const { result } = renderHook( () => useAccountTransactions({ account: 'rAccount123', tokenId: 'USD', }), { wrapper: createWrapper({}, queryClient) }, ) await waitFor(() => expect(result.current.loading).toBe(false)) expect(result.current.hasNextPage).toBe(true) }) it('handles fetch error', async () => { mockedGetAccountTransactions.mockRejectedValue(new Error('Network error')) const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } }, }) const { result } = renderHook( () => useAccountTransactions({ account: 'rAccount123', tokenId: 'USD', }), { wrapper: createWrapper({}, queryClient) }, ) await waitFor(() => expect(result.current.error).not.toBeNull()) expect(result.current.error?.message).toBe( 'get_account_transactions_failed', ) }) it('auto-fetches next page when current page has no matching transactions', async () => { // First page: no transactions, has marker // Second page: has transactions mockedGetAccountTransactions .mockResolvedValueOnce({ transactions: [], marker: 'page-2-marker', }) .mockResolvedValueOnce({ transactions: [{ hash: 'tx1' }], marker: undefined, }) const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } }, }) const { result } = renderHook( () => useAccountTransactions({ account: 'rAccount123', tokenId: 'USD', }), { wrapper: createWrapper({}, queryClient) }, ) // Wait for first fetch await waitFor(() => expect(mockedGetAccountTransactions).toHaveBeenCalledTimes(1), ) // Advance timer to trigger auto-fetch jest.advanceTimersByTime(200) await waitFor(() => expect(mockedGetAccountTransactions).toHaveBeenCalledTimes(2), ) // Verify data from both pages is available await waitFor(() => expect(result.current.loading).toBe(false)) expect(result.current.data?.pages).toHaveLength(2) expect(result.current.data?.pages[0].transactions).toEqual([]) expect(result.current.data?.pages[1].transactions).toEqual([ { hash: 'tx1' }, ]) }) }) ================================================ FILE: src/containers/Token/shared/test/hooks/usePaginationState.test.ts ================================================ import { renderHook, act } from '@testing-library/react' import { usePaginationState } from '../../hooks/usePaginationState' describe('usePaginationState', () => { it('initializes with default values', () => { const { result } = renderHook(() => usePaginationState(10)) expect(result.current.currentPage).toBe(1) expect(result.current.pageSize).toBe(10) expect(result.current.total).toBe(0) expect(result.current.hasMore).toBeUndefined() expect(result.current.hasPrevPage).toBeUndefined() }) it('initializes with provided pageSize', () => { const { result } = renderHook(() => usePaginationState(20)) expect(result.current.pageSize).toBe(20) }) it('initializes with provided total', () => { const { result } = renderHook(() => usePaginationState(10, 100)) expect(result.current.total).toBe(100) }) it('initializes with hasMore flag', () => { const { result } = renderHook(() => usePaginationState(10, 100, true)) expect(result.current.hasMore).toBe(true) }) it('initializes with hasPrevPage flag', () => { const { result } = renderHook(() => usePaginationState(10, 100, true, true)) expect(result.current.hasPrevPage).toBe(true) }) it('initializes with all parameters', () => { const { result } = renderHook(() => usePaginationState(20, 200, true, false), ) expect(result.current.pageSize).toBe(20) expect(result.current.total).toBe(200) expect(result.current.hasMore).toBe(true) expect(result.current.hasPrevPage).toBe(false) }) it('updates currentPage when setCurrentPage is called', () => { const { result } = renderHook(() => usePaginationState(10)) act(() => { result.current.setCurrentPage(2) }) expect(result.current.currentPage).toBe(2) }) it('updates currentPage to any valid number', () => { const { result } = renderHook(() => usePaginationState(10)) act(() => { result.current.setCurrentPage(5) }) expect(result.current.currentPage).toBe(5) }) it('handles multiple page updates', () => { const { result } = renderHook(() => usePaginationState(10)) act(() => { result.current.setCurrentPage(2) }) expect(result.current.currentPage).toBe(2) act(() => { result.current.setCurrentPage(3) }) expect(result.current.currentPage).toBe(3) act(() => { result.current.setCurrentPage(1) }) expect(result.current.currentPage).toBe(1) }) it('handles large page numbers', () => { const { result } = renderHook(() => usePaginationState(10)) act(() => { result.current.setCurrentPage(1000) }) expect(result.current.currentPage).toBe(1000) }) it('handles zero page number', () => { const { result } = renderHook(() => usePaginationState(10)) act(() => { result.current.setCurrentPage(0) }) expect(result.current.currentPage).toBe(0) }) it('handles negative page number', () => { const { result } = renderHook(() => usePaginationState(10)) act(() => { result.current.setCurrentPage(-1) }) expect(result.current.currentPage).toBe(-1) }) it('maintains pageSize across updates', () => { const { result } = renderHook(() => usePaginationState(15, 150)) act(() => { result.current.setCurrentPage(2) }) expect(result.current.pageSize).toBe(15) }) it('maintains total across updates', () => { const { result } = renderHook(() => usePaginationState(10, 100)) act(() => { result.current.setCurrentPage(2) }) expect(result.current.total).toBe(100) }) it('returns setCurrentPage function', () => { const { result } = renderHook(() => usePaginationState(10)) expect(typeof result.current.setCurrentPage).toBe('function') }) it('handles zero pageSize', () => { const { result } = renderHook(() => usePaginationState(0)) expect(result.current.pageSize).toBe(0) }) it('handles large pageSize', () => { const { result } = renderHook(() => usePaginationState(1000)) expect(result.current.pageSize).toBe(1000) }) it('handles zero total', () => { const { result } = renderHook(() => usePaginationState(10, 0)) expect(result.current.total).toBe(0) }) it('handles large total', () => { const { result } = renderHook(() => usePaginationState(10, 1000000)) expect(result.current.total).toBe(1000000) }) it('handles hasMore as false', () => { const { result } = renderHook(() => usePaginationState(10, 100, false)) expect(result.current.hasMore).toBe(false) }) it('handles hasPrevPage as false', () => { const { result } = renderHook(() => usePaginationState(10, 100, true, false), ) expect(result.current.hasPrevPage).toBe(false) }) it('provides all required properties', () => { const { result } = renderHook(() => usePaginationState(10, 100, true, true)) expect(result.current).toHaveProperty('currentPage') expect(result.current).toHaveProperty('setCurrentPage') expect(result.current).toHaveProperty('pageSize') expect(result.current).toHaveProperty('total') expect(result.current).toHaveProperty('hasMore') expect(result.current).toHaveProperty('hasPrevPage') }) }) ================================================ FILE: src/containers/Token/shared/test/hooks/useSortingState.test.ts ================================================ import { renderHook, act } from '@testing-library/react' import { useSortingState } from '../../hooks/useSortingState' describe('useSortingState', () => { it('initializes with default values', () => { const { result } = renderHook(() => useSortingState()) expect(result.current.sortField).toBe('timestamp') expect(result.current.sortOrder).toBe('desc') }) it('initializes with custom sortField', () => { const { result } = renderHook(() => useSortingState('name')) expect(result.current.sortField).toBe('name') expect(result.current.sortOrder).toBe('desc') }) it('initializes with custom sortOrder', () => { const { result } = renderHook(() => useSortingState('timestamp', 'asc')) expect(result.current.sortField).toBe('timestamp') expect(result.current.sortOrder).toBe('asc') }) it('initializes with custom sortField and sortOrder', () => { const { result } = renderHook(() => useSortingState('amount', 'asc')) expect(result.current.sortField).toBe('amount') expect(result.current.sortOrder).toBe('asc') }) it('updates sortField when setSortField is called', () => { const { result } = renderHook(() => useSortingState()) act(() => { result.current.setSortField?.('name') }) expect(result.current.sortField).toBe('name') }) it('updates sortOrder when setSortOrder is called', () => { const { result } = renderHook(() => useSortingState()) act(() => { result.current.setSortOrder?.('asc') }) expect(result.current.sortOrder).toBe('asc') }) it('handles multiple sortField updates', () => { const { result } = renderHook(() => useSortingState()) act(() => { result.current.setSortField?.('name') }) expect(result.current.sortField).toBe('name') act(() => { result.current.setSortField?.('amount') }) expect(result.current.sortField).toBe('amount') act(() => { result.current.setSortField?.('timestamp') }) expect(result.current.sortField).toBe('timestamp') }) it('handles multiple sortOrder updates', () => { const { result } = renderHook(() => useSortingState()) act(() => { result.current.setSortOrder?.('asc') }) expect(result.current.sortOrder).toBe('asc') act(() => { result.current.setSortOrder?.('desc') }) expect(result.current.sortOrder).toBe('desc') act(() => { result.current.setSortOrder?.('asc') }) expect(result.current.sortOrder).toBe('asc') }) it('maintains sortField when updating sortOrder', () => { const { result } = renderHook(() => useSortingState('name', 'desc')) act(() => { result.current.setSortOrder?.('asc') }) expect(result.current.sortField).toBe('name') expect(result.current.sortOrder).toBe('asc') }) it('maintains sortOrder when updating sortField', () => { const { result } = renderHook(() => useSortingState('timestamp', 'asc')) act(() => { result.current.setSortField?.('amount') }) expect(result.current.sortField).toBe('amount') expect(result.current.sortOrder).toBe('asc') }) it('returns setSortField function', () => { const { result } = renderHook(() => useSortingState()) expect(typeof result.current.setSortField).toBe('function') }) it('returns setSortOrder function', () => { const { result } = renderHook(() => useSortingState()) expect(typeof result.current.setSortOrder).toBe('function') }) it('handles empty string sortField', () => { const { result } = renderHook(() => useSortingState('')) expect(result.current.sortField).toBe('') }) it('handles special characters in sortField', () => { const { result } = renderHook(() => useSortingState('field_name')) expect(result.current.sortField).toBe('field_name') }) it('handles numeric sortField names', () => { const { result } = renderHook(() => useSortingState('field123')) expect(result.current.sortField).toBe('field123') }) it('provides all required properties', () => { const { result } = renderHook(() => useSortingState()) expect(result.current).toHaveProperty('sortField') expect(result.current).toHaveProperty('setSortField') expect(result.current).toHaveProperty('sortOrder') expect(result.current).toHaveProperty('setSortOrder') }) it('handles updating both sortField and sortOrder', () => { const { result } = renderHook(() => useSortingState('timestamp', 'desc')) act(() => { result.current.setSortField?.('amount') result.current.setSortOrder?.('asc') }) expect(result.current.sortField).toBe('amount') expect(result.current.sortOrder).toBe('asc') }) it('handles long sortField names', () => { const longFieldName = 'very_long_field_name_with_many_characters' const { result } = renderHook(() => useSortingState(longFieldName)) expect(result.current.sortField).toBe(longFieldName) }) it('handles camelCase sortField names', () => { const { result } = renderHook(() => useSortingState('sortByAmount')) expect(result.current.sortField).toBe('sortByAmount') }) it('handles snake_case sortField names', () => { const { result } = renderHook(() => useSortingState('sort_by_amount')) expect(result.current.sortField).toBe('sort_by_amount') }) it('maintains state across multiple operations', () => { const { result } = renderHook(() => useSortingState('name', 'asc')) act(() => { result.current.setSortField?.('amount') }) expect(result.current.sortField).toBe('amount') expect(result.current.sortOrder).toBe('asc') act(() => { result.current.setSortOrder?.('desc') }) expect(result.current.sortField).toBe('amount') expect(result.current.sortOrder).toBe('desc') act(() => { result.current.setSortField?.('timestamp') }) expect(result.current.sortField).toBe('timestamp') expect(result.current.sortOrder).toBe('desc') }) }) ================================================ FILE: src/containers/Token/shared/test/services/transfersPagination.test.ts ================================================ import { transfersPaginationService } from '../../services/transfersPagination' import { getTransfers } from '../../api/tokenTx' jest.mock('../../api/tokenTx', () => ({ getTransfers: jest.fn(), })) const mockGetTransfers = getTransfers as jest.Mock describe('TransfersPaginationService', () => { beforeEach(() => { jest.clearAllMocks() transfersPaginationService.clearCache() }) describe('getTransfersPage', () => { it('returns empty transfers on first call with no data', async () => { mockGetTransfers.mockResolvedValue({ results: [], next_cursor: null, }) const result = await transfersPaginationService.getTransfersPage( 'USD.rIssuer', 1, ) expect(result.transfers).toEqual([]) expect(result.totalTransfers).toBe(0) expect(result.hasMore).toBe(false) }) it('fetches and returns transfers on first page', async () => { const mockTransfers = [ { hash: 'hash1', ledger_index: 100, timestamp: 1000, type: 'Payment', account: 'rFrom1', destination: 'rTo1', amount: { currency: 'USD', issuer: 'rIssuer', value: '100' }, }, ] mockGetTransfers.mockResolvedValue({ results: mockTransfers, next_cursor: 'cursor1', }) const result = await transfersPaginationService.getTransfersPage( 'USD.rIssuer', 1, ) expect(result.transfers.length).toBe(1) expect(result.totalTransfers).toBe(1) expect(result.hasMore).toBe(false) }) it('uses default page size when not provided', async () => { mockGetTransfers.mockResolvedValue({ results: [], next_cursor: null, }) await transfersPaginationService.getTransfersPage('USD.rIssuer', 1) expect(mockGetTransfers).toHaveBeenCalledWith( 'USD.rIssuer', 200, undefined, 'next', undefined, undefined, ) }) it('uses custom page size when provided', async () => { mockGetTransfers.mockResolvedValue({ results: [], next_cursor: null, }) await transfersPaginationService.getTransfersPage('USD.rIssuer', 1, 20) expect(mockGetTransfers).toHaveBeenCalled() }) it('handles multiple pages correctly', async () => { const mockTransfers = Array.from({ length: 200 }, (_, i) => ({ hash: `hash${i}`, ledger_index: 100 + i, timestamp: 1000 + i, type: 'Payment', account: `rFrom${i}`, destination: `rTo${i}`, amount: { currency: 'USD', issuer: 'rIssuer', value: '100' }, })) mockGetTransfers.mockResolvedValue({ results: mockTransfers, next_cursor: 'cursor1', }) const result1 = await transfersPaginationService.getTransfersPage( 'USD.rIssuer', 1, 10, ) expect(result1.transfers.length).toBe(10) expect(result1.hasMore).toBe(true) }) it('caches transfers between calls', async () => { const mockTransfers = [ { hash: 'hash1', ledger_index: 100, timestamp: 1000, type: 'Payment', account: 'rFrom1', destination: 'rTo1', amount: { currency: 'USD', issuer: 'rIssuer', value: '100' }, }, ] mockGetTransfers.mockResolvedValue({ results: mockTransfers, next_cursor: null, }) await transfersPaginationService.getTransfersPage('USD.rIssuer', 1) const callCount1 = mockGetTransfers.mock.calls.length await transfersPaginationService.getTransfersPage('USD.rIssuer', 1) const callCount2 = mockGetTransfers.mock.calls.length // Should not fetch again for same page expect(callCount2).toBe(callCount1) }) it('handles sorting parameters', async () => { mockGetTransfers.mockResolvedValue({ results: [], next_cursor: null, }) await transfersPaginationService.getTransfersPage( 'USD.rIssuer', 1, 10, 'timestamp', 'asc', ) expect(mockGetTransfers).toHaveBeenCalledWith( 'USD.rIssuer', 200, undefined, 'next', 'timestamp', 'asc', ) }) it('returns correct hasMore flag', async () => { const mockTransfers = Array.from({ length: 200 }, (_, i) => ({ hash: `hash${i}`, ledger_index: 100 + i, timestamp: 1000 + i, type: 'Payment', account: `rFrom${i}`, destination: `rTo${i}`, amount: { currency: 'USD', issuer: 'rIssuer', value: '100' }, })) mockGetTransfers.mockResolvedValue({ results: mockTransfers, next_cursor: 'cursor1', }) const result = await transfersPaginationService.getTransfersPage( 'USD.rIssuer', 1, 10, ) expect(result.hasMore).toBe(true) }) }) describe('clearCache', () => { it('clears cache for specific tokenId', async () => { mockGetTransfers.mockResolvedValue({ results: [], next_cursor: null, }) await transfersPaginationService.getTransfersPage('USD.rIssuer', 1) transfersPaginationService.clearCache('USD.rIssuer') const count1 = mockGetTransfers.mock.calls.length await transfersPaginationService.getTransfersPage('USD.rIssuer', 1) const count2 = mockGetTransfers.mock.calls.length expect(count2).toBeGreaterThan(count1) }) it('clears all caches when no parameters provided', async () => { mockGetTransfers.mockResolvedValue({ results: [], next_cursor: null, }) await transfersPaginationService.getTransfersPage('USD.rIssuer', 1) transfersPaginationService.clearCache() const count1 = mockGetTransfers.mock.calls.length await transfersPaginationService.getTransfersPage('USD.rIssuer', 1) const count2 = mockGetTransfers.mock.calls.length expect(count2).toBeGreaterThan(count1) }) }) describe('getCachedTransfersCount', () => { it('returns 0 for uncached tokenId', () => { const count = transfersPaginationService.getCachedTransfersCount('USD.rIssuer') expect(count).toBe(0) }) it('returns correct count after fetching', async () => { const mockTransfers = Array.from({ length: 5 }, (_, i) => ({ hash: `hash${i}`, ledger_index: 100 + i, timestamp: 1000 + i, type: 'Payment', account: `rFrom${i}`, destination: `rTo${i}`, amount: { currency: 'USD', issuer: 'rIssuer', value: '100' }, })) mockGetTransfers.mockResolvedValue({ results: mockTransfers, next_cursor: null, }) await transfersPaginationService.getTransfersPage('USD.rIssuer', 1) const count = transfersPaginationService.getCachedTransfersCount('USD.rIssuer') expect(count).toBe(5) }) it('returns correct count with sorting parameters', async () => { const mockTransfers = Array.from({ length: 5 }, (_, i) => ({ hash: `hash${i}`, ledger_index: 100 + i, timestamp: 1000 + i, type: 'Payment', account: `rFrom${i}`, destination: `rTo${i}`, amount: { currency: 'USD', issuer: 'rIssuer', value: '100' }, })) mockGetTransfers.mockResolvedValue({ results: mockTransfers, next_cursor: null, }) await transfersPaginationService.getTransfersPage( 'USD.rIssuer', 1, 10, 'timestamp', 'asc', ) const count = transfersPaginationService.getCachedTransfersCount( 'USD.rIssuer', 'timestamp', 'asc', ) expect(count).toBe(5) }) }) describe('edge cases', () => { it('handles invalid page size gracefully', async () => { mockGetTransfers.mockResolvedValue({ results: [], next_cursor: null, }) const result = await transfersPaginationService.getTransfersPage( 'USD.rIssuer', 1, 0, ) expect(result).toBeDefined() }) it('handles negative page number', async () => { mockGetTransfers.mockResolvedValue({ results: [], next_cursor: null, }) const result = await transfersPaginationService.getTransfersPage( 'USD.rIssuer', -1, ) expect(result).toBeDefined() }) it('handles empty tokenId', async () => { mockGetTransfers.mockResolvedValue({ results: [], next_cursor: null, }) const result = await transfersPaginationService.getTransfersPage('', 1) expect(result).toBeDefined() }) it('handles large page numbers', async () => { mockGetTransfers.mockResolvedValue({ results: [], next_cursor: null, }) const result = await transfersPaginationService.getTransfersPage( 'USD.rIssuer', 1000, ) expect(result).toBeDefined() }) }) }) ================================================ FILE: src/containers/TokenNonMain/TokenHeader/index.tsx ================================================ import { useTranslation } from 'react-i18next' import './styles.scss' import { localizeNumber, formatLargeNumber } from '../../shared/utils' import Currency from '../../shared/components/Currency' import { Account } from '../../shared/components/Account' import DomainLink from '../../shared/components/DomainLink' import { TokenTableRow } from '../../shared/components/TokenTableRow' import { useLanguage } from '../../shared/hooks' import { LEDGER_ROUTE, TRANSACTION_ROUTE } from '../../App/routes' import { RouteLink } from '../../shared/routing' import { TokenData } from '../../../rippled/token' import { XRP_BASE } from '../../shared/transactionUtils' const CURRENCY_OPTIONS = { style: 'currency', currency: 'XRP', minimumFractionDigits: 2, maximumFractionDigits: 6, } interface TokenHeaderProps { accountId: string currency: string data: TokenData } export const TokenHeader = ({ accountId, currency, data, }: TokenHeaderProps) => { const language = useLanguage() const { t } = useTranslation() const { domain, rate, emailHash, previousLedger, previousTxn } = data const renderDetails = () => { const prevTxn = previousTxn && previousTxn.replace(/(.{20})..+/, '$1...') const abbrvEmail = emailHash && emailHash.replace(/(.{20})..+/, '$1...') return ( {domain && ( } /> )} {rate && } {previousLedger && ( {previousLedger} } /> )} {prevTxn} } /> {emailHash && ( )}
) } const renderSettings = () => { const { flags } = data const rippling = flags && flags.includes('lsfDefaultRipple') ? 'enabled' : 'disabled' const depositAuth = flags && flags.includes('lsfDepositAuth') ? 'enabled' : 'disabled' const masterKey = flags && flags.includes('lsfDisableMaster') ? 'disabled' : 'enabled' const receivingXRP = flags && flags.includes('lsfDisallowXRP') ? 'disabled' : 'enabled' const frozen = flags && flags.includes('lsfGlobalFreeze') ? 'true' : 'false' const noFreeze = flags && flags.includes('lsfNoFreeze') ? 'true' : 'false' const requireAuth = flags && flags.includes('lsfRequireAuth') ? 'true' : 'false' const requireDestTag = flags && flags.includes('lsfRequireDestTag') ? 'true' : 'false' const clawback = flags && flags.includes('lsfAllowTrustLineClawback') ? 'true' : 'false' return (
) } const renderHeaderContent = () => { const { balance, sequence, obligations, reserve } = data const currencyBalance = localizeNumber( parseInt(balance, 10) / XRP_BASE || 0.0, language, CURRENCY_OPTIONS, ) const reserveBalance = localizeNumber( reserve || 0.0, language, CURRENCY_OPTIONS, ) const obligationsBalance = formatLargeNumber( Number.parseFloat(obligations || '0'), ) return (
{t('accounts.xrp_balance')}
{currencyBalance}
{t('reserve')}
{reserveBalance}
{t('sequence_number_short')}
{sequence}
{t('issuer_address')}
{t('obligations')}
{obligationsBalance.num} {obligationsBalance.unit}

{t('details')}

{renderDetails()}

{t('settings')}

{renderSettings()}
) } return (

{emailHash && ( {`${currency} )}
{renderHeaderContent()}
) } ================================================ FILE: src/containers/TokenNonMain/TokenHeader/styles.scss ================================================ @use '../../shared/css/variables' as *; @use '../../shared/css/table'; .token-header-non-main { .header-container { .bottom-container { display: flex; flex-direction: column; padding-top: 64px; @include for-size(desktop-up) { flex-direction: row; padding-top: 80px; } .details { width: 100%; @include for-size(desktop-up) { width: 490px; } } .settings { width: 100%; @include for-size(desktop-up) { width: 650px; } } } .info-container { display: flex; flex-direction: column; justify-content: space-between; margin-top: 68px; @include for-size(desktop-up) { flex-direction: row; margin-top: 80px; } .values { display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 18px; color: $white; @include for-size(desktop-up) { flex-direction: column; margin-bottom: 0px; } .title { padding-bottom: 4px; color: $black-40; font-size: 14px; text-transform: uppercase; @include semibold; } .value { color: $white; font-size: 18px; line-height: 22.5px; text-decoration: none; @include bold; } } } } .token-header { margin-bottom: 16px; .box-header { display: flex; flex-direction: row; align-items: center; margin-top: 106px; text-align: left; span { margin: 0px; color: $white; font-size: 32px; @include bold; @include for-size(tablet-landscape-up) { font-size: 42px; } } img { width: 24px; height: 24px; margin-left: 16px; object-fit: contain; } } .box-content { min-height: 100px; padding-bottom: 20px; } .column { display: inline-block; width: 100%; vertical-align: top; @include for-size(desktop-up) { width: 450px; &.second { width: calc(100% - 450px); text-align: right; } } .secondary { padding: 0px 8px; border-bottom: 1px solid $black-20; margin-bottom: 20px; color: $black-90; font-size: 12px; @include bold; @include for-size(desktop-up) { border: none; } .title { color: $black-40; font-size: 14px; text-transform: uppercase; @include medium; } .label { color: $black-40; text-transform: uppercase; @include medium; } ul { padding: 0px; margin: 0px; list-style: none; li { padding: 1px; vertical-align: top; a { display: inline-block; overflow: hidden; color: inherit; text-overflow: ellipsis; text-transform: none; vertical-align: middle; white-space: nowrap; @include medium; } b { color: $white; word-break: break-all; @include bold; } &.flags { color: $blue-purple-30; font-style: italic; } } } &.x-address ul { width: 100%; li { display: flex; justify-content: space-between; @media (width >= 450px) { display: block; } .tag { font-weight: 500; } .network { font-weight: 500; } &.tag-info { padding-top: 14px; font-size: 14px; } } } &.signer-list ul { width: 100%; li { display: flex; justify-content: space-between; @media (width >= 450px) { display: block; } .account { overflow: hidden; width: 285px; padding-right: 10px; color: $white; text-overflow: ellipsis; white-space: nowrap; } .weight { text-align: right; white-space: nowrap; } &.quorum { display: block; } } } } } } } ================================================ FILE: src/containers/TokenNonMain/TokenHeader/test/actNotFound.json ================================================ { "account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "error": "actNotFound", "error_code": 19, "error_message": "Account not found.", "ledger_hash": "97992DBB4ED350B572B39D0026604943ACC84A3E5967454147253CB317551891", "ledger_index": 68989958, "request": { "account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "command": "account_info", "ledger_index": "validated", "queue": false, "signer_lists": false, "strict": false }, "validated": true } ================================================ FILE: src/containers/TokenNonMain/TokenHeader/test/rippledResponses.json ================================================ { "account_info": { "result": { "account_data": { "Account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "Balance": "123456000", "Flags": 0, "LedgerEntryType": "AccountRoot", "OwnerCount": 0, "PreviousTxnID": "6B6F2CA1633A22247058E988372BA9EFFFC5BF10212230B67341CA32DC9D4A82", "PreviousTxnLgrSeq": 68990183, "Sequence": 2148991, "index": "C3B625B296E95A21D7BBBB7E3D343AF423B463B87B5D56EE7F79C8E16A47A6F5", "signer_lists": [] }, "ledger_hash": "43C4195B2C90423771E6C5DF4AED11BF3D77FFD1E8A153A489E5B00C96318FCA", "ledger_index": 68990183, "validated": true }, "status": "success", "type": "response" }, "account_objects": { "result": { "account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "account_objects": [], "ledger_current_index": 24402380, "validated": false }, "status": "success", "type": "response" }, "gateway_balances": { "result": { "account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "ledger_hash": "F4023C801B8B4D05F16EFE5D8C4C3C14D02354AABBB94151F581A6BF0E04C20B", "ledger_index": 24402706, "obligations": { "ABC": "100" }, "validated": true }, "status": "success", "type": "response" }, "server_info": { "result": { "info": { "validated_ledger": { "age": 1, "base_fee_xrp": 0.00001, "hash": "EA01E248FCA5CFD33A3393DA5EBCCD9219BA8DB6AF6DC28A3B0A968604F46A76", "reserve_base_xrp": 10, "reserve_inc_xrp": 2, "seq": 24402729 }, "validation_quorum": 5 } }, "status": "success", "type": "response" } } ================================================ FILE: src/containers/TokenNonMain/TokenTransactionTable/TokenTransactionTable.tsx ================================================ import { useContext } from 'react' import { useTranslation } from 'react-i18next' import { useInfiniteQuery } from 'react-query' import { useAnalytics } from '../../shared/analytics' import SocketContext from '../../shared/SocketContext' import { TransactionTable } from '../../shared/components/TransactionTable/TransactionTable' import { getAccountTransactions } from '../../../rippled' export interface TokenTransactionsTableProps { accountId: string currency: string } export const TokenTransactionTable = ({ accountId, currency, }: TokenTransactionsTableProps) => { const { trackException } = useAnalytics() const rippledSocket = useContext(SocketContext) const { t } = useTranslation() const { data, error, isFetching: loading, fetchNextPage, hasNextPage, } = useInfiniteQuery( ['fetchTransactions', accountId, currency], ({ pageParam = '' }) => getAccountTransactions( accountId, currency, pageParam, undefined, rippledSocket, ).catch((errorResponse) => { const errorLocation = `token transactions ${accountId}.${currency} at ${pageParam}` trackException(`${errorLocation} --- ${JSON.stringify(errorResponse)}`) throw new Error('get_account_transactions_failed') }), { getNextPageParam: (lastPage) => lastPage.marker, }, ) return ( page.transactions).flat()} loading={loading} emptyMessage={t(error?.message || ('' as any))} onLoadMore={() => fetchNextPage()} hasAdditionalResults={hasNextPage} /> ) } ================================================ FILE: src/containers/TokenNonMain/TokenTransactionTable/index.tsx ================================================ export * from './TokenTransactionTable' ================================================ FILE: src/containers/TokenNonMain/TokenTransactionTable/test/TokenTransactionTable.test.tsx ================================================ import { render, fireEvent, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfig' import { TokenTransactionTable } from '../index' import TEST_TRANSACTIONS_DATA from '../../../Accounts/AccountTransactionTable/test/mockTransactions.json' import { getAccountTransactions } from '../../../../rippled' import { testQueryClient } from '../../../test/QueryClient' import { flushPromises } from '../../../test/utils' import Mock = jest.Mock jest.mock('../../../../rippled', () => ({ __esModule: true, getAccountTransactions: jest.fn(), })) const TEST_ACCOUNT_ID = 'rTEST_ACCOUNT' const TEST_CURRENCY = 'abc' describe('TokenTransactionsTable container', () => { const renderTokenTransactionTable = ( getAccountTransactionsImpl = () => new Promise(() => {}), ) => { ;(getAccountTransactions as Mock).mockImplementation( getAccountTransactionsImpl, ) return render( , ) } it('renders static parts', () => { const { container } = renderTokenTransactionTable() expect(container.querySelectorAll('.transaction-table').length).toBe(1) }) it('renders loader when fetching data', () => { const { container } = renderTokenTransactionTable() expect(container.querySelectorAll('.loader').length).toBe(1) }) it('renders dynamic content with transaction data', async () => { const { container } = renderTokenTransactionTable(() => Promise.resolve(TEST_TRANSACTIONS_DATA), ) await flushPromises() await waitFor(() => { expect(container.querySelector('.load-more-btn')).toBeInTheDocument() }) expect(container.querySelector('.transaction-table')).toBeInTheDocument() expect( container.querySelectorAll('.transaction-li.transaction-li-header') .length, ).toBe(1) expect(container.querySelectorAll('a').length).toBe(60) fireEvent.click(container.querySelector('.load-more-btn')!) expect(getAccountTransactions).toHaveBeenCalledWith( TEST_ACCOUNT_ID, TEST_CURRENCY, '44922483.5', undefined, undefined, ) }) it('renders error message when request fails', async () => { const { container } = renderTokenTransactionTable(() => Promise.reject()) await flushPromises() await waitFor(() => { expect( container.querySelector('.empty-transactions-message'), ).toBeInTheDocument() }) expect(container.querySelector('.load-more-btn')).not.toBeInTheDocument() expect(container.querySelector('.transaction-table')).toBeInTheDocument() expect( container.querySelector('.empty-transactions-message'), ).toHaveTextContent('get_account_transactions_failed') expect(container.querySelectorAll('a').length).toBe(0) }) }) ================================================ FILE: src/containers/TokenNonMain/TokenTransactionTable/test/successfulAccountTx.json ================================================ { "result": { "account": "rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv", "limit": 0, "transactions": [ { "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rPPbi1iNXmvY9HmJ9sH9g4gxvgVEfN4NaZ", "Balance": "316010893320", "Flags": 0, "OwnerCount": 0, "Sequence": 57083165 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1991E4EF8C9693AFFC9E200D112DFAD12449444CD8685FF859199B63B7C22341", "PreviousFields": { "Balance": "316014663320", "Sequence": 57083164 }, "PreviousTxnID": "ADD23A6189E86A345821A1FBC7A076A677E08947D9D09856E2BD2A8B5D2CF751", "PreviousTxnLgrSeq": 68995185 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBWpYJhuJWBPAkzJ4kYQqHShSkkF3rgeD", "Balance": "23750000", "Flags": 131072, "OwnerCount": 0, "Sequence": 199377 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "96F9BDDED4A0E0F33AD1B28CC202B0E8FA357F3FC8EB2F716FE25B49B9BBA7FA", "PreviousFields": { "Balance": "20000000" }, "PreviousTxnID": "3832CD380B8EF414B3504FC63B5B3A28EC24284183E8E759985A657710559847", "PreviousTxnLgrSeq": 68995265 } } ], "TransactionIndex": 54, "TransactionResult": "tesSUCCESS", "delivered_amount": "3750000" }, "tx": { "Account": "rPPbi1iNXmvY9HmJ9sH9g4gxvgVEfN4NaZ", "Amount": { "currency": "ABC", "issuer": "garbage", "value": "3.75" }, "Destination": "rBWpYJhuJWBPAkzJ4kYQqHShSkkF3rgeD", "DestinationTag": 2471596944, "Fee": "20000", "Flags": 2147483648, "LastLedgerSequence": 68995327, "Sequence": 57083164, "SigningPubKey": "02CA41BA17A2CDE0E5B7BEA8FC97CA0E9A196DCD5F524E4CA44F1C38B610F4A054", "TransactionType": "Payment", "TxnSignature": "304402200478EDD72D70A452C72EEA4AA9F3A72E6E706A594A373C54AC31810B351ADC2502200E4F4D0960AE6AF7ED93878FD35582507ACAD38CF5509DFD2BE1C67CA3C93C46", "date": 695430982, "hash": "7D150D03E799748425B45B59CF2511ACA58795EEC393663702C302A57460C53D", "inLedger": 68995325, "ledger_index": 68995325 }, "validated": true } ], "used_postgres": true, "validated": true }, "status": "success", "type": "response" } ================================================ FILE: src/containers/TokenNonMain/index.tsx ================================================ import { FC, PropsWithChildren, useContext, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { Helmet } from 'react-helmet-async' import { useQuery } from 'react-query' import { TokenHeader } from './TokenHeader' import { TokenTransactionTable } from './TokenTransactionTable' import NoMatch from '../NoMatch' import './styles.scss' import { NOT_FOUND, BAD_REQUEST } from '../shared/utils' import { useAnalytics } from '../shared/analytics' import { ErrorMessages } from '../shared/Interfaces' import { TOKEN_ROUTE } from '../App/routes' import { useRouteParams } from '../shared/routing' import SocketContext from '../shared/SocketContext' import { Loader } from '../shared/components/Loader' import getToken from '../../rippled/token' const ERROR_MESSAGES: ErrorMessages = { default: { title: 'generic_error', hints: ['not_your_fault'], }, [NOT_FOUND]: { title: 'account_not_found', hints: ['check_account_id'], }, [BAD_REQUEST]: { title: 'invalid_xrpl_address', hints: ['check_account_id'], }, } const getErrorMessage = (error) => ERROR_MESSAGES[error] || ERROR_MESSAGES.default const Page: FC> = ({ accountId, children, }) => (
{children}
) export const TokenNonMain = () => { const rippledSocket = useContext(SocketContext) const { trackScreenLoaded } = useAnalytics() const { token = '' } = useRouteParams(TOKEN_ROUTE) const [currency, accountId] = token.split('.') const { t } = useTranslation() const { data: tokenData, error: tokenDataError, isLoading: isTokenDataLoading, } = useQuery({ queryKey: ['token', currency, accountId], queryFn: () => getToken(currency, accountId, rippledSocket), }) useEffect(() => { trackScreenLoaded({ issuer: accountId, currency_code: currency, }) return () => { window.scrollTo(0, 0) } }, [accountId, currency, trackScreenLoaded]) const renderError = () => { const message = getErrorMessage(tokenDataError) return } if (tokenDataError) { return {renderError()} } return ( {isTokenDataLoading ? ( ) : ( tokenData && ( ) )} {accountId && tokenData && (

{t('token_transactions')}

)} {!accountId && (

Enter an account ID in the search box

)}
) } ================================================ FILE: src/containers/TokenNonMain/styles.scss ================================================ @use '../shared/css/variables'; .token-page-non-main { width: 100%; .loader { min-height: 100px; } } ================================================ FILE: src/containers/TokenNonMain/test/index.test.tsx ================================================ import { render, waitFor } from '@testing-library/react' import { Route } from 'react-router' import i18n from '../../../i18n/testConfig' import { TokenNonMain } from '../index' import { flushPromises, QuickHarness } from '../../test/utils' import { TOKEN_ROUTE } from '../../App/routes' import mockAccount from '../../Accounts/test/mockAccountState.json' import Mock = jest.Mock import getToken from '../../../rippled/token' jest.mock('../../../rippled/token', () => ({ __esModule: true, default: jest.fn(), })) describe('Token container', () => { const TEST_ACCOUNT_ID = 'rTEST_ACCOUNT' const renderTokenNonMain = (getAccountImpl = () => new Promise(() => {})) => { ;(getToken as Mock).mockImplementation(getAccountImpl) return render( } /> , ) } beforeEach(() => { jest.resetModules() }) it('renders without crashing', () => { renderTokenNonMain() }) it('renders static parts', async () => { const { container } = renderTokenNonMain(() => Promise.resolve(mockAccount)) await flushPromises() await waitFor(() => { // TokenHeader renders with class 'token-header-non-main' expect(container.querySelectorAll('.token-header-non-main').length).toBe( 1, ) }) // TokenTransactionTable renders with class 'transaction-table' expect(container.querySelectorAll('.transaction-table').length).toBe(1) }) }) ================================================ FILE: src/containers/Tokens/TokensTable.tsx ================================================ import { useTranslation } from 'react-i18next' import { FC } from 'react' import { Loader } from '../shared/components/Loader' import Currency from '../shared/components/Currency' import { LOSToken } from '../shared/losTypes' import { Account } from '../shared/components/Account' import UpIcon from '../shared/images/ic_up.svg' import DownIcon from '../shared/images/ic_down.svg' import SortTableColumn from '../shared/components/SortColumn' import { RouteLink } from '../shared/routing' import { TOKEN_ROUTE } from '../App/routes' import { shortenAccount } from '../shared/utils' import { parseCurrencyAmount, parsePercent, parseIntegerAmount, parsePrice, } from '../shared/NumberFormattingUtils' type SortOrder = 'asc' | 'desc' interface TokensTableProps { tokens: LOSToken[] sortField: string sortOrder: SortOrder setSortField: (field: string) => void setSortOrder: (order: SortOrder) => void setPage: (page: number) => void } const DEFAULT_EMPTY_VALUE = '--' const TokenLogo: FC<{ icon: string | undefined }> = ({ icon }) => icon ? (
) : (
) const PriceChange: FC<{ percent: number }> = ({ percent }) => (
0 ? 'increase' : 'decrease'}`}>
{percent > 0 ? parsePercent(percent) : parsePercent(percent).replace('-', '')}
{percent > 0 ? ( ) : ( )}
) export const TokensTable = ({ tokens, sortField, setSortField, sortOrder, setSortOrder, setPage, }: TokensTableProps) => { const { t } = useTranslation() const renderIssuer = (token: LOSToken) => (
{token.issuer_name && ( {token.issuer_name} ( )} {token.issuer_name && )}
) const renderToken = (token: LOSToken) => ( {token.index} {renderIssuer(token)} {token.price_usd && Number(token.price_usd) !== 0 ? parsePrice(token.price_usd) : DEFAULT_EMPTY_VALUE} {token.price_change ? ( ) : ( DEFAULT_EMPTY_VALUE )} {token.daily_volume_usd && Number(token.daily_volume_usd) !== 0 ? parseCurrencyAmount(token.daily_volume_usd) : DEFAULT_EMPTY_VALUE} {token.daily_trades && Number(token.daily_trades) !== 0 ? parseIntegerAmount(token.daily_trades) : DEFAULT_EMPTY_VALUE} {token.holders && Number(token.holders) !== 0 ? parseIntegerAmount(token.holders) : DEFAULT_EMPTY_VALUE} {token.tvl_usd && Number(token.tvl_usd) !== 0 ? parseCurrencyAmount(token.tvl_usd) : DEFAULT_EMPTY_VALUE} {token.market_cap_usd && Number(token.market_cap_usd) !== 0 ? parseCurrencyAmount(token.market_cap_usd) : DEFAULT_EMPTY_VALUE} ) return tokens.length > 0 ? (
{tokens.map(renderToken)}
# {t('name')} {t('issuer')}
) : ( ) } ================================================ FILE: src/containers/Tokens/index.tsx ================================================ import axios from 'axios' import { useQuery } from 'react-query' import { FC, useCallback, useMemo, useState, useEffect } from 'react' import { Trans, useTranslation } from 'react-i18next' import { Link } from 'react-router' import Log from '../shared/log' import { TokensTable } from './TokensTable' import { parseCurrencyAmount } from '../shared/NumberFormattingUtils' import './tokens.scss' import { Pagination } from '../shared/components/Pagination' import { Loader } from '../shared/components/Loader' import { LOSToken } from '../shared/losTypes' import { Tooltip, useTooltip } from '../shared/components/Tooltip' import HoverIcon from '../shared/images/hover.svg' import { useAnalytics } from '../shared/analytics' interface FilterProps { categories: CategoryKey[] filterField: string setFilterField: (field: string) => void setPage: (page: number) => void } interface TokensData { tokens: LOSToken[] metrics: { count: number market_cap: string volume_24h: string stablecoin: string } } type CategoryKey = 'stablecoin' | 'wrapped' const TOOLTIP_Y_OFFSET = 80 const PAGE_SIZE = 15 const Filter: FC = ({ categories, filterField, setFilterField, setPage, }) => { const { t } = useTranslation() const handleClick = (cat) => { if (filterField === cat) { setFilterField('') } else { setFilterField(cat) } setPage(1) } return (
{categories.map((cat) => ( ))}
) } export const Tokens = () => { const [sortField, setSortField] = useState('market_cap') const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc') const [filterField, setFilterField] = useState('') const [page, setPage] = useState(1) const { tooltip, showTooltip, hideTooltip } = useTooltip() const { t } = useTranslation() const { trackScreenLoaded, trackException } = useAnalytics() // Track page load useEffect(() => { trackScreenLoaded() }, [trackScreenLoaded]) const filterCategories: CategoryKey[] = ['stablecoin', 'wrapped'] const { data: tokensData } = useQuery( ['fetchTokens'], () => fetchTokens(), { refetchInterval: 60 * 1000, onError: (error) => { Log.error(error) trackException(`tokens fetch --- ${JSON.stringify(error)}`) }, }, ) const filteredTokens = useMemo(() => { if (!tokensData || !tokensData.tokens) return [] if (filterField === '') { return tokensData.tokens } return tokensData.tokens.filter( (token) => token.asset_class === filterField || token.asset_subclass === filterField, ) }, [tokensData, filterField]) const renderTextTooltip = (key: string) => ( { const rect = e.currentTarget.getBoundingClientRect() showTooltip('text', e, t(`${key}_description`, { defaultValue: '' }), { x: rect.left + rect.width / 2, y: rect.top - TOOLTIP_Y_OFFSET, }) }} onMouseLeave={() => hideTooltip()} /> ) const getSortValue = (token, field) => { switch (field) { case 'price': return Number(token.price ?? 0) case 'holders': return Number(token.holders) ?? 0 case 'market_cap': return Number(token.market_cap_usd ?? 0) case '24h': return token.price_change ?? 0 case 'volume': return Number(token.daily_volume ?? 0) case 'trades': return Number(token.daily_trades) ?? 0 case 'tvl': return token.tvl_xrp ?? 0 default: return 0 } } const sortTokens = useCallback( (tokens: LOSToken[]) => [...tokens].sort((a, b) => { const aVal = getSortValue(a, sortField) const bVal = getSortValue(b, sortField) if (aVal < bVal) return sortOrder === 'asc' ? -1 : 1 if (aVal > bVal) return sortOrder === 'asc' ? 1 : -1 return 0 }), [sortField, sortOrder], ) const sortedTokens = useMemo( () => sortTokens(filteredTokens), [filteredTokens, sortTokens], ) const fetchTokens = () => axios.get('/api/v1/tokens').then((response) => ({ tokens: response.data.tokens, metrics: response.data.metrics, })) const start = (page - 1) * PAGE_SIZE const pagedTokens = sortedTokens .slice(start, start + PAGE_SIZE) .map((token, idx) => ({ ...token, index: start + idx + 1, })) return (
{t('tokens')}
{tokensData?.metrics && (
{t('no_of_tokens')}
{tokensData.metrics.count}
{t('market_cap')} {renderTextTooltip('market_cap_metric')}
{parseCurrencyAmount(tokensData.metrics.market_cap)}
{t('volume_24h_total')} {renderTextTooltip('volume_24h_total')}
{parseCurrencyAmount(tokensData.metrics.volume_24h)}
{t('stablecoin')} {renderTextTooltip('stablecoin')}
{parseCurrencyAmount(tokensData.metrics.stablecoin)}
)} {pagedTokens.length > 0 ? ( <>
{` ${t('xrplmeta_guidelines')}`} ), }} />
) : ( )}
) } ================================================ FILE: src/containers/Tokens/test/index.test.tsx ================================================ import { render, waitFor } from '@testing-library/react' import moxios from 'moxios' import { Route } from 'react-router' import i18n from '../../../i18n/testConfigEnglish' import { Tokens } from '..' import NetworkContext from '../../shared/NetworkContext' import { flushPromises, QuickHarness } from '../../test/utils' import tokensData from './mock_data/tokens.json' import { TOKENS_ROUTE } from '../../App/routes' jest.mock('usehooks-ts', () => ({ useWindowSize: () => ({ width: 375, height: 600, }), })) describe('Tokens Page container', () => { const renderTokens = () => render( } /> , ) const oldEnvs = process.env beforeEach(() => { moxios.install() process.env = { ...oldEnvs, VITE_ENVIRONMENT: 'mainnet' } }) afterEach(() => { moxios.uninstall() process.env = oldEnvs }) it('renders without crashing', () => { renderTokens() }) it('renders all parts', async () => { moxios.stubRequest('/api/v1/tokens', { status: 200, response: tokensData, }) const { container } = renderTokens() await flushPromises() await waitFor(() => { expect(container.querySelectorAll('.tokens-page').length).toBe(1) expect(container.querySelectorAll('.metric').length).toBe(4) }) // Metrics const metrics = container.querySelectorAll('.metric') expect(metrics[0].querySelector('.title')?.textContent).toContain( '# of Tokens', ) expect(metrics[0].querySelector('.val')?.textContent).toContain('2') expect(metrics[1].querySelector('.title')?.textContent).toContain( 'Market Cap', ) expect(metrics[1].querySelector('.val')?.textContent).toContain('$152.1M') expect(metrics[2].querySelector('.title')?.textContent).toContain( 'DEX Traded Volume (24H)', ) expect(metrics[2].querySelector('.val')?.textContent).toContain('$1.0M') expect(metrics[3].querySelector('.title')?.textContent).toContain( 'Stablecoin', ) expect(metrics[3].querySelector('.val')?.textContent).toContain('$25.9M') // Filter const filters = container.querySelectorAll('.filter-field') expect(filters.length).toBe(2) expect(filters[0].querySelector('.filter-label')?.textContent).toContain( 'Stablecoin', ) expect(filters[1].querySelector('.filter-label')?.textContent).toContain( 'Wrapped', ) // Tokens Table expect(container.querySelectorAll('.tokens-table').length).toBe(1) // Table Headers expect(container.querySelector('th.count')?.textContent).toContain('#') expect(container.querySelector('th.name-col')?.textContent).toContain( 'name', ) expect(container.querySelector('th.issuer')?.textContent).toContain( 'Issuer', ) expect(container.querySelector('th.price')?.textContent).toContain('Price') expect(container.querySelector('th.volume')?.textContent).toContain( 'Volume', ) expect(container.querySelector('th.trades')?.textContent).toContain( 'Trades', ) expect(container.querySelector('th.holders')?.textContent).toContain( 'Holders', ) expect(container.querySelector('th.tvl')?.textContent).toContain('TVL') expect(container.querySelector('th.market_cap')?.textContent).toContain( 'Market Cap', ) // Table Rows // find all table rows excluding header const rows = Array.from(container.querySelectorAll('tr')).filter( (row) => !row.querySelector('th'), ) expect(rows).toHaveLength(2) const firstRow = rows[0] expect(firstRow.querySelector('td.count')?.textContent).toContain('1') expect(firstRow.querySelector('td.name')?.textContent).toContain('SOLO') expect(firstRow.querySelector('td.issuer')?.textContent).toContain( 'Sologenic', ) expect(firstRow.querySelector('td.price')?.textContent).toContain('$0.2') expect(firstRow.querySelector('td.volume')?.textContent).toContain( '$138.7K', ) expect(firstRow.querySelector('td.trades')?.textContent).toContain('1,847') expect(firstRow.querySelector('td.holders')?.textContent).toContain( '218.1K', ) expect(firstRow.querySelector('td.tvl')?.textContent).toContain('$1.1M') expect(firstRow.querySelector('td.market-cap')?.textContent).toContain( '$91.2M', ) }) }) ================================================ FILE: src/containers/Tokens/test/mock_data/tokens.json ================================================ { "tokens": [ { "price_change": 0.746248798476897, "issuer_name": "Sologenic", "currency": "534F4C4F00000000000000000000000000000000", "daily_trades": "1847", "market_cap_usd": "91217077.26694413936", "icon": "https://s1.xrplmeta.org/icon/C40439709A.png", "ttl": 1759942477, "social_links": [], "name": "SOLO", "tvl_xrp": 373092.61469, "issuer_account": "rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz", "market_cap": "31869122.528839", "holders": 218050, "circ_supply": "398767902.72876", "price_usd": "0.22874729044826992085", "issuer_domain": "sologenic.com", "daily_volume": "48471.8879079974", "trustlines": 284089, "supply": "398767902.72876", "trust_level": 3, "price": "0.0799189762033477", "daily_volume_usd": "138738.17644578647818", "tvl_usd": "1067880.6054703056" }, { "issuer_name": "Ripple", "currency": "524C555344000000000000000000000000000000", "market_cap_usd": "91154997.79932249888", "icon": "https://s1.xrplmeta.org/icon/5CEA036903.png", "asset_class": "rwa", "ttl": 1759942477, "social_links": [], "name": "Ripple USD", "market_cap": "31847433.408562", "holders": 35893, "circ_supply": "61205633.288940", "daily_volume": "815899.306129985", "asset_subclass": "stablecoin", "daily_volume_usd": "2335299.6299774882664", "price_change": 1.82092029404823, "daily_trades": "10544", "tvl_xrp": 1358331.016864, "issuer_account": "rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De", "price_usd": "0.9994448205797025864", "issuer_domain": "https://ripple.com/", "trustlines": 70617, "supply": "91205633.2899401", "trust_level": 3, "price": "0.349182745185485", "tvl_usd": "3887869.36970881536" } ], "metrics": { "count": 2, "market_cap": "152070284.207342", "volume_24h": "1043225.609494", "rwa": "25958016.241591", "stablecoin": "25927913.484817" } } ================================================ FILE: src/containers/Tokens/tokens.scss ================================================ @use '../shared/css/variables' as *; @use '../shared/css/table'; .tokens-page { overflow: visible; width: 100%; max-width: 1500px; min-height: 150px; margin: auto; margin-top: 40px; .text-truncate { @extend %truncate; } .metrics-wrapper { padding: 16px 16px 4px; border: 1px solid $black-60; margin-right: 24px; margin-bottom: 40px; margin-left: 24px; background-color: $black-80; font-size: 12px; .metric { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; background-color: $black-80; gap: 6px; white-space: nowrap; .title { display: flex; align-items: center; color: $black-40; gap: 8px; line-height: 150%; text-transform: uppercase; white-space: nowrap; @include bold; } .val { @include bold; } } } .type { display: inline-block; margin-bottom: 80px; margin-left: 24px; color: $white; font-size: 32px; @include bold; } .count { position: sticky; } .name { position: sticky; display: inline-flex; max-width: 120px; align-items: center; gap: 4px; @include for-size(desktop-up) { gap: 8px; } .icon { width: 18px; height: 18px; flex-shrink: 0; @include for-size(desktop-up) { width: 24px; height: 24px; } } } .issuer { max-width: 140px; @include for-size(tablet-landscape-up) { max-width: 200px; } @include for-size(desktop-up) { max-width: 240px; } } .issuer-content { display: flex; overflow: hidden; width: 100%; min-width: 0; align-items: center; text-overflow: ellipsis; white-space: nowrap; .issuer-name { overflow: hidden; max-width: 60%; flex-shrink: 0; text-overflow: ellipsis; } .account { overflow: hidden; min-width: 0; flex-shrink: 1; text-overflow: ellipsis; } } .percent { display: inline-flex; align-items: center; gap: 8px; .arrow { width: 10px; height: 10px; } &.increase { color: $green-50; } &.decrease { color: $orange-50; } } .filter { display: flex; flex-wrap: wrap; align-items: center; margin-bottom: 40px; margin-left: 24px; gap: 12px; .filter-icon { width: 24px; height: 24px; flex-shrink: 0; background-image: url('../shared/images/group.svg'); } .filter-field { display: flex; flex: 0 0 auto; align-items: center; padding: 6px 12px; border: 1px solid $black-50; border-radius: $border-radius; background-color: $black; color: $white; cursor: pointer; font-size: 12px; gap: 8px; text-transform: capitalize; @include medium; .item-icon { width: 20px; height: 20px; background-size: contain; } &:hover { background-color: $black-70; } &.selected { background-color: $white; color: $black; :hover { color: $black; } .item-icon { filter: invert(1); } } } .icon-stablecoin { background: url('../shared/images/stablecoin.svg'); } .icon-rwa { background: url('../shared/images/rwa.svg'); } .icon-wrapped { background: url('../shared/images/wrapped.svg'); } .icon-memes { background: url('../shared/images/memes.svg'); } } .footnote { @include footnote; a::after { content: none !important; } } @include for-size(tablet-landscape-up) { padding-right: 24px; padding-left: 24px; .metrics-wrapper { display: flex; flex-wrap: wrap; padding: 0; border: none; margin-right: 0; margin-left: 0; background-color: transparent; gap: 32px; .metric { display: block !important; flex-direction: column; padding: 14px 20px; border-radius: $border-radius; margin-bottom: 0; @include semibold; } } table.basic { font-size: 14px; } .type { margin-left: 0; } .filter { margin-left: 0; } } @include for-size(desktop-up) { padding-right: 150px; padding-left: 150px; margin: auto; margin-top: 100px; .metrics-wrapper { font-size: 16px; } .filter { .filter-field { padding: 8px 16px; font-size: 16px; } } .type { margin-left: auto; font-size: 42px; } } } ================================================ FILE: src/containers/Transactions/DetailTab/Description.tsx ================================================ import { useTranslation, Trans } from 'react-i18next' import { FC } from 'react' import { Sequence } from '../../shared/components/Sequence' import { transactionTypes } from '../../shared/components/Transaction' import { Account } from '../../shared/components/Account' export const TransactionDescription: FC<{ data: any }> = ({ data }) => { const { t } = useTranslation() if (!data || !data.tx) { return null } // Locate the component description section of the detail tab that is unique per TransactionType. const DescriptionComponent = transactionTypes[data.tx.TransactionType]?.Description return (
{t('description')}
{t('transaction_sequence')}{' '}
{data.tx.Delegate && (
}} />
)} {DescriptionComponent && }
) } ================================================ FILE: src/containers/Transactions/DetailTab/HookDetails.tsx ================================================ import { FC } from 'react' import { Trans, useTranslation } from 'react-i18next' import { convertHexToString } from '../../../rippled/lib/utils' import { Account } from '../../shared/components/Account' import { RouteLink } from '../../shared/routing' import { TRANSACTION_ROUTE } from '../../App/routes' const renderHookParameterName = (name: string) => { // Example: // 4556520100000000000000000000000000000000000000000000000000000002 -> EVR 2 const split = name.split('0000').filter((d) => d !== '') if (split.length === 2) { return `${convertHexToString(split[0])}${Number(split[1])}` } return name } const EmitDetails: FC<{ emitDetails: any }> = ({ emitDetails }) => { const { t } = useTranslation() return (
{t('emit_details')}
  • {emitDetails.EmitCallback && (
  • )}
    ) } const HookParameter: FC<{ HookParameter: any }> = ({ HookParameter: param, }) => (
  • {renderHookParameterName(param.HookParameterName)} {': '} {param.HookParameterValue.length <= 32 ? convertHexToString(param.HookParameterValue) : param.HookParameterValue}
  • ) const HookExecution: FC<{ HookExecution: any }> = ({ HookExecution: exec }) => (
  • ) export const HookDetails: FC<{ data: { tx: any; meta: any } }> = ({ data }) => { const { tx, meta } = data const { t } = useTranslation() if (!tx.EmitDetails && !tx.HookParameters && !meta.HookExecutions) return null return (
    {t('hooks')}
    {tx.EmitDetails && } {tx.HookParameters && (
    {t('hook_parameters')}
    {tx.HookParameters.map(HookParameter)}
    )} {meta.HookExecutions && (
    {t('hook_executions')}
    {meta.HookExecutions.map(HookExecution)}
    )}
    ) } ================================================ FILE: src/containers/Transactions/DetailTab/Meta/AccountRoot.tsx ================================================ import { Trans } from 'react-i18next' import { CURRENCY_OPTIONS, XRP_BASE } from '../../../shared/transactionUtils' import { localizeNumber } from '../../../shared/utils' import { Account } from '../../../shared/components/Account' import type { MetaRenderFunction } from './types' const render: MetaRenderFunction = (t, language, action, node, index) => { const fields = node.FinalFields || node.NewFields || { Balance: 0 } const prev = node.PreviousFields || { Balance: 0 } const change = (fields.Balance - prev.Balance) / XRP_BASE const numberOption = { ...CURRENCY_OPTIONS, currency: 'XRP' } const prevBalance = localizeNumber( prev.Balance / XRP_BASE, language, numberOption, ) const finalBalance = localizeNumber( fields.Balance / XRP_BASE, language, numberOption, ) const renderLine2 = () => { if (change > 0) { return (
    • Balance increased by {localizeNumber(change, language, numberOption)} XRP from {prevBalance} XRP to {finalBalance} XRP
    ) } if (change < 0) { return (
    • Balance decreased by {localizeNumber(change, language, numberOption)} XRP from {prevBalance} XRP to {finalBalance} XRP
    ) } return null } const renderLine1 = () => fields && fields.Account ? ( <> {t('owned_account_root', { action })}{' '} ) : ( t('unowned_account_root', { action }) ) return (
  • {renderLine1()} {renderLine2()}
  • ) } export default render ================================================ FILE: src/containers/Transactions/DetailTab/Meta/DirectoryNode.tsx ================================================ import { Account } from '../../../shared/components/Account' import type { DirectoryNodeRenderFunction } from './types' const render: DirectoryNodeRenderFunction = (t, action, node, index) => { const fields = node.FinalFields || node.NewFields return (
  • {t( fields.Owner ? 'transaction_owned_directory' : 'transaction_unowned_directory', { action, }, )} {fields.Owner && ( {' '} )} {fields.DomainID && ( {t('pertaining_to_the_Permissioned_Domain')}: {fields.DomainID} )}
  • ) } export default render ================================================ FILE: src/containers/Transactions/DetailTab/Meta/MPToken.tsx ================================================ import { Trans } from 'react-i18next' import { Account } from '../../../shared/components/Account' import { computeMPTokenBalanceChange } from '../../../shared/utils' import type { MetaRenderFunction } from './types' const render: MetaRenderFunction = (_t, _language, action, node, index) => { const { previousBalance, finalBalance, account, change } = computeMPTokenBalanceChange(node) const previousBalanceStr = previousBalance.toString(10) const finalBalanceStr = finalBalance.toString(10) const changeStr = change.toString(10) const line1 = ( It {action} an MPToken node of ) const line2 = change !== BigInt(0) ? (
    • Balance changed by {changeStr} from {previousBalanceStr} to {finalBalanceStr}
    ) : null return (
  • {line1} {line2}
  • ) } export default render ================================================ FILE: src/containers/Transactions/DetailTab/Meta/MPTokenIssuance.tsx ================================================ import { Trans } from 'react-i18next' import { Account } from '../../../shared/components/Account' import { computeMPTIssuanceBalanceChange } from '../../../shared/utils' import type { MetaRenderFunction } from './types' const render: MetaRenderFunction = (_t, _language, action, node, index) => { const { previousBalance, finalBalance, account, change } = computeMPTIssuanceBalanceChange(node) const previousBalanceStr = previousBalance.toString(10) const finalBalanceStr = finalBalance.toString(10) const changeStr = change.toString(10) const line1 = ( It {action} an MPTokenIssuance node of ) const line2 = change !== BigInt(0) ? (
    • Outstanding balance changed by {changeStr} from {previousBalanceStr} to {finalBalanceStr}
    ) : null return (
  • {line1} {line2}
  • ) } export default render ================================================ FILE: src/containers/Transactions/DetailTab/Meta/Offer.tsx ================================================ import { Fragment } from 'react' import { Trans } from 'react-i18next' import { CURRENCY_ORDER, CURRENCY_OPTIONS, XRP_BASE, } from '../../../shared/transactionUtils' import { localizeNumber } from '../../../shared/utils' import { Account } from '../../../shared/components/Account' import Currency from '../../../shared/components/Currency' import type { MetaRenderFunctionWithTx, MetaNode } from './types' const normalize = (value: number | string, currency: string): string => currency === 'XRP' ? (Number(value) / XRP_BASE).toString() : String(value) const renderChanges = ( _t: any, language: string, node: MetaNode, index: number, ) => { const meta: JSX.Element[] = [] const final = node.FinalFields const prev = node?.PreviousFields const paysCurrency = final.TakerPays.currency || 'XRP' const getsCurrency = final.TakerGets.currency || 'XRP' const finalPays = final.TakerPays.value || final.TakerPays const finalGets = final.TakerGets.value || final.TakerGets const prevPays = prev?.TakerPays?.value || prev?.TakerPays const prevGets = prev?.TakerGets?.value || prev?.TakerGets const changePays = normalize(prevPays - finalPays, paysCurrency) const changeGets = normalize(prevGets - finalGets, getsCurrency) if (prevPays && finalPays) { const options = { ...CURRENCY_OPTIONS, currency: paysCurrency } meta.push(
  • TakerPays {' '} decreased by { { change: localizeNumber(changePays, language, options), } as any } from { { previous: localizeNumber( normalize(prevPays, paysCurrency), language, options, ), } as any } to { { final: localizeNumber( normalize(finalPays, paysCurrency), language, options, ), } as any }
  • , ) } if (prevGets && finalGets) { const options = { ...CURRENCY_OPTIONS, currency: getsCurrency } meta.push(
  • TakerGets {' '} decreased by { { change: localizeNumber(changeGets, language, options), } as any } from { { previous: localizeNumber( normalize(prevGets, getsCurrency), language, options, ), } as any } to { { final: localizeNumber( normalize(finalGets, getsCurrency), language, options, ), } as any }
  • , ) } return {meta} } const render: MetaRenderFunctionWithTx = ( t, language, action, node, index, tx, ) => { const lines: JSX.Element[] = [] const fields = node.FinalFields || node.NewFields const paysCurrency = fields.TakerPays.currency || 'XRP' const getsCurrency = fields.TakerGets.currency || 'XRP' const takerPaysValue = normalize( fields.TakerPays.value || fields.TakerPays, paysCurrency, ) const invert = CURRENCY_ORDER.indexOf(getsCurrency) > CURRENCY_ORDER.indexOf(paysCurrency) if ( action === 'created' && tx.TransactionType === 'OfferCreate' && tx.Account === fields.Account && tx.Sequence === fields.Sequence && tx.OfferSequence ) { lines.push(
  • {t('offer_replaces')} {tx.OfferSequence}
  • , ) } else if (action === 'modified') { lines.push(
  • {t('offer_partially_filled')}
  • , ) lines.push(renderChanges(t, language, node, index)) } else if (action === 'deleted' && takerPaysValue === '0') { lines.push(
  • {t('offer_filled')}
  • , ) lines.push(renderChanges(t, language, node, index)) } else if (action === 'deleted' && tx.TransactionType === 'OfferCancel') { lines.push(
  • {t('offer_cancelled')}
  • , ) } else if ( action === 'deleted' && tx.TransactionType === 'OfferCreate' && tx.Account === fields.Account && tx.OfferSequence === fields.Sequence ) { lines.push(
  • {t('offer_replaced')} {tx.Sequence}
  • , ) } else if (action === 'deleted') { lines.push(
  • {t('offer_lack_of_funds')}
  • , ) lines.push(renderChanges(t, language, node, index)) } return (
  • ), Currency2: ( ), Account: , }} />
      {lines}
  • ) } export default render ================================================ FILE: src/containers/Transactions/DetailTab/Meta/PayChannel.tsx ================================================ import { Trans } from 'react-i18next' import { CURRENCY_OPTIONS } from '../../../shared/transactionUtils' import { localizeNumber } from '../../../shared/utils' import { Account } from '../../../shared/components/Account' import type { MetaRenderFunction } from './types' const MILLION = 1000000 const render: MetaRenderFunction = (_t, language, action, node, index) => { const fields = node.FinalFields || node.NewFields const prev = node.PreviousFields const numberOption = { ...CURRENCY_OPTIONS, currency: 'XRP' } const prevBalance = prev && prev.Balance ? prev.Balance : null const prevAmount = prev && prev.Amount ? prev.Amount : null const line1 = ( It {action} a PayChannel node from to ) const line2 = prevBalance ? (
  • Balance changed by {localizeNumber( (fields.Balance - prevBalance) / MILLION, language, numberOption, )} XRP from {localizeNumber(prevBalance / MILLION, language, numberOption)} XRP to {localizeNumber(fields.Balance / MILLION, language, numberOption)} XRP
  • ) : null const line3 = prevAmount ? (
  • Amount changed by {localizeNumber( (fields.Amount - prevAmount) / MILLION, language, numberOption, )} XRP from {localizeNumber(prevAmount / MILLION, language, numberOption)} XRP to {localizeNumber(fields.Amount / MILLION, language, numberOption)} XRP
  • ) : null return (
  • {line1} {line2 || line3 ? (
      {line2} {line3}
    ) : null}
  • ) } export default render ================================================ FILE: src/containers/Transactions/DetailTab/Meta/RippleState.tsx ================================================ import { Trans } from 'react-i18next' import { Account } from '../../../shared/components/Account' import { localizeNumber, computeRippleStateBalanceChange, } from '../../../shared/utils' import Currency from '../../../shared/components/Currency' import type { MetaRenderFunction } from './types' const render: MetaRenderFunction = (_t, language, action, node, index) => { const { change, numberOption, previousBalance, finalBalance, currency, account, counterAccount, } = computeRippleStateBalanceChange(node) const line1 = ( It {action} a{' '} RippleState node between and ) const line2 = change ? (
    • Balance changed by {localizeNumber(change, language, numberOption)} from {localizeNumber(previousBalance, language, numberOption)} to {localizeNumber(finalBalance, language, numberOption)}
    ) : null return (
  • {line1} {line2}
  • ) } export default render ================================================ FILE: src/containers/Transactions/DetailTab/Meta/index.tsx ================================================ import { FC } from 'react' import { useTranslation } from 'react-i18next' import { TFunction } from 'i18next' import renderAccountRoot from './AccountRoot' import renderDirectoryNode from './DirectoryNode' import renderOffer from './Offer' import renderRippleState from './RippleState' import renderPayChannel from './PayChannel' import renderMPToken from './MPToken' import renderMPTokenIssuance from './MPTokenIssuance' import { groupAffectedNodes } from '../../../shared/transactionUtils' import { useLanguage } from '../../../shared/hooks' const renderDefault = ( t: TFunction<'translations', undefined>, action: string, node: any, index: number, ) => (
  • {t('node_meta_type', { action })} {node.LedgerEntryType}
  • ) export const TransactionMeta: FC<{ data: any }> = ({ data }) => { const language = useLanguage() const { t } = useTranslation() const renderNodesMeta = (action: string, list: any[], tx: any) => { const meta = list.map((node, index) => { switch (node.LedgerEntryType) { case 'AccountRoot': return renderAccountRoot(t, language, action, node, index) case 'DirectoryNode': return renderDirectoryNode(t, action, node, index) case 'Offer': return renderOffer(t, language, action, node, index, tx) case 'RippleState': return renderRippleState(t, language, action, node, index) case 'PayChannel': return renderPayChannel(t, language, action, node, index) case 'MPTokenIssuance': return renderMPTokenIssuance(t, language, action, node, index) case 'MPToken': return renderMPToken(t, language, action, node, index) default: return renderDefault(t, action, node, index) } }) return ( meta.length !== 0 && (
    {t('nodes_type', { action })}
      {meta}
    ) ) } const affectedNodes = groupAffectedNodes(data) return (
    {t('meta')}
    {t('number_of_affected_node', { count: data.meta.AffectedNodes.length, })}
    {renderNodesMeta('created', affectedNodes.created, data.tx)} {renderNodesMeta('modified', affectedNodes.modified, data.tx)} {renderNodesMeta('deleted', affectedNodes.deleted, data.tx)}
    ) } ================================================ FILE: src/containers/Transactions/DetailTab/Meta/types.ts ================================================ // Union type for all possible node types - using any to handle the different field structures export type MetaNode = any // Render function signatures for Meta components export type MetaRenderFunction = ( t: any, language: string, action: string, node: MetaNode, index: number, ) => JSX.Element export type MetaRenderFunctionWithTx = ( t: any, language: string, action: string, node: MetaNode, index: number, tx: any, ) => JSX.Element export type DirectoryNodeRenderFunction = ( t: any, action: string, node: MetaNode, index: number, ) => JSX.Element ================================================ FILE: src/containers/Transactions/DetailTab/detailTab.scss ================================================ @use '../../shared/css/variables' as *; .detail-body { margin-top: 20px; color: $black-40; font-size: 12px; letter-spacing: 0px; .detail-section { padding: 5px 15px; border-bottom: 1px solid $black-70; margin: 0px 0px 30px; &:last-child { border: none; } li { overflow-wrap: break-word; } @include for-size(tablet-landscape-up) { width: 552px; } @include for-size(desktop-up) { width: 772px; } @include for-size(big-desktop-up) { width: 882px; } b { color: $black-30; @include medium; small { margin-left: 5px; } } ul { padding: 0px 30px; margin: 0px; li { ul { list-style: square; } li { margin: 0px; font-size: 14px; } } } .flags { font-style: italic; } .title { margin-bottom: 4px; color: $white; font-size: 16px; text-transform: capitalize; @include bold; span { margin-left: 8px; font-size: 10px; line-height: 18px; } } .detail-subtitle { margin-top: 16px; margin-bottom: 2px; color: $black-40; font-size: 14px; text-transform: uppercase; @include medium; } .ledger { @include medium; } .tx-result.fail { color: $orange-40; } .time { color: $blue-purple-30; } .hash { @include medium; } .condition, .fulfillment, .channel, .regular-key, .email, .message-key { color: $blue-purple-30; font-size: 13px; word-break: break-all; } .domain { color: $blue-purple-30; } .flag { color: $blue-purple-30; font-style: italic; } .account { font-size: 11px; @include bold; } .signers { margin: 5px 0px; list-style: decimal; li { margin: 2px; .label { font-size: 12px; text-transform: uppercase; } } } } } ================================================ FILE: src/containers/Transactions/DetailTab/index.tsx ================================================ import { FC } from 'react' import { Trans, useTranslation } from 'react-i18next' import { TransactionMeta } from './Meta' import { TransactionDescription } from './Description' import { Account } from '../../shared/components/Account' import { localizeDate, localizeNumber } from '../../shared/utils' import { DATE_OPTIONS, CURRENCY_OPTIONS, SUCCESSFUL_TRANSACTION, XRP_BASE, buildFlags, buildMemos, } from '../../shared/transactionUtils' import './detailTab.scss' import { useLanguage } from '../../shared/hooks' import { HookDetails } from './HookDetails' import { RouteLink } from '../../shared/routing' import { LEDGER_ROUTE } from '../../App/routes' export const DetailTab: FC<{ data: any }> = ({ data }) => { const { t } = useTranslation() const language = useLanguage() const renderStatus = () => { const { TransactionResult } = data.meta const time = localizeDate(new Date(data.date), language, DATE_OPTIONS) let line1 if (TransactionResult === SUCCESSFUL_TRANSACTION) { line1 = t('successful_transaction') } else { line1 = ( ) } return (
    {t('status')}
    {line1} {t('transaction_validated')} {data.ledger_index} {t('on')} {`${time} ${DATE_OPTIONS.timeZone}`}
    ) } const renderMemos = () => { const memos = buildMemos(data) return memos.length ? (
    {t('memos')} ({t('decoded_hex')})
    {memos.map((memo) => (
    {memo}
    ))}
    ) : null } const renderFee = () => { const numberOptions = { ...CURRENCY_OPTIONS, currency: 'XRP' } const totalCost = data.tx.Fee ? localizeNumber( Number.parseFloat(data.tx.Fee) / XRP_BASE, language, numberOptions, ) : null return ( totalCost && (
    {t('transaction_cost')}
    {t('transaction_consumed_fee')} {totalCost} XRP
    ) ) } const renderFlags = () => { const flags = buildFlags(data) return flags.length ? (
    {t('flags')}
    {flags.map((flag) => (
    {flag}
    ))}
    ) : null } const renderSigners = () => data.tx.Signers ? (
    {t('signers')}
      {data.tx.Signers.map((d) => (
    • ))}
    ) : null return (
    {renderStatus()} {renderSigners()} {renderFlags()} {renderFee()} {renderMemos()}
    ) } ================================================ FILE: src/containers/Transactions/Simple/index.tsx ================================================ import { FC } from 'react' import { ErrorBoundary } from 'react-error-boundary' import { useTranslation } from 'react-i18next' import { transactionTypes } from '../../shared/components/Transaction' import { DefaultSimple } from '../../shared/components/Transaction/DefaultSimple' export const Simple: FC<{ data: any type: string }> = ({ data, type }) => { // Locate the component for the left side of the simple tab that is unique per TransactionType. const { t } = useTranslation() const SimpleComponent = transactionTypes[type]?.Simple if (SimpleComponent) { return (
    {t('component_error')}
    {t('try_detailed_raw')}
    } > ) } return } ================================================ FILE: src/containers/Transactions/SimpleTab.tsx ================================================ import { FC } from 'react' import { useTranslation } from 'react-i18next' import { localizeDate, localizeNumber, BREAKPOINTS } from '../shared/utils' import { Account } from '../shared/components/Account' import { Sequence } from '../shared/components/Sequence' import { Simple } from './Simple' import { useLanguage } from '../shared/hooks' import { RouteLink } from '../shared/routing' import { CURRENCY_OPTIONS, XRP_BASE } from '../shared/transactionUtils' import { SimpleRow } from '../shared/components/Transaction/SimpleRow' import '../shared/css/simpleTab.scss' import './simpleTab.scss' import { LEDGER_ROUTE } from '../App/routes' const TIME_ZONE = 'UTC' const DATE_OPTIONS = { hour: 'numeric', minute: 'numeric', second: 'numeric', year: 'numeric', month: 'numeric', day: 'numeric', hour12: true, timeZone: TIME_ZONE, } export const SimpleTab: FC<{ data: any; width: number }> = ({ data, width, }) => { const { t } = useTranslation() const language = useLanguage() const renderRowIndex = ( time, ledgerIndex, fee, account, delegate, sequence, ticketSequence, isHook, ) => ( <> {time} {ledgerIndex} {account && ( )} {delegate && ( )} {fee} ) const { processed } = data const numberOptions = { ...CURRENCY_OPTIONS, currency: 'XRP' } const time = localizeDate(new Date(processed.date), language, DATE_OPTIONS) const ledgerIndex = processed.ledger_index const fee = processed.tx.Fee ? localizeNumber( Number.parseFloat(processed.tx.Fee) / XRP_BASE, language, numberOptions, ) : 0 const rowIndex = renderRowIndex( time, ledgerIndex, fee, processed.tx.Account, processed.tx.Delegate, processed.tx.Sequence, processed.tx.TicketSequence, !!processed.tx.EmitDetails, ) return (
    {width < BREAKPOINTS.landscape && rowIndex}
    {width >= BREAKPOINTS.landscape && (
    {rowIndex}
    )}
    ) } ================================================ FILE: src/containers/Transactions/index.tsx ================================================ import { useContext, useEffect } from 'react' import { Helmet } from 'react-helmet-async' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { useWindowSize } from 'usehooks-ts' import NoMatch from '../NoMatch' import { Loader } from '../shared/components/Loader' import { Tabs } from '../shared/components/Tabs' import { NOT_FOUND, BAD_REQUEST, HASH256_REGEX, CTID_REGEX, } from '../shared/utils' import { SimpleTab } from './SimpleTab' import { DetailTab } from './DetailTab' import './transaction.scss' import { AnalyticsFields, useAnalytics } from '../shared/analytics' import SocketContext from '../shared/SocketContext' import { TxStatus } from '../shared/components/TxStatus' import { getAction, getCategory } from '../shared/components/Transaction' import { buildPath, useRouteParams } from '../shared/routing' import { SUCCESSFUL_TRANSACTION } from '../shared/transactionUtils' import { getTransaction } from '../../rippled' import { TRANSACTION_ROUTE } from '../App/routes' import { JsonView } from '../shared/components/JsonView' const WRONG_NETWORK = 406 const ERROR_MESSAGES: Record = {} ERROR_MESSAGES[NOT_FOUND] = { title: 'transaction_not_found', hints: ['server_ledgers_hint', 'check_transaction_hash'], } ERROR_MESSAGES[BAD_REQUEST] = { title: 'invalid_transaction_hash', hints: ['check_transaction_hash'], } ERROR_MESSAGES[WRONG_NETWORK] = { title: 'wrong_network', hints: ['check_transaction_hash'], } ERROR_MESSAGES.default = { title: 'generic_error', hints: ['not_your_fault'], } const getErrorMessage = (error) => ERROR_MESSAGES[error] || ERROR_MESSAGES.default export const Transaction = () => { const { identifier = '', tab = 'simple' } = useRouteParams(TRANSACTION_ROUTE) const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const { trackException, trackScreenLoaded } = useAnalytics() const { isLoading, data, error, isError } = useQuery( ['transaction', identifier], () => { if (identifier === '') { return undefined } if (HASH256_REGEX.test(identifier) || CTID_REGEX.test(identifier)) { return getTransaction(identifier, rippledSocket).catch( (transactionRequestError) => { const status = transactionRequestError.code trackException( `transaction ${identifier} --- ${JSON.stringify( transactionRequestError.message, )}`, ) return Promise.reject(status) }, ) } return Promise.reject(BAD_REQUEST) }, ) const { width } = useWindowSize() useEffect(() => { if (!data?.processed) return const type = data?.processed.tx.TransactionType const status = data?.processed.meta.TransactionResult const transactionProperties: AnalyticsFields = { transaction_action: getAction(type), transaction_category: getCategory(type), transaction_type: type, } if (status !== SUCCESSFUL_TRANSACTION) { transactionProperties.tec_code = status } trackScreenLoaded(transactionProperties) }, [identifier, data?.processed, tab, trackScreenLoaded]) function renderSummary() { const type = data?.processed.tx.TransactionType return (
    {type}
    {t('hash')}:
    {data?.processed.hash}
    {data?.processed.tx.ctid && (
    CTID:
    {data.processed.tx.ctid}
    )}
    ) } function renderTabs() { const tabs = ['simple', 'detailed', 'raw'] const mainPath = buildPath(TRANSACTION_ROUTE, { identifier }) return } function renderTransaction() { if (!data) return undefined let body switch (tab) { case 'detailed': body = break case 'raw': body = break default: body = break } return ( <> {renderSummary()} {renderTabs()}
    {body}
    ) } let body if (isError) { const message = getErrorMessage(error) body = } else if (data?.processed && data?.processed.hash) { body = renderTransaction() } else if (!identifier) { body = ( ) } return (
    {isLoading && } {body}
    ) } ================================================ FILE: src/containers/Transactions/simpleTab.scss ================================================ @use '../shared/css/variables' as *; $subdued-color: $black-40; .simple-body-tx { .rows { padding-top: 0px; .groups-title { display: block; flex-direction: row; color: $black-40; font-size: 14px; font-weight: 600; text-transform: uppercase; } .partial-row { display: flex; overflow: hidden; flex-grow: 1; flex-wrap: wrap; padding-top: 20px; padding-left: 5px; color: $red-dark; float: right; font-size: 14px; font-style: italic; text-align: right; vertical-align: middle; @include regular; } .row { .value { text-align: right; .grant { .account { padding-bottom: 8px; font-size: 11px; text-align: right; @include medium; } } .amount { text-align: right; .amount-localized { display: block; } .one-line { display: flex; } .currency { display: block; } .currency, .one-line { margin: -1px 0px -16px; color: $subdued-color; font-size: 11px; text-align: right; @include medium; .account { font-size: inherit; line-height: inherit; vertical-align: bottom; } } &.list { margin-bottom: 12px; .one-line { justify-content: flex-end; margin: -1px 0px 0px; } } } ul { padding: 0; margin: 0; list-style: none; } &.flex-column { display: flex; flex-direction: column; } &.partial, &.closed, &.unset { color: $red-dark; font-size: 14px; font-style: italic; @include regular; } &.flag { color: $blue-purple-30; font-size: 14px; font-style: italic; @include regular; } &.condition, &.fulfillment, &.tx, &.channel { width: calc(100% - 120px); color: $subdued-color; font-size: 14px; white-space: normal; word-break: break-all; @include regular; } } &:first-child { padding-top: 40px; } } .error { padding: 50px; color: $orange-40; font-size: 14px; text-align: center; .type { margin: 0 5px; @include bold; } } .group { margin: 16px 0 16px -16px; background: rgba($black-80, 0.7); gap: 15px; &:first-child { margin-top: 0px; } &:last-child { margin-bottom: 0px; } .group-title { display: block; flex-direction: row; padding: 16px 0 0 16px; color: $black-40; font-size: 14px; font-weight: 600; text-transform: uppercase; } .row { padding: 16px 28px 12px 16px; &:last-child { padding-bottom: 16px; border: none; } } } } } ================================================ FILE: src/containers/Transactions/test/Description.test.tsx ================================================ import { render } from '@testing-library/react' import { BrowserRouter as Router } from 'react-router' import { I18nextProvider } from 'react-i18next' import { QueryClientProvider } from 'react-query' import i18n from '../../../i18n/testConfigEnglish' import { TransactionDescription } from '../DetailTab/Description' import Transaction from './mock_data/Transaction.json' import OfferCreateTicket from './mock_data/OfferCreateTicket.json' import EmittedPayment from './mock_data/EmittedPayment.json' import DelegatePayment from './mock_data/DelegatePayment.json' import { queryClient } from '../../shared/QueryClient' describe('Description container', () => { const renderDescription = (data = {}) => render( , ) it('renders without crashing', () => { renderDescription() }) it('renders transaction', () => { renderDescription(Transaction) }) it('renders sequence number with ticket', () => { const { container } = renderDescription(OfferCreateTicket) expect( container.querySelector('[data-testid="sequence"]'), ).toHaveTextContent('79469284 (a Ticket was used for this Transaction)') }) it('renders sequence number with hook', () => { const { container } = renderDescription(EmittedPayment) expect( container.querySelector('[data-testid="sequence"]'), ).toHaveTextContent('0 (this Transaction was emitted by a Hook)') }) it('renders delegate', () => { const { container } = renderDescription(DelegatePayment) expect( container.querySelector('[data-testid="delegate"]'), ).toHaveTextContent( 'The transaction is delegated to rNRfqQc9b9ehXJJYVR6NqPPwrS26tWeB6N', ) }) }) ================================================ FILE: src/containers/Transactions/test/DetailTab.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { BrowserRouter as Router } from 'react-router' import { I18nextProvider } from 'react-i18next' import { QueryClientProvider } from 'react-query' import Transaction from './mock_data/EscrowCreate.json' import FailedTransaction from '../../shared/components/Transaction/SignerListSet/test/mock_data/SignerListSet.json' import HookPayment from './mock_data/HookPayment.json' import EmittedPayment from './mock_data/EmittedPayment.json' import TrustSet from './mock_data/TrustSet.json' import { DetailTab } from '../DetailTab' import i18n from '../../../i18n/testConfigEnglish' import { convertHexToString } from '../../../rippled/lib/utils' import { queryClient } from '../../shared/QueryClient' describe('DetailTab container', () => { const renderDetailTab = (transaction: any = Transaction) => render( , ) it('renders without crashing', () => { renderDetailTab() }) it('renders all parts', () => { const { container } = renderDetailTab() expect(container.querySelector('.detail-body')).toBeInTheDocument() expect(screen.getByText('Status')).toBeInTheDocument() expect(screen.getByText('Description')).toBeInTheDocument() expect(screen.getByText('Memos')).toBeInTheDocument() expect(screen.getByText('Transaction Cost')).toBeInTheDocument() expect(screen.getByText('Flags')).toBeInTheDocument() expect(screen.getByText('Meta')).toBeInTheDocument() }) it('renders failed transaction', () => { const { container } = renderDetailTab(FailedTransaction) expect( container.querySelector('.detail-section[data-testid="status"]'), ).toHaveTextContent( 'This transaction failed with a status code of tecINSUFFICIENT_RESERVE, and validated in ledger 37375929 on', ) expect( container.querySelector('.detail-section[data-testid="status"] .fail'), ).toHaveTextContent('tecINSUFFICIENT_RESERVE') }) it('renders hooks section', () => { const { container } = renderDetailTab(HookPayment) const hooksSection = container.querySelector( '.detail-section[data-testid="hooks"]', ) expect(hooksSection).toBeInTheDocument() expect( hooksSection?.querySelector( '.detail-subsection[data-testid="emit-details"]', ), ).not.toBeInTheDocument() const paramWrapper = hooksSection?.querySelector( '.detail-subsection[data-testid="hook-params"]', ) expect(paramWrapper).toBeInTheDocument() const paramItems = paramWrapper?.querySelectorAll('li') expect(paramItems).toHaveLength(2) expect(paramItems?.[0]).toHaveTextContent('EVR\x012: evnHostUpdateReg') expect(paramItems?.[1]).toHaveTextContent( 'EVR\x013: 0000000000000000000000000000000000000000000000000000000000000000000000350C00EE110000506A05000500000000000000000000000000000000000000000000000000000000000000000000060300000000000000000000000000000000000000000000000000000000000000000000000000000000', ) const execWrapper = hooksSection?.querySelector( '.detail-subsection[data-testid="hook-executions"]', ) expect(execWrapper).toBeInTheDocument() expect(execWrapper?.querySelectorAll('li')).toHaveLength(1) const detailLines = execWrapper?.querySelectorAll('.detail-line') expect(detailLines).toHaveLength(4) expect(detailLines?.[0]).toHaveTextContent( 'It triggered the hook BF8F18C5D5E9F8281BA5489076BE10EC095C80E9CE003BB2D6957DD81D025C02', ) expect(detailLines?.[1]).toHaveTextContent( 'On the account rQUhXd7sopuga3taru3jfvc1BgVbscrb1X', ) expect(detailLines?.[1]?.querySelector('a')).toBeInTheDocument() expect(detailLines?.[2]).toHaveTextContent( `Returned the code 0x1f6 with string "${convertHexToString( '2E2F7372632F72656769737472792E6300', )}"`, ) expect(detailLines?.[3]).toHaveTextContent('Emitted 0 transactions') }) it('renders hooks section for emitted tx', () => { const { container } = renderDetailTab(EmittedPayment) const hooksSection = container.querySelector( '.detail-section[data-testid="hooks"]', ) expect(hooksSection).toBeInTheDocument() const emitWrapper = hooksSection?.querySelector( '.detail-subsection[data-testid="emit-details"]', ) expect(emitWrapper).toBeInTheDocument() const emitLines = emitWrapper?.querySelectorAll('.detail-line') expect(emitLines).toHaveLength(4) expect(emitLines?.[0]).toHaveTextContent( 'Number 1 in the line of generated transactions', ) expect(emitLines?.[1]).toHaveTextContent( 'Emitted by the hook A9B5411F4A4368008B4736EEE47A34B0EFCBE74016B9B94CC6208FBC0BF5C0C2', ) expect(emitLines?.[2]).toHaveTextContent( 'Emitted by a hook triggered by D6DB0B8D9C864FB7B46A154BC57C7D17D9BD59C80FFD...', ) expect(emitLines?.[2]?.querySelector('a')).toBeInTheDocument() expect(emitLines?.[3]).toHaveTextContent( 'The emit callback is rMPwD1b8dJUaqZHaBgEvFx4ENhtpPVvDsv', ) expect(emitLines?.[3]?.querySelector('a')).toBeInTheDocument() expect( hooksSection?.querySelector( '.detail-subsection[data-testid="hook-params"]', ), ).not.toBeInTheDocument() const execWrapper = hooksSection?.querySelector( '.detail-subsection[data-testid="hook-executions"]', ) expect(execWrapper).toBeInTheDocument() expect(execWrapper?.querySelectorAll('li')).toHaveLength(1) const detailLines = execWrapper?.querySelectorAll('.detail-line') expect(detailLines).toHaveLength(4) expect(detailLines?.[0]).toHaveTextContent( 'It triggered the hook A9B5411F4A4368008B4736EEE47A34B0EFCBE74016B9B94CC6208FBC0BF5C0C2', ) expect(detailLines?.[1]).toHaveTextContent( 'On the account rMPwD1b8dJUaqZHaBgEvFx4ENhtpPVvDsv', ) expect(detailLines?.[1]?.querySelector('a')).toBeInTheDocument() expect(detailLines?.[2]).toHaveTextContent( `Returned the code 0x8000000000000001 with string ""`, ) expect(detailLines?.[3]).toHaveTextContent('Emitted 0 transactions') }) it('renders flags', () => { const { container } = renderDetailTab(TrustSet) const expectedFlags = new Set([ 'tfFullyCanonicalSig', 'tfSetDeepFreeze', 'tfSetFreeze', 'tfSetAuth', ]) expect(screen.getByText('Flags')).toBeInTheDocument() const flagsContainer = container.querySelector('.detail-section .flags') expect(flagsContainer?.children).toHaveLength(expectedFlags.size) const renderedFlags = Array.from(flagsContainer?.children || []).map( (node) => node.textContent, ) expect(new Set(renderedFlags)).toEqual(expectedFlags) }) }) ================================================ FILE: src/containers/Transactions/test/Meta.test.tsx ================================================ import { render } from '@testing-library/react' import { BrowserRouter as Router } from 'react-router' import { I18nextProvider } from 'react-i18next' import i18n from '../../../i18n/testConfig' import Transaction from './mock_data/Transaction.json' import OfferCancel from '../../shared/components/Transaction/OfferCancel/test/mock_data/OfferCancel.json' import OfferCreateWithMissingPreviousFields from '../../shared/components/Transaction/OfferCreate/test/mock_data/OfferCreateWithMissingPreviousFields.json' import PaymentChannelClaim from '../../shared/components/Transaction/PaymentChannelClaim/test/mock_data/PaymentChannelClaim.json' import DirectMPTPayment from './mock_data/DirectMPTPayment.json' import { TransactionMeta } from '../DetailTab/Meta' import OfferCreateWithPermissionedDomainID from '../../shared/components/Transaction/OfferCreate/test/mock_data/OfferCreateWithPermissionedDomainID.json' describe('TransactionMeta container', () => { const renderMeta = (data: any = Transaction) => render( , ) it('renders without crashing', () => { renderMeta() }) it('renders Meta', () => { const { container } = renderMeta() expect(container.querySelectorAll('.title').length).toBe(1) expect(container.querySelectorAll('.detail-subsection').length).toBe(1) expect(container.textContent).toContain('number_of_affected_node') expect(container.querySelector('.detail-subtitle')).toHaveTextContent( 'nodes_type', ) expect(container.querySelectorAll('li').length).toBe(23) const listItems = container.querySelectorAll('li') // Check first list item contains expected content (AccountRoot) expect(listItems[0]).toHaveTextContent('owned_account_root') expect(listItems[0]).toHaveTextContent('rUmustd4TbkjaEuS7S1damozpBEREgRz9z') expect(listItems[0]).toHaveTextContent('Balance decreased by') // Check balance change content expect(listItems[1]).toHaveTextContent('Balance decreased by') // Check second account root expect(listItems[2]).toHaveTextContent('owned_account_root') expect(listItems[2]).toHaveTextContent('rPt8rwFrsucmjdKfjwRHGz9iZGxxN2cLYh') // Check balance decrease expect(listItems[3]).toHaveTextContent('Balance decreased by') // Check third account root with balance increase expect(listItems[4]).toHaveTextContent('owned_account_root') expect(listItems[4]).toHaveTextContent('rEGoBvzusE2MkDn3yrgZc817XiwRofqoJq') expect(listItems[4]).toHaveTextContent('Balance increased by') expect(listItems[5]).toHaveTextContent('Balance increased by') // Check directory node expect(listItems[6]).toHaveTextContent('transaction_owned_directory') expect(listItems[6]).toHaveTextContent('rETx8GBiH6fxhTcfHM9fGeyShqxozyD3xe') // Check first offer modification expect(listItems[7]).toHaveTextContent('offer_node_meta') expect(listItems[8]).toHaveTextContent('offer_partially_filled') expect(listItems[9]).toHaveTextContent('TakerPays') expect(listItems[9]).toHaveTextContent('XRP') expect(listItems[10]).toHaveTextContent('TakerGets') expect(listItems[10]).toHaveTextContent('CNY') expect(listItems[10]).toHaveTextContent( 'rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y', ) // Check second offer modification expect(listItems[11]).toHaveTextContent('offer_node_meta') expect(listItems[12]).toHaveTextContent('offer_partially_filled') expect(listItems[13]).toHaveTextContent('TakerPays') expect(listItems[13]).toHaveTextContent('CNY') expect(listItems[14]).toHaveTextContent('TakerGets') expect(listItems[14]).toHaveTextContent('XRP') // Check ripplestate nodes expect(listItems[15]).toHaveTextContent('CNY') expect(listItems[15]).toHaveTextContent('RippleState') expect(listItems[15]).toHaveTextContent( 'rUmustd4TbkjaEuS7S1damozpBEREgRz9z', ) expect(listItems[16]).toHaveTextContent('Balance changed by') expect(listItems[17]).toHaveTextContent('CNY') expect(listItems[17]).toHaveTextContent('RippleState') expect(listItems[18]).toHaveTextContent('Balance changed by') expect(listItems[19]).toHaveTextContent('CNY') expect(listItems[19]).toHaveTextContent('RippleState') expect(listItems[20]).toHaveTextContent('Balance changed by') expect(listItems[21]).toHaveTextContent('CNY') expect(listItems[21]).toHaveTextContent('RippleState') expect(listItems[22]).toHaveTextContent('Balance changed by') }) it('renders OfferCancel Meta', () => { const { container } = renderMeta(OfferCancel) expect(container.querySelectorAll('.title').length).toBe(1) expect(container.querySelectorAll('.detail-subsection').length).toBe(2) expect(container.textContent).toContain('number_of_affected_node') expect(container.querySelector('.detail-subtitle')).toHaveTextContent( 'nodes_type', ) expect(container.querySelectorAll('li').length).toBe(6) }) it('renders OfferCreate Meta with missing PreviousFields', () => { const { container } = renderMeta(OfferCreateWithMissingPreviousFields) expect(container.querySelectorAll('.title').length).toBe(1) expect(container.querySelectorAll('.detail-subsection').length).toBe(2) expect(container.textContent).toContain('number_of_affected_node') expect(container.querySelector('.detail-subtitle')).toHaveTextContent( 'nodes_type', ) expect(container.querySelectorAll('li').length).toBe(5291) }) it('renders PayChannel Meta', () => { const { container } = renderMeta(PaymentChannelClaim) expect(container.querySelectorAll('.title').length).toBe(1) expect(container.querySelectorAll('.detail-subsection').length).toBe(1) expect(container.textContent).toContain('number_of_affected_node') expect(container.querySelector('.detail-subtitle')).toHaveTextContent( 'nodes_type', ) expect(container.querySelectorAll('li').length).toBe(4) }) it('renders MPT Payment Meta', () => { const { container } = renderMeta(DirectMPTPayment) expect(container.querySelectorAll('.title').length).toBe(1) expect(container.querySelectorAll('.detail-subsection').length).toBe(1) expect(container.textContent).toContain('number_of_affected_node') expect(container.querySelector('.detail-subtitle')).toHaveTextContent( 'nodes_type', ) const listItems = container.querySelectorAll('li') expect(listItems.length).toBe(6) // Check MPToken node modification expect(listItems[2]).toHaveTextContent('MPToken') expect(listItems[2]).toHaveTextContent('rnNkvddM96FE2QsaFztLAn5xicjq5d6d8d') expect(listItems[2]).toHaveTextContent('Balance changed by') expect(listItems[3]).toHaveTextContent('Balance changed by') expect(listItems[3]).toHaveTextContent('100') // Check MPTokenIssuance node modification expect(listItems[4]).toHaveTextContent('MPTokenIssuance') expect(listItems[4]).toHaveTextContent('rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw') expect(listItems[4]).toHaveTextContent('Outstanding balance changed by') expect(listItems[5]).toHaveTextContent('Outstanding balance changed by') expect(listItems[5]).toHaveTextContent('100') }) it(`renders OfferCreate Meta with a Permissioned Domain ID`, () => { const { container } = renderMeta(OfferCreateWithPermissionedDomainID) expect(container.innerHTML).toContain( 'Domain: 4A4879496CFF23CA32242D50DA04DDB41F4561167276A62AF21899F83DF28812', ) }) }) ================================================ FILE: src/containers/Transactions/test/SimpleTab.test.tsx ================================================ import { render, cleanup } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import EnableAmendment from './mock_data/EnableAmendment.json' import Payment from '../../shared/components/Transaction/Payment/test/mock_data/Payment.json' import DelegatePayment from './mock_data/DelegatePayment.json' import { SimpleTab } from '../SimpleTab' import summarize from '../../../rippled/lib/txSummary' import i18n from '../../../i18n/testConfig' import { expectSimpleRowText } from '../../shared/components/Transaction/test' import SocketContext from '../../shared/SocketContext' import MockWsClient from '../../test/mockWsClient' import { queryClient } from '../../shared/QueryClient' describe('SimpleTab container', () => { let client const renderSimpleTab = (tx: any, width = 1200) => render( , ) beforeEach(() => { client = new MockWsClient() }) afterEach(() => { client.close() cleanup() }) it('renders EnableAmendment without crashing', () => { renderSimpleTab(EnableAmendment) }) it('renders simple tab information', () => { const { container } = renderSimpleTab(Payment) expect(container.querySelectorAll('.simple-body').length).toBe(1) expect(container.querySelectorAll('a').length).toBe(3) expectSimpleRowText(container, 'tx-date', '3/23/2018, 1:34:51 PM') expectSimpleRowText(container, 'ledger-index', '37432866') expectSimpleRowText( container, 'account', 'rNQEMJA4PsoSrZRn9J6RajAYhcDzzhf8ok', ) expectSimpleRowText(container, 'sequence', '31030') expectSimpleRowText(container, 'tx-cost', '\uE9000.15') }) it('renders simple tab information with delegate', () => { const { container } = renderSimpleTab(DelegatePayment) expect(container.querySelectorAll('.simple-body').length).toBe(1) expect(container.querySelectorAll('a').length).toBe(4) expectSimpleRowText(container, 'tx-date', '5/20/2025, 6:23:20 PM') expectSimpleRowText(container, 'ledger-index', '2947137') expectSimpleRowText( container, 'account', 'rfFLs8ZknoJKHCw7MtJKcs8GL81dqoDGRz', ) expectSimpleRowText( container, 'delegate', 'rNRfqQc9b9ehXJJYVR6NqPPwrS26tWeB6N', ) expectSimpleRowText(container, 'sequence', '2947132') expectSimpleRowText(container, 'tx-cost', '\uE9000.000001') }) }) ================================================ FILE: src/containers/Transactions/test/Transaction.test.tsx ================================================ import { render, waitFor } from '@testing-library/react' import { Route } from 'react-router' import mockTransaction from './mock_data/Transaction.json' import mockTransactionSummary from './mock_data/TransactionSummary.json' import i18n from '../../../i18n/testConfig' import { Transaction } from '../index' import { getTransaction } from '../../../rippled' import { Error as RippledError } from '../../../rippled/lib/utils' import { QuickHarness } from '../../test/utils' import Mock = jest.Mock jest.mock('../../../rippled', () => { const originalModule = jest.requireActual('../../../rippled') return { __esModule: true, ...originalModule, getTransaction: jest.fn(), } }) const mockedGetTransaction: Mock = getTransaction as Mock describe('Transaction container', () => { const renderTransaction = ( hash = '50BB0CC6EFC4F5EF9954E654D3230D4480DC83907A843C736B28420C7F02F774', tab = 'simple', ) => render( } /> , ) afterEach(() => { mockedGetTransaction.mockReset() }) it('renders without crashing', () => { renderTransaction() }) it('renders loading', () => { const { container } = renderTransaction() expect(container.querySelectorAll('.loader').length).toBe(1) }) it('renders 404 page on no match', async () => { mockedGetTransaction.mockImplementation(() => Promise.reject(new RippledError('transaction not found', 404)), ) const { container } = renderTransaction() await waitFor(() => { expect(container.querySelector('.no-match .title')).toHaveTextContent( 'transaction_not_found', ) }) const hints = container.querySelectorAll('.no-match .hint') expect(hints[0]).toHaveTextContent('server_ledgers_hint') expect(hints[1]).toHaveTextContent('check_transaction_hash') }) it('renders invalid hash page', async () => { const { container } = renderTransaction('aaaa') await waitFor(() => { expect(container.querySelector('.no-match .title')).toHaveTextContent( 'invalid_transaction_hash', ) }) expect(container.querySelector('.no-match .hint')).toHaveTextContent( 'check_transaction_hash', ) }) it('renders error page', async () => { mockedGetTransaction.mockImplementation(() => Promise.reject(new RippledError('transaction not validated', 500)), ) const { container } = renderTransaction() await waitFor(() => { expect(container.querySelector('.no-match .title')).toHaveTextContent( 'generic_error', ) }) expect(container.querySelector('.no-match .hint')).toHaveTextContent( 'not_your_fault', ) }) describe('with results', () => { beforeEach(async () => { const transaction = { processed: mockTransaction, summary: mockTransactionSummary, } mockedGetTransaction.mockImplementation(() => Promise.resolve(transaction), ) }) it('renders summary section', async () => { const { container } = renderTransaction(mockTransaction.hash) await waitFor(() => { expect(container.querySelectorAll('.transaction').length).toBe(1) expect(container.querySelector('.summary')).toBeInTheDocument() }) const summary = container.querySelector('.summary') expect(summary?.querySelector('.type')).toHaveTextContent('OfferCreate') const txids = container.querySelectorAll('.txid') expect(txids.length).toBe(2) expect(txids[0]).toHaveTextContent(`hash: ${mockTransaction.hash}`) expect(txids[1]).toHaveTextContent(`CTID: ${mockTransaction.tx.ctid}`) // TxStatus component renders success class for tesSUCCESS expect(summary?.querySelector('.tx-status.success')).toBeInTheDocument() expect(container.querySelectorAll('.tabs').length).toBe(1) const tabs = container.querySelectorAll('a.tab') expect(tabs.length).toBe(3) expect(tabs[0].getAttribute('title')).toBe('simple') expect(tabs[1].getAttribute('title')).toBe('detailed') expect(tabs[2].getAttribute('title')).toBe('raw') expect(container.querySelector('a.tab.selected')).toHaveTextContent( 'simple', ) }) it('renders detailed tab', async () => { const { container } = renderTransaction(mockTransaction.hash, 'detailed') await waitFor(() => { expect(container.querySelector('a.tab.selected')).toHaveTextContent( 'detailed', ) }) expect(container.querySelectorAll('.detail-body').length).toBe(1) }) it('renders raw tab', async () => { const { container } = renderTransaction(mockTransaction.hash, 'raw') await waitFor(() => { expect(container.querySelector('a.tab.selected')).toHaveTextContent( 'raw', ) }) expect(container.querySelectorAll('.json-view').length).toBe(1) }) }) }) ================================================ FILE: src/containers/Transactions/test/mock_data/DelegatePayment.json ================================================ { "tx": { "Account": "rfFLs8ZknoJKHCw7MtJKcs8GL81dqoDGRz", "Amount": "1000000", "Delegate": "rNRfqQc9b9ehXJJYVR6NqPPwrS26tWeB6N", "DeliverMax": "1000000", "Destination": "rsyK6CetAoRxXotHbYpp32oQQgD4JmvfBQ", "Fee": "1", "Flags": 0, "LastLedgerSequence": 2947155, "Sequence": 2947132, "SigningPubKey": "EDDC6A30775BE8B5E6E1007508ADE0DE00183D0BE41E5ED5331AAC4ED06849C640", "TransactionType": "Payment", "TxnSignature": "873B4198D657B6F079A0D4E728EEF65A51AF2C0A85243085895728D2B2A8E8075C063A38B99FB3E207996648E99367E07B244D71C054A000B0FA7B563477AB00", "ctid": "C02CF84100000002", "date": 1747765400000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfFLs8ZknoJKHCw7MtJKcs8GL81dqoDGRz", "Balance": "98999999", "Flags": 0, "OwnerCount": 1, "Sequence": 2947133 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "186BA30C233AEABA324162B0F0C67EFE31CDED0EBDA824E1F55A2D3AB19FC461", "PreviousFields": { "Balance": "99999999", "Sequence": 2947132 }, "PreviousTxnID": "0E48E0E9F68F4DE642B439EFCF0A2BF4C2F79B528483CE1B7DCF20F531E613E8", "PreviousTxnLgrSeq": 2947135 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsyK6CetAoRxXotHbYpp32oQQgD4JmvfBQ", "Balance": "101000000", "Flags": 0, "OwnerCount": 0, "Sequence": 2947133 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4649A0C0B4A7055A102576A7933F7F22FC0AEE780B18E4C729F6F4B43D24090B", "PreviousFields": { "Balance": "100000000" }, "PreviousTxnID": "E9E99D8A1FFAD0C2B7EC3FA47B616999DD59A7334E49BCAAB9456253B40BBE31", "PreviousTxnLgrSeq": 2947133 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNRfqQc9b9ehXJJYVR6NqPPwrS26tWeB6N", "Balance": "99999999", "Flags": 0, "OwnerCount": 0, "Sequence": 2947132 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FD174E3F989ADEC2194A51FADFB257F22475CCB2150E64F5FBCF4DD9F759C38C", "PreviousFields": { "Balance": "100000000" }, "PreviousTxnID": "5206FDB8E9A289228C744B70123BA8285E3F698E2DF72EB666B5C242A1C89857", "PreviousTxnLgrSeq": 2947132 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "delivered_amount": "1000000" }, "hash": "F8628ACECCA5E03E80F8BAA0BE6DAFCDBF025C91C7713B1B093AF663E992444C", "ledger_index": 2947137, "date": 1747765400000 } ================================================ FILE: src/containers/Transactions/test/mock_data/DirectMPTPayment.json ================================================ { "tx": { "Account": "rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw", "Amount": { "mpt_issuance_id": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3", "value": "100" }, "DeliverMax": { "mpt_issuance_id": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3", "value": "100" }, "Destination": "rnNkvddM96FE2QsaFztLAn5xicjq5d6d8d", "Fee": "10", "Flags": 2147483648, "Sequence": 12317, "SigningPubKey": "ED1E43F90700506F98E45CC8E77563ACB8FF0338739229AC98F0E1AEB409E786F9", "TransactionType": "Payment", "TxnSignature": "9949EF3E718A6776586A1DD91256C4055E761CBF1CE7A351912C08FE1BB415F6638FA096CAAE88D30B32E684448CDC52DEB022A7E3576AFA0C6E5ABB7BE2FE02", "ctid": "C000302000000000", "date": 1712087804000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw", "Balance": "99999980", "Flags": 0, "OwnerCount": 1, "Sequence": 12318 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "80909CC95DCD7E5E08631635C559E218D42C49721A1285192885B46E4737CF60", "PreviousFields": { "Balance": "99999990", "Sequence": 12317 }, "PreviousTxnID": "C9D0965E7A13F54186B6501D08ED54D74AA946A856D96BF7AAE18EA5FD5E93C2", "PreviousTxnLgrSeq": 12318 } }, { "ModifiedNode": { "FinalFields": { "Account": "rnNkvddM96FE2QsaFztLAn5xicjq5d6d8d", "Flags": 0, "MPTAmount": "100", "MPTokenIssuanceID": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "9B2E5EA9ACF16B591B941CAE5323EBED55E42495B16C92DC9FBEC0997E8E6804", "PreviousFields": {}, "PreviousTxnID": "4C41449D0C083746CC93DDA78F00E97AB8B857188E805F39C1A250F8C9467982", "PreviousTxnLgrSeq": 12319 } }, { "ModifiedNode": { "FinalFields": { "Flags": 64, "Issuer": "rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw", "OutstandingAmount": "100", "OwnerNode": "0", "Sequence": 12316 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "C38E54FD2C98FE848FE31CDA95F6F990A9A8715987171DA342A3296B7A9123B6", "PreviousFields": { "OutstandingAmount": "0" }, "PreviousTxnID": "C9D0965E7A13F54186B6501D08ED54D74AA946A856D96BF7AAE18EA5FD5E93C2", "PreviousTxnLgrSeq": 12318 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "delivered_amount": { "mpt_issuance_id": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3", "value": "100" } }, "hash": "5E74603F7C2E11030E644E681508FD1F24CAEB4CC0CE1F35A6230689D9694E85", "ledger_index": 12320, "date": 1712087804000 } ================================================ FILE: src/containers/Transactions/test/mock_data/EmittedPayment.json ================================================ { "tx": { "Account": "rMPwD1b8dJUaqZHaBgEvFx4ENhtpPVvDsv", "Amount": "999999", "Destination": "rfCarbonVNTuXckX6x2qTMFmFSnm6dEWGX", "DestinationTag": 0, "EmitDetails": { "EmitBurden": "1", "EmitCallback": "rMPwD1b8dJUaqZHaBgEvFx4ENhtpPVvDsv", "EmitGeneration": 1, "EmitHookHash": "A9B5411F4A4368008B4736EEE47A34B0EFCBE74016B9B94CC6208FBC0BF5C0C2", "EmitNonce": "74AEA17E77DCE55FD7E37098B3B96DFFD9E3A3CAD03823D723590D7F2813AC85", "EmitParentTxnID": "1D2E4D286D7EF7D13BD3D6DB0B8D9C864FB7B46A154BC57C7D17D9BD59C80FFD" }, "Fee": "31", "FirstLedgerSequence": 4309433, "Flags": 2147483648, "LastLedgerSequence": 4309437, "Sequence": 0, "SigningPubKey": "000000000000000000000000000000000000000000000000000000000000000000", "SourceTag": 0, "TransactionType": "Payment", "ctid": "C041C1B90001535A", "date": 1687874661000 }, "meta": { "AffectedNodes": [ { "DeletedNode": { "FinalFields": { "EmittedTxn": { "Account": "rMPwD1b8dJUaqZHaBgEvFx4ENhtpPVvDsv", "Amount": "999999", "Destination": "rfCarbonVNTuXckX6x2qTMFmFSnm6dEWGX", "DestinationTag": 0, "EmitDetails": { "EmitBurden": "1", "EmitCallback": "rMPwD1b8dJUaqZHaBgEvFx4ENhtpPVvDsv", "EmitGeneration": 1, "EmitHookHash": "A9B5411F4A4368008B4736EEE47A34B0EFCBE74016B9B94CC6208FBC0BF5C0C2", "EmitNonce": "74AEA17E77DCE55FD7E37098B3B96DFFD9E3A3CAD03823D723590D7F2813AC85", "EmitParentTxnID": "1D2E4D286D7EF7D13BD3D6DB0B8D9C864FB7B46A154BC57C7D17D9BD59C80FFD" }, "Fee": "31", "FirstLedgerSequence": 4309433, "Flags": 2147483648, "LastLedgerSequence": 4309437, "Sequence": 0, "SigningPubKey": "000000000000000000000000000000000000000000000000000000000000000000", "SourceTag": 0, "TransactionType": "Payment" }, "Flags": 0, "OwnerNode": "0" }, "LedgerEntryType": "EmittedTxn", "LedgerIndex": "30B66645E9A4DBD71BDE0EC2DCE2A0A8D89BB4A6885EBB83666EBF5A0FBE26D3" } }, { "DeletedNode": { "FinalFields": { "Flags": 4, "RootIndex": "B4DE823055D00BC12CD78FE1AAF74EE6062195B2629F49A25915A39C64BE1900" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B4DE823055D00BC12CD78FE1AAF74EE6062195B2629F49A25915A39C64BE1900" } }, { "ModifiedNode": { "FinalFields": { "Account": "rMPwD1b8dJUaqZHaBgEvFx4ENhtpPVvDsv", "Balance": "9396541450", "Flags": 0, "OwnerCount": 1, "Sequence": 4280223 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FDD5F4ABDFBF8EEE583BCAF910E66A6862941BE5E644E4DEA4BFB9362B8CCADF", "PreviousFields": { "Balance": "9396541481" } } } ], "HookExecutions": [ { "HookExecution": { "HookAccount": "rMPwD1b8dJUaqZHaBgEvFx4ENhtpPVvDsv", "HookEmitCount": 0, "HookExecutionIndex": 0, "HookHash": "A9B5411F4A4368008B4736EEE47A34B0EFCBE74016B9B94CC6208FBC0BF5C0C2", "HookInstructionCount": "25", "HookResult": 2, "HookReturnCode": "8000000000000001", "HookReturnString": "", "HookStateChangeCount": 0 } } ], "TransactionIndex": 1, "TransactionResult": "tecNO_DST_INSUF_XRP" }, "hash": "0B5F24CD8DCA13ABA7FD1B340AF489E7FC45201B6908ED38FFA561660BBBB567", "ledger_index": 4309433, "date": 1687874661000 } ================================================ FILE: src/containers/Transactions/test/mock_data/EnableAmendment.json ================================================ { "hash": "A5E2FF0168752EBA1363C4BB63FE67BB8FDAB32F36C4E508864B3E3D8DAF79AC", "ledger_index": 37421057, "date": "2018-03-23T01:42:41+00:00", "tx": { "TransactionType": "EnableAmendment", "Flags": 65536, "Sequence": 0, "LedgerSequence": 37421057, "Amendment": "F64E1EABBE79D55B3BB82020516CEC2C582A98A6BFE20FBE9BB6A0D233418064", "Fee": "0", "SigningPubKey": "", "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp" }, "meta": { "TransactionIndex": 7, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "Amendments", "LedgerIndex": "7DB0788C020F02780A673DC74757F23823FA3014C1866E72CC4CD8B226CD6EF4", "PreviousFields": { "Majorities": [ { "Majority": { "CloseTime": 575084560, "Amendment": "67A34F2CF55BFC0F93AACD5B281413176FEE195269FA6D95219A2DF738671172" } } ] }, "FinalFields": { "Flags": 0, "Majorities": [ { "Majority": { "CloseTime": 575084560, "Amendment": "67A34F2CF55BFC0F93AACD5B281413176FEE195269FA6D95219A2DF738671172" } }, { "Majority": { "CloseTime": 575084560, "Amendment": "F64E1EABBE79D55B3BB82020516CEC2C582A98A6BFE20FBE9BB6A0D233418064" } } ], "Amendments": [ "42426C4D4F1009EE67080A9B7965B44656D7714D104A72F9B4369F97ABF044EE", "4C97EBA926031A7CF7D7B36FDE3ED66DDA5421192D63DE53FFB46E43B9DC8373", "6781F8368C4771B83E8B821D88F580202BCB4228075297B19E4FDC5233F1EFDC", "740352F2412A9909880C23A559FCECEDA3BE2126FED62FC7660D628A06927F11", "1562511F573A19AE9BD103B5D6B9E01B3B46805AEC5D3C4805C902B514399146", "532651B4FD58DF8922A49BA101AB3E996E5BFBF95A913B3E392504863E63B164", "08DE7D96082187F6E6578530258C77FAABABE4C20474BDB82F04B021F1A68647", "E2E6F2866106419B88C50045ACE96368558C345566AC8F2BDF5A5B5587F0E6FA", "07D43DCE529B15A10827E5E04943B496762F9A88E3268269D69C44BE49E21104", "42EEA5E28A97824821D4EF97081FE36A54E9593C6E4F20CBAE098C69D2E072DC", "DC9CA96AEA1DCF83E527D1AFC916EFAF5D27388ECA4060A88817C1238CAEE0BF", "1D3463A5891F9E589C5AE839FFAC4A917CE96197098A1EF22304E1BC5B98A454", "6C92211186613F9647A89DFFBAB8F94C99D4C7E956D495270789128569177DA1", "CC5ABAE4F3EC92E94A59B1908C2BE82D2228B6485C00AFF8F22DF930D89C194E", "B9E739B8296B4A1BB29BE990B17D66E21B62A300A909F25AC55C22D6C72E1F9D", "B4D44CC3111ADD964E846FC57760C8B50FFCD5A82C86A72756F6B058DDDF96AD" ] } } } ], "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/Transactions/test/mock_data/EscrowCreate.json ================================================ { "hash": "27D43BD746193512ABD670DBE9C646F341BDCEDB0741CF862F64190E2851CAD1", "ledger_index": 37471281, "date": "2018-03-25T04:10:21+00:00", "tx": { "TransactionType": "EscrowCreate", "Flags": 2147483648, "Sequence": 104, "FinishAfter": 636368460, "CancelAfter": 636368060, "Amount": "997500000", "Fee": "10", "SigningPubKey": "02D4BAE5988733A2BEA96021337CA85F0056D9AA47BCF0E16E0E527A0A28DB100D", "TxnSignature": "30440220286F11B955EF4CA3A033503DC2C8E42F259A6A3A196E362453EFBB04F8ABF62902204998A8A74EDB142456E673345AB7ABB7A36506D6C8E5694B5D707108991C32C4", "Condition": "A0258020886F982742772F414243855DC13B348FC78FB3D5119412C8A6480114E36A4451810120", "Account": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi8q", "Destination": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi7q", "Memos": [ { "Memo": { "MemoType": "687474703A2F2F6578616D706C652E636F6D2F6D656D6F2F67656E65726963", "MemoData": "" } } ] }, "meta": { "TransactionIndex": 7, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "190D286E5687F825EA226482C56EB967011B258AB1F5B8F5028534E5030CA6B8", "FinalFields": { "Flags": 0, "RootIndex": "190D286E5687F825EA226482C56EB967011B258AB1F5B8F5028534E5030CA6B8", "Owner": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi8q" } } }, { "CreatedNode": { "LedgerEntryType": "Escrow", "LedgerIndex": "949D6E2DC8878166D6043348067D4672340C9710E950286E89D8385081B64C72", "NewFields": { "FinishAfter": 636368460, "Amount": "997500000", "Condition": "A0258020886F982742772F414243855DC13B348FC78FB3D5119412C8A6480114E36A4451810120", "Account": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi8q", "Destination": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi8q" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37471281, "PreviousTxnID": "81D8CE5B4489301E2906632250D05B429F1849CC69F14F205C23C0E142C12B33", "LedgerIndex": "BEAB548BF4AA0ED98E8DD381D566A56C35C20B49A4E9B1A10A7F334B0B50CB4C", "PreviousFields": { "Sequence": 104, "OwnerCount": 25, "Balance": "8132542897" }, "FinalFields": { "Flags": 0, "Sequence": 105, "OwnerCount": 26, "Balance": "7135042887", "Account": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi8q" } } } ], "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/Transactions/test/mock_data/HookPayment.json ================================================ { "tx": { "Account": "rKrSVLgaKQANTSEv1bY4cT4PVThCzFXpX6", "Amount": "1", "Destination": "rQUhXd7sopuga3taru3jfvc1BgVbscrb1X", "Fee": "11872", "Flags": 0, "HookParameters": [ { "HookParameter": { "HookParameterName": "4556520100000000000000000000000000000000000000000000000000000002", "HookParameterValue": "65766E486F7374557064617465526567" } }, { "HookParameter": { "HookParameterName": "4556520100000000000000000000000000000000000000000000000000000003", "HookParameterValue": "0000000000000000000000000000000000000000000000000000000000000000000000350C00EE110000506A05000500000000000000000000000000000000000000000000000000000000000000000000060300000000000000000000000000000000000000000000000000000000000000000000000000000000" } } ], "LastLedgerSequence": 4291160, "Memos": [], "NetworkID": 21338, "Sequence": 3006427, "SigningPubKey": "0309EAAD262DD00DFD62583BDBBE2CC1C599A6C4BD9D1009AACE65DF36D77FD3B5", "TransactionType": "Payment", "TxnSignature": "3044022053983031B2425E6D9B594749CC3216DE3FA7A417D996F479E5ABD5A36C67D915022004773723B770E6ADCCFFC4DCCBC95CC81EEBE7C43B6B2CA98DABAB852491E229", "ctid": "C0417A510000535A", "date": 1687819140000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rQUhXd7sopuga3taru3jfvc1BgVbscrb1X", "Balance": "28842707832", "Flags": 0, "OwnerCount": 132, "Sequence": 1784915 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "345E63077F8C9DF1D60DD91A6C7651A47A09388A58FF3FBAAFEA85E190C3BFE6", "PreviousFields": { "Balance": "28842707831" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rKrSVLgaKQANTSEv1bY4cT4PVThCzFXpX6", "Balance": "9837494804", "Domain": "656E312E65326368617274732E636F6D", "Flags": 8388608, "MessageKey": "0309EAAD262DD00DFD62583BDBBE2CC1C599A6C4BD9D1009AACE65DF36D77FD3B5", "OwnerCount": 4, "Sequence": 3006428 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "42378CC3CFC4C4D7B995B21A223DC67F9821869D5DA81FA2254351E8AA0C3C93", "PreviousFields": { "Balance": "9837506677", "Sequence": 3006427 } } } ], "HookExecutions": [ { "HookExecution": { "HookAccount": "rQUhXd7sopuga3taru3jfvc1BgVbscrb1X", "HookEmitCount": 0, "HookExecutionIndex": 0, "HookHash": "BF8F18C5D5E9F8281BA5489076BE10EC095C80E9CE003BB2D6957DD81D025C02", "HookInstructionCount": "5f3", "HookResult": 3, "HookReturnCode": "1f6", "HookReturnString": "2E2F7372632F72656769737472792E6300", "HookStateChangeCount": 12 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "delivered_amount": "1" }, "hash": "4708F405B482296B86B7B89C97838DBEEB7F388919AAAF563F9D4B4231DF48FD", "ledger_index": 4291153, "date": 1687819140000 } ================================================ FILE: src/containers/Transactions/test/mock_data/OfferCreateTicket.json ================================================ { "tx": { "Account": "rf4VZ6LYKnPY1uaEiZF8qzD8vrW91vvjbb", "Fee": "10", "Flags": 65536, "LastLedgerSequence": 80986097, "Sequence": 0, "SigningPubKey": "EDD17BABBBECFEFE3FCC777113E2A3B9F12F3747B92E6E822E04FE0F2EAFDCF83C", "TakerGets": { "currency": "EUR", "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", "value": "1362.49752" }, "TakerPays": { "currency": "GBP", "issuer": "r4GN9eEoz9K4BhMQXe4H1eYNtvtkwGdt8g", "value": "1168.4025" }, "TicketSequence": 79469284, "TransactionType": "OfferCreate", "TxnSignature": "337F766904250BD32A46EE74C7A6624F108769BAD04EDBB818C22B007D994700B90E043017EBB3582922676B62E65299214DB79AC563AD292EC97B08A357A509", "date": 1688757492000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "32fc", "Owner": "rf4VZ6LYKnPY1uaEiZF8qzD8vrW91vvjbb", "RootIndex": "031ACE475F9337139A17B266C859DC92F26154380AF93F77C72036BAAA3A9999" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4FB37C0D16E9CAF664BD74FFCBCE65F06F9B1BE048011A9251ED5AC7B255C228" } }, { "CreatedNode": { "LedgerEntryType": "Offer", "LedgerIndex": "677F2CF01C84ED748C2A0B146D740B716E8777E327835F1D5173BC1F28BF6704", "NewFields": { "Account": "rf4VZ6LYKnPY1uaEiZF8qzD8vrW91vvjbb", "BookDirectory": "BEED7204994F6D7E6967B2BFAA27880866F54F6F30BBA3B2541E7752CC657FC6", "Flags": 65536, "OwnerNode": "32fd", "Sequence": 79469284, "TakerGets": { "currency": "EUR", "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", "value": "1362.49752" }, "TakerPays": { "currency": "GBP", "issuer": "r4GN9eEoz9K4BhMQXe4H1eYNtvtkwGdt8g", "value": "1168.4025" } } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "32f7", "IndexPrevious": "32f3", "Owner": "rf4VZ6LYKnPY1uaEiZF8qzD8vrW91vvjbb", "RootIndex": "031ACE475F9337139A17B266C859DC92F26154380AF93F77C72036BAAA3A9999" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7632CE5B80F3C7E1D636BE4ACEEFACAA5D654A3A7AC553E0F069BC90A79A8EED" } }, { "DeletedNode": { "FinalFields": { "Account": "rf4VZ6LYKnPY1uaEiZF8qzD8vrW91vvjbb", "Flags": 0, "OwnerNode": "32f6", "PreviousTxnID": "1EE9C1A86FE001213E77CD9514594969C9B72660F021E6CA356ACE964081EC5E", "PreviousTxnLgrSeq": 80985444, "TicketSequence": 79469284 }, "LedgerEntryType": "Ticket", "LedgerIndex": "945B6605EE9AC922C81C3FCCDFB5B995FAC97923CEF190E4176B93553A00C542" } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BEED7204994F6D7E6967B2BFAA27880866F54F6F30BBA3B2541E7752CC657FC6", "NewFields": { "ExchangeRate": "541e7752cc657fc6", "RootIndex": "BEED7204994F6D7E6967B2BFAA27880866F54F6F30BBA3B2541E7752CC657FC6", "TakerGetsCurrency": "0000000000000000000000004555520000000000", "TakerGetsIssuer": "2ADB0B3959D60A6E6991F729E1918B7163925230", "TakerPaysCurrency": "0000000000000000000000004742500000000000", "TakerPaysIssuer": "E93BDB6C7098EF415FEA6C4B7A7A76BF9289118B" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rf4VZ6LYKnPY1uaEiZF8qzD8vrW91vvjbb", "Balance": "389253477", "Flags": 0, "OwnerCount": 157, "Sequence": 79469653, "TicketCount": 134 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E306A63B590C825C6278CC92A7D29E4030BA9DE4DE748CD9F9891F01B7045943", "PreviousFields": { "Balance": "389253487", "TicketCount": 135 }, "PreviousTxnID": "E32F95AABE7A3147952386495EA30075B99244BC7F69643E7D4268D43CDBCE3A", "PreviousTxnLgrSeq": 80986079 } } ], "TransactionIndex": 22, "TransactionResult": "tesSUCCESS" }, "hash": "BD19F7D08D7470E15B3F7329421B20B7511E9FDB2C9EB8C0E1F11540EAC76070", "ledger_index": 80986080, "date": 1688757492000 } ================================================ FILE: src/containers/Transactions/test/mock_data/Transaction.json ================================================ { "hash": "50BB0CC6EFC4F5EF9954E654D3230D4480DC83907A843C736B28420C7F02F774", "ledger_index": 37262431, "date": "2018-03-16T08:11:00+00:00", "tx": { "TransactionType": "OfferCreate", "Flags": 2147483648, "Sequence": 386316, "TakerPays": { "value": "19909.5799999996", "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y" }, "TakerGets": { "value": "20000", "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA" }, "Fee": "12", "SigningPubKey": "03854A934352E510CB095FB37F38FFF962B8A2AAAB2A594CBEC7A91A1AF5B3F29A", "TxnSignature": "304402205D1FFE09B3FE73ACE89C15C8649F717D1B69FF9A298B4F0B4ADAAFF80DE1348A0220251D87705A5AC1DAACCB9A89EE74F9CEF75FD36D7789406BF6032A4FEC69EE84", "Account": "rPt8rwFrsucmjdKfjwRHGz9iZGxxN2cLYh", "ctid": "C238945F00340000" }, "meta": { "TransactionIndex": 52, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9EB6E13F11FCE5465E064E874C7713CB8D5D5E6BD198443C49E1B14DE444E4CF", "FinalFields": { "Flags": 0, "IndexPrevious": "000000000000049E", "RootIndex": "8D47835C2516C1F8F28A43C140356DA142DEB58CA29EF27212ECE6DCFC4472C7", "Owner": "rETx8GBiH6fxhTcfHM9fGeyShqxozyD3xe" } } }, { "ModifiedNode": { "LedgerEntryType": "RippleState", "PreviousTxnLgrSeq": 37262431, "PreviousTxnID": "B4023B851C768A48DCBE3AB788BBBBA2B0AF8CF8344CF44BA2D9662F055C8AFD", "LedgerIndex": "20232CB217A011249CF4BEA427DA0C2AD91E5DABE3998640029A116435162BE4", "PreviousFields": { "Balance": { "value": "-187682.1955779691", "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji" } }, "FinalFields": { "Flags": 2228224, "LowNode": "00000000000003BA", "HighNode": "0000000000000000", "Balance": { "value": "-187907.6485143064", "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji" }, "LowLimit": { "value": "0", "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA" }, "HighLimit": { "value": "1000000000", "currency": "CNY", "issuer": "rUmustd4TbkjaEuS7S1damozpBEREgRz9z" } } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37262431, "PreviousTxnID": "B4023B851C768A48DCBE3AB788BBBBA2B0AF8CF8344CF44BA2D9662F055C8AFD", "LedgerIndex": "28751EC2E5DCEC6D94CCE16CCDF85F37A696CF79B15A56AA75308AEB4714C00E", "PreviousFields": { "Balance": "2910704988" }, "FinalFields": { "Flags": 0, "Sequence": 5805, "OwnerCount": 8, "Balance": "2860380672", "Account": "rUmustd4TbkjaEuS7S1damozpBEREgRz9z" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37262431, "PreviousTxnID": "6C3319FE469E81951A989F16756AD3CA9EBAF8115153BF4F6BFE8407862B45B6", "LedgerIndex": "2927E76DE56E6C05C1041AD6E3542C795AB0304974F8C5E50D1705E0600099ED", "PreviousFields": { "Sequence": 386316, "Balance": "98595124" }, "FinalFields": { "Flags": 0, "Sequence": 386317, "OwnerCount": 10, "Balance": "98595112", "Account": "rPt8rwFrsucmjdKfjwRHGz9iZGxxN2cLYh" } } }, { "ModifiedNode": { "LedgerEntryType": "RippleState", "PreviousTxnLgrSeq": 37260031, "PreviousTxnID": "615AED9D4AD767439A9DAED3DF5E48DA36C3FD33BD90528EB997027DEAF1E224", "LedgerIndex": "3DECAAB10E7761678F54C4148584D5A44214BE9BB641A7A7091321109DDE94A6", "PreviousFields": { "Balance": { "value": "-68093.01974026792", "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji" } }, "FinalFields": { "Flags": 2228224, "LowNode": "000000000000029A", "HighNode": "0000000000000000", "Balance": { "value": "-68317.73385056693", "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji" }, "LowLimit": { "value": "0", "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y" }, "HighLimit": { "value": "1000000000", "currency": "CNY", "issuer": "rPt8rwFrsucmjdKfjwRHGz9iZGxxN2cLYh" } } } }, { "ModifiedNode": { "LedgerEntryType": "Offer", "PreviousTxnLgrSeq": 37262431, "PreviousTxnID": "6D8782864959A135083A29FE1FE9936466F9DA5CB3ACE2879CB091555808C5F7", "LedgerIndex": "44464A364AE80AAF800F3D7FA13E014B3015432EF329EF985D780BDE58DDBA3F", "PreviousFields": { "TakerPays": "470318230", "TakerGets": { "value": "2100.120796711", "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y" } }, "FinalFields": { "Flags": 65536, "Sequence": 1181517, "BookNode": "0000000000000000", "OwnerNode": "0000000000000000", "BookDirectory": "49789A0B460DC77A2CED9349C432AEA97352345BA3C7313A5A07F4CBFD1CB76A", "TakerPays": "419993914", "TakerGets": { "value": "1875.406686411988", "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y" }, "Account": "rEGoBvzusE2MkDn3yrgZc817XiwRofqoJq" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37262431, "PreviousTxnID": "6D8782864959A135083A29FE1FE9936466F9DA5CB3ACE2879CB091555808C5F7", "LedgerIndex": "4D74E3C137F888F228BCBC8B9B7BC25765968B673728613C5B7C8BA7652FAD19", "PreviousFields": { "Balance": "5703912258" }, "FinalFields": { "Flags": 0, "Sequence": 1181518, "OwnerCount": 6, "Balance": "5754236574", "Account": "rEGoBvzusE2MkDn3yrgZc817XiwRofqoJq" } } }, { "ModifiedNode": { "LedgerEntryType": "RippleState", "PreviousTxnLgrSeq": 37262362, "PreviousTxnID": "A4DFF09046A6ADA470DDC4B6CD6865F474112916A1BB0F23E3F076AF7C1D7139", "LedgerIndex": "7036BC235F325305866B61CFF2EFD869CD1E2DEB5C5EAB78D22CAE7D1E06DA01", "PreviousFields": { "Balance": { "value": "9605.02284129326", "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji" } }, "FinalFields": { "Flags": 1114112, "LowNode": "0000000000000000", "HighNode": "00000000000003C5", "Balance": { "value": "9380.308730994248", "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji" }, "LowLimit": { "value": "1000000000", "currency": "CNY", "issuer": "rEGoBvzusE2MkDn3yrgZc817XiwRofqoJq" }, "HighLimit": { "value": "0", "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y" } } } }, { "ModifiedNode": { "LedgerEntryType": "Offer", "PreviousTxnLgrSeq": 37262431, "PreviousTxnID": "B4023B851C768A48DCBE3AB788BBBBA2B0AF8CF8344CF44BA2D9662F055C8AFD", "LedgerIndex": "858BD76155EF19E066B106835EEC9E5BAFD747DCD6830BBE0392B083A8A8048B", "PreviousFields": { "TakerPays": { "value": "12589.58241408", "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA" }, "TakerGets": "2810174646" }, "FinalFields": { "Flags": 131072, "Sequence": 5804, "BookNode": "0000000000000000", "OwnerNode": "0000000000000000", "BookDirectory": "7254404DF6B7FBFFEF34DC38867A7E7DE610B513997B78804F0FEA8948980000", "TakerPays": { "value": "12364.12947774268", "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA" }, "TakerGets": "2759850330", "Account": "rUmustd4TbkjaEuS7S1damozpBEREgRz9z" } } }, { "ModifiedNode": { "LedgerEntryType": "RippleState", "PreviousTxnLgrSeq": 37260031, "PreviousTxnID": "615AED9D4AD767439A9DAED3DF5E48DA36C3FD33BD90528EB997027DEAF1E224", "LedgerIndex": "989C5E28598302B1357F9F6EDB43F8D755AAB2AE9EF738882A0192721BC92779", "PreviousFields": { "Balance": { "value": "-225.90384221", "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji" } }, "FinalFields": { "Flags": 2228224, "LowNode": "0000000000000432", "HighNode": "0000000000000000", "Balance": { "value": "0", "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji" }, "LowLimit": { "value": "0", "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA" }, "HighLimit": { "value": "1000000000", "currency": "CNY", "issuer": "rPt8rwFrsucmjdKfjwRHGz9iZGxxN2cLYh" } } } } ], "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/Transactions/test/mock_data/TransactionSummary.json ================================================ { "instructions": { "gets": { "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA", "amount": 20000 }, "pays": { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y", "amount": 19909.5799999996 }, "firstCurrency": { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y" }, "secondCurrency": { "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA" } } } ================================================ FILE: src/containers/Transactions/test/mock_data/TrustSet.json ================================================ { "tx": { "Account": "rLwNAmcqi7ipSZ5cUc6zXZMjwEddr2yc8x", "Fee": "10", "Flags": 2152792064, "LimitAmount": { "currency": "EQT", "issuer": "rBeb4FLPG4XUwxdnnEztTLK6Zd9mxhDQ6E", "value": "0" }, "Sequence": 9198426, "SigningPubKey": "025CE5B77DBE302A3CF37D23DD2478A5F36349108BB4652422D858DAFE72284282", "SourceTag": 608402356, "TransactionType": "TrustSet", "TxnSignature": "30440220537A17DA2BD39101DE1978067CA17469E40D898ED7D2E360B8865A784F4E0B9602205A4BE189A12DA11C8D2F452FBF0CE1EBC6EC6FE44EAD0E198C66B8B1DF04ACB1", "ctid": "C08C5FEE00010001", "date": 1753466092000, "hash": "F7F89216FDB0135847BB4966607ACCABF7555302DC8143D2E1C71FEA9249AF3E", "inLedger": 9199598, "ledger_index": 9199598, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "EQT", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1" }, "Flags": 77266944, "HighLimit": { "currency": "EQT", "issuer": "rLwNAmcqi7ipSZ5cUc6zXZMjwEddr2yc8x", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "EQT", "issuer": "rBeb4FLPG4XUwxdnnEztTLK6Zd9mxhDQ6E", "value": "100000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "66C42DF2F527BA73BE6AD7E20A5BBC81A39A0A9DD9AE21FE7E3FC6EDA8593E88", "PreviousFields": { "Flags": 1638400 }, "PreviousTxnID": "0CEFFA595E230BED9BD23E0A32B594DB0781AE5C4315FC8BA673B278001F0163", "PreviousTxnLgrSeq": 9199409 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLwNAmcqi7ipSZ5cUc6zXZMjwEddr2yc8x", "Balance": "21999940", "Flags": 2156134400, "OwnerCount": 2, "Sequence": 9198427 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1C8011AE06D1DD364D7091702BAE8DAF921235FD7E462DAAF00F59D9353E580", "PreviousFields": { "Balance": "21999950", "OwnerCount": 1, "Sequence": 9198426 }, "PreviousTxnID": "7A85D2343EB6A7C8D10088351B59210213A0616B353CA841B4806A7024CED8B7", "PreviousTxnLgrSeq": 9199406 } } ], "TransactionIndex": 1, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "EQT", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1" }, "Flags": 77266944, "HighLimit": { "currency": "EQT", "issuer": "rLwNAmcqi7ipSZ5cUc6zXZMjwEddr2yc8x", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "EQT", "issuer": "rBeb4FLPG4XUwxdnnEztTLK6Zd9mxhDQ6E", "value": "100000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "66C42DF2F527BA73BE6AD7E20A5BBC81A39A0A9DD9AE21FE7E3FC6EDA8593E88", "PreviousFields": { "Flags": 1638400 }, "PreviousTxnID": "0CEFFA595E230BED9BD23E0A32B594DB0781AE5C4315FC8BA673B278001F0163", "PreviousTxnLgrSeq": 9199409 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLwNAmcqi7ipSZ5cUc6zXZMjwEddr2yc8x", "Balance": "21999940", "Flags": 2156134400, "OwnerCount": 2, "Sequence": 9198427 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1C8011AE06D1DD364D7091702BAE8DAF921235FD7E462DAAF00F59D9353E580", "PreviousFields": { "Balance": "21999950", "OwnerCount": 1, "Sequence": 9198426 }, "PreviousTxnID": "7A85D2343EB6A7C8D10088351B59210213A0616B353CA841B4806A7024CED8B7", "PreviousTxnLgrSeq": 9199406 } } ], "TransactionIndex": 1, "TransactionResult": "tesSUCCESS" }, "hash": "F7F89216FDB0135847BB4966607ACCABF7555302DC8143D2E1C71FEA9249AF3E", "ledger_index": 9199598, "date": 1753466092000 } ================================================ FILE: src/containers/Transactions/test/mock_data/rippledOfferCreate.json ================================================ { "result": { "Account": "rPt8rwFrsucmjdKfjwRHGz9iZGxxN2cLYh", "Fee": "12", "Flags": 2147483648, "Sequence": 386316, "SigningPubKey": "03854A934352E510CB095FB37F38FFF962B8A2AAAB2A594CBEC7A91A1AF5B3F29A", "TakerGets": { "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA", "value": "20000" }, "TakerPays": { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y", "value": "19909.5799999996" }, "TransactionType": "OfferCreate", "TxnSignature": "304402205D1FFE09B3FE73ACE89C15C8649F717D1B69FF9A298B4F0B4ADAAFF80DE1348A0220251D87705A5AC1DAACCB9A89EE74F9CEF75FD36D7789406BF6032A4FEC69EE84", "date": 574503060, "hash": "50BB0CC6EFC4F5EF9954E654D3230D4480DC83907A843C736B28420C7F02F774", "inLedger": 37262431, "ledger_index": 37262431, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-187907.6485143064" }, "Flags": 2228224, "HighLimit": { "currency": "CNY", "issuer": "rUmustd4TbkjaEuS7S1damozpBEREgRz9z", "value": "1000000000" }, "HighNode": "0", "LowLimit": { "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA", "value": "0" }, "LowNode": "3ba" }, "LedgerEntryType": "RippleState", "LedgerIndex": "20232CB217A011249CF4BEA427DA0C2AD91E5DABE3998640029A116435162BE4", "PreviousFields": { "Balance": { "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-187682.1955779691" } }, "PreviousTxnID": "B4023B851C768A48DCBE3AB788BBBBA2B0AF8CF8344CF44BA2D9662F055C8AFD", "PreviousTxnLgrSeq": 37262431 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUmustd4TbkjaEuS7S1damozpBEREgRz9z", "Balance": "2860380672", "Flags": 0, "OwnerCount": 8, "Sequence": 5805 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "28751EC2E5DCEC6D94CCE16CCDF85F37A696CF79B15A56AA75308AEB4714C00E", "PreviousFields": { "Balance": "2910704988" }, "PreviousTxnID": "B4023B851C768A48DCBE3AB788BBBBA2B0AF8CF8344CF44BA2D9662F055C8AFD", "PreviousTxnLgrSeq": 37262431 } }, { "ModifiedNode": { "FinalFields": { "Account": "rPt8rwFrsucmjdKfjwRHGz9iZGxxN2cLYh", "Balance": "98595112", "Flags": 0, "OwnerCount": 10, "Sequence": 386317 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2927E76DE56E6C05C1041AD6E3542C795AB0304974F8C5E50D1705E0600099ED", "PreviousFields": { "Balance": "98595124", "Sequence": 386316 }, "PreviousTxnID": "6C3319FE469E81951A989F16756AD3CA9EBAF8115153BF4F6BFE8407862B45B6", "PreviousTxnLgrSeq": 37262431 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-68317.73385056693" }, "Flags": 2228224, "HighLimit": { "currency": "CNY", "issuer": "rPt8rwFrsucmjdKfjwRHGz9iZGxxN2cLYh", "value": "1000000000" }, "HighNode": "0", "LowLimit": { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y", "value": "0" }, "LowNode": "29a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3DECAAB10E7761678F54C4148584D5A44214BE9BB641A7A7091321109DDE94A6", "PreviousFields": { "Balance": { "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-68093.01974026792" } }, "PreviousTxnID": "615AED9D4AD767439A9DAED3DF5E48DA36C3FD33BD90528EB997027DEAF1E224", "PreviousTxnLgrSeq": 37260031 } }, { "ModifiedNode": { "FinalFields": { "Account": "rEGoBvzusE2MkDn3yrgZc817XiwRofqoJq", "BookDirectory": "49789A0B460DC77A2CED9349C432AEA97352345BA3C7313A5A07F4CBFD1CB76A", "BookNode": "0", "Flags": 65536, "OwnerNode": "0", "Sequence": 1181517, "TakerGets": { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y", "value": "1875.406686411988" }, "TakerPays": "419993914" }, "LedgerEntryType": "Offer", "LedgerIndex": "44464A364AE80AAF800F3D7FA13E014B3015432EF329EF985D780BDE58DDBA3F", "PreviousFields": { "TakerGets": { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y", "value": "2100.120796711" }, "TakerPays": "470318230" }, "PreviousTxnID": "6D8782864959A135083A29FE1FE9936466F9DA5CB3ACE2879CB091555808C5F7", "PreviousTxnLgrSeq": 37262431 } }, { "ModifiedNode": { "FinalFields": { "Account": "rEGoBvzusE2MkDn3yrgZc817XiwRofqoJq", "Balance": "5754236574", "Flags": 0, "OwnerCount": 6, "Sequence": 1181518 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4D74E3C137F888F228BCBC8B9B7BC25765968B673728613C5B7C8BA7652FAD19", "PreviousFields": { "Balance": "5703912258" }, "PreviousTxnID": "6D8782864959A135083A29FE1FE9936466F9DA5CB3ACE2879CB091555808C5F7", "PreviousTxnLgrSeq": 37262431 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "9380.308730994248" }, "Flags": 1114112, "HighLimit": { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y", "value": "0" }, "HighNode": "3c5", "LowLimit": { "currency": "CNY", "issuer": "rEGoBvzusE2MkDn3yrgZc817XiwRofqoJq", "value": "1000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7036BC235F325305866B61CFF2EFD869CD1E2DEB5C5EAB78D22CAE7D1E06DA01", "PreviousFields": { "Balance": { "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "9605.02284129326" } }, "PreviousTxnID": "A4DFF09046A6ADA470DDC4B6CD6865F474112916A1BB0F23E3F076AF7C1D7139", "PreviousTxnLgrSeq": 37262362 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUmustd4TbkjaEuS7S1damozpBEREgRz9z", "BookDirectory": "7254404DF6B7FBFFEF34DC38867A7E7DE610B513997B78804F0FEA8948980000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "Sequence": 5804, "TakerGets": "2759850330", "TakerPays": { "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA", "value": "12364.12947774268" } }, "LedgerEntryType": "Offer", "LedgerIndex": "858BD76155EF19E066B106835EEC9E5BAFD747DCD6830BBE0392B083A8A8048B", "PreviousFields": { "TakerGets": "2810174646", "TakerPays": { "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA", "value": "12589.58241408" } }, "PreviousTxnID": "B4023B851C768A48DCBE3AB788BBBBA2B0AF8CF8344CF44BA2D9662F055C8AFD", "PreviousTxnLgrSeq": 37262431 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "CNY", "issuer": "rPt8rwFrsucmjdKfjwRHGz9iZGxxN2cLYh", "value": "1000000000" }, "HighNode": "0", "LowLimit": { "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA", "value": "0" }, "LowNode": "432" }, "LedgerEntryType": "RippleState", "LedgerIndex": "989C5E28598302B1357F9F6EDB43F8D755AAB2AE9EF738882A0192721BC92779", "PreviousFields": { "Balance": { "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-225.90384221" } }, "PreviousTxnID": "615AED9D4AD767439A9DAED3DF5E48DA36C3FD33BD90528EB997027DEAF1E224", "PreviousTxnLgrSeq": 37260031 } } ], "TransactionIndex": 52, "TransactionResult": "tesSUCCESS" }, "validated": true }, "status": "success", "type": "response" } ================================================ FILE: src/containers/Transactions/transaction.scss ================================================ @use '../shared/css/variables' as *; .transaction { position: relative; max-width: 912px; min-height: 600px; @include for-size(tablet-landscape-up) { width: 584px; margin: 0 auto; } @include for-size(desktop-up) { width: 820px; } @include for-size(big-desktop-up) { width: 912px; } .loader { position: absolute; z-index: 1; top: 0px; } .summary { padding: 0 16px 87px 0; .type { display: inline-block; margin-bottom: 24px; color: $white; font-size: 42px; @include bold; } .txid { .title { @include semibold; } display: flex; overflow: hidden; margin-top: 8px; color: $black-40; font-size: 12px; letter-spacing: 0px; line-height: 20px; text-overflow: ellipsis; text-transform: uppercase; white-space: nowrap; @include medium; } .tx-status { margin-left: 15px; } } } ================================================ FILE: src/containers/Validators/HistoryTab.tsx ================================================ import { useTranslation } from 'react-i18next' import { Loader } from '../shared/components/Loader' import { localizeDate } from '../shared/utils' import { useLanguage } from '../shared/hooks' import './historyTab.scss' import { ValidatorReport } from '../shared/vhsTypes' const DEFAULT_HISTORY_TIMEZONE = 'UTC' const ReportRow = ({ report }: { report: ValidatorReport }) => { const language = useLanguage() return (
    {localizeDate(new Date(report.date), language, { dateStyle: 'full', timeZone: DEFAULT_HISTORY_TIMEZONE, })}
    {localizeDate(new Date(report.date), language, { year: 'numeric', month: 'numeric', day: 'numeric', timeZone: DEFAULT_HISTORY_TIMEZONE, })}
    {report.chain} {report.score} {report.incomplete && *} {report.total} 0 ? 'td-missed' : '' }`} > {report.missed} ) } export interface HistoryTabProps { reports?: ValidatorReport[] } export const HistoryTab = ({ reports }: HistoryTabProps) => { const { t } = useTranslation() return ( {reports ? ( reports.map((report) => ( )) ) : ( )}
    {t('validator_history.date')} {t('validator_history.chain')} {t('validator_history.score')} {t('total')} {t('validator_history.missed')}
    ) } ================================================ FILE: src/containers/Validators/Simple/index.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from '../../shared/components/Transaction/SimpleRow' import { ValidatorScore, ValidatorSupplemented } from '../../shared/vhsTypes' import { RouteLink } from '../../shared/routing' import { LEDGER_ROUTE } from '../../App/routes' export interface SimpleProps { data: ValidatorSupplemented } const Simple = ({ data }: SimpleProps) => { const { t } = useTranslation() const renderAgreement = ( className: string, d: ValidatorScore | null, label: string, ) => d ? (
    {label}
    {Number.parseFloat(d.score).toFixed(5)} {d.incomplete && *}
    ) : (
    ) return ( <> {data.domain || 'Unknown'} {data.server_version}
    Master Key
    {data.master_key || 'Unknown'}
    Signing Key
    {data.signing_key || 'Unknown'}
    {data.current_index && ( {data?.ledger_hash || 'Unknown'} )} {renderAgreement('h1', data.agreement_1h, 'Agreement (1 hour)')} {renderAgreement('h24', data.agreement_24h, 'Agreement (24 hours)')} {renderAgreement('d30', data.agreement_30day, 'Agreement (30 days)')} ) } export default Simple ================================================ FILE: src/containers/Validators/SimpleTab.tsx ================================================ import { useTranslation } from 'react-i18next' import { FC } from 'react' import { RouteLink } from '../shared/routing' import { localizeDate, BREAKPOINTS } from '../shared/utils' import Simple from './Simple' import '../shared/css/simpleTab.scss' import './simpleTab.scss' import successIcon from '../shared/images/success.png' import { SimpleRow } from '../shared/components/Transaction/SimpleRow' import { useLanguage } from '../shared/hooks' import { ValidatorSupplemented } from '../shared/vhsTypes' import { LEDGER_ROUTE } from '../App/routes' const TIME_ZONE = 'UTC' const DATE_OPTIONS = { hour: 'numeric', minute: 'numeric', second: 'numeric', year: 'numeric', month: 'numeric', day: 'numeric', hour12: true, timeZone: TIME_ZONE, } export const SimpleTab: FC<{ data: ValidatorSupplemented width: number }> = ({ data, width }) => { const language = useLanguage() const { t } = useTranslation() const renderRowIndex = ({ last_ledger_time: lastLedgerTime, current_index: ledgerIndex, unl, }: ValidatorSupplemented) => { const unlRow = unl && ( {unl.toString()} {unl} ) return ( <> {lastLedgerTime && ( {localizeDate(new Date(lastLedgerTime), language, DATE_OPTIONS)} )} {ledgerIndex && ( {ledgerIndex} )} {unlRow} ) } const rowIndex = renderRowIndex(data) return (
    {width < BREAKPOINTS.landscape && rowIndex}
    {width >= BREAKPOINTS.landscape && (
    {rowIndex}
    )}
    ) } ================================================ FILE: src/containers/Validators/VotingTab.tsx ================================================ import { useTranslation } from 'react-i18next' import { FC } from 'react' import axios from 'axios' import { useQuery } from 'react-query' import { ValidatorSupplemented } from '../shared/vhsTypes' import { SimpleRow } from '../shared/components/Transaction/SimpleRow' import { FETCH_INTERVAL_ERROR_MILLIS, FETCH_INTERVAL_VHS_MILLIS, SERVER_ERROR, renderXRP, } from '../shared/utils' import { useAnalytics } from '../shared/analytics' import { XRP_BASE } from '../shared/transactionUtils' import './votingTab.scss' import { RouteLink } from '../shared/routing' import { AMENDMENT_ROUTE } from '../App/routes' import { Loader } from '../shared/components/Loader' export const VotingTab: FC<{ validatorData: ValidatorSupplemented network: string | undefined }> = ({ validatorData, network }) => { const { t } = useTranslation() const { trackException } = useAnalytics() const votedAmendments = new Set( validatorData.amendments ? validatorData.amendments.map((amendment) => amendment.id) : [], ) const { data, isLoading } = useQuery>( ['fetchNetworkVotingData', network], async () => fetchNetworkVote(network), { refetchInterval: (returnedData, _) => returnedData == null ? FETCH_INTERVAL_ERROR_MILLIS : FETCH_INTERVAL_VHS_MILLIS, refetchOnMount: true, enabled: !!network, }, ) function fetchNetworkVote(networkID: string | undefined) { const url = `${process.env.VITE_DATA_URL}/amendments/vote/${networkID}` return axios .get(url) .then((resp) => resp.data.amendments) .then((amendments) => amendments.filter((amendment) => amendment.voted !== undefined), ) .catch((axiosError) => { const status = axiosError.response && axiosError.response.status ? axiosError.response.status : SERVER_ERROR trackException(`${url} --- ${JSON.stringify(axiosError)}`) return Promise.reject(status) }) } const renderAmendment = (id: string, name: string, voted: boolean) => (
    {name} {id} {voted ? ( Yea ) : ( Nay )}
    ) return (
    {t('base_fee')}
    {renderXRP(validatorData.base_fee / XRP_BASE)}
    {t('account_reserve')}
    {renderXRP(validatorData.reserve_base / XRP_BASE)}
    {t('object_reserve')}
    {renderXRP(validatorData.reserve_inc / XRP_BASE)}
    {t('amendments')}
    {isLoading && } {data !== undefined && data.length > 0 ? data.map((amendment) => { const voted = votedAmendments.has(amendment.id) return renderAmendment(amendment.id, amendment.name, voted) }) : !isLoading && (
    {t('no_amendment_in_voting')}
    )}
    ) } ================================================ FILE: src/containers/Validators/historyTab.scss ================================================ @use '../shared/css/variables' as *; .history-table { // Col overall styling .col-date, .col-chain, .col-score, .col-missed, .col-total { @extend %truncate; } .col-date { width: 90px; @include for-size(tablet-landscape-up) { width: 200px; } @include for-size(desktop-up) { width: 300px; } @include for-size(big-desktop-up) { width: 390px; } .abbrev-date { @include for-size(tablet-landscape-up) { display: none; } } .full-date { display: none; @include for-size(tablet-landscape-up) { display: table-cell; } } } .col-chain { width: 55px; @include for-size(tablet-landscape-up) { width: 70px; } @include for-size(desktop-up) { width: 100px; } @include for-size(big-desktop-up) { width: 200px; } } .col-score { width: 55px; @include for-size(tablet-landscape-up) { width: 70px; } @include for-size(desktop-up) { width: 100px; } @include for-size(big-desktop-up) { width: 150px; } } .col-total { width: 55px; @include for-size(tablet-landscape-up) { width: 70px; } @include for-size(desktop-up) { width: 100px; } @include for-size(big-desktop-up) { width: 165px; } } .col-missed { width: 55px; @include for-size(tablet-landscape-up) { width: 70px; } @include for-size(desktop-up) { width: 100px; } @include for-size(big-desktop-up) { width: 165px; } } .td-missed { color: $orange-50; } } ================================================ FILE: src/containers/Validators/index.tsx ================================================ import { useContext, useEffect } from 'react' import axios from 'axios' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { useWindowSize } from 'usehooks-ts' import { Helmet } from 'react-helmet-async' import NoMatch from '../NoMatch' import { Loader } from '../shared/components/Loader' import { Tabs } from '../shared/components/Tabs' import { useAnalytics } from '../shared/analytics' import { FETCH_INTERVAL_ERROR_MILLIS, FETCH_INTERVAL_VHS_MILLIS, NOT_FOUND, SERVER_ERROR, } from '../shared/utils' import { getLedger } from '../../rippled' import { SimpleTab } from './SimpleTab' import { HistoryTab } from './HistoryTab' import './validator.scss' import SocketContext from '../shared/SocketContext' import { ValidatorReport, ValidatorSupplemented } from '../shared/vhsTypes' import NetworkContext from '../shared/NetworkContext' import { VALIDATOR_ROUTE } from '../App/routes' import { buildPath, useRouteParams } from '../shared/routing' import { VotingTab } from './VotingTab' import logger from '../../rippled/lib/logger' const log = logger({ name: 'validator' }) const ERROR_MESSAGES = { [NOT_FOUND]: { title: 'validator_not_found', hints: ['check_validator_key'], }, default: { title: 'generic_error', hints: ['not_your_fault'], }, } const getErrorMessage = (error: keyof typeof ERROR_MESSAGES | null) => (error && ERROR_MESSAGES[error]) || ERROR_MESSAGES.default export const Validator = () => { const rippledSocket = useContext(SocketContext) const network = useContext(NetworkContext) const { identifier = '', tab = 'details' } = useRouteParams(VALIDATOR_ROUTE) const { width } = useWindowSize() const { trackException, trackScreenLoaded } = useAnalytics() const { t } = useTranslation() const { data, error, isFetching: dataIsLoading, } = useQuery( ['fetchValidatorData', identifier], async () => fetchValidatorData(), { refetchInterval: (returnedData, _) => returnedData == null ? FETCH_INTERVAL_ERROR_MILLIS : FETCH_INTERVAL_VHS_MILLIS, refetchOnMount: true, enabled: !!network, }, ) const { data: reports, isFetching: reportIsLoading } = useQuery( ['fetchValidatorReport', identifier], async () => fetchValidatorReport(), { refetchInterval: FETCH_INTERVAL_VHS_MILLIS, refetchOnMount: true, }, ) useEffect(() => { trackScreenLoaded({ validator: identifier }) }, [identifier, tab, trackScreenLoaded]) function fetchValidatorReport(): Promise { return axios .get(`${process.env.VITE_DATA_URL}/validator/${identifier}/reports`) .then((resp) => resp.data.reports) .then((vhsReports: ValidatorReport[]) => { const sortedValidatorReports = vhsReports.sort((a, b) => a.date > b.date ? -1 : 1, ) return sortedValidatorReports }) } function fetchValidatorData() { const url = `${process.env.VITE_DATA_URL}/validator/${identifier}` return axios .get(url) .then((resp) => resp.data) .then((response) => { if (response.ledger_hash == null) { return getLedger(response.current_index, rippledSocket) .then((ledgerData) => ({ ...response, ledger_hash: ledgerData.ledger_hash, last_ledger_time: ledgerData.close_time, })) .catch((ledgerError) => { // Log the error and return response without ledger data log.error(`Error fetching ledger data: ${ledgerError.message}`) return response }) } return response }) .catch((axiosError) => { const status = axiosError.response && axiosError.response.status ? axiosError.response.status : SERVER_ERROR trackException(`${url} --- ${JSON.stringify(axiosError)}`) return Promise.reject(status) }) } function renderPageTitle() { if (!data) { return undefined } let short = '' if (data.domain) { short = data.domain } else if (data.master_key) { short = `${data.master_key.substring(0, 8)}...` } else if (data.signing_key) { short = `${data.signing_key.substring(0, 8)}...` } return } function renderSummary() { let name = 'Unknown Validator' if (data?.domain) { name = `Validator / Domain: ${data.domain}` } else if (data?.master_key) { name = `Validator / Public Key: ${data.master_key.substring(0, 8)}...` } else if (data?.signing_key) { name = `Validator / Ephemeral Key: ${data.signing_key.substring(0, 8)}...` } let subtitle = 'UNKNOWN KEY' if (data?.master_key) { subtitle = `MASTER KEY: ${data.master_key}` } else if (data?.signing_key) { subtitle = `SIGNING KEY: ${data.signing_key}` } return (
    {name}
    {subtitle}
    ) } function renderTabs() { const tabs = ['details', 'history', 'voting'] const mainPath = buildPath(VALIDATOR_ROUTE, { identifier }) return } function renderValidator() { let body switch (tab) { case 'history': body = break case 'voting': body = data && break default: body = data && break } return ( <> {renderPageTitle()} {renderSummary()} {renderTabs()}
    {body}
    ) } const isLoading = dataIsLoading || reportIsLoading let body if (error) { const message = getErrorMessage(error) body = } else if (data?.master_key || data?.signing_key) { body = renderValidator() } else if (!isLoading) { body = (

    Could not load validator

    ) } return (
    {renderPageTitle()} {isLoading && } {body}
    ) } ================================================ FILE: src/containers/Validators/simpleTab.scss ================================================ @use '../shared/css/variables' as *; .simple-body-validator { .row { .unl { img { height: 16px; padding-top: 2px; } } } } ================================================ FILE: src/containers/Validators/test/HistoryTab.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { HistoryTab } from '../HistoryTab' import history from './mock_data/history.json' import i18n from '../../../i18n/testConfig' import { ValidatorReport } from '../../shared/vhsTypes' describe(`HistoryTab:`, () => { const renderHistoryTab = (reports?: ValidatorReport[]) => render( , ) it('should render reports', () => { const { container } = renderHistoryTab(history) const rows = container.querySelectorAll('tbody tr') expect(rows).toHaveLength(8) const rowWithMisses = rows[3] expect( rowWithMisses.querySelector('.col-date .full-date'), ).toHaveTextContent('Sunday, August 28, 2022') expect( rowWithMisses.querySelector('.col-date .abbrev-date'), ).toHaveTextContent('8/28/2022') // Check less than 1 score expect(rowWithMisses.querySelector('.col-score')).toHaveClass('td-missed') expect(rowWithMisses.querySelector('.col-score')).toHaveTextContent( '0.99829', ) expect(rowWithMisses.querySelector('.col-missed')).toHaveClass('td-missed') expect(rowWithMisses.querySelector('.col-missed')).toHaveTextContent('37') // Check incomplete output expect(rows[7].querySelector('.col-score')).toHaveTextContent('0.99995*') }) it('should render loader', () => { const { container } = renderHistoryTab() expect(container.querySelectorAll('tbody tr')).toHaveLength(1) expect(container.querySelector('.loader')).toBeInTheDocument() }) }) ================================================ FILE: src/containers/Validators/test/SimpleTab.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { SimpleTab } from '../SimpleTab' import { expectSimpleRowLabel, expectSimpleRowText, } from '../../shared/components/Transaction/test' import i18n from '../../../i18n/testConfigEnglish' import validator from './mock_data/validator.json' describe('SimpleTab container', () => { const renderSimpleTab = (width = 1200) => render( , ) it('renders simple tab information', () => { const { container } = renderSimpleTab() expect(container.querySelectorAll('.simple-body').length).toBe(1) expect(container.querySelectorAll('a').length).toBe(2) expectSimpleRowText(container, 'version', '1.9.4') expectSimpleRowLabel( container, 'ledger-time', 'Last Ledger Date/Time (UTC)', ) expectSimpleRowText(container, 'ledger-time', '5/28/2020, 9:21:19 AM') expectSimpleRowLabel(container, 'ledger-index', 'Last Ledger Index') expectSimpleRowText(container, 'ledger-index', '55764842') expectSimpleRowLabel(container, '.unl', 'UNL') expectSimpleRowText(container, '.unl', 'vl.ripple.com') expectSimpleRowLabel(container, 'score-h1', 'Agreement (1 hour)') expectSimpleRowText(container, 'score-h1', '1.00000') expectSimpleRowLabel(container, 'score-h24', 'Agreement (24 hours)') expectSimpleRowText(container, 'score-h24', '1.00000*') expectSimpleRowLabel(container, 'score-d30', 'Agreement (30 days)') expectSimpleRowText(container, 'score-d30', '0.99844*') }) it('renders index row instead of index cart in width smaller than 900', () => { const { container } = renderSimpleTab(800) expect(container.querySelectorAll('.simple-body').length).toBe(1) expect(container.querySelectorAll('.index').length).toBe(0) }) }) ================================================ FILE: src/containers/Validators/test/Validator.test.js ================================================ import { render, waitFor } from '@testing-library/react' import moxios from 'moxios' import { Route } from 'react-router' import { BAD_REQUEST } from '../../shared/utils' import { Validator } from '../index' import { getLedger } from '../../../rippled' import NetworkContext from '../../shared/NetworkContext' import testConfigEnglish from '../../../i18n/testConfigEnglish' import { QuickHarness, flushPromises } from '../../test/utils' import { VALIDATOR_ROUTE } from '../../App/routes' global.location = '/validators/aaaa' const MOCK_IDENTIFIER = 'mock-validator-hash' jest.mock('../../../rippled', () => ({ __esModule: true, getLedger: jest.fn(), })) describe('Validator container', () => { const renderValidator = (props = {}) => { const defaultGetLedgerImpl = () => new Promise( () => {}, () => {}, ) getLedger.mockImplementation(props.getLedgerImpl || defaultGetLedgerImpl) return render( } /> , ) } beforeEach(async () => { moxios.install() }) afterEach(() => { moxios.uninstall() }) it('renders without crashing', () => { const { container } = renderValidator() expect(container.querySelector('.validator')).toBeInTheDocument() }) it('renders loading', () => { const { container } = renderValidator() expect(container.querySelector('.loader')).toBeInTheDocument() }) it('sets title to domain', async () => { moxios.stubRequest( `${process.env.VITE_DATA_URL}/validator/${MOCK_IDENTIFIER}`, { status: 200, response: { domain: 'example.com', ledger_hash: 'sample-ledger-hash', master_key: 'foo', }, }, ) renderValidator() await flushPromises() await flushPromises() expect(document.title).toBe('Validator example.com') }) it('sets title to master_key', async () => { moxios.stubRequest( `${process.env.VITE_DATA_URL}/validator/${MOCK_IDENTIFIER}`, { status: 200, response: { master_key: 'foo', ledger_hash: 'sample-ledger-hash', }, }, ) renderValidator() await flushPromises() await flushPromises() expect(document.title).toBe('Validator foo...') }) it('sets title to signing_key', async () => { moxios.stubRequest( `${process.env.VITE_DATA_URL}/validator/${MOCK_IDENTIFIER}`, { status: 200, response: { signing_key: 'bar', ledger_hash: 'sample-ledger-hash', }, }, ) renderValidator() await flushPromises() await flushPromises() expect(document.title).toBe('Validator bar...') }) it('fetches ledger hash if not provided', async () => { moxios.stubRequest( `${process.env.VITE_DATA_URL}/validator/${MOCK_IDENTIFIER}`, { status: 200, response: { master_key: 'foo', domain: 'test.example.com', current_index: '12345', }, }, ) const ledger = { status: 200, response: { ledger_hash: 'sample-ledger-hash', last_ledger_time: 123456789, }, } renderValidator({ getLedgerImpl: () => Promise.resolve(ledger), }) await flushPromises() await flushPromises() expect(getLedger).toHaveBeenCalledTimes(1) expect(getLedger).toHaveBeenCalledWith('12345', undefined) expect(document.title).toBe('Validator test.example.com') }) it('renders 404 page on no match', async () => { moxios.stubRequest( `${process.env.VITE_DATA_URL}/validator/${MOCK_IDENTIFIER}`, { status: BAD_REQUEST, response: { error: 'something went wrong' }, }, ) const { container } = renderValidator() await flushPromises() await flushPromises() await waitFor(() => { expect(container.querySelector('.no-match')).toBeInTheDocument() }) }) it('displays all details except last ledger date/time on ledger 404 error', async () => { moxios.stubRequest( `${process.env.VITE_DATA_URL}/validator/${MOCK_IDENTIFIER}`, { status: 200, response: { master_key: 'foo', domain: 'test.example.com', current_index: '12345', }, }, ) const notFoundError = new Error('Ledger not found') notFoundError.response = { status: 404 } const { container } = renderValidator({ getLedgerImpl: () => Promise.reject(notFoundError), }) await flushPromises() await flushPromises() expect(getLedger).toHaveBeenCalledWith('12345', undefined) expect(document.title).toBe('Validator test.example.com') // test ledger-time isn't updated expect( container.querySelector('[data-testid="ledger-time"]'), ).not.toBeInTheDocument() // test ledger-index stays the same const lastLedgerIndex = container.querySelector( '[data-testid="ledger-index"]', ) expect(lastLedgerIndex).toBeInTheDocument() expect(lastLedgerIndex.querySelector('.value')).toHaveTextContent('12345') }) }) ================================================ FILE: src/containers/Validators/test/VotingTab.test.tsx ================================================ import { render, waitFor } from '@testing-library/react' import moxios from 'moxios' import { Route } from 'react-router' import i18n from '../../../i18n/testConfigEnglish' import { VotingTab } from '../VotingTab' import { QuickHarness } from '../../test/utils' import validator from './mock_data/validator.json' import amendments from './mock_data/amendments.json' import NetworkContext from '../../shared/NetworkContext' import { VALIDATOR_ROUTE } from '../../App/routes' import { buildPath } from '../../shared/routing' jest.mock('usehooks-ts', () => ({ useWindowSize: () => ({ width: 375, height: 600, }), })) describe('VotingTab container', () => { const path = buildPath(VALIDATOR_ROUTE, { identifier: validator.signing_key, tab: 'voting', }) const renderVotingTab = () => render( } /> , ) const oldEnvs = process.env beforeEach(() => { moxios.install() process.env = { ...oldEnvs, VITE_ENVIRONMENT: 'mainnet' } }) afterEach(() => { moxios.uninstall() process.env = oldEnvs }) it('renders without crashing', () => { renderVotingTab() }) it('renders voting tab information', async () => { moxios.stubRequest(`${process.env.VITE_DATA_URL}/amendments/vote/main`, { status: 200, response: amendments, }) const { container } = renderVotingTab() await waitFor(() => { expect(container.querySelectorAll('.metrics .cell').length).toBe(3) expect(container.querySelectorAll('.voting-amendment .rows').length).toBe( 2, ) }) // Render fees voting correctly const cells = container.querySelectorAll('.metrics .cell') expect(cells[0].innerHTML).toContain('0.00001') expect(cells[1].innerHTML).toContain('10.00') expect(cells[2].innerHTML).toContain('2.00') // Render amendments correctly expect(container.querySelectorAll('.amendment-label').length).toBe(1) const rows = container.querySelectorAll('.voting-amendment .rows') expect(rows[0].innerHTML).toContain('AMM') expect(rows[0].innerHTML).toContain('Nay') expect(rows[1].innerHTML).toContain('Clawback') expect(rows[1].innerHTML).toContain('Yea') }) }) ================================================ FILE: src/containers/Validators/test/mock_data/amendments.json ================================================ { "amendments": [ { "id": "2E2FB9CF8A44EB80F4694D38AADAE9B8B7ADAFD2F092E10068E61C98C4F092B0", "ledger_index": 81986305, "tx_hash": "EFE82B7155CE5B766AF343D98DAE6662C2713C99E760D610370D02338881B2F3", "date": "2023-08-21T05:59:11.000Z", "name": "fixUniversalNumber", "rippled_version": "1.10.0", "deprecated": false }, { "id": "75A7E01C505DD5A179DFE3E000A9B6F1EDDEB55A12F95579A23E15B15DC8BE5A", "ledger_index": 81986305, "tx_hash": "65B8A4068B20696A866A07E5668B2AEB0451564E13B79421356FB962EC9A536B", "date": "2023-08-21T05:59:11.000Z", "name": "ImmediateOfferKilled", "rippled_version": "1.10.0", "deprecated": false }, { "id": "8CC0774A3BF66D1D22E76BBDA8E8A232E6B6313834301B3B23E8601196AE6455", "name": "AMM", "rippled_version": "1.12.0", "deprecated": false, "voted": { "count": 6, "validators": [ { "signing_key": "n9L7m2qvpDm4Jc7vBpW2gb5TJEbj1UNDxWyiYX91c2wBCWHknnA5", "ledger_index": "82658047" }, { "signing_key": "n9JiUqAXcHFzNFtdJ9uYeNZsdJTs1LGf4zr98bN7mWHxdtDpijAB", "ledger_index": "82658047" }, { "signing_key": "n94NK1FSM9d6wkMsUhzPVPPGPzNxcEJNV5LguNoFRAa7V2o4Vmpf", "ledger_index": "82658047" }, { "signing_key": "n9L8gNy4bXu8P8hR4wCPFvpomr6rtTRMUT5nX8jiYUVZD1oQ1dx5", "ledger_index": "82658047" }, { "signing_key": "n9LkKWDtnHvmauvBXC3xqaG2G8QMcFAAvRFbJLT5maBv7SwQnd9p", "ledger_index": "82658047" }, { "signing_key": "n9MxDjQMr1DkzW3Z5X1guKJq4QNDEeYFPgqGgHfpzerGbHWGZvj4", "ledger_index": "82658047" } ] } }, { "id": "56B241D7A43D40354D02A9DC4C8DF5C7A1F930D92A9035C4E12291B3CA3E1C2B", "name": "Clawback", "rippled_version": "1.12.0", "deprecated": false, "voted": { "count": 15, "validators": [ { "signing_key": "n9KNmrXo9gK3ucZy8KHKFM113ENGv6uyukS6Bb7TtuvEx98SdwMS", "ledger_index": "82658047" }, { "signing_key": "n94aSAP9QcYtmKxgCTxcv3xeD2cB6tuwH3mNDQzrjAQ5DTu7SfZi", "ledger_index": "82658047" }, { "signing_key": "n9LHt3x8EhVWatBKuEWYNBas1jxiAdsxtP5QtohtcPZgRUan4Jgi", "ledger_index": "82658047" }, { "signing_key": "n9L7m2qvpDm4Jc7vBpW2gb5TJEbj1UNDxWyiYX91c2wBCWHknnA5", "ledger_index": "82658047" }, { "signing_key": "n9Kto4YT6BqYbz5CYDqU8pqmw7k1dZD9eUrTt3CppAh5Vo2HmUct", "ledger_index": "82658047" }, { "signing_key": "n9LoWo183FhqjMznQ6aLNhWZ1gJvQdrnFq2QQn7wPgeZtvuPm68j", "ledger_index": "82658047" }, { "signing_key": "n94a894ARPe5RdcaRgdMBB9gG9ukS5mqsd7q2oNmC1NKqtZqEJnb", "ledger_index": "82658047" }, { "signing_key": "n9JiUqAXcHFzNFtdJ9uYeNZsdJTs1LGf4zr98bN7mWHxdtDpijAB", "ledger_index": "82658047" }, { "signing_key": "n94NK1FSM9d6wkMsUhzPVPPGPzNxcEJNV5LguNoFRAa7V2o4Vmpf", "ledger_index": "82658047" }, { "signing_key": "n9L8gNy4bXu8P8hR4wCPFvpomr6rtTRMUT5nX8jiYUVZD1oQ1dx5", "ledger_index": "82658047" }, { "signing_key": "n9LkKWDtnHvmauvBXC3xqaG2G8QMcFAAvRFbJLT5maBv7SwQnd9p", "ledger_index": "82658047" }, { "signing_key": "n9MxDjQMr1DkzW3Z5X1guKJq4QNDEeYFPgqGgHfpzerGbHWGZvj4", "ledger_index": "82658047" }, { "signing_key": "n9KaxgJv69FucW5kkiaMhCqS6sAR1wUVxpZaZmLGVXxAcAse9YhR", "ledger_index": "82658047" }, { "signing_key": "n94rGrfuwvYTS1HEeWboW2nGvAQgVDpiD8id2pLWSHFVggBRpQRE", "ledger_index": "82658047" }, { "signing_key": "n9M2UqXLK25h9YEQTskmCXbWPGhQmB1pFVqeXia38UwLaL838VbG", "ledger_index": "82658047" } ] } } ] } ================================================ FILE: src/containers/Validators/test/mock_data/history.json ================================================ [ { "validation_public_key": "nHUFE9prPXPrHcG3SkwP1UzAQbSphqyQkQK9ATXLZsfkezhhda3p", "date": "2022-08-31T23:00:00.000Z", "chain": "main", "score": "1.00000", "total": "21654", "missed": "0", "incomplete": false }, { "validation_public_key": "nHUFE9prPXPrHcG3SkwP1UzAQbSphqyQkQK9ATXLZsfkezhhda3p", "date": "2022-08-30T23:00:00.000Z", "chain": "main", "score": "1.00000", "total": "21705", "missed": "0", "incomplete": false }, { "validation_public_key": "nHUFE9prPXPrHcG3SkwP1UzAQbSphqyQkQK9ATXLZsfkezhhda3p", "date": "2022-08-29T23:00:00.000Z", "chain": "main", "score": "1.00000", "total": "21610", "missed": "0", "incomplete": false }, { "validation_public_key": "nHUFE9prPXPrHcG3SkwP1UzAQbSphqyQkQK9ATXLZsfkezhhda3p", "date": "2022-08-28T23:00:00.000Z", "chain": "main", "score": "0.99829", "total": "21579", "missed": "37", "incomplete": false }, { "validation_public_key": "nHUFE9prPXPrHcG3SkwP1UzAQbSphqyQkQK9ATXLZsfkezhhda3p", "date": "2022-08-27T23:00:00.000Z", "chain": "main", "score": "1.00000", "total": "21602", "missed": "0", "incomplete": false }, { "validation_public_key": "nHUFE9prPXPrHcG3SkwP1UzAQbSphqyQkQK9ATXLZsfkezhhda3p", "date": "2022-08-26T23:00:00.000Z", "chain": "main", "score": "1.00000", "total": "21473", "missed": "0", "incomplete": false }, { "validation_public_key": "nHUFE9prPXPrHcG3SkwP1UzAQbSphqyQkQK9ATXLZsfkezhhda3p", "date": "2022-08-25T23:00:00.000Z", "chain": "main", "score": "1.00000", "total": "21642", "missed": "0", "incomplete": false }, { "validation_public_key": "nHUFE9prPXPrHcG3SkwP1UzAQbSphqyQkQK9ATXLZsfkezhhda3p", "date": "2022-08-24T23:00:00.000Z", "chain": "main", "score": "0.99995", "total": "21672", "missed": "1", "incomplete": true } ] ================================================ FILE: src/containers/Validators/test/mock_data/validator.json ================================================ { "master_key": "nHUvzia57LRXr9zqnYpyFUFeKvis2tqn4DkXBVGSppt5M4nNq43C", "signing_key": "n9KNmrXo9gK3ucZy8KHKFM113ENGv6uyukS6Bb7TtuvEx98SdwMS", "validation_public_key": "nHUvzia57LRXr9zqnYpyFUFeKvis2tqn4DkXBVGSppt5M4nNq43C", "ledger_hash": "D498209A1B1BBACB9D7C8419F9A4136E7F7748E66B7936D2F92249A2C1AFBCB9", "current_index": 55764842, "partial": false, "chain": "main", "unl": "vl.ripple.com", "last_ledger_time": "2020-05-28T09:21:19.000Z", "server_version": "1.9.4", "agreement_1h": { "score": "1.00000", "missed": 0, "incomplete": false, "total": 917 }, "agreement_24h": { "score": "1.00000", "missed": 0, "incomplete": true, "total": 22184 }, "agreement_30day": { "score": "0.99844", "missed": 1046, "total": 672351, "incomplete": true }, "domain": "digifin.uk", "base_fee": 10, "reserve_base": 10000000, "reserve_inc": 2000000, "amendments": [ { "id": "56B241D7A43D40354D02A9DC4C8DF5C7A1F930D92A9035C4E12291B3CA3E1C2B", "name": "Clawback" } ] } ================================================ FILE: src/containers/Validators/types.ts ================================================ export interface ValidatorReport { chain: string date: string incomplete: boolean missed: string score: string total: string // eslint-disable-next-line camelcase -- mimicking rippled validation_public_key: string } ================================================ FILE: src/containers/Validators/validator.scss ================================================ @use '../shared/css/variables' as *; .validator { position: relative; min-height: 600px; @include for-size(tablet-landscape-up) { width: 552px; margin: auto; } @include for-size(desktop-up) { width: 772px; } @include for-size(big-desktop-up) { width: 1140px; } .loader { position: absolute; z-index: 1; top: 0; } .summary { width: calc(100% - 32px); padding: 30px 16px 20px; .type { display: inline-block; margin-bottom: 24px; color: $white; font-size: 32px; @include bold; } .label { margin-top: 16px; margin-bottom: 4px; color: $black-80; font-size: 24px; line-height: 32px; @include bold; @include for-size(tablet-landscape-up) { font-size: 32px; line-height: 40px; } @include for-size(desktop-up) { font-size: 40px; line-height: 48px; } @include for-size(big-desktop-up) { font-size: 40px; line-height: 48px; } } .hash { overflow: hidden; padding-bottom: 87px; color: $black-40; font-size: 12px; letter-spacing: 0px; line-height: 20px; text-overflow: ellipsis; white-space: nowrap; @include medium; } .status { display: inline-block; padding: 0px 15px 5px; font-size: 10px; line-height: 18px; text-transform: uppercase; vertical-align: middle; @include bold; @include for-size(tablet-landscape-up) { font-size: 12px; line-height: 20px; } @include for-size(desktop-up) { font-size: 12px; line-height: 20px; } @include for-size(big-desktop-up) { font-size: 12px; line-height: 20px; } &.success { color: $green; } &.fail { color: $orange-40; span { text-transform: none; } } img { position: relative; top: 4px; width: 16px; height: 16px; margin-right: 4px; } } } .tab-body { margin: 0px auto; } } ================================================ FILE: src/containers/Validators/votingTab.scss ================================================ @use '../shared/css/variables' as *; .voting { margin-left: 24px; .metrics { &.metrics-voting { width: auto; padding-left: 0; text-align: left; .cell { display: flex; justify-content: space-between; margin: 0 !important; text-align: left; @include for-size(tablet-landscape-up) { display: inline-block; } } } } .amendment-label { margin-top: 48px; font-size: 24px; font-weight: 700; } .voting-amendment { font-size: 14px; .rows { margin-top: 32px; background-color: $black-80; } .row { display: flex; flex-flow: row wrap; justify-content: space-between; padding: 16px; border-bottom: 1px solid $black-70; } .label { margin: 0; font-weight: 100; text-transform: capitalize; } .text-truncate { @extend %truncate; } } .badge { color: $black-100; text-transform: uppercase; &.yea { background-color: $green-60; } &.nay { background-color: $black-30; } } .no-match { &.no-match-amendments { margin: 32px 0; } } } ================================================ FILE: src/containers/Vault/CurrencyToggle.tsx ================================================ import { ReactNode } from 'react' import { useTranslation } from 'react-i18next' import { useTooltip } from '../shared/components/Tooltip' import './styles.scss' import HoverIcon from '../shared/images/hover.svg' const USD = 'USD' interface Props { nativeCurrencyDisplay?: ReactNode // Optional JSX for button display (defaults to nativeCurrency) selected: string // The currently selected currency (nativeCurrency or "USD") onToggle: (currency: string) => void usdDisabled?: boolean // Disable USD option when no price is available usdLoading?: boolean // Show loading state while fetching price } export const CurrencyToggle = ({ nativeCurrencyDisplay, selected, onToggle, usdDisabled = false, usdLoading = false, }: Props) => { const { t } = useTranslation() const { showTooltip, hideTooltip } = useTooltip() const renderTextTooltip = (key: string) => ( { const rect = e.currentTarget.getBoundingClientRect() showTooltip('text', e, t(`${key}_description`, { defaultValue: '' }), { x: rect.left + rect.width / 2, y: rect.top - 70, }) }} onMouseLeave={() => hideTooltip()} /> ) const handleUsdClick = () => { if (!usdDisabled && !usdLoading) { onToggle(USD) } } // Native is selected when selected is not USD (handles empty initial state) const isNativeSelected = selected !== USD return (
    {usdLoading && renderTextTooltip('currency_toggle_loading')} {!usdLoading && usdDisabled && renderTextTooltip('currency_toggle_unavailable')}
    {/* Only show tooltip if USD currency conversion data is available */} {!usdLoading && !usdDisabled && renderTextTooltip('currency_toggle')}
    ) } ================================================ FILE: src/containers/Vault/VaultDepositors/api/depositors.ts ================================================ import { getMPTHolders } from '../../../../rippled/lib/rippled' import { XRPLHolder } from '../../../shared/components/HoldersTable/HoldersTable' interface VaultHolderFromClio { account: string mpt_amount: string } export interface VaultDepositorSummary { depositors: XRPLHolder[] totalDepositors: number } /** * Fetches all vault depositors and calculates their share values. * * @param rippledSocket - The rippled socket connection * @param shareMptId - The MPT ID for vault shares * @param totalSupply - Total supply of vault shares * @param assetsTotal - Total assets in the vault * @param tokenToUsdRate - Exchange rate from token to USD * @returns Summary with all depositors and total count */ export async function fetchAllVaultDepositors( rippledSocket: any, shareMptId: string, totalSupply: string | undefined, assetsTotal: string | undefined, tokenToUsdRate: number, ): Promise { const allHolders: VaultHolderFromClio[] = [] let marker: string | undefined do { // eslint-disable-next-line no-await-in-loop const response = await getMPTHolders( rippledSocket, shareMptId, 100, // Fetch 100 at a time for efficiency marker || '', ) if (response.mpt_holders) { allHolders.push(...response.mpt_holders) } marker = response.marker } while (marker) const totalSupplyNum = totalSupply ? Number(totalSupply) : 0 const assetsTotalNum = assetsTotal ? Number(assetsTotal) : 0 // Filter out zero balances and sort by amount in descending order const sortedHolders = allHolders .filter((h) => Number(h.mpt_amount || 0) > 0) .sort((a, b) => Number(b.mpt_amount || 0) - Number(a.mpt_amount || 0)) // Calculate USD value for a holder's share const calculateValueUsd = (holderAmount: string): number | null => { const amount = Number(holderAmount) if (!totalSupplyNum || !assetsTotalNum) return null // Proportional value: (holder tokens / total supply) * total assets const value = (amount / totalSupplyNum) * assetsTotalNum // Convert to USD if (tokenToUsdRate > 0) { return value * tokenToUsdRate } return null } // Format depositors with rank and percentage const depositors: XRPLHolder[] = sortedHolders.map( (holder: VaultHolderFromClio, index: number) => { const amount = Number(holder.mpt_amount || '0') const percent = totalSupplyNum > 0 ? (amount / totalSupplyNum) * 100 : 0 return { rank: index + 1, account: holder.account, balance: holder.mpt_amount, percent, value_usd: calculateValueUsd(holder.mpt_amount), } }, ) return { depositors, totalDepositors: depositors.length, } } ================================================ FILE: src/containers/Vault/VaultDepositors/index.tsx ================================================ import { useContext, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import SocketContext from '../../shared/SocketContext' import { useAnalytics } from '../../shared/analytics' import { Loader } from '../../shared/components/Loader' import { HoldersTable } from '../../shared/components/HoldersTable/HoldersTable' import { useTokenToUSDRate } from '../../shared/hooks/useTokenToUSDRate' import { fetchAllVaultDepositors } from './api/depositors' import './styles.scss' interface AssetInfo { currency: string issuer?: string mpt_issuance_id?: string } interface Props { shareMptId: string totalSupply: string | undefined assetsTotal: string | undefined asset?: AssetInfo } const PAGE_SIZE = 10 export const VaultDepositors = ({ shareMptId, totalSupply, assetsTotal, asset, }: Props) => { const { t } = useTranslation() const { trackException } = useAnalytics() const rippledSocket = useContext(SocketContext) const [currentPage, setCurrentPage] = useState(1) const { rate: tokenToUsdRate } = useTokenToUSDRate(asset) const { data, isFetching: loading, error, } = useQuery( [ 'getVaultDepositors', shareMptId, totalSupply, assetsTotal, tokenToUsdRate, ], async () => fetchAllVaultDepositors( rippledSocket, shareMptId, totalSupply, assetsTotal, tokenToUsdRate, ), { enabled: !!shareMptId, onError: (e: any) => { trackException( `Error fetching Vault depositors ${shareMptId} --- ${JSON.stringify(e)}`, ) }, }, ) // Client-side pagination const paginatedDepositors = useMemo(() => { if (!data?.depositors) { return [] } const start = (currentPage - 1) * PAGE_SIZE const end = start + PAGE_SIZE return data.depositors.slice(start, end) }, [data?.depositors, currentPage]) if (error) { return (

    {t('depositors')}

    {t('depositors_fetch_error')}
    ) } if (loading && !data) { return (

    {t('depositors')}

    ) } if (!data || data.depositors.length === 0) { return (

    {t('depositors')}

    {t('no_depositors_message')}
    ) } // TODO: Test the visual appearance of this table after Clio API mpt_holders is implemented return (

    {t('depositors')}

    ) } ================================================ FILE: src/containers/Vault/VaultDepositors/styles.scss ================================================ @use '../../shared/css/variables' as *; .vault-depositors-section { width: 100%; padding: 0 24px; margin-top: 48px; @include for-size(desktop-up) { padding: 0 64px; } .vault-depositors-title { margin: 0 0 16px; color: $white; font-size: 24px; @include bold; } .vault-depositors-divider { background: $black-70; } .no-depositors-message { padding: 32px; color: $black-40; text-align: center; } .depositors-error-message { padding: 32px; color: #ff6b6b; text-align: center; } } .depositor-table { width: 100%; border-collapse: collapse; thead { tr { border-bottom: 1px solid $black-70; } th { padding: 16px 12px; color: $black-40; font-size: 12px; font-weight: normal; letter-spacing: 0.5px; text-align: left; text-transform: uppercase; &:first-child { padding-left: 0; } &:last-child { padding-right: 0; } } } tbody { tr { border-bottom: 1px solid $black-80; &:hover { background: rgba($white, 0.02); } } td { padding: 16px 12px; color: $white; font-size: 14px; &:first-child { padding-left: 0; } &:last-child { padding-right: 0; } } } .rank-cell { width: 80px; color: $black-40; } .account-cell { min-width: 150px; a { color: $green; text-decoration: none; &:hover { text-decoration: underline; } } } .tokens-cell { min-width: 120px; } .percent-cell { min-width: 100px; } .value-cell { min-width: 100px; } } .pagination { display: flex; align-items: center; justify-content: center; padding: 16px 0; margin-top: 24px; gap: 16px; .pagination-btn { padding: 8px 16px; border: 1px solid $black-60; border-radius: 4px; background: transparent; color: $white; cursor: pointer; font-size: 14px; transition: all 0.2s; &:disabled { cursor: not-allowed; opacity: 0.3; } &:hover:not(:disabled) { border-color: $green; color: $green; } } .pagination-info { color: $white; font-size: 14px; } } ================================================ FILE: src/containers/Vault/VaultDepositors/test/VaultDepositors.test.tsx ================================================ import React from 'react' import { render, screen, fireEvent, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider, QueryClient } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { VaultDepositors } from '../index' import { fetchAllVaultDepositors } from '../api/depositors' import Mock = jest.Mock jest.mock('../api/depositors', () => ({ fetchAllVaultDepositors: jest.fn(), })) jest.mock('../../../shared/analytics', () => ({ useAnalytics: () => ({ trackException: jest.fn() }), })) jest.mock('../../../shared/hooks/useTokenToUSDRate', () => ({ useTokenToUSDRate: () => ({ rate: 1.5, isAvailable: true, isLoading: false }), })) const mockedFetchAllDepositors = fetchAllVaultDepositors as Mock const mockSocket = {} as any const createQueryClient = () => new QueryClient({ defaultOptions: { queries: { retry: false, staleTime: 0, cacheTime: 0 } }, }) const TestWrapper = (queryClient: QueryClient) => ({ children }: { children: React.ReactNode }) => ( {children} ) const shareMptId = 'TEST_MPT_ID' const totalSupply = '1000000' const assetsTotal = '500000' const asset = { currency: 'XRP' } // Generate mock depositors for pagination testing (PAGE_SIZE = 10) const createMockDepositors = (count: number) => Array.from({ length: count }, (_, i) => ({ rank: i + 1, account: `rAccount${i + 1}`, balance: `${(100 - i) * 1000}`, percent: (100 - i) / 10, value_usd: (100 - i) * 100, })) describe('VaultDepositors', () => { beforeEach(() => { jest.clearAllMocks() }) it('renders loading state', () => { mockedFetchAllDepositors.mockReturnValue(new Promise(() => {})) render( , { wrapper: TestWrapper(createQueryClient()) }, ) expect(screen.getByText('Depositors')).toBeInTheDocument() expect(screen.getByAltText('Loading')).toBeInTheDocument() }) it('renders error state', async () => { mockedFetchAllDepositors.mockRejectedValue(new Error('API Error')) render( , { wrapper: TestWrapper(createQueryClient()) }, ) await waitFor(() => { expect( screen.getByText(/Unable to fetch depositors information/i), ).toBeInTheDocument() }) }) it('renders empty state when no depositors', async () => { mockedFetchAllDepositors.mockResolvedValue({ depositors: [], totalDepositors: 0, }) render( , { wrapper: TestWrapper(createQueryClient()) }, ) await waitFor(() => { expect(screen.getByText(/No depositors found/i)).toBeInTheDocument() }) }) it('renders depositors table with data', async () => { mockedFetchAllDepositors.mockResolvedValue({ depositors: createMockDepositors(5), totalDepositors: 5, }) render( , { wrapper: TestWrapper(createQueryClient()) }, ) await waitFor(() => { expect(screen.getByText('rAccount1')).toBeInTheDocument() expect(screen.getByText('rAccount5')).toBeInTheDocument() }) }) it('handles pagination when more than 10 depositors', async () => { // 15 depositors = 2 pages (10 + 5) mockedFetchAllDepositors.mockResolvedValue({ depositors: createMockDepositors(15), totalDepositors: 15, }) render( , { wrapper: TestWrapper(createQueryClient()) }, ) // Page 1: first 10 depositors await waitFor(() => { for (let i = 1; i <= 10; i += 1) { expect(screen.getByText(`rAccount${i}`)).toBeInTheDocument() } }) expect(screen.queryByText('rAccount11')).not.toBeInTheDocument() // Click page 2 const page2Button = screen.getByRole('button', { name: '2' }) fireEvent.click(page2Button) // Page 2: depositors 11-15 await waitFor(() => { expect(screen.getByText('rAccount11')).toBeInTheDocument() expect(screen.getByText('rAccount15')).toBeInTheDocument() }) }) it('disables query when shareMptId is empty', () => { render( , { wrapper: TestWrapper(createQueryClient()) }, ) expect(mockedFetchAllDepositors).not.toHaveBeenCalled() }) }) ================================================ FILE: src/containers/Vault/VaultHeader/index.tsx ================================================ import { useContext } from 'react' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { TokenTableRow } from '../../shared/components/TokenTableRow' import { Account } from '../../shared/components/Account' import { CopyableText } from '../../shared/components/CopyableText/CopyableText' import { useTokenToUSDRate } from '../../shared/hooks/useTokenToUSDRate' import { RouteLink } from '../../shared/routing' import { MPT_ROUTE } from '../../App/routes' import SocketContext from '../../shared/SocketContext' import { getMPTIssuance } from '../../../rippled/lib/rippled' import { parseVaultWebsite } from '../utils' import { shortenVaultID, shortenAccount, getCurrencySymbol, isCurrencyExoticSymbol, } from '../../shared/utils' import './styles.scss' import { useAnalytics } from '../../shared/analytics' import { parseAmount } from '../../shared/NumberFormattingUtils' import { convertHexToString } from '../../../rippled/lib/utils' import { Metadata } from '../../Token/MPT/Header/Metadata' import Currency from '../../shared/components/Currency' import { parseMPTokenMetadata } from '../../shared/mptUtils' interface VaultData { Owner?: string Asset?: { currency?: string issuer?: string mpt_issuance_id?: string } AssetsTotal?: string AssetsAvailable?: string AssetsMaximum?: string MPTIssuanceID?: string Flags?: number LossUnrealized?: string PseudoAccount?: string WithdrawalPolicy?: number Data?: string ShareMPTID?: string } interface Props { data: VaultData vaultId: string displayCurrency: string } // Vault flags from XLS-65d spec const VAULT_FLAGS = { lsfVaultPrivate: 0x00010000, } // Withdrawal policy values from XLS-65d spec const WITHDRAWAL_POLICIES: { [key: number]: string } = { 1: 'first_come_first_served', } export const VaultHeader = ({ data, vaultId, displayCurrency }: Props) => { const { t } = useTranslation() const { trackException } = useAnalytics() const rippledSocket = useContext(SocketContext) const { rate: tokenToUsdRate } = useTokenToUSDRate( data.Asset?.currency ? { currency: data.Asset.currency, issuer: data.Asset.issuer } : undefined, ) const { Owner: owner, Asset: asset, AssetsTotal: assetsTotal, AssetsAvailable: assetsAvailable, AssetsMaximum: assetsMaximum, Flags: flags, LossUnrealized: lossUnrealized, WithdrawalPolicy: withdrawalPolicy, Data: vaultDataRaw, ShareMPTID: vaultShareMptId, } = data // Converts amount to USD if displayCurrency is 'USD', otherwise returns as-is const convertToDisplayCurrency = ( amount: string | undefined, ): string | undefined => { if (!amount || displayCurrency !== 'USD') return amount const numAmount = Number(amount) if (Number.isNaN(numAmount)) return amount return tokenToUsdRate > 0 ? String(numAmount * tokenToUsdRate) : undefined } const { data: vaultAssetMptIssuanceData } = useQuery( ['getVaultAssetMPTIssuance', asset?.mpt_issuance_id], async () => { if (!asset?.mpt_issuance_id) return null const resp = await getMPTIssuance(rippledSocket, asset?.mpt_issuance_id) return resp?.node }, { enabled: !!asset?.mpt_issuance_id, onError: (e: any) => { trackException( `Error fetching MPT Issuance data for the Vault Asset MPT ID ${asset?.mpt_issuance_id} --- ${JSON.stringify(e)}`, ) }, }, ) const parsedAssetMptMetadata = parseMPTokenMetadata( vaultAssetMptIssuanceData?.MPTokenMetadata, ) const mptTicker = parsedAssetMptMetadata?.ticker as string | undefined // Returns 'USD' when showing USD values, otherwise the vault's asset currency const getDisplayCurrencyLabel = (): string => displayCurrency === 'USD' ? 'USD' : getCurrencySymbol( asset?.currency ?? mptTicker ?? asset?.mpt_issuance_id, ) // Fetch MPTokenIssuance to get the DomainID (vault credential) const { data: mptIssuanceData } = useQuery( ['getVaultShareMPTIssuance', vaultShareMptId], async () => { if (!vaultShareMptId) return null const resp = await getMPTIssuance(rippledSocket, vaultShareMptId) return resp?.node }, { enabled: !!vaultShareMptId, onError: (e: any) => { trackException( `Error fetching MPT Issuance data for MPT ID ${vaultShareMptId} --- ${JSON.stringify(e)}`, ) }, }, ) const vaultCredential = mptIssuanceData?.DomainID const isPrivate = flags !== undefined && (flags & VAULT_FLAGS.lsfVaultPrivate) !== 0 const decodedData = convertHexToString(vaultDataRaw) const vaultWebsite = parseVaultWebsite(vaultDataRaw) const getWithdrawalPolicyText = () => { if (withdrawalPolicy === undefined) return '-' const policyKey = WITHDRAWAL_POLICIES[withdrawalPolicy] if (!policyKey) return String(withdrawalPolicy) // Use type assertion for dynamic translation keys return t(policyKey as 'first_come_first_served') } const renderMPTSharesLink = () => { if (!vaultShareMptId) return '-' return ( {vaultShareMptId} ) } return (

    {t('vault')}

    } /> {owner && ( } /> )} {t('yes')} {t('no')} } /> {vaultCredential && ( )} {vaultWebsite && ( {vaultWebsite} } /> )} { if (!decodedData) return '-' try { return JSON.parse(decodedData) } catch { return decodedData } })()} displayMetadataTitle={false} /> } />
    ) } /> { const convertedAmount = convertToDisplayCurrency(assetsTotal) if ( convertedAmount === undefined && displayCurrency === 'USD' ) { return '--' } const amount = convertedAmount ?? assetsTotal if (amount === undefined) return '--' if ( ['0', '0.00', '0.0000'].includes( parseAmount(amount ?? '0', 2), ) ) return '--' // Note: As per the NumberFormat policy, prices in the range of [10_000, 1M] do not display decimal values // Very large prices (greater than 1M must have two decimal places) const displayedCurrency: string = getDisplayCurrencyLabel() if (Number(amount) < 1000000 && Number(amount) >= 10000) { if ( isCurrencyExoticSymbol(asset?.currency) && displayedCurrency !== 'USD' ) return `${getCurrencySymbol(asset?.currency)} ${parseAmount(amount, 0)}` // All USD denominated amounts are prefixed by `$` symbol return `${displayedCurrency === 'USD' ? '$' : ''}${parseAmount(amount, 0)} ${displayedCurrency}` } if ( isCurrencyExoticSymbol(asset?.currency) && displayedCurrency !== 'USD' ) return `${getCurrencySymbol(asset?.currency)} ${parseAmount(amount, 2)}` return `${displayedCurrency === 'USD' ? '$' : ''}${parseAmount(amount, 2)} ${displayedCurrency}` })()} /> { if (assetsMaximum === undefined) return t('no_limit') const parsedAmt = parseAmount(assetsMaximum, 2) if (['0', '0.00', '0.0000'].includes(parsedAmt)) return '--' const displayedCurrency: string = getDisplayCurrencyLabel() if ( isCurrencyExoticSymbol(asset?.currency) && displayedCurrency !== 'USD' ) return `${getCurrencySymbol(asset?.currency)} ${parsedAmt}` return `${displayedCurrency === 'USD' ? '$' : ''}${parsedAmt} ${displayedCurrency}` })()} /> { const parsedAmt = parseAmount(assetsAvailable ?? '0', 2) if (['0', '0.00', '0.0000'].includes(parsedAmt)) return '--' const displayedCurrency: string = getDisplayCurrencyLabel() if ( isCurrencyExoticSymbol(asset?.currency) && displayedCurrency !== 'USD' ) return `${getCurrencySymbol(asset?.currency)} ${parsedAmt}` return `${displayedCurrency === 'USD' ? '$' : ''}${parsedAmt} ${displayedCurrency}` })()} /> { const parsedAmt = parseAmount(lossUnrealized ?? '0', 2) if (['0', '0.00', '0.0000'].includes(parsedAmt)) return '--' const displayedCurrency: string = getDisplayCurrencyLabel() if ( isCurrencyExoticSymbol(asset?.currency) && displayedCurrency !== 'USD' ) return `${getCurrencySymbol(asset?.currency)} ${parsedAmt}` return `${displayedCurrency === 'USD' ? '$' : ''}${parsedAmt} ${displayedCurrency}` })()} />
    ) } ================================================ FILE: src/containers/Vault/VaultHeader/styles.scss ================================================ @use '../../shared/css/variables' as *; @use '../../shared/css/table'; .vault-section { width: 100%; padding: 0 24px; @include for-size(desktop-up) { padding: 0 64px; } .vault-section-title { margin: 0 0 16px; color: $white; font-size: 24px; @include bold; } .vault-section-divider { margin-bottom: 24px; background: $black-70; } } .vault-details-container { display: flex; flex-direction: column; gap: 24px; @include for-size(desktop-up) { flex-direction: row; gap: 80px; } .details-column { min-width: 0; flex: 1; .token-table { margin-top: 0; } } } // Override the MPT-page Metadata styles to fit inside a table row .vault-details-container .header-box.metadata-box { width: 100%; max-width: 100%; flex: initial; gap: 0; // Strip the outer wrapper — the JsonView container provides its own box .header-box-contents { padding: 0; border: none; } .metadata-json { overflow: visible; max-height: none; } .json-view-container { padding: 12px; border-radius: 6px; } .json-view { margin-bottom: 0; @include for-size(phone-only) { padding-top: 0; } } // Hide the Expand button — vault data is small enough to show fully .json-view-controls { display: none; } .metadata-string { padding: 0; font-size: 13px; } } .private-vault-toggle { display: inline-flex; gap: 8px; .toggle-pill { padding: 4px 16px; border: 1px solid $black-50; border-radius: 16px; color: $black-50; font-size: 12px; text-transform: uppercase; @include medium; &.active { border-color: $green; background: $green; color: $black; } } } ================================================ FILE: src/containers/Vault/VaultHeader/test/VaultHeader.test.tsx ================================================ /** * VaultHeader Component Unit Tests * * This test suite validates the VaultHeader component which displays * vault information including owner, assets, privacy settings, and * various financial metrics. * * Key concepts tested: * - Vault privacy flag (lsfVaultPrivate: 0x00010000) * - Asset types: XRP, IOU tokens, and MPTs (Multi-Purpose Tokens) * - Compact number formatting (K for thousands, M for millions) * - Hex-encoded Data field decoding * - Withdrawal policies from XLS-65d spec * - Vault credentials (DomainID from MPTokenIssuance) */ import { render, screen, waitFor, cleanup } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { VaultHeader } from '../index' import { queryClient } from '../../../shared/QueryClient' import { getMPTIssuance } from '../../../../rippled/lib/rippled' import Mock = jest.Mock // Mock the rippled library to control API responses jest.mock('../../../../rippled/lib/rippled') // Mock the XRP to USD rate hook const mockXRPToUSDRate = jest.fn() jest.mock('../../../shared/hooks/useXRPToUSDRate', () => ({ useXRPToUSDRate: () => mockXRPToUSDRate(), })) // Mock the token to USD rate hook const mockTokenToUSDRate = jest.fn() jest.mock('../../../shared/hooks/useTokenToUSDRate', () => ({ useTokenToUSDRate: (token: any) => { const result = mockTokenToUSDRate(token) // Return object structure if mockTokenToUSDRate returns a number if (typeof result === 'number') { return { rate: result, isAvailable: result > 0, isLoading: false } } // Otherwise return the result as-is (for custom mock implementations) return result }, })) const mockedGetMPTIssuance = getMPTIssuance as Mock // Mock socket client - represents the WebSocket connection to rippled const mockSocket = {} as any /** * TestWrapper Component * * Provides all necessary context providers for the VaultHeader component: * - I18nextProvider: Internationalization for translated text * - Router: React Router for link components * - SocketContext: WebSocket connection for rippled queries * - QueryClientProvider: React Query for data fetching/caching */ const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) describe('VaultHeader Component', () => { // Reset mocks and clear query cache before each test // This ensures tests are isolated and don't affect each other beforeEach(() => { jest.clearAllMocks() queryClient.clear() cleanup() // Default mock: no MPT issuance data (vault credential) mockedGetMPTIssuance.mockResolvedValue({ node: null }) // Default mock: XRP to USD rate of 2.0 for predictable conversion tests mockXRPToUSDRate.mockReturnValue(2.0) // Default mock: Token to USD rate based on asset type // XRP: 2.0 (same as XRP to USD rate) // RLUSD: 1.0 (stablecoin pegged 1:1 to USD) // Other: 0 (no conversion available) mockTokenToUSDRate.mockImplementation((token: any) => { if (!token) return 0 if (token.currency === 'XRP') return 2.0 if (token.currency === 'RLUSD') return 1.0 return 0 }) }) /** * ========================================= * SECTION 1: Basic Rendering Tests * ========================================= * These tests verify the component renders correctly with minimal data */ describe('Basic Rendering', () => { it('renders the vault section title', () => { // Minimal vault data required for rendering const vaultData = { Owner: 'rTestOwner123', Asset: { currency: 'XRP' }, } render( , ) // The component should display "Vault" as the section title const title = screen.getByText('Vault') expect(title.tagName).toBe('H2') expect(title).toHaveClass('vault-section-title') }) it('renders the vault details container', () => { const vaultData = { Owner: 'rTestOwner123', Asset: { currency: 'XRP' }, } const { container } = render( , ) // Verify the main container structure exists expect(container.querySelector('.vault-section')).toBeInTheDocument() expect( container.querySelector('.vault-details-container'), ).toBeInTheDocument() }) it('displays the vault ID with truncation', () => { const vaultId = 'ABC123DEF456GHI789JKL012' const vaultData = { Owner: 'rTestOwner123', Asset: { currency: 'XRP' }, } render( , ) // Vault ID should be truncated for display: first 8 chars + "..." + last 6 chars // This makes long IDs more readable while still being identifiable const vaultIdLabel = screen.getByText('Vault ID') expect(vaultIdLabel).toBeInTheDocument() // Verify the truncated format: ABC123DE...KL012 (8 chars + ... + 6 chars) const expectedTruncated = `${vaultId.substring(0, 8)}...${vaultId.substring(vaultId.length - 6)}` expect(screen.getByText(expectedTruncated)).toBeInTheDocument() }) it('displays the owner as a clickable account link', () => { const owner = 'rOwnerAccount123456' const vaultData = { Owner: owner, Asset: { currency: 'XRP' }, } render( , ) // Owner label should be present expect(screen.getByText('Owner')).toBeInTheDocument() // Owner value should display the exact account address as link text // The Account component displays the full address for short accounts const ownerLink = screen.getByRole('link', { name: `${owner.slice(0, 7)}...${owner.slice(-5)}`, }) expect(ownerLink.getAttribute('href')).toBe(`/accounts/${owner}`) }) }) /** * ========================================= * SECTION 2: Private Vault Flag Tests * ========================================= * Vaults can be public or private, controlled by the lsfVaultPrivate flag (0x00010000) * The UI displays this as YES/NO pill buttons */ describe('Private Vault Flag', () => { it('displays YES as active when vault is private (flag = 0x00010000)', () => { // lsfVaultPrivate flag is bit 16 (0x00010000) from XLS-65d spec const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, Flags: 0x00010000, // Private vault } const { container } = render( , ) // Verify the "Private Vault" label exists expect(screen.getByText('Private Vault')).toBeInTheDocument() // Find the toggle pills const togglePills = container.querySelectorAll('.toggle-pill') expect(togglePills.length).toBe(2) // YES pill should be active for private vault, with exact text const yesPill = togglePills[0] const noPill = togglePills[1] expect(yesPill.textContent).toBe('Yes') expect(noPill.textContent).toBe('No') expect(yesPill).toHaveClass('active') expect(noPill).not.toHaveClass('active') }) it('displays NO as active when vault is public (flag = 0)', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, Flags: 0, // Public vault (no flags set) } const { container } = render( , ) const togglePills = container.querySelectorAll('.toggle-pill') // NO pill should be active for public vault const yesPill = togglePills[0] const noPill = togglePills[1] expect(yesPill).not.toHaveClass('active') expect(noPill).toHaveClass('active') }) it('displays NO as active when Flags is undefined', () => { // When Flags field is missing, vault is treated as public const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, // Flags is intentionally omitted } const { container } = render( , ) const togglePills = container.querySelectorAll('.toggle-pill') const noPill = togglePills[1] expect(noPill).toHaveClass('active') }) it('correctly identifies private flag when combined with other flags', () => { // Flags can have multiple bits set; we need bitwise AND to check lsfVaultPrivate const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, Flags: 0x00010001, // Private flag (0x00010000) + another flag (0x00000001) } const { container } = render( , ) const togglePills = container.querySelectorAll('.toggle-pill') const yesPill = togglePills[0] expect(yesPill).toHaveClass('active') }) }) /** * ========================================= * SECTION 3: Asset Type Display Tests * ========================================= * Vaults can hold different asset types: * - XRP (native currency) * - IOU tokens (issued currencies like RLUSD) * - MPTs (Multi-Purpose Tokens identified by mpt_issuance_id) */ describe('Asset Type Display', () => { it('displays XRP for native currency vaults', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, } render( , ) // Verify exact label and value expect(screen.getByText('Asset')).toBeInTheDocument() expect(screen.getByText('\uE900')).toBeInTheDocument() }) it('displays currency code for IOU token vaults', () => { // IOU tokens have a currency code and issuer const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'USD', issuer: 'rIssuerAccount123', }, } render( , ) // Verify the exact currency code is displayed and issuer is hidden const currencyEl = screen.getByTestId('currency') expect(currencyEl).toHaveTextContent('USD') expect(currencyEl).not.toHaveTextContent('rIssuerAccount123') }) it('displays truncated MPT ID as a link for MPT vaults', () => { // MPTs are identified by a hex ID and should link to the MPT details page const mptId = '00001234ABCD5678EF90ABCDEF1234567890ABCDEF' const vaultData = { Owner: 'rTestOwner', Asset: { mpt_issuance_id: mptId, }, } render( , ) // Should be a link to the MPT page with exact truncated text const mptLink = screen.getByRole('link', { name: `${mptId}` }) expect(mptLink.getAttribute('href')).toBe(`/mpt/${mptId}`) }) it('displays dash when asset is undefined', () => { const vaultData = { Owner: 'rTestOwner', // Asset is intentionally omitted } render( , ) // Should display "-" as fallback const assetRow = screen.getByText('Asset').closest('tr') expect(assetRow).toHaveTextContent('AssetUnknown Currency Error') }) }) /** * ========================================= * SECTION 4: Compact Number Formatting Tests * ========================================= * Large numbers are formatted with K (thousands) and M (millions) suffixes * for better readability. Examples: * - 1,500,000 -> "1.5M" * - 250,000 -> "250K" * - 500 -> "500" */ describe('Compact Number Formatting', () => { it('formats millions with M suffix', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, AssetsTotal: '12500000', // 12.5 million AssetsAvailable: '5000000', // 5 million } render( , ) // Numbers >= 1,000,000 should display with M suffix // Verify exact formatted values: 12,500,000 -> "12.5M XRP", 5,000,000 -> "5M XRP" expect(screen.getByText('\uE900 12.50M')).toBeInTheDocument() expect(screen.getByText('\uE900 5.00M')).toBeInTheDocument() }) it('formats thousands with K suffix', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, AssetsAvailable: '250000', // 250 thousand LossUnrealized: '75000', // 75 thousand } render( , ) // Numbers >= 1,000 but < 1,000,000 should display with K suffix // Verify exact formatted values: 250,000 -> "250K XRP", 75,000 -> "75K XRP" expect(screen.getByText('\uE900 250.00K')).toBeInTheDocument() expect(screen.getByText('\uE900 75.00K')).toBeInTheDocument() }) it('displays small numbers without suffix', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, AssetsAvailable: '500', // Less than 1000 } render( , ) // Numbers < 1,000 should display as-is without K/M suffix // Verify exact formatted value: 500 -> "500 XRP" expect(screen.getByText('\uE900 500.00')).toBeInTheDocument() }) it('includes currency code in formatted amounts', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'RLUSD' }, AssetsAvailable: '1000000', } render( , ) // Amount should include the currency code // Verify exact formatted value: 1,000,000 RLUSD -> "1M RLUSD" expect(screen.getByText('1.00M RLUSD')).toBeInTheDocument() }) it('displays dash for undefined amounts', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, // AssetsAvailable is intentionally omitted } render( , ) // Undefined amounts should display as "0" const availableRow = screen.getByText('Available to Borrow').closest('tr') expect(availableRow).toHaveTextContent('Available to Borrow--') }) }) /** * ========================================= * SECTION 5: Data Field Decoding Tests * ========================================= * The vault's Data field can contain hex-encoded UTF-8 text * (e.g., vault name or description). The component should * decode and display it properly. */ describe('Data Field Decoding', () => { it('decodes hex-encoded Data field to UTF-8', () => { // "Hello Vault" encoded as hex: 48656c6c6f205661756c74 const originalText = 'Hello Vault' const hexData = '48656c6c6f205661756c74' // Buffer.from('Hello Vault').toString('hex') const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, Data: hexData, } render( , ) // The decoded text should be displayed with exact match expect(screen.getByText(originalText)).toBeInTheDocument() }) it('displays raw Data if not valid hex', () => { // Data that is not valid hex should be displayed as-is const rawData = 'NotHexData!' const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, Data: rawData, } expect(() => render( , ), ).toThrow('Invalid hex string') }) it('displays dash when Data is undefined', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, // Data is intentionally omitted } render( , ) const dataRow = screen.getByText('Data').closest('tr') expect(dataRow).toHaveTextContent('-') }) }) /** * ========================================= * SECTION 5b: Website Display Tests * ========================================= * The vault's Data field can contain JSON with a "w" (website) field. * When present, the website should be displayed as a clickable link. */ describe('Website Display', () => { it('displays website link when Data contains valid JSON with "w" key', () => { // {"n":"Test Vault","w":"example.com"} encoded as hex const jsonData = JSON.stringify({ n: 'Test Vault', w: 'example.com' }) const hexData = Buffer.from(jsonData).toString('hex') const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, Data: hexData, } render( , ) // Website label and link should be displayed expect(screen.getByText('Website')).toBeInTheDocument() const websiteLink = screen.getByRole('link', { name: 'example.com' }) expect(websiteLink).toHaveAttribute('href', 'https://example.com') expect(websiteLink).toHaveAttribute('target', '_blank') }) it('does not display website row when Data is valid JSON but missing "w" key', () => { // {"n":"Test Vault"} encoded as hex (no website field) const jsonData = JSON.stringify({ n: 'Test Vault' }) const hexData = Buffer.from(jsonData).toString('hex') const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, Data: hexData, } render( , ) // Website row should not be present expect(screen.queryByText('Website')).not.toBeInTheDocument() }) it('does not display website row when Data is not valid JSON', () => { // "Hello Vault" encoded as hex (plain text, not JSON) const hexData = Buffer.from('Hello Vault').toString('hex') const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, Data: hexData, } render( , ) // Website row should not be present expect(screen.queryByText('Website')).not.toBeInTheDocument() }) }) /** * ========================================= * SECTION 6: Withdrawal Policy Tests * ========================================= * Withdrawal policies define how depositors can withdraw funds. * Currently supported: 1 = "First Come, First Served" (from XLS-65d spec) */ describe('Withdrawal Policy Display', () => { it('displays "First Come First Served" for policy 1', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, WithdrawalPolicy: 1, } render( , ) expect(screen.getByText('Withdrawal Policy')).toBeInTheDocument() expect(screen.getByText('First Come First Served')).toBeInTheDocument() }) it('displays numeric value for unknown policy codes', () => { // Unknown policy codes should display the raw number const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, WithdrawalPolicy: 99, // Unknown policy } render( , ) const policyRow = screen.getByText('Withdrawal Policy').closest('tr') expect(policyRow).toHaveTextContent('99') }) it('displays dash when WithdrawalPolicy is undefined', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, // WithdrawalPolicy is intentionally omitted } render( , ) const policyRow = screen.getByText('Withdrawal Policy').closest('tr') expect(policyRow).toHaveTextContent('-') }) }) /** * ========================================= * SECTION 7: Vault Credential (DomainID) Tests * ========================================= * Private vaults may have a credential (DomainID) fetched from * the MPTokenIssuance ledger object associated with ShareMPTID. * This requires an async query to the ledger. */ describe('Vault Credential Display', () => { it('displays vault credential when DomainID is present', async () => { const domainId = 'credential123abc' mockedGetMPTIssuance.mockResolvedValue({ node: { DomainID: domainId }, }) const vaultData = { Account: 'rTestAccount', Asset: { currency: 'XRP' }, ShareMPTID: 'shareMptId123', } render( , ) // Wait for async query to complete and verify exact DomainID value await waitFor(() => { expect(screen.getByText('Permissioned Domain ID')).toBeInTheDocument() expect(screen.getByText(domainId)).toBeInTheDocument() }) }) it('does not display credential row when DomainID is absent', async () => { mockedGetMPTIssuance.mockResolvedValue({ node: {}, // No DomainID }) const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, ShareMPTID: 'shareMptId123', } render( , ) // The credential row should not appear await waitFor(() => { expect( screen.queryByText('Permissioned Domain ID'), ).not.toBeInTheDocument() }) }) it('does not fetch credential when ShareMPTID is missing', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, // ShareMPTID is intentionally omitted } render( , ) // getMPTIssuance should not be called without ShareMPTID expect(mockedGetMPTIssuance).not.toHaveBeenCalled() }) }) /** * ========================================= * SECTION 7b: MPT Asset Ticker from Metadata Tests * ========================================= * When the vault asset is an MPT, the component fetches the MPTokenIssuance * to extract XLS-89 metadata. If a ticker is present, it should be displayed * instead of the raw MPT ID. */ describe('MPT Asset Ticker from Metadata', () => { it('displays ticker from MPT metadata instead of MPT ID', async () => { const mptId = '00001234ABCD5678EF90ABCDEF1234567890ABCDEF' const mptMetadata = { ticker: 'VTKN', name: 'Vault Token' } const mptMetadataHex = Buffer.from(JSON.stringify(mptMetadata)) .toString('hex') .toUpperCase() mockedGetMPTIssuance.mockResolvedValue({ node: { MPTokenMetadata: mptMetadataHex }, }) const vaultData = { Owner: 'rTestOwner', Asset: { mpt_issuance_id: mptId }, } render( , ) // After metadata loads, ticker "VTKN" should appear in the Asset row await waitFor(() => { const assetRow = screen.getByText('Asset').closest('tr') expect(assetRow).toHaveTextContent('VTKN') }) }) it('displays ticker from compact metadata form', async () => { const mptId = '00001234ABCD5678EF90ABCDEF1234567890ABCDEF' // Compact form uses "t" for ticker const mptMetadata = { t: 'USD', n: 'US Dollar Token' } const mptMetadataHex = Buffer.from(JSON.stringify(mptMetadata)) .toString('hex') .toUpperCase() mockedGetMPTIssuance.mockResolvedValue({ node: { MPTokenMetadata: mptMetadataHex }, }) const vaultData = { Owner: 'rTestOwner', Asset: { mpt_issuance_id: mptId }, } render( , ) await waitFor(() => { const assetRow = screen.getByText('Asset').closest('tr') expect(assetRow).toHaveTextContent('USD') }) }) it('falls back to MPT ID when metadata has no ticker', async () => { const mptId = '00001234ABCD5678EF90ABCDEF1234567890ABCDEF' // Metadata without ticker field const mptMetadata = { name: 'Some Token' } const mptMetadataHex = Buffer.from(JSON.stringify(mptMetadata)) .toString('hex') .toUpperCase() mockedGetMPTIssuance.mockResolvedValue({ node: { MPTokenMetadata: mptMetadataHex }, }) const vaultData = { Owner: 'rTestOwner', Asset: { mpt_issuance_id: mptId }, } render( , ) // Should fall back to showing the MPT ID await waitFor(() => { const mptLink = screen.getByRole('link', { name: `${mptId}` }) expect(mptLink).toBeInTheDocument() }) }) it('falls back to MPT ID when no MPTokenMetadata field exists', async () => { const mptId = '00001234ABCD5678EF90ABCDEF1234567890ABCDEF' mockedGetMPTIssuance.mockResolvedValue({ node: {}, // No MPTokenMetadata }) const vaultData = { Owner: 'rTestOwner', Asset: { mpt_issuance_id: mptId }, } render( , ) await waitFor(() => { const mptLink = screen.getByRole('link', { name: `${mptId}` }) expect(mptLink).toBeInTheDocument() }) }) it('uses ticker in currency label for amount displays', async () => { const mptId = '00001234ABCD5678EF90ABCDEF1234567890ABCDEF' const mptMetadata = { ticker: 'VTKN', name: 'Vault Token', asset_class: 'defi', issuer_name: 'Test Issuer', } const mptMetadataHex = Buffer.from(JSON.stringify(mptMetadata)) .toString('hex') .toUpperCase() mockedGetMPTIssuance.mockResolvedValue({ node: { MPTokenMetadata: mptMetadataHex }, }) const vaultData = { Owner: 'rTestOwner', Asset: { mpt_issuance_id: mptId }, AssetsAvailable: '5000', } render( , ) // The ticker should appear as the currency label in amount fields await waitFor(() => { expect(screen.getByText('5,000.00 VTKN')).toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 8: Shares (MPT) Link Tests * ========================================= * Vault shares are represented as MPTs. The ShareMPTID should * link to the MPT details page with a truncated display. */ describe('Shares Link Display', () => { it('displays truncated ShareMPTID as a link', () => { const shareMptId = 'SHARE1234567890ABCDEF1234567890ABCDEF12' const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, ShareMPTID: shareMptId, } render( , ) // Verify link is present and href is correct const sharesLink = screen.getByRole('link', { name: shareMptId, }) expect(sharesLink.getAttribute('href')).toBe(`/mpt/${shareMptId}`) }) it('displays dash when ShareMPTID is missing', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, // ShareMPTID is intentionally omitted } render( , ) const sharesRow = screen.getByText('Shares').closest('tr') expect(sharesRow).toHaveTextContent('-') }) }) /** * ========================================= * SECTION 9: Maximum Assets / No Limit Tests * ========================================= * Vaults can have a maximum asset cap or be unlimited. * When AssetsMaximum is not set, "No limit" should be displayed. */ describe('Maximum Assets Display', () => { it('displays formatted amount when AssetsMaximum is set', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, AssetsMaximum: '10000000', // 10 million } render( , ) expect(screen.getByText('Max Total Supply')).toBeInTheDocument() expect(screen.getByText(/\uE900 10.00M/)).toBeInTheDocument() }) it('displays "No Limit" when AssetsMaximum is not set', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, // AssetsMaximum is intentionally omitted } render( , ) expect(screen.getByText('No Limit')).toBeInTheDocument() }) }) /** * ========================================= * SECTION 10: Total Value Locked (TVL) Tests * ========================================= * TVL is only displayed for supported currencies (XRP, RLUSD). * For other currencies, it shows "--" as the value may not * be reliably calculable. */ describe('Total Value Locked Display', () => { it('displays TVL for XRP vaults', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, AssetsTotal: '5000000', } render( , ) expect(screen.getByText('Total Value Locked (TVL)')).toBeInTheDocument() // Verify exact TVL value: 5,000,000 -> "5M XRP" expect(screen.getByText('\uE900 5.00M')).toBeInTheDocument() }) it('displays TVL for RLUSD vaults', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'RLUSD' }, AssetsTotal: '2500000', } render( , ) // Verify exact TVL value: 2,500,000 -> "2.50M RLUSD" expect(screen.getByText('2.50M RLUSD')).toBeInTheDocument() }) it('displays TVL in native currency for unsupported currencies', () => { // TVL is shown in native currency even for arbitrary currencies // when displayCurrency is 'native' (native mode) const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'UNKNOWN' }, AssetsTotal: '1000000', } render( , ) // In native mode, TVL is shown in the asset's currency expect(screen.getByText('1.00M UNKNOWN')).toBeInTheDocument() }) }) /** * ========================================= * SECTION 11: Edge Cases and Error Handling * ========================================= * Tests for unusual inputs and boundary conditions */ describe('Edge Cases', () => { it('handles empty vault data gracefully', () => { const vaultData = {} render( , ) // Component should render without crashing expect(screen.getByText('Vault')).toBeInTheDocument() }) it('handles very long vault IDs', () => { const longVaultId = 'A'.repeat(100) const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, } render( , ) // Should truncate without errors expect(screen.getByText('Vault ID')).toBeInTheDocument() }) }) /** * ========================================= * SECTION 12: Currency Toggle Conversion Tests * ========================================= * Tests that verify TVL conversion between native currency and USD * when the user toggles the currency display option. * * Conversion rules: * - XRP: Multiply by XRP/USD exchange rate * - RLUSD: 1:1 with USD (stablecoin) * - Other currencies: Show "--" (no conversion available) */ describe('Currency Toggle Conversion', () => { it('converts XRP TVL to USD using exchange rate when displayCurrency is "usd"', () => { // Mock XRP/USD rate of 2.5 mockXRPToUSDRate.mockReturnValue(2.5) mockTokenToUSDRate.mockImplementation((token: any) => { if (token?.currency === 'XRP') return 2.5 return 0 }) const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'XRP' }, AssetsTotal: '1000000', // 1 million XRP } render( , ) // 1,000,000 XRP * 2.5 = 2,500,000 USD = "2.50M USD" // formatAmount joins [prefix, formattedNum, currency] with spaces expect(screen.getByText('$2.50M USD')).toBeInTheDocument() }) it('displays RLUSD TVL as USD with 1:1 conversion when displayCurrency is "usd"', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'RLUSD' }, AssetsTotal: '5000000', // 5 million RLUSD } render( , ) // RLUSD is a stablecoin pegged 1:1 to USD // 5,000,000 RLUSD = "5.00M USD" expect(screen.getByText('$5.00M USD')).toBeInTheDocument() }) it('convert native currency EUR into USD displayed currency', () => { const vaultData = { Owner: 'rTestOwner', Asset: { currency: 'EUR', issuer: 'rIssuerAccount123' }, AssetsTotal: '1000000', // 1 million EUR } mockTokenToUSDRate.mockImplementation((token: any) => { if (token?.currency === 'EUR') return 2 return 0 }) render( , ) const tvlRow = screen.getByText('Total Value Locked (TVL)').closest('tr') expect(tvlRow).toHaveTextContent('Total Value Locked (TVL)$2.00M USD') }) }) }) ================================================ FILE: src/containers/Vault/VaultLoans/BrokerDetails.tsx ================================================ import { useTranslation } from 'react-i18next' import { CopyableText } from '../../shared/components/CopyableText/CopyableText' import { useTokenToUSDRate } from '../../shared/hooks/useTokenToUSDRate' import { formatRate, LSF_LOAN_DEFAULT } from './utils' import { BrokerLoansTable } from './BrokerLoansTable' import WarningIcon from '../../shared/images/warning.svg' import { parseAmount } from '../../shared/NumberFormattingUtils' import { shortenMPTID, getCurrencySymbol, isCurrencyExoticSymbol, } from '../../shared/utils' // TODO: Use types from xrpl.js instead of hand-writing it. interface LoanBrokerData { index: string Account: string Data?: string ManagementFeeRate?: number CoverAvailable?: string CoverRateMinimum?: number CoverRateLiquidation?: number DebtTotal?: string DebtMaximum?: string } interface AssetInfo { currency: string issuer?: string mpt_issuance_id?: string } interface Props { broker: LoanBrokerData displayCurrency: string asset?: AssetInfo loans?: any[] mptTicker?: string } export const BrokerDetails = ({ broker, displayCurrency, asset, loans, mptTicker, }: Props) => { const { t } = useTranslation() const { rate: tokenToUsdRate } = useTokenToUSDRate(asset) // Convert amount to display currency (USD or native) const convertToDisplayCurrency = ( amount: string | undefined, ): string | undefined => { if (!amount || displayCurrency !== 'USD') return amount const numAmount = Number(amount) if (Number.isNaN(numAmount)) return amount return tokenToUsdRate > 0 ? String(numAmount * tokenToUsdRate) : undefined } // Check if any loan has the default flag const hasDefaultedLoan = loans?.some( // eslint-disable-next-line no-bitwise -- required to check the status of the loan (loan: any) => loan.TotalValueOutstanding > 0 && (loan.Flags ?? 0) & LSF_LOAN_DEFAULT, ) const formatBrokerAmount = ( amount: string | undefined, inputAsset: AssetInfo | undefined, ): string => { const convertedAmount = convertToDisplayCurrency(amount) if (convertedAmount === undefined && displayCurrency === 'USD') { return '--' } const finalDisplayAmount = convertedAmount ?? amount if (finalDisplayAmount !== undefined) { if (displayCurrency === 'USD') { return `$${parseAmount(finalDisplayAmount, 2)} USD` } if ( inputAsset?.currency && isCurrencyExoticSymbol(inputAsset?.currency) ) { return `${getCurrencySymbol(inputAsset?.currency)} ${parseAmount(finalDisplayAmount, 2)}` } return ( `${parseAmount(finalDisplayAmount, 2)}` + ` ${ inputAsset?.currency ?? mptTicker ?? `${shortenMPTID(inputAsset?.mpt_issuance_id)}` }` ) } return '--' } return (
    {t('loan_broker_id')}
    {t('total_debt')} {formatBrokerAmount(broker.DebtTotal, asset)}
    {t('maximum_debt')} {formatBrokerAmount(broker.DebtMaximum, asset)}
    {t('management_fee')} {formatRate(broker.ManagementFeeRate)}
    {t('first_loss_capital')} {formatBrokerAmount(broker.CoverAvailable, asset)}
    {t('cover_rate_minimum')} {formatRate(broker.CoverRateMinimum)}
    {t('cover_rate_liquidation')} {formatRate(broker.CoverRateLiquidation)}
    {hasDefaultedLoan && (
    {t('loan_default_detected')}
    )}
    ) } ================================================ FILE: src/containers/Vault/VaultLoans/BrokerLoansTable.tsx ================================================ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { LoanRow, LoanData } from './LoanRow' import { LSF_LOAN_DEFAULT, LSF_LOAN_IMPAIRED } from './utils' import { Pagination } from '../../shared/components/Pagination/Pagination' import FilterIcon from '../../shared/images/filter.svg' const ITEMS_PER_PAGE = 10 type LoanFilter = 'all' | 'default' | 'impaired' interface AssetInfo { currency: string issuer?: string mpt_issuance_id?: string } interface Props { loans: LoanData[] | undefined currency: string displayCurrency: string asset?: AssetInfo isCurrencySpecialSymbol?: boolean } export const BrokerLoansTable = ({ loans, currency, displayCurrency, asset, isCurrencySpecialSymbol = false, }: Props) => { const { t } = useTranslation() const [currentPage, setCurrentPage] = useState(1) const [filter, setFilter] = useState('all') const effectiveDisplayCurrency = displayCurrency || currency if (!loans || loans.length === 0) { return (

    {t('no_loans_message')}

    ) } // Filter loans based on selected filter const filteredLoans = loans.filter((loan) => { if (filter === 'all') return true if (filter === 'default') { // eslint-disable-next-line no-bitwise return ( Number(loan.TotalValueOutstanding) > 0 && (loan.Flags ?? 0) & LSF_LOAN_DEFAULT ) } if (filter === 'impaired') { // eslint-disable-next-line no-bitwise return ( Number(loan.TotalValueOutstanding) > 0 && (loan.Flags ?? 0) & LSF_LOAN_IMPAIRED ) } return true }) // Handle filter change and reset pagination const handleFilterChange = (newFilter: LoanFilter) => { setFilter(newFilter) setCurrentPage(1) } // Pagination logic const startIndex = (currentPage - 1) * ITEMS_PER_PAGE const endIndex = startIndex + ITEMS_PER_PAGE const paginatedLoans = filteredLoans.slice(startIndex, endIndex) return (
    {t('loan_id')}
    {t('borrower')}
    {t('amount_requested')}
    {t('interest_rate')}
    {t('outstanding_balance')}
    {t('status')}
    {paginatedLoans.map((loan) => ( ))}
    ) } ================================================ FILE: src/containers/Vault/VaultLoans/BrokerTabs.tsx ================================================ interface LoanBrokerData { index: string Data?: string } interface Props { brokers: LoanBrokerData[] selectedIndex: number onSelect: (index: number) => void loanCountMap: Record } export const BrokerTabs = ({ brokers, selectedIndex, onSelect, loanCountMap, }: Props) => (
    {brokers.map((broker, index) => { const name = `Broker ${index + 1}` const loanCount = loanCountMap[broker.index] ?? 0 const isSelected = index === selectedIndex return ( ) })}
    ) ================================================ FILE: src/containers/Vault/VaultLoans/LoanRow.tsx ================================================ import { useContext, useState } from 'react' import { useTranslation } from 'react-i18next' import { useQuery } from 'react-query' import { Account } from '../../shared/components/Account' import SocketContext from '../../shared/SocketContext' import { useLanguage } from '../../shared/hooks' import { useTokenToUSDRate } from '../../shared/hooks/useTokenToUSDRate' import { parseAmount } from '../../shared/NumberFormattingUtils' import { getLedgerEntry } from '../../../rippled/lib/rippled' import { formatRate, formatPaymentInterval, formatLoanStatus, formatRippleDate, truncateId, } from './utils' import ExpandIcon from '../../shared/images/down_arrow.svg' import { getCurrencySymbol } from '../../shared/utils' export interface LoanData { index: string Borrower: string LoanBrokerID: string TotalValueOutstanding: string InterestRate: number LateInterestRate: number CloseInterestRate: number LoanOriginationFee: string LoanServiceFee: string LatePaymentFee: string ClosePaymentFee: string OverpaymentFee: number PaymentInterval: number PaymentRemaining: number GracePeriod: number StartDate: number NextPaymentDueDate: number Flags: number PaymentTotal?: number PreviousTxnLgrSeq?: number PrincipalOutstanding?: string } interface AssetInfo { currency: string issuer?: string mpt_issuance_id?: string } interface Props { loan: LoanData currency: string displayCurrency: string asset?: AssetInfo isCurrencySpecialSymbol?: boolean } export const LoanRow = ({ loan, currency, displayCurrency, asset, isCurrencySpecialSymbol = false, }: Props) => { const { t } = useTranslation() const language = useLanguage() const rippledSocket = useContext(SocketContext) const { rate: tokenToUsdRate } = useTokenToUSDRate(asset) const [expanded, setExpanded] = useState(false) const { data: originalPrincipal, isLoading: isPrincipalLoading } = useQuery( ['originalPrincipal', loan.index], async () => { if (!loan.PreviousTxnLgrSeq) return loan.PrincipalOutstanding ?? null let lastSuccessful: any = null let currentSeq = loan.PreviousTxnLgrSeq const MAX_ITERATIONS = 100 for (let i = 0; i < MAX_ITERATIONS; i += 1) { try { // eslint-disable-next-line no-await-in-loop const resp = await getLedgerEntry( rippledSocket, { index: loan.index }, currentSeq - 1, ) lastSuccessful = resp.node if (currentSeq === resp.node.PreviousTxnLgrSeq) break currentSeq = resp.node.PreviousTxnLgrSeq } catch { // entryNotFound means we've gone past creation — last success is the creation state break } } return ( lastSuccessful?.PrincipalOutstanding ?? loan.PrincipalOutstanding ?? null ) }, { staleTime: Infinity, enabled: !!rippledSocket, }, ) const { status, colorClass } = formatLoanStatus( loan.Flags, loan.TotalValueOutstanding ?? 0, ) const formatAmount = (amount: string | number): string => { const num = typeof amount === 'string' ? Number(amount) : amount if (Number.isNaN(num)) return String(amount) // Convert to USD if needed let displayNum = num if (displayCurrency === 'USD' && tokenToUsdRate > 0) { displayNum = num * tokenToUsdRate } else if (displayCurrency === 'USD' && tokenToUsdRate === 0) { return '--' } const prefix = displayCurrency === 'USD' ? '$' : '' if (isCurrencySpecialSymbol && displayCurrency !== 'USD') return `${getCurrencySymbol(currency)} ${parseAmount(displayNum, 1, language)}` return `${prefix}${parseAmount(displayNum, 1, language)} ${displayCurrency}` } const formatFee = (fee: string | number): string => { // this method is used with fields which have a soeDEFAULT configuration. If they are not specified, display 0. if (!fee) return '0' const num = typeof fee === 'string' ? Number(fee) : fee if (Number.isNaN(num)) return String(fee) if (num === 0) return '0' // Convert to USD if needed let displayNum = num if (displayCurrency === 'USD' && tokenToUsdRate > 0) { displayNum = num * tokenToUsdRate } else if (displayCurrency === 'USD' && tokenToUsdRate === 0) { return '--' } const prefix = displayCurrency === 'USD' ? '$' : '' if (isCurrencySpecialSymbol) return `${getCurrencySymbol(currency)} ${parseAmount(displayNum, 1, language)}` return `${prefix}${parseAmount(displayNum, 1, language)} ${displayCurrency}` } const formatGracePeriod = (seconds: number): string => { const days = Math.round(seconds / 86400) return `${days} Days` } return (
    {expanded && (
    {t('next_due_date')} {formatRippleDate(loan.NextPaymentDueDate, language)}
    {t('origination_date')} {formatRippleDate(loan.StartDate, language)}
    {t('frequency')} {formatPaymentInterval(loan.PaymentInterval)}
    {t('installments')} {loan.PaymentRemaining}
    {t('grace_period')} {formatGracePeriod(loan.GracePeriod)}
    {t('loan_origination_fee')} {formatFee(loan.LoanOriginationFee)}
    {t('loan_service_fee')} {formatFee(loan.LoanServiceFee)}
    {t('late_interest_rate')} {formatRate(loan.LateInterestRate)}
    {t('late_payment_fee')} {formatFee(loan.LatePaymentFee)}
    {t('prepayment_fee')} {formatFee(loan.OverpaymentFee)}
    {t('full_payment_fee')} {formatFee(loan.ClosePaymentFee)}
    )}
    ) } ================================================ FILE: src/containers/Vault/VaultLoans/index.tsx ================================================ import { useContext, useState } from 'react' import { useTranslation } from 'react-i18next' import { useQuery, useQueries } from 'react-query' import SocketContext from '../../shared/SocketContext' import { getAccountObjects } from '../../../rippled/lib/rippled' import { useAnalytics } from '../../shared/analytics' import { Loader } from '../../shared/components/Loader' import { BrokerTabs } from './BrokerTabs' import { BrokerDetails } from './BrokerDetails' import './styles.scss' interface LoanBrokerData { index: string LedgerEntryType: string Account: string Owner: string VaultID: string Data?: string ManagementFeeRate?: number CoverAvailable?: string CoverRateMinimum?: number CoverRateLiquidation?: number DebtTotal?: string DebtMaximum?: string OwnerCount?: number } interface AssetInfo { currency: string issuer?: string mpt_issuance_id?: string } interface Props { vaultId: string vaultPseudoAccount: string displayCurrency: string asset?: AssetInfo mptTicker?: string } export const VaultLoans = ({ vaultId, vaultPseudoAccount, displayCurrency, asset, mptTicker, }: Props) => { const { t } = useTranslation() const { trackException } = useAnalytics() const rippledSocket = useContext(SocketContext) const [selectedBrokerIndex, setSelectedBrokerIndex] = useState(0) const { data: loanBrokers, isFetching: loading } = useQuery< LoanBrokerData[] | undefined >( ['getVaultLoanBrokers', vaultPseudoAccount], async () => { const allBrokers: LoanBrokerData[] = [] let marker: string | undefined do { // eslint-disable-next-line no-await-in-loop const resp = await getAccountObjects( rippledSocket, vaultPseudoAccount, 'loan_broker', marker, ) if (!resp?.account_objects) { break } const vaultBrokers = resp.account_objects.filter( (obj: LoanBrokerData) => obj.VaultID === vaultId, ) allBrokers.push(...vaultBrokers) marker = resp.marker } while (marker) return allBrokers }, { enabled: !!vaultPseudoAccount, onError: (e: any) => { trackException( `Error fetching Loan Brokers for account ${vaultPseudoAccount} --- ${JSON.stringify(e)}`, ) }, }, ) // Fetch loans for each broker - must be called before any early returns // This data is shared with BrokerDetails to avoid duplicate API calls // Paginates through all results using marker const brokerLoansQueries = useQueries( (loanBrokers ?? []).map((broker) => ({ queryKey: ['getBrokerLoans', broker.Account, broker.index], queryFn: async () => { const allLoans: any[] = [] let marker: string | undefined do { // eslint-disable-next-line no-await-in-loop const resp = await getAccountObjects( rippledSocket, broker.Account, 'loan', marker, ) if (!resp?.account_objects) { break } const brokerLoans = resp.account_objects.filter( (obj: any) => obj.LoanBrokerID === broker.index, ) allLoans.push(...brokerLoans) marker = resp.marker } while (marker) return { brokerId: broker.index, loans: allLoans } }, enabled: !!broker.Account && !!broker.index, })), ) // Build maps of broker ID to loans and loan counts const brokerLoansMap: Record = {} const loanCountMap: Record = {} brokerLoansQueries.forEach((query) => { if (query.data) { brokerLoansMap[query.data.brokerId] = query.data.loans loanCountMap[query.data.brokerId] = query.data.loans.length } }) if (loading) { return (

    {t('loans')}

    ) } if (!loanBrokers || loanBrokers.length === 0) { return (

    {t('loans')}

    {t('no_loan_brokers_message')}
    ) } loanBrokers.sort( (a: LoanBrokerData, b: LoanBrokerData) => loanCountMap[b.index] - loanCountMap[a.index], ) const selectedBroker = loanBrokers[selectedBrokerIndex] return (

    {t('loans')}

    {selectedBroker && ( )}
    ) } ================================================ FILE: src/containers/Vault/VaultLoans/styles.scss ================================================ @use '../../shared/css/variables' as *; .vault-loans-section { width: 100%; padding: 0 24px; margin-top: 48px; @include for-size(desktop-up) { padding: 0 64px; } .vault-loans-title { margin: 0 0 16px; color: $white; font-size: 24px; @include bold; } .vault-loans-divider { margin-bottom: 24px; background: $black-70; } } .broker-tabs { display: flex; flex-wrap: wrap; margin-bottom: 24px; gap: 12px; .broker-tab { padding: 10px 20px; border: 1px solid $black-60; border-radius: 24px; background: transparent; color: $white; cursor: pointer; font-size: 14px; transition: background-color 0.2s, border-color 0.2s; &:hover { border-color: $black-40; } &.selected { border-color: $green; background: $green; color: $black; @include bold; } } } .broker-details-card { padding: 24px; border-radius: 8px; background: $black-80; .broker-header { margin-bottom: 24px; .broker-label { display: block; margin-bottom: 4px; color: $black-40; font-size: 12px; letter-spacing: 0.5px; text-transform: uppercase; } .broker-name { margin: 0; color: $white; font-size: 20px; @include bold; } } .broker-metrics { display: grid; gap: 24px; grid-template-columns: repeat(2, 1fr); @include for-size(desktop-up) { grid-template-columns: repeat(4, 1fr); } .metric { .metric-label { display: block; margin-bottom: 8px; color: $black-40; font-size: 12px; letter-spacing: 0.5px; text-transform: uppercase; } .metric-value { color: $white; font-size: 16px; } } } .broker-top-row { display: grid; padding-bottom: 24px; border-bottom: 1px solid $black-70; margin-bottom: 24px; gap: 24px; grid-template-columns: 1fr; @include for-size(desktop-up) { grid-template-columns: repeat(4, 1fr); } .broker-id-section { @include for-size(desktop-up) { grid-column: span 2; } .broker-id-label { display: block; margin-bottom: 8px; color: $black-40; font-size: 12px; letter-spacing: 0.5px; text-transform: uppercase; } .broker-id-value { display: flex; align-items: center; color: $white; font-size: 16px; gap: 8px; word-break: break-all; } } .broker-debt-section { display: contents; .debt-metric { .metric-label { display: block; margin-bottom: 8px; color: $black-40; font-size: 12px; letter-spacing: 0.5px; text-transform: uppercase; } .metric-value { color: $white; font-size: 16px; } } } } // Default loan warning banner .broker-default-banner { display: flex; align-items: center; padding: 16px 20px; border-radius: 8px; margin-top: 24px; background: rgb(139 69 19 / 60%); gap: 12px; .warning-icon { width: 20px; height: 20px; flex-shrink: 0; color: #ffd700; } span { color: $white; font-size: 14px; } } } // Broker Loans Table Styles .broker-loans-table { padding-top: 24px; border-top: 1px solid $black-70; margin-top: 32px; overflow-x: auto; } // Loans Filter Bar .loans-filter-bar { display: flex; align-items: center; justify-content: flex-end; margin-bottom: 16px; gap: 12px; .filter-buttons { display: flex; gap: 8px; .filter-btn { padding: 6px 16px; border: 1px solid $black-60; border-radius: 16px; background: transparent; color: $white; cursor: pointer; font-size: 13px; transition: background-color 0.2s, border-color 0.2s; &:hover { border-color: $black-40; } &.active { border-color: $green; background: $green; color: $black; @include bold; } } .filter-indicator { display: flex; align-items: center; .filter-icon { width: 16px; height: 16px; fill: $black-40; } } } } .broker-loans-loading, .broker-loans-empty, .no-loan-brokers-message { padding: 32px; color: $black-40; text-align: center; } .loans-table-header { display: grid; min-width: 750px; padding: 16px 8px; border-bottom: 1px solid $black-70; gap: 16px; grid-template-columns: 1.5fr 1.2fr 1.5fr 1fr 1.5fr 0.8fr; .header-cell { color: $black-40; font-size: 14px; letter-spacing: 0.5px; text-transform: uppercase; } } .loans-table-body { .loan-row { border-bottom: 1px solid $black-70; &:last-child { border-bottom: none; } &.expanded { background: rgba($black-70, 0.3); } } } .loan-row-main { display: grid; width: 100%; min-width: 750px; padding: 16px 8px; border: none; background: transparent; cursor: pointer; gap: 16px; grid-template-columns: 1.5fr 1.2fr 1.5fr 1fr 1.5fr 0.8fr; text-align: left; transition: background-color 0.2s; &:hover { background: rgba($black-70, 0.5); } .loan-cell { display: flex; align-items: center; color: $white; font-size: 14px; &.loan-id { gap: 8px; .expand-icon { width: 12px; height: 12px; fill: $black-40; transition: transform 0.2s; &.rotated { transform: rotate(180deg); } } .loan-id-text { color: $white; } } &.borrower { .account { color: $green; text-decoration: none; &:hover { text-decoration: underline; } } } &.status { gap: 8px; .status-dot { width: 8px; height: 8px; border-radius: 50%; } &.status-current { color: $green; .status-dot { background: $green; } } &.status-default { color: #ff6b6b; .status-dot { background: #ff6b6b; } } &.status-impaired { color: #ffa500; .status-dot { background: #ffa500; } } &.status-paid-off { color: $black-40; .status-dot { background: $black-40; } } } } } .loan-row-details { padding: 16px 32px 24px; background: rgba($black-70, 0.5); .details-row { display: grid; margin-bottom: 16px; gap: 16px 24px; grid-template-columns: repeat(2, 1fr); @include for-size(desktop-up) { grid-template-columns: repeat(5, 1fr); } &:last-child { margin-bottom: 0; } } .detail-item { .detail-label { display: block; margin-bottom: 4px; color: $black-40; font-size: 11px; letter-spacing: 0.5px; text-transform: uppercase; } .detail-value { color: $white; font-size: 14px; } } } // Pagination Styles .loans-pagination { display: flex; align-items: center; justify-content: center; padding: 24px 0; gap: 4px; .pagination-btn { min-width: 32px; height: 32px; padding: 0 8px; border: 1px solid $black-60; border-radius: 4px; background: transparent; color: $white; cursor: pointer; font-size: 14px; transition: background-color 0.2s, border-color 0.2s; &:disabled { cursor: not-allowed; opacity: 0.5; } &:hover:not(:disabled) { border-color: $black-40; background: $black-70; } &.active { border-color: $green; background: $green; color: $black; @include bold; } &.prev, &.next, &.last { font-weight: bold; } } .pagination-ellipsis { padding: 0 8px; color: $black-40; } } ================================================ FILE: src/containers/Vault/VaultLoans/test/BrokerLoansTable.test.tsx ================================================ /** * BrokerLoansTable Component Unit Tests * * This test suite validates the BrokerLoansTable component which displays * a filterable, paginated table of loans for a loan broker. * * Key concepts tested: * - Empty state when no loans exist * - Filter functionality (All Loans, Default, Impaired) * - Table header rendering * - Pagination controls and navigation * - Filter + pagination interaction (page reset on filter change) * - Loan row rendering */ import { render, screen, fireEvent, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider, QueryClient } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { BrokerLoansTable } from '../BrokerLoansTable' import { LoanData } from '../LoanRow' import { getLedgerEntry } from '../../../../rippled/lib/rippled' import { LSF_LOAN_DEFAULT, LSF_LOAN_IMPAIRED } from '../utils' import { isCurrencyExoticSymbol } from '../../../shared/utils' import Mock = jest.Mock jest.mock('../../../../rippled/lib/rippled', () => ({ getLedgerEntry: jest.fn(), })) jest.mock('../../../shared/hooks/useTokenToUSDRate', () => ({ useTokenToUSDRate: () => ({ rate: 1.5, isAvailable: true, isLoading: false }), })) const mockedGetLedgerEntry = getLedgerEntry as Mock const mockSocket = {} as any // Default test props const defaultDisplayCurrency = 'XRP' const defaultAsset = { currency: 'XRP' } /** * Creates a fresh QueryClient for each test */ const createTestQueryClient = () => new QueryClient({ defaultOptions: { queries: { retry: false, staleTime: 0, cacheTime: 0, }, }, }) /** * TestWrapper Component * * BrokerLoansTable needs: * - I18nextProvider: For translated text (filter buttons, headers, empty message) * - Router: For Account links in LoanRow * - QueryClientProvider: For useTokenToUSDRate hook in LoanRow */ const TestWrapper = ({ children }: { children: React.ReactNode }) => { const queryClient = createTestQueryClient() return ( {children} ) } /** * SocketTestWrapper Component * * Like TestWrapper but includes SocketContext.Provider so that the * originalPrincipal useQuery (enabled: !!rippledSocket) actually fires. */ const SocketTestWrapper = ({ children }: { children: React.ReactNode }) => { const queryClient = createTestQueryClient() return ( {children} ) } /** * Mock loan data generator * * Creates a loan object with all required fields. * The Flags field can be set to simulate Default or Impaired status. */ const createMockLoan = (overrides: Partial = {}): LoanData => ({ index: `LOAN_${Math.random().toString(36).substring(7).toUpperCase()}`, Borrower: `rBorrower${Math.random().toString(36).substring(7)}`, LoanBrokerID: 'BROKER_123', PrincipalOutstanding: '10000', TotalValueOutstanding: '10500', InterestRate: 500, LateInterestRate: 1000, CloseInterestRate: 0, LoanOriginationFee: '100', LoanServiceFee: '50', LatePaymentFee: '25', ClosePaymentFee: '200', OverpaymentFee: 100, PaymentInterval: 2592000, PaymentRemaining: 12, GracePeriod: 432000, StartDate: 750000000, NextPaymentDueDate: 752592000, Flags: 0, ...overrides, }) /** * Helper to generate multiple loans */ const createMockLoans = ( count: number, overrides: Partial = {}, ): LoanData[] => Array.from({ length: count }, (_, i) => createMockLoan({ index: `LOAN_${i + 1}`, ...overrides }), ) describe('BrokerLoansTable Component', () => { /** * ========================================= * SECTION 1: Empty State Tests * ========================================= * When no loans exist, display an appropriate message. */ describe('Empty State', () => { it('displays empty message when loans array is empty', () => { render( , ) expect( screen.getByText('No loans found for this broker.'), ).toBeInTheDocument() }) it('displays empty message when loans is undefined', () => { render( , ) expect( screen.getByText('No loans found for this broker.'), ).toBeInTheDocument() }) it('does not render filter bar when no loans exist', () => { const { container } = render( , ) expect( container.querySelector('.loans-filter-bar'), ).not.toBeInTheDocument() }) it('does not render pagination when no loans exist', () => { const { container } = render( , ) expect( container.querySelector('.loans-pagination'), ).not.toBeInTheDocument() }) }) /** * ========================================= * SECTION 2: Table Header Tests * ========================================= * Verify all column headers are rendered correctly. */ describe('Table Headers', () => { it('renders all column headers', () => { const loans = [createMockLoan()] render( , ) expect(screen.getByText('Loan ID')).toBeInTheDocument() expect(screen.getByText('Borrower')).toBeInTheDocument() expect(screen.getByText('Amount Requested')).toBeInTheDocument() expect(screen.getByText('Interest Rate')).toBeInTheDocument() expect(screen.getByText('Outstanding Balance')).toBeInTheDocument() expect(screen.getByText('Status')).toBeInTheDocument() }) }) /** * ========================================= * SECTION 3: Filter Bar Tests * ========================================= * Test the filter buttons and their functionality. */ describe('Filter Bar', () => { it('renders all filter buttons', () => { const loans = [createMockLoan()] render( , ) expect(screen.getByText('All Loans')).toBeInTheDocument() expect(screen.getByText('Default')).toBeInTheDocument() expect(screen.getByText('Impaired')).toBeInTheDocument() }) it('All Loans filter is active by default', () => { const loans = [createMockLoan()] render( , ) const allLoansBtn = screen.getByText('All Loans') expect(allLoansBtn).toHaveClass('active') // Other filters should not be active const defaultBtn = screen.getByText('Default') const impairedBtn = screen.getByText('Impaired') expect(defaultBtn).not.toHaveClass('active') expect(impairedBtn).not.toHaveClass('active') }) it('clicking filter button changes active state', () => { const loans = [createMockLoan()] render( , ) const defaultBtn = screen.getByText('Default') fireEvent.click(defaultBtn) // Default should now be active expect(defaultBtn).toHaveClass('active') // All Loans should no longer be active expect(screen.getByText('All Loans')).not.toHaveClass('active') }) it('renders filter icon', () => { const loans = [createMockLoan()] const { container } = render( , ) expect(container.querySelector('.filter-icon')).toBeInTheDocument() }) }) /** * ========================================= * SECTION 4: Filter Functionality Tests * ========================================= * Verify that filters correctly show/hide loans based on status. */ describe('Filter Functionality', () => { it('All Loans filter shows all loans', () => { const loans = [ createMockLoan({ index: 'LOAN_CURRENT', Flags: 0 }), createMockLoan({ index: 'LOAN_DEFAULT', Flags: LSF_LOAN_DEFAULT }), createMockLoan({ index: 'LOAN_IMPAIRED', Flags: LSF_LOAN_IMPAIRED }), ] const { container } = render( , ) // All 3 loans should be displayed const rows = container.querySelectorAll('.loan-row') expect(rows.length).toBe(3) }) it('Default filter shows only defaulted loans', () => { const loans = [ createMockLoan({ index: 'LOAN_CURRENT', Flags: 0 }), createMockLoan({ index: 'LOAN_DEFAULT_1', Flags: LSF_LOAN_DEFAULT }), createMockLoan({ index: 'LOAN_DEFAULT_2', Flags: LSF_LOAN_DEFAULT }), createMockLoan({ index: 'LOAN_IMPAIRED', Flags: LSF_LOAN_IMPAIRED }), ] const { container } = render( , ) // Click Default filter button (in the filter-buttons container) const filterButtons = container.querySelector('.filter-buttons') const defaultBtn = filterButtons?.querySelector( '.filter-btn:nth-child(2)', ) fireEvent.click(defaultBtn!) // Only 2 defaulted loans should be displayed const rows = container.querySelectorAll('.loan-row') expect(rows.length).toBe(2) }) it('Impaired filter shows only impaired loans', () => { const loans = [ createMockLoan({ index: 'LOAN_CURRENT', Flags: 0 }), createMockLoan({ index: 'LOAN_DEFAULT', Flags: LSF_LOAN_DEFAULT }), createMockLoan({ index: 'LOAN_IMPAIRED_1', Flags: LSF_LOAN_IMPAIRED }), createMockLoan({ index: 'LOAN_IMPAIRED_2', Flags: LSF_LOAN_IMPAIRED }), ] const { container } = render( , ) // Click Impaired filter button (3rd button in filter-buttons) const filterButtons = container.querySelector('.filter-buttons') const impairedBtn = filterButtons?.querySelector( '.filter-btn:nth-child(3)', ) fireEvent.click(impairedBtn!) // Only 2 impaired loans should be displayed const rows = container.querySelectorAll('.loan-row') expect(rows.length).toBe(2) }) it('shows empty state when filter has no matching loans', () => { // All loans are current (no flags) const loans = [ createMockLoan({ index: 'LOAN_1', Flags: 0 }), createMockLoan({ index: 'LOAN_2', Flags: 0 }), ] const { container } = render( , ) // Click Default filter button - no loans match const filterButtons = container.querySelector('.filter-buttons') const defaultBtn = filterButtons?.querySelector( '.filter-btn:nth-child(2)', ) fireEvent.click(defaultBtn!) // No loan rows should be displayed const rows = container.querySelectorAll('.loan-row') expect(rows.length).toBe(0) }) it('switching back to All Loans shows all loans again', () => { const loans = [ createMockLoan({ index: 'LOAN_1', Flags: 0 }), createMockLoan({ index: 'LOAN_2', Flags: LSF_LOAN_DEFAULT }), ] const { container } = render( , ) const filterButtons = container.querySelector('.filter-buttons') const defaultBtn = filterButtons?.querySelector( '.filter-btn:nth-child(2)', ) const allLoansBtn = filterButtons?.querySelector( '.filter-btn:nth-child(1)', ) // Apply Default filter fireEvent.click(defaultBtn!) expect(container.querySelectorAll('.loan-row').length).toBe(1) // Switch back to All Loans fireEvent.click(allLoansBtn!) expect(container.querySelectorAll('.loan-row').length).toBe(2) }) }) /** * ========================================= * SECTION 5: Pagination Display Tests * ========================================= * Test pagination controls visibility and state. */ describe('Pagination Display', () => { it('does not show pagination when loans fit on one page', () => { // ITEMS_PER_PAGE is 10, so 5 loans should not need pagination const loans = createMockLoans(5) const { container } = render( , ) expect( container.querySelector('.loans-pagination'), ).not.toBeInTheDocument() }) it('shows pagination when loans exceed one page', () => { // More than 10 loans requires pagination const loans = createMockLoans(15) const { container } = render( , ) expect(container.querySelector('.loans-pagination')).toBeInTheDocument() }) it('displays correct page numbers for small number of pages', () => { // 25 loans = 3 pages (at 10 per page) const loans = createMockLoans(25) render( , ) // Should show pages 1, 2, 3 expect(screen.getByRole('button', { name: '1' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '2' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '3' })).toBeInTheDocument() }) it('first page is active by default', () => { const loans = createMockLoans(25) render( , ) const page1Btn = screen.getByRole('button', { name: '1' }) expect(page1Btn).toHaveClass('active') }) it('Previous button is disabled on first page', () => { const loans = createMockLoans(25) const { container } = render( , ) // The Pagination component has prev buttons as the first two .page-btn elements const pageButtons = container.querySelectorAll('.page-btn') const prevBtn = pageButtons[1] // Second button is single prev (first is double prev) expect(prevBtn).toBeDisabled() }) it('Next button is enabled on first page when more pages exist', () => { const loans = createMockLoans(25) const { container } = render( , ) // The Pagination component has next buttons as the last two .page-btn elements const pageButtons = container.querySelectorAll('.page-btn') const nextBtn = pageButtons[2] // Third button is single next expect(nextBtn).not.toBeDisabled() }) }) /** * ========================================= * SECTION 6: Pagination Navigation Tests * ========================================= * Test clicking pagination controls to navigate between pages. */ describe('Pagination Navigation', () => { it('clicking Next navigates to next page', () => { const loans = createMockLoans(25) const { container } = render( , ) // Click Next (third .page-btn) const pageButtons = container.querySelectorAll('.page-btn') fireEvent.click(pageButtons[2]) // Page 2 should now be active const page2Btn = screen.getByRole('button', { name: '2' }) expect(page2Btn).toHaveClass('active') }) it('clicking Previous navigates to previous page', () => { const loans = createMockLoans(25) const { container } = render( , ) // Go to page 2 first (click Next - third .page-btn) let pageButtons = container.querySelectorAll('.page-btn') fireEvent.click(pageButtons[2]) // Click Previous (second .page-btn) pageButtons = container.querySelectorAll('.page-btn') fireEvent.click(pageButtons[1]) // Page 1 should be active again const page1Btn = screen.getByRole('button', { name: '1' }) expect(page1Btn).toHaveClass('active') }) it('clicking Last navigates to last page', () => { // 25 loans = 3 pages const loans = createMockLoans(25) const { container } = render( , ) // Click Last (fourth .page-btn - double arrow next) const pageButtons = container.querySelectorAll('.page-btn') fireEvent.click(pageButtons[3]) // Page 3 should be active const page3Btn = screen.getByRole('button', { name: '3' }) expect(page3Btn).toHaveClass('active') }) it('clicking page number navigates directly to that page', () => { const loans = createMockLoans(25) render( , ) // Click page 3 directly fireEvent.click(screen.getByRole('button', { name: '3' })) const page3Btn = screen.getByRole('button', { name: '3' }) expect(page3Btn).toHaveClass('active') }) it('Next button is disabled on last page', () => { const loans = createMockLoans(25) const { container } = render( , ) // Go to last page (click Last - fourth .page-btn) let pageButtons = container.querySelectorAll('.page-btn') fireEvent.click(pageButtons[3]) // Next should be disabled (third .page-btn) pageButtons = container.querySelectorAll('.page-btn') expect(pageButtons[2]).toBeDisabled() }) it('Last button is disabled on last page', () => { const loans = createMockLoans(25) const { container } = render( , ) // Go to last page (click Last - fourth .page-btn) let pageButtons = container.querySelectorAll('.page-btn') fireEvent.click(pageButtons[3]) // Last should be disabled (fourth .page-btn) pageButtons = container.querySelectorAll('.page-btn') expect(pageButtons[3]).toBeDisabled() }) }) /** * ========================================= * SECTION 7: Pagination with Ellipsis Tests * ========================================= * When there are many pages, ellipsis (...) should appear. */ describe('Pagination with Ellipsis', () => { it('shows ellipsis for many pages', () => { // 100 loans = 10 pages, should show ellipsis const loans = createMockLoans(100) const { container } = render( , ) // Should have ellipsis element (Pagination component uses .page-ellipsis) const ellipsis = container.querySelectorAll('.page-ellipsis') expect(ellipsis.length).toBeGreaterThan(0) }) it('always shows first and last page numbers', () => { // 100 loans = 10 pages const loans = createMockLoans(100) render( , ) // First page (1) should always be visible expect(screen.getByRole('button', { name: '1' })).toBeInTheDocument() // Last page (10) should always be visible expect(screen.getByRole('button', { name: '10' })).toBeInTheDocument() }) }) /** * ========================================= * SECTION 8: Filter + Pagination Interaction * ========================================= * Changing filter should reset pagination to page 1. */ describe('Filter and Pagination Interaction', () => { it('resets to page 1 when filter changes', () => { // Create 15 current loans and 15 defaulted loans // This ensures pagination exists for both All Loans (30 = 3 pages) and Default (15 = 2 pages) const currentLoans = createMockLoans(15, { Flags: 0 }) const defaultedLoans = createMockLoans(15, { Flags: LSF_LOAN_DEFAULT }) const loans = [...currentLoans, ...defaultedLoans] const { container } = render( , ) // Navigate to page 2 (click Next - third .page-btn) const pageButtons = container.querySelectorAll('.page-btn') fireEvent.click(pageButtons[2]) expect(screen.getByRole('button', { name: '2' })).toHaveClass('active') // Change filter to Default using specific selector const filterButtons = container.querySelector('.filter-buttons') const defaultBtn = filterButtons?.querySelector( '.filter-btn:nth-child(2)', ) fireEvent.click(defaultBtn!) // Should be back on page 1 (filter reset pagination) expect(screen.getByRole('button', { name: '1' })).toHaveClass('active') }) it('pagination updates based on filtered loan count', () => { // 25 loans total, but only 5 are defaulted const currentLoans = createMockLoans(20, { Flags: 0 }) const defaultedLoans = createMockLoans(5, { Flags: LSF_LOAN_DEFAULT }) const loans = [...currentLoans, ...defaultedLoans] const { container } = render( , ) // With all loans, should have 3 pages (25 loans / 10 per page) expect(screen.getByRole('button', { name: '3' })).toBeInTheDocument() // Filter to Default only (5 loans = 1 page) fireEvent.click(screen.getByText('Default')) // Pagination should disappear (only 5 loans fit on one page) expect( container.querySelector('.loans-pagination'), ).not.toBeInTheDocument() }) }) /** * ========================================= * SECTION 9: Items Per Page Tests * ========================================= * Verify correct number of items displayed per page. */ describe('Items Per Page', () => { it('displays maximum 10 loans per page', () => { const loans = createMockLoans(25) const { container } = render( , ) // First page should show 10 loans const rows = container.querySelectorAll('.loan-row') expect(rows.length).toBe(10) }) it('displays remaining loans on last page', () => { // 25 loans: page 1 = 10, page 2 = 10, page 3 = 5 const loans = createMockLoans(25) const { container } = render( , ) // Go to last page (click Last - fourth .page-btn) const pageButtons = container.querySelectorAll('.page-btn') fireEvent.click(pageButtons[3]) // Should show 5 loans on page 3 const rows = container.querySelectorAll('.loan-row') expect(rows.length).toBe(5) }) }) /** * ========================================= * SECTION 10: Currency Prop Tests * ========================================= * Verify currency is passed through to LoanRow. */ describe('Currency Prop tests', () => { it('renders correctly with non-XRP/non-USD currency', () => { // Test with EUR - an arbitrary IOU currency that is neither XRP nor RLUSD // This ensures the component handles any currency type correctly const loans = [ createMockLoan({ index: 'LOAN_EUR_1', PrincipalOutstanding: '5000', TotalValueOutstanding: '5250', }), ] const { container } = render( , ) // Table should render with loan row expect(container.querySelector('.loan-row')).toBeInTheDocument() // Verify the amount-requested and outstanding-balance cells display EUR values const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') const outstandingBalance = loanRow.querySelector('.outstanding-balance') expect(amountRequested).toHaveTextContent('5,000.00 EUR') expect(outstandingBalance).toHaveTextContent('5,250.00 EUR') }) it(`Render the BrokerLoans table with BTC exotic currency`, () => { const loans = [ createMockLoan({ index: 'LOAN_BTC_1', PrincipalOutstanding: '5000', TotalValueOutstanding: '5250', }), ] const btcAsset = { currency: 'BTC', issuer: 'rTestIssuer' } const { container } = render( , ) // Table should render with loan row expect(container.querySelector('.loan-row')).toBeInTheDocument() // Currency should appear in the amount columns const elementsWithCurrency = screen.getAllByText(/\u20BF 5,250.00/) expect(elementsWithCurrency.length).toBeGreaterThan(0) // Verify XRP and USD do not appear - ensures EUR is used throughout expect(screen.queryByText(/XRP/)).not.toBeInTheDocument() expect(screen.queryByText(/USD/)).not.toBeInTheDocument() }) it(`display a BTC-denominated Loan in USD currency`, () => { const loans = [ createMockLoan({ index: 'LOAN_BTC_1', PrincipalOutstanding: '5000', TotalValueOutstanding: '5250', }), ] const btcAsset = { currency: 'BTC', issuer: 'rTestIssuer' } const { container } = render( , ) // Table should render with loan row expect(container.querySelector('.loan-row')).toBeInTheDocument() const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') const outstandingBalance = loanRow.querySelector('.outstanding-balance') expect(amountRequested).toHaveTextContent('$7,500.00 USD') expect(outstandingBalance).toHaveTextContent('$7,875.00 USD') }) it('display a XRP-denominated Loan in XRP currency', () => { const loans = [createMockLoan()] // This should not throw - currency defaults to XRP because XRP is the asset of the Vault. const { container } = render( , ) // Verify the amount-requested and outstanding-balance cells display values const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') const outstandingBalance = loanRow.querySelector('.outstanding-balance') expect(amountRequested).toHaveTextContent('\uE900 10.0K') expect(outstandingBalance).toHaveTextContent('\uE900 10.5K') }) it(`display a XRP-denominated Loan in USD currency`, () => { const loans = [createMockLoan()] // This should not throw - currency defaults to XRP because XRP is the asset of the Vault. const { container } = render( , ) // Verify the amount-requested and outstanding-balance cells display values const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') const outstandingBalance = loanRow.querySelector('.outstanding-balance') expect(amountRequested).toHaveTextContent('$15.0K USD') expect(outstandingBalance).toHaveTextContent('$15.8K USD') }) }) /** * ========================================= * SECTION 11: Original Principal Traversal Tests * ========================================= * Test the ledger history traversal that fetches the original loan principal. * These tests use SocketTestWrapper to enable the useQuery that calls getLedgerEntry. */ describe('Original Principal Traversal', () => { beforeEach(() => { mockedGetLedgerEntry.mockReset() }) it('traverses multiple ledger entries to find original principal', async () => { const loans = [ createMockLoan({ index: 'LOAN_TRAVERSAL', PreviousTxnLgrSeq: 300, PrincipalOutstanding: '8000', TotalValueOutstanding: '8500', }), ] mockedGetLedgerEntry .mockResolvedValueOnce({ node: { PreviousTxnLgrSeq: 200, PrincipalOutstanding: '9000' }, }) .mockResolvedValueOnce({ node: { PreviousTxnLgrSeq: 100, PrincipalOutstanding: '10000' }, }) .mockRejectedValueOnce(new Error('ledger entry not found')) const { container } = render( , ) await waitFor(() => { const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') expect(amountRequested).toHaveTextContent('10.0K EUR') }) const loanRow = container.querySelector('.loan-row')! const outstandingBalance = loanRow.querySelector('.outstanding-balance') expect(outstandingBalance).toHaveTextContent('8,500.00 EUR') }) it('falls back to PrincipalOutstanding when first fetch throws (loan created one tx ago)', async () => { const loans = [ createMockLoan({ index: 'LOAN_SINGLE_STEP', PreviousTxnLgrSeq: 150, PrincipalOutstanding: '9500', TotalValueOutstanding: '9800', }), ] mockedGetLedgerEntry.mockRejectedValueOnce( new Error('ledger entry not found'), ) const { container } = render( , ) await waitFor(() => { const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') expect(amountRequested).toHaveTextContent('9,500.00 EUR') }) }) it('uses PrincipalOutstanding directly when no PreviousTxnLgrSeq exists', async () => { const loans = [ createMockLoan({ index: 'LOAN_NO_PREV', PrincipalOutstanding: '10000', TotalValueOutstanding: '10500', }), ] const { container } = render( , ) await waitFor(() => { const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') expect(amountRequested).toHaveTextContent('10.0K EUR') }) expect(mockedGetLedgerEntry).not.toHaveBeenCalled() }) it('falls back to PrincipalOutstanding on generic error', async () => { const loans = [ createMockLoan({ index: 'LOAN_ERROR', PreviousTxnLgrSeq: 300, PrincipalOutstanding: '8000', TotalValueOutstanding: '8500', }), ] mockedGetLedgerEntry.mockRejectedValue(new Error('network error')) const { container } = render( , ) await waitFor(() => { const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') expect(amountRequested).toHaveTextContent('8,000.00 EUR') }) }) it('stops traversal when PreviousTxnLgrSeq does not change (prevents infinite loop)', async () => { const loans = [ createMockLoan({ index: 'LOAN_SAME_SEQ', PreviousTxnLgrSeq: 200, PrincipalOutstanding: '8000', TotalValueOutstanding: '8500', }), ] // Returns the same PreviousTxnLgrSeq — the guard should break the loop mockedGetLedgerEntry.mockResolvedValue({ node: { PreviousTxnLgrSeq: 200, PrincipalOutstanding: '9000' }, }) const { container } = render( , ) await waitFor(() => { const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') expect(amountRequested).toHaveTextContent('9,000.00 EUR') }) expect(mockedGetLedgerEntry).toHaveBeenCalledTimes(1) }) it('shows loading state while traversal is in progress', () => { const loans = [ createMockLoan({ index: 'LOAN_LOADING', PreviousTxnLgrSeq: 300, PrincipalOutstanding: '8000', TotalValueOutstanding: '8500', }), ] // Never-resolving promise to keep the query in loading state mockedGetLedgerEntry.mockReturnValue(new Promise(() => {})) const { container } = render( , ) const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') expect(amountRequested).toHaveTextContent('--') }) }) /** * ========================================= * SECTION 12: Currency Display Regression Tests * ========================================= * Guard against empty displayCurrency reaching LoanRow, which causes * amounts to render without a currency label (e.g., "5,000.00 " with * trailing space). This was triggered by MPT token vaults where * CurrencyToggle passes '' on native currency click. */ describe('Currency Display Regression', () => { const MPT_ID = '00000001A407AF5856CEFF0100000000000000000000000000000000' const SHORTENED_MPT = '00000001A4...0000000000' it('empty displayCurrency produces amounts with trailing space and no currency label', () => { const loans = [ createMockLoan({ index: 'LOAN_EMPTY_DC', PrincipalOutstanding: '5000', TotalValueOutstanding: '5250', }), ] const { container } = render( , ) const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') const outstandingBalance = loanRow.querySelector('.outstanding-balance') expect(amountRequested?.textContent).toBe('5,000.00 EUR') expect(outstandingBalance?.textContent).toBe('5,250.00 EUR') }) it('MPT token displays amounts with shortened MPTID suffix', () => { const loans = [ createMockLoan({ index: 'LOAN_MPT_NATIVE', PrincipalOutstanding: '5000', TotalValueOutstanding: '5250', }), ] const { container } = render( , ) const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') const outstandingBalance = loanRow.querySelector('.outstanding-balance') expect(amountRequested).toHaveTextContent(`5,000.00 ${SHORTENED_MPT}`) expect(outstandingBalance).toHaveTextContent(`5,250.00 ${SHORTENED_MPT}`) }) }) /** * ========================================= * SECTION 13: MPT Ticker Display in LoanRow * ========================================= * When the vault asset is an MPT with XLS-89 metadata containing a ticker, * the ticker should be used as the currency label in loan amounts instead * of the shortened MPT ID. */ describe('MPT Ticker Display in LoanRow', () => { const MPT_ID = '00000001A407AF5856CEFF0100000000000000000000000000000000' const MPT_TICKER = 'VTKN' it('displays MPT ticker in amount columns instead of shortened MPT ID', () => { const loans = [ createMockLoan({ index: 'LOAN_MPT_TICKER', PrincipalOutstanding: '5000', TotalValueOutstanding: '5250', }), ] const { container } = render( , ) const loanRow = container.querySelector('.loan-row')! const amountRequested = loanRow.querySelector('.amount-requested') const outstandingBalance = loanRow.querySelector('.outstanding-balance') expect(amountRequested).toHaveTextContent('5,000.00 VTKN') expect(amountRequested).not.toHaveTextContent('00000001A4') expect(outstandingBalance).toHaveTextContent('5,250.00 VTKN') expect(outstandingBalance).not.toHaveTextContent('00000001A4') }) it('displays ticker in expanded loan detail fees', async () => { const loans = [ createMockLoan({ index: 'LOAN_MPT_FEES', LoanOriginationFee: '100', LoanServiceFee: '50', }), ] const { container } = render( , ) // Expand the loan row const loanButton = container.querySelector('.loan-row-main')! fireEvent.click(loanButton) await waitFor(() => { const details = container.querySelector('.loan-row-details') expect(details).toBeInTheDocument() // Fee values should use the ticker const originationFee = screen .getByText('Loan Origination Fee') .closest('.detail-item') expect( originationFee?.querySelector('.detail-value'), ).toHaveTextContent('100.00 VTKN') const serviceFee = screen .getByText('Loan Service Fee') .closest('.detail-item') expect(serviceFee?.querySelector('.detail-value')).toHaveTextContent( '50.00 VTKN', ) }) }) }) }) ================================================ FILE: src/containers/Vault/VaultLoans/test/VaultLoans.test.tsx ================================================ /** * VaultLoans Component Unit Tests * * This test suite validates the VaultLoans component which displays * loan brokers and their associated loans for a vault. * * Key concepts tested: * - Basic rendering (section title, divider) * - Loading state with Loader component * - Empty state when no loan brokers exist * - Broker tabs display with loan counts * - Broker selection and tab switching * - Error handling and analytics tracking */ import { render, screen, waitFor, fireEvent } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider, QueryClient } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { VaultLoans } from '../index' import { getAccountObjects } from '../../../../rippled/lib/rippled' import Mock = jest.Mock // Default test props const defaultDisplayCurrency = 'XRP' const defaultAsset = { currency: 'XRP' } // Mock the rippled library to control API responses jest.mock('../../../../rippled/lib/rippled', () => ({ getAccountObjects: jest.fn(), })) // Mock the analytics hook for error tracking const mockTrackException = jest.fn() jest.mock('../../../shared/analytics', () => ({ useAnalytics: () => ({ trackException: mockTrackException, }), })) // Mock the token to USD rate hook const mockTokenToUSDRate = jest.fn() jest.mock('../../../shared/hooks/useTokenToUSDRate', () => ({ useTokenToUSDRate: (token: any) => { const result = mockTokenToUSDRate(token) if (typeof result === 'number') { return { rate: result, isAvailable: result > 0, isLoading: false } } return result }, })) const mockedGetAccountObjects = getAccountObjects as Mock // Mock socket client - represents the WebSocket connection to rippled const mockSocket = {} as any /** * Creates a fresh QueryClient for each test * Disables retries and caching to make tests predictable */ const createTestQueryClient = () => new QueryClient({ defaultOptions: { queries: { retry: false, staleTime: 0, cacheTime: 0, }, }, }) /** * TestWrapper Component * * Provides all necessary context providers for the VaultLoans component: * - I18nextProvider: Internationalization for translated text * - Router: React Router for Account link components * - SocketContext: WebSocket connection for rippled queries * - QueryClientProvider: React Query for data fetching/caching */ const createTestWrapper = (queryClient: QueryClient) => ({ children }: { children: React.ReactNode }) => ( {children} ) /** * Mock loan broker data generator * * Creates a loan broker object matching the LoanBrokerData interface. * Loan brokers are entities authorized to create loans from a vault. */ const createMockBroker = (overrides: any = {}) => ({ index: `BROKER_${Math.random().toString(36).substring(7).toUpperCase()}`, LedgerEntryType: 'LoanBroker', Account: `rBrokerAccount${Math.random().toString(36).substring(7)}`, Owner: 'rOwnerAccount123', VaultID: 'TEST_VAULT_ID_123', ManagementFeeRate: 500, // 0.05% in 1/10th basis points CoverAvailable: '100000', CoverRateMinimum: 1000, CoverRateLiquidation: 500, DebtTotal: '50000', DebtMaximum: '1000000', ...overrides, }) /** * Mock loan data generator * * Creates a loan object matching the LoanData interface. * Each loan is associated with a borrower and a loan broker. */ const createMockLoan = (overrides: any = {}) => ({ index: `LOAN_${Math.random().toString(36).substring(7).toUpperCase()}`, LedgerEntryType: 'Loan', Borrower: `rBorrower${Math.random().toString(36).substring(7)}`, LoanBrokerID: 'BROKER_123', PrincipalOutstanding: '10000', TotalValueOutstanding: '10500', InterestRate: 500, LateInterestRate: 1000, CloseInterestRate: 0, LoanOriginationFee: '100', LoanServiceFee: '50', LatePaymentFee: '25', ClosePaymentFee: '200', OverpaymentFee: 100, PaymentInterval: 2592000, // ~30 days (monthly) PaymentRemaining: 12, GracePeriod: 432000, // 5 days StartDate: 750000000, NextPaymentDueDate: 752592000, Flags: 0, ...overrides, }) describe('VaultLoans Component', () => { let queryClient: QueryClient beforeEach(() => { jest.clearAllMocks() queryClient = createTestQueryClient() // Default mock: XRP = 1.5, RLUSD = 1.0, others = 0 (no conversion) mockTokenToUSDRate.mockImplementation((token: any) => { if (!token) return 0 if (token.currency === 'XRP') return 1.5 if (token.currency === 'RLUSD') return 1.0 return 0 }) }) afterEach(() => { queryClient.clear() }) /** * ========================================= * SECTION 1: Basic Rendering Tests * ========================================= * These tests verify the component renders correctly with its * structural elements: title and divider. */ describe('Basic Rendering', () => { it('renders the loans section title', async () => { // Setup: Return empty brokers list mockedGetAccountObjects.mockResolvedValue({ account_objects: [], }) const TestWrapper = createTestWrapper(queryClient) render( , ) // The component should display "Loans" as the section title await waitFor(() => { const title = screen.getByText('Loans') expect(title.tagName).toBe('H2') expect(title).toHaveClass('vault-loans-title') }) }) it('renders the divider element', async () => { mockedGetAccountObjects.mockResolvedValue({ account_objects: [], }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) await waitFor(() => { expect( container.querySelector('.vault-loans-divider'), ).toBeInTheDocument() }) }) it('renders correctly with non-XRP/non-RLUSD asset currency', async () => { // Test with EUR - a currency that is neither XRP nor RLUSD // This ensures the component handles arbitrary IOU currencies const broker = createMockBroker({ index: 'BROKER_EUR', VaultID: 'TEST_VAULT_ID', DebtTotal: '25000', DebtMaximum: '500000', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { // Component should render with EUR currency in debt amounts const totalDebtMetric = screen .getByText('Total Debt') .closest('.debt-metric') expect( totalDebtMetric?.querySelector('.metric-value'), ).toHaveTextContent('25.00K EUR') const maxDebtMetric = screen .getByText('Maximum Debt') .closest('.debt-metric') expect(maxDebtMetric?.querySelector('.metric-value')).toHaveTextContent( '500.00K EUR', ) }) }) }) /** * ========================================= * SECTION 2: Loading State Tests * ========================================= * When fetching loan brokers, a Loader should be displayed. */ describe('Loading State', () => { it('displays loader while fetching loan brokers', async () => { // Create a pending promise to keep loading state let resolvePromise: (value: any) => void const pendingPromise = new Promise((resolve) => { resolvePromise = resolve }) mockedGetAccountObjects.mockReturnValue(pendingPromise) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) // Loader should be visible while fetching expect(container.querySelector('.loader')).toBeInTheDocument() // Clean up resolvePromise!({ account_objects: [] }) }) it('hides loader after loan brokers are loaded', async () => { mockedGetAccountObjects.mockResolvedValue({ account_objects: [createMockBroker({ VaultID: 'TEST_VAULT_ID' })], }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) await waitFor(() => { expect(container.querySelector('.loader')).not.toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 3: Empty State Tests * ========================================= * When no loan brokers exist for a vault, display appropriate message. */ describe('Empty State', () => { it('displays empty message when no loan brokers exist', async () => { mockedGetAccountObjects.mockResolvedValue({ account_objects: [], }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect( screen.getByText('No loan brokers have been set up for this vault.'), ).toBeInTheDocument() }) }) it('displays empty message when brokers exist but none match vaultId', async () => { // Return brokers that don't match the requested vaultId mockedGetAccountObjects.mockResolvedValue({ account_objects: [createMockBroker({ VaultID: 'DIFFERENT_VAULT_ID' })], }) const TestWrapper = createTestWrapper(queryClient) render( , ) // Should show empty message since no brokers match the vault ID await waitFor(() => { expect( screen.getByText('No loan brokers have been set up for this vault.'), ).toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 4: Broker Tabs Display Tests * ========================================= * When loan brokers exist, tabs should be displayed for selection. */ describe('Broker Tabs Display', () => { it('renders broker tabs when brokers exist', async () => { const broker1 = createMockBroker({ index: 'BROKER_001', VaultID: 'TEST_VAULT_ID', Account: 'rBrokerAccount1', }) const broker2 = createMockBroker({ index: 'BROKER_002', VaultID: 'TEST_VAULT_ID', Account: 'rBrokerAccount2', }) // First call returns brokers, subsequent calls return empty loans mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker1, broker2] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) await waitFor(() => { // Should render broker tabs container expect(container.querySelector('.broker-tabs')).toBeInTheDocument() // Should render two tab buttons const tabs = container.querySelectorAll('.broker-tab') expect(tabs.length).toBe(2) }) }) it('displays broker numbers in tabs (Broker 1, Broker 2, etc.)', async () => { const broker1 = createMockBroker({ index: 'BROKER_001', VaultID: 'TEST_VAULT_ID', }) const broker2 = createMockBroker({ index: 'BROKER_002', VaultID: 'TEST_VAULT_ID', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker1, broker2] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { // Tabs show "Broker N (count)" format expect(screen.getByText(/Broker 1/)).toBeInTheDocument() expect(screen.getByText(/Broker 2/)).toBeInTheDocument() }) }) it('first broker tab is selected by default', async () => { const broker = createMockBroker({ index: 'BROKER_001', VaultID: 'TEST_VAULT_ID', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) await waitFor(() => { const selectedTab = container.querySelector('.broker-tab.selected') expect(selectedTab).toBeInTheDocument() expect(selectedTab).toHaveTextContent('Broker 1') }) }) it('displays broker tabs in descending order of loan count', async () => { // Create brokers - broker1 has fewer loans, broker2 has more loans const broker1 = createMockBroker({ index: 'BROKER_FEW_LOANS', VaultID: 'TEST_VAULT_ID', Account: 'rBrokerAccount1', }) const broker2 = createMockBroker({ index: 'BROKER_MANY_LOANS', VaultID: 'TEST_VAULT_ID', Account: 'rBrokerAccount2', }) const broker3 = createMockBroker({ index: 'BROKER_TOO_MANY_LOANS', VaultID: 'TEST_VAULT_ID', Account: 'rBrokerAccount3', }) // Create loans - broker1 has 1 loan, broker2 has 5 loans const broker1Loans = [ createMockLoan({ LoanBrokerID: 'BROKER_FEW_LOANS' }), ] const broker2Loans = [ createMockLoan({ LoanBrokerID: 'BROKER_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_MANY_LOANS' }), ] const broker3Loans = [ createMockLoan({ LoanBrokerID: 'BROKER_TOO_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_TOO_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_TOO_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_TOO_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_TOO_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_TOO_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_TOO_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_TOO_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_TOO_MANY_LOANS' }), createMockLoan({ LoanBrokerID: 'BROKER_TOO_MANY_LOANS' }), ] // Mock returns brokers in order [broker1, broker2] (broker1 first) // But after sorting by loan count, broker2 should appear first mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker1, broker2, broker3] }) // brokers .mockResolvedValueOnce({ account_objects: broker1Loans }) // loans for broker1 .mockResolvedValueOnce({ account_objects: broker2Loans }) // loans for broker2 .mockResolvedValueOnce({ account_objects: broker3Loans }) // loans for broker2 const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) await waitFor(() => { const tabs = container.querySelectorAll('.broker-tab') expect(tabs.length).toBe(3) // First tab should be broker with 10 loans (sorted descending by loan count) expect(tabs[0]).toHaveTextContent('Broker 1 (10)') // Second tab should be broker with 5 loans expect(tabs[1]).toHaveTextContent('Broker 2 (5)') // Second tab should be broker with 1 loan expect(tabs[2]).toHaveTextContent('Broker 3 (1)') }) }) }) /** * ========================================= * SECTION 5: Broker Tab Selection Tests * ========================================= * Users should be able to switch between broker tabs. */ describe('Broker Tab Selection', () => { it('switches to selected broker when tab is clicked', async () => { const broker1 = createMockBroker({ index: 'BROKER_001', VaultID: 'TEST_VAULT_ID', Account: 'rBrokerAccount1', }) const broker2 = createMockBroker({ index: 'BROKER_002', VaultID: 'TEST_VAULT_ID', Account: 'rBrokerAccount2', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker1, broker2] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) await waitFor(() => { expect(screen.getByText(/Broker 2/)).toBeInTheDocument() }) // Click on Broker 2 tab fireEvent.click(screen.getByText(/Broker 2/)) // Broker 2 tab should now be selected await waitFor(() => { const selectedTab = container.querySelector('.broker-tab.selected') expect(selectedTab).toHaveTextContent('Broker 2') }) }) }) /** * ========================================= * SECTION 6: Loan Count Display Tests * ========================================= * Each broker tab should show the count of loans. */ describe('Loan Count Display', () => { it('displays loan count in broker tabs', async () => { const brokerId = 'BROKER_WITH_LOANS' const broker = createMockBroker({ index: brokerId, VaultID: 'TEST_VAULT_ID', Account: 'rBrokerAccount1', }) // Create loans associated with this broker const loans = [ createMockLoan({ LoanBrokerID: brokerId }), createMockLoan({ LoanBrokerID: brokerId }), createMockLoan({ LoanBrokerID: brokerId }), ] // First call: get brokers, Second call: get loan count, Third call: get loans for display mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) // brokers .mockResolvedValueOnce({ account_objects: loans }) // loan count query .mockResolvedValueOnce({ account_objects: loans }) // loans for BrokerDetails const TestWrapper = createTestWrapper(queryClient) render( , ) // Tab should show "Broker 1 (3)" format await waitFor(() => { expect(screen.getByText(/Broker 1 \(3\)/)).toBeInTheDocument() }) }) it('shows zero count when broker has no loans', async () => { const broker = createMockBroker({ index: 'BROKER_NO_LOANS', VaultID: 'TEST_VAULT_ID', Account: 'rBrokerAccount1', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) // No loans const TestWrapper = createTestWrapper(queryClient) render( , ) // Tab should show "Broker 1 (0)" await waitFor(() => { expect(screen.getByText(/Broker 1 \(0\)/)).toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 7.1: BrokerDetails Display Tests * ========================================= * When a broker is selected, its details should be displayed. */ describe('BrokerDetails Display', () => { it('displays broker details card when broker is selected', async () => { const broker = createMockBroker({ index: 'BROKER_123', VaultID: 'TEST_VAULT_ID', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) await waitFor(() => { expect( container.querySelector('.broker-details-card'), ).toBeInTheDocument() }) }) it('displays broker ID in details', async () => { const brokerId = 'BROKER_ID_DISPLAY_TEST' const broker = createMockBroker({ index: brokerId, VaultID: 'TEST_VAULT_ID', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(screen.getByText('Loan Broker ID')).toBeInTheDocument() expect(screen.getByText(brokerId)).toBeInTheDocument() }) }) it('displays total debt and maximum debt metrics', async () => { const broker = createMockBroker({ index: 'BROKER_123', VaultID: 'TEST_VAULT_ID', DebtTotal: '50000', DebtMaximum: '1000000', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { // Amounts are formatted with compact notation (50.00K, 1.00M) const totalDebtMetric = screen .getByText('Total Debt') .closest('.debt-metric') expect( totalDebtMetric?.querySelector('.metric-value'), ).toHaveTextContent('\uE900 50.00K') const maxDebtMetric = screen .getByText('Maximum Debt') .closest('.debt-metric') expect(maxDebtMetric?.querySelector('.metric-value')).toHaveTextContent( '\uE900 1.00M', ) }) }) it(`display BrokerDetails card: XRP-denominated Loan in USD Currency`, async () => { const broker = createMockBroker({ index: 'BROKER_123', VaultID: 'TEST_VAULT_ID', DebtTotal: '50000', DebtMaximum: '1000000', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { // Amounts are formatted with compact notation (50.00K, 1.00M) const totalDebtMetric = screen .getByText('Total Debt') .closest('.debt-metric') expect( totalDebtMetric?.querySelector('.metric-value'), ).toHaveTextContent('$75.00K USD') const maxDebtMetric = screen .getByText('Maximum Debt') .closest('.debt-metric') expect(maxDebtMetric?.querySelector('.metric-value')).toHaveTextContent( '$1.50M USD', ) }) }) it(`display BrokerDetails card: IOU-denominated Loan in USD Currency`, async () => { const broker = createMockBroker({ index: 'BROKER_123', VaultID: 'TEST_VAULT_ID', DebtTotal: '50000', DebtMaximum: '1000000', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { // Note: This test validates the case where USD conversion is not available const totalDebtMetric = screen .getByText('Total Debt') .closest('.debt-metric') expect( totalDebtMetric?.querySelector('.metric-value'), ).toHaveTextContent('--') const maxDebtMetric = screen .getByText('Maximum Debt') .closest('.debt-metric') expect(maxDebtMetric?.querySelector('.metric-value')).toHaveTextContent( '--', ) }) }) it(`display BrokerDetails card: BTC-denominated Loan in USD Currency`, async () => { // Mock BTC to USD rate so conversion is available mockTokenToUSDRate.mockImplementation((token: any) => { if (!token) return 0 if (token.currency === 'BTC') return 1.5 return 0 }) const broker = createMockBroker({ index: 'BROKER_123', VaultID: 'TEST_VAULT_ID', DebtTotal: '50000', DebtMaximum: '1000000', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { // BTC 50,000 * 1.5 = 75,000 USD, BTC 1,000,000 * 1.5 = 1,500,000 USD const totalDebtMetric = screen .getByText('Total Debt') .closest('.debt-metric') expect( totalDebtMetric?.querySelector('.metric-value'), ).toHaveTextContent('$75.00K USD') const maxDebtMetric = screen .getByText('Maximum Debt') .closest('.debt-metric') expect(maxDebtMetric?.querySelector('.metric-value')).toHaveTextContent( '$1.50M USD', ) }) }) }) /** * ========================================= * SECTION 7.2: BrokerDetails Display Tests with Exotic Vault asset-type * ========================================= * When a broker is selected, its details should be displayed. */ describe('BrokerDetails Display with BTC Exotic Currency Symbol', () => { it('displays total debt and maximum debt metrics with BTC Exotic Currency Symbol', async () => { const broker = createMockBroker({ index: 'BROKER_123', VaultID: 'TEST_VAULT_ID', DebtTotal: '50000', DebtMaximum: '1000000', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { // Amounts are formatted with compact notation (50.00K, 1.00M) const totalDebtMetric = screen .getByText('Total Debt') .closest('.debt-metric') expect( totalDebtMetric?.querySelector('.metric-value'), ).toHaveTextContent('\u20BF 50.00K') const maxDebtMetric = screen .getByText('Maximum Debt') .closest('.debt-metric') expect(maxDebtMetric?.querySelector('.metric-value')).toHaveTextContent( '\u20BF 1.00M', ) }) }) it('displays total debt and maximum debt metrics with ETH Exotic Currency Symbol', async () => { const broker = createMockBroker({ index: 'BROKER_123', VaultID: 'TEST_VAULT_ID', DebtTotal: '50000', DebtMaximum: '1000000', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { // Amounts are formatted with compact notation (50.00K, 1.00M) const totalDebtMetric = screen .getByText('Total Debt') .closest('.debt-metric') expect( totalDebtMetric?.querySelector('.metric-value'), ).toHaveTextContent('\uE902 50.00K') const maxDebtMetric = screen .getByText('Maximum Debt') .closest('.debt-metric') expect(maxDebtMetric?.querySelector('.metric-value')).toHaveTextContent( '\uE902 1.00M', ) }) }) }) /** * ========================================= * SECTION 7.3: BrokerDetails Display with MPT Ticker * ========================================= * When the vault asset is an MPT with XLS-89 metadata containing a ticker, * the ticker should be used as the currency label instead of the shortened MPT ID. */ describe('BrokerDetails Display with MPT Ticker', () => { const mptIssuanceId = '000086F070A052C270F902E0AD5B795B2DC3C9F4B113E86EF' it('displays MPT ticker in debt amounts instead of shortened MPT ID', async () => { const broker = createMockBroker({ index: 'BROKER_MPT', VaultID: 'TEST_VAULT_ID', DebtTotal: '50000', DebtMaximum: '1000000', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { const totalDebtMetric = screen .getByText('Total Debt') .closest('.debt-metric') const totalDebtValue = totalDebtMetric?.querySelector('.metric-value')?.textContent expect(totalDebtValue).toContain('50.00K VTKN') expect(totalDebtValue).not.toContain('000086F0') const maxDebtMetric = screen .getByText('Maximum Debt') .closest('.debt-metric') const maxDebtValue = maxDebtMetric?.querySelector('.metric-value')?.textContent expect(maxDebtValue).toContain('1.00M VTKN') expect(maxDebtValue).not.toContain('000086F0') }) }) it('falls back to shortened MPT ID when ticker is not provided', async () => { const broker = createMockBroker({ index: 'BROKER_MPT_3', VaultID: 'TEST_VAULT_ID', DebtTotal: '500', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { const totalDebtMetric = screen .getByText('Total Debt') .closest('.debt-metric') const metricValue = totalDebtMetric?.querySelector('.metric-value')?.textContent // Should contain the shortened MPT ID since no ticker is provided expect(metricValue).toContain('000086F0') }) }) it('displays MPT ticker in first loss capital metric', async () => { const broker = createMockBroker({ index: 'BROKER_MPT_4', VaultID: 'TEST_VAULT_ID', CoverAvailable: '25000', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [broker] }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { const flcMetric = screen .getByText('first-loss capital') .closest('.metric') expect(flcMetric?.querySelector('.metric-value')).toHaveTextContent( '25.00K VTKN', ) }) }) }) /** * ========================================= * SECTION 8: Error Handling Tests * ========================================= * When API calls fail, errors should be tracked. */ describe('Error Handling', () => { it('tracks exception when loan broker fetch fails', async () => { const errorResponse = { code: 'NETWORK_ERROR', message: 'Connection failed', } mockedGetAccountObjects.mockRejectedValue(errorResponse) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(mockTrackException).toHaveBeenCalledWith( expect.stringContaining( 'Error fetching Loan Brokers for account rTestPseudoAccount', ), ) }) }) }) /** * ========================================= * SECTION 9: Query Behavior Tests * ========================================= * Tests for the query configuration and behavior. */ describe('Query Behavior', () => { it('does not fetch when vaultPseudoAccount is empty', () => { const TestWrapper = createTestWrapper(queryClient) render( , ) // Query should not be enabled when vaultPseudoAccount is empty expect(mockedGetAccountObjects).not.toHaveBeenCalled() }) it('fetches loan brokers with correct account type filter', async () => { mockedGetAccountObjects.mockResolvedValue({ account_objects: [], }) const testAccount = 'rTestPseudoAccount123' const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(mockedGetAccountObjects).toHaveBeenCalledWith( mockSocket, testAccount, 'loan_broker', undefined, ) }) }) it('filters brokers by matching vaultId', async () => { const matchingBroker = createMockBroker({ index: 'MATCHING_BROKER', VaultID: 'TARGET_VAULT_ID', }) const nonMatchingBroker = createMockBroker({ index: 'NON_MATCHING_BROKER', VaultID: 'OTHER_VAULT_ID', }) mockedGetAccountObjects .mockResolvedValueOnce({ account_objects: [matchingBroker, nonMatchingBroker], }) .mockResolvedValue({ account_objects: [] }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) await waitFor(() => { // Only one broker tab should be shown (the matching one) const tabs = container.querySelectorAll('.broker-tab') expect(tabs.length).toBe(1) }) }) }) }) ================================================ FILE: src/containers/Vault/VaultLoans/test/utils.test.ts ================================================ /** * VaultLoans Utility Functions Unit Tests * * This test suite validates the utility functions used across the VaultLoans * component for formatting rates, dates, loan status, and IDs. * * Key functions tested: * - formatRate: Converts 1/10th basis points to percentage strings * - formatPaymentInterval: Converts seconds to human-readable frequency * - formatLoanStatus: Determines loan status from flags and balance * - formatRippleDate: Converts Ripple epoch timestamps to date strings * - truncateId: Shortens long IDs for display * - LSF_LOAN_DEFAULT, LSF_LOAN_IMPAIRED: Flag constants */ import { formatRate, formatPaymentInterval, formatLoanStatus, truncateId, LSF_LOAN_DEFAULT, LSF_LOAN_IMPAIRED, } from '../utils' describe('VaultLoans Utils', () => { /** * ========================================= * SECTION 1: formatRate Tests * ========================================= * formatRate converts values from 1/10th basis points to percentage strings. * 1 basis point = 0.01%, so 1/10th basis point = 0.001% * * The formula is: percentage = rate / 1000 * Example: 500 (1/10th bps) → 500/1000 = 0.5 → "0.500%" */ describe('formatRate', () => { it('converts 1/10th basis points to percentage', () => { // 500 / 1000 = 0.5% expect(formatRate(500)).toBe('0.50%') }) it('handles zero rate', () => { expect(formatRate(0)).toBe('0.00%') }) it('handles small rates (less than 1 basis point)', () => { // 1 / 1000 = 0.001% expect(formatRate(1)).toBe('0.00%') }) it('handles large rates', () => { // 10000 / 1000 = 10% expect(formatRate(10000)).toBe('10.00%') }) it('returns default value for undefined rate', () => { // Default ManagementFeeRate, CoverRateMinimum, etc. is 0 or `--` expect(formatRate(undefined)).toBe('--') }) it('formats with exactly 3 decimal places', () => { // Ensures consistent formatting regardless of value expect(formatRate(1000)).toBe('1.00%') expect(formatRate(1500)).toBe('1.50%') expect(formatRate(1234)).toBe('1.23%') }) }) /** * ========================================= * SECTION 2: formatPaymentInterval Tests * ========================================= * formatPaymentInterval converts seconds to human-readable frequency. * Common intervals: * - Daily: 86,400 seconds (1 day) * - Weekly: 604,800 seconds (7 days) * - Bi-Weekly: ~1,209,600 seconds (14 days) * - Monthly: ~2,592,000 seconds (30 days) * - Quarterly: ~7,776,000 seconds (90 days) * - Yearly: ~31,536,000 seconds (365 days) */ describe('formatPaymentInterval', () => { it('identifies daily interval', () => { const oneDay = 86400 expect(formatPaymentInterval(oneDay)).toBe('Daily') }) it('identifies weekly interval', () => { const sevenDays = 604800 expect(formatPaymentInterval(sevenDays)).toBe('Weekly') }) it('identifies bi-weekly interval', () => { const fourteenDays = 1209600 expect(formatPaymentInterval(fourteenDays)).toBe('Bi-Weekly') }) it('identifies monthly interval (30 days)', () => { const thirtyDays = 2592000 expect(formatPaymentInterval(thirtyDays)).toBe('Monthly') }) it('identifies monthly interval with slight variance (28-31 days)', () => { // Real months vary from 28-31 days expect(formatPaymentInterval(28 * 86400)).toBe('Monthly') expect(formatPaymentInterval(31 * 86400)).toBe('Monthly') }) it('identifies quarterly interval', () => { const ninetyDays = 7776000 expect(formatPaymentInterval(ninetyDays)).toBe('Quarterly') }) it('identifies yearly interval', () => { const threeHundredSixtyFiveDays = 31536000 expect(formatPaymentInterval(threeHundredSixtyFiveDays)).toBe('Yearly') }) it('shows days for non-standard intervals', () => { // 45 days doesn't match any standard interval const fortyFiveDays = 45 * 86400 expect(formatPaymentInterval(fortyFiveDays)).toBe('45 Days') }) }) /** * ========================================= * SECTION 3: formatLoanStatus Tests * ========================================= * formatLoanStatus determines loan status based on: * 1. Flags (LSF_LOAN_DEFAULT, LSF_LOAN_IMPAIRED) * 2. Outstanding balance (0 = paid off) * * Priority order: * 1. Paid Off (balance = 0) * 2. Default (LSF_LOAN_DEFAULT flag set) * 3. Impaired (LSF_LOAN_IMPAIRED flag set) * 4. Current (no flags, has balance) */ describe('formatLoanStatus', () => { it('returns paid_off status when balance is zero', () => { const result = formatLoanStatus(0, 0) expect(result.status).toBe('loan_status_paid_off') expect(result.colorClass).toBe('status-paid-off') }) it('returns paid_off status when balance is "0" string', () => { const result = formatLoanStatus(0, '0') expect(result.status).toBe('loan_status_paid_off') }) it('returns default status when LSF_LOAN_DEFAULT flag is set', () => { const result = formatLoanStatus(LSF_LOAN_DEFAULT, 1000) expect(result.status).toBe('loan_status_default') expect(result.colorClass).toBe('status-default') }) it('returns impaired status when LSF_LOAN_IMPAIRED flag is set', () => { const result = formatLoanStatus(LSF_LOAN_IMPAIRED, 1000) expect(result.status).toBe('loan_status_impaired') expect(result.colorClass).toBe('status-impaired') }) it('returns current status for active loan with no flags', () => { const result = formatLoanStatus(0, 1000) expect(result.status).toBe('loan_status_current') expect(result.colorClass).toBe('status-current') }) it('paid_off takes priority over default flag', () => { // Even if default flag is set, zero balance means paid off const result = formatLoanStatus(LSF_LOAN_DEFAULT, 0) expect(result.status).toBe('loan_status_paid_off') }) it('default takes priority over impaired flag', () => { // If both flags are set, default takes precedence const bothFlags = LSF_LOAN_DEFAULT | LSF_LOAN_IMPAIRED const result = formatLoanStatus(bothFlags, 1000) expect(result.status).toBe('loan_status_default') }) it('handles string balance values', () => { const result = formatLoanStatus(0, '5000') expect(result.status).toBe('loan_status_current') }) }) /** * ========================================= * SECTION 4: truncateId Tests * ========================================= * truncateId shortens long IDs for display by showing * the first N chars, "...", and the last M chars. * * Default: first 7 chars + "..." + last 5 chars */ describe('truncateId', () => { it('truncates long IDs with default parameters', () => { const longId = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ123456' // Default: first 7 + "..." + last 5 expect(truncateId(longId)).toBe('ABCDEFG...23456') }) it('returns original ID if already short enough', () => { const shortId = 'ABC123' expect(truncateId(shortId)).toBe('ABC123') }) it('uses custom start and end character counts', () => { const id = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' // First 4 + "..." + last 4 expect(truncateId(id, 4, 4)).toBe('ABCD...WXYZ') }) it('handles empty string', () => { expect(truncateId('')).toBe('') }) it('handles undefined/null gracefully', () => { expect(truncateId(undefined as any)).toBe(undefined) }) it('does not truncate if ID length equals threshold', () => { // Threshold is startChars + endChars + 3 (for "...") // Default: 7 + 5 + 3 = 15 const exactId = 'ABCDEFGHIJKLMNO' // 15 chars expect(truncateId(exactId)).toBe(exactId) }) }) /** * ========================================= * SECTION 5: Flag Constants Tests * ========================================= * Verify the loan flag constants match the XLS-66 spec. */ describe('Flag Constants', () => { it('LSF_LOAN_DEFAULT has correct value', () => { // From XLS-66 spec: 0x00010000 = 65536 expect(LSF_LOAN_DEFAULT).toBe(0x00010000) expect(LSF_LOAN_DEFAULT).toBe(65536) }) it('LSF_LOAN_IMPAIRED has correct value', () => { // From XLS-66 spec: 0x00020000 = 131072 expect(LSF_LOAN_IMPAIRED).toBe(0x00020000) expect(LSF_LOAN_IMPAIRED).toBe(131072) }) it('flags are distinct (no overlap)', () => { // Bitwise AND should be 0 for distinct flags expect(LSF_LOAN_DEFAULT & LSF_LOAN_IMPAIRED).toBe(0) }) it('flags can be combined with bitwise OR', () => { const combined = LSF_LOAN_DEFAULT | LSF_LOAN_IMPAIRED // Combined should have both bits set expect(combined & LSF_LOAN_DEFAULT).toBeTruthy() expect(combined & LSF_LOAN_IMPAIRED).toBeTruthy() }) }) }) ================================================ FILE: src/containers/Vault/VaultLoans/utils.ts ================================================ import { convertRippleDate } from '../../../rippled/lib/convertRippleDate' // 1/10th basis point = 0.001% const ONE_TENTH_BASIS_POINT = 1000 // Loan flag constants from XLS-66 spec export const LSF_LOAN_DEFAULT = 0x00010000 export const LSF_LOAN_IMPAIRED = 0x00020000 /** * Format a rate value from 1/10th basis points to percentage string * e.g., 50 (1/10th bps) -> "0.05%" */ export const formatRate = (rate: number | undefined): string => { // the default value for ManagementFeeRate, CoverRateLiquidation and CoverRateMinimum is 0, displayed as `--` if (rate === undefined) return '--' // Convert from 1/10th basis points to percentage // 1 basis point = 0.01%, 1/10th basis point = 0.001% const percentage = rate / ONE_TENTH_BASIS_POINT // The field must be able to display up to 2 decimal places return `${percentage.toFixed(2)}%` } /** * Convert payment interval in seconds to human-readable frequency * Common intervals: Monthly (~30 days), Weekly (7 days), Daily (1 day) */ export const formatPaymentInterval = (seconds: number): string => { const SECONDS_PER_DAY = 86400 const days = Math.round(seconds / SECONDS_PER_DAY) if (days >= 28 && days <= 31) return 'Monthly' if (days >= 13 && days <= 15) return 'Bi-Weekly' if (days >= 6 && days <= 8) return 'Weekly' if (days === 1) return 'Daily' if (days >= 89 && days <= 92) return 'Quarterly' if (days >= 364 && days <= 366) return 'Yearly' return `${days} Days` } /** * Valid translation keys for loan status */ export type LoanStatusKey = | 'loan_status_paid_off' | 'loan_status_default' | 'loan_status_impaired' | 'loan_status_current' /** * Determine loan status based on flags and outstanding balance * Returns status key for translation and color class */ export const formatLoanStatus = ( flags: number, totalLoanValueOutstanding: string | number, ): { status: LoanStatusKey; colorClass: string } => { const outstanding = typeof totalLoanValueOutstanding === 'string' ? Number(totalLoanValueOutstanding) : totalLoanValueOutstanding // Check if loan is paid off (no outstanding balance) if (outstanding === 0) { return { status: 'loan_status_paid_off', colorClass: 'status-paid-off' } } // Check if loan is defaulted // eslint-disable-next-line no-bitwise if (flags & LSF_LOAN_DEFAULT) { return { status: 'loan_status_default', colorClass: 'status-default' } } // Check if loan is impaired // eslint-disable-next-line no-bitwise if (flags & LSF_LOAN_IMPAIRED) { return { status: 'loan_status_impaired', colorClass: 'status-impaired' } } // Otherwise loan is current return { status: 'loan_status_current', colorClass: 'status-current' } } /** * Format a Ripple epoch timestamp to a readable date string */ export const formatRippleDate = ( timestamp: number, language: string = 'en-US', ): string => { if (!timestamp) return '-' const jsTimestamp = convertRippleDate(timestamp) const date = new Date(jsTimestamp) return date.toLocaleDateString(language, { year: 'numeric', month: 'short', day: '2-digit', }) } /** * Truncate a string (like loan ID or address) to show start and end * e.g., "4F5E6D7...890AB" */ export const truncateId = ( id: string, startChars = 7, endChars = 5, ): string => { if (!id || id.length <= startChars + endChars + 3) return id return `${id.slice(0, startChars)}...${id.slice(-endChars)}` } ================================================ FILE: src/containers/Vault/VaultTransactions/index.tsx ================================================ import { useContext } from 'react' import { useTranslation } from 'react-i18next' import { useInfiniteQuery } from 'react-query' import SocketContext from '../../shared/SocketContext' import { getAccountTransactions } from '../../../rippled' import { TransactionTable } from '../../shared/components/TransactionTable/TransactionTable' import { useAnalytics } from '../../shared/analytics' import './styles.scss' interface Props { accountId: string } export const VaultTransactions = ({ accountId }: Props) => { const { t } = useTranslation() const { trackException } = useAnalytics() const rippledSocket = useContext(SocketContext) const { data, error, isFetching: loading, fetchNextPage, hasNextPage, } = useInfiniteQuery( ['fetchVaultTransactions', accountId], ({ pageParam = '' }) => getAccountTransactions( accountId, undefined, pageParam, undefined, rippledSocket, ).catch((errorResponse) => { const errorLocation = `vault transactions ${accountId} at ${pageParam}` trackException(`${errorLocation} --- ${JSON.stringify(errorResponse)}`) throw new Error('get_vault_transactions_failed') }), { getNextPageParam: (lastPage) => lastPage.marker, enabled: !!accountId, }, ) const transactions = data?.pages?.reduce( (allTransactions: any[], page: any) => page.transactions ? allTransactions.concat(page.transactions) : allTransactions, [], ) || [] return (

    {t('transactions')}

    fetchNextPage()} hasAdditionalResults={hasNextPage} hasHashColumn />
    ) } ================================================ FILE: src/containers/Vault/VaultTransactions/styles.scss ================================================ @use '../../shared/css/variables' as *; .vault-transactions-section { width: 100%; padding: 0 24px; margin-top: 48px; @include for-size(desktop-up) { padding: 0 64px; } .vault-transactions-title { margin: 0 0 16px; color: $white; font-size: 24px; @include bold; } .vault-transactions-divider { background: $black-70; } .transaction-table { overflow-x: auto; } } ================================================ FILE: src/containers/Vault/VaultTransactions/test/VaultTransactions.test.tsx ================================================ /** * VaultTransactions Component Unit Tests * * This test suite validates the VaultTransactions component which displays * a paginated list of transactions for a vault's pseudo account. * * Key concepts tested: * - Basic rendering (section title, table headers) * - Loading state with Loader component * - Empty state when no transactions exist * - Transaction list display with proper columns * - Error handling and error message display * - Pagination via "Load More" button * - Infinite query behavior for fetching transaction pages */ import { render, screen, waitFor, fireEvent } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import { QueryClientProvider, QueryClient } from 'react-query' import i18n from '../../../../i18n/testConfigEnglish' import SocketContext from '../../../shared/SocketContext' import { VaultTransactions } from '../index' import { getAccountTransactions } from '../../../../rippled' import Mock = jest.Mock // Mock the rippled library to control API responses jest.mock('../../../../rippled', () => ({ getAccountTransactions: jest.fn(), })) // Mock the analytics hook (used by LoadMoreButton and VaultTransactions) const mockTrackException = jest.fn() const mockTrack = jest.fn() jest.mock('../../../shared/analytics', () => ({ useAnalytics: () => ({ trackException: mockTrackException, track: mockTrack, }), })) const mockedGetAccountTransactions = getAccountTransactions as Mock // Mock socket client - represents the WebSocket connection to rippled const mockSocket = {} as any /** * Creates a fresh QueryClient for each test * * We disable retries and set stale time to 0 to make tests predictable. * Each test gets its own QueryClient to prevent state leakage between tests. */ const createTestQueryClient = () => new QueryClient({ defaultOptions: { queries: { retry: false, staleTime: 0, cacheTime: 0, }, }, }) /** * TestWrapper Component * * Provides all necessary context providers for the VaultTransactions component: * - I18nextProvider: Internationalization for translated text * - Router: React Router for link components (transaction links) * - SocketContext: WebSocket connection for rippled queries * - QueryClientProvider: React Query for data fetching/caching */ const createTestWrapper = (queryClient: QueryClient) => ({ children }: { children: React.ReactNode }) => ( {children} ) /** * Mock transaction data generator * * Creates realistic transaction objects with all fields needed by TransactionTableRow. * Each transaction includes: hash, type, account, result, date. * * Note: We intentionally omit 'details' to avoid triggering nested TableDetail * components which may have complex dependencies (like Account component). */ const createMockTransaction = (overrides: any = {}) => ({ hash: `HASH${Math.random().toString(36).substring(7).toUpperCase()}`, type: 'Payment', account: 'rTestAccount123', result: 'tesSUCCESS', date: '2024-01-15T10:30:00Z', ...overrides, }) describe('VaultTransactions Component', () => { let queryClient: QueryClient // Create fresh QueryClient and reset mocks before each test beforeEach(() => { jest.clearAllMocks() queryClient = createTestQueryClient() }) // Clean up after each test afterEach(() => { queryClient.clear() }) /** * ========================================= * SECTION 1: Basic Rendering Tests * ========================================= * These tests verify the component renders correctly with its * structural elements: title, divider, and table headers. */ describe('Basic Rendering', () => { it('renders the transactions section title', async () => { // Setup: Return empty transactions to focus on structure mockedGetAccountTransactions.mockResolvedValue({ transactions: [], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) // The component should display "Transactions" as the section title await waitFor(() => { const title = screen.getByText('Transactions') expect(title.tagName).toBe('H2') expect(title).toHaveClass('vault-transactions-title') }) }) it('renders the divider element', async () => { mockedGetAccountTransactions.mockResolvedValue({ transactions: [], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) // Verify the divider element exists for visual separation await waitFor(() => { expect( container.querySelector('.vault-transactions-divider'), ).toBeInTheDocument() }) }) it('renders table headers with hash column', async () => { // VaultTransactions passes hasHashColumn as true mockedGetAccountTransactions.mockResolvedValue({ transactions: [], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) // Verify all expected column headers are present // The TransactionTable renders these headers when hasHashColumn/hasAmountColumn are true await waitFor(() => { expect(screen.getByText('Tx Hash')).toBeInTheDocument() expect(screen.getByText('Account')).toBeInTheDocument() expect(screen.getByText('Transaction Type')).toBeInTheDocument() expect(screen.getByText('Status')).toBeInTheDocument() expect(screen.getByText('Date/time (UTC)')).toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 2: Loading State Tests * ========================================= * When fetching transactions, a Loader should be displayed. * This provides visual feedback to users during data retrieval. */ describe('Loading State', () => { it('displays loader while fetching transactions', async () => { // Setup: Create a promise that won't resolve immediately to keep loading state let resolvePromise: (value: any) => void const pendingPromise = new Promise((resolve) => { resolvePromise = resolve }) mockedGetAccountTransactions.mockReturnValue(pendingPromise) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) // The Loader component should be visible during fetch expect(container.querySelector('.loader')).toBeInTheDocument() // Clean up: resolve the promise resolvePromise!({ transactions: [], marker: undefined }) }) it('hides loader after transactions are loaded', async () => { mockedGetAccountTransactions.mockResolvedValue({ transactions: [createMockTransaction()], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) // Wait for loading to complete await waitFor(() => { expect(container.querySelector('.loader')).not.toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 3: Empty State Tests * ========================================= * When no transactions exist for an account, the component should * display an appropriate empty state message. */ describe('Empty State', () => { it('displays empty message when no transactions exist', async () => { mockedGetAccountTransactions.mockResolvedValue({ transactions: [], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) // The TransactionTable shows a default empty message await waitFor(() => { expect(screen.getByText('No transactions found.')).toBeInTheDocument() }) }) it('does not show Load More button when there are no transactions', async () => { mockedGetAccountTransactions.mockResolvedValue({ transactions: [], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(screen.queryByText('Load more...')).not.toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 4: Transaction Display Tests * ========================================= * These tests verify that transactions are rendered correctly * with all their details: hash, account, type, amount, status, date. */ describe('Transaction Display', () => { it('renders transaction rows for each transaction', async () => { const transactions = [ createMockTransaction({ hash: 'HASH001ABC' }), createMockTransaction({ hash: 'HASH002DEF' }), createMockTransaction({ hash: 'HASH003GHI' }), ] mockedGetAccountTransactions.mockResolvedValue({ transactions, marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) // Each transaction should render as a list item await waitFor(() => { // transaction-li class is used for each row (excluding header) const transactionRows = container.querySelectorAll( '.transaction-li:not(.transaction-li-header)', ) expect(transactionRows.length).toBe(3) }) }) it('displays transaction hash in shortened format', async () => { // Transaction hashes are typically 64 characters; UI shortens them for readability const fullHash = 'ABC123DEF456789012345678901234567890123456789012345678901234' const transactions = [createMockTransaction({ hash: fullHash })] mockedGetAccountTransactions.mockResolvedValue({ transactions, marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) // The hash should be shortened (first 6 chars + ... + last 6 chars pattern) await waitFor(() => { // shortenTxHash function shortens to "ABC123...1234" format const hashElement = screen.getByText(/ABC123...901234/) expect(hashElement).toBeInTheDocument() }) }) it('shows success status for successful transactions', async () => { const transactions = [createMockTransaction({ result: 'tesSUCCESS' })] mockedGetAccountTransactions.mockResolvedValue({ transactions, marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) // Successful transactions have 'success' class await waitFor(() => { const successRow = container.querySelector('.transaction-li.success') expect(successRow).toBeInTheDocument() }) }) it('shows fail status for failed transactions', async () => { // Non-tesSUCCESS results are considered failures const transactions = [createMockTransaction({ result: 'tecNO_DST' })] mockedGetAccountTransactions.mockResolvedValue({ transactions, marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) // Failed transactions have 'fail' class await waitFor(() => { const failRow = container.querySelector('.transaction-li.fail') expect(failRow).toBeInTheDocument() }) }) it('displays different transaction types correctly', async () => { // Vault transactions can include various types: deposits, withdrawals, loans, etc. const transactions = [ createMockTransaction({ type: 'VaultDeposit', hash: 'HASH_DEPOSIT' }), createMockTransaction({ type: 'VaultWithdraw', hash: 'HASH_WITHDRAW' }), createMockTransaction({ type: 'VaultClawback', hash: 'HASH_CLAWBACK' }), ] mockedGetAccountTransactions.mockResolvedValue({ transactions, marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(screen.getByText('Vault Deposit')).toBeInTheDocument() expect(screen.getByText('Vault Withdraw')).toBeInTheDocument() expect(screen.getByText('Vault Clawback')).toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 5: Error Handling Tests * ========================================= * When API calls fail, the component should display appropriate * error messages to inform the user of the issue. */ describe('Error Handling', () => { it('displays error message when transaction fetch fails', async () => { // Simulate API error mockedGetAccountTransactions.mockRejectedValue( new Error('get_vault_transactions_failed'), ) const TestWrapper = createTestWrapper(queryClient) render( , ) // The error message is displayed via TransactionTable's emptyMessage await waitFor(() => { expect( screen.getByText('Unable to load vault transactions at this time.'), ).toBeInTheDocument() }) }) it('does not display loader when error occurs', async () => { mockedGetAccountTransactions.mockRejectedValue( new Error('get_vault_transactions_failed'), ) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) await waitFor(() => { expect(container.querySelector('.loader')).not.toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 6: Pagination Tests * ========================================= * The component uses infinite query for pagination. When more * transactions are available, a "Load More" button appears. */ describe('Pagination', () => { it('displays Load More button when more results are available', async () => { // When API returns a marker, it indicates more results exist mockedGetAccountTransactions.mockResolvedValue({ transactions: [createMockTransaction()], marker: 'next_page_marker', // Presence of marker means more pages }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(screen.getByText('Load more...')).toBeInTheDocument() }) }) it('does not display Load More button when no more results', async () => { // No marker means this is the last page mockedGetAccountTransactions.mockResolvedValue({ transactions: [createMockTransaction()], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(screen.queryByText('Load more...')).not.toBeInTheDocument() }) }) it('fetches next page when Load More is clicked', async () => { // First page response with marker indicating more pages const firstPageTransactions = [ createMockTransaction({ hash: 'FIRST_PAGE_HASH' }), ] const secondPageTransactions = [ createMockTransaction({ hash: 'SECOND_PAGE_HASH' }), ] mockedGetAccountTransactions .mockResolvedValueOnce({ transactions: firstPageTransactions, marker: 'page_2_marker', }) .mockResolvedValueOnce({ transactions: secondPageTransactions, marker: undefined, // No more pages }) const TestWrapper = createTestWrapper(queryClient) render( , ) // Wait for first page to load await waitFor(() => { expect(screen.getByText('Load more...')).toBeInTheDocument() }) // Click Load More fireEvent.click(screen.getByText('Load more...')) // Verify second page was requested await waitFor(() => { expect(mockedGetAccountTransactions).toHaveBeenCalledTimes(2) }) }) it('accumulates transactions from multiple pages', async () => { const firstPageTransactions = [ createMockTransaction({ hash: 'PAGE1_HASH1', account: 'rAccount1' }), createMockTransaction({ hash: 'PAGE1_HASH2', account: 'rAccount2' }), ] const secondPageTransactions = [ createMockTransaction({ hash: 'PAGE2_HASH1', account: 'rAccount3' }), ] mockedGetAccountTransactions .mockResolvedValueOnce({ transactions: firstPageTransactions, marker: 'page_2_marker', }) .mockResolvedValueOnce({ transactions: secondPageTransactions, marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) // Wait for first page await waitFor(() => { expect(screen.getByText('Load more...')).toBeInTheDocument() }) // Click Load More to fetch second page fireEvent.click(screen.getByText('Load more...')) // After loading both pages, all 3 transactions should be displayed await waitFor(() => { const transactionRows = container.querySelectorAll( '.transaction-li:not(.transaction-li-header)', ) expect(transactionRows.length).toBe(3) }) }) it('hides Load More button after all pages are loaded', async () => { mockedGetAccountTransactions .mockResolvedValueOnce({ transactions: [createMockTransaction()], marker: 'page_2_marker', }) .mockResolvedValueOnce({ transactions: [createMockTransaction()], marker: undefined, // Last page }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(screen.getByText('Load more...')).toBeInTheDocument() }) fireEvent.click(screen.getByText('Load more...')) // After loading last page, Load More should disappear await waitFor(() => { expect(screen.queryByText('Load more...')).not.toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 7: Query Behavior Tests * ========================================= * Tests for the useInfiniteQuery behavior and its configuration. */ describe('Query Behavior', () => { it('does not fetch when accountId is empty', () => { const TestWrapper = createTestWrapper(queryClient) render( , ) // Query should not be enabled when accountId is empty expect(mockedGetAccountTransactions).not.toHaveBeenCalled() }) it('fetches transactions with correct accountId', async () => { const testAccountId = 'rVaultPseudoAccount456' mockedGetAccountTransactions.mockResolvedValue({ transactions: [], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(mockedGetAccountTransactions).toHaveBeenCalledWith( testAccountId, undefined, // currency '', // marker (empty for first page) undefined, // limit mockSocket, // rippledSocket ) }) }) it('passes marker to subsequent page requests', async () => { const pageMarker = 'test_marker_12345' mockedGetAccountTransactions .mockResolvedValueOnce({ transactions: [createMockTransaction()], marker: pageMarker, }) .mockResolvedValueOnce({ transactions: [], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(screen.getByText('Load more...')).toBeInTheDocument() }) fireEvent.click(screen.getByText('Load more...')) // Second call should include the marker from first response await waitFor(() => { expect(mockedGetAccountTransactions).toHaveBeenNthCalledWith( 2, 'rTestAccount', undefined, pageMarker, // marker from previous response undefined, mockSocket, ) }) }) }) /** * ========================================= * SECTION 8: Edge Cases * ========================================= * Tests for unusual inputs and boundary conditions. */ describe('Edge Cases', () => { it('handles transactions with missing details gracefully', async () => { // Some transactions might not have details or amount const transactionWithoutDetails = { hash: 'HASH_NO_DETAILS', type: 'AccountSet', account: 'rTestAccount', result: 'tesSUCCESS', date: '2024-01-15T10:30:00Z', // No details field } mockedGetAccountTransactions.mockResolvedValue({ transactions: [transactionWithoutDetails], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) const { container } = render( , ) // Component should render without crashing await waitFor(() => { const transactionRows = container.querySelectorAll( '.transaction-li:not(.transaction-li-header)', ) expect(transactionRows.length).toBe(1) }) }) it('handles API returning null transactions array', async () => { mockedGetAccountTransactions.mockResolvedValue({ transactions: null, marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) // Should show empty message, not crash await waitFor(() => { expect(screen.getByText('No transactions found.')).toBeInTheDocument() }) }) it('handles very long account IDs', async () => { const longAccountId = `r${'A'.repeat(50)}` mockedGetAccountTransactions.mockResolvedValue({ transactions: [], marker: undefined, }) const TestWrapper = createTestWrapper(queryClient) render( , ) await waitFor(() => { expect(mockedGetAccountTransactions).toHaveBeenCalledWith( longAccountId, undefined, '', undefined, mockSocket, ) }) }) }) }) ================================================ FILE: src/containers/Vault/index.tsx ================================================ import { FC, PropsWithChildren, useContext, useEffect, useState } from 'react' import { useParams } from 'react-router' import { Helmet } from 'react-helmet-async' import { useQuery } from 'react-query' import { useTranslation } from 'react-i18next' import NoMatch from '../NoMatch' import { VaultHeader } from './VaultHeader' import { VaultTransactions } from './VaultTransactions' import { VaultLoans } from './VaultLoans' import { CurrencyToggle } from './CurrencyToggle' import { Loader } from '../shared/components/Loader' import { CopyableText } from '../shared/components/CopyableText/CopyableText' import { Tooltip, useTooltip } from '../shared/components/Tooltip' import SocketContext from '../shared/SocketContext' import { getVault, getMPTIssuance } from '../../rippled/lib/rippled' import { useAnalytics } from '../shared/analytics' import { useTokenToUSDRate } from '../shared/hooks/useTokenToUSDRate' import { parseMPTokenMetadata } from '../shared/mptUtils' import { NOT_FOUND, BAD_REQUEST, shortenVaultID, getCurrencySymbol, shortenMPTID, } from '../shared/utils' import { ErrorMessage } from '../shared/Interfaces' import { parseVaultName, renderAssetCurrency } from './utils' import './styles.scss' const ERROR_MESSAGES: { [code: number]: ErrorMessage } = { [NOT_FOUND]: { title: 'vault_not_found', hints: ['check_vault_id'], }, [BAD_REQUEST]: { title: 'invalid_vault_id', hints: ['check_vault_id'], }, } const DEFAULT_ERROR: ErrorMessage = { title: 'get_vault_failed', hints: ['not_your_fault'], } const getErrorMessage = (error: number | null) => error ? (ERROR_MESSAGES[error] ?? DEFAULT_ERROR) : DEFAULT_ERROR const Page: FC> = ({ vaultId, children, }) => (
    {children}
    ) export const Vault = () => { const { t } = useTranslation() const { trackScreenLoaded, trackException } = useAnalytics() const { id: vaultId = '' } = useParams<{ id: string }>() const [error, setError] = useState(null) const [displayCurrency, setDisplayCurrency] = useState('') const rippledSocket = useContext(SocketContext) const { tooltip } = useTooltip() const { data: vaultData, isFetching: loading } = useQuery( ['getVault', vaultId], async () => getVault(rippledSocket, vaultId), { enabled: !!vaultId, onError: (e: any) => { trackException( `Error fetching Vault data for vault ID ${vaultId} --- ${JSON.stringify(e)}`, ) setError(e.code) }, }, ) // Check if USD conversion is available for this token // Must be called before any early returns to satisfy React hooks rules const { isAvailable: usdAvailable, isLoading: usdLoading } = useTokenToUSDRate(vaultData?.Asset) // Fetch MPT issuance data to extract ticker from metadata const mptIssuanceId = vaultData?.Asset?.mpt_issuance_id const { data: assetMptIssuanceData } = useQuery( ['getVaultAssetMPTIssuance', mptIssuanceId], async () => { if (!mptIssuanceId) return null const resp = await getMPTIssuance(rippledSocket, mptIssuanceId) return resp?.node }, { enabled: !!mptIssuanceId, onError: (e: any) => { trackException( `Error fetching MPT Issuance data for vault asset MPT ID ${mptIssuanceId} --- ${JSON.stringify(e)}`, ) }, }, ) const mptTicker = parseMPTokenMetadata(assetMptIssuanceData?.MPTokenMetadata) ?.ticker as string | undefined // Compute native currency label from vault asset const nativeCurrency = getCurrencySymbol(vaultData?.Asset?.currency) ?? mptTicker ?? shortenMPTID(vaultData?.Asset?.mpt_issuance_id) ?? '' useEffect(() => { trackScreenLoaded({ vault_id: vaultId, }) return () => { window.scrollTo(0, 0) } }, [vaultId, trackScreenLoaded]) // Set displayCurrency to native currency once vault data loads, // and update it when the MPIssuance ticker resolves (unless user has toggled to USD) useEffect(() => { if (nativeCurrency && (!displayCurrency || displayCurrency !== 'USD')) { setDisplayCurrency(nativeCurrency) } }, [nativeCurrency]) // eslint-disable-line react-hooks/exhaustive-deps const renderError = () => { const message = getErrorMessage(error) return (
    ) } if (error) { return {renderError()} } // Get the Vault's (Pseudo)Account ID for transactions const transactionAccountId = vaultData?.Account return ( {vaultId && loading && } {vaultId && !loading && vaultData && ( <>

    {parseVaultName(vaultData.Data) || t('single_asset_vault')}

    {t('vault_id')}:
    setDisplayCurrency(val || nativeCurrency)} usdDisabled={!usdAvailable} usdLoading={usdLoading} />
    {transactionAccountId && ( )} {/* TODO: Include the VaultDepositors component here once Clio APIs are available */} {transactionAccountId && ( )} )}
    ) } export default Vault ================================================ FILE: src/containers/Vault/styles.scss ================================================ @use '../shared/css/variables' as *; .vault-page { width: 100%; margin-top: 100px; .loader { min-height: 100px; } } .vault-warning { font-size: 14px; text-align: center; } .vault-title-section { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; padding: 0 24px; margin-bottom: 32px; gap: 16px; @include for-size(desktop-up) { flex-wrap: nowrap; padding: 0 64px; } .vault-title-left { flex: 1; } .vault-title { margin: 0 0 16px; color: $white; font-size: 36px; @include bold; @include for-size(desktop-up) { font-size: 48px; } } .vault-title-id { display: flex; align-items: center; color: $white; font-size: 14px; gap: 8px; .vault-title-id-label { color: $black-40; font-size: 12px; letter-spacing: 0.5px; text-transform: uppercase; } } } .currency-toggle-wrapper { display: flex; align-items: center; gap: 8px; } .currency-toggle { display: flex; align-items: center; padding: 4px; border: 1px solid $black-40; border-radius: 6px; background: transparent; .toggle-option { border: none; border-radius: 4px; background: transparent; color: $black-40; cursor: pointer; font-size: 14px; transition: all 0.2s ease; @include medium; &:hover:not(.disabled) { color: $white; } &.active { background: transparent; color: $green; } &.disabled { cursor: not-allowed; opacity: 0.4; &:hover { color: $black-40; } } } } ================================================ FILE: src/containers/Vault/test/CurrencyToggle.test.tsx ================================================ /** * CurrencyToggle Component Unit Tests * * This test suite validates the CurrencyToggle component which allows users * to switch between viewing values in the vault's native currency or USD. * * Key concepts tested: * - Basic rendering (native currency button, USD button, help icon) * - Toggle functionality (clicking buttons triggers onToggle callback) * - Active state styling (selected currency shows active class) * - USD button disabled state (when conversion rate is unavailable) * - USD button loading state (while fetching conversion rate) * - Tooltip behavior (help icon, disabled/loading tooltips) */ import { render, screen, fireEvent } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../i18n/testConfigEnglish' import { CurrencyToggle } from '../CurrencyToggle' // Mock the useTooltip hook const mockShowTooltip = jest.fn() const mockHideTooltip = jest.fn() jest.mock('../../shared/components/Tooltip', () => ({ useTooltip: () => ({ showTooltip: mockShowTooltip, hideTooltip: mockHideTooltip, }), })) /** * TestWrapper Component * * Provides I18nextProvider for translated text in the component. */ const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) describe('CurrencyToggle Component', () => { // Reset mocks before each test beforeEach(() => { jest.clearAllMocks() }) /** * ========================================= * SECTION 1: Basic Rendering Tests * ========================================= * Verify the component renders all expected elements. */ describe('Basic Rendering', () => { it('renders native currency and USD button', () => { const onToggle = jest.fn() render( ABC} selected="ABC" onToggle={onToggle} /> , ) expect(screen.getByText('ABC')).toBeInTheDocument() expect(screen.getByText('USD')).toBeInTheDocument() }) it('renders help icon', () => { const onToggle = jest.fn() const { container } = render( XRP} selected="XRP" onToggle={onToggle} /> , ) expect( container.querySelector('.currency-toggle-wrapper > .hover'), ).toBeInTheDocument() }) }) /** * ========================================= * SECTION 2: Active State Tests * ========================================= * Verify correct styling when each currency is selected. */ describe('Active State', () => { it('shows native currency button as active when selected is not USD', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} /> , ) const nativeButton = screen.getByText('XRP').closest('button') expect(nativeButton).toHaveClass('active') }) it('shows USD button as active when selected is "USD"', () => { const onToggle = jest.fn() render( XRP} selected="USD" onToggle={onToggle} /> , ) const usdButton = screen.getByText('USD') expect(usdButton).toHaveClass('active') }) it('native currency button is not active when USD is selected', () => { const onToggle = jest.fn() render( XRP} selected="USD" onToggle={onToggle} /> , ) const nativeButton = screen.getByText('XRP').closest('button') expect(nativeButton).not.toHaveClass('active') }) it('USD button is not active when native currency is selected', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} /> , ) const usdButton = screen.getByText('USD') expect(usdButton).not.toHaveClass('active') }) }) /** * ========================================= * SECTION 3: Toggle Functionality Tests * ========================================= * Verify clicking buttons triggers the onToggle callback correctly. */ describe('Toggle Functionality', () => { it('calls onToggle with empty string when native currency button is clicked', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} /> , ) fireEvent.click(screen.getByText('XRP')) // Empty string indicates native currency expect(onToggle).toHaveBeenCalledWith('') }) it('calls onToggle with "USD" when USD button is clicked', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} /> , ) fireEvent.click(screen.getByText('USD')) expect(onToggle).toHaveBeenCalledWith('USD') }) it('allows clicking native currency button even when already selected', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} /> , ) fireEvent.click(screen.getByText('XRP')) // Empty string indicates native currency expect(onToggle).toHaveBeenCalledWith('') }) }) /** * ========================================= * SECTION 4: USD Disabled State Tests * ========================================= * When USD conversion rate is unavailable, the USD button should be disabled. */ describe('USD Disabled State (Rate Unavailable)', () => { it('disables USD button when usdDisabled is true', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} usdDisabled /> , ) const usdButton = screen.getByText('USD') expect(usdButton).toBeDisabled() }) it('adds disabled class when usdDisabled is true', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} usdDisabled /> , ) const usdButton = screen.getByText('USD') expect(usdButton).toHaveClass('disabled') }) it('does not call onToggle when disabled USD button is clicked', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} usdDisabled /> , ) fireEvent.click(screen.getByText('USD')) expect(onToggle).not.toHaveBeenCalled() }) it('native currency button still works when USD is disabled', () => { const onToggle = jest.fn() render( XRP} selected="USD" onToggle={onToggle} usdDisabled /> , ) fireEvent.click(screen.getByText('XRP')) // Empty string indicates switching back to native currency expect(onToggle).toHaveBeenCalledWith('') }) it('shows unavailable tooltip on hover when USD is disabled', () => { const onToggle = jest.fn() const { container } = render( XRP} selected="XRP" onToggle={onToggle} usdDisabled /> , ) const hoverIcon = container.querySelector( '.toggle-option-wrapper .hover', )! fireEvent.mouseOver(hoverIcon) expect(mockShowTooltip).toHaveBeenCalledWith( 'text', expect.any(Object), 'USD conversion not available for this token', expect.objectContaining({ x: expect.any(Number), y: expect.any(Number), }), ) }) it('hides tooltip on mouse leave', () => { const onToggle = jest.fn() const { container } = render( XRP} selected="XRP" onToggle={onToggle} usdDisabled /> , ) const hoverIcon = container.querySelector( '.toggle-option-wrapper .hover', )! fireEvent.mouseOver(hoverIcon) fireEvent.mouseLeave(hoverIcon) expect(mockHideTooltip).toHaveBeenCalled() }) }) /** * ========================================= * SECTION 5: USD Loading State Tests * ========================================= * While fetching conversion rate, show loading state. */ describe('USD Loading State', () => { it('shows "..." instead of "USD" when loading', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} usdLoading /> , ) expect(screen.getByText('...')).toBeInTheDocument() expect(screen.queryByText('USD')).not.toBeInTheDocument() }) it('disables USD button when loading', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} usdLoading /> , ) const loadingButton = screen.getByText('...') expect(loadingButton).toBeDisabled() }) it('adds disabled class when loading', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} usdLoading /> , ) const loadingButton = screen.getByText('...') expect(loadingButton).toHaveClass('disabled') }) it('does not call onToggle when loading USD button is clicked', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} usdLoading /> , ) fireEvent.click(screen.getByText('...')) expect(onToggle).not.toHaveBeenCalled() }) it('shows loading tooltip on hover when loading', () => { const onToggle = jest.fn() const { container } = render( XRP} selected="XRP" onToggle={onToggle} usdLoading /> , ) const hoverIcon = container.querySelector( '.toggle-option-wrapper .hover', )! fireEvent.mouseOver(hoverIcon) expect(mockShowTooltip).toHaveBeenCalledWith( 'text', expect.any(Object), 'Loading USD conversion rate...', expect.objectContaining({ x: expect.any(Number), y: expect.any(Number), }), ) }) }) /** * ========================================= * SECTION 6: Help Icon Tooltip Tests * ========================================= * Verify the help icon shows tooltip on hover. */ describe('Help Icon Tooltip', () => { it('shows help tooltip on hover', () => { const onToggle = jest.fn() const { container } = render( EUR} selected="EUR" onToggle={onToggle} /> , ) const helpIcon = container.querySelector( '.currency-toggle-wrapper > .hover', )! fireEvent.mouseOver(helpIcon) expect(mockShowTooltip).toHaveBeenCalledWith( 'text', expect.any(Object), 'Toggle to view values in native-currency or USD', expect.objectContaining({ x: expect.any(Number), y: expect.any(Number), }), ) }) it('hides help tooltip on mouse leave', () => { const onToggle = jest.fn() const { container } = render( XRP} selected="XRP" onToggle={onToggle} /> , ) const helpIcon = container.querySelector( '.currency-toggle-wrapper > .hover', )! fireEvent.mouseOver(helpIcon) fireEvent.mouseLeave(helpIcon) expect(mockHideTooltip).toHaveBeenCalled() }) }) /** * ========================================= * SECTION 7: Enabled USD State Tests * ========================================= * When USD conversion is available and not loading. */ describe('USD Enabled State (Rate Available)', () => { it('USD button is enabled by default (no usdDisabled or usdLoading)', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} /> , ) const usdButton = screen.getByText('USD') expect(usdButton).not.toBeDisabled() expect(usdButton).not.toHaveClass('disabled') }) it('USD button is enabled when usdDisabled is explicitly false', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} usdDisabled={false} /> , ) const usdButton = screen.getByText('USD') expect(usdButton).not.toBeDisabled() }) it('does not show tooltip on hover when USD is enabled', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} /> , ) const usdButton = screen.getByText('USD') // Mouse events are on the wrapper span const wrapper = usdButton.parentElement! fireEvent.mouseEnter(wrapper) // showTooltip should not be called because getUsdTooltip returns '' expect(mockShowTooltip).not.toHaveBeenCalled() }) it('calls onToggle when enabled USD button is clicked', () => { const onToggle = jest.fn() render( XRP} selected="XRP" onToggle={onToggle} usdDisabled={false} usdLoading={false} /> , ) fireEvent.click(screen.getByText('USD')) expect(onToggle).toHaveBeenCalledWith('USD') }) }) /** * ========================================= * SECTION 8: JSX Display Prop Tests * ========================================= * Test the nativeCurrencyDisplay prop for custom JSX rendering. */ describe('JSX Display Prop (nativeCurrencyDisplay)', () => { it('renders nativeCurrencyDisplay when provided', () => { const onToggle = jest.fn() render( Custom-XRP } selected="Custom-XRP" onToggle={onToggle} /> , ) expect(screen.getByTestId('custom-display')).toBeInTheDocument() expect(screen.getByText('Custom-XRP')).toBeInTheDocument() }) it('calls onToggle with empty string when JSX display is clicked', () => { const onToggle = jest.fn() render( ABC123...} selected="ABC123" onToggle={onToggle} /> , ) // Click the native currency button (which shows the JSX display) fireEvent.click(screen.getByText('ABC123...')) // Empty string indicates switching to native currency expect(onToggle).toHaveBeenCalledWith('') }) }) /** * ========================================= * SECTION 9: MPT Ticker Display Tests * ========================================= * When an MPT asset has XLS-89 metadata with a ticker symbol, * the toggle should display the ticker (e.g., "VTKN") instead * of the truncated MPT ID (e.g., "000086F0...234DE"). */ describe('MPT Ticker Display', () => { it('displays MPT ticker symbol when available', () => { const onToggle = jest.fn() render( VTKN} selected="VTKN" onToggle={onToggle} /> , ) // Ticker should appear as the native currency button text expect(screen.getByText('VTKN')).toBeInTheDocument() // Should NOT show an MPT ID format expect(screen.queryByText(/MPT \(/)).not.toBeInTheDocument() }) it('shows MPT ticker as active when selected', () => { const onToggle = jest.fn() render( VTKN} selected="VTKN" onToggle={onToggle} /> , ) const tickerButton = screen.getByText('VTKN').closest('button') expect(tickerButton).toHaveClass('active') }) it('calls onToggle with empty string when MPT ticker button is clicked', () => { const onToggle = jest.fn() render( VTKN} selected="USD" onToggle={onToggle} /> , ) fireEvent.click(screen.getByText('VTKN')) expect(onToggle).toHaveBeenCalledWith('') }) it('falls back to truncated MPT ID when ticker is not available', () => { const onToggle = jest.fn() render( 000086F0...234DE} selected="" onToggle={onToggle} /> , ) expect(screen.getByText('000086F0...234DE')).toBeInTheDocument() }) it('toggles between MPT ticker and USD correctly', () => { const selections: string[] = [] const onToggle = (currency: string) => { selections.push(currency) } const { rerender } = render( VTKN} selected="VTKN" onToggle={onToggle} /> , ) // Click USD fireEvent.click(screen.getByText('USD')) expect(selections).toEqual(['USD']) // Rerender with USD selected rerender( VTKN} selected="USD" onToggle={onToggle} /> , ) // Click ticker to switch back fireEvent.click(screen.getByText('VTKN')) expect(selections).toEqual(['USD', '']) }) }) /** * ========================================= * SECTION 10: Edge Cases * ========================================= * Test edge cases and unusual inputs. */ describe('Edge Cases', () => { it('maintains correct state after multiple toggles', () => { const selections: string[] = [] const onToggle = (currency: string) => { selections.push(currency) } const { rerender } = render( XRP} selected="XRP" onToggle={onToggle} /> , ) // Click USD fireEvent.click(screen.getByText('USD')) expect(selections).toContain('USD') // Rerender with USD selected rerender( XRP} selected="USD" onToggle={onToggle} /> , ) // Click native currency button - passes empty string to switch to native fireEvent.click(screen.getByText('XRP')) expect(selections).toContain('') // Both clicks resulted in expected callbacks expect(selections).toEqual(['USD', '']) }) }) }) ================================================ FILE: src/containers/Vault/test/Vault.test.tsx ================================================ /** * Vault Component Unit Tests * * This test suite validates the top-level Vault page component. * Tests focus on page-level behavior NOT covered by child component tests: * * - Page structure and Helmet title * - Loading state * - Error handling (NOT_FOUND, BAD_REQUEST, generic errors) * - No vault ID warning state * - Title section (decoded name vs "Yield Pool" fallback) * - Conditional rendering of child components * - Analytics tracking (trackScreenLoaded) * - Asset currency display logic * * Child components (VaultHeader, VaultLoans, VaultTransactions, VaultDepositors) * are mocked to avoid redundant testing - they have their own test suites. */ import { render, screen, waitFor } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { MemoryRouter, Route, Routes } from 'react-router' import { QueryClientProvider, QueryClient } from 'react-query' import { HelmetProvider } from 'react-helmet-async' import i18n from '../../../i18n/testConfigEnglish' import SocketContext from '../../shared/SocketContext' import { Vault } from '../index' import { getVault } from '../../../rippled/lib/rippled' import Mock = jest.Mock // Mock the rippled API jest.mock('../../../rippled/lib/rippled', () => ({ getVault: jest.fn(), getMPTIssuance: jest.fn(), })) // Mock analytics const mockTrackScreenLoaded = jest.fn() const mockTrackException = jest.fn() jest.mock('../../shared/analytics', () => ({ useAnalytics: () => ({ trackScreenLoaded: mockTrackScreenLoaded, trackException: mockTrackException, }), })) // Mock NoMatch component to avoid its socket dependencies jest.mock('../../NoMatch', () => ({ __esModule: true, default: ({ title, hints }: { title: string; hints?: string[] }) => (
    {title}
    {hints?.map((hint) => (
    {hint}
    ))}
    ), })) // Mock useTokenToUSDRate hook jest.mock('../../shared/hooks/useTokenToUSDRate', () => ({ useTokenToUSDRate: () => ({ rate: 2.0, isAvailable: true, isLoading: false }), })) // Mock child components to avoid testing their internals jest.mock('../VaultHeader', () => ({ VaultHeader: ({ vaultId }: { vaultId: string }) => (
    VaultHeader: {vaultId}
    ), })) jest.mock('../VaultLoans', () => ({ VaultLoans: ({ vaultId, vaultPseudoAccount, asset }: any) => { // Mock mirrors VaultLoans currency derivation logic const NON_STANDARD_CODE_LENGTH = 40 const LP_TOKEN_IDENTIFIER = '03' const hexToString = (hex: string) => { let s = '' for (let i = 0; i < hex.length; i += 2) { const code = parseInt(hex.substring(i, i + 2), 16) if (!isNaN(code) && code !== 0) s += String.fromCharCode(code) } return s } let currency = '' if (asset?.currency) { if ( asset.currency.length === NON_STANDARD_CODE_LENGTH && asset.currency.substring(0, 2) !== LP_TOKEN_IDENTIFIER ) { currency = hexToString(asset.currency) } else { currency = asset.currency } } else if (asset?.mpt_issuance_id) { currency = 'MPT' } return (
    VaultLoans: {vaultId} | {vaultPseudoAccount} | {currency}
    ) }, })) jest.mock('../VaultTransactions', () => ({ VaultTransactions: ({ accountId }: { accountId: string }) => (
    VaultTransactions: {accountId}
    ), })) jest.mock('../VaultDepositors', () => ({ VaultDepositors: ({ shareMptId }: { shareMptId: string }) => (
    VaultDepositors: {shareMptId}
    ), })) const mockedGetVault = getVault as Mock const mockSocket = { getState: jest.fn().mockReturnValue('connected'), } as any const createTestQueryClient = () => new QueryClient({ defaultOptions: { queries: { retry: false, staleTime: 0, cacheTime: 0, }, }, }) /** * TestWrapper with route parameter support * * Uses MemoryRouter to simulate URL with vault ID parameter. * HelmetProvider is needed for the Helmet component. */ const createTestWrapper = (queryClient: QueryClient, vaultId: string = '') => { const initialEntries = vaultId ? [`/vault/${vaultId}`] : ['/vault/'] return ({ children }: { children: React.ReactNode }) => ( ) } /** * Mock vault data generator * * Note: The Vault ledger object uses `Account` for the pseudo-account ID * (not `PseudoAccount`). This matches the XRPL Vault ledger entry structure. */ const createMockVaultData = (overrides: any = {}) => ({ Owner: 'rOwnerAccount123', Account: 'rPseudoAccount456', // Vault's pseudo-account Asset: { currency: 'XRP' }, AssetsTotal: '1000000', AssetsAvailable: '500000', ShareMPTID: 'SHARE_MPT_ID_123', ShareTotal: '100000', Data: '48656c6c6f205661756c74', // "Hello Vault" in hex ...overrides, }) describe('Vault Component', () => { let queryClient: QueryClient beforeEach(() => { jest.clearAllMocks() queryClient = createTestQueryClient() }) afterEach(() => { queryClient.clear() }) /** * ========================================= * SECTION 1: Page Structure Tests * ========================================= */ describe('Page Structure', () => { it('renders vault-page container', async () => { mockedGetVault.mockResolvedValue(createMockVaultData()) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') const { container } = render( , ) await waitFor(() => { expect(container.querySelector('.vault-page')).toBeInTheDocument() }) }) it('applies section class for max-width constraints', async () => { mockedGetVault.mockResolvedValue(createMockVaultData()) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') const { container } = render( , ) await waitFor(() => { const vaultPage = container.querySelector('.vault-page') expect(vaultPage).toBeInTheDocument() expect(vaultPage).toHaveClass('section') }) }) }) /** * ========================================= * SECTION 2: No Vault ID State Tests * ========================================= */ describe('No Vault ID State', () => { it('does not fetch vault data when no ID provided', () => { const TestWrapper = createTestWrapper(queryClient, '') render( , ) expect(mockedGetVault).not.toHaveBeenCalled() }) }) /** * ========================================= * SECTION 3: Loading State Tests * ========================================= */ describe('Loading State', () => { it('displays loader while fetching vault data', async () => { let resolvePromise: (value: any) => void const pendingPromise = new Promise((resolve) => { resolvePromise = resolve }) mockedGetVault.mockReturnValue(pendingPromise) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') const { container } = render( , ) expect(container.querySelector('.loader')).toBeInTheDocument() // Clean up resolvePromise!(createMockVaultData()) }) it('hides loader after data loads', async () => { mockedGetVault.mockResolvedValue(createMockVaultData()) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') const { container } = render( , ) await waitFor(() => { expect(container.querySelector('.loader')).not.toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 4: Error Handling Tests * ========================================= */ describe('Error Handling', () => { it('displays NOT_FOUND error message', async () => { mockedGetVault.mockRejectedValue({ code: 404 }) const TestWrapper = createTestWrapper(queryClient, 'INVALID_VAULT') render( , ) await waitFor(() => { // NoMatch component is rendered with vault_not_found title expect(screen.getByTestId('no-match')).toBeInTheDocument() expect(screen.getByTestId('no-match-title')).toHaveTextContent( 'vault_not_found', ) }) }) it('displays BAD_REQUEST error message', async () => { mockedGetVault.mockRejectedValue({ code: 400 }) const TestWrapper = createTestWrapper(queryClient, 'MALFORMED_ID') render( , ) await waitFor(() => { expect(screen.getByTestId('no-match')).toBeInTheDocument() expect(screen.getByTestId('no-match-title')).toHaveTextContent( 'invalid_vault_id', ) }) }) it('displays invalid vault ID message for non-hex vault IDs', async () => { // Simulates error from rippled when vault ID is not a valid hex string (e.g., "1234") mockedGetVault.mockRejectedValue({ code: 400, message: 'Invalid vault ID format', }) const TestWrapper = createTestWrapper(queryClient, '1234') render( , ) await waitFor(() => { expect(screen.getByTestId('no-match')).toBeInTheDocument() expect(screen.getByTestId('no-match-title')).toHaveTextContent( 'invalid_vault_id', ) }) }) it('tracks exception when fetch fails', async () => { const errorResponse = { code: 500, message: 'Server error' } mockedGetVault.mockRejectedValue(errorResponse) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { expect(mockTrackException).toHaveBeenCalledWith( expect.stringContaining( 'Error fetching Vault data for vault ID TEST_VAULT_ID', ), ) }) }) it('displays user-friendly error message for generic errors', async () => { // Generic server error (not 404 or 400) mockedGetVault.mockRejectedValue({ code: 500, message: 'Internal error' }) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { expect(screen.getByTestId('no-match')).toBeInTheDocument() // Should show user-friendly message instead of generic "Something bad happened" expect(screen.getByTestId('no-match-title')).toHaveTextContent( 'get_vault_failed', ) }) }) }) /** * ========================================= * SECTION 5: Title Section Tests * ========================================= */ describe('Title Section', () => { it('displays decoded vault name from Data field', async () => { // {"n":"Hello Vault"} encoded as hex (JSON convention for vault name) const vaultData = createMockVaultData({ Data: '7b226e223a2248656c6c6f205661756c74227d', }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { expect(screen.getByText('Hello Vault')).toBeInTheDocument() }) }) it('displays "Yield Pool" fallback when no Data field', async () => { const vaultData = createMockVaultData({ Data: undefined }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { expect(screen.getByText('Single Asset Vault')).toBeInTheDocument() }) }) it('displays vault ID with copy functionality', async () => { const testVaultId = 'VAULT_ID_12345' mockedGetVault.mockResolvedValue(createMockVaultData()) const TestWrapper = createTestWrapper(queryClient, testVaultId) const { container } = render( , ) await waitFor(() => { expect(screen.getByText('Vault ID:')).toBeInTheDocument() expect(screen.getByText(testVaultId)).toBeInTheDocument() // Verify CopyableText component is rendered with copy icon const copyableWrapper = container.querySelector( '.copyable-text-with-icon', ) expect(copyableWrapper).toBeInTheDocument() // Verify copy button exists with accessible label const copyButton = screen.getByRole('button', { name: 'Click to copy', }) expect(copyButton).toBeInTheDocument() }) }) }) /** * ========================================= * SECTION 6: Child Component Rendering Tests * ========================================= * Tests that child components receive correct props * and are conditionally rendered based on data. */ describe('Child Component Rendering', () => { it('renders VaultHeader when vault data exists', async () => { mockedGetVault.mockResolvedValue(createMockVaultData()) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { expect(screen.getByTestId('vault-header')).toBeInTheDocument() }) }) it('renders VaultLoans with Account when available', async () => { const vaultData = createMockVaultData({ Account: 'rPseudoAccount123', Owner: 'rOwner456', }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { const loansComponent = screen.getByTestId('vault-loans') expect(loansComponent).toBeInTheDocument() // Should use Account (pseudo-account) expect(loansComponent).toHaveTextContent('rPseudoAccount123') }) }) it('does not render VaultLoans when no account ID available', async () => { const vaultData = createMockVaultData({ Account: undefined, Owner: undefined, }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { expect(screen.getByTestId('vault-header')).toBeInTheDocument() }) expect(screen.queryByTestId('vault-loans')).not.toBeInTheDocument() }) // TODO: Uncomment this when VaultDepositors made available // it('renders VaultDepositors when ShareMPTID exists', async () => { // const vaultData = createMockVaultData({ // ShareMPTID: 'SHARE_MPT_123', // }) // mockedGetVault.mockResolvedValue(vaultData) // const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') // render( // // // , // ) // await waitFor(() => { // const depositorsComponent = screen.getByTestId('vault-depositors') // expect(depositorsComponent).toBeInTheDocument() // expect(depositorsComponent).toHaveTextContent('SHARE_MPT_123') // }) // }) it('does not render VaultDepositors when ShareMPTID missing', async () => { const vaultData = createMockVaultData({ ShareMPTID: undefined, }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { expect(screen.getByTestId('vault-header')).toBeInTheDocument() }) expect(screen.queryByTestId('vault-depositors')).not.toBeInTheDocument() }) it('renders VaultTransactions when account ID exists', async () => { const vaultData = createMockVaultData({ Account: 'rPseudoAccount123', }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { const transactionsComponent = screen.getByTestId('vault-transactions') expect(transactionsComponent).toBeInTheDocument() expect(transactionsComponent).toHaveTextContent('rPseudoAccount123') }) }) it('renders all child components when vault data has required fields', async () => { // Default mock data includes: PseudoAccount, ShareMPTID, Asset - all required for full rendering mockedGetVault.mockResolvedValue(createMockVaultData()) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) // Wait for vault data to load and all components to render await waitFor(() => { // VaultHeader always renders when vault data exists expect(screen.getByTestId('vault-header')).toBeInTheDocument() }) // VaultLoans renders when PseudoAccount exists expect(screen.getByTestId('vault-loans')).toBeInTheDocument() // TODO: Uncomment this when VaultDepositors made available // // VaultDepositors renders when ShareMPTID exists // expect(screen.getByTestId('vault-depositors')).toBeInTheDocument() // VaultTransactions renders when PseudoAccount exists expect(screen.getByTestId('vault-transactions')).toBeInTheDocument() }) }) /** * ========================================= * SECTION 7: Asset Currency Display Tests * ========================================= */ describe('Asset Currency Display', () => { it('passes XRP as currency for XRP vaults', async () => { // Standard 3-char currency codes are stored as-is (not hex-encoded) const vaultData = createMockVaultData({ Asset: { currency: 'XRP' }, }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { const loansComponent = screen.getByTestId('vault-loans') expect(loansComponent).toHaveTextContent('XRP') }) }) it('passes currency code for IOU vaults', async () => { // Standard 3-char currency codes are stored as-is (not hex-encoded) const vaultData = createMockVaultData({ Asset: { currency: 'USD', issuer: 'rIssuer123' }, }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { const loansComponent = screen.getByTestId('vault-loans') expect(loansComponent).toHaveTextContent('USD') }) }) it('passes MPT identifier for MPT vaults', async () => { // VaultLoans now derives currency internally and shows "MPT" for all MPT assets const vaultData = createMockVaultData({ Asset: { mpt_issuance_id: 'MPT_ISSUANCE_ID_LONG_STRING_123456' }, }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { const loansComponent = screen.getByTestId('vault-loans') expect(loansComponent).toHaveTextContent('MPT') }) }) it('decodes hex-encoded IOU currency code', async () => { // "RLUSD" encoded as hex (52=R, 4C=L, 55=U, 53=S, 44=D) const vaultData = createMockVaultData({ Asset: { currency: '524C555344000000000000000000000000000000', issuer: 'rIssuer123', }, }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { const loansComponent = screen.getByTestId('vault-loans') expect(loansComponent).toHaveTextContent('RLUSD') }) }) it('displays MPT identifier for MPT assets', async () => { // VaultLoans now derives currency internally and shows "MPT" for MPT assets // (MPT ticker lookup is only done for CurrencyToggle display, not for amount formatting) const mptIssuanceId = '00000C4F23D0CC3B3D973CDC631050101ABCD1234' const vaultData = createMockVaultData({ Asset: { mpt_issuance_id: mptIssuanceId }, }) mockedGetVault.mockResolvedValue(vaultData) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { const loansComponent = screen.getByTestId('vault-loans') expect(loansComponent).toHaveTextContent('MPT') }) }) }) /** * ========================================= * SECTION 8: Analytics Tracking Tests * ========================================= */ describe('Analytics Tracking', () => { it('tracks screen loaded on mount', async () => { mockedGetVault.mockResolvedValue(createMockVaultData()) const TestWrapper = createTestWrapper(queryClient, 'TEST_VAULT_ID') render( , ) await waitFor(() => { expect(mockTrackScreenLoaded).toHaveBeenCalledWith({ vault_id: 'TEST_VAULT_ID', }) }) }) it('tracks screen loaded with empty vault ID', () => { const TestWrapper = createTestWrapper(queryClient, '') render( , ) expect(mockTrackScreenLoaded).toHaveBeenCalledWith({ vault_id: '', }) }) }) }) ================================================ FILE: src/containers/Vault/test/utils.test.ts ================================================ import { parseVaultWebsite } from '../utils' describe('parseVaultWebsite', () => { it('returns website when Data contains valid JSON with "w" key', () => { // {"n":"Test Vault","w":"example.com"} encoded as hex const hexData = Buffer.from( JSON.stringify({ n: 'Test Vault', w: 'example.com' }), ).toString('hex') expect(parseVaultWebsite(hexData)).toBe('example.com') }) it('returns undefined when Data contains valid JSON but missing "w" key', () => { // {"n":"Test Vault"} encoded as hex (no website field) const hexData = Buffer.from(JSON.stringify({ n: 'Test Vault' })).toString( 'hex', ) expect(parseVaultWebsite(hexData)).toBeUndefined() }) it('returns undefined when Data is not valid JSON', () => { // "Hello World" encoded as hex (plain text, not JSON) const hexData = Buffer.from('Hello World').toString('hex') expect(parseVaultWebsite(hexData)).toBeUndefined() }) }) ================================================ FILE: src/containers/Vault/utils.tsx ================================================ import { ReactNode } from 'react' import { convertHexToString } from '../../rippled/lib/utils' import Currency from '../shared/components/Currency' /** * Vault Data JSON Convention * Field names are short to fit within 256-byte limit: * - n: Human-readable name of the Vault * - w: Website associated with the Vault operator */ interface VaultDataJson { n?: string // name w?: string // website } /** * Parse the vault data JSON from the Data field. * Returns the parsed object if valid JSON, otherwise undefined. */ const parseVaultDataJson = ( data: string | undefined, ): VaultDataJson | undefined => { const decoded = convertHexToString(data) if (!decoded) return undefined try { const parsed: VaultDataJson = JSON.parse(decoded) if (parsed && typeof parsed === 'object') { return parsed } } catch { // Not valid JSON, return undefined } return undefined } /** * Parse the vault name from the Data field if it follows the JSON convention. * Returns the name (n field) if the data is valid JSON with a name field, * otherwise returns undefined. */ export const parseVaultName = ( data: string | undefined, ): string | undefined => { if (!data) return undefined const parsed = parseVaultDataJson(data) if (parsed && typeof parsed.n === 'string' && parsed.n.trim()) { return parsed.n.trim() } return undefined } /** * Parse the vault website from the Data field if it follows the JSON convention. * Returns the website (w field) if the data is valid JSON with a website field, * otherwise returns undefined. */ export const parseVaultWebsite = ( data: string | undefined, ): string | undefined => { const parsed = parseVaultDataJson(data) if (parsed && typeof parsed.w === 'string' && parsed.w.trim()) { return parsed.w.trim() } return undefined } // Render Currency component for display in toggle button // When mptTicker is provided, display it directly instead of the MPT ID export const renderAssetCurrency = ( asset: { currency: string issuer?: string mpt_issuance_id?: string }, mptTicker?: string, ): ReactNode => { // const asset = vaultData?.Asset if (!asset) return null if (asset.mpt_issuance_id) { if (mptTicker) { return {mptTicker} } return ( ) } if (asset.currency) { return ( ) } return null } ================================================ FILE: src/containers/Vaults/VaultsTable.tsx ================================================ import { useTranslation } from 'react-i18next' import { RouteLink } from '../shared/routing' import { TOKEN_ROUTE } from '../App/routes' import type { VaultData } from './types' import { parseCurrencyAmount, parsePercent, } from '../shared/NumberFormattingUtils' import { shortenAccount } from '../shared/utils' import ExternalLink from '../shared/images/external_link.svg' import SortTableColumn from '../shared/components/SortColumn' type SortOrder = 'asc' | 'desc' interface VaultsTableProps { vaults: (VaultData & { index: number })[] sortField: string sortOrder: SortOrder setSortField: (field: string) => void setSortOrder: (order: SortOrder) => void setPage: (page: number) => void xrpToUSDRate: number assetPrices: Record } const DEFAULT_EMPTY_VALUE = '--' const shortenVaultIdShort = (id: string): string => id.length > 10 ? `${id.slice(0, 5)}...${id.slice(-3)}` : id const formatAssetDisplay = (vault: VaultData): string => { if (vault.asset_currency === 'XRP') return 'XRP' const issuerDisplay = vault.asset_issuer_name ? vault.asset_issuer_name : shortenAccount(vault.asset_issuer) return `${vault.asset_currency} (${issuerDisplay})` } const toUsd = ( vault: VaultData, amount: number, xrpToUSDRate: number, assetPrices: Record, ): number => { if (vault.asset_currency === 'XRP') { return amount * xrpToUSDRate } // Look up the asset's XRP price from xrplmeta, then convert to USD const key = `${vault.asset_currency}.${vault.asset_issuer}` const xrpPrice = assetPrices[key] if (xrpPrice) { return amount * xrpPrice * xrpToUSDRate } return amount } export const VaultsTable = ({ vaults, sortField, setSortField, sortOrder, setSortOrder, setPage, xrpToUSDRate, assetPrices, }: VaultsTableProps) => { const { t } = useTranslation() const renderVaultRow = (vault: VaultData & { index: number }) => ( {vault.index} {shortenAccount(vault.vault_id)} {shortenVaultIdShort(vault.vault_id)} {vault.name || DEFAULT_EMPTY_VALUE} {vault.asset_currency !== 'XRP' && vault.asset_issuer ? ( {formatAssetDisplay(vault)} ) : ( {formatAssetDisplay(vault)} )} {vault.tvl_usd ? parseCurrencyAmount( toUsd(vault, vault.tvl_usd, xrpToUSDRate, assetPrices), ) : DEFAULT_EMPTY_VALUE} {vault.outstanding_loans_usd != null ? parseCurrencyAmount( toUsd( vault, vault.outstanding_loans_usd, xrpToUSDRate, assetPrices, ), ) : DEFAULT_EMPTY_VALUE} {vault.utilization_ratio != null ? parsePercent(vault.utilization_ratio * 100) : DEFAULT_EMPTY_VALUE} {vault.avg_interest_rate != null ? parsePercent(vault.avg_interest_rate) : DEFAULT_EMPTY_VALUE} {vault.website ? ( ) : ( DEFAULT_EMPTY_VALUE )} ) return (
    {vaults.length > 0 ? ( vaults.map(renderVaultRow) ) : ( )}
    # {t('vaults_table_vault_id')} {t('name')} {t('vaults_table_asset')} {t('vaults_table_website')}
    {t('vaults_no_results')}
    ) } ================================================ FILE: src/containers/Vaults/api.ts ================================================ import axios from 'axios' import type { VaultData, VaultsMetrics, VaultsListResponse, AssetPricesResponse, } from './types' // Maps frontend sort field names to API sort_by param values const SORT_FIELD_MAP: Record = { 'tvl-usd': 'assets_total', 'outstanding-loans-usd': 'outstanding_loans', 'avg-interest-rate': 'average_interest_rate', 'utilization-ratio': 'utilization_ratio', } // Maps frontend filter keys to API asset_type param values const ASSET_TYPE_MAP: Record = { '': 'all', xrp: 'xrp', stablecoin: 'stablecoins', } // Maps raw API vault object to frontend VaultData shape const mapVault = (raw: any): VaultData => ({ vault_id: raw.vault_id, name: raw.name, asset_currency: raw.asset_currency, asset_issuer: raw.asset_issuer, asset_issuer_name: raw.asset_issuer_name, tvl_usd: raw.assets_total, outstanding_loans_usd: raw.outstanding_loans, utilization_ratio: raw.utilization_ratio, avg_interest_rate: raw.average_interest_rate, website: raw.website, asset_category: raw.asset_category, }) export const fetchVaultsList = (params: { page: number size: number sortField: string sortOrder: 'asc' | 'desc' assetType: string searchQuery: string }): Promise => { const queryParams = new URLSearchParams({ page: params.page.toString(), size: params.size.toString(), sort_order: params.sortOrder, }) const apiSortBy = SORT_FIELD_MAP[params.sortField] if (apiSortBy) { queryParams.set('sort_by', apiSortBy) } const apiAssetType = ASSET_TYPE_MAP[params.assetType] ?? 'all' if (apiAssetType !== 'all') { queryParams.set('asset_type', apiAssetType) } if (params.searchQuery.trim()) { queryParams.set('name_like', params.searchQuery.trim()) } return axios.get(`/api/v1/vaults?${queryParams.toString()}`).then((resp) => { const { data } = resp return { ...data, results: (data.results || []).map(mapVault), } }) } export const fetchVaultsAggregateStats = (): Promise => axios.get('/api/v1/vaults/aggregate-statistics').then((resp) => resp.data) export const fetchVaultAssetPrices = (): Promise => axios.get('/api/v1/vaults/asset-prices').then((resp) => resp.data) ================================================ FILE: src/containers/Vaults/index.tsx ================================================ import { useEffect, useRef, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { Helmet } from 'react-helmet-async' import { useQuery } from 'react-query' import Log from '../shared/log' import { VaultsTable } from './VaultsTable' import { parseCurrencyAmount } from '../shared/NumberFormattingUtils' import './vaults.scss' import { Pagination } from '../shared/components/Pagination' import { Loader } from '../shared/components/Loader' import { Tooltip, useTooltip } from '../shared/components/Tooltip' import HoverIcon from '../shared/images/hover.svg' import { useAnalytics } from '../shared/analytics' import { useXRPToUSDRate } from '../shared/hooks/useXRPToUSDRate' import type { VaultData } from './types' import { fetchVaultsList, fetchVaultsAggregateStats, fetchVaultAssetPrices, } from './api' export type { VaultData } type FilterCategory = '' | 'xrp' | 'stablecoin' const TOOLTIP_Y_OFFSET = 80 const PAGE_SIZE = 20 const SEARCH_DEBOUNCE_MS = 400 const PRICE_REFETCH_INTERVAL = 5 * 60 * 1000 // 5 minutes export const Vaults = () => { const [sortField, setSortField] = useState('tvl-usd') const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc') const [filterField, setFilterField] = useState('') const [searchQuery, setSearchQuery] = useState('') const [debouncedSearch, setDebouncedSearch] = useState('') const [page, setPage] = useState(1) const { tooltip, showTooltip, hideTooltip } = useTooltip() const { t } = useTranslation() const { trackScreenLoaded, trackException } = useAnalytics() const xrpToUSDRate = useXRPToUSDRate() const searchTimerRef = useRef>() useEffect(() => { trackScreenLoaded() }, [trackScreenLoaded]) // Fetch aggregate stats once on mount const { data: metrics } = useQuery( ['vaultsAggregateStats'], fetchVaultsAggregateStats, { onError: (error) => { Log.error(error) trackException(`vaults stats fetch --- ${JSON.stringify(error)}`) }, }, ) // Fetch and periodically refresh asset prices from xrplmeta const { data: assetPricesData } = useQuery( ['vaultAssetPrices'], fetchVaultAssetPrices, { refetchInterval: PRICE_REFETCH_INTERVAL, onError: (error) => Log.error(error), }, ) const assetPrices = assetPricesData?.prices ?? {} // Fetch vaults list whenever params change const { data: vaultsResponse, isLoading: tableLoading, refetch: refetchVaults, } = useQuery( ['vaultsList', page, sortField, sortOrder, filterField, debouncedSearch], () => fetchVaultsList({ page, size: PAGE_SIZE, sortField, sortOrder, assetType: filterField, searchQuery: debouncedSearch, }), { keepPreviousData: true, onError: (error) => { Log.error(error) trackException(`vaults list fetch --- ${JSON.stringify(error)}`) }, }, ) // Debounce search input useEffect(() => { if (searchTimerRef.current) { clearTimeout(searchTimerRef.current) } searchTimerRef.current = setTimeout(() => { setDebouncedSearch(searchQuery) setPage(1) }, SEARCH_DEBOUNCE_MS) return () => { if (searchTimerRef.current) { clearTimeout(searchTimerRef.current) } } }, [searchQuery]) const renderTextTooltip = (key: string) => ( { const rect = e.currentTarget.getBoundingClientRect() showTooltip('text', e, t(`${key}_description`, { defaultValue: '' }), { x: rect.left + rect.width / 2, y: rect.top - TOOLTIP_Y_OFFSET, }) }} onMouseLeave={() => hideTooltip()} /> ) const vaults = (vaultsResponse?.results ?? []).map((vault, idx) => ({ ...vault, index: (page - 1) * PAGE_SIZE + idx + 1, })) const totalItems = vaultsResponse?.total ?? 0 const filterCategories: { key: FilterCategory label: string }[] = [ { key: '', label: t('vaults_filter_all_assets') }, { key: 'xrp', label: 'XRP' }, { key: 'stablecoin', label: t('vaults_filter_stablecoins'), }, ] const handleFilterClick = (cat: FilterCategory) => { setFilterField(cat === filterField ? '' : cat) setPage(1) } const handleSortFieldChange = (field: string) => { setSortField(field) setPage(1) } const handleSortOrderChange = (order: 'asc' | 'desc') => { setSortOrder(order) setPage(1) } if (!metrics && !vaultsResponse) { return (
    {t('vaults')}
    ) } return (
    {t('vaults')}
    {metrics && (
    {t('vaults_tvl')} {renderTextTooltip('vaults_tvl')}
    {parseCurrencyAmount(metrics.tvl_total * xrpToUSDRate)}
    {t('vaults_outstanding_loans')} {renderTextTooltip('vaults_outstanding_loans')}
    {parseCurrencyAmount(metrics.debt_total * xrpToUSDRate)}
    {t('vaults_loans_originated')} {renderTextTooltip('vaults_loans_originated')}
    {parseCurrencyAmount(metrics.loans_originated * xrpToUSDRate)}
    {t('vaults_avg_interest_rate')} {renderTextTooltip('vaults_avg_interest_rate')}
    {metrics.avg_interest_rate.toFixed(2)}%
    {t('vaults_num_vaults')} {renderTextTooltip('vaults_num_vaults')}
    {metrics.active_vaults.toLocaleString()}
    {t('vaults_utilization_ratio')} {renderTextTooltip('vaults_utilization_ratio')}
    {(metrics.utilization_ratio * 100).toFixed(1)}%
    )}
    {filterCategories.map((cat) => ( ))}
    setSearchQuery(e.target.value)} /> {searchQuery && ( )}
    {tableLoading && (
    )}
    {/* eslint-disable-next-line jsx-a11y/anchor-has-content,jsx-a11y/control-has-associated-label */} XRPL Meta
    ) } ================================================ FILE: src/containers/Vaults/test/api/vaults.test.ts ================================================ import axios from 'axios' import { fetchVaultsList, fetchVaultsAggregateStats, fetchVaultAssetPrices, } from '../../api' jest.mock('axios') describe('Vaults API', () => { const mockAxios = axios as jest.Mocked beforeEach(() => { jest.clearAllMocks() }) describe('fetchVaultsList', () => { const mockApiResponse = { total: 2, page: 1, size: 20, sort_by: 'assets_total', sort_order: 'desc', asset_type: 'all', results: [ { vault_id: 'vault123', name: 'Test Vault', asset_currency: 'XRP', asset_issuer: '', asset_issuer_name: '', assets_total: 5000000, outstanding_loans: 2500000, utilization_ratio: 0.5, average_interest_rate: 5.25, website: 'https://example.com', asset_category: 'xrp', }, ], } it('should fetch and map vault data correctly', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockApiResponse }) const result = await fetchVaultsList({ page: 1, size: 20, sortField: 'tvl-usd', sortOrder: 'desc', assetType: '', searchQuery: '', }) expect(result.total).toBe(2) expect(result.results).toHaveLength(1) // Verify field mapping from API names to frontend names expect(result.results[0].vault_id).toBe('vault123') expect(result.results[0].name).toBe('Test Vault') expect(result.results[0].tvl_usd).toBe(5000000) expect(result.results[0].outstanding_loans_usd).toBe(2500000) expect(result.results[0].avg_interest_rate).toBe(5.25) expect(result.results[0].utilization_ratio).toBe(0.5) }) it('should map sort field names to API parameters', async () => { mockAxios.get.mockResolvedValueOnce({ data: { ...mockApiResponse, results: [] }, }) await fetchVaultsList({ page: 1, size: 20, sortField: 'tvl-usd', sortOrder: 'desc', assetType: '', searchQuery: '', }) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('sort_by=assets_total'), ) }) it('should map outstanding-loans-usd sort field', async () => { mockAxios.get.mockResolvedValueOnce({ data: { ...mockApiResponse, results: [] }, }) await fetchVaultsList({ page: 1, size: 20, sortField: 'outstanding-loans-usd', sortOrder: 'asc', assetType: '', searchQuery: '', }) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('sort_by=outstanding_loans'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('sort_order=asc'), ) }) it('should include asset_type param for non-default filters', async () => { mockAxios.get.mockResolvedValueOnce({ data: { ...mockApiResponse, results: [] }, }) await fetchVaultsList({ page: 1, size: 20, sortField: 'tvl-usd', sortOrder: 'desc', assetType: 'stablecoin', searchQuery: '', }) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('asset_type=stablecoins'), ) }) it('should not include asset_type for "all" filter', async () => { mockAxios.get.mockResolvedValueOnce({ data: { ...mockApiResponse, results: [] }, }) await fetchVaultsList({ page: 1, size: 20, sortField: 'tvl-usd', sortOrder: 'desc', assetType: '', searchQuery: '', }) expect(mockAxios.get).toHaveBeenCalledWith( expect.not.stringContaining('asset_type='), ) }) it('should include name_like param for search queries', async () => { mockAxios.get.mockResolvedValueOnce({ data: { ...mockApiResponse, results: [] }, }) await fetchVaultsList({ page: 1, size: 20, sortField: 'tvl-usd', sortOrder: 'desc', assetType: '', searchQuery: 'lending', }) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('name_like=lending'), ) }) it('should trim whitespace from search queries', async () => { mockAxios.get.mockResolvedValueOnce({ data: { ...mockApiResponse, results: [] }, }) await fetchVaultsList({ page: 1, size: 20, sortField: 'tvl-usd', sortOrder: 'desc', assetType: '', searchQuery: ' vault ', }) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('name_like=vault'), ) }) it('should not include name_like for empty search', async () => { mockAxios.get.mockResolvedValueOnce({ data: { ...mockApiResponse, results: [] }, }) await fetchVaultsList({ page: 1, size: 20, sortField: 'tvl-usd', sortOrder: 'desc', assetType: '', searchQuery: ' ', }) expect(mockAxios.get).toHaveBeenCalledWith( expect.not.stringContaining('name_like'), ) }) it('should include page and size params', async () => { mockAxios.get.mockResolvedValueOnce({ data: { ...mockApiResponse, results: [] }, }) await fetchVaultsList({ page: 3, size: 10, sortField: 'tvl-usd', sortOrder: 'desc', assetType: '', searchQuery: '', }) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('page=3'), ) expect(mockAxios.get).toHaveBeenCalledWith( expect.stringContaining('size=10'), ) }) it('should handle empty results array', async () => { mockAxios.get.mockResolvedValueOnce({ data: { ...mockApiResponse, total: 0, results: [] }, }) const result = await fetchVaultsList({ page: 1, size: 20, sortField: 'tvl-usd', sortOrder: 'desc', assetType: '', searchQuery: '', }) expect(result.total).toBe(0) expect(result.results).toHaveLength(0) }) it('should propagate network errors', async () => { mockAxios.get.mockRejectedValueOnce(new Error('Network error')) await expect( fetchVaultsList({ page: 1, size: 20, sortField: 'tvl-usd', sortOrder: 'desc', assetType: '', searchQuery: '', }), ).rejects.toThrow('Network error') }) }) describe('fetchVaultsAggregateStats', () => { const mockStatsResponse = { tvl_total: 8000000, debt_total: 3700000, active_vaults: 42, avg_interest_rate: 4.5, utilization_ratio: 0.4625, loans_originated: 15000000, last_updated: '2026-03-17T00:00:00Z', } it('should fetch aggregate stats successfully', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockStatsResponse }) const result = await fetchVaultsAggregateStats() expect(result).toEqual(mockStatsResponse) expect(mockAxios.get).toHaveBeenCalledWith( '/api/v1/vaults/aggregate-statistics', ) }) it('should return all expected fields', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockStatsResponse }) const result = await fetchVaultsAggregateStats() expect(result).toHaveProperty('tvl_total') expect(result).toHaveProperty('debt_total') expect(result).toHaveProperty('active_vaults') expect(result).toHaveProperty('avg_interest_rate') expect(result).toHaveProperty('utilization_ratio') expect(result).toHaveProperty('loans_originated') }) it('should propagate network errors', async () => { mockAxios.get.mockRejectedValueOnce(new Error('Server error')) await expect(fetchVaultsAggregateStats()).rejects.toThrow('Server error') }) }) describe('fetchVaultAssetPrices', () => { const mockPricesResponse = { prices: { 'USD.rIssuer123': 0.35, 'EUR.rIssuer456': 0.38, }, lastUpdated: 1710000000000, } it('should fetch asset prices successfully', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockPricesResponse }) const result = await fetchVaultAssetPrices() expect(result).toEqual(mockPricesResponse) expect(mockAxios.get).toHaveBeenCalledWith('/api/v1/vaults/asset-prices') }) it('should return prices map and lastUpdated', async () => { mockAxios.get.mockResolvedValueOnce({ data: mockPricesResponse }) const result = await fetchVaultAssetPrices() expect(result).toHaveProperty('prices') expect(result).toHaveProperty('lastUpdated') expect(result.prices['USD.rIssuer123']).toBe(0.35) }) it('should propagate network errors', async () => { mockAxios.get.mockRejectedValueOnce(new Error('Server error')) await expect(fetchVaultAssetPrices()).rejects.toThrow('Server error') }) }) }) ================================================ FILE: src/containers/Vaults/test/index.test.tsx ================================================ import { render, waitFor, fireEvent } from '@testing-library/react' import moxios from 'moxios' import { Route } from 'react-router' import i18n from '../../../i18n/testConfigEnglish' import { Vaults } from '..' import NetworkContext from '../../shared/NetworkContext' import { flushPromises, QuickHarness } from '../../test/utils' import vaultsData from './mock_data/vaults.json' import aggregateStats from './mock_data/aggregate_stats.json' import { VAULTS_ROUTE } from '../../App/routes' jest.mock('usehooks-ts', () => ({ useWindowSize: () => ({ width: 375, height: 600, }), })) jest.mock('../../shared/hooks/useXRPToUSDRate', () => ({ useXRPToUSDRate: () => 2.0, })) describe('Vaults Page container', () => { const renderVaults = () => render( } /> , ) const oldEnvs = process.env const mockAssetPrices = { prices: { '524C555344000000000000000000000000000000.rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De': 0.35, }, lastUpdated: Date.now(), } const stubVaultsApis = () => { moxios.stubRequest('/api/v1/vaults/aggregate-statistics', { status: 200, response: aggregateStats, }) moxios.stubRequest('/api/v1/vaults/asset-prices', { status: 200, response: mockAssetPrices, }) moxios.stubRequest(/\/api\/v1\/vaults\?/, { status: 200, response: vaultsData, }) } beforeEach(() => { moxios.install() process.env = { ...oldEnvs, VITE_ENVIRONMENT: 'mainnet' } }) afterEach(() => { moxios.uninstall() process.env = oldEnvs }) it('renders without crashing', () => { renderVaults() }) it('renders all parts', async () => { stubVaultsApis() const { container } = renderVaults() await flushPromises() await waitFor(() => { expect(container.querySelectorAll('.vaults-page').length).toBe(1) expect(container.querySelectorAll('.metric').length).toBe(6) }) // Metrics (xrpToUSDRate = 2.0) const metrics = container.querySelectorAll('.metric') // TVL: 8,000,000 * 2 = $16.0M expect(metrics[0].querySelector('.title')?.textContent).toContain( 'Total Value Locked (TVL)', ) expect(metrics[0].querySelector('.val')?.textContent).toContain('$16.0M') // Outstanding Loans: 3,700,000 * 2 = $7.4M expect(metrics[1].querySelector('.title')?.textContent).toContain( 'Outstanding Loans', ) expect(metrics[1].querySelector('.val')?.textContent).toContain('$7.4M') // Loans Originated: 15,000,000 * 2 = $30.0M expect(metrics[2].querySelector('.title')?.textContent).toContain( 'Loans Originated', ) expect(metrics[2].querySelector('.val')?.textContent).toContain('$30.0M') // Avg Interest Rate: 4.50% expect(metrics[3].querySelector('.title')?.textContent).toContain( 'Avg. Interest Rate', ) expect(metrics[3].querySelector('.val')?.textContent).toContain('4.50%') // # of Vaults: 42 expect(metrics[4].querySelector('.title')?.textContent).toContain( '# of Vaults', ) expect(metrics[4].querySelector('.val')?.textContent).toContain('42') // Utilization Ratio: 0.4625 * 100 = 46.3% expect(metrics[5].querySelector('.title')?.textContent).toContain( 'Utilization Ratio', ) expect(metrics[5].querySelector('.val')?.textContent).toContain('46.3%') // Filters const filters = container.querySelectorAll('.filter-field') expect(filters.length).toBe(3) expect(filters[0].querySelector('.filter-label')?.textContent).toContain( 'All Assets', ) expect(filters[1].querySelector('.filter-label')?.textContent).toContain( 'XRP', ) expect(filters[2].querySelector('.filter-label')?.textContent).toContain( 'Stablecoins', ) // Vaults Table expect(container.querySelectorAll('.vaults-table').length).toBe(1) // Table Headers expect(container.querySelector('th.rank')?.textContent).toContain('#') expect(container.querySelector('th.vault-id')?.textContent).toContain( 'Vault ID', ) expect(container.querySelector('th.name-col')?.textContent).toContain( 'name', ) expect(container.querySelector('th.asset')?.textContent).toContain('Asset') expect(container.querySelector('th.tvl-usd')?.textContent).toContain( 'TVL (USD)', ) expect( container.querySelector('th.outstanding-loans-usd')?.textContent, ).toContain('Outstanding Loans') expect( container.querySelector('th.utilization-ratio')?.textContent, ).toContain('Utilization Ratio') expect( container.querySelector('th.avg-interest-rate')?.textContent, ).toContain('Avg. Interest Rate') expect(container.querySelector('th.website')?.textContent).toContain( 'Website', ) // Table Rows (excluding header) const rows = Array.from(container.querySelectorAll('tr')).filter( (row) => !row.querySelector('th'), ) expect(rows).toHaveLength(2) // Row 1: XRP vault (asset_currency = XRP, so TVL = 5,000,000 * 2 = $10.0M) const firstRow = rows[0] expect(firstRow.querySelector('td.rank')?.textContent).toContain('1') expect(firstRow.querySelector('td.name')?.textContent).toContain( 'XRP Lending Vault', ) expect(firstRow.querySelector('td.asset')?.textContent).toContain('XRP') expect(firstRow.querySelector('td.tvl')?.textContent).toContain('$10.0M') expect( firstRow.querySelector('td.outstanding-loans')?.textContent, ).toContain('$5.0M') expect(firstRow.querySelector('td.utilization')?.textContent).toContain( '50.00%', ) expect(firstRow.querySelector('td.interest-rate')?.textContent).toContain( '5.25%', ) // Row 2: RLUSD vault (price=0.35 XRP, xrpToUSDRate=2.0) // TVL: 3,000,000 * 0.35 * 2 = $2.1M // Outstanding loans: 1,200,000 * 0.35 * 2 = $840.0K const secondRow = rows[1] expect(secondRow.querySelector('td.rank')?.textContent).toContain('2') expect(secondRow.querySelector('td.name')?.textContent).toContain( 'RLUSD Stable Vault', ) expect(secondRow.querySelector('td.asset')?.textContent).toContain('Ripple') expect(secondRow.querySelector('td.tvl')?.textContent).toContain('$2.1M') expect( secondRow.querySelector('td.outstanding-loans')?.textContent, ).toContain('$840.0K') expect(secondRow.querySelector('td.utilization')?.textContent).toContain( '40.00%', ) expect(secondRow.querySelector('td.interest-rate')?.textContent).toContain( '3.75%', ) }) it('renders search bar', async () => { stubVaultsApis() const { container } = renderVaults() await flushPromises() await waitFor(() => { expect(container.querySelector('.search-bar')).toBeTruthy() }) const input = container.querySelector( '.search-bar input', ) as HTMLInputElement expect(input).toBeTruthy() expect(input.placeholder).toContain( 'Search Accounts, Vault Names, Assets, Websites', ) }) it('renders empty state when no vaults returned', async () => { moxios.stubRequest('/api/v1/vaults/aggregate-statistics', { status: 200, response: aggregateStats, }) moxios.stubRequest('/api/v1/vaults/asset-prices', { status: 200, response: mockAssetPrices, }) moxios.stubRequest(/\/api\/v1\/vaults\?/, { status: 200, response: { ...vaultsData, total: 0, results: [] }, }) const { container } = renderVaults() await flushPromises() await waitFor(() => { expect(container.querySelector('.empty-message')?.textContent).toContain( 'No vaults found.', ) }) }) it('toggles filter selection', async () => { stubVaultsApis() const { container } = renderVaults() await flushPromises() await waitFor(() => { expect(container.querySelectorAll('.filter-field').length).toBe(3) }) const xrpFilter = container.querySelectorAll('.filter-field')[1] fireEvent.click(xrpFilter) expect(xrpFilter.classList.contains('selected')).toBe(true) // Clicking the same filter again deselects it fireEvent.click(xrpFilter) expect(xrpFilter.classList.contains('selected')).toBe(false) }) it('renders refresh button', async () => { stubVaultsApis() const { container } = renderVaults() await flushPromises() await waitFor(() => { expect(container.querySelector('.refresh-button')).toBeTruthy() }) }) it('renders pagination', async () => { stubVaultsApis() const { container } = renderVaults() await flushPromises() await waitFor(() => { expect(container.querySelector('.vaults-page')).toBeTruthy() }) // Pagination component should be rendered (with only 2 items and pageSize 20, // pagination may render but with limited controls) await waitFor(() => { expect(container.querySelector('.vaults-table-section')).toBeTruthy() }) }) it('renders disclaimer footnote', async () => { stubVaultsApis() const { container } = renderVaults() await flushPromises() await waitFor(() => { expect(container.querySelector('.footnote')).toBeTruthy() }) expect(container.querySelector('.footnote')?.textContent).toContain( 'Trust Level ≥1', ) const link = container.querySelector('.footnote a') as HTMLAnchorElement expect(link).toBeTruthy() expect(link.textContent).toBe('XRPL Meta') expect(link.href).toBe('https://xrplmeta.org/') }) }) ================================================ FILE: src/containers/Vaults/test/mock_data/aggregate_stats.json ================================================ { "tvl_total": 8000000, "debt_total": 3700000, "active_vaults": 42, "avg_interest_rate": 4.5, "utilization_ratio": 0.4625, "loans_originated": 15000000, "last_updated": "2026-03-17T00:00:00Z" } ================================================ FILE: src/containers/Vaults/test/mock_data/vaults.json ================================================ { "total": 2, "page": 1, "size": 20, "sort_by": "assets_total", "sort_order": "desc", "asset_type": "all", "results": [ { "vault_id": "ABC123DEF456GHI789JKL012MNO345PQR678STU901VWX234YZA567BCD890EFG", "name": "XRP Lending Vault", "asset_currency": "XRP", "asset_issuer": "", "asset_issuer_name": "", "assets_total": 5000000, "outstanding_loans": 2500000, "utilization_ratio": 0.5, "average_interest_rate": 5.25, "website": "https://example.com", "asset_category": "xrp" }, { "vault_id": "ZYX987WVU654TSR321QPO098NML765KJI432HGF109EDC876BAZ543YXW210VUT", "name": "RLUSD Stable Vault", "asset_currency": "524C555344000000000000000000000000000000", "asset_issuer": "rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De", "asset_issuer_name": "Ripple", "assets_total": 3000000, "outstanding_loans": 1200000, "utilization_ratio": 0.4, "average_interest_rate": 3.75, "website": "ripple.com", "asset_category": "stablecoin" } ] } ================================================ FILE: src/containers/Vaults/types.ts ================================================ export interface VaultData { vault_id: string name: string asset_currency: string asset_issuer: string asset_issuer_name: string tvl_usd: number outstanding_loans_usd: number utilization_ratio: number avg_interest_rate: number website: string asset_category: string } export interface VaultsMetrics { tvl_total: number debt_total: number active_vaults: number avg_interest_rate: number utilization_ratio: number loans_originated: number last_updated: string } export interface VaultsListResponse { total: number page: number size: number sort_by: string sort_order: string asset_type: string results: VaultData[] } export interface AssetPricesResponse { prices: Record // "currency.issuer" → XRP price lastUpdated: number | null } ================================================ FILE: src/containers/Vaults/vaults.scss ================================================ @use '../shared/css/variables' as *; @use '../shared/css/table'; .vaults-page { overflow: visible; width: 100%; max-width: 1500px; min-height: 150px; margin: auto; margin-top: 40px; .text-truncate { @extend %truncate; } .type { display: inline-block; margin-bottom: 80px; margin-left: 24px; color: $white; font-size: 32px; @include bold; } .metrics-wrapper { padding: 16px 16px 4px; border: 1px solid $black-60; margin-right: 24px; margin-bottom: 40px; margin-left: 24px; background-color: $black-80; font-size: 12px; .metric { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; background-color: $black-80; gap: 6px; .title { display: flex; align-items: center; color: $black-40; gap: 8px; line-height: 150%; text-transform: uppercase; @include semibold; .hover { width: 16px; height: 16px; flex-shrink: 0; } } .val { color: $white; font-size: 18px; @include bold; } } } .vaults-controls { display: flex; flex-direction: column; margin-bottom: 24px; margin-left: 24px; gap: 16px; } .filter { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; .filter-icon { width: 24px; height: 24px; flex-shrink: 0; background-image: url('../shared/images/group.svg'); } .filter-field { display: flex; flex: 0 0 auto; align-items: center; padding: 6px 12px; border: 1px solid $black-50; border-radius: $border-radius; background-color: $black; color: $white; cursor: pointer; font-size: 12px; gap: 8px; @include medium; &:hover { background-color: $black-70; } &.selected { background-color: $white; color: $black; &:hover { color: $black; } } } } .controls-right { display: flex; align-items: center; gap: 12px; } .refresh-button { display: flex; width: 40px; height: 40px; flex-shrink: 0; align-items: center; justify-content: center; padding: 0; border: 1px solid $black-50; border-radius: $border-radius; background-color: transparent; color: $white; cursor: pointer; font-size: 18px; line-height: 1; transition: all 0.2s ease; &:hover { background-color: rgba($black-80, 0.5); } &:active { background-color: $black-70; } } .search-bar { display: flex; align-items: center; padding: 8px 16px; border: 1px solid $black-50; border-radius: $border-radius; gap: 16px; .search-icon { width: 12px; height: 12px; flex-shrink: 0; background-image: url('../shared/images/search.svg'); background-repeat: no-repeat; background-size: contain; } &:hover, &:focus-within { background-color: rgba($black-80, 0.5); } &:focus-within { border-color: $blue-purple-40; } input { width: 100%; border: none; border-radius: 0; appearance: none; background: transparent; color: $white; font-size: 14px; letter-spacing: 0.14px; line-height: 24px; outline: none !important; &::placeholder { color: $black-50; } } .search-clear { display: flex; flex-shrink: 0; align-items: center; justify-content: center; padding: 0; border: none; background: transparent; color: $black-40; cursor: pointer; font-size: 12px; &:hover { color: $white; } } } .vaults-table-section { position: relative; .table-loader-overlay { position: absolute; z-index: 10; display: flex; align-items: center; justify-content: center; background-color: rgba($black, 0.5); inset: 0; } } .vaults-table { .table-wrap { overflow-x: auto; } table.basic { min-width: 900px; font-size: 14px; table-layout: fixed; th { font-size: 12px; @include semibold; &.rank { width: 3%; } &.vault-id { width: 13%; } &.name-col { width: 15%; } &.asset { width: 13%; } &.tvl-usd, &.outstanding-loans-usd, &.utilization-ratio, &.avg-interest-rate { width: 11%; text-align: right; .sort-header .arrow { width: 12px; height: 12px; opacity: 0.4; } &.active { color: $white; .sort-header .arrow { opacity: 1; } } } &.website { width: 6%; text-align: center; } } td { &.name { @extend %truncate; } &.asset { white-space: nowrap; } &.vault-id { .vault-id-long { display: none; } .vault-id-short { display: inline; } } &.website { text-align: center; } } } .green-link { color: $green-30; cursor: pointer; } .website-link { display: inline-flex; align-items: center; color: $green-30; &::after { content: none !important; } } .external-link-icon { width: 15px; height: 15px; path { fill: $green-30; } } } .footnote { @include footnote; } @include for-size(tablet-landscape-up) { padding-right: 24px; padding-left: 24px; .type { margin-left: 0; } .metrics-wrapper { display: flex; flex-wrap: wrap; padding: 0; border: none; margin-right: 0; margin-left: 0; background-color: transparent; gap: 32px; .metric { display: block !important; min-width: 200px; flex: 1 1 calc(33.333% - 32px); padding: 14px 20px; border-radius: $border-radius; margin-bottom: 0; background-color: $black-80; .title { margin-bottom: 6px; font-size: 14px; } .val { font-size: 18px; } } } .vaults-controls { flex-direction: row; align-items: center; justify-content: space-between; margin-left: 0; } .controls-right .search-bar { width: 400px; } table.basic { font-size: 14px; } .vaults-table table.basic td.vault-id { .vault-id-long { display: inline; } .vault-id-short { display: none; } } } @include for-size(desktop-up) { padding-right: 150px; padding-left: 150px; margin: auto; margin-top: 100px; .type { margin-left: auto; font-size: 42px; } .filter { .filter-field { padding: 8px 16px; font-size: 14px; } } } } ================================================ FILE: src/containers/shared/EmptyMessageTableRow.tsx ================================================ import { PropsWithChildren } from 'react' export type EmptyMessageTableRowProps = PropsWithChildren<{ colSpan: number // How many columns is the table }> export const EmptyMessageTableRow = ({ children, colSpan, }: EmptyMessageTableRowProps) => ( {children} ) ================================================ FILE: src/containers/shared/Interfaces.tsx ================================================ /** * Values returned by 'formatAccountInfo' from /src/rippled/lib/utils.js */ export interface AccountFormattedInfo { accountTransactionID?: string sequence?: number ticketCount?: number ownerCount?: number reserve?: number tick?: number rate?: string domain?: string emailHash?: string flags?: string[] balance?: string previousTxn?: string previousLedger?: number nftMinter?: string } /** * Values returned by 'formatNFTInfo' from /src/rippled/lib/utils.js */ export interface NFTFormattedInfo { NFTId?: string ledgerIndex?: number owner?: string isBurned?: boolean flags?: string[] transferFee?: number issuer?: string NFTTaxon?: number NFTSerial?: number uri?: string validated?: boolean status?: string warnings?: string[] } /** * Values returned by 'formatMPTIssuance' from /src/rippled/lib/utils.js */ export interface FormattedMPTIssuance { issuer: string sequence: number assetScale?: number maxAmt?: string outstandingAmt?: string flags?: string[] transferFee?: number rawMPTMetadata?: string parsedMPTMetadata?: Record isMPTMetadataCompliant: boolean } export interface ErrorMessage { title: string hints: string[] } export type ErrorMessages = { default: ErrorMessage [code: number]: ErrorMessage } ================================================ FILE: src/containers/shared/LoadMoreButton.tsx ================================================ import { MouseEventHandler } from 'react' import { useTranslation } from 'react-i18next' import { useAnalytics } from './analytics' export interface LoadMoreButtonProps { onClick: MouseEventHandler } export const LoadMoreButton = ({ onClick }: LoadMoreButtonProps) => { const { track } = useAnalytics() const { t } = useTranslation() const onClickWrapper = (event) => { track('load_more', {}) onClick(event) } return ( ) } ================================================ FILE: src/containers/shared/NetworkContext.tsx ================================================ import React, { useEffect, useState } from 'react' import axios from 'axios' import Log from './log' const ENV_NETWORK_MAP: Record = { mainnet: 'main', testnet: 'test', devnet: 'dev', xahau_mainnet: 'xahau-main', xahau_testnet: 'xahau-test', } function getNetworkName() { if ( process.env.VITE_ENVIRONMENT && process.env.VITE_ENVIRONMENT in ENV_NETWORK_MAP ) { return ENV_NETWORK_MAP[process.env.VITE_ENVIRONMENT] } return undefined } const NetworkContext = React.createContext(getNetworkName()) export type NetworkProviderProps = React.PropsWithChildren<{ children: any rippledUrl?: string }> export const NetworkProvider = ({ children, rippledUrl, }: NetworkProviderProps) => { const initialNetworkName = getNetworkName() const [networkName, setNetworkName] = useState(initialNetworkName) useEffect(() => { if (initialNetworkName == null && rippledUrl) { axios .get(`${process.env.VITE_DATA_URL}/get_network/${rippledUrl}`) .then((resp) => resp.data) .then((data) => setNetworkName( data.result && data.result === 'error' ? null : data.network, ), ) .catch((e) => Log.error(e)) } }, [initialNetworkName, rippledUrl]) return ( {children} ) } export { getNetworkName } export default NetworkContext ================================================ FILE: src/containers/shared/NumberFormattingUtils.ts ================================================ import { localizeNumber, formatLargeNumber, formatSmallNumber } from './utils' /** * Thresholds for determining formatting precision. * Adjust these values as needed to match product or UX requirements. */ const USD_REGULAR_BALANCE_LOWER_BOUND = 1 const USD_SMALL_BALANCE_LOWER_BOUND = 0.0001 const TOKEN_BALANCE_LARGE_LOWER_BOUND = 999 // Standard display for most XRP amounts (2 decimals) export const XRP_CURRENCY_OPTIONS = { style: 'currency', currency: 'XRP', minimumFractionDigits: 2, maximumFractionDigits: 2, } // Higher precision for small (<1 XRP) balances export const XRP_SMALL_BALANCE_CURRENCY_OPTIONS = { style: 'currency', currency: 'XRP', minimumFractionDigits: 2, maximumFractionDigits: 4, } export const USD_CURRENCY_OPTIONS = { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2, } // Higher precision for small (<1 USD) balances export const USD_SMALL_BALANCE_CURRENCY_OPTIONS = { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 4, } // Higher precision for small (<0.0001 USD) balances export const USD_EXTRA_SMALL_BALANCE_CURRENCY_OPTIONS = { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 10, } export const NUMBER_DEFAULT_OPTIONS = { style: 'decimal', minimumFractionDigits: 0, maximumFractionDigits: 2, useGrouping: true, } export const NUMBER_SMALL_OPTIONS = { style: 'decimal', minimumFractionDigits: 0, maximumFractionDigits: 4, useGrouping: true, } /** * Formats USD values (price or balance) with tiered precision based on value * @param value - The USD value to format * @param lang - Language for localization * @returns Formatted USD string or '--' for zero values */ export const formatUsdValue = (value: number, lang: string): string => { if (value === 0) { return '--' } let options if (value >= USD_REGULAR_BALANCE_LOWER_BOUND) { options = USD_CURRENCY_OPTIONS } else if (value >= USD_SMALL_BALANCE_LOWER_BOUND) { options = USD_SMALL_BALANCE_CURRENCY_OPTIONS } else { options = USD_EXTRA_SMALL_BALANCE_CURRENCY_OPTIONS } return localizeNumber(value, lang, options) || '--' } /** * Formats token balances with conditional precision based on value * @param balance - The token balance to format * @param lang - Language for localization * @returns Formatted balance string */ export const formatTokenBalance = (balance: number, lang: string): string => { const options = balance > TOKEN_BALANCE_LARGE_LOWER_BOUND ? NUMBER_DEFAULT_OPTIONS : NUMBER_SMALL_OPTIONS return localizeNumber(balance, lang, options) || '0' } /** * Three-step calculation for USD balance to ensure mathematical consistency * Formats USD price, formats token balance, then calculates USD balance using displayed values * @param tokenBalance - The token balance * @param priceInUSD - Price in USD * @param lang - Language for localization * @returns Object with formatted USD price, token balance, and calculated USD balance */ export const calculateFormattedUsdBalance = ( tokenBalance: number, priceInUSD: number, lang: string, ): { formattedUsdPrice: string formattedBalance: string formattedBalanceUsd: string } => { let formattedUsdPrice = '--' let formattedBalance = '--' let formattedBalanceUsd = '--' if (priceInUSD !== 0) { // Step 1: Format USD Price formattedUsdPrice = formatUsdValue(priceInUSD, lang) const displayedUsdPrice = parseFloat( (formattedUsdPrice || '0').replace(/[$,]/g, ''), // Removes dollar signs and commas from USD prices like "$4,321.30" → "4321.30" ) // Step 2: Format Balance formattedBalance = formatTokenBalance(tokenBalance, lang) const displayedBalance = parseFloat( (formattedBalance || '0').replace(/[,]/g, ''), // Removes commas from token balances like "1,234.5678" → "1234.5678" ) // Step 3: Calculate USD Balance using displayed values const calculatedBalanceUSD = displayedUsdPrice * displayedBalance formattedBalanceUsd = formatUsdValue(calculatedBalanceUSD, lang) } else { // If no price, still format the balance formattedBalance = formatTokenBalance(tokenBalance, lang) } return { formattedUsdPrice, formattedBalance, formattedBalanceUsd, } } /** * Formats numbers according to the general rules: * - Small numbers (< 1): 4 decimal places with trailing zeros * - Large numbers (>= 10,000): abbreviate with 1 decimal place and suffix (K, M, B) * - Medium numbers (1 to 9,999): full number with 2 decimal places and commas * @param value - The numeric value to format * @param decimals - Number of decimal places for abbreviated numbers (default: 1) * @param lang - Language for localization (default: 'en-US') * @returns Formatted string */ export const parseAmount = ( value: string | number, decimals: number = 1, lang: string = 'en-US', ): string => { const valueNumeric = Number(value) if (valueNumeric === 0) { return ( localizeNumber(0, lang, { minimumFractionDigits: 2, maximumFractionDigits: 2, }) || '0.00' ) } if (valueNumeric.toString().includes('e')) { return '< 0.0001' } if (valueNumeric > 0 && valueNumeric < 1) { return formatSmallNumber(valueNumeric, lang) || '0.0000' } const formatted = formatLargeNumber(valueNumeric, decimals, lang) return formatted.unit ? `${formatted.num || '0'}${formatted.unit}` : formatted.num || '0' } /** * Formats currency amounts with dollar sign prefix * @param value - The numeric value to format as currency * @param decimals - Number of decimal places for abbreviated numbers (default: 1) * @returns Formatted currency string with $ prefix */ export const parseCurrencyAmount = ( value: string | number, decimals: number = 1, lang: string = 'en-US', ): string => { const formatted = parseAmount(value, decimals, lang) if (formatted === '< 0.0001') { return '<\u00A0$0.0001' } return `$${formatted}` } /** * Formats integer values with 0 decimal places * @param value - The numeric value to format as integer * @param lang - Language for localization (default: 'en-US') * @returns Formatted integer string with commas for thousands separators */ export const parseIntegerAmount = ( value: string | number, lang: string = 'en-US', ): string => { const valueNumeric = Number(value) if (valueNumeric === 0) { return '0' } // For large numbers (>= 10,000), use abbreviations with 1 decimal place if (valueNumeric >= 10000) { const formatted = formatLargeNumber(valueNumeric, 1, lang) return formatted.unit ? `${formatted.num || '0'}${formatted.unit}` : formatted.num || '0' } // For smaller numbers, show full integer with commas return ( localizeNumber(Math.round(valueNumeric), lang, { useGrouping: true }) || Math.round(valueNumeric).toString() ) } /** * Formats price values with special rules: * - For prices >= $10,000: no decimal places * - For very large prices (>= $1,000,000): abbreviate with 2 decimal places * - Otherwise: use standard currency formatting * @param value - The price value to format * @param lang - Language for localization (default: 'en-US') * @returns Formatted price string with $ prefix */ export const parsePrice = ( value: string | number, lang: string = 'en-US', ): string => { const valueNumeric = Number(value) if (valueNumeric === 0) { return `$${localizeNumber(0, lang, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) || '0.00'}` } if (valueNumeric > 0 && valueNumeric < 0.0001) { return '<\u00A0$0.0001' } if (valueNumeric > 0 && valueNumeric < 1) { return `$${formatSmallNumber(valueNumeric, lang) || '0.0000'}` } if (valueNumeric >= 1000000) { const formatted = formatLargeNumber(valueNumeric, 2, lang) return `$${formatted.num || '0'}${formatted.unit}` } if (valueNumeric >= 10000) { return `$${localizeNumber(Math.round(valueNumeric), lang, { useGrouping: true }) || Math.round(valueNumeric).toString()}` } return `$${ localizeNumber(valueNumeric, lang, { minimumFractionDigits: 2, maximumFractionDigits: 2, }) || valueNumeric.toFixed(2) }` } /** * Formats percentage values with % suffix and configurable decimal places and cutoff * * @param percent - The percentage value to format * @param digits - Number of decimal places to display (default: 2) * @param cutoff - Minimum percentage value to display (default: 0.01 for 0.01%) * @returns Formatted percentage string with % suffix */ export const parsePercent = ( percent: number, digits = 2, cutoff = 0.01, ): string => { // Handle very small percentages below the cutoff if (Math.abs(percent) < cutoff) { return `${(0.0).toFixed(digits)}%` } // Use specified decimal places for percentages return `${percent.toFixed(digits)}%` } ================================================ FILE: src/containers/shared/QueryClient.tsx ================================================ import { QueryClient } from 'react-query' export const queryClient = new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, retry: false, }, }, }) ================================================ FILE: src/containers/shared/SocketContext.tsx ================================================ import React, { useContext, createContext, useEffect, useState } from 'react' import { XrplClient } from 'xrpl-client' import { useAnalytics } from './analytics' const LOCALHOST_URLS = ['localhost', '127.0.0.1', '0.0.0.0'] export interface ExplorerXrplClient extends XrplClient { p2pSocket: XrplClient rippledUrl: string | undefined } function isInsecureWs(rippledHost: string | undefined): boolean { return ( !!Number(process.env.VITE_INSECURE_WS) || LOCALHOST_URLS.some((url) => rippledHost?.includes(url)) || rippledHost === '' ) } function getSocket(rippledUrl?: string): ExplorerXrplClient { const hosts = rippledUrl ? [rippledUrl] : process.env.VITE_RIPPLED_HOST?.split(',') || [] const wsUrls: string[] = [] hosts.forEach((host) => { const prefix = isInsecureWs(host) ? 'ws' : 'wss' if (host?.includes(':')) { wsUrls.push(`${prefix}://${host}`) } else if (process.env.VITE_RIPPLED_WS_PORT) { wsUrls.push(`${prefix}://${host}:${process.env.VITE_RIPPLED_WS_PORT}`) if (process.env.VITE_ENVIRONMENT === 'custom') { wsUrls.push(`${prefix}://${host}`) } } else { wsUrls.push(`${prefix}://${host}`) } }) const socket = new XrplClient(wsUrls, { tryAllNodes: true, }) as ExplorerXrplClient const hasP2PSocket = process.env.VITE_P2P_RIPPLED_HOST != null && process.env.VITE_P2P_RIPPLED_HOST !== '' // @ts-ignore - will be removed eventually socket.p2pSocket = hasP2PSocket ? new XrplClient([ `${isInsecureWs(process.env.VITE_P2P_RIPPLED_HOST) ? 'ws' : 'wss'}://${ process.env.VITE_P2P_RIPPLED_HOST }:${process.env.VITE_RIPPLED_WS_PORT}`, ]) : undefined socket.rippledUrl = rippledUrl return socket } const SocketContext = createContext(undefined!) export type SocketProviderProps = React.PropsWithChildren<{ children: any rippledUrl?: string }> export const SocketProvider = ({ children, rippledUrl, }: SocketProviderProps) => { const socket = getSocket(rippledUrl) const { setGlobals } = useAnalytics() socket.once('online', () => { setGlobals({ entrypoint: socket.getState().server.uri, }) }) useEffect(() => () => { socket.close() if (socket.p2pSocket !== undefined) { socket.p2pSocket.close() } }) return ( {children} ) } /** * Hook that says whether the global socket is currently connected */ const useIsOnline = () => { const rippledSocket = useContext(SocketContext) const [isOnline, setIsOnline] = useState(false) useEffect(() => { const setIsReadyTrue = () => setIsOnline(true) const setIsReadyFalse = () => setIsOnline(false) rippledSocket.ready().then(() => { setIsReadyTrue() rippledSocket.on('online', setIsReadyTrue) rippledSocket.on('offline', setIsReadyFalse) }) return () => { rippledSocket.off('online', setIsReadyTrue) rippledSocket.off('offline', setIsReadyFalse) } }, [rippledSocket]) return { isOnline, } } export { getSocket, useIsOnline } export default SocketContext ================================================ FILE: src/containers/shared/amendmentUtils.ts ================================================ import axios from 'axios' import { localizeDate } from './utils' let cachedRippledVersions = new Map() const TIME_ZONE = 'UTC' const DATE_OPTIONS = { hour: 'numeric', minute: 'numeric', second: 'numeric', year: 'numeric', month: 'numeric', day: 'numeric', hour12: true, timeZone: TIME_ZONE, } export function getExpectedDate(date: string, language: string) { const txDate = new Date(date) return localizeDate( txDate.setDate(txDate.getDate() + 14), language, DATE_OPTIONS, ) } async function fetchMinRippledVersions() { const response = await axios.get( `${process.env.VITE_DATA_URL}/amendments/info`, ) const { amendments } = response.data const mapping = new Map() amendments.forEach((amendment) => { if (amendment.name && amendment.rippled_version) { mapping.set(amendment.name, amendment.rippled_version) } }) return mapping } export async function getRippledVersion(name: string) { if (cachedRippledVersions.get(name)) { return cachedRippledVersions.get(name) } cachedRippledVersions = await fetchMinRippledVersions() return cachedRippledVersions.get(name) } ================================================ FILE: src/containers/shared/analytics.ts ================================================ import { useCallback, useEffect } from 'react' import { useLocation } from 'react-router' /* eslint-disable camelcase -- GA uses underscores for the names */ export type AnalyticsEventNames = | 'exception' | 'screen_view' | 'search' | 'mobile_menu' | 'network_switch' | 'load_more' | 'not_found' | 'token_search_click' export interface AnalyticsFields { network?: string entrypoint?: string transaction_type?: string transaction_category?: string transaction_action?: string tec_code?: string account_id?: string issuer?: string currency_code?: string asset1?: string asset2?: string nftoken_id?: string search_term?: string search_category?: string validator?: string mpt_issuance_id?: string vault_id?: string description?: string page_title?: string page_location?: string page_path?: string } /* eslint-enable camelcase */ class Analytics { globals: any = {} setGlobals(newGlobals) { Object.assign(this.globals, newGlobals) } track(event: AnalyticsEventNames, fields: AnalyticsFields) { window.dataLayer.push({ ...this.globals, ...fields, event }) } trackException(description: string) { this.track('exception', { description }) } trackScreenLoaded(fields?: AnalyticsFields) { this.track('screen_view', { ...fields, page_title: document.title, }) } } export const analytics = new Analytics() export const useAnalytics = () => { const setGlobals = useCallback((newGlobals) => { analytics.setGlobals(newGlobals) }, []) const track = useCallback( (...args: Parameters) => analytics.track(...args), [], ) const trackException = useCallback((description: string) => { analytics.trackException(description) }, []) const trackScreenLoaded = useCallback((fields?: AnalyticsFields) => { analytics.trackScreenLoaded(fields) }, []) return { setGlobals, track, trackException, trackScreenLoaded, } } /** * Sets up a hook to populate page_path from `useLocation`. This allows for via various routers. * @constructor */ export const AnalyticsSetPath = () => { const { setGlobals } = useAnalytics() const { hash, pathname, search } = useLocation() useEffect(() => { // remove the custom mode's endpoint from the url path const url = (process.env.VITE_ENVIRONMENT === 'custom' ? `/${pathname.split('/').slice(2).join('/')}` : pathname) + search + hash setGlobals({ page_path: url, }) }, [hash, pathname, search, setGlobals]) return null } ================================================ FILE: src/containers/shared/components/Account.tsx ================================================ import { RouteLink } from '../routing' import { ACCOUNT_ROUTE } from '../../App/routes' export interface AccountProps { account: string displayText?: string link?: boolean tag?: number } export const Account = (props: AccountProps) => { const { account, displayText, link = true, tag } = props const parts = account.split(':') const computedTag = tag || parts[1] return ( <> {link ? ( {displayText || parts[0]} ) : ( {displayText || parts[0]} )} {computedTag && ( :{computedTag} )} ) } ================================================ FILE: src/containers/shared/components/Amount.tsx ================================================ import { useQuery } from 'react-query' import { useContext } from 'react' import { CURRENCY_OPTIONS, XRP_BASE } from '../transactionUtils' import { useLanguage } from '../hooks' import { localizeNumber, convertScaledPrice } from '../utils' import { parseAmount } from '../NumberFormattingUtils' import Currency from './Currency' import { ExplorerAmount } from '../types' import { FormattedMPTIssuance } from '../Interfaces' import { getMPTIssuance } from '../../../rippled/lib/rippled' import { formatMPTIssuance } from '../../../rippled/lib/utils' import SocketContext from '../SocketContext' import { useAnalytics } from '../analytics' export interface AmountProps { value: ExplorerAmount | string displayIssuer?: boolean modifier?: `+` | '-' | '~' // value to put in front of the currency symbol and number shortenIssuer?: boolean displayCurrency?: boolean /** Format amount with parseAmount instead of localizeNumber. */ useParseAmount?: boolean } export const Amount = ({ displayIssuer = true, modifier, value, shortenIssuer = false, displayCurrency = true, useParseAmount: useParsed = false, }: AmountProps) => { const language = useLanguage() const rippledSocket = useContext(SocketContext) const { trackException } = useAnalytics() // Handle the special case where amount is '< 0.0001' string const isSmallAmountString = typeof value === 'object' && value.amount === '< 0.0001' const issuer = typeof value === 'string' ? undefined : value.issuer const currency = typeof value === 'string' ? 'XRP' : value.currency const amount = typeof value === 'string' ? parseInt(value, 10) / XRP_BASE : value.amount const isMPT = typeof value === 'string' ? false : (value.isMPT ?? false) const options = { ...CURRENCY_OPTIONS, currency } const renderAmount = (localizedAmount: any) => ( {modifier && {modifier}} {localizedAmount} {displayCurrency && ( <> {' '} )} ) const mptID = isMPT ? (value as ExplorerAmount).currency : null // fetch MPTIssuance only if isMPT is true const { data: mptIssuanceData } = useQuery( ['getMPTIssuanceScale', mptID], async () => { const info = await getMPTIssuance(rippledSocket, mptID) return formatMPTIssuance(info.node) }, { onError: (e: any) => { trackException(`mptIssuance ${mptID} --- ${JSON.stringify(e)}`) }, enabled: isMPT, }, ) || {} // Handle the special case where amount is '< 0.0001' if (isSmallAmountString) { return renderAmount('< 0.0001') } // if amount is MPT type, we need to fetch the scale from the MPTokenIssuance // object so we can show the scaled amount if (isMPT && typeof value !== 'string') { if (mptIssuanceData) { const scale = mptIssuanceData.assetScale ?? 0 const scaledAmount = convertScaledPrice( parseInt(amount as string, 10).toString(16), scale, ) return renderAmount(localizeNumber(scaledAmount, language, {}, true)) } return null } if (useParsed) { return renderAmount(parseAmount(amount, 1, language)) } return renderAmount(localizeNumber(amount, language, options)) } ================================================ FILE: src/containers/shared/components/CopyableText/CopyableText.tsx ================================================ import { useState } from 'react' import { useTranslation } from 'react-i18next' import CopyIcon from '../../images/copy.svg' import './styles.scss' interface CopyableTextProps { /** The text to copy to clipboard when clicked */ text: string /** The text displayed in the button */ displayText: string /** Whether to show a separate copy icon button next to the text */ showCopyIcon?: boolean } /** * A button component that copies text to the clipboard when clicked. * * - Shows "Click to copy" tooltip on hover/focus * - Shows green "Copied" tooltip for 2 seconds after clicking * - When showCopyIcon is true, displays the text with a separate copy icon button */ export const CopyableText = ({ text, displayText, showCopyIcon = false, }: CopyableTextProps) => { const { t } = useTranslation() const [copied, setCopied] = useState(false) const [showHint, setShowHint] = useState(false) const handleCopy = (e: React.MouseEvent) => { navigator.clipboard.writeText(text) setCopied(true) setShowHint(false) // Remove focus after clicking, so the green highlight goes away when "Copied" is shown. e.currentTarget.blur() setTimeout(() => setCopied(false), 2000) } const handleMouseEnter = () => { if (!copied) { setShowHint(true) } } const handleMouseLeave = () => { setShowHint(false) } const handleFocus = () => { if (!copied) { setShowHint(true) } } const handleBlur = () => { setShowHint(false) } if (showCopyIcon) { return ( {displayText} ) } return ( ) } ================================================ FILE: src/containers/shared/components/CopyableText/index.ts ================================================ export { CopyableText } from './CopyableText' ================================================ FILE: src/containers/shared/components/CopyableText/styles.scss ================================================ @use '../../css/variables' as *; .copy-button { position: relative; padding: 0; border: none; background: none; color: $white; cursor: pointer; font-family: inherit; font-size: inherit; font-weight: inherit; .copy-tooltip { position: absolute; z-index: 1000; top: -32px; left: 50%; padding: 8px 12px; border-radius: 2px; background: rgb(0 0 0 / 90%); color: white; font-size: 13px; font-weight: normal; line-height: 16px; transform: translateX(-50%); white-space: nowrap; @include medium; &.copied { color: $white; } } } .copyable-text-with-icon { display: inline-flex; align-items: center; .copyable-text-value { color: $white; } .copy-icon-button { position: relative; display: none; align-items: center; justify-content: center; padding: 0; border: none; margin-left: 0.25em; background: transparent; cursor: pointer; vertical-align: -10%; .copy-icon { width: 1em; height: 11px; color: #f5f5f7; fill: none; } .copy-tooltip { position: absolute; z-index: 1000; top: -32px; left: 50%; padding: 8px 12px; border-radius: 2px; background: rgb(0 0 0 / 90%); color: white; font-size: 13px; font-weight: normal; line-height: 16px; transform: translateX(-50%); white-space: nowrap; @include medium; &.copied { color: $white; } } } &:hover .copy-icon-button, &:focus-within .copy-icon-button { display: inline-flex; } } ================================================ FILE: src/containers/shared/components/CopyableText/test/CopyableText.test.tsx ================================================ import { render, fireEvent, act } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../../i18n/testConfigEnglish' import { CopyableText } from '..' // Mock clipboard API const mockWriteText = jest.fn() Object.assign(navigator, { clipboard: { writeText: mockWriteText, }, }) describe('CopyableText', () => { beforeEach(() => { jest.clearAllMocks() jest.useFakeTimers() }) afterEach(() => { jest.useRealTimers() }) const renderCopyableText = (props: { text: string; displayText: string }) => render( , ) it('renders displayText correctly', () => { const { container } = renderCopyableText({ text: 'secret-value', displayText: 'Click me', }) expect(container.querySelector('.copy-button')).toHaveTextContent( 'Click me', ) }) it('copies text to clipboard when clicked', () => { const { container } = renderCopyableText({ text: 'secret-value-to-copy', displayText: 'Copy this', }) fireEvent.click(container.querySelector('.copy-button')!) expect(mockWriteText).toHaveBeenCalledWith('secret-value-to-copy') }) it('shows "Click to copy" tooltip on hover', () => { const { container } = renderCopyableText({ text: 'value', displayText: 'Copy', }) // Initially no tooltip expect(container.querySelector('.copy-tooltip')).not.toBeInTheDocument() // Hover to show hint fireEvent.mouseEnter(container.querySelector('.copy-button')!) // Tooltip should appear with "Click to copy" expect(container.querySelector('.copy-tooltip')).toBeInTheDocument() expect(container.querySelector('.copy-tooltip')).toHaveTextContent( 'Click to copy', ) // Mouse leave hides tooltip fireEvent.mouseLeave(container.querySelector('.copy-button')!) expect(container.querySelector('.copy-tooltip')).not.toBeInTheDocument() }) it('shows "Click to copy" tooltip on focus', () => { const { container } = renderCopyableText({ text: 'value', displayText: 'Copy', }) // Focus to show hint fireEvent.focus(container.querySelector('.copy-button')!) expect(container.querySelector('.copy-tooltip')).toBeInTheDocument() expect(container.querySelector('.copy-tooltip')).toHaveTextContent( 'Click to copy', ) // Blur hides tooltip fireEvent.blur(container.querySelector('.copy-button')!) expect(container.querySelector('.copy-tooltip')).not.toBeInTheDocument() }) it('shows "Copied" tooltip after clicking and hides it after 2 seconds', () => { const { container } = renderCopyableText({ text: 'value', displayText: 'Copy', }) // Click to copy fireEvent.click(container.querySelector('.copy-button')!) // Tooltip should show "Copied" with the copied class for green styling expect(container.querySelector('.copy-tooltip.copied')).toBeInTheDocument() expect(container.querySelector('.copy-tooltip.copied')).toHaveTextContent( 'Copied', ) // Fast-forward 2 seconds act(() => { jest.advanceTimersByTime(2000) }) // Tooltip should disappear expect(container.querySelector('.copy-tooltip')).not.toBeInTheDocument() }) }) ================================================ FILE: src/containers/shared/components/Currency.tsx ================================================ import { RouteLink } from '../routing' import { TOKEN_ROUTE, MPT_ROUTE } from '../../App/routes' import { shortenMPTID } from '../utils' // https://xrpl.org/currency-formats.html#nonstandard-currency-codes const NON_STANDARD_CODE_LENGTH = 40 const XRP = 'XRP' // https://xrpl.org/docs/concepts/tokens/decentralized-exchange/automated-market-makers#lp-token-currency-codes export const LP_TOKEN_IDENTIFIER = '03' export interface Props { issuer?: string currency: string link?: boolean shortenIssuer?: boolean displaySymbol?: boolean isMPT?: boolean hideIssuer?: boolean shortenMPTIssuanceID?: boolean } /* TODO: LP token identifier is the identifier for LP tokens. All issued LP tokens start with 03 so we can use this to make sure we're only converting actual hex values. */ const Currency = (props: Props) => { const { issuer, currency, link = true, shortenIssuer = false, displaySymbol = true, isMPT = false, hideIssuer = false, shortenMPTIssuanceID = false, } = props let content: string if (isMPT) { const display = `${shortenMPTIssuanceID ? shortenMPTID(currency) : currency}` if (link) return ( {display} ) content = display } else { let currencyCode = currency?.length === NON_STANDARD_CODE_LENGTH && currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER ? hexToString(currency) : currency if ( currency?.length === NON_STANDARD_CODE_LENGTH && currencyCode.length === 3 ) { currencyCode = `Fake${currencyCode}` } let display = `${currencyCode}` if (currencyCode === XRP && displaySymbol) { display = `\uE900 ${display}` } if (issuer && !hideIssuer) { display += '.' display += shortenIssuer ? issuer.substring(0, 4) : issuer } if (link && issuer) return ( {display} ) content = display } return ( {content} ) } export const hexToString = (hex: string) => { let string = '' for (let i = 0; i < hex.length; i += 2) { const part = hex.substring(i, i + 2) const code = parseInt(part, 16) if (!isNaN(code) && code !== 0) { string += String.fromCharCode(code) } } return string } export default Currency ================================================ FILE: src/containers/shared/components/CurrencySwitch/CurrencySwitch.tsx ================================================ import { FC } from 'react' import './styles.scss' /** A two-option switch for toggling between currency display modes. */ interface CurrencySwitchProps { /** Label shown on the left side of the switch */ leftLabel: string /** Label shown on the right side of the switch */ rightLabel: string /** The currently selected value (must match leftLabel or rightLabel) */ selected: string /** Called with the other value when the switch is toggled */ onChange: (value: string) => void } export const CurrencySwitch: FC = ({ leftLabel, rightLabel, selected, onChange, }) => { const isRight = selected === rightLabel return (
    {leftLabel} {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */} {rightLabel}
    ) } ================================================ FILE: src/containers/shared/components/CurrencySwitch/index.ts ================================================ export { CurrencySwitch } from './CurrencySwitch' ================================================ FILE: src/containers/shared/components/CurrencySwitch/styles.scss ================================================ @use '../../css/variables' as *; .currency-switch { display: flex; align-items: center; gap: 8px; @include for-size(tablet-portrait-up) { gap: 12px; } .currency-label { color: $black-40; font-size: 14px; @include medium; @include for-size(tablet-portrait-up) { font-size: 16px; } &.active { color: $white; @include bold; } } .toggle-switch { position: relative; display: inline-block; width: 36px; height: 20px; cursor: pointer; @include for-size(desktop-up) { width: 40px; height: 24px; } input { position: absolute; width: 0; height: 0; opacity: 0; } .toggle-slider { position: absolute; border-radius: 24px; background-color: $blue; inset: 0; transition: background-color 0.2s; &::before { position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: 50%; background-color: $white; content: ''; transition: transform 0.2s; @include for-size(desktop-up) { width: 18px; height: 18px; } } } input:checked + .toggle-slider::before { transform: translateX(16px); } } } ================================================ FILE: src/containers/shared/components/CurrencySwitch/test/CurrencySwitch.test.tsx ================================================ import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { CurrencySwitch } from '../CurrencySwitch' describe('CurrencySwitch', () => { it('renders both labels', () => { render( , ) expect(screen.getByText('USD')).toBeInTheDocument() expect(screen.getByText('XRP')).toBeInTheDocument() }) it('highlights the selected label', () => { const { rerender } = render( , ) expect(screen.getByText('USD')).toHaveClass('active') expect(screen.getByText('XRP')).not.toHaveClass('active') rerender( , ) expect(screen.getByText('USD')).not.toHaveClass('active') expect(screen.getByText('XRP')).toHaveClass('active') }) it('calls onChange with right label when toggled from left', async () => { const onChange = jest.fn() render( , ) await userEvent.click(screen.getByLabelText('Toggle currency')) expect(onChange).toHaveBeenCalledWith('XRP') }) it('calls onChange with left label when toggled from right', async () => { const onChange = jest.fn() render( , ) await userEvent.click(screen.getByLabelText('Toggle currency')) expect(onChange).toHaveBeenCalledWith('USD') }) it('checkbox is unchecked when left is selected', () => { render( , ) expect(screen.getByRole('checkbox')).not.toBeChecked() }) it('checkbox is checked when right is selected', () => { render( , ) expect(screen.getByRole('checkbox')).toBeChecked() }) it('works with arbitrary labels', async () => { const onChange = jest.fn() render( , ) expect(screen.getByText('BTC')).toHaveClass('active') await userEvent.click(screen.getByLabelText('Toggle currency')) expect(onChange).toHaveBeenCalledWith('ETH') }) }) ================================================ FILE: src/containers/shared/components/DexTradeTable/DexTradeTable.tsx ================================================ import { useTranslation } from 'react-i18next' import { useEffect, useRef } from 'react' import { Link } from 'react-router' import { Account } from '../Account' import { Loader } from '../Loader' import { EmptyStateMessage } from '../EmptyStateMessage' import { useTooltip } from '../Tooltip' import HoverIcon from '../../images/hover.svg' import ArrowIcon from '../../images/down_arrow.svg' import './styles.scss' import '../../css/data-tables-mobile.scss' import { Pagination } from '../Pagination' import { ExplorerAmount } from '../../types' import { ResponsiveTimestamp } from '../ResponsiveTimestamp' import { Amount } from '../Amount' import Currency from '../Currency' import { shortenAccount, shortenTxHash } from '../../utils' import { parseAmount } from '../../NumberFormattingUtils' import { useLanguage } from '../../hooks' export interface DexTradeFormatted { hash: string ledger: number timestamp: number from: string to: string amount_in: ExplorerAmount amount_out: ExplorerAmount rate: number | null type?: string subtype?: string } interface DexTradeTableProps { transactions: DexTradeFormatted[] isLoading?: boolean totalTrades: number currentPage: number onPageChange: (page: number) => void pageSize: number hasMore?: boolean hasPrevPage?: boolean sortField?: string setSortField?: (field: string) => void sortOrder?: 'asc' | 'desc' setSortOrder?: (order: 'asc' | 'desc') => void onRefresh?: () => void hideType?: boolean } export const DexTradeTable = ({ transactions, isLoading = false, totalTrades, currentPage, onPageChange, pageSize, hasMore = false, hasPrevPage = false, sortField, setSortField, sortOrder, setSortOrder, onRefresh, hideType = false, }: DexTradeTableProps) => { const { t } = useTranslation() const language = useLanguage() const { showTooltip, hideTooltip } = useTooltip() const tableRef = useRef(null) // Scroll to top of table when page changes useEffect(() => { if (!isLoading) { // Use double requestAnimationFrame to ensure scroll happens after DOM updates requestAnimationFrame(() => { requestAnimationFrame(() => { const tableContainer = tableRef.current?.closest('.tokens-table') if (tableContainer) { const rect = tableContainer.getBoundingClientRect() const scrollTop = window.scrollY + rect.top - 200 // Scroll higher to show tabs and table headers window.scrollTo({ top: scrollTop, behavior: 'smooth' }) } }) }) } }, [currentPage, isLoading]) const renderTextTooltip = (tooltipText: string, yOffset = 60) => ( ) => { const rect = e.currentTarget.getBoundingClientRect() showTooltip('text', e, tooltipText, { x: rect.left - 10, y: rect.top - yOffset, }) }} onMouseLeave={() => hideTooltip()} /> ) const formatDexType = (type: string | undefined) => { if (!type) { return '--' } if (type === 'orderBook') { return 'Order Book' } if (type === 'amm') { return 'AMM' } return type } const handleTimestampSort = () => { if (setSortField && setSortOrder) { if (sortField === 'timestamp') { // Toggle sort order setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc') } else { // Set to timestamp field with desc order by default setSortField('timestamp') setSortOrder('desc') } } } const renderTransaction = (tx: DexTradeFormatted, idx: number) => ( {shortenTxHash(tx.hash)} {tx.ledger} {!hideType && {formatDexType(tx.type)}} 1{' '} {' '} = {tx.rate !== null ? parseAmount(tx.rate) : '--'}{' '} ) return (
    {isLoading && } {!isLoading && transactions && transactions.length > 0 && ( <>
    {t('data_available_from_notice')}
    {!hideType && ( )} {transactions.map((tx, idx) => renderTransaction(tx, idx))}
    {t('tx_hash')} {t('ledger')} {t('timestamp')} {sortField === 'timestamp' && ( )} {t('token_page.dex_type')}{t('from')} {t('to')} {t('amount_in')} {renderTextTooltip(t('token_page.dex_amount_in_tooltip'))} {t('amount_out')} {renderTextTooltip( t('token_page.dex_amount_out_tooltip'), )} {t('rate')} {renderTextTooltip(t('token_page.dex_rate_tooltip'))}
    {(hasMore || hasPrevPage) && ( )} )} {!isLoading && (!transactions || transactions.length === 0) && ( )}
    ) } ================================================ FILE: src/containers/shared/components/DexTradeTable/formatDexTrade.ts ================================================ import { DexTradeFormatted } from './DexTradeTable' /** Raw DEX trade as returned by LOS /dex-trades API */ export interface LOSDexTradeRaw { tx_hash: string ledger_index: number timestamp: number from: string to: string type?: string subtype?: string amount_in: { currency: string; issuer?: string; value: string } amount_out: { currency: string; issuer?: string; value: string } } /** Transform a raw LOS dex trade into the format consumed by DexTradeTable. */ export const formatDexTrade = (trade: LOSDexTradeRaw): DexTradeFormatted => ({ hash: trade.tx_hash, ledger: trade.ledger_index, timestamp: trade.timestamp, from: trade.from, to: trade.to, type: trade.type, subtype: trade.subtype, amount_in: { currency: trade.amount_in.currency, issuer: trade.amount_in.issuer, amount: Number(trade.amount_in.value), }, amount_out: { currency: trade.amount_out.currency, issuer: trade.amount_out.issuer, amount: Number(trade.amount_out.value), }, rate: trade.amount_in && Number(trade.amount_in.value) !== 0 ? Number(trade.amount_out.value) / Number(trade.amount_in.value) : null, }) ================================================ FILE: src/containers/shared/components/DexTradeTable/styles.scss ================================================ @use '../../css/variables' as *; @use '../../css/table'; @use '../../css/data-tables-notice'; // ============================================================================= // DEX TRADE TABLE - Component-specific styles // ============================================================================= .text-truncate { @extend %truncate; } // Add spacing between action and timestamp columns .tx-action { padding-right: 16px; @include for-size(phone-only) { padding-right: 12px; } } // Scoped styles for dex trade table to prevent conflicts with other tables .tokens-table { // Custom tooltip styling for dex trade table .tooltip.tooltip-text { z-index: 9999; max-width: calc(100vw - 32px); margin: 0 16px; } table.basic { // Fix column widths for dex trade table to prevent wrapping and ensure consistent spacing .tx-hash { width: 100px; min-width: 100px; } th:nth-child(2), .tx-ledger { width: 80px; min-width: 80px; padding: 15px 5px; @include for-size(desktop-up) { padding: 15px 5px !important; } } .tx-timestamp { width: 200px; min-width: 200px; padding: 15px 5px; @include for-size(tablet-portrait-up) { padding: 15px 5px 15px 0px; } } .tx-type { width: 100px; min-width: 100px; } .tx-from, .tx-to { width: 140px; min-width: 140px; } .tx-amount-in, .tx-amount-out { width: 140px; min-width: 140px; } .tx-amount-rate { width: 165px; min-width: 165px; } } } ================================================ FILE: src/containers/shared/components/DexTradeTable/test/DexTradeTable.test.tsx ================================================ import { render, screen, fireEvent } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import i18n from '../../../../../i18n/testConfigEnglish' import { DexTradeTable, DexTradeFormatted } from '../DexTradeTable' // Amount must be mocked — it uses useQuery(), SocketContext, and useAnalytics() jest.mock('../../Amount', () => ({ Amount: ({ value }: any) =>
    {value.amount}
    , })) const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) const mockDexTrades: DexTradeFormatted[] = [ { hash: 'E3FE6EA3D48F0C2B639448020EA4F03D4F4F8FFDB243A852A0F59177921B4879', ledger: 12345, timestamp: 1609459200, from: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', to: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', amount_in: { currency: 'USD', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', amount: '100', }, amount_out: { currency: 'XRP', issuer: '', amount: '500', }, rate: 5, type: 'orderBook', }, { hash: 'F4GF7FB4E49F1D3C740559131FB5G04E4G5G9GGEC354B963B1G60288C32C5980', ledger: 12346, timestamp: 1609545600, from: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', to: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', amount_in: { currency: 'XRP', issuer: '', amount: '1000', }, amount_out: { currency: 'EUR', issuer: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', amount: '200', }, rate: 0.2, type: 'amm', }, ] describe('DexTradeTable Component', () => { const mockOnPageChange = jest.fn() const mockOnRefresh = jest.fn() beforeEach(() => { jest.clearAllMocks() }) it('renders without crashing', () => { render( , ) expect(screen.getByText('E3FE6E...1B4879')).toBeInTheDocument() }) it('displays all transactions in the table', () => { render( , ) const accounts = screen.getAllByTestId('account') expect(accounts.length).toBeGreaterThanOrEqual(2) expect(accounts[0]).toHaveTextContent('rN7n7ot...6fzRH') expect(accounts[1]).toHaveTextContent('rLNaPoK...4dc6w') }) it('shows loading state when isLoading is true', () => { render( , ) expect(screen.getByRole('img', { name: /loading/i })).toBeInTheDocument() }) it('shows no trades message when empty and not loading', () => { render( , ) expect(screen.getByText(/no dex trades found/i)).toBeInTheDocument() expect(screen.getByText('no_info.svg')).toBeInTheDocument() }) it('calls onPageChange when pagination is triggered', () => { render( , ) const page2Button = screen.getByRole('button', { name: '2' }) fireEvent.click(page2Button) expect(mockOnPageChange).toHaveBeenCalledWith(2) }) it('displays correct DEX type for orderBook', () => { render( , ) expect(screen.getByText('Order Book')).toBeInTheDocument() }) it('displays correct DEX type for AMM', () => { render( , ) expect(screen.getByText('AMM')).toBeInTheDocument() }) it('renders table headers correctly', () => { const { container } = render( , ) const headers = container.querySelectorAll('thead th') expect(headers.length).toBe(9) }) it('displays refresh button when transactions exist', () => { render( , ) const refreshButton = screen.getByTitle(/refresh/i) expect(refreshButton).toBeInTheDocument() }) it('calls onRefresh when refresh button is clicked', () => { render( , ) const refreshButton = screen.getByTitle(/refresh/i) fireEvent.click(refreshButton) expect(mockOnRefresh).toHaveBeenCalled() }) it('handles transactions with null rate', () => { const tradesWithNullRate: DexTradeFormatted[] = [ { ...mockDexTrades[0], rate: null, }, ] const { container } = render( , ) const rateCell = container.querySelector('tbody tr .tx-amount-rate') expect(rateCell?.textContent).toContain('--') }) it('handles transactions without type', () => { const tradesWithoutType: DexTradeFormatted[] = [ { ...mockDexTrades[0], type: undefined, }, ] const { container } = render( , ) const typeCell = container.querySelector('tbody tr .tx-type') expect(typeCell?.textContent).toBe('--') }) it('displays pagination when hasMore is true', () => { render( , ) expect( screen.getByRole('navigation', { name: /pagination/i }), ).toBeInTheDocument() }) it('displays pagination when hasPrevPage is true', () => { render( , ) expect( screen.getByRole('navigation', { name: /pagination/i }), ).toBeInTheDocument() }) it('renders correct number of rows', () => { const { container } = render( , ) const rows = container.querySelectorAll('tbody tr') expect(rows.length).toBe(mockDexTrades.length) }) it('hides type column when hideType is true', () => { const { container } = render( , ) const headers = container.querySelectorAll('thead th') expect(headers.length).toBe(8) expect(screen.queryByText('Order Book')).not.toBeInTheDocument() expect(screen.queryByText('AMM')).not.toBeInTheDocument() }) it('handles single transaction', () => { const singleTrade: DexTradeFormatted[] = [mockDexTrades[0]] render( , ) const accounts = screen.getAllByTestId('account') expect(accounts[0]).toHaveTextContent('rN7n7ot...6fzRH') expect(accounts[1]).toHaveTextContent('rLNaPoK...4dc6w') }) }) ================================================ FILE: src/containers/shared/components/DomainLink.tsx ================================================ import classnames from 'classnames' import { decodeHex } from '../transactionUtils' export interface Props { className?: string decode?: boolean domain: string displayDomain?: string keepProtocol?: boolean } // Matches a protocol (e.g. 'http://' or 'https://') at the start of a string. const PROTOCOL_REGEX = /^([a-z][a-z0-9+\-.]*):\/\// const PROTOCOL_REMOVAL_REGEX = /^(https?:\/\/)?(.*?)(\/)?$/ const DomainLink = (props: Props) => { const { className, decode = false, domain, displayDomain = '', keepProtocol = true, } = props // If decode is true, decode the domain const decodedDomain = decode ? decodeHex(domain) : domain // Use the test method to check for the protocol const domainHasProtocol = PROTOCOL_REGEX.test(decodedDomain) // If decoded domain does not have a protocol, add one ; otherwise, don't let href = domainHasProtocol ? decodedDomain : `https://${decodedDomain}` if (href.startsWith('ipfs://')) { href = href.replace('ipfs://', 'https://ipfs.io/ipfs/') } const domainText = keepProtocol ? decodedDomain : decodedDomain.replace(PROTOCOL_REMOVAL_REGEX, '$2') return ( event.stopPropagation()} > {displayDomain || domainText} ) } export default DomainLink ================================================ FILE: src/containers/shared/components/Dropdown/Dropdown.tsx ================================================ import classnames from 'classnames' import { ReactNode, useCallback, useEffect, useRef, useState } from 'react' import ArrowIcon from '../../images/down_arrow.svg' import './dropdown.scss' export interface DropdownProps { tagName?: `div` | `li` title: ReactNode | string children: ReactNode | undefined className?: string } // TODO: Add useId after upgrading to react@18 to populate id on .dropdown-menu and aria-controlled by on .dropdown-toggle /** * A simple dropdown that has auto closing * * @param title The value in the toggle * @param children The contents of the menu. DropdownItem is the preferred child component * @param className * @constructor * * @example * * alert('hello')}>Option 1 * Option 2 * */ export const Dropdown = ({ title, children, className, tagName = `div`, }: DropdownProps) => { const [expanded, setExpanded] = useState(false) const dropdownRef = useRef(null) const globalClickListener = useCallback((nativeEvent) => { // ignore click event happened inside the dropdown menu if (dropdownRef.current && dropdownRef.current.contains(nativeEvent.target)) return // else hide dropdown menu setExpanded(false) document.removeEventListener('click', globalClickListener) }, []) useEffect( (): (() => void) => () => // remove listener when cleaning up component document.removeEventListener('click', globalClickListener), [globalClickListener], ) const toggleExpand = () => { // don't de-expand if clicking in the textbox setExpanded((prevExpanded) => !prevExpanded) document.addEventListener('click', globalClickListener) } const TagName = tagName return (
    {children}
    ) } ================================================ FILE: src/containers/shared/components/Dropdown/DropdownItem.tsx ================================================ import { PropsWithChildren } from 'react' import classnames from 'classnames' export type DropdownItemProps = PropsWithChildren<{ className?: string handler?: (event) => void href?: string }> export const DropdownItem = ({ children, className, handler, href, }: DropdownItemProps) => { const Tag = handler || href ? `a` : `div` return ( {children} ) } ================================================ FILE: src/containers/shared/components/Dropdown/dropdown.scss ================================================ @use '../../css/variables' as *; .dropdown { position: relative; display: inline-block; font-size: 14px; white-space: nowrap; } .dropdown-toggle { display: flex; align-items: center; font-weight: 700; gap: 0 8px; .arrow { height: 1em; margin-left: auto; } } .dropdown-menu { position: absolute; z-index: 100; display: none; overflow: hidden; min-width: max(100%, 160px); padding: 8px; border: 1px solid $black-80; border-radius: $border-radius; margin-top: 5px; background: rgba($black, 0.96); } .dropdown-item { padding: 12px 8px; border-radius: calc($border-radius / 2); font-weight: normal; @at-root { a#{&} { display: flex; align-items: center; color: $white; gap: 0 12px; &::after { display: none; } &:hover { background: $black-80; cursor: pointer; } } } input { width: 100%; padding: 8px; border: none; background: $black-80; color: $white; font-size: inherit; &::placeholder { color: $black-40; } } .btn-remove { padding: 8px; margin-left: auto; background: url('../../images/close.png') center no-repeat; background-size: 8px; } } .dropdown-expanded { .arrow { transform: rotate(180deg); } .dropdown-menu { display: block; } } .dropdown-right { .dropdown-menu { right: 0; } } ================================================ FILE: src/containers/shared/components/Dropdown/index.ts ================================================ export * from './Dropdown' export * from './DropdownItem' ================================================ FILE: src/containers/shared/components/Dropdown/test/Dropdown.test.tsx ================================================ import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { Dropdown } from '../Dropdown' describe('Dropdown', () => { describe('prop: title', () => { it('renders when it is jsx', () => { const title = Woo render(Menu Contents) expect(screen.getByText('Woo')).toBeInTheDocument() expect(screen.getByText('Woo')).toHaveClass('title-component') }) it('renders when it is a string', () => { const title = 'Woo' render(Menu Contents) expect(screen.getByRole('button')).toHaveTextContent(title) }) }) describe(`prop: className`, () => { it('renders with custom className', () => { const { container } = render( Menu Contents , ) expect(container.querySelector('.dropdown')).toHaveClass( 'dropdown-custom', ) }) }) it('shows menu when clicking toggle', async () => { const { container } = render(Menu Contents) const dropdown = container.querySelector('.dropdown') expect(dropdown).not.toHaveClass('dropdown-expanded') await userEvent.click(screen.getByRole('button')) expect(dropdown).toHaveClass('dropdown-expanded') await userEvent.click(screen.getByRole('button')) expect(dropdown).not.toHaveClass('dropdown-expanded') }) it('hides menu when clicking toggle outside the component', async () => { const { container } = render(
    Menu Contents
    , ) const dropdown = container.querySelector('.dropdown') expect(dropdown).not.toHaveClass('dropdown-expanded') await userEvent.click(screen.getByRole('button', { name: /woo/i })) expect(dropdown).toHaveClass('dropdown-expanded') await userEvent.click(screen.getByText('Menu Contents')) expect(dropdown).toHaveClass('dropdown-expanded') await userEvent.click(screen.getByRole('button', { name: /outside/i })) expect(dropdown).not.toHaveClass('dropdown-expanded') }) it('adds aria roles', async () => { const { container } = render(Menu Contents) const toggle = screen.getByRole('button') const menu = container.querySelector('.dropdown-menu') expect(toggle).toHaveAttribute('aria-haspopup', 'true') expect(toggle).toHaveAttribute('tabIndex', '0') expect(menu).toHaveAttribute('tabIndex', '0') await userEvent.click(toggle) expect(toggle).toHaveAttribute('aria-expanded', 'true') expect(menu).toHaveAttribute('aria-hidden', 'false') }) }) ================================================ FILE: src/containers/shared/components/Dropdown/test/DropdownItem.test.tsx ================================================ import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { DropdownItem } from '../DropdownItem' describe('DropdownItem', () => { describe(`prop: className`, () => { it('renders with custom className', () => { render(Hello) expect(screen.getByRole('menuitem')).toHaveClass( 'dropdown-item', 'custom', ) }) }) describe('prop: handler', () => { const handler = jest.fn() beforeEach(() => { handler.mockClear() }) it('renders as an anchor tag', () => { render(Hello) const element = screen.getByRole('menuitem') expect(element.tagName.toLowerCase()).toBe('a') }) it('executes handler on click', async () => { render(Hello) await userEvent.click(screen.getByRole('menuitem')) expect(handler).toHaveBeenCalled() }) it('executes handler on keyup', async () => { render(Hello) await userEvent.click(screen.getByRole('menuitem')) expect(handler).toHaveBeenCalled() }) }) describe('prop: href', () => { it('renders as an anchor tag', () => { render(Hello) const element = screen.getByRole('menuitem') expect(element.tagName.toLowerCase()).toBe('a') }) it('renders href attribute on anchor', () => { render(Hello) expect(screen.getByRole('menuitem')).toHaveAttribute('href') }) }) it('renders as div without handler or href', () => { render(Hello) const element = screen.getByRole('menuitem') expect(element.tagName.toLowerCase()).toBe('div') }) it('adds aria roles', () => { render(Hello) expect(screen.getByRole('menuitem')).toBeInTheDocument() }) }) ================================================ FILE: src/containers/shared/components/DualAxisAreaChart/DualAxisAreaChart.tsx ================================================ import { FC } from 'react' import { AreaChart, Area, XAxis, YAxis, Tooltip, TooltipProps, ResponsiveContainer, CartesianGrid, } from 'recharts' /** Configuration for a single Y-axis and its associated area series. */ export interface AxisConfig { dataKey: string label: string color: string formatter: (value: number) => string show: boolean } /** * A recharts AreaChart with two Y-axes (left + right), gradient fills, * and configurable axis formatting. */ export interface DualAxisAreaChartProps { data: any[] xAxisKey: string xAxisFormatter?: (value: any) => string leftAxis: AxisConfig rightAxis: AxisConfig height?: number margin?: { top: number; right: number; left: number; bottom: number } tooltipContent?: FC> gridStroke?: string axisStroke?: string tickColor?: string tickFontSize?: number showGrid?: boolean gradientOpacity?: number } export const DualAxisAreaChart: FC = ({ data, xAxisKey, xAxisFormatter, leftAxis, rightAxis, height = 340, margin = { top: 10, right: 50, left: 50, bottom: 0 }, tooltipContent, gridStroke = '#333', axisStroke = '#555', tickColor = '#888', tickFontSize = 13, showGrid = true, gradientOpacity = 0.8, }) => { const tickInterval = data.length > 6 ? Math.floor(data.length / 5) : 0 const leftGradientId = `gradient-${leftAxis.dataKey}` const rightGradientId = `gradient-${rightAxis.dataKey}` return ( {showGrid && ( )} {tooltipContent && } {leftAxis.show && ( )} {rightAxis.show && ( )} ) } ================================================ FILE: src/containers/shared/components/DualAxisAreaChart/index.ts ================================================ export { DualAxisAreaChart, type AxisConfig, type DualAxisAreaChartProps, } from './DualAxisAreaChart' ================================================ FILE: src/containers/shared/components/EmptyStateMessage/emptyStateMessage.scss ================================================ @use '../../css/variables' as *; // Empty state message styling .empty-state-message { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 60px 20px; color: $black-40; text-align: center; .empty-state-icon { width: 126px; height: 137px; margin-bottom: 16px; opacity: 0.5; } .empty-state-text { color: $black-60; font-size: 16px; line-height: 1.5; } } ================================================ FILE: src/containers/shared/components/EmptyStateMessage/index.tsx ================================================ import { ReactNode } from 'react' import NoInfo from '../../images/no_info.svg' import './emptyStateMessage.scss' interface EmptyStateMessageProps { message: ReactNode } export const EmptyStateMessage = ({ message }: EmptyStateMessageProps) => (
    {message}
    ) ================================================ FILE: src/containers/shared/components/EmptyStateMessage/tests/index.test.tsx ================================================ import { render } from '@testing-library/react' import { EmptyStateMessage } from '../index' describe('EmptyStateMessage', () => { it('renders correctly with message', () => { const testMessage = 'No data available' const { container } = render() expect(container.querySelectorAll('.empty-state-message')).toHaveLength(1) expect(container.querySelector('.empty-state-text')).toHaveTextContent( testMessage, ) }) }) ================================================ FILE: src/containers/shared/components/HoldersTable/HoldersTable.tsx ================================================ import { useTranslation } from 'react-i18next' import { useEffect, useRef } from 'react' import { Loader } from '../Loader' import { Pagination } from '../Pagination' import { EmptyStateMessage } from '../EmptyStateMessage' import './styles.scss' import '../../css/data-tables-mobile.scss' import { parseAmount, parseCurrencyAmount, parsePercent, } from '../../NumberFormattingUtils' import { shortenAccount } from '../../utils' import { Account } from '../Account' export interface XRPLHolder { rank: number account: string balance: number | string percent: number value_usd: number | null } interface HoldersTableProps { holders: XRPLHolder[] isHoldersDataLoading?: boolean totalHolders: number currentPage: number onPageChange: (page: number) => void pageSize: number } export const HoldersTable = ({ holders, isHoldersDataLoading = false, totalHolders, currentPage, onPageChange, pageSize, }: HoldersTableProps) => { const { t } = useTranslation() const tableRef = useRef(null) // Scroll to top of table when page changes useEffect(() => { if (!isHoldersDataLoading) { // Use double requestAnimationFrame to ensure scroll happens after DOM updates requestAnimationFrame(() => { requestAnimationFrame(() => { const tableContainer = tableRef.current?.closest('.tokens-table') if (tableContainer) { const rect = tableContainer.getBoundingClientRect() const scrollTop = window.scrollY + rect.top - 200 // Scroll higher to show tabs and table headers window.scrollTo({ top: scrollTop, behavior: 'smooth' }) } }) }) } }, [currentPage, isHoldersDataLoading]) const renderHolder = (holder: XRPLHolder) => ( {holder.rank} {parseAmount(holder.balance)} {parsePercent(holder.percent)} {holder.value_usd === null ? '--' : parseCurrencyAmount(holder.value_usd)} ) if (!isHoldersDataLoading && (!holders || holders.length === 0)) { return } return (
    {isHoldersDataLoading ? ( ) : ( holders.map(renderHolder) )}
    {t('token_page.holders_rank')} {t('account')} {t('token_page.holders_num_tokens')} {t('token_page.holders_percent_supply')} {t('token_page.holders_usd_value')}
    {!isHoldersDataLoading && totalHolders > pageSize && ( )}
    ) } ================================================ FILE: src/containers/shared/components/HoldersTable/styles.scss ================================================ @use '../../css/variables' as *; @use '../../css/table'; // Fix column widths for holders table .holder-rank { width: 60px; min-width: 60px; } .tx-hash { width: 140px; min-width: 140px; } .tx-ledger { width: 120px; min-width: 120px; } .tx-percent-supply { width: 110px; min-width: 110px; } .tx-value { width: 120px; min-width: 120px; } ================================================ FILE: src/containers/shared/components/HoldersTable/test/HoldersTable.test.tsx ================================================ import { render, screen, fireEvent } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import i18n from '../../../../../i18n/testConfigEnglish' import { HoldersTable, XRPLHolder } from '../HoldersTable' const TestWrapper = ({ children }: { children: React.ReactNode }) => ( {children} ) const mockHolders: XRPLHolder[] = [ { rank: 1, account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', balance: 1000000, percent: 25.5, value_usd: 500000, }, { rank: 2, account: 'rLNaPoKeeBjZe2qs6x52yVPZpZ8td4dc6w', balance: 500000, percent: 12.75, value_usd: 250000, }, { rank: 3, account: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', balance: 250000, percent: 6.375, value_usd: 125000, }, ] describe('HoldersTable Component', () => { const mockOnPageChange = jest.fn() beforeEach(() => { jest.clearAllMocks() }) it('renders without crashing', () => { render( , ) // Verify accounts are rendered (shortened to first 7 + last 5 chars with ... in between) const accounts = screen.getAllByTestId('account') expect(accounts.length).toBeGreaterThanOrEqual(3) expect(accounts[0]).toHaveTextContent('rN7n7ot...6fzRH') }) it('displays all holders in the table', () => { render( , ) // Verify accounts are rendered (they are shortened to first 7 + last 5 chars with ... in between) const accounts = screen.getAllByTestId('account') expect(accounts.length).toBeGreaterThanOrEqual(3) expect(accounts[0]).toHaveTextContent('rN7n7ot...6fzRH') expect(accounts[1]).toHaveTextContent('rLNaPoK...4dc6w') expect(accounts[2]).toHaveTextContent('rvYAfWj...bs59B') }) it('displays correct rank for each holder', () => { const { container } = render( , ) const rows = container.querySelectorAll('tbody tr') expect(rows.length).toBe(3) }) it('shows loading state when isHoldersDataLoading is true', () => { render( , ) expect(screen.getByRole('img', { name: /loading/i })).toBeInTheDocument() }) it('shows no holders message when empty and not loading', () => { render( , ) expect(screen.getByText(/no holders/i)).toBeInTheDocument() }) it('calls onPageChange when pagination is triggered', () => { render( , ) const page2Button = screen.getByRole('button', { name: '2' }) fireEvent.click(page2Button) expect(mockOnPageChange).toHaveBeenCalledWith(2) }) it('renders table headers correctly', () => { const { container } = render( , ) const headers = container.querySelectorAll('thead th') expect(headers.length).toBe(5) }) it('displays pagination when there are multiple pages', () => { render( , ) expect( screen.getByRole('navigation', { name: /pagination/i }), ).toBeInTheDocument() }) it('does not display pagination when all items fit on one page', () => { render( , ) expect( screen.queryByRole('navigation', { name: /pagination/i }), ).not.toBeInTheDocument() }) it('handles single holder correctly', () => { const singleHolder: XRPLHolder[] = [mockHolders[0]] render( , ) // Verify account is rendered (shortened to first 7 + last 5 chars with ... in between) const account = screen.getByTestId('account') expect(account).toHaveTextContent('rN7n7ot...6fzRH') }) it('handles large holder balances', () => { const largeHolder: XRPLHolder[] = [ { rank: 1, account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', balance: 999999999999, percent: 99.99, value_usd: 999999999999, }, ] render( , ) // Verify account is rendered (shortened to first 7 + last 5 chars with ... in between) const account = screen.getByTestId('account') expect(account).toHaveTextContent('rN7n7ot...6fzRH') }) it('handles zero balance holders', () => { const zeroHolder: XRPLHolder[] = [ { rank: 1, account: 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', balance: 0, percent: 0, value_usd: 0, }, ] render( , ) // Verify account is rendered (shortened to first 7 + last 5 chars with ... in between) const account = screen.getByTestId('account') expect(account).toHaveTextContent('rN7n7ot...6fzRH') }) it('renders table with correct CSS classes', () => { const { container } = render( , ) expect(container.querySelector('.tokens-table')).toBeInTheDocument() expect(container.querySelector('table.basic')).toBeInTheDocument() }) it('displays correct number of rows for current page', () => { const { container } = render( , ) const rows = container.querySelectorAll('tbody tr') expect(rows.length).toBe(mockHolders.length) }) }) ================================================ FILE: src/containers/shared/components/JsonView/JsonView.tsx ================================================ import { useState } from 'react' import ReactJson from 'react18-json-view' import { useTranslation } from 'react-i18next' import './json-view.scss' import CollapseAllIcon from '../../images/collapse_all.svg' import ExpandAllIcon from '../../images/expand_all.svg' interface JsonViewProps { data: any showExpandButton?: boolean showBackground?: boolean } export const JsonView = ({ data, showExpandButton = false, showBackground = false, }: JsonViewProps) => { const { t } = useTranslation() const [isExpanded, setIsExpanded] = useState(false) const handleExpandToggle = () => { setIsExpanded(!isExpanded) } const Icon = isExpanded ? CollapseAllIcon : ExpandAllIcon return (
    {showExpandButton && (
    )} { if (params.node === undefined) return { className: 'json-view--undefined' } return undefined }} />
    ) } ================================================ FILE: src/containers/shared/components/JsonView/index.ts ================================================ export * from './JsonView' ================================================ FILE: src/containers/shared/components/JsonView/json-view.scss ================================================ @use '../../css/variables' as *; @import 'react18-json-view/src/style.css'; .json-view-container { position: relative; &.show-background { padding: 24px; background-color: $black-80; } } .json-view { overflow: hidden; margin-bottom: 40px; color: $black-10 !important; font-size: 12px; letter-spacing: 0; @include for-size(phone-only) { padding-top: 85px; } svg { height: 11px !important; color: $black-10; } } .json-view-controls { position: absolute; z-index: 10; top: 24px; right: 24px; display: flex; height: auto; align-items: flex-start; justify-content: flex-end; padding-top: 4px; @include for-size(phone-only) { position: absolute; top: 24px; right: auto; left: 24px; justify-content: flex-start; padding-top: 0; } } .json-view-expand-button { display: flex; align-items: center; justify-content: flex-end; padding: 4px 16px; border: 1px solid $white; border-radius: 100px; background: transparent; color: $white; cursor: pointer; font-size: 12px; font-style: normal; gap: 10px; line-height: 150%; transition: all 0.2s ease; @include regular; &:hover { background: $black-70; } &:focus { outline: none; } } .jv-button { color: $orange-50 !important; font-size: 14px; } .jv-indent { border-left: 1px solid $black-60; margin: 4px; } /* stylelint-disable selector-class-pattern -- react18-json-view uses these */ .json-view--boolean { color: $magenta-60 !important; } .json-view--pair { margin: 4px; } .json-view--property { color: $black-10 !important; } .json-view--null, .json-view--undefined { display: inline-block; padding: 1px 2px; border-radius: 3px; background-color: $black-60; color: $black-10 !important; font-size: 11px; } .json-view--number { color: $green-30 !important; } .json-view--string { color: $orange-50 !important; overflow-wrap: break-word; white-space: pre-wrap; word-break: break-all; } /* stylelint-enable selector-class-pattern */ ================================================ FILE: src/containers/shared/components/JsonView/test/JsonView.test.tsx ================================================ import { render, screen, fireEvent, cleanup } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { JsonView } from '../JsonView' import i18n from '../../../../../i18n/testConfigEnglish' const renderComponent = (component: JSX.Element) => render({component}) const mockData = { Account: 'rL7cFLMatevSip1b2FVFVMevSip1b2FVFVMevSip1b2FVFV', Fee: '50', LastLedgerSequence: 98135739, OfferSequence: 98722304, Sequence: 98722305, SigningPubKey: 'EDB83C0135E7CE2C7CE2DCDE0E4B4B09E0B0B7B580D975D50F80D50A67E58E13', TransactionType: 'OfferCancel', TxnSignature: '93B80F8FB8832C4F3E39C179B411D2AAFB7D4851894301C1B2FDE8BE1942B...', hash: '327FD39E14EF14741374137A2BC0CCEA67AEC371F2D67B58E66182B1AEC89E', ctid: 'C8D6ELA000000000', meta: { AffectedNodes: [ { ModifiedNode: { FinalFields: { Account: 'rL7cFLMatevSip1b2FVFVMevSip1b2FVFVMevSip1b2FVFV', Balance: '41797929', Flags: 0, LedgerEntryType: 'AccountRoot', OwnerCount: 0, PreviousTxnID: '30615372ELF11D1065C7DEDEOE4B4B09E0B0B7B580D975D50F80D50A67E58E13', PreviousTxnLgrSeq: 30615372, Sequence: 98722306, }, LedgerEntryType: 'AccountRoot', LedgerIndex: '30615372ELF11D1065C7DEDEOE4B4B09E0B0B7B580D975D50F80D50A67E58E13', PreviousFields: { Balance: '41797979', Sequence: 98722305, }, PreviousTxnID: '30615372ELF11D1065C7DEDEOE4B4B09E0B0B7B580D975D50F80D50A67E58E13', PreviousTxnLgrSeq: 30615371, }, }, ], TransactionIndex: 0, TransactionResult: 'tesSUCCESS', }, } describe('JsonView', () => { afterEach(cleanup) describe('Basic Rendering', () => { it('renders without crashing', () => { renderComponent() expect(screen.getByText('Account')).toBeInTheDocument() expect(screen.getByText('Fee')).toBeInTheDocument() expect(screen.getByText('TransactionType')).toBeInTheDocument() }) it('renders JSON data correctly', () => { renderComponent() // Check that key properties are displayed expect(screen.getByText('Account')).toBeInTheDocument() expect( screen.getByText(/rL7cFLMatevSip1b2FVFVMevSip1b2FVFVMevSip1b2FVFV/), ).toBeInTheDocument() expect(screen.getByText('Fee')).toBeInTheDocument() expect(screen.getAllByText(/50/)[0]).toBeInTheDocument() expect(screen.getByText('TransactionType')).toBeInTheDocument() expect(screen.getByText(/OfferCancel/)).toBeInTheDocument() }) it('does not show expand button by default', () => { renderComponent() const expandButton = document.querySelector('.json-view-expand-button') expect(expandButton).not.toBeInTheDocument() const controls = document.querySelector('.json-view-controls') expect(controls).not.toBeInTheDocument() }) }) describe('Expand Button Functionality', () => { it('shows expand button when showExpandButton is true', () => { renderComponent() const expandButton = document.querySelector('.json-view-expand-button') expect(expandButton).toBeInTheDocument() const controls = document.querySelector('.json-view-controls') expect(controls).toBeInTheDocument() }) it('displays "Expand" text initially', () => { renderComponent() const expandButton = document.querySelector('.json-view-expand-button') expect(expandButton).toHaveTextContent('Expand') }) it('toggles button text when clicked', () => { renderComponent() const expandButton = document.querySelector( '.json-view-expand-button', ) as HTMLButtonElement // Initially shows "Expand" expect(expandButton).toHaveTextContent('Expand') expect(expandButton).toHaveAttribute('aria-label', 'Expand') // Click to expand fireEvent.click(expandButton) // Should now show "Collapse" expect(expandButton).toHaveTextContent('Collapse') expect(expandButton).toHaveAttribute('aria-label', 'Collapse') // Click again to collapse fireEvent.click(expandButton) // Should be back to "Expand" expect(expandButton).toHaveTextContent('Expand') expect(expandButton).toHaveAttribute('aria-label', 'Expand') }) it('renders SVG icons', () => { renderComponent() const expandButton = document.querySelector('.json-view-expand-button') const svg = expandButton?.querySelector('svg') expect(svg).toBeInTheDocument() expect(svg).toHaveAttribute('width', '24') expect(svg).toHaveAttribute('height', '24') }) it('changes icon when toggled', () => { renderComponent() const expandButton = document.querySelector( '.json-view-expand-button', ) as HTMLButtonElement const initialSvg = expandButton?.querySelector('svg') const initialSvgContent = initialSvg?.textContent // Click to expand fireEvent.click(expandButton) const toggledSvg = expandButton?.querySelector('svg') const toggledSvgContent = toggledSvg?.textContent // SVG content should be different (different icon) expect(toggledSvgContent).not.toBe(initialSvgContent) }) }) describe('Edge Cases', () => { it('handles empty data object', () => { renderComponent() // Should still render without errors const container = document.querySelector('.json-view-container') expect(container).toBeInTheDocument() }) it('handles null data', () => { renderComponent() // Should still render without errors const container = document.querySelector('.json-view-container') expect(container).toBeInTheDocument() }) it('handles complex nested data', () => { const complexData = { level1: { level2: { level3: { deepValue: 'test', }, }, }, } renderComponent() expect(screen.getByText('level1')).toBeInTheDocument() expect(screen.getByRole('button')).toBeInTheDocument() }) }) describe('Integration with react18-json-view', () => { it('passes correct props to ReactJson component', () => { renderComponent() // The component should render the JSON structure expect(screen.getByText('Account')).toBeInTheDocument() expect(screen.getByText('meta')).toBeInTheDocument() expect(screen.getByText('AffectedNodes')).toBeInTheDocument() }) it('handles expand/collapse state correctly', () => { renderComponent() const expandButton = document.querySelector( '.json-view-expand-button', ) as HTMLButtonElement // Initially collapsed (collapsed=5) - some nested content is visible but deeply nested values are not expect(screen.getByText('FinalFields')).toBeInTheDocument() expect(screen.getByText('PreviousFields')).toBeInTheDocument() // But the actual balance values should be collapsed expect(screen.queryByText(/41797929/)).not.toBeInTheDocument() expect(screen.queryByText(/41797979/)).not.toBeInTheDocument() // Click to expand (collapsed=false) fireEvent.click(expandButton) // After expansion, all deeply nested content should be visible including balance values expect(screen.getByText('ModifiedNode')).toBeInTheDocument() expect(screen.getByText('FinalFields')).toBeInTheDocument() expect(screen.getByText('PreviousFields')).toBeInTheDocument() expect(screen.getAllByText('Balance').length).toBeGreaterThan(0) expect(screen.getByText(/41797929/)).toBeInTheDocument() expect(screen.getByText(/41797979/)).toBeInTheDocument() expect(screen.getAllByText('OwnerCount').length).toBeGreaterThan(0) // Click to collapse again (collapsed=5) fireEvent.click(expandButton) // After collapsing, deeply nested values should be hidden again expect(screen.getByText('FinalFields')).toBeInTheDocument() // Still visible at level 5 expect(screen.getByText('PreviousFields')).toBeInTheDocument() // Still visible at level 5 expect(screen.queryByText(/41797929/)).not.toBeInTheDocument() // Hidden beyond level 5 expect(screen.queryByText(/41797979/)).not.toBeInTheDocument() // Hidden beyond level 5 }) }) }) ================================================ FILE: src/containers/shared/components/Loader.tsx ================================================ import { FC } from 'react' import { useTranslation } from 'react-i18next' import LoaderPath from '../images/xrp-loader.png' import '../css/loader.scss' export const Loader: FC<{ className?: string }> = ({ className }) => { const { t } = useTranslation() return (
    {t('loading')}
    ) } ================================================ FILE: src/containers/shared/components/MPTokenLink.tsx ================================================ import { RouteLink } from '../routing' import { MPT_ROUTE } from '../../App/routes' export interface MPTokenLinkProps { tokenID: string } export const MPTokenLink = ({ tokenID }: MPTokenLinkProps) => ( {tokenID} ) ================================================ FILE: src/containers/shared/components/NFTokenLink.tsx ================================================ import { RouteLink } from '../routing' import { NFT_ROUTE } from '../../App/routes' export interface NFTokenLinkProps { tokenID: string shortTokenID?: string } export const NFTokenLink = ({ tokenID, shortTokenID }: NFTokenLinkProps) => ( {shortTokenID || tokenID} ) ================================================ FILE: src/containers/shared/components/Notification/index.tsx ================================================ import { useEffect, useState } from 'react' import './styles.scss' type NotificationLevel = 'primary' type NotificationUsage = | 'default' | 'success' | 'warning' | 'danger' | 'dark' | 'light' | 'dark50' export interface NotificationProps { autoDismiss?: boolean message: string action?: string level?: NotificationLevel delay?: number usage?: NotificationUsage className?: string } export const Notification = ({ autoDismiss = false, delay = 5000, message, action, usage = 'default', level = 'primary', className, }: NotificationProps) => { const [dismissed, setDismissed] = useState(false) useEffect(() => { if (autoDismiss) { setTimeout(() => { setDismissed(true) }, delay) } }, [autoDismiss, delay]) const classNames = ['notification', usage, `${level}-theme`, className].join( ' ', ) return !dismissed ? (
    {message} {action}
    ) : null } ================================================ FILE: src/containers/shared/components/Notification/styles.scss ================================================ @use '../../css/variables' as *; .notification { border: 1px solid; border-radius: 4px; margin: 12px 0; background: $blue; color: $white; font-size: 14px; line-height: 22px; text-align: center; @include bold; span { padding: 0 22px; } &.primary-theme { color: $white; &.default { border-color: $blue; background: $blue; } &.success { border-color: $green; background: $green; } &.warning { border-color: $orange; background: $orange; } &.danger { border-color: $red; background: $red-dark; } &.dark { border-color: $black-100; background: $black-100; } &.dark50 { border-color: $black-50; background: $black-50; } &.light { border-color: $white; background: $white; color: $black-100; } } } ================================================ FILE: src/containers/shared/components/Notification/tests/index.test.tsx ================================================ import { render } from '@testing-library/react' import { Notification } from '../index' /* eslint-disable react/jsx-props-no-spreading */ const VALID_USAGES = [ 'default', 'success', 'warning', 'danger', 'dark', 'light', 'dark50', ] const notificationLevels = ['primary', 'secondary', 'ghost'] const message = 'A catchy message' const renderComponent = (props) => render() describe('', () => { it('should render with custom className', () => { const className = 'test-class' const { container } = renderComponent({ message, className, }) expect(container.firstChild).toHaveClass(className) }) it('should render the action button', () => { const { container } = renderComponent({ message, action: {items.map((it, index) => it === 'dots' ? ( ) : ( ), )}
    ) : null return (
    {tableStructure(paginatedData)} {pagination}
    ) } ================================================ FILE: src/containers/shared/components/PaginatedTable/styles.scss ================================================ @use '../../css/variables' as *; .table-pagination { position: relative; z-index: 5; display: flex; align-items: center; justify-content: center; margin: 12px 0 0; gap: 3px; } /* Page numbers + chevrons */ .table-pg-btn { display: inline-flex; align-items: center; justify-content: center; border: none; background: transparent; color: $black-50; cursor: pointer; font-size: 14px; } .table-pg-btn:hover { background: rgb(255 255 255 / 3%); color: $black-0; } .table-pg-btn.is-active { background: rgb(22 163 74 / 6%); color: $green-30; } /* Larger green chevrons for first/prev/next/last */ .table-pg-btn[aria-label='First page'], .table-pg-btn[aria-label='Previous page'], .table-pg-btn[aria-label='Next page'], .table-pg-btn[aria-label='Last page'] { padding: 0 5px; color: $green-30; font-size: 25px; } /* Disabled state */ .table-pg-btn:disabled { background: transparent; color: $black-50; cursor: not-allowed; opacity: 0.35; } /* Ellipsis */ .table-pg-ellipsis { padding: 0 6px; color: $black-50; font-size: 15px; } ================================================ FILE: src/containers/shared/components/PaginatedTable/test/PaginatedTable.test.tsx ================================================ import { render, screen, fireEvent } from '@testing-library/react' import { PaginatedTable } from '../index' describe('PaginatedTable', () => { const mockTableStructure = (data: any[]) => ( {data.map((item) => ( ))}
    {item.name}
    ) const generateMockData = (count: number) => Array.from({ length: count }, (_, i) => ({ name: `Item ${i + 1}` })) describe('Rendering', () => { it('renders without crashing with empty data', () => { render() expect(screen.queryByRole('navigation')).not.toBeInTheDocument() }) it('renders table with data', () => { const data = generateMockData(5) render() expect(screen.getByText('Item 1')).toBeInTheDocument() expect(screen.getByText('Item 5')).toBeInTheDocument() }) it('does not render pagination when data fits in one page', () => { const data = generateMockData(5) render( , ) expect(screen.queryByRole('navigation')).not.toBeInTheDocument() }) it('renders pagination when data exceeds page size', () => { const data = generateMockData(15) render( , ) expect( screen.getByRole('navigation', { name: 'Table pagination' }), ).toBeInTheDocument() }) }) describe('Pagination controls', () => { it('renders all pagination buttons', () => { const data = generateMockData(15) render( , ) expect(screen.getByLabelText('First page')).toBeInTheDocument() expect(screen.getByLabelText('Previous page')).toBeInTheDocument() expect(screen.getByLabelText('Next page')).toBeInTheDocument() expect(screen.getByLabelText('Last page')).toBeInTheDocument() }) it('disables prev/first buttons on first page', () => { const data = generateMockData(15) render( , ) expect(screen.getByLabelText('First page')).toBeDisabled() expect(screen.getByLabelText('Previous page')).toBeDisabled() expect(screen.getByLabelText('Next page')).not.toBeDisabled() expect(screen.getByLabelText('Last page')).not.toBeDisabled() }) it('disables next/last buttons on last page', () => { const data = generateMockData(15) render( , ) const lastPageButton = screen.getByLabelText('Last page') fireEvent.click(lastPageButton) expect(screen.getByLabelText('First page')).not.toBeDisabled() expect(screen.getByLabelText('Previous page')).not.toBeDisabled() expect(screen.getByLabelText('Next page')).toBeDisabled() expect(screen.getByLabelText('Last page')).toBeDisabled() }) it('marks current page as active', () => { const data = generateMockData(15) render( , ) const page1Button = screen.getByRole('button', { name: '1', current: 'page', }) expect(page1Button).toHaveClass('is-active') }) }) describe('Navigation', () => { it('navigates to next page', () => { const data = generateMockData(25) render( , ) expect(screen.getByText('Item 1')).toBeInTheDocument() expect(screen.queryByText('Item 11')).not.toBeInTheDocument() fireEvent.click(screen.getByLabelText('Next page')) expect(screen.queryByText('Item 1')).not.toBeInTheDocument() expect(screen.getByText('Item 11')).toBeInTheDocument() }) it('navigates to previous page', () => { const data = generateMockData(25) render( , ) fireEvent.click(screen.getByLabelText('Next page')) fireEvent.click(screen.getByLabelText('Previous page')) expect(screen.getByText('Item 1')).toBeInTheDocument() expect(screen.queryByText('Item 11')).not.toBeInTheDocument() }) it('navigates to first page', () => { const data = generateMockData(25) render( , ) fireEvent.click(screen.getByLabelText('Last page')) fireEvent.click(screen.getByLabelText('First page')) expect(screen.getByText('Item 1')).toBeInTheDocument() expect(screen.queryByText('Item 21')).not.toBeInTheDocument() }) it('navigates to last page', () => { const data = generateMockData(25) render( , ) fireEvent.click(screen.getByLabelText('Last page')) expect(screen.queryByText('Item 1')).not.toBeInTheDocument() expect(screen.getByText('Item 21')).toBeInTheDocument() expect(screen.getByText('Item 25')).toBeInTheDocument() }) it('navigates to specific page by clicking page number', () => { const data = generateMockData(30) render( , ) const page2Button = screen.getByRole('button', { name: '2' }) fireEvent.click(page2Button) expect(screen.queryByText('Item 1')).not.toBeInTheDocument() expect(screen.getByText('Item 11')).toBeInTheDocument() expect(screen.getByText('Item 20')).toBeInTheDocument() }) }) describe('Page items display', () => { it('shows all pages when total pages <= 7', () => { const data = generateMockData(70) render( , ) expect(screen.getByRole('button', { name: '1' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '7' })).toBeInTheDocument() expect(screen.queryByText('…')).not.toBeInTheDocument() }) it('shows ellipsis at end when current page <= 4', () => { const data = generateMockData(100) render( , ) expect(screen.getByRole('button', { name: '1' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '5' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '10' })).toBeInTheDocument() expect(screen.getAllByText('…')).toHaveLength(1) }) it('shows ellipsis at start when current page >= total - 3', () => { const data = generateMockData(100) render( , ) fireEvent.click(screen.getByLabelText('Last page')) expect(screen.getByRole('button', { name: '1' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '6' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '10' })).toBeInTheDocument() expect(screen.getAllByText('…')).toHaveLength(1) }) it('shows ellipsis at both ends when in middle pages', () => { const data = generateMockData(100) render( , ) fireEvent.click(screen.getByRole('button', { name: '5' })) expect(screen.getByRole('button', { name: '1' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '3' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '5' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '7' })).toBeInTheDocument() expect(screen.getByRole('button', { name: '10' })).toBeInTheDocument() expect(screen.getAllByText('…')).toHaveLength(2) }) }) describe('Data pagination', () => { it('displays correct data for each page', () => { const data = generateMockData(25) render( , ) // Page 1: Items 1-10 expect(screen.getByText('Item 1')).toBeInTheDocument() expect(screen.getByText('Item 10')).toBeInTheDocument() expect(screen.queryByText('Item 11')).not.toBeInTheDocument() fireEvent.click(screen.getByLabelText('Next page')) // Page 2: Items 11-20 expect(screen.queryByText('Item 10')).not.toBeInTheDocument() expect(screen.getByText('Item 11')).toBeInTheDocument() expect(screen.getByText('Item 20')).toBeInTheDocument() expect(screen.queryByText('Item 21')).not.toBeInTheDocument() fireEvent.click(screen.getByLabelText('Next page')) // Page 3: Items 21-25 expect(screen.queryByText('Item 20')).not.toBeInTheDocument() expect(screen.getByText('Item 21')).toBeInTheDocument() expect(screen.getByText('Item 25')).toBeInTheDocument() }) it('uses custom page size', () => { const data = generateMockData(15) render( , ) expect(screen.getByText('Item 1')).toBeInTheDocument() expect(screen.getByText('Item 5')).toBeInTheDocument() expect(screen.queryByText('Item 6')).not.toBeInTheDocument() }) }) }) ================================================ FILE: src/containers/shared/components/Pagination/Pagination.tsx ================================================ import './pagination.scss' import Arrow from '../../images/right-vector.svg' import DoubleArrow from '../../images/double-right-vector.svg' type Props = { totalItems: number currentPage: number onPageChange: (page: number) => void siblingCount?: number className?: string pageSize?: number scrollToTop?: number | null showLastPage?: boolean } const DOTS = '…' function range(start: number, end: number) { const len = end - start + 1 return Array.from({ length: len }, (_, i) => i + start) } function getPaginationRange({ totalItems, siblingCount, currentPage, pageSize, showLastPage = true, }: { totalItems: number siblingCount: number currentPage: number pageSize: number showLastPage?: boolean }) { const totalPageCount = Math.max(1, Math.ceil(totalItems / pageSize)) const totalPageNumbers = siblingCount * 2 + 5 if (totalPageNumbers >= totalPageCount) { return range(1, totalPageCount) } const leftSiblingIndex = Math.max(currentPage - siblingCount, 1) const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPageCount) const showLeftDots = leftSiblingIndex > 2 const showRightDots = rightSiblingIndex < totalPageCount - 2 const firstPageIndex = 1 const lastPageIndex = totalPageCount // If showLastPage is false, don't show the last page or the dots leading to it if (!showLastPage) { if (!showLeftDots) { const leftItemCount = 3 + 2 * siblingCount const leftRange = range(1, leftItemCount) return [...leftRange, DOTS] } if (showLeftDots) { const rightRange = range( leftSiblingIndex, Math.min(rightSiblingIndex, totalPageCount), ) return [firstPageIndex, DOTS, ...rightRange] } return [ firstPageIndex, DOTS, ...range(leftSiblingIndex, rightSiblingIndex), DOTS, ] } if (!showLeftDots && showRightDots) { const leftItemCount = 3 + 2 * siblingCount const leftRange = range(1, leftItemCount) return [...leftRange, DOTS, lastPageIndex] } if (showLeftDots && !showRightDots) { const rightItemCount = 3 + 2 * siblingCount const rightRange = range(lastPageIndex - rightItemCount + 1, lastPageIndex) return [firstPageIndex, DOTS, ...rightRange] } return [ firstPageIndex, DOTS, ...range(leftSiblingIndex, rightSiblingIndex), DOTS, lastPageIndex, ] } export const Pagination = ({ totalItems, currentPage, onPageChange, siblingCount = 1, className = '', pageSize = 15, scrollToTop = 100, showLastPage = true, }: Props) => { const totalPages = Math.max(1, Math.ceil(totalItems / pageSize)) if (totalPages <= 1) return null const paginationRange = getPaginationRange({ totalItems, siblingCount, currentPage, pageSize, showLastPage, }) const canGoPrev = currentPage > 1 const canGoNext = currentPage < totalPages const handlePageChange = (page: number) => { onPageChange(page) if (scrollToTop !== null && scrollToTop !== undefined) { window.scrollTo({ top: scrollToTop, behavior: 'auto' }) } } return ( ) } ================================================ FILE: src/containers/shared/components/Pagination/index.ts ================================================ export * from './Pagination' ================================================ FILE: src/containers/shared/components/Pagination/pagination.scss ================================================ @use '../../css/variables.scss' as *; .pagination { display: flex; align-items: center; /* vertical centering (optional) */ justify-content: center; /* horizontal centering */ margin: 24px 0; color: $black-50; gap: 8px; user-select: none; .page-list { display: flex; padding: 0; margin: 0; list-style: none; } .page-number, .page-btn, .page-ellipsis { display: flex; align-items: center; justify-content: center; } .page-number, .page-btn { padding: 2px 6px; border: none; background: none; color: $black-50; cursor: pointer; font-size: 14px; opacity: 0.85; } .page-number.active { color: $green-30; } .page-btn[disabled] { display: none; } .page-ellipsis { padding: 0 2px; opacity: 0.6; } .page-size { display: inline-flex; align-items: center; margin-right: 8px; gap: 6px; opacity: 0.85; } .prev { transform: rotate(180deg); transform-box: fill-box; transform-origin: center; } svg { width: 14px; height: 14px; } } ================================================ FILE: src/containers/shared/components/ResponsiveTimestamp/ResponsiveTimestamp.tsx ================================================ import { FC } from 'react' import { convertRippleDate } from '../../../../rippled/lib/convertRippleDate' import './styles.scss' interface ResponsiveTimestampProps { timestamp: number lang: string } export const ResponsiveTimestamp: FC = ({ timestamp, lang, }) => { const date = new Date(convertRippleDate(timestamp)) // Desktop format: "12/15/2023, 10:30:45 AM" const desktopFormat = date.toLocaleString(lang, { month: '2-digit', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit', }) // Mobile format: "12/15/2023 10:30" const mobileFormat = date.toLocaleString(lang, { month: '2-digit', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', hour12: false, }) return (
    {desktopFormat} {mobileFormat}
    ) } ================================================ FILE: src/containers/shared/components/ResponsiveTimestamp/index.ts ================================================ export { ResponsiveTimestamp } from './ResponsiveTimestamp' ================================================ FILE: src/containers/shared/components/ResponsiveTimestamp/styles.scss ================================================ @use '../../css/variables' as *; .responsive-timestamp { .desktop-timestamp { display: inline; @include for-size(phone-only) { display: none; } } .mobile-timestamp { display: none; @include for-size(phone-only) { display: inline; } } } ================================================ FILE: src/containers/shared/components/Sequence.tsx ================================================ import { useTranslation } from 'react-i18next' import { FC } from 'react' import { ACCOUNT_ZERO } from '../transactionUtils' interface SequenceProps { addContextHelp?: boolean sequence?: number ticketSequence?: number account?: string isHook?: boolean } export const Sequence: FC = ({ addContextHelp = false, sequence = 0, ticketSequence = 0, account = '', isHook = false, }) => { const { t } = useTranslation() const isPseudoTransaction = account === ACCOUNT_ZERO || account === '' function getContext() { if (isHook) { return addContextHelp === true ? t('hook_emitted') : t('hook') } return addContextHelp === true ? t('ticket_used') : t('ticket') } return ( {sequence === 0 && !isPseudoTransaction ? ( {ticketSequence} {' ('} {getContext()}) ) : ( sequence )} ) } ================================================ FILE: src/containers/shared/components/SortColumn.tsx ================================================ import React from 'react' import { useTranslation } from 'react-i18next' import { useTooltip } from './Tooltip' import ArrowIcon from '../images/down_arrow.svg' import '../css/sort.scss' import HoverIcon from '../images/hover.svg' type SortOrder = 'asc' | 'desc' interface SortTableProps { field: string label: string sortField: string sortOrder: SortOrder setSortField: (field: string) => void setSortOrder: (order: SortOrder) => void setPage: (page: number) => void tooltip?: boolean alwaysShowArrow?: boolean } const SortTableColumn: React.FC = ({ field, label, sortField, sortOrder, setSortField, setSortOrder, setPage, tooltip = false, alwaysShowArrow = false, }) => { const { showTooltip, hideTooltip } = useTooltip() const { t } = useTranslation() const renderTextTooltip = (key: string, yOffset = 60) => ( { const rect = e.currentTarget.getBoundingClientRect() showTooltip('text', e, t(`${key}_description`, { defaultValue: '' }), { x: rect.left + rect.width / 2, y: rect.top - yOffset, }) }} onMouseLeave={() => hideTooltip()} /> ) const handleClick = () => { if (sortField === field) { setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc') } else { setSortField(field) setSortOrder('desc') } setPage(1) } const isActive = sortField === field const showArrow = isActive || alwaysShowArrow return ( {label} {tooltip && renderTextTooltip(field)} {showArrow && ( )} ) } export default SortTableColumn ================================================ FILE: src/containers/shared/components/Streams/StreamsContext.tsx ================================================ import { contextFactory } from '../../helpers' import { Ledger, Metrics } from './types' import { StreamValidator } from '../../vhsTypes' const [StreamsContext, useStreams] = contextFactory<{ metrics: Metrics ledgers: Record validators: Record }>({ hook: 'useStreams', provider: 'StreamsProvider', }) export { StreamsContext, useStreams } ================================================ FILE: src/containers/shared/components/Streams/StreamsProvider.tsx ================================================ import { FC, PropsWithChildren, useContext, useEffect, useMemo, useRef, useState, } from 'react' import axios from 'axios' import type { LedgerStream, ValidationStream } from 'xrpl' import { AnyJson } from 'xrpl-client' import { useQuery } from 'react-query' import SocketContext from '../../SocketContext' import { getLedger } from '../../../../rippled/lib/rippled' import { convertRippleDate } from '../../../../rippled/lib/convertRippleDate' import { summarizeLedger } from '../../../../rippled/lib/summarizeLedger' import Log from '../../log' import { getNegativeUNL, getQuorum } from '../../../../rippled' import { XRP_BASE } from '../../transactionUtils' import { StreamsContext } from './StreamsContext' import { Ledger, LedgerHash, RunningMetrics } from './types' import { StreamValidator } from '../../vhsTypes' const THROTTLE = 200 const MAX_LEDGERS_SHOWN = 50 const fetchMetrics = () => axios .get('/api/v1/metrics') .then((result) => result.data) .catch((e) => Log.error(e)) const fetchNegativeUNL = async (rippledSocket) => getNegativeUNL(rippledSocket) .then((data) => { if (data === undefined) throw new Error('undefined nUNL') return data }) .catch((e) => { Log.error(e) return [] }) const fetchQuorum = async (rippledSocket): Promise => getQuorum(rippledSocket) .then((data) => { if (data === undefined) throw new Error('undefined quorum') return data }) .catch((e) => Log.error(e)) const truncateLedgers = (ledgers: Record, count) => Object.entries(ledgers) .sort((a, b) => parseInt(b[0], 10) - parseInt(a[0], 10)) .slice(0, count) .reduce((accumulator, [index, ledger]) => { accumulator[index] = ledger return accumulator }, {}) export const StreamsProvider: FC = ({ children }) => { // In custom mode we populate metrics from ledgers loaded into memory const useServerMetrics = process.env.VITE_ENVIRONMENT !== 'custom' const [ledgers, setLedgers] = useState>({}) const ledgersRef = useRef>(ledgers) const firstLedgerRef = useRef(0) const [validators, setValidators] = useState>( {}, ) const validationQueue = useRef([]) const socket = useContext(SocketContext) // metrics const [runningMetrics, setRunningMetrics] = useState({}) const [loadFee, setLoadFee] = useState() const { data: quorum, refetch: refetchQuorum } = useQuery( 'quorum', () => fetchQuorum(socket), { enabled: socket.getState().online }, ) const { data: nUnl, refetch: refetchNUnl } = useQuery( 'nUnl', () => fetchNegativeUNL(socket), { enabled: socket.getState().online }, ) const { data: serverRunningMetrics, refetch: refetchServerRunningMetrics } = useQuery('runningMetrics', () => fetchMetrics()) function addLedger(index: number | string) { // Only add new ledgers that are newer than the last one added. Log.trace(`Processing ledger index: ${index}`, 'StreamsProvider.addLedger') if (!firstLedgerRef.current) { firstLedgerRef.current = Number(index) } if (firstLedgerRef.current > Number(index)) { return } if (!(index in ledgers)) { setLedgers((previousLedgers) => ({ [index]: { index: Number(index), seen: Date.now(), hashes: [], transactions: undefined, txCount: undefined, }, ...truncateLedgers(previousLedgers, MAX_LEDGERS_SHOWN - 1), })) } } function updateMetrics() { const ledgerChain = Object.values(ledgers) .sort((a, b) => a.index - b.index) .slice(-MAX_LEDGERS_SHOWN) let time = 0 let fees = 0 let timeCount = 0 let txCount = 0 let txWithFeesCount = 0 let ledgerCount = 0 ledgerChain.forEach((d, i) => { const next = ledgerChain[i + 1] if (next && next.seen && d.seen) { time += next.seen - d.seen timeCount += 1 } if (d.totalFees) { fees += d.totalFees txWithFeesCount += d.txCount ?? 0 } if (d.txCount) { txCount += d.txCount } ledgerCount += 1 }) setRunningMetrics({ txn_ledger: ledgerCount ? (txCount / ledgerCount).toFixed(2) : undefined, txn_sec: time ? ((txCount / time) * 1000).toFixed(2) : undefined, avg_fee: txWithFeesCount ? (fees / txWithFeesCount).toPrecision(4) : undefined, ledger_interval: timeCount ? (time / timeCount / 1000).toFixed(3) : undefined, }) } function onLedger(data: LedgerStream) { Log.trace( `Processing ledger data: ${JSON.stringify(data)}`, 'StreamsProvider.onLedger', ) if (!ledgersRef.current[data.ledger_index]) { // The ledger closed, but we did not have an existing entry likely because the page just loaded and its // validations came in before we connected to the websocket. addLedger(data.ledger_index) } useServerMetrics ? refetchServerRunningMetrics() : updateMetrics() setLoadFee((data.fee_base / XRP_BASE).toString()) // After each flag ledger we should check the UNL and quorum which are correlated and can only update every flag ledger. if (data.ledger_index % 256 === 0 || !quorum) { refetchNUnl() refetchQuorum() } // use ledger_hash to fetch the complete ledger info from the rippled server. // other fields (like close_time) can be obtained from the response of the `ledger` RPC. getLedger(socket, { ledger_hash: data.ledger_hash }) .then(populateFromLedgerResponse) .catch((error) => { Log.error(error) }) } const populateFromLedgerResponse = (ledger: any) => { Log.trace( `Processing ledger: ${JSON.stringify(ledger)}`, 'StreamsProvider.populateFromLedgerResponse', ) const ledgerSummary = summarizeLedger(ledger) let idx: number // legacy rippled clients (prior to v1.12.0) populate `seqNum` field instead of `ledger_index` if (!Number.isNaN(Number(ledgerSummary.ledger_index))) { idx = Number(ledgerSummary.ledger_index) } else { idx = Number(ledger.seqNum) } if (Number.isNaN(idx)) { Log.error( `Unable to typecast ledger-index to number type: ${ledgerSummary.ledger_index}`, 'StreamsProvider.populateFromLedgerResponse', ) return } setLedgers((previousLedgers) => { const newLedger = Object.assign(previousLedgers[idx] ?? { hashes: [] }, { index: idx, txCount: ledgerSummary.transactions.length, closeTime: convertRippleDate(ledgerSummary.ledger_time), transactions: ledgerSummary.transactions, // Note: Ledger.totalFees is of `number` (primitive javascript) type, whereas ledgerSummary.total_fees is of `Number` type. // Both of these types are compatible with each other: https://stackoverflow.com/questions/67155108/what-is-the-difference-between-number-and-number-in-typescript totalFees: ledgerSummary.total_fees, // fix type }) const matchingHashIndex = newLedger?.hashes.findIndex( (hash) => hash.hash === ledgerSummary.ledger_hash, ) const matchingHash = newLedger?.hashes[matchingHashIndex] if (matchingHash) { matchingHash.validated = true } if (newLedger && matchingHash) { newLedger.hashes[matchingHashIndex] = { ...matchingHash, } } return { ...previousLedgers, [idx]: newLedger } }) } const onValidation = (data: ValidationStream) => { Log.trace( `Processing validation data: ${JSON.stringify(data)}`, 'StreamsProvider.onValidation', ) if (!ledgersRef.current[Number(data.ledger_index)]) { addLedger(data.ledger_index) } if (firstLedgerRef.current <= Number(data.ledger_index)) { validationQueue.current.push(data) } } // Process validations in chunks to make re-renders more manageable. function processValidationQueue() { Log.trace( `Processing validation queue: ${JSON.stringify(validationQueue.current)}`, 'StreamsProvider.processValidationQueue', ) setTimeout(processValidationQueue, THROTTLE) if (validationQueue.current.length < 1) { return } // copy the queue and clear it, so we aren't adding more while processing const queue = [...validationQueue.current] validationQueue.current = [] setLedgers((previousLedgers) => { queue.forEach((validation) => { const ledger = previousLedgers[Number(validation.ledger_index)] const matchingHashIndex = ledger?.hashes.findIndex( (hash) => hash.hash === validation.ledger_hash, ) let matchingHash = ledger?.hashes[matchingHashIndex] as LedgerHash if (!matchingHash) { matchingHash = { hash: validation.ledger_hash, unselected: false, validated: false, validations: [], time: convertRippleDate(validation.signing_time), cookie: validation.cookie, } ledger.hashes.push(matchingHash) } matchingHash.validations = [...matchingHash.validations, validation] if (ledger) { ledger.hashes = [...(ledger?.hashes || [])] ledger.hashes[matchingHashIndex] = { ...matchingHash, } } }) return { ...previousLedgers } }) setValidators((previousValidators) => { const newValidators: any = { ...previousValidators } queue.forEach((validation) => { newValidators[validation.validation_public_key] = { ...previousValidators[validation.validation_public_key], cookie: validation.cookie, ledger_index: Number(validation.ledger_index), ledger_hash: validation.ledger_hash, pubkey: validation.validation_public_key, partial: !validation.full, time: convertRippleDate(validation.signing_time), last: Date.now(), } }) return newValidators }) } useEffect(() => { const interval = setTimeout(processValidationQueue, THROTTLE) if (socket) { socket.send({ command: 'subscribe', streams: ['ledger', 'validations'], }) socket.on('ledger', onLedger as (json: AnyJson) => void) socket.on('validation', onValidation as (json: AnyJson) => void) // Load in the most recent validated ledger to prevent the page from being empty until the next validations come in. getLedger(socket, { ledger_index: 'validated' }) .then(populateFromLedgerResponse) .catch((error) => { Log.error(error) }) } return () => { clearTimeout(interval) if (socket) { socket.send({ command: 'unsubscribe', streams: ['ledger', 'validations'], }) socket.off('ledger', onLedger) socket.off('validation', onValidation) } } // eslint-disable-next-line react-hooks/exhaustive-deps -- this should only run when the socket is connected or disconnected }, []) useEffect(() => { ledgersRef.current = ledgers }, [ledgers]) const value = useMemo( () => ({ ledgers, validators, metrics: { ...(useServerMetrics ? serverRunningMetrics : runningMetrics), load_fee: loadFee, quorum, nUnl, }, }), [ useServerMetrics, ledgers, runningMetrics, serverRunningMetrics, validators, loadFee, quorum, nUnl, ], ) return ( {children} ) } ================================================ FILE: src/containers/shared/components/Streams/index.ts ================================================ export * from './types' export * from './StreamsContext' export * from './StreamsProvider' ================================================ FILE: src/containers/shared/components/Streams/types.ts ================================================ import type { ValidationStream } from 'xrpl' import { TransactionSummary } from '../../types' export type LedgerValidation = ValidationStream & { partial?: boolean } export interface LedgerHash { hash: string validated: boolean unselected: boolean validations: LedgerValidation[] time: number cookie?: string } export interface Ledger { transactions: TransactionSummary[] index: number hashes: LedgerHash[] seen: number txCount?: number closeTime: number totalFees: number } export interface RunningMetrics { txn_sec?: string txn_ledger?: string ledger_interval?: string avg_fee?: string } export interface Metrics extends RunningMetrics { base_fee?: string load_fee?: string nUnl?: string[] quorum?: string } ================================================ FILE: src/containers/shared/components/TVLVolumeChart/TVLVolumeChart.tsx ================================================ import { FC, useState } from 'react' import { useTranslation } from 'react-i18next' import { useWindowSize } from 'usehooks-ts' import { TooltipProps } from 'recharts' import { DualAxisAreaChart, AxisConfig } from '../DualAxisAreaChart' import { Loader } from '../Loader' import { useTooltip } from '../Tooltip' import { parseAmount } from '../../NumberFormattingUtils' import { GREEN_500, PURPLE_500 } from '../../utils' import { CurrencySwitch } from '../CurrencySwitch' import './styles.scss' export interface TVLVolumeDataPoint { date: string tvl: number volume: number } export interface TVLVolumeChartProps { data: TVLVolumeDataPoint[] isLoading: boolean displayCurrency: 'usd' | 'xrp' setDisplayCurrency: (currency: 'usd' | 'xrp') => void onTimeRangeChange: (range: string) => void } const TIME_RANGES = ['1W', '1M', '6M', '1Y', '5Y'] as const const TVL_COLOR = GREEN_500 const VOLUME_COLOR = PURPLE_500 const formatDateTick = (value: string, timeRange: string): string => { const date = new Date(value) if (timeRange === '5Y') { return date.toLocaleDateString('en-US', { year: '2-digit', timeZone: 'UTC', }) } if (timeRange === '1W' || timeRange === '1M') { return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', timeZone: 'UTC', }) } return date.toLocaleDateString('en-US', { month: 'short', year: '2-digit', timeZone: 'UTC', }) } const formatCurrencyTick = ( value: number, currencyMode: 'usd' | 'xrp', ): string => { const prefix = currencyMode === 'usd' ? '$' : '' if (value === 0) { return `${prefix}0` } if (value >= 1000000) { return `${prefix}${(value / 1000000).toFixed(1)}M` } if (value >= 1000) { return `${prefix}${(value / 1000).toFixed(0)}K` } return `${prefix}${value.toFixed(0)}` } export const TVLVolumeChart: FC = ({ data, isLoading, displayCurrency, setDisplayCurrency, onTimeRangeChange, }) => { const { t } = useTranslation() const { showTooltip, hideTooltip } = useTooltip() const { width: windowWidth = 1200 } = useWindowSize() const [timeRange, setTimeRange] = useState('6M') const [showTVL, setShowTVL] = useState(true) const [showVolume, setShowVolume] = useState(true) const handleTimeRangeChange = (range: string) => { setTimeRange(range) onTimeRangeChange(range) } const isSmallScreen = windowWidth < 600 const chartMargin = isSmallScreen ? { top: 10, right: 10, left: 10, bottom: 0 } : { top: 10, right: 50, left: 50, bottom: 0 } const chartTickFontSize = isSmallScreen ? 10 : 13 const formatTooltipValue = (value: number | string) => { const num = Number(value) const formatted = parseAmount(num) return displayCurrency === 'usd' ? `$${formatted}` : `${formatted} XRP` } const renderTooltip = ({ active, payload, label, }: TooltipProps) => { if (active && payload && payload.length > 0) { const date = new Date(label as string) const formattedDate = date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', timeZone: 'UTC', }) return (

    {formattedDate}

    {payload.map((entry) => (

    {entry.name}: {formatTooltipValue(entry.value ?? 0)}

    ))}
    ) } return null } const chartData = data const leftAxis: AxisConfig = { dataKey: 'tvl', label: 'TVL', color: TVL_COLOR, formatter: (value: number) => formatCurrencyTick(value, displayCurrency), show: showTVL, } const rightAxis: AxisConfig = { dataKey: 'volume', label: 'Volume', color: VOLUME_COLOR, formatter: (value: number) => formatCurrencyTick(value, displayCurrency), show: showVolume, } return (

    {t('tvl_and_volume')}

    {/* Controls row: toggle + checkboxes */}
    setDisplayCurrency(value === 'USD' ? 'usd' : 'xrp') } />
    {TIME_RANGES.map((range) => ( ))}
    {isLoading ? ( ) : ( formatDateTick(value, timeRange)} leftAxis={leftAxis} rightAxis={rightAxis} tooltipContent={renderTooltip} margin={chartMargin} tickFontSize={chartTickFontSize} /> )}
    { const rect = e.currentTarget.getBoundingClientRect() showTooltip('text', e, t('tvl_tooltip' as any), { x: rect.left + rect.width / 2, y: rect.top - 60, }) }} onFocus={() => {}} onMouseLeave={() => hideTooltip()} > {t('tvl')}
    {t('volume')}
    ) } ================================================ FILE: src/containers/shared/components/TVLVolumeChart/index.ts ================================================ export { TVLVolumeChart } from './TVLVolumeChart' ================================================ FILE: src/containers/shared/components/TVLVolumeChart/styles.scss ================================================ @use '../../css/variables' as *; $tvl-color: #32e685; $volume-color: #7919ff; .tvl-volume-section { margin-bottom: 50px; .chart-section-title { padding-bottom: 0; border-bottom: none; margin: 0 0 16px; color: $white; font-size: 16px; @include bold; @include for-size(tablet-portrait-up) { margin: 0 0 20px; font-size: 18px; } @include for-size(desktop-up) { font-size: 20px; } } // ── Controls row: toggle + checkboxes ── .controls { display: flex; flex-wrap: wrap; align-items: center; margin-bottom: 12px; gap: 16px; @include for-size(tablet-portrait-up) { margin-bottom: 16px; gap: 24px; } @include for-size(desktop-up) { gap: 42px; } } .filter-checkbox { display: flex; align-items: center; color: $white; cursor: pointer; font-size: 14px; gap: 8px; @include medium; @include for-size(tablet-portrait-up) { font-size: 16px; gap: 12px; } input[type='checkbox'] { display: none; } .checkbox-custom { position: relative; display: flex; width: 20px; height: 20px; flex-shrink: 0; align-items: center; justify-content: center; border: 1px solid $green-60; border-radius: 4px; background-color: transparent; transition: all 0.2s; @include for-size(desktop-up) { width: 22px; height: 22px; } &::after { position: absolute; display: none; width: 5px; height: 10px; border: solid $black-100; border-width: 0 2px 2px 0; margin-top: -2px; content: ''; transform: rotate(45deg); } } &:hover .checkbox-custom { border-color: $green; } input[type='checkbox']:checked + .checkbox-custom { border-color: $blue; background-color: $blue; &::after { display: block; } } } } .tvl-volume-chart-container { padding: 16px 12px; border: 1px solid $black-60; border-radius: $border-radius; background-color: $black-80; @include for-size(desktop-up) { padding: 32px; } .chart-header { display: flex; justify-content: flex-end; margin-bottom: 16px; @include for-size(desktop-up) { margin-bottom: 24px; } } .time-filters { display: flex; gap: 8px; @include for-size(tablet-portrait-up) { gap: 12px; } @include for-size(desktop-up) { gap: 16px; } .time-filter { display: flex; width: 40px; align-items: center; justify-content: center; padding: 6px; border: 1px solid $black-50; border-radius: $border-radius; background-color: $black; color: $white; cursor: pointer; font-size: 12px; transition: all 0.15s; @include regular; @include for-size(tablet-portrait-up) { width: 50px; padding: 8px; font-size: 14px; } &:hover { border-color: $black-40; background-color: $black-80; } &.active { border-color: $blue; background-color: $blue; color: $white; @include bold; } } } .chart-tooltip { padding: 10px 14px; border: 1px solid $black-60; border-radius: $border-radius; background: $black-80; .tooltip-label { margin: 0 0 6px; color: $black-40; font-size: 12px; } .tooltip-value { margin: 2px 0; font-size: 13px; @include semibold; } } .chart-legend { display: flex; justify-content: center; margin-top: 12px; gap: 24px; } .legend-item { display: flex; align-items: center; color: $white; font-size: 11px; gap: 6px; @include for-size(tablet-portrait-up) { font-size: 13px; gap: 8px; } } .legend-color { width: 12px; height: 12px; flex-shrink: 0; border-radius: 3px; @include for-size(tablet-portrait-up) { width: 14px; height: 14px; } &.tvl-color { background: $tvl-color; } &.volume-color { background: $volume-color; } } } ================================================ FILE: src/containers/shared/components/TVLVolumeChart/test/TVLVolumeChart.test.tsx ================================================ import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../../i18n/testConfig' import { TVLVolumeChart } from '../TVLVolumeChart' import { TooltipProvider } from '../../Tooltip' // ResizeObserver is not available in jsdom (required by recharts ResponsiveContainer) function MockResizeObserver() { return { observe: jest.fn(), unobserve: jest.fn(), disconnect: jest.fn() } } beforeAll(() => { global.ResizeObserver = MockResizeObserver as unknown as typeof ResizeObserver }) const mockData = [ { date: '2026-03-25', tvl: 7000000, volume: 700 }, { date: '2026-03-26', tvl: 7100000, volume: 800 }, { date: '2026-03-27', tvl: 7200000, volume: 550 }, ] interface RenderProps { data?: { date: string; tvl: number; volume: number }[] isLoading?: boolean displayCurrency?: 'usd' | 'xrp' setDisplayCurrency?: (currency: 'usd' | 'xrp') => void onTimeRangeChange?: (range: string) => void } const renderComponent = ({ data = mockData, isLoading = false, displayCurrency = 'usd', setDisplayCurrency = jest.fn(), onTimeRangeChange = jest.fn(), }: RenderProps = {}) => render( , ) describe('TVLVolumeChart', () => { it('renders chart section title', () => { renderComponent() expect(screen.getByText('tvl_and_volume')).toBeInTheDocument() }) it('renders currency toggle labels', () => { renderComponent() expect(screen.getByText('USD')).toBeInTheDocument() expect(screen.getByText('XRP')).toBeInTheDocument() }) it('renders TVL and Volume checkboxes', () => { renderComponent() const checkboxes = screen.getAllByRole('checkbox') // Toggle + TVL checkbox + Volume checkbox = 3 expect(checkboxes.length).toBe(3) }) it('renders all time range buttons', () => { renderComponent() expect(screen.getByText('1W')).toBeInTheDocument() expect(screen.getByText('1M')).toBeInTheDocument() expect(screen.getByText('6M')).toBeInTheDocument() expect(screen.getByText('1Y')).toBeInTheDocument() expect(screen.getByText('5Y')).toBeInTheDocument() }) it('calls onTimeRangeChange when a time range button is clicked', async () => { const onTimeRangeChange = jest.fn() renderComponent({ onTimeRangeChange }) await userEvent.click(screen.getByText('1W')) expect(onTimeRangeChange).toHaveBeenCalledWith('1W') }) it('calls setDisplayCurrency when toggle is clicked', async () => { const setDisplayCurrency = jest.fn() renderComponent({ setDisplayCurrency }) const toggle = screen.getByLabelText('Toggle currency') await userEvent.click(toggle) expect(setDisplayCurrency).toHaveBeenCalledWith('xrp') }) it('renders chart legend', () => { renderComponent() const legends = document.querySelectorAll('.legend-text') expect(legends.length).toBe(2) }) it('shows loader when isLoading is true', () => { renderComponent({ isLoading: true, data: [] }) expect(screen.getByRole('img', { name: /loading/i })).toBeInTheDocument() }) }) ================================================ FILE: src/containers/shared/components/Tabs.tsx ================================================ import { useTranslation } from 'react-i18next' import { Link } from 'react-router' import '../css/tabs.scss' interface TabConfig { id: string labelKey: string onTabClick?: () => void } interface Props { path?: string selected: string tabs: string[] | TabConfig[] onTabChange?: (tabId: string) => void } export const Tabs = ({ tabs, selected, path, onTabChange }: Props) => { const { t } = useTranslation() // Normalize tabs to TabConfig format const normalizedTabs: TabConfig[] = tabs.map((tab) => { if (typeof tab === 'string') { return { id: tab, labelKey: tab.replace('-', '_'), } } return tab }) // If path is provided, use routing-based tabs (original behavior) if (path) { const items = normalizedTabs.map((tab) => { const className = selected === tab.id ? 'tab selected' : 'tab' const title = t(tab.labelKey as any) return ( {title} ) }) return
    {items}
    } // Otherwise, use state-based tabs with onTabChange callback const items = normalizedTabs.map((tab) => { const className = selected === tab.id ? 'tab selected' : 'tab' const title = t(tab.labelKey as any) const handleClick = () => { onTabChange?.(tab.id) tab.onTabClick?.() } return ( ) }) return
    {items}
    } ================================================ FILE: src/containers/shared/components/TokenSearchResults/TokenSearchResults.tsx ================================================ import { useContext } from 'react' import './styles.scss' import { useTranslation } from 'react-i18next' import axios from 'axios' import { useQuery } from 'react-query' import { useAnalytics } from '../../analytics' import { TokenSearchRow } from './TokenSearchRow' import SocketContext from '../../SocketContext' import Log from '../../log' import { getAccountLines } from '../../../../rippled/lib/rippled' import { FETCH_INTERVAL_XRP_USD_ORACLE_MILLIS, ORACLE_ACCOUNT, } from '../../utils' import { LOSToken } from '../../losTypes' interface SearchResultsProps { currentSearchValue: string setCurrentSearchInput: (string) => void } const SearchResults = ({ currentSearchValue, setCurrentSearchInput, }: SearchResultsProps): JSX.Element | null => { const analytics = useAnalytics() const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const { data: XRPUSDPrice = 0.0 } = useQuery( ['fetchXRPToUSDRate'], () => fetchXRPToUSDRate(), { refetchInterval: FETCH_INTERVAL_XRP_USD_ORACLE_MILLIS, onError: (error) => { Log.error(error) return 0.0 }, }, ) const { data: tokens = [] } = useQuery( ['fetchTokens', currentSearchValue], () => fetchTokens(), { enabled: !!currentSearchValue, staleTime: 0, keepPreviousData: false, onError: (error) => Log.error(error), }, ) const fetchXRPToUSDRate = () => getAccountLines(rippledSocket, ORACLE_ACCOUNT, 1).then( (accountLines) => accountLines.lines[0]?.limit ?? 0.0, ) const fetchTokens = () => { if (currentSearchValue === '') { return [] // Return an empty list if search is cleared } return axios .get(`/api/v1/tokens/search/${currentSearchValue}`) .then((response) => response.data.tokens) } const onLinkClick = () => { analytics.track('token_search_click', { search_category: 'token', search_term: currentSearchValue, }) // clear current search on navigation setCurrentSearchInput('') } return tokens.length > 0 ? (
    {t('tokens')} ({tokens.length})
    {tokens.map((token) => ( ))}
    ) : null } export default SearchResults ================================================ FILE: src/containers/shared/components/TokenSearchResults/TokenSearchRow.tsx ================================================ import { Link } from 'react-router' import { useTranslation } from 'react-i18next' import { FC } from 'react' import { Amount } from '../Amount' import { localizeNumber } from '../../utils' import Currency from '../Currency' import DomainLink from '../DomainLink' import { LOSToken } from '../../losTypes' const parsePrice = (dollarPrice: string, xrpPrice: number): number => { const parsedDollar = Number(dollarPrice) return Number((parsedDollar * xrpPrice).toFixed(6)) } const DEFAULT_VALUE = '--' const TokenLogo: FC<{ token: LOSToken }> = ({ token }) => token && token.icon ? (
    ) : (
    ) const TokenName: FC<{ token: LOSToken }> = ({ token }) => token && token.name ? (
    ({token.name.trim().toUpperCase().replace('(', '').replace(')', '')})
    ) : null const IssuerAddress: FC<{ token: LOSToken; onClick: any }> = ({ token, onClick, }) => token && token.issuer_account ? (
    {token.issuer_name && `${token.issuer_name} (`}
    {token.issuer_account}
    {token.issuer_name &&
    )
    } ) : null interface SearchResultRowProps { token: LOSToken onClick: () => void xrpPrice: number } export const TokenSearchRow = ({ token, onClick, xrpPrice, }: SearchResultRowProps): JSX.Element => { const { t } = useTranslation() return (
    {token.price ? ( ) : (
    {DEFAULT_VALUE}
    )}
    {t('holders_count', { holders: localizeNumber(token.holders), })}
    {t('trustlines', { trustlines: localizeNumber(token.trustlines), })}
    {t('issuer')}:
    {token.issuer_domain && ( <>
    {t('website')}:
    )}
    ) } ================================================ FILE: src/containers/shared/components/TokenSearchResults/styles.scss ================================================ @use '../../css/variables' as *; .search-results-menu { position: absolute; z-index: 1; width: 100%; max-height: 400px; border: 1px solid $black-80; border-radius: 8px; border-top: 0px; margin-top: 6px; background-color: $black-100; box-shadow: 2px 2px 15px 0px rgb(131 131 134 / 30%); overflow-wrap: anywhere; overflow-y: scroll; scrollbar-color: $black-50 transparent; scrollbar-width: thin; @media (width < 900px) { max-width: calc(100% - 32px); } } .search-results-header { padding: 0.5rem 0rem 0.5rem 1rem; background-color: $black-80; font-size: 14px; font-weight: 500; } .result-row-icon { width: 1.5rem; height: 1.5rem; border-radius: 16px; } .no-logo { border-radius: 50%; background-color: $black-50; } .result-currency { flex-shrink: 0; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; white-space: nowrap; } .result-token-name { padding-top: 2px; padding-bottom: 2px; margin-left: 3px; } .result-logo { padding-right: 14px; padding-left: 1rem; } .search-result-row { position: relative; display: flex; width: 100%; box-sizing: border-box; padding-top: 13px; padding-bottom: 13px; color: $black-0; font-size: 14px; font-weight: 500; &:hover { background-color: $black-70; color: $black-0; cursor: pointer; } } .result-name-line { display: flex; flex-wrap: wrap; align-items: center; margin-bottom: 0.5rem; white-space: nowrap; } .result-issuer-line { display: flex; overflow: hidden; padding: 0 1rem; margin-bottom: 0.5rem; color: $black-50; } .result-website-line { display: flex; flex-direction: row; padding: 0 1rem; color: $black-50; } .metric-chip { padding: 2px 12px; border: 1px solid $black-70; border-radius: 100px; margin-right: 8px; margin-left: 8px; background-color: $black-100; font-size: 12px; font-weight: 600; &:hover { background-color: $black-100; cursor: pointer; } } .issuer-link { display: inline-flex !important; overflow: hidden; margin-left: 0.25rem; color: $black-50; &:hover { background: transparent; color: $blue-purple-30; } } .issuer-address { @extend %truncate; } .issuer-name, .issuer-title { flex-shrink: 0; } .result-domain-link { margin-left: 0.25rem; } ================================================ FILE: src/containers/shared/components/TokenSearchResults/test/TokenSearchResults.test.js ================================================ import { render, cleanup, waitFor } from '@testing-library/react' import moxios from 'moxios' import i18n from '../../../../../i18n/testConfig' import testTokens from './mock_data/tokens.json' import SocketContext from '../../../SocketContext' import SearchResults from '../TokenSearchResults' import MockWsClient from '../../../../test/mockWsClient' import { QuickHarness, flushPromises } from '../../../../test/utils' const testQuery = 'test' describe('Testing tokens search', () => { let client const renderSearchResults = () => { const searchURL = `/api/v1/tokens/search/${testQuery}` moxios.stubRequest(searchURL, { status: 200, response: testTokens, }) return render( , ) } beforeEach(() => { moxios.install() client = new MockWsClient() }) afterEach(() => { client.close() moxios.uninstall() cleanup() }) it('renders without crashing', async () => { const { container } = renderSearchResults() await flushPromises() await waitFor(() => { expect(container.querySelectorAll('.search-results-menu').length).toEqual( 1, ) }) }) it('renders all tokens ', async () => { const { container } = renderSearchResults() await flushPromises() await waitFor(() => { expect( container.querySelector('.search-results-menu .search-results-header'), ).toBeInTheDocument() }) const searchMenu = container.querySelector('.search-results-menu') expect(searchMenu.querySelector('.search-results-header').outerHTML).toBe( `
    tokens (1)
    `, ) expect(searchMenu.querySelector('.currency').outerHTML).toBe( `SOLO`, ) expect(searchMenu.querySelector('.issuer-name').outerHTML).toBe( `
    Sologenic (
    `, ) expect(searchMenu.querySelector('.issuer-address').outerHTML).toBe( `
    rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz
    `, ) expect( searchMenu .querySelector('.search-result-row') .querySelectorAll('.metric-chip').length, ).toEqual(3) expect(searchMenu.querySelector('.domain').outerHTML).toBe( `sologenic.com`, ) }) }) ================================================ FILE: src/containers/shared/components/TokenSearchResults/test/mock_data/tokens.json ================================================ { "tokens": [ { "price_change": -3.31881203079154, "issuer_name": "Sologenic", "currency": "534F4C4F00000000000000000000000000000000", "daily_trades": "549", "icon": "https://s1.xrplmeta.org/icon/C40439709A.png", "ttl": 1755388960, "social_links": [], "name": "SOLO", "tvl_xrp": 603524.60505, "issuer_account": "rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz", "market_cap": "44282163.354157", "holders": 218547, "circ_supply": "398974338.612327", "issuer_domain": "sologenic.com", "daily_volume": "35991.7343289996", "supply": "398974338.612327", "trustlines": 283772, "trust_level": 3, "price": "0.110990003788651" } ] } ================================================ FILE: src/containers/shared/components/TokenTableRow.tsx ================================================ export interface TokenTableRowProps { label: string value: any } export const TokenTableRow = (props: TokenTableRowProps) => { const { label, value } = props return ( {label} {value} ) } ================================================ FILE: src/containers/shared/components/Tooltip/Tooltip.tsx ================================================ import { CSSProperties } from 'react' import { useTranslation } from 'react-i18next' import successIcon from '../../images/success.png' import { localizeDate } from '../../utils' import '../../css/tooltip.scss' import { TxStatus } from '../TxStatus' import { TxLabel } from '../TxLabel' import { useLanguage } from '../../hooks' const PADDING_Y = 20 const DATE_OPTIONS = { hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true, } export interface TooltipInstance { data?: any mode: string x: number y: number } export const Tooltip = ({ tooltip }: { tooltip?: TooltipInstance }) => { const { t } = useTranslation() const language = useLanguage() if (!tooltip) { // eslint-disable-next-line react/jsx-no-useless-fragment return <> } const { data } = tooltip const renderNegativeUnlTooltip = () => data.nUnl.map((key) => { const short = key.substring(0, 8) return
    {`${short}...`}
    }) const renderValidatorTooltip = () => { const { v = {}, pubkey, time } = data const key = v.master_key || pubkey return ( <>
    {v.domain}
    {key}
    {localizeDate(time, language, DATE_OPTIONS)}
    {v.unl && (
    {v.unl} {v.unl}
    )} ) } const renderTxTooltip = () => { const { type, result, account } = data return ( <>
    {account}
    ) } const renderMissingValidators = () => ( <>
    {t('missing')}:
    {data.missing.map((d) => (
    {d.domain || d.master_key}
    ))} ) const renderNFTId = () =>
    {data.tokenId}
    const renderMPTId = () =>
    {data.tokenId}
    const renderText = () =>
    {data}
    const { x, y, mode } = tooltip const style: CSSProperties = { top: y + PADDING_Y, left: x } const modeMap = { validator: renderValidatorTooltip, tx: renderTxTooltip, nUnl: renderNegativeUnlTooltip, missing: renderMissingValidators, nftId: renderNFTId, mptId: renderMPTId, text: renderText, } return modeMap[mode] ? (
    {modeMap[mode]()}
    ) : null } ================================================ FILE: src/containers/shared/components/Tooltip/index.ts ================================================ export * from './Tooltip' export * from './useTooltip' ================================================ FILE: src/containers/shared/components/Tooltip/useTooltip.tsx ================================================ import { createContext, Dispatch, FC, MouseEvent, PropsWithChildren, SetStateAction, useContext, useMemo, useState, } from 'react' export interface TooltipContextType { tooltip?: any setTooltip: Dispatch> hideTooltip: () => void showTooltip: ( mode: string, event: MouseEvent | MouseEvent, data: any, positionOverride?: { x: number; y: number }, ) => void } export const TooltipContext = createContext({ tooltip: undefined, setTooltip: (tt: SetStateAction) => tt, hideTooltip: () => {}, showTooltip: () => {}, }) export const TooltipProvider: FC = ({ children }) => { const [tooltip, setTooltip] = useState() const hideTooltip = () => setTooltip(undefined) const showTooltip = ( mode: string, event: MouseEvent, data: any, positionOverride?: { x: number; y: number }, ) => { setTooltip({ data, mode, x: positionOverride?.x ?? (event.currentTarget instanceof HTMLElement ? event.currentTarget.offsetLeft : event.nativeEvent.offsetX), y: positionOverride?.y ?? (event.currentTarget instanceof HTMLElement ? event.currentTarget.offsetTop : event.nativeEvent.offsetY), }) } const tooltipValues = useMemo( () => ({ tooltip, setTooltip, hideTooltip, showTooltip, }), [tooltip], ) return ( {children} ) } export const useTooltip = (): TooltipContextType => useContext(TooltipContext) ================================================ FILE: src/containers/shared/components/Transaction/AMMBid/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { Account } from '../../Account' import { Amount } from '../../Amount' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const { ammAccountID, bidMin, bidMax, authAccounts } = data.instructions return ( <> {ammAccountID && ( )} {bidMin && ( )} {bidMax && ( )} {authAccounts && ( {authAccounts.map((accID: string) => ( ))} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/AMMBid/index.ts ================================================ import { Simple } from './Simple' import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { parser } from './parser' export const AMMBid: TransactionMapping = { Simple, action: TransactionAction.MODIFY, category: TransactionCategory.DEX, parser, } ================================================ FILE: src/containers/shared/components/Transaction/AMMBid/parser.ts ================================================ import { getAMMAccountID, getAuthAccounts } from '../../../metaParser' function getMinBid(tx: any) { return tx.BidMin ? { currency: 'LP', issuer: tx.BidMin.issuer, amount: tx.BidMin.value } : undefined } function getMaxBid(tx: any) { return tx.BidMax ? { currency: 'LP', issuer: tx.BidMax.issuer, amount: tx.BidMax.value } : undefined } export function parser(tx: any, meta: any) { const ammAccountID = getAMMAccountID(meta) const bidMin = getMinBid(tx) const bidMax = getMaxBid(tx) const authAccounts = getAuthAccounts(tx) return { ammAccountID, bidMin, authAccounts, bidMax, } } ================================================ FILE: src/containers/shared/components/Transaction/AMMBid/test/AMMBid.test.tsx ================================================ import { Simple } from '../Simple' import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import bidMock from './mock_data/amm_bid.json' describe('AMM Bid Tests', () => { const renderComponent = createSimpleRenderFactory(Simple) it('renders from transaction', () => { const { container, unmount } = renderComponent(bidMock) expectSimpleRowText( container, 'min_slot_price', '100.00 LP.rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W', ) expectSimpleRowText( container, 'max_slot_price', '500.00 LP.rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W', ) expectSimpleRowText( container, 'account_id', 'rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W', ) expectSimpleRowText( container, 'auth_accounts', 'ra8uHq2Qme5j19TqvPzTE2nqT12Zc3xJmKrU6o2YguZi847RaiH2QGTkL4eZWZjbxZvk', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AMMBid/test/mock_data/amm_bid.json ================================================ { "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "9173773.260640362" }, "Flags": 65536, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "32951EDAF938635BE23319144E5420B4F2D19E81483B5759F535FEF0730AF797", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "9173965.000290365" } }, "PreviousTxnID": "62969AAF44C876412326B11782FA709851AD400568FD7C329D38D7F94F6E83CD", "PreviousTxnLgrSeq": 318596 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Balance": "991642540761", "Flags": 8388608, "OwnerCount": 2, "Sequence": 14 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "53383A918D45DEF78DED23CE5141C0FAB44661D602465F5FCFC487792448F1E2", "PreviousFields": { "Balance": "991642540771", "Sequence": 13 }, "PreviousTxnID": "62969AAF44C876412326B11782FA709851AD400568FD7C329D38D7F94F6E83CD", "PreviousTxnLgrSeq": 318596 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "AuctionSlot": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "DiscountedFee": 0, "Expiration": 723254240, "Price": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "191.7396500029036" } }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "19173773.26064036" }, "TradingFee": 0 }, "LedgerEntryType": "AMM", "LedgerIndex": "C7FD06649235AF4CABD8FA6D8BB0CAF6C6EA5038A74D0DDD5025290683636D02", "PreviousFields": { "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "19173965.00029036" } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "BidMin": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "100" }, "BidMax": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "500" }, "AuthAccounts": [ { "AuthAccount": { "Account": "ra8uHq2Qme5j19TqvPzTE2nqT12Zc3xJmK" } }, { "AuthAccount": { "Account": "rU6o2YguZi847RaiH2QGTkL4eZWZjbxZvk" } } ], "Fee": "10", "Flags": 0, "Sequence": 13, "SigningPubKey": "023CFED4018084296285DD8A321C099134B9CF6DCD8D91DC067BABCFF0E3F2BE1A", "TransactionType": "AMMBid", "TxnSignature": "3045022100A808321D7E4532354ECD848050B2BBB49978B0E96E3048E5EBD95C4CD05A4DF9022037796FC79058C7F4940AE5B0DE8D5A3B8561098621AA01FD36845FF4F1F1BF9F", "date": "2022-11-30T23:57:21Z" } } ================================================ FILE: src/containers/shared/components/Transaction/AMMClawback/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Account } from '../../Account' import { Amount } from '../../Amount' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const { amount2, amount, holder } = data.instructions return ( <> {amount && ( )} {amount2 && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/AMMClawback/TableDetail.tsx ================================================ import { Trans, useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import { Account } from '../../Account' import { TransactionTableDetailProps } from '../types' export const TableDetail = ({ instructions }: TransactionTableDetailProps) => { const { t } = useTranslation() const { amount2, amount, holder } = instructions if (amount2) { return (
    {t('claws_back')} and from
    ) } return (
    {t('claws_back')} from
    ) } ================================================ FILE: src/containers/shared/components/Transaction/AMMClawback/index.ts ================================================ import { Simple } from './Simple' import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { parser } from './parser' import { TableDetail } from './TableDetail' export const AMMClawback: TransactionMapping = { TableDetail, Simple, action: TransactionAction.CANCEL, category: TransactionCategory.DEX, parser, } ================================================ FILE: src/containers/shared/components/Transaction/AMMClawback/parser.ts ================================================ import type { AMMClawback } from 'xrpl' import { findAssetAmount } from '../../../metaParser' export function parser(tx: AMMClawback, meta: any) { const account = tx.Account const holder = tx.Holder const amount = findAssetAmount(meta, tx.Asset, tx) if (tx.Flags) { // @ts-expect-error - MPT is not being supported for AMM transactions until https://github.com/XRPLF/rippled/pull/5285 is merged const amount2 = findAssetAmount(meta, tx.Asset2, tx) return { amount, account, amount2, holder, } } return { amount, account, holder, } } ================================================ FILE: src/containers/shared/components/Transaction/AMMClawback/test/AMMClawbackSimple.test.tsx ================================================ import { expectSimpleRowNotToExist, expectSimpleRowText } from '../../test' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockAMMClawbackNoFlag from './mock_data/withoutFlag.json' import mockAMMClawbackWithAmount from './mock_data/withAmount.json' import mockAMMClawbackWithFlag from './mock_data/withFlag.json' const renderSimple = createSimpleRenderFactory(Simple) describe('AMMClawback: Simple', () => { it('renders without tfClawTwoAssets flag, only one asset should be clawed back', () => { const { container } = renderSimple(mockAMMClawbackNoFlag) expectSimpleRowText( container, 'asset1', '$260.00 USD.rGGjMesMUrRMP8ZkLZ2cZ5agzmFwBfT4f2', ) expectSimpleRowNotToExist(container, 'asset2') expectSimpleRowText( container, 'holder', 'rJk5n4egp7Th4Y4vxAMVAbf1ziuiFuVKiw', ) }) it('renders with tfClawTwoAssets flag, both asset should be clawed back', () => { const { container } = renderSimple(mockAMMClawbackWithFlag) expectSimpleRowText( container, 'asset1', '$260.00 USD.rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk', ) expectSimpleRowText( container, 'asset2', '100.00 YEN.rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk', ) expectSimpleRowText( container, 'holder', 'r4eWC5DixP74dpk7FDzXcap1BJ2NaoUeZN', ) }) it('renders with Amount set', () => { const { container } = renderSimple(mockAMMClawbackWithAmount) expectSimpleRowText( container, 'asset1', '$20.00 USD.rK2Du3gUmFbg5UFFHFq9LKywVuGbqNsyyi', ) }) }) ================================================ FILE: src/containers/shared/components/Transaction/AMMClawback/test/AMMClawbackTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import AMMClawbackNoFlag from './mock_data/withoutFlag.json' import AMMClawbackWithFlag from './mock_data/withFlag.json' import mockAMMClawbackWithAmount from './mock_data/withAmount.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('AMMClawback: TableDetail', () => { it('renders without tfClawTwoAssets flag, only one asset should be clawed back', () => { const { container, unmount } = renderComponent(AMMClawbackNoFlag) expect(container).toHaveTextContent( 'claws_back' + '$260.00 USD.rGGjMesMUrRMP8ZkLZ2cZ5agzmFwBfT4f2' + 'from' + 'rJk5n4egp7Th4Y4vxAMVAbf1ziuiFuVKiw', ) unmount() }) it('renders without tfClawTwoAssets flag, both assets should be clawed back', () => { const { container, unmount } = renderComponent(AMMClawbackWithFlag) expect(container).toHaveTextContent( 'claws_back' + '$260.00 USD.rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk' + 'and' + '100.00 YEN.rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk' + 'from' + 'r4eWC5DixP74dpk7FDzXcap1BJ2NaoUeZN', ) unmount() }) it('renders with Amount set', () => { const { container, unmount } = renderComponent(mockAMMClawbackWithAmount) expect(container).toHaveTextContent( 'claws_back' + '$20.00 USD.rK2Du3gUmFbg5UFFHFq9LKywVuGbqNsyyi' + 'from' + 'rJbLyxGA3jvwrFmiouADLHMKaBQn46SVZi', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AMMClawback/test/mock_data/withAmount.json ================================================ { "tx": { "Account": "rK2Du3gUmFbg5UFFHFq9LKywVuGbqNsyyi", "Amount": { "currency": "USD", "issuer": "rK2Du3gUmFbg5UFFHFq9LKywVuGbqNsyyi", "value": "20" }, "Asset": { "currency": "USD", "issuer": "rK2Du3gUmFbg5UFFHFq9LKywVuGbqNsyyi" }, "Asset2": { "currency": "XRP" }, "Fee": "12", "Flags": 0, "Holder": "rJbLyxGA3jvwrFmiouADLHMKaBQn46SVZi", "LastLedgerSequence": 230970, "Sequence": 230944, "SigningPubKey": "ED723B12E122AA8FCD9C627C47F086F03F3A159694F95704B3B10600CE51D9FD08", "TransactionType": "AMMClawback", "TxnSignature": "1114A1D07FDAEE942023DB1CE24434AD9E2D3FE35CDB7F7AD4D997B476BD615DB4C6853B689802070C420D9AF7D58761A3D0C88226C61DE636E074B35C520C0A", "ctid": "C003862800200002", "date": 1739312961000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rK2Du3gUmFbg5UFFHFq9LKywVuGbqNsyyi", "Balance": "99999952", "Flags": 2155872256, "OwnerCount": 0, "Sequence": 230945 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0DBF627C1E345907877801F17D8600F6070488B4E11A25EF91ED80F9B4C47023", "PreviousFields": { "Balance": "99999964", "Sequence": 230944 }, "PreviousTxnID": "68DEA274DFA1E2D8540BF40B12EA882901EF7049DF562F507187D8FFD52CD56A", "PreviousTxnLgrSeq": 230949 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "240.0000000000002" }, "Flags": 16842752, "HighLimit": { "currency": "USD", "issuer": "rK2Du3gUmFbg5UFFHFq9LKywVuGbqNsyyi", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ravwv8VvsaoXuHsjaKZLd5C84X2x79sr8T", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "26DD7487583BF2BCA6CD8BCBD140CF7CD1C1AA06068BB199534F7CCD47438F23", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "260.0000000000002" } }, "PreviousTxnID": "168EDD75D0A5C349960557C7C5613100389C1FE9544E8A83767F7EA17D8EEACA", "PreviousTxnLgrSeq": 230950 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJbLyxGA3jvwrFmiouADLHMKaBQn46SVZi", "Balance": "99799745", "Flags": 0, "OwnerCount": 2, "Sequence": 230943 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2FB4D2B26B9F16855220BC46B06193724A666FA45F58AC404F1C253B1CC47C23", "PreviousFields": { "Balance": "99799726" }, "PreviousTxnID": "168EDD75D0A5C349960557C7C5613100389C1FE9544E8A83767F7EA17D8EEACA", "PreviousTxnLgrSeq": 230950 } }, { "ModifiedNode": { "FinalFields": { "Account": "ravwv8VvsaoXuHsjaKZLd5C84X2x79sr8T", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rK2Du3gUmFbg5UFFHFq9LKywVuGbqNsyyi" }, "AuctionSlot": { "Account": "rJbLyxGA3jvwrFmiouADLHMKaBQn46SVZi", "DiscountedFee": 1, "Expiration": 792714550, "Price": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "ravwv8VvsaoXuHsjaKZLd5C84X2x79sr8T", "value": "0" } }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "ravwv8VvsaoXuHsjaKZLd5C84X2x79sr8T", "value": "235.3393393150508" }, "OwnerNode": "0", "TradingFee": 12, "VoteSlots": [ { "VoteEntry": { "Account": "rJbLyxGA3jvwrFmiouADLHMKaBQn46SVZi", "TradingFee": 12, "VoteWeight": 100000 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "4B82C6834CF2DF6320763766BB21A9D62DD02752F9F8FDDABC394E7584BDAD4A", "PreviousFields": { "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "ravwv8VvsaoXuHsjaKZLd5C84X2x79sr8T", "value": "254.9509509246383" } }, "PreviousTxnID": "168EDD75D0A5C349960557C7C5613100389C1FE9544E8A83767F7EA17D8EEACA", "PreviousTxnLgrSeq": 230950 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-235.3393393150508" }, "Flags": 2228224, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rJbLyxGA3jvwrFmiouADLHMKaBQn46SVZi", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "ravwv8VvsaoXuHsjaKZLd5C84X2x79sr8T", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C27E27B4CC4E229B6DC3027C7F05E31EE4F311C05120B83165DE838968BEFAF6", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-254.9509509246383" } }, "PreviousTxnID": "168EDD75D0A5C349960557C7C5613100389C1FE9544E8A83767F7EA17D8EEACA", "PreviousTxnLgrSeq": 230950 } }, { "ModifiedNode": { "FinalFields": { "AMMID": "4B82C6834CF2DF6320763766BB21A9D62DD02752F9F8FDDABC394E7584BDAD4A", "Account": "ravwv8VvsaoXuHsjaKZLd5C84X2x79sr8T", "Balance": "231", "Flags": 26214400, "OwnerCount": 1, "Sequence": 230949 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F4EEAB09F9EC00FEE9B8C3C7434EB140F57348564A46B0A5E161C7C49051BFFD", "PreviousFields": { "Balance": "250" }, "PreviousTxnID": "68DEA274DFA1E2D8540BF40B12EA882901EF7049DF562F507187D8FFD52CD56A", "PreviousTxnLgrSeq": 230949 } } ], "TransactionIndex": 32, "TransactionResult": "tesSUCCESS" }, "hash": "4C8C11648764ADF0D64020081600739760771C3510862272A86551C70FCC38D1", "ledger_index": 230952, "date": 1739312961000 } ================================================ FILE: src/containers/shared/components/Transaction/AMMClawback/test/mock_data/withFlag.json ================================================ { "tx": { "Account": "rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk", "Asset": { "currency": "USD", "issuer": "rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk" }, "Asset2": { "currency": "YEN", "issuer": "rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk" }, "Fee": "12", "Flags": 1, "Holder": "r4eWC5DixP74dpk7FDzXcap1BJ2NaoUeZN", "LastLedgerSequence": 254460, "Sequence": 254428, "SigningPubKey": "ED7FBCDEF465DF8D6D25B50EDF4B10ECB4A50C15B4A7F5EE49437DD17B5B67E39B", "TransactionType": "AMMClawback", "TxnSignature": "19846DD492CD9F914333DA06CE17545A8447BDC5F0191F76ABDDEFFECA2261E9A75861D66578AF83569B254D6303C475F92DB84B9C4979EE8C0F20AFAD405304", "ctid": "C003E1EA00000002", "date": 1739385880000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk", "Balance": "99999940", "Flags": 2155872256, "OwnerCount": 0, "Sequence": 254429 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "49648B64B65B612D89AA414A3C352400A3B38DE891D551C7103E4C439F0270FE", "PreviousFields": { "Balance": "99999952", "Sequence": 254428 }, "PreviousTxnID": "60DC4B0DCF3364F490974C0F8BF4ECB98F06E7679B21BD0EBF04EE54E3A8370D", "PreviousTxnLgrSeq": 254438 } }, { "DeletedNode": { "FinalFields": { "Account": "rVABxFmKqgaamoxhyajfU26NSQhM1GSVT", "Asset": { "currency": "USD", "issuer": "rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk" }, "Asset2": { "currency": "YEN", "issuer": "rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk" }, "AuctionSlot": { "Account": "r4eWC5DixP74dpk7FDzXcap1BJ2NaoUeZN", "DiscountedFee": 1, "Expiration": 792787462, "Price": { "currency": "0347228E34D1F45F1527508854B97B9CEC898B99", "issuer": "rVABxFmKqgaamoxhyajfU26NSQhM1GSVT", "value": "0" } }, "Flags": 0, "LPTokenBalance": { "currency": "0347228E34D1F45F1527508854B97B9CEC898B99", "issuer": "rVABxFmKqgaamoxhyajfU26NSQhM1GSVT", "value": "161.2451393095337" }, "OwnerNode": "0", "PreviousTxnID": "BD39A86341D8E00E6E989C7D60E6D03D195E90E3552E76D5701CBF0B4172FA1A", "PreviousTxnLgrSeq": 254440, "TradingFee": 12, "VoteSlots": [ { "VoteEntry": { "Account": "r4eWC5DixP74dpk7FDzXcap1BJ2NaoUeZN", "TradingFee": 12, "VoteWeight": 100000 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "6E934944DA277E595B306225B71DF2B43BF957AF5BA0812B273B61221EEFF459" } }, { "DeletedNode": { "FinalFields": { "AMMID": "6E934944DA277E595B306225B71DF2B43BF957AF5BA0812B273B61221EEFF459", "Account": "rVABxFmKqgaamoxhyajfU26NSQhM1GSVT", "Balance": "0", "Flags": 26214400, "OwnerCount": 0, "PreviousTxnID": "60DC4B0DCF3364F490974C0F8BF4ECB98F06E7679B21BD0EBF04EE54E3A8370D", "PreviousTxnLgrSeq": 254438, "Sequence": 254438 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7D4B3E5DB6FA1A916E314C9F2150249DF0F70F6B83A714F990598A92DC054CC5", "PreviousFields": { "OwnerCount": 2 } } }, { "ModifiedNode": { "FinalFields": { "Account": "r4eWC5DixP74dpk7FDzXcap1BJ2NaoUeZN", "Balance": "99799964", "Flags": 0, "OwnerCount": 2, "Sequence": 254426 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "83B3EFF4EEF419DABDA36AF86D2B1F6C4BA787EA6398E461E6AEE1EC0FDAEF14", "PreviousFields": { "OwnerCount": 3 }, "PreviousTxnID": "BD39A86341D8E00E6E989C7D60E6D03D195E90E3552E76D5701CBF0B4172FA1A", "PreviousTxnLgrSeq": 254440 } }, { "DeletedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 16777216, "HighLimit": { "currency": "USD", "issuer": "rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rVABxFmKqgaamoxhyajfU26NSQhM1GSVT", "value": "0" }, "LowNode": "0", "PreviousTxnID": "BD39A86341D8E00E6E989C7D60E6D03D195E90E3552E76D5701CBF0B4172FA1A", "PreviousTxnLgrSeq": 254440 }, "LedgerEntryType": "RippleState", "LedgerIndex": "971E4A160386760AC1AD94A2711C75E6954F915C5A781640A11BBDCAC8D56A29", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "260" }, "Flags": 16842752 } } }, { "DeletedNode": { "FinalFields": { "Balance": { "currency": "YEN", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 16777216, "HighLimit": { "currency": "YEN", "issuer": "rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "YEN", "issuer": "rVABxFmKqgaamoxhyajfU26NSQhM1GSVT", "value": "0" }, "LowNode": "0", "PreviousTxnID": "60DC4B0DCF3364F490974C0F8BF4ECB98F06E7679B21BD0EBF04EE54E3A8370D", "PreviousTxnLgrSeq": 254438 }, "LedgerEntryType": "RippleState", "LedgerIndex": "98F5AFE3DF8C6BCC07F2EF6AA76CA1CA49389C4FB5F0D5E1AB31FD0410891538", "PreviousFields": { "Balance": { "currency": "YEN", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "100" }, "Flags": 16842752 } } }, { "DeletedNode": { "FinalFields": { "Balance": { "currency": "0347228E34D1F45F1527508854B97B9CEC898B99", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2097152, "HighLimit": { "currency": "0347228E34D1F45F1527508854B97B9CEC898B99", "issuer": "r4eWC5DixP74dpk7FDzXcap1BJ2NaoUeZN", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "0347228E34D1F45F1527508854B97B9CEC898B99", "issuer": "rVABxFmKqgaamoxhyajfU26NSQhM1GSVT", "value": "0" }, "LowNode": "0", "PreviousTxnID": "BD39A86341D8E00E6E989C7D60E6D03D195E90E3552E76D5701CBF0B4172FA1A", "PreviousTxnLgrSeq": 254440 }, "LedgerEntryType": "RippleState", "LedgerIndex": "A9CD2BD0E3FEF8B6315D81D1BECFCC2D4D61C2AC0FEDE0068F2518D11B46ECB4", "PreviousFields": { "Balance": { "currency": "0347228E34D1F45F1527508854B97B9CEC898B99", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-161.2451393095337" }, "Flags": 2228224 } } }, { "DeletedNode": { "FinalFields": { "Flags": 0, "Owner": "rVABxFmKqgaamoxhyajfU26NSQhM1GSVT", "PreviousTxnID": "60DC4B0DCF3364F490974C0F8BF4ECB98F06E7679B21BD0EBF04EE54E3A8370D", "PreviousTxnLgrSeq": 254438, "RootIndex": "B3335E5D0FD255079F7163800B97ECC3A9E766C6360A5206DF782EB5E2A0D0F0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B3335E5D0FD255079F7163800B97ECC3A9E766C6360A5206DF782EB5E2A0D0F0" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rUuVtbgagFKjHPTxmN639XYVHLATnB6VNk", "RootIndex": "C192FCC5BDF820AA1E92CAECB4E0B3F9276AD98EA15018B380AA2164AFC353C8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C192FCC5BDF820AA1E92CAECB4E0B3F9276AD98EA15018B380AA2164AFC353C8", "PreviousTxnID": "60DC4B0DCF3364F490974C0F8BF4ECB98F06E7679B21BD0EBF04EE54E3A8370D", "PreviousTxnLgrSeq": 254438 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r4eWC5DixP74dpk7FDzXcap1BJ2NaoUeZN", "RootIndex": "D88F143891ED07B0E39F8F756E1E0A6B0FB904A2C39D84A53AC9553C40F241EB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D88F143891ED07B0E39F8F756E1E0A6B0FB904A2C39D84A53AC9553C40F241EB", "PreviousTxnID": "60DC4B0DCF3364F490974C0F8BF4ECB98F06E7679B21BD0EBF04EE54E3A8370D", "PreviousTxnLgrSeq": 254438 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "9ADAC8C3CF9A7D162EFB93F9CFEBBFFBD8B17F3AFAE26C634E154FF1015AEFC0", "ledger_index": 254442, "date": 1739385880000 } ================================================ FILE: src/containers/shared/components/Transaction/AMMClawback/test/mock_data/withoutFlag.json ================================================ { "tx": { "Account": "rGGjMesMUrRMP8ZkLZ2cZ5agzmFwBfT4f2", "Asset": { "currency": "USD", "issuer": "rGGjMesMUrRMP8ZkLZ2cZ5agzmFwBfT4f2" }, "Asset2": { "currency": "XRP" }, "Fee": "12", "Flags": 0, "Holder": "rJk5n4egp7Th4Y4vxAMVAbf1ziuiFuVKiw", "LastLedgerSequence": 223800, "Sequence": 223773, "SigningPubKey": "ED6181A0E956D793CF5A4965A6CF7E92A60DE6F2035A0A7A063AE27CF6C689CE43", "TransactionType": "AMMClawback", "TxnSignature": "38DCB4EC5842F90B6639099F08ED916A8C9143F39CE29E95F3C3A7AB4A3A274EC1B3C880E900347F4AC2B4965FA9E24F32AE24E37E5637D4941797B61D9D6B09", "ctid": "C0036A2600000002", "date": 1739289812000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rJk5n4egp7Th4Y4vxAMVAbf1ziuiFuVKiw", "RootIndex": "221B55985CE3E04EA6EEF2C3E37EE26CA91651CB308DE9DD798092E20C7C37A1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "221B55985CE3E04EA6EEF2C3E37EE26CA91651CB308DE9DD798092E20C7C37A1", "PreviousTxnID": "D4C34015291D34FD2D5D03FB86F21F44FF7BAAD099573E88F53DB2081C07D737", "PreviousTxnLgrSeq": 223779 } }, { "DeletedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 16777216, "HighLimit": { "currency": "USD", "issuer": "rGGjMesMUrRMP8ZkLZ2cZ5agzmFwBfT4f2", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "r3mDE6Agmyp8xnARMoEoKvJbpGQseUiBtv", "value": "0" }, "LowNode": "0", "PreviousTxnID": "60EE2673F078628842575576BEE10D8D00208093C90AFC9CF93465522110993E", "PreviousTxnLgrSeq": 223780 }, "LedgerEntryType": "RippleState", "LedgerIndex": "4EF836D4D7305E8FDE6E04FD54857D818778218715E9474D2EC2667799EF096D", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "260.0000000000002" }, "Flags": 16842752 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rGGjMesMUrRMP8ZkLZ2cZ5agzmFwBfT4f2", "Balance": "99999952", "Flags": 2155872256, "OwnerCount": 0, "Sequence": 223774 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "63B68A5062ED9768EDECF2187B03B79B70A7EE3C5382D09D3E44BAAD762DA0E0", "PreviousFields": { "Balance": "99999964", "Sequence": 223773 }, "PreviousTxnID": "D4C34015291D34FD2D5D03FB86F21F44FF7BAAD099573E88F53DB2081C07D737", "PreviousTxnLgrSeq": 223779 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJk5n4egp7Th4Y4vxAMVAbf1ziuiFuVKiw", "Balance": "99799976", "Flags": 0, "OwnerCount": 1, "Sequence": 223771 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8F9B0C3D5EF04F2BD1C7D0E5B050A300F78180EE9E84E5D5510953D60F93F519", "PreviousFields": { "Balance": "99799726", "OwnerCount": 2 }, "PreviousTxnID": "60EE2673F078628842575576BEE10D8D00208093C90AFC9CF93465522110993E", "PreviousTxnLgrSeq": 223780 } }, { "DeletedNode": { "FinalFields": { "Flags": 0, "Owner": "r3mDE6Agmyp8xnARMoEoKvJbpGQseUiBtv", "PreviousTxnID": "D4C34015291D34FD2D5D03FB86F21F44FF7BAAD099573E88F53DB2081C07D737", "PreviousTxnLgrSeq": 223779, "RootIndex": "96CAC0ED63FFA30F53912D4A0F0E7974661F98CD89C9AA98A8CC750C9E1E6A54" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "96CAC0ED63FFA30F53912D4A0F0E7974661F98CD89C9AA98A8CC750C9E1E6A54" } }, { "DeletedNode": { "FinalFields": { "Account": "r3mDE6Agmyp8xnARMoEoKvJbpGQseUiBtv", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rGGjMesMUrRMP8ZkLZ2cZ5agzmFwBfT4f2" }, "AuctionSlot": { "Account": "rJk5n4egp7Th4Y4vxAMVAbf1ziuiFuVKiw", "DiscountedFee": 1, "Expiration": 792691402, "Price": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "r3mDE6Agmyp8xnARMoEoKvJbpGQseUiBtv", "value": "0" } }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "r3mDE6Agmyp8xnARMoEoKvJbpGQseUiBtv", "value": "254.9509509246383" }, "OwnerNode": "0", "PreviousTxnID": "60EE2673F078628842575576BEE10D8D00208093C90AFC9CF93465522110993E", "PreviousTxnLgrSeq": 223780, "TradingFee": 12, "VoteSlots": [ { "VoteEntry": { "Account": "rJk5n4egp7Th4Y4vxAMVAbf1ziuiFuVKiw", "TradingFee": 12, "VoteWeight": 100000 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "9F4ABCCDF2CECA64CCD309B609AEE8A73A6C06FD0D19B49AC7857B61433B94E7" } }, { "DeletedNode": { "FinalFields": { "AMMID": "9F4ABCCDF2CECA64CCD309B609AEE8A73A6C06FD0D19B49AC7857B61433B94E7", "Account": "r3mDE6Agmyp8xnARMoEoKvJbpGQseUiBtv", "Balance": "0", "Flags": 26214400, "OwnerCount": 0, "PreviousTxnID": "D4C34015291D34FD2D5D03FB86F21F44FF7BAAD099573E88F53DB2081C07D737", "PreviousTxnLgrSeq": 223779, "Sequence": 223779 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AA50E7BEF6A65C18C68981E7022A2BE977583157CE7B48987BAF98E24880D51F", "PreviousFields": { "Balance": "250", "OwnerCount": 1 } } }, { "DeletedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2097152, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rJk5n4egp7Th4Y4vxAMVAbf1ziuiFuVKiw", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "r3mDE6Agmyp8xnARMoEoKvJbpGQseUiBtv", "value": "0" }, "LowNode": "0", "PreviousTxnID": "60EE2673F078628842575576BEE10D8D00208093C90AFC9CF93465522110993E", "PreviousTxnLgrSeq": 223780 }, "LedgerEntryType": "RippleState", "LedgerIndex": "CC1C7BA5826A8E0119FEACB2D92619454E74B1DB91350AC59E025583CB0147D3", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-254.9509509246383" }, "Flags": 2228224 } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rGGjMesMUrRMP8ZkLZ2cZ5agzmFwBfT4f2", "RootIndex": "D28B5E4A4DCD6F42F4EC2EE591B2602D8E7CD69E241066D474EFA6BEFAE721A0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D28B5E4A4DCD6F42F4EC2EE591B2602D8E7CD69E241066D474EFA6BEFAE721A0", "PreviousTxnID": "D4C34015291D34FD2D5D03FB86F21F44FF7BAAD099573E88F53DB2081C07D737", "PreviousTxnLgrSeq": 223779 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "58AA4289ED06C3792E536F07B482C32A3F325CAAEFB169E3B8FC55316E4A3F02", "ledger_index": 223782, "date": 1739289812000 } ================================================ FILE: src/containers/shared/components/Transaction/AMMCreate/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { formatTradingFee } from '../../../utils' import { Account } from '../../Account' import { Amount } from '../../Amount' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const { amount, amount2, ammAccountID, tradingFee } = data.instructions const tf = formatTradingFee(tradingFee) return ( <> {ammAccountID && ( )} {amount && ( )} {amount2 && ( )} {tf && ( {tf}% )} ) } ================================================ FILE: src/containers/shared/components/Transaction/AMMCreate/index.ts ================================================ import { Simple } from './Simple' import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { parser } from './parser' export const AMMCreate: TransactionMapping = { Simple, action: TransactionAction.CREATE, category: TransactionCategory.DEX, parser, } ================================================ FILE: src/containers/shared/components/Transaction/AMMCreate/parser.ts ================================================ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { getAMMAccountID } from '../../../metaParser' export function parser(tx: any, meta: any) { const amount = formatAmount(tx.Amount) const amount2 = formatAmount(tx.Amount2) const tradingFee = tx.TradingFee const ammAccountID = getAMMAccountID(meta) return { amount, amount2, tradingFee, ammAccountID, } } ================================================ FILE: src/containers/shared/components/Transaction/AMMCreate/test/AMMCreate.test.tsx ================================================ import { Simple } from '../Simple' import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import createMock from './mock_data/amm_create.json' describe('AMM Create Tests', () => { const renderComponent = createSimpleRenderFactory(Simple) it('renders from transaction', () => { const { container, unmount } = renderComponent(createMock) expectSimpleRowText(container, 'asset1', '\uE90010,000.00 XRP') expectSimpleRowText(container, 'trading_fee', '0.001%') expectSimpleRowText( container, 'asset2', '$10,000.00 USD.rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET', ) expectSimpleRowText( container, 'account_id', 'rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AMMCreate/test/mock_data/amm_create.json ================================================ { "tx": { "Account": "rwRGF9pmfEGT4GcZ379cYC9p3wpJDozy8w", "Amount": "10000000000", "Amount2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "10000" }, "Fee": "10", "Flags": 0, "Sequence": 3, "SigningPubKey": "02BFF00BCB2D25845C1D7C1FC5AAAE465B56CBB966BF034E1F6FFC097E8A6FBD28", "TradingFee": 1, "TransactionType": "AMMCreate", "TxnSignature": "304402200CE5EA35FB7545CA8CD3231C2EE6F23D6B9EF7E146F23016905B9516721D5745022062DCC01BB7617C93F85DAE93917CC585FF09AE690BA78FDC5924565EEC186C70", "date": "2022-11-21T20:58:11Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-990000" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rwRGF9pmfEGT4GcZ379cYC9p3wpJDozy8w", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "10D7C86BCC29BAE4545D06CE98A2F961F0DBC73DE38B9792BA776B821EFF28AC", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1000000" } }, "PreviousTxnID": "98D314D1EC81BE9342EDA1C04BCEFA8F327B0EFE12839F1EAB52065492B20E82", "PreviousTxnLgrSeq": 114138 } }, { "CreatedNode": { "LedgerEntryType": "RippleState", "LedgerIndex": "2BC24DD364DD10CFF573560CB7C911DE61971207993417B5A1EC87E227DE7424", "NewFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10000000" }, "Flags": 65536, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "0" }, "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rwRGF9pmfEGT4GcZ379cYC9p3wpJDozy8w", "value": "0" } } } }, { "CreatedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "471AC5276FBA4916D53017D7073D44C5F4780CC73954B1715DC8A65365E8ACAC", "NewFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Balance": "10000000000", "Flags": 59768832, "OwnerCount": 1, "Sequence": 1 } } }, { "CreatedNode": { "LedgerEntryType": "RippleState", "LedgerIndex": "65B78B3B60DA403E99C8CC526882EC34299AF2BA135842CE489C02F82D0203F3", "NewFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10000" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "0" }, "LowLimit": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "0" } } } }, { "ModifiedNode": { "FinalFields": { "Account": "rwRGF9pmfEGT4GcZ379cYC9p3wpJDozy8w", "Balance": "989999999970", "Flags": 8388608, "OwnerCount": 2, "Sequence": 4 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "83A4BB5EA0DB3CFEE89804BC08E1CBD222E869046EE01A7ECCAB57F8433F9655", "PreviousFields": { "Balance": "999999999980", "OwnerCount": 1, "Sequence": 3 }, "PreviousTxnID": "F7998834E30DEB92E62754744328C882CD1C50C59A7568884B14F498B2B91198", "PreviousTxnLgrSeq": 114136 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "RootIndex": "A49DF2BCB7DE1E35F4F0662624A45DF35D56BC3833008E0BE8721424BBD80E33" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A49DF2BCB7DE1E35F4F0662624A45DF35D56BC3833008E0BE8721424BBD80E33" } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A55924837E8BDDBAA2A59B4E1490E81CA63EC5266C679FF5418F1975AA793ADF", "NewFields": { "Owner": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "RootIndex": "A55924837E8BDDBAA2A59B4E1490E81CA63EC5266C679FF5418F1975AA793ADF" } } }, { "CreatedNode": { "LedgerEntryType": "AMM", "LedgerIndex": "C7FD06649235AF4CABD8FA6D8BB0CAF6C6EA5038A74D0DDD5025290683636D02", "NewFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "10000000" } } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rwRGF9pmfEGT4GcZ379cYC9p3wpJDozy8w", "RootIndex": "D69B2631EAE1115AFA8A12284B3780D743CB6CBA74A2F5D878CD68C0352C4CFA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D69B2631EAE1115AFA8A12284B3780D743CB6CBA74A2F5D878CD68C0352C4CFA" } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "F2C157AFC0B58AE61CF96D0A671A35B0E240E3BFBCE71F18604307627AB1EDF5", "PreviousTxnID": "B05CAE1B66F6A64ADB5B7753395E49FC8E5376D3E95ED50BE5F7395509D6334C", "PreviousTxnLgrSeq": 114138 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/AMMDelete/Description.tsx ================================================ import { Trans } from 'react-i18next' import { type AMMDelete } from 'xrpl' import { TransactionDescriptionProps } from '../types' import Currency from '../../Currency' export const Description = ({ data, }: TransactionDescriptionProps) => { const { Asset, Asset2 } = data.tx return (
    , Asset2: ( // @ts-expect-error - MPT is not being supported for AMM transactions until https://github.com/XRPLF/rippled/pull/5285 is merged ), }} />
    ) } ================================================ FILE: src/containers/shared/components/Transaction/AMMDelete/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { type AMMDelete } from 'xrpl' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import Currency from '../../Currency' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const { Asset, Asset2 } = data.instructions return ( <> {/* @ts-expect-error - MPT is not being supported for AMM transactions until https://github.com/XRPLF/rippled/pull/5285 is merged */} {/* @ts-expect-error - MPT is not being supported for AMM transactions until https://github.com/XRPLF/rippled/pull/5285 is merged */} ) } ================================================ FILE: src/containers/shared/components/Transaction/AMMDelete/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { type AMMDelete } from 'xrpl' import { TransactionTableDetailProps } from '../types' import Currency from '../../Currency' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { Asset, Asset2 } = instructions return (
    {t('asset1')} {/* @ts-expect-error - MPT is not being supported for AMM transactions until https://github.com/XRPLF/rippled/pull/5285 is merged */}
    {t('asset2')} {/* @ts-expect-error - MPT is not being supported for AMM transactions until https://github.com/XRPLF/rippled/pull/5285 is merged */}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/AMMDelete/index.ts ================================================ import { type AMMDelete } from 'xrpl' import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const AMMDeleteTransaction: TransactionMapping = { Description, TableDetail, Simple, action: TransactionAction.CANCEL, category: TransactionCategory.DEX, parser: (tx: AMMDelete): AMMDelete => tx, } ================================================ FILE: src/containers/shared/components/Transaction/AMMDelete/test/AMMDeleteDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import mockAMMDelete from './mock_data/AMMDelete.json' import { Description } from '../Description' import { createDescriptionRenderFactory } from '../../test' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('AMMDelete: Description', () => { it('renders description for AMMDelete transaction', () => { const { container, unmount } = renderComponent(mockAMMDelete) expect( container.querySelector('[data-testid="amm-delete-description"]'), ).toHaveTextContent( 'Attempted to delete the AMM for \uE900 XRP and FOO.rm5c42Crqpdch5fbuCdHmSMV1wrL9arV9.If there were more than 512 trustlines, this only removes 512 trustlines instead.', ) expect(container.querySelector('a')).toHaveAttribute( 'href', '/token/FOO.rm5c42Crqpdch5fbuCdHmSMV1wrL9arV9', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AMMDelete/test/AMMDeleteSimple.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { expectSimpleRowText } from '../../test' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockAMMDelete from './mock_data/AMMDelete.json' const renderComponent = createSimpleRenderFactory(Simple, i18n) describe('AMMDelete: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockAMMDelete) // TOOD: - Make this look up asset 1 / asset 2 currency codes expectSimpleRowText(container, 'asset1', '\uE900 XRP') expectSimpleRowText( container, 'asset2', 'FOO.rm5c42Crqpdch5fbuCdHmSMV1wrL9arV9', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AMMDelete/test/AMMDeleteTableDetail.test.tsx ================================================ import { TableDetail } from '../TableDetail' import mockAMMDelete from './mock_data/AMMDelete.json' import { createTableDetailRenderFactory } from '../../test' import i18n from '../../../../../../i18n/testConfigEnglish' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('AMMDelete: TableDetail', () => { it('renders with an expiration and offer', () => { const { container, unmount } = renderComponent(mockAMMDelete) expect(container.querySelector('[data-testid="asset"]')).toHaveTextContent( 'Asset 1\uE900 XRP', ) expect(container.querySelector('[data-testid="asset2"]')).toHaveTextContent( 'Asset 2FOO.rm5c42Crqpdch5fbuCdHmSMV1wrL9arV9', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AMMDelete/test/mock_data/AMMDelete.json ================================================ { "tx": { "Account": "rm5c42Crqpdch5fbuCdHmSMV1wrL9arV9", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "FOO", "issuer": "rm5c42Crqpdch5fbuCdHmSMV1wrL9arV9" }, "Fee": "12", "Flags": 0, "LastLedgerSequence": 372572, "Sequence": 372548, "SigningPubKey": "ED6784394D134E202BCCD957A1A3C5A66647092F3929D388A878A16D1910875435", "TransactionType": "AMMDelete", "TxnSignature": "F9AA459D8CE593E6E2E69BB6A6F723A4822FD5F40314F642FA9EC5187F7FD937FBD3E8A214119D04C74358A3478DCB6EAABE02EFAC1E6E125E15310E18A36D0D", "date": 1693268101000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rm5c42Crqpdch5fbuCdHmSMV1wrL9arV9", "Balance": "9997998976", "Flags": 8388608, "OwnerCount": 1, "Sequence": 372549 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "84CA74ECFDB34F014142013B4CD2FBE3942C7BA9BA7E1FC5A1CB1EF719173812", "PreviousFields": { "Balance": "9997998988", "Sequence": 372548 }, "PreviousTxnID": "E5051DA09F143A719521D6ABBB3856EA3E2CA38EF1CFF0E7DF9FE1C31DD73B6D", "PreviousTxnLgrSeq": 372552 } } ], "TransactionIndex": 0, "TransactionResult": "tecAMM_NOT_EMPTY" }, "hash": "D159883D456646562F51F3E5A2754F7D880D39A6372EDF679A43A7DDB77F735C", "ledger_index": 372554, "date": 1693268101000 } ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { Account } from '../../Account' import { Amount } from '../../Amount' import { localizeNumber } from '../../../utils' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const { amount, amount2, ammAccountID, ePrice, lpTokens } = data.instructions const lpTokenFormatted = lpTokens?.amount ? localizeNumber(lpTokens.amount, 'en-US', { minimumFractionDigits: 0, maximumFractionDigits: 2, }) : undefined return ( <> {ammAccountID && ( )} {amount && ( )} {amount2 && ( )} {ePrice && ( )} {lpTokenFormatted && ( {lpTokenFormatted} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/index.ts ================================================ import { Simple } from './Simple' import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { parser } from './parser' export const AMMDeposit: TransactionMapping = { Simple, action: TransactionAction.SEND, category: TransactionCategory.DEX, parser, } ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/parser.ts ================================================ import { getAMMAccountID, findAssetAmount, getLPTokenAmount, } from '../../../metaParser' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export function parser(tx: any, meta: any) { const ammAccountID = getAMMAccountID(meta) const ePrice = formatAmount(tx.EPrice) const lpTokens = getLPTokenAmount(meta) const amount = findAssetAmount(meta, tx.Asset, tx) const amount2 = findAssetAmount(meta, tx.Asset2, tx) return { amount, amount2, ammAccountID, ePrice, lpTokens, } } ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/test/AMMDeposit.test.tsx ================================================ import { Simple } from '../Simple' import { createSimpleRenderFactory, expectSimpleRowNotToExist, expectSimpleRowText, } from '../../test' import depositBothAssets from './mock_data/deposit_both.json' import depositUSD from './mock_data/deposit_usd.json' import depositXRP from './mock_data/deposit_xrp.json' import depositEprice from './mock_data/deposit_eprice.json' import depositNonXRP from './mock_data/deposit_nonxrp.json' import depositFail from './mock_data/deposit_fail.json' import depositLPToken from './mock_data/deposit_lptoken.json' describe('AMM Deposit Tests', () => { const renderComponent = createSimpleRenderFactory(Simple) it('renders with both assets', () => { const { container, unmount } = renderComponent(depositBothAssets) expectSimpleRowText(container, 'asset1', '\uE90010,997.290462 XRP') expectSimpleRowText( container, 'asset2', '$10,000.00 USD.rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET', ) expectSimpleRowText( container, 'account_id', 'rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W', ) unmount() }) it('renders only with USD', () => { const { container, unmount } = renderComponent(depositUSD) expectSimpleRowNotToExist(container, 'asset1') expectSimpleRowText( container, 'asset2', '$2,000.00 USD.rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET', ) expectSimpleRowText( container, 'account_id', 'rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W', ) unmount() }) it('renders only with XRP', () => { const { container, unmount } = renderComponent(depositXRP) expectSimpleRowText(container, 'asset1', '\uE9001,000.00 XRP') expectSimpleRowText( container, 'account_id', 'rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W', ) unmount() }) it('renders with eprice', () => { const { container, unmount } = renderComponent(depositEprice) expectSimpleRowNotToExist(container, 'asset1') expectSimpleRowText( container, 'asset2', '$1,000.00 USD.rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy', ) expectSimpleRowText( container, 'effective_price', '$0.10 USD.rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy', ) expectSimpleRowText( container, 'account_id', 'rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97', ) unmount() }) it('renders with both assets non XRP', () => { const { container, unmount } = renderComponent(depositNonXRP) expectSimpleRowText( container, 'asset1', '€500.00 EUR.rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr', ) expectSimpleRowText( container, 'asset2', '$500.00 USD.rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr', ) expectSimpleRowText( container, 'account_id', 'rEJ1X5BoSmHqa5h6TSVvYrHAzFmyxGqNic', ) unmount() }) it('deposit shouldnt crash with tx that changes fee', () => { const { container, unmount } = renderComponent(depositFail) expectSimpleRowNotToExist(container, 'asset1') expectSimpleRowNotToExist(container, 'asset2') expectSimpleRowNotToExist(container, 'account_id') unmount() }) it('renders LP Tokens properly', () => { const { container, unmount } = renderComponent(depositLPToken) expectSimpleRowText(container, 'lp_tokens', '4,279,342.4') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/test/mock_data/deposit_both.json ================================================ { "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "11001684.93864386" }, "Flags": 65536, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "32951EDAF938635BE23319144E5420B4F2D19E81483B5759F535FEF0730AF797", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "514888.2582723813" } }, "PreviousTxnID": "C9A05B23CCCD598D90B00F3B3E7FD49A592A6C6EE8C1ECFC3A16823D9B99CF41", "PreviousTxnLgrSeq": 317108 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Balance": "22024039991", "Flags": 59768832, "OwnerCount": 1, "Sequence": 1 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "471AC5276FBA4916D53017D7073D44C5F4780CC73954B1715DC8A65365E8ACAC", "PreviousFields": { "Balance": "11026749529" }, "PreviousTxnID": "C9A05B23CCCD598D90B00F3B3E7FD49A592A6C6EE8C1ECFC3A16823D9B99CF41", "PreviousTxnLgrSeq": 317108 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Balance": "987975959919", "Flags": 8388608, "OwnerCount": 2, "Sequence": 10 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "53383A918D45DEF78DED23CE5141C0FAB44661D602465F5FCFC487792448F1E2", "PreviousFields": { "Balance": "998973250391", "Sequence": 9 }, "PreviousTxnID": "C9A05B23CCCD598D90B00F3B3E7FD49A592A6C6EE8C1ECFC3A16823D9B99CF41", "PreviousTxnLgrSeq": 317108 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20026.78756798392" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "65B78B3B60DA403E99C8CC526882EC34299AF2BA135842CE489C02F82D0203F3", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10026.78756798392" } }, "PreviousTxnID": "C9A05B23CCCD598D90B00F3B3E7FD49A592A6C6EE8C1ECFC3A16823D9B99CF41", "PreviousTxnLgrSeq": 317108 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-989973.2124320161" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "AB154A6C44E28D94D9856A68FA7BBB342F8A517E9107144646AE4880BED76117", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-999973.2124320161" } }, "PreviousTxnID": "C9A05B23CCCD598D90B00F3B3E7FD49A592A6C6EE8C1ECFC3A16823D9B99CF41", "PreviousTxnLgrSeq": 317108 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "21001684.93864386" }, "TradingFee": 0 }, "LedgerEntryType": "AMM", "LedgerIndex": "C7FD06649235AF4CABD8FA6D8BB0CAF6C6EA5038A74D0DDD5025290683636D02", "PreviousFields": { "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "10514888.25827238" } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Amount": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "10000" }, "Amount2": "20000000000", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "Fee": "10", "Flags": 1048576, "Sequence": 9, "SigningPubKey": "023CFED4018084296285DD8A321C099134B9CF6DCD8D91DC067BABCFF0E3F2BE1A", "TransactionType": "AMMDeposit", "TxnSignature": "304502210094677044010A252FDE5837644092548C7286E36667D67116163F4B42E02AE78C02206BED75A5D9BE3AC70DC1C3DC85DB88C289C33B315144FE345487734FC924E53F", "date": "2022-11-28T22:28:03Z" } } ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/test/mock_data/deposit_eprice.json ================================================ { "tx": { "Account": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "Amount": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "value": "1000" }, "Asset": { "currency": "XRP", "amount": 0.00001 }, "Asset2": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "amount": 999.9999999999964 }, "EPrice": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "value": "0.1" }, "Fee": "10", "Flags": 4194304, "Sequence": 113539, "SigningPubKey": "031E3709F92AF9138B63CCDEC7357E3779762F3FB3BB56F6966D7040644B0E179C", "TransactionType": "AMMDeposit", "TxnSignature": "304402200942E3F71CC272FD385211DA12F312A9B8883FAB1307DD2302BA0CC4720D34C102205C9719BE1EA8C6E430FC8BF51BF641484D169B0E6DD19677EA7238FAEF54DC8D", "date": "2023-01-17T23:34:32Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "Balance": "29994999980", "Flags": 0, "OwnerCount": 2, "Sequence": 113540 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1E47D3574E19E3D519D57FF5B3A6EE7622A5998A82DF170C440C8CB7AA0015E1", "PreviousFields": { "Balance": "29994999990", "Sequence": 113539 }, "PreviousTxnID": "1853F40E7D243AE2CDC86BEF435F0251E3115F912F624DBC4B4EC42EB70788A7", "PreviousTxnLgrSeq": 113560 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10440.58975699956" }, "Flags": 16908288, "HighLimit": { "currency": "USD", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6821A772CD6D9CC703438CDE99713837AE7D7606AB31CCF2D1E5E5991A637E43", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9440.589756999564" } }, "PreviousTxnID": "90BC4C26A58B8861A2824CB24195CBD1C20E2109A12078AE5FC07CECE8CDAEF6", "PreviousTxnLgrSeq": 114210 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy" }, "AuctionSlot": { "Account": "r7stmFYYViSDxXYFZkXtL7fRanUyFwWey", "AuthAccounts": [ { "AuthAccount": { "Account": "ra8uHq2Qme5j19TqvPzTE2nqT12Zc3xJmK" } }, { "AuthAccount": { "Account": "rU6o2YguZi847RaiH2QGTkL4eZWZjbxZvk" } } ], "DiscountedFee": 0, "Expiration": 727397182, "Price": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "100" } }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "10754867.45765637" }, "TradingFee": 225, "VoteSlots": [ { "VoteEntry": { "Account": "rKE48YsvrtNfW1mwXGY5zruNnvbQme1EnD", "TradingFee": 350, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rJgu92PQxSMcs4ycLKoCGk4rYgoJeWmexR", "TradingFee": 300, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rGLvAxi5QRBxYnKdg8CqXGnYrFWr1WWi6b", "TradingFee": 150, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rGfys78D1z3gSHE75iYxJzseJQqRKrQcJy", "TradingFee": 200, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rHTFtEYeo8b9Guur4DNADyXnLe28XgEjFb", "TradingFee": 100, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "r3qituSZx5nH6B1ygXvWkB9oNANNagWUYq", "TradingFee": 50, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rnQk7TFb2EWX6QSUBxcy1WtAkfb19NkYXN", "TradingFee": 250, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rPL9AqJtUqw5UWGgizCormAMtZhWoLBwbS", "TradingFee": 400, "VoteWeight": 90 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "9ADECA79A6FA8287F94FDA558E5DDB15C33856E73910991EE842A7B170F45B35", "PreviousFields": { "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "10227406.29545451" } } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-19000" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "value": "60000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F966CB2731E550DB40887518B4E6E73E4F0F8E63CC77BC6918AF610753977FC2", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20000" } }, "PreviousTxnID": "1853F40E7D243AE2CDC86BEF435F0251E3115F912F624DBC4B4EC42EB70788A7", "PreviousTxnLgrSeq": 113560 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10527461.16220186" }, "Flags": 1114112, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FE014629D5BE7D92E9A520189D5758FAB0E7A4C672A1F0847AD1B790C04CC395", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10000000" } }, "PreviousTxnID": "1853F40E7D243AE2CDC86BEF435F0251E3115F912F624DBC4B4EC42EB70788A7", "PreviousTxnLgrSeq": 113560 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "9B4AFEE8FD2E47E71089585A9A0B8E8B2643B0328DA570B9DB1EC1820795CB16", "ledger_index": 114526, "date": "2023-01-17T23:34:32Z" } ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/test/mock_data/deposit_fail.json ================================================ { "tx": { "Account": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "Amount": "100000000", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy" }, "Fee": "10", "Flags": 524288, "Sequence": 113545, "SigningPubKey": "031E3709F92AF9138B63CCDEC7357E3779762F3FB3BB56F6966D7040644B0E179C", "TransactionType": "AMMWithdraw", "TxnSignature": "3044022079422294399EE1A47EB35C018CD7775E074E51BB161E005E09754243FBDA58B902203775B497F7D2993F4BA0DAC4F9E8362BEB583D261C6F4E043303451B70942428", "date": "2023-01-18T01:20:21Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "Balance": "41057652006", "Flags": 0, "OwnerCount": 1, "Sequence": 113546 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1E47D3574E19E3D519D57FF5B3A6EE7622A5998A82DF170C440C8CB7AA0015E1", "PreviousFields": { "Balance": "41057652016", "Sequence": 113545 }, "PreviousTxnID": "C7B058C67F97CF7C5F8B135BFF702FFE320130CB9516422BA82256D99E07F9F0", "PreviousTxnLgrSeq": 116474 } } ], "TransactionIndex": 0, "TransactionResult": "tecAMM_BALANCE" } } ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/test/mock_data/deposit_lptoken.json ================================================ { "tx": { "Account": "rLGLRLAyh6sPsYYddF9XighPaK6YyhftpW", "Amount": "2000000", "Amount2": { "currency": "574C464900000000000000000000000000000000", "issuer": "rGVxqEKH58bAZQKoRjyBJkYDPazCRxsqJ", "value": "15839384.398443" }, "Asset": { "currency": "XRP" }, "Asset2": { "currency": "574C464900000000000000000000000000000000", "issuer": "rGVxqEKH58bAZQKoRjyBJkYDPazCRxsqJ" }, "Fee": "12", "Flags": 1048576, "LastLedgerSequence": 97520507, "Sequence": 91550423, "SigningPubKey": "026140E2349AAFD11B9C702E43F86400773E85755639190EBFFD7DC65C53A0DE92", "SourceTag": 74920348, "TransactionType": "AMMDeposit", "TxnSignature": "3045022100DB8B1F1B39F9958F4EBBB368A4462392EF71F42B0BBD17EC2B179114484B55E602204B843FA969062FEFD723DA65694361A67823367CB7C25977B9086B90A7B17616", "hash": "6D85FF2BEE30E53F690A0DBEBCAAB83AD207E264A49EA83DE29A30A1BD36D06D", "ctid": "C5D00B6900000000" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "574C464900000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-240776638.5747707" }, "Flags": 2228224, "HighLimit": { "currency": "574C464900000000000000000000000000000000", "issuer": "rLGLRLAyh6sPsYYddF9XighPaK6YyhftpW", "value": "99997097504.31943" }, "HighNode": "0", "LowLimit": { "currency": "574C464900000000000000000000000000000000", "issuer": "rGVxqEKH58bAZQKoRjyBJkYDPazCRxsqJ", "value": "0" }, "LowNode": "1b" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2FECF5F478EBC8E22E0109353461944B3B16CDEFE923124797C21ECF231AEBCA", "PreviousFields": { "Balance": { "currency": "574C464900000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-256616022.97321" } }, "PreviousTxnID": "D7FDEA1E7827F015E9BA86903D13FC38B5BC64D1FD5BBF75C3E432B915B61408", "PreviousTxnLgrSeq": 97520440 } }, { "ModifiedNode": { "FinalFields": { "AMMID": "660E6977E9842140E7310436A362DD276C77EA66CBBC06CBAD53CA83030B9E62", "Account": "rn8gn11MeoxnAcSvHiTGDUdvAZydGvXp21", "Balance": "1431840972", "Flags": 26214400, "OwnerCount": 1, "Sequence": 93580609 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "501BE541F2A35C3FF167481E543C5CD320F8F221AAC2CB9F9699AEF7A81239C1", "PreviousFields": { "Balance": "1429840972" }, "PreviousTxnID": "D7FDEA1E7827F015E9BA86903D13FC38B5BC64D1FD5BBF75C3E432B915B61408", "PreviousTxnLgrSeq": 97520440 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "574C464900000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-11339739776.4744" }, "Flags": 16908288, "HighLimit": { "currency": "574C464900000000000000000000000000000000", "issuer": "rn8gn11MeoxnAcSvHiTGDUdvAZydGvXp21", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "574C464900000000000000000000000000000000", "issuer": "rGVxqEKH58bAZQKoRjyBJkYDPazCRxsqJ", "value": "0" }, "LowNode": "11" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6348E9F846C58DF3587F80E52A68F661094692576D84107686FD871485D9EA63", "PreviousFields": { "Balance": { "currency": "574C464900000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-11323900392.07596" } }, "PreviousTxnID": "D7FDEA1E7827F015E9BA86903D13FC38B5BC64D1FD5BBF75C3E432B915B61408", "PreviousTxnLgrSeq": 97520440 } }, { "ModifiedNode": { "FinalFields": { "Account": "rn8gn11MeoxnAcSvHiTGDUdvAZydGvXp21", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "574C464900000000000000000000000000000000", "issuer": "rGVxqEKH58bAZQKoRjyBJkYDPazCRxsqJ" }, "AuctionSlot": { "Account": "rHPHmsoofHe83Grzkczzar6HaBixZYLi2y", "DiscountedFee": 100, "Expiration": 790758222, "Price": { "currency": "034326630D65E49CE46381F3DF6C333A24EF9DD5", "issuer": "rn8gn11MeoxnAcSvHiTGDUdvAZydGvXp21", "value": "0" } }, "Flags": 0, "LPTokenBalance": { "currency": "034326630D65E49CE46381F3DF6C333A24EF9DD5", "issuer": "rn8gn11MeoxnAcSvHiTGDUdvAZydGvXp21", "value": "3063668890.262321" }, "OwnerNode": "0", "TradingFee": 1000, "VoteSlots": [ { "VoteEntry": { "Account": "rHPHmsoofHe83Grzkczzar6HaBixZYLi2y", "TradingFee": 1000, "VoteWeight": 76247 } }, { "VoteEntry": { "Account": "rNJkfihfGdQdeB6oAdizUc1naQzJ7SMnhf", "TradingFee": 1000, "VoteWeight": 532 } }, { "VoteEntry": { "Account": "rp9T8C1KpaYAk79PSr2wjWQ19B2jFpVoiW", "TradingFee": 1000, "VoteWeight": 8122 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "660E6977E9842140E7310436A362DD276C77EA66CBBC06CBAD53CA83030B9E62", "PreviousFields": { "LPTokenBalance": { "currency": "034326630D65E49CE46381F3DF6C333A24EF9DD5", "issuer": "rn8gn11MeoxnAcSvHiTGDUdvAZydGvXp21", "value": "3059389547.863029" } }, "PreviousTxnID": "0C37E99203905408BC222E63E1F965C264D569A7F4C51E4938EBA9385C43EB27", "PreviousTxnLgrSeq": 97437889 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rLGLRLAyh6sPsYYddF9XighPaK6YyhftpW", "RootIndex": "84E6E4868CEC3A7377D656D8A37E0866A882128D29D24D036463FB698D4C9276" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "84E6E4868CEC3A7377D656D8A37E0866A882128D29D24D036463FB698D4C9276", "PreviousTxnID": "6B31C0F6B523361716C7E9708F289C11D907404929AB9C61CB927F612A37E6E8", "PreviousTxnLgrSeq": 97520316 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rn8gn11MeoxnAcSvHiTGDUdvAZydGvXp21", "RootIndex": "B78034000734213582DBD8519C932A6948B8104450BD5CDBB0576C85053E84E7" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B78034000734213582DBD8519C932A6948B8104450BD5CDBB0576C85053E84E7", "PreviousTxnID": "0C37E99203905408BC222E63E1F965C264D569A7F4C51E4938EBA9385C43EB27", "PreviousTxnLgrSeq": 97437889 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLGLRLAyh6sPsYYddF9XighPaK6YyhftpW", "Balance": "6132666", "Flags": 0, "OwnerCount": 16, "Sequence": 91550424 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F44F6CFB64D54D5B4D320F9A7B0D961291D9197A856ABA8F84F3E6ACED42A5F5", "PreviousFields": { "Balance": "8132678", "OwnerCount": 15, "Sequence": 91550423 }, "PreviousTxnID": "CB64B17D730809C689CAABA3A4BDE106B39164B0FDFD667C3598DE8F125C0154", "PreviousTxnLgrSeq": 97520485 } }, { "CreatedNode": { "LedgerEntryType": "RippleState", "LedgerIndex": "FF4C8A2AE9481F513489CBC71216C9BD93AD9A3711F34782706E29DFBF2ED694", "NewFields": { "Balance": { "currency": "034326630D65E49CE46381F3DF6C333A24EF9DD5", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4279342.399292" }, "Flags": 2228224, "HighLimit": { "currency": "034326630D65E49CE46381F3DF6C333A24EF9DD5", "issuer": "rLGLRLAyh6sPsYYddF9XighPaK6YyhftpW", "value": "0" }, "LowLimit": { "currency": "034326630D65E49CE46381F3DF6C333A24EF9DD5", "issuer": "rn8gn11MeoxnAcSvHiTGDUdvAZydGvXp21", "value": "0" } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true, "date": 1752703261000, "ledger_index": 97520489, "inLedger": 97520489, "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" } ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/test/mock_data/deposit_nonxrp.json ================================================ { "tx": { "Account": "rno4rnVC5E8b3pLsQhkDV83nBf4k8ThdyG", "Amount": { "currency": "USD", "issuer": "rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr", "value": "500" }, "Amount2": { "currency": "EUR", "issuer": "rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr", "value": "500" }, "Asset": { "currency": "EUR", "issuer": "rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr", "amount": 500 }, "Asset2": { "currency": "USD", "issuer": "rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr", "amount": 500 }, "Fee": "10", "Flags": 1048576, "Sequence": 172369, "SigningPubKey": "034F64DC1AA64405C826E76FE2C1E75CF009C383AFE170882004357BC02CC7677F", "TransactionType": "AMMDeposit", "TxnSignature": "30440220018BF040C92E3CD09471D61E518FA6888C3EF30D974ECC123FD6B46BF32CDBFB02204CAE4B71D611E77E3655641862F90CBDCBBAEC87F1807A390C7C9D6B9C21D38F", "date": "2023-01-19T23:58:40Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03FE31F736943F050684BDDE2A78B1D2AE331DF5", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10500" }, "Flags": 1114112, "HighLimit": { "currency": "03FE31F736943F050684BDDE2A78B1D2AE331DF5", "issuer": "rEJ1X5BoSmHqa5h6TSVvYrHAzFmyxGqNic", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03FE31F736943F050684BDDE2A78B1D2AE331DF5", "issuer": "rno4rnVC5E8b3pLsQhkDV83nBf4k8ThdyG", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0F93EA0030F7FF31713CEEE05DB871B26BEEBBA1C7DAA18FEFFBF6E66C0D2046", "PreviousFields": { "Balance": { "currency": "03FE31F736943F050684BDDE2A78B1D2AE331DF5", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10000" } }, "PreviousTxnID": "60D62672AFD306B2922EE34FF2FAF36471437A56CB745C34E9A144E297DAD4B1", "PreviousTxnLgrSeq": 172387 } }, { "ModifiedNode": { "FinalFields": { "Account": "rEJ1X5BoSmHqa5h6TSVvYrHAzFmyxGqNic", "Asset": { "currency": "EUR", "issuer": "rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr" }, "Asset2": { "currency": "USD", "issuer": "rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr" }, "Flags": 0, "LPTokenBalance": { "currency": "03FE31F736943F050684BDDE2A78B1D2AE331DF5", "issuer": "rEJ1X5BoSmHqa5h6TSVvYrHAzFmyxGqNic", "value": "10500" }, "TradingFee": 0 }, "LedgerEntryType": "AMM", "LedgerIndex": "3BC36D1B0563D5E0C56F2AED812A5A75F20077AEC8A50E912CC9F5AE7A9097B3", "PreviousFields": { "LPTokenBalance": { "currency": "03FE31F736943F050684BDDE2A78B1D2AE331DF5", "issuer": "rEJ1X5BoSmHqa5h6TSVvYrHAzFmyxGqNic", "value": "10000" } } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "89500" }, "Flags": 2162688, "HighLimit": { "currency": "USD", "issuer": "rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rno4rnVC5E8b3pLsQhkDV83nBf4k8ThdyG", "value": "1000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "41517EE2A364A2B4DBFCBC3BC794A4A9259F2DFBCF3EA494658829AD2F6708EF", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "90000" } }, "PreviousTxnID": "60D62672AFD306B2922EE34FF2FAF36471437A56CB745C34E9A144E297DAD4B1", "PreviousTxnLgrSeq": 172387 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "EUR", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10500" }, "Flags": 17956864, "HighLimit": { "currency": "EUR", "issuer": "rEJ1X5BoSmHqa5h6TSVvYrHAzFmyxGqNic", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "EUR", "issuer": "rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4224B4C62D8B15C1657EE66664738E039704D60BE9042E9D2C5F7F0A357B5C87", "PreviousFields": { "Balance": { "currency": "EUR", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10000" } }, "PreviousTxnID": "60D62672AFD306B2922EE34FF2FAF36471437A56CB745C34E9A144E297DAD4B1", "PreviousTxnLgrSeq": 172387 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "EUR", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "189500" }, "Flags": 2162688, "HighLimit": { "currency": "EUR", "issuer": "rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "EUR", "issuer": "rno4rnVC5E8b3pLsQhkDV83nBf4k8ThdyG", "value": "1000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "80D9AB85EC6BB25BD87A676EFB9B14EF1D1D3CC9B01CDDE3C0A0C7A4D27B12B5", "PreviousFields": { "Balance": { "currency": "EUR", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "190000" } }, "PreviousTxnID": "60D62672AFD306B2922EE34FF2FAF36471437A56CB745C34E9A144E297DAD4B1", "PreviousTxnLgrSeq": 172387 } }, { "ModifiedNode": { "FinalFields": { "Account": "rno4rnVC5E8b3pLsQhkDV83nBf4k8ThdyG", "Balance": "9994999970", "Flags": 0, "OwnerCount": 3, "Sequence": 172370 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "98A64F6B42164DEACE36E05D3482633645DDD02E78A345C927BC5B846695F607", "PreviousFields": { "Balance": "9994999980", "Sequence": 172369 }, "PreviousTxnID": "60D62672AFD306B2922EE34FF2FAF36471437A56CB745C34E9A144E297DAD4B1", "PreviousTxnLgrSeq": 172387 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10500" }, "Flags": 17956864, "HighLimit": { "currency": "USD", "issuer": "rEJ1X5BoSmHqa5h6TSVvYrHAzFmyxGqNic", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rEaiyQKvxYWmh7q9mvSm11kZmKx92HZdmr", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F1AA3596A743B3D5A16C7725278C3190EB19DC7237758697B8BD2E8488F9FC5C", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10000" } }, "PreviousTxnID": "60D62672AFD306B2922EE34FF2FAF36471437A56CB745C34E9A144E297DAD4B1", "PreviousTxnLgrSeq": 172387 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "F031EC2F67432AE3DA8084EA8CC3CA3832CC5BF7B1D37161E01C5533E699EC77", "ledger_index": 172412, "date": "2023-01-19T23:58:40Z" } ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/test/mock_data/deposit_usd.json ================================================ { "tx": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Amount": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "2000" }, "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "Fee": "10", "Flags": 524288, "Sequence": 10, "SigningPubKey": "023CFED4018084296285DD8A321C099134B9CF6DCD8D91DC067BABCFF0E3F2BE1A", "TransactionType": "AMMDeposit", "TxnSignature": "3045022100E97288DE0E1A6232A35227D3EF95A75D1E902D123E1C4CC8E69686A0D5A30BED022071639476F7A7999927E859AB3AE4FCD73D016E94B3886CD2A85DDCA8173EE42B", "date": "2022-11-28T22:39:12Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "12025413.73598727" }, "Flags": 65536, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "32951EDAF938635BE23319144E5420B4F2D19E81483B5759F535FEF0730AF797", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "11001684.93864386" } }, "PreviousTxnID": "14DE7AE1A29A0CE13FEBABCF4EBCD48AF4945725CA07405EC0E0A50CBCE29CCC", "PreviousTxnLgrSeq": 317249 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Balance": "987975959909", "Flags": 8388608, "OwnerCount": 2, "Sequence": 11 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "53383A918D45DEF78DED23CE5141C0FAB44661D602465F5FCFC487792448F1E2", "PreviousFields": { "Balance": "987975959919", "Sequence": 10 }, "PreviousTxnID": "14DE7AE1A29A0CE13FEBABCF4EBCD48AF4945725CA07405EC0E0A50CBCE29CCC", "PreviousTxnLgrSeq": 317249 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-22026.78756798392" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "65B78B3B60DA403E99C8CC526882EC34299AF2BA135842CE489C02F82D0203F3", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20026.78756798392" } }, "PreviousTxnID": "14DE7AE1A29A0CE13FEBABCF4EBCD48AF4945725CA07405EC0E0A50CBCE29CCC", "PreviousTxnLgrSeq": 317249 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-987973.2124320161" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "AB154A6C44E28D94D9856A68FA7BBB342F8A517E9107144646AE4880BED76117", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-989973.2124320161" } }, "PreviousTxnID": "14DE7AE1A29A0CE13FEBABCF4EBCD48AF4945725CA07405EC0E0A50CBCE29CCC", "PreviousTxnLgrSeq": 317249 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "22025413.73598727" }, "TradingFee": 0 }, "LedgerEntryType": "AMM", "LedgerIndex": "C7FD06649235AF4CABD8FA6D8BB0CAF6C6EA5038A74D0DDD5025290683636D02", "PreviousFields": { "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "21001684.93864386" } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/AMMDeposit/test/mock_data/deposit_xrp.json ================================================ { "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "515288.2582723813" }, "Flags": 65536, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "32951EDAF938635BE23319144E5420B4F2D19E81483B5759F535FEF0730AF797", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "27169" } }, "PreviousTxnID": "209B17403B42271F2D50DEC0F808AE07EC04B8B9605FF52B1093BFF31676AD2C", "PreviousTxnLgrSeq": 233852 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Balance": "11027169000", "Flags": 59768832, "OwnerCount": 1, "Sequence": 1 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "471AC5276FBA4916D53017D7073D44C5F4780CC73954B1715DC8A65365E8ACAC", "PreviousFields": { "Balance": "10027169000" }, "PreviousTxnID": "209B17403B42271F2D50DEC0F808AE07EC04B8B9605FF52B1093BFF31676AD2C", "PreviousTxnLgrSeq": 233852 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Balance": "998972830930", "Flags": 8388608, "OwnerCount": 2, "Sequence": 8 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "53383A918D45DEF78DED23CE5141C0FAB44661D602465F5FCFC487792448F1E2", "PreviousFields": { "Balance": "999972830940", "Sequence": 7 }, "PreviousTxnID": "209B17403B42271F2D50DEC0F808AE07EC04B8B9605FF52B1093BFF31676AD2C", "PreviousTxnLgrSeq": 233852 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "10515288.25827238" }, "TradingFee": 0 }, "LedgerEntryType": "AMM", "LedgerIndex": "C7FD06649235AF4CABD8FA6D8BB0CAF6C6EA5038A74D0DDD5025290683636D02", "PreviousFields": { "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "10027169" } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Amount": "1000000000", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "Fee": "10", "Flags": 524288, "Sequence": 7, "SigningPubKey": "023CFED4018084296285DD8A321C099134B9CF6DCD8D91DC067BABCFF0E3F2BE1A", "TransactionType": "AMMDeposit", "TxnSignature": "3045022100D1363F0A6D7252690820657B6ACCB35245E65D8DCDB48199578C213ED9D3E24B0220697D4DC057ECCD942BC59B0242411839C125696CD9DE9A3EFE45367EE0D1D29D", "date": "2022-11-26T00:55:02Z" } } ================================================ FILE: src/containers/shared/components/Transaction/AMMVote/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { formatTradingFee } from '../../../utils' import { Account } from '../../Account' import { Amount } from '../../Amount' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const { amount, amount2, tradingFee, ammAccountID } = data.instructions const tf = formatTradingFee(tradingFee) return ( <> {ammAccountID && ( )} {amount && ( )} {amount2 && ( )} {tf && ( {tf}% )} ) } ================================================ FILE: src/containers/shared/components/Transaction/AMMVote/index.ts ================================================ import { Simple } from './Simple' import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { parser } from './parser' export const AMMVote: TransactionMapping = { Simple, action: TransactionAction.MODIFY, category: TransactionCategory.DEX, parser, } ================================================ FILE: src/containers/shared/components/Transaction/AMMVote/parser.ts ================================================ import { findAssetAmount, getAMMAccountID } from '../../../metaParser' export function parser(tx: any, meta: any) { const tradingFee = tx.TradingFee const ammAccountID = getAMMAccountID(meta) const amount = findAssetAmount(meta, tx.Asset, tx) const amount2 = findAssetAmount(meta, tx.Asset2, tx) return { tradingFee, ammAccountID, amount, amount2, } } ================================================ FILE: src/containers/shared/components/Transaction/AMMVote/test/AMMVote.test.tsx ================================================ import { Simple } from '../Simple' import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import voteMock from './mock_data/amm_vote.json' describe('AMM Vote Tests', () => { const renderComponent = createSimpleRenderFactory(Simple) it('renders from transaction', () => { const { container, unmount } = renderComponent(voteMock) expectSimpleRowText(container, 'trading_fee', '0.001%') expectSimpleRowText( container, 'account_id', 'rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AMMVote/test/mock_data/amm_vote.json ================================================ { "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Balance": "991642540751", "Flags": 8388608, "OwnerCount": 2, "Sequence": 15 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "53383A918D45DEF78DED23CE5141C0FAB44661D602465F5FCFC487792448F1E2", "PreviousFields": { "Balance": "991642540761", "Sequence": 14 }, "PreviousTxnID": "C23F7BB2A7F80DBCE9AB5CBA1E3F1CA20F2E68F34B98ADE7C4241B68E4574FEA", "PreviousTxnLgrSeq": 376513 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "AuctionSlot": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "DiscountedFee": 0, "Expiration": 723254240, "Price": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "191.7396500029036" } }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "19173773.26064036" }, "TradingFee": 1, "VoteSlots": [ { "VoteEntry": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "TradingFee": 1, "VoteWeight": 47845 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "C7FD06649235AF4CABD8FA6D8BB0CAF6C6EA5038A74D0DDD5025290683636D02", "PreviousFields": { "TradingFee": 0 } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "Fee": "10", "Flags": 0, "Sequence": 14, "SigningPubKey": "023CFED4018084296285DD8A321C099134B9CF6DCD8D91DC067BABCFF0E3F2BE1A", "TradingFee": 1, "TransactionType": "AMMVote", "TxnSignature": "3045022100978CE4DB4D648CE0E5F8744A0D29F40AD1A7874AF3D80E3DF06A4FC7A830EB5B022009ACABE3EE71B368520649A1F0251256137CA9B5742EEFDA8960C7E567670929", "date": "2022-11-30T23:57:42Z" } } ================================================ FILE: src/containers/shared/components/Transaction/AMMWithdraw/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { localizeNumber } from '../../../utils' import { Account } from '../../Account' import { Amount } from '../../Amount' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const { amount, amount2, lpTokens, ammAccountID, ePrice } = data.instructions const lpTokenFormatted = lpTokens?.amount ? localizeNumber(lpTokens.amount, 'en-US', { minimumFractionDigits: 0, maximumFractionDigits: 2, }) : undefined return ( <> {ammAccountID && ( )} {amount && ( )} {amount2 && ( )} {ePrice && ( )} {lpTokenFormatted && ( {lpTokenFormatted} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/AMMWithdraw/index.ts ================================================ import { Simple } from './Simple' import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { parser } from './parser' export const AMMWithdraw: TransactionMapping = { Simple, action: TransactionAction.SEND, category: TransactionCategory.DEX, parser, } ================================================ FILE: src/containers/shared/components/Transaction/AMMWithdraw/parser.ts ================================================ import { findAssetAmount, getAMMAccountID, getLPTokenAmount, } from '../../../metaParser' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export function parser(tx: any, meta: any) { const ammAccountID = getAMMAccountID(meta) const lpTokens = getLPTokenAmount(meta) const ePrice = formatAmount(tx.EPrice) const amount = findAssetAmount(meta, tx.Asset, tx) const amount2 = findAssetAmount(meta, tx.Asset2, tx) return { amount, amount2, ammAccountID, lpTokens, ePrice, } } ================================================ FILE: src/containers/shared/components/Transaction/AMMWithdraw/test/AMMWithdraw.test.tsx ================================================ import { Simple } from '../Simple' import { createSimpleRenderFactory, expectSimpleRowNotToExist, expectSimpleRowText, } from '../../test' import withdrawMock from './mock_data/withdraw.json' import withdrawUSDMock from './mock_data/withdraw_usd.json' import withdrawXRPMock from './mock_data/withdraw_xrp.json' import withdrawEpriceMock from './mock_data/withdraw_eprice.json' import withdrawAll from './mock_data/withdraw_all.json' describe('AMM Withdraw Tests', () => { const renderComponent = createSimpleRenderFactory(Simple) it('renders from transaction', () => { const { container, unmount } = renderComponent(withdrawMock) expectSimpleRowText(container, 'asset1', '\uE9003,666.580862 XRP') expectSimpleRowText( container, 'asset2', '$4,000.00 USD.rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET', ) expectSimpleRowText( container, 'account_id', 'rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W', ) unmount() }) it('renders transaction from usd only', () => { const { container, unmount } = renderComponent(withdrawUSDMock) expectSimpleRowNotToExist(container, 'asset1') expectSimpleRowText( container, 'asset2', '$100.00 USD.rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy', ) expectSimpleRowText( container, 'account_id', 'rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97', ) unmount() }) it('renders transaction from XRP only', () => { const { container, unmount } = renderComponent(withdrawXRPMock) expectSimpleRowNotToExist(container, 'asset2') expectSimpleRowText(container, 'asset1', '\uE90099.99998 XRP') expectSimpleRowText( container, 'account_id', 'rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97', ) unmount() }) it('renders transaction from eprice', () => { const { container, unmount } = renderComponent(withdrawEpriceMock) expectSimpleRowNotToExist(container, 'asset1') expectSimpleRowText( container, 'asset2', '$1,639.41097028 USD.rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy', ) expectSimpleRowText( container, 'account_id', 'rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97', ) unmount() }) it('renders LP Tokens properly', () => { const { container, unmount } = renderComponent(withdrawAll) expectSimpleRowText(container, 'lp_tokens', '4.77') unmount() }) it('renders positive XRP amount even if transaction fee is greater than XRP taken out of AMM', () => { const { container, unmount } = renderComponent(withdrawAll) expectSimpleRowNotToExist(container, 'asset2') expectSimpleRowText(container, 'asset1', '\uE9000.000005 XRP') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AMMWithdraw/test/mock_data/withdraw.json ================================================ { "tx": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Amount": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "4000" }, "Amount2": "4000000000", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "Fee": "10", "Flags": 1048576, "Sequence": 12, "SigningPubKey": "023CFED4018084296285DD8A321C099134B9CF6DCD8D91DC067BABCFF0E3F2BE1A", "TransactionType": "AMMWithdraw", "TxnSignature": "304502210081F3DBDA3F0E9BEA18CE9E7F0E8C1A0083D8B98DD18A4C8B192B50F8788341A2022036AD3BD6F74C5F13FCBBF3FAA821D502E212C8C4ECE98AF2F98B1B7E430304EB", "date": "2022-11-28T23:35:50Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "9173965.000290365" }, "Flags": 65536, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "32951EDAF938635BE23319144E5420B4F2D19E81483B5759F535FEF0730AF797", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "13003628.63160447" } }, "PreviousTxnID": "0FEA8D6779D0C6BAD7B3D6CD85A99A935E9176D696937A35BD7D2440AC9C97F0", "PreviousTxnLgrSeq": 317473 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Balance": "18357459109", "Flags": 59768832, "OwnerCount": 1, "Sequence": 1 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "471AC5276FBA4916D53017D7073D44C5F4780CC73954B1715DC8A65365E8ACAC", "PreviousFields": { "Balance": "22024039991" }, "PreviousTxnID": "14DE7AE1A29A0CE13FEBABCF4EBCD48AF4945725CA07405EC0E0A50CBCE29CCC", "PreviousTxnLgrSeq": 317249 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "Balance": "991642540771", "Flags": 8388608, "OwnerCount": 2, "Sequence": 13 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "53383A918D45DEF78DED23CE5141C0FAB44661D602465F5FCFC487792448F1E2", "PreviousFields": { "Balance": "987975959899", "Sequence": 12 }, "PreviousTxnID": "0FEA8D6779D0C6BAD7B3D6CD85A99A935E9176D696937A35BD7D2440AC9C97F0", "PreviousTxnLgrSeq": 317473 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20026.78756798392" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "65B78B3B60DA403E99C8CC526882EC34299AF2BA135842CE489C02F82D0203F3", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-24026.78756798392" } }, "PreviousTxnID": "0FEA8D6779D0C6BAD7B3D6CD85A99A935E9176D696937A35BD7D2440AC9C97F0", "PreviousTxnLgrSeq": 317473 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-989973.2124320161" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rUwaiErsYE5kibUUtaPczXZVVd73VNy4R9", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "AB154A6C44E28D94D9856A68FA7BBB342F8A517E9107144646AE4880BED76117", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-985973.2124320161" } }, "PreviousTxnID": "0FEA8D6779D0C6BAD7B3D6CD85A99A935E9176D696937A35BD7D2440AC9C97F0", "PreviousTxnLgrSeq": 317473 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rhpHaFggC92ELty3n3yDEtuFgWxXWkUFET" }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "19173965.00029036" }, "TradingFee": 0 }, "LedgerEntryType": "AMM", "LedgerIndex": "C7FD06649235AF4CABD8FA6D8BB0CAF6C6EA5038A74D0DDD5025290683636D02", "PreviousFields": { "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rMEdVzU8mtEArzjrN9avm3kA675GX7ez8W", "value": "23003628.63160447" } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/AMMWithdraw/test/mock_data/withdraw_all.json ================================================ { "tx": { "Account": "rhaAaAaaSDNiZpvUPQN5H5aP6kpZ2brare", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "4147444E00000000000000000000000000000000", "issuer": "rUSF1wn7BfHLgnCApU4uPURf56TWtcqahA" }, "Fee": "100", "Flags": 131072, "LastLedgerSequence": 97666771, "Sequence": 94287972, "SigningPubKey": "0254F7BB9189361F61C0532A32D3C8D043C7C3780E080DD3C6E2BFD131BF856F7E", "TransactionType": "AMMWithdraw", "TxnSignature": "3045022100F7F376DB982E061A8A6BE76D84D31BA898C35E0FE290202A46666990477095FA02205C6D4350AFD48C5A97E16F3A92AC4F7AAC8BCF5D5EBF2DDF2F63ECE681988389", "hash": "68AD5C03CCF55D84EDB68E92E014716E6D059A4D6779E1E1595EBCC2E14E8B39", "ctid": "C5D2463F00270000" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rhaAaAaaSDNiZpvUPQN5H5aP6kpZ2brare", "RootIndex": "25C0D3BB6C48EA92B0474E34C42D137E1FF7A38FE48D603FBD23AB5AAB75081E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "25C0D3BB6C48EA92B0474E34C42D137E1FF7A38FE48D603FBD23AB5AAB75081E", "PreviousTxnID": "A4628BCC9AF0AB56032C83FD93F5D2CE59A366E9C2BF5848E26CA36B4BCA0875", "PreviousTxnLgrSeq": 97666611 } }, { "DeletedNode": { "FinalFields": { "AMMID": "C963A4B34A98FD522F1EC2FF229247E1CE05C820204EE9BBFDAE8AAB3C3EAA44", "Account": "rGjXpVMZtX5KFPNxt7srucLuLsPXxHLCPe", "Balance": "0", "Flags": 26214400, "OwnerCount": 0, "PreviousTxnID": "C2C08B76D640A778A1C6B1872E20BDBF58FA58E6048AB99FC3DDDECA6C07D1A2", "PreviousTxnLgrSeq": 97666611, "Sequence": 97666609 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7D483F2F26536969776123735C61C3885490D175709C7454FBAEF39AB1E5E2C4", "PreviousFields": { "Balance": "5", "OwnerCount": 1 } } }, { "DeletedNode": { "FinalFields": { "Flags": 0, "Owner": "rGjXpVMZtX5KFPNxt7srucLuLsPXxHLCPe", "PreviousTxnID": "C2C08B76D640A778A1C6B1872E20BDBF58FA58E6048AB99FC3DDDECA6C07D1A2", "PreviousTxnLgrSeq": 97666611, "RootIndex": "7EBE5E7A3699DB40EDB5451EE479A57C08D3C051E20C90875C32EF5C4AF52136" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7EBE5E7A3699DB40EDB5451EE479A57C08D3C051E20C90875C32EF5C4AF52136" } }, { "CreatedNode": { "LedgerEntryType": "RippleState", "LedgerIndex": "9A02EC53233C6629E0FB1E403FCF3ECF9D405B63BC4EDEA4BBD6464618066CC8", "NewFields": { "Balance": { "currency": "4147444E00000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4.55850791" }, "Flags": 1114112, "HighLimit": { "currency": "4147444E00000000000000000000000000000000", "issuer": "rUSF1wn7BfHLgnCApU4uPURf56TWtcqahA", "value": "0" }, "HighNode": "3", "LowLimit": { "currency": "4147444E00000000000000000000000000000000", "issuer": "rhaAaAaaSDNiZpvUPQN5H5aP6kpZ2brare", "value": "0" } } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rUSF1wn7BfHLgnCApU4uPURf56TWtcqahA", "RootIndex": "D0EB2E110763130F51F8D5E3916CCA7A9222DD6ED984649C24BBAF62F4C8FD7C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9DBEE938E8BB7E75305B4468AC42D7E941FECA6DCDE4EDD0CEEA36601F503749", "PreviousTxnID": "FBCD265CD622D83F914B28F1B3A8DCCA44E2546B19D05B12C6D7E6F7DFE240DE", "PreviousTxnLgrSeq": 97666615 } }, { "ModifiedNode": { "FinalFields": { "Account": "rhaAaAaaSDNiZpvUPQN5H5aP6kpZ2brare", "Balance": "94165821", "Flags": 0, "OwnerCount": 2, "Sequence": 94287973 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A94F7C14018E704F0F99B5731ABD9DF179CFD17DEEB09B64DC58695ADA454949", "PreviousFields": { "Balance": "94165916", "Sequence": 94287972 }, "PreviousTxnID": "F432C4C2BAFE4CF8515E60925D4374D7CB067B68362E55920055B6FCA589DA59", "PreviousTxnLgrSeq": 97666613 } }, { "DeletedNode": { "FinalFields": { "Account": "rGjXpVMZtX5KFPNxt7srucLuLsPXxHLCPe", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "4147444E00000000000000000000000000000000", "issuer": "rUSF1wn7BfHLgnCApU4uPURf56TWtcqahA" }, "AuctionSlot": { "Account": "rHUYcq5sgqTscPDP4JkUBp4JAejTT8fR5Z", "DiscountedFee": 100, "Expiration": 806674721, "Price": { "currency": "0376CD9DC788A7B5B6FF15C3042E637F798393FC", "issuer": "rGjXpVMZtX5KFPNxt7srucLuLsPXxHLCPe", "value": "0" } }, "Flags": 0, "LPTokenBalance": { "currency": "0376CD9DC788A7B5B6FF15C3042E637F798393FC", "issuer": "rGjXpVMZtX5KFPNxt7srucLuLsPXxHLCPe", "value": "4.7710463" }, "OwnerNode": "0", "PreviousTxnID": "F432C4C2BAFE4CF8515E60925D4374D7CB067B68362E55920055B6FCA589DA59", "PreviousTxnLgrSeq": 97666613, "TradingFee": 1000, "VoteSlots": [ { "VoteEntry": { "Account": "rhaAaAaaSDNiZpvUPQN5H5aP6kpZ2brare", "TradingFee": 1000, "VoteWeight": 100000 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "C963A4B34A98FD522F1EC2FF229247E1CE05C820204EE9BBFDAE8AAB3C3EAA44" } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "D681715789CA270DBD3C1DAAF89DEADF001BF99E10023736D228CB887D4AC8C8", "PreviousTxnID": "80BAB41A65C27B23CC88616669D475EE3B03434DEE6F4B14E39A27648E4355F8", "PreviousTxnLgrSeq": 97666619 } }, { "DeletedNode": { "FinalFields": { "Balance": { "currency": "0376CD9DC788A7B5B6FF15C3042E637F798393FC", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1048576, "HighLimit": { "currency": "0376CD9DC788A7B5B6FF15C3042E637F798393FC", "issuer": "rGjXpVMZtX5KFPNxt7srucLuLsPXxHLCPe", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "0376CD9DC788A7B5B6FF15C3042E637F798393FC", "issuer": "rhaAaAaaSDNiZpvUPQN5H5aP6kpZ2brare", "value": "0" }, "LowNode": "0", "PreviousTxnID": "A4628BCC9AF0AB56032C83FD93F5D2CE59A366E9C2BF5848E26CA36B4BCA0875", "PreviousTxnLgrSeq": 97666611 }, "LedgerEntryType": "RippleState", "LedgerIndex": "EB64CA02BD24176701F2ADC00873A42959BD93585BF78E947A5A23E41CF6C327", "PreviousFields": { "Balance": { "currency": "0376CD9DC788A7B5B6FF15C3042E637F798393FC", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4.7710463" }, "Flags": 1114112 } } }, { "DeletedNode": { "FinalFields": { "Balance": { "currency": "4147444E00000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 16777216, "HighLimit": { "currency": "4147444E00000000000000000000000000000000", "issuer": "rGjXpVMZtX5KFPNxt7srucLuLsPXxHLCPe", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "4147444E00000000000000000000000000000000", "issuer": "rUSF1wn7BfHLgnCApU4uPURf56TWtcqahA", "value": "0" }, "LowNode": "3", "PreviousTxnID": "C2C08B76D640A778A1C6B1872E20BDBF58FA58E6048AB99FC3DDDECA6C07D1A2", "PreviousTxnLgrSeq": 97666611 }, "LedgerEntryType": "RippleState", "LedgerIndex": "F0DB56A979BE581CD1F87BB9FBF89341435175BB14BACF274C085C4D55D07310", "PreviousFields": { "Balance": { "currency": "4147444E00000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4.55850791" }, "Flags": 16908288 } } } ], "TransactionIndex": 39, "TransactionResult": "tesSUCCESS" }, "hash": "68AD5C03CCF55D84EDB68E92E014716E6D059A4D6779E1E1595EBCC2E14E8B39", "ledger_index": 97666623, "date": 1753273181000 } ================================================ FILE: src/containers/shared/components/Transaction/AMMWithdraw/test/mock_data/withdraw_eprice.json ================================================ { "tx": { "Account": "r7stmFYYViSDxXYFZkXtL7fRanUyFwWey", "Amount": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "value": "0" }, "Asset": { "currency": "XRP", "amount": 0.00001 }, "Asset2": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "amount": 1639.4109702798014 }, "EPrice": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "520" }, "Fee": "10", "Flags": 4194304, "Sequence": 113541, "SigningPubKey": "025D06F9635CF6363CB238C81925155F94AB7944202CFE6EAAE3A1FBCD818F1C5E", "TransactionType": "AMMWithdraw", "TxnSignature": "3044022020769C8B08DB2C4323B117036E05096AD40D9C7A8542E2A913AD9E0EABE2DEC302202065F02CB9BDAE07865B3558102FE1905013AACB718BC7C0F464B854A3452B12", "date": "2023-01-17T23:18:43Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "30639.4109702798" }, "Flags": 65536, "HighLimit": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "r7stmFYYViSDxXYFZkXtL7fRanUyFwWey", "value": "60000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4978EF296D4D3064928F7BC522A48977D98053DF9BD9C3BCD0BBBD219BDE20B0", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "29000" } }, "PreviousTxnID": "23DC76DE0BC1066B7B70FC7F2214FCC053C553C6046CFA7A25065D1A1E425812", "PreviousTxnLgrSeq": 113563 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9440.589756999564" }, "Flags": 16908288, "HighLimit": { "currency": "USD", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6821A772CD6D9CC703438CDE99713837AE7D7606AB31CCF2D1E5E5991A637E43", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-11080.00072727936" } }, "PreviousTxnID": "E969278BF1E342808DFEF55F9D2E086E574AA4770905C405852C42E17C523C49", "PreviousTxnLgrSeq": 113567 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "147406.29545451" }, "Flags": 65536, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "r7stmFYYViSDxXYFZkXtL7fRanUyFwWey", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "708941031E4B7A159C510EA35D723D4439E93E9DAD4C26EE473F640154E190C7", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "999900" } }, "PreviousTxnID": "D852B817F69C4417E76CAAE54C5E78D7D54C04E6FA3C6FC81CCA3A01EAABEF25", "PreviousTxnLgrSeq": 113565 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy" }, "AuctionSlot": { "Account": "r7stmFYYViSDxXYFZkXtL7fRanUyFwWey", "AuthAccounts": [ { "AuthAccount": { "Account": "ra8uHq2Qme5j19TqvPzTE2nqT12Zc3xJmK" } }, { "AuthAccount": { "Account": "rU6o2YguZi847RaiH2QGTkL4eZWZjbxZvk" } } ], "DiscountedFee": 0, "Expiration": 727397182, "Price": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "100" } }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "10227406.29545451" }, "TradingFee": 225, "VoteSlots": [ { "VoteEntry": { "Account": "rKE48YsvrtNfW1mwXGY5zruNnvbQme1EnD", "TradingFee": 350, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rJgu92PQxSMcs4ycLKoCGk4rYgoJeWmexR", "TradingFee": 300, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rGLvAxi5QRBxYnKdg8CqXGnYrFWr1WWi6b", "TradingFee": 150, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rGfys78D1z3gSHE75iYxJzseJQqRKrQcJy", "TradingFee": 200, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rHTFtEYeo8b9Guur4DNADyXnLe28XgEjFb", "TradingFee": 100, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "r3qituSZx5nH6B1ygXvWkB9oNANNagWUYq", "TradingFee": 50, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rnQk7TFb2EWX6QSUBxcy1WtAkfb19NkYXN", "TradingFee": 250, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rPL9AqJtUqw5UWGgizCormAMtZhWoLBwbS", "TradingFee": 400, "VoteWeight": 90 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "9ADECA79A6FA8287F94FDA558E5DDB15C33856E73910991EE842A7B170F45B35", "PreviousFields": { "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "11079900" } } } }, { "ModifiedNode": { "FinalFields": { "Account": "r7stmFYYViSDxXYFZkXtL7fRanUyFwWey", "Balance": "38999999950", "Flags": 8388608, "OwnerCount": 2, "Sequence": 113542 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CE4CB96141255DE701556F0EB79E72EA481B4690C498F29234598E641E6EF2D0", "PreviousFields": { "Balance": "38999999960", "Sequence": 113541 }, "PreviousTxnID": "D852B817F69C4417E76CAAE54C5E78D7D54C04E6FA3C6FC81CCA3A01EAABEF25", "PreviousTxnLgrSeq": 113565 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "90BC4C26A58B8861A2824CB24195CBD1C20E2109A12078AE5FC07CECE8CDAEF6", "ledger_index": 114210, "date": "2023-01-17T23:18:43Z" } ================================================ FILE: src/containers/shared/components/Transaction/AMMWithdraw/test/mock_data/withdraw_usd.json ================================================ { "tx": { "Account": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "Amount": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "value": "100" }, "Asset": { "currency": "XRP", "amount": 0.00001 }, "Asset2": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "amount": 100 }, "Fee": "10", "Flags": 524288, "Sequence": 113542, "SigningPubKey": "031E3709F92AF9138B63CCDEC7357E3779762F3FB3BB56F6966D7040644B0E179C", "TransactionType": "AMMWithdraw", "TxnSignature": "3045022100C19ACC9C27537B055AE16F5D7A92853F83C1A4920355B35E0688C1A3CAD96DB4022006CAAADC90DACE7096629599CF8D1B454D92D5063BAF01155C38F2B5C9492152", "date": "2023-01-18T00:12:42Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "Balance": "29994999950", "Flags": 0, "OwnerCount": 2, "Sequence": 113543 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1E47D3574E19E3D519D57FF5B3A6EE7622A5998A82DF170C440C8CB7AA0015E1", "PreviousFields": { "Balance": "29994999960", "Sequence": 113542 }, "PreviousTxnID": "137D0EF6B80E63EA0D794B744D2B689A4EDCB5E3C94CDB40C5D08CC950BC5F89", "PreviousTxnLgrSeq": 114927 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10340.58975699956" }, "Flags": 16908288, "HighLimit": { "currency": "USD", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6821A772CD6D9CC703438CDE99713837AE7D7606AB31CCF2D1E5E5991A637E43", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10440.58975699956" } }, "PreviousTxnID": "9B4AFEE8FD2E47E71089585A9A0B8E8B2643B0328DA570B9DB1EC1820795CB16", "PreviousTxnLgrSeq": 114526 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy" }, "AuctionSlot": { "Account": "r7stmFYYViSDxXYFZkXtL7fRanUyFwWey", "AuthAccounts": [ { "AuthAccount": { "Account": "ra8uHq2Qme5j19TqvPzTE2nqT12Zc3xJmK" } }, { "AuthAccount": { "Account": "rU6o2YguZi847RaiH2QGTkL4eZWZjbxZvk" } } ], "DiscountedFee": 0, "Expiration": 727397182, "Price": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "100" } }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "10703180.16970725" }, "TradingFee": 225, "VoteSlots": [ { "VoteEntry": { "Account": "rKE48YsvrtNfW1mwXGY5zruNnvbQme1EnD", "TradingFee": 350, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rJgu92PQxSMcs4ycLKoCGk4rYgoJeWmexR", "TradingFee": 300, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rGLvAxi5QRBxYnKdg8CqXGnYrFWr1WWi6b", "TradingFee": 150, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rGfys78D1z3gSHE75iYxJzseJQqRKrQcJy", "TradingFee": 200, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rHTFtEYeo8b9Guur4DNADyXnLe28XgEjFb", "TradingFee": 100, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "r3qituSZx5nH6B1ygXvWkB9oNANNagWUYq", "TradingFee": 50, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rnQk7TFb2EWX6QSUBxcy1WtAkfb19NkYXN", "TradingFee": 250, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rPL9AqJtUqw5UWGgizCormAMtZhWoLBwbS", "TradingFee": 400, "VoteWeight": 90 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "9ADECA79A6FA8287F94FDA558E5DDB15C33856E73910991EE842A7B170F45B35", "PreviousFields": { "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "10754867.45765637" } } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-19100" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "value": "60000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F966CB2731E550DB40887518B4E6E73E4F0F8E63CC77BC6918AF610753977FC2", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-19000" } }, "PreviousTxnID": "9B4AFEE8FD2E47E71089585A9A0B8E8B2643B0328DA570B9DB1EC1820795CB16", "PreviousTxnLgrSeq": 114526 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10475773.87425274" }, "Flags": 1114112, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FE014629D5BE7D92E9A520189D5758FAB0E7A4C672A1F0847AD1B790C04CC395", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10527461.16220186" } }, "PreviousTxnID": "9B4AFEE8FD2E47E71089585A9A0B8E8B2643B0328DA570B9DB1EC1820795CB16", "PreviousTxnLgrSeq": 114526 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "F9D17A67A23EE944E4B8EBF17FBD2AC12F6A2923737754F8D1C21B9055328339", "ledger_index": 115287, "date": "2023-01-18T00:12:42Z" } ================================================ FILE: src/containers/shared/components/Transaction/AMMWithdraw/test/mock_data/withdraw_xrp.json ================================================ { "tx": { "Account": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "Amount": "100000000", "Asset": { "currency": "XRP", "amount": 99.99999 }, "Asset2": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy", "amount": null }, "Fee": "10", "Flags": 524288, "Sequence": 113543, "SigningPubKey": "031E3709F92AF9138B63CCDEC7357E3779762F3FB3BB56F6966D7040644B0E179C", "TransactionType": "AMMWithdraw", "TxnSignature": "3044022002EC2204C4B5DFB2A732390129BCD307C485BE12900D416C72AC4DD0C192616602201B10C6F3A17A32DCD8C7066B45FDDFD621E87D9B6064A82D2B189C6838B3D9E8", "date": "2023-01-18T00:12:52Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "Balance": "30094999940", "Flags": 0, "OwnerCount": 2, "Sequence": 113544 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1E47D3574E19E3D519D57FF5B3A6EE7622A5998A82DF170C440C8CB7AA0015E1", "PreviousFields": { "Balance": "29994999950", "Sequence": 113543 }, "PreviousTxnID": "F9D17A67A23EE944E4B8EBF17FBD2AC12F6A2923737754F8D1C21B9055328339", "PreviousTxnLgrSeq": 115287 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "Balance": "10980000728", "Flags": 59768832, "OwnerCount": 1, "Sequence": 113560 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "86843146392F52D7BD45969F7BD9E6DF62C8D650FC695CFBD1BAE77E2BAFE7F8", "PreviousFields": { "Balance": "11080000728" }, "PreviousTxnID": "E969278BF1E342808DFEF55F9D2E086E574AA4770905C405852C42E17C523C49", "PreviousTxnLgrSeq": 113567 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "Asset": { "currency": "XRP" }, "Asset2": { "currency": "USD", "issuer": "rA3nNmhWKRZvcsA89DxTRbV62JiaSZWdy" }, "AuctionSlot": { "Account": "r7stmFYYViSDxXYFZkXtL7fRanUyFwWey", "AuthAccounts": [ { "AuthAccount": { "Account": "ra8uHq2Qme5j19TqvPzTE2nqT12Zc3xJmK" } }, { "AuthAccount": { "Account": "rU6o2YguZi847RaiH2QGTkL4eZWZjbxZvk" } } ], "DiscountedFee": 0, "Expiration": 727397182, "Price": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "100" } }, "Flags": 0, "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "10654716.50420904" }, "TradingFee": 225, "VoteSlots": [ { "VoteEntry": { "Account": "rKE48YsvrtNfW1mwXGY5zruNnvbQme1EnD", "TradingFee": 350, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rJgu92PQxSMcs4ycLKoCGk4rYgoJeWmexR", "TradingFee": 300, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rGLvAxi5QRBxYnKdg8CqXGnYrFWr1WWi6b", "TradingFee": 150, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rGfys78D1z3gSHE75iYxJzseJQqRKrQcJy", "TradingFee": 200, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rHTFtEYeo8b9Guur4DNADyXnLe28XgEjFb", "TradingFee": 100, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "r3qituSZx5nH6B1ygXvWkB9oNANNagWUYq", "TradingFee": 50, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rnQk7TFb2EWX6QSUBxcy1WtAkfb19NkYXN", "TradingFee": 250, "VoteWeight": 90 } }, { "VoteEntry": { "Account": "rPL9AqJtUqw5UWGgizCormAMtZhWoLBwbS", "TradingFee": 400, "VoteWeight": 90 } } ] }, "LedgerEntryType": "AMM", "LedgerIndex": "9ADECA79A6FA8287F94FDA558E5DDB15C33856E73910991EE842A7B170F45B35", "PreviousFields": { "LPTokenBalance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "10703180.16970725" } } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10427310.20875453" }, "Flags": 1114112, "HighLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rHrzrzVHSyunKzW3JLgSaLcsxfwVLPVV97", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rhmfYgnWbKKwYNJbh3iysPHbz7aparZ1qd", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FE014629D5BE7D92E9A520189D5758FAB0E7A4C672A1F0847AD1B790C04CC395", "PreviousFields": { "Balance": { "currency": "03930D02208264E2E40EC1B0C09E4DB96EE197B1", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10475773.87425274" } }, "PreviousTxnID": "F9D17A67A23EE944E4B8EBF17FBD2AC12F6A2923737754F8D1C21B9055328339", "PreviousTxnLgrSeq": 115287 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "697FF8492BDAB8C4914C93CFA1F38D354E06375616A41604298E7228607C8941", "ledger_index": 115290, "date": "2023-01-18T00:12:52Z" } ================================================ FILE: src/containers/shared/components/Transaction/AccountDelete/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { AccountDelete } from 'xrpl' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { Account } from '../../Account' import { CredentialIDs } from '../CredentialIDs' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const tx = data.instructions return ( <> {tx.DestinationTag && :{tx.DestinationTag}} {tx.CredentialIDs && tx.CredentialIDs.length > 0 && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/AccountDelete/index.ts ================================================ import type { AccountDelete } from 'xrpl' import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' export const AccountDeleteTransaction: TransactionMapping = { Simple, action: TransactionAction.CANCEL, category: TransactionCategory.ACCOUNT, parser: (tx: AccountDelete): AccountDelete => tx, } ================================================ FILE: src/containers/shared/components/Transaction/AccountDelete/test/AccountDeleteSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText, expectSimpleRowLabel, } from '../../test' import { Simple } from '../Simple' import mockAccountDelete from './mock_data/AccountDelete.json' import mockAccountDeleteWithDestinationTag from './mock_data/AccountDeleteWithDestinationTag.json' import mockAccountDeleteWithCredentialIDs from './mock_data/AccountDeleteWithCredentialIDs.json' const renderComponent = createSimpleRenderFactory(Simple) describe('AccountDelete: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockAccountDelete) expectSimpleRowText( container, 'destination', 'raT74sdzpxJUaubcBAQNS8aLqFMU85Rr5J', ) unmount() }) it('renders with destination tag', () => { const { container, unmount } = renderComponent( mockAccountDeleteWithDestinationTag, ) expectSimpleRowText( container, 'destination', 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn:123123', ) unmount() }) it('renders with CredentialIDs', () => { const { container, unmount } = renderComponent( mockAccountDeleteWithCredentialIDs, ) expectSimpleRowText( container, 'destination', 'raT74sdzpxJUaubcBAQNS8aLqFMU85Rr5J', ) expectSimpleRowText( container, 'credential-id-0', '7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955', ) expectSimpleRowLabel(container, 'credential-id-0', 'credential_ids') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AccountDelete/test/mock_data/AccountDelete.json ================================================ { "tx": { "Account": "raf19Ns8czi85kTfia3KJ9ndjSp9baTLyH", "Destination": "raT74sdzpxJUaubcBAQNS8aLqFMU85Rr5J", "Fee": "5000000", "Flags": 2147483648, "Sequence": 58118671, "SigningPubKey": "0211DA2A9AEF04FB772776CD35291AF20DC09A6F0EF52C1A58E4ED43C8685D7093", "TransactionType": "AccountDelete", "TxnSignature": "304402202E61AC4B56BFFD2186D3E9BDECE7B68CD21B9486F691C5B31AA0E84E161E2C1C022048B70011A1D04566883EFEC3E988C31A853B89D18E0159315EF488DE89F7BA8B" }, "meta": { "AffectedNodes": [ { "DeletedNode": { "FinalFields": { "Account": "raf19Ns8czi85kTfia3KJ9ndjSp9baTLyH", "Balance": "0", "Flags": 0, "MessageKey": "020000000000000000000000007C50654DCAE0020232ABB4C236F7CE03CF2784B0", "OwnerCount": 0, "PreviousTxnID": "9A0AD95BA92118D66BDB3DCF86575BAEBE34D3F640146BD5A68D4AC355E56A21", "PreviousTxnLgrSeq": 58233607, "Sequence": 58118672 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1F8BBAE9AD8533D18C1A2DD03E22232D49A28CCF2383D80CEE50735E82900068", "PreviousFields": { "Balance": "19999988", "Sequence": 58118671 } } }, { "ModifiedNode": { "FinalFields": { "Account": "raT74sdzpxJUaubcBAQNS8aLqFMU85Rr5J", "Balance": "11468518495", "Flags": 0, "OwnerCount": 0, "Sequence": 58233435 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "40D5C5FF088C4BC3CA79974DCB585DDD04E9D88FF732AE6E7E36F0FF1CDD4220", "PreviousFields": { "Balance": "11453518507" }, "PreviousTxnID": "9A0AD95BA92118D66BDB3DCF86575BAEBE34D3F640146BD5A68D4AC355E56A21", "PreviousTxnLgrSeq": 58233607 } } ], "DeliveredAmount": "14999988", "TransactionIndex": 34, "TransactionResult": "tesSUCCESS", "delivered_amount": "14999988" }, "hash": "91BCF2965F7381EC01EDA6A36948A23480B566A0DDD3B13610ED8FD59840956D", "ledger_index": 58233707, "date": "2020-09-16T23:18:20Z" } ================================================ FILE: src/containers/shared/components/Transaction/AccountDelete/test/mock_data/AccountDeleteWithCredentialIDs.json ================================================ { "tx": { "Account": "raf19Ns8czi85kTfia3KJ9ndjSp9baTLyH", "Destination": "raT74sdzpxJUaubcBAQNS8aLqFMU85Rr5J", "CredentialIDs": [ "7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955" ], "Fee": "5000000", "Flags": 2147483648, "Sequence": 58118671, "SigningPubKey": "0211DA2A9AEF04FB772776CD35291AF20DC09A6F0EF52C1A58E4ED43C8685D7093", "TransactionType": "AccountDelete", "TxnSignature": "304402202E61AC4B56BFFD2186D3E9BDECE7B68CD21B9486F691C5B31AA0E84E161E2C1C022048B70011A1D04566883EFEC3E988C31A853B89D18E0159315EF488DE89F7BA8B" }, "meta": { "AffectedNodes": [ { "DeletedNode": { "FinalFields": { "Account": "raf19Ns8czi85kTfia3KJ9ndjSp9baTLyH", "Balance": "0", "Flags": 0, "MessageKey": "020000000000000000000000007C50654DCAE0020232ABB4C236F7CE03CF2784B0", "OwnerCount": 0, "PreviousTxnID": "9A0AD95BA92118D66BDB3DCF86575BAEBE34D3F640146BD5A68D4AC355E56A21", "PreviousTxnLgrSeq": 58233607, "Sequence": 58118672 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1F8BBAE9AD8533D18C1A2DD03E22232D49A28CCF2383D80CEE50735E82900068", "PreviousFields": { "Balance": "19999988", "Sequence": 58118671 } } }, { "ModifiedNode": { "FinalFields": { "Account": "raT74sdzpxJUaubcBAQNS8aLqFMU85Rr5J", "Balance": "11468518495", "Flags": 0, "OwnerCount": 0, "Sequence": 58233435 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "40D5C5FF088C4BC3CA79974DCB585DDD04E9D88FF732AE6E7E36F0FF1CDD4220", "PreviousFields": { "Balance": "11453518507" }, "PreviousTxnID": "9A0AD95BA92118D66BDB3DCF86575BAEBE34D3F640146BD5A68D4AC355E56A21", "PreviousTxnLgrSeq": 58233607 } } ], "DeliveredAmount": "14999988", "TransactionIndex": 34, "TransactionResult": "tesSUCCESS", "delivered_amount": "14999988" }, "hash": "91BCF2965F7381EC01EDA6A36948A23480B566A0DDD3B13610ED8FD59840956D", "ledger_index": 58233707, "date": "2020-09-16T23:18:20Z" } ================================================ FILE: src/containers/shared/components/Transaction/AccountDelete/test/mock_data/AccountDeleteWithDestinationTag.json ================================================ { "tx": { "Account": "rQHoYBZ7pvJgh9DpjeELnXiR5uWoLRxyGA", "Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "DestinationTag": 123123, "Fee": "5000000", "Flags": 2147483648, "LastLedgerSequence": 69841530, "Sequence": 67024637, "SigningPubKey": "0263F02703A97E5BD3AA671183D83219522704CCC49D85EB1AC199989181D405A6", "TransactionType": "AccountDelete", "TxnSignature": "3045022100A3AF36CB35476F22B83C2ECB7003D9C0BED72B201C102E774FB75E37908C9911022055C29E1C2CFBFF9610341B352E140AD59F5146BAD02AD90E44BDA05B87749476", "date": "2022-02-21T15:44:11Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "AccountTxnID": "4E0AA11CBDD1760DE95B68DF2ABBE75C9698CEB548BEA9789053FCB3EBD444FB", "Balance": "1026816941", "Domain": "6D64756F31332E636F6D", "EmailHash": "98B4375E1D753E5B91627516F6D70977", "Flags": 9568256, "MessageKey": "0000000000000000000000070000000300", "OwnerCount": 12, "RegularKey": "rD9iJmieYHn8jTtPjwwkW2Wm9sVDvPXLoJ", "Sequence": 385, "TransferRate": 4294967295 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8", "PreviousFields": { "Balance": "1021816941" }, "PreviousTxnID": "8566673ECD0A9731C516906E5D2F47129C5C13713602140733831A56CEAE1A05", "PreviousTxnLgrSeq": 68999137 } }, { "DeletedNode": { "FinalFields": { "Account": "rQHoYBZ7pvJgh9DpjeELnXiR5uWoLRxyGA", "Balance": "0", "Flags": 0, "OwnerCount": 0, "PreviousTxnID": "474E7682B4D9F2B752C7897C5C0362C93397C361D14A5A68F2A4BA2F06E54D7F", "PreviousTxnLgrSeq": 69841432, "Sequence": 67024638 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "377D6778741A746817C993E97BB57F35E528B582B77BE28F9397CBD84E6E5CB0", "PreviousFields": { "Balance": "10000000", "Sequence": 67024637 } } } ], "DeliveredAmount": "5000000", "TransactionIndex": 82, "TransactionResult": "tesSUCCESS", "delivered_amount": "5000000" }, "hash": "6DB88ADABE67CA86A3853122224858B17B60283476B7E7D5A436A56B10725413", "ledger_index": 69841511, "date": "2022-02-21T15:44:11Z" } ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/Description.tsx ================================================ import { useTranslation, Trans } from 'react-i18next' import type { AccountSet } from 'xrpl' import { ACCOUNT_FLAGS } from '../../../transactionUtils' import DomainLink from '../../DomainLink' import { TransactionDescriptionProps } from '../types' import { Account } from '../../Account' export const Description = ({ data, }: TransactionDescriptionProps) => { const { t } = useTranslation() const { tx } = data return ( <> {tx.Domain && (
    {t('set_domain_description')}
    )} {tx.EmailHash && (
    {t('set_email_description')} {tx.EmailHash}
    )} {tx.MessageKey && (
    {t('set_message_key_description')} {tx.MessageKey}
    )} {tx.SetFlag && (
    {t('set_flag_description')} {' '} {ACCOUNT_FLAGS[tx.SetFlag] || tx.SetFlag}
    )} {tx.ClearFlag && (
    {t('clear_flag_description')} {' '} {ACCOUNT_FLAGS[tx.ClearFlag] || tx.ClearFlag}
    )} {tx.NFTokenMinter && (
    )} ) } ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { AccountSet } from 'xrpl' import { ACCOUNT_FLAGS } from '../../../transactionUtils' import DomainLink from '../../DomainLink' import { Account } from '../../Account' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const tx = data.instructions return ( <> {tx.Domain && ( )} {tx.EmailHash && ( {tx.EmailHash} )} {tx.MessageKey && ( {tx.MessageKey} )} {tx.SetFlag && ( {ACCOUNT_FLAGS[tx.SetFlag] || tx.SetFlag} )} {tx.ClearFlag && ( {ACCOUNT_FLAGS[tx.ClearFlag] || tx.ClearFlag} )} {tx.NFTokenMinter && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import type { AccountSet } from 'xrpl' import { ACCOUNT_FLAGS, decodeHex } from '../../../transactionUtils' import { Account } from '../../Account' import { TransactionTableDetailProps } from '../types' export const TableDetail = ({ instructions: tx, }: TransactionTableDetailProps) => { const { t } = useTranslation() return ( <> {tx.Domain && (
    {t('domain')}:{' '} {decodeHex(tx.Domain)}
    )} {tx.EmailHash && (
    {t('email_hash')}:{' '} {tx.EmailHash}
    )} {tx.MessageKey && (
    {t('message_key')}:{' '} {tx.MessageKey}
    )} {tx.SetFlag && (
    {t('set_flag')}:{' '} {ACCOUNT_FLAGS[Number(tx.SetFlag)] || tx.SetFlag}
    )} {tx.ClearFlag && (
    {t('clear_flag')}:{' '} {ACCOUNT_FLAGS[Number(tx.ClearFlag)] || tx.ClearFlag}
    )} {tx.NFTokenMinter && (
    {t('nftoken_minter')}:{' '}
    )} ) } ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/index.tsx ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const AccountSetTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.MODIFY, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/test/AccountSetDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { Description } from '../Description' import { createDescriptionRenderFactory } from '../../test' import mockAccountSetWithDomain from './mock_data/AccountSetWithDomain.json' import mockAccountSetWithClearFlag from './mock_data/AccountSetWithClearFlag.json' import mockAccountSetWithSetFlag from './mock_data/AccountSetWithSetFlag.json' import mockAccountSetWithMessageKey from './mock_data/AccountSetWithMessageKey.json' import mockAccountSetWithNFTokenMinter from './mock_data/AccountSetWithNFTokenMinter.json' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('AccountSet: Description', () => { it('renders tx that sets the domain', () => { const { container, unmount } = renderComponent(mockAccountSetWithDomain) expect(container).toHaveTextContent( 'It sets the account domain as mduo13.com', ) unmount() }) it('renders tx that sets the email hash', () => { const { container, unmount } = renderComponent({ ...mockAccountSetWithDomain, tx: { ...mockAccountSetWithDomain.tx, Domain: undefined, EmailHash: '7AC3878BF42A5329698F468A6AAA03B9', }, }) expect(container).toHaveTextContent( 'It sets the account email hash as 7AC3878BF42A5329698F468A6AAA03B9', ) unmount() }) it('renders tx that clears a flag', () => { const { container, unmount } = renderComponent(mockAccountSetWithClearFlag) expect(container).toHaveTextContent( 'It clears the account flag asfGlobalFreeze', ) unmount() }) it('renders tx that sets a flag', () => { const { container, unmount } = renderComponent(mockAccountSetWithSetFlag) expect(container).toHaveTextContent( 'It sets the account flag asfRequireDest', ) unmount() }) it('renders tx that clears a flag that is not defined', () => { const { container, unmount } = renderComponent({ ...mockAccountSetWithClearFlag, tx: { ...mockAccountSetWithClearFlag.tx, ClearFlag: 45 }, }) expect(container).toHaveTextContent('It clears the account flag 45') unmount() }) it('renders tx that sets a flag that is not defined', () => { const { container, unmount } = renderComponent({ ...mockAccountSetWithSetFlag, tx: { ...mockAccountSetWithSetFlag.tx, SetFlag: 45 }, }) expect(container).toHaveTextContent('It sets the account flag 45') unmount() }) it('renders tx that sets a message', () => { const { container, unmount } = renderComponent(mockAccountSetWithMessageKey) expect( container.querySelector('[data-testid="message-key"]'), ).toHaveTextContent( 'It sets the account message key as 020000000000000000000000000941C216565D33C8A8ACD1A33C359E84D652D1DA', ) unmount() }) it('renders tx that sets a minter', () => { const { container, unmount } = renderComponent( mockAccountSetWithNFTokenMinter, ) expect(container.querySelector('[data-testid="minter"]')).toHaveTextContent( 'It sets rXMART8usFd5kABXCayoP6ZfB35b4v43t as the authorized minter for this account', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/test/AccountSetSimple.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockAccountSetWithDomain from './mock_data/AccountSetWithDomain.json' import mockAccountSetWithClearFlag from './mock_data/AccountSetWithClearFlag.json' import mockAccountSetWithSetFlag from './mock_data/AccountSetWithSetFlag.json' import mockAccountSetWithMessageKey from './mock_data/AccountSetWithMessageKey.json' import mockAccountSetWithNFTokenMinter from './mock_data/AccountSetWithNFTokenMinter.json' import { expectSimpleRowLabel, expectSimpleRowText } from '../../test' const renderComponent = createSimpleRenderFactory(Simple, i18n) describe('AccountSet: Simple', () => { it('renders tx that sets the domain', () => { const { container, unmount } = renderComponent(mockAccountSetWithDomain) expectSimpleRowLabel(container, 'domain', 'domain') expectSimpleRowText(container, 'domain', 'mduo13.com') unmount() }) it('renders tx that sets the email hash', () => { const { container } = renderComponent({ ...mockAccountSetWithDomain, tx: { ...mockAccountSetWithDomain.tx, Domain: undefined, EmailHash: '7AC3878BF42A5329698F468A6AAA03B9', }, }) expectSimpleRowLabel(container, 'email', 'email hash') expectSimpleRowText(container, 'email', '7AC3878BF42A5329698F468A6AAA03B9') }) it('renders tx that clears a flag', () => { const { container, unmount } = renderComponent(mockAccountSetWithClearFlag) expectSimpleRowLabel(container, 'clear-flag', 'clear flag') expectSimpleRowText(container, 'clear-flag', 'asfGlobalFreeze') unmount() }) it('renders tx that sets a flag', () => { const { container, unmount } = renderComponent(mockAccountSetWithSetFlag) expectSimpleRowLabel(container, 'set-flag', 'set flag') expectSimpleRowText(container, 'set-flag', 'asfRequireDest') unmount() }) it('renders tx that clears a flag without a defined flag', () => { const { container, unmount } = renderComponent({ ...mockAccountSetWithClearFlag, tx: { ...mockAccountSetWithClearFlag.tx, ClearFlag: 45 }, }) expectSimpleRowLabel(container, 'clear-flag', 'clear flag') expectSimpleRowText(container, 'clear-flag', '45') unmount() }) it('renders tx that sets a flag without a defined flag', () => { const { container, unmount } = renderComponent({ ...mockAccountSetWithSetFlag, tx: { ...mockAccountSetWithSetFlag.tx, SetFlag: 45 }, }) expectSimpleRowLabel(container, 'set-flag', 'set flag') expectSimpleRowText(container, 'set-flag', '45') unmount() }) it('renders tx that sets a message', () => { const { container, unmount } = renderComponent(mockAccountSetWithMessageKey) expectSimpleRowLabel(container, 'message', 'message key') expectSimpleRowText( container, 'message', '020000000000000000000000000941C216565D33C8A8ACD1A33C359E84D652D1DA', ) unmount() }) it('renders tx that sets a minter', () => { const { container, unmount } = renderComponent( mockAccountSetWithNFTokenMinter, ) expectSimpleRowLabel(container, 'minter', 'NFT Minter') expectSimpleRowText( container, 'minter', 'rXMART8usFd5kABXCayoP6ZfB35b4v43t', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/test/AccountSetTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import i18n from '../../../../../../i18n/testConfigEnglish' import { TableDetail } from '../TableDetail' import mockAccountSetWithDomain from './mock_data/AccountSetWithDomain.json' import mockAccountSetWithClearFlag from './mock_data/AccountSetWithClearFlag.json' import mockAccountSetWithSetFlag from './mock_data/AccountSetWithSetFlag.json' import mockAccountSetWithMessageKey from './mock_data/AccountSetWithMessageKey.json' import mockAccountSetWithNFTokenMinter from './mock_data/AccountSetWithNFTokenMinter.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('AccountSet: TableDetail', () => { it('renders tx that sets the domain', () => { const { container, unmount } = renderComponent(mockAccountSetWithDomain) expect(container).toHaveTextContent('domain: mduo13.com') unmount() }) it('renders tx that sets the email hash', () => { const { container, unmount } = renderComponent({ ...mockAccountSetWithDomain, tx: { ...mockAccountSetWithDomain.tx, Domain: undefined, EmailHash: '7AC3878BF42A5329698F468A6AAA03B9', }, }) expect(container).toHaveTextContent( 'email hash: 7AC3878BF42A5329698F468A6AAA03B9', ) unmount() }) it('renders tx that clears a flag', () => { const { container, unmount } = renderComponent(mockAccountSetWithClearFlag) expect(container).toHaveTextContent('clear flag: asfGlobalFreeze') unmount() }) it('renders tx that sets a flag', () => { const { container, unmount } = renderComponent(mockAccountSetWithSetFlag) expect(container).toHaveTextContent('set flag: asfRequireDest') unmount() }) it('renders tx that clears a flag that is not defined', () => { const { container, unmount } = renderComponent({ ...mockAccountSetWithClearFlag, tx: { ...mockAccountSetWithClearFlag.tx, ClearFlag: 45 }, }) expect(container).toHaveTextContent('clear flag: 45') unmount() }) it('renders tx that sets a flag that is not defined', () => { const { container, unmount } = renderComponent({ ...mockAccountSetWithSetFlag, tx: { ...mockAccountSetWithSetFlag.tx, SetFlag: 45 }, }) expect(container).toHaveTextContent('set flag: 45') unmount() }) it('renders tx that sets a message', () => { const { container, unmount } = renderComponent(mockAccountSetWithMessageKey) expect(container).toHaveTextContent( 'message key: 020000000000000000000000000941C216565D33C8A8ACD1A33C359E84D652D1DA', ) unmount() }) it('renders tx that sets a minter', () => { const { container, unmount } = renderComponent( mockAccountSetWithNFTokenMinter, ) expect(container.querySelector('[data-testid="minter"]')).toHaveTextContent( 'NFT Minter: rXMART8usFd5kABXCayoP6ZfB35b4v43t', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/test/mock_data/AccountSetWithClearFlag.json ================================================ { "tx": { "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "ClearFlag": 7, "Fee": "12000", "Flags": 2147483648, "LastLedgerSequence": 18123085, "Sequence": 350, "SigningPubKey": "03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB", "TransactionType": "AccountSet", "TxnSignature": "3045022100EBDF1A5718BC47251ADDE4F84A7971AB9D2886DDA7E20016B9373DF2AA88161B02201958A3E7E594F0FACC8F29C7505288626CF73E7225DF8EA1EC9797AA0F8AD2B6", "date": "2016-01-06T22:58:50Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "AccountTxnID": "719D520BBA197666BADE09A68D059709D6155AE80E29DF19FDC53EEF25B1A915", "Balance": "100270663", "Domain": "6D64756F31332E636F6D", "EmailHash": "98B4375E1D753E5B91627516F6D70977", "Flags": 8388608, "MessageKey": "0000000000000000000000070000000300", "OwnerCount": 4, "Sequence": 351, "TransferRate": 1004999999 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8", "PreviousFields": { "AccountTxnID": "7955A09FEC8D20CA20F39B67908C219F6B3E64C24E1EFABAA672E440186B8667", "Balance": "100282663", "Flags": 12582912, "Sequence": 350 }, "PreviousTxnID": "7955A09FEC8D20CA20F39B67908C219F6B3E64C24E1EFABAA672E440186B8667", "PreviousTxnLgrSeq": 18121764 } } ], "TransactionIndex": 4, "TransactionResult": "tesSUCCESS" }, "hash": "719D520BBA197666BADE09A68D059709D6155AE80E29DF19FDC53EEF25B1A915", "ledger_index": 18123084, "date": "2016-01-06T22:58:50Z" } ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/test/mock_data/AccountSetWithDomain.json ================================================ { "tx": { "Account": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", "Domain": "6D64756F31332E636F6D", "Fee": "12", "Flags": 0, "LastLedgerSequence": 69173351, "Sequence": 16, "SigningPubKey": "02B3EC4E5DD96029A647CFA20DA07FE1F85296505552CCAC114087E66B46BD77DF", "TransactionType": "AccountSet", "TxnSignature": "3044022012424CC922880F7196DF03C9D14C71631527A36FF10FB460CC45B5B406675E8F02205A1BB0F42CCABBE252C82F4F94B21307D8B0A4341E85D5F7DEC3AAF18CB8EE24", "date": "2022-01-22T02:27:41Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW", "Balance": "20323989", "Domain": "6D64756F31332E636F6D", "Flags": 0, "OwnerCount": 1, "Sequence": 17, "TransferRate": 1005000000 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F0D5C006F9DD3227B13516AA3DC8CC14909954496F1876051D646639ACB34C02", "PreviousFields": { "Balance": "20324001", "Sequence": 16 }, "PreviousTxnID": "BDF144FA668838F8485B4FF677291F7039137A5247D616519D0BB8BC234952F7", "PreviousTxnLgrSeq": 67118406 } } ], "TransactionIndex": 25, "TransactionResult": "tesSUCCESS" }, "hash": "09F5E55AD8309310A536852A1321A7B8FDEBF5F7F8DDE8D78A6C70DACCBEC707", "ledger_index": 69173333, "date": "2022-01-22T02:27:41Z" } ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/test/mock_data/AccountSetWithMessageKey.json ================================================ { "tx": { "Account": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX", "Fee": "12", "Flags": 2147483648, "LastLedgerSequence": 60069268, "MessageKey": "020000000000000000000000000941C216565D33C8A8ACD1A33C359E84D652D1DA", "Sequence": 35, "SigningPubKey": "ED9F3F4ECF8F66D7727847B569EC055F637FA059A08623E63EFE78DFC9F42C1299", "TransactionType": "AccountSet", "TxnSignature": "653F6BE81D8BDA15FA4DAACAA3968A286CDD59484933046C66B2163543DF7A81996EFE2EA29BB5713FA276F59355811342008D6E9AB1C212D12010A396E0B500", "date": "2020-12-08T02:05:40Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX", "Balance": "79723222395", "Domain": "6D64756F31332E636F6D", "Flags": 65536, "MessageKey": "020000000000000000000000000941C216565D33C8A8ACD1A33C359E84D652D1DA", "OwnerCount": 2, "RegularKey": "rUnMgNT74LreSH8i23FbonW8iYfADyq5tR", "Sequence": 36 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "43EA78783A089B137D5E87610DF3BD4129F989EDD02EFAF6C265924D3A0EF8CE", "PreviousFields": { "Balance": "79723222407", "Sequence": 35 }, "PreviousTxnID": "EEA6B31F6E49D4F59103F20E51BCB44919ACFDC51861616F397B8FA66E2F8861", "PreviousTxnLgrSeq": 60069210 } } ], "TransactionIndex": 12, "TransactionResult": "tesSUCCESS" }, "hash": "79050F3835F7D1B806206E5F9E43939C5B624EC0D246264D6761110BF5818C62", "ledger_index": 60069265, "date": "2020-12-08T02:05:40Z" } ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/test/mock_data/AccountSetWithNFTokenMinter.json ================================================ { "tx": { "Account": "rUBZRgMztpzMUVz4Ne67pAUisBtvqU6Coc", "Fee": "225", "LastLedgerSequence": 75444767, "NFTokenMinter": "rXMART8usFd5kABXCayoP6ZfB35b4v43t", "Sequence": 75425977, "SetFlag": 10, "SigningPubKey": "EDADF95E0375381F32BDEB63A980E5378AECE1F59FD255977D7800C40E9A3618DF", "TransactionType": "AccountSet", "TxnSignature": "73DFC88CB11471707BE18F4D985866C65ECB7F186A41216ADA2545D72CCFEBD438B17415E199F7EE1C24540BA8C948E297595ACB7D5007584A921BEC5685FB01", "date": "2022-10-31T22:14:31Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rUBZRgMztpzMUVz4Ne67pAUisBtvqU6Coc", "Balance": "19999715", "Flags": 0, "NFTokenMinter": "rXMART8usFd5kABXCayoP6ZfB35b4v43t", "OwnerCount": 1, "Sequence": 75425978 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EA67F0BBF06894FBAA495C20B960D5D649C218F3FD167BF6866AF52E102C4CAB", "PreviousFields": { "Balance": "19999940", "Sequence": 75425977 }, "PreviousTxnID": "95382C7B8C71D8CBF77B6A65FEA37FDD6C1FDBBD1AC8C35DF9F2E6ADEB7F75F4", "PreviousTxnLgrSeq": 75444695 } } ], "TransactionIndex": 16, "TransactionResult": "tesSUCCESS" }, "hash": "180F2A55E2E06396D835A49B834595D2A9E5842E2C0E95AE3F85716926BFDAA1", "ledger_index": 75444759, "date": "2022-10-31T22:14:31Z" } ================================================ FILE: src/containers/shared/components/Transaction/AccountSet/test/mock_data/AccountSetWithSetFlag.json ================================================ { "tx": { "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "Fee": "10000", "Flags": 0, "Sequence": 355, "SetFlag": 1, "SigningPubKey": "03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB", "TransactionType": "AccountSet", "TxnSignature": "304402201BE9677917AD0DB5DC988A1737F62C0364BB0147BDF9A8F7097030C8E8557CC202201A0CA1B5C9F815CA86DFCD548596DA6F4C0FBD3C398FBE129044D1F35D1066F5", "date": "2016-01-22T22:09:51Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "AccountTxnID": "C464D4D13DCB88BA72C1B7A389E748BF7504CA52A7104692E55B41CA499110A3", "Balance": "100211663", "Domain": "6D64756F31332E636F6D", "EmailHash": "98B4375E1D753E5B91627516F6D70977", "Flags": 9043968, "MessageKey": "0000000000000000000000070000000300", "OwnerCount": 4, "Sequence": 356, "TransferRate": 1004999999 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8", "PreviousFields": { "AccountTxnID": "59025DD6C9848679BA433448A1DD95833F2F4B64B03E214D074C7A5B6E3E3E70", "Balance": "100221663", "Flags": 8912896, "Sequence": 355 }, "PreviousTxnID": "F93F189C54D99397E97AD036830AEE129883C4C2F6A6DF3747797C86E62DA790", "PreviousTxnLgrSeq": 18406205 } } ], "TransactionIndex": 7, "TransactionResult": "tesSUCCESS" }, "hash": "C464D4D13DCB88BA72C1B7A389E748BF7504CA52A7104692E55B41CA499110A3", "ledger_index": 18424170, "date": "2016-01-22T22:09:51Z" } ================================================ FILE: src/containers/shared/components/Transaction/Batch/Description.tsx ================================================ import { Trans } from 'react-i18next' import { TransactionDescriptionProps } from '../types' import { Account } from '../../Account' export const Description = ({ data }: TransactionDescriptionProps) => { const Signers = data.tx.BatchSigners function renderSigners() { return Signers.map((signer, index) => ( {index < Signers.length - 1 && ', '} )) } return Signers ? (
    {renderSigners()}, }} />
    ) : null } ================================================ FILE: src/containers/shared/components/Transaction/Batch/Simple.tsx ================================================ import { Trans, useTranslation } from 'react-i18next' import { useContext } from 'react' import { useQuery } from 'react-query' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { SimpleGroup } from '../SimpleGroup' import { Account } from '../../Account' import { TRANSACTION_ROUTE } from '../../../../App/routes' import { RouteLink } from '../../../routing' import SocketContext from '../../../SocketContext' import { getBatchTxStatus } from './utils' import '../../../css/txstatus.scss' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const { batchTransactions } = data.instructions const { data: updatedBatchTransactions = [] } = useQuery( ['batchTxStatus', batchTransactions], () => getBatchTxStatus(rippledSocket, batchTransactions), { enabled: !!batchTransactions.length && !!rippledSocket, }, ) const renderFailedStatus = (status) => { if (status === 'not validated') { return t('not-validated') } return {status} } const renderBatchTransaction = (tx) => ( {tx.successful || tx.status !== 'not validated' ? ( {tx.hash} ) : ( tx.hash )} {tx.successful ? ( t('successful') ) : ( {renderFailedStatus(tx.status)} ), }} /> )} ) return <>{updatedBatchTransactions.map(renderBatchTransaction)} } ================================================ FILE: src/containers/shared/components/Transaction/Batch/TableDetail.tsx ================================================ import { Trans, useTranslation } from 'react-i18next' import { useContext } from 'react' import { useQuery } from 'react-query' import { TransactionTableDetailProps } from '../types' import SocketContext from '../../../SocketContext' import { getBatchTxStatus } from './utils' import { RouteLink } from '../../../routing' import { TRANSACTION_ROUTE } from '../../../../App/routes' export const TableDetail = ({ instructions: tx, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { batchTransactions } = tx const rippledSocket = useContext(SocketContext) const { data: updatedBatchTransactions = [] } = useQuery( ['batchTxStatus', batchTransactions], () => getBatchTxStatus(rippledSocket, batchTransactions), { enabled: !!batchTransactions.length && !!rippledSocket, }, ) function renderTxList() { const successfulTxs = updatedBatchTransactions.filter( (transaction) => transaction.successful, ) return successfulTxs.map((transaction, index) => ( {transaction.hash} {index < successfulTxs.length - 1 && ', '} )) } return ( <>
    {t('batch')}, }} values={{ batch_count: batchTransactions.length, }} />
    {renderTxList()}, }} />
    ) } ================================================ FILE: src/containers/shared/components/Transaction/Batch/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' import { Description } from './Description' import { parser } from './parser' export const BatchTransaction: TransactionMapping = { Simple, Description, TableDetail, action: TransactionAction.CREATE, category: TransactionCategory.OTHER, parser, } ================================================ FILE: src/containers/shared/components/Transaction/Batch/parser.ts ================================================ import type { Batch } from 'xrpl' import { hashSignedTx } from './utils' export function parser(tx: Batch) { const batchTransactions = tx.RawTransactions.map((transaction) => ({ Account: transaction.RawTransaction.Account, hash: hashSignedTx(transaction.RawTransaction), })) const batchSigners = tx.BatchSigners?.map((signer) => ({ Account: signer.BatchSigner.Account, })) return { batchTransactions, batchSigners } } ================================================ FILE: src/containers/shared/components/Transaction/Batch/test/BatchDescription.test.tsx ================================================ import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import Batch from './mock_data/Batch.json' import i18n from '../../../../../../i18n/testConfigEnglish' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('Clawback', () => { it('handles Clawback Description ', () => { const { container, unmount } = renderComponent(Batch) expect(container.querySelector('[data-testid="desc"]')).toHaveTextContent( `Batch Signers: ` + `rGPoXHWJgeSQow8NQYZgW6HT82GMwTLAaB, ` + `rH84ztgQsQuUnZwaM3ujHjQQJYEf4NR59M`, ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/Batch/test/BatchSimple.test.tsx ================================================ import { render, waitFor } from '@testing-library/react' import { expectSimpleRowText } from '../../test' import { QuickHarness } from '../../../../../test/utils' import { Simple } from '../Simple' import * as rippled from '../../../../../../rippled/lib/rippled' import SocketContext from '../../../../SocketContext' import MockWsClient from '../../../../../test/mockWsClient' import summarizeTransaction from '../../../../../../rippled/lib/txSummary' import i18n from '../../../../../../i18n/testConfigEnglish' import Batch from './mock_data/Batch.json' import InnerTransactionSuccessful from './mock_data/InnerTxSuccessful.json' import InnerTransactionFailed from './mock_data/InnerTxFailed.json' jest.mock('../../../../../../rippled/lib/rippled', () => ({ __esModule: true, getTransaction: jest.fn(), })) const mockedGetTransaction = rippled.getTransaction as jest.Mock function renderComponent(tx: any, socketMock: any = {}) { const data = summarizeTransaction(tx, true) return render( , ) } describe('Batch: Simple', () => { let client beforeEach(() => { client = new MockWsClient() }) afterEach(() => { client.close() mockedGetTransaction.mockReset() }) it('renders', async () => { mockedGetTransaction.mockImplementation((_, txId) => { if ( txId === 'EB5933399A49541B65552C5B5959AEECC520D10B946EC30F5A39B9EAA16C7D56' ) { return Promise.resolve(InnerTransactionSuccessful) } return Promise.reject(new Error('transaction not found')) }) const { container } = renderComponent(Batch, client) await waitFor(() => { expect(container.querySelectorAll('.group')).toHaveLength(3) }) const groups = container.querySelectorAll('.group') const innerTx1 = groups[0] const innerTx2 = groups[1] const innerTx3 = groups[2] expectSimpleRowText( innerTx1, 'tx-account', 'rGfNFbXcdrx1t7UDEzrJkPCVBRAR2o6HVc', ) expectSimpleRowText( innerTx1, 'tx-hash', 'EB5933399A49541B65552C5B5959AEECC520D10B946EC30F5A39B9EAA16C7D56', ) expectSimpleRowText(innerTx1, 'tx-status', 'Successful') expectSimpleRowText( innerTx2, 'tx-account', 'rH84ztgQsQuUnZwaM3ujHjQQJYEf4NR59M', ) expectSimpleRowText( innerTx2, 'tx-hash', 'FD62E8028755E60A8529C76861FAF31A71C97AEAE4E1B27D2D3FAAD234272C11', ) expectSimpleRowText(innerTx2, 'tx-status', 'Failed (Not Validated)') expectSimpleRowText( innerTx3, 'tx-account', 'rGPoXHWJgeSQow8NQYZgW6HT82GMwTLAaB', ) expectSimpleRowText( innerTx3, 'tx-hash', 'B7EB7E00B47E4CD57FECAB8E0EBAF5EB9471C66A3F80CB5C7D88856FAA7CD090', ) expectSimpleRowText(innerTx3, 'tx-status', 'Failed (Not Validated)') }) it('show failed transaction', async () => { mockedGetTransaction.mockImplementation((_, txId) => { if ( txId === 'EB5933399A49541B65552C5B5959AEECC520D10B946EC30F5A39B9EAA16C7D56' ) { return Promise.resolve(InnerTransactionFailed) } return Promise.reject(new Error('transaction not found')) }) const { container } = renderComponent(Batch, client) await waitFor(() => { expect(container.querySelectorAll('.group')).toHaveLength(3) }) const innerTx1 = container.querySelectorAll('.group')[0] expectSimpleRowText( innerTx1, 'tx-account', 'rGfNFbXcdrx1t7UDEzrJkPCVBRAR2o6HVc', ) expectSimpleRowText( innerTx1, 'tx-hash', 'EB5933399A49541B65552C5B5959AEECC520D10B946EC30F5A39B9EAA16C7D56', ) expectSimpleRowText(innerTx1, 'tx-status', 'Failed (tecUNFUNDED_PAYMENT)') }) }) ================================================ FILE: src/containers/shared/components/Transaction/Batch/test/BatchTableDetail.test.tsx ================================================ import { render, waitFor } from '@testing-library/react' import i18n from '../../../../../../i18n/testConfigEnglish' import * as rippled from '../../../../../../rippled/lib/rippled' import { TableDetail } from '../TableDetail' import Batch from './mock_data/Batch.json' import InnerTransaction from './mock_data/InnerTxSuccessful.json' import MockWsClient from '../../../../../test/mockWsClient' import summarizeTransaction from '../../../../../../rippled/lib/txSummary' import { QuickHarness } from '../../../../../test/utils' import SocketContext from '../../../../SocketContext' function renderComponent(tx: any, socketMock: any = {}) { const data = summarizeTransaction(tx, true) return render( , ) } jest.mock('../../../../../../rippled/lib/rippled', () => ({ __esModule: true, getTransaction: jest.fn(), })) const mockedGetTransaction = rippled.getTransaction as jest.Mock describe('Batch: TableDetail', () => { let client beforeEach(() => { client = new MockWsClient() }) afterEach(() => { client.close() mockedGetTransaction.mockReset() }) it('renders', async () => { mockedGetTransaction.mockImplementation((_, txId) => { if ( txId === 'EB5933399A49541B65552C5B5959AEECC520D10B946EC30F5A39B9EAA16C7D56' ) { return Promise.resolve(InnerTransaction) } return Promise.reject(new Error('transaction not found')) }) const { container } = renderComponent(Batch) await waitFor(() => { expect(container).toHaveTextContent( 'Batch 3 transactions' + 'Applied Inner Transactions: ' + 'EB5933399A49541B65552C5B5959AEECC520D10B946EC30F5A39B9EAA16C7D56', ) }) }) }) ================================================ FILE: src/containers/shared/components/Transaction/Batch/test/mock_data/Batch.json ================================================ { "tx": { "Account": "rGfNFbXcdrx1t7UDEzrJkPCVBRAR2o6HVc", "BatchSigners": [ { "BatchSigner": { "Account": "rGPoXHWJgeSQow8NQYZgW6HT82GMwTLAaB", "SigningPubKey": "ED69F00948A324C474E76D9FDB9786DB7A8F1C4494EF0DF157CB6C7FD2B3825546", "TxnSignature": "07D05F59CA2A00CC18548E9BD05AFAEEBD24827050AAC5E87DDEA8CF605B8CC996194F9CF91AC7651018AC158EF8E91A70FC938D03CA5F7809D134350B83B508" } }, { "BatchSigner": { "Account": "rH84ztgQsQuUnZwaM3ujHjQQJYEf4NR59M", "SigningPubKey": "EDD0172DDA3EE826BA95B23A3D4299461381A09E2A9DB981F924787FDCF1237D94", "TxnSignature": "DC3A2F4C25DC4E4D7FB20F620F0D403AC628F1F135AF1CDD060A6FAA60C87ED595A81D7860EED3A1D6E999DFE17EA45F9D649C55FE559CC298F3F2BF19363F00" } } ], "Fee": "8", "Flags": 131072, "LastLedgerSequence": 4105155, "RawTransactions": [ { "RawTransaction": { "Account": "rGfNFbXcdrx1t7UDEzrJkPCVBRAR2o6HVc", "Amount": "10000000", "Destination": "rs6Skg9oNmbCS2FeHLkYXTvz5QmBbqotbm", "Fee": "0", "Flags": 1073741824, "Sequence": 4105131, "SigningPubKey": "", "TransactionType": "Payment" } }, { "RawTransaction": { "Account": "rH84ztgQsQuUnZwaM3ujHjQQJYEf4NR59M", "Amount": "10000000", "Destination": "rs6Skg9oNmbCS2FeHLkYXTvz5QmBbqotbm", "Fee": "0", "Flags": 1073741824, "Sequence": 4105134, "SigningPubKey": "", "TransactionType": "Payment" } }, { "RawTransaction": { "Account": "rGPoXHWJgeSQow8NQYZgW6HT82GMwTLAaB", "Amount": "10000000", "Destination": "rs6Skg9oNmbCS2FeHLkYXTvz5QmBbqotbm", "Fee": "0", "Flags": 1073741824, "Sequence": 4105135, "SigningPubKey": "", "TransactionType": "Payment" } } ], "Sequence": 4105130, "SigningPubKey": "ED22122357075DF80555FBD7B4B16E777ABD05C3C2CFAD75E9A6A99FD78729BB19", "TransactionType": "Batch", "TxnSignature": "97EA43481D8448544B49580E42BACFD6BCAA3B9B13C940BE3BC9C71D2D81B3D9EA92AFDB35A2AB22780ED6F1D837437BF2B8A291987F17463AD602F13EBA2806", "ctid": "C03EA3B100000002", "date": 1751382100000, "hash": "9B956A77943DF3FB891DD14D2D41A87CD6E5FA8CC606A097F47319EE6110ABA1", "inLedger": 4105137, "ledger_index": 4105137, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rGfNFbXcdrx1t7UDEzrJkPCVBRAR2o6HVc", "Balance": "99999992", "Flags": 0, "OwnerCount": 0, "Sequence": 4105131 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C944D2DAB07823AF102AE4C26D9E4561928045392428DD5040F97CED66851A07", "PreviousFields": { "Balance": "100000000", "Sequence": 4105130 }, "PreviousTxnID": "E1456C423164AC5F86226994DCD899C1B3A59A63F8B21568BB1847D38537883E", "PreviousTxnLgrSeq": 4105130 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rGfNFbXcdrx1t7UDEzrJkPCVBRAR2o6HVc", "Balance": "99999992", "Flags": 0, "OwnerCount": 0, "Sequence": 4105131 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C944D2DAB07823AF102AE4C26D9E4561928045392428DD5040F97CED66851A07", "PreviousFields": { "Balance": "100000000", "Sequence": 4105130 }, "PreviousTxnID": "E1456C423164AC5F86226994DCD899C1B3A59A63F8B21568BB1847D38537883E", "PreviousTxnLgrSeq": 4105130 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "9B956A77943DF3FB891DD14D2D41A87CD6E5FA8CC606A097F47319EE6110ABA1", "ledger_index": 4105137, "date": 1751382100000 } ================================================ FILE: src/containers/shared/components/Transaction/Batch/test/mock_data/InnerTxFailed.json ================================================ { "Account": "rGfNFbXcdrx1t7UDEzrJkPCVBRAR2o6HVc", "Amount": "10000000", "DeliverMax": "10000000", "Destination": "rs6Skg9oNmbCS2FeHLkYXTvz5QmBbqotbm", "Fee": "0", "Flags": 1073741824, "Sequence": 4105131, "SigningPubKey": "", "TransactionType": "Payment", "ctid": "C03EA3B100010002", "date": 804697300, "hash": "EB5933399A49541B65552C5B5959AEECC520D10B946EC30F5A39B9EAA16C7D56", "inLedger": 4105137, "ledger_index": 4105137, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rs6Skg9oNmbCS2FeHLkYXTvz5QmBbqotbm", "Balance": "9999990", "Flags": 0, "OwnerCount": 0, "Sequence": 4105132 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "63BAFBAE46A0E3C6711A8E5020A49886B2FCA50AD9204017BE2BBDB02F025A88", "PreviousFields": { "Balance": "100000000" }, "PreviousTxnID": "63043E9063DBF29379845C3A38D305BBC7B7622E5380193B657C29AFAF57C41E", "PreviousTxnLgrSeq": 4105132 } } ], "ParentBatchID": "9B956A77943DF3FB891DD14D2D41A87CD6E5FA8CC606A097F47319EE6110ABA1", "TransactionIndex": 1, "TransactionResult": "tecUNFUNDED_PAYMENT", "delivered_amount": "10000000" }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/Batch/test/mock_data/InnerTxSuccessful.json ================================================ { "Account": "rGfNFbXcdrx1t7UDEzrJkPCVBRAR2o6HVc", "Amount": "10000000", "DeliverMax": "10000000", "Destination": "rs6Skg9oNmbCS2FeHLkYXTvz5QmBbqotbm", "Fee": "0", "Flags": 1073741824, "Sequence": 4105131, "SigningPubKey": "", "TransactionType": "Payment", "ctid": "C03EA3B100010002", "date": 804697300, "hash": "EB5933399A49541B65552C5B5959AEECC520D10B946EC30F5A39B9EAA16C7D56", "inLedger": 4105137, "ledger_index": 4105137, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rs6Skg9oNmbCS2FeHLkYXTvz5QmBbqotbm", "Balance": "110000000", "Flags": 0, "OwnerCount": 0, "Sequence": 4105132 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "63BAFBAE46A0E3C6711A8E5020A49886B2FCA50AD9204017BE2BBDB02F025A88", "PreviousFields": { "Balance": "100000000" }, "PreviousTxnID": "63043E9063DBF29379845C3A38D305BBC7B7622E5380193B657C29AFAF57C41E", "PreviousTxnLgrSeq": 4105132 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGfNFbXcdrx1t7UDEzrJkPCVBRAR2o6HVc", "Balance": "89999992", "Flags": 0, "OwnerCount": 0, "Sequence": 4105132 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C944D2DAB07823AF102AE4C26D9E4561928045392428DD5040F97CED66851A07", "PreviousFields": { "Balance": "99999992", "Sequence": 4105131 }, "PreviousTxnID": "9B956A77943DF3FB891DD14D2D41A87CD6E5FA8CC606A097F47319EE6110ABA1", "PreviousTxnLgrSeq": 4105137 } } ], "ParentBatchID": "9B956A77943DF3FB891DD14D2D41A87CD6E5FA8CC606A097F47319EE6110ABA1", "TransactionIndex": 1, "TransactionResult": "tesSUCCESS", "delivered_amount": "10000000" }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/Batch/utils.ts ================================================ import type { Transaction } from 'xrpl' import { decode, encode } from 'ripple-binary-codec' import { bytesToHex, hexToBytes } from '@xrplf/isomorphic/dist/utils' import { sha512 } from '@xrplf/isomorphic/sha512' import { getTransaction } from '../../../../../rippled/lib/rippled' export async function getBatchTxStatus(rippledSocket, batchTransactions) { const results = await Promise.all( batchTransactions.map(async (tx) => { try { const res = await getTransaction(rippledSocket, tx.hash) if (res.meta.TransactionResult === 'tesSUCCESS') { return { ...tx, successful: true, } } return { ...tx, successful: false, status: res.meta.TransactionResult, } } catch (error) { return { ...tx, successful: false, status: 'not validated', } } }), ) return results } enum GlobalFlags { tfInnerBatchTxn = 0x40000000, } enum HashPrefix { // transaction plus signature to give transaction ID 'TXN' TRANSACTION_ID = 0x54584e00, // transaction plus metadata 'TND' TRANSACTION_NODE = 0x534e4400, // inner node in tree 'MIN' INNER_NODE = 0x4d494e00, // leaf node in tree 'MLN' LEAF_NODE = 0x4d4c4e00, // inner transaction to sign 'STX' TRANSACTION_SIGN = 0x53545800, // inner transaction to sign (TESTNET) 'stx' TRANSACTION_SIGN_TESTNET = 0x73747800, // inner transaction to multisign 'SMT' TRANSACTION_MULTISIGN = 0x534d5400, // ledger 'LWR' LEDGER = 0x4c575200, } const HASH_BYTES = 32 export function hashSignedTx(tx: Transaction | string): string { let txBlob: string let txObject: Transaction if (typeof tx === 'string') { txBlob = tx /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Required until updated in binary codec. */ txObject = decode(tx) as unknown as Transaction } else { txBlob = encode(tx) txObject = tx } if ( txObject.TxnSignature === undefined && txObject.Signers === undefined && txObject.SigningPubKey === undefined && !hasFlag(txObject, GlobalFlags.tfInnerBatchTxn, 'tfInnerBatchTxn') ) { throw new Error('The transaction must be signed to hash it.') } const prefix = HashPrefix.TRANSACTION_ID.toString(16).toUpperCase() return sha512Half(prefix.concat(txBlob)) } function hasFlag( tx: Transaction | Record, flag: number, flagName: string, ): boolean { if (tx.Flags == null) { return false } if (typeof tx.Flags === 'number') { return isFlagEnabled(tx.Flags, flag) } return tx.Flags[flagName] === true } export function isFlagEnabled(Flags: number, checkFlag: number): boolean { // eslint-disable-next-line no-bitwise -- flags need bitwise return (BigInt(checkFlag) & BigInt(Flags)) === BigInt(checkFlag) } function sha512Half(hex: string): string { return bytesToHex(sha512(hexToBytes(hex)).slice(0, HASH_BYTES)) } ================================================ FILE: src/containers/shared/components/Transaction/Clawback/Description.tsx ================================================ import { Trans } from 'react-i18next' import { TransactionDescriptionProps } from '../types' import { Amount } from '../../Amount' import { Account } from '../../Account' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const Description = ({ data }: TransactionDescriptionProps) => { const issuer = data.tx.Account const amount = formatAmount(data.tx.Amount) const holder = amount.isMPT ? data.tx.Holder : data.tx.Amount.issuer amount.issuer = issuer return ( <>
    , destination: , }} />
    , }} />
    ) } ================================================ FILE: src/containers/shared/components/Transaction/Clawback/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { ClawbackInstructions } from './types' import { Account } from '../../Account' import { Amount } from '../../Amount' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { amount, holder } = data.instructions const { t } = useTranslation() return ( <> {holder && ( )} {amount && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/Clawback/TableDetail.tsx ================================================ import { useTranslation, Trans } from 'react-i18next' import { Amount } from '../../Amount' import { TransactionTableDetailProps } from '../types' import { ClawbackInstructions } from './types' import { Account } from '../../Account' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { amount, holder } = instructions return (
    {amount && holder && (
    {t('claws_back')} from
    )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/Clawback/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' import { TableDetail } from './TableDetail' import { Description } from './Description' export const ClawbackTransaction: TransactionMapping = { Simple, TableDetail, Description, action: TransactionAction.CANCEL, category: TransactionCategory.PAYMENT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/Clawback/parser.ts ================================================ import type { Clawback } from 'xrpl' import { ClawbackInstructions } from './types' import { TransactionParser } from '../types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { computeRippleStateBalanceChange, computeMPTokenBalanceChange, } from '../../../utils' export const parser: TransactionParser = ( tx, meta, ) => { const account = tx.Account const amount = formatAmount(tx.Amount) if (amount.isMPT === true) { const holder = tx.Holder const filteredMptNode = meta.AffectedNodes.filter( (node: any) => node.ModifiedNode?.LedgerEntryType === 'MPToken', ) // If no mpt is modified, it means the tx failed. // We just return the amount that was attempted to claw. if (!filteredMptNode || filteredMptNode.length !== 1) return { amount, account, holder, } const mptNode = filteredMptNode[0].ModifiedNode const { change } = computeMPTokenBalanceChange(mptNode) amount.amount = BigInt(change) < 0 ? BigInt(-change).toString(10) : BigInt(change).toString(10) return { account, amount, holder, } } const holder = amount.issuer amount.issuer = account // At this point, we need to get the ACTUAL balance change as a // result of Clawback. If the issuer tries to claw back more than // what holder has, only the max available balance is clawed. const trustlineNode = meta.AffectedNodes.filter( (node: any) => node.DeletedNode?.LedgerEntryType === 'RippleState' || node.ModifiedNode?.LedgerEntryType === 'RippleState', ) // If no trustline is modified, it means the tx failed. // We just return the amount that was attempted to claw. if (!trustlineNode || trustlineNode.length !== 1) return { amount, account, holder, } const { change } = computeRippleStateBalanceChange( trustlineNode[0].ModifiedNode ?? trustlineNode[0].DeletedNode, ) // Update the amount that was actually clawed back // (could be different from what was submitted) amount.amount = Math.abs(change) return { account, amount, holder, } } ================================================ FILE: src/containers/shared/components/Transaction/Clawback/test/ClawbackDescription.test.tsx ================================================ import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import transaction from './mock_data/Clawback.json' import i18n from '../../../../../../i18n/testConfigEnglish' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('Clawback', () => { it('handles Clawback Description ', () => { const { container, unmount } = renderComponent(transaction) expect( container.querySelector('[data-testid="from-to-line"]'), ).toHaveTextContent( `rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9 claws back from rscBWQpyZEmQvupeB1quu7Ky8YX4f5CHDP`, ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( `The max clawback amount is 4,840.00 FOO.rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9`, ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/Clawback/test/ClawbackSimple.test.tsx ================================================ import { useQuery } from 'react-query' import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import transaction from './mock_data/Clawback.json' import transactionFailure from './mock_data/Clawback_Failure.json' import transactionMPT from './mock_data/ClawbackMPT.json' import transactionMPTFailure from './mock_data/ClawbackMPT_Failure.json' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const renderComponent = createSimpleRenderFactory(Simple) describe('Clawback', () => { it('handles Clawback simple view ', () => { const { container, unmount } = renderComponent(transaction) expectSimpleRowText( container, 'holder', 'rscBWQpyZEmQvupeB1quu7Ky8YX4f5CHDP', ) expectSimpleRowText( container, 'amount', '3,840.00 FOO.rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9', ) unmount() }) it('handles MPT Clawback simple view ', () => { const data = { assetScale: 3, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent(transactionMPT) expectSimpleRowText( container, 'holder', 'rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD', ) expectSimpleRowText( container, 'amount', '0.05 00000D668E702F54A27C42EF98C13B0787D1766CC9162A47', ) unmount() }) it('handles failed Clawback simple view ', () => { const { container, unmount } = renderComponent(transactionFailure) expectSimpleRowText( container, 'holder', 'rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9', ) expectSimpleRowText( container, 'amount', '4,840.00 FOO.rscBWQpyZEmQvupeB1quu7Ky8YX4f5CHDP', ) unmount() }) it('handles failed MPT Clawback simple view ', () => { const data = { assetScale: 3, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent(transactionMPTFailure) expectSimpleRowText( container, 'holder', 'r9rAqX8Jjo4uACsimYDVsy5thHDPivujqf', ) expectSimpleRowText( container, 'amount', '0.05 000010952ECE2AFC727F1C67EF568F360A2D92CB7C29FF7C', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/Clawback/test/ClawbackTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import transaction from './mock_data/Clawback.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('Clawback', () => { it('handles Clawback TableDetail ', () => { const { container, unmount } = renderComponent(transaction) expect(container.querySelector('.clawback')).toHaveTextContent( `claws_back3,840.00 FOO.rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9fromrscBWQpyZEmQvupeB1quu7Ky8YX4f5CHDP`, ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/Clawback/test/mock_data/Clawback.json ================================================ { "tx": { "Account": "rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9", "Amount": { "currency": "FOO", "issuer": "rscBWQpyZEmQvupeB1quu7Ky8YX4f5CHDP", "value": "4840" }, "Fee": "10", "Flags": 0, "LastLedgerSequence": 515, "Sequence": 492, "SigningPubKey": "ED4B74169976E689D549ED4A50BF06C1174115D363CF9E14031030D2BB5CAA274D", "TransactionType": "Clawback", "TxnSignature": "E3C2138CA0C09DD4243DB47B562BDE334CFADFDFF39B50DE7E2A3D6FBCB1ADD89CCAF19A7DE08C3C295974492C3FC7E7CD71FB040A582154EC26DB09D1AEF800", "date": 1688136937000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9", "Balance": "99999999960", "Flags": 2155872256, "OwnerCount": 0, "Sequence": 493 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "057A552C60FE5AC6C77FC70C28209BB4D33C60C6A350DACEF609C48FE12A4387", "PreviousFields": { "Balance": "99999999970", "Sequence": 492 }, "PreviousTxnID": "E6EF19434F7FF87AB6EE7127A19D9FBC822B3E8E7C26264A902703424AB1F188", "PreviousTxnLgrSeq": 493 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "FOO", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 65536, "HighLimit": { "currency": "FOO", "issuer": "rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "FOO", "issuer": "rscBWQpyZEmQvupeB1quu7Ky8YX4f5CHDP", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "907573E62311BAC99A985BBBB38DAB09D89B0C47167AB6E280DD2B309CFAF31B", "PreviousFields": { "Balance": { "currency": "FOO", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3840" } }, "PreviousTxnID": "FEF8B23EB453ECC8BE0D4104CEB0B481E029213848EC1BD11470F8B8C3E6B424", "PreviousTxnLgrSeq": 494 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "0E09D8C61C799AF206D66F81561EC5B52641B439EEA47CB4F5637A918FB51536", "ledger_index": 496, "date": 1688136937000 } ================================================ FILE: src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json ================================================ { "tx": { "Account": "rDz9LyymZh4C1jJvFK6v6qXeeARLdYKuEW", "Amount": { "mpt_issuance_id": "00000D668E702F54A27C42EF98C13B0787D1766CC9162A47", "value": "50" }, "Fee": "10", "Flags": 2147483648, "Holder": "rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD", "Sequence": 3432, "SigningPubKey": "ED0C1DE70A8762E6C98EC78CF13D278D6950ECDFE8E87BAD3732730845E2D9AB6A", "TransactionType": "Clawback", "TxnSignature": "8099CED925A463A2A24F55A496D2BB40108B75840770DFBA9796FBBD40AA482126EE9DAF2512D5D2E8268BCBFC277828E66A28CF3394702611290B45FBA88109", "ctid": "C0000D6D00000000", "date": 1728575981000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rDz9LyymZh4C1jJvFK6v6qXeeARLdYKuEW", "Balance": "99999970", "Flags": 0, "OwnerCount": 1, "Sequence": 3433 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "06A3654A4A8829FD0575ADDD068BD04F7483C407E027CB43F77C2A5CA575368B", "PreviousFields": { "Balance": "99999980", "Sequence": 3432 }, "PreviousTxnID": "4B6D63C7AA15899EC1CB3D84C923B08A62D6643A75D28B254F7A0C082B2C0D75", "PreviousTxnLgrSeq": 3436 } }, { "ModifiedNode": { "FinalFields": { "AssetScale": 3, "Flags": 98, "Issuer": "rDz9LyymZh4C1jJvFK6v6qXeeARLdYKuEW", "MPTokenMetadata": "7B226E616D65223A2255532054726561737572792042696C6C20546F6B656E222C2273796D626F6C223A225553544254222C22646563696D616C73223A322C22746F74616C537570706C79223A313030303030302C22697373756572223A225553205472656173757279222C22697373756544617465223A22323032342D30332D3235222C226D6174757269747944617465223A22323032352D30332D3235222C226661636556616C7565223A2231303030222C22696E74657265737452617465223A22322E35222C22696E7465726573744672657175656E6379223A22517561727465726C79222C22636F6C6C61746572616C223A22555320476F7665726E6D656E74222C226A7572697364696374696F6E223A22556E6974656420537461746573222C22726567756C61746F7279436F6D706C69616E6365223A2253454320526567756C6174696F6E73222C22736563757269747954797065223A2254726561737572792042696C6C222C2265787465726E616C5F75726C223A2268747470733A2F2F6578616D706C652E636F6D2F742D62696C6C2D746F6B656E2D6D657461646174612E6A736F6E227D", "MaximumAmount": "9223372036854775807", "OutstandingAmount": "50", "OwnerNode": "0", "Sequence": 3430 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "0EABDC95DBBC52F8A95A5F49C38211A30B916BC329774F46CC081D502F9E1895", "PreviousFields": { "OutstandingAmount": "100" }, "PreviousTxnID": "4B6D63C7AA15899EC1CB3D84C923B08A62D6643A75D28B254F7A0C082B2C0D75", "PreviousTxnLgrSeq": 3436 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD", "Flags": 0, "MPTAmount": "50", "MPTokenIssuanceID": "00000D668E702F54A27C42EF98C13B0787D1766CC9162A47", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "DA40BA069F110465BD90BF5732163836F011E3E761CCF7B6949FAA24D97132F6", "PreviousFields": { "MPTAmount": "100" }, "PreviousTxnID": "4B6D63C7AA15899EC1CB3D84C923B08A62D6643A75D28B254F7A0C082B2C0D75", "PreviousTxnLgrSeq": 3436 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "46B686335794B911B3B76C2F4B76AF424F9978C3E82B2F6488801C359AA71856", "ledger_index": 3437, "date": 1728575981000 } ================================================ FILE: src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json ================================================ { "tx": { "Account": "rnGVhdnWv7g3fW8UNJyFHj6eyngsMdwA8c", "Amount": { "mpt_issuance_id": "000010952ECE2AFC727F1C67EF568F360A2D92CB7C29FF7C", "value": "50" }, "Fee": "10", "Flags": 2147483648, "Holder": "r9rAqX8Jjo4uACsimYDVsy5thHDPivujqf", "Sequence": 4246, "SigningPubKey": "ED4F6FF2241860884D4DD6C5797BDA553155D194F07B1BFC67129F183322DA7DC3", "TransactionType": "Clawback", "TxnSignature": "C54F175F0AFD950507C059E0EA5E6FA0079E7CDE5DF62BB122B56DC34A351C2369E208B31F7C27B1E9D21753506E195B147500D033884C44373899C84A97680B", "ctid": "C000109B00000000", "date": 1728577343000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rnGVhdnWv7g3fW8UNJyFHj6eyngsMdwA8c", "Balance": "99999980", "Flags": 0, "OwnerCount": 1, "Sequence": 4247 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "95A16157D164CD90D64BC94DE3EA7758AE3088391C9AC44AFCAC90C5153D83D5", "PreviousFields": { "Balance": "99999990", "Sequence": 4246 }, "PreviousTxnID": "8ACD0682CB1EDDCF6C61F15E6B9637D2719FDA2EC32EB384A68F36F0A0297D91", "PreviousTxnLgrSeq": 4248 } } ], "TransactionIndex": 0, "TransactionResult": "tecINSUFFICIENT_FUNDS" }, "hash": "26E6E7AEA4F78801EB0408D802FEBA11B962BFD680501DF0D0C58F30C6EA8951", "ledger_index": 4251, "date": 1728577343000 } ================================================ FILE: src/containers/shared/components/Transaction/Clawback/test/mock_data/Clawback_Failure.json ================================================ { "tx": { "Account": "rscBWQpyZEmQvupeB1quu7Ky8YX4f5CHDP", "Amount": { "currency": "FOO", "issuer": "rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9", "value": "4840" }, "Fee": "10", "Flags": 0, "LastLedgerSequence": 514, "Sequence": 491, "SigningPubKey": "EDF33A9B13FC43193E136D5E76DD171DF8E7E7184979F214480252A812E148436F", "TransactionType": "Clawback", "TxnSignature": "4B36BF456ED06B326CF7C130FDD96F4BA0F6475CA23D5362A1FEB5D10905B377B5B359E077478E4E7412E3ED5A17FE7E7D5E7DAF554976B0B582526E082E0A0D", "date": 1688136936000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rscBWQpyZEmQvupeB1quu7Ky8YX4f5CHDP", "Balance": "99999999970", "Flags": 0, "OwnerCount": 1, "Sequence": 492 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9815D11E762BFF706A1FA0362217D0DB3F3756204523D7DE46469D0DE2A2A83E", "PreviousFields": { "Balance": "99999999980", "Sequence": 491 }, "PreviousTxnID": "FEF8B23EB453ECC8BE0D4104CEB0B481E029213848EC1BD11470F8B8C3E6B424", "PreviousTxnLgrSeq": 494 } } ], "TransactionIndex": 0, "TransactionResult": "tecNO_PERMISSION" }, "hash": "6B8CD7D19CD1E3E428F26A897C4CAEDFE4474390C7CBF6D885A76CC66E80DEFA", "ledger_index": 495, "date": 1688136936000 } ================================================ FILE: src/containers/shared/components/Transaction/Clawback/types.ts ================================================ import { ExplorerAmount } from '../../../types' export interface ClawbackInstructions { account: string amount?: ExplorerAmount holder?: string } ================================================ FILE: src/containers/shared/components/Transaction/CredentialAccept/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { type CredentialAccept } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { convertHexToString } from '../../../../../rippled/lib/utils' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { Issuer: issuer, CredentialType: credentialType } = data.instructions return ( <> {issuer} {convertHexToString(credentialType)} ) } ================================================ FILE: src/containers/shared/components/Transaction/CredentialAccept/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { type CredentialAccept } from 'xrpl' import { TransactionTableDetailProps } from '../types' import { convertHexToString } from '../../../../../rippled/lib/utils' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { Issuer: issuer, CredentialType: credentialType } = instructions return (
    {t('issuer')}: {issuer}
    {t('credential_type')}: {convertHexToString(credentialType)}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/CredentialAccept/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const CredentialAcceptTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.MODIFY, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/CredentialAccept/test/CredentialAcceptSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import CredentialAccept from './mock_data/CredentialAccept.json' const renderComponent = createSimpleRenderFactory(Simple) describe('CredentialAccept: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(CredentialAccept) expectSimpleRowText( container, 'issuer', 'rL6bethyyyphLye6A8WHhw1KxDZrwiqCmi', ) expectSimpleRowText(container, 'credential-type', 'My test credential') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/CredentialAccept/test/CredentialAcceptTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockCredentialAccept from './mock_data/CredentialAccept.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('CredentialAcceptTableDetail ', () => { it('renders CredentialAcceptTableDetail', () => { const { container, unmount } = renderComponent(mockCredentialAccept) expect(container.querySelector('[data-testid="issuer"]')).toHaveTextContent( 'issuer: rL6bethyyyphLye6A8WHhw1KxDZrwiqCmi', ) expect( container.querySelector('[data-testid="credential-type"]'), ).toHaveTextContent('credential_type: My test credential') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/CredentialAccept/test/mock_data/CredentialAccept.json ================================================ { "close_time_iso": "2025-02-18T15:06:23Z", "ctid": "C006630D00000002", "hash": "A5BB4EADEF1AF9D81FA9C4EB748B4B8EFB4A28D8DF7FC5227CBE2CF256376693", "ledger_hash": "265927953A34EB94E687C5AC98A3B696FD225F26BAC36E37DD247E1B8137C43C", "ledger_index": 418573, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rwXChshgJHh6KwwXY8hN1iNAiuyzJkz7p6", "Balance": "99999988", "Flags": 0, "OwnerCount": 1, "Sequence": 418571 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "63821A059043CABF96E1955881B0C0ACAD6BB997F7BBD8F2551E3109616D463A", "PreviousFields": { "Balance": "100000000", "OwnerCount": 0, "Sequence": 418570 }, "PreviousTxnID": "79488F1D640ECC2059CC5D682177EEF6A597A5528372EEA163CE86EA3B188346", "PreviousTxnLgrSeq": 418570 } }, { "ModifiedNode": { "FinalFields": { "CredentialType": "4D7920746573742063726564656E7469616C", "Flags": 65536, "Issuer": "rL6bethyyyphLye6A8WHhw1KxDZrwiqCmi", "IssuerNode": "0", "Subject": "rwXChshgJHh6KwwXY8hN1iNAiuyzJkz7p6", "SubjectNode": "0", "URI": "74657374555249" }, "LedgerEntryType": "Credential", "LedgerIndex": "7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955", "PreviousFields": { "Flags": 0 }, "PreviousTxnID": "FADDC5925ACC5A5C567E3C70730E090767A9B22330CFB272005169A7CABA82DB", "PreviousTxnLgrSeq": 418572 } }, { "ModifiedNode": { "FinalFields": { "Account": "rL6bethyyyphLye6A8WHhw1KxDZrwiqCmi", "Balance": "99999988", "Flags": 0, "OwnerCount": 0, "Sequence": 418570 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CF3D9A16400DAE31DA3F0FEF511D753C5F7560ECDB8EC9B7F9E92DC837A01F52", "PreviousFields": { "OwnerCount": 1 }, "PreviousTxnID": "FADDC5925ACC5A5C567E3C70730E090767A9B22330CFB272005169A7CABA82DB", "PreviousTxnLgrSeq": 418572 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rwXChshgJHh6KwwXY8hN1iNAiuyzJkz7p6", "CredentialType": "4D7920746573742063726564656E7469616C", "Fee": "12", "Flags": 0, "Issuer": "rL6bethyyyphLye6A8WHhw1KxDZrwiqCmi", "LastLedgerSequence": 418592, "Sequence": 418570, "SigningPubKey": "ED2EFC907F00BA33809F2FB7B297489AB095197E3C55F3F941792B2A83966AC54E", "TransactionType": "CredentialAccept", "TxnSignature": "1D3E366930405D78B1909B5FF0B7315DD76A0D1B318CF675E66C0B6F162874B69F356E52A41F6E10323CAF076194E44F7C63105C4FA9031AB8AF15769C805404", "date": 793206383, "ledger_index": 418573 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/CredentialCreate/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { type CredentialCreate } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { convertHexToString } from '../../../../../rippled/lib/utils' import { localizeDate } from '../../../utils' import { useLanguage } from '../../../hooks' import { convertRippleDate } from '../../../../../rippled/lib/convertRippleDate' import { DATE_OPTIONS } from '../../../transactionUtils' const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const language = useLanguage() const { data } = props const { Subject: subject, CredentialType: credentialType, Expiration: expiration, URI: uri, } = data.instructions return ( <> {subject} {convertHexToString(credentialType)} {expiration && ( {localizeDate( new Date(convertRippleDate(expiration)), language, DATE_OPTIONS, )} )} {uri && ( {convertHexToString(uri)} )} ) } export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/CredentialCreate/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { type CredentialCreate } from 'xrpl' import { TransactionTableDetailProps } from '../types' import { convertHexToString } from '../../../../../rippled/lib/utils' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { Subject: subject, CredentialType: credentialType, Expiration: expiration, URI: uri, } = instructions return (
    {t('subject')}: {subject}
    {t('credential_type')}: {convertHexToString(credentialType)}
    {expiration && (
    {t('expiration')}: {expiration}
    )} {uri && (
    {t('uri')}: {convertHexToString(uri)}
    )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/CredentialCreate/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const CredentialCreateTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.CREATE, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/CredentialCreate/test/CredentialCreateSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import CredentialCreate from './mock_data/CredentialCreate.json' const renderComponent = createSimpleRenderFactory(Simple) describe('CredentialCreate: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(CredentialCreate) expectSimpleRowText( container, 'subject', 'rDeEwcsbGz4GXyGpyRuQo9vRGGT269Jmjk', ) expectSimpleRowText(container, 'credential-type', 'VerifiedAccount') expectSimpleRowText( container, 'expiration', 'October 5, 2026 at 1:53:30 PM', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/CredentialCreate/test/CredentialCreateTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockCredentialCreate from './mock_data/CredentialCreate.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('CredentialAcceptTableDetail ', () => { it('renders CredentialAcceptTableDetail', () => { const { container, unmount } = renderComponent(mockCredentialCreate) expect( container.querySelector('[data-testid="subject"]'), ).toHaveTextContent('subject: rDeEwcsbGz4GXyGpyRuQo9vRGGT269Jmjk') expect( container.querySelector('[data-testid="credential-type"]'), ).toHaveTextContent('credential_type: VerifiedAccount') expect( container.querySelector('[data-testid="expiration"]'), ).toHaveTextContent('expiration: 844523610') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/CredentialCreate/test/mock_data/CredentialCreate.json ================================================ { "close_time_iso": "2025-10-05T13:53:31Z", "ctid": "C000DAA700000002", "hash": "38668D75129E7949649D001907709D1F8DB0FD88232B03CD510707E679AD1E0B", "ledger_hash": "B7DE3742299BE553CC1DE08EFDA3EDE88F94C65B073A623F0C72484F6A9C78C7", "ledger_index": 55975, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfEd8iC2g1LVUj75bMkui3yTPcPj6W5Mgr", "Balance": "99999996", "Flags": 0, "OwnerCount": 1, "Sequence": 51131 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3AFBED20615BECB3DE06CB98E2DD0C905E572E4D279C4B5FD77EB48E110991A4", "PreviousFields": { "Balance": "99999997", "OwnerCount": 0, "Sequence": 51130 }, "PreviousTxnID": "76E2BEEC3AE4DF755F821BA301CED0DCC56D20BC6ABAB5C4F3717057D9F82D1A", "PreviousTxnLgrSeq": 51555 } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A0102CBC99F6B6114ACD2AD065DC41A5517CB5BEA7958FACA106FF2066B8041D", "NewFields": { "Owner": "rDeEwcsbGz4GXyGpyRuQo9vRGGT269Jmjk", "RootIndex": "A0102CBC99F6B6114ACD2AD065DC41A5517CB5BEA7958FACA106FF2066B8041D" } } }, { "CreatedNode": { "LedgerEntryType": "Credential", "LedgerIndex": "C9B22CD799166C336E5F4EE0B85986EC354F1279F2A80C77B4A8B2EEF6EB9517", "NewFields": { "CredentialType": "56657269666965644163636F756E74", "Expiration": 844523610, "Issuer": "rfEd8iC2g1LVUj75bMkui3yTPcPj6W5Mgr", "Subject": "rDeEwcsbGz4GXyGpyRuQo9vRGGT269Jmjk" } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D79FCA4F80ABD89F9D0BEBB4B44986D0E5D552DECF4A12947FD2C2493CF55C4A", "NewFields": { "Owner": "rfEd8iC2g1LVUj75bMkui3yTPcPj6W5Mgr", "RootIndex": "D79FCA4F80ABD89F9D0BEBB4B44986D0E5D552DECF4A12947FD2C2493CF55C4A" } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rfEd8iC2g1LVUj75bMkui3yTPcPj6W5Mgr", "CredentialType": "56657269666965644163636F756E74", "Expiration": 844523610, "Fee": "1", "Flags": 0, "LastLedgerSequence": 55993, "Sequence": 51130, "SigningPubKey": "ED607EE5D1864691EAF2AB8E20873ECAC397EEFAD7E9D714EFC19F44DBC858BDDE", "Subject": "rDeEwcsbGz4GXyGpyRuQo9vRGGT269Jmjk", "TransactionType": "CredentialCreate", "TxnSignature": "EDE43649F01BDAC931E5C2477AE77E7C04B82EF3DEA575F3C8C2E553221747F59E6E57A625FA858C019D9709D829ED33B6C2ABBF42C55952B1F5FCE0309F3608", "date": 812987611, "ledger_index": 55975 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/CredentialDelete/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { type CredentialDelete } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { convertHexToString } from '../../../../../rippled/lib/utils' const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { Account: account, Subject: subject, CredentialType: credentialType, Issuer: issuer, } = data.instructions return ( <> {subject || account} {issuer && ( {issuer || account} )} {convertHexToString(credentialType)} ) } export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/CredentialDelete/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { type CredentialDelete } from 'xrpl' import { TransactionTableDetailProps } from '../types' import { convertHexToString } from '../../../../../rippled/lib/utils' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { Account: account, Subject: subject, Issuer: issuer, CredentialType: credentialType, } = instructions return (
    {t('subject')}: {subject || account}
    {t('issuer')}: {issuer || account}
    {t('credential_type')}: {convertHexToString(credentialType)}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/CredentialDelete/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const CredentialDeleteTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.CANCEL, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/CredentialDelete/test/CredentialDeleteSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import CredentialDelete from './mock_data/CredentialDelete.json' const renderComponent = createSimpleRenderFactory(Simple) describe('CredentialDelete: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(CredentialDelete) expectSimpleRowText( container, 'subject', 'rwXChshgJHh6KwwXY8hN1iNAiuyzJkz7p6', ) expectSimpleRowText(container, 'credential-type', 'My test credential') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/CredentialDelete/test/CredentialDeleteTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockCredentialDelete from './mock_data/CredentialDelete.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('CredentialDeleteTableDetail ', () => { it('renders CredentialDeleteTableDetail', () => { const { container, unmount } = renderComponent(mockCredentialDelete) expect( container.querySelector('[data-testid="subject"]'), ).toHaveTextContent('subject: rwXChshgJHh6KwwXY8hN1iNAiuyzJkz7p6') expect( container.querySelector('[data-testid="credential-type"]'), ).toHaveTextContent('credential_type: My test credential') expect(container.querySelector('[data-testid="issuer"]')).toHaveTextContent( 'issuer: rL6bethyyyphLye6A8WHhw1KxDZrwiqCmi', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/CredentialDelete/test/mock_data/CredentialDelete.json ================================================ { "close_time_iso": "2025-02-18T15:06:31Z", "ctid": "C006630F00000002", "hash": "C7707BDAF65E6C45C2009290A313244717281ABCEFA7D08DD879E19D8F83085F", "ledger_hash": "634992138E5DC7059441C4B115D5445F050F8CF8CE6F5640CA1E33EEA3DD9343", "ledger_index": 418575, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rwXChshgJHh6KwwXY8hN1iNAiuyzJkz7p6", "Balance": "99999988", "Flags": 0, "OwnerCount": 0, "Sequence": 418571 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "63821A059043CABF96E1955881B0C0ACAD6BB997F7BBD8F2551E3109616D463A", "PreviousFields": { "OwnerCount": 1 }, "PreviousTxnID": "A5BB4EADEF1AF9D81FA9C4EB748B4B8EFB4A28D8DF7FC5227CBE2CF256376693", "PreviousTxnLgrSeq": 418573 } }, { "DeletedNode": { "FinalFields": { "Flags": 0, "Owner": "rwXChshgJHh6KwwXY8hN1iNAiuyzJkz7p6", "PreviousTxnID": "FADDC5925ACC5A5C567E3C70730E090767A9B22330CFB272005169A7CABA82DB", "PreviousTxnLgrSeq": 418572, "RootIndex": "675537AB5EB6416AED24E856E20E5A203FB5A73F0C5D2D92359B5A45184BC594" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "675537AB5EB6416AED24E856E20E5A203FB5A73F0C5D2D92359B5A45184BC594" } }, { "DeletedNode": { "FinalFields": { "CredentialType": "4D7920746573742063726564656E7469616C", "Flags": 65536, "Issuer": "rL6bethyyyphLye6A8WHhw1KxDZrwiqCmi", "IssuerNode": "0", "PreviousTxnID": "A5BB4EADEF1AF9D81FA9C4EB748B4B8EFB4A28D8DF7FC5227CBE2CF256376693", "PreviousTxnLgrSeq": 418573, "Subject": "rwXChshgJHh6KwwXY8hN1iNAiuyzJkz7p6", "SubjectNode": "0", "URI": "74657374555249" }, "LedgerEntryType": "Credential", "LedgerIndex": "7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955" } }, { "DeletedNode": { "FinalFields": { "Flags": 0, "Owner": "rL6bethyyyphLye6A8WHhw1KxDZrwiqCmi", "PreviousTxnID": "FADDC5925ACC5A5C567E3C70730E090767A9B22330CFB272005169A7CABA82DB", "PreviousTxnLgrSeq": 418572, "RootIndex": "7D29B654F46648EA1787141BEC0CB3BAA6B42290955C335F9A7B2F34F9D4ACA0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7D29B654F46648EA1787141BEC0CB3BAA6B42290955C335F9A7B2F34F9D4ACA0" } }, { "ModifiedNode": { "FinalFields": { "Account": "rL6bethyyyphLye6A8WHhw1KxDZrwiqCmi", "Balance": "99999976", "Flags": 0, "OwnerCount": 0, "Sequence": 418571 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CF3D9A16400DAE31DA3F0FEF511D753C5F7560ECDB8EC9B7F9E92DC837A01F52", "PreviousFields": { "Balance": "99999988", "Sequence": 418570 }, "PreviousTxnID": "A5BB4EADEF1AF9D81FA9C4EB748B4B8EFB4A28D8DF7FC5227CBE2CF256376693", "PreviousTxnLgrSeq": 418573 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rL6bethyyyphLye6A8WHhw1KxDZrwiqCmi", "CredentialType": "4D7920746573742063726564656E7469616C", "Fee": "12", "Flags": 0, "LastLedgerSequence": 418593, "Sequence": 418570, "SigningPubKey": "ED8627CFD25412BDC67E6B1F1C219669FFEEF7F8D3D46EA572FBE394FAD3A8F46E", "Subject": "rwXChshgJHh6KwwXY8hN1iNAiuyzJkz7p6", "TransactionType": "CredentialDelete", "TxnSignature": "B193889C5791E0E9C9B12B9E948B3E911445986BF5A33415FFC875076F46EA49D7437F03FF8372411D306DAD2E9CDD4C123BBCB0CEFE0C517252F7B23AD34A0D", "date": 793206391, "ledger_index": 418575 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/CredentialIDs.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from './SimpleRow' interface CredentialIDsProps { credentialIDs: string[] } export const CredentialIDs = ({ credentialIDs }: CredentialIDsProps) => { const { t } = useTranslation() if (!credentialIDs || credentialIDs.length === 0) { return null } return ( <> {credentialIDs.map((id, index) => ( {id} ))} ) } ================================================ FILE: src/containers/shared/components/Transaction/DIDDelete/Simple.tsx ================================================ import type { DIDDelete } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' const Simple: TransactionSimpleComponent = ( _props: TransactionSimpleProps, ) => null export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/DIDDelete/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' export const DIDDeleteTransaction: TransactionMapping = { Simple, action: TransactionAction.CANCEL, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/DIDDelete/test/DIDDeleteSimple.test.tsx ================================================ import { createSimpleRenderFactory } from '../../test' import { Simple } from '../Simple' import DIDDelete from './mock_data/DIDDelete.json' const renderComponent = createSimpleRenderFactory(Simple) describe('DIDDelete: Simple', () => { it('renders', () => { const { unmount } = renderComponent(DIDDelete) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/DIDDelete/test/mock_data/DIDDelete.json ================================================ { "tx": { "Account": "r91PyqgWTgED2x8dPHQX7gBktDoSJyHadi", "Fee": "10", "Flags": 2147483648, "Sequence": 10, "SigningPubKey": "ED4195861D0E6438C9CB53C05035A35F8C0183264FBFD07D3EF3DEDFA376E841F6", "TransactionType": "DIDDelete", "TxnSignature": "BA5EE539FBBB76BC5A8017837AC486B9FBB2803B51C71E289CE373420BDEE2FECA62BAAB6596EAD92715CA6FC6E9AC987468564279BF279217223B8BF4814208", "ctid": "C000000B00000000", "date": 1695754510000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "r91PyqgWTgED2x8dPHQX7gBktDoSJyHadi", "Balance": "999999999980", "Flags": 0, "OwnerCount": 0, "Sequence": 11 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "502EE614ECBCEC0BE756852ED6F9A460CB441052DA36585D8A59A8D55A6728DF", "PreviousFields": { "Balance": "999999999990", "OwnerCount": 1, "Sequence": 10 }, "PreviousTxnID": "2858A1F28031EDA2065DED324B7D7924F3D5320A60F14BBC16902784E1175F7F", "PreviousTxnLgrSeq": 10 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r91PyqgWTgED2x8dPHQX7gBktDoSJyHadi", "RootIndex": "52904262844EF0B9813C13C5C1C4732AD5ED0B5FC51B38F5C9329BF10AA1C8ED" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "52904262844EF0B9813C13C5C1C4732AD5ED0B5FC51B38F5C9329BF10AA1C8ED" } }, { "DeletedNode": { "FinalFields": { "Account": "r91PyqgWTgED2x8dPHQX7gBktDoSJyHadi", "Attestation": "617474657374", "DIDDocument": "646F63", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "2858A1F28031EDA2065DED324B7D7924F3D5320A60F14BBC16902784E1175F7F", "PreviousTxnLgrSeq": 10, "URI": "6469645F6578616D706C65" }, "LedgerEntryType": "DID", "LedgerIndex": "62FA3D98BA56773590ACC6C5A93126085287E6A6BBCE82DFB085487F385442C3" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "3CFF587C2CB976563CE6D89268FA5C90626F0D0B466B56607C0775241BAF6274", "ledger_index": 11, "date": 1695754510000 } ================================================ FILE: src/containers/shared/components/Transaction/DIDSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { DIDSet } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { convertHexToString } from '../../../../../rippled/lib/utils' const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { URI, DIDDocument, Data } = data.instructions return ( <> {URI && ( {convertHexToString(URI)} )} {DIDDocument && ( {convertHexToString(DIDDocument)} )} {Data && ( {convertHexToString(Data)} )} ) } export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/DIDSet/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import type { DIDSet } from 'xrpl' import { TransactionTableDetailProps } from '../types' import { convertHexToString } from '../../../../../rippled/lib/utils' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { URI, DIDDocument, Data } = instructions return (
    {URI && (
    {t('uri')}: {convertHexToString(URI)}
    )} {DIDDocument && (
    {t('did_document')}: {convertHexToString(DIDDocument)}
    )} {Data && (
    {t('data')}: {convertHexToString(Data)}
    )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/DIDSet/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const DIDSetTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.CREATE, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/DIDSet/test/DIDSetSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import DIDSet from './mock_data/DIDSet.json' const renderComponent = createSimpleRenderFactory(Simple) describe('DIDSet: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(DIDSet) expectSimpleRowText(container, 'uri', 'did_example') expectSimpleRowText(container, 'did-document', 'doc') expectSimpleRowText(container, 'data', 'attest') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/DIDSet/test/DIDSetTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import DIDSet from './mock_data/DIDSet.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('DIDSet: TableDetail', () => { it('renders', () => { const { container, unmount } = renderComponent(DIDSet) expect(container).toHaveTextContent( // eslint-disable-next-line no-useless-concat -- easier to read this way 'uri: did_example' + 'did_document: doc' + 'data: attest', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/DIDSet/test/mock_data/DIDSet.json ================================================ { "tx": { "Account": "rsMvgKpm7cb5TMxt9XRGBXyyVWToBnDTBn", "Data": "617474657374", "DIDDocument": "646F63", "Fee": "10", "Flags": 2147483648, "Sequence": 7, "SigningPubKey": "ED1F092C6A847F1095938E8DA5BA2E3710642FE6436ED559E42574FD0562BCC0C8", "TransactionType": "DIDSet", "TxnSignature": "7B513D1FF1FA5E6D36A4E5C2AB748CB5D18664E0CCF9CF2A33FEA586070FCA2B8EAD91158B6FAA6689282B14BC186453BB10CF66E95A493C04C5F22BDE05B708", "URI": "6469645F6578616D706C65", "ctid": "C000000800000000", "date": 1695751681000 }, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "DID", "LedgerIndex": "6DB3D8D5B4D76A0BCC1F009759D6FB80F32148194FF7F118B53C6141496F5EA1", "NewFields": { "Account": "rsMvgKpm7cb5TMxt9XRGBXyyVWToBnDTBn", "Data": "617474657374", "DIDDocument": "646F63", "URI": "6469645F6578616D706C65" } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "89B26FFDA662393CAE9FBE41F734A269414D2B6DDF835A58BED6C4094F678321", "NewFields": { "Owner": "rsMvgKpm7cb5TMxt9XRGBXyyVWToBnDTBn", "RootIndex": "89B26FFDA662393CAE9FBE41F734A269414D2B6DDF835A58BED6C4094F678321" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rsMvgKpm7cb5TMxt9XRGBXyyVWToBnDTBn", "Balance": "999999999990", "Flags": 0, "OwnerCount": 1, "Sequence": 8 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E9045B69A0655023B8E4008DAA20A67AE3DFDF785A4A71E740B15414F7FEC435", "PreviousFields": { "Balance": "1000000000000", "OwnerCount": 0, "Sequence": 7 }, "PreviousTxnID": "47150C4F0FF2B33140ED221E424B2F685EF853E6E000837FBAB71DB1AD9018C9", "PreviousTxnLgrSeq": 7 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "3119491F7965C0048D7FEF0C9D177307A974B2764662082F405A5D8F2B4AEEB6", "ledger_index": 8, "date": 1695751681000 } ================================================ FILE: src/containers/shared/components/Transaction/DefaultSimple.tsx ================================================ import { isValidClassicAddress } from 'ripple-address-codec' import { formatAmount } from '../../../../rippled/lib/txSummary/formatAmount' import { Account } from '../Account' import { Amount } from '../Amount' import Currency from '../Currency' import { SimpleGroup } from './SimpleGroup' import { SimpleRow } from './SimpleRow' import { TransactionSimpleProps } from './types' const DEFAULT_TX_ELEMENTS = [ 'Account', 'EmitDetails', 'Fee', 'FirstLedgerSequence', 'Flags', 'HookParameters', 'LastLedgerSequence', 'Memos', 'Signers', 'NetworkID', 'Sequence', 'SigningPubKey', 'TransactionType', 'TxnSignature', 'ctid', 'date', 'warnings', ] const displayKey = (key: string) => key.replace(/([a-z])([A-Z])/g, '$1 $2') const isCurrency = (value: any) => typeof value === 'object' && Object.keys(value).length <= 2 && (value.issuer == null || typeof value.issuer === 'string') && typeof value.currency === 'string' const isAmount = (amount: any, key: any = null) => key === 'Amount' || (typeof amount === 'object' && Object.keys(amount).length === 3 && typeof amount.issuer === 'string' && typeof amount.currency === 'string' && typeof amount.value === 'string') const processValue = (value: any) => { if (typeof value === 'string') { if (isValidClassicAddress(value)) { return } if (value.length > 300) { return `${value.substring(0, 300)}...` } if (value === '') { return {''} } if (typeof value === 'object') { return JSON.stringify(value) } return value } if (Array.isArray(value)) { return value.map((childValue) => { if ( typeof childValue === 'object' && Object.keys(childValue).length === 1 ) { const childKey = Object.keys(childValue)[0] const processed = processValue(childValue[childKey]) return
    {processed}
    } const processed = processValue(childValue) return
    {processed}
    }) } if (typeof value === 'object') { return (
    {Object.entries(value).map(([childKey, childValue]) => (
    {`${childKey}: `} {processValue(childValue)}
    ))}
    ) } return JSON.stringify(value) } const getRowNested = (key: any, value: any, uniqueKey: string = '') => { if (key === 'Amount') { return ( ) } if (isCurrency(value)) { return ( ) } if (isAmount(value, key)) { return ( ) } return ( {processValue(value)} ) } const getRow = (key: any, value: any) => { if (Array.isArray(value)) { return (
    {value.map((innerValue, index) => { if ( typeof innerValue === 'object' && Object.keys(innerValue).length === 1 ) { const innerKey = Object.keys(innerValue)[0] return ( {Object.entries(innerValue[innerKey]).map( ([childKey, childValue], index2) => getRowNested(childKey, childValue, index2.toString()), )} ) } return getRowNested(index.toString(), innerValue, index.toString()) })}
    ) } if ( typeof value === 'object' && !isCurrency(value) && !isAmount(value, key) ) { return ( {Object.entries(value).map(([childKey, childValue], index) => getRowNested(childKey, childValue, index.toString()), )} ) } return getRowNested(key, value) } export const DefaultSimple = ({ data }: TransactionSimpleProps) => { const uniqueData = Object.fromEntries( Object.entries(data.instructions).filter( ([key, value]) => !DEFAULT_TX_ELEMENTS.includes(key) && value != null, ), ) return ( <>{Object.entries(uniqueData).map(([key, value]) => getRow(key, value))} ) } ================================================ FILE: src/containers/shared/components/Transaction/DelegateSet/Description.tsx ================================================ import { Trans } from 'react-i18next' import { TransactionDescriptionProps } from '../types' import { DelegateSet } from './types' import { Account } from '../../Account' export const Description = ({ data, }: TransactionDescriptionProps) => { const { tx } = data const { Account: account, Authorize: authorize, Permissions: permissions, } = tx return ( , Permissions: ( {permissions .map((permission) => permission.Permission.PermissionValue) .join(', ')} ), Authorize: , }} /> ) } ================================================ FILE: src/containers/shared/components/Transaction/DelegateSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { DelegateSet } from './types' import { SimpleRow } from '../SimpleRow' import { Account } from '../../Account' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { Authorize, Permissions } = data.instructions return ( <> {Permissions.map((permission) => (
    {permission.Permission.PermissionValue}
    ))}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/DelegateSet/TableDetail.tsx ================================================ import { useTranslation, Trans } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { DelegateSet } from './types' import { Account } from '../../Account' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { Authorize, Permissions } = instructions return (
    {t('delegate')}, Permissions: ( {Permissions.map( (permission) => permission.Permission.PermissionValue, ).join(', ')} ), Account: , }} />
    ) } ================================================ FILE: src/containers/shared/components/Transaction/DelegateSet/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const DelegateSetTransaction: TransactionMapping = { Simple, TableDetail, Description, action: TransactionAction.CREATE, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/DelegateSet/test/DelegateSetDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import mockDelegateSet from './mock_data/DelegateSet.json' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('DelegateSet: Description', () => { it('renders', () => { const { container, unmount } = renderComponent(mockDelegateSet) expect(container).toHaveTextContent( 'rfFLs8ZknoJKHCw7MtJKcs8GL81dqoDGRz delegates Payment, AccountDomainSet permissions to rNRfqQc9b9ehXJJYVR6NqPPwrS26tWeB6N', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/DelegateSet/test/DelegateSetSimple.test.tsx ================================================ import { expectSimpleRowText, createSimpleRenderFactory } from '../../test' import { Simple } from '../Simple' import mockDelegateSet from './mock_data/DelegateSet.json' const renderComponent = createSimpleRenderFactory(Simple) describe('DelegateSet: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockDelegateSet) expectSimpleRowText( container, 'authorize', 'rNRfqQc9b9ehXJJYVR6NqPPwrS26tWeB6N', ) expectSimpleRowText(container, 'permissions', 'PaymentAccountDomainSet') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/DelegateSet/test/DelegateSetTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockDelegateSet from './mock_data/DelegateSet.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('DelegateSetTableDetail', () => { it('render DelegateSetTableDetail', () => { const { container, unmount } = renderComponent(mockDelegateSet) expect(container).toHaveTextContent( 'Delegate ' + 'Payment, AccountDomainSet permissions ' + 'to ' + 'rNRfqQc9b9ehXJJYVR6NqPPwrS26tWeB6N', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/DelegateSet/test/mock_data/DelegateSet.json ================================================ { "tx": { "Account": "rfFLs8ZknoJKHCw7MtJKcs8GL81dqoDGRz", "Authorize": "rNRfqQc9b9ehXJJYVR6NqPPwrS26tWeB6N", "Fee": "1", "Flags": 0, "LastLedgerSequence": 2947153, "Permissions": [ { "Permission": { "PermissionValue": "Payment" } }, { "Permission": { "PermissionValue": "AccountDomainSet" } } ], "Sequence": 2947131, "SigningPubKey": "ED9031FEB8A3DF9EDF8F5DA6DA1756C8DE57AF0C3A35A517807DC549418736BB89", "TransactionType": "DelegateSet", "TxnSignature": "0F9B6CA42B177E6F44456FDF06CE1F38D0C7B98EB28C2E43B393EAB6932DBF61E6024E5EAED158A93329F2661B15B218B8DB4FB74EF1DFA58246CA1E77B32801", "ctid": "C02CF83F00000002", "date": 1747765391000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfFLs8ZknoJKHCw7MtJKcs8GL81dqoDGRz", "Balance": "99999999", "Flags": 0, "OwnerCount": 1, "Sequence": 2947132 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "186BA30C233AEABA324162B0F0C67EFE31CDED0EBDA824E1F55A2D3AB19FC461", "PreviousFields": { "Balance": "100000000", "OwnerCount": 0, "Sequence": 2947131 }, "PreviousTxnID": "AEA9640F6C23CAEF178090BF43032506845A6CA339EA43BA2ADE8E3688D1F874", "PreviousTxnLgrSeq": 2947131 } }, { "CreatedNode": { "LedgerEntryType": "Delegate", "LedgerIndex": "756E9B60A214A46E3FCCD44776D5B578404E726E544EA54CF0C4900F303043A0", "NewFields": { "Account": "rfFLs8ZknoJKHCw7MtJKcs8GL81dqoDGRz", "Authorize": "rNRfqQc9b9ehXJJYVR6NqPPwrS26tWeB6N", "Permissions": [ { "Permission": { "PermissionValue": "Payment" } }, { "Permission": { "PermissionValue": "AccountDomainSet" } } ] } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "76D0EA7FD2D7EBE2C3952A777064E968686572E72B961DD8F2E84BF17EA18D59", "NewFields": { "Owner": "rfFLs8ZknoJKHCw7MtJKcs8GL81dqoDGRz", "RootIndex": "76D0EA7FD2D7EBE2C3952A777064E968686572E72B961DD8F2E84BF17EA18D59" } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "0E48E0E9F68F4DE642B439EFCF0A2BF4C2F79B528483CE1B7DCF20F531E613E8", "ledger_index": 2947135, "date": 1747765391000 } ================================================ FILE: src/containers/shared/components/Transaction/DelegateSet/types.ts ================================================ import { TransactionCommonFields } from '../types' // TODO: clean up when xrpl.js released with this feature. export interface DelegateSet extends TransactionCommonFields { Authorize: string Permissions: Permission[] } export interface Permission { Permission: { PermissionValue: string } } ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/Description.tsx ================================================ import { Trans, useTranslation } from 'react-i18next' import { Account } from '../../Account' import { TransactionDescriptionProps } from '../types' import { DepositPreauth } from './types' import { convertHexToString } from '../../../../../rippled/lib/utils' import { parser } from './parser' export const Description = ({ data, }: TransactionDescriptionProps) => { const { t } = useTranslation() const tx = parser(data.tx) if (tx.Authorize) { return (
    It authorizes to send payments to the account
    ) } if (tx.Unauthorize) { return (
    It removes the authorization for to send payments to the account
    ) } if (tx.AuthorizeCredentials && tx.AuthorizeCredentials.length > 0) { return (

    {t('deposit_auth_credentials')}

      {tx.AuthorizeCredentials.map((cred) => (
    • {convertHexToString(cred.CredentialType)} from{' '}
    • ))}
    ) } if (tx.UnauthorizeCredentials && tx.UnauthorizeCredentials.length > 0) { return (

    {t('deposit_unauth_credentials')}

      {tx.UnauthorizeCredentials.map((cred) => (
    • {convertHexToString(cred.CredentialType)} from{' '}
    • ))}
    ) } return null } ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from '../SimpleRow' import { SimpleGroup } from '../SimpleGroup' import { TransactionSimpleProps } from '../types' import { DepositPreauth } from './types' import { convertHexToString } from '../../../../../rippled/lib/utils' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const { Authorize, Unauthorize, AuthorizeCredentials, UnauthorizeCredentials, } = data.instructions if (Authorize) { return ( {Authorize} ) } if (Unauthorize) { return ( {Unauthorize} ) } if (AuthorizeCredentials && AuthorizeCredentials.length > 0) { return ( <>
    {`${t('authorize')} ${t('accepted_credentials')}`}
    {AuthorizeCredentials.map((cred, index) => ( {cred.Issuer} {convertHexToString(cred.CredentialType)} ))} ) } if (UnauthorizeCredentials && UnauthorizeCredentials.length > 0) { return ( <>
    {`${t('unauthorize')} ${t('accepted_credentials')}`}
    {UnauthorizeCredentials.map((cred, index) => ( {cred.Issuer} {convertHexToString(cred.CredentialType)} ))} ) } return null } ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { DepositPreauth } from './types' import { Account } from '../../Account' import { convertHexToString } from '../../../../../rippled/lib/utils' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { Authorize, Unauthorize, AuthorizeCredentials, UnauthorizeCredentials, } = instructions if (Authorize) { return (
    {t('authorize')}
    ) } if (Unauthorize) { return (
    {t('unauthorize')}
    ) } if (AuthorizeCredentials && AuthorizeCredentials.length > 0) { return (
    {t('authorize')} {t('accepted_credentials')}
    {AuthorizeCredentials.map((cred) => (
    {convertHexToString(cred.CredentialType)}
    ))}
    ) } if (UnauthorizeCredentials && UnauthorizeCredentials.length > 0) { return (
    {t('unauthorize')} {t('accepted_credentials')}
    {UnauthorizeCredentials.map((cred) => (
    {convertHexToString(cred.CredentialType)}
    ))}
    ) } return null } ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { Description } from './Description' import { TableDetail } from './TableDetail' import { parser } from './parser' export const DepositPreauthTransaction: TransactionMapping = { Description, Simple, TableDetail, parser, action: TransactionAction.MODIFY, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/parser.ts ================================================ import { CredentialAuth, DepositPreauth } from './types' // Transform the nested XRPL credential structure to flat CredentialAuth objects const transformCredentials = (credentials: any[]): CredentialAuth[] => credentials.map((item) => { // Check if it's nested (has Credential wrapper) or already flat if (item.Credential) { return { Issuer: item.Credential.Issuer, CredentialType: item.Credential.CredentialType, } } // Already flat, return as-is return { Issuer: item.Issuer, CredentialType: item.CredentialType, } }) export const parser = (tx: any): DepositPreauth => { // Handle AuthorizeCredentials (both nested and flat structures) if (tx.AuthorizeCredentials) { const { Authorize, Unauthorize, ...rest } = tx const result = { ...rest, AuthorizeCredentials: transformCredentials(tx.AuthorizeCredentials), } as DepositPreauth return result } // Handle UnauthorizeCredentials (both nested and flat structures) if (tx.UnauthorizeCredentials) { const { Authorize, Unauthorize, ...rest } = tx const result = { ...rest, UnauthorizeCredentials: transformCredentials(tx.UnauthorizeCredentials), } as DepositPreauth return result } // For Authorize/Unauthorize fields (string-based), pass through unchanged return tx as DepositPreauth } ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/test/DepositPreauthDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import mockDepositPreaut from './mock_data/DepositPreauth.json' import mockDepositPreauthUnauthorize from './mock_data/DepositPreauthUnauthorize.json' import mockDepositPreauthAuthorizeCredentials from './mock_data/DepositPreauthAuthorizeCredentials.json' import mockDepositPreauthUnauthorizeCredentials from './mock_data/DepositPreauthUnauthorizeCredentials.json' import { Description } from '../Description' import { createDescriptionRenderFactory } from '../../test' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('DepositPreauth: Description', () => { it('renders description for authorize', () => { const { container, unmount } = renderComponent(mockDepositPreaut) expect(container.innerHTML).toBe( `
    It authorizes to send payments to this account
    `, ) unmount() }) it('renders description for unauthorize', () => { const { container, unmount } = renderComponent( mockDepositPreauthUnauthorize, ) expect(container.innerHTML).toBe( `
    It removes the authorization for to send payments to this account
    `, ) unmount() }) it('renders description for authorize credentials', () => { const { container, unmount } = renderComponent( mockDepositPreauthAuthorizeCredentials, ) const html = container.innerHTML expect(html).toContain('It authorizes the following credentials:') expect(html).toContain('KYC') expect(html).toContain('rISABEL') expect(html).toContain('ID') expect(html).toContain('rTRUSTED') unmount() }) it('renders description for unauthorize credentials', () => { const { container, unmount } = renderComponent( mockDepositPreauthUnauthorizeCredentials, ) const html = container.innerHTML expect(html).toContain( 'It removes the authorization for the following credentials:', ) expect(html).toContain('KYC') expect(html).toContain('rISABEL') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/test/DepositPreauthSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText, expectSimpleRowLabel, } from '../../test' import { Simple } from '../Simple' import mockDepositPreauth from './mock_data/DepositPreauth.json' import mockDepositPreauthUnauthorize from './mock_data/DepositPreauthUnauthorize.json' import mockDepositPreauthAuthorizeCredentials from './mock_data/DepositPreauthAuthorizeCredentials.json' import mockDepositPreauthUnauthorizeCredentials from './mock_data/DepositPreauthUnauthorizeCredentials.json' const renderComponent = createSimpleRenderFactory(Simple) describe('DepositPreauth: Simple', () => { it('renders authorized', () => { const { container, unmount } = renderComponent(mockDepositPreauth) expectSimpleRowText( container, 'authorize', 'rDJFnv5sEfp42LMFiX3mVQKczpFTdxYDzM', ) unmount() }) it('renders unauthorized', () => { const { container, unmount } = renderComponent( mockDepositPreauthUnauthorize, ) expectSimpleRowText( container, 'unauthorize', 'rDJFnv5sEfp42LMFiX3mVQKczpFTdxYDzM', ) unmount() }) it('renders authorize credentials', () => { const { container, unmount } = renderComponent( mockDepositPreauthAuthorizeCredentials, ) // Check that SimpleGroup is rendered expect(container.querySelectorAll('.group')).toHaveLength(2) expect(container.querySelectorAll('.groups-title')).toHaveLength(1) // Check first credential expectSimpleRowText(container, 'credential-issuer-0', 'rISABEL......') expectSimpleRowLabel(container, 'credential-issuer-0', 'credential_issuer') expectSimpleRowText(container, 'credential-type-0', 'KYC') // 4B5943 hex decodes to "KYC" expectSimpleRowLabel(container, 'credential-type-0', 'credential_type') // Check second credential expectSimpleRowText(container, 'credential-issuer-1', 'rTRUSTED.....') expectSimpleRowLabel(container, 'credential-issuer-1', 'credential_issuer') expectSimpleRowText(container, 'credential-type-1', 'ID') // 4944 hex decodes to "ID" expectSimpleRowLabel(container, 'credential-type-1', 'credential_type') unmount() }) it('renders unauthorize credentials', () => { const { container, unmount } = renderComponent( mockDepositPreauthUnauthorizeCredentials, ) // Check that SimpleGroup is rendered expect(container.querySelectorAll('.group')).toHaveLength(1) expect(container.querySelectorAll('.groups-title')).toHaveLength(1) expectSimpleRowText(container, 'credential-issuer-0', 'rISABEL......') expectSimpleRowLabel(container, 'credential-issuer-0', 'credential_issuer') expectSimpleRowText(container, 'credential-type-0', 'KYC') // 4B5943 hex decodes to "KYC" expectSimpleRowLabel(container, 'credential-type-0', 'credential_type') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/test/DepositPreauthTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockDepositPreauth from './mock_data/DepositPreauth.json' import mockDepositPreauthAuthorizeCredentials from './mock_data/DepositPreauthAuthorizeCredentials.json' import mockDepositPreauthUnauthorize from './mock_data/DepositPreauthUnauthorize.json' import mockDepositPreauthUnauthorizeCredentials from './mock_data/DepositPreauthUnauthorizeCredentials.json' import i18n from '../../../../../../i18n/testConfigEnglish' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('DepositPreauthTableDetail', () => { it('renders DepositPreauth with Authorize', () => { const { container, unmount } = renderComponent(mockDepositPreauth) expect(container.querySelector('.deposit-preauth')).toBeInTheDocument() expect( container.querySelector('.deposit-preauth .label'), ).toHaveTextContent('authorize') expect( container.querySelector('[data-testid="account"]'), ).toBeInTheDocument() expect( container.querySelector('[data-testid="account"]'), ).toHaveTextContent('rDJFnv5sEfp42LMFiX3mVQKczpFTdxYDzM') unmount() }) it('renders DepositPreauth with Unauthorize', () => { const { container, unmount } = renderComponent( mockDepositPreauthUnauthorize, ) expect(container.querySelector('.deposit-preauth')).toBeInTheDocument() expect( container.querySelector('.deposit-preauth .label'), ).toHaveTextContent('unauthorize') expect( container.querySelector('[data-testid="account"]'), ).toBeInTheDocument() expect( container.querySelector('[data-testid="account"]'), ).toHaveTextContent('rDJFnv5sEfp42LMFiX3mVQKczpFTdxYDzM') unmount() }) it('renders DepositPreauth with AuthorizeCredentials', () => { const { container, unmount } = renderComponent( mockDepositPreauthAuthorizeCredentials, ) expect(container.querySelector('.deposit-preauth')).toBeInTheDocument() expect( container.querySelector('.deposit-preauth .label'), ).toHaveTextContent('authorize Accepted Credentials') expect(container.querySelector('.credentials')).toBeInTheDocument() expect(container.querySelectorAll('.credential')).toHaveLength(2) const credentialTypes = container.querySelectorAll('.credential-type') expect(credentialTypes[0]).toHaveTextContent('KYC') expect(credentialTypes[1]).toHaveTextContent('ID') unmount() }) it('renders DepositPreauth with UnauthorizeCredentials', () => { const { container, unmount } = renderComponent( mockDepositPreauthUnauthorizeCredentials, ) expect(container.querySelector('.deposit-preauth')).toBeInTheDocument() expect( container.querySelector('.deposit-preauth .label'), ).toHaveTextContent('unauthorize Accepted Credentials') expect(container.querySelector('.credentials')).toBeInTheDocument() expect(container.querySelectorAll('.credential')).toHaveLength(1) expect(container.querySelector('.credential-type')).toHaveTextContent('KYC') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/test/mock_data/DepositPreauth.json ================================================ { "hash": "B5D94C027C846171B2F5D4C2D126E88580BF369986A155C1890352F5BC4D7AF9", "ledger_index": 37360499, "date": "2018-03-20T12:48:10+00:00", "tx": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "Authorize": "rDJFnv5sEfp42LMFiX3mVQKczpFTdxYDzM", "Fee": "10", "Flags": 2147483648, "Sequence": 65, "SigningPubKey": "03EB1E2603E7571D6144684996C10DA75063D6E2F3B3FDABE38B857C1BE9578A55", "TransactionType": "DepositPreauth", "TxnSignature": "3045022100B0A5672E3E09FA3AF8CF1DCC1D8C881F58B39212D6FDC42CCF30E5400D0EFD9F02202DDD9517D9409D1D9A529B8AEA7DE13AE4CDF96BB6D18FA0D9732DBFC887348D" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "Balance": "9827999174", "Flags": 0, "OwnerCount": 8, "Sequence": 66 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "146AAAF7A266D8A92DFFEAB1A71B6523534F27820873F4E213014B23398867D2", "PreviousFields": { "Balance": "9827999184", "OwnerCount": 7, "Sequence": 65 }, "PreviousTxnID": "8107CEE99D556326ACD4662CA10A24550240D9F933E55435A0C0DB3B06DD343E", "PreviousTxnLgrSeq": 11427673 } }, { "CreatedNode": { "LedgerEntryType": "DepositPreauth", "LedgerIndex": "C2D0317AD266B93CB3B36AEB0ABB673B0AFFAB134809CCACFD7158F539603C3A", "NewFields": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "Authorize": "rDJFnv5sEfp42LMFiX3mVQKczpFTdxYDzM" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "RootIndex": "CD08416851CA53E9649408118A4908E01E43436ED950886D1B1E66F4B68B82EC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CD08416851CA53E9649408118A4908E01E43436ED950886D1B1E66F4B68B82EC" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/test/mock_data/DepositPreauthAuthorizeCredentials.json ================================================ { "hash": "B5D94C027C846171B2F5D4C2D126E88580BF369986A155C1890352F5BC4D7AF9", "ledger_index": 37360499, "date": "2018-03-20T12:48:10+00:00", "tx": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "AuthorizeCredentials": [ { "Credential": { "Issuer": "rISABEL......", "CredentialType": "4B5943" } }, { "Credential": { "Issuer": "rTRUSTED.....", "CredentialType": "4944" } } ], "Fee": "10", "Flags": 2147483648, "Sequence": 65, "SigningPubKey": "03EB1E2603E7571D6144684996C10DA75063D6E2F3B3FDABE38B857C1BE9578A55", "TransactionType": "DepositPreauth", "TxnSignature": "3045022100B0A5672E3E09FA3AF8CF1DCC1D8C881F58B39212D6FDC42CCF30E5400D0EFD9F02202DDD9517D9409D1D9A529B8AEA7DE13AE4CDF96BB6D18FA0D9732DBFC887348D" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "Balance": "9827999174", "Flags": 0, "OwnerCount": 8, "Sequence": 66 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "146AAAF7A266D8A92DFFEAB1A71B6523534F27820873F4E213014B23398867D2", "PreviousFields": { "Balance": "9827999184", "OwnerCount": 7, "Sequence": 65 }, "PreviousTxnID": "8107CEE99D556326ACD4662CA10A24550240D9F933E55435A0C0DB3B06DD343E", "PreviousTxnLgrSeq": 11427673 } }, { "CreatedNode": { "LedgerEntryType": "DepositPreauth", "LedgerIndex": "C2D0317AD266B93CB3B36AEB0ABB673B0AFFAB134809CCACFD7158F539603C3A", "NewFields": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "AuthorizeCredentials": [ { "Credential": { "Issuer": "rISABEL......", "CredentialType": "4B5943" } }, { "Credential": { "Issuer": "rTRUSTED.....", "CredentialType": "4944" } } ] } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "RootIndex": "CD08416851CA53E9649408118A4908E01E43436ED950886D1B1E66F4B68B82EC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CD08416851CA53E9649408118A4908E01E43436ED950886D1B1E66F4B68B82EC" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/test/mock_data/DepositPreauthUnauthorize.json ================================================ { "hash": "B5D94C027C846171B2F5D4C2D126E88580BF369986A155C1890352F5BC4D7AF9", "ledger_index": 37360499, "date": "2018-03-20T12:48:10+00:00", "tx": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "Unauthorize": "rDJFnv5sEfp42LMFiX3mVQKczpFTdxYDzM", "Fee": "10", "Flags": 2147483648, "Sequence": 65, "SigningPubKey": "03EB1E2603E7571D6144684996C10DA75063D6E2F3B3FDABE38B857C1BE9578A55", "TransactionType": "DepositPreauth", "TxnSignature": "3045022100B0A5672E3E09FA3AF8CF1DCC1D8C881F58B39212D6FDC42CCF30E5400D0EFD9F02202DDD9517D9409D1D9A529B8AEA7DE13AE4CDF96BB6D18FA0D9732DBFC887348D" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "Balance": "9827999174", "Flags": 0, "OwnerCount": 8, "Sequence": 66 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "146AAAF7A266D8A92DFFEAB1A71B6523534F27820873F4E213014B23398867D2", "PreviousFields": { "Balance": "9827999184", "OwnerCount": 7, "Sequence": 65 }, "PreviousTxnID": "8107CEE99D556326ACD4662CA10A24550240D9F933E55435A0C0DB3B06DD343E", "PreviousTxnLgrSeq": 11427673 } }, { "CreatedNode": { "LedgerEntryType": "DepositPreauth", "LedgerIndex": "C2D0317AD266B93CB3B36AEB0ABB673B0AFFAB134809CCACFD7158F539603C3A", "NewFields": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "Authorize": "rDJFnv5sEfp42LMFiX3mVQKczpFTdxYDzM" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "RootIndex": "CD08416851CA53E9649408118A4908E01E43436ED950886D1B1E66F4B68B82EC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CD08416851CA53E9649408118A4908E01E43436ED950886D1B1E66F4B68B82EC" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/test/mock_data/DepositPreauthUnauthorizeCredentials.json ================================================ { "hash": "B5D94C027C846171B2F5D4C2D126E88580BF369986A155C1890352F5BC4D7AF9", "ledger_index": 37360499, "date": "2018-03-20T12:48:10+00:00", "tx": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "UnauthorizeCredentials": [ { "Credential": { "Issuer": "rISABEL......", "CredentialType": "4B5943" } } ], "Fee": "10", "Flags": 2147483648, "Sequence": 65, "SigningPubKey": "03EB1E2603E7571D6144684996C10DA75063D6E2F3B3FDABE38B857C1BE9578A55", "TransactionType": "DepositPreauth", "TxnSignature": "3045022100B0A5672E3E09FA3AF8CF1DCC1D8C881F58B39212D6FDC42CCF30E5400D0EFD9F02202DDD9517D9409D1D9A529B8AEA7DE13AE4CDF96BB6D18FA0D9732DBFC887348D" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "Balance": "9827999174", "Flags": 0, "OwnerCount": 8, "Sequence": 66 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "146AAAF7A266D8A92DFFEAB1A71B6523534F27820873F4E213014B23398867D2", "PreviousFields": { "Balance": "9827999184", "OwnerCount": 7, "Sequence": 65 }, "PreviousTxnID": "8107CEE99D556326ACD4662CA10A24550240D9F933E55435A0C0DB3B06DD343E", "PreviousTxnLgrSeq": 11427673 } }, { "DeletedNode": { "FinalFields": { "Account": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "UnauthorizeCredentials": [ { "Credential": { "Issuer": "rISABEL......", "CredentialType": "4B5943" } } ] }, "LedgerEntryType": "DepositPreauth", "LedgerIndex": "C2D0317AD266B93CB3B36AEB0ABB673B0AFFAB134809CCACFD7158F539603C3A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDd6FpNbeY2CrQajSmP178BmNGusmQiYMM", "RootIndex": "CD08416851CA53E9649408118A4908E01E43436ED950886D1B1E66F4B68B82EC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CD08416851CA53E9649408118A4908E01E43436ED950886D1B1E66F4B68B82EC" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/DepositPreauth/types.ts ================================================ // Credential authorization object as per XLS-70 spec export interface CredentialAuth { Issuer: string CredentialType: string } export interface DepositPreauthWithAuthorize { Authorize: string Unauthorize: never AuthorizeCredentials: never UnauthorizeCredentials: never } export interface DepositPreauthWithUnauthorize { Authorize: never Unauthorize: string AuthorizeCredentials: never UnauthorizeCredentials: never } export interface DepositPreauthWithAuthorizeCredentials { Authorize: never Unauthorize: never AuthorizeCredentials: CredentialAuth[] UnauthorizeCredentials: never } export interface DepositPreauthWithUnauthorizeCredentials { Authorize: never Unauthorize: never AuthorizeCredentials: never UnauthorizeCredentials: CredentialAuth[] } export type DepositPreauth = | DepositPreauthWithAuthorize | DepositPreauthWithUnauthorize | DepositPreauthWithAuthorizeCredentials | DepositPreauthWithUnauthorizeCredentials ================================================ FILE: src/containers/shared/components/Transaction/EnableAmendment/Simple.tsx ================================================ import { useContext, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import type { EnableAmendment } from 'xrpl' import { useLanguage } from '../../../hooks' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { getExpectedDate, getRippledVersion } from '../../../amendmentUtils' import { AMENDMENT_ROUTE } from '../../../../App/routes' import { RouteLink } from '../../../routing' import SocketContext from '../../../SocketContext' import { getFeature } from '../../../../../rippled/lib/rippled' const states = { loading: 'Loading', unknown: 'Unknown', } export const Simple = ({ data }: TransactionSimpleProps) => { const language = useLanguage() const { t } = useTranslation() const [amendmentDetails, setAmendmentDetails] = useState({ name: states.loading, minRippledVersion: states.loading, }) const rippledSocket = useContext(SocketContext) useEffect(() => { const amendmentId = data.instructions.Amendment getFeature(rippledSocket, amendmentId).then((feature) => { const name = feature && feature[amendmentId] ? feature[amendmentId].name : '' getRippledVersion(name).then((rippledVersion) => { setAmendmentDetails({ name: name || states.unknown, minRippledVersion: rippledVersion || states.unknown, }) }) }) }, [data.instructions.Amendment, rippledSocket]) let amendmentStatus = states.unknown let expectedDate: string | null = states.unknown switch (data.instructions.Flags) { case undefined: amendmentStatus = 'Enabled' break case 65536: amendmentStatus = 'Got Majority' expectedDate = getExpectedDate(data.instructions.date, language) break case 131072: amendmentStatus = 'Lost Majority' break default: amendmentStatus = states.unknown } return ( <> {amendmentDetails.name} {amendmentStatus} {amendmentDetails.minRippledVersion} {amendmentStatus === 'Got Majority' && ( {expectedDate} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/EnableAmendment/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' export const EnableAmendmentTransaction: TransactionMapping = { Simple, action: TransactionAction.MODIFY, category: TransactionCategory.PSEUDO, } ================================================ FILE: src/containers/shared/components/Transaction/EnableAmendment/test/EnableAmendmentSimple.test.tsx ================================================ import { waitFor } from '@testing-library/react' import i18n from '../../../../../../i18n/testConfigEnglish' import { expectSimpleRowLabel, expectSimpleRowNotToExist, expectSimpleRowText, } from '../../test' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockEnableAmendmentWithEnabled from './mock_data/EnableAmendmentWithEnabled.json' import mockEnableAmendmentWithMinority from './mock_data/EnableAmendmentWithMinority.json' import mockEnableAmendmentWithMajority from './mock_data/EnableAmendmentWithMajority.json' import mockFeatureExpandedSignerList from './mock_data/FeatureExpandedSignerList.json' import mockFeatureNegativeUNL from './mock_data/FeatureNegativeUNL.json' import { getRippledVersion } from '../../../../amendmentUtils' import { getFeature } from '../../../../../../rippled/lib/rippled' const renderComponent = createSimpleRenderFactory(Simple, i18n) jest.mock('../../../../amendmentUtils', () => { // Require the original module to not be mocked... const originalModule = jest.requireActual('../../../../amendmentUtils') return { __esModule: true, ...originalModule, getRippledVersion: jest.fn(), } }) jest.mock('../../../../../../rippled/lib/rippled', () => { const originalModule = jest.requireActual( '../../../../../../rippled/lib/rippled', ) return { __esModule: true, ...originalModule, getFeature: jest.fn(), } }) const mockedGetRippledVersion = getRippledVersion as jest.MockedFunction< typeof getRippledVersion > const mockedGetFeature = getFeature as jest.MockedFunction describe('EnableAmendment: Simple', () => { afterEach(() => { mockedGetFeature.mockReset() }) it('renders tx that causes an amendment to loose majority', async () => { mockedGetRippledVersion.mockImplementation(() => Promise.resolve('v1.9.1')) mockedGetFeature.mockImplementation(() => Promise.resolve(mockFeatureExpandedSignerList), ) const { container, unmount } = renderComponent( mockEnableAmendmentWithMinority, ) expectSimpleRowLabel(container, 'name', 'Amendment Name') expectSimpleRowText(container, 'name', 'Loading') expectSimpleRowLabel(container, 'status', 'Amendment Status') expectSimpleRowText(container, 'status', 'Lost Majority') expectSimpleRowLabel(container, 'version', 'Introduced In') expectSimpleRowText(container, 'version', 'Loading') expectSimpleRowNotToExist(container, 'date') await waitFor(() => { expectSimpleRowText(container, 'name', 'ExpandedSignerList') }) expectSimpleRowText(container, 'version', 'v1.9.1') unmount() }) it('renders tx that causes an amendment to gain majority', async () => { mockedGetRippledVersion.mockImplementation(() => Promise.resolve('v1.9.1')) mockedGetFeature.mockImplementation(() => Promise.resolve(mockFeatureExpandedSignerList), ) const { container, unmount } = renderComponent( mockEnableAmendmentWithMajority, ) expectSimpleRowLabel(container, 'name', 'Amendment Name') expectSimpleRowText(container, 'name', 'Loading') expectSimpleRowLabel(container, 'status', 'Amendment Status') expectSimpleRowText(container, 'status', 'Got Majority') expectSimpleRowLabel(container, 'version', 'Introduced In') expectSimpleRowText(container, 'version', 'Loading') expectSimpleRowLabel(container, 'date', 'Expected Date') expectSimpleRowText(container, 'date', '10/13/2022, 3:28:31 PM') await waitFor(() => { expectSimpleRowText(container, 'name', 'ExpandedSignerList') }) expectSimpleRowText(container, 'version', 'v1.9.1') expect( container.querySelector('[data-testid="name"] .value a'), ).toHaveAttribute( 'href', '/amendment/B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856', ) unmount() }) it('renders tx that enables an amendment', async () => { mockedGetRippledVersion.mockImplementation(() => Promise.resolve('v1.7.3')) mockedGetFeature.mockImplementation(() => Promise.resolve(mockFeatureNegativeUNL), ) const { container, unmount } = renderComponent( mockEnableAmendmentWithEnabled, ) expectSimpleRowLabel(container, 'name', 'Amendment Name') expectSimpleRowText(container, 'name', 'Loading') expectSimpleRowLabel(container, 'status', 'Amendment Status') expectSimpleRowText(container, 'status', 'Enabled') expectSimpleRowLabel(container, 'version', 'Introduced In') expectSimpleRowText(container, 'version', 'Loading') await waitFor(() => { expectSimpleRowText(container, 'name', 'NegativeUNL') }) expectSimpleRowText(container, 'version', 'v1.7.3') unmount() }) it('renders tx that cannot determine version or name', async () => { mockedGetRippledVersion.mockImplementation(() => Promise.resolve('')) mockedGetFeature.mockImplementation(() => Promise.resolve(null)) const { container } = renderComponent(mockEnableAmendmentWithEnabled) expectSimpleRowLabel(container, 'name', 'Amendment Name') expectSimpleRowText(container, 'name', 'Loading') expectSimpleRowLabel(container, 'version', 'Introduced In') expectSimpleRowText(container, 'version', 'Loading') await waitFor(() => { expectSimpleRowText(container, 'name', 'Unknown') }) expectSimpleRowText(container, 'version', 'Unknown') }) it('renders tx that cannot determine version', async () => { mockedGetRippledVersion.mockImplementation(() => Promise.resolve('')) mockedGetFeature.mockImplementation(() => Promise.resolve(mockFeatureNegativeUNL), ) const { container } = renderComponent(mockEnableAmendmentWithEnabled) expectSimpleRowLabel(container, 'name', 'Amendment Name') expectSimpleRowText(container, 'name', 'Loading') expectSimpleRowLabel(container, 'version', 'Introduced In') expectSimpleRowText(container, 'version', 'Loading') await waitFor(() => { expectSimpleRowText(container, 'name', 'NegativeUNL') }) expectSimpleRowText(container, 'version', 'Unknown') }) it('renders tx that cannot determine name', async () => { mockedGetRippledVersion.mockImplementation(() => Promise.resolve('v1.7.3')) mockedGetFeature.mockImplementation(() => Promise.resolve(null)) const { container } = renderComponent(mockEnableAmendmentWithEnabled) expectSimpleRowLabel(container, 'name', 'Amendment Name') expectSimpleRowText(container, 'name', 'Loading') expectSimpleRowLabel(container, 'version', 'Introduced In') expectSimpleRowText(container, 'version', 'Loading') await waitFor(() => { expectSimpleRowText(container, 'name', 'Unknown') }) expectSimpleRowText(container, 'version', 'v1.7.3') }) }) ================================================ FILE: src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/EnableAmendmentWithEnabled.json ================================================ { "tx": { "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp", "Amendment": "B4E4F5D2D6FB84DF7399960A732309C9FD530EAE5941838160042833625A6076", "Fee": "0", "LedgerSequence": 67849217, "Sequence": 0, "SigningPubKey": "", "TransactionType": "EnableAmendment", "date": "2021-11-21T18:38:51Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Amendments": [ "42426C4D4F1009EE67080A9B7965B44656D7714D104A72F9B4369F97ABF044EE", "4C97EBA926031A7CF7D7B36FDE3ED66DDA5421192D63DE53FFB46E43B9DC8373", "6781F8368C4771B83E8B821D88F580202BCB4228075297B19E4FDC5233F1EFDC", "740352F2412A9909880C23A559FCECEDA3BE2126FED62FC7660D628A06927F11", "1562511F573A19AE9BD103B5D6B9E01B3B46805AEC5D3C4805C902B514399146", "532651B4FD58DF8922A49BA101AB3E996E5BFBF95A913B3E392504863E63B164", "08DE7D96082187F6E6578530258C77FAABABE4C20474BDB82F04B021F1A68647", "E2E6F2866106419B88C50045ACE96368558C345566AC8F2BDF5A5B5587F0E6FA", "07D43DCE529B15A10827E5E04943B496762F9A88E3268269D69C44BE49E21104", "42EEA5E28A97824821D4EF97081FE36A54E9593C6E4F20CBAE098C69D2E072DC", "DC9CA96AEA1DCF83E527D1AFC916EFAF5D27388ECA4060A88817C1238CAEE0BF", "1D3463A5891F9E589C5AE839FFAC4A917CE96197098A1EF22304E1BC5B98A454", "6C92211186613F9647A89DFFBAB8F94C99D4C7E956D495270789128569177DA1", "CC5ABAE4F3EC92E94A59B1908C2BE82D2228B6485C00AFF8F22DF930D89C194E", "B9E739B8296B4A1BB29BE990B17D66E21B62A300A909F25AC55C22D6C72E1F9D", "B4D44CC3111ADD964E846FC57760C8B50FFCD5A82C86A72756F6B058DDDF96AD", "67A34F2CF55BFC0F93AACD5B281413176FEE195269FA6D95219A2DF738671172", "F64E1EABBE79D55B3BB82020516CEC2C582A98A6BFE20FBE9BB6A0D233418064", "7117E2EC2DBF119CA55181D69819F1999ECEE1A0225A7FD2B9ED47940968479C", "58BE9B5968C4DA7C59BA900961828B113E5490699B21877DEF9A31E9D0FE5D5F", "CA7C02118BA27599528543DFE77BA6838D1B0F43B447D4D7F53523CE6A0E9AC2", "5D08145F0A4983F23AFFFF514E83FAD355C5ABFBB6CAB76FB5BC8519FF5F33BE", "3CBC5C4E630A1B82380295CDA84B32B49DD066602E74E39B85EF64137FA65194", "FBD513F1B893AC765B78F250E6FFA6A11B573209D1842ADC787C850696741288", "2CD5286D8D687E98B41102BDD797198E81EA41DF7BD104E6561FEB104EFF2561", "586480873651E106F1D6339B0C4A8945BA705A777F3F4524626FF1FC07EFE41D", "C4483A1896170C66C098DEA5B0E024309C60DC960DE5F01CD7AF986AA3D9AD37", "8F81B066ED20DAECA20DF57187767685EEF3980B228E0667A650BAF24426D3B4", "621A0B264970359869E3C0363A899909AAB7A887C8B73519E4ECF952D33258A8", "30CD365592B8EE40489BA01AE2F7555CAC9C983145871DC82A42A31CF5BAE7D9", "157D2D480E006395B76F948E3E07A45A05FE10230D88A7993C71F97AE4B1F2D1", "00C1FC4A53E60AB02C864641002B3172F38677E29C26C5406685179B37E1EDAC", "89308AF3B8B10B7192C4E613E1D2E4D9BA64B2EE2D5232402AE82A6A7220D953", "3012E8230864E95A58C60FD61430D7E1B4D3353195F2981DC12B0C7C0950FFAC", "1F4AFA8FA1BC8827AD4C0F682C03A8B671DCDF6B5C4DE36D44243A684103EF88", "4F46DF03559967AC60F2EB272FEFE3928A7594A45FF774B87A7E540DB0F8F068", "25BA44241B3BD880770BFA4DA21C7180576831855368CBEC6A3154FDE4A7676E", "452F5906C46D46F407883344BFDD90E672B672C5E9943DB4891E3A34FEEEB9DB", "AF8DF7465C338AE64B1E937D6C8DA138C0D63AD5134A68792BBBE1F63356C422", "B6B3EEDC0267AB50491FDC450A398AF30DBCD977CECED8BEF2499CAB5DAC19E2", "955DF3FA5891195A9DAEFA1DDC6BB244B545DDE1BAA84CBB25D5F12A8DA68A0C", "B4E4F5D2D6FB84DF7399960A732309C9FD530EAE5941838160042833625A6076" ], "Flags": 0 }, "LedgerEntryType": "Amendments", "LedgerIndex": "7DB0788C020F02780A673DC74757F23823FA3014C1866E72CC4CD8B226CD6EF4", "PreviousFields": { "Amendments": [ "42426C4D4F1009EE67080A9B7965B44656D7714D104A72F9B4369F97ABF044EE", "4C97EBA926031A7CF7D7B36FDE3ED66DDA5421192D63DE53FFB46E43B9DC8373", "6781F8368C4771B83E8B821D88F580202BCB4228075297B19E4FDC5233F1EFDC", "740352F2412A9909880C23A559FCECEDA3BE2126FED62FC7660D628A06927F11", "1562511F573A19AE9BD103B5D6B9E01B3B46805AEC5D3C4805C902B514399146", "532651B4FD58DF8922A49BA101AB3E996E5BFBF95A913B3E392504863E63B164", "08DE7D96082187F6E6578530258C77FAABABE4C20474BDB82F04B021F1A68647", "E2E6F2866106419B88C50045ACE96368558C345566AC8F2BDF5A5B5587F0E6FA", "07D43DCE529B15A10827E5E04943B496762F9A88E3268269D69C44BE49E21104", "42EEA5E28A97824821D4EF97081FE36A54E9593C6E4F20CBAE098C69D2E072DC", "DC9CA96AEA1DCF83E527D1AFC916EFAF5D27388ECA4060A88817C1238CAEE0BF", "1D3463A5891F9E589C5AE839FFAC4A917CE96197098A1EF22304E1BC5B98A454", "6C92211186613F9647A89DFFBAB8F94C99D4C7E956D495270789128569177DA1", "CC5ABAE4F3EC92E94A59B1908C2BE82D2228B6485C00AFF8F22DF930D89C194E", "B9E739B8296B4A1BB29BE990B17D66E21B62A300A909F25AC55C22D6C72E1F9D", "B4D44CC3111ADD964E846FC57760C8B50FFCD5A82C86A72756F6B058DDDF96AD", "67A34F2CF55BFC0F93AACD5B281413176FEE195269FA6D95219A2DF738671172", "F64E1EABBE79D55B3BB82020516CEC2C582A98A6BFE20FBE9BB6A0D233418064", "7117E2EC2DBF119CA55181D69819F1999ECEE1A0225A7FD2B9ED47940968479C", "58BE9B5968C4DA7C59BA900961828B113E5490699B21877DEF9A31E9D0FE5D5F", "CA7C02118BA27599528543DFE77BA6838D1B0F43B447D4D7F53523CE6A0E9AC2", "5D08145F0A4983F23AFFFF514E83FAD355C5ABFBB6CAB76FB5BC8519FF5F33BE", "3CBC5C4E630A1B82380295CDA84B32B49DD066602E74E39B85EF64137FA65194", "FBD513F1B893AC765B78F250E6FFA6A11B573209D1842ADC787C850696741288", "2CD5286D8D687E98B41102BDD797198E81EA41DF7BD104E6561FEB104EFF2561", "586480873651E106F1D6339B0C4A8945BA705A777F3F4524626FF1FC07EFE41D", "C4483A1896170C66C098DEA5B0E024309C60DC960DE5F01CD7AF986AA3D9AD37", "8F81B066ED20DAECA20DF57187767685EEF3980B228E0667A650BAF24426D3B4", "621A0B264970359869E3C0363A899909AAB7A887C8B73519E4ECF952D33258A8", "30CD365592B8EE40489BA01AE2F7555CAC9C983145871DC82A42A31CF5BAE7D9", "157D2D480E006395B76F948E3E07A45A05FE10230D88A7993C71F97AE4B1F2D1", "00C1FC4A53E60AB02C864641002B3172F38677E29C26C5406685179B37E1EDAC", "89308AF3B8B10B7192C4E613E1D2E4D9BA64B2EE2D5232402AE82A6A7220D953", "3012E8230864E95A58C60FD61430D7E1B4D3353195F2981DC12B0C7C0950FFAC", "1F4AFA8FA1BC8827AD4C0F682C03A8B671DCDF6B5C4DE36D44243A684103EF88", "4F46DF03559967AC60F2EB272FEFE3928A7594A45FF774B87A7E540DB0F8F068", "25BA44241B3BD880770BFA4DA21C7180576831855368CBEC6A3154FDE4A7676E", "452F5906C46D46F407883344BFDD90E672B672C5E9943DB4891E3A34FEEEB9DB", "AF8DF7465C338AE64B1E937D6C8DA138C0D63AD5134A68792BBBE1F63356C422", "B6B3EEDC0267AB50491FDC450A398AF30DBCD977CECED8BEF2499CAB5DAC19E2", "955DF3FA5891195A9DAEFA1DDC6BB244B545DDE1BAA84CBB25D5F12A8DA68A0C" ], "Majorities": [ { "Majority": { "Amendment": "B4E4F5D2D6FB84DF7399960A732309C9FD530EAE5941838160042833625A6076", "CloseTime": 689625462 } } ] } } } ], "TransactionIndex": 66, "TransactionResult": "tesSUCCESS" }, "hash": "1500FADB73E7148191216C53040990E829C7110788B26E7F3246CB3660769EBA", "ledger_index": 67849217, "date": "2021-11-21T18:38:51Z" } ================================================ FILE: src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/EnableAmendmentWithMajority.json ================================================ { "tx": { "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp", "Amendment": "B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856", "Fee": "0", "Flags": 65536, "LedgerSequence": 74724097, "Sequence": 0, "SigningPubKey": "", "TransactionType": "EnableAmendment", "date": "2022-09-29T15:28:31Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Amendments": [ "42426C4D4F1009EE67080A9B7965B44656D7714D104A72F9B4369F97ABF044EE", "4C97EBA926031A7CF7D7B36FDE3ED66DDA5421192D63DE53FFB46E43B9DC8373", "6781F8368C4771B83E8B821D88F580202BCB4228075297B19E4FDC5233F1EFDC", "740352F2412A9909880C23A559FCECEDA3BE2126FED62FC7660D628A06927F11", "1562511F573A19AE9BD103B5D6B9E01B3B46805AEC5D3C4805C902B514399146", "532651B4FD58DF8922A49BA101AB3E996E5BFBF95A913B3E392504863E63B164", "08DE7D96082187F6E6578530258C77FAABABE4C20474BDB82F04B021F1A68647", "E2E6F2866106419B88C50045ACE96368558C345566AC8F2BDF5A5B5587F0E6FA", "07D43DCE529B15A10827E5E04943B496762F9A88E3268269D69C44BE49E21104", "42EEA5E28A97824821D4EF97081FE36A54E9593C6E4F20CBAE098C69D2E072DC", "DC9CA96AEA1DCF83E527D1AFC916EFAF5D27388ECA4060A88817C1238CAEE0BF", "1D3463A5891F9E589C5AE839FFAC4A917CE96197098A1EF22304E1BC5B98A454", "6C92211186613F9647A89DFFBAB8F94C99D4C7E956D495270789128569177DA1", "CC5ABAE4F3EC92E94A59B1908C2BE82D2228B6485C00AFF8F22DF930D89C194E", "B9E739B8296B4A1BB29BE990B17D66E21B62A300A909F25AC55C22D6C72E1F9D", "B4D44CC3111ADD964E846FC57760C8B50FFCD5A82C86A72756F6B058DDDF96AD", "67A34F2CF55BFC0F93AACD5B281413176FEE195269FA6D95219A2DF738671172", "F64E1EABBE79D55B3BB82020516CEC2C582A98A6BFE20FBE9BB6A0D233418064", "7117E2EC2DBF119CA55181D69819F1999ECEE1A0225A7FD2B9ED47940968479C", "58BE9B5968C4DA7C59BA900961828B113E5490699B21877DEF9A31E9D0FE5D5F", "CA7C02118BA27599528543DFE77BA6838D1B0F43B447D4D7F53523CE6A0E9AC2", "5D08145F0A4983F23AFFFF514E83FAD355C5ABFBB6CAB76FB5BC8519FF5F33BE", "3CBC5C4E630A1B82380295CDA84B32B49DD066602E74E39B85EF64137FA65194", "FBD513F1B893AC765B78F250E6FFA6A11B573209D1842ADC787C850696741288", "2CD5286D8D687E98B41102BDD797198E81EA41DF7BD104E6561FEB104EFF2561", "586480873651E106F1D6339B0C4A8945BA705A777F3F4524626FF1FC07EFE41D", "C4483A1896170C66C098DEA5B0E024309C60DC960DE5F01CD7AF986AA3D9AD37", "8F81B066ED20DAECA20DF57187767685EEF3980B228E0667A650BAF24426D3B4", "621A0B264970359869E3C0363A899909AAB7A887C8B73519E4ECF952D33258A8", "30CD365592B8EE40489BA01AE2F7555CAC9C983145871DC82A42A31CF5BAE7D9", "157D2D480E006395B76F948E3E07A45A05FE10230D88A7993C71F97AE4B1F2D1", "00C1FC4A53E60AB02C864641002B3172F38677E29C26C5406685179B37E1EDAC", "89308AF3B8B10B7192C4E613E1D2E4D9BA64B2EE2D5232402AE82A6A7220D953", "3012E8230864E95A58C60FD61430D7E1B4D3353195F2981DC12B0C7C0950FFAC", "1F4AFA8FA1BC8827AD4C0F682C03A8B671DCDF6B5C4DE36D44243A684103EF88", "4F46DF03559967AC60F2EB272FEFE3928A7594A45FF774B87A7E540DB0F8F068", "25BA44241B3BD880770BFA4DA21C7180576831855368CBEC6A3154FDE4A7676E", "452F5906C46D46F407883344BFDD90E672B672C5E9943DB4891E3A34FEEEB9DB", "AF8DF7465C338AE64B1E937D6C8DA138C0D63AD5134A68792BBBE1F63356C422", "B6B3EEDC0267AB50491FDC450A398AF30DBCD977CECED8BEF2499CAB5DAC19E2", "955DF3FA5891195A9DAEFA1DDC6BB244B545DDE1BAA84CBB25D5F12A8DA68A0C", "B4E4F5D2D6FB84DF7399960A732309C9FD530EAE5941838160042833625A6076" ], "Flags": 0, "Majorities": [ { "Majority": { "Amendment": "B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856", "CloseTime": 717780510 } } ] }, "LedgerEntryType": "Amendments", "LedgerIndex": "7DB0788C020F02780A673DC74757F23823FA3014C1866E72CC4CD8B226CD6EF4", "PreviousFields": {} } } ], "TransactionIndex": 5, "TransactionResult": "tesSUCCESS" }, "hash": "042AA148D6FF73BB255B381E222CA3EFDC83A51B84C4DDD81B1CB3863C25B34D", "ledger_index": 74724097, "date": "2022-09-29T15:28:31Z" } ================================================ FILE: src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/EnableAmendmentWithMinority.json ================================================ { "tx": { "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp", "Amendment": "B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856", "Fee": "0", "Flags": 131072, "LedgerSequence": 74119937, "Sequence": 0, "SigningPubKey": "", "TransactionType": "EnableAmendment", "date": "2022-09-02T15:02:22Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Amendments": [ "42426C4D4F1009EE67080A9B7965B44656D7714D104A72F9B4369F97ABF044EE", "4C97EBA926031A7CF7D7B36FDE3ED66DDA5421192D63DE53FFB46E43B9DC8373", "6781F8368C4771B83E8B821D88F580202BCB4228075297B19E4FDC5233F1EFDC", "740352F2412A9909880C23A559FCECEDA3BE2126FED62FC7660D628A06927F11", "1562511F573A19AE9BD103B5D6B9E01B3B46805AEC5D3C4805C902B514399146", "532651B4FD58DF8922A49BA101AB3E996E5BFBF95A913B3E392504863E63B164", "08DE7D96082187F6E6578530258C77FAABABE4C20474BDB82F04B021F1A68647", "E2E6F2866106419B88C50045ACE96368558C345566AC8F2BDF5A5B5587F0E6FA", "07D43DCE529B15A10827E5E04943B496762F9A88E3268269D69C44BE49E21104", "42EEA5E28A97824821D4EF97081FE36A54E9593C6E4F20CBAE098C69D2E072DC", "DC9CA96AEA1DCF83E527D1AFC916EFAF5D27388ECA4060A88817C1238CAEE0BF", "1D3463A5891F9E589C5AE839FFAC4A917CE96197098A1EF22304E1BC5B98A454", "6C92211186613F9647A89DFFBAB8F94C99D4C7E956D495270789128569177DA1", "CC5ABAE4F3EC92E94A59B1908C2BE82D2228B6485C00AFF8F22DF930D89C194E", "B9E739B8296B4A1BB29BE990B17D66E21B62A300A909F25AC55C22D6C72E1F9D", "B4D44CC3111ADD964E846FC57760C8B50FFCD5A82C86A72756F6B058DDDF96AD", "67A34F2CF55BFC0F93AACD5B281413176FEE195269FA6D95219A2DF738671172", "F64E1EABBE79D55B3BB82020516CEC2C582A98A6BFE20FBE9BB6A0D233418064", "7117E2EC2DBF119CA55181D69819F1999ECEE1A0225A7FD2B9ED47940968479C", "58BE9B5968C4DA7C59BA900961828B113E5490699B21877DEF9A31E9D0FE5D5F", "CA7C02118BA27599528543DFE77BA6838D1B0F43B447D4D7F53523CE6A0E9AC2", "5D08145F0A4983F23AFFFF514E83FAD355C5ABFBB6CAB76FB5BC8519FF5F33BE", "3CBC5C4E630A1B82380295CDA84B32B49DD066602E74E39B85EF64137FA65194", "FBD513F1B893AC765B78F250E6FFA6A11B573209D1842ADC787C850696741288", "2CD5286D8D687E98B41102BDD797198E81EA41DF7BD104E6561FEB104EFF2561", "586480873651E106F1D6339B0C4A8945BA705A777F3F4524626FF1FC07EFE41D", "C4483A1896170C66C098DEA5B0E024309C60DC960DE5F01CD7AF986AA3D9AD37", "8F81B066ED20DAECA20DF57187767685EEF3980B228E0667A650BAF24426D3B4", "621A0B264970359869E3C0363A899909AAB7A887C8B73519E4ECF952D33258A8", "30CD365592B8EE40489BA01AE2F7555CAC9C983145871DC82A42A31CF5BAE7D9", "157D2D480E006395B76F948E3E07A45A05FE10230D88A7993C71F97AE4B1F2D1", "00C1FC4A53E60AB02C864641002B3172F38677E29C26C5406685179B37E1EDAC", "89308AF3B8B10B7192C4E613E1D2E4D9BA64B2EE2D5232402AE82A6A7220D953", "3012E8230864E95A58C60FD61430D7E1B4D3353195F2981DC12B0C7C0950FFAC", "1F4AFA8FA1BC8827AD4C0F682C03A8B671DCDF6B5C4DE36D44243A684103EF88", "4F46DF03559967AC60F2EB272FEFE3928A7594A45FF774B87A7E540DB0F8F068", "25BA44241B3BD880770BFA4DA21C7180576831855368CBEC6A3154FDE4A7676E", "452F5906C46D46F407883344BFDD90E672B672C5E9943DB4891E3A34FEEEB9DB", "AF8DF7465C338AE64B1E937D6C8DA138C0D63AD5134A68792BBBE1F63356C422", "B6B3EEDC0267AB50491FDC450A398AF30DBCD977CECED8BEF2499CAB5DAC19E2", "955DF3FA5891195A9DAEFA1DDC6BB244B545DDE1BAA84CBB25D5F12A8DA68A0C", "B4E4F5D2D6FB84DF7399960A732309C9FD530EAE5941838160042833625A6076" ], "Flags": 0, "Majorities": [ { "Majority": { "Amendment": "32A122F1352A4C7B3A6D790362CC34749C5E57FCE896377BFDC6CCD14F6CD627", "CloseTime": 715204150 } } ] }, "LedgerEntryType": "Amendments", "LedgerIndex": "7DB0788C020F02780A673DC74757F23823FA3014C1866E72CC4CD8B226CD6EF4", "PreviousFields": { "Majorities": [ { "Majority": { "Amendment": "32A122F1352A4C7B3A6D790362CC34749C5E57FCE896377BFDC6CCD14F6CD627", "CloseTime": 715204150 } }, { "Majority": { "Amendment": "B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856", "CloseTime": 715445160 } } ] } } } ], "TransactionIndex": 7, "TransactionResult": "tesSUCCESS" }, "hash": "D49080BB2626D57D2E1086C51FCFA046E199242C18336EDBA7AD0B8687844104", "ledger_index": 74119937, "date": "2022-09-02T15:02:22Z" } ================================================ FILE: src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/FeatureExpandedSignerList.json ================================================ { "B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856": { "enabled": false, "name": "ExpandedSignerList", "supported": true } } ================================================ FILE: src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/FeatureNegativeUNL.json ================================================ { "B4E4F5D2D6FB84DF7399960A732309C9FD530EAE5941838160042833625A6076": { "enabled": false, "name": "NegativeUNL", "supported": true } } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCancel/Description.tsx ================================================ import { useTranslation, Trans } from 'react-i18next' import type { EscrowCancel } from 'xrpl' import { findNode } from '../../../transactionUtils' import { Account } from '../../Account' import { TransactionDescriptionComponent, TransactionDescriptionProps, } from '../types' import { TRANSACTION_ROUTE } from '../../../../App/routes' import { RouteLink } from '../../../routing' import { formatAmount, isXRP, } from '../../../../../rippled/lib/txSummary/formatAmount' import { Amount } from '../../Amount' const Description: TransactionDescriptionComponent = ( props: TransactionDescriptionProps, ) => { const { t } = useTranslation() const { data } = props const deleted: any = findNode(data.meta, 'DeletedNode', 'Escrow') if (deleted == null) { return null } return ( <>
    {t('escrow_cancellation_desc')}
    The escrowed amount of was returned to {isXRP(deleted.FinalFields.Amount) && data.tx.Owner === data.tx.Account && ( {' '} ( {' '} {t('escrow_after_transaction_cost')}) )}
    The escrow was created by with transaction {`${deleted.FinalFields.PreviousTxnID.substring(0, 6)}...`} ) } export { Description } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCancel/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { TRANSACTION_ROUTE } from '../../../../App/routes' import { RouteLink } from '../../../routing' const Simple: TransactionSimpleComponent = (props: TransactionSimpleProps) => { const { t } = useTranslation() const { data } = props const { owner, sequence, tx, destination, amount, condition } = data.instructions return ( <> {` - ${sequence}`} {condition && ( {condition} )} {amount.amount && ( )} {destination && ( )} {tx && ( {tx} )} ) } export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCancel/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { Sequence } from '../../Sequence' export const TableDetail = (props: any) => { const { t } = useTranslation() const { instructions } = props const { owner, sequence, ticketSequence, isHook } = instructions return (
    {owner && ( <> {t('cancel_escrow')}{' '} -{' '} )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCancel/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { Description } from './Description' import { parser } from './parser' import { TableDetail } from './TableDetail' export const EscrowCancelTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.CANCEL, category: TransactionCategory.PAYMENT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCancel/parser.ts ================================================ import type { EscrowCancel, TransactionMetadata } from 'xrpl' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { findNode } from '../../../transactionUtils' const findNodeFinalFields = (meta: TransactionMetadata) => { const node = findNode(meta, 'DeletedNode', 'Escrow') return node ? node.FinalFields : {} } export function parser(tx: EscrowCancel, meta: TransactionMetadata) { const escrow = findNodeFinalFields(meta) return { sequence: tx.OfferSequence, owner: tx.Owner, tx: escrow.PreviousTxnID, amount: escrow.Amount ? formatAmount(escrow.Amount) : undefined, destination: escrow.Destination && escrow.Destination !== escrow.Account ? escrow.Destination : undefined, condition: escrow.Condition, } } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCancel/test/EscrowCancelDescription.test.tsx ================================================ import { useQuery } from 'react-query' import mockEscrowCancel from './mock_data/EscrowCancel.json' import { Description } from '../Description' import { createDescriptionRenderFactory } from '../../test' import i18n from '../../../../../../i18n/testConfigEnglish' const renderComponent = createDescriptionRenderFactory(Description, i18n) jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) function getTestByName(name: string) { return mockEscrowCancel[name] } describe('EscrowCancelDescription', () => { it('renders description for EscrowCancel', () => { const { container, unmount } = renderComponent( getTestByName('EscrowCancel having XRP escrowed'), ) expect(container.innerHTML).toBe( '
    Cancellation was triggered by
    The escrowed amount of 135.79 XRP was returned to (135.78999 XRP after transaction cost)
    The escrow was created by with transaction A979AD...', ) unmount() }) it('test XRP amount', () => { const { container, unmount } = renderComponent( getTestByName('EscrowCancel having XRP escrowed'), ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( `The escrowed amount of \uE900135.79 XRP was returned to rpmqbo5FWoydTL2Ufh5YdtzmRjbeLyxt56 (\uE900135.78999 XRP after transaction cost)`, ) unmount() }) it('test IOU amount', () => { const { container, unmount } = renderComponent( getTestByName('EscrowCancel having IOU escrowed'), ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( 'The escrowed amount of 1.00 ZZZ.rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8 was returned to rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK', ) unmount() }) it('test MPT amount', () => { const data = { assetScale: 4, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent( getTestByName('EscrowCancel having MPT escrowed'), ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( 'The escrowed amount of 0.0001 0044E49BC9FB70ADC1A604A5792643A38CA5887219C21C8C was returned to r4ipomC348PqM2rGSBmhfRPXUH6CzKS1XJ', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/EscrowCancel/test/EscrowCancelSimple.test.tsx ================================================ import { useQuery } from 'react-query' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockEscrowCancel from './mock_data/EscrowCancel.json' const renderComponent = createSimpleRenderFactory(Simple) jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) function getTestByName(name: string) { return mockEscrowCancel[name] } describe('EscrowCancelSimple', () => { it('renders with an expiration and offer', () => { const { container, unmount } = renderComponent( getTestByName('EscrowCancel having XRP escrowed'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent(`\uE900135.79 XRP`) expect( container.querySelector('[data-testid="escrow-cancel"] .value'), ).toHaveTextContent('rpmqbo5FWoydTL2Ufh5YdtzmRjbeLyxt56 - 9') expect( container.querySelector('[data-testid="escrow-cancel-tx"] .value'), ).toHaveTextContent( `A979AD5C6A6C844913DA51D71BF5F0B8E254D9A211FA837C4B322C4A8FD358E6`, ) unmount() }) it('test XRP amount', () => { const { container, unmount } = renderComponent( getTestByName('EscrowCancel having XRP escrowed'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent(`\uE900135.79 XRP`) unmount() }) it('test IOU amount', () => { const { container, unmount } = renderComponent( getTestByName('EscrowCancel having IOU escrowed'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent('1.00 ZZZ.rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8') unmount() }) it('test MPT amount', () => { const data = { assetScale: 4, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent( getTestByName('EscrowCancel having MPT escrowed'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent( '0.0001 0044E49BC9FB70ADC1A604A5792643A38CA5887219C21C8C', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/EscrowCancel/test/EscrowCancelTableDetail.test.tsx ================================================ import { TableDetail } from '../TableDetail' import mockEscrowCancel from './mock_data/EscrowCancel.json' import { createTableDetailRenderFactory } from '../../test' import i18nTestConfigEnUS from '../../../../../../i18n/testConfigEnglish' const renderComponent = createTableDetailRenderFactory( TableDetail, i18nTestConfigEnUS, ) describe('EscrowCancelTableDetail', () => { it('renders EscrowCancel without crashing', () => { const { container, unmount } = renderComponent( mockEscrowCancel['EscrowCancel having XRP escrowed'], ) expect(container).toHaveTextContent( 'cancel escrow rpmqbo5FWoydTL2Ufh5YdtzmRjbeLyxt56 - 9', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/EscrowCancel/test/mock_data/EscrowCancel.json ================================================ { "EscrowCancel having XRP escrowed": { "hash": "C6A85A5DAC39F60F52372A5992A3760F2E042AD4146C5BB1D332EB7B6671E67D", "ledger_index": 36481307, "date": "2018-02-10T23:45:21+00:00", "tx": { "TransactionType": "EscrowCancel", "Flags": 2147483648, "Sequence": 14, "OfferSequence": 9, "Fee": "10", "SigningPubKey": "03A0452D88684D99C2E64FA9C21D749E496E8BF6E2339A78ED7CE90F009789A868", "TxnSignature": "3045022100A395018AE11415150546340FC4E8A8903E473626540D9804967089617EA6DB49022016F1415F974526F2D09FE5831696D2C964AC3EB68D78360C963AA9DAE7244EF4", "Account": "rpmqbo5FWoydTL2Ufh5YdtzmRjbeLyxt56", "Owner": "rpmqbo5FWoydTL2Ufh5YdtzmRjbeLyxt56" }, "meta": { "TransactionIndex": 21, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 36481294, "PreviousTxnID": "CDA75ED59DBA56E6B699793EBF984C7702D3BB37BBFB4DFE429259FB49830CD1", "LedgerIndex": "585A58602324683ED54FAE51B2DA583979879392B41BB906251FFB8293889974", "PreviousFields": { "Sequence": 14, "OwnerCount": 1, "Balance": "508959870" }, "FinalFields": { "Flags": 0, "Sequence": 15, "OwnerCount": 0, "Balance": "644749860", "Account": "rpmqbo5FWoydTL2Ufh5YdtzmRjbeLyxt56" } } }, { "DeletedNode": { "LedgerEntryType": "Escrow", "LedgerIndex": "CEE1B7E04519FAEC58F4F440EFE714A91DDE7E83A3599B050ED24E84A598BF46", "FinalFields": { "Flags": 0, "PreviousTxnLgrSeq": 36480365, "CancelAfter": 571621204, "FinishAfter": 571620604, "OwnerNode": "0000000000000000", "PreviousTxnID": "A979AD5C6A6C844913DA51D71BF5F0B8E254D9A211FA837C4B322C4A8FD358E6", "Amount": "135790000", "Account": "rpmqbo5FWoydTL2Ufh5YdtzmRjbeLyxt56", "Destination": "rpmqbo5FWoydTL2Ufh5YdtzmRjbeLyxt56" } } }, { "ModifiedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F7DBEAAF43ACF1C656C878489D307A49A31EAF96A41951B00A043D262B4B6717", "FinalFields": { "Flags": 0, "RootIndex": "F7DBEAAF43ACF1C656C878489D307A49A31EAF96A41951B00A043D262B4B6717", "Owner": "rpmqbo5FWoydTL2Ufh5YdtzmRjbeLyxt56" } } } ], "TransactionResult": "tesSUCCESS" } }, "EscrowCancel having IOU escrowed": { "tx": { "Account": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "Fee": "1", "Flags": 0, "LastLedgerSequence": 4469279, "OfferSequence": 4466553, "Owner": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Sequence": 4467163, "SigningPubKey": "EDDB3F5BC950C1DBCEB6C9C10B7E70FB333618F944447F1DFD9C2D5543B81A2BCB", "TransactionType": "EscrowCancel", "TxnSignature": "67B4B46D599184A9801AA81D05BBBF54C281F0633003370335DDB17D4EEFD87E22EFFBB717CB3920752B102D298F4953B76BB37EA3E273938CECE5EB838C4102", "ledger_index": 4469261, "ctid": "C044320D00010002", "date": 805842921 }, "hash": "9D43C605A299C3CECD759D640B36B93E6A7E726D2A56261892BDFD7EF4E7B383", "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "RootIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217", "PreviousTxnID": "CED2D5751FAC5F888686313959A24ABC19BD0D116A0053584FC55B76DBA4A66E", "PreviousTxnLgrSeq": 4469251 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "RootIndex": "1F882E04D2F24B427C89A1B79A2C26C94A3387CF60228C86E9C027D05FFED1FF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1F882E04D2F24B427C89A1B79A2C26C94A3387CF60228C86E9C027D05FFED1FF", "PreviousTxnID": "CED2D5751FAC5F888686313959A24ABC19BD0D116A0053584FC55B76DBA4A66E", "PreviousTxnLgrSeq": 4469251 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8", "RootIndex": "783570F9840AABAE60F077CA184FA9686DAADC12BF3270514C1931CBC0DC8452" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "783570F9840AABAE60F077CA184FA9686DAADC12BF3270514C1931CBC0DC8452", "PreviousTxnID": "CED2D5751FAC5F888686313959A24ABC19BD0D116A0053584FC55B76DBA4A66E", "PreviousTxnLgrSeq": 4469251 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "Balance": "99999996", "Flags": 0, "OwnerCount": 3, "Sequence": 4467164 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B9E2BAE404EEADECEE678349CD2639831A6766AE15616F570F5B345868422912", "PreviousFields": { "Balance": "99999997", "Sequence": 4467163 }, "PreviousTxnID": "CED2D5751FAC5F888686313959A24ABC19BD0D116A0053584FC55B76DBA4A66E", "PreviousTxnLgrSeq": 4469251 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Balance": "99999905", "Flags": 0, "OwnerCount": 13, "Sequence": 4466554 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1F036A2B38438CE1D39AC1ED3682CE46703352616B6EA8853F4FB25F4684313", "PreviousFields": { "OwnerCount": 14 }, "PreviousTxnID": "CED2D5751FAC5F888686313959A24ABC19BD0D116A0053584FC55B76DBA4A66E", "PreviousTxnLgrSeq": 4469251 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "ZZZ", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-199" }, "Flags": 131072, "HighLimit": { "currency": "ZZZ", "issuer": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "value": "10000" }, "HighNode": "0", "LowLimit": { "currency": "ZZZ", "issuer": "rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E7B74BC26326DB0B953AB9460915820DFE99A33C3585C4988030627F68BB5A54", "PreviousFields": { "Balance": { "currency": "ZZZ", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-198" } }, "PreviousTxnID": "CED2D5751FAC5F888686313959A24ABC19BD0D116A0053584FC55B76DBA4A66E", "PreviousTxnLgrSeq": 4469251 } }, { "DeletedNode": { "FinalFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Amount": { "currency": "ZZZ", "issuer": "rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8", "value": "1" }, "CancelAfter": 805842907, "Destination": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "DestinationNode": "0", "FinishAfter": 805842897, "Flags": 0, "IssuerNode": "0", "OwnerNode": "0", "PreviousTxnID": "CED2D5751FAC5F888686313959A24ABC19BD0D116A0053584FC55B76DBA4A66E", "PreviousTxnLgrSeq": 4469251 }, "LedgerEntryType": "Escrow", "LedgerIndex": "EF540EC5CBCDF5CB3929C96CC540FC5856EF07AB9AF98F6C9BEBB30F0262D75F" } } ], "TransactionIndex": 1, "TransactionResult": "tesSUCCESS" } }, "EscrowCancel having MPT escrowed": { "tx": { "Account": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "Fee": "1", "Flags": 0, "LastLedgerSequence": 4658119, "OfferSequence": 4571215, "Owner": "r4ipomC348PqM2rGSBmhfRPXUH6CzKS1XJ", "Sequence": 4467171, "SigningPubKey": "EDDB3F5BC950C1DBCEB6C9C10B7E70FB333618F944447F1DFD9C2D5543B81A2BCB", "TransactionType": "EscrowCancel", "TxnSignature": "C975905200023AD738F36AD22E8E40F51F7F3FDD53CE51E329F75115944870FD7FA600447F81705CB654EFDB0E4C307CDCA91AF2EADC261196892D089BF7C401", "ledger_index": 4658101, "ctid": "C04713B500000002", "date": 806433870 }, "hash": "2000465DF9C919F6459948BE857B0391467B110F10AAD9663BBCE91F6BE63E9A", "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "RootIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217", "PreviousTxnID": "6DB0332DF41321922F831129DA8EF753684D3140638A79A5621A44701D4742D4", "PreviousTxnLgrSeq": 4658091 } }, { "DeletedNode": { "FinalFields": { "Account": "r4ipomC348PqM2rGSBmhfRPXUH6CzKS1XJ", "Amount": { "mpt_issuance_id": "0044E49BC9FB70ADC1A604A5792643A38CA5887219C21C8C", "value": "1" }, "CancelAfter": 806433853, "Destination": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "DestinationNode": "0", "FinishAfter": 806433843, "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "6DB0332DF41321922F831129DA8EF753684D3140638A79A5621A44701D4742D4", "PreviousTxnLgrSeq": 4658091 }, "LedgerEntryType": "Escrow", "LedgerIndex": "136AB4073D6E889AE556BEA67731648EAB724C16549B6BA83398D3B9C3159950" } }, { "ModifiedNode": { "FinalFields": { "Account": "r4ipomC348PqM2rGSBmhfRPXUH6CzKS1XJ", "Flags": 0, "MPTAmount": "100", "MPTokenIssuanceID": "0044E49BC9FB70ADC1A604A5792643A38CA5887219C21C8C", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "69C278A3CE041CF57612AC9098DA8317CB8C2B62F50392C82F376F5A33A25C4F", "PreviousFields": { "LockedAmount": "1", "MPTAmount": "99" }, "PreviousTxnID": "6DB0332DF41321922F831129DA8EF753684D3140638A79A5621A44701D4742D4", "PreviousTxnLgrSeq": 4658091 } }, { "ModifiedNode": { "FinalFields": { "Flags": 40, "Issuer": "rKQzpv6jvPeRSULjdwWZgiCZEUNpkSXzYH", "MaximumAmount": "50000000", "OutstandingAmount": "100", "OwnerNode": "0", "Sequence": 4514971 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "7EFCE3347922F755E953AC92B765F12B817A397EBC536854FB88298F219840E9", "PreviousFields": { "LockedAmount": "1" }, "PreviousTxnID": "6DB0332DF41321922F831129DA8EF753684D3140638A79A5621A44701D4742D4", "PreviousTxnLgrSeq": 4658091 } }, { "ModifiedNode": { "FinalFields": { "Account": "r4ipomC348PqM2rGSBmhfRPXUH6CzKS1XJ", "Balance": "99999993", "Flags": 0, "OwnerCount": 6, "Sequence": 4571216 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9A94AD7404B4ABD0492C51225B67A6F1F75BF34B0A050EF7305A169D6BD30A15", "PreviousFields": { "OwnerCount": 7 }, "PreviousTxnID": "6DB0332DF41321922F831129DA8EF753684D3140638A79A5621A44701D4742D4", "PreviousTxnLgrSeq": 4658091 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r4ipomC348PqM2rGSBmhfRPXUH6CzKS1XJ", "RootIndex": "A3BB6ADAAF6BFFE8D5B2F4EF091E665956B8503FE93CF0123A9EE78A332A3B03" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A3BB6ADAAF6BFFE8D5B2F4EF091E665956B8503FE93CF0123A9EE78A332A3B03", "PreviousTxnID": "6DB0332DF41321922F831129DA8EF753684D3140638A79A5621A44701D4742D4", "PreviousTxnLgrSeq": 4658091 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "Balance": "99999988", "Flags": 0, "OwnerCount": 7, "Sequence": 4467172 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B9E2BAE404EEADECEE678349CD2639831A6766AE15616F570F5B345868422912", "PreviousFields": { "Balance": "99999989", "Sequence": 4467171 }, "PreviousTxnID": "6DB0332DF41321922F831129DA8EF753684D3140638A79A5621A44701D4742D4", "PreviousTxnLgrSeq": 4658091 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true, "ledger_index": 4658101, "ledger_hash": "DCE739424F1DF8313DBFFAA80EE521F8487961F7CF886B46713B35BBF7DC7155", "close_time_iso": "2025-07-21T17:24:30Z", "ctid": "C04713B500000002" } } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCreate/Description.tsx ================================================ import { useTranslation, Trans } from 'react-i18next' import type { EscrowCreate } from 'xrpl' import { DATE_OPTIONS } from '../../../transactionUtils' import { Account } from '../../Account' import { localizeDate } from '../../../utils' import { TransactionDescriptionComponent, TransactionDescriptionProps, } from '../types' import { convertRippleDate } from '../../../../../rippled/lib/convertRippleDate' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' const Description: TransactionDescriptionComponent = ( props: TransactionDescriptionProps, ) => { const { t, i18n } = useTranslation() const language = i18n.resolvedLanguage const { data } = props const formatDate = (time: number) => `${localizeDate(convertRippleDate(time), language, DATE_OPTIONS)} ${ DATE_OPTIONS.timeZone }` return ( <> {data.tx.Destination !== data.tx.Account ? ( The escrow is from to ) : ( the escrow was created by and the funds will be returned to the same account )} {data.tx.Condition && (
    {t('escrow_condition')} {data.tx.Condition}
    )}
    {t('escrowed_amount')} {' '}
    {data.tx.CancelAfter && (
    {t('describe_cancel_after')} {formatDate(data.tx.CancelAfter)}
    )} {data.tx.FinishAfter && (
    {t('describe_finish_after')} {formatDate(data.tx.FinishAfter)}
    )} ) } export { Description } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCreate/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { useLanguage } from '../../../hooks' import { localizeDate } from '../../../utils' import { DATE_OPTIONS } from '../../../transactionUtils' const Simple: TransactionSimpleComponent = (props: TransactionSimpleProps) => { const { t } = useTranslation() const language = useLanguage() const { data } = props const { amount, destination, condition, finishAfter, cancelAfter, finishFunction, escrowData, } = data.instructions const caDate = cancelAfter ? localizeDate(new Date(cancelAfter), language, DATE_OPTIONS) : null const faDate = finishAfter ? localizeDate(new Date(finishAfter), language, DATE_OPTIONS) : null return ( <> {destination && ( )} {condition && ( {condition} )} {cancelAfter && ( {caDate} {DATE_OPTIONS.timeZone} )} {finishAfter && ( {faDate} {DATE_OPTIONS.timeZone} )} {finishFunction && ( {finishFunction} )} {escrowData && ( {escrowData} )} ) } export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCreate/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import { localizeDate } from '../../../utils' import { DATE_OPTIONS } from '../../../transactionUtils' import { useLanguage } from '../../../hooks' export const TableDetail = (props: any) => { const { t } = useTranslation() const { instructions } = props const language = useLanguage() const { amount, destination, finishAfter, cancelAfter, condition } = instructions return (
    {amount && (
    {t('amount')}
    )} {destination && (
    {t('destination')} {' '} {destination}{' '}
    )} {condition && (
    {t('condition')} {' '} {condition}{' '}
    )} {finishAfter && (
    {t('finish_after')} {localizeDate(new Date(finishAfter), language, DATE_OPTIONS)} UTC
    )} {cancelAfter && (
    {t('cancel_after')} {localizeDate(new Date(cancelAfter), language, DATE_OPTIONS)} UTC
    )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCreate/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { Description } from './Description' import { parser } from './parser' import { TableDetail } from './TableDetail' export const EscrowCreateTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.CREATE, category: TransactionCategory.PAYMENT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCreate/parser.ts ================================================ import type { EscrowCreate } from 'xrpl' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { convertRippleDate } from '../../../../../rippled/lib/convertRippleDate' export function parser(tx: EscrowCreate) { return { amount: formatAmount(tx.Amount), destination: tx.Destination !== tx.Account ? tx.Destination : undefined, condition: tx.Condition, cancelAfter: tx.CancelAfter ? convertRippleDate(tx.CancelAfter) : undefined, finishAfter: tx.FinishAfter ? convertRippleDate(tx.FinishAfter) : undefined, finishFunction: tx.FinishFunction, escrowData: tx.Data, } } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCreate/test/EscrowCreateDescription.test.tsx ================================================ import { useQuery } from 'react-query' import i18n from '../../../../../../i18n/testConfigEnglish' import mockEscrowCreateTests from './mock_data/EscrowCreate.json' import { Description } from '../Description' import { createDescriptionRenderFactory } from '../../test' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const renderComponent = createDescriptionRenderFactory(Description, i18n) function getTestByName(name: string) { return mockEscrowCreateTests[name] } describe('EscrowCreateDescription', () => { it('renders description for EscrowCreate', () => { const { container, unmount } = renderComponent( getTestByName('renders EscrowCreate'), ) expect(container.innerHTML).toBe( 'The escrow is from to
    The escrow has a fulfillment condition of A0258020886F982742772F414243855DC13B348FC78FB3D5119412C8A6480114E36A4451810120
    It escrowed 997.50 XRP
    It can be cancelled after March 1, 2020 at 8:54:20 AM UTC
    It can be finished after March 1, 2020 at 9:01:00 AM UTC
    ', ) unmount() }) it('test XRP amount', () => { const { container, unmount } = renderComponent( getTestByName('renders EscrowCreate'), ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent(`It escrowed \uE900997.50 XRP`) unmount() }) it('test IOU amount', () => { const { container, unmount } = renderComponent( getTestByName('test IOU amount'), ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( `It escrowed 1.00 ZZZ.rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8`, ) unmount() }) it('test MPT amount', () => { const data = { assetScale: 4, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent( getTestByName('test MPT amount'), ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( `It escrowed 0.0001 0044E48FC9FB70ADC1A604A5792643A38CA5887219C21C8C`, ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/EscrowCreate/test/EscrowCreateSimple.test.tsx ================================================ import { useQuery } from 'react-query' import { Simple } from '../Simple' import mockEscrowCreateTests from './mock_data/EscrowCreate.json' import mockEscrowCreateFinishFunction from './mock_data/EscrowCreateFinishFunction.json' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const renderComponent = createSimpleRenderFactory(Simple) function getTestByName(name: string) { return mockEscrowCreateTests[name] } describe('EscrowCreateSimple', () => { it('renders with an expiration and offer', () => { const { container, unmount } = renderComponent( getTestByName('renders EscrowCreate'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent('\uE900997.50 XRP') expect( container.querySelector('[data-testid="escrow-destination"] .value'), ).toHaveTextContent('rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi7q') expect( container.querySelector('[data-testid="escrow-condition"] .value'), ).toHaveTextContent( 'A0258020886F982742772F414243855DC13B348FC78FB3D5119412C8A6480114E36A4451810120', ) unmount() }) it('renders with a smart escrow', () => { const { container, unmount } = renderComponent( mockEscrowCreateFinishFunction, ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent('\uE9000.10 XRP') expect( container.querySelector('[data-testid="escrow-destination"] .value'), ).toHaveTextContent('rQE6iDVinSGsk9jdGS8rbwHste1VkhyCo6') expect( container.querySelector('[data-testid="escrow-finish-function"] .value'), ).toHaveTextContent( '0061736D0100000001690F60037F7F7F017F60027F7F017F60017F0060027F7F0060057F7F7F7F' + '7F017F6000017F60037E7F7F017F60057F7F7F7F7F0060037F7F7F0060067F7F7F7F7F7F017F' + '600B7F7F7F7F7F7F7F7F7F7F7F017F60017F017F60047F7F7F7F0060000060057F7E7E7E7E00' + '028C010508686F73745F6C6962057072696E74000308686F73745F6C69620A67657454784669' + '656C64000108686F73745F6C69621A67657443757272656E744C6564676572456E7472794669' + '656C64000108686F73745F6C6962136765744C6564676572456E7472794669656C6400040868' + '6F73745F6C696213676574506172656E744C656467657254696D650005035453020', ) expect( container.querySelector('[data-testid="escrow-data"] .value'), ).toHaveTextContent('70000000') unmount() }) it('test XRP amount', () => { const { container, unmount } = renderComponent( getTestByName('renders EscrowCreate'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent(`\uE900997.50 XRP`) unmount() }) it('test IOU amount', () => { const { container, unmount } = renderComponent( getTestByName('test IOU amount'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent('1.00 ZZZ.rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8') unmount() }) it('test MPT amount', () => { const data = { assetScale: 4, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent( getTestByName('test MPT amount'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent( '0.0001 0044E48FC9FB70ADC1A604A5792643A38CA5887219C21C8C', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/EscrowCreate/test/EscrowCreateTableDetail.test.tsx ================================================ import { useQuery } from 'react-query' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import i18n from '../../../../../../i18n/testConfigEnglish' import mockEscrowCreate from './mock_data/EscrowCreate.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) function getTestByName(name: string) { return mockEscrowCreate[name] } describe('EscrowCreateTableDetail', () => { it('renders EscrowCreate without crashing', () => { const { container, unmount } = renderComponent( getTestByName('renders EscrowCreate'), ) expect( container.querySelector('[data-testid="account"]'), ).toHaveTextContent('rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi7q') expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( `997.50 XRP`, ) expect( container.querySelector('[data-testid="condition"]'), ).toHaveTextContent( 'A0258020886F982742772F414243855DC13B348FC78FB3D5119412C8A6480114E36A4451810120', ) expect( container.querySelector('[data-testid="finish_after"]'), ).toHaveTextContent(`March 1, 2020 at 9:01:00 AM UTC`) expect( container.querySelector('[data-testid="cancel_after"]'), ).toHaveTextContent(`March 1, 2020 at 8:54:20 AM UTC`) unmount() }) it('test XRP amount', () => { const { container, unmount } = renderComponent( getTestByName('renders EscrowCreate'), ) expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( `\uE900997.50 XRP`, ) unmount() }) it('test IOU amount', () => { const { container, unmount } = renderComponent( getTestByName('test IOU amount'), ) expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( `1.00 ZZZ.rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8`, ) unmount() }) it('test MPT amount', () => { const data = { assetScale: 4, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent( getTestByName('test MPT amount'), ) expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( `0.0001 0044E48FC9FB70ADC1A604A5792643A38CA5887219C21C8C`, ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/EscrowCreate/test/mock_data/EscrowCreate.json ================================================ { "renders EscrowCreate": { "hash": "27D43BD746193512ABD670DBE9C646F341BDCEDB0741CF862F64190E2851CAD1", "ledger_index": 37471281, "date": "2018-03-25T04:10:21+00:00", "tx": { "TransactionType": "EscrowCreate", "Flags": 2147483648, "Sequence": 104, "FinishAfter": 636368460, "CancelAfter": 636368060, "Amount": "997500000", "Fee": "10", "SigningPubKey": "02D4BAE5988733A2BEA96021337CA85F0056D9AA47BCF0E16E0E527A0A28DB100D", "TxnSignature": "30440220286F11B955EF4CA3A033503DC2C8E42F259A6A3A196E362453EFBB04F8ABF62902204998A8A74EDB142456E673345AB7ABB7A36506D6C8E5694B5D707108991C32C4", "Condition": "A0258020886F982742772F414243855DC13B348FC78FB3D5119412C8A6480114E36A4451810120", "Account": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi8q", "Destination": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi7q", "Memos": [ { "Memo": { "MemoType": "687474703A2F2F6578616D706C652E636F6D2F6D656D6F2F67656E65726963", "MemoData": "" } } ] }, "meta": { "TransactionIndex": 7, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "190D286E5687F825EA226482C56EB967011B258AB1F5B8F5028534E5030CA6B8", "FinalFields": { "Flags": 0, "RootIndex": "190D286E5687F825EA226482C56EB967011B258AB1F5B8F5028534E5030CA6B8", "Owner": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi8q" } } }, { "CreatedNode": { "LedgerEntryType": "Escrow", "LedgerIndex": "949D6E2DC8878166D6043348067D4672340C9710E950286E89D8385081B64C72", "NewFields": { "FinishAfter": 636368460, "Amount": "997500000", "Condition": "A0258020886F982742772F414243855DC13B348FC78FB3D5119412C8A6480114E36A4451810120", "Account": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi8q", "Destination": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi8q" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37471281, "PreviousTxnID": "81D8CE5B4489301E2906632250D05B429F1849CC69F14F205C23C0E142C12B33", "LedgerIndex": "BEAB548BF4AA0ED98E8DD381D566A56C35C20B49A4E9B1A10A7F334B0B50CB4C", "PreviousFields": { "Sequence": 104, "OwnerCount": 25, "Balance": "8132542897" }, "FinalFields": { "Flags": 0, "Sequence": 105, "OwnerCount": 26, "Balance": "7135042887", "Account": "rLbgNAngLq3HABBXK4uPGCHrqeZwgaYi8q" } } } ], "TransactionResult": "tesSUCCESS" } }, "test IOU amount": { "close_time_iso": "2025-07-14T21:14:51Z", "ctid": "C044320300000002", "hash": "CED2D5751FAC5F888686313959A24ABC19BD0D116A0053584FC55B76DBA4A66E", "ledger_hash": "76CDF005DBC80DDF35BA9549694A57B777091E0425740F7CA70BBD2267F2BF59", "ledger_index": 4469251, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "RootIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217", "PreviousTxnID": "5D39379E6FD59BB84FA908AFC032271894E25FC65DBAE465B05A5EECA65B01FC", "PreviousTxnLgrSeq": 4469174 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "RootIndex": "1F882E04D2F24B427C89A1B79A2C26C94A3387CF60228C86E9C027D05FFED1FF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1F882E04D2F24B427C89A1B79A2C26C94A3387CF60228C86E9C027D05FFED1FF", "PreviousTxnID": "5D39379E6FD59BB84FA908AFC032271894E25FC65DBAE465B05A5EECA65B01FC", "PreviousTxnLgrSeq": 4469174 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8", "RootIndex": "783570F9840AABAE60F077CA184FA9686DAADC12BF3270514C1931CBC0DC8452" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "783570F9840AABAE60F077CA184FA9686DAADC12BF3270514C1931CBC0DC8452", "PreviousTxnID": "5D39379E6FD59BB84FA908AFC032271894E25FC65DBAE465B05A5EECA65B01FC", "PreviousTxnLgrSeq": 4469174 } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "B9E2BAE404EEADECEE678349CD2639831A6766AE15616F570F5B345868422912", "PreviousTxnID": "CDA69D793C0758BFEF64BA4FF8FBECE6890F43BFCDBC869755A13EA410CC03BE", "PreviousTxnLgrSeq": 4469245 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Balance": "99999905", "Flags": 0, "OwnerCount": 14, "Sequence": 4466554 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1F036A2B38438CE1D39AC1ED3682CE46703352616B6EA8853F4FB25F4684313", "PreviousFields": { "Balance": "99999906", "OwnerCount": 13, "Sequence": 4466553 }, "PreviousTxnID": "7C99CE7343CECA17BF96914DCECD58F9BD916081D63FEAEA5DD6C517AE86DD07", "PreviousTxnLgrSeq": 4469243 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "ZZZ", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-198" }, "Flags": 131072, "HighLimit": { "currency": "ZZZ", "issuer": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "value": "10000" }, "HighNode": "0", "LowLimit": { "currency": "ZZZ", "issuer": "rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E7B74BC26326DB0B953AB9460915820DFE99A33C3585C4988030627F68BB5A54", "PreviousFields": { "Balance": { "currency": "ZZZ", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-199" } }, "PreviousTxnID": "93F7DC25ACA9D028291507893D6F36A428655887C2EAF8FA154DA1B198DB9128", "PreviousTxnLgrSeq": 4469247 } }, { "CreatedNode": { "LedgerEntryType": "Escrow", "LedgerIndex": "EF540EC5CBCDF5CB3929C96CC540FC5856EF07AB9AF98F6C9BEBB30F0262D75F", "NewFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Amount": { "currency": "ZZZ", "issuer": "rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8", "value": "1" }, "CancelAfter": 805842907, "Destination": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "FinishAfter": 805842897 } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Amount": { "currency": "ZZZ", "issuer": "rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8", "value": "1" }, "CancelAfter": 805842907, "Destination": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "Fee": "1", "FinishAfter": 805842897, "Flags": 0, "LastLedgerSequence": 4469269, "Sequence": 4466553, "SigningPubKey": "EDD4401CFFB6285C91655EBA715A65E8F21FA2685A682E8345AF01ED01705C3583", "TransactionType": "EscrowCreate", "TxnSignature": "137DCE6F5ABE9F5E1956484D0BC02354ECC41FCEDB43F390ABD23CA9CF3034E6C0D312EBDF87F7B62E38093AAFAF55ADBF4E9683E979C77920BA256A3CDDE90B", "date": 805842891, "ledger_index": 4469251 }, "validated": true }, "test MPT amount": { "close_time_iso": "2025-07-16T21:07:42Z", "ctid": "C045077300000002", "hash": "04D33C94957033B41CBB5702C0AFC02CB9063C000FA3FB7C67E8D2AB611CEF03", "ledger_hash": "95163894C7E7732E4C0C82124880011F5734FBEA337AB6A0EA42B521A9C7CDB0", "ledger_index": 4523891, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "RootIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217", "PreviousTxnID": "486A66108E91006A5E77041F23B8CC5B258320C331B9765FAD73FB2E028BD420", "PreviousTxnLgrSeq": 4523885 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "RootIndex": "1F882E04D2F24B427C89A1B79A2C26C94A3387CF60228C86E9C027D05FFED1FF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1F882E04D2F24B427C89A1B79A2C26C94A3387CF60228C86E9C027D05FFED1FF", "PreviousTxnID": "B15A7FF9F2EBCAA82078C74A4E8A16ED6DF87D82A7402DE2D4DD087483AF0FC6", "PreviousTxnLgrSeq": 4523887 } }, { "ModifiedNode": { "FinalFields": { "Flags": 40, "Issuer": "rKQzpv6jvPeRSULjdwWZgiCZEUNpkSXzYH", "LockedAmount": "1", "MPTokenMetadata": "10", "MaximumAmount": "50000000", "OutstandingAmount": "100", "OwnerNode": "0", "Sequence": 4514959 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "3D1E11A0C2587D89DE8D0A50B07EBA322A92E9C57066179F2D90109274B57A26", "PreviousFields": {}, "PreviousTxnID": "ECFAA72120219C414B53B6C3D71122CEB21FAF9A711F07346E0CC02F1F090E21", "PreviousTxnLgrSeq": 4523889 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Flags": 0, "LockedAmount": "1", "MPTAmount": "99", "MPTokenIssuanceID": "0044E48FC9FB70ADC1A604A5792643A38CA5887219C21C8C", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "535B9B6237899D37F4613B41F1B633F4B2453801A768E273DE205DBA434F094F", "PreviousFields": { "MPTAmount": "100" }, "PreviousTxnID": "ECFAA72120219C414B53B6C3D71122CEB21FAF9A711F07346E0CC02F1F090E21", "PreviousTxnLgrSeq": 4523889 } }, { "CreatedNode": { "LedgerEntryType": "Escrow", "LedgerIndex": "A4DFBF50AC21A42B279CCCD2902E2DF0FCA52B4D150C73C0D9681C6309D0A5C7", "NewFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Amount": { "mpt_issuance_id": "0044E48FC9FB70ADC1A604A5792643A38CA5887219C21C8C", "value": "1" }, "CancelAfter": 806015458, "Destination": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "FinishAfter": 806015268 } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "B9E2BAE404EEADECEE678349CD2639831A6766AE15616F570F5B345868422912", "PreviousTxnID": "D1342EFC262311A2A12386783DFDC33CD09D82B2BCE82BD9A20C0F6EA3D964A4", "PreviousTxnLgrSeq": 4523874 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Balance": "99999892", "Flags": 0, "OwnerCount": 21, "Sequence": 4466567 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1F036A2B38438CE1D39AC1ED3682CE46703352616B6EA8853F4FB25F4684313", "PreviousFields": { "Balance": "99999893", "OwnerCount": 20, "Sequence": 4466566 }, "PreviousTxnID": "B15A7FF9F2EBCAA82078C74A4E8A16ED6DF87D82A7402DE2D4DD087483AF0FC6", "PreviousTxnLgrSeq": 4523887 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Amount": { "mpt_issuance_id": "0044E48FC9FB70ADC1A604A5792643A38CA5887219C21C8C", "value": "1" }, "CancelAfter": 806015458, "Destination": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "Fee": "1", "FinishAfter": 806015268, "Flags": 0, "LastLedgerSequence": 4523909, "Sequence": 4466566, "SigningPubKey": "EDD4401CFFB6285C91655EBA715A65E8F21FA2685A682E8345AF01ED01705C3583", "TransactionType": "EscrowCreate", "TxnSignature": "7716E1514AC4E77636ED6E87D7D0B7A60BAC480E5C5028E84910B0EB851DC2D14A6A56BDC8CEE3EB0FD51F6AB6B981A8022D6A28B633120345E40A92D75C5F0C", "date": 806015262, "ledger_index": 4523891 }, "validated": true } } ================================================ FILE: src/containers/shared/components/Transaction/EscrowCreate/test/mock_data/EscrowCreateFinishFunction.json ================================================ { "ctid": "C003B7CD000007D2", "date": 796841422, "hash": "D731AD7AEA61C7FF117D3ED31E73ACB1C60D05E75B0161A005C752BD055726CA", "inLedger": 243661, "ledger_index": 243661, "tx": { "Account": "rnP1xXwRYNxuxfMsyzQuJEjP35AXaV1zF6", "Amount": "100000", "CancelAfter": 796841620, "Data": "70000000", "Destination": "rQE6iDVinSGsk9jdGS8rbwHste1VkhyCo6", "Fee": "10000", "FinishAfter": 796841425, "FinishFunction": "0061736D0100000001690F60037F7F7F017F60027F7F017F60017F0060027F7F0060057F7F7F7F7F017F6000017F60037E7F7F017F60057F7F7F7F7F0060037F7F7F0060067F7F7F7F7F7F017F600B7F7F7F7F7F7F7F7F7F7F7F017F60017F017F60047F7F7F7F0060000060057F7E7E7E7E00028C010508686F73745F6C6962057072696E74000308686F73745F6C69620A67657454784669656C64000108686F73745F6C69621A67657443757272656E744C6564676572456E7472794669656C64000108686F73745F6C6962136765744C6564676572456E7472794669656C64000408686F73745F6C696213676574506172656E744C656467657254696D650005035453020", "Flags": 0, "LastLedgerSequence": 243679, "NetworkID": 2002, "Sequence": 243658, "SigningPubKey": "EDE6EDD0A1F68D38583C68CED6B7728C68D4FCE797EE4F57A92F9D8E5FB7CA4958", "TransactionType": "EscrowCreate", "TxnSignature": "84BE469EECD88CB6D6E407ADDAF6A46AE8E805461C22F87AD3159EBECD216EDEA5EBB18AB6AC1EE7FA015725D6A12A25E90C2C0A09A7A36E9A815C1353281209" }, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "Escrow", "LedgerIndex": "26CD872C3DD427B2046125E7827D1ED061B087E2DBAA1F7397B4AB42B7934037", "NewFields": { "Account": "rnP1xXwRYNxuxfMsyzQuJEjP35AXaV1zF6", "Amount": "100000", "CancelAfter": 796841620, "Data": "70000000", "Destination": "rQE6iDVinSGsk9jdGS8rbwHste1VkhyCo6", "FinishAfter": 796841425, "FinishFunction": "0061736D0100000001690F60037F7F7F017F60027F7F017F60017F0060027F7F0060057F7F7F7F7F017F6000017F60037E7F7F017F60057F7F7F7F7F0060037F7F7F0060067F7F7F7F7F7F017F600B7F7F7F7F7F7F7F7F7F7F7F017F60017F017F60047F7F7F7F0060000060057F7E7E7E7E00028C010508686F73745F6C6962057072696E74000308686F73745F6C69620A67657454784669656C64000108686F73745F6C69621A67657443757272656E744C6564676572456E7472794669656C64000108686F73745F6C6962136765744C6564676572456E7472794669656C64000408686F73745F6C696213676574506172656E744C656467657254696D650005035453020603070101080901010A01000202010102080008000B0C0301010101040508020303030D03010204030008010101010D040001010801010B02030D0D0203010101020D0C0C0001010D030302020C0300000E0405017001212105030100110619037F01418080C0000B7F0041DCA2C0000B7F0041E0A2C0000B074506066D656D6F72790200057265616479002308616C6C6F63617465003D0A6465616C6C6F63617465003F0A5F5F646174615F656E6403010B5F5F686561705F6261736503020926010041010B2031322B0E091F0D2133343C453B464F54121815101420131E37383944474B4C4D0AE1CA0153DE0101027F23808080800041C0006B220124808080800020014100360214200142808080801037020C200141033A003820014120360228200141003602342001418080C08000360230200141003602202001410036021820012001410C6A36022C024020002000411F7522027320026BAD2000417F73411F76200141186A1086808080000D00200128020C210020012802102202200128021410808080800002402000450D00200220001087808080000B200141C0006A2480808080000F0B41A880C0800041372001413F6A419880C0800041AC81C08000108880808000000BEC0203027F017E037F23808080800041306B2203248080808000412721040240024020004290CE005A0D00200021050C010B412721040340200341096A20046A2206417C6A20004290CE0080220542F0B1037E20007CA7220741FFFF037141E4006E2208410174419A85C080006A2F00003B00002006417E6A2008419C7F6C20076A41FFFF0371410174419A85C080006A2F00003B00002004417C6A2104200042FFC1D72F5621062005210020060D000B0B02400240200542E300560D002005A721060C010B200341096A2004417E6A22046A2005A7220741FFFF037141E4006E2206419C7F6C20076A41FFFF0371410174419A85C080006A2F00003B00000B024002402006410A490D00200341096A2004417E6A22046A2006410174419A85C080006A2F00003B00000C010B200341096A2004417F6A22046A20064130723A00000B2002200141014100200341096A20046A412720046B108C808080002104200341306A24808080800020040B6C01027F024002402000417C6A2802002202417871220341044108200241037122021B20016A490D0002402002450D002003200141276A4B0D020B200010A5808080000F0B41818EC0800041B08EC0800010A680808000000B41C08EC0800041F08EC0800010A680808000000B8F0101017F23808080800041C0006B22052480808080002005200136020C2005200036020820052003360214200520023602102005410236021C200541B884C08000360218200542023702242005418180808000AD422086200541106AAD843703382005418280808000AD422086200541086AAD843703302005200541306A360220200541186A200410AA80808000000B9E0301067F23808080800041C0006B220224808080800002400240200028020022032D00000D002001280214419582C080004104200128021828020C118080808000808080800021000C010B4101210020012802142204419982C0800041042001280218220528020C220611808080800080808080000D00200341016A210302400240200128021C22074104710D0041012100200441F184C080004101200611808080800080808080000D0220032001108A80808000450D010C020B200441F284C080004102200611808080800080808080000D0141012100200241013A001B200220053602102002200436020C20022007360238200241C884C08000360234200220012D00203A003C2002200128021036022C200220012902083702242002200129020037021C20022002411B6A36021420022002410C6A36023020032002411C6A108A808080000D01200228023041EC84C080004102200228023428020C11808080800080808080000D010B2001280214419C97C080004101200128021828020C118080808000808080800021000B200241C0006A24808080800020000BE90201057F2380808080004180016B22022480808080000240024002400240200128021C22034110710D0020034120710D0120003100004101200110868080800021000C030B20002D0000210041FF00210303402002200322046A22052000410F712203413072200341D7006A2003410A491B3A00002004417F6A2103200041FF017122064104762100200641104F0D000C020B0B20002D0000210041FF00210303402002200322046A22052000410F712203413072200341376A2003410A491B3A00002004417F6A2103200041FF017122064104762100200641104F0D000B02402004418101490D002004418001418885C08000108B80808000000B20014101419885C0800041022005418101200441016A6B108C8080800021000C010B02402004418101490D002004418001418885C08000108B80808000000B20014101419885C0800041022005418101200441016A6B108C8080800021000B20024180016A24808080800020000B7902017F017E23808080800041306B220324808080800020032000360200200320013602042003410236020C200341D887C08000360208200342023702142003418380808000AD4220862204200341046AAD84370328200320042003AD843703202003200341206A360210200341086A200210AA80808000000BCB0501077F0240024020010D00200541016A2106200028021C2107412D21080C010B412B418080C400200028021C220741017122011B2108200120056A21060B0240024020074104710D00410021020C010B0240024020030D00410021090C010B02402003410371220A0D000C010B41002109200221010340200920012C000041BF7F4A6A2109200141016A2101200A417F6A220A0D000B0B200920066A21060B024020002802000D000240200028021422012000280218220920082002200310AD80808000450D0041010F0B200120042005200928020C11808080800080808080000F0B02400240024002402000280204220120064B0D00200028021422012000280218220920082002200310AD80808000450D0141010F0B2007410871450D01200028021021072000413036021020002D0020210B4101210C200041013A0020200028021422092000280218220A20082002200310AD808080000D02200120066B41016A2101024003402001417F6A2201450D0120094130200A2802101181808080008080808000450D000B41010F0B0240200920042005200A28020C1180808080008080808000450D0041010F0B2000200B3A00202000200736021041000F0B200120042005200928020C1180808080008080808000210C0C010B200120066B210702400240024020002D002022010E0402000100020B20072101410021070C010B20074101762101200741016A41017621070B200141016A210120002802102106200028021821092000280214210A024003402001417F6A2201450D01200A200620092802101181808080008080808000450D000B41010F0B4101210C200A200920082002200310AD808080000D00200A20042005200928020C11808080800080808080000D00410021010340024020072001470D0020072007490F0B200141016A2101200A200620092802101181808080008080808000450D000B2001417F6A2007490F0B200C0B6601017F23808080800041106B220224808080800020022000280200220041046A36020C200141E181C08000410941EA81C08000410B200041848080800041F581C0800041092002410C6A418580808000108F808080002100200241106A24808080800020000BE70201057F2380808080004180016B22022480808080000240024002400240200128021C22034110710D0020034120710D0120003502004101200110868080800021000C030B2000280200210041FF00210303402002200322046A22052000410F712203413072200341D7006A2003410A491B3A00002004417F6A210320004110492106200041047621002006450D000C020B0B2000280200210041FF00210303402002200322046A22052000410F712203413072200341376A2003410A491B3A00002004417F6A210320004110492106200041047621002006450D000B02402004418101490D002004418001418885C08000108B80808000000B20014101419885C0800041022005418101200441016A6B108C8080800021000C010B02402004418101490D002004418001418885C08000108B80808000000B20014101419885C0800041022005418101200441016A6B108C8080800021000B20024180016A24808080800020000BF50101017F23808080800041106B220B248080808000200028021420012002200028021828020C11808080800080808080002102200B41003A000D200B20023A000C200B2000360208200B41086A200320042005200610B680808000200720082009200A10B680808000210A200B2D000D2202200B2D000C2201722100024020024101470D0020014101710D000240200A28020022002D001C4104710D00200028021441EF84C080004102200028021828020C118080808000808080800021000C010B200028021441EE84C080004101200028021828020C118080808000808080800021000B200B41106A24808080800020004101710B12002000418080C0800020011091808080000BBF05010A7F23808080800041306B2203248080808000200341033A002C2003412036021C41002104200341003602282003200136022420032000360220200341003602142003410036020C02400240024002400240200228021022050D00200228020C2200450D0120022802082101200041037421062000417F6A41FFFFFFFF017141016A21042002280200210003400240200041046A2802002207450D00200328022020002802002007200328022428020C11808080800080808080000D040B20012802002003410C6A200128020411818080800080808080000D03200141086A2101200041086A2100200641786A22060D000C020B0B20022802142201450D00200141057421082001417F6A41FFFFFF3F7141016A210420022802082109200228020021004100210603400240200041046A2802002201450D00200328022020002802002001200328022428020C11808080800080808080000D030B2003200520066A220141106A28020036021C20032001411C6A2D00003A002C2003200141186A2802003602282001410C6A28020021074100210A4100210B024002400240200141086A2802000E03010002010B2007410374210C4100210B2009200C6A220C2802040D01200C28020021070B4101210B0B200320073602102003200B36020C200141046A280200210702400240024020012802000E03010002010B2007410374210B2009200B6A220B2802040D01200B28020021070B4101210A0B200320073602182003200A3602142009200141146A2802004103746A22012802002003410C6A200128020411818080800080808080000D02200041086A21002008200641206A2206470D000B0B200420022802044F0D012003280220200228020020044103746A22012802002001280204200328022428020C1180808080008080808000450D010B410121010C010B410021010B200341306A24808080800020010B1E01017F024020002802002201450D00200028020420011087808080000B0B1E01017F024020002802002201450D00200028020420011087808080000B0B2200200128021441DC81C080004105200128021828020C11808080800080808080000BE30201027F23808080800041106B220224808080800002400240024002402001418001490D002002410036020C2001418010490D0102402001418080044F0D0020022001413F71418001723A000E20022001410C7641E001723A000C20022001410676413F71418001723A000D410321010C030B20022001413F71418001723A000F2002200141127641F001723A000C20022001410676413F71418001723A000E20022001410C76413F71418001723A000D410421010C020B0240200028020822032000280200470D0020001096808080000B2000200341016A360208200028020420036A20013A00000C020B20022001413F71418001723A000D2002200141067641C001723A000C410221010B02402000280200200028020822036B20014F0D00200020032001109780808000200028020821030B200028020420036A2002410C6A200110D6808080001A2000200320016A3602080B200241106A24808080800041000B5501017F23808080800041106B2201248080808000200141086A200020002802004101109C80808000024020012802082200418180808078460D002000200128020C109D80808000000B200141106A2480808080000B5201017F23808080800041106B2203248080808000200341086A200020012002109C80808000024020032802082202418180808078460D002002200328020C109D80808000000B200341106A2480808080000B4B01017F02402000280200200028020822036B20024F0D00200020032002109780808000200028020821030B200028020420036A2001200210D6808080001A2000200320026A36020841000B6F01017F0240024002402002280204450D000240200228020822030D0041002D00B89EC080001A0C020B200228020020032001109A8080800021020C020B41002D00B89EC080001A0B2001109B8080800021020B2000200136020820002002410120021B36020420002002453602000B800601057F0240024002402000417C6A22032802002204417871220541044108200441037122061B20016A490D0002402006450D002005200141276A4B0D020B41102002410B6A4178712002410B491B210102400240024020060D002001418002490D0120052001410472490D01200520016B418180084F0D010C020B200041786A220720056A21060240024002400240200520014F0D00200641002802ACA2C08000460D03200641002802A8A2C08000460D02200628020422044102710D042004417871220420056A22052001490D042006200410A780808000200520016B22024110490D0120032001200328020041017172410272360200200720016A22012002410372360204200720056A220520052802044101723602042001200210A88080800020000F0B200520016B2202410F4D0D0420032001200441017172410272360200200720016A22052002410372360204200620062802044101723602042005200210A88080800020000F0B20032005200328020041017172410272360200200720056A2202200228020441017236020420000F0B41002802A0A2C0800020056A22052001490D0102400240200520016B2202410F4B0D0020032004410171200572410272360200200720056A2202200228020441017236020441002102410021010C010B20032001200441017172410272360200200720016A22012002410172360204200720056A2205200236020020052005280204417E713602040B410020013602A8A2C08000410020023602A0A2C0800020000F0B41002802A4A2C0800020056A220520014B0D040B02402002109B8080800022050D0041000F0B20052000417C4178200328020022014103711B20014178716A2201200220012002491B10D6808080002102200010A580808000200221000B20000F0B41818EC0800041B08EC0800010A680808000000B41C08EC0800041F08EC0800010A680808000000B20032001200441017172410272360200200720016A2202200520016B2205410172360204410020053602A4A2C08000410020023602ACA2C0800020000BCB2502087F017E02400240024002400240024002400240200041F501490D0041002101200041CDFF7B4F0D052000410B6A22014178712102410028029CA2C080002203450D04411F21040240200041F4FFFF074B0D002002410620014108766722006B7641017120004101746B413E6A21040B410020026B21010240200441027441809FC080006A28020022050D0041002100410021060C020B4100210020024100411920044101766B2004411F461B74210741002106034002402005220528020441787122082002490D00200820026B220820014F0D00200821012005210620080D004100210120052106200521000C040B200528021422082000200820052007411D764104716A41106A2802002205471B200020081B2100200741017421072005450D020C000B0B02404100280298A2C08000220541102000410B6A41F803712000410B491B22024103762201762200410371450D00024002402000417F7341017120016A220741037422004190A0C080006A220120004198A0C080006A28020022022802082206460D002006200136020C200120063602080C010B41002005417E20077771360298A2C080000B20022000410372360204200220006A22002000280204410172360204200241086A0F0B200241002802A0A2C080004D0D0302400240024020000D00410028029CA2C080002200450D0620006841027441809FC080006A280200220628020441787120026B21012006210503400240200628021022000D00200628021422000D0020052802182104024002400240200528020C22002005470D00200541144110200528021422001B6A28020022060D01410021000C020B20052802082206200036020C200020063602080C010B200541146A200541106A20001B21070340200721082006220041146A200041106A200028021422061B210720004114411020061B6A28020022060D000B200841003602000B2004450D040240200528021C41027441809FC080006A22062802002005460D0020044110411420042802102005461B6A20003602002000450D050C040B2006200036020020000D034100410028029CA2C08000417E200528021C777136029CA2C080000C040B200028020441787120026B22062001200620014922061B21012000200520061B2105200021060C000B0B02400240200020017441022001742200410020006B727168220841037422014190A0C080006A220620014198A0C080006A28020022002802082207460D002007200636020C200620073602080C010B41002005417E20087771360298A2C080000B20002002410372360204200020026A2207200120026B2206410172360204200020016A2006360200024041002802A0A2C080002205450D0020054178714190A0C080006A210141002802A8A2C080002102024002404100280298A2C08000220841012005410376742205710D0041002008200572360298A2C08000200121050C010B200128020821050B200120023602082005200236020C2002200136020C200220053602080B410020073602A8A2C08000410020063602A0A2C08000200041086A0F0B20002004360218024020052802102206450D0020002006360210200620003602180B20052802142206450D0020002006360214200620003602180B02400240024020014110490D0020052002410372360204200520026A22022001410172360204200220016A200136020041002802A0A2C080002207450D0120074178714190A0C080006A210641002802A8A2C080002100024002404100280298A2C08000220841012007410376742207710D0041002008200772360298A2C08000200621070C010B200628020821070B200620003602082007200036020C2000200636020C200020073602080C010B2005200120026A2200410372360204200520006A220020002802044101723602040C010B410020023602A8A2C08000410020013602A0A2C080000B200541086A0F0B024020002006720D004100210641022004742200410020006B722003712200450D0320006841027441809FC080006A28020021000B2000450D010B0340200020062000280204417871220520026B220820014922041B2103200520024921072008200120041B21080240200028021022050D00200028021421050B2006200320071B21062001200820071B21012005210020050D000B0B2006450D00024041002802A0A2C0800022002002490D002001200020026B4F0D010B20062802182104024002400240200628020C22002006470D00200641144110200628021422001B6A28020022050D01410021000C020B20062802082205200036020C200020053602080C010B200641146A200641106A20001B21070340200721082005220041146A200041106A200028021422051B210720004114411020051B6A28020022050D000B200841003602000B2004450D030240200628021C41027441809FC080006A22052802002006460D0020044110411420042802102006461B6A20003602002000450D040C030B2005200036020020000D024100410028029CA2C08000417E200628021C777136029CA2C080000C030B02400240024002400240024041002802A0A2C08000220020024F0D00024041002802A4A2C08000220020024B0D0041002101200241AF80046A220641107640002200417F4622070D0720004110742205450D07410041002802B0A2C08000410020064180807C7120071B22086A22003602B0A2C08000410041002802B4A2C0800022012000200120004B1B3602B4A2C0800002400240024041002802ACA2C080002201450D004180A0C080002100034020002802002206200028020422076A2005460D02200028020822000D000C030B0B0240024041002802BCA2C080002200450D00200020054D0D010B410020053602BCA2C080000B410041FF1F3602C0A2C0800041002008360284A0C0800041002005360280A0C0800041004190A0C0800036029CA0C0800041004198A0C080003602A4A0C0800041004190A0C08000360298A0C08000410041A0A0C080003602ACA0C0800041004198A0C080003602A0A0C08000410041A8A0C080003602B4A0C08000410041A0A0C080003602A8A0C08000410041B0A0C080003602BCA0C08000410041A8A0C080003602B0A0C08000410041B8A0C080003602C4A0C08000410041B0A0C080003602B8A0C08000410041C0A0C080003602CCA0C08000410041B8A0C080003602C0A0C08000410041C8A0C080003602D4A0C08000410041C0A0C080003602C8A0C080004100410036028CA0C08000410041D0A0C080003602DCA0C08000410041C8A0C080003602D0A0C08000410041D0A0C080003602D8A0C08000410041D8A0C080003602E4A0C08000410041D8A0C080003602E0A0C08000410041E0A0C080003602ECA0C08000410041E0A0C080003602E8A0C08000410041E8A0C080003602F4A0C08000410041E8A0C080003602F0A0C08000410041F0A0C080003602FCA0C08000410041F0A0C080003602F8A0C08000410041F8A0C08000360284A1C08000410041F8A0C08000360280A1C0800041004180A1C0800036028CA1C0800041004180A1C08000360288A1C0800041004188A1C08000360294A1C0800041004188A1C08000360290A1C0800041004190A1C0800036029CA1C0800041004198A1C080003602A4A1C0800041004190A1C08000360298A1C08000410041A0A1C080003602ACA1C0800041004198A1C080003602A0A1C08000410041A8A1C080003602B4A1C08000410041A0A1C080003602A8A1C08000410041B0A1C080003602BCA1C08000410041A8A1C080003602B0A1C08000410041B8A1C080003602C4A1C08000410041B0A1C080003602B8A1C08000410041C0A1C080003602CCA1C08000410041B8A1C080003602C0A1C08000410041C8A1C080003602D4A1C08000410041C0A1C080003602C8A1C08000410041D0A1C080003602DCA1C08000410041C8A1C080003602D0A1C08000410041D8A1C080003602E4A1C08000410041D0A1C080003602D8A1C08000410041E0A1C080003602ECA1C08000410041D8A1C080003602E0A1C08000410041E8A1C080003602F4A1C08000410041E0A1C080003602E8A1C08000410041F0A1C080003602FCA1C08000410041E8A1C080003602F0A1C08000410041F8A1C08000360284A2C08000410041F0A1C080003602F8A1C0800041004180A2C0800036028CA2C08000410041F8A1C08000360280A2C0800041004188A2C08000360294A2C0800041004180A2C08000360288A2C08000410020053602ACA2C0800041004188A2C08000360290A2C080004100200841586A22003602A4A2C0800020052000410172360204200520006A4128360204410041808080013602B8A2C080000C080B200120054F0D00200620014B0D00200028020C450D030B410041002802BCA2C080002200200520002005491B3602BCA2C08000200520086A21064180A0C0800021000240024002400340200028020022072006460D01200028020822000D000C020B0B200028020C450D010B4180A0C0800021000240034002402000280200220620014B0D002001200620002802046A2206490D020B200028020821000C000B0B410020053602ACA2C080004100200841586A22003602A4A2C0800020052000410172360204200520006A4128360204410041808080013602B8A2C080002001200641606A41787141786A22002000200141106A491B2207411B3602044100290280A0C080002109200741106A4100290288A0C080003702002007200937020841002008360284A0C0800041002005360280A0C080004100200741086A360288A0C080004100410036028CA0C080002007411C6A2100034020004107360200200041046A22002006490D000B20072001460D0720072007280204417E713602042001200720016B22004101723602042007200036020002402000418002490D002001200010D0808080000C080B200041F801714190A0C080006A2106024002404100280298A2C08000220541012000410376742200710D0041002005200072360298A2C08000200621000C010B200628020821000B200620013602082000200136020C2001200636020C200120003602080C070B200020053602002000200028020420086A360204200520024103723602042007410F6A41787141786A2201200520026A22006B2102200141002802ACA2C08000460D03200141002802A8A2C08000460D040240200128020422064103714101470D0020012006417871220610A780808000200620026A2102200120066A220128020421060B20012006417E7136020420002002410172360204200020026A200236020002402002418002490D002000200210D0808080000C060B200241F801714190A0C080006A2101024002404100280298A2C08000220641012002410376742202710D0041002006200272360298A2C08000200121020C010B200128020821020B200120003602082002200036020C2000200136020C200020023602080C050B4100200020026B22013602A4A2C08000410041002802ACA2C08000220020026A22063602ACA2C080002006200141017236020420002002410372360204200041086A21010C060B41002802A8A2C08000210102400240200020026B2206410F4B0D00410041003602A8A2C08000410041003602A0A2C0800020012000410372360204200120006A220020002802044101723602040C010B410020063602A0A2C080004100200120026A22053602A8A2C0800020052006410172360204200120006A2006360200200120024103723602040B200141086A0F0B2000200720086A360204410041002802ACA2C080002200410F6A417871220141786A22063602ACA2C080004100200020016B41002802A4A2C0800020086A22016A41086A22053602A4A2C0800020062005410172360204200020016A4128360204410041808080013602B8A2C080000C030B410020003602ACA2C08000410041002802A4A2C0800020026A22023602A4A2C08000200020024101723602040C010B410020003602A8A2C08000410041002802A0A2C0800020026A22023602A0A2C0800020002002410172360204200020026A20023602000B200541086A0F0B4100210141002802A4A2C08000220020024D0D004100200020026B22013602A4A2C08000410041002802ACA2C08000220020026A22063602ACA2C080002006200141017236020420002002410372360204200041086A0F0B20010F0B20002004360218024020062802102205450D0020002005360210200520003602180B20062802142205450D0020002005360214200520003602180B0240024020014110490D0020062002410372360204200620026A22002001410172360204200020016A200136020002402001418002490D002000200110D0808080000C020B200141F801714190A0C080006A2102024002404100280298A2C08000220541012001410376742201710D0041002005200172360298A2C08000200221010C010B200228020821010B200220003602082001200036020C2000200236020C200020013602080C010B2006200120026A2200410372360204200620006A220020002802044101723602040B200641086A0BE90101037F23808080800041206B2204248080808000024002400240200220036A220320024F0D00410021020C010B410021022001280200220541017422062003200620034B1B22034108200341084B1B22034100480D000240024020050D00410021020C010B2004200536021C20042001280204360214410121020B20042002360218200441086A2003200441146A109980808000024020042802080D00200428020C2102200120033602002001200236020441818080807821020C010B20042802102101200428020C21020C010B0B2000200136020420002002360200200441206A2480808080000B1000024020000D0010A9808080000B000B6101017F23808080800041106B220224808080800020022000410C6A36020C200141FE81C08000410D418B82C0800041052000418680808000419082C0800041052002410C6A418780808000108F808080002100200241106A24808080800020000BE00301097F23808080800041C0006B2202248080808000200028020821032000280204210441012105200128021441B083C080004101200128021828020C1180808080008080808000210002402003450D0041002106034020062107410121062000410171210841012100024020080D0002400240200128021C22084104710D002007410171450D0141012100200128021441E784C080004102200128021828020C1180808080008080808000450D010C020B200128021821092001280214210A024020074101710D0041012100200A41888BC080004101200928020C11808080800080808080000D020B200241013A001B200220093602102002200A36020C20022008360238200241C884C08000360234200220012D00203A003C2002200128021036022C200220012902083702242002200129020037021C20022002411B6A36021420022002410C6A360230024020042002411C6A108A808080000D00200228023041EC84C080004102200228023428020C118080808000808080800021000C020B410121000C010B20042001108A8080800021000B200441016A21042003417F6A22030D000B0B024020000D00200128021441F484C080004101200128021828020C118080808000808080800021050B200241C0006A24808080800020050B4A01017F23808080800041106B22022480808080002002200036020C200141EE8AC0800041FB8AC080002002410C6A41888080800010A2808080002100200241106A24808080800020000B3D00200128021420002802002D0000410274220041A09EC080006A2802002000418C9EC080006A280200200128021828020C11808080800080808080000BE70101017F23808080800041106B220524808080800020002802142001410D200028021828020C11808080800080808080002101200541003A000D200520013A000C20052000360208200541086A200241042003200410B680808000210320052D000D220120052D000C2204722100024020014101470D0020044101710D000240200328020022002D001C4104710D00200028021441EF84C080004102200028021828020C118080808000808080800021000C010B200028021441EE84C080004101200028021828020C118080808000808080800021000B200541106A24808080800020004101710BF513050B7F017E057F027E057F23808080800041C0006B220024808080800041002D00B89EC080001A02400240024002400240024002400240024002400240024002404107109B808080002201450D00200141036A41002800F18BC08000360000200141002800EE8BC08000360000200141071081808080002202280004210320022800002104200241081087808080002001410710878080800041002D00B89EC080001A4107109B808080002201450D00200141036A41002800F18BC08000360000200141002800EE8BC08000360000200141071082808080002202280004210520022800002106200241081087808080002001410710878080800041002D00B89EC080001A410B109B808080002201450D00200141076A41002800FC8BC08000360000200141002900F58BC080003700002001410B1082808080002202280004210720022800002108200241081087808080002001410B10878080800041002D00B89EC080001A4107109B808080002201450D00200141036A410028009F8CC080003600002001410028009C8CC0800036000041E1002008200720014107108380808000220928000421022009280000210A20094108108780808000200041186A200A200210A48080800002400240024020002D00184101460D002000290320210B02402002450D00200A20021087808080000B200141071087808080004100210941002D00B89EC080001A4104109B808080002201450D03200141C4C2D18B06360000200141041082808080002202280000210C2002280004210A2002410810878080800020014104108780808000024002400240200A4100480D000240200A0D00410121014100210D0C030B41002D00B89EC080001A200A109B8080800022010D01410121090B2009200A109D80808000000B200A210D0B2001200C200A10D6808080002102200A450D014100200A41796A22012001200A4B1B210E200241036A417C7120026B210F4100210103400240024002400240200220016A2D00002209C022104100480D00200F20016B4103710D012001200E4F0D020340200220016A2209280204200928020072418081828478710D03200141086A2201200E490D000C030B0B42808080808020211142808080801021120240024002400240024002400240024002400240024002402009418888C080006A2D0000417E6A0E030003010B0B200141016A2209200A490D01420021110C090B42002111200141016A2213200A490D020C080B4280808080802021114280808080102112200220096A2C000041BF7F4A0D080C060B42002111200141016A2213200A4F0D06200220136A2C00002113024002400240200941E001460D00200941ED01460D012010411F6A41FF0171410C490D022010417E71416E470D0420134140480D050C040B201341607141A07F460D040C030B2013419F7F4A0D020C030B20134140480D020C010B200220136A2C000021130240024002400240200941907E6A0E050100000002000B2010410F6A41FF017141024B0D03201341404E0D030C020B201341F0006A41FF017141304F0D020C010B2013418F7F4A0D010B200141026A2209200A4F0D05200220096A2C000041BF7F4A0D0242002112200141036A2209200A4F0D06200220096A2C000041BF7F4C0D04428080808080E00021110C030B4280808080802021110C020B42002112200141026A2209200A4F0D04200220096A2C000041BF7F4C0D020B428080808080C00021110B42808080801021120C020B200941016A21010C040B420021120B20112012842001AD8421110240200D418080808078470D00200A21142002210D0C070B200020113702242000200D3602182000200AAD4220862002AD8437021C41988AC08000412B200041186A41CC81C0800041A882C08000108880808000000B200141016A21010C010B2001200A4F0D000340200220016A2C00004100480D01200A200141016A2201470D000C040B0B2001200A490D000C020B0B200020002D00193A000C41988AC08000412B2000410C6A41888AC0800041A48CC08000108880808000000B200AAD2111200221140B200041186A20142011A710A48080800020002D00184101460D01200029032021124100210F108480808000211541002D00B89EC080001A410B109B808080002216450D00201641076A41002800878CC08000360000201641002900808CC080003700002016410B10828080800022012800002117200128000421132001410810878080800002400240024020130E020F00010B4101210F20172D0000220141556A0E030E010E010B20172D000021010B0240200141FF017141556A0E03040600060B2013417F6A2109201741016A210220134109490D024100210103402009450D0A20022D000041506A220E41094B0D084103210F2001AC420A7E2211422088A72011A72210411F75470D0D200241016A21022009417F6A2109200E41004A2010200E6B220120104873450D000C0D0B0B000B200020002D00193A000C41988AC08000412B2000410C6A41BC81C0800041B882C08000108880808000000B2009450D01410021014101210F034020022D000041506A220E41094B0D0A200241016A21022001410A6C200E6B21012009417F6A22090D000C070B0B2013417F6A2109201741016A2102201341094F0D0220090D040B410021010C050B201321092017210220134108490D020B4100210103402009450D0320022D000041506A220E41094B0D014102210F2001AC420A7E2211422088A72011A72210411F75470D06200241016A21022009417F6A2109200E4100482010200E6A220120104873450D000C060B0B4101210F0C040B410021014101210F034020022D000041506A220E41094B0D04200241016A2102200E2001410A6C6A21012009417F6A22090D000B0B2013450D010B201720131087808080000B2016410B108780808000200420031080808080002006200510808080800020082007108080808000200C200A10808080800020004100360214200042808080801037020C200041033A003820004120360228200041003602342000418080C08000360230200041003602202000410036021820002000410C6A36022C0240200B4101200041186A1086808080000D00200028020C210220002802102209200028021410808080800002402002450D00200920021087808080000B2015108580808000200110858080800041002102024020032005470D0020042006200310D58080800045200B20125871201520014E7121020B0240200D450D002014200D1087808080000B0240200A450D00200C200A1087808080000B02402007450D00200820071087808080000B02402005450D00200620051087808080000B02402003450D00200420031087808080000B200041C0006A24808080800020020F0B41A880C0800041372000413F6A419880C0800041AC81C08000108880808000000B2000200F3A001841988AC08000412B200041186A41888AC08000418C8CC08000108880808000000BD60202027F027E23808080800041106B22032480808080000240024002400240024002400240024002400240024020020E020200010B4101210220012D000041556A0E03060306030B20012D0000412B470D01200141016A2101200241124921042002417F6A210220040D020C030B200041003A00010C050B200241114F0D010B420021050C010B4200210503402002450D04200320054200420A420010D78080800020012D000041506A2204410A4F0D02024020032903084200510D00200041023A00010C040B200141016A21012002417F6A2102200329030022062004AD7C220520065A0D000B200041023A00010C020B034020012D000041506A2204410A4F0D01200141016A21012005420A7E2004AD7C21052002417F6A2202450D030C000B0B41012101200041013A00010C020B410121010C010B20002005370308410021010B200020013A0000200341106A2480808080000BBE0601057F200041786A22012000417C6A280200220241787122006A21030240024020024101710D002002410271450D012001280200220220006A21000240200120026B220141002802A8A2C08000470D0020032802044103714103470D01410020003602A0A2C0800020032003280204417E7136020420012000410172360204200320003602000F0B2001200210A7808080000B024002400240024002400240200328020422024102710D00200341002802ACA2C08000460D02200341002802A8A2C08000460D0320032002417871220210A7808080002001200220006A2200410172360204200120006A2000360200200141002802A8A2C08000470D01410020003602A0A2C080000F0B20032002417E7136020420012000410172360204200120006A20003602000B2000418002490D022001200010D08080800041002101410041002802C0A2C08000417F6A22003602C0A2C0800020000D0402404100280288A0C080002200450D00410021010340200141016A2101200028020822000D000B0B4100200141FF1F200141FF1F4B1B3602C0A2C080000F0B410020013602ACA2C08000410041002802A4A2C0800020006A22003602A4A2C08000200120004101723602040240200141002802A8A2C08000470D00410041003602A0A2C08000410041003602A8A2C080000B200041002802B8A2C0800022044D0D0341002802ACA2C080002200450D034100210241002802A4A2C0800022054129490D024180A0C080002101034002402001280200220320004B0D002000200320012802046A490D040B200128020821010C000B0B410020013602A8A2C08000410041002802A0A2C0800020006A22003602A0A2C0800020012000410172360204200120006A20003602000F0B200041F801714190A0C080006A2103024002404100280298A2C08000220241012000410376742200710D0041002002200072360298A2C08000200321000C010B200328020821000B200320013602082000200136020C2001200336020C200120003602080F0B02404100280288A0C080002201450D00410021020340200241016A2102200128020822010D000B0B4100200241FF1F200241FF1F4B1B3602C0A2C08000200520044D0D004100417F3602B8A2C080000B0B4D01017F23808080800041206B22022480808080002002410036021020024101360204200242043702082002412E36021C200220003602182002200241186A3602002002200110AA80808000000B820301047F200028020C21020240024002402001418002490D002000280218210302400240024020022000470D00200041144110200028021422021B6A28020022010D01410021020C020B20002802082201200236020C200220013602080C010B200041146A200041106A20021B21040340200421052001220241146A200241106A200228021422011B210420024114411020011B6A28020022010D000B200541003602000B2003450D020240200028021C41027441809FC080006A22012802002000460D0020034110411420032802102000461B6A20023602002002450D030C020B2001200236020020020D014100410028029CA2C08000417E200028021C777136029CA2C080000C020B0240200220002802082204460D002004200236020C200220043602080F0B41004100280298A2C08000417E20014103767771360298A2C080000F0B20022003360218024020002802102201450D0020022001360210200120023602180B20002802142201450D0020022001360214200120023602180F0B0BA00401027F200020016A210202400240200028020422034101710D002003410271450D012000280200220320016A21010240200020036B220041002802A8A2C08000470D0020022802044103714103470D01410020013602A0A2C0800020022002280204417E7136020420002001410172360204200220013602000C020B2000200310A7808080000B0240024002400240200228020422034102710D00200241002802ACA2C08000460D02200241002802A8A2C08000460D0320022003417871220310A7808080002000200320016A2201410172360204200020016A2001360200200041002802A8A2C08000470D01410020013602A0A2C080000F0B20022003417E7136020420002001410172360204200020016A20013602000B02402001418002490D002000200110D0808080000F0B200141F801714190A0C080006A2102024002404100280298A2C08000220341012001410376742201710D0041002003200172360298A2C08000200221010C010B200228020821010B200220003602082001200036020C2000200236020C200020013602080F0B410020003602ACA2C08000410041002802A4A2C0800020016A22013602A4A2C0800020002001410172360204200041002802A8A2C08000470D01410041003602A0A2C08000410041003602A8A2C080000F0B410020003602A8A2C08000410041002802A0A2C0800020016A22013602A0A2C0800020002001410172360204200020016A20013602000F0B0B4701017F23808080800041206B2200248080808000200041003602182000410136020C200041DC82C0800036020820004204370210200041086A41F882C0800010AA80808000000B5601017F23808080800041206B2202248080808000200241106A200041106A290200370300200241086A200041086A290200370300200241013B011C2002200136021820022000290200370300200210AC80808000000B11002000350200410120011086808080000B5D01027F23808080800041206B220124808080800020002802182102200141106A200041106A290200370300200141086A200041086A2902003703002001200036021C2001200236021820012000290200370300200110D180808000000B490002402002418080C400460D002000200220012802101181808080008080808000450D0041010F0B024020030D0041000F0B200020032004200128020C11808080800080808080000B7D02017F017E23808080800041306B220224808080800020022000360200200220013602042002410236020C200241F887C08000360208200242023702142002418380808000AD4220862203200241046AAD84370328200220032002AD843703202002200241206A360210200241086A419487C0800010AA80808000000BC20B010B7F200028020821030240024002400240200028020022040D002003410171450D010B02402003410171450D00200120026A210502400240200028020C22060D0041002107200121080C010B4100210741002109200121080340200822032005460D020240024020032C00002208417F4C0D00200341016A21080C010B0240200841604F0D00200341026A21080C010B0240200841704F0D00200341036A21080C010B200341046A21080B200820036B20076A21072006200941016A2209470D000B0B20082005460D00024020082C00002203417F4A0D0020034160491A0B024002402007450D000240200720024F0D00200120076A2C000041BF7F4A0D01410021030C020B20072002460D00410021030C010B200121030B2007200220031B21022003200120031B21010B024020040D00200028021420012002200028021828020C11808080800080808080000F0B2000280204210A024020024110490D0020022001200141036A417C7122076B22096A220B41037121044100210641002103024020012007460D004100210302402009417C4B0D00410021034100210503402003200120056A22082C000041BF7F4A6A200841016A2C000041BF7F4A6A200841026A2C000041BF7F4A6A200841036A2C000041BF7F4A6A2103200541046A22050D000B0B200121080340200320082C000041BF7F4A6A2103200841016A2108200941016A22090D000B0B02402004450D002007200B417C716A22082C000041BF7F4A210620044101460D00200620082C000141BF7F4A6A210620044102460D00200620082C000241BF7F4A6A21060B200B4102762105200620036A21060340200721042005450D04200541C001200541C001491B220B410371210C200B410274210D41002108024020054104490D002004200D41F007716A210941002108200421030340200328020C2207417F7341077620074106767241818284087120032802082207417F7341077620074106767241818284087120032802042207417F7341077620074106767241818284087120032802002207417F7341077620074106767241818284087120086A6A6A6A2108200341106A22032009470D000B0B2005200B6B21052004200D6A2107200841087641FF81FC0771200841FF81FC07716A418180046C41107620066A2106200C450D000B2004200B41FC01714102746A22082802002203417F734107762003410676724181828408712103200C4101460D0220082802042207417F7341077620074106767241818284087120036A2103200C4102460D0220082802082208417F7341077620084106767241818284087120036A21030C020B024020020D00410021060C030B2002410371210802400240200241044F0D0041002106410021090C010B41002106200121032002410C71220921070340200620032C000041BF7F4A6A200341016A2C000041BF7F4A6A200341026A2C000041BF7F4A6A200341036A2C000041BF7F4A6A2106200341046A21032007417C6A22070D000B0B2008450D02200120096A21030340200620032C000041BF7F4A6A2106200341016A21032008417F6A22080D000C030B0B200028021420012002200028021828020C11808080800080808080000F0B200341087641FF811C71200341FF81FC07716A418180046C41107620066A21060B02400240200A20064D0D00200A20066B21054100210302400240024020002D00200E0402000102020B20052103410021050C010B20054101762103200541016A41017621050B200341016A210320002802102109200028021821082000280214210703402003417F6A2203450D022007200920082802101181808080008080808000450D000B41010F0B200028021420012002200028021828020C11808080800080808080000F0B0240200720012002200828020C1180808080008080808000450D0041010F0B410021030340024020052003470D0020052005490F0B200341016A21032007200920082802101181808080008080808000450D000B2003417F6A2005490B820302017F017E23808080800041F0006B2203248080808000200341B08DC0800036020C20032000360208200341B08DC08000360214200320013602102003410236021C200341B183C08000360218024020022802000D002003410336025C200341E483C08000360258200342033702642003418180808000AD4220862204200341106AAD8437034820032004200341086AAD843703402003418280808000AD422086200341186AAD843703382003200341386A360260200341D8006A41E899C0800010AA80808000000B200341206A41106A200241106A290200370300200341206A41086A200241086A290200370300200320022902003703202003410436025C2003419884C08000360258200342043702642003418180808000AD4220862204200341106AAD8437035020032004200341086AAD843703482003418980808000AD422086200341206AAD843703402003418280808000AD422086200341186AAD843703382003200341386A360260200341D8006A41E899C0800010AA80808000000B1C0020002802002001200028020428020C11818080800080808080000B140020012000280200200028020410AF808080000B14002001280214200128021820001091808080000B22002001280214418883C08000410E200128021828020C11808080800080808080000B6001017F23808080800041306B22002480808080002000410136020C200041A883C08000360208200042013702142000418A80808000AD4220862000412F6AAD843703202000200041206A360210200041086A41CC97C0800010AA80808000000BE70302057F017E23808080800041C0006B220524808080800041012106024020002D00040D0020002D0005210702402000280200220828021C22094104710D0041012106200828021441E784C0800041E484C08000200741017122071B4102410320071B200828021828020C11808080800080808080000D01200828021420012002200828021828020C11808080800080808080000D01200828021441EF97C080004102200828021828020C11808080800080808080000D01200320082004118180808000808080800021060C010B41012106024020074101710D00200828021441E984C080004103200828021828020C11808080800080808080000D01200828021C21090B41012106200541013A001B2005200829021437020C200541C884C0800036023420052005411B6A360214200520082902083702242008290200210A200520093602382005200828021036022C200520082D00203A003C2005200A37021C20052005410C6A3602302005410C6A2001200210B7808080000D002005410C6A41EF97C08000410210B7808080000D0020032005411C6A200411818080800080808080000D00200528023041EC84C080004102200528023428020C118080808000808080800021060B200041013A0005200020063A0004200541C0006A24808080800020000BDF04010C7F2001417F6A21032000280204210420002802002105200028020821064100210741002108410021094100210A02400340200A4101710D0102400240200920024B0D000340200120096A210A0240024002400240200220096B220B41074B0D0020022009470D01200221090C050B02400240200A41036A417C71220C200A6B220D450D00410021000340200A20006A2D0000410A460D05200D200041016A2200470D000B200D200B41786A220E4D0D010C030B200B41786A210E0B03404180828408200C2802002200418A94A8D000736B2000724180828408200C41046A2802002200418A94A8D000736B2000727141808182847871418081828478470D02200C41086A210C200D41086A220D200E4D0D000C020B0B410021000340200A20006A2D0000410A460D02200B200041016A2200470D000B200221090C030B0240200D200B470D00200221090C030B200A200D6A210C2002200D6B20096B210B4100210002400340200C20006A2D0000410A460D01200B200041016A2200470D000B200221090C030B2000200D6A21000B200020096A220C41016A21090240200C20024F0D00200A20006A2D0000410A470D004100210A2009210D200921000C030B200920024D0D000B0B20082002460D024101210A2008210D200221000B0240024020062D0000450D00200541E084C080004104200428020C11808080800080808080000D010B200020086B210B4100210C024020002008460D00200320006A2D0000410A46210C0B200120086A21002006200C3A0000200D210820052000200B200428020C1180808080008080808000450D010B0B410121070B20070B6001027F20002802042102200028020021030240200028020822002D0000450D00200341E084C080004104200228020C1180808080008080808000450D0041010F0B20002001410A463A000020032001200228021011818080800080808080000B1200200041C884C0800020011091808080000B6A01017F23808080800041306B22032480808080002003200136020C2003200036020820034101360214200341D490C080003602102003420137021C2003418280808000AD422086200341086AAD843703282003200341286A360218200341106A200210AA80808000000B2701017F200028020022002000411F7522027320026BAD2000417F73411F7620011086808080000B830201087F2380808080004180016B2202248080808000200128020421032001280200210420002802002100200128021C2205210602402005410471450D002005410872210620040D0020014281808080A0013702000B2001200641047236021C41FF00210603402002200622076A22082000410F712206413072200641D7006A2006410A491B3A00002007417F6A210620004110492109200041047621002009450D000B02402007418101490D002007418001418885C08000108B80808000000B20014101419885C0800041022008418101200741016A6B108C8080800021002001200536021C200120033602042001200436020020024180016A24808080800020000BAF0101017F23808080800041306B2201248080808000024002402000417F4C0D000240024020000D00410121000C010B41002D00B89EC080001A2000109B808080002200450D020B2001200036020C200141023602142001418C8BC080003602102001420137021C2001418B8080800036022C2001200141286A36021820012001410C6A360228200141106A10BE80808000200128020C2100200141306A24808080800020000F0B10A9808080000B000BBE0604017F017E037F017E23808080800041C0006B22012480808080002001410636020C2001419498C08000360208024041002D00E89EC080004103460D0010C8808080000B0240024002400240024041002903D0A2C0800022024200520D00024041002802D8A2C0800022030D0010C18080800041002802D8A2C0800021030B20032003280200220441016A3602002004417F4C0D012003450D02200320032802002204417F6A3602002003290308210220044101470D00200310C2808080000B024002400240200241002903C09EC08000510D0041002D00CC9EC08000210441012103410041013A00CC9EC08000200120043A00182004450D012001420037023420014281808080C00037022C200141BC99C08000360228200141186A200141286A10C380808000000B024041002802C89EC080002203417F460D00200341016A21030C020B419C9AC08000412641E09AC0800010BA80808000000B410020023703C09EC080000B410020033602C89EC08000200141C09EC0800036021041042103200141043A00182001200141106A360220200141186A41C08DC080002000109180808000210020012D001821040240024020000D00420021024117200441FF0171764101710D01200128021C220328020021000240200341046A28020022042802002205450D002000200511828080800080808080000B024020042802042204450D00200020041087808080000B2003410C108780808000410421030C010B200441FF01714104460D032001290318220642807E8321022006A721030B200128021022002000280208417F6A2204360208024020040D00200041003A000C200042003703000B200341FF01714104470D03200141C0006A2480808080000F0B000B41808FC0800041DE0041F48FC0800010BA80808000000B200141003602382001410136022C2001418499C0800036022820014204370230200141286A418C99C0800010AA80808000000B200120022003AD42FF0183843703102001410236022C200141F497C08000360228200142023702342001418C80808000AD422086200141106AAD843703202001418280808000AD422086200141086AAD843703182001200141186A360230200141286A418498C0800010AA80808000000B7F01017F23808080800041306B22022480808080002002200036020C20024102360214200241A88BC080003602102002420137021C2002418B8080800036022C2002200241286A36021820022002410C6A360228200241106A10BE8080800002402001450D00200228020C20011087808080000B200241306A2480808080000B4701017F23808080800041206B2200248080808000200041003602182000410136020C200041BC90C0800036020820004204370210200041086A41C490C0800010AA80808000000BF90103027F037E017F23808080800041206B220024808080800041002D00B89EC080001A0240024002404120109B808080002201450D0020014102360210200142818080801037030041002903F89EC08000210203402002427F510D024100200242017C220341002903F89EC080002204200420025122051B3703F89EC08000200421022005450D000B410020033703D0A2C080002001200337030841002802D8A2C08000450D02200041003602182000410136020C200041C48CC0800036020820004204370210200041086A419C8DC0800010AA808080000B000B10C080808000000B410020013602D8A2C08000200041206A2480808080000B5B01027F024020002802104101470D002000280214220141003A000020002802182202450D00200120021087808080000B02402000417F460D00200020002802042201417F6A36020420014101470D00200041201087808080000B0B3A01017F23808080800041106B2202248080808000200241AC8DC0800036020C20022000360208200241086A2002410C6A200110B080808000000B3000024020002802002D00000D00200141E286C08000410510AF808080000F0B200141E786C08000410410AF808080000BE50301017F23808080800041C0006B220224808080800002400240024002400240024020002D00000E0400010203000B2002200028020436020441002D00B89EC080001A4114109B808080002200450D04200041106A41002800809BC08000360000200041086A41002900F89AC08000370000200041002900F09AC08000370000200241143602102002200036020C200241143602082002410336022C200241A097C08000360228200242023702342002418D80808000AD422086200241046AAD843703202002418E80808000AD422086200241086AAD843703182002200241186A36023020012802142001280218200241286A109180808000210020022802082201450D03200228020C20011087808080000C030B20002D000121002002410136022C200241D490C08000360228200242013702342002418280808000AD422086200241186AAD8437030820022000410274220041C49BC080006A28020036021C2002200041E89CC080006A2802003602182002200241086A36023020012802142001280218200241286A10918080800021000C020B200120002802042200280200200028020410AF8080800021000C010B2000280204220028020020012000280204280210118180808000808080800021000B200241C0006A24808080800020000F0B000B140020012000280204200028020810AF808080000B7001037F200028020421010240024020002D0000220041044B0D0020004103470D010B200128020021000240200141046A28020022022802002203450D002000200311828080800080808080000B024020022802042202450D00200020021087808080000B2001410C1087808080000B0BF10101027F23808080800041206B2200248080808000024002400240024041002D00E89EC080000E0400000301000B410041023A00E89EC0800041002D00B89EC080001A418008109B808080002201450D01410041033A00E89EC08000410020013602D89EC08000410042808080808080013703D09EC08000410042003703C09EC08000410041003A00E09EC08000410041003602DC9EC08000410041003A00CC9EC08000410041003602C89EC080000B200041206A2480808080000F0B000B200041003602182000410136020C200041BC9BC0800036020820004204370210200041086A418C9AC0800010AA80808000000BB108010A7F23808080800041206B22042480808080000240024002400240024020012802100D002001417F360210200341002003200241036A417C7120026B22056B41077120032005491B22066B210720032006490D0102402006450D0002400240200220036A2208417F6A22092D0000410A470D002006417F6A21060C010B200220076A220A2009460D0102402008417E6A22092D0000410A470D002006417E6A21060C010B200A2009460D0102402008417D6A22092D0000410A470D002006417D6A21060C010B200A2009460D0102402008417C6A22092D0000410A470D002006417C6A21060C010B200A2009460D0102402008417B6A22092D0000410A470D002006417B6A21060C010B200A2009460D0102402008417A6A22092D0000410A470D002006417A6A21060C010B200A2009460D010240200841796A22092D0000410A470D00200641796A21060C010B200A2009460D01200641787221060B200620076A41016A21060C040B20052003200320054B1B210B410020066B21082002417C6A210C2006417F7320026A210A02400340200A21052008210620072209200B4D0D01200641786A2108200541786A210A41808284082002200941786A22076A280200220D418A94A8D000736B200D724180828408200C20096A280200220D418A94A8D000736B200D727141808182847871418081828478460D000B0B200920034B0D0202400340200320066A450D012006417F6A2106200520036A21092005417F6A210520092D0000410A470D000B200320066A41016A21060C040B024002402001411C6A28020022060D00410021060C010B2006200141186A2802006A417F6A2D0000410A470D0041002106200141003A00202001411C6A41003602000B0240200128021420066B20034B0D002000200141146A2002200310CA808080000C050B200128021820066A2002200310D6808080001A200041043A00002001411C6A200620036A3602000C040B10B580808000000B20072003418487C08000108B80808000000B2009200310AE80808000000B0240200320064F0D00200441003602182004410136020C2004418C91C0800036020820044204370210200441086A419491C0800010AA80808000000B02402001411C6A2802002205450D0002400240200128021420056B20064D0D00200141186A28020020056A2002200610D6808080001A2001411C6A200520066A22053602000C010B200441086A200141146A2002200610CA80808000024020042D00084104460D00200020042903083702000C030B2001411C6A28020021050B2005450D00200141003A00202001411C6A41003602000B200220066A210502402001280214200320066B22064B0D002000200141146A2005200610CA808080000C010B200141186A2802002005200610D6808080001A200041043A00002001411C6A20063602000B2001200128021041016A360210200441206A2480808080000B7101027F20012802002104024020012802082205450D00200420056B20034F0D004100210520014100360208200141003A000C0B0240200420034D0D00200128020420056A2002200310D6808080001A200041043A00002001200520036A3602080F0B20004204370200200141003A000C0BC90103027F017E027F23808080800041106B2203248080808000200341086A20002802082802002001200210C980808000024020032D000822024104460D0020002802042104200329030821050240024020002D0000220141044B0D0020014103470D010B200428020021010240200441046A28020022062802002207450D002001200711828080800080808080000B024020062802042206450D00200120061087808080000B2004410C1087808080000B200020053702000B200341106A24808080800020024104470B9C0303027F017E037F23808080800041106B22022480808080002002410036020402400240024002402001418001490D002001418010490D012001418080044F0D0220022001413F71418001723A000620022001410C7641E001723A000420022001410676413F71418001723A0005410321010C030B200220013A0004410121010C020B20022001413F71418001723A00052002200141067641C001723A0004410221010C010B20022001413F71418001723A00072002200141127641F001723A000420022001410676413F71418001723A000620022001410C76413F71418001723A0005410421010B200241086A2000280208280200200241046A200110C980808000024020022D000822014104460D0020002802042103200229030821040240024020002D0000220541044B0D0020054103470D010B200328020021050240200341046A28020022062802002207450D002005200711828080800080808080000B024020062802042206450D00200520061087808080000B2003410C1087808080000B200020043702000B200241106A24808080800020014104470B1200200041C08DC0800020011091808080000B0300000B0900200041003602000BC30201047F411F21020240200141FFFFFF074B0D002001410620014108766722026B7641017120024101746B413E6A21020B200042003702102000200236021C200241027441809FC080006A21030240410028029CA2C0800041012002742204710D0020032000360200200020033602182000200036020C200020003602084100410028029CA2C0800020047236029CA2C080000F0B024002400240200328020022042802044178712001470D00200421020C010B20014100411920024101766B2002411F461B742103034020042003411D764104716A41106A22052802002202450D02200341017421032002210420022802044178712001470D000B0B20022802082203200036020C20022000360208200041003602182000200236020C200020033602080F0B20052000360200200020043602182000200036020C200020003602080B0B00200010D280808000000BB50101037F23808080800041106B2201248080808000200028020C2102024002400240024020002802040E020001020B20020D0141012102410021030C020B20020D00200028020022022802042103200228020021020C010B20014180808080783602002001200036020C2001418F80808000200028021C22002D001C20002D001D10D380808000000B20012003360204200120023602002001419080808000200028021C22002D001C20002D001D10D380808000000B990101027F23808080800041106B2204248080808000410041002802F49EC08000220541016A3602F49EC08000024020054100480D000240024041002D00C8A2C080000D00410041002802C4A2C0800041016A3602C4A2C0800041002802F09EC08000417F4A0D010C020B200441086A200020011183808080008080808000000B410041003A00C8A2C080002002450D0010CE80808000000B000B0C00200020012902003703000B4A01037F4100210302402002450D000240034020002D0000220420012D00002205470D01200041016A2100200141016A21012002417F6A2202450D020C000B0B200420056B21030B20030BC10201087F02400240200241104F0D00200021030C010B2000410020006B41037122046A210502402004450D0020002103200121060340200320062D00003A0000200641016A2106200341016A22032005490D000B0B2005200220046B2207417C7122086A210302400240200120046A2209410371450D0020084101480D012009410374220641187121022009417C71220A41046A2101410020066B4118712104200A28020021060340200520062002762001280200220620047472360200200141046A2101200541046A22052003490D000C020B0B20084101480D0020092101034020052001280200360200200141046A2101200541046A22052003490D000B0B20074103712102200920086A21010B02402002450D00200320026A21050340200320012D00003A0000200141016A2101200341016A22032005490D000B0B20000B6E01067E2000200342FFFFFFFF0F832205200142FFFFFFFF0F8322067E22072003422088220820067E22062005200142208822097E7C22054220867C220A3703002000200820097E2005200654AD4220862005422088847C200A200754AD7C200420017E200320027E7C7C3703080B0BBE1E0100418080C0000BB41E110000000C00000004000000120000001300000014000000000000000000000001000000150000006120446973706C617920696D706C656D656E746174696F6E2072657475726E656420616E206572726F7220756E65787065637465646C792F72757374632F633266373463336639323861656235303366313562346539656635373738653737663330353862382F6C6962726172792F616C6C6F632F7372632F737472696E672E727300005F0010004B000000060A00000E00000000000000010000000100000016000000170000001400000004000000180000004572726F72557466384572726F7276616C69645F75705F746F6572726F725F6C656E46726F6D557466384572726F7262797465736572726F724E6F6E65536F6D657372632F6C69622E7273001D0110000A0000000C0000003D0000001D0110000A0000000D000000370000006361706163697479206F766572666C6F770000004801100011000000616C6C6F632F7372632F7261775F7665632E727364011000140000001800000005000000426F72726F774D75744572726F72616C726561647920626F72726F7765643A2096011000120000005B3D3D617373657274696F6E20606C6566742020726967687460206661696C65640A20206C6566743A200A2072696768743A2000B301100010000000C301100017000000DA0110000900000020726967687460206661696C65643A200A20206C6566743A20000000B301100010000000FC011000100000000C02100009000000DA011000090000000100000000000000EF0B100002000000000000000C00000004000000190000001A0000001B00000020202020207B202C20207B0A2C0A7D207D28280A5D636F72652F7372632F666D742F6E756D2E7273750210001300000066000000170000003078303030313032303330343035303630373038303931303131313231333134313531363137313831393230323132323233323432353236323732383239333033313332333333343335333633373338333934303431343234333434343534363437343834393530353135323533353435353536353735383539363036313632363336343635363636373638363937303731373237333734373537363737373837393830383138323833383438353836383738383839393039313932393339343935393639373938393966616C736574727565636F72652F7372632F736C6963652F6D656D6368722E7273006B03100018000000830000001E0000006B031000180000009F0000000900000072616E676520737461727420696E64657820206F7574206F662072616E676520666F7220736C696365206F66206C656E67746820A403100012000000B60310002200000072616E676520656E6420696E64657820E803100010000000B603100022000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202020202020202020202020202020202020202020203030303030303030303030303030303040404040400000000000000000000000000000001000000010000001600000063616C6C65642060526573756C743A3A756E77726170282960206F6E20616E2060457272602076616C7565456D707479496E76616C69644469676974506F734F766572666C6F774E65674F766572666C6F775A65726F5061727365496E744572726F726B696E64616C6C6F63617465200A0000007F0510000900000088051000010000006465616C6C6F6361746520009C0510000B00000088051000010000002F686F6D652F7077616E672F7761736D2F72782D7761736D2D70726F746F747970652F7872706C2D7374642F7372632F6C69622E72734163636F756E7444657374696E6174696F6E46696E697368416674657200B805100036000000690000001600000042616C616E636500B8051000360000007E000000160000007265656E7472616E7420696E69740000340610000E0000002F72757374632F633266373463336639323861656235303366313562346539656635373738653737663330353862382F6C6962726172792F636F72652F7372632F63656C6C2F6F6E63652E72730000004C0610004D0000002301000042000000000000000000000004000000040000001C0000001D0000000C000000040000001E0000001F000000200000002F727573742F646570732F646C6D616C6C6F632D302E322E362F7372632F646C6D616C6C6F632E7273617373657274696F6E206661696C65643A207073697A65203E3D2073697A65202B206D696E5F6F7665726865616400D806100029000000A804000009000000617373657274696F6E206661696C65643A207073697A65203C3D2073697A65202B206D61785F6F766572686561640000D806100029000000AE0400000D000000757365206F66207374643A3A7468726561643A3A63757272656E742829206973206E6F7420706F737369626C6520616674657220746865207468726561642773206C6F63616C206461746120686173206265656E2064657374726F7965647374642F7372632F7468726561642F6D6F642E727300DE07100015000000F1020000130000006661696C656420746F2067656E657261746520756E69717565207468726561642049443A20626974737061636520657868617573746564000408100037000000DE07100015000000C40400000D00000001000000000000007374642F7372632F696F2F62756666657265642F6C696E657772697465727368696D2E72736D6964203E206C656E000081081000090000005C081000250000000F01000029000000656E74697479206E6F7420666F756E647065726D697373696F6E2064656E696564636F6E6E656374696F6E2072656675736564636F6E6E656374696F6E207265736574686F737420756E726561636861626C656E6574776F726B20756E726561636861626C65636F6E6E656374696F6E2061626F727465646E6F7420636F6E6E65637465646164647265737320696E2075736561646472657373206E6F7420617661696C61626C656E6574776F726B20646F776E62726F6B656E2070697065656E7469747920616C7265616479206578697374736F7065726174696F6E20776F756C6420626C6F636B6E6F742061206469726563746F727969732061206469726563746F72796469726563746F7279206E6F7420656D707479726561642D6F6E6C792066696C6573797374656D206F722073746F72616765206D656469756D66696C6573797374656D206C6F6F70206F7220696E646972656374696F6E206C696D69742028652E672E2073796D6C696E6B206C6F6F70297374616C65206E6574776F726B2066696C652068616E646C65696E76616C696420696E70757420706172616D65746572696E76616C6964206461746174696D6564206F75747772697465207A65726F6E6F2073746F726167652073706163657365656B206F6E20756E7365656B61626C652066696C6566696C6573797374656D2071756F746120657863656564656466696C6520746F6F206C617267657265736F75726365206275737965786563757461626C652066696C652062757379646561646C6F636B63726F73732D646576696365206C696E6B206F722072656E616D65746F6F206D616E79206C696E6B73696E76616C69642066696C656E616D65617267756D656E74206C69737420746F6F206C6F6E676F7065726174696F6E20696E746572727570746564756E737570706F72746564756E657870656374656420656E64206F662066696C656F7574206F66206D656D6F72796F74686572206572726F72756E63617465676F72697A6564206572726F7220286F73206572726F7220290000000100000000000000910B10000B0000009C0B1000010000007374642F7372632F696F2F737464696F2E727300B80B1000130000002C030000140000006661696C6564207072696E74696E6720746F203A20000000DC0B100013000000EF0B100002000000B80B1000130000005D040000090000007374646F75747374642F7372632F696F2F6D6F642E72736120666F726D617474696E6720747261697420696D706C656D656E746174696F6E2072657475726E656420616E206572726F72207768656E2074686520756E6465726C79696E672073747265616D20646964206E6F740000002B0C1000560000001A0C100011000000280700001500000063616E6E6F74207265637572736976656C792061637175697265206D757465789C0C1000200000007374642F7372632F7379732F73796E632F6D757465782F6E6F5F746872656164732E7273C40C10002400000014000000090000007374642F7372632F73796E632F6F6E63652E7273F80C100014000000D9000000140000006C6F636B20636F756E74206F766572666C6F7720696E207265656E7472616E74206D757465787374642F7372632F73796E632F7265656E7472616E745F6C6F636B2E7273420D10001E000000220100002D0000006F7065726174696F6E207375636365737366756C6F6E652D74696D6520696E697469616C697A6174696F6E206D6179206E6F7420626520706572666F726D6564207265637572736976656C79840D100038000000100000001100000012000000100000001000000013000000120000000D0000000E000000150000000C0000000B00000015000000150000000F0000000E00000013000000260000003800000019000000170000000C000000090000000A0000001000000017000000190000000E0000000D00000014000000080000001B0000000E0000001000000016000000150000000B000000160000000D0000000B00000013000000A4081000B4081000C5081000D7081000E7081000F70810000A0910001C09100029091000370910004C0910005809100063091000780910008D0910009C091000AA091000BD091000E30910001B0A1000340A10004B0A1000570A1000600A10006A0A10007A0A1000910A1000AA0A1000B80A1000C50A1000D90A1000E10A1000FC0A10000A0B10001A0B1000300B1000450B1000500B1000660B1000730B10007E0B1000050000000C0000000B0000000B000000040000004305100048051000540510005F0510006A05100000C62E046E616D65000E0D7761736D5F6C69622E7761736D018E2E5800325F5A4E313068656C7065725F6C696238686F73745F6C6962357072696E74313768643363303132663765666531663636334501385F5A4E313068656C7065725F6C696238686F73745F6C6962313067657454784669656C64313768623836623962643665383439353163634502485F5A4E313068656C7065725F6C696238686F73745F6C6962323667657443757272656E744C6564676572456E7472794669656C64313768613461383030373262396335613761644503415F5A4E313068656C7065725F6C696238686F73745F6C696231396765744C6564676572456E7472794669656C64313768633661326634323734313038306331384504415F5A4E313068656C7065725F6C696238686F73745F6C69623139676574506172656E744C656467657254696D65313768373164336639663165383665663230374505315F5A4E313068656C7065725F6C696231327072696E745F6E756D626572313768343432633966366462343461613636374506305F5A4E34636F726533666D74336E756D33696D7037666D745F7536343137686435323166613665663661303637326145070E5F5F727573745F6465616C6C6F6308325F5A4E34636F726536726573756C743133756E777261705F6661696C6564313768663839396364303037373637303035314509475F5A4E34325F244C54242452462454247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D7431376831323761303230623939303135656661450A475F5A4E34325F244C54242452462454247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D7431376833326438343961303132376564636461450B445F5A4E34636F726535736C69636535696E6465783236736C6963655F73746172745F696E6465785F6C656E5F6661696C31376866393161336166653837623164343433450C385F5A4E34636F726533666D7439466F726D617474657231327061645F696E74656772616C31376863346561303761306263313335366334450D475F5A4E34325F244C54242452462454247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D7431376835626463353035616635323364323939450E5E5F5A4E34636F726533666D74336E756D35325F244C5424696D706C2475323024636F72652E2E666D742E2E44656275672475323024666F7224753230247573697A652447542433666D7431376836336361623039386234313233343130450F465F5A4E34636F726533666D7439466F726D6174746572323664656275675F7374727563745F6669656C64325F66696E697368313768313566616636373332666330396462644510305F5A4E34636F726533666D743557726974653977726974655F666D74313768396461663134643536353865323530364511265F5A4E34636F726533666D743577726974653137683933353534653462653731663263376145124C5F5A4E34636F726533707472343264726F705F696E5F706C616365244C5424616C6C6F632E2E737472696E672E2E537472696E6724475424313768323037363135366438643165323961384513535F5A4E34636F726533707472343964726F705F696E5F706C616365244C5424616C6C6F632E2E737472696E672E2E46726F6D557466384572726F7224475424313768323066303937633266353863396661374514525F5A4E35335F244C5424636F72652E2E666D742E2E4572726F72247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D743137686637616532383535623234396462633545155F5F5A4E35385F244C5424616C6C6F632E2E737472696E672E2E537472696E67247532302461732475323024636F72652E2E666D742E2E577269746524475424313077726974655F63686172313768323134333931636238656231353263364516435F5A4E35616C6C6F63377261775F7665633139526177566563244C54245424432441244754243867726F775F6F6E653137686661666363383935356337386333653545175A5F5A4E35616C6C6F63377261775F7665633230526177566563496E6E6572244C5424412447542437726573657276653231646F5F726573657276655F616E645F68616E646C653137686235633533636263666639643631653745185D5F5A4E35385F244C5424616C6C6F632E2E737472696E672E2E537472696E67247532302461732475323024636F72652E2E666D742E2E5772697465244754243977726974655F737472313768353939643965353738393436646439384519325F5A4E35616C6C6F63377261775F766563313166696E6973685F67726F7731376832313261636366633461323839333362451A0E5F5F727573745F7265616C6C6F631B435F5A4E38646C6D616C6C6F6338646C6D616C6C6F633137446C6D616C6C6F63244C54244124475424366D616C6C6F6331376865363539333961346338393763633135451C4B5F5A4E35616C6C6F63377261775F7665633230526177566563496E6E6572244C54244124475424313467726F775F616D6F7274697A656431376834623330643530396631323837393465451D335F5A4E35616C6C6F63377261775F766563313268616E646C655F6572726F7231376839376237646264306637326464373838451E5E5F5A4E36355F244C5424616C6C6F632E2E737472696E672E2E46726F6D557466384572726F72247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D7431376831323138613136316439333634386539451F5E5F5A4E36355F244C5424616C6C6F632E2E7665632E2E566563244C5424542443244124475424247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D74313768613636623539636339336533383537344520615F5A4E36385F244C5424636F72652E2E6E756D2E2E6572726F722E2E5061727365496E744572726F72247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D74313768633837363633386165616230633031664521475F5A4E34325F244C54242452462454247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D74313768393934323165636534623836333034384522465F5A4E34636F726533666D7439466F726D6174746572323664656275675F7374727563745F6669656C64315F66696E69736831376862653338633662346233306235386332452305726561647924675F5A4E34636F7265336E756D36305F244C5424696D706C2475323024636F72652E2E7374722E2E7472616974732E2E46726F6D5374722475323024666F722475323024753634244754243866726F6D5F737472313768356563336638363835643535346239644525415F5A4E38646C6D616C6C6F6338646C6D616C6C6F633137446C6D616C6C6F63244C5424412447542434667265653137683339383334616161616533653839343645262C5F5A4E34636F72653970616E69636B696E673570616E69633137683034656562393137646439336332323945274A5F5A4E38646C6D616C6C6F6338646C6D616C6C6F633137446C6D616C6C6F63244C542441244754243132756E6C696E6B5F6368756E6B3137683933346533646333383362623538613345284B5F5A4E38646C6D616C6C6F6338646C6D616C6C6F633137446C6D616C6C6F63244C542441244754243133646973706F73655F6368756E6B313768366530636363643435383635373436334529385F5A4E35616C6C6F63377261775F766563313763617061636974795F6F766572666C6F7731376834393964343832613965643537313561452A305F5A4E34636F72653970616E69636B696E673970616E69635F666D7431376836353430636362326435666463336162452B625F5A4E34636F726533666D74336E756D33696D7035325F244C5424696D706C2475323024636F72652E2E666D742E2E446973706C61792475323024666F7224753230247533322447542433666D7431376862663365303232383438336533373561452C11727573745F626567696E5F756E77696E642D465F5A4E34636F726533666D7439466F726D617474657231327061645F696E74656772616C313277726974655F70726566697831376861396134333238306236303036643132452E425F5A4E34636F726535736C69636535696E6465783234736C6963655F656E645F696E6465785F6C656E5F6661696C31376830383862353665323939626561616166452F2E5F5A4E34636F726533666D7439466F726D6174746572337061643137683437363961653338393337346363353145303B5F5A4E34636F72653970616E69636B696E6731396173736572745F6661696C65645F696E6E6572313768366637653332353764383461353034324531475F5A4E34325F244C54242452462454247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D74313768336136626161316262343761643230344532495F5A4E34345F244C54242452462454247532302461732475323024636F72652E2E666D742E2E446973706C61792447542433666D74313768376666346430623836303963323437324533585F5A4E35395F244C5424636F72652E2E666D742E2E417267756D656E7473247532302461732475323024636F72652E2E666D742E2E446973706C61792447542433666D743137683638613365386535303963616663363445345C5F5A4E36335F244C5424636F72652E2E63656C6C2E2E426F72726F774D75744572726F72247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D74313768313564336433343334626464636363384535395F5A4E34636F72653463656C6C323270616E69635F616C72656164795F626F72726F7765643137683331346235326131626334366266653445363C5F5A4E34636F726533666D74386275696C6465727331314465627567537472756374356669656C64313768333531353864666637643465616633354537675F5A4E36385F244C5424636F72652E2E666D742E2E6275696C646572732E2E50616441646170746572247532302461732475323024636F72652E2E666D742E2E5772697465244754243977726974655F737472313768383138623439653765363961323666644538695F5A4E36385F244C5424636F72652E2E666D742E2E6275696C646572732E2E50616441646170746572247532302461732475323024636F72652E2E666D742E2E577269746524475424313077726974655F63686172313768393437396266363162306130356661314539305F5A4E34636F726533666D743557726974653977726974655F666D7431376835393430386336353062386232313531453A325F5A4E34636F7265366F7074696F6E31336578706563745F6661696C656431376866303861393965326437333336633661453B625F5A4E34636F726533666D74336E756D33696D7035325F244C5424696D706C2475323024636F72652E2E666D742E2E446973706C61792475323024666F7224753230246933322447542433666D7431376863656439306337613633396330316464453C4F5F5A4E35305F244C5424244250246D7574247532302454247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D7431376834366435353230663839333131346633453D08616C6C6F636174653E2B5F5A4E3373746432696F35737464696F365F7072696E7431376838316334373231363630343666306663453F0A6465616C6C6F6361746540395F5A4E3373746436746872656164385468726561644964336E657739657868617573746564313768333336626637613134383830343463384541425F5A4E34636F72653463656C6C346F6E636531374F6E636543656C6C244C54245424475424387472795F696E69743137686365363362663232383531393165373145423E5F5A4E35616C6C6F633473796E633136417263244C54245424432441244754243964726F705F736C6F77313768656539616363636164396363313036394543355F5A4E34636F72653970616E69636B696E6731336173736572745F6661696C6564313768323332363266326333633738623661624544475F5A4E34325F244C54242452462454247532302461732475323024636F72652E2E666D742E2E44656275672447542433666D74313768653138373433383865303762666532354545595F5A4E36305F244C54247374642E2E696F2E2E6572726F722E2E4572726F72247532302461732475323024636F72652E2E666D742E2E446973706C61792447542433666D74313768393032373163376232613663653833394546595F5A4E36305F244C5424616C6C6F632E2E737472696E672E2E537472696E67247532302461732475323024636F72652E2E666D742E2E446973706C61792447542433666D743137686365343232366161316637323663316345477A5F5A4E34636F726533707472383864726F705F696E5F706C616365244C54247374642E2E696F2E2E57726974652E2E77726974655F666D742E2E41646170746572244C5424616C6C6F632E2E7665632E2E566563244C54247538244754242447542424475424313768313636646336316162303333346331654548495F5A4E337374643473796E63396F6E63655F6C6F636B31374F6E63654C6F636B244C542454244754243130696E697469616C697A65313768376635633530386461396531623039624549605F5A4E36315F244C54247374642E2E696F2E2E737464696F2E2E5374646F75744C6F636B2475323024617324753230247374642E2E696F2E2E5772697465244754243977726974655F616C6C31376832346238323631303436316432353666454A555F5A4E3373746432696F386275666665726564396275667772697465723138427566577269746572244C54245724475424313477726974655F616C6C5F636F6C6431376835383462646262616562306662316262454B735F5A4E38305F244C54247374642E2E696F2E2E57726974652E2E77726974655F666D742E2E41646170746572244C54245424475424247532302461732475323024636F72652E2E666D742E2E5772697465244754243977726974655F73747231376837666163663562633065666364383038454C325F5A4E34636F726533666D74355772697465313077726974655F6368617231376866306233626531656331396465356537454D305F5A4E34636F726533666D743557726974653977726974655F666D7431376866383830386630646630653435313364454E0A727573745F70616E69634F375F5A4E34636F72653570616E6963313250616E69635061796C6F61643661735F737472313768363134396631343264396132653032654550505F5A4E38646C6D616C6C6F6338646C6D616C6C6F633137446C6D616C6C6F63244C542441244754243138696E736572745F6C617267655F6368756E6B313768656665383531613237353832646137624551455F5A4E3373746433737973396261636B747261636532365F5F727573745F656E645F73686F72745F6261636B7472616365313768346463336465343764323230323162394552585F5A4E337374643970616E69636B696E673139626567696E5F70616E69635F68616E646C657232385F24753762242475376224636C6F73757265247537642424753764243137686531376133393737663839633131373845533B5F5A4E337374643970616E69636B696E673230727573745F70616E69635F776974685F686F6F6B31376837373665373963396636353931626535455483015F5A4E39395F244C54247374642E2E70616E69636B696E672E2E626567696E5F70616E69635F68616E646C65722E2E5374617469635374725061796C6F6164247532302461732475323024636F72652E2E70616E69632E2E50616E69635061796C6F6164244754243661735F737472313768656233663732326432323465343266384555066D656D636D7056066D656D63707957085F5F6D756C746933071201000F5F5F737461636B5F706F696E746572090A0100072E726F6461746100550970726F64756365727302086C616E6775616765010452757374000C70726F6365737365642D62790105727573746325312E38332E302D6E696768746C79202863326637346333663920323032342D30392D30392900490F7461726765745F6665617475726573042B0A6D756C746976616C75652B0F6D757461626C652D676C6F62616C732B0F7265666572656E63652D74797065732B087369676E2D657874" } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2CE363897F39866A6F045785019BD5893B7EFF43024A00D3A044CD8596D32FEC", "NewFields": { "Owner": "rQE6iDVinSGsk9jdGS8rbwHste1VkhyCo6", "RootIndex": "2CE363897F39866A6F045785019BD5893B7EFF43024A00D3A044CD8596D32FEC" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "B25B7B94E9F049F9398C693898DDF6284B9E87EEFBAD0EB138DD4157DC8D435D", "PreviousTxnID": "2573FFB1BD7D97BEDABC545BB6F998E7311FD5B53F8847950CA53A2636491DB4", "PreviousTxnLgrSeq": 243659 } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C8CEBBA27C656047179FA43935498EA64967589A8F72523427A688763BB66402", "NewFields": { "Owner": "rnP1xXwRYNxuxfMsyzQuJEjP35AXaV1zF6", "RootIndex": "C8CEBBA27C656047179FA43935498EA64967589A8F72523427A688763BB66402" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rnP1xXwRYNxuxfMsyzQuJEjP35AXaV1zF6", "Balance": "99890000", "Flags": 0, "OwnerCount": 2, "Sequence": 243659 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CF6154867E065C1B691CBC3E91B9D574AAE896BC83227652A6B69A3819B5D060", "PreviousFields": { "Balance": "100000000", "OwnerCount": 0, "Sequence": 243658 }, "PreviousTxnID": "37E2379120A1DA0A3861840BFFEB5725919A73659FF327F4B695338B95F90B3D", "PreviousTxnLgrSeq": 243658 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/Description.tsx ================================================ import { useTranslation, Trans } from 'react-i18next' import type { EscrowFinish } from 'xrpl' import { findNode } from '../../../transactionUtils' import { Account } from '../../Account' import { TransactionDescriptionComponent, TransactionDescriptionProps, } from '../types' import { RouteLink } from '../../../routing' import { TRANSACTION_ROUTE } from '../../../../App/routes' import { Amount } from '../../Amount' import { formatAmount, isXRP, } from '../../../../../rippled/lib/txSummary/formatAmount' const Description: TransactionDescriptionComponent = ( props: TransactionDescriptionProps, ) => { const { t } = useTranslation() const { data } = props const deleted: any = findNode(data.meta, 'DeletedNode', 'Escrow') if (deleted == null) { return null } return ( <>
    {t('escrow_completion_desc')}
    The escrowed amount of was delivered to {isXRP(deleted.FinalFields.Amount) && deleted.FinalFields.Destination === data.tx.Account && ( {' '} ( {' '} {t('escrow_after_transaction_cost')}) )}
    The escrow was created by with transaction {`${deleted.FinalFields.PreviousTxnID.substring(0, 6)}...`} {data.tx.Fulfillment && (
    {t('escrow_finish_fulfillment_desc')} {data.tx.Fulfillment}
    )} ) } export { Description } ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { RouteLink } from '../../../routing' import { TRANSACTION_ROUTE } from '../../../../App/routes' import { CredentialIDs } from '../CredentialIDs' const Simple: TransactionSimpleComponent = (props: TransactionSimpleProps) => { const { t } = useTranslation() const { data } = props const { owner, sequence, previousTx, destination, amount = {}, condition, fulfillment, computationAllowance, credentialIDs, } = data.instructions return ( <> {` - ${sequence}`} {condition && ( )} {fulfillment && ( {fulfillment} )} {amount.amount && ( )} {destination && ( )} {computationAllowance && ( {computationAllowance} {t('gas')} )} {previousTx && ( {previousTx} )} {credentialIDs && credentialIDs.length > 0 && ( )} ) } export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' export const TableDetail = (props: any) => { const { t } = useTranslation() const { instructions } = props const { amount, owner, sequence, fulfillment, ticketSequence } = instructions return (
    {owner && (
    {t('finish_escrow')} {owner} {' '} -{sequence !== 0 ? sequence : `${ticketSequence} (Ticket)`}
    )} {amount && (
    {t('amount')}
    )} {fulfillment && (
    {t('fulfillment')} {fulfillment}
    )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { Description } from './Description' import { parser } from './parser' import { TableDetail } from './TableDetail' export const EscrowFinishTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.FINISH, category: TransactionCategory.PAYMENT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/parser.ts ================================================ import type { EscrowFinish, TransactionMetadata } from 'xrpl' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { findNode } from '../../../transactionUtils' const findNodeFinalFields = (meta: TransactionMetadata) => { const node = findNode(meta, 'DeletedNode', 'Escrow') return node ? node.FinalFields : {} } export function parser(tx: EscrowFinish, meta: TransactionMetadata) { const escrow = findNodeFinalFields(meta) return { sequence: tx.OfferSequence, owner: tx.Owner, previousTx: escrow.PreviousTxnID, amount: escrow.Amount ? formatAmount(escrow.Amount) : undefined, destination: escrow.Destination && escrow.Destination !== escrow.Account ? escrow.Destination : undefined, condition: escrow.Condition, fulfillment: tx.Fulfillment, computationAllowance: tx.ComputationAllowance, credentialIDs: (tx as any).CredentialIDs, // Cast to any to include CredentialIDs } } ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/test/EscrowFinishDescription.test.tsx ================================================ import { useQuery } from 'react-query' import mockEscrowFinish from './mock_data/EscrowFinish.json' import { Description } from '../Description' import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test' const renderComponent = createDescriptionRenderFactory(Description, i18n) jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) function getTestByName(name: string) { return mockEscrowFinish[name] } describe('EscrowFinishDescription', () => { it('renders description for EscrowFinish', () => { const { container, unmount } = renderComponent( getTestByName('EscrowFinish having XRP escrowed'), ) expect(container.innerHTML).toBe( '
    Completion was triggered by
    The escrowed amount of 0.0154 XRP was delivered to (0.015388 XRP after transaction cost)
    The escrow was created by with transaction 3E2E75...
    The escrow condition is fulfilled by Fulfillment
    ', ) unmount() }) it('test XRP amount', () => { const { container, unmount } = renderComponent( getTestByName('EscrowFinish having XRP escrowed'), ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( `The escrowed amount of \uE9000.0154 XRP was delivered to r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8 (\uE9000.015388 XRP after transaction cost)`, ) unmount() }) it('test IOU amount', () => { const { container, unmount } = renderComponent( getTestByName('EscrowFinish having IOU escrowed'), ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( 'The escrowed amount of 1.00 ZZZ.rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8 was delivered to rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N', ) unmount() }) it('test MPT amount', () => { const data = { assetScale: 4, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent( getTestByName('EscrowFinish having MPT escrowed'), ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( 'The escrowed amount of 0.0001 0044E493C9FB70ADC1A604A5792643A38CA5887219C21C8C was delivered to rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/test/EscrowFinishSimple.test.tsx ================================================ import { useQuery } from 'react-query' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockEscrowFinish from './mock_data/EscrowFinish.json' import mockEscrowFinishCompAllow from './mock_data/EscrowFinishComputationAllowance.json' import mockEscrowFinishCredentialIDs from './mock_data/EscrowFinishWithCredentialIDs.json' const renderComponent = createSimpleRenderFactory(Simple) jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) function getTestByName(name: string) { return mockEscrowFinish[name] } describe('EscrowFinishSimple', () => { it('renders with an expiration and offer', () => { const { container, unmount } = renderComponent( getTestByName('EscrowFinish having XRP escrowed'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent(`\uE9000.0154 XRP`) expect( container.querySelector('[data-testid="escrow-tx"] .value'), ).toHaveTextContent( `3E2E755FA75FF1020C39E2ECC407E9F1C0E49A7229EDD15FF93B9F869878F1CC`, ) unmount() }) it('renders a smart escrow finish properly', () => { const { container, unmount } = renderComponent(mockEscrowFinishCompAllow) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent(`\uE9000.10 XRP`) expect( container.querySelector('[data-testid="escrow-tx"] .value'), ).toHaveTextContent( `2C44A096646F815F9072D8FB3954B2B9025C21AE614CE96CB2D2C4907F9B2A1D`, ) expect( container.querySelector('[data-testid="computation-allowance"] .value'), ).toHaveTextContent('1000000 gas') unmount() }) it('test XRP amount', () => { const { container, unmount } = renderComponent( getTestByName('EscrowFinish having XRP escrowed'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent(`\uE9000.0154 XRP`) unmount() }) it('test IOU amount', () => { const { container, unmount } = renderComponent( getTestByName('EscrowFinish having IOU escrowed'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent('1.00 ZZZ.rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8') unmount() }) it('test MPT amount', () => { const data = { assetScale: 4, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent( getTestByName('EscrowFinish having MPT escrowed'), ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent( '0.0001 0044E493C9FB70ADC1A604A5792643A38CA5887219C21C8C', ) unmount() }) it('renders with CredentialIDs', () => { const { container, unmount } = renderComponent( mockEscrowFinishCredentialIDs, ) expect( container.querySelector('[data-testid="escrow-amount"] .value'), ).toHaveTextContent(`\uE9000.0154 XRP`) expect( container.querySelector('[data-testid="credential-id-0"]'), ).toBeInTheDocument() expect( container.querySelector('[data-testid="credential-id-1"]'), ).toBeInTheDocument() expect( container.querySelector('[data-testid="credential-id-0"] .value'), ).toHaveTextContent( '7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955', ) expect( container.querySelector('[data-testid="credential-id-1"] .value'), ).toHaveTextContent( '8B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A956', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/test/EscrowFinishTableDetail.test.tsx ================================================ import { useQuery } from 'react-query' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockEscrowFinish from './mock_data/EscrowFinish.json' import i18n from '../../../../../../i18n/testConfigEnglish' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) function getTestByName(name: string) { return mockEscrowFinish[name] } describe('EscrowFinishTableDetail', () => { it('renders EscrowFinish without crashing', () => { const { container, unmount } = renderComponent( getTestByName('EscrowFinish having XRP escrowed'), ) expect( container.querySelector('[data-testid="escrow-account"]'), ).toHaveTextContent(`finish escrowr4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8 -28`) expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( `\uE9000.0154 XRP`, ) expect( container.querySelector('[data-testid="escrow-fulfillment"]'), ).toHaveTextContent(`fulfillment Fulfillment`) unmount() }) it('test XRP amount', () => { const { container, unmount } = renderComponent( getTestByName('EscrowFinish having XRP escrowed'), ) expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( `\uE9000.0154 XRP`, ) unmount() }) it('test IOU amount', () => { const { container, unmount } = renderComponent( getTestByName('EscrowFinish having IOU escrowed'), ) expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( `1.00 ZZZ.rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8`, ) unmount() }) it('test MPT amount', () => { const data = { assetScale: 4, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent( getTestByName('EscrowFinish having MPT escrowed'), ) expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( `0.0001 0044E493C9FB70ADC1A604A5792643A38CA5887219C21C8C`, ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/test/mock_data/EscrowFinish.json ================================================ { "EscrowFinish having XRP escrowed": { "hash": "985F9CA6FD2256D5C59F8B2CC1F51BDB2F12EB7C58CB2CCA7E4A74161432B7C4", "ledger_index": 37467862, "date": "2018-03-25T00:45:12+00:00", "tx": { "TransactionType": "EscrowFinish", "Flags": 2147483648, "Fulfillment": "Fulfillment", "Sequence": 31, "OfferSequence": 28, "LastLedgerSequence": 37467863, "Fee": "12", "SigningPubKey": "0380BB0305B1192D1F20E2E15C93E99434F8DF52ED72FC18FA4F69671B578691DF", "TxnSignature": "30450221009254A6DE4960F185E19A6717B000EB542C1340BABB5E1C0447D743FB00A026A50220232DFE95819DA27B789DF47359C3EDD29FC539041EFF8526185D42485CF886A6", "Account": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8", "Owner": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8" }, "meta": { "TransactionIndex": 23, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37467849, "PreviousTxnID": "C730DAD26F068100CDD7F5CF17CFB7EA729D3000BFDF92BBC36590C4FE906866", "LedgerIndex": "70AD67C13AB61B6FCAF9CD65862478E079B05C772D65F60179EC8E7E7701740E", "PreviousFields": { "Sequence": 31, "OwnerCount": 4, "Balance": "59916121" }, "FinalFields": { "Flags": 0, "Sequence": 32, "OwnerCount": 3, "Balance": "59931509", "Account": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8" } } }, { "ModifiedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7C3EC8879AD0E00BAE0957F7A5F1DBDD0E84F04202912AF9910296CD6FC427E0", "FinalFields": { "Flags": 0, "RootIndex": "7C3EC8879AD0E00BAE0957F7A5F1DBDD0E84F04202912AF9910296CD6FC427E0", "Owner": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8" } } }, { "DeletedNode": { "LedgerEntryType": "Escrow", "LedgerIndex": "C4B2935F1E8BBCF7C10FBF5E3C98897DE37A2DA6C6F3E3A591B55D1A6DC8FDEF", "FinalFields": { "Flags": 0, "PreviousTxnLgrSeq": 37466547, "DestinationTag": 0, "FinishAfter": 575249422, "OwnerNode": "0000000000000000", "PreviousTxnID": "3E2E755FA75FF1020C39E2ECC407E9F1C0E49A7229EDD15FF93B9F869878F1CC", "Amount": "15400", "Account": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8", "Destination": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8" } } } ], "TransactionResult": "tesSUCCESS" } }, "EscrowFinish having IOU escrowed": { "tx": { "Account": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "Fee": "1", "Flags": 0, "LastLedgerSequence": 4469192, "OfferSequence": 4466551, "Owner": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Sequence": 4467161, "SigningPubKey": "EDDB3F5BC950C1DBCEB6C9C10B7E70FB333618F944447F1DFD9C2D5543B81A2BCB", "TransactionType": "EscrowFinish", "TxnSignature": "A7FC7A08C03AD4F3F08DDBC7489AE755AB162B4645E1AD365B481122D1EAE4E8ECBCFA9AC2FC010B7CA01AB18EDB12B09E6FE08DFF0A33813DDF78681E8F9401", "ledger_index": 4469174, "ctid": "C04431B600050002", "date": 805842630 }, "hash": "5D39379E6FD59BB84FA908AFC032271894E25FC65DBAE465B05A5EECA65B01FC", "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "RootIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217", "PreviousTxnID": "94869A575F0B48A8AFC6628D83241FB13CD082AD35D172103E26B79F77F6C179", "PreviousTxnLgrSeq": 4469165 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "RootIndex": "1F882E04D2F24B427C89A1B79A2C26C94A3387CF60228C86E9C027D05FFED1FF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1F882E04D2F24B427C89A1B79A2C26C94A3387CF60228C86E9C027D05FFED1FF", "PreviousTxnID": "94869A575F0B48A8AFC6628D83241FB13CD082AD35D172103E26B79F77F6C179", "PreviousTxnLgrSeq": 4469165 } }, { "DeletedNode": { "FinalFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Amount": { "currency": "ZZZ", "issuer": "rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8", "value": "1" }, "CancelAfter": 805842790, "Destination": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "DestinationNode": "0", "FinishAfter": 805842600, "Flags": 0, "IssuerNode": "0", "OwnerNode": "0", "PreviousTxnID": "94869A575F0B48A8AFC6628D83241FB13CD082AD35D172103E26B79F77F6C179", "PreviousTxnLgrSeq": 4469165 }, "LedgerEntryType": "Escrow", "LedgerIndex": "771DFC8F43D0F9DCE2313A26D6F867EEDB3595AA46B46CA076E26CDCFC369167" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8", "RootIndex": "783570F9840AABAE60F077CA184FA9686DAADC12BF3270514C1931CBC0DC8452" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "783570F9840AABAE60F077CA184FA9686DAADC12BF3270514C1931CBC0DC8452", "PreviousTxnID": "94869A575F0B48A8AFC6628D83241FB13CD082AD35D172103E26B79F77F6C179", "PreviousTxnLgrSeq": 4469165 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "ZZZ", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-101" }, "Flags": 131072, "HighLimit": { "currency": "ZZZ", "issuer": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "value": "10000" }, "HighNode": "0", "LowLimit": { "currency": "ZZZ", "issuer": "rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8F7710AF2382180CAE97B13555D3244970B2B4E7AB580929C2EA8164612086D4", "PreviousFields": { "Balance": { "currency": "ZZZ", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-100" } }, "PreviousTxnID": "315DFAFF176C555C5176CA91B9A646B79A9064D24018180CCB7368268B39A134", "PreviousTxnLgrSeq": 4469163 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "Balance": "99999998", "Flags": 0, "OwnerCount": 3, "Sequence": 4467162 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B9E2BAE404EEADECEE678349CD2639831A6766AE15616F570F5B345868422912", "PreviousFields": { "Balance": "99999999", "Sequence": 4467161 }, "PreviousTxnID": "94869A575F0B48A8AFC6628D83241FB13CD082AD35D172103E26B79F77F6C179", "PreviousTxnLgrSeq": 4469165 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Balance": "99999907", "Flags": 0, "OwnerCount": 13, "Sequence": 4466552 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1F036A2B38438CE1D39AC1ED3682CE46703352616B6EA8853F4FB25F4684313", "PreviousFields": { "OwnerCount": 14 }, "PreviousTxnID": "94869A575F0B48A8AFC6628D83241FB13CD082AD35D172103E26B79F77F6C179", "PreviousTxnLgrSeq": 4469165 } } ], "TransactionIndex": 5, "TransactionResult": "tesSUCCESS" }, "validated": true, "ledger_index": 4469174, "ledger_hash": "5E8A7C3FD44E846D6096ABB124FD4ACD451E4616261EC6CA03C562A580E6D90B", "close_time_iso": "2025-07-14T21:10:30Z", "ctid": "C04431B600050002" }, "EscrowFinish having MPT escrowed": { "tx": { "Account": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "Fee": "1", "Flags": 0, "LastLedgerSequence": 4543614, "OfferSequence": 4466568, "Owner": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Sequence": 4467166, "SigningPubKey": "EDDB3F5BC950C1DBCEB6C9C10B7E70FB333618F944447F1DFD9C2D5543B81A2BCB", "TransactionType": "EscrowFinish", "TxnSignature": "028C429A596E4AA857D9A728B7124423DF3DD816DB10353C59B35C240197091472E2195F1C0A3BEBA26BE8D7E0E71CD20F54DE7B3D93447998DCDB2A6710470D", "ledger_index": 4543596, "ctid": "C045546C00000002", "date": 806076750 }, "hash": "E1FDD95D1303DEF2794D49913CDE7CD91EB3FFE0FF35C7AB2E7DC7BD8EDE7851", "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "RootIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "02968F27FCD2E454F5146A6B5768F55C1FCF659A858265406B7855AD2E364217", "PreviousTxnID": "85844936B005ECFA2A39B2DBB92EED81AF9DF393E9D6C2A207AB5E34F6C66550", "PreviousTxnLgrSeq": 4543586 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "RootIndex": "1F882E04D2F24B427C89A1B79A2C26C94A3387CF60228C86E9C027D05FFED1FF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1F882E04D2F24B427C89A1B79A2C26C94A3387CF60228C86E9C027D05FFED1FF", "PreviousTxnID": "85844936B005ECFA2A39B2DBB92EED81AF9DF393E9D6C2A207AB5E34F6C66550", "PreviousTxnLgrSeq": 4543586 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Flags": 0, "MPTAmount": "99", "MPTokenIssuanceID": "0044E493C9FB70ADC1A604A5792643A38CA5887219C21C8C", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "5A29E93B3B281F0271A7C4E50B9E017CB3836C7FFA203827976A9738B1F3F029", "PreviousFields": { "LockedAmount": "1" }, "PreviousTxnID": "85844936B005ECFA2A39B2DBB92EED81AF9DF393E9D6C2A207AB5E34F6C66550", "PreviousTxnLgrSeq": 4543586 } }, { "DeletedNode": { "FinalFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Amount": { "mpt_issuance_id": "0044E493C9FB70ADC1A604A5792643A38CA5887219C21C8C", "value": "1" }, "CancelAfter": 806076910, "Destination": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "DestinationNode": "0", "FinishAfter": 806076720, "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "85844936B005ECFA2A39B2DBB92EED81AF9DF393E9D6C2A207AB5E34F6C66550", "PreviousTxnLgrSeq": 4543586 }, "LedgerEntryType": "Escrow", "LedgerIndex": "B24F0F56AAC834BB12BD56C6BF78FC35E159EC135EB1C323D70B726A99F19D7B" } }, { "ModifiedNode": { "FinalFields": { "Account": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "Balance": "99999993", "Flags": 0, "OwnerCount": 6, "Sequence": 4467167 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B9E2BAE404EEADECEE678349CD2639831A6766AE15616F570F5B345868422912", "PreviousFields": { "Balance": "99999994", "OwnerCount": 5, "Sequence": 4467166 }, "PreviousTxnID": "85844936B005ECFA2A39B2DBB92EED81AF9DF393E9D6C2A207AB5E34F6C66550", "PreviousTxnLgrSeq": 4543586 } }, { "ModifiedNode": { "FinalFields": { "Flags": 40, "Issuer": "rKQzpv6jvPeRSULjdwWZgiCZEUNpkSXzYH", "MPTokenMetadata": "7B0A202020202020227469636B6572223A20225442494C4C222C0A202020202020226E616D65223A2022542D42696C6C205969656C6420546F6B656E222C0A2020202020202264657363223A202241207969656C642D62656172696E6720737461626C65636F696E206261636B65642062792073686F72742D7465726D20552E532E205472656173757269657320616E64206D6F6E6579206D61726B657420696E737472756D656E74732E222C0A2020202020202269636F6E223A202268747470733A2F2F6578616D706C652E6F72672F7462696C6C2D69636F6E2E706E67222C0A2020202020202261737365745F636C617373223A2022727761222C0A2020202020202261737365745F737562636C617373223A20227472656173757279222C0A202020202020226973737565725F6E616D65223A20224578616D706C65205969656C6420436F2E222C0A2020202020202275726C73223A205B0A20202020202020207B0A202020202020202020202275726C223A202268747470733A2F2F6578616D706C657969656C642E636F2F7462696C6C222C0A202020202020202020202274797065223A202277656273697465222C0A20202020202020202020227469746C65223A202250726F647563742050616765220A20202020202020207D2C0A20202020202020207B0A202020202020202020202275726C223A202268747470733A2F2F6578616D706C657969656C642E636F2F646F6373222C0A202020202020202020202274797065223A2022646F6373222C0A20202020202020202020227469746C65223A20225969656C6420546F6B656E20446F6373220A20202020202020207D0A2020202020205D2C0A202020202020226164646974696F6E616C5F696E666F223A207B0A202020202020202022696E7465726573745F72617465223A2022352E303025222C0A202020202020202022696E7465726573745F74797065223A20227661726961626C65222C0A2020202020202020227969656C645F736F75726365223A2022552E532E2054726561737572792042696C6C73222C0A2020202020202020226D617475726974795F64617465223A2022323034352D30362D3330222C0A2020202020202020226375736970223A2022393132373936525830220A2020202020207D0A202020207D", "MaximumAmount": "50000000", "OutstandingAmount": "100", "OwnerNode": "0", "Sequence": 4514963 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "BE5DFE70E39F527214CDCA714F2335F99447E6346F1C6901958E7D8123DF58C2", "PreviousFields": { "LockedAmount": "1" }, "PreviousTxnID": "85844936B005ECFA2A39B2DBB92EED81AF9DF393E9D6C2A207AB5E34F6C66550", "PreviousTxnLgrSeq": 4543586 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDtpgHpsUFu2dHC6fMZnwgZvNEDZ9MG9YK", "Balance": "99999890", "Flags": 0, "OwnerCount": 22, "Sequence": 4466569 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1F036A2B38438CE1D39AC1ED3682CE46703352616B6EA8853F4FB25F4684313", "PreviousFields": { "OwnerCount": 23 }, "PreviousTxnID": "85844936B005ECFA2A39B2DBB92EED81AF9DF393E9D6C2A207AB5E34F6C66550", "PreviousTxnLgrSeq": 4543586 } }, { "CreatedNode": { "LedgerEntryType": "MPToken", "LedgerIndex": "C2A9A6F4DE55540E9315D83E2CCA1D4A00CE1A16AAD7EE8B621F795E4DFEC0A9", "NewFields": { "Account": "rHVkbnz2ZLVUCPugCbLsXbCsayrJARLq1N", "MPTAmount": "1", "MPTokenIssuanceID": "0044E493C9FB70ADC1A604A5792643A38CA5887219C21C8C" } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true, "ledger_index": 4543596, "ledger_hash": "4941D35B768EAC6F3B57CC4BACEF864B76BFEF8B25B589872318BEAB6D62532E", "close_time_iso": "2025-07-17T14:12:30Z", "ctid": "C045546C00000002" } } ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/test/mock_data/EscrowFinishComputationAllowance.json ================================================ { "tx": { "Account": "rPPLRQwB3KGvpfDMABZucA8ifJJcvQhHD3", "ComputationAllowance": 1000000, "Fee": "10000", "Flags": 0, "LastLedgerSequence": 1450713, "NetworkID": 2002, "OfferSequence": 1450673, "Owner": "rBgoQAw3UnosNycPuoYYAWRE2oT3JcZq9P", "Sequence": 460749, "SigningPubKey": "ED9EBC89633B128D883BF098E05ADE6ED58918C045798E6953BED4E862A5F28479", "TransactionType": "EscrowFinish", "TxnSignature": "FE9A56652DEBC7CD0B2A58DB9E5C9EA346B79DEF4D3674553E328248405272541F9A7350977BDBDFAA5BCA09F2A2FF4055733C9FEF4327CBC3742D74135B6F00" }, "ctid": "C01622C7000007D2", "date": 800467292, "hash": "DA610A7C898AF311D8DCEE0DBE61E6C2061829FBEB3309DE90171B868423EF03", "inLedger": 1450695, "ledger_index": 1450695, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rs4KGMcFw68vcShciFUztZSRjnTq13oDg3", "RootIndex": "0B77DDBCBE8E3043DD721BB0511C0A1985B771FD4921924EF1E0C0ECC13FF449" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0B77DDBCBE8E3043DD721BB0511C0A1985B771FD4921924EF1E0C0ECC13FF449" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBgoQAw3UnosNycPuoYYAWRE2oT3JcZq9P", "RootIndex": "1204773E9124B2913E653E50175465D42C9DB4C90EF17890D110C79C00951E17" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1204773E9124B2913E653E50175465D42C9DB4C90EF17890D110C79C00951E17" } }, { "ModifiedNode": { "FinalFields": { "Account": "rPPLRQwB3KGvpfDMABZucA8ifJJcvQhHD3", "Balance": "99830000", "Flags": 0, "OwnerCount": 0, "Sequence": 460750 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "501280F3B041963B8DFD84A75B36D5E031E45E23A870300E611DA2BEBD611782", "PreviousFields": { "Balance": "99840000", "Sequence": 460749 }, "PreviousTxnID": "99057D7AA54CF98AB880D78C299644254B9797F47BBEA99C18BCBF22030BA759", "PreviousTxnLgrSeq": 1136863 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBgoQAw3UnosNycPuoYYAWRE2oT3JcZq9P", "Balance": "99890000", "Flags": 0, "OwnerCount": 0, "Sequence": 1450674 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5AB010023D40BD0069ABA7C535574816B818953E12148650C57AB0EFDF8988D1", "PreviousFields": { "OwnerCount": 2 }, "PreviousTxnID": "2C44A096646F815F9072D8FB3954B2B9025C21AE614CE96CB2D2C4907F9B2A1D", "PreviousTxnLgrSeq": 1450675 } }, { "DeletedNode": { "FinalFields": { "Account": "rBgoQAw3UnosNycPuoYYAWRE2oT3JcZq9P", "Amount": "100000", "CancelAfter": 800469231, "Data": "70000000", "Destination": "rs4KGMcFw68vcShciFUztZSRjnTq13oDg3", "DestinationNode": "0", "FinishAfter": 800467236, "FinishFunction": "0061736D010000000105016000017F02190108686F73745F6C69620C6765744C656467657253716E0000030201000405017001010105030100100619037F01418080C0000B7F00418080C0000B7F00418080C0000B072D04066D656D6F7279020005726561647900010A5F5F646174615F656E6403010B5F5F686561705F6261736503020A0D010B0010808080800041044A0B0071046E616D6500100F6C65646765725F73716E2E7761736D014402003A5F5A4E31306C65646765725F73716E38686F73745F6C696231326765744C656467657253716E313768316433393063353137643539356635644501057265616479071201000F5F5F737461636B5F706F696E74657200550970726F64756365727302086C616E6775616765010452757374000C70726F6365737365642D62790105727573746325312E38362E302D6E696768746C79202862336233363861313820323032352D30312D30352900490F7461726765745F6665617475726573042B0A6D756C746976616C75652B0F6D757461626C652D676C6F62616C732B0F7265666572656E63652D74797065732B087369676E2D657874", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "2C44A096646F815F9072D8FB3954B2B9025C21AE614CE96CB2D2C4907F9B2A1D", "PreviousTxnLgrSeq": 1450675 }, "LedgerEntryType": "Escrow", "LedgerIndex": "5C27F9721E461014117FC364A15D81B1761CA58CBBAB0A94823A9970586DA5B4" } }, { "ModifiedNode": { "FinalFields": { "Account": "rs4KGMcFw68vcShciFUztZSRjnTq13oDg3", "Balance": "100100000", "Flags": 0, "OwnerCount": 0, "Sequence": 1450674 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "67767DBD166A61727DCB28A07CC208A11DB7B7A5BB49BB63AFD473766EF688A8", "PreviousFields": { "Balance": "100000000" }, "PreviousTxnID": "2C44A096646F815F9072D8FB3954B2B9025C21AE614CE96CB2D2C4907F9B2A1D", "PreviousTxnLgrSeq": 1450675 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/EscrowFinish/test/mock_data/EscrowFinishWithCredentialIDs.json ================================================ { "hash": "985F9CA6FD2256D5C59F8B2CC1F51BDB2F12EB7C58CB2CCA7E4A74161432B7C4", "ledger_index": 37467862, "date": "2018-03-25T00:45:12+00:00", "tx": { "TransactionType": "EscrowFinish", "Flags": 2147483648, "Fulfillment": "Fulfillment", "Sequence": 31, "OfferSequence": 28, "LastLedgerSequence": 37467863, "Fee": "12", "SigningPubKey": "0380BB0305B1192D1F20E2E15C93E99434F8DF52ED72FC18FA4F69671B578691DF", "TxnSignature": "30450221009254A6DE4960F185E19A6717B000EB542C1340BABB5E1C0447D743FB00A026A50220232DFE95819DA27B789DF47359C3EDD29FC539041EFF8526185D42485CF886A6", "Account": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8", "Owner": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8", "CredentialIDs": [ "7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955", "8B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A956" ] }, "meta": { "TransactionIndex": 23, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37467849, "PreviousTxnID": "C730DAD26F068100CDD7F5CF17CFB7EA729D3000BFDF92BBC36590C4FE906866", "LedgerIndex": "70AD67C13AB61B6FCAF9CD65862478E079B05C772D65F60179EC8E7E7701740E", "PreviousFields": { "Sequence": 31, "OwnerCount": 4, "Balance": "59916121" }, "FinalFields": { "Flags": 0, "Sequence": 32, "OwnerCount": 3, "Balance": "59931509", "Account": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8" } } }, { "DeletedNode": { "LedgerEntryType": "Escrow", "LedgerIndex": "89C78DC2F504E3C8CA91C7BE9EA53CA7F72F44A30F8F57CFA8CF8BA90ADC6826", "FinalFields": { "Destination": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8", "Amount": "15400", "PreviousTxnLgrSeq": 37467849, "Account": "r4UDXF4nL7Tgss8uQxn39cCocd8GnGyXS8", "PreviousTxnID": "3E2E755FA75FF1020C39E2ECC407E9F1C0E49A7229EDD15FF93B9F869878F1CC" } } } ], "TransactionResult": "tesSUCCESS", "delivered_amount": "15400" } } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { t } = useTranslation() const { loanBrokerID, calculatedAmount } = data.instructions return ( <> {loanBrokerID && ( {loanBrokerID} )} {calculatedAmount && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { Amount } from '../../Amount' export const TableDetail = ({ instructions }: TransactionTableDetailProps) => { const { t } = useTranslation() const { amount, calculatedAmount, loanBrokerID } = instructions const displayAmount = calculatedAmount || amount return (
    {t('claws_back')} {displayAmount && } {t('first_loss_capital')} {t('from')} {t('loan_broker_id')}{' '} {loanBrokerID}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' import { parser } from './parser' export const LoanBrokerCoverClawbackTransaction: TransactionMapping = { Simple, TableDetail, parser, action: TransactionAction.CANCEL, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/parser.ts ================================================ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { LoanBrokerCoverClawback } from './types' // XRPL neutral issuer address used in RippleState balance objects const XRPL_NEUTRAL_ISSUER = 'rrrrrrrrrrrrrrrrrrrrBZbvji' export function parser(tx: LoanBrokerCoverClawback, meta: any) { // LoanBrokerCoverClawback cannot clawback XRP according to XLS-66 specification // If tx.Amount is a string (XRP), just return it as-is without processing if (typeof tx.Amount === 'string') { return { loanBrokerID: tx.LoanBrokerID, amount: formatAmount(tx.Amount), calculatedAmount: formatAmount(tx.Amount), loanBrokerData: undefined, } } const loanBrokerNode = meta.AffectedNodes?.find( (node: any) => (node.ModifiedNode && node.ModifiedNode.LedgerEntryType === 'LoanBroker') || (node.DeletedNode && node.DeletedNode.LedgerEntryType === 'LoanBroker'), ) let calculatedAmount = tx.Amount let loanBrokerData if (loanBrokerNode) { const nodeData = loanBrokerNode.ModifiedNode || loanBrokerNode.DeletedNode const fields = nodeData.FinalFields || nodeData.PreviousFields if (fields) { loanBrokerData = { CoverAvailable: fields.CoverAvailable, DebtTotal: fields.DebtTotal, CoverRateMinimum: fields.CoverRateMinimum, } // If Amount is 0 or unset, calculate it using the formula: // Amount = CoverAvailable - (DebtTotal * CoverRateMinimum) if ( !tx.Amount || (typeof tx.Amount === 'object' && tx.Amount.value === '0') ) { const previousFields = nodeData.PreviousFields const coverAvailable = parseFloat( previousFields?.CoverAvailable || fields.CoverAvailable || '0', ) const debtTotal = parseFloat(fields.DebtTotal || '0') const coverRateMinimum = fields.CoverRateMinimum || 0 // CoverRateMinimum is in 1/10th basis points, so divide by 100000 const requiredCover = debtTotal * (coverRateMinimum / 100000) let clawbackAmount = Math.max(0, coverAvailable - requiredCover) // For MPT, calculate actual clawback from MPToken balance changes const mpTokenNode = meta.AffectedNodes?.find( (node: any) => node.ModifiedNode && node.ModifiedNode.LedgerEntryType === 'MPToken', ) if (mpTokenNode) { const tokenData = mpTokenNode.ModifiedNode const previousAmount = parseFloat( tokenData.PreviousFields?.MPTAmount || '0', ) const finalAmount = parseFloat( tokenData.FinalFields?.MPTAmount || '0', ) // Clawback amount is the reduction in MPTAmount clawbackAmount = Math.max(0, previousAmount - finalAmount) } if (typeof tx.Amount === 'object') { if ('issuer' in tx.Amount) { // IOU calculatedAmount = { currency: tx.Amount.currency, issuer: tx.Amount.issuer, value: clawbackAmount.toString(), } } else { // MPT calculatedAmount = { mpt_issuance_id: tx.Amount.mpt_issuance_id, value: clawbackAmount.toString(), } } } else if (tx.Amount === undefined) { // Amount is undefined, infer currency from RippleState or MPToken changes in metadata const rippleStateNode = meta.AffectedNodes?.find( (node: any) => (node.ModifiedNode && node.ModifiedNode.LedgerEntryType === 'RippleState') || (node.CreatedNode && node.CreatedNode.LedgerEntryType === 'RippleState'), ) const mpTokenNodeForInference = meta.AffectedNodes?.find( (node: any) => (node.ModifiedNode && node.ModifiedNode.LedgerEntryType === 'MPToken') || (node.CreatedNode && node.CreatedNode.LedgerEntryType === 'MPToken'), ) if (rippleStateNode) { const stateData = rippleStateNode.ModifiedNode || rippleStateNode.CreatedNode const balance = stateData.FinalFields?.Balance || stateData.NewFields?.Balance if (balance && typeof balance === 'object' && balance.currency) { // Found a currency balance change, use this currency calculatedAmount = { currency: balance.currency, issuer: balance.issuer === XRPL_NEUTRAL_ISSUER ? stateData.FinalFields?.LowLimit?.issuer || stateData.FinalFields?.HighLimit?.issuer : balance.issuer, value: clawbackAmount.toString(), } } } else if (mpTokenNodeForInference) { const tokenData = mpTokenNodeForInference.ModifiedNode || mpTokenNodeForInference.CreatedNode const mpTokenIssuanceID = tokenData.FinalFields?.MPTokenIssuanceID || tokenData.NewFields?.MPTokenIssuanceID if (mpTokenIssuanceID) { calculatedAmount = { mpt_issuance_id: mpTokenIssuanceID, value: clawbackAmount.toString(), } } } } } } } return { loanBrokerID: tx.LoanBrokerID, amount: tx.Amount ? formatAmount(tx.Amount) : undefined, calculatedAmount: calculatedAmount ? formatAmount(calculatedAmount) : undefined, loanBrokerData, } } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/test/LoanBrokerCoverClawbackSimple.test.tsx ================================================ import { useQuery } from 'react-query' import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import LoanBrokerCoverClawback from './mock_data/LoanBrokerCoverClawback.json' import LoanBrokerCoverClawbackZeroAmount from './mock_data/LoanBrokerCoverClawbackZeroAmount.json' import LoanBrokerCoverClawbackNoAmount from './mock_data/LoanBrokerCoverClawbackNoAmount.json' import LoanBrokerCoverClawbackMPT from './mock_data/LoanBrokerCoverClawbackMPT.json' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const renderComponent = createSimpleRenderFactory(Simple) describe('LoanBrokerCoverClawback: Simple', () => { it('renders with explicit amount', () => { const { container, unmount } = renderComponent(LoanBrokerCoverClawback) expectSimpleRowText( container, 'loan-broker-id', '7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B', ) expectSimpleRowText( container, 'amount', '$5.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) unmount() }) it('renders with calculated amount when Amount is 0', () => { const { container, unmount } = renderComponent( LoanBrokerCoverClawbackZeroAmount, ) expectSimpleRowText( container, 'loan-broker-id', '7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B', ) expectSimpleRowText( container, 'amount', '$14.95 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) unmount() }) it('renders with calculated amount when Amount is undefined (real transaction)', () => { const { container, unmount } = renderComponent( LoanBrokerCoverClawbackNoAmount, ) expectSimpleRowText( container, 'loan-broker-id', '693FCCFB835B322B2714107323EAC727D710DF827030B3935E0A6B62D15B1EEC', ) expectSimpleRowText( container, 'amount', '$4.94151169 USD.rh2z5N9avJKVKvWFXyayEMqd7ABqo7Disx', ) unmount() }) it('renders with calculated MPT amount when Amount is undefined', () => { ;(useQuery as jest.Mock).mockImplementation(() => ({ data: { assetScale: 2, }, })) const { container, unmount } = renderComponent(LoanBrokerCoverClawbackMPT) expectSimpleRowText( container, 'loan-broker-id', '358A255D294C9F5653686E90640F7EA922CBB26149EDD0AF8A02569BFC9412DC', ) expectSimpleRowText( container, 'amount', '4.94 0004E8D60726C960436D88F20FFC2A873665CE675789E255', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/test/LoanBrokerCoverClawbackTableDetail.test.tsx ================================================ import { useQuery } from 'react-query' import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import LoanBrokerCoverClawback from './mock_data/LoanBrokerCoverClawback.json' import LoanBrokerCoverClawbackZeroAmount from './mock_data/LoanBrokerCoverClawbackZeroAmount.json' import LoanBrokerCoverClawbackNoAmount from './mock_data/LoanBrokerCoverClawbackNoAmount.json' import LoanBrokerCoverClawbackMPT from './mock_data/LoanBrokerCoverClawbackMPT.json' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('LoanBrokerCoverClawbackTableDetail', () => { it('renders with explicit amount', () => { const { container, unmount } = renderComponent(LoanBrokerCoverClawback) expect( container.querySelector('.loan-broker-cover-clawback'), ).toHaveTextContent( 'Claws back$5.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7first-loss capital from Loan Broker ID 7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B', ) unmount() }) it('renders with calculated amount when Amount is 0', () => { const { container, unmount } = renderComponent( LoanBrokerCoverClawbackZeroAmount, ) expect( container.querySelector('.loan-broker-cover-clawback'), ).toHaveTextContent( 'Claws back$14.95 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7first-loss capital from Loan Broker ID 7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B', ) unmount() }) it('renders with calculated amount when Amount is undefined', () => { const { container, unmount } = renderComponent( LoanBrokerCoverClawbackNoAmount, ) expect( container.querySelector('.loan-broker-cover-clawback'), ).toHaveTextContent( 'Claws back$4.94151169 USD.rh2z5N9avJKVKvWFXyayEMqd7ABqo7Disxfirst-loss capital from Loan Broker ID 693FCCFB835B322B2714107323EAC727D710DF827030B3935E0A6B62D15B1EEC', ) unmount() }) it('renders with calculated MPT amount when Amount is undefined', () => { // Mock MPT issuance data for scaling ;(useQuery as jest.Mock).mockImplementation(() => ({ data: { assetScale: 2, }, })) const { container, unmount } = renderComponent(LoanBrokerCoverClawbackMPT) expect( container.querySelector('.loan-broker-cover-clawback'), ).toHaveTextContent( 'Claws back4.94 0004E8D60726C960436D88F20FFC2A873665CE675789E255first-loss capital from Loan Broker ID 358A255D294C9F5653686E90640F7EA922CBB26149EDD0AF8A02569BFC9412DC', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/test/mock_data/LoanBrokerCoverClawback.json ================================================ { "tx": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Amount": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "5" }, "Destination": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 291195, "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "NetworkID": 3222, "Sequence": 291160, "SigningPubKey": "ED99153B1435C4D98191569187E7AF9DF00319794C1A82366E6E2F87B741BA1BBA", "TransactionType": "LoanBrokerCoverClawback", "TxnSignature": "FFECC1F5D224CC74FA3FC30ED19CD9013461DD265F0B43F98D38FBF577E6B540F9C3EB952962233562556D219516B5D52E09733B4CA155636AE7391452934D06", "ctid": "C004716800000C96", "date": 1762469400000, "hash": "04139F851E529667FE6038628B9ED7960C8225BBCA0E16512C6CB4E22A2FD0BA", "inLedger": 291176, "ledger_index": 291176, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "5", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "5.84883123436912", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "CoverAvailable": "10" }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "80000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291161 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "82000000", "Sequence": 291160 }, "PreviousTxnID": "680925BDAE5F9F25A12095390EE0F443A898A40B8A5ADAC273A1F83814B15A17", "PreviousTxnLgrSeq": 291174 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9.32219481235746" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9A3D6C6DFE031982ECF8591700201F7A0F62E4D74564D3810F90B622DC31168", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4.32219481235746" } }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FDC8A4899C79C91D4329811A45695C59B8060F28EA7D923EB6F47E15F42FC312", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10" } }, "PreviousTxnID": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "PreviousTxnLgrSeq": 291167 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "5", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "5.84883123436912", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "CoverAvailable": "10" }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "80000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291161 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "82000000", "Sequence": 291160 }, "PreviousTxnID": "680925BDAE5F9F25A12095390EE0F443A898A40B8A5ADAC273A1F83814B15A17", "PreviousTxnLgrSeq": 291174 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9.32219481235746" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9A3D6C6DFE031982ECF8591700201F7A0F62E4D74564D3810F90B622DC31168", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4.32219481235746" } }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FDC8A4899C79C91D4329811A45695C59B8060F28EA7D923EB6F47E15F42FC312", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10" } }, "PreviousTxnID": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "PreviousTxnLgrSeq": 291167 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "04139F851E529667FE6038628B9ED7960C8225BBCA0E16512C6CB4E22A2FD0BA", "ledger_index": 291176, "date": 1762469400000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/test/mock_data/LoanBrokerCoverClawbackMPT.json ================================================ { "tx": { "Account": "reFUHWyJpym5FpHeyjjxcF7KgExTUbsVP", "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 321787, "LoanBrokerID": "358A255D294C9F5653686E90640F7EA922CBB26149EDD0AF8A02569BFC9412DC", "NetworkID": 3222, "Sequence": 321752, "SigningPubKey": "EDC477F852D181EE6066BAB536FD5F295F40CA00BC52F2507F116DDDE37C7FBFE9", "TransactionType": "LoanBrokerCoverClawback", "TxnSignature": "2D9B9B741548FE8CF52CC15B4EDF9516E0AA1B6D32FCBAFA59418B5C01DAC4E9DEB0D4EFEFE0405DD09376495CAA58C66C0A41076648A4222D56E8F334C4500D", "ctid": "C004E8E800000C96", "date": 1765149982000, "hash": "6F95CE2BC083D317C304ED47CDD77E2DAD7F339C79FF9CA7581B3EAAC01695D3", "inLedger": 321768, "ledger_index": 321768, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "reFUHWyJpym5FpHeyjjxcF7KgExTUbsVP", "Balance": "94000000", "Flags": 0, "OwnerCount": 1, "Sequence": 321753 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "13B2067024FE3B1FC2D5A4991084F27521D926AF217EF49D5C702D9E330C5A3D", "PreviousFields": { "Balance": "96000000", "Sequence": 321752 }, "PreviousTxnID": "53EE9CC17605B9BE0906BA0A3BDA2FDD424873ED22E0679648672DBBCD20D9CC", "PreviousTxnLgrSeq": 321755 } }, { "ModifiedNode": { "FinalFields": { "AssetScale": 2, "Flags": 98, "Issuer": "reFUHWyJpym5FpHeyjjxcF7KgExTUbsVP", "OutstandingAmount": "9506", "OwnerNode": "0", "Sequence": 321750 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "31614FAC7702E68ACD8AB9F5F6662CDC9085A435D2A43AC5AA1A3D6A3E34FB04", "PreviousFields": { "OutstandingAmount": "10000" }, "PreviousTxnID": "53EE9CC17605B9BE0906BA0A3BDA2FDD424873ED22E0679648672DBBCD20D9CC", "PreviousTxnLgrSeq": 321755 } }, { "ModifiedNode": { "FinalFields": { "Account": "rssDBZ9QfyrrckjHwvtonxKrFkcyRXN2R8", "CoverAvailable": "6", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "100000", "DebtTotal": "585", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfbwAbovknQQuq5qrSwBsKcQb572oZRxw3", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 321751, "VaultID": "D6208D8EE26A1FE651F444211AD807B801707839FD9C217A18C15FCC7B2B4A59", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "358A255D294C9F5653686E90640F7EA922CBB26149EDD0AF8A02569BFC9412DC", "PreviousFields": { "CoverAvailable": "500" }, "PreviousTxnID": "6E99D96DAFB762A93EAC232E60D309C1C283994956D319060AB785BA48E23AAC", "PreviousTxnLgrSeq": 321767 } }, { "ModifiedNode": { "FinalFields": { "Account": "rssDBZ9QfyrrckjHwvtonxKrFkcyRXN2R8", "Flags": 0, "MPTAmount": "6", "MPTokenIssuanceID": "0004E8D60726C960436D88F20FFC2A873665CE675789E255", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "B2736FB9C776B458E0ACA0F831C82C5D24B30697547818F65382DEA0FF13221F", "PreviousFields": { "MPTAmount": "500" }, "PreviousTxnID": "6E99D96DAFB762A93EAC232E60D309C1C283994956D319060AB785BA48E23AAC", "PreviousTxnLgrSeq": 321767 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "reFUHWyJpym5FpHeyjjxcF7KgExTUbsVP", "Balance": "94000000", "Flags": 0, "OwnerCount": 1, "Sequence": 321753 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "13B2067024FE3B1FC2D5A4991084F27521D926AF217EF49D5C702D9E330C5A3D", "PreviousFields": { "Balance": "96000000", "Sequence": 321752 }, "PreviousTxnID": "53EE9CC17605B9BE0906BA0A3BDA2FDD424873ED22E0679648672DBBCD20D9CC", "PreviousTxnLgrSeq": 321755 } }, { "ModifiedNode": { "FinalFields": { "AssetScale": 2, "Flags": 98, "Issuer": "reFUHWyJpym5FpHeyjjxcF7KgExTUbsVP", "OutstandingAmount": "9506", "OwnerNode": "0", "Sequence": 321750 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "31614FAC7702E68ACD8AB9F5F6662CDC9085A435D2A43AC5AA1A3D6A3E34FB04", "PreviousFields": { "OutstandingAmount": "10000" }, "PreviousTxnID": "53EE9CC17605B9BE0906BA0A3BDA2FDD424873ED22E0679648672DBBCD20D9CC", "PreviousTxnLgrSeq": 321755 } }, { "ModifiedNode": { "FinalFields": { "Account": "rssDBZ9QfyrrckjHwvtonxKrFkcyRXN2R8", "CoverAvailable": "6", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "100000", "DebtTotal": "585", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfbwAbovknQQuq5qrSwBsKcQb572oZRxw3", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 321751, "VaultID": "D6208D8EE26A1FE651F444211AD807B801707839FD9C217A18C15FCC7B2B4A59", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "358A255D294C9F5653686E90640F7EA922CBB26149EDD0AF8A02569BFC9412DC", "PreviousFields": { "CoverAvailable": "500" }, "PreviousTxnID": "6E99D96DAFB762A93EAC232E60D309C1C283994956D319060AB785BA48E23AAC", "PreviousTxnLgrSeq": 321767 } }, { "ModifiedNode": { "FinalFields": { "Account": "rssDBZ9QfyrrckjHwvtonxKrFkcyRXN2R8", "Flags": 0, "MPTAmount": "6", "MPTokenIssuanceID": "0004E8D60726C960436D88F20FFC2A873665CE675789E255", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "B2736FB9C776B458E0ACA0F831C82C5D24B30697547818F65382DEA0FF13221F", "PreviousFields": { "MPTAmount": "500" }, "PreviousTxnID": "6E99D96DAFB762A93EAC232E60D309C1C283994956D319060AB785BA48E23AAC", "PreviousTxnLgrSeq": 321767 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "6F95CE2BC083D317C304ED47CDD77E2DAD7F339C79FF9CA7581B3EAAC01695D3", "ledger_index": 321768, "date": 1765149982000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/test/mock_data/LoanBrokerCoverClawbackNoAmount.json ================================================ { "tx": { "Account": "rh2z5N9avJKVKvWFXyayEMqd7ABqo7Disx", "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 316225, "LoanBrokerID": "693FCCFB835B322B2714107323EAC727D710DF827030B3935E0A6B62D15B1EEC", "NetworkID": 3222, "Sequence": 316171, "SigningPubKey": "ED0D0E55562A79DB42C6AA9FB94335978D8376754349764080116D57C7752488F3", "TransactionType": "LoanBrokerCoverClawback", "TxnSignature": "129FAD4A7ECC1E68B8297DF722282B2376773AC779A9B52386C886C3B2E4363C0C6D26B3D35F8A6917591C8FE5CD6C4D11F561848756F80BB351591DC3672808", "ctid": "C004D32F00000C96", "date": 815859711, "hash": "53DCF247B7116FF9643966D3769A8F029D9844FBA5D65FBB270F5495F50AC50C", "inLedger": 316207, "ledger_index": 316207, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "r3rMJsHUvBb35JfzKy4wpyauEg71Hkpa9W", "CoverAvailable": "0.058488312343691", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "5.84883123436912", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rGjCwsP5siHmd81KinTomSJXA8T9ssPHea", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 316166, "VaultID": "F018F41546EEC83A298BD10563C7B8A3B99BAAD2E55FAEB39FE6BE69B009DE0C", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "693FCCFB835B322B2714107323EAC727D710DF827030B3935E0A6B62D15B1EEC", "PreviousFields": { "CoverAvailable": "5" }, "PreviousTxnID": "3080E8781A41172042A3674866851A064B24919B069EE863442E9CD2281604CA", "PreviousTxnLgrSeq": 316205 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-0.058488312343691" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "r3rMJsHUvBb35JfzKy4wpyauEg71Hkpa9W", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rh2z5N9avJKVKvWFXyayEMqd7ABqo7Disx", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9792BAE4BE62B31326F661130E27EBF2020F2565EC2AE9F1C2C2368510CA59D0", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5" } }, "PreviousTxnID": "3080E8781A41172042A3674866851A064B24919B069EE863442E9CD2281604CA", "PreviousTxnLgrSeq": 316205 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "r3rMJsHUvBb35JfzKy4wpyauEg71Hkpa9W", "CoverAvailable": "0.058488312343691", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "5.84883123436912", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rGjCwsP5siHmd81KinTomSJXA8T9ssPHea", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 316166, "VaultID": "F018F41546EEC83A298BD10563C7B8A3B99BAAD2E55FAEB39FE6BE69B009DE0C", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "693FCCFB835B322B2714107323EAC727D710DF827030B3935E0A6B62D15B1EEC", "PreviousFields": { "CoverAvailable": "5" }, "PreviousTxnID": "3080E8781A41172042A3674866851A064B24919B069EE863442E9CD2281604CA", "PreviousTxnLgrSeq": 316205 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-0.058488312343691" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "r3rMJsHUvBb35JfzKy4wpyauEg71Hkpa9W", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rh2z5N9avJKVKvWFXyayEMqd7ABqo7Disx", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9792BAE4BE62B31326F661130E27EBF2020F2565EC2AE9F1C2C2368510CA59D0", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5" } }, "PreviousTxnID": "3080E8781A41172042A3674866851A064B24919B069EE863442E9CD2281604CA", "PreviousTxnLgrSeq": 316205 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "53DCF247B7116FF9643966D3769A8F029D9844FBA5D65FBB270F5495F50AC50C", "ledger_index": 316207, "date": 815859711 } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/test/mock_data/LoanBrokerCoverClawbackZeroAmount.json ================================================ { "tx": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Amount": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "Destination": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 291195, "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "NetworkID": 3222, "Sequence": 291160, "SigningPubKey": "ED99153B1435C4D98191569187E7AF9DF00319794C1A82366E6E2F87B741BA1BBA", "TransactionType": "LoanBrokerCoverClawback", "TxnSignature": "FFECC1F5D224CC74FA3FC30ED19CD9013461DD265F0B43F98D38FBF577E6B540F9C3EB952962233562556D219516B5D52E09733B4CA155636AE7391452934D06", "ctid": "C004716800000C96", "date": 1762469400000, "hash": "04139F851E529667FE6038628B9ED7960C8225BBCA0E16512C6CB4E22A2FD0BA", "inLedger": 291176, "ledger_index": 291176, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "10", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "5", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "CoverAvailable": "15" }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "10", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "5", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "CoverAvailable": "15" }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "04139F851E529667FE6038628B9ED7960C8225BBCA0E16512C6CB4E22A2FD0BA", "ledger_index": 291176, "date": 1762469400000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverClawback/types.ts ================================================ import { Amount } from '../../../types' import { TransactionCommonFields } from '../types' // TODO: remove when lending protocol (XLS-66) is supported on xrpl.js export interface LoanBrokerCoverClawback extends TransactionCommonFields { LoanBrokerID?: string Amount?: Amount } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverDeposit/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { LoanBrokerCoverDeposit } from './types' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { LoanBrokerID, Amount: amount } = data.instructions return ( <> {LoanBrokerID} ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverDeposit/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { LoanBrokerCoverDeposit } from './types' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { Amount: amount, LoanBrokerID } = instructions return (
    {t('transaction_action_SEND')} {t('first_loss_capital')} {t('to')} {t('loan_broker_id')} {LoanBrokerID}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverDeposit/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const LoanBrokerCoverDepositTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.SEND, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverDeposit/test/LoanBrokerCoverDepositSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import LoanBrokerCoverDeposit from './mock_data/LoanBrokerCoverDeposit.json' const renderComponent = createSimpleRenderFactory(Simple) describe('LoanBrokerCoverDeposit: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(LoanBrokerCoverDeposit) expectSimpleRowText( container, 'loan-broker-id', '7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B', ) expectSimpleRowText( container, 'amount', '$10.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverDeposit/test/LoanBrokerCoverDepositTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import LoanBrokerCoverDeposit from './mock_data/LoanBrokerCoverDeposit.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('LoanBrokerCoverDepositTableDetail', () => { it('renders with amount and loan broker ID', () => { const { container, unmount } = renderComponent(LoanBrokerCoverDeposit) expect( container.querySelector('.loan-broker-cover-deposit'), ).toHaveTextContent( 'Send$10.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7first-loss capital to Loan Broker ID7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverDeposit/test/mock_data/LoanBrokerCoverDeposit.json ================================================ { "tx": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Amount": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "10" }, "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 291185, "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "NetworkID": 3222, "Sequence": 291155, "SigningPubKey": "ED99153B1435C4D98191569187E7AF9DF00319794C1A82366E6E2F87B741BA1BBA", "TransactionType": "LoanBrokerCoverDeposit", "TxnSignature": "75D97B9C2CC95F7BA20C7931BBD44B91DAB64113E700432B400F0E3096D6457CFE8B8530F1895CE7384E4F37DC1F7A609B8D54CFEAEB8341F7BC192BADA63B0D", "ctid": "C004715F00000C96", "date": 1762469371000, "hash": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "inLedger": 291167, "ledger_index": 291167, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "10", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "Flags": 0, "LoanSequence": 1, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": {}, "PreviousTxnID": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "PreviousTxnLgrSeq": 291165 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8AC6CD6C4F2A31F675CEDE92C5FBEB0E7D2C72A0BD9CF1FA2264984FE524F32E", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-40" } }, "PreviousTxnID": "0A7F9BE7463DC3E3512F0228EC348922F6BBDE433A1C4644C60B977BDEB7ED71", "PreviousTxnLgrSeq": 291163 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "90000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291156 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "92000000", "Sequence": 291155 }, "PreviousTxnID": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "PreviousTxnLgrSeq": 291165 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FDC8A4899C79C91D4329811A45695C59B8060F28EA7D923EB6F47E15F42FC312", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" } }, "PreviousTxnID": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "PreviousTxnLgrSeq": 291165 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "10", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "Flags": 0, "LoanSequence": 1, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": {}, "PreviousTxnID": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "PreviousTxnLgrSeq": 291165 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8AC6CD6C4F2A31F675CEDE92C5FBEB0E7D2C72A0BD9CF1FA2264984FE524F32E", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-40" } }, "PreviousTxnID": "0A7F9BE7463DC3E3512F0228EC348922F6BBDE433A1C4644C60B977BDEB7ED71", "PreviousTxnLgrSeq": 291163 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "90000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291156 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "92000000", "Sequence": 291155 }, "PreviousTxnID": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "PreviousTxnLgrSeq": 291165 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FDC8A4899C79C91D4329811A45695C59B8060F28EA7D923EB6F47E15F42FC312", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" } }, "PreviousTxnID": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "PreviousTxnLgrSeq": 291165 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "ledger_index": 291167, "date": 1762469371000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverDeposit/types.ts ================================================ import { Amount } from '../../../types' import { TransactionCommonFields } from '../types' // TODO: remove when lending protocol (XLS-66) is supported on xrpl.js export interface LoanBrokerCoverDeposit extends TransactionCommonFields { LoanBrokerID: string Amount: Amount } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverWithdraw/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { Account } from '../../Account' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { LoanBrokerCoverWithdraw } from './types' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { LoanBrokerID, Amount: amount, Destination } = data.instructions return ( <> {LoanBrokerID} {Destination && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverWithdraw/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { LoanBrokerCoverWithdraw } from './types' import { Amount } from '../../Amount' import { Account } from '../../Account' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { Amount: amount, Destination } = instructions return (
    {t('withdraw')} {t('first_loss_capital')} {Destination && ( <> {t('to')} )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverWithdraw/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const LoanBrokerCoverWithdrawTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.SEND, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverWithdraw/test/LoanBrokerCoverWithdrawSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import LoanBrokerCoverWithdraw from './mock_data/LoanBrokerCoverWithdraw.json' const renderComponent = createSimpleRenderFactory(Simple) describe('LoanBrokerCoverWithdraw: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(LoanBrokerCoverWithdraw) expectSimpleRowText( container, 'loan-broker-id', '7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B', ) expectSimpleRowText( container, 'amount', '$5.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) expectSimpleRowText( container, 'destination', 'rH4absn9JcB8m943YRMNJpuR9HQs56hkr8', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverWithdraw/test/LoanBrokerCoverWithdrawTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import LoanBrokerCoverWithdraw from './mock_data/LoanBrokerCoverWithdraw.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('LoanBrokerCoverWithdrawTableDetail', () => { it('renders with amount, destination, and first-loss capital', () => { const { container, unmount } = renderComponent(LoanBrokerCoverWithdraw) expect( container.querySelector('.loan-broker-cover-withdraw'), ).toHaveTextContent( 'withdraw$5.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7first-loss capitaltorH4absn9JcB8m943YRMNJpuR9HQs56hkr8', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverWithdraw/test/mock_data/LoanBrokerCoverWithdraw.json ================================================ { "tx": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Amount": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "5" }, "Destination": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 291195, "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "NetworkID": 3222, "Sequence": 291160, "SigningPubKey": "ED99153B1435C4D98191569187E7AF9DF00319794C1A82366E6E2F87B741BA1BBA", "TransactionType": "LoanBrokerCoverWithdraw", "TxnSignature": "FFECC1F5D224CC74FA3FC30ED19CD9013461DD265F0B43F98D38FBF577E6B540F9C3EB952962233562556D219516B5D52E09733B4CA155636AE7391452934D06", "ctid": "C004716800000C96", "date": 1762469400000, "hash": "04139F851E529667FE6038628B9ED7960C8225BBCA0E16512C6CB4E22A2FD0BA", "inLedger": 291176, "ledger_index": 291176, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "5", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "5.84883123436912", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "CoverAvailable": "10" }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "80000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291161 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "82000000", "Sequence": 291160 }, "PreviousTxnID": "680925BDAE5F9F25A12095390EE0F443A898A40B8A5ADAC273A1F83814B15A17", "PreviousTxnLgrSeq": 291174 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9.32219481235746" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9A3D6C6DFE031982ECF8591700201F7A0F62E4D74564D3810F90B622DC31168", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4.32219481235746" } }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FDC8A4899C79C91D4329811A45695C59B8060F28EA7D923EB6F47E15F42FC312", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10" } }, "PreviousTxnID": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "PreviousTxnLgrSeq": 291167 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "5", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "5.84883123436912", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "CoverAvailable": "10" }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "80000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291161 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "82000000", "Sequence": 291160 }, "PreviousTxnID": "680925BDAE5F9F25A12095390EE0F443A898A40B8A5ADAC273A1F83814B15A17", "PreviousTxnLgrSeq": 291174 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9.32219481235746" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9A3D6C6DFE031982ECF8591700201F7A0F62E4D74564D3810F90B622DC31168", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4.32219481235746" } }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FDC8A4899C79C91D4329811A45695C59B8060F28EA7D923EB6F47E15F42FC312", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10" } }, "PreviousTxnID": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "PreviousTxnLgrSeq": 291167 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "04139F851E529667FE6038628B9ED7960C8225BBCA0E16512C6CB4E22A2FD0BA", "ledger_index": 291176, "date": 1762469400000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerCoverWithdraw/types.ts ================================================ import { Amount } from '../../../types' import { TransactionCommonFields } from '../types' // TODO: remove when lending protocol (XLS-66) is supported on xrpl.js export interface LoanBrokerCoverWithdraw extends TransactionCommonFields { LoanBrokerID: string Amount: Amount Destination?: string } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerDelete/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { LoanBrokerDelete } from './types' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { LoanBrokerID } = data.instructions return ( {LoanBrokerID} ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerDelete/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { LoanBrokerDelete } from './types' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { LoanBrokerID } = instructions return (
    {t('delete')} {t('loan_broker_id')} {LoanBrokerID}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerDelete/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const LoanBrokerDeleteTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.CANCEL, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerDelete/test/LoanBrokerDeleteSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import LoanBrokerDelete from './mock_data/LoanBrokerDelete.json' const renderComponent = createSimpleRenderFactory(Simple) describe('LoanBrokerDelete: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(LoanBrokerDelete) expectSimpleRowText( container, 'loan-broker-id', '7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerDelete/test/LoanBrokerDeleteTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import LoanBrokerDelete from './mock_data/LoanBrokerDelete.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('LoanBrokerDeleteTableDetail', () => { it('renders with loan broker ID', () => { const { container, unmount } = renderComponent(LoanBrokerDelete) expect(container.querySelector('.loan-broker-delete')).toHaveTextContent( 'deleteLoan Broker ID7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerDelete/test/mock_data/LoanBrokerDelete.json ================================================ { "tx": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 291197, "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "NetworkID": 3222, "Sequence": 291161, "SigningPubKey": "ED99153B1435C4D98191569187E7AF9DF00319794C1A82366E6E2F87B741BA1BBA", "TransactionType": "LoanBrokerDelete", "TxnSignature": "F77378990FFB053BBFA43EDDE314E45FA0E2A340C398B0043F98C92A38A214C9575F3C6A18B7870EC2B46AED705303377639128A7F808AF1E51FA23A6B6A450F", "ctid": "C004716A00000C96", "date": 1762469402000, "hash": "3B331E0A610E56EB0CA4943F374C445780C041414B05E8BDDD5E27EE86D6BA75", "inLedger": 291178, "ledger_index": 291178, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "78000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291162 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "80000000", "Sequence": 291161 }, "PreviousTxnID": "04139F851E529667FE6038628B9ED7960C8225BBCA0E16512C6CB4E22A2FD0BA", "PreviousTxnLgrSeq": 291176 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "78000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291162 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "80000000", "Sequence": 291161 }, "PreviousTxnID": "04139F851E529667FE6038628B9ED7960C8225BBCA0E16512C6CB4E22A2FD0BA", "PreviousTxnLgrSeq": 291176 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "3B331E0A610E56EB0CA4943F374C445780C041414B05E8BDDD5E27EE86D6BA75", "ledger_index": 291178, "date": 1762469402000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerDelete/types.ts ================================================ import { TransactionCommonFields } from '../types' // TODO: remove when lending protocol (XLS-66) is supported on xrpl.js export interface LoanBrokerDelete extends TransactionCommonFields { LoanBrokerID: string } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { useContext } from 'react' import { useQuery } from 'react-query' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { JsonView } from '../../JsonView' import SocketContext from '../../../SocketContext' import { getVaultAsset } from '../utils/vaultUtils' import { formatAmountWithAsset } from '../../../../../rippled/lib/txSummary/formatAmount' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const { vaultID, loanBrokerID, debtMaximumRaw, dataFromHex, dataAsJson, managementFeeRatePercent, coverRateMinimumPercent, coverRateLiquidationPercent, } = data.instructions // Fetch Vault asset information to format DebtMaximum correctly const { data: vaultAsset } = useQuery( ['vaultAsset', vaultID], () => getVaultAsset(rippledSocket, vaultID), { enabled: !!vaultID && !!rippledSocket, }, ) // Format DebtMaximum with correct currency const debtMaximum = vaultAsset && debtMaximumRaw !== undefined ? formatAmountWithAsset(debtMaximumRaw, vaultAsset) : undefined return ( <> {vaultID} {loanBrokerID && ( {loanBrokerID} )} {managementFeeRatePercent && ( {managementFeeRatePercent} )} {debtMaximumRaw !== undefined && ( {debtMaximumRaw === '0' ? ( {t('no_limit')} ) : ( debtMaximum && )} )} {coverRateMinimumPercent && ( {coverRateMinimumPercent} )} {coverRateLiquidationPercent && ( {coverRateLiquidationPercent} )} {dataFromHex && ( {dataAsJson ? : dataFromHex} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerSet/TableDetail.tsx ================================================ import { useTranslation, Trans } from 'react-i18next' import { useContext } from 'react' import { useQuery } from 'react-query' import { TransactionTableDetailProps } from '../types' import { Amount } from '../../Amount' import SocketContext from '../../../SocketContext' import { getVaultAsset } from '../utils/vaultUtils' import { formatAmountWithAsset } from '../../../../../rippled/lib/txSummary/formatAmount' import { shortenVaultID } from '../../../utils' export const TableDetail = ({ instructions }: TransactionTableDetailProps) => { const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const { vaultID, debtMaximumRaw, managementFeeRatePercent, coverRateMinimumPercent, coverRateLiquidationPercent, } = instructions // Fetch Vault asset information to format DebtMaximum correctly const { data: vaultAsset } = useQuery( ['vaultAsset', vaultID], () => getVaultAsset(rippledSocket, vaultID), { enabled: !!vaultID && !!rippledSocket, }, ) // Format DebtMaximum with correct currency const debtMaximum = vaultAsset && debtMaximumRaw !== undefined ? formatAmountWithAsset(debtMaximumRaw, vaultAsset) : undefined // Determine if we should show DebtMaximum field const shouldShowDebtMaximum = debtMaximumRaw !== undefined return (
    {t('vault_id')}: {shortenVaultID(vaultID)}
    {(coverRateMinimumPercent || coverRateLiquidationPercent || managementFeeRatePercent) && (
    {t('rates')}: {t('management_fee_rate')} {managementFeeRatePercent} {(coverRateMinimumPercent || coverRateLiquidationPercent) && ', '} ) : ( ), CoverRateMinimum: coverRateMinimumPercent ? ( {t('cover_rate_minimum')} {coverRateMinimumPercent} {coverRateLiquidationPercent && ', '} ) : ( ), CoverRateLiquidation: coverRateLiquidationPercent ? ( {t('cover_rate_liquidation')} {coverRateLiquidationPercent} ) : ( ), }} />
    )} {shouldShowDebtMaximum && (
    {t('debt_maximum')}: {debtMaximumRaw === '0' ? ( {t('no_limit')} ) : ( debtMaximum && )}
    )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerSet/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' import { parser } from './parser' export const LoanBrokerSetTransaction: TransactionMapping = { Simple, TableDetail, parser, action: TransactionAction.MODIFY, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerSet/parser.ts ================================================ import { LoanBrokerSet } from './types' import { convertHexToString } from '../../../../../rippled/lib/utils' import { parsePercent } from '../../../NumberFormattingUtils' import { isValidJsonString, ONE_TENTH_BASIS_POINT, ONE_TENTH_BASIS_POINT_CUTOFF, ONE_TENTH_BASIS_POINT_DIGITS, } from '../../../utils' export function parser(tx: LoanBrokerSet, meta?: any) { const dataFromHex = tx.Data ? convertHexToString(tx.Data) : undefined // Check if this is creating a new LoanBroker (CreatedNode) const isCreatingLoanBroker = meta?.AffectedNodes?.some( (node: any) => node.CreatedNode?.LedgerEntryType === 'LoanBroker' && node.CreatedNode?.NewFields?.LoanBrokerID === tx.LoanBrokerID, ) // For new LoanBrokers, if DebtMaximum is omitted, default to "0" (No Limit) // For existing LoanBrokers, if DebtMaximum is omitted, leave as undefined (don't show) let debtMaximumRaw = tx.DebtMaximum if (debtMaximumRaw === undefined && isCreatingLoanBroker) { debtMaximumRaw = '0' } return { vaultID: tx.VaultID, loanBrokerID: tx.LoanBrokerID, // Pass raw DebtMaximum value - components will format with correct currency debtMaximumRaw, dataFromHex, dataAsJson: dataFromHex && isValidJsonString(dataFromHex) ? JSON.parse(dataFromHex) : undefined, managementFeeRatePercent: tx.ManagementFeeRate !== undefined ? parsePercent( tx.ManagementFeeRate / ONE_TENTH_BASIS_POINT, ONE_TENTH_BASIS_POINT_DIGITS, ONE_TENTH_BASIS_POINT_CUTOFF, ) : undefined, coverRateMinimumPercent: tx.CoverRateMinimum !== undefined ? parsePercent( tx.CoverRateMinimum / ONE_TENTH_BASIS_POINT, ONE_TENTH_BASIS_POINT_DIGITS, ONE_TENTH_BASIS_POINT_CUTOFF, ) : undefined, coverRateLiquidationPercent: tx.CoverRateLiquidation !== undefined ? parsePercent( tx.CoverRateLiquidation / ONE_TENTH_BASIS_POINT, ONE_TENTH_BASIS_POINT_DIGITS, ONE_TENTH_BASIS_POINT_CUTOFF, ) : undefined, } } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerSet/test/LoanBrokerSetSimple.test.tsx ================================================ import { useQuery } from 'react-query' import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import i18n from '../../../../../../i18n/testConfigEnglish' import { Simple } from '../Simple' import LoanBrokerSet from './mock_data/LoanBrokerSet.json' import LoanBrokerSetZeroDebt from './mock_data/LoanBrokerSetZeroDebt.json' import LoanBrokerSetPartialUpdate from './mock_data/LoanBrokerSetPartialUpdate.json' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const renderComponent = createSimpleRenderFactory(Simple, i18n) describe('LoanBrokerSet: Simple', () => { it('renders', () => { // Mock useQuery to return the vault asset information ;(useQuery as jest.Mock).mockReturnValue({ data: { currency: 'USD', issuer: 'ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7' }, isLoading: false, error: null, }) const { container, unmount } = renderComponent(LoanBrokerSet) expectSimpleRowText( container, 'vault-id', 'AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7', ) expectSimpleRowText(container, 'management-fee-rate', '1.000%') expectSimpleRowText( container, 'debt-maximum', '$100,000.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) expectSimpleRowText(container, 'cover-rate-minimum', '1.000%') expectSimpleRowText(container, 'cover-rate-liquidation', '5.000%') expectSimpleRowText(container, 'data', '{meta: "LoanBroker Metadata"}') unmount() }) it('renders with zero debt maximum showing No Limit', () => { // Mock useQuery to return the vault asset information ;(useQuery as jest.Mock).mockReturnValue({ data: { currency: 'USD', issuer: 'ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7' }, isLoading: false, error: null, }) const { container, unmount } = renderComponent(LoanBrokerSetZeroDebt) expectSimpleRowText( container, 'vault-id', 'AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7', ) expectSimpleRowText(container, 'management-fee-rate', '1.000%') expectSimpleRowText(container, 'debt-maximum', 'No Limit') expectSimpleRowText(container, 'cover-rate-minimum', '1.000%') expectSimpleRowText(container, 'cover-rate-liquidation', '5.000%') expectSimpleRowText(container, 'data', '{meta: "LoanBroker Metadata"}') unmount() }) it('renders partial update without showing omitted DebtMaximum field', () => { // Mock useQuery to return the vault asset information ;(useQuery as jest.Mock).mockReturnValue({ data: { currency: 'USD', issuer: 'ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7' }, isLoading: false, error: null, }) const { container, unmount } = renderComponent(LoanBrokerSetPartialUpdate) expectSimpleRowText( container, 'vault-id', 'AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7', ) expectSimpleRowText(container, 'management-fee-rate', '1.000%') expectSimpleRowText(container, 'cover-rate-minimum', '1.000%') expectSimpleRowText(container, 'cover-rate-liquidation', '5.000%') expectSimpleRowText(container, 'data', '{meta: "LoanBroker Metadata"}') // DebtMaximum should not be shown since it was omitted from the transaction expect( container.querySelector('[data-testid="debt-maximum"]'), ).not.toBeInTheDocument() unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerSet/test/LoanBrokerSetTableDetail.test.tsx ================================================ import { useQuery } from 'react-query' import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import LoanBrokerSet from './mock_data/LoanBrokerSet.json' import LoanBrokerSetPartialUpdate from './mock_data/LoanBrokerSetPartialUpdate.json' import LoanBrokerSetZeroDebt from './mock_data/LoanBrokerSetZeroDebt.json' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('LoanBrokerSetTableDetail', () => { it('renders with non-zero debt maximum', () => { // Mock useQuery to return the vault asset information ;(useQuery as jest.Mock).mockReturnValue({ data: { currency: 'USD', issuer: 'ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7' }, isLoading: false, error: null, }) const { container, unmount } = renderComponent(LoanBrokerSet) expect(container.querySelector('.loan-broker-set')).toHaveTextContent( 'Vault ID: AE7952AF...9654D7' + 'rates: Management Fee Rate 1.000%, Cover Rate Minimum 1.000%, Cover Rate Liquidation 5.000%' + 'Debt Maximum: $100,000.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) unmount() }) it('renders with zero debt maximum showing No Limit', () => { // Mock useQuery to return the vault asset information ;(useQuery as jest.Mock).mockReturnValue({ data: { currency: 'USD', issuer: 'ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7' }, isLoading: false, error: null, }) const { container, unmount } = renderComponent(LoanBrokerSetZeroDebt) expect(container.querySelector('.debt-maximum')).toHaveTextContent( 'Debt Maximum: No Limit', ) unmount() }) it('renders partial update without showing omitted DebtMaximum field', () => { // Mock useQuery to return the vault asset information ;(useQuery as jest.Mock).mockReturnValue({ data: { currency: 'USD', issuer: 'ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7' }, isLoading: false, error: null, }) const { container, unmount } = renderComponent(LoanBrokerSetPartialUpdate) expect(container.querySelector('.loan-broker-set')).toHaveTextContent( 'Vault ID: AE7952AF...9654D7' + 'rates: Management Fee Rate 1.000%, Cover Rate Minimum 1.000%, Cover Rate Liquidation 5.000%', ) // DebtMaximum should not be shown since it was omitted from the transaction expect(container.querySelector('.debt-maximum')).not.toBeInTheDocument() unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerSet/test/mock_data/LoanBrokerSet.json ================================================ { "tx": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "100000", "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 291183, "ManagementFeeRate": 1000, "NetworkID": 3222, "Sequence": 291154, "SigningPubKey": "ED99153B1435C4D98191569187E7AF9DF00319794C1A82366E6E2F87B741BA1BBA", "TransactionType": "LoanBrokerSet", "TxnSignature": "A561FF4611163D14CC45D966735832D23778F393B5B23368BFD9F587247810D4973DD838CDA741A0AD021A413805AE1C05FA5E0273A2B541173B070FF1C83108", "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "ctid": "C004715D00000C96", "date": 1762469362000, "hash": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "inLedger": 291165, "ledger_index": 291165, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "RootIndex": "4F6AE8BD0997DFFA83AD6E066EDDF019D8FBAF1C6E4B3B7CB8B06AE103D33158" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4F6AE8BD0997DFFA83AD6E066EDDF019D8FBAF1C6E4B3B7CB8B06AE103D33158", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "RootIndex": "56322EFCCEB8C30307F375007FD8B8C53F7B4B0E75B78066323CDDCBCDB948BE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "56322EFCCEB8C30307F375007FD8B8C53F7B4B0E75B78066323CDDCBCDB948BE", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113", "NewFields": { "Owner": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "RootIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113" } } }, { "CreatedNode": { "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "NewFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "LoanSequence": 1, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "RootIndex": "97E4739330007BCB77E6A730F07EF3C6E88233D57BA642DC67967C3136EA3542" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "97E4739330007BCB77E6A730F07EF3C6E88233D57BA642DC67967C3136EA3542", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "9CC9DDE74906A6CFEE975F7B8B31F55F410FDD0DFD8D6474B5A144EB29CF8322", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "CreatedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "ACE302E9118CA9A0423C36306CC659E413C3196A7E2D44C5D519A8BF468A50D7", "NewFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "Flags": 26214400, "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "OwnerCount": 1 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "92000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291155 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "94000000", "OwnerCount": 3, "Sequence": 291154 }, "PreviousTxnID": "0A7F9BE7463DC3E3512F0228EC348922F6BBDE433A1C4644C60B977BDEB7ED71", "PreviousTxnLgrSeq": 291163 } }, { "CreatedNode": { "LedgerEntryType": "RippleState", "LedgerIndex": "FDC8A4899C79C91D4329811A45695C59B8060F28EA7D923EB6F47E15F42FC312", "NewFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "value": "0" }, "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "RootIndex": "4F6AE8BD0997DFFA83AD6E066EDDF019D8FBAF1C6E4B3B7CB8B06AE103D33158" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4F6AE8BD0997DFFA83AD6E066EDDF019D8FBAF1C6E4B3B7CB8B06AE103D33158", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "RootIndex": "56322EFCCEB8C30307F375007FD8B8C53F7B4B0E75B78066323CDDCBCDB948BE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "56322EFCCEB8C30307F375007FD8B8C53F7B4B0E75B78066323CDDCBCDB948BE", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113", "NewFields": { "Owner": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "RootIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113" } } }, { "CreatedNode": { "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "NewFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "LoanSequence": 1, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "RootIndex": "97E4739330007BCB77E6A730F07EF3C6E88233D57BA642DC67967C3136EA3542" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "97E4739330007BCB77E6A730F07EF3C6E88233D57BA642DC67967C3136EA3542", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "9CC9DDE74906A6CFEE975F7B8B31F55F410FDD0DFD8D6474B5A144EB29CF8322", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "CreatedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "ACE302E9118CA9A0423C36306CC659E413C3196A7E2D44C5D519A8BF468A50D7", "NewFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "Flags": 26214400, "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "OwnerCount": 1 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "92000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291155 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "94000000", "OwnerCount": 3, "Sequence": 291154 }, "PreviousTxnID": "0A7F9BE7463DC3E3512F0228EC348922F6BBDE433A1C4644C60B977BDEB7ED71", "PreviousTxnLgrSeq": 291163 } }, { "CreatedNode": { "LedgerEntryType": "RippleState", "LedgerIndex": "FDC8A4899C79C91D4329811A45695C59B8060F28EA7D923EB6F47E15F42FC312", "NewFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "value": "0" }, "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "ledger_index": 291165, "date": 1762469362000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerSet/test/mock_data/LoanBrokerSetPartialUpdate.json ================================================ { "tx": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 291183, "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "ManagementFeeRate": 1000, "NetworkID": 3222, "Sequence": 291154, "SigningPubKey": "ED99153B1435C4D98191569187E7AF9DF00319794C1A82366E6E2F87B741BA1BBA", "TransactionType": "LoanBrokerSet", "TxnSignature": "A561FF4611163D14CC45D966735832D23778F393B5B23368BFD9F587247810D4973DD838CDA741A0AD021A413805AE1C05FA5E0273A2B541173B070FF1C83108", "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "ctid": "C004715D00000C96", "date": 1762469362000, "hash": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "inLedger": 291165, "ledger_index": 291165, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "LoanSequence": 1, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "CoverRateLiquidation": 3000, "CoverRateMinimum": 500, "ManagementFeeRate": 500 }, "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "100000", "LoanSequence": 1, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "CoverRateLiquidation": 3000, "CoverRateMinimum": 500, "ManagementFeeRate": 500 }, "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "ledger_index": 291165, "date": 1762469362000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerSet/test/mock_data/LoanBrokerSetZeroDebt.json ================================================ { "tx": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "0", "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 291183, "ManagementFeeRate": 1000, "NetworkID": 3222, "Sequence": 291154, "SigningPubKey": "ED99153B1435C4D98191569187E7AF9DF00319794C1A82366E6E2F87B741BA1BBA", "TransactionType": "LoanBrokerSet", "TxnSignature": "A561FF4611163D14CC45D966735832D23778F393B5B23368BFD9F587247810D4973DD838CDA741A0AD021A413805AE1C05FA5E0273A2B541173B070FF1C83108", "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "ctid": "C004715D00000C96", "date": 1762469362000, "hash": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "inLedger": 291165, "ledger_index": 291165, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "RootIndex": "4F6AE8BD0997DFFA83AD6E066EDDF019D8FBAF1C6E4B3B7CB8B06AE103D33158" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4F6AE8BD0997DFFA83AD6E066EDDF019D8FBAF1C6E4B3B7CB8B06AE103D33158", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "RootIndex": "56322EFCCEB8C30307F375007FD8B8C53F7B4B0E75B78066323CDDCBCDB948BE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "56322EFCCEB8C30307F375007FD8B8C53F7B4B0E75B78066323CDDCBCDB948BE", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113", "NewFields": { "Owner": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "RootIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113" } } }, { "CreatedNode": { "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "NewFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "LoanSequence": 1, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "RootIndex": "97E4739330007BCB77E6A730F07EF3C6E88233D57BA642DC67967C3136EA3542" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "97E4739330007BCB77E6A730F07EF3C6E88233D57BA642DC67967C3136EA3542", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "9CC9DDE74906A6CFEE975F7B8B31F55F410FDD0DFD8D6474B5A144EB29CF8322", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "CreatedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "ACE302E9118CA9A0423C36306CC659E413C3196A7E2D44C5D519A8BF468A50D7", "NewFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "Flags": 26214400, "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "OwnerCount": 1 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "92000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291155 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "94000000", "OwnerCount": 3, "Sequence": 291154 }, "PreviousTxnID": "0A7F9BE7463DC3E3512F0228EC348922F6BBDE433A1C4644C60B977BDEB7ED71", "PreviousTxnLgrSeq": 291163 } }, { "CreatedNode": { "LedgerEntryType": "RippleState", "LedgerIndex": "FDC8A4899C79C91D4329811A45695C59B8060F28EA7D923EB6F47E15F42FC312", "NewFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "value": "0" }, "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "RootIndex": "4F6AE8BD0997DFFA83AD6E066EDDF019D8FBAF1C6E4B3B7CB8B06AE103D33158" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4F6AE8BD0997DFFA83AD6E066EDDF019D8FBAF1C6E4B3B7CB8B06AE103D33158", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "RootIndex": "56322EFCCEB8C30307F375007FD8B8C53F7B4B0E75B78066323CDDCBCDB948BE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "56322EFCCEB8C30307F375007FD8B8C53F7B4B0E75B78066323CDDCBCDB948BE", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113", "NewFields": { "Owner": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "RootIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113" } } }, { "CreatedNode": { "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "NewFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "LoanSequence": 1, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "RootIndex": "97E4739330007BCB77E6A730F07EF3C6E88233D57BA642DC67967C3136EA3542" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "97E4739330007BCB77E6A730F07EF3C6E88233D57BA642DC67967C3136EA3542", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "9CC9DDE74906A6CFEE975F7B8B31F55F410FDD0DFD8D6474B5A144EB29CF8322", "PreviousTxnID": "3839C7D6506483F7B48DBF3523E27BD3745049F6CEEC1E2194181C11116FAAAB", "PreviousTxnLgrSeq": 291162 } }, { "CreatedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "ACE302E9118CA9A0423C36306CC659E413C3196A7E2D44C5D519A8BF468A50D7", "NewFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "Flags": 26214400, "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "OwnerCount": 1 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "92000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291155 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "94000000", "OwnerCount": 3, "Sequence": 291154 }, "PreviousTxnID": "0A7F9BE7463DC3E3512F0228EC348922F6BBDE433A1C4644C60B977BDEB7ED71", "PreviousTxnLgrSeq": 291163 } }, { "CreatedNode": { "LedgerEntryType": "RippleState", "LedgerIndex": "FDC8A4899C79C91D4329811A45695C59B8060F28EA7D923EB6F47E15F42FC312", "NewFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "value": "0" }, "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "ledger_index": 291165, "date": 1762469362000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanBrokerSet/types.ts ================================================ import { Amount } from '../../../types' import { TransactionCommonFields } from '../types' // TODO: remove when lending protocol (XLS-66) is supported on xrpl.js export interface LoanBrokerSet extends TransactionCommonFields { VaultID: string LoanBrokerID?: string Data?: string ManagementFeeRate?: number DebtMaximum?: Amount CoverRateMinimum?: number CoverRateLiquidation?: number } ================================================ FILE: src/containers/shared/components/Transaction/LoanDelete/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { LoanDelete } from './types' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { LoanID } = data.instructions return ( {LoanID} ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanDelete/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { LoanDelete } from './types' import { shortenLoanID } from '../../../utils' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { LoanID } = instructions return (
    {t('deletes')} {t('loan_id')} {shortenLoanID(LoanID)}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanDelete/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const LoanDeleteTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.CANCEL, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/LoanDelete/test/LoanDeleteSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import LoanDelete from './mock_data/LoanDelete.json' const renderComponent = createSimpleRenderFactory(Simple) describe('LoanDelete: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(LoanDelete) expectSimpleRowText( container, 'loan-id', '28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanDelete/test/LoanDeleteTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import LoanDelete from './mock_data/LoanDelete.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('LoanDeleteTableDetail', () => { it('renders with delete action and loan ID', () => { const { container, unmount } = renderComponent(LoanDelete) expect(container.querySelector('.loan-delete')).toHaveTextContent( 'deletesLoan ID28375E...24CD66', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanDelete/test/mock_data/LoanDelete.json ================================================ { "tx": { "Account": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 291194, "LoanID": "28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66", "NetworkID": 3222, "Sequence": 291155, "SigningPubKey": "ED5063FC56A0BD4398964FFD55B3FC353C291C34B81A60BFD33FDC0B036C4D403E", "TransactionType": "LoanDelete", "TxnSignature": "B979EC74ED77776913778854DEC302CCA482719D94718DAED8C61AE3FFAEA1C0031DB9B24A400320BCD6661D51CA08982FB74AE25F16A4943F244426B23DFE08", "ctid": "C004716700000C96", "date": 1762469393000, "hash": "08BAA79D26A977CAD558929F8A67297FFEDCDEC4CB092B159052108ECD3C5A63", "inLedger": 291175, "ledger_index": 291175, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Balance": "94000000", "Flags": 0, "OwnerCount": 2, "Sequence": 291156 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "369E58AA309D1EA2619E990C565B61C92E6A393C8AE0A043663F03D471F324A1", "PreviousFields": { "Balance": "96000000", "Sequence": 291155 }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } } ], "TransactionIndex": 0, "TransactionResult": "tecHAS_OBLIGATIONS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Balance": "94000000", "Flags": 0, "OwnerCount": 2, "Sequence": 291156 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "369E58AA309D1EA2619E990C565B61C92E6A393C8AE0A043663F03D471F324A1", "PreviousFields": { "Balance": "96000000", "Sequence": 291155 }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } } ], "TransactionIndex": 0, "TransactionResult": "tecHAS_OBLIGATIONS" }, "hash": "08BAA79D26A977CAD558929F8A67297FFEDCDEC4CB092B159052108ECD3C5A63", "ledger_index": 291175, "date": 1762469393000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanDelete/types.ts ================================================ import { TransactionCommonFields } from '../types' // TODO: remove when lending protocol (XLS-66) is supported on xrpl.js export interface LoanDelete extends TransactionCommonFields { LoanID: string } ================================================ FILE: src/containers/shared/components/Transaction/LoanManage/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { LoanManage } from './types' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { LoanID } = data.instructions return ( {LoanID} ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanManage/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { LoanManage } from './types' import { shortenLoanID } from '../../../utils' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { LoanID } = instructions return (
    {t('loan_id')} {shortenLoanID(LoanID)}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanManage/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const LoanManageTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.MODIFY, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/LoanManage/test/LoanManageSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import LoanManage from './mock_data/LoanManage.json' const renderComponent = createSimpleRenderFactory(Simple) describe('LoanManage: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(LoanManage) expectSimpleRowText( container, 'loan-id', '28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanManage/test/LoanManageTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import LoanManage from './mock_data/LoanManage.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('LoanManageTableDetail', () => { it('renders with loan ID', () => { const { container, unmount } = renderComponent(LoanManage) expect(container.querySelector('.loan-manage')).toHaveTextContent( 'Loan ID28375E...24CD66', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanManage/test/mock_data/LoanManage.json ================================================ { "tx": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Fee": "2000000", "Flags": 131072, "LastLedgerSequence": 291190, "LoanID": "28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66", "NetworkID": 3222, "Sequence": 291157, "SigningPubKey": "ED99153B1435C4D98191569187E7AF9DF00319794C1A82366E6E2F87B741BA1BBA", "TransactionType": "LoanManage", "TxnSignature": "E7FC58AB8495E798359EBF972A674E8A11366E7F85957EF840BCFA0623F3B4B4F248E8EC279DD8B55830DCB57AF35A6346B083C2538673FF096D1CC0B5B5D504", "ctid": "C004716300000C96", "date": 1762469382000, "hash": "3B281754D397C58E69E56CE25F612B4FAB6AD0B2ABE7ACAF5C1A8829A2CE49FC", "inLedger": 291171, "ledger_index": 291171, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Borrower": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "CloseInterestRate": 200, "ClosePaymentFee": "1", "Flags": 131072, "GracePeriod": 604800, "InterestRate": 500, "LateInterestRate": 1000, "LatePaymentFee": "0.5", "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "LoanBrokerNode": "0", "LoanOriginationFee": "1", "LoanScale": -14, "LoanSequence": 1, "LoanServiceFee": "0.1", "ManagementFeeOutstanding": "0.00009602833405", "NextPaymentDueDate": 815784581, "OverpaymentFee": 500, "OverpaymentInterestRate": 300, "OwnerNode": "0", "PaymentInterval": 2592000, "PaymentRemaining": 7, "PeriodicPayment": "0.8355610375288088", "PreviousPaymentDate": 828744581, "PrincipalOutstanding": "5.83932442929905", "StartDate": 815784581, "TotalValueOutstanding": "5.84892726270317" }, "LedgerEntryType": "Loan", "LedgerIndex": "28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66", "PreviousFields": { "Flags": 0, "NextPaymentDueDate": 831336581 }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "Asset": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7" }, "AssetsAvailable": "54.17763389147314", "AssetsTotal": "60.02646512584226", "Flags": 0, "LossUnrealized": "5.84883123436912", "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerNode": "0", "Scale": 6, "Sequence": 291152, "ShareMPTID": "000000014FF15D0B970E3DA867E1A3F714F1E7E6D67B3B79", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "PreviousFields": { "LossUnrealized": "0" }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "86000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291158 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "88000000", "Sequence": 291157 }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Borrower": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "CloseInterestRate": 200, "ClosePaymentFee": "1", "Flags": 131072, "GracePeriod": 604800, "InterestRate": 500, "LateInterestRate": 1000, "LatePaymentFee": "0.5", "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "LoanBrokerNode": "0", "LoanOriginationFee": "1", "LoanScale": -14, "LoanSequence": 1, "LoanServiceFee": "0.1", "ManagementFeeOutstanding": "0.00009602833405", "NextPaymentDueDate": 815784581, "OverpaymentFee": 500, "OverpaymentInterestRate": 300, "OwnerNode": "0", "PaymentInterval": 2592000, "PaymentRemaining": 7, "PeriodicPayment": "0.8355610375288088", "PreviousPaymentDate": 828744581, "PrincipalOutstanding": "5.83932442929905", "StartDate": 815784581, "TotalValueOutstanding": "5.84892726270317" }, "LedgerEntryType": "Loan", "LedgerIndex": "28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66", "PreviousFields": { "Flags": 0, "NextPaymentDueDate": 831336581 }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "Asset": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7" }, "AssetsAvailable": "54.17763389147314", "AssetsTotal": "60.02646512584226", "Flags": 0, "LossUnrealized": "5.84883123436912", "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerNode": "0", "Scale": 6, "Sequence": 291152, "ShareMPTID": "000000014FF15D0B970E3DA867E1A3F714F1E7E6D67B3B79", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "PreviousFields": { "LossUnrealized": "0" }, "PreviousTxnID": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "PreviousTxnLgrSeq": 291170 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "86000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291158 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "88000000", "Sequence": 291157 }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "3B281754D397C58E69E56CE25F612B4FAB6AD0B2ABE7ACAF5C1A8829A2CE49FC", "ledger_index": 291171, "date": 1762469382000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanManage/types.ts ================================================ import { TransactionCommonFields } from '../types' // TODO: remove when lending protocol (XLS-66) is supported on xrpl.js export interface LoanManage extends TransactionCommonFields { LoanID: string } ================================================ FILE: src/containers/shared/components/Transaction/LoanPay/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { LoanPay } from './types' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { LoanID, Amount: amount } = data.instructions return ( <> {LoanID} ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanPay/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { LoanPay } from './types' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { Amount: amount, LoanID } = instructions return (
    {t('send')} {t('to')} {t('loan_id')} {LoanID}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanPay/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const LoanPayTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.SEND, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/LoanPay/test/LoanPaySimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import LoanPay from './mock_data/LoanPay.json' const renderComponent = createSimpleRenderFactory(Simple) describe('LoanPay: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(LoanPay) expectSimpleRowText( container, 'loan-id', '28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66', ) expectSimpleRowText( container, 'amount', '$5.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanPay/test/LoanPayTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import LoanPay from './mock_data/LoanPay.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('LoanPayTableDetail', () => { it('renders with amount and loan ID', () => { const { container, unmount } = renderComponent(LoanPay) expect(container.querySelector('.loan-pay')).toHaveTextContent( 'Send$5.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7to Loan ID28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanPay/test/mock_data/LoanPay.json ================================================ { "tx": { "Account": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Amount": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "5" }, "Fee": "2000000", "Flags": 0, "LastLedgerSequence": 291188, "LoanID": "28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66", "NetworkID": 3222, "Sequence": 291154, "SigningPubKey": "ED5063FC56A0BD4398964FFD55B3FC353C291C34B81A60BFD33FDC0B036C4D403E", "TransactionType": "LoanPay", "TxnSignature": "B752377C875D27F2578F0CB9F9F29672856FACD23D0109586EC46EE473995EDEF733DEED4B7CBD984B69E8336C4F239C9604BBAADECF8FE1D47C5172C9C63D01", "ctid": "C004716200000C96", "date": 1762469381000, "hash": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "inLedger": 291170, "ledger_index": 291170, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Borrower": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "CloseInterestRate": 200, "ClosePaymentFee": "1", "Flags": 0, "GracePeriod": 604800, "InterestRate": 500, "LateInterestRate": 1000, "LatePaymentFee": "0.5", "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "LoanBrokerNode": "0", "LoanOriginationFee": "1", "LoanScale": -14, "LoanSequence": 1, "LoanServiceFee": "0.1", "ManagementFeeOutstanding": "0.00009602833405", "NextPaymentDueDate": 831336581, "OverpaymentFee": 500, "OverpaymentInterestRate": 300, "OwnerNode": "0", "PaymentInterval": 2592000, "PaymentRemaining": 7, "PeriodicPayment": "0.8355610375288088", "PreviousPaymentDate": 828744581, "PrincipalOutstanding": "5.83932442929905", "StartDate": 815784581, "TotalValueOutstanding": "5.84892726270317" }, "LedgerEntryType": "Loan", "LedgerIndex": "28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66", "PreviousFields": { "ManagementFeeOutstanding": "0.00026732450345", "NextPaymentDueDate": 818376581, "PaymentRemaining": 12, "PrincipalOutstanding": "10", "TotalValueOutstanding": "10.02673245034571" }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Account": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Balance": "96000000", "Flags": 0, "OwnerCount": 2, "Sequence": 291155 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "369E58AA309D1EA2619E990C565B61C92E6A393C8AE0A043663F03D471F324A1", "PreviousFields": { "Balance": "98000000", "Sequence": 291154 }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-54.17763389147314" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "48EF1C5BBC06B44C85D2C16A27D682BB5D3622B99E78EB969B73C679C26D319F", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-50" } }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "10", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "5.84883123436912", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "DebtTotal": "10.02646512584226" }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-31.5001712961694" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8AC6CD6C4F2A31F675CEDE92C5FBEB0E7D2C72A0BD9CF1FA2264984FE524F32E", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-31" } }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "Asset": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7" }, "AssetsAvailable": "54.17763389147314", "AssetsTotal": "60.02646512584226", "Flags": 0, "LossUnrealized": "0", "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerNode": "0", "Scale": 6, "Sequence": 291152, "ShareMPTID": "000000014FF15D0B970E3DA867E1A3F714F1E7E6D67B3B79", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "PreviousFields": { "AssetsAvailable": "50" }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4.32219481235746" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9A3D6C6DFE031982ECF8591700201F7A0F62E4D74564D3810F90B622DC31168", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9" } }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Borrower": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "CloseInterestRate": 200, "ClosePaymentFee": "1", "Flags": 0, "GracePeriod": 604800, "InterestRate": 500, "LateInterestRate": 1000, "LatePaymentFee": "0.5", "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "LoanBrokerNode": "0", "LoanOriginationFee": "1", "LoanScale": -14, "LoanSequence": 1, "LoanServiceFee": "0.1", "ManagementFeeOutstanding": "0.00009602833405", "NextPaymentDueDate": 831336581, "OverpaymentFee": 500, "OverpaymentInterestRate": 300, "OwnerNode": "0", "PaymentInterval": 2592000, "PaymentRemaining": 7, "PeriodicPayment": "0.8355610375288088", "PreviousPaymentDate": 828744581, "PrincipalOutstanding": "5.83932442929905", "StartDate": 815784581, "TotalValueOutstanding": "5.84892726270317" }, "LedgerEntryType": "Loan", "LedgerIndex": "28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66", "PreviousFields": { "ManagementFeeOutstanding": "0.00026732450345", "NextPaymentDueDate": 818376581, "PaymentRemaining": 12, "PrincipalOutstanding": "10", "TotalValueOutstanding": "10.02673245034571" }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Account": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Balance": "96000000", "Flags": 0, "OwnerCount": 2, "Sequence": 291155 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "369E58AA309D1EA2619E990C565B61C92E6A393C8AE0A043663F03D471F324A1", "PreviousFields": { "Balance": "98000000", "Sequence": 291154 }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-54.17763389147314" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "48EF1C5BBC06B44C85D2C16A27D682BB5D3622B99E78EB969B73C679C26D319F", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-50" } }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "10", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "5.84883123436912", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "DebtTotal": "10.02646512584226" }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-31.5001712961694" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8AC6CD6C4F2A31F675CEDE92C5FBEB0E7D2C72A0BD9CF1FA2264984FE524F32E", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-31" } }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "Asset": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7" }, "AssetsAvailable": "54.17763389147314", "AssetsTotal": "60.02646512584226", "Flags": 0, "LossUnrealized": "0", "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerNode": "0", "Scale": 6, "Sequence": 291152, "ShareMPTID": "000000014FF15D0B970E3DA867E1A3F714F1E7E6D67B3B79", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "PreviousFields": { "AssetsAvailable": "50" }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4.32219481235746" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9A3D6C6DFE031982ECF8591700201F7A0F62E4D74564D3810F90B622DC31168", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9" } }, "PreviousTxnID": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "PreviousTxnLgrSeq": 291168 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "C56440AE7007618356BA3E7C87E4822684156D08E6FC69194C864DBC624DFDA2", "ledger_index": 291170, "date": 1762469381000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanPay/types.ts ================================================ import { Amount } from '../../../types' import { TransactionCommonFields } from '../types' // TODO: remove when lending protocol (XLS-66) is supported on xrpl.js export interface LoanPay extends TransactionCommonFields { LoanID: string Amount: Amount } ================================================ FILE: src/containers/shared/components/Transaction/LoanSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { useContext } from 'react' import { useQuery } from 'react-query' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { Account } from '../../Account' import { formatDurationDetailed } from '../../../utils' import { JsonView } from '../../JsonView' import SocketContext from '../../../SocketContext' import { getVaultAssetFromLoanBroker } from '../utils/vaultUtils' import { formatAmountWithAsset } from '../../../../../rippled/lib/txSummary/formatAmount' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const { loanBrokerID, counterparty, principalRequestedRaw, loanOriginationFeeRaw, loanServiceFeeRaw, latePaymentFeeRaw, closePaymentFeeRaw, paymentTotal, paymentInterval, gracePeriod, dataFromHex, dataAsJson, interestRatePercent, lateInterestRatePercent, closeInterestRatePercent, overpaymentInterestRatePercent, overpaymentFeePercent, } = data.instructions // Fetch Vault asset information from LoanBroker const { data: vaultAsset } = useQuery( ['vaultAssetFromLoanBroker', loanBrokerID], () => getVaultAssetFromLoanBroker(rippledSocket, loanBrokerID), { enabled: !!loanBrokerID && !!rippledSocket }, ) // Format amounts with correct currency const principalRequested = vaultAsset && principalRequestedRaw !== undefined ? formatAmountWithAsset(principalRequestedRaw, vaultAsset) : undefined const loanOriginationFee = vaultAsset && loanOriginationFeeRaw !== undefined ? formatAmountWithAsset(loanOriginationFeeRaw, vaultAsset) : undefined const loanServiceFee = vaultAsset && loanServiceFeeRaw !== undefined ? formatAmountWithAsset(loanServiceFeeRaw, vaultAsset) : undefined const latePaymentFee = vaultAsset && latePaymentFeeRaw !== undefined ? formatAmountWithAsset(latePaymentFeeRaw, vaultAsset) : undefined const closePaymentFee = vaultAsset && closePaymentFeeRaw !== undefined ? formatAmountWithAsset(closePaymentFeeRaw, vaultAsset) : undefined return ( <> {loanBrokerID} {counterparty && ( )} {principalRequested && ( )} {interestRatePercent && ( {interestRatePercent} )} {paymentTotal !== undefined && ( {paymentTotal} )} {paymentInterval !== undefined && ( {formatDurationDetailed(paymentInterval)} )} {gracePeriod !== undefined && ( {formatDurationDetailed(gracePeriod)} )} {loanOriginationFee && ( )} {loanServiceFee && ( )} {latePaymentFee && ( )} {closePaymentFee && ( )} {overpaymentFeePercent && ( {overpaymentFeePercent} )} {lateInterestRatePercent && ( {lateInterestRatePercent} )} {closeInterestRatePercent && ( {closeInterestRatePercent} )} {overpaymentInterestRatePercent && ( {overpaymentInterestRatePercent} )} {dataFromHex && ( {dataAsJson ? : dataFromHex} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanSet/TableDetail.tsx ================================================ import { useTranslation, Trans } from 'react-i18next' import { useContext } from 'react' import { useQuery } from 'react-query' import { TransactionTableDetailProps } from '../types' import { Amount } from '../../Amount' import { Account } from '../../Account' import { formatDurationDetailed, shortenLoanBrokerID } from '../../../utils' import SocketContext from '../../../SocketContext' import { getVaultAssetFromLoanBroker } from '../utils/vaultUtils' import { formatAmountWithAsset } from '../../../../../rippled/lib/txSummary/formatAmount' export const TableDetail = ({ instructions }: TransactionTableDetailProps) => { const { t } = useTranslation() const rippledSocket = useContext(SocketContext) const { loanBrokerID, principalRequestedRaw, counterparty, paymentTotal, paymentInterval, gracePeriod, loanOriginationFeeRaw, loanServiceFeeRaw, interestRatePercent, lateInterestRatePercent, overpaymentFeePercent, } = instructions // Fetch Vault asset information from LoanBroker const { data: vaultAsset } = useQuery( ['vaultAssetFromLoanBroker', loanBrokerID], () => getVaultAssetFromLoanBroker(rippledSocket, loanBrokerID), { enabled: !!loanBrokerID && !!rippledSocket }, ) // Format amounts with correct currency const principalRequested = vaultAsset && principalRequestedRaw !== undefined ? formatAmountWithAsset(principalRequestedRaw, vaultAsset) : undefined const loanOriginationFee = vaultAsset && loanOriginationFeeRaw !== undefined ? formatAmountWithAsset(loanOriginationFeeRaw, vaultAsset) : undefined const loanServiceFee = vaultAsset && loanServiceFeeRaw !== undefined ? formatAmountWithAsset(loanServiceFeeRaw, vaultAsset) : undefined return (
    {t('loan_broker_id')}: {shortenLoanBrokerID(loanBrokerID)}
    {principalRequested && (
    {t('request')}: {counterparty && ( <> {t('from')} )}
    )} {(interestRatePercent || lateInterestRatePercent || overpaymentFeePercent) && (
    Rates: {t('interest_rate')} {interestRatePercent} {(lateInterestRatePercent || overpaymentFeePercent) && ', '} ) : ( ), LateInterestRate: lateInterestRatePercent ? ( {t('late_interest_rate')} {lateInterestRatePercent} {overpaymentFeePercent && ', '} ) : ( ), OverpaymentFee: overpaymentFeePercent ? ( {t('overpayment_fee')} {overpaymentFeePercent} ) : ( ), }} />
    )} {(loanOriginationFee || loanServiceFee) && (
    Fees: {t('loan_origination_fee')}{' '} {loanServiceFee && ', '} ) : ( ), LoanServiceFee: loanServiceFee ? ( {t('loan_service_fee')} ) : ( ), }} />
    )} {(paymentTotal !== undefined || paymentInterval !== undefined || gracePeriod !== undefined) && (
    {t('terms')}: {paymentTotal} {t('payment_total')} {(paymentInterval !== undefined || gracePeriod !== undefined) && ', '} ) : ( ), PaymentInterval: paymentInterval !== undefined ? ( {t('payment_interval')}{' '} {formatDurationDetailed(paymentInterval)} {gracePeriod !== undefined && ', '} ) : ( ), GracePeriod: gracePeriod !== undefined ? ( {t('grace_period')} {formatDurationDetailed(gracePeriod)} ) : ( ), }} />
    )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/LoanSet/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' import { parser } from './parser' export const LoanSetTransaction: TransactionMapping = { Simple, TableDetail, parser, action: TransactionAction.MODIFY, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/LoanSet/parser.ts ================================================ import { LoanSet } from './types' import { convertHexToString } from '../../../../../rippled/lib/utils' import { parsePercent } from '../../../NumberFormattingUtils' import { isValidJsonString, ONE_TENTH_BASIS_POINT, ONE_TENTH_BASIS_POINT_CUTOFF, ONE_TENTH_BASIS_POINT_DIGITS, } from '../../../utils' export function parser(tx: LoanSet) { const dataFromHex = tx.Data ? convertHexToString(tx.Data) : undefined return { loanBrokerID: tx.LoanBrokerID, counterparty: tx.Counterparty, principalRequestedRaw: tx.PrincipalRequested, paymentTotal: tx.PaymentTotal, paymentInterval: tx.PaymentInterval, gracePeriod: tx.GracePeriod, loanOriginationFeeRaw: tx.LoanOriginationFee, loanServiceFeeRaw: tx.LoanServiceFee, latePaymentFeeRaw: tx.LatePaymentFee, closePaymentFeeRaw: tx.ClosePaymentFee, dataFromHex, dataAsJson: dataFromHex && isValidJsonString(dataFromHex) ? JSON.parse(dataFromHex) : undefined, interestRatePercent: tx.InterestRate !== undefined ? parsePercent( tx.InterestRate / ONE_TENTH_BASIS_POINT, ONE_TENTH_BASIS_POINT_DIGITS, ONE_TENTH_BASIS_POINT_CUTOFF, ) : undefined, lateInterestRatePercent: tx.LateInterestRate !== undefined ? parsePercent( tx.LateInterestRate / ONE_TENTH_BASIS_POINT, ONE_TENTH_BASIS_POINT_DIGITS, ONE_TENTH_BASIS_POINT_CUTOFF, ) : undefined, closeInterestRatePercent: tx.CloseInterestRate !== undefined ? parsePercent( tx.CloseInterestRate / ONE_TENTH_BASIS_POINT, ONE_TENTH_BASIS_POINT_DIGITS, ONE_TENTH_BASIS_POINT_CUTOFF, ) : undefined, overpaymentInterestRatePercent: tx.OverpaymentInterestRate !== undefined ? parsePercent( tx.OverpaymentInterestRate / ONE_TENTH_BASIS_POINT, ONE_TENTH_BASIS_POINT_DIGITS, ONE_TENTH_BASIS_POINT_CUTOFF, ) : undefined, overpaymentFeePercent: tx.OverpaymentFee !== undefined ? parsePercent( tx.OverpaymentFee / ONE_TENTH_BASIS_POINT, ONE_TENTH_BASIS_POINT_DIGITS, ONE_TENTH_BASIS_POINT_CUTOFF, ) : undefined, } } ================================================ FILE: src/containers/shared/components/Transaction/LoanSet/test/LoanSetSimple.test.tsx ================================================ import { useQuery } from 'react-query' import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import LoanSet from './mock_data/LoanSet.json' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const renderComponent = createSimpleRenderFactory(Simple) describe('LoanSet: Simple', () => { it('renders', () => { // Mock useQuery to return the vault asset information ;(useQuery as jest.Mock).mockReturnValue({ data: { currency: 'USD', issuer: 'ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7' }, isLoading: false, error: null, }) const { container, unmount } = renderComponent(LoanSet) expectSimpleRowText( container, 'loan-broker-id', '7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B', ) expectSimpleRowText( container, 'counterparty', 'rH4absn9JcB8m943YRMNJpuR9HQs56hkr8', ) expectSimpleRowText( container, 'principal-requested', '$10.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) expectSimpleRowText(container, 'payment-total', '12') expectSimpleRowText(container, 'payment-interval', '30d') expectSimpleRowText(container, 'grace-period', '7d') expectSimpleRowText( container, 'loan-origination-fee', '$1.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) expectSimpleRowText( container, 'loan-service-fee', '$0.10 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) expectSimpleRowText( container, 'late-payment-fee', '$0.50 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) expectSimpleRowText( container, 'close-payment-fee', '$1.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7', ) expectSimpleRowText(container, 'overpayment-fee', '0.500%') expectSimpleRowText(container, 'interest-rate', '0.500%') expectSimpleRowText(container, 'late-interest-rate', '1.000%') expectSimpleRowText(container, 'close-interest-rate', '0.200%') expectSimpleRowText(container, 'overpayment-interest-rate', '0.003%') expectSimpleRowText(container, 'data', '{meta: "LoanSet Metadata"}') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanSet/test/LoanSetTableDetail.test.tsx ================================================ import { useQuery } from 'react-query' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import i18n from '../../../../../../i18n/testConfigEnglish' import LoanSet from './mock_data/LoanSet.json' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('LoanSetTableDetail', () => { it('renders with all loan details', () => { // Mock useQuery to return the vault asset information ;(useQuery as jest.Mock).mockReturnValue({ data: { currency: 'USD', issuer: 'ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7' }, isLoading: false, error: null, }) const { container, unmount } = renderComponent(LoanSet) expect(container.querySelector('.loan-set')).toHaveTextContent( 'Loan Broker ID: 7B3AF3...3CB80BRequest: $10.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7 from rH4absn9JcB8m943YRMNJpuR9HQs56hkr8Rates: Interest Rate 0.500%, Late Interest Rate 1.000%, Overpayment Fee 0.500%Fees: Loan Origination Fee $1.00 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7, Loan Service Fee $0.10 USD.ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7Terms: 12 Payment Total, Payment Interval 30d, Grace Period 7d', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/LoanSet/test/mock_data/LoanSet.json ================================================ { "tx": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "CloseInterestRate": 200, "ClosePaymentFee": "1", "Counterparty": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "CounterpartySignature": { "SigningPubKey": "ED5063FC56A0BD4398964FFD55B3FC353C291C34B81A60BFD33FDC0B036C4D403E", "TxnSignature": "E98B5560AEE64C27C680E7B9A83239DB3035958761626186455E56C841EBD88438057A0B355C9410E6E5B1A494BFE957ADD8B4873FC9D4700A3BA1041451A905" }, "Data": "7B226D657461223A224C6F616E536574204D65746164617461227D", "Fee": "2000000", "Flags": 0, "GracePeriod": 604800, "InterestRate": 500, "LastLedgerSequence": 291187, "LateInterestRate": 1000, "LatePaymentFee": "0.5", "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "LoanOriginationFee": "1", "LoanServiceFee": "0.1", "NetworkID": 3222, "OverpaymentFee": 500, "OverpaymentInterestRate": 3, "PaymentInterval": 2592000, "PaymentTotal": 12, "PrincipalRequested": "10", "Sequence": 291156, "SigningPubKey": "ED99153B1435C4D98191569187E7AF9DF00319794C1A82366E6E2F87B741BA1BBA", "TransactionType": "LoanSet", "TxnSignature": "8DA211444677251A1173149739C982FEC8C56D05C293E825F1B94855B805E8A485BE8F54DDD56D3AC6558AB4C001D950408BDB33F2D2044FE73FABC95463E60F", "ctid": "C004716000000C96", "date": 1762469372000, "hash": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "inLedger": 291168, "ledger_index": 291168, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "Loan", "LedgerIndex": "28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66", "NewFields": { "Borrower": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "CloseInterestRate": 200, "ClosePaymentFee": "1", "GracePeriod": 604800, "InterestRate": 500, "LateInterestRate": 1000, "LatePaymentFee": "0.5", "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "LoanOriginationFee": "1", "LoanScale": -14, "LoanSequence": 1, "LoanServiceFee": "0.1", "ManagementFeeOutstanding": "0.00026732450345", "NextPaymentDueDate": 818376581, "OverpaymentFee": 500, "OverpaymentInterestRate": 300, "PaymentInterval": 2592000, "PaymentRemaining": 12, "PeriodicPayment": "0.8355610375288088", "PrincipalOutstanding": "10", "StartDate": 815784581, "TotalValueOutstanding": "10.02673245034571" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Balance": "98000000", "Flags": 0, "OwnerCount": 2, "Sequence": 291154 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "369E58AA309D1EA2619E990C565B61C92E6A393C8AE0A043663F03D471F324A1", "PreviousFields": { "OwnerCount": 1 }, "PreviousTxnID": "7B7D18BDC3DFDC8C91F04D4F4A477C9E99A64F815130F57874CA7482295E4DA2", "PreviousTxnLgrSeq": 291159 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-50" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "48EF1C5BBC06B44C85D2C16A27D682BB5D3622B99E78EB969B73C679C26D319F", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-60" } }, "PreviousTxnID": "0A7F9BE7463DC3E3512F0228EC348922F6BBDE433A1C4644C60B977BDEB7ED71", "PreviousTxnLgrSeq": 291163 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "RootIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113", "PreviousTxnID": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "PreviousTxnLgrSeq": 291165 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "10", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "10.02646512584226", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "LoanSequence": 1 }, "PreviousTxnID": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "PreviousTxnLgrSeq": 291167 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-31" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8AC6CD6C4F2A31F675CEDE92C5FBEB0E7D2C72A0BD9CF1FA2264984FE524F32E", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30" } }, "PreviousTxnID": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "PreviousTxnLgrSeq": 291167 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "RootIndex": "9DED4EC03D7D8F22316E10700C046310C4F96C71DBA219BC679231054F426DCD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9DED4EC03D7D8F22316E10700C046310C4F96C71DBA219BC679231054F426DCD", "PreviousTxnID": "7B7D18BDC3DFDC8C91F04D4F4A477C9E99A64F815130F57874CA7482295E4DA2", "PreviousTxnLgrSeq": 291159 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "Asset": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7" }, "AssetsAvailable": "50", "AssetsTotal": "60.02646512584226", "Flags": 0, "LossUnrealized": "0", "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerNode": "0", "Scale": 6, "Sequence": 291152, "ShareMPTID": "000000014FF15D0B970E3DA867E1A3F714F1E7E6D67B3B79", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "PreviousFields": { "AssetsAvailable": "60", "AssetsTotal": "60" }, "PreviousTxnID": "0A7F9BE7463DC3E3512F0228EC348922F6BBDE433A1C4644C60B977BDEB7ED71", "PreviousTxnLgrSeq": 291163 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "88000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291157 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "90000000", "Sequence": 291156 }, "PreviousTxnID": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "PreviousTxnLgrSeq": 291167 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9A3D6C6DFE031982ECF8591700201F7A0F62E4D74564D3810F90B622DC31168", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" } }, "PreviousTxnID": "7B7D18BDC3DFDC8C91F04D4F4A477C9E99A64F815130F57874CA7482295E4DA2", "PreviousTxnLgrSeq": 291159 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "validated": true }, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "Loan", "LedgerIndex": "28375E885D1F8E46502B1A6FA44B9E2EFC15244F467010082BE314AE6224CD66", "NewFields": { "Borrower": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "CloseInterestRate": 200, "ClosePaymentFee": "1", "GracePeriod": 604800, "InterestRate": 500, "LateInterestRate": 1000, "LatePaymentFee": "0.5", "LoanBrokerID": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "LoanOriginationFee": "1", "LoanScale": -14, "LoanSequence": 1, "LoanServiceFee": "0.1", "ManagementFeeOutstanding": "0.00026732450345", "NextPaymentDueDate": 818376581, "OverpaymentFee": 500, "OverpaymentInterestRate": 300, "PaymentInterval": 2592000, "PaymentRemaining": 12, "PeriodicPayment": "0.8355610375288088", "PrincipalOutstanding": "10", "StartDate": 815784581, "TotalValueOutstanding": "10.02673245034571" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "Balance": "98000000", "Flags": 0, "OwnerCount": 2, "Sequence": 291154 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "369E58AA309D1EA2619E990C565B61C92E6A393C8AE0A043663F03D471F324A1", "PreviousFields": { "OwnerCount": 1 }, "PreviousTxnID": "7B7D18BDC3DFDC8C91F04D4F4A477C9E99A64F815130F57874CA7482295E4DA2", "PreviousTxnLgrSeq": 291159 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-50" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "48EF1C5BBC06B44C85D2C16A27D682BB5D3622B99E78EB969B73C679C26D319F", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-60" } }, "PreviousTxnID": "0A7F9BE7463DC3E3512F0228EC348922F6BBDE433A1C4644C60B977BDEB7ED71", "PreviousTxnLgrSeq": 291163 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "RootIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5B97A3DDC76913125CBF3FB9458955DA93A1D8EA834D770AAFCD0651B2EB3113", "PreviousTxnID": "12FE9E6C435F338E41959A1B8C107F353CC28936387037AAA3749DCB4077B526", "PreviousTxnLgrSeq": 291165 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBuMfvezoska1LReG1CBoayi8esBgqzpQ4", "CoverAvailable": "10", "CoverRateLiquidation": 5000, "CoverRateMinimum": 1000, "Data": "7B226D657461223A224C6F616E42726F6B6572204D65746164617461227D", "DebtMaximum": "1000000000000000e-4", "DebtTotal": "10.02646512584226", "Flags": 0, "LoanSequence": 2, "ManagementFeeRate": 1000, "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerCount": 1, "OwnerNode": "0", "Sequence": 291154, "VaultID": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "VaultNode": "0" }, "LedgerEntryType": "LoanBroker", "LedgerIndex": "7B3AF305C92293AF3F01088298E354E7B649F963427FA4B7F5414EF1383CB80B", "PreviousFields": { "LoanSequence": 1 }, "PreviousTxnID": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "PreviousTxnLgrSeq": 291167 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-31" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8AC6CD6C4F2A31F675CEDE92C5FBEB0E7D2C72A0BD9CF1FA2264984FE524F32E", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30" } }, "PreviousTxnID": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "PreviousTxnLgrSeq": 291167 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "RootIndex": "9DED4EC03D7D8F22316E10700C046310C4F96C71DBA219BC679231054F426DCD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9DED4EC03D7D8F22316E10700C046310C4F96C71DBA219BC679231054F426DCD", "PreviousTxnID": "7B7D18BDC3DFDC8C91F04D4F4A477C9E99A64F815130F57874CA7482295E4DA2", "PreviousTxnLgrSeq": 291159 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3H6XP3x3uzNW89mqSspxAVq3Pzd9hbZhG", "Asset": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7" }, "AssetsAvailable": "50", "AssetsTotal": "60.02646512584226", "Flags": 0, "LossUnrealized": "0", "Owner": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "OwnerNode": "0", "Scale": 6, "Sequence": 291152, "ShareMPTID": "000000014FF15D0B970E3DA867E1A3F714F1E7E6D67B3B79", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "AE7952AFEE76456A1ECA877E1797E9FF842E7FD87D1F2C856B7B1EE10C9654D7", "PreviousFields": { "AssetsAvailable": "60", "AssetsTotal": "60" }, "PreviousTxnID": "0A7F9BE7463DC3E3512F0228EC348922F6BBDE433A1C4644C60B977BDEB7ED71", "PreviousTxnLgrSeq": 291163 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfS5JMvtQk6w5tZbwpSnpx15U8qrXWW8yi", "Balance": "88000000", "Flags": 0, "OwnerCount": 5, "Sequence": 291157 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3A16624DDD503F0F01A1C777E597D3513B30E06576BD5DB5C59FBC604BCEBFC", "PreviousFields": { "Balance": "90000000", "Sequence": 291156 }, "PreviousTxnID": "61300C6409AA68AEFFBEED82B1A446AADA8FFE11152E901C36C524D62F242B54", "PreviousTxnLgrSeq": 291167 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rH4absn9JcB8m943YRMNJpuR9HQs56hkr8", "value": "1000000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "ra8dG1xwi5dQTJx1fRNCc8gjSAdQMX3vV7", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9A3D6C6DFE031982ECF8591700201F7A0F62E4D74564D3810F90B622DC31168", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" } }, "PreviousTxnID": "7B7D18BDC3DFDC8C91F04D4F4A477C9E99A64F815130F57874CA7482295E4DA2", "PreviousTxnLgrSeq": 291159 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "636378D09168009F4ED87A933ACA7EDD9278B2D8F14D654DD759FE8687E4BDC6", "ledger_index": 291168, "date": 1762469372000 } ================================================ FILE: src/containers/shared/components/Transaction/LoanSet/types.ts ================================================ import { TransactionCommonFields } from '../types' // TODO: remove when lending protocol (XLS-66) is supported on xrpl.js export interface LoanSet extends TransactionCommonFields { LoanBrokerID: string Counterparty?: string CounterpartySignature: object LoanOriginationFee?: string | number LoanServiceFee?: string | number LatePaymentFee?: string | number ClosePaymentFee?: string | number OverpaymentFee?: number InterestRate?: number LateInterestRate?: number CloseInterestRate?: number OverpaymentInterestRate?: number PrincipalRequested: string | number PaymentTotal?: number PaymentInterval?: number GracePeriod?: number Data?: string } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { MPTokenAuthorize } from 'xrpl' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { Account } from '../../Account' import { MPTokenLink } from '../../MPTokenLink' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { MPTokenIssuanceID, Holder } = data.instructions const { t } = useTranslation() return ( <> {Holder && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenAuthorize/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' export const MPTokenAuthorizeTransaction: TransactionMapping = { Simple, action: TransactionAction.MODIFY, category: TransactionCategory.MPT, } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenAuthorize/test/MPTokenAuthorizeSimple.test.jsx ================================================ import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import { expectSimpleRowText, expectSimpleRowNotToExist } from '../../test' import transactionSuccess from './mock_data/MPTokenAuthorize.json' import transactionFail from './mock_data/MPTokenAuthorize_Fail.json' import transactionWithHolder from './mock_data/MPTokenAuthorize_WithHolder.json' import transactionWithHolderFail from './mock_data/MPTokenAuthorize_WithHolderFail.json' const renderComponent = createSimpleRenderFactory(Simple) describe('MPTokenAuthorize', () => { it('handles MPTokenAuthorize w/o holder simple view ', () => { const { container, unmount } = renderComponent(transactionSuccess) expectSimpleRowText( container, 'mpt-issuance-id', '000005F398B624EBD06822198649C920C8B20ADB8EBE745E', ) expectSimpleRowNotToExist(container, 'mpt-holder') unmount() }) it('handles MPTokenAuthorize view w/ holder simple view ', () => { const { container, unmount } = renderComponent(transactionWithHolder) expectSimpleRowText( container, 'mpt-issuance-id', '0000130B63FC523E33FDF4D1318D8D484B0D1111098CFD0B', ) expectSimpleRowText( container, 'mpt-holder', 'rK3bB9myvWoMaLbLnpksGx2Zz58BL225am', ) unmount() }) it('handles failed MPTokenAuthorize view w/ holder simple view ', () => { const { container, unmount } = renderComponent(transactionWithHolderFail) expectSimpleRowText( container, 'mpt-issuance-id', '00000F76D46440EE21F74E5B2398315BC1CFEB9A7EB48A14', ) expectSimpleRowText( container, 'mpt-holder', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) unmount() }) it('handles failed MPTokenAuthorize w/o holder simple view ', () => { const { container, unmount } = renderComponent(transactionFail) expectSimpleRowText( container, 'mpt-issuance-id', '0000098410531B842DEECCF4ABB1268C931EB71D9F6A1B64', ) expectSimpleRowNotToExist(container, 'mpt-holder') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize.json ================================================ { "tx": { "Account": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny", "Fee": "10", "Flags": 2147483648, "MPTokenIssuanceID": "000005F398B624EBD06822198649C920C8B20ADB8EBE745E", "Sequence": 1524, "SigningPubKey": "ED97BAFB2D380AF67DA2C1968C3A1DC38797E9BA0653CE620F6BC97FFD66925EBB", "TransactionType": "MPTokenAuthorize", "TxnSignature": "28879892AF0D465063993BD1DDCA147C7CA0AB9C8429DAB3A0030AA4AC57AA80F725F295622913C07E4CAFB3160DEF7E8D0209429390B0FBD78F96B28E700A07", "ctid": "C00005F600000000", "date": 1711397033000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny", "Balance": "99999990", "Flags": 0, "OwnerCount": 1, "Sequence": 1525 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "424AAE60FE8A4B7EF77DA492F9561AAFA1D09DB56BE5804B055235BCD662C9FE", "PreviousFields": { "Balance": "100000000", "OwnerCount": 0, "Sequence": 1524 }, "PreviousTxnID": "B6301327D79A93DC211043ABF66A60DC9C70BD2962FC42E0EAD0A829680ABAE8", "PreviousTxnLgrSeq": 1524 } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "65BCF554A41D30521B876D012D3DC167F9E886E02D88231E9DEBD2501A4A7BB5", "NewFields": { "Owner": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny", "RootIndex": "65BCF554A41D30521B876D012D3DC167F9E886E02D88231E9DEBD2501A4A7BB5" } } }, { "CreatedNode": { "LedgerEntryType": "MPToken", "LedgerIndex": "91D261494BB3D64D5D3D12BD480EB58C5E2B21F3222B12FE442BC73276C27266", "NewFields": { "Account": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny", "MPTokenIssuanceID": "000005F398B624EBD06822198649C920C8B20ADB8EBE745E" } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "9592E76A725CF4A5A441024EE80596DFE8809D1AD1EC28A8D9DB2CEC2CB81EDC", "ledger_index": 1526, "date": 1711397033000 } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_Fail.json ================================================ { "tx": { "Account": "rJtok1j4okh4HkKxC3ArAvZbMD1vcDSteo", "Fee": "10", "Flags": 2147483648, "MPTokenIssuanceID": "0000098410531B842DEECCF4ABB1268C931EB71D9F6A1B64", "Sequence": 2438, "SigningPubKey": "EDE493F0B7846A102A5C6EF4FDD9E95D1A84B0BEB99DED06C4436C0D61E5FA0B67", "TransactionType": "MPTokenAuthorize", "TxnSignature": "C903E4BA935BA27424D05CA230385FBA392CB4B48C136E37EF5DABE07814A2A8FA0AAEE34FCAB994D1AED7A663EB4CA121FA07B83E3C5A74289ABA258AA45F00", "ctid": "C000098800000000", "date": 1711398512000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rJtok1j4okh4HkKxC3ArAvZbMD1vcDSteo", "Balance": "99999980", "Flags": 0, "OwnerCount": 1, "Sequence": 2439 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FE496E6B5CBE4778460846E5B93648B41E15463E691311EA4CD7E578561CA20E", "PreviousFields": { "Balance": "99999990", "Sequence": 2438 }, "PreviousTxnID": "26BB8D3B11AA0C967470DBA5D6B09A10608B4D1DADE0408668A45C010F4B8DDC", "PreviousTxnLgrSeq": 2439 } } ], "TransactionIndex": 0, "TransactionResult": "tecMPTOKEN_EXISTS" }, "hash": "7B785C2D172D8FAE35DBBA66868D147747F32B5D6AA41F62D698E872643CE2B6", "ledger_index": 2440, "date": 1711398512000 } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json ================================================ { "tx": { "Account": "rwfgw2dWqUAexB46z5QRq2dJcgTK9piw5w", "Fee": "10", "Flags": 2147483648, "Holder": "rK3bB9myvWoMaLbLnpksGx2Zz58BL225am", "MPTokenIssuanceID": "0000130B63FC523E33FDF4D1318D8D484B0D1111098CFD0B", "Sequence": 4876, "SigningPubKey": "ED936E848B8E37D20991C2E1C5C76ABAEC0625D693CEB85BA495B58E16712DA627", "TransactionType": "MPTokenAuthorize", "TxnSignature": "3F31AD3682B9261975E27895DFCB9F373C33C174A076445C33AE13A6713D7FC8C8305A4D05C4918979C9EAD0230A61CE9998B71BEE21653D6BFCCC65F599100E", "ctid": "C000130F00000000", "date": 1711400951000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rwfgw2dWqUAexB46z5QRq2dJcgTK9piw5w", "Balance": "99999980", "Flags": 0, "OwnerCount": 1, "Sequence": 4877 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C688ECD4065B909634121581E792188424F29B48C062F1D1D4FED180DEAF3A23", "PreviousFields": { "Balance": "99999990", "Sequence": 4876 }, "PreviousTxnID": "D12E5ED52F495449A537DB9293174209CC132CDCD4EFBBACCEB7F8E8FC582BBC", "PreviousTxnLgrSeq": 4877 } }, { "ModifiedNode": { "FinalFields": { "Account": "rK3bB9myvWoMaLbLnpksGx2Zz58BL225am", "Flags": 2, "MPTokenIssuanceID": "0000130B63FC523E33FDF4D1318D8D484B0D1111098CFD0B", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "E6BC3F027146E5A2A50C01C37E7C5320E608C9D1D5BE763F32748865DB6EF3DE", "PreviousFields": { "Flags": 0 }, "PreviousTxnID": "FA5F2B8CE18C33D09E0243A2D20319AB9AF9D6CF5F1C2568B0CC4764DEC31F7A", "PreviousTxnLgrSeq": 4878 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "5F92E78273BCF8A71E129F2CC9B8B0D5611E79D4CF81B530BF7B69892A579060", "ledger_index": 4879, "date": 1711400951000 } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json ================================================ { "tx": { "Account": "rL4pMQAa3V7s9QNw1wEk2znnhjbfYo4GQC", "Fee": "10", "Flags": 2147483648, "Holder": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "MPTokenIssuanceID": "00000F76D46440EE21F74E5B2398315BC1CFEB9A7EB48A14", "Sequence": 3959, "SigningPubKey": "EDF7A3D93CE3AA46168649283C20C2D4FC36642FDD87449F1CCF068638BF17B10E", "TransactionType": "MPTokenAuthorize", "TxnSignature": "2795F1DC9C54493ADE475800A67FD5B3BC7B65F4E343CEEA0950E994F0FC10D0DAED13B4B0FD345E92BFD2B4F42A09A44906D5B2CD1D8FD7A4B3D28983F51806", "ctid": "C0000F7900000000", "date": 1711400033000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rL4pMQAa3V7s9QNw1wEk2znnhjbfYo4GQC", "Balance": "99999980", "Flags": 0, "OwnerCount": 1, "Sequence": 3960 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "00BFE84169F6CAA5D03348856B57D47788B6856ABA9FA6EC7A16E6DA1B99B9D7", "PreviousFields": { "Balance": "99999990", "Sequence": 3959 }, "PreviousTxnID": "E07D68B9728EE8954C66219FF713782933612A7D5EF44B50F5485557629DFE3D", "PreviousTxnLgrSeq": 3960 } } ], "TransactionIndex": 0, "TransactionResult": "tecNO_AUTH" }, "hash": "95AE2E382D6CFBFCECC012DDC52458E753FB9208A5040D2F441B5DE5BEA535CF", "ledger_index": 3961, "date": 1711400033000 } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { MPTokenIssuanceCreateInstructions } from './types' import { useLanguage } from '../../../hooks' import { isValidJsonString, localizeNumber } from '../../../utils' import { MPTokenLink } from '../../MPTokenLink' import { JsonView } from '../../JsonView' import './styles.scss' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { issuanceID, metadata, assetScale, transferFee, maxAmount } = data.instructions const { t } = useTranslation() const language = useLanguage() const formattedFee = transferFee && `${localizeNumber((transferFee / 1000).toPrecision(5), language, { minimumFractionDigits: 3, })}%` return ( <> {issuanceID && ( )} {assetScale && ( {assetScale} )} {transferFee && ( {formattedFee} )} {maxAmount && ( {maxAmount} )} {metadata && ( {isValidJsonString(metadata) ? ( ) : ( metadata )} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceCreate/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const MPTokenIssuanceCreateTransaction: TransactionMapping = { Simple, action: TransactionAction.CREATE, category: TransactionCategory.MPT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceCreate/parser.ts ================================================ import type { MPTokenIssuanceCreate } from 'xrpl' import { MPTokenIssuanceCreateInstructions } from './types' import { TransactionParser } from '../types' import { convertHexToString } from '../../../../../rippled/lib/utils' export const parser: TransactionParser< MPTokenIssuanceCreate, MPTokenIssuanceCreateInstructions > = (tx, meta) => ({ issuanceID: meta.mpt_issuance_id, metadata: tx.MPTokenMetadata ? convertHexToString(tx.MPTokenMetadata) : undefined, transferFee: tx.TransferFee, assetScale: tx.AssetScale, maxAmount: tx.MaximumAmount ? BigInt(tx.MaximumAmount).toString(10) : undefined, }) ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceCreate/styles.scss ================================================ .jv-indent { border-left: none; } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/MPTokenIssuanceCreateSimple.test.jsx ================================================ import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import { expectSimpleRowText } from '../../test' import transactionSuccess from './mock_data/MPTokenIssuanceCreate.json' const renderComponent = createSimpleRenderFactory(Simple) describe('MPTokenIssuanceCreate', () => { it('handles MPTokenIssuanceCreate simple view ', () => { const { container, unmount } = renderComponent(transactionSuccess) expectSimpleRowText( container, 'mpt-issuance-id', '0000157844C3F3B57A8B579FEE1033CC8E8498729D063617', ) expectSimpleRowText(container, 'mpt-asset-scale', '2') expectSimpleRowText(container, 'mpt-max-amount', '9223372036854775807') expectSimpleRowText( container, 'mpt-metadata', 'https://ipfs.io/ipfs/QmZnjmB9Tk4xaA9E679ytrPXda3beWMLUnMB5RFj1eStLp', ) expectSimpleRowText(container, 'mpt-fee', '0.010%') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/mock_data/MPTokenIssuanceCreate.json ================================================ { "tx": { "Account": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg", "AssetScale": 2, "Fee": "10", "Flags": 34, "MPTokenMetadata": "68747470733A2F2F697066732E696F2F697066732F516D5A6E6A6D4239546B34786141394536373979747250586461336265574D4C556E4D423552466A316553744C70", "MaximumAmount": "9223372036854775807", "Sequence": 5496, "SigningPubKey": "EDAD408FAEE57EB4A347E6FE395B834DD47C6531C3C37B09ACC35528161CAD4B0E", "TransactionType": "MPTokenIssuanceCreate", "TransferFee": 10, "TxnSignature": "F7AA8083EE7D7EFD10E11FF5A12B73D2D45A80094AEED4B41FBF2A90C9E03E5E4D162E91FA1EC156BF94E770E70E7633DF09665A5C2D5408178FC376BFC9B100", "ctid": "C000157A00000000", "date": 1710949602000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg", "Balance": "99999990", "Flags": 0, "OwnerCount": 1, "Sequence": 5497 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1996F74D57092C1AC261F55CB16A45A63C785993691869A431D72A5BF8AF47A0", "PreviousFields": { "Balance": "100000000", "OwnerCount": 0, "Sequence": 5496 }, "PreviousTxnID": "531254FC0F1599CCAF9ABCDBE0854B6BFBBA225ADD7CA341D2897CBDC3E78E5E", "PreviousTxnLgrSeq": 5496 } }, { "CreatedNode": { "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "265CEA78D8246B8B51D5CCC20AF4DB95569DE09E53115C888B176A3D1D05048A", "NewFields": { "AssetScale": 2, "Flags": 34, "Issuer": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg", "MPTokenMetadata": "68747470733A2F2F697066732E696F2F697066732F516D5A6E6A6D4239546B34786141394536373979747250586461336265574D4C556E4D423552466A316553744C70", "MaximumAmount": "9223372036854775807", "Sequence": 5496, "TransferFee": 10 } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3A6F809498F6C0E3664BD8451BBAE5F972E45AF17537354D1C28F3A00B35BDFE", "NewFields": { "Owner": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg", "RootIndex": "3A6F809498F6C0E3664BD8451BBAE5F972E45AF17537354D1C28F3A00B35BDFE" } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "mpt_issuance_id": "0000157844C3F3B57A8B579FEE1033CC8E8498729D063617" }, "hash": "9686DA1322D2D8F9CD97C5848A8E3CADB9D3F73154DA59BB3A3CACC4CA43671C", "ledger_index": 5498, "date": 1710949602000 } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceCreate/types.ts ================================================ export interface MPTokenIssuanceCreateInstructions { issuanceID?: string metadata?: string transferFee?: number assetScale?: number maxAmount?: string } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { MPTokenIssuanceDestroy } from 'xrpl' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { MPTokenLink } from '../../MPTokenLink' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { MPTokenIssuanceID } = data.instructions const { t } = useTranslation() return ( ) } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' export const MPTokenIssuanceDestroyTransaction: TransactionMapping = { Simple, action: TransactionAction.CANCEL, category: TransactionCategory.MPT, } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/MPTokenIssuanceDestroySimple.test.jsx ================================================ import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import { expectSimpleRowText } from '../../test' import transactionSuccess from './mock_data/MPTokenIssuanceDestroy.json' import transactionFail from './mock_data/MPTokenIssuanceDestroy_Fail.json' const renderComponent = createSimpleRenderFactory(Simple) describe('MPTokenIssuanceDestroy', () => { it('handles MPTokenIssuanceDestroy simple view ', () => { const { container, unmount } = renderComponent(transactionSuccess) expectSimpleRowText( container, 'mpt-issuance-id', '0000071E15A457415B9A921957CA1958F0E3B8A049BE8627', ) unmount() }) it('handles failed MPTokenIssuanceDestroy simple view ', () => { const { container, unmount } = renderComponent(transactionFail) expectSimpleRowText( container, 'mpt-issuance-id', '0000097E2ACB52C693EABBB156034140B2ED5E9522C4ACF4', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy.json ================================================ { "tx": { "Account": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1", "Fee": "10", "Flags": 2147483648, "MPTokenIssuanceID": "0000071E15A457415B9A921957CA1958F0E3B8A049BE8627", "Sequence": 1823, "SigningPubKey": "ED31ED6E308C928DA72935A03526C3C5422353EB686908D3ADAD9D573921DBDFB5", "TransactionType": "MPTokenIssuanceDestroy", "TxnSignature": "432417F93E86710B50619E4B9EAA43A7F636546A70D4A854E619AF01108A400519A4022B7BABE4807263CDD7EB43217B9ABB8F9745B988981B1A556D11C83200", "ctid": "C000072100000000", "date": 1710968140000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1", "Balance": "99999980", "Flags": 0, "OwnerCount": 0, "Sequence": 1824 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "27F062565B9B9226F10C5AA25E1AD5C3E70A6A93FF2AB4851614A2C43D083850", "PreviousFields": { "Balance": "99999990", "OwnerCount": 1, "Sequence": 1823 }, "PreviousTxnID": "E6DFD28EDD7213F43B7D0DB1296D09460458709583BEEA29F17C2F63B4DA9FC4", "PreviousTxnLgrSeq": 1824 } }, { "DeletedNode": { "FinalFields": { "Flags": 0, "Issuer": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1", "OutstandingAmount": "0", "OwnerNode": "0", "PreviousTxnID": "E6DFD28EDD7213F43B7D0DB1296D09460458709583BEEA29F17C2F63B4DA9FC4", "PreviousTxnLgrSeq": 1824, "Sequence": 1822 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "9C882DA4DF7B92FC968A0ADCA8BAFB7842264F98A5E147348C6E6077EAB24AA8" } }, { "DeletedNode": { "FinalFields": { "Flags": 0, "Owner": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1", "RootIndex": "B8124B2AD6A85560C73E1748E2C8B0E5C0871F4439F10B042DD7E4017D864287" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B8124B2AD6A85560C73E1748E2C8B0E5C0871F4439F10B042DD7E4017D864287" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "9EB556D18BFB67F31C8716C7F3CBBB070E1E7B120DEDDC423D25DFAD850BD93A", "ledger_index": 1825, "date": 1710968140000 } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy_Fail.json ================================================ { "tx": { "Account": "rJbNXmT1uhmbghSQAFcgxAAN9yCRCu9y7g", "Fee": "10", "Flags": 2147483648, "MPTokenIssuanceID": "0000097E2ACB52C693EABBB156034140B2ED5E9522C4ACF4", "Sequence": 2431, "SigningPubKey": "EDF5A4F08EDD12BB89658B8DE56558600342AD92D42FEDFAD682F4DAD9647EF5AA", "TransactionType": "MPTokenIssuanceDestroy", "TxnSignature": "C3B5F7D9A21A5EF85663058790DE7F458EA903C0010F3C2E1FEA45647052C2D85231ED4C17EB324A97AC2D4DE9A71F46D277B8A0A7AFB42D30A3EDA42E8E4106", "ctid": "C000098100000000", "date": 1710970247000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rJbNXmT1uhmbghSQAFcgxAAN9yCRCu9y7g", "Balance": "99999990", "Flags": 0, "OwnerCount": 0, "Sequence": 2432 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BA6DF5388FF6BF026D3F8C91893534890F87309A32D30749CC70BCB1C6F1BEF6", "PreviousFields": { "Balance": "100000000", "Sequence": 2431 }, "PreviousTxnID": "07F74CD4BD3E54410E436F9895BC2EC98D35E05F7584CB95D6660AF0411E9283", "PreviousTxnLgrSeq": 2431 } } ], "TransactionIndex": 0, "TransactionResult": "tecNO_PERMISSION" }, "hash": "2F31C86C343B2D2DB3D8B01BDE84E5BFA0BCB86321365A16D93DF806B79B16FD", "ledger_index": 2433, "date": 1710970247000 } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { MPTokenIssuanceSet } from 'xrpl' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { Account } from '../../Account' import { MPTokenLink } from '../../MPTokenLink' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { MPTokenIssuanceID, Holder } = data.instructions const { t } = useTranslation() return ( <> {Holder && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceSet/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' export const MPTokenIssuanceSetTransaction: TransactionMapping = { Simple, action: TransactionAction.MODIFY, category: TransactionCategory.MPT, } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/MPTokenIssuanceSetSimple.test.jsx ================================================ import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import { expectSimpleRowText, expectSimpleRowNotToExist } from '../../test' import transactionSuccess from './mock_data/MPTokenIssuanceSet.json' import transactionNoHolder from './mock_data/MPTokenIssuanceSet_NoHolder.json' import transactionFail from './mock_data/MPTokenIssuanceSet_Fail.json' const renderComponent = createSimpleRenderFactory(Simple) describe('MPTokenIssuanceSet', () => { it('handles MPTokenIssuanceSet simple view ', () => { const { container, unmount } = renderComponent(transactionSuccess) expectSimpleRowText( container, 'mpt-issuance-id', '00000BED9E4ADA3DCC1BE78683C4B623A74013818160590C', ) expectSimpleRowText( container, 'mpt-holder', 'r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg', ) unmount() }) it('handles MPTokenIssuanceSet simple view w/o holder ', () => { const { container, unmount } = renderComponent(transactionNoHolder) expectSimpleRowText( container, 'mpt-issuance-id', '000002609BB39CEC721B5AB337B6BD862ACD2811CBBB5F18', ) expectSimpleRowNotToExist(container, 'mpt-holder') unmount() }) it('handles failed MPTokenIssuanceSet simple view ', () => { const { container, unmount } = renderComponent(transactionFail) expectSimpleRowText( container, 'mpt-issuance-id', '00000F83146C83112AED215CD345F8E7327459BFCF6B8062', ) expectSimpleRowText( container, 'mpt-holder', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json ================================================ { "tx": { "Account": "rERyS9qtwky94UMMjjmbku3uo5aQwAoJ58", "Fee": "10", "Flags": 1, "Holder": "r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg", "MPTokenIssuanceID": "00000BED9E4ADA3DCC1BE78683C4B623A74013818160590C", "Sequence": 3054, "SigningPubKey": "EDF73A1C528F5BFBD6FF2B05D0C71760D7D2DF1DE3496935612E47BCB440F28040", "TransactionType": "MPTokenIssuanceSet", "TxnSignature": "5BC9ABE91A10F86440E301F17DFADD08D2E55E0699441372BE73D843B4481869BD6224ED461BC4F9894E97F1F99562D3CF2CD1A4E991BD7993DC24EDA63F5B05", "ctid": "C0000BF100000000", "date": 1711047580000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg", "Flags": 1, "MPTokenIssuanceID": "00000BED9E4ADA3DCC1BE78683C4B623A74013818160590C", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "DDA698915F22D7CEA45896CB70DCC0DF803E1F573B92B6F0178F1688208EED04", "PreviousFields": { "Flags": 0 }, "PreviousTxnID": "39709CA66D9103354D09070234A14253EC779846BB73477EEB21C5A65144C844", "PreviousTxnLgrSeq": 3056 } }, { "ModifiedNode": { "FinalFields": { "Account": "rERyS9qtwky94UMMjjmbku3uo5aQwAoJ58", "Balance": "99999980", "Flags": 0, "OwnerCount": 1, "Sequence": 3055 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EDD52DA05DAB16BAF6A3B7D47CCB9FEAB7AAC2BDD9CB007F6A3B8E0DBCE50A45", "PreviousFields": { "Balance": "99999990", "Sequence": 3054 }, "PreviousTxnID": "41A99F7E107F813C132B105AB930FD8C6960530DDFA5D98FCEF5A5600DA39D38", "PreviousTxnLgrSeq": 3055 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "4993E5B875E0217ABC92EFC395805F1344D8A9A3D75437EEA457C05EDB3AB20B", "ledger_index": 3057, "date": 1711047580000 } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json ================================================ { "tx": { "Account": "rpizWPf4g8JLWFUT7143Zn9A1n2Dy9bnji", "Fee": "10", "Flags": 1, "Holder": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "MPTokenIssuanceID": "00000F83146C83112AED215CD345F8E7327459BFCF6B8062", "Sequence": 3972, "SigningPubKey": "ED4EC06184C745D99AEAAA16526C900DC181C8546899F462C3D105C11A6677A65A", "TransactionType": "MPTokenIssuanceSet", "TxnSignature": "2A9D1795983016A162F05CEBBD35E65B955BD67AB96B8A2DB2E31027EA67DDF082B1C4D67F9219CBF9893520ACB0ACB80E2ED3CE96496AA4668BCCF4A46EAE0A", "ctid": "C0000F8700000000", "date": 1711048704000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rpizWPf4g8JLWFUT7143Zn9A1n2Dy9bnji", "Balance": "99999980", "Flags": 0, "OwnerCount": 1, "Sequence": 3973 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F937A006AB86775D475946D43BA1612F3BC24A2C144550D4EC0266C2F08303D5", "PreviousFields": { "Balance": "99999990", "Sequence": 3972 }, "PreviousTxnID": "8D322CBF8A965E64FB903551C80A2E1DF9E2480A7AD0B1D98BE56574BC9FE215", "PreviousTxnLgrSeq": 3973 } } ], "TransactionIndex": 0, "TransactionResult": "tecOBJECT_NOT_FOUND" }, "hash": "E47D5242B7E210B9E1DAEFF90DC19DA9310C04CF4444C76F2C76A44533EEC48F", "ledger_index": 3975, "date": 1711048704000 } ================================================ FILE: src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_NoHolder.json ================================================ { "tx": { "Account": "rEUGuTqrySk9o1rZSVx8seuvcsEZymeEYM", "Fee": "10", "Flags": 1, "MPTokenIssuanceID": "000002609BB39CEC721B5AB337B6BD862ACD2811CBBB5F18", "Sequence": 609, "SigningPubKey": "ED92DDE49AA689EC63589623067968B85E4885A9874B3CAB89E07D192EBFA42FF9", "TransactionType": "MPTokenIssuanceSet", "TxnSignature": "6678BF017A62360DAA39156112960D934440467D2E4098958F053B6758A2D237DA82CD27FDA3B35BAB610D74669BF6C4DEB12D77984E48158B2D79C8BAEC3303", "ctid": "C000026400000000", "date": 1711133159000, "hash": "undefined", "inLedger": "undefined", "ledger_index": "undefined", "meta": "undefined", "validated": "undefined", "metaData": "undefined", "status": "undefined" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rEUGuTqrySk9o1rZSVx8seuvcsEZymeEYM", "Balance": "99999980", "Flags": 0, "OwnerCount": 1, "Sequence": 610 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1D54D263727856612FC7C7A27D93532ED0C41B74FA651992C125AD19C900669D", "PreviousFields": { "Balance": "99999990", "Sequence": 609 }, "PreviousTxnID": "CF68A8D929F089F6F53B071250935DD7C3F52F6E175D82E53118265D776D4BF7", "PreviousTxnLgrSeq": 610 } }, { "ModifiedNode": { "FinalFields": { "Flags": 35, "Issuer": "rEUGuTqrySk9o1rZSVx8seuvcsEZymeEYM", "OutstandingAmount": "0", "OwnerNode": "0", "Sequence": 608 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "E8DF796110B1FBD9086A4637491E49843D33D897FBC32F03A33140F76378EE86", "PreviousFields": { "Flags": 34 }, "PreviousTxnID": "CF68A8D929F089F6F53B071250935DD7C3F52F6E175D82E53118265D776D4BF7", "PreviousTxnLgrSeq": 610 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "73C21D8B5DFBF5DE03FCAF0D69C00E9E2918280561E9898C556A1C743A566D47", "ledger_index": 612, "date": 1711133159000 } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenAcceptOffer/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { NFTokenAcceptOfferInstructions } from './types' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { NFTokenLink } from '../../NFTokenLink' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { acceptedOfferIDs, amount, tokenID, seller, buyer } = data.instructions const { t } = useTranslation() return ( <> {acceptedOfferIDs.map((offer) => ( {offer} ))} {amount && seller && buyer && tokenID && ( <> )} ) } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenAcceptOffer/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const NFTokenAcceptOfferTransaction: TransactionMapping = { Simple, action: TransactionAction.FINISH, category: TransactionCategory.NFT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenAcceptOffer/parser.ts ================================================ import type { NFTokenAcceptOffer } from 'xrpl' import { NFTokenAcceptOfferInstructions } from './types' import { TransactionParser } from '../types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' const determineIsSellOffer = (flags: number) => (flags & 1) !== 0 export const parser: TransactionParser< NFTokenAcceptOffer, NFTokenAcceptOfferInstructions > = (tx, meta) => { const acceptedOfferNodes = meta.AffectedNodes.filter( (node: any) => node.DeletedNode?.LedgerEntryType === 'NFTokenOffer', ) const acceptedOfferIDs: string[] = [] if (tx.NFTokenBuyOffer) { acceptedOfferIDs.push(tx.NFTokenBuyOffer) } if (tx.NFTokenSellOffer) { acceptedOfferIDs.push(tx.NFTokenSellOffer) } // If in brokered mode, we must fetch both of the NFTokenOffer nodes // in order to fetch the seller and buyer from each if (acceptedOfferNodes.length > 1) { const buyOfferNode = acceptedOfferNodes.find( (node: any) => !determineIsSellOffer(node.DeletedNode?.FinalFields?.Flags), )?.DeletedNode?.FinalFields const sellOfferNode = acceptedOfferNodes.find((node: any) => determineIsSellOffer(node.DeletedNode?.FinalFields?.Flags), )?.DeletedNode?.FinalFields return { amount: formatAmount(buyOfferNode.Amount), tokenID: meta.nftoken_id, seller: sellOfferNode.Owner, buyer: buyOfferNode.Owner, acceptedOfferIDs, } } const acceptedOfferNode = acceptedOfferNodes[0]?.DeletedNode?.FinalFields if (!acceptedOfferNode) { return { acceptedOfferIDs, } } const amount = formatAmount(acceptedOfferNode.Amount) const tokenID = meta.nftoken_id const offerer = acceptedOfferNode.Owner const accepter = tx.Account const isSellOffer = determineIsSellOffer(acceptedOfferNode.Flags) const seller = isSellOffer ? offerer : accepter const buyer = isSellOffer ? accepter : offerer return { amount, tokenID, seller, buyer, acceptedOfferIDs, } } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/NFTokenAcceptOfferSimple.test.tsx ================================================ import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import transactionBuy from './mock_data/NFTokenAcceptOffer_Buy.json' import transactionSell from './mock_data/NFTokenAcceptOffer_Sell.json' import transactionFailure from './mock_data/NFTokenAcceptOffer_Failure.json' import transactionBroker from './mock_data/NFTokenAcceptOffer_Broker.json' import { expectSimpleRowText, expectSimpleRowNotToExist } from '../../test' const renderComponent = createSimpleRenderFactory(Simple) describe('NFTokenAcceptOffer', () => { it('handles NFTokenAcceptOffer Buy simple view ', () => { const { container, unmount } = renderComponent(transactionBuy) expectSimpleRowText( container, 'token-id', '000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D', ) expectSimpleRowText( container, 'offer-id', '8278760A246D4464EE701D503091B9DB0D9790DD2BBE9CAABCA45B04A1A25B6B', ) expectSimpleRowText(container, 'amount', '\uE9000.0001 XRP') expectSimpleRowText( container, 'buyer', 'rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh', ) expectSimpleRowText( container, 'seller', 'r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g', ) unmount() }) it('handles NFTokenAcceptOffer Sell simple view ', () => { const { container, unmount } = renderComponent(transactionSell) expectSimpleRowText( container, 'token-id', '000800006203F49C21D5D6E022CB16DE3538F248662FC73C216B9CBF00000023', ) expectSimpleRowText( container, 'offer-id', '505E7F1E1EA989C0B0196AB7F503ACACAC7A9640C27B58A5E3C9DD31E88848D4', ) expectSimpleRowText(container, 'amount', '\uE9000.000102 XRP') expectSimpleRowText( container, 'buyer', 'rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh', ) expectSimpleRowText( container, 'seller', 'r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g', ) unmount() }) it('handles NFTokenAcceptOffer Sell Failure simple view ', () => { const { container, unmount } = renderComponent(transactionFailure) expectSimpleRowText( container, 'offer-id', '17AFFE8C8D94554EB3A31A517B05C16085777FAEA9ACEDDCDE9D7CFD7B988D01', ) expectSimpleRowNotToExist(container, 'token-id') expectSimpleRowNotToExist(container, 'amount') expectSimpleRowNotToExist(container, 'buyer') expectSimpleRowNotToExist(container, 'seller') unmount() }) it('handles NFTokenAcceptOffer from Broker simple view ', () => { const { container, unmount } = renderComponent(transactionBroker) expectSimpleRowText( container, 'token-id', '00081B581189F5687DBB7516339D6CCB5593D96622AD82DF08CFDA8600000A17', ) expect( container.querySelectorAll('[data-testid="offer-id"] .value'), ).toHaveLength(2) expectSimpleRowText(container, 'amount', '\uE9002,500.00 XRP') expectSimpleRowText( container, 'buyer', 'rNYKGnHrjSnKXQGgACciyCLg4xRcwWZixN', ) expectSimpleRowText( container, 'seller', 'rnp9DA6H2tLH7YFkgpjoVREB2yccYv56Sg', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Broker.json ================================================ { "tx": { "Account": "rpZqTPC8GvrSvEfFsUuHkmPCg29GdQuXhC", "Fee": "12", "Flags": 0, "LastLedgerSequence": 76208269, "NFTokenBuyOffer": "A685850D95F9C391CFD2F96DB4D2D70F1C4F23A507F1E195B1D4B50B6F5E9A18", "NFTokenSellOffer": "7BF2F4616B8AB7BED6002F97D70EBE47C03543A19A60E749C9CFEF5AE01966A8", "Sequence": 75453630, "SigningPubKey": "EDFC78FE5C5F474985678DD821FCDD7F65F2F7CC5029E3D0BEB46C9B0D90C622FF", "TransactionType": "NFTokenAcceptOffer", "TxnSignature": "E2FE466B2D7989B04B842937830BC0212CF03E9EE581850211D020CD6251248BD5F01F5865A3283C960451A01741D6D038AACC95B1F4644A7864104D1FD0D905", "date": "2022-12-04T23:35:41Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rNYKGnHrjSnKXQGgACciyCLg4xRcwWZixN", "RootIndex": "24813BB34553FA893101E9B1FEE53252C2DC31431BB5E41358954933E523AB94" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "24813BB34553FA893101E9B1FEE53252C2DC31431BB5E41358954933E523AB94" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "NFTokens": [ { "NFToken": { "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF098255C20000015B" } }, { "NFToken": { "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF283CC552000000CB" } }, { "NFToken": { "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF374DF7CC0000015D" } }, { "NFToken": { "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF4EA91F1A00001293" } } ] }, "LedgerEntryType": "NFTokenPage", "LedgerIndex": "2C17C88F9BDC90AAFFF9D798A700EAF10DC46829FFFFFFFFFFFFFFFFFFFFFFFF", "PreviousFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF08CFDA8600000A17" } }, { "NFToken": { "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF098255C20000015B" } }, { "NFToken": { "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF283CC552000000CB" } }, { "NFToken": { "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF374DF7CC0000015D" } }, { "NFToken": { "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF4EA91F1A00001293" } } ] }, "PreviousTxnID": "E47A58C710B8103A043EB305A04676B027931F984103F6DA545E6D546421AC0D", "PreviousTxnLgrSeq": 75917763 } }, { "ModifiedNode": { "FinalFields": { "Account": "rnp9DA6H2tLH7YFkgpjoVREB2yccYv56Sg", "Balance": "77816893445", "Flags": 0, "OwnerCount": 55, "Sequence": 65701033, "TicketCount": 16 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3E50408AAA1F0A13269A7C8FE93496C88BEE1BDC5C96A8C0CB9003F8FC939F27", "PreviousFields": { "Balance": "75491893445", "OwnerCount": 56 }, "PreviousTxnID": "119DCCC0037FA2211A9F5007836C19FFC8AF0DD13FCF2F59528D27DBE969EDD0", "PreviousTxnLgrSeq": 75965987 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rnp9DA6H2tLH7YFkgpjoVREB2yccYv56Sg", "RootIndex": "6D52AE70F0C878F8642378A6C026F10BF8909A597E1899C8B5005F538ECD450F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "66BECB0CDA8C50AD15E19F4E813BC6C85CAC74C9AC6D205477DEE4E9D7AA3FC6" } }, { "DeletedNode": { "FinalFields": { "Flags": 2, "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF08CFDA8600000A17", "RootIndex": "71E1F9791E5CC8F018E70DD090F5A3B1F8B2BC13C93A56E5E18C821037D24BD1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "71E1F9791E5CC8F018E70DD090F5A3B1F8B2BC13C93A56E5E18C821037D24BD1" } }, { "DeletedNode": { "FinalFields": { "Amount": "2500000000", "Destination": "rpZqTPC8GvrSvEfFsUuHkmPCg29GdQuXhC", "Flags": 1, "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF08CFDA8600000A17", "NFTokenOfferNode": "0", "Owner": "rnp9DA6H2tLH7YFkgpjoVREB2yccYv56Sg", "OwnerNode": "3", "PreviousTxnID": "810CAD96FFF00F69CCC20B7D68855DCB388D625E5F5FA9DD47377107BF7001BF", "PreviousTxnLgrSeq": 75965938 }, "LedgerEntryType": "NFTokenOffer", "LedgerIndex": "7BF2F4616B8AB7BED6002F97D70EBE47C03543A19A60E749C9CFEF5AE01966A8" } }, { "CreatedNode": { "LedgerEntryType": "NFTokenPage", "LedgerIndex": "9485C5C8C36AA7AF2FAAD8E11245C5033A204061FFFFFFFFFFFFFFFFFFFFFFFF", "NewFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF08CFDA8600000A17" } } ] } } }, { "DeletedNode": { "FinalFields": { "Amount": "2500000000", "Flags": 0, "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF08CFDA8600000A17", "NFTokenOfferNode": "0", "Owner": "rNYKGnHrjSnKXQGgACciyCLg4xRcwWZixN", "OwnerNode": "0", "PreviousTxnID": "1C42F9D7C942526AE8B211F8536BF5DBE36743AD5F9DB7B190F14268421A6943", "PreviousTxnLgrSeq": 76208249 }, "LedgerEntryType": "NFTokenOffer", "LedgerIndex": "A685850D95F9C391CFD2F96DB4D2D70F1C4F23A507F1E195B1D4B50B6F5E9A18" } }, { "ModifiedNode": { "FinalFields": { "Account": "rpZqTPC8GvrSvEfFsUuHkmPCg29GdQuXhC", "Balance": "152567272010", "Flags": 0, "OwnerCount": 1, "Sequence": 75453631 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CD3CA85955F9B786BAD89F9125200EB9BCBEE5DCC996CC71A565FAA876CD1ACC", "PreviousFields": { "Balance": "152567272022", "Sequence": 75453630 }, "PreviousTxnID": "4BE847413014620D5904E3D9FA30C92D1F4E2C178B81F9DB6140D6B8499E86C0", "PreviousTxnLgrSeq": 76208241 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNYKGnHrjSnKXQGgACciyCLg4xRcwWZixN", "Balance": "21998970", "Flags": 0, "OwnerCount": 2, "Sequence": 76057635 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E534CA7F437D749A11D955FCC94B056DB08A04FA8105C9C2F6FE38C8AF4198A6", "PreviousFields": { "Balance": "2521998970" }, "PreviousTxnID": "1C42F9D7C942526AE8B211F8536BF5DBE36743AD5F9DB7B190F14268421A6943", "PreviousTxnLgrSeq": 76208249 } }, { "ModifiedNode": { "FinalFields": { "Flags": 1, "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF08CFDA8600000A17", "RootIndex": "EE9EF849B4AB3F45833EAE89B77821729E94CE77A2312D026E41F70644C404D1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EE9EF849B4AB3F45833EAE89B77821729E94CE77A2312D026E41F70644C404D1" } }, { "ModifiedNode": { "FinalFields": { "Account": "rpbjkoncKiv1LkPWShzZksqYPzKXmUhTW7", "Balance": "147197157182", "Domain": "68747470733A2F2F6D61726B6574706C6163652D6170692E6F6E7872702E636F6D2F6170692F6D657461646174612F", "Flags": 0, "MintedNFTokens": 5859, "OwnerCount": 1548, "Sequence": 75447037 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F67A0D5CA164FD7BF50CA0896B50C1C99A0E50EAFF996A4C3BC491FDED8AA296", "PreviousFields": { "Balance": "147022157182" }, "PreviousTxnID": "D95AA7174EDD06CCB0FA5821CF4D37CFFF1DA1016C2FD881EF3C1DD7F48422FD", "PreviousTxnLgrSeq": 76206899 } } ], "TransactionIndex": 7, "TransactionResult": "tesSUCCESS", "nftoken_id": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF08CFDA8600000A17" }, "hash": "E6CE3C3C554BA01891A9D12E89062C34BBEA6282CF8AA4D9AF8BF7D0E7D26B7D", "ledger_index": 76208251, "date": "2022-12-04T23:35:41Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Buy.json ================================================ { "tx": { "Account": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "Fee": "12", "Flags": 0, "LastLedgerSequence": 1799514, "NFTokenBuyOffer": "8278760A246D4464EE701D503091B9DB0D9790DD2BBE9CAABCA45B04A1A25B6B", "Sequence": 1166460, "SigningPubKey": "ED475D1452031E8F9641AF1631519A58F7B8681E172E4838AA0E59408ADA1727DD", "TransactionType": "NFTokenAcceptOffer", "TxnSignature": "61E42CD0A4FF1D16ADBF57743BE0F6061DED3907C5E4AABF4387EDE08E298A9E694360AC381E2FBD7BB6AD5795E4AD303E0BB0D59EE25F0AF44BE5EA362C9D04", "date": "2022-05-03T17:14:22Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "Balance": "9999998276", "Flags": 0, "OwnerCount": 2, "Sequence": 1166460 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "471307512702DC1933C63B795519B8BF08BC4EAD840D87BD84AA98A1EB90DDF6", "PreviousFields": { "Balance": "9999998376", "OwnerCount": 3 }, "PreviousTxnID": "1F0ED931D656F31631BBD186E21DA735EDCDBDC7A68EBD9587C9C1EA5917C4C2", "PreviousTxnLgrSeq": 1799495 } }, { "DeletedNode": { "FinalFields": { "Flags": 1, "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D", "RootIndex": "4866AEDB883C1F063E54457B0BF5FD031CDE4868A1697C84229FA16BA3D2C198" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4866AEDB883C1F063E54457B0BF5FD031CDE4868A1697C84229FA16BA3D2C198" } }, { "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": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D", "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" } } ] }, "PreviousTxnID": "BF21798556EBC55C097A9255CB6C4286CEFEFED8BF09B4F8180921B2F9731FFA", "PreviousTxnLgrSeq": 1799491 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "NFTokens": [ { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C2DCBAB9D00000002", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C3C7172B500000019", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C409177A80000000E", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C44B17C9E00000003", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C577748AB0000000F", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C5B974D9F00000004", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C6E5D19AA00000010", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C727D1EA100000005", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8542EAAD00000011", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8962EFA000000006", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C9C28BBAC00000012", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CA048C0A300000007", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CB30E8CAF00000013", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CB72E91A200000008", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CC9F45DAE00000014", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CCE1462A500000009", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CE0DA2EB100000015", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CE4FA33A40000000A", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CF7BFFFB000000016", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CFBE004A70000000B", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } } ] }, "LedgerEntryType": "NFTokenPage", "LedgerIndex": "6203F49C21D5D6E022CB16DE3538F248662FC73CFFFFFFFFFFFFFFFFFFFFFFFF", "PreviousFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C2DCBAB9D00000002", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C3C7172B500000019", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C409177A80000000E", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C44B17C9E00000003", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C577748AB0000000F", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C5B974D9F00000004", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C6E5D19AA00000010", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C727D1EA100000005", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8542EAAD00000011", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8962EFA000000006", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C9C28BBAC00000012", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CA048C0A300000007", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CB30E8CAF00000013", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CB72E91A200000008", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CC9F45DAE00000014", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CCE1462A500000009", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CE0DA2EB100000015", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CE4FA33A40000000A", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CF7BFFFB000000016", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CFBE004A70000000B", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } } ] }, "PreviousTxnID": "1CB12DE84CD9B989B06D5E062855DCE428A4308DA6762D63F7B78CC500A03024", "PreviousTxnLgrSeq": 1799495 } }, { "DeletedNode": { "FinalFields": { "Amount": "100", "Flags": 0, "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D", "NFTokenOfferNode": "0", "Owner": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "OwnerNode": "0", "PreviousTxnID": "1F0ED931D656F31631BBD186E21DA735EDCDBDC7A68EBD9587C9C1EA5917C4C2", "PreviousTxnLgrSeq": 1799495 }, "LedgerEntryType": "NFTokenOffer", "LedgerIndex": "8278760A246D4464EE701D503091B9DB0D9790DD2BBE9CAABCA45B04A1A25B6B" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "RootIndex": "9F6DDE1956BC72B44EFEA1BD742C97B3A63D3FBDBAE139D595D580690399C860" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9F6DDE1956BC72B44EFEA1BD742C97B3A63D3FBDBAE139D595D580690399C860" } }, { "ModifiedNode": { "FinalFields": { "Account": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "Balance": "10000000036", "BurnedNFTokens": 4, "Flags": 0, "MintedNFTokens": 26, "OwnerCount": 2, "Sequence": 1166461 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BE121B82D5812149D633F605EB07265A80B762A365CE94883089FEEE4B955701", "PreviousFields": { "Balance": "9999999948", "Sequence": 1166460 }, "PreviousTxnID": "3659C5A411DE288820DC8D95F4DE5007BCA9B52D03D3ADD31BE37F0259CA670E", "PreviousTxnLgrSeq": 1799495 } } ], "TransactionIndex": 4, "TransactionResult": "tesSUCCESS", "nftoken_id": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D" }, "hash": "21C60F255B29D0034B9EBA2ED1F7523635C61DED1D6BDBCFFD67703C45F7072D", "ledger_index": 1799495, "date": "2022-05-03T17:14:22Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Failure.json ================================================ { "tx": { "Account": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "Fee": "12", "Flags": 0, "LastLedgerSequence": 1888939, "NFTokenSellOffer": "17AFFE8C8D94554EB3A31A517B05C16085777FAEA9ACEDDCDE9D7CFD7B988D01", "Sequence": 1166473, "SigningPubKey": "EDB9A1F05A7A91250ECB784754F3BEC3A76C3DAB34F28FAC570798EC0B0817407D", "TransactionType": "NFTokenAcceptOffer", "TxnSignature": "5274111A862BD1E61925DADC7F95DF5FEF0B7B79DFAFBB14B6DF72D01554EBC96150D2503A588AE274E20D965CA15C53181256B765A6A6957FE55404AA01E700", "date": "2022-05-06T19:59:52Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "Balance": "9999998008", "Flags": 0, "OwnerCount": 8, "Sequence": 1166474 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "471307512702DC1933C63B795519B8BF08BC4EAD840D87BD84AA98A1EB90DDF6", "PreviousFields": { "Balance": "9999998020", "Sequence": 1166473 }, "PreviousTxnID": "727181396636CDEFBB7D96CD7A86FCCF9F07390360EF1F2E8034384970C0B9DF", "PreviousTxnLgrSeq": 1888920 } } ], "TransactionIndex": 3, "TransactionResult": "tecINSUFFICIENT_FUNDS" }, "hash": "376D09D2D001116D690B47E5AD21DD2AD33896CD3A99C60D584A711E503652B7", "ledger_index": 1888920, "date": "2022-05-06T19:59:52Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Sell.json ================================================ { "tx": { "Account": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "Fee": "12", "Flags": 0, "LastLedgerSequence": 1889209, "NFTokenSellOffer": "505E7F1E1EA989C0B0196AB7F503ACACAC7A9640C27B58A5E3C9DD31E88848D4", "Sequence": 1166479, "SigningPubKey": "EDB9A1F05A7A91250ECB784754F3BEC3A76C3DAB34F28FAC570798EC0B0817407D", "TransactionType": "NFTokenAcceptOffer", "TxnSignature": "53275DA6103CC8CFFFE014305D9934F317F4DCC0A3472B064F5BFAE58F3136D9C6CD33A568688FE2C490A52025E4466939B749B067B6929CD619C6CE62BA150C", "date": "2022-05-06T20:13:30Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "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": "505E7F1E1EA989C0B0196AB7F503ACACAC7A9640C27B58A5E3C9DD31E88848D4" } }, { "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", "nftoken_id": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C216B9CBF00000023" }, "hash": "553922B202932DD500C6E0D6905BA1D8ACC0DF746519DD6AAA724AF70D23F1E6", "ledger_index": 1889191, "date": "2022-05-06T20:13:30Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenAcceptOffer/types.ts ================================================ import { ExplorerAmount } from '../../../types' export interface NFTokenAcceptOfferInstructions { acceptedOfferIDs: string[] amount?: ExplorerAmount tokenID?: string seller?: string buyer?: string } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenBurn/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { NFTokenBurn } from 'xrpl' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { NFTokenLink } from '../../NFTokenLink' import { Account } from '../../Account' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { NFTokenID, Owner } = data.instructions const { t } = useTranslation() return ( <> {Owner && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenBurn/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' export const NFTokenBurnTransaction: TransactionMapping = { Simple, action: TransactionAction.CANCEL, category: TransactionCategory.NFT, } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenBurn/test/NFTokenBurnSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText, expectSimpleRowNotToExist, } from '../../test' import { Simple } from '../Simple' import transaction from './mock_data/NFTokenBurn.json' import transactionByIssuer from './mock_data/NFTokenBurnByIssuer.json' const renderComponent = createSimpleRenderFactory(Simple) describe('NFTokenBurn', () => { it('handles NFTokenBurn simple view ', () => { const { container, unmount } = renderComponent(transaction) expectSimpleRowText( container, 'token-id', '000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D', ) expectSimpleRowNotToExist(container, 'owner') unmount() }) it('handles NFTokenBurn when the burner is not the owner', () => { const { container, unmount } = renderComponent(transactionByIssuer) expectSimpleRowText( container, 'token-id', '00090000DF7682C6F61329B887798E2ABB518BF1C923F4010000099B00000000', ) expectSimpleRowText( container, 'owner', 'rH3Jr1zwADrokm2niuJLEAD5NuoVwBvzpk', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/NFTokenBurn/test/mock_data/NFTokenBurn.json ================================================ { "tx": { "Account": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "Fee": "12", "Flags": 0, "LastLedgerSequence": 1799514, "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D", "Sequence": 1166460, "SigningPubKey": "EDB9A1F05A7A91250ECB784754F3BEC3A76C3DAB34F28FAC570798EC0B0817407D", "TransactionType": "NFTokenBurn", "TxnSignature": "A2D3B290DCE4287F87CC06FBC61D231B74FA9675E272560B6BE375FF571646383617B39311C5A2DDBB5BFC90159670B62387C9737612D1C81BF37E66E1A4B808", "date": "2022-05-03T17:14:30Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "Balance": "9999998264", "Flags": 0, "OwnerCount": 2, "Sequence": 1166461 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "471307512702DC1933C63B795519B8BF08BC4EAD840D87BD84AA98A1EB90DDF6", "PreviousFields": { "Balance": "9999998276", "Sequence": 1166460 }, "PreviousTxnID": "21C60F255B29D0034B9EBA2ED1F7523635C61DED1D6BDBCFFD67703C45F7072D", "PreviousTxnLgrSeq": 1799495 } }, { "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" } } ] }, "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": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } } ] }, "PreviousTxnID": "21C60F255B29D0034B9EBA2ED1F7523635C61DED1D6BDBCFFD67703C45F7072D", "PreviousTxnLgrSeq": 1799495 } }, { "ModifiedNode": { "FinalFields": { "Account": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "Balance": "10000000036", "BurnedNFTokens": 5, "Flags": 0, "MintedNFTokens": 26, "OwnerCount": 2, "Sequence": 1166461 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BE121B82D5812149D633F605EB07265A80B762A365CE94883089FEEE4B955701", "PreviousFields": { "BurnedNFTokens": 4 }, "PreviousTxnID": "21C60F255B29D0034B9EBA2ED1F7523635C61DED1D6BDBCFFD67703C45F7072D", "PreviousTxnLgrSeq": 1799495 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "0804FB2EA692C6095DD44445262B4D175A2EFCDE8D8F90518C7DC4C34986CB42", "ledger_index": 1799496, "date": "2022-05-03T17:14:30Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenBurn/test/mock_data/NFTokenBurnByIssuer.json ================================================ { "tx": { "Account": "rM4ZChGM4VY6dXMgDndBfhwarVngLPhJZZ", "Fee": "10", "Flags": 0, "LastLedgerSequence": 25937903, "NFTokenID": "00090000DF7682C6F61329B887798E2ABB518BF1C923F4010000099B00000000", "Owner": "rH3Jr1zwADrokm2niuJLEAD5NuoVwBvzpk", "Sequence": 25937877, "SigningPubKey": "ED68F374C09FCE011F3CDF457C7C1D497808C0BC46A06D9A3D383A89D9BEE459DB", "TransactionType": "NFTokenBurn", "TxnSignature": "F16DAF30F6E50D2E13708611A39A08FC1218BB1E03EB25C7A8062AE789670C0A1B7A8592DCE971DE9C264B550DF01549D5459CCB8BF82E350AA1C1EC386E2F04", "date": 1675959383000 }, "meta": { "AffectedNodes": [ { "DeletedNode": { "FinalFields": { "Flags": 0, "NFTokens": [ { "NFToken": { "NFTokenID": "00090000DF7682C6F61329B887798E2ABB518BF1C923F4010000099B00000000", "URI": "68747470733A2F2F7872706C2E6F7267" } } ], "PreviousTxnID": "1BADC2BC91690540A45A156BFE60FBE9291019B413CAA4CD7AD821E3BEAB372B", "PreviousTxnLgrSeq": 25937882 }, "LedgerEntryType": "NFTokenPage", "LedgerIndex": "B0E320B82A567FB451C6BBB11AB22E620470ACB5FFFFFFFFFFFFFFFFFFFFFFFF" } }, { "ModifiedNode": { "FinalFields": { "Account": "rM4ZChGM4VY6dXMgDndBfhwarVngLPhJZZ", "Balance": "309999970", "BurnedNFTokens": 1, "Flags": 0, "MintedNFTokens": 1, "OwnerCount": 0, "Sequence": 25937878 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CF5FF4B703D136DE49F9BEEA686005656FA032A83596C624169D93A99E7A716B", "PreviousFields": { "Balance": "309999980", "Sequence": 25937877 }, "PreviousTxnID": "1BADC2BC91690540A45A156BFE60FBE9291019B413CAA4CD7AD821E3BEAB372B", "PreviousTxnLgrSeq": 25937882 } }, { "ModifiedNode": { "FinalFields": { "Account": "rH3Jr1zwADrokm2niuJLEAD5NuoVwBvzpk", "Balance": "289999990", "Flags": 0, "OwnerCount": 0, "Sequence": 25937877 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D34DA06E64E4389D308E0DF4135BB601B3EA434565BD1CDF852474674D8CF52C", "PreviousFields": { "OwnerCount": 1 }, "PreviousTxnID": "1BADC2BC91690540A45A156BFE60FBE9291019B413CAA4CD7AD821E3BEAB372B", "PreviousTxnLgrSeq": 25937882 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "9D9B5483BA1893E9C2767AFAFDE201FF370E9EBDFFD07DA4382D8620823DF872", "ledger_index": 25937884, "date": 1675959383000 } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCancelOffer/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { NFTokenCancelOfferInstructions } from './types' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { NFTokenLink } from '../../NFTokenLink' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { cancelledOffers } = data.instructions const { t } = useTranslation() return ( <> {cancelledOffers.map(({ amount, offerID, tokenID, offerer }) => ( <> {offerID} ))} ) } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCancelOffer/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const NFTokenCancelOfferTransaction: TransactionMapping = { Simple, action: TransactionAction.CANCEL, category: TransactionCategory.NFT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCancelOffer/parser.ts ================================================ import type { NFTokenCancelOffer } from 'xrpl' import { NFTokenCancelOfferInstructions } from './types' import { TransactionParser } from '../types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const parser: TransactionParser< NFTokenCancelOffer, NFTokenCancelOfferInstructions > = (_, meta) => { const cancelledOffers = meta.AffectedNodes.filter( (node: any) => node.DeletedNode?.LedgerEntryType === 'NFTokenOffer', ).map((node: any) => ({ offerID: meta.offer_id, amount: formatAmount(node.DeletedNode.FinalFields.Amount), tokenID: node.DeletedNode.FinalFields.NFTokenID, offerer: node.DeletedNode.FinalFields.Owner, })) return { cancelledOffers, } } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCancelOffer/test/NFTokenCancelOfferSimple.test.tsx ================================================ import { BrowserRouter as Router } from 'react-router' import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { QueryClientProvider } from 'react-query' import { Simple as NFTokenCancelOffer } from '../Simple' import transaction from './mock_data/NFTokenCancelOffer.json' import summarizeTransaction from '../../../../../../rippled/lib/txSummary' import i18n from '../../../../../../i18n/testConfig' import { queryClient } from '../../../../QueryClient' describe('NFTokenCancelOffer', () => { it('handles NFTokenCancelOffer simple view ', () => { const { container } = render( , ) expect( container.querySelector('[data-testid="token-id"] .value'), ).toHaveTextContent( '000800006203F49C21D5D6E022CB16DE3538F248662FC73C258BA1B200000018', ) expect( container.querySelector('[data-testid="offer-id"] .value'), ).toHaveTextContent( '35F3D6D99548FA5F5315580FBF8BA6B15CAA2CAE93023D5CE4FDC130602BC5C3', ) expect( container.querySelector('[data-testid="amount"] .value'), ).toHaveTextContent('$100.00 USD.r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g') expect( container.querySelector('[data-testid="offerer"] .value'), ).toHaveTextContent('r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g') }) }) ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCancelOffer/test/mock_data/NFTokenCancelOffer.json ================================================ { "tx": { "Account": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "Fee": "12", "Flags": 0, "LastLedgerSequence": 1799509, "NFTokenOffers": [ "35F3D6D99548FA5F5315580FBF8BA6B15CAA2CAE93023D5CE4FDC130602BC5C3" ], "Sequence": 1166455, "SigningPubKey": "ED475D1452031E8F9641AF1631519A58F7B8681E172E4838AA0E59408ADA1727DD", "TransactionType": "NFTokenCancelOffer", "TxnSignature": "F144590035403E17E188F0811AC0B29C9722894DB2CF6B947D1766DED10BBAB2EBEB21C286557F215B116A38BAE549EA484590313681C700B7BB32C732943D08", "date": "2022-05-03T17:14:11Z" }, "meta": { "AffectedNodes": [ { "DeletedNode": { "FinalFields": { "Amount": { "currency": "USD", "issuer": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "value": "100" }, "Flags": 1, "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C258BA1B200000018", "NFTokenOfferNode": "0", "Owner": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "OwnerNode": "0", "PreviousTxnID": "EE7864D17CF77C9BD7F1F9047C8E61F3AC306AFDDE53AB20D6CB6C06B336691B", "PreviousTxnLgrSeq": 1799491 }, "LedgerEntryType": "NFTokenOffer", "LedgerIndex": "35F3D6D99548FA5F5315580FBF8BA6B15CAA2CAE93023D5CE4FDC130602BC5C3" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "RootIndex": "AD6F3AF6156005C0482079B801CC331F212FDE722B4F0714B0563173F303C345" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AD6F3AF6156005C0482079B801CC331F212FDE722B4F0714B0563173F303C345" } }, { "ModifiedNode": { "FinalFields": { "Account": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "Balance": "9999999896", "BurnedNFTokens": 3, "Flags": 0, "MintedNFTokens": 25, "OwnerCount": 2, "Sequence": 1166456 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BE121B82D5812149D633F605EB07265A80B762A365CE94883089FEEE4B955701", "PreviousFields": { "Balance": "9999999908", "OwnerCount": 3, "Sequence": 1166455 }, "PreviousTxnID": "EE7864D17CF77C9BD7F1F9047C8E61F3AC306AFDDE53AB20D6CB6C06B336691B", "PreviousTxnLgrSeq": 1799491 } }, { "DeletedNode": { "FinalFields": { "Flags": 2, "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C258BA1B200000018", "RootIndex": "F9544E936304C5F72F89E2560ED23CBA2CCB8AA4ACD77B42093ACB86C95E34EB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F9544E936304C5F72F89E2560ED23CBA2CCB8AA4ACD77B42093ACB86C95E34EB" } } ], "TransactionIndex": 2, "TransactionResult": "tesSUCCESS", "offer_id": "35F3D6D99548FA5F5315580FBF8BA6B15CAA2CAE93023D5CE4FDC130602BC5C3" }, "hash": "AF12B2694896ADE0F93C8C3D09602B242F08C50854A0C600E0E7A2E18586C8C3", "ledger_index": 1799491, "date": "2022-05-03T17:14:11Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCancelOffer/types.ts ================================================ export interface NFTokenCancelOfferInstructions { cancelledOffers: { amount: { currency: string; amount: number; issuer: string } offerID: string tokenID: string offerer: string }[] } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCreateOffer/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { Amount } from '../../Amount' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { NFTokenCreateOfferInstructions } from './types' import { NFTokenLink } from '../../NFTokenLink' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { offerID, account, amount, tokenID, isSellOffer, owner, destination } = data.instructions const { t } = useTranslation() return ( <> {offerID && ( {offerID} )} {destination && ( )} {!isSellOffer && owner && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCreateOffer/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const NFTokenCreateOfferTransaction: TransactionMapping = { Simple, action: TransactionAction.CREATE, category: TransactionCategory.NFT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCreateOffer/parser.ts ================================================ import type { NFTokenCreateOffer } from 'xrpl' import { NFTokenCreateOfferInstructions } from './types' import { TransactionParser } from '../types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const parser: TransactionParser< NFTokenCreateOffer, NFTokenCreateOfferInstructions > = (tx, meta) => { const account = tx.Account const amount = formatAmount(tx.Amount) const tokenID = tx.NFTokenID const isSellOffer = ((tx.Flags as number)! & 1) !== 0 const owner = tx.Owner const offerID = meta.offer_id const destination = tx.Destination return { account, amount, tokenID, isSellOffer, owner, offerID, destination, } } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCreateOffer/test/NFTokenCreateOfferSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import transactionBuy from './mock_data/NFTokenCreateOffer_Buy.json' import transactionSell from './mock_data/NFTokenCreateOffer_Sell.json' import transactionFailed from './mock_data/NFTokenCreateOfferFailed.json' import transactionDestination from './mock_data/NFTokenCreateOfferDestination.json' const renderComponent = createSimpleRenderFactory(Simple) describe('NFTokenCreateOffer', () => { it('handles NFTokenCreateOffer buy simple view ', () => { const { container, unmount } = renderComponent(transactionBuy) expectSimpleRowText( container, 'token-id', '000800006203F49C21D5D6E022CB16DE3538F248662FC73C2DCBAB9D00000002', ) expectSimpleRowText( container, 'offer-id', '3D1C297DA5B831267CCF692F8A023688D6A4BD5AFAE9A746D5C4E0B15D256B29', ) expectSimpleRowText( container, 'owner', 'r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g', ) expectSimpleRowText(container, 'amount', '\uE9000.0001 XRP') expect( container.querySelector('[data-testid="buyer-or-seller"] .label'), ).toHaveTextContent('buyer') expectSimpleRowText( container, 'buyer-or-seller', 'rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh', ) expect( container.querySelector('[data-testid="destination"] .value'), ).not.toBeInTheDocument() unmount() }) it('handles NFTokenCreateOffer sell simple view ', () => { const { container, unmount } = renderComponent(transactionSell) expectSimpleRowText( container, 'token-id', '000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D', ) expectSimpleRowText( container, 'offer-id', 'F660CA62E16B8067649052E8FCE947049FC6EF0D8B42EF7E5819997EC5AE45B6', ) expect( container.querySelector('[data-testid="owner"] .value'), ).not.toBeInTheDocument() expectSimpleRowText( container, 'amount', '$100.00 USD.r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g', ) expect( container.querySelector('[data-testid="buyer-or-seller"] .label'), ).toHaveTextContent('seller') expectSimpleRowText( container, 'buyer-or-seller', 'r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g', ) expect( container.querySelector('[data-testid="destination"] .value'), ).not.toBeInTheDocument() unmount() }) it('handles failed NFTokenCreateOffer transaction', () => { const { container, unmount } = renderComponent(transactionFailed) expectSimpleRowText( container, 'token-id', '00080000AC7377C74DD53E77C8161537F5EBF56B0CE8FD3BD392C2B800001702', ) expect( container.querySelector('[data-testid="offer-id"] .value'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="owner"] .value'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'amount', '\uE900500.00 XRP') unmount() }) it('handles NFTokenCreateOffer with destination', () => { const { container, unmount } = renderComponent(transactionDestination) expectSimpleRowText( container, 'destination', 'rpdUbED32X3YXRPBGzSv8gMTJE66t3sji9', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOfferDestination.json ================================================ { "tx": { "Account": "rpbjkoncKiv1LkPWShzZksqYPzKXmUhTW7", "Amount": { "currency": "5850554E4B000000000000000000000000000000", "issuer": "rHEL3bM4RFsvF8kbQj3cya8YiDvjoEmxLq", "value": "0.5" }, "Destination": "rpdUbED32X3YXRPBGzSv8gMTJE66t3sji9", "Fee": "3200", "Flags": 1, "LastLedgerSequence": 75503875, "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF0E4C932400000475", "Sequence": 75438831, "Signers": [ { "Signer": { "Account": "rpZqTPC8GvrSvEfFsUuHkmPCg29GdQuXhC", "SigningPubKey": "EDFC78FE5C5F474985678DD821FCDD7F65F2F7CC5029E3D0BEB46C9B0D90C622FF", "TxnSignature": "83DFD46E7BCC1ECCA7B90790CA20F1679D01515CD550DC0DB35D2CB58E944FAB7BDF094C3FD97AC96D427938C01548324CB6AB9B7DDA7010710410C2858E8304" } } ], "SigningPubKey": "", "TransactionType": "NFTokenCreateOffer", "date": "2022-11-03T13:52:11Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "49", "Owner": "rpbjkoncKiv1LkPWShzZksqYPzKXmUhTW7", "RootIndex": "DF6BE9CA7E98626513B669C0E8A916F5D828A55AF48DEAFE13A2AF7616C1CCAC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "667B9C412FB987C3C539DD4A5EE74D461A163C9CBF389F8CA2A11DACDAFA2EC8" } }, { "CreatedNode": { "LedgerEntryType": "NFTokenOffer", "LedgerIndex": "9B815A559A5CE9B7BD974F2465E12DACC2FB8CC073D1E7E1529DE84ADAB2CB3C", "NewFields": { "Amount": { "currency": "5850554E4B000000000000000000000000000000", "issuer": "rHEL3bM4RFsvF8kbQj3cya8YiDvjoEmxLq", "value": "0.5" }, "Destination": "rpdUbED32X3YXRPBGzSv8gMTJE66t3sji9", "Flags": 1, "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF0E4C932400000475", "Owner": "rpbjkoncKiv1LkPWShzZksqYPzKXmUhTW7", "OwnerNode": "4a" } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F2DB05119B3C0256D30618BEB899023E9CFBFFF092F839E564B00B853B4F231A", "NewFields": { "Flags": 2, "NFTokenID": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF0E4C932400000475", "RootIndex": "F2DB05119B3C0256D30618BEB899023E9CFBFFF092F839E564B00B853B4F231A" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rpbjkoncKiv1LkPWShzZksqYPzKXmUhTW7", "Balance": "24682484324", "Domain": "68747470733A2F2F6D61726B6574706C6163652D6170692E6F6E7872702E636F6D2F6170692F6D657461646174612F", "Flags": 0, "MintedNFTokens": 4567, "OwnerCount": 2155, "Sequence": 75438832 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F67A0D5CA164FD7BF50CA0896B50C1C99A0E50EAFF996A4C3BC491FDED8AA296", "PreviousFields": { "Balance": "24682487524", "OwnerCount": 2154, "Sequence": 75438831 }, "PreviousTxnID": "E28BE8A4BF9E7F8C3E0492A1560CE98C228C3F2F496FAC94CD1E66BFF46CF5D5", "PreviousTxnLgrSeq": 75503864 } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "FE217FC0DEF05A99601DDD35F61832DFB299EC845D6BD74EAEDCB82A804DEEB2", "PreviousTxnID": "BE2ACA9B3CC2D5EF3D826E79690F28C1F8A90ACF6A0F262FD859F154ABE457BF", "PreviousTxnLgrSeq": 75503861 } } ], "TransactionIndex": 3, "TransactionResult": "tesSUCCESS" }, "hash": "C641C7D195330115AE973F309129F263AF1898F6F98449CAEA0F3E0C07449B33", "ledger_index": 75503866, "date": "2022-11-03T13:52:11Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOfferFailed.json ================================================ { "tx": { "Account": "rG5qYqxdmDmLkVnPrLcWKE6LYTMeFGhYy9", "Amount": "500000000", "Destination": "rpZqTPC8GvrSvEfFsUuHkmPCg29GdQuXhC", "Fee": "3200", "Flags": 1, "LastLedgerSequence": 75482570, "NFTokenID": "00080000AC7377C74DD53E77C8161537F5EBF56B0CE8FD3BD392C2B800001702", "Sequence": 74319468, "Signers": [ { "Signer": { "Account": "rpZqTPC8GvrSvEfFsUuHkmPCg29GdQuXhC", "SigningPubKey": "EDFC78FE5C5F474985678DD821FCDD7F65F2F7CC5029E3D0BEB46C9B0D90C622FF", "TxnSignature": "C193905FA6F5731C090147B8E2EB6D96A4B83BCDCEB5845A0D467D351254140C64F5158B7FF87F295FDFC816DB6019351233A26F0042539D908BC9D651274E03" } } ], "SigningPubKey": "", "TransactionType": "NFTokenCreateOffer", "date": "2022-11-02T14:57:11Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rG5qYqxdmDmLkVnPrLcWKE6LYTMeFGhYy9", "Balance": "218159358161", "Domain": "68747470733A2F2F6D61726B6574706C6163652D6170692E6F6E7872702E636F6D2F6170692F6D657461646174612F", "Flags": 0, "MintedNFTokens": 6443, "OwnerCount": 745, "Sequence": 74319469 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5707571AF2319C0203A9D25CF498F5672EACB4F38AE02327C3E3608175D91CA6", "PreviousFields": { "Balance": "218159361361", "Sequence": 74319468 }, "PreviousTxnID": "BE9714F3CB7A97E901953FB850BB58A0A5D2C39B71F30CF6C80DF86C87327283", "PreviousTxnLgrSeq": 75482561 } } ], "TransactionIndex": 59, "TransactionResult": "tecNO_ENTRY" }, "hash": "2C476AF454BA8D519675B01749A1B76D9E52E2CA6DD7CAA4BD3DBA02E415D528", "ledger_index": 75482561, "date": "2022-11-02T14:57:11Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOffer_Buy.json ================================================ { "tx": { "Account": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "Amount": "100", "Fee": "12", "Flags": 0, "LastLedgerSequence": 1888000, "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C2DCBAB9D00000002", "Owner": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "Sequence": 1166462, "SigningPubKey": "EDB9A1F05A7A91250ECB784754F3BEC3A76C3DAB34F28FAC570798EC0B0817407D", "TransactionType": "NFTokenCreateOffer", "TxnSignature": "D9B8E95ACC258F881D423C723985047FB254D37E545684553492E0B5F68A11806EFBDE36E42413C41794E0F587CC0FA07BA728ED478CFAD0DA63311F3DD04E0C", "date": "2022-05-06T19:12:51Z" }, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "NFTokenOffer", "LedgerIndex": "3D1C297DA5B831267CCF692F8A023688D6A4BD5AFAE9A746D5C4E0B15D256B29", "NewFields": { "Amount": "100", "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C2DCBAB9D00000002", "Owner": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "Balance": "9999998240", "Flags": 0, "OwnerCount": 4, "Sequence": 1166463 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "471307512702DC1933C63B795519B8BF08BC4EAD840D87BD84AA98A1EB90DDF6", "PreviousFields": { "Balance": "9999998252", "OwnerCount": 3, "Sequence": 1166462 }, "PreviousTxnID": "339BFFA30E1340CDD22D910AA079FCCD2B9F4614B996C92C248EAE027F64C9CE", "PreviousTxnLgrSeq": 1887921 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfFRmXUR1yfxeUfXj7WwKhETrtToYx1hYh", "RootIndex": "9F6DDE1956BC72B44EFEA1BD742C97B3A63D3FBDBAE139D595D580690399C860" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9F6DDE1956BC72B44EFEA1BD742C97B3A63D3FBDBAE139D595D580690399C860" } }, { "ModifiedNode": { "FinalFields": { "Flags": 1, "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C2DCBAB9D00000002", "RootIndex": "CB119C8C6C0F9B3DDB02E330412430D34AD05D984F774E601D82C039DF6EF6CA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CB119C8C6C0F9B3DDB02E330412430D34AD05D984F774E601D82C039DF6EF6CA" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "offer_id": "3D1C297DA5B831267CCF692F8A023688D6A4BD5AFAE9A746D5C4E0B15D256B29" }, "hash": "385DC0497AAF8061549A7DC04EB20C2B387A167792796F5806A13E0422125563", "ledger_index": 1887982, "date": "2022-05-06T19:12:51Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOffer_Sell.json ================================================ { "tx": { "Account": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "Amount": { "currency": "USD", "issuer": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "value": "100" }, "Fee": "12", "Flags": 1, "LastLedgerSequence": 1799513, "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D", "Sequence": 1166458, "SigningPubKey": "ED475D1452031E8F9641AF1631519A58F7B8681E172E4838AA0E59408ADA1727DD", "TransactionType": "NFTokenCreateOffer", "TxnSignature": "DAB95285F64A2E0B11E7688755C64CA3C10A638CB4991B02FFF18DF461D2FEE01BC62B4DE3FDEA35ACC82E1C1C5E0879786ED291553525FD4F600F5309B7FA09", "date": "2022-05-03T17:14:22Z" }, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "01CBC3128E14D214746251242FC47F9144DB82DE05D68CAD5499C577F282430F", "NewFields": { "Flags": 2, "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D", "RootIndex": "01CBC3128E14D214746251242FC47F9144DB82DE05D68CAD5499C577F282430F" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "RootIndex": "AD6F3AF6156005C0482079B801CC331F212FDE722B4F0714B0563173F303C345" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AD6F3AF6156005C0482079B801CC331F212FDE722B4F0714B0563173F303C345" } }, { "ModifiedNode": { "FinalFields": { "Account": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "Balance": "9999999960", "BurnedNFTokens": 4, "Flags": 0, "MintedNFTokens": 26, "OwnerCount": 3, "Sequence": 1166459 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BE121B82D5812149D633F605EB07265A80B762A365CE94883089FEEE4B955701", "PreviousFields": { "Balance": "9999999972", "OwnerCount": 2, "Sequence": 1166458 }, "PreviousTxnID": "1CB12DE84CD9B989B06D5E062855DCE428A4308DA6762D63F7B78CC500A03024", "PreviousTxnLgrSeq": 1799495 } }, { "CreatedNode": { "LedgerEntryType": "NFTokenOffer", "LedgerIndex": "F660CA62E16B8067649052E8FCE947049FC6EF0D8B42EF7E5819997EC5AE45B6", "NewFields": { "Amount": { "currency": "USD", "issuer": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "value": "100" }, "Flags": 1, "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D", "Owner": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g" } } } ], "TransactionIndex": 1, "TransactionResult": "tesSUCCESS", "offer_id": "F660CA62E16B8067649052E8FCE947049FC6EF0D8B42EF7E5819997EC5AE45B6" }, "hash": "47DCA082AE5920D672B32E63623B799899B91B77D68365711B07376E5ACFC8DB", "ledger_index": 1799495, "date": "2022-05-03T17:14:22Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenCreateOffer/types.ts ================================================ import { ExplorerAmount } from '../../../types' export interface NFTokenCreateOfferInstructions { account: string amount: ExplorerAmount tokenID: string isSellOffer: boolean owner?: string offerID: string destination?: string } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { NFTokenMintInstructions } from './types' import { Account } from '../../Account' import { useLanguage } from '../../../hooks' import { localizeNumber } from '../../../utils' import { NFTokenLink } from '../../NFTokenLink' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { tokenID, tokenTaxon, uri, transferFee, issuer } = data.instructions const { t } = useTranslation() const language = useLanguage() const formattedFee = transferFee && `${localizeNumber((transferFee / 1000).toPrecision(5), language, { minimumFractionDigits: 3, })}%` return ( <> {tokenID && ( )} {tokenTaxon} {uri && ( {uri} )} {transferFee && ( {formattedFee} )} {issuer && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const NFTokenMintTransaction: TransactionMapping = { Simple, action: TransactionAction.CREATE, category: TransactionCategory.NFT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/parser.ts ================================================ import type { NFTokenMint } from 'xrpl' import { NFTokenMintInstructions } from './types' import { TransactionParser } from '../types' import { convertHexToString } from '../../../../../rippled/lib/utils' export const parser: TransactionParser = ( tx, meta, ) => ({ tokenID: meta.nftoken_id, tokenTaxon: tx.NFTokenTaxon, uri: convertHexToString(tx.URI ?? undefined), transferFee: tx.TransferFee, issuer: tx.Issuer, }) ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/test/NFTokenMintSimple.test.tsx ================================================ import { BrowserRouter as Router } from 'react-router' import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { Simple as NFTokenMint } from '../Simple' import transactionModified2 from './mock_data/NFTokenMintModified2.json' import transactionModified1Created1 from './mock_data/NFTokenMintModified1Created1.json' import transactionModified2Created1 from './mock_data/NFTokenMintMostModified2Created1.json' import transactionWithIssuer from './mock_data/NFTokenMintWithIssuer.json' import transactionModified4Created1 from './mock_data/NFTokenMintModified4Created1.json' import transactionNullURI from './mock_data/NFTokenMintNullURI.json' import transactionFailed from './mock_data/NFTokenMintFailed.json' import summarizeTransaction from '../../../../../../rippled/lib/txSummary' import i18n from '../../../../../../i18n/testConfig' import { convertHexToString } from '../../../../../../rippled/lib/utils' import { expectSimpleRowText, expectSimpleRowNotToExist } from '../../test' describe('NFTokenMint', () => { it('handles NFTokenMint that modified 2 nodes', () => { const { container } = render( , ) expectSimpleRowText( container, 'token-id', '000800006203F49C21D5D6E022CB16DE3538F248662FC73C535743B40000001A', ) expectSimpleRowText(container, 'token-taxon', '1') expectSimpleRowText(container, 'token-uri', 'https://gregweisbrod.com') expectSimpleRowNotToExist(container, 'token-fee') expectSimpleRowNotToExist(container, 'token-issuer') }) it('handles NFTokenMint that modified 1 node and created 1 node', () => { const { container } = render( , ) expectSimpleRowText( container, 'token-id', '0008000085D33F9C5481D3515029C9904D16F0109414D3A00000099A00000000', ) expectSimpleRowText(container, 'token-taxon', '1') expectSimpleRowText(container, 'token-uri', 'https://gregweisbrod.com') expectSimpleRowNotToExist(container, 'token-fee') expectSimpleRowNotToExist(container, 'token-issuer') }) it('handles NFTokenMint that modified 2 nodes and created 1 node', () => { const { container } = render( , ) expectSimpleRowText( container, 'token-id', '0008000085D33F9C5481D3515029C9904D16F0109414D3A0DCBA29BA00000020', ) expectSimpleRowText(container, 'token-taxon', '1') expectSimpleRowText(container, 'token-uri', 'https://gregweisbrod.com') expectSimpleRowNotToExist(container, 'token-fee') expectSimpleRowNotToExist(container, 'token-issuer') }) it('handles NFTokenMint with issuer', () => { const { container } = render( , ) expect( container.querySelector('[data-testid="token-issuer"] .value'), ).toBeInTheDocument() expectSimpleRowText( container, 'token-id', '000861A8A99B4460C2A4CCC90634FD9C7F51940AD9450BE30000099B00000000', ) expectSimpleRowText(container, 'token-taxon', '0') expectSimpleRowText( container, 'token-uri', 'ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf4dfuylqabf3oclgtqy55fbzdi', ) expectSimpleRowText(container, 'token-fee', '25.000%') expectSimpleRowText( container, 'token-issuer', 'rGToUZ1JjRUdv1wXNXKMFn2o4wTM2DLkpg', ) }) it('handles NFTokenMint that modified 3 nodes', () => { const { container } = render( , ) expectSimpleRowText( container, 'token-id', '000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFBEC443000063A7', ) expectSimpleRowText(container, 'token-taxon', '1') expectSimpleRowText( container, 'token-uri', convertHexToString( '516D5071416B3677777577796A71654C476F64665253375156774677394346736A6D363375485661556438387463', ) as string, ) }) it('handles NFTokenMint that has null URI', () => { const { container } = render( , ) expectSimpleRowNotToExist(container, 'token-uri') }) it('handles NFTokenMint that failed', () => { const { container } = render( , ) expectSimpleRowNotToExist(container, 'token-id') expectSimpleRowText(container, 'token-taxon', '19') expectSimpleRowText( container, 'token-uri', convertHexToString( '516D5071416B3677777577796A71654C476F64665253375156774677394346736A6D363375485661556438387463', ) as string, ) }) }) ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintFailed.json ================================================ { "tx": { "Account": "rXMART8usFd5kABXCayoP6ZfB35b4v43t", "Fee": "12", "Flags": 8, "Issuer": "rnth4aXUdfZiMtkctrb1Xu5f6k67yE8FX6", "LastLedgerSequence": 75483624, "Memos": [ { "Memo": { "MemoData": "686474207073616F2F2F206D6E6172742E61722F202F6676696F776D2D6E5374702F622F6E6135656172393366316F393463666533363030696438366E62633230203564463972663662643A316C367037313720343835666F36743239", "MemoType": "465474746D74696E74" } } ], "NFTokenTaxon": 19, "Sequence": 71996319, "SigningPubKey": "ED8BB649713ED492AE35B4B5CA745CCA55ADF8EF4CEDB2CC8BA4E28557E993AD2F", "TransactionType": "NFTokenMint", "TransferFee": 5000, "TxnSignature": "F73CD6E691ADF5DFA04D736D64D080811320609E22534BDE29EF4A53F48C74F79F999A348AA88EDF5F95FF124A5F51D51EF541C60BBE083662FC21C4D2B6F60E", "URI": "516D5071416B3677777577796A71654C476F64665253375156774677394346736A6D363375485661556438387463", "date": "2022-11-02T16:05:10Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rXMART8usFd5kABXCayoP6ZfB35b4v43t", "Balance": "10529594769", "Domain": "786D6172742E617274", "EmailHash": "D48190C85BE485DEA4CF4A56A8E93772", "Flags": 0, "OwnerCount": 4904, "Sequence": 71996320 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "141E89D379C6949CA34BCB244DCBB7A6B2889781B157119CCC05ED19DFB676B0", "PreviousFields": { "Balance": "10529594781", "Sequence": 71996319 }, "PreviousTxnID": "EAA312672DEB6BFE65B07C50F857E892F16A2E25EC6DC3AC73ECED91F9B6E440", "PreviousTxnLgrSeq": 75483606 } } ], "TransactionIndex": 65, "TransactionResult": "tecNO_PERMISSION" }, "hash": "04708041CF404E122D76D009CA8F8D0BF5FD47D6784376CDA8FBE89FF59279E4", "ledger_index": 75483606, "date": "2022-11-02T16:05:10Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified1Created1.json ================================================ { "tx": { "Account": "rDUbAKGzBRs3ztKpfMiWUAB5nwtcmrnRVe", "Fee": "12", "Flags": 8, "LastLedgerSequence": 5605248, "NFTokenTaxon": 1, "Sequence": 5605209, "SigningPubKey": "022DAC45B8CC7B217C47A04957A6DF7FE2C8E4BA485808FCBBFC82E115260E1C32", "TransactionType": "NFTokenMint", "TxnSignature": "3045022100CF7620E25E4763FDC8746CEFAB250C2A6DB67FA581B58CAC928331A92C7661BB0220640A34137AC525CDA0D28A0E2B2832A418516C8B9CF1CFE36A8FC3AA966A66F1", "URI": "68747470733A2F2F677265677765697362726F642E636F6D", "date": "2022-09-13T20:44:40Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rDUbAKGzBRs3ztKpfMiWUAB5nwtcmrnRVe", "Balance": "9999999988", "Flags": 0, "MintedNFTokens": 1, "OwnerCount": 1, "Sequence": 5605210 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "433D9E7BE08CC6D929AE1AE85150F8FADCE098529C41BD134A47DEA255D0DAAC", "PreviousFields": { "Balance": "10000000000", "OwnerCount": 0, "Sequence": 5605209 }, "PreviousTxnID": "EBCF09070D88E39E9C830355AEDA0F412E14345F08F29ED15EBFF2F4CA4500C2", "PreviousTxnLgrSeq": 5605209 } }, { "CreatedNode": { "LedgerEntryType": "NFTokenPage", "LedgerIndex": "85D33F9C5481D3515029C9904D16F0109414D3A0FFFFFFFFFFFFFFFFFFFFFFFF", "NewFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A00000099A00000000", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } } ] } } } ], "TransactionIndex": 1, "TransactionResult": "tesSUCCESS", "nftoken_id": "0008000085D33F9C5481D3515029C9904D16F0109414D3A00000099A00000000" }, "hash": "B0AAA46053F2570200CA1E12978EFFBB124374276669CC3F68602A6788182172", "ledger_index": 5605230, "date": "2022-09-13T20:44:40Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified2.json ================================================ { "tx": { "Account": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "Fee": "12", "Flags": 8, "LastLedgerSequence": 1861454, "NFTokenTaxon": 1, "Sequence": 1166461, "SigningPubKey": "ED475D1452031E8F9641AF1631519A58F7B8681E172E4838AA0E59408ADA1727DD", "TransactionType": "NFTokenMint", "TxnSignature": "683F58F1355FD2EB02D3C84244FE76C67337B8E5D3FF496948A4A338880FD651649F8960251A3DC3A24E9F1B7D45EEA32DD06B2FD501B6CF7ED18C1FEB863F0E", "URI": "68747470733A2F2F677265677765697362726F642E636F6D", "date": "2022-05-05T21:01:31Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "NFTokens": [ { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C2DCBAB9D00000002", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C3C7172B500000019", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C409177A80000000E", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C44B17C9E00000003", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C535743B40000001A", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C577748AB0000000F", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C5B974D9F00000004", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C6E5D19AA00000010", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C727D1EA100000005", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8542EAAD00000011", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8962EFA000000006", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C9C28BBAC00000012", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CA048C0A300000007", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CB30E8CAF00000013", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CB72E91A200000008", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CC9F45DAE00000014", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CCE1462A500000009", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CE0DA2EB100000015", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CE4FA33A40000000A", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CF7BFFFB000000016", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CFBE004A70000000B", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } } ] }, "LedgerEntryType": "NFTokenPage", "LedgerIndex": "6203F49C21D5D6E022CB16DE3538F248662FC73CFFFFFFFFFFFFFFFFFFFFFFFF", "PreviousFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C2DCBAB9D00000002", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C3C7172B500000019", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C409177A80000000E", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C44B17C9E00000003", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C577748AB0000000F", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C5B974D9F00000004", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C6E5D19AA00000010", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C727D1EA100000005", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8542EAAD00000011", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C8962EFA000000006", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C9C28BBAC00000012", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CA048C0A300000007", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CB30E8CAF00000013", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CB72E91A200000008", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CC9F45DAE00000014", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CCE1462A500000009", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CE0DA2EB100000015", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CE4FA33A40000000A", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CF7BFFFB000000016", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "000800006203F49C21D5D6E022CB16DE3538F248662FC73CFBE004A70000000B", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } } ] }, "PreviousTxnID": "21C60F255B29D0034B9EBA2ED1F7523635C61DED1D6BDBCFFD67703C45F7072D", "PreviousTxnLgrSeq": 1799495 } }, { "ModifiedNode": { "FinalFields": { "Account": "r9AExd6v3keXaXa3nXAMHHcP9nWy9Aef2g", "Balance": "10000000024", "BurnedNFTokens": 5, "Flags": 0, "MintedNFTokens": 27, "OwnerCount": 2, "Sequence": 1166462 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BE121B82D5812149D633F605EB07265A80B762A365CE94883089FEEE4B955701", "PreviousFields": { "Balance": "10000000036", "MintedNFTokens": 26, "Sequence": 1166461 }, "PreviousTxnID": "0804FB2EA692C6095DD44445262B4D175A2EFCDE8D8F90518C7DC4C34986CB42", "PreviousTxnLgrSeq": 1799496 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "nftoken_id": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C535743B40000001A" }, "hash": "B9A20167DC30985ABD983912F29DE81CB4579FAF9672C9D68BEC5219C19C7E50", "ledger_index": 1861436, "date": "2022-05-05T21:01:31Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified4Created1.json ================================================ { "tx": { "Account": "rM9VmbyB9KMeZaWHEeDXcnNocvJ48B1eW1", "Fee": "6854", "Flags": 13, "Issuer": "rHAfrQNDBohGbWuWTWzpJe1LQWyYVnbG2n", "LastLedgerSequence": 6453202, "NFTokenTaxon": 1, "Sequence": 6418448, "SigningPubKey": "033CE078DDAFF0B97A06F8ABBE7AD25B93634B3DFD3D4205889896C84DB4D15786", "TransactionType": "NFTokenMint", "TransferFee": 0, "TxnSignature": "3045022100D79246DEFA5EAF939B55822E82665DE298D5D5C9789C3B1887F9BD97E982CB240220763C3F95802DFDD18D10DF67E8C9F56E5FA3E83F479D21F08ECC6A033FAA1483", "URI": "516D5071416B3677777577796A71654C476F64665253375156774677394346736A6D363375485661556438387463", "date": "2022-10-13T10:27:50Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rM9VmbyB9KMeZaWHEeDXcnNocvJ48B1eW1", "Balance": "11192140712", "Flags": 0, "OwnerCount": 660, "Sequence": 6418449 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C13B772A75D9CECF32319D6DF100F00090E638630ABE2F5C755AF03787DB3F9B", "PreviousFields": { "Balance": "11192147566", "OwnerCount": 659, "Sequence": 6418448 }, "PreviousTxnID": "22DCD81B1AACDCE6FDAD39CCAF9D9EFD25C29E13C28F32340673FBAE88D0A619", "PreviousTxnLgrSeq": 6453184 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "NFTokens": [ { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CEE49E170000297B", "URI": "516D54367A533666696E6B655077373334684A4445707465697577744654476E46776458586137356E66626E5950" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CEE645B000004616", "URI": "516D5445546E697A395864784563616564375147687466745847586A3670575965575A6A74797667616F6B4C3659" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CEE7ED4D000062B1", "URI": "516D64455A614D69355542776F413964366F476455756D32587A6448576D7251586D345673474835434268594B59" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CEEE88D100003A35", "URI": "516D55696A4D477A4A56377A42534577616772456373647567334D36716E557A33577857784E4274466B34665461" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CEF03069000056D0", "URI": "516D65794433554845653477475A62637253744D6D66546466634A375054357475396652374150686E4B4D324C58" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CEF6CBEE00002E54", "URI": "516D5639614A6E69665566707948525353383978447668375768524C4878713232686B4661356372786248635057" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CEF8738B00004AEF", "URI": "516D544570483566596639716F476F795747693574724C6F317563314E5448377073374D714B7465565968356E71" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF00B6A800003F0E", "URI": "516D58355267784162575A506E41487776765470764B716271373656784B6E33356D474D38563148516A64624D54" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF025E4500005BA9", "URI": "516D627943344871744B6B7A4337653632506E47694C52365A5732577555616B7A7043674473694467364D614233" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF08F9C90000332D", "URI": "516D647674716A424452794B583346595247325432786F76333666387A7968583977626B417A377A66693467624E" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF0AA16200004FC8", "URI": "516D593878777A72787755796637777565534E647A526A5456577131616E7667747761356D783774574631663355" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF12E483000043E7", "URI": "516D4E7664504B57774D4B534D386D674358674861786748467441704A66623137487967344E6E397163474E6270" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF148C1C00006082", "URI": "516D567A765772316D51414D6E664336337346336B736145484B4D6F7334536B72724D6B58694D355A7870326474" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF1B27A000003806", "URI": "516D517A4B754841554B694559446D6E714E3152487455334B74454C696233375665725734355A74436835523536" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF1CCF3E000054A1", "URI": "516D6558696A5A387575755642423238767177383165784C6E58544263736279387235693864795A4E35436D567A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF236AC100002C25", "URI": "516D5452356651465045597A6B444C31535954657238566D7871416138523641386D6B4E416E434E326555664336" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF25125A000048C0", "URI": "516D594471634C6A3275486E544C6E36584D4A4242726F313462515474383177434B334D3351727042736D324255" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF2D557B00003CDF", "URI": "516D5752556F53706252534C467A48594E4A7975484D31356F583679793854634A343369446B504B58324E547870" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF2EFD140000597A", "URI": "516D5752475150384B6834664564655A3169666858465356486779456F397255554D50477763597A38616E734A36" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF359898000030FE", "URI": "516D50456669586462616E376956547A58587573457A56526F5A754E78513844754D6B504B4D5074784448443752" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF37403500004D99", "URI": "516D637757594D356331704A62384E6E444C61645678424B385877557775514348444451654C7873465A72655945" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF3F8352000041B8", "URI": "516D5771617477566634487A435939445A386144485969473161596E5A5474394763714C596E5355377747636F45" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF412AEF00005E53", "URI": "516D5654637956776F57764276745A626B38456B4750454E4365634734735A68746D3477774D4348756E71633754" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF47C673000035D7", "URI": "516D5748486556723937554A7333635635534A73453876674836644E4E6237566F7944367A484479614C6B466747" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF496E0F00005272", "URI": "516D544A77684761553172666D454A6B326E5A5A424C42737A4A6E774B56794B705767724642365166676B566A72" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF500990000029F6", "URI": "516D6144456732626338645072463268464D546B425677576E5252793738464E4D6F507A444835454B48464B5A41" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF51B12D00004691", "URI": "516D593776675978524B4E4654693535465262314B6B3563343139726B78526D6862337542697335707562654562" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF5358C60000632C", "URI": "516D635458785372395038644652673447594D44475359784B3864444B464673565A414E596E58796F4853433374" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF59F44A00003AB0", "URI": "516D586D537576395036777936534335485566415A33337868625A486E6B387634387A6E597343624D7250616B39" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF5B9BE40000574B", "URI": "516D564C42434B6D7239396D365A785577365545325859734C6F787A56546138367559666D786166504157757042" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF62376B00002ECF", "URI": "516D62365977657962355A50465578487A70326875623537727070466F4A574554664563456263314A384B68686D" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF63DF0400004B6A", "URI": "516D547442476D6764626763727A66645564754536463162614332433237416B63616762386F534D436169547944" } } ], "NextPageMin": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51CFB331EC00003652", "PreviousPageMin": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51CEE49E170000297B" }, "LedgerEntryType": "NFTokenPage", "LedgerIndex": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51CF6C222500003F89", "PreviousFields": { "NextPageMin": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51CFFA41B700002D1B" }, "PreviousTxnID": "B548CC1B9DE79633D3717DB4D2E0373FEB598F233235228216E5EEA3B748721A", "PreviousTxnLgrSeq": 6453184 } }, { "CreatedNode": { "LedgerEntryType": "NFTokenPage", "LedgerIndex": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51CFB331EC00003652", "NewFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF6C222500003F89", "URI": "516D5748635941366F69447043704A413469385065516856355374576A4D725646434E6F69333776384B716B514A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF6DC9BE00005C24", "URI": "516D5867337737314471764A4D51625251416F6F6B3262544E585344775750697738654A426872553254586B6556" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF746542000033A8", "URI": "516D5451384C66764B316833623334324E6555344D534A4D4C57505848485971526F334A46446E524D6874436248" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF760CDC00005043", "URI": "516D4E7A69336434664E615A6F76484773336F545A6F4C4A3650364161337267484B6A70763561747277616D3157" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF7E4FFC00004462", "URI": "516D5448677A524A4462717234474C6A3470325276556237714C5066337A6B754B334B4B61705138313173526176" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF7FF799000060FD", "URI": "516D57534A7445426F7647387169575072544237666758556F416541415971564838337545426453694D56345354" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF86931D00003881", "URI": "516D50577732776765366E79577A5A4735535A48324A736F4A4C59474442754E6563585941354E324C51624A424C" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF883AB50000551C", "URI": "516D626150426342457A62684B465955345253396F346E51446D3650374E6E52717767425544315A5751466B5273" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF8ED63A00002CA0", "URI": "516D56543573354D4D5A667667644C356A6E3661526F73797A6E67714B475774323338584A576339654563716D5A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF907DD70000493B", "URI": "516D626D32554A6D6D724A4A63346377664C693834464E7943464A7250744D3559394374526B3146726547454661" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF98C0F400003D5A", "URI": "516D5A387835757353434D645377664C76664A4E6F66384B4A4264795A696B4A765234397369594445436D357455" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF9A6891000059F5", "URI": "516D5337624A3634463166356F4763444170363764596F3956564E62503174486274756163745848375045363774" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFA1041500003179", "URI": "516D563133757764783669616F3951625074677936536B47356A78324E77476D4E72566F574E6E716E6870626566" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFA2ABAE00004E14", "URI": "516D545564545166667A65424D675663355A383672667A506E48737372736D63456668357575463671654E655955" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFAAEECF00004233", "URI": "516D517350473767757541735731377A3348656569534A5175417939716E71706E437454336F4E415732776B5A68" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFAC966800005ECE", "URI": "516D644D3879734E484B754E4B516144464D5A78593767686464586E4A6B734D4A6F4D794346697A377735344B4A" } } ], "NextPageMin": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51CFFA41B700002D1B", "PreviousPageMin": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51CF6C222500003F89" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "NFTokens": [ { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFB331EC00003652", "URI": "516D6332646B6447445A4653343545737834426A6951526A7058326839646148697632444276395A5A4236787457" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFB4D98A000052ED", "URI": "516D647045574E5A55475162414446333742584638316F547136714578534631774A4E4B63464D58465576373770" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFBB750D00002A71", "URI": "516D52767864435554456B67556462486B6E6352696D7A655843434E746373336E52706956414C6F375944573552" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFBD1CA60000470C", "URI": "516D545052783857793156706565456F4A75374C614556685A627A6A61346143766F68614C72704A4D393773746A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFBEC443000063A7", "URI": "516D5071416B3677777577796A71654C476F64665253375156774677394346736A6D363375485661556438387463" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFC55FC700003B2B", "URI": "516D65714A5734706157457342466176706E396243337A53566D524871676F4B56476A37477A476F43677634707A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFC70763000057C6", "URI": "516D55626E5635553536436164414559325576364C66315261784744344D575978365A714C544B4439516B713866" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFCDA2E400002F4A", "URI": "516D53447842577250526532586A42365A31796D517336446532597A33727A75754B66556134526D45456144794A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFCF4A8100004BE5", "URI": "516D534D63464D727A3162634173685333727447584E4B3374366353425834727A3468565A534B7A354644674456" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFD78D9E00004004", "URI": "516D6369736D48475A5A4437684578447752676F5633317066746953716570617757546E4264574E6B6641513158" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFD9353B00005C9F", "URI": "516D66436B315857706E75485655344B6D6A48664E334275784473787954703674386E4638704A52353154485269" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFDFD0BF00003423", "URI": "516D5145756D486F59794B507033705A7371564652523661357151704571364C655A61483863345A664C6A32636B" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFE1785B000050BE", "URI": "516D64567636536F5976577A757668654C51506B513354445671564B586E326F543542783167444A76584C39515A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFE9BB79000044DD", "URI": "516D63514E78594262444273555A7631486A695032464E766A504665594A65797537524D696A4343423770753462" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFEB631200006178", "URI": "516D576733794E777862477457676466725032444374703966695A564D7474455937363459647157646236616154" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFF1FE96000038FC", "URI": "516D5647684541543972355846686A444E626D764B347465646A3666417661385853767471366A56696D48457A73" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFF3A63000005597", "URI": "516D616444516762673247466433555A356364695A5645706B4335646673554C467170444C323537576E456B7365" } } ], "NextPageMin": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51D081C5C500004329", "PreviousPageMin": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51CFB331EC00003652" }, "LedgerEntryType": "NFTokenPage", "LedgerIndex": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51CFFA41B700002D1B", "PreviousFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF6C222500003F89", "URI": "516D5748635941366F69447043704A413469385065516856355374576A4D725646434E6F69333776384B716B514A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF6DC9BE00005C24", "URI": "516D5867337737314471764A4D51625251416F6F6B3262544E585344775750697738654A426872553254586B6556" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF746542000033A8", "URI": "516D5451384C66764B316833623334324E6555344D534A4D4C57505848485971526F334A46446E524D6874436248" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF760CDC00005043", "URI": "516D4E7A69336434664E615A6F76484773336F545A6F4C4A3650364161337267484B6A70763561747277616D3157" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF7E4FFC00004462", "URI": "516D5448677A524A4462717234474C6A3470325276556237714C5066337A6B754B334B4B61705138313173526176" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF7FF799000060FD", "URI": "516D57534A7445426F7647387169575072544237666758556F416541415971564838337545426453694D56345354" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF86931D00003881", "URI": "516D50577732776765366E79577A5A4735535A48324A736F4A4C59474442754E6563585941354E324C51624A424C" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF883AB50000551C", "URI": "516D626150426342457A62684B465955345253396F346E51446D3650374E6E52717767425544315A5751466B5273" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF8ED63A00002CA0", "URI": "516D56543573354D4D5A667667644C356A6E3661526F73797A6E67714B475774323338584A576339654563716D5A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF907DD70000493B", "URI": "516D626D32554A6D6D724A4A63346377664C693834464E7943464A7250744D3559394374526B3146726547454661" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF98C0F400003D5A", "URI": "516D5A387835757353434D645377664C76664A4E6F66384B4A4264795A696B4A765234397369594445436D357455" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CF9A6891000059F5", "URI": "516D5337624A3634463166356F4763444170363764596F3956564E62503174486274756163745848375045363774" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFA1041500003179", "URI": "516D563133757764783669616F3951625074677936536B47356A78324E77476D4E72566F574E6E716E6870626566" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFA2ABAE00004E14", "URI": "516D545564545166667A65424D675663355A383672667A506E48737372736D63456668357575463671654E655955" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFAAEECF00004233", "URI": "516D517350473767757541735731377A3348656569534A5175417939716E71706E437454336F4E415732776B5A68" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFAC966800005ECE", "URI": "516D644D3879734E484B754E4B516144464D5A78593767686464586E4A6B734D4A6F4D794346697A377735344B4A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFB331EC00003652", "URI": "516D6332646B6447445A4653343545737834426A6951526A7058326839646148697632444276395A5A4236787457" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFB4D98A000052ED", "URI": "516D647045574E5A55475162414446333742584638316F547136714578534631774A4E4B63464D58465576373770" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFBB750D00002A71", "URI": "516D52767864435554456B67556462486B6E6352696D7A655843434E746373336E52706956414C6F375944573552" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFBD1CA60000470C", "URI": "516D545052783857793156706565456F4A75374C614556685A627A6A61346143766F68614C72704A4D393773746A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFC55FC700003B2B", "URI": "516D65714A5734706157457342466176706E396243337A53566D524871676F4B56476A37477A476F43677634707A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFC70763000057C6", "URI": "516D55626E5635553536436164414559325576364C66315261784744344D575978365A714C544B4439516B713866" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFCDA2E400002F4A", "URI": "516D53447842577250526532586A42365A31796D517336446532597A33727A75754B66556134526D45456144794A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFCF4A8100004BE5", "URI": "516D534D63464D727A3162634173685333727447584E4B3374366353425834727A3468565A534B7A354644674456" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFD78D9E00004004", "URI": "516D6369736D48475A5A4437684578447752676F5633317066746953716570617757546E4264574E6B6641513158" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFD9353B00005C9F", "URI": "516D66436B315857706E75485655344B6D6A48664E334275784473787954703674386E4638704A52353154485269" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFDFD0BF00003423", "URI": "516D5145756D486F59794B507033705A7371564652523661357151704571364C655A61483863345A664C6A32636B" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFE1785B000050BE", "URI": "516D64567636536F5976577A757668654C51506B513354445671564B586E326F543542783167444A76584C39515A" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFE9BB79000044DD", "URI": "516D63514E78594262444273555A7631486A695032464E766A504665594A65797537524D696A4343423770753462" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFEB631200006178", "URI": "516D576733794E777862477457676466725032444374703966695A564D7474455937363459647157646236616154" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFF1FE96000038FC", "URI": "516D5647684541543972355846686A444E626D764B347465646A3666417661385853767471366A56696D48457A73" } }, { "NFToken": { "NFTokenID": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFF3A63000005597", "URI": "516D616444516762673247466433555A356364695A5645706B4335646673554C467170444C323537576E456B7365" } } ], "PreviousPageMin": "DCFDDBC8EE3BBBA48B175FCBD6606D6AC92CD03843567C51CF6C222500003F89" }, "PreviousTxnID": "7D52B90FAB145FF352B630EFD80D91AA2040F183C36782893336A8775643E012", "PreviousTxnLgrSeq": 6453183 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHAfrQNDBohGbWuWTWzpJe1LQWyYVnbG2n", "Balance": "8269299100", "Flags": 0, "MintedNFTokens": 25512, "NFTokenMinter": "rM9VmbyB9KMeZaWHEeDXcnNocvJ48B1eW1", "OwnerCount": 1, "Sequence": 5705984 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F0E5B41CEBE04809B152C28EC7D6015BB1FE3DD45260FA3D3B4C87981B261ADC", "PreviousFields": { "MintedNFTokens": 25511 }, "PreviousTxnID": "22DCD81B1AACDCE6FDAD39CCAF9D9EFD25C29E13C28F32340673FBAE88D0A619", "PreviousTxnLgrSeq": 6453184 } } ], "TransactionIndex": 337, "TransactionResult": "tesSUCCESS", "nftoken_id": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFBEC443000063A7" }, "hash": "4E0EB5F23D248740CB8FC28D1003CEFE841E21811FE2EA4B195CFE1B0BC54219", "ledger_index": 6453184, "date": "2022-10-13T10:27:50Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintMostModified2Created1.json ================================================ { "tx": { "Account": "rDUbAKGzBRs3ztKpfMiWUAB5nwtcmrnRVe", "Fee": "12", "Flags": 8, "LastLedgerSequence": 5605307, "NFTokenTaxon": 1, "Sequence": 5605241, "SigningPubKey": "022DAC45B8CC7B217C47A04957A6DF7FE2C8E4BA485808FCBBFC82E115260E1C32", "TransactionType": "NFTokenMint", "TxnSignature": "30440220623FB22FE14ED40690333A9B53DA7547CC38B75128B922B5EDA0FB1E7B8642F30220363B6A61A3B7F2A02F3202A67D97B1635576EBEE8465DD3A72E88DC3DFAE38E1", "URI": "68747470733A2F2F677265677765697362726F642E636F6D", "date": "2022-09-13T20:47:41Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rDUbAKGzBRs3ztKpfMiWUAB5nwtcmrnRVe", "Balance": "9999999604", "Flags": 0, "MintedNFTokens": 33, "OwnerCount": 2, "Sequence": 5605242 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "433D9E7BE08CC6D929AE1AE85150F8FADCE098529C41BD134A47DEA255D0DAAC", "PreviousFields": { "Balance": "9999999616", "MintedNFTokens": 32, "OwnerCount": 1, "Sequence": 5605241 }, "PreviousTxnID": "44003568EB431E295D741C3FB98EB5525AD5203288FFB23B15DEB46899317D0B", "PreviousTxnLgrSeq": 5605232 } }, { "CreatedNode": { "LedgerEntryType": "NFTokenPage", "LedgerIndex": "85D33F9C5481D3515029C9904D16F0109414D3A09414D3A08122E5B60000001C", "NewFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A00000099A00000000", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A00EA5D0B300000017", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A012C5D5A60000000C", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A016E5DA9D00000001", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0258BA1B200000018", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A029ABA6A90000000D", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A02DCBAB9C00000002", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A03C7172B500000019", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0409177A80000000E", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A044B17C9F00000003", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0535743B40000001A", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0577748AB0000000F", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A05B974D9E00000004", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A06A3D14B70000001B", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A06E5D19AA00000010", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0727D1EA100000005", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } } ], "NextPageMin": "85D33F9C5481D3515029C9904D16F0109414D3A0FFFFFFFFFFFFFFFFFFFFFFFF" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "NFTokens": [ { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A08122E5B60000001C", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A08542EAAD00000011", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A08962EFA000000006", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A09808B6B90000001D", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A09C28BBAC00000012", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0A048C0A300000007", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0AEEE87B80000001E", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0B30E8CAF00000013", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0B72E91A200000008", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0C5D458BB0000001F", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0C9F45DAE00000014", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0CE1462A500000009", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0DCBA29BA00000020", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0E0DA2EB100000015", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0E4FA33A40000000A", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0F7BFFFB000000016", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0FBE004A70000000B", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } } ], "PreviousPageMin": "85D33F9C5481D3515029C9904D16F0109414D3A09414D3A08122E5B60000001C" }, "LedgerEntryType": "NFTokenPage", "LedgerIndex": "85D33F9C5481D3515029C9904D16F0109414D3A0FFFFFFFFFFFFFFFFFFFFFFFF", "PreviousFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A00000099A00000000", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A00EA5D0B300000017", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A012C5D5A60000000C", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A016E5DA9D00000001", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0258BA1B200000018", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A029ABA6A90000000D", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A02DCBAB9C00000002", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A03C7172B500000019", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0409177A80000000E", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A044B17C9F00000003", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0535743B40000001A", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0577748AB0000000F", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A05B974D9E00000004", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A06A3D14B70000001B", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A06E5D19AA00000010", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0727D1EA100000005", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A08122E5B60000001C", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A08542EAAD00000011", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A08962EFA000000006", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A09808B6B90000001D", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A09C28BBAC00000012", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0A048C0A300000007", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0AEEE87B80000001E", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0B30E8CAF00000013", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0B72E91A200000008", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0C5D458BB0000001F", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0C9F45DAE00000014", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0CE1462A500000009", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0E0DA2EB100000015", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0E4FA33A40000000A", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0F7BFFFB000000016", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } }, { "NFToken": { "NFTokenID": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0FBE004A70000000B", "URI": "68747470733A2F2F677265677765697362726F642E636F6D" } } ] }, "PreviousTxnID": "44003568EB431E295D741C3FB98EB5525AD5203288FFB23B15DEB46899317D0B", "PreviousTxnLgrSeq": 5605232 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "nftoken_id": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0DCBA29BA00000020" }, "hash": "C4E598099A8B13C5C8D2B8C86385A37B64C2F62BFA1FB87196401BB6ACB67A69", "ledger_index": 5605289, "date": "2022-09-13T20:47:41Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintNullURI.json ================================================ { "tx": { "Account": "rsbHDfMAdxv1EyAURp8F5txgFesepmCYRY", "Fee": "250000", "Flags": 8, "NFTokenTaxon": 0, "Sequence": 75420256, "SigningPubKey": "03D3969BCE7722E4F85DA427C8674D50037A91715B16645ACDCF60BFF478D7B239", "TransactionType": "NFTokenMint", "TxnSignature": "3045022100F8E5F9216353EE5E13D7BD894B1F0C982865798F4CBCCFFBCF9855645C42CF3902201863046780FCB1A4355AF55C4D494E176A2C6849312B7BC70406B041D4792A59", "date": "2022-10-31T20:50:52Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "NFTokenPage", "LedgerIndex": "1C6BECB802DFC006F025A13EA940ECBF9FD4909EFFFFFFFFFFFFFFFFFFFFFFFF", "NewFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "000800001C6BECB802DFC006F025A13EA940ECBF9FD4909E0000099B00000000" } } ] } } }, { "ModifiedNode": { "FinalFields": { "Account": "rsbHDfMAdxv1EyAURp8F5txgFesepmCYRY", "Balance": "14750000", "Flags": 0, "MintedNFTokens": 1, "OwnerCount": 1, "Sequence": 75420257 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "57BCBCEF2CB5956ABB814B26E791899B33716929B3CFA1F77B328659CB65BA17", "PreviousFields": { "Balance": "15000000", "OwnerCount": 0, "Sequence": 75420256 }, "PreviousTxnID": "E1F96EA699BCE5BF881AF10E5452380F2EFE1989948A2207D28DD4CD75D979A5", "PreviousTxnLgrSeq": 75420256 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "465A6EAC412E32CDD6C3D21537AD1C5919987EE162D606480133E1E43FBD14A7", "ledger_index": 75443459, "date": "2022-10-31T20:50:52Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintWithIssuer.json ================================================ { "tx": { "Account": "rwrk4nxjiJkKoAXFc4h27eD4M8qCxBtApR", "Fee": "12", "Flags": 8, "Issuer": "rGToUZ1JjRUdv1wXNXKMFn2o4wTM2DLkpg", "LastLedgerSequence": 4997966, "NFTokenTaxon": 0, "Sequence": 4577828, "SigningPubKey": "ED1D201E4DED96C5B2982A496523A3D94343DEC30C6F755F8F067C25C7C9A12C4B", "TransactionType": "NFTokenMint", "TransferFee": 25000, "TxnSignature": "7D8BD43D93B059791C6F0A0CC853ADC349D5D2D1E84DCCCF17D6FDAF57728C8490A2D689A17A4BCE43D340D1D7092EEEEE3E507203D5CF6D9CFCE403C638FE07", "URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469", "date": "2022-08-23T16:18:00Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rwrk4nxjiJkKoAXFc4h27eD4M8qCxBtApR", "Balance": "10099999976", "Flags": 0, "OwnerCount": 1, "Sequence": 4577829 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0AD887D8A9E69B063E96E9F05DB1B57D4BE524B65BEE8A55DA4CDB715D4DFEFD", "PreviousFields": { "Balance": "10099999988", "OwnerCount": 0, "Sequence": 4577828 }, "PreviousTxnID": "155610402248BC8E40BEAF33996280EBE1EBE44512B6ED4625BE8D04C9DE88BB", "PreviousTxnLgrSeq": 4997761 } }, { "CreatedNode": { "LedgerEntryType": "NFTokenPage", "LedgerIndex": "62DD5482923E4CC6B49066146DAFE97491F4927EFFFFFFFFFFFFFFFFFFFFFFFF", "NewFields": { "NFTokens": [ { "NFToken": { "NFTokenID": "000861A8A99B4460C2A4CCC90634FD9C7F51940AD9450BE30000099B00000000", "URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469" } } ] } } }, { "ModifiedNode": { "FinalFields": { "Account": "rGToUZ1JjRUdv1wXNXKMFn2o4wTM2DLkpg", "Balance": "9899999964", "Flags": 8388608, "MintedNFTokens": 1, "NFTokenMinter": "rwrk4nxjiJkKoAXFc4h27eD4M8qCxBtApR", "OwnerCount": 0, "Sequence": 4577826 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "77AC8387084CD40B2176E1B5FE0646994226ABFC1C4A4403470E1AACDD540F12", "PreviousFields": {}, "PreviousTxnID": "68DAF39F4C95E804315D1C96AEF9F170E9756CE9AC67BE97644FBA29EDE55B8C", "PreviousTxnLgrSeq": 4997929 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "nftoken_id": "000861A8A99B4460C2A4CCC90634FD9C7F51940AD9450BE30000099B00000000" }, "hash": "73629D3E84AC18C06350A9A4A0B2EF15AB52E5A62AECDAB4A0579DEF342FC61F", "ledger_index": 4997948, "date": "2022-08-23T16:18:00Z" } ================================================ FILE: src/containers/shared/components/Transaction/NFTokenMint/types.ts ================================================ export interface NFTokenMintInstructions { tokenID: string tokenTaxon: number uri?: string transferFee?: number issuer?: string } ================================================ FILE: src/containers/shared/components/Transaction/OfferCancel/Description.tsx ================================================ import { useTranslation } from 'react-i18next' import type { OfferCancel } from 'xrpl' import { TransactionDescriptionProps } from '../types' export const Description = ({ data, }: TransactionDescriptionProps) => { const { t } = useTranslation() return (
    {t('offer_cancel_description')} {data.tx.OfferSequence}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/OfferCancel/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { OfferCancel } from 'xrpl' import { TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const { OfferSequence } = data.instructions return ( #{OfferSequence} ) } ================================================ FILE: src/containers/shared/components/Transaction/OfferCancel/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import type { OfferCancel } from 'xrpl' import { TransactionTableDetailProps } from '../types' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { OfferSequence } = instructions return (
    {t('cancel_offer')} {` #`} {OfferSequence}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/OfferCancel/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const OfferCancelTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.CANCEL, category: TransactionCategory.DEX, } ================================================ FILE: src/containers/shared/components/Transaction/OfferCancel/test/OfferCancelDescription.test.tsx ================================================ import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import offerCancel from './mock_data/OfferCancel.json' const renderComponent = createDescriptionRenderFactory(Description) describe('OfferCancel: Description', () => { it('renders', () => { const { container } = renderComponent(offerCancel) expect( container.querySelector('[data-testid="cancel-line"]'), ).toHaveTextContent('offer_cancel_description15239384') }) }) ================================================ FILE: src/containers/shared/components/Transaction/OfferCancel/test/OfferCancelSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import offerCancel from './mock_data/OfferCancel.json' const renderComponent = createSimpleRenderFactory(Simple) describe('OfferCancel: Simple', () => { it('renders', () => { const { container } = renderComponent(offerCancel) expectSimpleRowText(container, 'cancel', '#15239384') }) }) ================================================ FILE: src/containers/shared/components/Transaction/OfferCancel/test/OfferCancelTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import offerCancel from './mock_data/OfferCancel.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('OfferCancel: TableDetail', () => { it('renders', () => { const { container } = renderComponent(offerCancel) expect(container).toHaveTextContent('cancel_offer #15239384') }) }) ================================================ FILE: src/containers/shared/components/Transaction/OfferCancel/test/mock_data/OfferCancel.json ================================================ { "hash": "F4EFFD0C02ECE3ADDE16E320FE08C4D411914ABEEB80861C95EE19589397BB56", "ledger_index": 37478576, "date": "2018-03-25T11:29:01+00:00", "tx": { "TransactionType": "OfferCancel", "Flags": 0, "Sequence": 15239390, "OfferSequence": 15239384, "LastLedgerSequence": 37478579, "Fee": "10500", "SigningPubKey": "0218E7C9B6D291B8849698BC524CC907962784C4D5423EE2020EF71530440C6E89", "TxnSignature": "3045022100FA7BDD54480D5B929D81E8261BEB39EF18860C1B76CB28A769D3DE12F6E886F10220442F10B61A503B02941FD021FEBEC2DE46B47ECB00FAD0DE0541AA65E5A9FDB8", "Account": "rENDnFwR3CPvrsPjD9XXeqVoXeVt2CpPWX" }, "meta": { "TransactionIndex": 11, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "14DEA231A078047ACAACEE19534B087DE63AAAE6F7916251638C3C8E60F3B5FC", "FinalFields": { "Flags": 0, "IndexPrevious": "000000000000028D", "RootIndex": "CDE11BB8E6416965C5B88DEA6671D442DA8CD437B20BD98E659EAFA11D3508C3", "Owner": "rENDnFwR3CPvrsPjD9XXeqVoXeVt2CpPWX" } } }, { "DeletedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "90B86A84C7F7843673BCF82E565E69498CAEF463F8055ABA4C0456385DE09800", "FinalFields": { "Flags": 0, "ExchangeRate": "4C0456385DE09800", "RootIndex": "90B86A84C7F7843673BCF82E565E69498CAEF463F8055ABA4C0456385DE09800", "TakerPaysCurrency": "0000000000000000000000004554480000000000", "TakerPaysIssuer": "06CC4A6D023E68AA3499C6DE3E9F2DC52B8BA254", "TakerGetsCurrency": "0000000000000000000000000000000000000000", "TakerGetsIssuer": "0000000000000000000000000000000000000000" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37478576, "PreviousTxnID": "6EE3B6D5B6A6C726CCBA47BD8D3165C56C35F67047F53869DCF4A8D5A4F81494", "LedgerIndex": "BDBFC8F6381C40F63B756F4781D9487B09184EB774D866BC08B0F68E2AC48569", "PreviousFields": { "Sequence": 15239390, "OwnerCount": 37, "Balance": "19236781263" }, "FinalFields": { "Flags": 0, "Sequence": 15239391, "OwnerCount": 36, "Balance": "19236770763", "Account": "rENDnFwR3CPvrsPjD9XXeqVoXeVt2CpPWX" } } }, { "DeletedNode": { "LedgerEntryType": "Offer", "LedgerIndex": "E64901D63D911B4C27A7DFA8D3691B92F51BEC7525269A8485E07A953A44E01D", "FinalFields": { "Flags": 0, "Sequence": 15239384, "PreviousTxnLgrSeq": 37478575, "BookNode": "0000000000000000", "OwnerNode": "000000000000028E", "PreviousTxnID": "689927F683CB4441C6BB0D594EF361155E5206EDF936500CB0668CF5BEC022E4", "BookDirectory": "90B86A84C7F7843673BCF82E565E69498CAEF463F8055ABA4C0456385DE09800", "TakerPays": { "value": "3.90624", "currency": "ETH", "issuer": "rcA8X3TVMST1n3CJeAdGk1RdRCHii7N2h" }, "TakerGets": "3200000000", "Account": "rENDnFwR3CPvrsPjD9XXeqVoXeVt2CpPWX" } } } ], "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/Description.tsx ================================================ import { useTranslation, Trans } from 'react-i18next' import { localizeDate } from '../../../utils' import { DATE_OPTIONS, CURRENCY_ORDER, XRP_BASE, } from '../../../transactionUtils' import { Account } from '../../Account' import { TransactionDescriptionComponent, TransactionDescriptionProps, } from '../types' import { convertRippleDate } from '../../../../../rippled/lib/utils' import Currency from '../../Currency' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' const normalize = (amount: any) => amount.value || amount / XRP_BASE const Description: TransactionDescriptionComponent = ( props: TransactionDescriptionProps, ) => { const { t, i18n } = useTranslation() const language = i18n.resolvedLanguage const { data } = props const paysCurrency = data.tx.TakerPays.currency || 'XRP' const getsCurrency = data.tx.TakerGets.currency || 'XRP' const paysValue = normalize(data.tx.TakerPays) const getsValue = normalize(data.tx.TakerGets) const invert = CURRENCY_ORDER.indexOf(getsCurrency) > CURRENCY_ORDER.indexOf(paysCurrency) let rate = getsValue / paysValue let pair if (invert) { rate = 1 / rate pair = ( / ) } else { pair = ( / ) } const renderLine4 = () => { const unixT = convertRippleDate(data.tx.Expiration) const today = new Date() const transString = unixT - today.getTime() > 0 ? 'offer_will_expire_desc' : 'offer_did_expire_desc' const date = `${localizeDate(unixT, language, DATE_OPTIONS)} ${ DATE_OPTIONS.timeZone }` return ( The offer expires {date} unless cancelled before ) } return ( <>
    The account offered to pay in order to receive
    {t('offer_create_desc_line_2')} {rate.toPrecision(5)} {pair}
    {data.tx.OfferSequence && (
    {t('offer_create_desc_line_3')} {data.tx.OfferSequence}
    )} {data.tx.Expiration && renderLine4()} {data.tx.DomainID && (
    {t('offer_create_desc_line_5')} : {data.tx.DomainID}
    )} ) } export { Description } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import Currency from '../../Currency' const Simple: TransactionSimpleComponent = (props: TransactionSimpleProps) => { const { t } = useTranslation() const { data } = props const { price, firstCurrency, secondCurrency, pays, gets, cancel, domainID } = data.instructions return ( <>
    {`${Number(price)}`}
    /
    {cancel && ( #{cancel} )} {domainID && ( {domainID} )} ) } export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import Currency from '../../Currency' export const TableDetail = (props: any) => { const { t } = useTranslation() const { instructions } = props const { gets, pays, price, firstCurrency, secondCurrency, cancel, domainID } = instructions return pays && gets ? (
    {t('price')}: {`${Number(price)} `} /
    {t('buy')}
    {t('sell')}
    {cancel && (
    {t('cancel_offer')} {` #`} {cancel}
    )} {domainID && (
    {t('domain_id')}: {domainID}
    )}
    ) : null } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { Description } from './Description' import { parser } from './parser' import { TableDetail } from './TableDetail' export const OfferCreateTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.CREATE, category: TransactionCategory.DEX, parser, } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/parser.ts ================================================ import { CURRENCY_ORDER } from '../../../transactionUtils' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export function parser(tx: any) { const gets = formatAmount(tx.TakerGets) const base = tx.TakerGets.currency ? tx.TakerGets : { currency: 'XRP' } const counter = tx.TakerPays.currency ? tx.TakerPays : { currency: 'XRP' } const pays = formatAmount(tx.TakerPays) const price = Number(pays.amount) / Number(gets.amount) const invert = CURRENCY_ORDER.indexOf(counter.currency) > CURRENCY_ORDER.indexOf(base.currency) return { gets, pays, price: (invert ? 1 / price : price).toPrecision(6), firstCurrency: invert ? counter : base, secondCurrency: invert ? base : counter, cancel: tx.OfferSequence, domainID: tx.DomainID, } } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/test/OfferCreateDescription.test.tsx ================================================ import OfferCreate from './mock_data/OfferCreateWithExpirationAndCancel.json' import OfferCreateInvertedCurrencies from './mock_data/OfferCreateInvertedCurrencies.json' import OfferCreateWithPermissionedDomainID from './mock_data/OfferCreateWithPermissionedDomainID.json' import { Description } from '../Description' import { createDescriptionRenderFactory } from '../../test' const renderComponent = createDescriptionRenderFactory(Description) describe('OfferCreate: Description', () => { it('renders description for transaction with cancel and expiration', () => { const { container, unmount } = renderComponent(OfferCreate) expect(container.innerHTML).toBe( '
    The accountoffered to pay1,080,661.95882 CSC.rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwrin order to receive1,764.293151 XRP
    offer_create_desc_line_2 612.52XRP/CSC.rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr
    offer_create_desc_line_3 44866443
    The offer expiresMay 18, 2022 at 5:28:16 PM UTCunless cancelled before', ) unmount() }) it('renders description for transaction with inverted currencies', () => { const { container, unmount } = renderComponent( OfferCreateInvertedCurrencies, ) expect(container.innerHTML).toBe( '
    The accountoffered to pay17,588.363594 XRPin order to receive$6,101.33033905 USD.rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B
    offer_create_desc_line_2 0.34690XRP/USD.rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B
    offer_create_desc_line_3 80543309
    ', ) unmount() }) it('renders description for transaction with Permissioned Domain ID', () => { const { container, unmount } = renderComponent( OfferCreateWithPermissionedDomainID, ) expect(container.innerHTML).toBe( '
    The accountoffered to pay17,588.363594 XRPin order to receive$10.00 USD.rnybsH3BZKKCG7fwPzTeLtGejnq6UQyNCC
    offer_create_desc_line_2 0.00056856XRP/USD.rnybsH3BZKKCG7fwPzTeLtGejnq6UQyNCC
    offer_create_desc_line_5: 4A4879496CFF23CA32242D50DA04DDB41F4561167276A62AF21899F83DF28812
    ', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/test/OfferCreateSimple.test.tsx ================================================ import { Simple } from '../Simple' import mockOfferCreateWithCancel from './mock_data/OfferCreateWithExpirationAndCancel.json' import mockOfferCreate from './mock_data/OfferCreate.json' import mockOfferCreateWithPermissionedDomainID from './mock_data/OfferCreateWithPermissionedDomainID.json' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' const renderComponent = createSimpleRenderFactory(Simple) describe('OfferCreate: Simple', () => { it('renders with an expiration and offer', () => { const { container, unmount } = renderComponent(mockOfferCreateWithCancel) expect( container.querySelector('[data-testid="amount"] .one-line'), ).toHaveTextContent('\uE900 XRP/CSC.rCSC') expect( container.querySelector('[data-testid="cancel-id"] .value'), ).toHaveTextContent('#44866443') expect( container.querySelector('[data-testid="amount-buy"] .value'), ).toHaveTextContent(`\uE9001,764.293151 XRP`) expect( container.querySelector('[data-testid="amount-sell"] .value'), ).toHaveTextContent(`1,080,661.95882 CSC.rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr`) unmount() }) it('renders', () => { const { container } = renderComponent(mockOfferCreate) expect( container.querySelector('[data-testid="offer-id"] .value'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="amount-buy"] .value'), ).toHaveTextContent(`\uE90024,755.081083 XRP`) expect( container.querySelector('[data-testid="amount-sell"] .value'), ).toHaveTextContent(`51.41523894 BCH.rcyS4CeCZVYvTiKcxj6Sx32ibKwcDHLds`) }) it(`renders offerCreate with a Permissioned Domain ID`, () => { const { container } = renderComponent( mockOfferCreateWithPermissionedDomainID, ) expect( container.querySelector('[data-testid="domain-id"] .value'), ).toHaveTextContent( '4A4879496CFF23CA32242D50DA04DDB41F4561167276A62AF21899F83DF28812', ) }) }) ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/test/OfferCreateTableDetail.test.tsx ================================================ import { TableDetail } from '../TableDetail' import mockOfferCreateInvertedCurrencies from './mock_data/OfferCreateInvertedCurrencies.json' import mockOfferCreateWithCancel from './mock_data/OfferCreateWithExpirationAndCancel.json' import mockOfferCreate from './mock_data/OfferCreate.json' import mockOfferCreateWithPermissionedDomainID from './mock_data/OfferCreateWithPermissionedDomainID.json' import { createTableDetailRenderFactory } from '../../test' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('OfferCreate: TableDetail', () => { it('renders with an expiration and offer', () => { const { container, unmount } = renderComponent(mockOfferCreateWithCancel) expect(container.querySelector('[data-testid="pair"]')).toHaveTextContent( 'price:612.518 \uE900 XRP/CSC.rCSC', ) expect( container.querySelector('[data-testid="cancel-id"]'), ).toHaveTextContent('cancel_offer #44866443') // Amount components are rendered in order: price (in pair), buy, sell // Skip the first one (price) and check buy/sell const amounts = container.querySelectorAll('[data-testid="amount"]') expect(amounts[1]).toHaveTextContent(`\uE9001,764.293151 XRP`) expect(amounts[2]).toHaveTextContent( `1,080,661.95882 CSC.rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr`, ) unmount() }) it('renders', () => { const { container, unmount } = renderComponent(mockOfferCreate) expect(container.querySelector('[data-testid="pair"]')).toHaveTextContent( 'price:0.00207696 \uE900 XRP/BCH.rcyS', ) expect( container.querySelector('[data-testid="offer-id"]'), ).not.toBeInTheDocument() // Amount components are rendered in order: price (in pair), buy, sell // Skip the first one (price) and check buy/sell const amounts = container.querySelectorAll('[data-testid="amount"]') expect(amounts[1]).toHaveTextContent(`\uE90024,755.081083 XRP`) expect(amounts[2]).toHaveTextContent( `51.41523894 BCH.rcyS4CeCZVYvTiKcxj6Sx32ibKwcDHLds`, ) unmount() }) it('renders inverted currencies', () => { const { container, unmount } = renderComponent( mockOfferCreateInvertedCurrencies, ) expect(container.querySelector('[data-testid="pair"]')).toHaveTextContent( 'price:0.346896 \uE900 XRP/USD.rvYA', ) unmount() }) it(`renders offerCreate with a Permissioned Domain ID`, () => { const { container, unmount } = renderComponent( mockOfferCreateWithPermissionedDomainID, ) expect( container.querySelector('[data-testid="domain-id"]'), ).toHaveTextContent( 'domain_id: 4A4879496CFF23CA32242D50DA04DDB41F4561167276A62AF21899F83DF28812', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/test/mock_data/OfferCreate.json ================================================ { "tx": { "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "Fee": "5176", "Flags": 0, "LastLedgerSequence": 71724753, "Sequence": 56768893, "SigningPubKey": "03C48299E57F5AE7C2BE1391B581D313F1967EA2301628C07AC412092FDC15BA22", "TakerGets": { "currency": "BCH", "issuer": "rcyS4CeCZVYvTiKcxj6Sx32ibKwcDHLds", "value": "51.41523894181696" }, "TakerPays": "24755081083", "TransactionType": "OfferCreate", "TxnSignature": "3044022069287DAA493E6C5754D32121408F42034F26BE8C8111EC27D8F9FBD9F01448A60220015FB59A284F388322835F9C4EC3C2C9ABCE763F9327C474D0BA668A8632E922", "date": "2022-05-18T02:40:11Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "33C81D720DBA84863A1510FD5C6C3E9224F0F5778261CF175D111AFA1F573DF6", "NewFields": { "ExchangeRate": "5d111afa1f573df6", "RootIndex": "33C81D720DBA84863A1510FD5C6C3E9224F0F5778261CF175D111AFA1F573DF6", "TakerGetsCurrency": "0000000000000000000000004243480000000000", "TakerGetsIssuer": "06CDAB9869053E0AC7764D9ACB35B182CB195414" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "80a5", "Owner": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "RootIndex": "FDE0DCA95589B07340A7D5BE2FD72AA8EEAC878664CC9B707308B4419333E551" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9E7DC11BB1D16C2157414F189CB738981C64598711D1FA0F15723FBBC11AD83E" } }, { "ModifiedNode": { "FinalFields": { "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "Balance": "220102267009", "Flags": 0, "OwnerCount": 108, "Sequence": 56768894 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B1B9AAC12B56B1CFC93DDC8AF6958B50E89509F377ED4825A3D970F249892CE3", "PreviousFields": { "Balance": "220102272185", "OwnerCount": 107, "Sequence": 56768893 }, "PreviousTxnID": "41336A151E6F8F91852E03A04204F62BB186B486691B5AB27AB00A70C3B26B37", "PreviousTxnLgrSeq": 71724751 } }, { "CreatedNode": { "LedgerEntryType": "Offer", "LedgerIndex": "E284EF740006031D49F6EDACA80AD8CC3A7507318ADAAE8781A846CF26351C6F", "NewFields": { "Account": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "BookDirectory": "33C81D720DBA84863A1510FD5C6C3E9224F0F5778261CF175D111AFA1F573DF6", "OwnerNode": "80a6", "Sequence": 56768893, "TakerGets": { "currency": "BCH", "issuer": "rcyS4CeCZVYvTiKcxj6Sx32ibKwcDHLds", "value": "51.41523894181696" }, "TakerPays": "24755081083" } } } ], "TransactionIndex": 16, "TransactionResult": "tesSUCCESS" }, "hash": "DB244B742B5C4CDD11A53D0F487C616D18E8C0EC60FF38F059E167095506820A", "ledger_index": 71724751, "date": "2022-05-18T02:40:11Z" } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/test/mock_data/OfferCreateInvertedCurrencies.json ================================================ { "tx": { "Account": "rXTZ5g8X7mrAYEe7iFeM9fiS4ccueyurG", "Fee": "20", "Flags": 2148007936, "LastLedgerSequence": 73246636, "OfferSequence": 80543309, "Sequence": 80543317, "SigningPubKey": "02AC7FB83A5AC706F0613B3D93F1C361D84F6415D4E539E1A8BC66F2198F8CACE4", "TakerGets": "17588363594", "TakerPays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "value": "6101.330339051342" }, "TransactionType": "OfferCreate", "TxnSignature": "3044022053255898628BD1FFE4BF4CE3EA3D1547740C4C01E87CCF25399574CCF5D5049C0220100028FD3556C78E09FDFD3037AE8842743BE22BB4C4DF820E845DD96A82A7DC", "date": "2022-07-25T16:00:21Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rXTZ5g8X7mrAYEe7iFeM9fiS4ccueyurG", "Balance": "18649363494", "Flags": 0, "OwnerCount": 10, "Sequence": 80543318 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "07400FD4578F4DEFDEF1A5C3EB6F6F149ACADECE9963ACB8B71168F4DB7FE212", "PreviousFields": { "Balance": "18649363514", "Sequence": 80543317 }, "PreviousTxnID": "DF5843F92F6C5D4A346BC157CDA7F66A3A80A2D8EC3EC322B16DC94E68440EC7", "PreviousTxnLgrSeq": 73246635 } }, { "CreatedNode": { "LedgerEntryType": "Offer", "LedgerIndex": "1CAE86BA73B8043E63726781443EF2EA32CD6A9489B1858D1FB78021428BE580", "NewFields": { "Account": "rXTZ5g8X7mrAYEe7iFeM9fiS4ccueyurG", "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E0C52FFD72214AE", "Flags": 131072, "Sequence": 80543317, "TakerGets": "17588363594", "TakerPays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "value": "6101.330339051342" } } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "0", "Owner": "rXTZ5g8X7mrAYEe7iFeM9fiS4ccueyurG", "RootIndex": "5F3DA35DF75B05413178A5945C63B06B9489F2EFACF65CF3053638B65B5B8777" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5F3DA35DF75B05413178A5945C63B06B9489F2EFACF65CF3053638B65B5B8777" } }, { "DeletedNode": { "FinalFields": { "Account": "rXTZ5g8X7mrAYEe7iFeM9fiS4ccueyurG", "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E0C52FFD72214AD", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "A59445B441B2C2EBDE2EEA8FE7079A6D6631CFAB6A73FC8677DEA7AB48B393C7", "PreviousTxnLgrSeq": 73246632, "Sequence": 80543309, "TakerGets": "17588363754", "TakerPays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "value": "6101.330394554676" } }, "LedgerEntryType": "Offer", "LedgerIndex": "C665813A16DC6539C0F794479516D4DEFD85EDE677C0A5475475D87C443A2228" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "4e0c52ffd72214ad", "Flags": 0, "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E0C52FFD72214AD", "TakerGetsCurrency": "0000000000000000000000000000000000000000", "TakerGetsIssuer": "0000000000000000000000000000000000000000", "TakerPaysCurrency": "0000000000000000000000005553440000000000", "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E0C52FFD72214AD" } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E0C52FFD72214AE", "NewFields": { "ExchangeRate": "4e0c52ffd72214ae", "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E0C52FFD72214AE", "TakerPaysCurrency": "0000000000000000000000005553440000000000", "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1" } } } ], "TransactionIndex": 39, "TransactionResult": "tesSUCCESS" }, "hash": "75B818FCF3C74E4A7F0829AE899BDC927191C740E8D37D1451908907AA5C5078", "ledger_index": 73246635, "date": "2022-07-25T16:00:21Z" } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/test/mock_data/OfferCreateWithExpiration.json ================================================ { "tx": { "Account": "rsG5iLf2gey9e1vVtLBb1R88XskVGWVAw1", "Expiration": 737735327, "Fee": "12", "Flags": 2148007936, "LastLedgerSequence": 71735709, "Sequence": 71310941, "SigningPubKey": "0328508E495AC91BEA0EA4EC65C7861661C57FF0C45287CB386F4100F1711E8D85", "TakerGets": { "currency": "BPM", "issuer": "rDBMvpjV6DoWvr3LqMUG8JBgd4QbBoU1E2", "value": "1" }, "TakerPays": "71420000", "TransactionType": "OfferCreate", "TxnSignature": "3045022100A19A1039C367E871F301DDDA5A105201F7A322E293C2749EC34B471E7806356902204CE49171C40BE9279F1293DBDA21FEB1EC55E0ED1760C78F85D1A2EA9E152940", "date": "2022-05-18T14:30:00Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rpwfJxJ9MrRPPstaBSEtuSCzLhDsmUYjaQ", "RootIndex": "007B86804A6D6F78B3B095B9A00678245069593542D7C60A82EBCBE1D1A1AA85" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "007B86804A6D6F78B3B095B9A00678245069593542D7C60A82EBCBE1D1A1AA85" } }, { "ModifiedNode": { "FinalFields": { "Account": "rpwfJxJ9MrRPPstaBSEtuSCzLhDsmUYjaQ", "BookDirectory": "AA9EB97185D32FE5CB61A2AD883F0AAA66507E77DCFE03384D04F94AE6AF8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "Sequence": 66239955, "TakerGets": "147170905", "TakerPays": { "currency": "BPM", "issuer": "rDBMvpjV6DoWvr3LqMUG8JBgd4QbBoU1E2", "value": "2.060392678" } }, "LedgerEntryType": "Offer", "LedgerIndex": "4C39E3771FFD78C03F4BD8F7AE111289DCB8C00BDB25181FBB73570EB7EFFA84", "PreviousFields": { "TakerGets": "208392400", "TakerPays": { "currency": "BPM", "issuer": "rDBMvpjV6DoWvr3LqMUG8JBgd4QbBoU1E2", "value": "2.9174936" } }, "PreviousTxnID": "AEB07E1D2BE2A2991C5A7951C3E98AF6A743E3D5E688A5BA23B099AEB4F0746A", "PreviousTxnLgrSeq": 71735429 } }, { "ModifiedNode": { "FinalFields": { "Account": "rpwfJxJ9MrRPPstaBSEtuSCzLhDsmUYjaQ", "Balance": "164963813", "Flags": 0, "OwnerCount": 9, "Sequence": 66239956 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8DFC879437AE0F7C59A44B0BEBA81AB04E1A42FB2BCEF0E15030A9399AF162DE", "PreviousFields": { "Balance": "236392385", "OwnerCount": 10 }, "PreviousTxnID": "AEB07E1D2BE2A2991C5A7951C3E98AF6A743E3D5E688A5BA23B099AEB4F0746A", "PreviousTxnLgrSeq": 71735429 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "BPM", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5000099" }, "Flags": 1114112, "HighLimit": { "currency": "BPM", "issuer": "rDBMvpjV6DoWvr3LqMUG8JBgd4QbBoU1E2", "value": "0" }, "HighNode": "7", "LowLimit": { "currency": "BPM", "issuer": "rsG5iLf2gey9e1vVtLBb1R88XskVGWVAw1", "value": "10000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A2571B11B6DD963EA3A0CFEC43E7C226A2DD621A960460338D95C07CEB73E3B0", "PreviousFields": { "Balance": { "currency": "BPM", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5000100" } }, "PreviousTxnID": "603978602C11C97206F58B81E0825EBCEEDFB753C9CE62496522B732DB3AD2A2", "PreviousTxnLgrSeq": 71735541 } }, { "ModifiedNode": { "FinalFields": { "ExchangeRate": "4d04f94ae6af8000", "Flags": 0, "RootIndex": "AA9EB97185D32FE5CB61A2AD883F0AAA66507E77DCFE03384D04F94AE6AF8000", "TakerGetsCurrency": "0000000000000000000000000000000000000000", "TakerGetsIssuer": "0000000000000000000000000000000000000000", "TakerPaysCurrency": "00000000000000000000000042504D0000000000", "TakerPaysIssuer": "8597209DD7A086DE4002A5BCF25D25FEB41DD6CD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AA9EB97185D32FE5CB61A2AD883F0AAA66507E77DCFE03384D04F94AE6AF8000" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "BPM", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1" }, "Flags": 1114112, "HighLimit": { "currency": "BPM", "issuer": "rDBMvpjV6DoWvr3LqMUG8JBgd4QbBoU1E2", "value": "0" }, "HighNode": "31", "LowLimit": { "currency": "BPM", "issuer": "rpwfJxJ9MrRPPstaBSEtuSCzLhDsmUYjaQ", "value": "10000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C2B353479AD0023E8E37F16E468565D6B36189043F3031AFE1409729DF31E0C6", "PreviousFields": { "Balance": { "currency": "BPM", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" } }, "PreviousTxnID": "192446F3FACE5A644BCE9535643137DC3F0AF12C0D269E8987D4C4E6DF822336", "PreviousTxnLgrSeq": 71735127 } }, { "DeletedNode": { "FinalFields": { "Account": "rpwfJxJ9MrRPPstaBSEtuSCzLhDsmUYjaQ", "BookDirectory": "AA9EB97185D32FE5CB61A2AD883F0AAA66507E77DCFE03384D04F94AE6AF8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "3CCF0FA2DD55D6AD65F6BAB659C1E3678C5A85856B8266F68B72C5119C6C9180", "PreviousTxnLgrSeq": 71735213, "Sequence": 66239953, "TakerGets": "0", "TakerPays": { "currency": "BPM", "issuer": "rDBMvpjV6DoWvr3LqMUG8JBgd4QbBoU1E2", "value": "0" } }, "LedgerEntryType": "Offer", "LedgerIndex": "E49A1AC62924EC4F29196985632D3C8F35E46F1C1547466E4CDC72861543B2B1", "PreviousFields": { "TakerGets": "10207077", "TakerPays": { "currency": "BPM", "issuer": "rDBMvpjV6DoWvr3LqMUG8JBgd4QbBoU1E2", "value": "0.142899078" } } } }, { "ModifiedNode": { "FinalFields": { "Account": "rsG5iLf2gey9e1vVtLBb1R88XskVGWVAw1", "Balance": "99428470", "Flags": 0, "OwnerCount": 2, "Sequence": 71310942 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F90B2824129799001E35CCBA4E8583038F9BCFE28B229A082055235594198D69", "PreviousFields": { "Balance": "27999910", "Sequence": 71310941 }, "PreviousTxnID": "D8BF6CBD4F3C4101808C2401B569E613D30840330AAFE5FF4C1EF68ED7E7FC7A", "PreviousTxnLgrSeq": 71578111 } } ], "TransactionIndex": 19, "TransactionResult": "tesSUCCESS" }, "hash": "42E717B9936C13DBA659E36AE8AC4D4C51D282AD851E0F068379B2F13E8BD73D", "ledger_index": 71735683, "date": "2022-05-18T14:30:00Z" } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/test/mock_data/OfferCreateWithExpirationAndCancel.json ================================================ { "tx": { "Account": "rETx8GBiH6fxhTcfHM9fGeyShqxozyD3xe", "Expiration": 706210096, "Fee": "20", "Flags": 2148073472, "LastLedgerSequence": 71737504, "OfferSequence": 44866443, "Sequence": 44866499, "SigningPubKey": "02E729FFD554E5254291CB033D0CC08B32D6A3795A747C5F4F7DFECA20B616B6BF", "TakerGets": { "currency": "CSC", "issuer": "rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr", "value": "1080661.95882" }, "TakerPays": "1764293151", "TransactionType": "OfferCreate", "TxnSignature": "304402205868DB7AA2E00E68BE0E85DEF12257634D4AADCFED65A1B46CABA2FF8147F04D02201384DF6FD397DAA61B4EE7CBEFEDCCF2FC6B5D91679BE5ED6FF1F1691FC4C1BB", "date": "2022-05-18T16:28:20Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "651", "Owner": "rETx8GBiH6fxhTcfHM9fGeyShqxozyD3xe", "RootIndex": "8D47835C2516C1F8F28A43C140356DA142DEB58CA29EF27212ECE6DCFC4472C7" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "170193B7EFAB8B71E41C8E3A835297E5D0EA1B11C36E60416EBBB4C47E482CA0" } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD5805CCD843C9A8EA", "NewFields": { "ExchangeRate": "5805ccd843c9a8ea", "RootIndex": "B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD5805CCD843C9A8EA", "TakerGetsCurrency": "0000000000000000000000004353430000000000", "TakerGetsIssuer": "07453A365D565F637A8CB8478AF080F2CE8E0D48" } } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5805ce7569d293be", "Flags": 0, "RootIndex": "B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD5805CE7569D293BE", "TakerGetsCurrency": "0000000000000000000000004353430000000000", "TakerGetsIssuer": "07453A365D565F637A8CB8478AF080F2CE8E0D48", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD5805CE7569D293BE" } }, { "DeletedNode": { "FinalFields": { "Account": "rETx8GBiH6fxhTcfHM9fGeyShqxozyD3xe", "BookDirectory": "B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD5805CE7569D293BE", "BookNode": "0", "Expiration": 706210036, "Flags": 196608, "OwnerNode": "6a8", "PreviousTxnID": "7C71DA321971CAA5222FC702B2A7F4E7160F0DCD3E22F64D91800CF202D9D949", "PreviousTxnLgrSeq": 71737489, "Sequence": 44866443, "TakerGets": { "currency": "CSC", "issuer": "rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr", "value": "1080661.95882" }, "TakerPays": "1766210742" }, "LedgerEntryType": "Offer", "LedgerIndex": "C36A1E486775F89E5A2312A0A27913B144623034982B44043F93C0425D9E77C7" } }, { "CreatedNode": { "LedgerEntryType": "Offer", "LedgerIndex": "E1C174026DED3E3443223915D38045C0B442BE0741BD4E82B6B100A622C819B0", "NewFields": { "Account": "rETx8GBiH6fxhTcfHM9fGeyShqxozyD3xe", "BookDirectory": "B288090D3C8C2DFE50D835DB4C0F09EAF4C1ABF29B1F92DD5805CCD843C9A8EA", "Expiration": 706210096, "Flags": 196608, "OwnerNode": "6a8", "Sequence": 44866499, "TakerGets": { "currency": "CSC", "issuer": "rCSCManTZ8ME9EoLrSHHYKW8PPwWMgkwr", "value": "1080661.95882" }, "TakerPays": "1764293151" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rETx8GBiH6fxhTcfHM9fGeyShqxozyD3xe", "Balance": "85999100", "Flags": 0, "MessageKey": "02000000000000000000000000F3AE90A6141CEB9C639BA74FC024278306F6D42E", "OwnerCount": 15, "Sequence": 44866500 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E938FF495007E7C01911CDFDA087111CD0130C8A6FDACCCB34914636A31486C5", "PreviousFields": { "Balance": "85999120", "Sequence": 44866499 }, "PreviousTxnID": "0CE8053EA958D04400D1930370ECC3FD582CE924110C9B07E83295A6FBAB1E85", "PreviousTxnLgrSeq": 71737504 } } ], "TransactionIndex": 23, "TransactionResult": "tesSUCCESS" }, "hash": "6FDE7EC0DAC71E7B2684CC2C4A1F2C3DC84B81A87B9172322BC1A8EFB49438F5", "ledger_index": 71737504, "date": "2022-05-18T16:28:20Z" } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/test/mock_data/OfferCreateWithMissingPreviousFields.json ================================================ { "tx": { "Account": "ratboJVqeveTRpRvto7G811syRvhgQXBtB", "Expiration": 727237801, "Fee": "18", "Flags": 2148007936, "LastLedgerSequence": 69064214, "Sequence": 67114055, "SigningPubKey": "03103FED6076D5F3E7ED496A74F3EC5CA04A1AFC3A4FB7E90828EF72DE70386750", "TakerGets": "529000000000000", "TakerPays": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1058000000000000e-3" }, "TransactionType": "OfferCreate", "TxnSignature": "304402200585B12D8DD376F695DD1F3AD89039A26735770F4A73D64B07D7B71B1B0A95F702202555AB355B1A51788E67F3BA28BBE142CE7F1C53935FEA3510D5FED74A89DACB", "date": "2022-01-17T02:30:40Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "DeletedNode": { "FinalFields": { "Account": "rESTNm5GsJf8WQEnEmszRCsiEzHuFAcgQk", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522354ECBEA090F2", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "60E4D345CD33480E2754CAF28FA43CA095E8688966D13570EB4362DC24F9CF9C", "PreviousTxnLgrSeq": 68868327, "Sequence": 66677005, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0025AEB8071D71500CA087333147FCBDD6F9AAEC6634B136D5CEE957A99DFFA3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "77431669" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rfnaFsTkxCWYtenT3MxsFxjjrX4F7itNzd", "Balance": "1623057702", "Flags": 0, "OwnerCount": 252, "Sequence": 66195695 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "004EE8ED4AE2A11701BBF2609366B3A43F645BE1BE3D5C42BD3B5D711FA316E6", "PreviousFields": { "Balance": "1584127753", "OwnerCount": 253 }, "PreviousTxnID": "5C83A59E0EC77E2CFBF9DCF06BD63DBF1C2644FC0D195594142C33649ABCCC10", "PreviousTxnLgrSeq": 69064164 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-290951959.25848" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEpLbrik9r6KpjVbWXA71SVQnMCkY8BEUK", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ada" }, "LedgerEntryType": "RippleState", "LedgerIndex": "00576D745238740783A3DEFF51D2FC6606F577A39FADF76EA8558690FDB2D552", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-76409507595.13332" } }, "PreviousTxnID": "C34BB20F960AD4382D529D218E71BCBB81969568CCD6A82BBFC6AAC78EBF9C08", "PreviousTxnLgrSeq": 69034874 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "b", "Owner": "rsE3JJ4VxxndQwzRusS99pmAeYN3bEYZmc", "RootIndex": "2BA630BE21EDA0681F0E98D4441383EE77C77A06851F782EA598B84CDBE04183" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "006028C8ADFCC39CA785003945D6EA95EE3E31743D0C705366BFFA710708BE76" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5750000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "efc", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpJZ3qkUBb3m68p3YrzJE7onMcswN4XDY8", "value": "9999610698104576e-1" }, "LowNode": "8" }, "LedgerEntryType": "RippleState", "LedgerIndex": "006402E81497BD2F2913A6A2F7F72946BDD7ADD86E4CAD7A7E1BEB6C20B8B1BD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "25750000000" } }, "PreviousTxnID": "29C20A49F2FA1A18054D55087FC2284BBB92F85782982A23AD8CA758C7577D7F", "PreviousTxnLgrSeq": 68990958 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rGZkP89rxHSHy1opAagx8cUx4JdMhr9v4", "RootIndex": "846A7CB5E09802AF1EE9B5B2C96CA9F1862FE77698FEE5728215DD2AB5B9C4AE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0069DB26B59B239235E14C7D0AA7390946B8635C15A223738DF748D3D4152595" } }, { "ModifiedNode": { "FinalFields": { "Account": "rNoN8BUzTSY5oyJmAMiKNGo1k8PSxhyJzc", "Balance": "412799122", "Flags": 0, "OwnerCount": 142, "Sequence": 67232094 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "00856884D9892892CD5B6F54BA568146CF6C776B6665F31E95CFD67200C8960F", "PreviousFields": { "Balance": "296009275", "OwnerCount": 143 }, "PreviousTxnID": "9CD4143710835ED770C1EE5554381657573797150D26AA189B1653CA5D98C9B3", "PreviousTxnLgrSeq": 68989854 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "2da", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnhFkVQVhLHoMBNc5aUNk5fRvZfXmt16nz", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "009C2B988ADF8022EC6A00381C96828E2D9DEA14678EADE1137FF96A909E170E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "AFE01AA91FE14CA8DC6D7E3B4BE16EB5684C16A1039A7BE1A336048BF17CA767", "PreviousTxnLgrSeq": 67951474 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMAWeQvUd5zQpyY9hSdaUMRMTQHcgAXvj5", "value": "9999999997999989e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "9c8" }, "LedgerEntryType": "RippleState", "LedgerIndex": "00BB2037F9D0266BE80288560E5402B7FB1E1423E119B22DAA1C11367B20A752", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-61293868439.03283" } }, "PreviousTxnID": "48C140CC2CA353858C4C311A5D146514E8F131DD62F00433B7F510EFA6DD7D2D", "PreviousTxnLgrSeq": 69044256 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-70073908794" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLkaQPNxjeDmFBqhQ2GszmgT4wxykPCP5K", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "537" }, "LedgerEntryType": "RippleState", "LedgerIndex": "00D4C120F87FEB629CE72EE760459A7345BCC8D1246F7B5F9F3395537BFAC37B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-88183309987.39236" } }, "PreviousTxnID": "0A0E0771F6EC02D17D0A6A45E3A03D5E2460B6F3307AB9A2054024828E1F3808", "PreviousTxnLgrSeq": 69023482 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ebc", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMhxYNNMAgwGdSciDqnCb8tVqJZ22VCCL", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "00E53A1AA480024150E77841498BAE248742A03721FE7C8354556BEA98B750EF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1881122768316515e-4" } }, "PreviousTxnID": "323A1B5D0A3AC9563EA91FDD2DEDD2CE093394F49DF4639C506542428DE296F9", "PreviousTxnLgrSeq": 68940869 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "8565760891.33962" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "d88", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3pUPUHoXbK4o5wjfPWjqQe4Xh2wu2KWvq", "value": "9999999997999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "00EC342A4E3EBC371D82BDBF69DF5F28E0C89B68740F095F483E4141C4AB22C7", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "44585839772.10755" } }, "PreviousTxnID": "00C70A0DCA209C7295F5AD94FC7B284A138AD7F80D622CCA946F5B1EE813D2B2", "PreviousTxnLgrSeq": 69044299 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJ7DCt3RdTywMMwKTq2Pm8srSeU4GvmSiW", "Balance": "415751859", "Flags": 0, "OwnerCount": 144, "Sequence": 67713565 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "00F0C469079DBB3EBF352C661E1F82D6DB7FF4ABBF9EBB97BD781425AAD0A1A2", "PreviousFields": { "Balance": "353354280", "OwnerCount": 145 }, "PreviousTxnID": "4D1D313B5142975FE2A3145838F1017674BD1AAA712BB1497BCE3EE7FBD42AEE", "PreviousTxnLgrSeq": 69063778 } }, { "DeletedNode": { "FinalFields": { "Account": "rMGX6LAGxRUHd4g3yW1ukFhThgiCxMioX3", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208077540DD5B6E", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "9AAFF0D67BD99FA249A98B4B6DBA2257F30228388C5ACB8B94E27D3F92E14F7A", "PreviousTxnLgrSeq": 69044585, "Sequence": 68628053, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1152727648821991e-4" }, "TakerPays": "260516448" }, "LedgerEntryType": "Offer", "LedgerIndex": "013374CBB57A02A47E537F589B384AEF18DDC771FB63290ABE931A53F0A90E7A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDfGPHrMgjFmWvA3TRkx5rcD85Y9sNizB2", "RootIndex": "6B73EED7B040E0EB3B9132367495EC6A6F6E2573B7823B38FE4E824F0CE47B7C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "01476A1DD222ECD72611FB829EC7AA7D4AAD06059135F7BAD5E8C9C8AD46DAB9" } }, { "ModifiedNode": { "FinalFields": { "Account": "rnMENGbcT6QgrfDGjz7UJvyMryD8YPdi3y", "Balance": "9920379350", "Flags": 0, "OwnerCount": 72, "Sequence": 65874420 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "014CBDDF684B031FC0583D59255B6334B65C7336C30E5E44D8A92DEA61140255", "PreviousFields": { "Balance": "161999928", "OwnerCount": 73 }, "PreviousTxnID": "1A3DE882FF56D5A6DDDC6D669E3D0AA690BFCF88262F5CE09C907ACD94386D8C", "PreviousTxnLgrSeq": 68991027 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rnDZQsMj4ttxiiL23S8LEAzhbhNtK3P6ap", "RootIndex": "0378B0BC7791CCD5B887C038F36A0C47BF7407C8764C3305669B7FAF0C60F3EF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0153863EAF9D3D5A50C4A5F6F5D92504E0A7330E511DB53D05B14FBCE997F3D4" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rB7sr2UvCBewPJXg9My4kjDFWDF9URdRuJ", "RootIndex": "767DC66E41CB93802611E7E7D770E4EC180A94EDEA10B3B2EC7A57BA45616EA7" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "015A94886F0D80D3CF0A60E710665E9036D67C82AC642F5CA8948465DF08F2E3" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "803", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpeh8BoXFBaV9nkmRvyHWMt9tGagwWhk5s", "value": "9999999999999999e-1" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "017C4B3C0B91C01AA81F6568E3E1154D25CE4482F9CD4C5EDEC762B25A2ECF10", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "1503FBEE8ABF735F587ADE3990464B1D45647019BE39F05C037ED5EBCDF6A4C0", "PreviousTxnLgrSeq": 67993303 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "b", "Owner": "r3mZ69KGMSXXfdFe2xxeNvSkA98mQQ52aF", "RootIndex": "6D30E557DAD896881F769671001834736F3425E9A87920263677491949B5A151" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "018C22EA13F5D541FB6E4A61AE978790684E7C82C0B663DF9A11B5CA97B33FBA" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "f08", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfn3KpY6HS6aE1vviRjhHfNn3BfuSrhmzv", "value": "9999610698094578e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "019AD1D97D34FC4CCC1112E99EC9B155FAFEBD3AF2136C1E7B386658F2427D41", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "8800001000" } }, "PreviousTxnID": "A92B0EB6D2BD0339FDD1044FCA07B6E9A6195129DB9C94E271AEF28DE8998CDC", "PreviousTxnLgrSeq": 69029858 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "d", "IndexPrevious": "b", "Owner": "rGMM3Ag2DiYP71uk8mWQi8fafCQczx8ouK", "RootIndex": "6CFD694ADD9E400E492F218639C9D4327E10F22E0A9F39BBC8E02FE373F93D0E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "019D8DE73CBEC286FD445D00BFE5170602B2EFBEE222C287C28B5EF5C68CAFCD" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ede", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rh8TcfXzDZdQBB8R9aQfE2zUUwpd1zbEWv", "value": "9999999999999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "01B27F486CA3CBDE4ACAA56D82FC39F831F14A3A4BB09E8CAD05EA14F1C6B986", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1999999999999999e-4" } }, "PreviousTxnID": "F1F73F4E6AEBAC69C6551DE27AE748A951C2A4CCE76D7C107DCF13FE5BAB961A", "PreviousTxnLgrSeq": 68898560 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "767", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwyhjUuEiNmgv4AG4ptie2eAWqN4kfraxv", "value": "9999999999999999e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "01E7B58F8272F89F2F9CF9C2B5645DE523B35CD0826F770906BE9A92A6D25C15", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10000000000" } }, "PreviousTxnID": "A2535790B7E8900FBC3EC47C06E3E1AFBD81FC16CB3AA70EF6AF8A42971DC08E", "PreviousTxnLgrSeq": 68902682 } }, { "ModifiedNode": { "FinalFields": { "Account": "rENubezZP8CRwDNdupJB2J8D1GxukZ7hjv", "Balance": "357888429", "Flags": 0, "OwnerCount": 61, "Sequence": 67385257 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "020FD37B8CCA04F2632B5856E12B69C4512409541598AF0E701EDEC5EF032108", "PreviousFields": { "Balance": "337888429", "OwnerCount": 62 }, "PreviousTxnID": "2911158C391867F6FDC9C550045373855E8718907EE8B4BD9A1CE78687485866", "PreviousTxnLgrSeq": 69061950 } }, { "DeletedNode": { "FinalFields": { "Account": "rsdrgJ5xtkPpnWfJeeshHZLWmQEMS3cFzQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Expiration": 722825997, "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "038BABFE15B6E2EAAD9134953132CC40B1FC72B13466AB6695E7B5325420382B", "PreviousTxnLgrSeq": 67961739, "Sequence": 67219914, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "02242D3A2968A901D2657D4BDE9BBD3BC8C76F837AD51713977B249878C595CB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "50000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rMGXtc2jn88JResx6QRWgyxUvdrXRwmZ7J", "Balance": "232197593", "Flags": 0, "OwnerCount": 39, "Sequence": 66730949 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "029CA399728272C05ECFBC2BD18DA11142E4EDA2DC6C40210C72D8069D980C57", "PreviousFields": { "Balance": "89999985", "OwnerCount": 40 }, "PreviousTxnID": "4D2DF5F52510E75F80F548291F82233717D47B41215398B59F97BB5EE3214209", "PreviousTxnLgrSeq": 69026936 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "c", "IndexPrevious": "a", "Owner": "rPhzFvrw8hkGkdzQvSRjuHuESLDqnd6xDg", "RootIndex": "9FE3D8E47F8AE95559809E2B2408BCB07A48681C059D7EAF51382704171B22D3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "030C100AC3BA02B469513C24482DF3169E3BFA5A3151CAF21F65CF0498BAA5D3" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rNirEvsSGiRDGtL68t6MJwfAyU1MExreYv", "RootIndex": "651B32528BEA8B8A73B48ED10EB3CE11A0C907551EC6E0DAFB9CEF77ECEF1EF8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0325B3D2228B862CFE41AA412EC9F8AAA37183C95A4CC6F59BF774C6406831FA" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4VjGvXZQwpAy5iqMCt6kbSbFb7Bi8RYEG", "value": "9999610698104584e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "eda" }, "LedgerEntryType": "RippleState", "LedgerIndex": "032CEC5A55D5D6FCEE7EF7C33F8A5469E8CB7EE88534DA146CBF6307B29F2673", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20100012300" } }, "PreviousTxnID": "A20D9847E15FA7A7E506E22A80FE1A1FAEEF11DDA7E4C0E418E0D9C0D9002E87", "PreviousTxnLgrSeq": 68922661 } }, { "DeletedNode": { "FinalFields": { "Account": "rs4wbWdssBMJRgn4tJak3eq1JgrJ7Pgfnk", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B27184EC2AB6", "BookNode": "0", "Expiration": 726846407, "Flags": 0, "OwnerNode": "4", "PreviousTxnID": "D0F1D54AF5B9A8A3FF9D400AEA05D4E6E0AA597AC09BF56E2B34164B3C484AB7", "PreviousTxnLgrSeq": 68964741, "Sequence": 67390727, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "034A1D79B3937372E4944824FCBA9FCF163A9DEA1F75E4495724B133C36143B9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "22341375000" }, "TakerPays": "105000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10000000000.1736" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMrt91RkHZwmYfUbVX72iwmbiaRxnKXjo9", "value": "9999999997999991e-1" }, "HighNode": "a", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "d13" }, "LedgerEntryType": "RippleState", "LedgerIndex": "034D9B521E66A1839566C6387F7C8C9158E65B5057F38ADC9484315554E3EE8E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-6553287172755202e-4" } }, "PreviousTxnID": "49348E7713B675A0F360B071E2750047DD611BB2E4FF2807955F7F388888E110", "PreviousTxnLgrSeq": 69045371 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "10", "IndexPrevious": "e", "Owner": "r4F6d9gkY5JPEkDEmUwcLgGX2NSV6o7DyR", "RootIndex": "F8EC5BDB08CD19C6618EF1B0E1C0678F34E6541C908D643CDB0F437211813C8C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0356513FF37E64A2D845FDBFBD26E2F870D31CF5639281DE0C4E24320DBE4B5F" } }, { "DeletedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2097152, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGgYjYE7aH7sY7uc9BHpks2NDgVkptYkDh", "value": "0" }, "HighNode": "3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ee6", "PreviousTxnID": "7E0820CB80C5347299228CCA5CC3D41616EAD8D1F7F5465D68B7B456A9D3594C", "PreviousTxnLgrSeq": 68898821 }, "LedgerEntryType": "RippleState", "LedgerIndex": "03911B3D27AFF9C2E0FE6B23323322184EF271D868B4B9B6E0F5003D3CB1AEBD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10000000000" }, "Flags": 2228224 } } }, { "DeletedNode": { "FinalFields": { "Account": "r4KDwn1x7ihYbekn13gYAoV9fFnjwFa28R", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531A5CDA496C4F40", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "030403616ABC48C47A3E211C26C2C3881A225104C0880A3750B6C8283AE58F14", "PreviousTxnLgrSeq": 68865191, "Sequence": 61086216, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "03A47396288F4B81A81C27C29BB6E135BFDC408FED7E0E14A4B8D9B5EEEE545A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4485520145803172e-4" }, "TakerPays": "33284542077" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "28046783702.39721" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "222", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raDJvZX8gbRfZ3hUWimZPdVcDRzsZQdhmr", "value": "1000000000000000" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "03C26CA9E5C1D104DD7A57D4B68001B735BBDFAB1D9B127EBAC9E39799B53A24", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "70046793702.39721" } }, "PreviousTxnID": "93F0873BD2CCCC432644192B0CB2068105E2248FC246D9EED7471C300893A9F8", "PreviousTxnLgrSeq": 69049581 } }, { "DeletedNode": { "FinalFields": { "Account": "rGQaGNPT8u7Wt1RoqJEhBgAPyc9ek5RfCL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208E1BC9BF04000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "15A80A6D08A6E004CAB595436E45BBF27FF36B4A8322E0B18473B06A4700CF24", "PreviousTxnLgrSeq": 69035205, "Sequence": 65975086, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "03CA86ABE8BB3B42DF726FB35D754E5CB5C0600D7DA96CFC2BCFCFF4FB447E35", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "25000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rfJmPRPCTwt45woergVCBhkHWjxVBevfan", "Balance": "98748320", "Flags": 0, "OwnerCount": 40, "Sequence": 66581238 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "03D0C83A9B1FD3B6FF4614320A6EF0679A1608806DE6F152F45165FD7EF41FAD", "PreviousFields": { "OwnerCount": 41 }, "PreviousTxnID": "124F91528EC0DF6A75244C5D1B861B93C0C6178792D1EA5F0F83B775A6464D8A", "PreviousTxnLgrSeq": 69060424 } }, { "DeletedNode": { "FinalFields": { "Account": "rJjTUAWDqunqKUB8SgYHV8QNTmvGArX4Lv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AD73B83473000", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "AD0B23017BDBA321F257D4CCD02453737BA34434413D2A9CF84DE27F361D1796", "PreviousTxnLgrSeq": 68904413, "Sequence": 67287197, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "75550000" }, "LedgerEntryType": "Offer", "LedgerIndex": "041EABCD5A8AE2129C81AA69AB29DE5D53A4FE3B4100C9E1FB384DA98854D8AD" } }, { "ModifiedNode": { "FinalFields": { "Account": "rHT6EWF9zJzwNtHQsxyrRMSQL4h5GhkcUn", "Balance": "4393218546", "Flags": 0, "OwnerCount": 18, "Sequence": 67682153 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "04242CF97ED5ED7107A9491E4F83CE354CF24527A33D1A32FD4CDA5C7488E7D3", "PreviousFields": { "Balance": "3715218546", "OwnerCount": 19 }, "PreviousTxnID": "736C9642E7CB7BCCAB1D48616D88ACC6CF88A7C9EB78C8436A9BE975A6F97F49", "PreviousTxnLgrSeq": 69056730 } }, { "DeletedNode": { "FinalFields": { "Account": "rK4qafqqEtLjM1CRfcgY1H8Z4zGTRATkaV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521883837089C902", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "8E98046882CF2E37F34A33DD82289C0FA22A17EB4F5DB6E3294E3029B9E07FE4", "PreviousTxnLgrSeq": 68899240, "Sequence": 66367867, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "04494E12F81AEFF0B6B506510A4642294D3360E08F4AF939019AC27096E953D8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "74669043263.20191" }, "TakerPays": "515216398" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rQDGBD8WCV3szWgH9rvyhjPHPX66KPGVnd", "Balance": "332125559", "Flags": 0, "OwnerCount": 25, "Sequence": 67654267 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "047DDB90A214E3C911E52EEB5902ADBE289A0F7434B44DF3FFDB217A96CC306F", "PreviousFields": { "Balance": "252265699", "OwnerCount": 26 }, "PreviousTxnID": "3B58740F83B822466599B340C5CAD53BF47B506855EADF1EEC2476BACE937BAF", "PreviousTxnLgrSeq": 69064176 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3500000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "625", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r91eSWyof8C4aiDL2gM1xTdmc9GJy3rTWb", "value": "1000000000000000e-4" }, "LowNode": "4" }, "LedgerEntryType": "RippleState", "LedgerIndex": "04989A4ACFA7C8DCD5890D1BF6FC69B683211F17F5705692BBA1049494952293", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7000000000" } }, "PreviousTxnID": "79AE85BCBF5A1DFB052F443DEFE1175A44C406751A4354F09E2061C0C84DC6EF", "PreviousTxnLgrSeq": 68897189 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rBCw1uH84iKcSRVjY8ALzx66Q9ZVNMgYsn", "RootIndex": "4F2B185BAA4AB1B9C35680658304FB11BE41F080D55D11B539075A4A5CD53DA9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "049FDB5F35F4F3684324F4A1BAC613856C9509C330FC68C0324F923F4AB48BB0" } }, { "ModifiedNode": { "FinalFields": { "Account": "rQDZDYodywYJULXJtv68QyoDbkV5EZgh9s", "Balance": "2196152987", "Flags": 0, "OwnerCount": 152, "Sequence": 67424412 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "04B9B4EDE4D521F88B2B1D93E1861AF74D3F3EDFE5712B5789EECC06118E95F1", "PreviousFields": { "Balance": "1308437399", "OwnerCount": 153 }, "PreviousTxnID": "89D4B056506ECA595285123D7FE08109E839E8AEE53DB7AFB9CD21201FC9368C", "PreviousTxnLgrSeq": 69063370 } }, { "DeletedNode": { "FinalFields": { "Account": "rpeh8BoXFBaV9nkmRvyHWMt9tGagwWhk5s", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD494E4986", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "1FA434902C7C5F2F7BDED540D45AC7F87E5B15DED2AF9092DD2C9B7D3BBED4DF", "PreviousTxnLgrSeq": 68999399, "Sequence": 67385081, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0510EE0BBFFB001D3566DB7DF47D4F551184DC474C586150F7A114D20C78CE9B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "155719797" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rExSJvWnn93G5NfnzZ3YKuPgpQnr8wBsrE", "value": "1000000000" }, "HighNode": "b7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e1a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "054B2C88DB2616036AE283096BDABB641A30C46DE56CCC6F9DE3F3A7CF1AF0B5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1598241241885340e-3" } }, "PreviousTxnID": "7D6F23EA47B2851ED6ADE5B73DE47B0C4F5FD850BD8DE31E3FFC9F56C56D4938", "PreviousTxnLgrSeq": 69059543 } }, { "DeletedNode": { "FinalFields": { "Account": "rMGX6LAGxRUHd4g3yW1ukFhThgiCxMioX3", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207CE28EB76D7D3", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "CB354DAED6E268FAE9259928E0B5665F0DF0607FFC11E1DB86D167A1E3E02FAE", "PreviousTxnLgrSeq": 69050997, "Sequence": 68628058, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "054C07BCD0C72665A234D9435727409BCD230DA0A2F945ECF59669786DEB9E34", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "34911374032.31382" }, "TakerPays": "76700288" } } }, { "DeletedNode": { "FinalFields": { "Account": "rUdhzvzWjHpSjP6CGksiit3bdgGLV5DXZv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521B541CF380C4EC", "BookNode": "0", "Flags": 0, "OwnerNode": "2", "PreviousTxnID": "469984C4EF8C5E5B9B5264FFF2E7114F02577ECA24EFD41BC9BF3D975CED7642", "PreviousTxnLgrSeq": 68907356, "Sequence": 67546186, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "05699879D8666FC57A1DB142B57C51DD25FB59C1435ADB62D4CDA08F3CB31329", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "13000000000" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1810329300.17244" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMBUa2qAaU6K8DRTyQsfmeRUtu6j7m8ovB", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "d76" }, "LedgerEntryType": "RippleState", "LedgerIndex": "057547C9D5E7C116AC41CFB57B1F2AB5273102208A452E8CBE08CE58401105FB", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-12068862001.14957" } }, "PreviousTxnID": "CBDE7F3153432CD2D2933A66814B200593A5C67D18219C4D5E7A4F7E76A4C260", "PreviousTxnLgrSeq": 67996095 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1421567855260000e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLVaKJ42tddq3vJAFiPibubt2HbBpTHuX7", "value": "1000000000000000" }, "HighNode": "4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "25d" }, "LedgerEntryType": "RippleState", "LedgerIndex": "058F43F3F4A7F9B0EBE502C6EF6922F5050D74985B33AD5B3A831A4C5E48878B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1500000000000000e-4" } }, "PreviousTxnID": "13DAD17CE8D14EE8F749D023FF6C059152129223E9527DD122CC88D82472CFCF", "PreviousTxnLgrSeq": 68991218 } }, { "DeletedNode": { "FinalFields": { "Account": "rnB62vv6d8dQV13A3nHQQ7LEGy8DEWkLuG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D94CE37663689", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "05A91D401C3028F5C60A5DDB32A88E6586E4512902CF048D6DFF404E20CD5501", "PreviousTxnLgrSeq": 68905044, "Sequence": 67267180, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "05B938C3E5C52669A6CF9B8F2259AB9F72B2D5867992AB3B14A0944C621435F5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12010010000" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rpWE8DQzMegfBwaPaQhF9EGfxWWxvqRwk5", "RootIndex": "05D405CDC6AB585B155B17B10DE4DD5C0C2C6CE80C49AF665EB648FDC41354AD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "05D405CDC6AB585B155B17B10DE4DD5C0C2C6CE80C49AF665EB648FDC41354AD" } }, { "DeletedNode": { "FinalFields": { "Account": "rBBS1EhebBUcDs7gDa4ZuoTfmBwsRGqycY", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308F3ED38D58000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "4239630C3C820C95AD603B09EAAEEE4D2FE76CD4E675E693FCF701899389BFFA", "PreviousTxnLgrSeq": 68893233, "Sequence": 67855167, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "05E7301E23B4AEC139A1BDD163B8403876873838FD183B4087AF91254B47C6DA", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "252000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rJ7kEdYrtovE89yxzJ14DgPYCR58odZYVi", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD498D0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "8F3203A157F450A05B1D1655FE4E09A3496B96C5D10C9563102509C87B7920C9", "PreviousTxnLgrSeq": 69057902, "Sequence": 67712449, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "05EBDDC840621D49BF36C6FDA73EF674B7E9E00C24D0636D6D90F44D6AFAA2DD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1734116600" }, "TakerPays": "34682332" } } }, { "DeletedNode": { "FinalFields": { "Account": "rEpLbrik9r6KpjVbWXA71SVQnMCkY8BEUK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365215F59634A8EE00", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "532ADE2B36E989BE4EB996A65262F09E1B290B4EC0EEC65C9951A5697A979F20", "PreviousTxnLgrSeq": 69038102, "Sequence": 66709822, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "05F30997DEF8B965C52F7C7B541B5A6B8C50F1972634FB16E02980E4C737ADFD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "38109507595.13332" }, "TakerPays": "235554866" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rPc9ia41Ad7unkvCE7gKKZPovAuCBPt63E", "Balance": "1887787925", "Flags": 0, "OwnerCount": 173, "Sequence": 66718336 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "05F797E1AE186521677B7EEE9565D46D7A40D059400525C462ED927E052BDDA9", "PreviousFields": { "Balance": "1437787926", "OwnerCount": 174 }, "PreviousTxnID": "79719E23F698151223E80320072519233A577400C7FE1FD7C386185725491700", "PreviousTxnLgrSeq": 69063461 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLPotHoaZNMvAKnTE1xUaVYsHVKKf3SzYY", "Balance": "365922312", "Flags": 0, "OwnerCount": 137, "Sequence": 67243913 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "05FF0BFF016291E09E91C0272F17FD9A100CE1E4749D3E70BD95BD72A568D686", "PreviousFields": { "OwnerCount": 138 }, "PreviousTxnID": "0F73B6285F101ADF1B1432E9367E2B1563E1BA7D1416332F2BE50F70F34A10B9", "PreviousTxnLgrSeq": 69064131 } }, { "DeletedNode": { "FinalFields": { "Account": "rJDQRE86NN3S8bhRYMZK2cWwdGd7nV7zBc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232B168AA1B000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "9356CBBC76566624BD9844108E6DF2E30DD1BEDF1BC33D618B813E81AF5ABF60", "PreviousTxnLgrSeq": 68895883, "Sequence": 66611015, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20800000000" }, "TakerPays": "205899200" }, "LedgerEntryType": "Offer", "LedgerIndex": "060604DDCC0CEE0C066A93DA6FE91BC1A8C52636019508AB859843F955417B21" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHm3si5FLgHjXC7E2qXKwNDGAe5khVpEHg", "value": "9999999997869990e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "d95" }, "LedgerEntryType": "RippleState", "LedgerIndex": "06545DDF09591B8D61FAAC323A8F2F311AD170C7282F1655EE183EB309366BE0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-3810005946327354e-4" } }, "PreviousTxnID": "FAF23A42CD9C1CE08E15BBF038562D5A5DA63588B8EE2FC239E6B74CDB1E59C2", "PreviousTxnLgrSeq": 68986599 } }, { "DeletedNode": { "FinalFields": { "Account": "r4KVUoogBDoZS9NZAzs37JTgpCoCwbBsSk", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EEBE0B13C1E42", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "42822FCE90C09031A72BC58A0766291F50054C36520944B346438330E094A487", "PreviousTxnLgrSeq": 69021443, "Sequence": 67522998, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "06C4115D1E2CEE7286A9250880B222F309903FF56143D6A1031C0D0CCE5A1287", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6260118880.087294" }, "TakerPays": "26292499" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "dc1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnYbiXaSpChddFy4fdVYDtNscUsAfgaA4U", "value": "9999999997999991e-1" }, "LowNode": "7" }, "LedgerEntryType": "RippleState", "LedgerIndex": "06E35F4AF7443BD801EDA95AB9048E0D07A838BD6E331D45C2970A63254414F9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1011664832151627e-4" } }, "PreviousTxnID": "6F83979B27E767F89398AA84A42DD65591544601710E54C679988BA2F76C1DE7", "PreviousTxnLgrSeq": 69012452 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2043332912584925e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rK4qafqqEtLjM1CRfcgY1H8Z4zGTRATkaV", "value": "1000000000000000" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "42e" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0770AD962247116CCF816D25AD57D843EF82A73AAE0DF7D40941A2FC5C22B364", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2790023345216944e-4" } }, "PreviousTxnID": "E3A646DF5C5EFBF528B56CA795B6DE564D0D7D3B275BE2EF91BB51A5E1B80559", "PreviousTxnLgrSeq": 68995486 } }, { "DeletedNode": { "FinalFields": { "Account": "r4zXDbBBSbrguDq5pTzabnMgXY7n5qg2jb", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C3793747E980", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "B68CCBBC73BA8627F5E584D57F097FBBD4ACD6D91721D89828B29F9DB737F546", "PreviousTxnLgrSeq": 68866269, "Sequence": 67256127, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "499999999" }, "LedgerEntryType": "Offer", "LedgerIndex": "07ADB65E04854ABAF91EF1070D4FF9E902B6DCBDF107BC0D234938E5C8760336" } }, { "ModifiedNode": { "FinalFields": { "Account": "rNRaTAdpRUh1YNTBdCu6JXdQZX2pfWo3FU", "Balance": "429999988", "Flags": 0, "OwnerCount": 208, "Sequence": 66712733 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "07B9188EC9EF02AABDA7CB272CE1A5D3A9C2C78DB38182FB7B063CD458DE5BA8", "PreviousFields": { "OwnerCount": 209 }, "PreviousTxnID": "E6ABB4E9719BAE6798412E129D66785349CF556021A9FD4B2E81894CE691FD94", "PreviousTxnLgrSeq": 69063864 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "81c", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsqgHRLHgg1vHi8iA1w1J9amuuUAjwEzwa", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "07C5F6D8EB254F6C4F45852F34DDE407CF288298F8C2015A112F0D849F16BEF7", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "47796284510.95766" } }, "PreviousTxnID": "0461B14818F69CE7E6AA20F32811FC8F65418EA1A3B951E7331BCE052367B5B6", "PreviousTxnLgrSeq": 68996570 } }, { "ModifiedNode": { "FinalFields": { "Account": "rasT449dxdmpB7Ak1GqwE9TdrkZEty1tAZ", "Balance": "236235600", "Flags": 0, "OwnerCount": 43, "Sequence": 67132390 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "07E36661C9E5E7A49D46D1CE960E81C4712C4D5D8B72371368523F514A92E1F6", "PreviousFields": { "Balance": "146235600", "OwnerCount": 44 }, "PreviousTxnID": "E814FB70400DF52B7414A35635BD6AA6F0F156E59A2A53B6473A270F8A4AF227", "PreviousTxnLgrSeq": 69062135 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEEmAELYEW2kQQRJEXhN9qJnzZmUnLxhJd", "value": "9999610698104576e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ecc" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0849A787ACABD9596381F4E58F8855D0106342E5F0AB0A47D172E3892DF8E346", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-618459800.4693254" } }, "PreviousTxnID": "FA133884EA54D2C86F9B08A23AD2D8ACD0AA433199C6A57E5EF9C230B0AFBF17", "PreviousTxnLgrSeq": 68954948 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rGPEKNaNPYojt4sFbUzodh9SUNxixCwoBC", "RootIndex": "0A7B4230B73036EFF114716FB5A99349311B598F3A1D8DBFB3455D664C319E35" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "085B6B3762B3D8CFE9E5FD961DA1E280D7FCE335EB67A6E98EA122647C746D0F" } }, { "ModifiedNode": { "FinalFields": { "Account": "r4oX1kuULiPWPRA2hwV1R7K8kB9gUxqTtv", "Balance": "685639081", "Flags": 0, "OwnerCount": 81, "Sequence": 64613025 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "086162970C6670AA30C4F446F7134E3BD99D294CC4A0EC4694BE25A2E053B9F9", "PreviousFields": { "Balance": "180121665", "OwnerCount": 82 }, "PreviousTxnID": "9FF69C6F7DF53B4D6BDE71AA2D71E10F6E590BC70C04B71130274D8B1CC249AE", "PreviousTxnLgrSeq": 69046704 } }, { "DeletedNode": { "FinalFields": { "Account": "rPWjueM7txwURGpJDWF9yQRn8cVmWQTDnE", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3886F4085D", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "3702EAEE8722808C4FE4EDCB7A88E0CE9B268C6D1F3653C38178A34266A822E5", "PreviousTxnLgrSeq": 68996477, "Sequence": 66692551, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "088605C405BBFE2518FD8023B6B222A92D975F5EA899C8FBAFDB6092624609B5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "14389666508.9877" }, "TakerPays": "79143165" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "45539951262.589" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "aa", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsPnG9Kmz7rf9fXRZ7zrVb8tmmjUkUEpin", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "088765D8BD49D0EAA2A5E082020DD2843BA2DA0E2DF560F847C5A4BD4DACC9FC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5455399512625890e-4" } }, "PreviousTxnID": "E514E794F914C281237FEE472458044DBFDA488AE1DF6C7E0090A0A234B0BFA9", "PreviousTxnLgrSeq": 69043806 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rhPNtVD6tfZTrxvebJaquV8Bh5F2Kh8cMa", "RootIndex": "0B60DE2E48A1708F4C15A73749EFF15C4C28985B9E40B3BF68788C9B99482700" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0898F40C211A0DF4CF117F39F66F4E047736A27E242F3B21330717284C60AB0C" } }, { "ModifiedNode": { "FinalFields": { "Account": "rMGX6LAGxRUHd4g3yW1ukFhThgiCxMioX3", "Balance": "5237123400", "Flags": 0, "OwnerCount": 8, "Sequence": 68628061 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "089A31D49D110B3E29249F3A8325F348A438D7F0E9D5C9F79925A1D6A7B58F3A", "PreviousFields": { "Balance": "5160423112", "OwnerCount": 11 }, "PreviousTxnID": "CBD7C383A87922FC550E1170366F06A777BC7418CAEABDAEB07AD1F61183B2A8", "PreviousTxnLgrSeq": 69064080 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4KVUoogBDoZS9NZAzs37JTgpCoCwbBsSk", "value": "9999999999999990e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "d26" }, "LedgerEntryType": "RippleState", "LedgerIndex": "08BAD6CC14D75C6DE894722B2F73554AFC750857A9E71959F40A4F68632EC60C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-6260118880.087294" } }, "PreviousTxnID": "06C9F9F8E665D842CF62A17BD8CD61635AEA73F2FBAE9A00CAE8B7C42C0CC5BC", "PreviousTxnLgrSeq": 68972723 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2500000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c45", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsMSXmszPAgaY8sipuVq6gfdgUX3zpX6am", "value": "9999999999999998e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "08C19668824E55DED2D964AFFC4AFFE220B91678EEEF9B227350EA0022AC6368", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5000000000" } }, "PreviousTxnID": "5A897BC35CB11AFA4FAC976724C40DB8A4E287FAC8031D1AEEA734E2058811DA", "PreviousTxnLgrSeq": 68898843 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rQ34CimjrmwQA4bz3qCwGRHPFuo8rbnVWv", "RootIndex": "99E0D97ACF35178150CB8B5011E8302219906DD2E63DEEA9A2C16000E46487FF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "08CE6692E28A74E71C9265646405DA861158BC1F9BCE15B97EF8961120468EE3" } }, { "DeletedNode": { "FinalFields": { "Account": "rG7WNJTTMRQma1eeWs5CDv8LwsLb3QQhvv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520859500338E000", "BookNode": "0", "Flags": 0, "OwnerNode": "5", "PreviousTxnID": "96CC5711C8BE6E83BD64C97012A3975A20A1E3AD68837A386F3D16A1D2A0713A", "PreviousTxnLgrSeq": 69031182, "Sequence": 65803309, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9999999991692810e-4" }, "TakerPays": "2349999998" }, "LedgerEntryType": "Offer", "LedgerIndex": "08D44D52140ECDAB2B3BF20DA77E94D22C0F597F02019DFF254C3D97F1B1868A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-3" }, "TakerPays": "2350000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rwJECKX27rvudR1C4R2QCUZwatR9zkC4u5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A388A1CDAC6", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "84394D8AD0A35A590E668D403CAEC881D63EB792818BE213A29C5F05B8B2B358", "PreviousTxnLgrSeq": 68933538, "Sequence": 67403543, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "08E29D249E7804C0FAB6A23ECE393422F61229320A538CA8F5C042A4528F6E42", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "33124787288.07941" }, "TakerPays": "182186330" } } }, { "DeletedNode": { "FinalFields": { "Account": "rHHviosMrm1hi4Nfm7MTipMw2oeEQRTeod", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652166CBB05D13878", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "23F68E50B6B1454D339F07D380D0CF5230006325E0204647BEC7E1C7F0552B94", "PreviousTxnLgrSeq": 68938628, "Sequence": 65851879, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "09059CBD69443B2FED5FC23DDAA5E3C15CC778F924ECB63FAA82C1C2350B7CAC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4077859898660000e-4" }, "TakerPays": "2573945168" } } }, { "DeletedNode": { "FinalFields": { "Account": "rhPNtVD6tfZTrxvebJaquV8Bh5F2Kh8cMa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D7F2B9D42A180", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "BE0EF09F638259CD6AC16061DEAAC5B5BEE925A818F1D01F63F3057F05BC6CF1", "PreviousTxnLgrSeq": 68997647, "Sequence": 67342402, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "093D20C90C619E61B66DB787D5538BBF429D074EF472DDF278FC3016803FFDE4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7982434333.333333" }, "TakerPays": "30325268" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rnpQiciqw8RGKo3NmqAuyZXScNoCNmQSL6", "Balance": "573080990", "Flags": 0, "OwnerCount": 197, "Sequence": 67428331 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0948D017351A93E2C416843731315D8735CAAC55F3D1CE60AB078D54CCC38F77", "PreviousFields": { "Balance": "472310755", "OwnerCount": 198 }, "PreviousTxnID": "5E94051DCA99D4C07282BD9243952C2F2D1AF703EC443D14971B81AF749583A3", "PreviousTxnLgrSeq": 69063803 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2457679721703980e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "f02", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rB4BbxNJ7Hv7i63EwPcEZjuP8YHizdkkvd", "value": "9999610698224570e-1" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "09645B41876ECECDD8530FE462EB20DB2C28E1907AA458331CF1BB8E3DA300C0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2500000000000001e-4" } }, "PreviousTxnID": "CAE8836EA5152715C60B986F3D9EB5C9339D7F4D5DA7A623E5177F24A985CAF6", "PreviousTxnLgrSeq": 69012697 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rKVDELWvNMyoxDQenRjpToSvsLL7RwR62h", "RootIndex": "098529106860F2477DEEF3A958AD9574F2FFB199F28F5900CBE6FE74E14EB1C8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "098529106860F2477DEEF3A958AD9574F2FFB199F28F5900CBE6FE74E14EB1C8" } }, { "DeletedNode": { "FinalFields": { "Account": "rNARwAxVp9C26pcBpRbFHdw6P5Sxa4q7kr", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CADF102B", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "0538C6D836F7BDB2A1ECD52D6D522A7256AC533C4470CD41D441EA2596BF4E7E", "PreviousTxnLgrSeq": 68144901, "Sequence": 67347422, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "38929949330" }, "TakerPays": "3503695439" }, "LedgerEntryType": "Offer", "LedgerIndex": "0A0EBEA9928DF446DED01525A8EBC7A8F97D303B0547B6E890E09B77401ED38A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rxAPteBXbVsr6qvwqA54qERcdkojkjdmC", "RootIndex": "1D90936DA6D5312BF75287D86424C97917F363D2A6D98EBCA9C497F7F4E28FD0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0A3031248606AAD28CC125FFD1366576C1BD901A86421CB8E90CF13F000A4644" } }, { "DeletedNode": { "FinalFields": { "Account": "rNH6NhWEAVCRPrcDv9NYJdPKv4YTHn1EgA", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD498D0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "6E8FDF7AB33BB162EBF723C7E2B5849A3ABBF8F22681E4E85320CE50A0B0B646", "PreviousTxnLgrSeq": 68892118, "Sequence": 67414031, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0A73294726372FC4B278763E56E488DA9B963D76F305E636163383D1C451C377", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "200000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rfTkTBbkD6NFaNLprSDfnC3CJEtNwgqYwy", "Balance": "220764794", "Flags": 0, "OwnerCount": 17, "Sequence": 68037582 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0AB465ED0BDD02A086A9212D6D37C1BF9F126887773D6F55E502A89ECC94E139", "PreviousFields": { "Balance": "63295204", "OwnerCount": 18 }, "PreviousTxnID": "5480B4E780BDF258CE1EEA7F76AF0ADA97DAC1DB2329F6F6AD5218EB122B3C48", "PreviousTxnLgrSeq": 68998157 } }, { "ModifiedNode": { "FinalFields": { "Account": "rPG9SrHPEhwbExniY48qKCqDqjGKyVn38w", "Balance": "524713186", "Flags": 0, "OwnerCount": 108, "Sequence": 67109685 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0AF2AD5BB6F7BF9C45954F271C39C1B9BB19AF743A68B026C476C1EF71282A55", "PreviousFields": { "Balance": "410713186", "OwnerCount": 110 }, "PreviousTxnID": "45727D4C1DE83C7514B36956AF9C54FFF021EB12BA09B3AF983BF5B8645FB687", "PreviousTxnLgrSeq": 69063341 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "r3PYAn9d1DTFzJ9kuvFnhudgwsVZ6pm5hT", "RootIndex": "70A7D0633F66003A7C5CE50C1518BE549AE989C02017F5E58E4B87BA013871FF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0AFEA2B431D9F703D246A4FAF6FA41A3385BF8891C00115DE97F99551D3AB71A" } }, { "DeletedNode": { "FinalFields": { "Account": "rBVRpQjDpGqLs588dtthtZhrPJCcM4w3TS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "6A16C2849207B085ED095ADE5CADD3B38EA12DC1EFCD88A32BCDA38A5704B49E", "PreviousTxnLgrSeq": 68514589, "Sequence": 65828898, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0B02058CAF31E6CED3EDD3F0D53ECCD77FC82B4F478961203A66904C1E3D5CA8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "1000000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEXcziBZ9tEnmNVrcdbQATJPr8JRHuRrZV", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "afd" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0B09848DAF8247C956A6919F7D8FD1EE5CC7DC4935C9C3FBB5906430F93F4F77", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-50006701881.61506" } }, "PreviousTxnID": "BA207EEF041D076096D2B9C30DBF16003030B8DFF1A556FA60756E3163B81BF9", "PreviousTxnLgrSeq": 68922331 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e9c", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rhhokxTQGXV3zHGWJqy1SiJ19yYTSFeGHU", "value": "9999610698224571e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0B0A027079E5821B58E5D520AB0088A160BEBC7145E39FF00DCF7B69921BF543", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1015239468014499e-4" } }, "PreviousTxnID": "1EDC50243B49430385F8582632C2FA20EAFD1973B3C52BD97DEF737F606D4D36", "PreviousTxnLgrSeq": 68982497 } }, { "DeletedNode": { "FinalFields": { "Account": "rfKEwoau3VsYDkabUXs7KbivzJXUE1iw9W", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAF5ED5C", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "B01A07417D543A8FCB7E0CCAE6720BB8C122CB04A293B704D2776640E5B030A2", "PreviousTxnLgrSeq": 68161076, "Sequence": 67016663, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "93431878392" }, "TakerPays": "8408869055" }, "LedgerEntryType": "Offer", "LedgerIndex": "0B0E60C2CC7BEAE7D13CBC3C0AEF78AA1446E060281DE037C5EA2CF93129ED78" } }, { "ModifiedNode": { "FinalFields": { "Account": "r87fNs5eU59kPhMXgYHVziF6Q5icW4WHW", "Balance": "425313969", "Flags": 0, "OwnerCount": 9, "Sequence": 67324759 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0B10B5C9C286987A47C91D602E938044E097B49D1E6DE93EF27DAE6AF4ABB0C3", "PreviousFields": { "Balance": "33557972", "OwnerCount": 10 }, "PreviousTxnID": "65ADBDBA3F406C3F3AB3B90BE7D04743651B301E88FBDF9E26F69C704B889777", "PreviousTxnLgrSeq": 69024131 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "6", "Owner": "rnW1sfCjjdMou7RKC2PquXVchHYBMAHqTD", "RootIndex": "F4D58E4AC9BEE4659315F7B51B12A1A5C579AB918B9F4FD5C9208E1E77094192" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0B2B72D8D0683C4BD8697F8723D3BA5B5A62E73141B5DA94C908B54EB37B0A23" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rUZdJF5FhJJwrdjrcJ8vjfo7NySmeGRxxa", "RootIndex": "365830CC27852B3EDDEF0EF6B6EA81A3C5A6C893721A234F383112B0AE0F17E0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0B2F2FE329BFE0EAADC028251E795950BAB9337FA76B02A3E21B66BDB5C4D7B9" } }, { "DeletedNode": { "FinalFields": { "Account": "rP7b2urRNSZ6dfigtcEaChxF14R3kK8djd", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "F9DFE7ADD6A7556FC918C77B2DCCEF80BCE1EB5B726194B54825C405A36EC0B7", "PreviousTxnLgrSeq": 68998127, "Sequence": 67293302, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0B5C9522E506405EA399C4EB0A2921EE698D3C7EDD07E763382B8B2F32EF054E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "50000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rp6kmTUHj7Q6CeSZDrqNLRbtvhdbb6N5gY", "Balance": "771519915", "Flags": 0, "OwnerCount": 182, "Sequence": 66759051 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0B62334DF34CF3F7E3B8EF904C2302BE5AE16D5E98623AEECA9F6C984687A657", "PreviousFields": { "Balance": "701446007", "OwnerCount": 183 }, "PreviousTxnID": "58D73569984B250C493BE6205EC66782B08CE8647EF077E3FC1A69D940B93A6E", "PreviousTxnLgrSeq": 68936265 } }, { "DeletedNode": { "FinalFields": { "Account": "rDvF12VVLg8CD36Ba9U4HUB5q7AWai6BFi", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C1448303C8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "DAA18512DA2AC2AF9B2BEED65B557F84062200A413AD686025BD78442E93F3B0", "PreviousTxnLgrSeq": 68998105, "Sequence": 64347056, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0B8901DAB4039F91F9BA7B893AC549845584C4F852776DDEB9F4EEA2345E3DB0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "68000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGJ5He1dXx78w8pGB7zHH9K7dWd9pF8p39", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C844EB2F", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "B81960D4344588A3E01316BD1260B23D404188604909D8898194F4647322CD00", "PreviousTxnLgrSeq": 68909523, "Sequence": 67090006, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0B9013E68A5A44B94F6BD5D2860AD351EFA139C4E7E41EFC3666CD590C0AD7F0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "22000000000" }, "TakerPays": "197999999" } } }, { "DeletedNode": { "FinalFields": { "Account": "rzNhpkxVUc86h9CJyB1qssHYenzkVpyn7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3887C7F795", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "C5E34D918DBFF25B319E175A8703F05F6B5011E787DE9671EB03EE8C052BCF6F", "PreviousTxnLgrSeq": 68923195, "Sequence": 66818368, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0BACA51604C5743D97ECB7D2E174FAC34E600BA4E899C527B6A1704481CC531F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "24000000000" }, "TakerPays": "131999999" } } }, { "DeletedNode": { "FinalFields": { "Account": "rLkhJhEaChEegzryMAeps63ghhG1yXzifL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E57D4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "59F0DD3529DC21E12B65C960E06E0C2DB32A687709E5918967F17E6B5BA09F27", "PreviousTxnLgrSeq": 68988965, "Sequence": 67425992, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0BCFE9EC95F19626E0C0044E821F3AD3321DADEDD1487A93F64EB4843488B31A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9600000000000000e-4" }, "TakerPays": "4320000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-18463481609.31418" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKycDDwvkpARRr8dccx6mTKBBr6W1GkGjK", "value": "9999999997999991e-1" }, "HighNode": "4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "dda" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0BDA359D8F6D01D138DB7F9ACB752C4AE1CA1724D754D3D4A59919A8CA489B33", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20463481609.31418" } }, "PreviousTxnID": "285A4D9BE05169EBC350AB7A76635F868BECE13CB1DEA056C8F0691567A4043B", "PreviousTxnLgrSeq": 68891367 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "11", "IndexPrevious": "f", "Owner": "raWLEhWafGEFDsN2GWTFcmPc79x11j92as", "RootIndex": "0A617EA9C3725EDF8F1573A7CEF6E69965E819FA6958D3917B1BDD3446776F86" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0BF7E25E37DF191538AA372D37D14BA1DC57B3D53048CF8C7A2E7386183D7F47" } }, { "DeletedNode": { "FinalFields": { "Account": "rLzgqyEetWAoARj7XcpWExwpRCvYq5zHi6", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C3E7B96C68CD0", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "1892045AC074A7F94CDF995C21F3DD7359E33AC5B48178E811AAC8645FEB5805", "PreviousTxnLgrSeq": 68905441, "Sequence": 67630695, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0C55BA078508B73B4D64052C454F2A2EFA76708ECC43D56413239F538132D264", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5269682218.30986" }, "TakerPays": "41893973" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rUdhzvzWjHpSjP6CGksiit3bdgGLV5DXZv", "RootIndex": "6BF0BB998DBA1FA0A7D6C033B316942EC850FB722B036E378025C55A28005D68" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0C882F7FAA548E552B8A498251F279B9E64FF4D07DF71EA4183000FCB839C668" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rJDQRE86NN3S8bhRYMZK2cWwdGd7nV7zBc", "RootIndex": "FB7896378C203DC3BD6B620F2132E483089DCE642AF0B26FF48923D8E5E2DE2A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0CA0ECA9EC13061CE28DE2321F8DBF38FD1AEE29C569C3972E237E37AC727738" } }, { "DeletedNode": { "FinalFields": { "Account": "rpBHrwSGdQm3hE3f6988mSgV9LAzuBsx9A", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217FB16D3ACD435", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "7BCB87CAEEAC89B70418EE19667BA5586318ECF12544953DC732C88A0A0A08FA", "PreviousTxnLgrSeq": 68905151, "Sequence": 67835800, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "52555431" }, "LedgerEntryType": "Offer", "LedgerIndex": "0D03E2A77E98FEAE389845DD0DD76F4E07C0CFFFC17809B98C1FA6A1DAF1591D" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBefpcbGP1mhJhuLmYSbPSj4oDTufciZDH", "RootIndex": "0D059FDC9B2A3B06C882735F946E349B9E2664EE68A9C1098EF62A54773B1A1D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0D059FDC9B2A3B06C882735F946E349B9E2664EE68A9C1098EF62A54773B1A1D" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rHQELpjMXco8drUJVmfUq89kCZbDdWBr3A", "RootIndex": "19927BFC4E7AFAAAA6E903D6B4B83BCF8B4D85295EDD551BF6892F9CAD1BC9C4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0D346EF431E0ECC8199BDE89A929E0F40B8695563E583B4FA696F0F67634A97C" } }, { "ModifiedNode": { "FinalFields": { "Account": "rh1bgyeVNDBauF3vXuASW2L8MWrdq8XYko", "Balance": "257232732", "Flags": 0, "OwnerCount": 5, "Sequence": 67364436 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0D4E9FBF050C963720231D008A4AFEC87A657B152A911466702945A7D514AF4A", "PreviousFields": { "Balance": "23999985", "OwnerCount": 7 }, "PreviousTxnID": "63FCEAB46FADE9B9B92DE43A738D14DDB5064FDB48A9F3D1A62A0857E0C76D03", "PreviousTxnLgrSeq": 68994748 } }, { "DeletedNode": { "FinalFields": { "Account": "r3Tj4vpfRp2r95SM97TwEFGCUZayDqKM4h", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD4969AA80", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "267EDE06C3726A9074F2768CFA0243974E2571A0A28BAD6C5D09F4771C3E3209", "PreviousTxnLgrSeq": 68284059, "Sequence": 66932170, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "17864125470.68351" }, "TakerPays": "357282509" }, "LedgerEntryType": "Offer", "LedgerIndex": "0D9F4F8B845CD085C18F9D70062FAF69CEC300F37CB977149DFEAE745DCCC26B" } }, { "DeletedNode": { "FinalFields": { "Account": "raf2m8Ki2PVqjTU3YsKK5R62dAhiYXepcz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D3D0C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "F6E4AFD96A07B43B10DE403418DA3762FB8A49FE3901505C962C667AFEC227B9", "PreviousTxnLgrSeq": 68905425, "Sequence": 66240304, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0DB65BCFB15C81C88BFD1C36D7111865F1E6A61E67638598CA8E63C6840E7E4E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "50000000000" }, "TakerPays": "375000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGKv1gHL1ANheQZ4GMCikKaGYoKJC6o6wG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3886E8497E", "BookNode": "0", "Flags": 0, "OwnerNode": "21", "PreviousTxnID": "EAD98C88E86D64960D11B5E1DEA7209385A55227F0FCB5D2F6855AC378D969CA", "PreviousTxnLgrSeq": 69011830, "Sequence": 66128550, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "164344590.35237" }, "TakerPays": "903895" }, "LedgerEntryType": "Offer", "LedgerIndex": "0DD7B91A93DBF93C8B8558B718259A4E7353DDAE95B867931E9C4B4887716F0A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12681332857.14286" }, "TakerPays": "69747330" } } }, { "DeletedNode": { "FinalFields": { "Account": "rELkNgURGeR4vEFUEYHNATaS9pwPk4KFEm", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CB5D0DC89D26", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "8964903F1BEC29C70CC69F98AC7AF17494DBAB82B5B407E61BBBEA3AA26CEC61", "PreviousTxnLgrSeq": 68928432, "Sequence": 66617430, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0DFD43A3E0DEAACF7688EEF4C05197629378EE118168687386C673B7BB8B94A7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "54338423" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rLCRC3mUAkWe4R8EwjZ43BGQs7hmpdGrbE", "Balance": "1288521542", "Flags": 0, "OwnerCount": 181, "Sequence": 66153728 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0E143780D5F448EE55221E92E1072BAA723701DD3E9A370F0C872B1228DE4641", "PreviousFields": { "Balance": "1079867036", "OwnerCount": 182 }, "PreviousTxnID": "F247AB87C15B6965C82BE72F41B0D5C70CF421ECD24A0AB323D69DD36635F846", "PreviousTxnLgrSeq": 69055899 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGEVM6YhWfikBZiXgWRdcUk7XpAyAnUHZw", "Balance": "199659720", "Flags": 0, "OwnerCount": 53, "Sequence": 67349511 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0E14AE95469D581F5D172E7D75FFF69AF36585433AFBD268B59CB70835ED1737", "PreviousFields": { "Balance": "162559531", "OwnerCount": 54 }, "PreviousTxnID": "BBFF713B732025905959E4CCE6C7ABE523FF73EA63D84F349B0666DEED69DFEB", "PreviousTxnLgrSeq": 69059223 } }, { "DeletedNode": { "FinalFields": { "Account": "rKBxw9iprFx2LgVfPdthKb6oWUYBLVm4Jw", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530E35FA931A0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "32FF861B5E2CFD8C6CDD7D9B7B4E3AF20B973DBF072186E9A4BD7C62A4F75B86", "PreviousTxnLgrSeq": 68790612, "Sequence": 63654623, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989900" }, "TakerPays": "311439596" }, "LedgerEntryType": "Offer", "LedgerIndex": "0E29FB800EE70EB241DBCB7D91DF87AB72080F86194DAD586D729ACA3E104456" } }, { "ModifiedNode": { "FinalFields": { "Account": "rUXKKLv8kzkXLnNpe2aGq2PyRKuotFQEPi", "Balance": "1359935997", "Flags": 0, "OwnerCount": 374, "Sequence": 67508596 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0E4627D9EB53ED5F446085EFBF0B445FD6BBAC1EC6F0BAD9A00AB2660D9B8F7A", "PreviousFields": { "Balance": "1294935997", "OwnerCount": 375 }, "PreviousTxnID": "6FB8F72491A27CA265E545651231856462CF5700CD7FCC9BE40D1229A2D04051", "PreviousTxnLgrSeq": 69064164 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1135179899765819e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNqG1shTsAyEcTFcAeBxGsLpmaNAGbcESv", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "31f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0E66B7D169343C5ECBEA4BF784DA5024F55D7481563150B451EB64B068D59CBC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1490909697085819e-4" } }, "PreviousTxnID": "2075D1A611EE60F8B9310F6E14C38225A758492427BC06028D3CDD72C22C78C0", "PreviousTxnLgrSeq": 68827994 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10127307826.78187" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rQHveZ6yCKwNSGRiu4QnTSjJbLRfgBr72p", "value": "1000000000000000e-4" }, "HighNode": "b", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ddf" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0E676D1155E87CEF42CF68CBD09B70EFC9BCEA608F3075549D94BB2C2726DFF5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-60127307826.78187" } }, "PreviousTxnID": "D924B30E1F2867649649D4B12134C5089862C0260EF95853081A40C8982DA859", "PreviousTxnLgrSeq": 68986376 } }, { "DeletedNode": { "FinalFields": { "Account": "rnhFkVQVhLHoMBNc5aUNk5fRvZfXmt16nz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652221125046F5A60", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "8AF0B05D8F4675B47DE0F99056DCD8599DF717801FD6B0BD0530B0E0C552F050", "PreviousTxnLgrSeq": 68897067, "Sequence": 66616947, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0E6DD9EB5C53195B6730FB1BC4C5990D41AB47CB7162245D559D6B35B97EE349", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "74659856" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rKzptAtXDpvuPnT8Es2c3Tq8URKvEWYomC", "Balance": "344294036", "Flags": 0, "OwnerCount": 20, "Sequence": 68602201 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0E889FFFFCE2698EA9CF1DC6D8C414BA67E05403D5777DA0D0B449CD6C2F2E04", "PreviousFields": { "Balance": "291997237", "OwnerCount": 21 }, "PreviousTxnID": "4B45BB55CC272469029436A525D3CA48E6C88D7F9B883B676633CAECECDB0447", "PreviousTxnLgrSeq": 69062756 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rLVGNfLJYnQtqJDuNWkpu1yaSBnrrSGPdt", "RootIndex": "40B837F7CA5CFE63E97E19241C37951272F962FC2254B53540BC31F78E4A1DE1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0E8DEBC07E6080CC31E2A2ABD7AE4C60A015FB1141DD1133DF9B1D3563CB8E11" } }, { "DeletedNode": { "FinalFields": { "Account": "r35RUZ6PjS9JT6pHG6298ES1abD9uv43D4", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FB87CFD4C2220", "BookNode": "0", "Flags": 0, "OwnerNode": "1", "PreviousTxnID": "B8B9A796D62C38B669320C6C5D87ECA38EC67221AB78C973FE5195C4874573DD", "PreviousTxnLgrSeq": 69017586, "Sequence": 67194422, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0E8E5B996F4BC9A409ADA93495AE1AEE7DDCA66F35356CA77EAD82F257E0E4C7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6160000127.9529" }, "TakerPays": "55000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rMX68jd5whLXjPmrgvjHYKwZHcbQ3HiYuV", "RootIndex": "F90867ECC4E94006F8B14B621ED8A8D6D0A943EBC822AB9AD16D6506D13B7B3C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0EB4731F5326512473BD010F7F9B495F6813F701B2746E2BAA0B35887D22B257" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "48b", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUZdJF5FhJJwrdjrcJ8vjfo7NySmeGRxxa", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0ED47ADB201CA5BC4C7BD200EA07CF4A09279EF55A0DA900D3C9DFBFACD74717", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7786189866" } }, "PreviousTxnID": "0ED25D91D8DAF3AB358B83FAA55D5BCBB727C52686241E501F6EDEEA5FF98F75", "PreviousTxnLgrSeq": 68057679 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-43831878392" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEoF1AJrncEkjDkmoQNYxvCp49Wyn6RFvc", "value": "1000000000000000e-4" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "7a4" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0ED5F8671BE488656F930607EE27B38B865CA6DDD80AA404858B5FB6E67C0E2B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-93431878392" } }, "PreviousTxnID": "7240CECAFA90526AB38573D46C46414C322C53222E4E025E8D4386F472CB9108", "PreviousTxnLgrSeq": 68991132 } }, { "DeletedNode": { "FinalFields": { "Account": "rBCw1uH84iKcSRVjY8ALzx66Q9ZVNMgYsn", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680DDB897", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "2FB487F1DC0C61DD0C188BEA3233D9663E994ADBFA7D3E71542957B9E21BB051", "PreviousTxnLgrSeq": 68899016, "Sequence": 67605377, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0EE6FFC2156188E81A951CA7E39451C8059FC6BC3D53FB138BD0580B82997DF6", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10899881300.38661" }, "TakerPays": "76299169" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r9dgnNCff83iCn4xXUpnLndv4tuCY23b4P", "Balance": "106656447", "Flags": 0, "OwnerCount": 25, "Sequence": 67328099 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0EE8D023A5FCE3175E6CD65BBDAB9CAFDBB18E36DB19C5D75B889CCB6DE71E14", "PreviousFields": { "OwnerCount": 26 }, "PreviousTxnID": "8EA2B5CC7EB7530F858C13D989E44EA5C1254CBAEA651C9C36D39EACF7460378", "PreviousTxnLgrSeq": 69045296 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJ5v25nqLv1P2Fij67kW1QE6iWqthP89v9", "value": "9999999999999993e-1" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "114" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0EEB0F8A737E279D51EF3C885933147FF8D3E81531DF35316487053C1A913833", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "386D6167D9F75E5D05281872A9A60A62F2330BD8CB1636254349E8F2C8A5B59C", "PreviousTxnLgrSeq": 67949125 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "d55", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raZJeAMN8WHNBRrVCc5RXYfD7mAuKctiwE", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0EF1FC188A3CDEC4CD92B1BF77BCA0C1C3AB8AF5891C796BBE10AE76E4AA5BC0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989900" } }, "PreviousTxnID": "D4006962D3344E3734A8FA2D965FC6CE6535331BE6FEB2DB044E263F6F9B438C", "PreviousTxnLgrSeq": 68151683 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2000000000000000e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "f01", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBHSrXq2LzGniUp4zypCRk1isLw1ywLPHv", "value": "9999610698224570e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0EF5991931265280DF9E4016C1EDB156139B4331E390E3F8A8777ACEF0F8461E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1000000000000000e-3" } }, "PreviousTxnID": "A8D3B6427580A92E0650B67F924954F17315D1129F24680F0B9E32D46ADC7CDE", "PreviousTxnLgrSeq": 68986978 } }, { "DeletedNode": { "FinalFields": { "Account": "rPDEk87BWPzJVDg22rmwGBu7gxKdkQrJEc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530B4EE0E7F53A0D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "A17AB2E93C15843C7EBC764920F5EEB478092EC6DF6B1C99C4F927C9AAAEA84B", "PreviousTxnLgrSeq": 69026131, "Sequence": 67489221, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0F06FDB75F370FA2427DF39915AE11DE66E2C13FCD07B4B1533CFB19EB1A9886", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989864.472159" }, "TakerPays": "247824368" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "cca", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rhft58oDqDyMaUZZCKeBgEY4ewRC5HSpqM", "value": "9999999999999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0F0F4B44ECC90B2854955FFD2C471B37BF0A85645E73BE7AB0070631F876CC86", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "486618005.0343238" } }, "PreviousTxnID": "8AD6B46103F388F2689406E08CEA22A9CC5EFB59ED714C87219DCB4933E074D2", "PreviousTxnLgrSeq": 69039753 } }, { "ModifiedNode": { "FinalFields": { "Account": "r36sopaDwMDWZS4XNkCM27TNVkdywisWY4", "Balance": "1629629918", "Flags": 0, "OwnerCount": 34, "Sequence": 66335316 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0F12F22F7FCF6310A964D2A43DA5FAB469BFC885EA30AE21C05765CD79AA6A3B", "PreviousFields": { "Balance": "943606351", "OwnerCount": 35 }, "PreviousTxnID": "9C64BBFCA78A5EAF306194C5C43E85C9F4459C3484FF102CC7275737B40EBC84", "PreviousTxnLgrSeq": 69058542 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e92", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r98DGNQEGR9x2bhRVBbuiHAqxq2aDD6pKa", "value": "9999610698224583e-1" }, "LowNode": "8" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0F19FCBBDB3FD111921096408C88DFF7DDF07D2EA0E4541819244A9CD909D8A2", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1986476167812287e-3" } }, "PreviousTxnID": "D8D8C8F1CD9E76A5EAB4B578595C12BCAEA1D67BDD96D2BA1CBC4D0274789BFE", "PreviousTxnLgrSeq": 69034931 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBCcUJicoai17VVsbUKJ7BGqDa7dQ3549N", "RootIndex": "BDEB39D086D51554471B3E2764C150ABC20AA61529B3EA7DD7151802DBF2F57B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0F2CF2E772CD501A6A601C9C0C2996166CC2F7382AD14777AD73D6F18917134C" } }, { "DeletedNode": { "FinalFields": { "Account": "rUN6cc1UZw3jJRFAQpzYZdwA75aKR6qJE1", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365303B1DFDE1A28C3", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "3E9A6BB5BB8BCAD4F1203E6E61EEA9999AB43A0BFF7782961AB16FBC92F61724", "PreviousTxnLgrSeq": 68293464, "Sequence": 66466047, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0F346D02791B41B87DF42F622BF5F71EEF9E738FA7E247477A83A34D9101AB91", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "80974294" } } }, { "DeletedNode": { "FinalFields": { "Account": "rf7hbrdWs2saBvmLubvuzHJuDhDwJf2Fuf", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26FB3EF51", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "35B5E35A7819A783F9A88DEE0C4E60C5F7EC042C031713E1F1A7D6199E0C2765", "PreviousTxnLgrSeq": 68155315, "Sequence": 67205568, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "0F46655E16B9ACA262A9F2A766BCFCEDC7462511BF92A4E63F6EAC018109F57D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1167898480100000e-4" }, "TakerPays": "1167898480" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rHHviosMrm1hi4Nfm7MTipMw2oeEQRTeod", "Balance": "6105018044", "Flags": 0, "OwnerCount": 273, "Sequence": 65851923 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0F5639D5F49AAE987C5F3255FDA2909D27BAABA043D40AC4B50AFBFE44AD7BDE", "PreviousFields": { "Balance": "1951072877", "OwnerCount": 275 }, "PreviousTxnID": "A6C1BAA0D395F918AEEC8A8ABE3EF95CD9E8B2F67466F5ADC8D9476E29C24435", "PreviousTxnLgrSeq": 69060575 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "7", "Owner": "rp6kmTUHj7Q6CeSZDrqNLRbtvhdbb6N5gY", "RootIndex": "39292EB400C714D8100A8AEE9758AFCA71B691F85DD7D139CEB6E430E211E0F2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0F8E335F3E7F3208641CEA156827EE16846226A58FDB661849F2CEA65476F28A" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4xMZEgWZaocA566U2xgUqKcTnXKZkBLLi", "value": "1000000000000000e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "eea" }, "LedgerEntryType": "RippleState", "LedgerIndex": "0FBA249B1A2C72406A15A83444B5047AAB481945111356C5BDC5B2C298D06646", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30362565818.18181" } }, "PreviousTxnID": "E870A9D7819919F66D784FD021ACCC36792626536EB6BC6277C48AA39A65A484", "PreviousTxnLgrSeq": 69002463 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rB7sr2UvCBewPJXg9My4kjDFWDF9URdRuJ", "RootIndex": "767DC66E41CB93802611E7E7D770E4EC180A94EDEA10B3B2EC7A57BA45616EA7" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0FC80B7C9B21E0E2E715BE051450840601F4A5FAB39E0269B9756AB277F0B64F" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJsM7f8iBRAiXz3bMUaiCsxHujM8UpirwN", "Balance": "74923258", "Flags": 0, "OwnerCount": 31, "Sequence": 67366335 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "0FCEEDF6C3256CC715C2A475A265024323274F41A2F3B38E3E7BD2A817BD16C2", "PreviousFields": { "OwnerCount": 32 }, "PreviousTxnID": "11705204AB37C744F166A2B13BB489C9F36F456A0CF7CA16DE6A1FE509680490", "PreviousTxnLgrSeq": 69053620 } }, { "DeletedNode": { "FinalFields": { "Account": "rGT6ze5CuPEUzsk92YnLLkEqjv6qqhabrF", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652080FA4B992EEEA", "BookNode": "0", "Flags": 0, "OwnerNode": "178", "PreviousTxnID": "A06601DEE13BF3FB02C3B5AE046C9251BEF364786ED5387AA3E3E59D448F084A", "PreviousTxnLgrSeq": 69039469, "Sequence": 82778, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6690171952200000e-4" }, "TakerPays": "1518000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "1021312030FFE4E87C35F02DC0509F8CED0240B942E339F549A85BF4325BC446" } }, { "DeletedNode": { "FinalFields": { "Account": "rEgSssemRh6cSEJYWAyA6Q9uEm6XjBUZ2H", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210A987B567EA45", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "5A60738DBDBADF316EAFFBB45F10F35AB132208230A6EA282EA012244CDF815A", "PreviousTxnLgrSeq": 68965212, "Sequence": 68766419, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1035AD17FC65ACAB5ED7956F7560293505AE5E9346054C33A386AD0714BA6636", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10618837198.62227" }, "TakerPays": "49802346" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "dc9", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfzxSb2zMhKDqCsD81pZt7Bjkvak4NBwFx", "value": "1000000000000000e-1" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "103992BC2FBB7CAEBC8C74D4E7249DB800C9598D7DC2256B6A32AA767378F74F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "62287918928" } }, "PreviousTxnID": "C0E965FB598A3F52031BC85F732A3259470329DD7FB457AC38F58D46EA95FDF0", "PreviousTxnLgrSeq": 68502319 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rLtYxg3QjyCpbY68rJg6XCeecMyCnzBNCt", "RootIndex": "40A2D4A2CCBAB05E3DDF58AAC552EBD526621C9BAE30DA6DE01ABEEC382C71DE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "104F8616DFE4E5235154C9F4070A0825B04F9CA5DA3E9798F985B30C299EC526" } }, { "ModifiedNode": { "FinalFields": { "Account": "rGMM3Ag2DiYP71uk8mWQi8fafCQczx8ouK", "Balance": "2718793284", "Flags": 0, "OwnerCount": 221, "Sequence": 66413285 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "10678F6A32C919DE598661889FEC5BCE90C6F77C0AD61FB00A6826076D9BBDAE", "PreviousFields": { "Balance": "468793284", "OwnerCount": 222 }, "PreviousTxnID": "4DB4B84C22E7808A646C9B49607123398527BF9F0F6C5A02BC6135F88E1FB133", "PreviousTxnLgrSeq": 69046354 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rLVaKJ42tddq3vJAFiPibubt2HbBpTHuX7", "RootIndex": "2FA1CBF832CFCCE5514EDB4DB3E3A6FDFAB22E98B9D0B61CFF72270C49EB45CA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "106B112F283134CA6CB9FF475A3E9F8F758560E2B717BDF7DA757705EA2C62FA" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10786484799" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJeogNqHS69HkL8Le6zZoezAhGwpU4WPsc", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "460" }, "LedgerEntryType": "RippleState", "LedgerIndex": "10B01DB7E7973052A9A1FCB66DCA9924DF268E5C23BCEDF8E24CE84F9EEC7CA3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-17572969598" } }, "PreviousTxnID": "33BB5DEEC2392CCE623157B3071AC108CCC903D1D793339B4CAF8710F840F39D", "PreviousTxnLgrSeq": 69038927 } }, { "ModifiedNode": { "FinalFields": { "Account": "rKKDmfji3MYEAtBZY3AQj8ghcuH1HXYpZC", "Balance": "1125852829", "Flags": 0, "OwnerCount": 126, "Sequence": 67520742 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "10D7600D505178494E305F122B331EE048E924BF2169C57936150F1E4DCC72DC", "PreviousFields": { "Balance": "515295620", "OwnerCount": 127 }, "PreviousTxnID": "3568E719E7F6A7AF74CB41B13ABCCEE1C7F042C42D1E13003ADF79C3E96B93FC", "PreviousTxnLgrSeq": 69063877 } }, { "DeletedNode": { "FinalFields": { "Account": "rsHib22BtXCKbRdrodUNNXdxumiaPqZQVk", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365206F9C1F5BCF5EC", "BookNode": "0", "Expiration": 695702064, "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "E6A6537BA7B409AB7C1162D066057D9CAB61701D331AC4E18F76790CA76B9A79", "PreviousTxnLgrSeq": 69064174, "Sequence": 68089119, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "10FDB2D680ED2864AFBDF3C44F725EC0188524E297DC70A81ED808F9E9DE2691", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "35651326434.5712" }, "TakerPays": "70000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "8", "IndexPrevious": "6", "Owner": "r3Gqpysb37rsJfn8RTCG6bSmigvzYPbWa4", "RootIndex": "9DE42192B8AACB2B9EADF8A440F2B9CAB2AB798C1A7B965CD72656B86616855C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "110702C4B5532DBD17D8DDD7C0C00E860D75D0820E72A927DCD512C1B5F195E7" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rhASEa6rnfc5WHFbd2ZdExhwyfBu27pitp", "RootIndex": "19D5DF592B455BF1953D7B938B39CAAEDFDAF3199C37D3F16F87AB334A25E757" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "11242F8C577D0DC0464DFEFAF00F90B1313440B1182C0BB70A05299000E76CA6" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rGR9AifcxWmhBqTR2JWAPooQsR9kW5yzj6", "RootIndex": "114416FC0F515174B9E33247220FDF44798FCFA284AF80139BE3633ED1CC14E6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "114416FC0F515174B9E33247220FDF44798FCFA284AF80139BE3633ED1CC14E6" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPc9ia41Ad7unkvCE7gKKZPovAuCBPt63E", "value": "1000000000000000" }, "HighNode": "4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "66c" }, "LedgerEntryType": "RippleState", "LedgerIndex": "114AB4CC7577B2A1C3DDAD1D30CD63943FFECA50A004223418F115C43FD6AA1D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1000000000000000e-4" } }, "PreviousTxnID": "6AE5656AD3C1B5CD84101DA3E418DFA383885382B70D7160E12DAA00D0540915", "PreviousTxnLgrSeq": 68986036 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rEEmAELYEW2kQQRJEXhN9qJnzZmUnLxhJd", "RootIndex": "116B5AAC1024735555270D3FF24C05430F63B9921DD273D8BEA2C21E41EA39D6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "116B5AAC1024735555270D3FF24C05430F63B9921DD273D8BEA2C21E41EA39D6" } }, { "ModifiedNode": { "FinalFields": { "Account": "rKbNu1SDc3i5dWHdp3uLxWVn2tsA4ovDJR", "Balance": "2673123460", "Flags": 0, "OwnerCount": 35, "Sequence": 66971941 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "117A222D26942CE0DC871A3DFF1FA606A8317436754736B4E8FF5D75FDCFBFF8", "PreviousFields": { "Balance": "267927406", "OwnerCount": 36 }, "PreviousTxnID": "65B778731ECE0DCA9E70587CD4D5AAD25437906726C2B75075D8E95F0A554AD2", "PreviousTxnLgrSeq": 69063096 } }, { "ModifiedNode": { "FinalFields": { "Account": "rqben5VgPyij1hAY4bi4yPyp3vf6GgY3z", "Balance": "1669477642", "Flags": 0, "OwnerCount": 67, "Sequence": 67935204 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "118178029D713F95DFBA54E2A06E3A12463F400D3AC3AA99A6FCF4477A79A8F9", "PreviousFields": { "Balance": "1460810978", "OwnerCount": 70 }, "PreviousTxnID": "3FD1357E4B5D54B1BEE2C24DB6D6728A2B1D5A998358FDE4963228DC80A7DA99", "PreviousTxnLgrSeq": 69062036 } }, { "DeletedNode": { "FinalFields": { "Account": "r87fNs5eU59kPhMXgYHVziF6Q5icW4WHW", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E548AAF9", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "EBB3357440EBD8A95C42EF2AFA5FEDA8BB732B60E88118E103D706D60D3EA132", "PreviousTxnLgrSeq": 68981113, "Sequence": 67324755, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "118235D090449F04D9DF8285A15F0C8B755DB952EBD9A70CC3612443F3CAD402", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "87056888288.88889" }, "TakerPays": "391755997" } } }, { "DeletedNode": { "FinalFields": { "Account": "rnYbiXaSpChddFy4fdVYDtNscUsAfgaA4U", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "EF6DE9F4B88A7575643E71D591B3485681AA7C24EACFC33EE33044A09D10D511", "PreviousTxnLgrSeq": 68789603, "Sequence": 66933185, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "43833516784.8373" }, "TakerPays": "438335167" }, "LedgerEntryType": "Offer", "LedgerIndex": "1185A25E82E9165CE4749C1C91AC6E8CB68B40F7050930E4F7EFA065E93DE9C3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "45000000000" }, "TakerPays": "450000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rno35bcvBqLMETwksdhSiUuDQquXyoBtem", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218B3B7771F9000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "F701D95160FDD31481B54B786C810CC691A2070A5CEC292212BA747D045EEBCD", "PreviousTxnLgrSeq": 68902685, "Sequence": 66320127, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "119CF790FBB1C2014621B28538FDD96B295D4469163371E34B36A25DBF163111", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "28000000000" }, "TakerPays": "194684000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e20", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9N61ut2QDA3sThiawsRjj3A7gvz4ZGM2L", "value": "9999688558266541e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "11BAF6BC66D8651B93813A18ED2A0702ECC02435B46B07C5056B115E323B6B4C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3033952329.40077" } }, "PreviousTxnID": "5C9CE9B2CFF8F87D5170B5BF46BD8F373FF045D31CC4CC1B02A589533548516A", "PreviousTxnLgrSeq": 68899285 } }, { "DeletedNode": { "FinalFields": { "Account": "rB7sr2UvCBewPJXg9My4kjDFWDF9URdRuJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305E087F66D6352", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "E28F094CAAF2D8E434B0255CAA1E8B9D4A132A9F22A223882C1190D74E0FAC75", "PreviousTxnLgrSeq": 68159677, "Sequence": 67712880, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "128799694" }, "LedgerEntryType": "Offer", "LedgerIndex": "11CD7C806FB47948F92EA3423E43FD68627AA4E57A88F906214C49BAB90E9D5F" } }, { "ModifiedNode": { "FinalFields": { "Account": "rpcz3Nun3FcRunaTBPPZ6VK8De82hr2DzG", "Balance": "212187748", "Flags": 0, "OwnerCount": 47, "Sequence": 66971099 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "11E05863B4C6211385D6DDC25D0C6C49DBA0C06FE1BC9C7DDA303CDEE3C78FA9", "PreviousFields": { "Balance": "156235749", "OwnerCount": 48 }, "PreviousTxnID": "F4D571B7F685FE1D04218BFA0A2C924BD2E89215A8CA7579745AC918D07D0F98", "PreviousTxnLgrSeq": 68989941 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNaQPWNXMaNzEWKoidMaJqNskRUFKbKWM2", "Balance": "251879614", "Flags": 0, "OwnerCount": 48, "Sequence": 67342487 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "11EB531DFED1AFD9097B1C064570C652FEED388CBA49A1B92DBF3668F18DCCE8", "PreviousFields": { "Balance": "140768503", "OwnerCount": 49 }, "PreviousTxnID": "3B391B8D2AD67240C79C806EE0D899A255DD0B1E5E4AA7AC468DE099039DA8D7", "PreviousTxnLgrSeq": 69047469 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rsRPHwDyRv18j1hT1wkQEHCvtCpgKYYyGc", "RootIndex": "1208A96808FB7029B17E7538B1BA4947F37BB152CF645E515FCC7B8D32D2006D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1208A96808FB7029B17E7538B1BA4947F37BB152CF645E515FCC7B8D32D2006D" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGKv1gHL1ANheQZ4GMCikKaGYoKJC6o6wG", "value": "9999610698224570e-1" }, "HighNode": "20", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "eea" }, "LedgerEntryType": "RippleState", "LedgerIndex": "12226FB855B3C941CB6DB6D7460D8518EA0181627F6C638FE8DCA13712292E77", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-12516988266.79049" } }, "PreviousTxnID": "E715BA74CF7E73BDD024047361A1DDBDF668AD726370E57905BD54F3A67EADCA", "PreviousTxnLgrSeq": 69053769 } }, { "DeletedNode": { "FinalFields": { "Account": "r9ny1UWruE383T7YTyQgiH4re75gzGpKqa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5BA7901040B2", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "249D5DE9ED966468146810488DE133CD966EE7A9E2987C313E5A85432F7E7DFE", "PreviousTxnLgrSeq": 68998380, "Sequence": 66266409, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "12685D9A06E713141940EEB88FCE81FD0504D5025B1F5F2B4DB89382CA6FDE64", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15366462099.11738" }, "TakerPays": "49126579" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKzptAtXDpvuPnT8Es2c3Tq8URKvEWYomC", "value": "1000000000000000e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "edb" }, "LedgerEntryType": "RippleState", "LedgerIndex": "1272CB04F4118FC2A32DD8A4CE74EE3AF1152426F1518B9F5F1F59E2768F2E9F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5230203000" } }, "PreviousTxnID": "20A049B8223DE9E4E8722A52F737BCF93F446C12AC49BAC78F06E5E74614C1C7", "PreviousTxnLgrSeq": 68891668 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rEJjxWqDiG1H1PDqXXnwdHjxAUTnVGmrDS", "RootIndex": "DF6B446A5EDEBF2A5A2665EA849F8757F58F816A37D4CDB1FAFE40AA54271302" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "127819DF620F25E9EEB0E67D85CBBDF31FC5D4BA7C05D2B86F7EA561622CE6CB" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rU7MhPtUbjCow4e3Hoqxv9PVQ7ebo3mLen", "RootIndex": "127C96792C9D0899072E8311ECDBAFA03938E480C08FE93F62AAAF11FEDF81DC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "127C96792C9D0899072E8311ECDBAFA03938E480C08FE93F62AAAF11FEDF81DC" } }, { "ModifiedNode": { "FinalFields": { "Account": "raLEGx6aGsVshgdT3oGzM2nyv8oAruC8Wf", "Balance": "142486715", "Flags": 0, "OwnerCount": 51, "Sequence": 67515320 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "12F01336F08D68163783965263484CB8E9B9C3EBF2F926484CF8BE60DB3800CB", "PreviousFields": { "Balance": "117486715", "OwnerCount": 52 }, "PreviousTxnID": "60E440CBB8D48599B43A0F5CA7C79EA819335320F1A7CD05E241DFC7645C554F", "PreviousTxnLgrSeq": 69052176 } }, { "DeletedNode": { "FinalFields": { "Account": "rKVDELWvNMyoxDQenRjpToSvsLL7RwR62h", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A569D5C23E278", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "8E2C83F5F98179CA712548909AFC733AFEC622A757083D0CFA036F8C418458D6", "PreviousTxnLgrSeq": 69015670, "Sequence": 68633126, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "12F28F9760A78CC8A996B59F26111D9AD62351BDA3420397607ABB1100480166", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "25700144.63779652" }, "TakerPays": "74787" } } }, { "DeletedNode": { "FinalFields": { "Account": "r3PYAn9d1DTFzJ9kuvFnhudgwsVZ6pm5hT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EE99ADC0CA200", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "EAED420D9E0CA9D5E769134FD48D43555AC3159E5E575683AEA4DDBF0CA5219B", "PreviousTxnLgrSeq": 68996914, "Sequence": 67442312, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1699075413897170e-4" }, "TakerPays": "713187074" }, "LedgerEntryType": "Offer", "LedgerIndex": "1339BE8189112E1F34E2610EFE148272766D63C28D9D6FB425DB6F3F04E3FF91", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4000000000000000e-4" }, "TakerPays": "1679000400" } } }, { "DeletedNode": { "FinalFields": { "Account": "rU7MhPtUbjCow4e3Hoqxv9PVQ7ebo3mLen", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "20B4D5B59589981B4EC9C02655A4BC8ECFDA60DB1CDD1A9DA15C22F80BA95506", "PreviousTxnLgrSeq": 68898444, "Sequence": 67761542, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "134342064041598A7A2D604C7720B6A87D8B335C54A176628DF08B84F01B0A3A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "60652861" } } }, { "DeletedNode": { "FinalFields": { "Account": "rfXqSEeWLr4MYYLsESHbsyh3CZhAitzYVg", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132F4573ED3217", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "7C593B6EBFDB8DFBADD385AC791E919CB123F08ABB752E473ED0BD15DCA36C53", "PreviousTxnLgrSeq": 68922144, "Sequence": 67866272, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "135E9039A81FA8F336408D1AA11DBFB385915203645B8E043E0707C27BE4902B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10133845184.51845" }, "TakerPays": "54722763" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "6", "IndexPrevious": "4", "Owner": "r4zXDbBBSbrguDq5pTzabnMgXY7n5qg2jb", "RootIndex": "7701B90FA50AF135326B1DBE0C8B8A71C4E95CA5C6E659E479DEA0D12D2873BB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "137BC72F601FF0990CBC930457A969597A1B6713AAD17676134B56B87959101A" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e39", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUkBkCrKSXyNbUcj7hNC684Z2TrzouvZBr", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "138B64CF78C44EFE0119269D0EB6F3ADD2237D9DF2D8CEB6EE2DB821F066A041", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "26076190543.44082" } }, "PreviousTxnID": "820BEABAADAB392C11C37D65E86AC7B934016559980661AF94D92024FF65A75C", "PreviousTxnLgrSeq": 68911654 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJd8ipxtKA6u9iXpvCJYQrsES2Q4FsySHR", "value": "1000000000000000e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e9b" }, "LedgerEntryType": "RippleState", "LedgerIndex": "13C94FB63ADDF9C78223F32CACF7392521296797A2EDE621B55FE54FE7E57D68", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-8000000000" } }, "PreviousTxnID": "696F5F87ECAA5D62083B2E12517FFFC0E109997A1E2C091F19874337E2F6E65B", "PreviousTxnLgrSeq": 69004161 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMq6uX75yyCP9KjWCxYghLf9xsr3rQCbJv", "Balance": "329096691", "Flags": 0, "OwnerCount": 96, "Sequence": 67526059 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "13CA3040D4DC05C1D57B8E093EFA6D67FA4F6E602061E435D44876D63BFBF692", "PreviousFields": { "Balance": "266596692", "OwnerCount": 97 }, "PreviousTxnID": "4E3EE064C019240D636E1D732F0248A6C4EC2470C0FD44710CCB61969B9B701B", "PreviousTxnLgrSeq": 69063977 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "24", "Owner": "rh9MmnkJaQ1P1Y6ZzmRFpQAc9UdH6pKTiS", "RootIndex": "BD4BC1790ADA535088B54F5C320B7A0B0D23AAAECCAF1819BFFA3E850C8455D6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "13CEDF99C2220D0D57091E6E82FB05977413C68104E0AAAEB26C3D12EDDCF12F" } }, { "DeletedNode": { "FinalFields": { "Account": "rKU9ca11NtN2HFEaNj3WhV7dS13vpDeS46", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BE0CE0F610676", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "7F366AB4A393DB7A525CA10F4AD2415031B6911E8662E75D8CB00B860BB2F277", "PreviousTxnLgrSeq": 68898126, "Sequence": 66579410, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "19458705638.32727" }, "TakerPays": "152692463" }, "LedgerEntryType": "Offer", "LedgerIndex": "13E84CDDD22E8B9573D609346F2DCC312A54D181C381BD3D78398141A9121FEF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "49458705638.32734" }, "TakerPays": "388102463" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "8", "Owner": "ra1aHhcQxB9sHWm7ppBMKEQWs4FTfRGZAg", "RootIndex": "A3F6CFCB36517239CD869C18F5C4463E8F6891EDCDBF24A29C719AED42CF02CC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "13FEF40B873AFBF49985E7F94F1D7781079E1C23068E768FA200AD4012CF39AB" } }, { "ModifiedNode": { "FinalFields": { "Account": "raHjNXUyRvwxN5Vr5NtQ5pbFVgbM7kqLrP", "Balance": "1631809812", "Flags": 0, "OwnerCount": 55, "Sequence": 66646327 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1411339E2292D8C681AC3D2940B993F19E9C696D36F8A368AEAA11DA5FD674D0", "PreviousFields": { "Balance": "126194111", "OwnerCount": 56 }, "PreviousTxnID": "DD6B8DE93A64E4F4F80523487AAD86AC196781750C73FEFA816EEE070ABA4726", "PreviousTxnLgrSeq": 69061616 } }, { "ModifiedNode": { "FinalFields": { "Account": "raKfcCtqnoopzuWrRWY88p5hbTBmF7RzTj", "Balance": "391036831", "Flags": 0, "OwnerCount": 28, "Sequence": 67579563 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "148BDB9934AB73BDAB451EDCDABDD324BE65FB0C5043C531CB2CD6F8921ABF9A", "PreviousFields": { "Balance": "291036831", "OwnerCount": 29 }, "PreviousTxnID": "1673903120175841DF64C77E9F242908AD97FA6A035F65F15F104D4995F02DEB", "PreviousTxnLgrSeq": 69053471 } }, { "DeletedNode": { "FinalFields": { "Account": "rwsVYq1xyweADXhtBLLfr2X9FL57DnGTk3", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521661D10886FBAB", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "156F1E950F03472F65F98CAFCA239CBF46BAB58C6024783AF16128D775D1817F", "PreviousTxnLgrSeq": 68927305, "Sequence": 67647706, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "14980DD3F2920A491D44E68D0AFFDB15FE0DB370883F3475ABB5B90BF66B51EF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2098115110.418" }, "TakerPays": "13218125" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "12412553330.92059" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "b06", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwJECKX27rvudR1C4R2QCUZwatR9zkC4u5", "value": "9999999997999989e-1" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "14B8BDED89BEB4FB62AC72A830CADBF3770C7887DA8D50530107172825696925", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "45537340619" } }, "PreviousTxnID": "82A653E0454F0E2FE654187E035B447BDC13DC546EBC300FCEA7094B2DDD1300", "PreviousTxnLgrSeq": 68995488 } }, { "DeletedNode": { "FinalFields": { "Account": "rnpQiciqw8RGKo3NmqAuyZXScNoCNmQSL6", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132AB9523E86A8", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "ADEF9FFE88CE621028C88C5B97648D03213EE03DB516037581D217E1648ADCA0", "PreviousTxnLgrSeq": 68932768, "Sequence": 67428288, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "14F2D335706607522AF2E7FBD0961A71D8BF13014CBFCEB5094A903CE40D0CEB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "18678449508.79754" }, "TakerPays": "100770235" } } }, { "DeletedNode": { "FinalFields": { "Account": "rhEwjxZkMbARLTQmMsR7N6MxRDUUKLF1RP", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F7882D5", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "5036040814755CA4A0CFD8C655296D631EFB3709EBBD06C398B933A945AF5F34", "PreviousTxnLgrSeq": 68156028, "Sequence": 67389325, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "11023761340.69075" }, "TakerPays": "1102376133" }, "LedgerEntryType": "Offer", "LedgerIndex": "14FEB59EC7D827D630F6ADD59EA8D9FCFFA3985AF73FDF8F371AA0B9B27357FF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "17241379338.19075" }, "TakerPays": "1724137933" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5000000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHQELpjMXco8drUJVmfUq89kCZbDdWBr3A", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "72f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "1506F6D2305BA15CCF3AF9406F5D05F048C00AB01FA7EB4A66A5FA44AE4B9D9C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7000000000" } }, "PreviousTxnID": "C90E5993C029A0328FE9CEC457C121D64469E203A2A7958185E50EA711A00D72", "PreviousTxnLgrSeq": 68899664 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHunttX1NcJT4kdqXJZaqjkU7zeMmJuauN", "value": "1000000000000000e-1" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ea6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "151D3B28FEE4D8E860AE2FB4EE231A8F5730807D2FB958835ED4FABE0F960204", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1154462616532678e-4" } }, "PreviousTxnID": "A876CC518EAC8086AD5CFF07F89A0083F8C01AF3EDF1F83A2873FFCA50D8373E", "PreviousTxnLgrSeq": 68956977 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "c", "IndexPrevious": "a", "Owner": "rHHviosMrm1hi4Nfm7MTipMw2oeEQRTeod", "RootIndex": "D328BE27A8ADCB49C5630044BC76FEEF5D15AA7B44CDE83B9594167A145F8DD8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "15792A8349A395092788AFC8A81C61BA715F1678DB99638EEB84E826F2EE642C" } }, { "ModifiedNode": { "FinalFields": { "Account": "r3fU9zQRHEWPbnN3r9TcM1d6NSRsBvUjau", "Balance": "498417249", "Flags": 0, "OwnerCount": 92, "Sequence": 67522082 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1583CD276F1C181543B54BD1F94233B6273755B8462204D1733814AC8D7AA59C", "PreviousFields": { "Balance": "477217249", "OwnerCount": 93 }, "PreviousTxnID": "8BB5F5B9542ABE87FA547B9FD7EAF099C5DC21ECDF7FE766669F20AE4DE7AB83", "PreviousTxnLgrSeq": 69054071 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "r3uzGoy1vgEEdULUkLBRJXaYfww3nzYP27", "RootIndex": "129E6EF8A8F1BF628EA95D2A94CD08A6672D9B34760E8C911CFA1A47EED92F8D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "159497FEC9C4E9CB26C84E10EB13BA7ACCFE43FCEF653EB2C9AC1F454AAA1DD2" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rhrguNtFAs4pp6FD4n2Uz2M5PQACwnWdrC", "RootIndex": "F8D506185F094CF04D271EA780018165C2D82CE21CA5844760DC0EBE4A9AF1AB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "15C960DC8446973E27A6A13C906CD8A873235F80F0EA4F2DAB65DF76BAD34418" } }, { "DeletedNode": { "FinalFields": { "Account": "rNLPZmai318pizfUNmkebSrtsR5mFvVVWt", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "7C886A10308F9DB4875E38A81A143EF4A78BE302E10EF23376303C5D2FAA97A0", "PreviousTxnLgrSeq": 68890675, "Sequence": 65894134, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "15DB8A587B6405037448FCEC16DB54AB063DC35734E25992CF7BCABA6A54D9BF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7000000000" }, "TakerPays": "70000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "d", "IndexPrevious": "b", "Owner": "rsydLXavwRHUq9TWdwYqPpYViuFBNuYQYs", "RootIndex": "915A98AAD8D9A9670FA25E5FF703921D59FA22918FFFF2461E7C00232D0FBA5D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "15E048B55E43909A12879A61155DE4450D7AAB8548112AE921852EEC58823BAF" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4A2sUYHaLAGsDxfwUSv7GXTyYRsoBfQin", "value": "9999610698224576e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e7d" }, "LedgerEntryType": "RippleState", "LedgerIndex": "15EDAF3359B21F80C7E8799BDDB76BD183B7E1AE97589831B753F9D9C0BCA3D6", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-14866087945.17969" } }, "PreviousTxnID": "516199CA01F6EF24C69DD122DF38068F800E082AE5F4A99320E35BEB6B5D3F6B", "PreviousTxnLgrSeq": 68940525 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7786973309.70861" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r48QoxLkkqiwjzhposyFj61op7AtvR5aLq", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "cf2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "1691FCEDAEAD89B2474FE4001A5FE028D01CDF0AA853750C52DC5284E1658F24", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-23941973309.70861" } }, "PreviousTxnID": "64E93CD6EC69A437B4447E19605284264BEFDF7D4C43727DC21553B42FE1F2B2", "PreviousTxnLgrSeq": 68912329 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "r9MQ7Hek3iMwBnYRuHTuuG3ssJu48PHaxJ", "RootIndex": "D2DAF9DE64380E0214B3F74212953AFD557A92CCF328266843C22E1572875671" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1694417E7128CB02A03B57BF15EEB450CCA1F5200568BAE5BD91C93C85F92167" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHmYEsWRfXC1YbFEKeJRWu9d7tdZ6x1od5", "value": "9999999997999991e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "b6e" }, "LedgerEntryType": "RippleState", "LedgerIndex": "169E3B164864340E7F4A0A8C54E74585200DB0DF382834300752B6014B7174AF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-14000000000" } }, "PreviousTxnID": "481EC438668C04BB9CC8F2DD0093942D152A40408A2EFD40E56303D1BCDF8B9B", "PreviousTxnLgrSeq": 68227200 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a3c", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rB7bqYSsffBTNfLgyyyXyWL2e1bg2djJq2", "value": "9999999999999990e-1" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "16A70882D5F402DEBC814CC48EBBE7C136E940EE0BC40BB7838FBEE3662620DA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "78C01598E586DFFDBFAA1D68D6BD0ACBABC36E42B7E59606AD98A4AC8D54C332", "PreviousTxnLgrSeq": 68057439 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rLgitcbChWYinjw7tiwK6wQw2mN6pEyWzw", "RootIndex": "16C9FBC6693C492AABE3929A70371E21DA61AC32ACA15C72EA8EF23989C7ECBD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "16C9FBC6693C492AABE3929A70371E21DA61AC32ACA15C72EA8EF23989C7ECBD" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "9", "Owner": "rGgjwqb3Lg3yvrb1CRRqcTghWvU4r7fvFX", "RootIndex": "0993EA29BCB09980B54168F4B391202F77C09534C939B3A4B0F37D7745287714" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "16CCACCF223053932377ED9C29C923F7152827826E2BC4490ED2826986ABF9F0" } }, { "DeletedNode": { "FinalFields": { "Account": "rK1QTLhkJgn7zvG8ZcGJea3XzWfj45xhRE", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "BDE5ED0568DE638AD0C5636D2FDD271727FD7EBA5B76BE0AE321CB7CA23B64F2", "PreviousTxnLgrSeq": 68900131, "Sequence": 68264055, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "16DB6E534C6F72A8BEB071ADFC78C0C78FEC1A4F7976DDD176FA10F1F143083C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rQpXmMNyGKtsYHwkG7Y3n8sXSXo2cmB1Nt", "RootIndex": "16E0C156FF84FCA3E23F5D16B0D7E698F6A66097FAD5EB31261809FF6370038C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "16E0C156FF84FCA3E23F5D16B0D7E698F6A66097FAD5EB31261809FF6370038C" } }, { "DeletedNode": { "FinalFields": { "Account": "rGEpUHYXy3Lt8KvmaKG9wGEB51H1nGAcJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217FFA2F2B82AEC", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "B449A16D554A778FB594F0081335A3C5D687A92E0F39D6F767BE40F228C43296", "PreviousTxnLgrSeq": 69040844, "Sequence": 68786183, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "16E4CF3B1B816C9AC9B84FC473F676299D41E30036DEF06A375C79D8539FC1B6", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4555713689.655172" }, "TakerPays": "30773845" } } }, { "DeletedNode": { "FinalFields": { "Account": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530AA87BF01D4380", "BookNode": "0", "Expiration": 723610812, "Flags": 0, "OwnerNode": "c", "PreviousTxnID": "9C0CBDF92855D1220A1816717391FB545B54E697F70E8875E31C3910CE4EFEC3", "PreviousTxnLgrSeq": 68154162, "Sequence": 1411, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1713B2474A54018FA152BCFE706A67F922DBE30C65D06164307708C7D0A98EB1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3333333300000000e-4" }, "TakerPays": "10000000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "7", "Owner": "r98DGNQEGR9x2bhRVBbuiHAqxq2aDD6pKa", "RootIndex": "4509AC09B894AB80FB8225E235EA6295D629A8F6A759AA177218DCAD3C19933B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "172A06873BB83B41B07FFD90E640F37230C5B62C2C315474E5006B1661F6B0DC" } }, { "DeletedNode": { "FinalFields": { "Account": "rJKHj2kBpPFHbEu4m2uuSuh5rQEcAYwJ8Z", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C276AC49", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "3BE635A79FB9128A7018B79D1AF3031A1DA4D9D34E0D83B07B3C7797BF180A39", "PreviousTxnLgrSeq": 68897122, "Sequence": 67088025, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1746C58C253F934AF2B953CF32466FAAA717A1A6EDE75F0CF31C1014900FAE28", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7000000000" }, "TakerPays": "62999999" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3997127386520694e-3" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ce0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpCmDBk3dADpY9cb77D1hA4NHYnn7YbJM1", "value": "9999999997999900e-2" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "17536D89843338D4A7A5502E58CCB89B963BF68DB0F6B36B7E5D018233657127", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4210127386520694e-3" } }, "PreviousTxnID": "6125C0759027EEF3E016DF24B55F67B626424E62B6DAE36D07C2B5498B45FEED", "PreviousTxnLgrSeq": 68264001 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rHAYfZTYakQQ5NJCP8BD21nrQeQmDyst5a", "RootIndex": "047B99C075CFA917FAD71119725DBDE11B1160DE029036A76B7521E9C4B45EB0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "175F500472CF2335DF87A4707E5F65EFB429939892EF2153016F2AC694C20757" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2500000000000000e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEjghQohwSDxD7d3NbTdrzRLGRRsGf7qwN", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "42f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "1787282E21035E247DC0B19014EB6AE5B129F750E42FB938D42DE31439F281E5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-3000000000000000e-4" } }, "PreviousTxnID": "7364DEE751C5B2D714B9C2A3B42FFD41DAF05907BE7CAF3281D1BEC0EF17F148", "PreviousTxnLgrSeq": 68867488 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rJWkGGCNuazEf7ch7C9bZkiiYy62Z95SA9", "RootIndex": "091FA763978758309AC5D8242AFE3FFEB6FE5A5B72D6D9B037C9186F4F55B599" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "17B99F5B9CFE91D1F62175B7514D68248AFBF076D4484C8D6599DD197578DF95" } }, { "DeletedNode": { "FinalFields": { "Account": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CB83D440", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "56289B096296D440731D027D320B144AF097FA5140426FFE1275437C38091E98", "PreviousTxnLgrSeq": 67960053, "Sequence": 1034, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "180293417D2968D9E3885548364B2347633CF5E3952012E076D7E8D8CC9064D7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1111111110000000e-4" }, "TakerPays": "1000000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHLNuze17yJvjKohtAWTiakAUWFDp81Nbv", "RootIndex": "1854415E1280BFCAFAC66998B9A37DC80959EF18F49CED094042B51132C5C58A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1854415E1280BFCAFAC66998B9A37DC80959EF18F49CED094042B51132C5C58A" } }, { "ModifiedNode": { "FinalFields": { "Account": "rBCw1uH84iKcSRVjY8ALzx66Q9ZVNMgYsn", "Balance": "262296646", "Flags": 0, "OwnerCount": 87, "Sequence": 67605379 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "18A67BB911101B6601D6AC53B2197C8F217C38EDF7E6571C371F0B4CCC4136CA", "PreviousFields": { "Balance": "185997477", "OwnerCount": 88 }, "PreviousTxnID": "3198D16B3C01A0E75143933DFD9AD154FCEE7A3C53B2EDA8FE5687585892953F", "PreviousTxnLgrSeq": 69027486 } }, { "ModifiedNode": { "FinalFields": { "Account": "rw2K4HQDujtogHECEi9ubWzeVVHr2bBN16", "Balance": "369162887", "Flags": 0, "OwnerCount": 67, "Sequence": 67133437 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "18AC37CB030F3B039F2176F7DBF58953635ABFEF3F6D068E0481C81CC2113D7C", "PreviousFields": { "Balance": "213443090", "OwnerCount": 68 }, "PreviousTxnID": "6EEAC53B70256EFEBF3AFD71E0343C1ED8E9A4C51C786DD8E8CE9DE72753DB61", "PreviousTxnLgrSeq": 69063536 } }, { "DeletedNode": { "FinalFields": { "Account": "rjD7dFqNXSEK4juN3ntGwbYn1P3xjepVf", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26BA20215", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "A4E85BD56A83692AF50894E1BB73C061373B8FC2002AA5C236192B6167D77071", "PreviousTxnLgrSeq": 68059457, "Sequence": 67707159, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "18C7B3CEB9E5248D301CC4D1DB57A5627993764C1970CF3F9D33E5360C6FC757", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3889722226.893519" }, "TakerPays": "38897222" } } }, { "DeletedNode": { "FinalFields": { "Account": "rNvk1SNQZhU6fsyMuaTeLucyw5x5uxfxQy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213B7B21280E000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "5554419DFC980FCD8974C177DC530D516450FED5E54C083F030DB5DB0ECBDBE5", "PreviousTxnLgrSeq": 68919955, "Sequence": 67175540, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "18D0A42C6A5E27161BA31733CB95250C32D0F1482B193681FD73ED4F9C58D4C3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "894236036.036037" }, "TakerPays": "4963010" } } }, { "DeletedNode": { "FinalFields": { "Account": "rLtYxg3QjyCpbY68rJg6XCeecMyCnzBNCt", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CB5D0DC89D26", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "E0E19EC7AAE78ECA7BCD3D85DEFE79C7D756D09A5AD101DCF713B42349DACBAC", "PreviousTxnLgrSeq": 68928469, "Sequence": 66617290, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "18EED4504B4DB8294B8A7E7EF356BA89DF6FF292E5F2DF1C7138E94CFC21306D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "54338423" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rQnNwoWPxGyxMoLogTPHYeK1hGYwJ3b9Sz", "value": "1000000000000000e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ed3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "18F17C8FB1C47DEE25DF8696652FB4A71352BE9ADD54FE837C382831482EE46A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-31784313725.49019" } }, "PreviousTxnID": "D3C0C9D44AE7C4B4A1AFA2CE78BACF5E06723DA75D3FFB31D77BF78D909531C3", "PreviousTxnLgrSeq": 68922926 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfJ35bQofteAs3h4aCA77V5wSHRsHChttf", "Balance": "271123542", "Flags": 0, "OwnerCount": 94, "Sequence": 66166943 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "192F37E4AC5E43751769269E7104B06C3E1AF76F2CC1A9DBE0E9B53916F6B313", "PreviousFields": { "Balance": "214463542", "OwnerCount": 95 }, "PreviousTxnID": "E7B5D934A360620CFDEB6E8B44A09E2355405739626DD8260532A1B483C92594", "PreviousTxnLgrSeq": 69030968 } }, { "DeletedNode": { "FinalFields": { "Account": "rNk5vizuipEGcr9cNVXnh1eBjhaMFqFs42", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAFA8000", "BookNode": "0", "Expiration": 724402522, "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "26D081808A21497EDE4B3CA0F91F6E0E979C0028E60E5A60431885EE55A9DEFD", "PreviousTxnLgrSeq": 68348074, "Sequence": 67689494, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1938E34E3586172C47E6281CAD5E2A3B86368C2ADDC346F44512DEA0431549E5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000" }, "TakerPays": "90000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rsRPHwDyRv18j1hT1wkQEHCvtCpgKYYyGc", "Balance": "389155969", "Flags": 0, "MessageKey": "020000000000000000000000004E60D4CEF14D65829B9F2EA13230010E0686261D", "OwnerCount": 17, "Sequence": 58601491 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1949A881B3C84A70EB716DF170EEB540A8C002DE915708E948B3311E94701597", "PreviousFields": { "Balance": "227032370", "OwnerCount": 18 }, "PreviousTxnID": "E1E9B849387117F3C518CCB9A4BE3AC9F23116F57A12D033DF0CC8A8FB9D3FEE", "PreviousTxnLgrSeq": 69053916 } }, { "DeletedNode": { "FinalFields": { "Account": "rDHvd9BAsKFcmRyCA3Y6iYEMi7n3xzR5Uu", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653212BF3B80C09E6", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "F28F8A108123B4D924F518ECE81A17674289159F4CD97871565507FB07E605CE", "PreviousTxnLgrSeq": 68289551, "Sequence": 66975678, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15571979732" }, "TakerPays": "1453955747" }, "LedgerEntryType": "Offer", "LedgerIndex": "1951F859DEC752C8A8355AD69AC1C65300A0F08E58E1AB02F8194E877B0966CD" } }, { "DeletedNode": { "FinalFields": { "Account": "rL92EVWszBA1ZbZADyficMkRFVvpV15sEE", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E32B4780A2147", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "ACF9D5A5F8687CFF0AF796A6B02C34D49460B14D4CED704B144CED778743CBE1", "PreviousTxnLgrSeq": 68899849, "Sequence": 67153653, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1984B8151D30B18DCFE4699C919B30E4771119A39FFD13F5BB49705B053B5C43", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "26034361675.38556" }, "TakerPays": "221292074" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r5EHmNdKr1SRiA1DrtKBo18DYRrE5ncHF", "Balance": "400777805", "Flags": 0, "OwnerCount": 5, "Sequence": 67580215 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "199109E9C56836664C315F11860C4E034682A08BE0B7F22DD103F60D98B15673", "PreviousFields": { "Balance": "22747977", "OwnerCount": 6 }, "PreviousTxnID": "5908D39202A0D8B2F5928B7E6537EFCB3C660F0153DDD6EA4BBBD1F6F1D07C9C", "PreviousTxnLgrSeq": 69039387 } }, { "DeletedNode": { "FinalFields": { "Account": "rspLJnfzomVceQKCn6ExME3gJEUuhUZxdV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26EBE57EC", "BookNode": "0", "Flags": 131072, "OwnerNode": "15", "PreviousTxnID": "5371AE37E0E1742902E404689D186DFD40CCF35915FDE99B283E02C1E9E91364", "PreviousTxnLgrSeq": 68942879, "Sequence": 67373759, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "22122176237.5" }, "TakerPays": "221221762" }, "LedgerEntryType": "Offer", "LedgerIndex": "19934C6D6852353DCE48CC6B7CB9D83C32905946333B86BF70E857E1FA9B3A0E" } }, { "ModifiedNode": { "FinalFields": { "Account": "rhJfzjX6NrYjiR8yGumtJSHuuLxn2JbgvT", "Balance": "121526754", "Flags": 0, "OwnerCount": 21, "Sequence": 67761600 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "19B56E16C088C8EE3560F6C4170B1524144E822955F1490AC89DD2C9F967A7E0", "PreviousFields": { "Balance": "60873893", "OwnerCount": 22 }, "PreviousTxnID": "D0B094EF85CDB4F374E881AA0451298239F739836BE9C6A92BD6911FB59B234D", "PreviousTxnLgrSeq": 69044027 } }, { "DeletedNode": { "FinalFields": { "Account": "rsNTEynqepWnCvBMLb8x3tekWQXG2TxfEM", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B8BDB94BFC03D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "7C63F1694CD8140D0C5A3EBC88AF5A61C1A7BFF6F5E91B2F245A77DF03668D44", "PreviousTxnLgrSeq": 68999618, "Sequence": 67692595, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8619713969.454317" }, "TakerPays": "28014070" }, "LedgerEntryType": "Offer", "LedgerIndex": "19E49F39D0F0C4A0CDAF8FFDB67D2FCC6DE9C7967DA639478B98AD2AB1405FA5" } }, { "ModifiedNode": { "FinalFields": { "Account": "rGgjwqb3Lg3yvrb1CRRqcTghWvU4r7fvFX", "Balance": "3627435762", "Flags": 0, "OwnerCount": 86, "Sequence": 66228561 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1A98773469D02CF9328DF41309B61FBDE85128E04BDA77C89CF42BE552FD285F", "PreviousFields": { "Balance": "1314996772", "OwnerCount": 87 }, "PreviousTxnID": "629E9FE84D5E4CAC080426621498BC5D00516C4EDACA94CB08EA7CA0D5271E38", "PreviousTxnLgrSeq": 69060088 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsWg26FevrM9h2PFcanVpvpaLNuoGpLnrB", "Balance": "6148244613", "Flags": 0, "OwnerCount": 23, "Sequence": 67689872 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1AF68234660EC08CCBDE52361FEF42724B159EDFCCD7A3DFA94D2F2A1E2BF142", "PreviousFields": { "Balance": "5898244613", "OwnerCount": 24 }, "PreviousTxnID": "1E63D9C71BA5E435C690DDE49C3CC7E4034057BB224CD25F276D0BD856E786F3", "PreviousTxnLgrSeq": 68784970 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e7e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKnBQjFdG2pPCrKiUmeZZZ6YjmuCyWVta", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "1AFF59DA46D633626E64AE3E64DC92BCD669A9987547656708F8CDBC5B90DF92", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7607438921.424369" } }, "PreviousTxnID": "913BFC867235A7532C957B2914F84E8318CDA1EFB97AAA8436D17CD0B589C22C", "PreviousTxnLgrSeq": 68752885 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rUdhzvzWjHpSjP6CGksiit3bdgGLV5DXZv", "RootIndex": "6BF0BB998DBA1FA0A7D6C033B316942EC850FB722B036E378025C55A28005D68" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1B2E5B143F52A4097994454701E39B9CAC76F7347F20FA20D29DD1581B66367C" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "r4A2sUYHaLAGsDxfwUSv7GXTyYRsoBfQin", "RootIndex": "5EFD0A90FF4AD5FFD97A0821FF1183192FC13A98174BD184E63638165FB2BF6C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1B4B3D5865BD60C8B476AE47E393E881C1AA69B654323D81C4F900DF65602EB8" } }, { "DeletedNode": { "FinalFields": { "Account": "rKzptAtXDpvuPnT8Es2c3Tq8URKvEWYomC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386099206BD71", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "70FE7C12628FD71F5FC3340F21520B39E8843062B44691CB7D84B8C54246CB9D", "PreviousTxnLgrSeq": 68893812, "Sequence": 68602029, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1B5A3E1623893589CC83B67E92036830AC5F00786ECC7F336EA02FCFCE866D84", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5230203000" }, "TakerPays": "52296799" } } }, { "DeletedNode": { "FinalFields": { "Account": "rMDc7eVhCw5jjCXU5DGpn2tUV9D7aBBFLx", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "0D26618E261731B91EE2412BA41ABC2B0B07036CF933B1C785203615B44F9B3A", "PreviousTxnLgrSeq": 68150767, "Sequence": 66970144, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7000000000" }, "TakerPays": "70000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "1B641190A11084B9DC7062F302DB79F9ABFAD12E4BF0576DB8168164A7265BB0" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "22130399.88578" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e96", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rD5TVx1akARpWNKumsadd69Wask2L69v7E", "value": "1000000000000000e-1" }, "LowNode": "9" }, "LedgerEntryType": "RippleState", "LedgerIndex": "1B6E12D4F7C835A898694B4687EE951D42845453A861F38F3004B594F7713E01", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "11579630399.88578" } }, "PreviousTxnID": "202F976F658DEF73049F918F5D60C05DE871BE89E1BC09ED8C3D341EF4D32E64", "PreviousTxnLgrSeq": 68922054 } }, { "DeletedNode": { "FinalFields": { "Account": "rpBHrwSGdQm3hE3f6988mSgV9LAzuBsx9A", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F867DE43305C1", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "72A999D4AC1543489AD132EBC19E8B766BB36C7F4E959E3E4C2A9A3AB511AB68", "PreviousTxnLgrSeq": 69002204, "Sequence": 67835821, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1C7E7F20C3196BCA78079FC186CCD857E40C66D01089CA7F6E37F2F2FD85E03C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "34024775" } } }, { "DeletedNode": { "FinalFields": { "Account": "rh1bgyeVNDBauF3vXuASW2L8MWrdq8XYko", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C110214914003", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "13B8825F4E2F134933BA769767C16B8A2DD10B498E83CDD2F78566268F3A8390", "PreviousTxnLgrSeq": 68898445, "Sequence": 67364431, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "258138076.92307" }, "TakerPays": "2039290" }, "LedgerEntryType": "Offer", "LedgerIndex": "1CD36013F87E2FEC079D57D80036EA35680C9CC1695D1B39169A8B5D29F72F37", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "28128427410.9589" }, "TakerPays": "222214576" } } }, { "DeletedNode": { "FinalFields": { "Account": "rDTDTzVK47KCcGmiywZHhKsDP7323fqGGL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "83C3975676540F9094F43911AC5C8E51AB89B80AFF24DC1B4D1A4EE9A00606B6", "PreviousTxnLgrSeq": 68923490, "Sequence": 67690769, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1CD59617A0E0106AAF035E7C7919AA45095F955C6690EFDE7CB8F8A38A230002", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "11000000000" }, "TakerPays": "88000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r9N61ut2QDA3sThiawsRjj3A7gvz4ZGM2L", "Balance": "38301396", "Flags": 0, "OwnerCount": 3, "Sequence": 67750590 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1CE1B379074CAED87EAF1CCDCE4E010A7A96B75A3895E7C9532078E915D25119", "PreviousFields": { "Balance": "19217836", "OwnerCount": 4 }, "PreviousTxnID": "295F948E361781843BE241B720AC4E49759181DE1DA86E0B3C36F1678D50FF64", "PreviousTxnLgrSeq": 68899294 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rPy5zQthBW1gHiWbdHmbPkGtF9jM5XQGNs", "RootIndex": "1D4245A55D65057567ED6AB0861703BD897D6A2228973B8F15340B750447FA78" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1D4245A55D65057567ED6AB0861703BD897D6A2228973B8F15340B750447FA78" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rA1sVxrZ16rSr1SrxUfsHAR592J2X4yVf", "RootIndex": "472CD4D9A22546D55D5D1EED745A7D35C34B18FF1570C18EA06542F1985D1A9A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1D5F30054EF643CD1031BF50B4425C1FA40F7F12A08AAB7E4EB1F9875206C9DC" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rnZhNn5hFGdBk7UTE5hLjBZFNrYGSs1wHQ", "RootIndex": "D995383C6B7DDB592B4F0A10CB53903AFFA964BE69A9928483C5513A7C574D90" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1D68A9E96A158FAB6F2E648EE841D3636114CA461BD60B07B7E347D59D717526" } }, { "DeletedNode": { "FinalFields": { "Account": "r3pUPUHoXbK4o5wjfPWjqQe4Xh2wu2KWvq", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5ABEBA22641F", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "48B61B3F26CA5A8B030994271FA4F30B0DB59DF7983320DAAFC355D67A18A223", "PreviousTxnLgrSeq": 68998704, "Sequence": 67672840, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1DAE4AE204BE20369F16830C7A4251B4F3B40757A639542FC622E62725092208", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "36020078880.76793" }, "TakerPays": "115120170" } } }, { "DeletedNode": { "FinalFields": { "Account": "rKeFfq8ZvHbFWbsQBAeTB5Ng7aGtoLN84K", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C135F5B977000", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "F6124A49A80B1C86FA74DBFCF32359261F1318E4B91533E248C2443DA2BE5FAA", "PreviousTxnLgrSeq": 68998201, "Sequence": 66392600, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1DBAB9DD65C1897AE98215DE8F2ADDE8BDC4708C7A69022B410E55DBE8BC4580", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "95000000000" }, "TakerPays": "322905000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ec7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9Bq12mZUmUByGGcnu8tvj2KYAcJQ4zbTL", "value": "9999610698104599e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "1DC1B00749187BD1BBD95D62ABAE6BB4C67277A5FB9579A680BDC3DF37E19566", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "8518114231.41891" } }, "PreviousTxnID": "D9824679563B6EA473273FFB417F710FC38475816A587B3ADCF03119B70D039D", "PreviousTxnLgrSeq": 69011393 } }, { "DeletedNode": { "FinalFields": { "Account": "r3fU9zQRHEWPbnN3r9TcM1d6NSRsBvUjau", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652096A2934A7A000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "ACBEA9B450F2FD9E323BAAFCED663AE047ABAEA8F7B5EEC6818DBB6D56BA8FF8", "PreviousTxnLgrSeq": 69019593, "Sequence": 67522044, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1DF2FFED86F4FC4DADF8A956E5C46348D9F9523F5EAF689C6A3B64AEDBFD09F7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8000000000" }, "TakerPays": "21200000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r4VjGvXZQwpAy5iqMCt6kbSbFb7Bi8RYEG", "Balance": "181144549", "Flags": 0, "OwnerCount": 27, "Sequence": 67388838 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1E420A04BDAF14BD85F7F5323F0F3678549BD152E26ABB38AB26175090C0EF75", "PreviousFields": { "Balance": "75033545", "OwnerCount": 29 }, "PreviousTxnID": "5FA79E32931031D8164D13CB652F540F46D95BEA6AEB225C03CCA111A7861B94", "PreviousTxnLgrSeq": 69041286 } }, { "ModifiedNode": { "FinalFields": { "Account": "ra5BMHvXy7Y97xhxSLKZWCDPpbqc9fvWdq", "Balance": "1886066286", "Flags": 0, "OwnerCount": 487, "Sequence": 66693363 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1E50496BE33B40F0AF1587C64DF445B16CFFAF95558E9951B62D820EC4CF672F", "PreviousFields": { "Balance": "1379027054", "OwnerCount": 488 }, "PreviousTxnID": "AEA72183F7C564D41169DEB006506E454BB3505E353846A1F72BA1E4552E3735", "PreviousTxnLgrSeq": 69061749 } }, { "DeletedNode": { "FinalFields": { "Account": "rKMLJSbumUE4mnXET6X1DDFF6JsN8wE8x9", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530D529AE9E86000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "7137805819BC88B8B8802D3C7609F664CF5F61332D2D849E86B9A78E985147E2", "PreviousTxnLgrSeq": 69024161, "Sequence": 67332287, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1E6983B54F743E543110BE66FBFC9095AAAB6F037AF79FABD85B39A8CA05FDC0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000000000e-4" }, "TakerPays": "7500000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGZkP89rxHSHy1opAagx8cUx4JdMhr9v4", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653044364C5BB0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "1CF2617727BDEF8491177DD1FEA32ABC107ADB2E02B918D1C86DA3E1EDEC9A2D", "PreviousTxnLgrSeq": 68898797, "Sequence": 66951132, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1E702B3E800AFB61479691B910C2AEC5E45EECED43D1D44965536D4F12A0BB95", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "43000000000" }, "TakerPays": "516000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rNvk1SNQZhU6fsyMuaTeLucyw5x5uxfxQy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "0F1579B2E692FAFA3A8DCF2FF10EA6614BC9A7F2E6AF2CE6ABE5EB6E576C2FC0", "PreviousTxnLgrSeq": 68964092, "Sequence": 67175575, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1E919F75A82D956940CA2986426F04A0050621E6F0351207925FBD26507887F2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "18500000000" }, "TakerPays": "92500000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rMX68jd5whLXjPmrgvjHYKwZHcbQ3HiYuV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "5CA941D0A00DC0C8D9AC4E47BC15392F1E65E4DE85B9EF3A33FDF92198735208", "PreviousTxnLgrSeq": 68886178, "Sequence": 66684940, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1E925EBB9521BCB66EC48C5D8C28AC253095ED4DC14B0EDF4104DC4B35AD0D14", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "55100000000" }, "TakerPays": "551000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "98a", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raentKRvbeEBLCQQUC5vbc8FH6zFuzaNEJ", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "1E9945C7177CFE696EFDB886672F95E72AE88E23C5823E4F2EA646064770048F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "3791AAE2422DA08AA5E1AEC6A4C1ACFEB0C757B7F655155D60DC2122C35714A1", "PreviousTxnLgrSeq": 67991591 } }, { "ModifiedNode": { "FinalFields": { "Account": "rPhzFvrw8hkGkdzQvSRjuHuESLDqnd6xDg", "Balance": "6750078641", "Flags": 0, "OwnerCount": 100, "Sequence": 66579287 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1EBBB74F5C1C807F23550FE73068A521D4931CF9CAF71A7FD668486BD9178753", "PreviousFields": { "Balance": "6000078641", "OwnerCount": 101 }, "PreviousTxnID": "B30964B6F71044B0F93122AFC56A6324FFBC8FFD8BE0A214495AB13E41D35F28", "PreviousTxnLgrSeq": 69052892 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGUKHhcBwNpS8WUqpxNsFW6Yhy6ZwEuATq", "Balance": "121526754", "Flags": 0, "OwnerCount": 21, "Sequence": 67761610 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1ECD72AF0B3DAE70F160A6F4752052FAC9D4F68665A9512B7D5BF339A35244A7", "PreviousFields": { "Balance": "60873893", "OwnerCount": 22 }, "PreviousTxnID": "A93176758759005778DACA00D3A1B1BD5D2C6B8FBD89822B6482599E769729D0", "PreviousTxnLgrSeq": 69044037 } }, { "DeletedNode": { "FinalFields": { "Account": "rBMPrNjN4FCHpC3wWAdrorVra71nhSRkuK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26DD87DD0", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "B247983180E3DB0120413571461DFF28990ED6D79EE7D45BEACEF91CCFA93403", "PreviousTxnLgrSeq": 68895108, "Sequence": 67579980, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1EDF6E16C5D882F0B75CBAFE0E84E68E0B8DE3BC0F699E726A2A347399184B12", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15253908648.83523" }, "TakerPays": "152539086" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGFCR192crZ5FBYgZPMAZCeBzTrkqeFXqh", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207B854FCEA8D40", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "BA4BB119A1FA9FB2DAC355A626C52C5664BBE0F58F9ECB30133765EA181670A7", "PreviousTxnLgrSeq": 69051503, "Sequence": 68269307, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1EE7069AC9BE018001340FA66925A82B80E50628DCB5AF7A508AD7F49A666A37", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1057712712014134e-4" }, "TakerPays": "229840972" } } }, { "DeletedNode": { "FinalFields": { "Account": "r4A2sUYHaLAGsDxfwUSv7GXTyYRsoBfQin", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214401EAA3E7408", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "CBD376FFA1853C8F5C2DDF8BD7C17A007169A1A19266F10E348696ABF4DFD83F", "PreviousTxnLgrSeq": 68933255, "Sequence": 67453667, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "51589768393.78238" }, "TakerPays": "294061679" }, "LedgerEntryType": "Offer", "LedgerIndex": "1EFAC278A8443BF03B204C5669600A31F56656282F7D42859A8000D166AD02AB" } }, { "DeletedNode": { "FinalFields": { "Account": "rBnj6UP9thqpSLVq1rEKinhuhmFHmhaC8m", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521239B533B2A000", "BookNode": "0", "Flags": 131072, "OwnerNode": "13", "PreviousTxnID": "E0C3A6903ED1DAA2C17AA9706A7B99A3B4BC1A3B5A2F2C936ED1536C94B3C73F", "PreviousTxnLgrSeq": 69013038, "Sequence": 67351865, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1F1155896FCA3377785F40DBB36D1C97CCBF1910FD05BF7797A8163910691ACE", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "25650000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rJ7kEdYrtovE89yxzJ14DgPYCR58odZYVi", "Balance": "200178747", "Flags": 0, "OwnerCount": 58, "Sequence": 67712450 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1F648AC92319E66AB4D0D26296D1A599ACAA47453B54D462B0B2B64C87DF6B53", "PreviousFields": { "Balance": "165496415", "OwnerCount": 59 }, "PreviousTxnID": "8F3203A157F450A05B1D1655FE4E09A3496B96C5D10C9563102509C87B7920C9", "PreviousTxnLgrSeq": 69057902 } }, { "DeletedNode": { "FinalFields": { "Account": "rJQTrHKExfeCjschk5MGwPZuditZ8vdWnD", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C0C790BBBE1CE", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "02E31B69218F1AB1407F0CEC03A2211A26ADE02959713A4C78E97EA490815ACD", "PreviousTxnLgrSeq": 68915809, "Sequence": 65794635, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1F811C76B96AEB6F02644637934930631CCFAD3A0BDF61DC9B4DC6080B976D8B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "14925373067.5246" }, "TakerPays": "117836020" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rdjYAQLjaChAyFx1sVLn4uy3mrSZy2f24", "Balance": "726741638", "Flags": 0, "OwnerCount": 13, "Sequence": 66163705 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1F9B25892986AA8498C5DB2E32DC72BF80D089FF25B41A8A0700711D4CC71CA2", "PreviousFields": { "OwnerCount": 14 }, "PreviousTxnID": "C0887B0F03DAD920B4FE9A0BCE0BE2017AB18951F2268182CD6AFC1FD14F3DF4", "PreviousTxnLgrSeq": 69049436 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "rEnJLGTTfay1rUmQqsB9PPMrhNo3sFkT5g", "RootIndex": "1FA1048EB9886CF62A2D607A75DF617B301B7D483E11DC52645703D18CD0C64F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "1FA1048EB9886CF62A2D607A75DF617B301B7D483E11DC52645703D18CD0C64F" } }, { "DeletedNode": { "FinalFields": { "Account": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C07E9BFA2DEB8", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "553C23D0D539E8366662E6BC64055F97CBCF29CD2C23D1D7D208BCAB4AD47149", "PreviousTxnLgrSeq": 68900173, "Sequence": 67528326, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1FB02BFD56B3497008148E40A7A335CE1838A4353EB010814CDAD1AAD0F44FE8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7800000000" }, "TakerPays": "61541999" } } }, { "DeletedNode": { "FinalFields": { "Account": "rLaYDDZDLBvzSGxKhxDEKovMrQ3CoDXQV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CB5D0DC89D26", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "355F3DE4D10B011775D56E4A072FD36B28B32D425D5DBFEA5836BD4EC800786C", "PreviousTxnLgrSeq": 68928764, "Sequence": 66614069, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1FB5FAAE0B551C8F4213B629C4CC35C44C037B1A8499B0331272D97761B31B58", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "54338423" } } }, { "DeletedNode": { "FinalFields": { "Account": "rBzk3TdhfdbidCHeKWfmQ5dy9AuAtGbXeY", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521168861D612556", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "9BAEE34021D631EE7FF7825774A33A67EBDCAFF96177FDCC03A1C29551F0DE6F", "PreviousTxnLgrSeq": 68968110, "Sequence": 67686290, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "1FD96549A07DDD635D11553F15A59A214B4F651B828970819D04E6A66552EEF1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4948149965.676937" }, "TakerPays": "24245934" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rE2zUmDvH8vtBsGPBTdLSJW8rDLNVy8g4V", "Balance": "132670391", "Flags": 0, "OwnerCount": 23, "Sequence": 67407795 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2012C65D1B2539CA69359DB61211B5158E40C0CAD3A0BA9F4ABF16D437FB74E4", "PreviousFields": { "Balance": "61805566", "OwnerCount": 24 }, "PreviousTxnID": "ED0D9427327AF4A41060266802D47544E003ABB90E3103F3727BE4EE9E12C7B2", "PreviousTxnLgrSeq": 68946094 } }, { "DeletedNode": { "FinalFields": { "Account": "r9Bq12mZUmUByGGcnu8tvj2KYAcJQ4zbTL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BE977DAAD", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "E318B29740460A2B1A7DD6FF3EAB04324157D50BF72914B035125B8E2820B6B0", "PreviousTxnLgrSeq": 69019282, "Sequence": 67987238, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "201BDC0D7B8A03BE8C3ACC73E23C5AEE14C59F3AA4E1DBA24E77AFB8607DBDF5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8518114231.41891" }, "TakerPays": "25554342" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGtD3bMYvE4snnRuTS2n3CBfSLeUMBpSyM", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652096EB55A2F4B0D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "F1186343C4E0EDD135C610EB81CD4DC9F66A5770082BAE40317A9286A09CB5AA", "PreviousTxnLgrSeq": 69019433, "Sequence": 67428673, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "203AD400560ED551B674B42BB6AB34BF7FCDEA84DAADC1CCCCF2023CE4E60CF7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "14128771526" }, "TakerPays": "37511888" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rA1sVxrZ16rSr1SrxUfsHAR592J2X4yVf", "Balance": "932040653", "Flags": 0, "OwnerCount": 52, "Sequence": 67344730 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "203D6B212658AF0984146E9A9A12A6B03A096F92C66EAF0C6ABBF9FDA6B96DC2", "PreviousFields": { "OwnerCount": 53 }, "PreviousTxnID": "DDA0BDD9AF8D1F85A7505011DBA4D7C40A50B08D462921D501C756DBADDCE31F", "PreviousTxnLgrSeq": 68741952 } }, { "ModifiedNode": { "FinalFields": { "Account": "r9UmfXWeEUHZ9nUzywkmpHorhBLB9uhjpc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26FBC61BA", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "Sequence": 66690404, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "70360051902.12952" }, "TakerPays": "7036005190" }, "LedgerEntryType": "Offer", "LedgerIndex": "20542AC4CAB42D09ECFB776D1A59B82B7EEAFE982D1A73AF72DB60C7B6E6B384", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "88230878382.67041" }, "TakerPays": "8823087838" }, "PreviousTxnID": "C5F9771EC0ED121C13A668957B2689B8F2F042E7F0217CE74CC373C17B127E62", "PreviousTxnLgrSeq": 68178811 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rUs2aUqfDfjTN9HWdhXzRZZJkHm5rGUUdS", "RootIndex": "20BB09FF4F59DC8D6D18A8AD0A68096BF2038D23C4F82505AEE9748D5A69F8B6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "20BB09FF4F59DC8D6D18A8AD0A68096BF2038D23C4F82505AEE9748D5A69F8B6" } }, { "ModifiedNode": { "FinalFields": { "Account": "rpzdffxTgRvMawxbRSs9c26T1FTEjfgznz", "Balance": "674597796", "Flags": 0, "OwnerCount": 265, "Sequence": 67340365 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "20F80D6DE16DA7E2CC163E881D98BB50F5A8ACE1376139B39A787867EEBAE378", "PreviousFields": { "Balance": "569205959", "OwnerCount": 266 }, "PreviousTxnID": "E0B906F8F0136C2FB4C0964571E0046EB038DD92E4F716D1B96DC84F50B5D243", "PreviousTxnLgrSeq": 69063769 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3000000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e98", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3BA8VZ9TV8U5qgd72SX4Ct2iAgQGwcfZ6", "value": "1000000000000000e-1" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "20F93831CAA830D46C90C51D07D44B313437BDF74B9AC0D4BA5467CF9572242D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5000000000" } }, "PreviousTxnID": "5B1D22AC5EFA3009FD8236F7833BF03FBB10438D70DE548DBD8F2F9F864CBEEA", "PreviousTxnLgrSeq": 69009994 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rGgYjYE7aH7sY7uc9BHpks2NDgVkptYkDh", "RootIndex": "97A576D21439D455DE5877D950AD921F9783B7F1F98B39CA0A504AB9CD3C6232" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2107C7AEC5BB7223F87048EDB23A9A6A4C352961DC8EF209D491F2DC96831A93" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r4KDwn1x7ihYbekn13gYAoV9fFnjwFa28R", "RootIndex": "2113BFF4DBD2F72BEBF6389F2E0ABB84FBD7EDDB8DD1C4918EB249716AF17618" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2113BFF4DBD2F72BEBF6389F2E0ABB84FBD7EDDB8DD1C4918EB249716AF17618" } }, { "DeletedNode": { "FinalFields": { "Account": "rGhP8A7jhRj3qkYPUR35bRvLCJyxh7xmGq", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72F0A4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "3FFDCA8F6EEDD7688EFD62074C68995E8BCB57B8E29B93E6343F0AB4A8696852", "PreviousTxnLgrSeq": 68900976, "Sequence": 66928922, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "211BFE58D57153DB29CDFC3236CC5D29D71B06B70881A9AB46DBF3E31B5BE19A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "30000000000" }, "TakerPays": "195000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "rGQaGNPT8u7Wt1RoqJEhBgAPyc9ek5RfCL", "RootIndex": "7F01E74706516AC43C1C1D253E6887968B43326AE119A44CD7F7F2493FA1840C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "213002C4D9C91EA46A6B2F0E9077F8B5AC8ABD768BB910617A19F41F6B7C8584" } }, { "DeletedNode": { "FinalFields": { "Account": "raBj3rXVSVdcA66ge5mMyS1iWzMFSyxmB6", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6B0C5020E93F", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "CFA015DC86218ADB42AB123D69679356615FBC40753D685BBBF3CEFB73D33734", "PreviousTxnLgrSeq": 68901703, "Sequence": 66229726, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "21514145F905595196AFE9F182F93AAFD48612905ABBFA26027C67A29DC94868", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "25900393251.8185" }, "TakerPays": "207177245" } } }, { "DeletedNode": { "FinalFields": { "Account": "r9dgnNCff83iCn4xXUpnLndv4tuCY23b4P", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26AB38C66", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "85A63376BB3F2BE1CB557E66313EFC554A25733070AA1216A8673DA15EEC3D33", "PreviousTxnLgrSeq": 67983367, "Sequence": 67328049, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "77859898" }, "LedgerEntryType": "Offer", "LedgerIndex": "216A60E1C974ED0E69CDDE56C8674A946F686254C400751D3BA9BA2413805F00" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "b", "IndexPrevious": "9", "Owner": "r91eSWyof8C4aiDL2gM1xTdmc9GJy3rTWb", "RootIndex": "53F876712808EBFE41AD321F65DDB7042D17317BF1FA60284C12A510C70484A8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "217C9FFF75D95ACB8A3574279FCC6E9054DBB96C64779AD7BE000650D52A8562" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHNNQAEvRxzWoi2ukxZ371fsjJjxRva3pd", "value": "1000000000000000e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ebb" }, "LedgerEntryType": "RippleState", "LedgerIndex": "21831FD7739747FD7BC4C3D91A9B4104FDB6DB626E172567F44F096BEA9E5798", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2000000000" } }, "PreviousTxnID": "74664E20BFF89820C7ED324B74D04AC4D03E490FFA9AF71DF7B91E69820D6C0C", "PreviousTxnLgrSeq": 69016490 } }, { "DeletedNode": { "FinalFields": { "Account": "rGPEKNaNPYojt4sFbUzodh9SUNxixCwoBC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE76816D8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "5FB2F64D7E90376D1B16365D4BA2A7D5DD83B62FD9CDF99DED46119F7F873BEB", "PreviousTxnLgrSeq": 68899284, "Sequence": 67759693, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "21AE830A858BAEAE7CC3F52B833BBEB4FCB7C481AE9266E652C6E7A6B9B41A7E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "140000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "24271357729.88059" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "d84", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwhKYMZGMmf9zeLdZWq4rs31DQeaxn65R2", "value": "9999999999999990e-1" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "21CA87A36E6A2D83122994227199951934F7C06CC1D3B38F40D204EACB922856", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "37971357729.88059" } }, "PreviousTxnID": "277B29CE8CD51C21EDEF0DF622CB891C481FE62B8C6F6D2C027B07FEE90D8259", "PreviousTxnLgrSeq": 68999038 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rnG1UdmTmDXHaQp1vVp4jsH5ZhJKp97TjH", "RootIndex": "DC17208D789059BB0F2F9959711B0D0CF09EAB60C60B42D97C413BFA5010EA85" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "21CCA9FE71D970C67F22EE9107CE5C44FB0DB793490D9156675FB2D6BA5B2FA4" } }, { "DeletedNode": { "FinalFields": { "Account": "rPfw6T9Nu154bW5Yqyd351rebEphbe3Fhm", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D252161A9790F", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "2FC6B9CFE2309EE69F4C042584734F75723B57B578D1FECBB93B957088D46D3B", "PreviousTxnLgrSeq": 69018804, "Sequence": 67371477, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "220303F74E2F4A42224ECA40E551D50BD6085048F7640B797CFA0C4F702578C4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1052737689222326e-3" }, "TakerPays": "3895129450" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e0b", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9dqJno4U42mpcjAymrrUS11q5rAWazGfP", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "221A6703C5EE2DF8D00824E0324D53AFA6F09A4478428B44C313AD1F44A362A9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "52708748895.93176" } }, "PreviousTxnID": "149752F31AD36FCAB9759917357C376437939341B60BD526646FECD2DF8185D1", "PreviousTxnLgrSeq": 68878412 } }, { "ModifiedNode": { "FinalFields": { "Account": "raWLEhWafGEFDsN2GWTFcmPc79x11j92as", "Balance": "717829115", "Flags": 0, "OwnerCount": 329, "Sequence": 66825490 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "22355CB1593B5F8371A918E737D52FC00E5ADB25BB38657B191DA76279D5B937", "PreviousFields": { "OwnerCount": 330 }, "PreviousTxnID": "28885DFD8BAB24243BC38E0427176959BD34111EF362F01B45AC7158B40C7B5B", "PreviousTxnLgrSeq": 69063617 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "a", "Owner": "rJxQUBBc7qcHrGcjrb265KwXeZrVio5Eri", "RootIndex": "7A92326C2120E27B82D8A465FCDD494708A1307E0F80D93839A3291D4DB2278B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2256460DDA0264BACE893EB194ACB181EDAC9FAAC980FE8A21F1B184D1648D0C" } }, { "DeletedNode": { "FinalFields": { "Account": "rfe2f8LznaFRfwdoiZGPxej6zbdYAYe4Rq", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A388A43C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "C6704763C2CCD8A331CE29653C244B792E3F7FE4B2CFA6097DDB853982D0810A", "PreviousTxnLgrSeq": 69015349, "Sequence": 66686310, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "226EF34E611B81BC3C1A5188C3A9B0905FCBCFCE5FE4969CF7C253E9C905E785", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "550000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r98DGNQEGR9x2bhRVBbuiHAqxq2aDD6pKa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652166B5DCCC05505", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "5FA843247C57F5B8B6337CEAEB4C23DD34008B589E5EDA2C4DF3918A3D3431B5", "PreviousTxnLgrSeq": 68943466, "Sequence": 67202687, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4951685744427229e-4" }, "TakerPays": "3124761338" }, "LedgerEntryType": "Offer", "LedgerIndex": "2274EDB26DA4DDE1256853C1F3243319E28EFF4BAEB33FA54934EF2CFC9FCAE0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8203834320333173e-4" }, "TakerPays": "5177029729" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "21022172638.2" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "318", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsF1oN5xbuJQ3wPD87jjDvEde3VKwSrAue", "value": "1000000000000000e-4" }, "LowNode": "4" }, "LedgerEntryType": "RippleState", "LedgerIndex": "22CAE9D0152D6447918705AB84A667BA749671F8506B52C9D26D7AD42838281F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "46715939196" } }, "PreviousTxnID": "5AD9BB0684FD03207D2D58C2355D4E49409653D72D7F5E539186ACE47255D28B", "PreviousTxnLgrSeq": 68005716 } }, { "DeletedNode": { "FinalFields": { "Account": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082F79CD900000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "09F5C119C383119EF339B905DCE8A6D42874FBFDE5A4A5FA58C228381848D4D6", "PreviousTxnLgrSeq": 69054951, "Sequence": 67440528, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "22F075132AD3FC12E4CEFBEAEA0D627EE379812EA4307FA86579A8FE67299F65", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "230400000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rBBS1EhebBUcDs7gDa4ZuoTfmBwsRGqycY", "RootIndex": "B3F6EBD353C36298281EB4A734AB01C585D6DBEAA1D8FA66E5B3F66F645545E1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "23081AB18979CF365605C89F4D45ECAF1A09A9F3868EFDBEFEB0408492F30001" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rJqAwcpzstjreWoBc7wGXRtWoxSeXTUzf9", "RootIndex": "C7E3DBF1D4EF2F55A08C767A73BD0D4866547EAC0AB554E724F31AA9A8BE1C22" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2330602EE88593C5C80AFD48FAC37E1A651A822FCD89B94C9CAC0773B1E61D98" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1701415593270816e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "de6", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnYFf4DWQj3Eip1R5mVvocQxtcBcvTvRo7", "value": "9999999999999990e-1" }, "LowNode": "a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2395D3DEC3A9E25F94B4CD2B47BAF09F50E9A55EE005B3EE898BCC58E669E4F5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2501415593270816e-4" } }, "PreviousTxnID": "5681245E9E203AE3274E8F9FFA41ACC87101654B550E2AE83A004BCFC0367523", "PreviousTxnLgrSeq": 69000049 } }, { "DeletedNode": { "FinalFields": { "Account": "r33yXJH6HkJc128VKpjvrcdC89M4zDaP9f", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "31C9FBB6C153528AB070425F85C65412620E18838F60E8189E0F1DB8E31F268F", "PreviousTxnLgrSeq": 68898709, "Sequence": 67761592, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "239F95F164783976BDE5F43E1B0CE0442D93639454E745DDD6FACA0310D7B8DD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "60652861" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rjD7dFqNXSEK4juN3ntGwbYn1P3xjepVf", "RootIndex": "3B310A5F77E2506C0F0711092668E84A10CB5ED5E61B6F886D3C83F65DE008B4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "23A06EF5F4AC1BC12BF3ED8411C9F44BB9DCFFCDC431DA2CC76B5122F987C50F" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rMhxYNNMAgwGdSciDqnCb8tVqJZ22VCCL", "RootIndex": "23A7042FFFEB5E5D799813F35CCE4011A4D10DBAA5C03A22D8E9C05EA1C9E601" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "23A7042FFFEB5E5D799813F35CCE4011A4D10DBAA5C03A22D8E9C05EA1C9E601" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "70360051902.12952" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "1e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9UmfXWeEUHZ9nUzywkmpHorhBLB9uhjpc", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "23AEF96D519B25ADD46D46FE5637528E3954BC84AA786E1AFC28AD322A4B1253", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "88230878382.67041" } }, "PreviousTxnID": "76A1E30FF669BD2CD8AFD2DCC1ABE89D4328116CA85E22CA6852A7C8489B0566", "PreviousTxnLgrSeq": 68117921 } }, { "DeletedNode": { "FinalFields": { "Account": "rwFqpfxexbDa1fUuG87ceDdbe1JnugjWUV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530E35FA929C930B", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "20C8EA979F36EF87A916CC728B80F514B2645F7BAD49ED5E95F869A95C1E4F28", "PreviousTxnLgrSeq": 68152620, "Sequence": 66775772, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "23B441085CE429F2D210CACFF030B98B77C2526B2640076168A9D0EDBF9EF9B6", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "311439594" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rENubezZP8CRwDNdupJB2J8D1GxukZ7hjv", "RootIndex": "FDAAA7A62195393D5AD21177C835075AF55B81B163395FE07D23F2766896845F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "23CAC39F4C167685A431EFB332C4CBAC6B1352C6686FE840833CE266ACFECF0B" } }, { "ModifiedNode": { "FinalFields": { "Account": "rKVDELWvNMyoxDQenRjpToSvsLL7RwR62h", "Balance": "36674391", "Flags": 0, "OwnerCount": 5, "Sequence": 68633127 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2411698F2C1906FDB08B568905A601A7A6A6341F4EC1ABA3ADF10CC29AE125A2", "PreviousFields": { "Balance": "36599604", "OwnerCount": 6 }, "PreviousTxnID": "8E2C83F5F98179CA712548909AFC733AFEC622A757083D0CFA036F8C418458D6", "PreviousTxnLgrSeq": 69015670 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "93288847549.8484" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e75", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rp9kJTnnfXrjwVFxGRWfjUbJdmxkGP4cif", "value": "9999999999999000e-3" }, "LowNode": "4" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2479F46EE5E081EAAD1F009667C84B94EDE0DCE20197ECA157D356327F8DF797", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2500000002327955e-4" } }, "PreviousTxnID": "3383089ECC13A35204D62969EC7518EBC065646542A5041B4C8BF58C4A739BE1", "PreviousTxnLgrSeq": 69034815 } }, { "DeletedNode": { "FinalFields": { "Account": "raWLEhWafGEFDsN2GWTFcmPc79x11j92as", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521CC6E8361B3181", "BookNode": "0", "Flags": 131072, "OwnerNode": "10", "PreviousTxnID": "5DFC897676597741F6964108867935D9A5189E740F25171DB2B1B39D365F46F7", "PreviousTxnLgrSeq": 68199860, "Sequence": 66824794, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "62287918963" }, "TakerPays": "504532143" }, "LedgerEntryType": "Offer", "LedgerIndex": "24C3BF511AECC11CEC65C609E9C816E83D9A4F05C406147EB1DC9781555C1A07" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e70", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rh2ExLW6MJMJdoX7386pzfkNbhHSjqVWtC", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "24CB7E518452547AABAE37643501B1B0D5FE8CB2B7AD1263F935179C4158E85A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "21000000128.28504" } }, "PreviousTxnID": "D38AF4801A76F29A2932D6C143E27494BED7645D77D4C0827D81C873E6E4CC95", "PreviousTxnLgrSeq": 68633549 } }, { "DeletedNode": { "FinalFields": { "Account": "rK3ctAQ3dxZmdQZ7JJt2PZBU7GZPwAkK1P", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4D6AE4CB", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "259F1AE7686B6A6674E8B9A2F5CF5954277604DFB6089FC43F184A7DF4933D85", "PreviousTxnLgrSeq": 68915033, "Sequence": 67101499, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "25292B3277D5BF53030B60A594007A30054229111EAFC6C55FF9D16A988F1307", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15571979802" }, "TakerPays": "104332264" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rwsVYq1xyweADXhtBLLfr2X9FL57DnGTk3", "RootIndex": "252DEB1A1BEAE012386BAA026026C4B05220FDE1161D1D7715C78D80B1EC77B3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "252DEB1A1BEAE012386BAA026026C4B05220FDE1161D1D7715C78D80B1EC77B3" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rLkaQPNxjeDmFBqhQ2GszmgT4wxykPCP5K", "RootIndex": "5B7EA164867C8884CBC9759820ED1BB7DD3E72985A9C8EC92B75B9132C6A7B6F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2552C6166706B60B262D31BB58B5D6FB1957F438239A99F02926B9CE84A12501" } }, { "ModifiedNode": { "FinalFields": { "Account": "rGtD3bMYvE4snnRuTS2n3CBfSLeUMBpSyM", "Balance": "144388070", "Flags": 0, "OwnerCount": 14, "Sequence": 67428708 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "257E20958695ECBE04642E455D58A416E990E0197F9F9875C1F349CB85131B53", "PreviousFields": { "Balance": "106876182", "OwnerCount": 15 }, "PreviousTxnID": "E3F43F07AD69032914ABF169395FBC5615466324A8C7E89021EBF7424D5D9FEF", "PreviousTxnLgrSeq": 69062556 } }, { "ModifiedNode": { "FinalFields": { "Account": "rKso7KmktCCYBfe79sNAFnfKffvansBBRz", "Balance": "780387977", "Flags": 0, "OwnerCount": 187, "Sequence": 67328616 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "25A5E744BD7DF95F174696A0E29964C2D9919C7547783F404C76B770873FBC6A", "PreviousFields": { "Balance": "480387977", "OwnerCount": 191 }, "PreviousTxnID": "0E8D46F16F7AB53C1F9E49396C027C1C083A41F65DD4CD76ACB31356AA3194CE", "PreviousTxnLgrSeq": 69063224 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rPBCCKXYaB9eBeVKenvGeGKywHUVHFQmSS", "RootIndex": "C5871FAAA3D662ABE72DF923E70F1B30B4F0582F0F1F6374B7BC42CEFFABD22A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "25AE6C5D3394079D8E8021F4C33905248EA574B78C04CAD8E7B59D00EC51F596" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "70000000000.5145" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e8e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3yLxRMK4K5z8UzzYC9tQASyFZ7p6EQDwz", "value": "9999610698224570e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "25F554F7441B712F3CD34C55F9853CD10EA32A8BE33330C64C73C5B3B54C1583", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2900000000005145e-4" } }, "PreviousTxnID": "48C140CC2CA353858C4C311A5D146514E8F131DD62F00433B7F510EFA6DD7D2D", "PreviousTxnLgrSeq": 69044256 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "ee7", "IndexPrevious": "ee5", "Owner": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "RootIndex": "21631664938D4CC6734C2E4172D601193743662C234F1CDDC89B7502A0B62C68" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "26016DE6CF1ACFCC0EBD508CC7C3FB404C3B3ABC7C4BCBA5233A349780D74439" } }, { "DeletedNode": { "FinalFields": { "Account": "rNNzeaYd4nSmhTirshmVBdK1zfHApVy7Hy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3888E0ECCC", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "C14F090175900E0371FA068CFC8BF422D4F398D74A993CA2915B1DAD7362F2AA", "PreviousTxnLgrSeq": 68942432, "Sequence": 67492521, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15000717154.33161" }, "TakerPays": "82503944" }, "LedgerEntryType": "Offer", "LedgerIndex": "2605B6CF1EBC7ACDBA20AD52BEDD3F609413EB20CDC373E24F41789A6548AC4F" } }, { "ModifiedNode": { "FinalFields": { "Account": "rfJYknVqAa2EmEKkKsR2CjJVBKedFU9DNZ", "Balance": "1575120860", "Flags": 0, "OwnerCount": 39, "Sequence": 65823004 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2608DA4EFDC2D0C82173CAD63F83D782685345B586B1AB168DFB609723D2B26F", "PreviousFields": { "Balance": "1107961469", "OwnerCount": 40 }, "PreviousTxnID": "0D6A7E9CF6539057446CAAAEB1811AAD97AFD04279B517FD83F3355F241F31A7", "PreviousTxnLgrSeq": 69047917 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e84", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfTkTBbkD6NFaNLprSDfnC3CJEtNwgqYwy", "value": "9999610698224564e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2609AF69C26128D738F60B75F3444B42E3EE8DCA705B6F0841276D6A92A04931", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "20188409096.34552" } }, "PreviousTxnID": "36DAE2626D68C0420659901BB069D4BC875305DE83A499A275C8AC0DBD65C833", "PreviousTxnLgrSeq": 68898367 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rQKYm7pcdeXMPEgGTRUAAuoziWwhhW3DC2", "RootIndex": "43CD72508A29365217D82C64770360A5A7EF5D73235637EA39360BBC99FFADCF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2621C83F3178A230D4BD2F5874D37A55B79BFA574233D7408B34430A7F993017" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rpBHrwSGdQm3hE3f6988mSgV9LAzuBsx9A", "RootIndex": "0963FCEE10CDDADE279639F4A6B9CBF350D2FF4DEE0BE1A3FDDD4EBA33E279E8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2625525A0FF17FE2CB9AE08418DC1DF86089D5AA5DFE08DD45A34D24BE1A8F23" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ec7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raANwNJ9aqncwhGT1Eh9mksqTvAMm3WZG3", "value": "9999610698104599e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2648819C6BEF4FF12F48663826D717ACF7FAAE43E919BF3ED96F1F32D01D6E74", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4500000000" } }, "PreviousTxnID": "17EEA99EF212BDA2A59F02E22D63EE95BD21430EFF033DFEE530994E5A9092B3", "PreviousTxnLgrSeq": 68872215 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDWTpV5omq7rh5Wnro4noWmWFEFcRx17ma", "Balance": "399761714", "Flags": 0, "OwnerCount": 22, "Sequence": 68039701 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2658AB780CF7DD69DAC2D903928947353BC057D30DDCBB12B2AD6B1A95DFF9AD", "PreviousFields": { "Balance": "135373146", "OwnerCount": 23 }, "PreviousTxnID": "F0AFC95BE0356DEA4FFB536D9DC986DAE496D4D6646A93857E51C0F50889C3D2", "PreviousTxnLgrSeq": 69060223 } }, { "DeletedNode": { "FinalFields": { "Account": "rhASEa6rnfc5WHFbd2ZdExhwyfBu27pitp", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "994EB136D861D0CD5E6EB0BBEBEA1D90693F2E52B7F7A828E396B0E4DB70369B", "PreviousTxnLgrSeq": 69048862, "Sequence": 67430937, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2659D3EDECDEBBA318041413BD7849E75A2797BB172E42BF693F57A376B8E1D0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2225000000" }, "TakerPays": "11125000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "Balance": "38645586617", "Flags": 0, "MessageKey": "020000000000000000000000004C72BFC9C19A94868D26BAD1567078C708DF8888", "OwnerCount": 377, "Sequence": 2015 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "26A8898D814259251A332134B9F84B57E5174DDC3221547067BED9AA55C8CA4B", "PreviousFields": { "Balance": "2645586617", "OwnerCount": 384 }, "PreviousTxnID": "A14D0A8AE79A1C01438C21136603535AA8C25F57926C3097FA75362BC65F4AE0", "PreviousTxnLgrSeq": 69059646 } }, { "DeletedNode": { "FinalFields": { "Account": "rBE6UN87gwvyAuud7dSn2d6zdBUWCjgqRG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521DFC22A1E78000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "D3FA9F052F9A7E50E297D0E52AD2B6E7F053CDE8F30233A59F67C199DFDA8C3E", "PreviousTxnLgrSeq": 68901785, "Sequence": 67882079, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "26AC27CD1C02571C1E3883A918BE447E7CE2DA57120945270AF39F4A9E1E779D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "27951950000" }, "TakerPays": "235914458" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9223344420.93548" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGEVM6YhWfikBZiXgWRdcUk7XpAyAnUHZw", "value": "1000000000000000e-1" }, "HighNode": "5", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ea2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "26B16ACAA4EEF1ED67057331BAC817E02A9DD64A15A155B0A56E02419921111B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-13345587741.93548" } }, "PreviousTxnID": "203AFDFD5E0BEBA65E6C7D03037AE3D3DCDEA4455709C752BFBC2E5A20AD9A06", "PreviousTxnLgrSeq": 69049470 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "884", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r36sopaDwMDWZS4XNkCM27TNVkdywisWY4", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "26B559FAB7D30EFFE1CB70D26859D40F1CE9ECEAF68EDA2DE959EFF9F5E599E3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "85645888526" } }, "PreviousTxnID": "D50405B61E4B332185CB559B4D036D87A4C6262A9B7B4D3CC4BB892911EE5390", "PreviousTxnLgrSeq": 68794962 } }, { "DeletedNode": { "FinalFields": { "Account": "rHQELpjMXco8drUJVmfUq89kCZbDdWBr3A", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218AD59A69C2000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "D519192488D5942B332D6EC0FF7F52020DA347762821C57AFA845EE7290D9631", "PreviousTxnLgrSeq": 68900006, "Sequence": 67416808, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "26BB45746F8856EC3FBC16EF55EBB58428A946BC3D24FC6622B2375802D5B7B3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000" }, "TakerPays": "13892000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r9vQtUmSgHmDFpc6K7BKLj5JvGBEbvwP9Q", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F04E2021E", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "1C64EE7C01D76CDE52971D42CA14CCF409729927FB8A4179913BB1BD7F23A6A1", "PreviousTxnLgrSeq": 68899243, "Sequence": 67374023, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "26C0870AFC229519A54C281E690C4C792CD70202DB56535B05C68B1FD0A40B1E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "40051845672.48726" }, "TakerPays": "312404396" } } }, { "DeletedNode": { "FinalFields": { "Account": "rUrv5jwSUrmeGJa5Uj6DB3mBGojLFsRg7L", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304625103A6F78E", "BookNode": "0", "Flags": 131072, "OwnerNode": "12", "PreviousTxnID": "F45720AE21C4ED7BC3C306A18675D00256DAA1975EC5C630DB0EB92FC6390175", "PreviousTxnLgrSeq": 69051376, "Sequence": 66532153, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "26E530C4792D7E44EBC1FF9A03933765504C2DEB24E244AA0D235A91A973832D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1919157614683850e-3" }, "TakerPays": "23682404965" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rpFYhEoT7AeTuaAZYwU25Gjn3i2VygsMnP", "Balance": "268000000", "Flags": 0, "OwnerCount": 102, "Sequence": 67371922 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "26FBFF4686D5B358E3246D850FF8DC53C0EED54C5AE361291FD5EDC6162AEE99", "PreviousFields": { "Balance": "218000000", "OwnerCount": 103 }, "PreviousTxnID": "96EA1450140558153915443528B63537B0CD1B86763F2BD0E3EA18AFF67E9E8E", "PreviousTxnLgrSeq": 69054481 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "r3NPSAnK3n8wx7pdeCje64yvei4xLBrgd", "RootIndex": "2703769F01574F9679F0607476A79F30CD013D2BE5476B2B99745284B6D996C7" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2703769F01574F9679F0607476A79F30CD013D2BE5476B2B99745284B6D996C7" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMQGzm5niy3VzeWEqokwb28toV137fbiYJ", "value": "9999922137971320e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "dbe" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2721148850AD777A7D1C8B8EAA4BCF611FF265218BE84F2CF0F822373CD8D872", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9316406834.806797" } }, "PreviousTxnID": "2C9A60217C753BE6F8BE2F5745931B80D0A62E88CC2B88B765125971E37A5FE5", "PreviousTxnLgrSeq": 68897459 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "47372755454.80939" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a5d", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rxAPteBXbVsr6qvwqA54qERcdkojkjdmC", "value": "1000000000000000e-4" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "276ADDC1E2826C8C3FDD232678DEED600A0E91A375657E8D2DC0032DA6B40D17", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "67372755454.80939" } }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "d1", "Owner": "rExSJvWnn93G5NfnzZ3YKuPgpQnr8wBsrE", "RootIndex": "D981BA49AC1C7F251814582EC50FF0706B329412FF323379321FC9FA4657E836" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "276EA0610087B36C3D6CC79BC1DC6F1E0070E0AA77E29A6F47D8CE8D5EADBD20" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "12", "IndexPrevious": "10", "Owner": "raKckiVpb6sE7hq7y1VGpF9YdGAVSbJJLu", "RootIndex": "C664ADC4725AFCC1EDF164434D29C14FAF0DCC4764916ABAC8828F8918BFA17F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "27725CDBDFC98E0127D8F11F0E597A559D270EFB339B911E1EC03423C70BEC50" } }, { "ModifiedNode": { "FinalFields": { "Account": "rBHSrXq2LzGniUp4zypCRk1isLw1ywLPHv", "Balance": "27809718651", "Flags": 0, "OwnerCount": 7, "Sequence": 68976418 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "27935817A68BC6D4AB013E255D1896AA2A7A77734BE9A896484B8A45F1179A8D", "PreviousFields": { "Balance": "134718651", "OwnerCount": 11 }, "PreviousTxnID": "242CD55427BF531C2721635F236B13C8D295664C8890E1E20427B71FE1353246", "PreviousTxnLgrSeq": 68998561 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJd8ipxtKA6u9iXpvCJYQrsES2Q4FsySHR", "Balance": "88368906", "Flags": 0, "OwnerCount": 22, "Sequence": 68739610 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "27CE1342A600FC2183F6870845FAA28517A78A5B1CDD52DC2142958D1334D8CE", "PreviousFields": { "Balance": "56368906", "OwnerCount": 23 }, "PreviousTxnID": "821BA9E33BCA17910B8A5BCFE292E411180D468D8EEA325B0B5581EDCBEFEC8A", "PreviousTxnLgrSeq": 69046062 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1187859898660000e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMRX7LEEzj9s3Hm3fysfBXnkNzAaRbDawT", "value": "1000000000000000" }, "HighNode": "6", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "5bf" }, "LedgerEntryType": "RippleState", "LedgerIndex": "27D3C31049E45B52D0867E9C86C8F5D56830E49049EE6E31AB719331273747EC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1287859898660000e-4" } }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "raZJeAMN8WHNBRrVCc5RXYfD7mAuKctiwE", "RootIndex": "6532EE3BDD8C440E04066C79B503CADF8E836685E8F7B98B907C47500F9841AC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "27E01FFD5AF4DB2D5A9A27D58B710ADE9637B812EC1B611056C627B2F9748E73" } }, { "ModifiedNode": { "FinalFields": { "Account": "ra4q61eeGoZx4cAJKPHQdyukvugrB2jhgW", "Balance": "18277239", "Flags": 0, "OwnerCount": 2, "Sequence": 68759781 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "27EBC60053D366042F7603D7A970B2009FB2866A43527EC618D05CC7A78A133D", "PreviousFields": { "Balance": "17959372", "OwnerCount": 3 }, "PreviousTxnID": "B3C8DA1903D7796F6952252A120299058DC4A1CE9E7105657A7DAE0DE3805E43", "PreviousTxnLgrSeq": 68981171 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHyR27TRJ73Eu8bqe5wBxX64hJ9Xf2c5XQ", "Balance": "276296308", "Flags": 0, "OwnerCount": 40, "Sequence": 68895671 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "27ECD3E477998CAA7A2CFFA073CE12A57A2EC754DACDC13ACD3F726EA576D1BB", "PreviousFields": { "Balance": "166296309", "OwnerCount": 41 }, "PreviousTxnID": "A1A42F0DCA18CE78BE8CBA904E4B99514A38E1DC984C0AE74B07A09D54806A94", "PreviousTxnLgrSeq": 69060028 } }, { "DeletedNode": { "FinalFields": { "Account": "rwJrcmU1fHLmHgWcKC1D4bZQNkUGJs165m", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521F9E80B451ED76", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "57564CF96225E27069DBD85717B476991BCBF8E1BF0AB2D701935FA35F4C68BF", "PreviousTxnLgrSeq": 68868297, "Sequence": 66648096, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "69295309" }, "LedgerEntryType": "Offer", "LedgerIndex": "27EE732CEE031AB9592AFF0F765763EFC78F6078B0F5311A3D79537847E6257B" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r87fNs5eU59kPhMXgYHVziF6Q5icW4WHW", "RootIndex": "281B896F3DEA2AFCB3D804F94F8B12F36DFD023CD84CC13A21040C0BA2070F09" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "281B896F3DEA2AFCB3D804F94F8B12F36DFD023CD84CC13A21040C0BA2070F09" } }, { "DeletedNode": { "FinalFields": { "Account": "rBHSrXq2LzGniUp4zypCRk1isLw1ywLPHv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "199D3BBB23E73F015D1C4560B4A19DCF5548E3D756F38F16B9CB8AA410396604", "PreviousTxnLgrSeq": 68998238, "Sequence": 68976408, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2833DFE4CFEB9A43292611AD2C27C861EA6243839563448965FCCAEDE9C29B2C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2500000000000000e-4" }, "TakerPays": "2000000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rfn3KpY6HS6aE1vviRjhHfNn3BfuSrhmzv", "Balance": "71559160", "Flags": 0, "OwnerCount": 9, "Sequence": 68449368 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2835B3956AC9E8B85C2281A0EA921722E898F363AD4ED2B7337FCFBFFA9E3384", "PreviousFields": { "Balance": "44103157", "OwnerCount": 10 }, "PreviousTxnID": "99BFD48B77283E8C0FDFDD597F87F07EDEB4AC883C75469CB8A23DB9B165E5A7", "PreviousTxnLgrSeq": 69050455 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rNVK54FFqQPyc5jFNayw1WrW2m54SRAMWv", "RootIndex": "9E1557F1ABDEDF78D8A81A0E0D87E8974EB4F1D3CD2A37D606DA2EC271A83C2C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "283CFDDA3C9401C7AE85D93CF4F6E671AB5BCDE802463FCDE679443D5D158142" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rMAWeQvUd5zQpyY9hSdaUMRMTQHcgAXvj5", "RootIndex": "DF574BF4AF4B10F42E5F385FF14CFF59A61AA0C75C1EE688668E5A49AB2836D6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "289B627B35964B46F2C4D8C3B542D3D9783EDCC93D9AFEB34C1473AA03B56957" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rnB62vv6d8dQV13A3nHQQ7LEGy8DEWkLuG", "RootIndex": "CABB5C6F0F0DFD993B47105A363276F87CC9E63DFAEB06D01FF2B1C2E237CD0F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "28BB070FA902B21BBD45060DF79EE6E02418BEF25303162461DF9AE0EEF88C89" } }, { "DeletedNode": { "FinalFields": { "Account": "rLC5cTyVFPDTN4nuTcM9F2MAzhbkS7a78Q", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "20338B3EBA8302188BB1D078BD7D9FA3ED4ACDFA3DB43E9382C1FBC997C82EF2", "PreviousTxnLgrSeq": 68898394, "Sequence": 67761537, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "28ED6AF797986BEA1E96EFD03E7EE52F6C520FCFA12F55BC7C1948F7B8E7B3F4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "60652861" } } }, { "DeletedNode": { "FinalFields": { "Account": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304879B1216B000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "B3013F07118AFA88E47774F30AC064BB5D3C1C08AAE6AF34C06D188CEB8D5BCF", "PreviousTxnLgrSeq": 68889001, "Sequence": 67528317, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2934CC65BA5DB855C31E6C03A4223E89683FBDD99DC295218FFF7E53EAE2898E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7800000000" }, "TakerPays": "99450000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rHAYfZTYakQQ5NJCP8BD21nrQeQmDyst5a", "Balance": "438222345", "Flags": 0, "OwnerCount": 113, "Sequence": 66939998 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "295684EC1191BC986E034EAF5F6CD80BCB97B78B6EF29EC17A555FF0D33E917F", "PreviousFields": { "Balance": "238222346", "OwnerCount": 114 }, "PreviousTxnID": "AF08C551478F6C2D594388D4C0D4394D7B56C5B7BEF7284EFA50862188A65EA0", "PreviousTxnLgrSeq": 69028532 } }, { "ModifiedNode": { "FinalFields": { "Account": "rzNhpkxVUc86h9CJyB1qssHYenzkVpyn7", "Balance": "351979290", "Flags": 0, "OwnerCount": 59, "Sequence": 66818389 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "295DED70A140326C7045354A716BC2AAF6373A6870669CDDB2B7D7FA332CA163", "PreviousFields": { "Balance": "219979291", "OwnerCount": 61 }, "PreviousTxnID": "9FD4675F9FDC4098F449CD01A8658EB76F6F312BED860199E3452601E8599098", "PreviousTxnLgrSeq": 69063398 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDjnNyWymW4pUzukDcEtmySixuXR4RLsKV", "Balance": "133140574", "Flags": 0, "OwnerCount": 44, "Sequence": 67708022 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "29B0BB1C91B59D76FEDCAF704A2E76236C9FC674836EA77A96A8A3462EC74D12", "PreviousFields": { "OwnerCount": 45 }, "PreviousTxnID": "EDB955273533F7A539AC11A1B11E520AC2B7745592161B2DE0B618C12425DA21", "PreviousTxnLgrSeq": 69018269 } }, { "DeletedNode": { "FinalFields": { "Account": "rGQaGNPT8u7Wt1RoqJEhBgAPyc9ek5RfCL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520775F05A074000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "BDB8B6155CA0720553E3723134CC1A88C0F2DFE8F9D0FB6989711A3B42A45845", "PreviousTxnLgrSeq": 69053340, "Sequence": 65975096, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2A65FBF06799E24E5A1A82AE4A3CFF3411C609F117B28B79303839FEC6C89EAC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "21000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1000000000000000e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "d0e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwCDD5H9MDWdQE4y15hzipJWXjZpoZWPgL", "value": "1000000000000000e-1" }, "LowNode": "4" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2A8498F88030EB5F98C104210A925448C4AE5CD9C9E52788C44CBEE559CDC7F3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2000000000000003e-4" } }, "PreviousTxnID": "EFB15A64951D16E6E2FFFBB7AD70FB36A546F3F08C72B9B55FEC84E985F495A7", "PreviousTxnLgrSeq": 68878357 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rfh8snfXUdwqc25vUfwxJxJnVM1n1dJvoh", "RootIndex": "CE1ED6CA4B62FD462ABD4857F454A2159B022F143AE65E805D818C117F7D1670" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2A908EF7C95D71DFD33E5121BBDDCD3108F75F2D412CE8D8F638C3C6B825298F" } }, { "DeletedNode": { "FinalFields": { "Account": "rUqaUzkL9NU9wp7BReWWPJQddAErF45hkE", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F4B69DB", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "EC738CAC268337C0CA7FA4C390E2C03CD14334571F1DBAA51601B78080675651", "PreviousTxnLgrSeq": 68264874, "Sequence": 67136325, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "778598986" }, "LedgerEntryType": "Offer", "LedgerIndex": "2ABDF03CBDFAD71E9CAC64D052C580BB01A4FEA187822A37DA072BA3BC46074F" } }, { "DeletedNode": { "FinalFields": { "Account": "rH5oQKTQ5VaFHC8MFN912377XMG5EH3vTB", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CA4247F9", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "A09868E91C151464FA7974616AAC0C94B338AD540548CE37CF32E27FF2D6BB41", "PreviousTxnLgrSeq": 68948371, "Sequence": 59805856, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2AC5617C9953A48E2868D9588612002E40355C64344D023E1AD0448F1CD84847", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "700739087" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r4KDwn1x7ihYbekn13gYAoV9fFnjwFa28R", "Balance": "33358676840", "Flags": 0, "OwnerCount": 22, "Sequence": 61086238 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B0DC79C9EBE1CACB5E5ED776D73D2ED2BE02C938556F5E161783DCC63F99E48", "PreviousFields": { "Balance": "74134763", "OwnerCount": 23 }, "PreviousTxnID": "13C33504BEA155191D964DF9112CD8162D85FAF4AB38DE63E1365A0981D1D087", "PreviousTxnLgrSeq": 69040742 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3mZ69KGMSXXfdFe2xxeNvSkA98mQQ52aF", "Balance": "1588203395", "Flags": 0, "OwnerCount": 134, "Sequence": 67138998 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B1BE194F04C2B6CF5C6A19121AA275887F38C4B4B7B4E78BC8910F3F8ECC95B", "PreviousFields": { "Balance": "776962495", "OwnerCount": 136 }, "PreviousTxnID": "6942C90E200D896734DE6BFF324C0DB64774CABEC7FBDB31081CD556CB07A611", "PreviousTxnLgrSeq": 69063914 } }, { "DeletedNode": { "FinalFields": { "Account": "raA94X4CEVD8GVTSQWjafELaah67aqrvjG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214ECEC7DBA2000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "06845EF291A015B98CBA8F169B6ADA49C9426DB716DE3C089127EEABCF99F967", "PreviousTxnLgrSeq": 68922999, "Sequence": 67107686, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2B1C22EA132D85ABC7C29CCE118A206964017A16A4E797767F963415CEEB7A49", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "58900000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rPvqZW8q9bpYrAKjGhtL7AZAq8bvqEQDuq", "Balance": "433587552", "Flags": 0, "OwnerCount": 164, "Sequence": 66726811 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B2D3230A0ED38E338663779825D602684627EEB62D4B4351FB9BDD1E129FF33", "PreviousFields": { "Balance": "393038560", "OwnerCount": 165 }, "PreviousTxnID": "83847C961BE852656E1E21D167E712830BD8988F1CFB54650C8DA231EEC5EAB5", "PreviousTxnLgrSeq": 69063297 } }, { "DeletedNode": { "FinalFields": { "Account": "rpCmDBk3dADpY9cb77D1hA4NHYnn7YbJM1", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530500FA7BE8B448", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "435BD0B34F1386288BE68678E591C355CDAED0A70A27D91F373885801A09AA4C", "PreviousTxnLgrSeq": 68827775, "Sequence": 67930071, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2B3662310EBE83CA0DBFDACC92C464E56458996C98DB1942B0EA1ED4B8D82045", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2130000000000000e-4" }, "TakerPays": "3000000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r4VjGvXZQwpAy5iqMCt6kbSbFb7Bi8RYEG", "RootIndex": "AC4237EFB432D594C12215F48B2A648F4C6EB9EDCFED17C73C167A59F06052E2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2B58062CA93BCDCA289246A380603B77112F6B10FE55B2DB705524E805D06D3B" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDsyrKqgbAuWUu1fmJx84Vgm3X4H53rztM", "RootIndex": "2BAE8B017DE80F82BB24E22038520FE054AF25FD4DEB044E2B5846EA5522B406" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2BAE8B017DE80F82BB24E22038520FE054AF25FD4DEB044E2B5846EA5522B406" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1.527841" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPDEk87BWPzJVDg22rmwGBu7gxKdkQrJEc", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "600" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2BD2095845250E37D28D5EE4039C9DE2AC06805A0C4C4CC8E767E8A60FE25271", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "F599016CB6F2425F3CC644B9099B22A365883D799C825F8A8AEFAABDE693C2A1", "PreviousTxnLgrSeq": 67999867 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "a", "Owner": "ra76UpbMwxu2GePpQeV7dogXZUxvn8upup", "RootIndex": "47E05475890E16A1F86C2F822BC976DFE15A295681A17C2269C5BB93E955676B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2BDA2C48CD5A6D8635164142F2596F29DF8D270CE919D977F5BB7593AE8A0F28" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rGFCR192crZ5FBYgZPMAZCeBzTrkqeFXqh", "RootIndex": "2BE7105FAD8D982344635BFDD4597EAB7A60C1CBA7EF880B63A963BF19506C4E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2BE7105FAD8D982344635BFDD4597EAB7A60C1CBA7EF880B63A963BF19506C4E" } }, { "ModifiedNode": { "FinalFields": { "Account": "rh2ExLW6MJMJdoX7386pzfkNbhHSjqVWtC", "Balance": "173694894", "Flags": 0, "OwnerCount": 10, "Sequence": 68087684 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2C0DA53B53916B260A10C537EAD63ECEE8E927380D846EE59BA6DB71AF7D9200", "PreviousFields": { "Balance": "32994894", "OwnerCount": 11 }, "PreviousTxnID": "8A4C572BAC84A91ED8F4922E55A1E86EAA0308713FAAEBEDC2C2CAAFE387792C", "PreviousTxnLgrSeq": 69020687 } }, { "DeletedNode": { "FinalFields": { "Account": "rLV3c2Bymn4fq7kyrqysEd1ddizDxvwS1m", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "953E523933B6B488FF4D3C7F751DEDF2BD01C46B1FB9356F705399FE8A393D75", "PreviousTxnLgrSeq": 68899404, "Sequence": 67840001, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2C1518CF38FEC4D5EDBB797FE678147813DDF6A48FC994AD1ADB5C2DC3C1C3CF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4000000000" }, "TakerPays": "24000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rnhd3RdnLUZY4sYxS2p5zTJk24zHB7VyUo", "Balance": "27726032", "Flags": 0, "OwnerCount": 4, "Sequence": 67654186 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2C37E8B65A7D10B63A49119287CCDB01E3FE622D0F2A0D09E38824D9D38A36A2", "PreviousFields": { "Balance": "20974446", "OwnerCount": 5 }, "PreviousTxnID": "387B6506959224B09CE7CEB4421CC335F242E07C18A25A5B87CA04BD48F32189", "PreviousTxnLgrSeq": 69044815 } }, { "DeletedNode": { "FinalFields": { "Account": "rqben5VgPyij1hAY4bi4yPyp3vf6GgY3z", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE767B78B070", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "2D93E86E695E066B16342E5DE5C0D1DCD0FF436013E24DAEAF976D633FDEF1BA", "PreviousTxnLgrSeq": 68966854, "Sequence": 67935101, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2C4717CB0979873209DD2334977C725D2714122F9AFBF9FEF88E29F24D067056", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9999999999.9" }, "TakerPays": "69999999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rJd8ipxtKA6u9iXpvCJYQrsES2Q4FsySHR", "RootIndex": "2C4E28FA354BCBE5F7312E9D40068C95EC1249AAB58548E806015CD4B40B05F9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2C4E28FA354BCBE5F7312E9D40068C95EC1249AAB58548E806015CD4B40B05F9" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "raqKMtQVnQPuQpPLBoeyPbjYHSokvu1R1z", "RootIndex": "EF52A1E1AF43D94286ECACF8C1A0DD001AD1B2E07D095C441565CF93BD1AD677" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2C5575D638837ADE7B895846901C3DADC5155B356145EBDFE3CBE77F0721782F" } }, { "DeletedNode": { "FinalFields": { "Account": "rJNmHPHrMr649at3SBHakJ38mRAQZA9pvs", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653063B9AD03CCE98", "BookNode": "0", "Expiration": 724074927, "Flags": 0, "OwnerNode": "8", "PreviousTxnID": "B4479D907D1109FEA4B7F1308C300AABD4932BE7A3CFB992B579FF1538AFEC67", "PreviousTxnLgrSeq": 68267446, "Sequence": 66004276, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2C7AABC2B23E48161E4A86885DAE9778880D900404058B91A680EEDD6609D41B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1140000000" }, "TakerPays": "20000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "147898568" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e30", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUyceekfg9mU133ecSKptNTpj4nYnFMi58", "value": "1000000000000000e-1" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2C7BE253B94D0A5472EA96B1E5C8C4F95A4F685FABD53833A6EA6F6F1452AE15", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1147898568" } }, "PreviousTxnID": "2806A5A8C0C6B54FEBFC6300F00CF2D16A695C5CF4B6E3C90EB36D4DDF1CBAD0", "PreviousTxnLgrSeq": 68899592 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJ5v25nqLv1P2Fij67kW1QE6iWqthP89v9", "Balance": "515123993", "Flags": 0, "OwnerCount": 151, "Sequence": 66614797 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2C8ADA64551A5C7DA0E56E5FEC43B629D82BCD8D65F3673AD8D026D7A00F8F3A", "PreviousFields": { "Balance": "424027912", "OwnerCount": 152 }, "PreviousTxnID": "37CE68BF30231A977D7FA6A537956F4DDD5D9F63375834E60D85CEECB05C6DAC", "PreviousTxnLgrSeq": 69064028 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDWTpV5omq7rh5Wnro4noWmWFEFcRx17ma", "RootIndex": "2C996C9E04E4747F70F3D2D873D609EB63BA67789A2FB6A67AD250E74B833B23" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2C996C9E04E4747F70F3D2D873D609EB63BA67789A2FB6A67AD250E74B833B23" } }, { "ModifiedNode": { "FinalFields": { "Account": "r35RUZ6PjS9JT6pHG6298ES1abD9uv43D4", "Balance": "1077953061", "Flags": 0, "OwnerCount": 37, "Sequence": 67194424 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2CA3DAD91C732D4EBFB6B02578876779411053D7B2E5B25DFC406F3EE7C9005B", "PreviousFields": { "Balance": "1022953061", "OwnerCount": 38 }, "PreviousTxnID": "D4D0852ED4D8E2CFE9A3BFE5895C24B95195F91175D869EE75B0F5F6168942F3", "PreviousTxnLgrSeq": 69045862 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3PWgfzUbXKYDoLD6p49JqiabjfQCj14AZ", "Balance": "2005485429", "Flags": 0, "OwnerCount": 616, "Sequence": 65987229 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2CB344B13C83D8E8A9E5352203B1BE37E8F929F8378CD19307E1C7D0261AC23F", "PreviousFields": { "Balance": "1886037420", "OwnerCount": 617 }, "PreviousTxnID": "FC829BF0D448BD3442BDE680A4E188D94DD957D9795DA95E746187F197320B72", "PreviousTxnLgrSeq": 69059958 } }, { "DeletedNode": { "FinalFields": { "Account": "r9TcqWtCqzG7xnhLcYPUbKsV691wNPzMMw", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530AE5DC6DAAB62F", "BookNode": "0", "Expiration": 726020521, "Flags": 0, "OwnerNode": "a", "PreviousTxnID": "B79A078C7DE8BF5F74124442DB1267766453F32B03C1BE4204074ABF7186060D", "PreviousTxnLgrSeq": 68754629, "Sequence": 67460726, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2CCE5270C1E3BF119B0924CFC5417F5319B9015BE0F7A62716A0E72E7AC23291", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9780000000" }, "TakerPays": "300000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rh1bgyeVNDBauF3vXuASW2L8MWrdq8XYko", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9DE60F32C", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "63FCEAB46FADE9B9B92DE43A738D14DDB5064FDB48A9F3D1A62A0857E0C76D03", "PreviousTxnLgrSeq": 68994748, "Sequence": 67364435, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2CD87E346176CA539FAEE8D4B46FB2CDABBF331285074E9126C8A858E9A9D55F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2901658076.923077" }, "TakerPays": "13057461" } } }, { "DeletedNode": { "FinalFields": { "Account": "rs9woHiJb73K8uqmCAUx7hRfW2a2WR5cwi", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA7607D3B", "BookNode": "0", "Expiration": 723092961, "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "D8D5EE8C9DF8C53A561D214511DE6DF2C9F3CE16006943CA8E1C11B4A058CD5A", "PreviousTxnLgrSeq": 68027886, "Sequence": 67697632, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "778989866" }, "TakerPays": "7789899" }, "LedgerEntryType": "Offer", "LedgerIndex": "2CFC8E23F939200CC97B93893FA9C9D7FFCE5782C50D228BB2066027ED19AC20" } }, { "ModifiedNode": { "FinalFields": { "Account": "rHNNQAEvRxzWoi2ukxZ371fsjJjxRva3pd", "Balance": "91833121", "Flags": 0, "OwnerCount": 23, "Sequence": 67949465 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2D03DD3A90D97592CE73E2EB3CC99243619AA852B310DD6216BC1C3364AC5384", "PreviousFields": { "Balance": "86333121", "OwnerCount": 24 }, "PreviousTxnID": "20AEDB7930E0E08BD4B81DB58CC8235360FFB64F55C3A66F27F530E5BC19DC25", "PreviousTxnLgrSeq": 69063435 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "2d6", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rah3AgBTwgnCvR5aJfj4p6Gy98hZt57gXD", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2D219CB52C44C0FF809993A9FCCB276A31FC31CE4F4114A32BD8669CE6B9F071", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "1887F9417EDB3B0EE057075015D38E1471F0E73714AA72DC6494B1D0FF6939F5", "PreviousTxnLgrSeq": 67951451 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBzk3TdhfdbidCHeKWfmQ5dy9AuAtGbXeY", "Balance": "599184766", "Flags": 0, "OwnerCount": 60, "Sequence": 67686309 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2D230793C470EA9E169F14E3BCBE2A8A55C8DD310301F6B59DFCEAD275131750", "PreviousFields": { "Balance": "140637564", "OwnerCount": 63 }, "PreviousTxnID": "DF796D4FFFD8216C70D04847E9BF4A143758937A7C6AA6797FAC641AE6E6F5BE", "PreviousTxnLgrSeq": 69030898 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNRoroUiCSQM3hcrEkwV5p6uCx8WSm3Mjy", "Balance": "386758224", "Flags": 0, "OwnerCount": 136, "Sequence": 66470083 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2D7B08AE91F57C88635D6C6AA05EC458ED7DA5B7A4DA0B7561C37A32A5BFB776", "PreviousFields": { "Balance": "350758224", "OwnerCount": 137 }, "PreviousTxnID": "07EE9A32ADFCB265FBC6B936C82F4A83A1AFA99E25D3A816EAA18B82B7EFDD5F", "PreviousTxnLgrSeq": 69063579 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rQnNwoWPxGyxMoLogTPHYeK1hGYwJ3b9Sz", "RootIndex": "B2F6DB427F0FC8ED27135509CC7EAB6064F5848FF44E2A4609A8EF055FF616CA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2DA12DEA8824CB89B2350B54493090810C7935682B7F466CF4A6DBC37B03F8EE" } }, { "DeletedNode": { "FinalFields": { "Account": "rMGX6LAGxRUHd4g3yW1ukFhThgiCxMioX3", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207CF11C11B6F58", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "059A77218204BA7209A92305FD06BBA31B4235770075CB99419626E1F78B1F7E", "PreviousTxnLgrSeq": 69050922, "Sequence": 68628057, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "36675913373.39329" }, "TakerPays": "80613658" }, "LedgerEntryType": "Offer", "LedgerIndex": "2DA9EC67C159A3D3CE3FCAADE3A0304B164C57AFCE4A1B54A66D33957EF7E529" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rK3ctAQ3dxZmdQZ7JJt2PZBU7GZPwAkK1P", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "12" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2DB45C82B283C3EB7C761F594C5027E7EE46E6629F783EFA8B601339BA227248", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-15571979802" } }, "PreviousTxnID": "3FB972053C03A48A247DAD36DD4408D3260FC2D32DB5B3CB4722ECB2314FC0E8", "PreviousTxnLgrSeq": 68140468 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "dfa", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDrVDF6etbhSYtnBoqxbRd4CyGHQ5YNR4z", "value": "9999999999999990e-1" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2DB4C0CEB8239539B2F5968F18645F925E605A51CDDFE9C3759B2B67A9A1C9DF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "25000000000" } }, "PreviousTxnID": "808483DE8C02BB3297A29B4BECB913C6DC226D403087E9AFA8A0E7947CD351A3", "PreviousTxnLgrSeq": 68991025 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "9036317942.10513" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "76b", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDDmwBnxoXcq7PLUXTvsfVHhEqGpNCS138", "value": "1000000000000000e-4" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2DBCDE67CE0374CA007C2BA17A374A1A2B4DF6F9FDA0BEE713B7644578139F78", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10036317942.10513" } }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "b58", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfXqSEeWLr4MYYLsESHbsyh3CZhAitzYVg", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2DCD6F9A44D6727A80208EA37B8C79E4A18A44E56642A1D1299739556DBDE2BA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10133845184.51845" } }, "PreviousTxnID": "3DD37A7F33CA3313EB5E02BB2B8DF02567EE26F42B760B0A3526561BC2AF9344", "PreviousTxnLgrSeq": 68468161 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "10", "IndexPrevious": "e", "Owner": "rPCYDR6z5MW5EvxVzPhVa6cfLyckEDWs5T", "RootIndex": "D8365414EDBF06893B6D1AA08E8C50EB19A922772B8B1EEF93C951621675541E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2DE908B83BD4DE7B085AF2F49F9E3024DBED37C495B1094FF7347671142354B7" } }, { "DeletedNode": { "FinalFields": { "Account": "rBYvQ1bajMk5CQ8MTa6whA9MZ4uuJGwtEh", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "A9EA55C15AB886F7FCC5FE3E155490050FA554DA86106BF768478AFB4FF8AE72", "PreviousTxnLgrSeq": 68896306, "Sequence": 66621819, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "100000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "2DF3B46893D270568E50E084E7E0A4C6F41EA7AA0AE1B8E321D0126CF9B5D322" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2218056090106409e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGPEKNaNPYojt4sFbUzodh9SUNxixCwoBC", "value": "9999610698104603e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ed3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2E2E2C2CBB961AD482CDBA759AC4C593D1118DD7D103E716A76B234781FC8529", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2918056090106409e-4" } }, "PreviousTxnID": "93EDB1CEC8C7D9E69551DDF54BE5AF5D1E84FB03C17BEECA6F5E2DE328A64F95", "PreviousTxnLgrSeq": 68992388 } }, { "DeletedNode": { "FinalFields": { "Account": "r3XYRBp1PnkL2JesUDNw5zo4yxmkYQD9dK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D602B014", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "B0A7B22F2D427F621DFCE942F5A78E8E63C02B42C61157FF6CF6DA4B83A11A61", "PreviousTxnLgrSeq": 68152167, "Sequence": 67819048, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "101217868" }, "LedgerEntryType": "Offer", "LedgerIndex": "2E3007C0A7E65200703B528739476AD2982C8A9DBF893BE15F97392A8BA953E4" } }, { "DeletedNode": { "FinalFields": { "Account": "rBefpcbGP1mhJhuLmYSbPSj4oDTufciZDH", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB52622F29071", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "2DF9FBB3214E5913732341046D5EE97BAABE8D55479D95992C0FD621991EACE8", "PreviousTxnLgrSeq": 68898345, "Sequence": 67337573, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2E39A7EA374F910F9A28D90DEA0A9C62346551C178A12E04020F3E438493E4F7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3951941647.058824" }, "TakerPays": "30821192" } } }, { "DeletedNode": { "FinalFields": { "Account": "rn9Yx4G5KM8ie2sm6Qaju7xPbvQPFiUu2f", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218289060790000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "0CCBE78F6BFEB9FCA7E85330F90B1B09F4D81D7B73AC053DA5A84ADE04498D6B", "PreviousTxnLgrSeq": 68899294, "Sequence": 67611638, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2E3C69F32AB53CE9866ED03EC740A8BCA7C302D0D88DF025ABAE29D5BF8CD8AE", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "68000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rHXRGGkmL2bGwkbsz9mnpVi3eAZt5bThdo", "Balance": "72768139", "Flags": 0, "OwnerCount": 3, "Sequence": 66754972 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2E437C5FAAAC788A0A0E5E8D17DB0A79683F4A495F8521466376419377FF4A35", "PreviousFields": { "Balance": "18499790", "OwnerCount": 4 }, "PreviousTxnID": "387764D69FE7A46C47F7D554E4F14BB1A0984F8C180A5F22E35CE8C3613D26BC", "PreviousTxnLgrSeq": 68899246 } }, { "DeletedNode": { "FinalFields": { "Account": "rPpC3LrzwLjh2qU7XtQKFb4GCZyAUHz7Ss", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E32B478974000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "79305D4B1DC75E15B8B9EE877D15D8F47C626405F96E7422030D57D7CD13048F", "PreviousTxnLgrSeq": 68897510, "Sequence": 66167436, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2E53DE06F1BDB8E6F0DF200317065AA548900D3E357D9E2FE5E7E6FFCA5448C9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12500000000" }, "TakerPays": "106250000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rLVGNfLJYnQtqJDuNWkpu1yaSBnrrSGPdt", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BE3888D7CA000", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "EE88FF24E6EA03619B81F6650D9F5C1545A20D1DB261D7738642F6D8D5B2ED3C", "PreviousTxnLgrSeq": 68898671, "Sequence": 67363381, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2E5B457B89E72BD160F55407A08B78938267544AB5B68E39A436A07E7D029D16", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9000000000" }, "TakerPays": "70650000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPy5zQthBW1gHiWbdHmbPkGtF9jM5XQGNs", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "a51" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2EA65814C2EF6CD244AF297A9D076BB86B08ED628BB84A3147CACBD89BD0EA09", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-21206537461.53846" } }, "PreviousTxnID": "9AA87618582175A162AA221373DEB907D849BB9B16A93F5023A63ACF9BBC2930", "PreviousTxnLgrSeq": 69002813 } }, { "ModifiedNode": { "FinalFields": { "Account": "rjuBmfDDfaXxXRPhcGsGb3qSjdrEUwMGT", "Balance": "1084564672", "Flags": 0, "OwnerCount": 38, "Sequence": 67439660 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2EA96E990F6E3214F9DC4EF037E9A905E39D079CFB86A76724827072F5FBFC88", "PreviousFields": { "OwnerCount": 39 }, "PreviousTxnID": "7419BDA747FBC6A3CE53355853C21EAA178F0C13031C02B36EB34A98635B9114", "PreviousTxnLgrSeq": 69063408 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r33yXJH6HkJc128VKpjvrcdC89M4zDaP9f", "RootIndex": "2EC0BC3928CCFF88C70A2B0309F8FE95AEDC385248083AFF9F1B2F11552C8253" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2EC0BC3928CCFF88C70A2B0309F8FE95AEDC385248083AFF9F1B2F11552C8253" } }, { "DeletedNode": { "FinalFields": { "Account": "rNWUPV44ECUZNuemMektfAsccCmYRnZXK5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D6354000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "C8C5423DBDB8D7204DB660E6002F6A93D0A1217DE848D5EE4A7FAAC6AD7319B7", "PreviousTxnLgrSeq": 69053693, "Sequence": 67770366, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2EC9D2252A883425788C0A6B5AB6BB2E7C3159B9178885823EBE643294034515", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9000000000" }, "TakerPays": "117000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-87.6206" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHHviosMrm1hi4Nfm7MTipMw2oeEQRTeod", "value": "1000000000000000" }, "HighNode": "4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "2ce" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2ED3C9A16A3838B5341FD2EDF7591EDF4D274A12F40764C09F7A3849C9E622F3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-8077859899536206e-4" } }, "PreviousTxnID": "4CC219CFE4E4E6E29E152A45B270B9DFF5BAB8D4FF056EB200FF58AD34779CC1", "PreviousTxnLgrSeq": 68995313 } }, { "DeletedNode": { "FinalFields": { "Account": "rKB9EELQpLTeDNb3H5HJT7QbCPdA1NzDQ7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365221C0331CB28F20", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "1B9DA4F1F41A8A65CD08108526CCAF1734822C1F7A587139BAEFB356DD42A8A7", "PreviousTxnLgrSeq": 68903599, "Sequence": 67528555, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2EE1DB5A8FEC45277EDE257B23C30085F835E0ED34A7C37D32C454F571225465", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "86829360313.06876" }, "TakerPays": "824878922" } } }, { "DeletedNode": { "FinalFields": { "Account": "rs4wbWdssBMJRgn4tJak3eq1JgrJ7Pgfnk", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D7DC0FE0610C5", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "ED75D46C2B67D1FD123E6138C0C08EF375A37B9E2D68D1F59A9CA14B2167D7E4", "PreviousTxnLgrSeq": 68997801, "Sequence": 67390751, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "2F002EBDDEAE544ECF8589CCCDF182AFBAEE744F1673E63FDD68D706B3FFA713", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "26333512300" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rMWLJFUZZk4ueZuy4yiLPJa23dGih6phUa", "RootIndex": "19C4B2B83EE66310005478D8E31E6B6C7FDFB8B21BAE3D3413D3EE7A8C6A4476" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "2F05F18CA9FC00314DD788298BF1C90F7E17688BDAA7AF60ADEFB464152F6E95" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5400000000000006e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "df2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwLffu7VZ4rMMa5thTQppfL9g4FMB1sNys", "value": "1000000000000000e-2" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "2F3A2A9C9B7B82A1B01EE9AD131F261E3353CCB5B0968B64515153325128DB5D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "8987395559615390e-4" } }, "PreviousTxnID": "80CD6EC1E9D4EB842148311C17936A5736CEC03B227AF02F840039E01E293CB9", "PreviousTxnLgrSeq": 68945547 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJRfgew5k5b2Qgj5r9gn2L6w66hE5vwYnH", "Balance": "217601208", "Flags": 0, "OwnerCount": 80, "Sequence": 67406199 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2F5B70F8451C2D8A422B52F7E8B3BFA1659ED3DCD7BEF2E6EE817519A3367194", "PreviousFields": { "Balance": "193286208", "OwnerCount": 81 }, "PreviousTxnID": "123B9C58B38DEE62E97D8C1620DC86CEFA0B9E0B0E89562715A0AA710DD39254", "PreviousTxnLgrSeq": 69052978 } }, { "ModifiedNode": { "FinalFields": { "Account": "r4izcArVy7Ccp9j1VEwnbso67AsYhaEjdJ", "Balance": "165749879", "Flags": 0, "OwnerCount": 48, "Sequence": 66579210 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2F91A5502CCD74CA55AD26FF27B789D12E6B56301E8855BCFD04296717E9EECF", "PreviousFields": { "Balance": "113999880", "OwnerCount": 49 }, "PreviousTxnID": "EBCF3836A7B7ACC8FECC9DA4C4272E6F6266092083FFA959ECA01D962F6F5194", "PreviousTxnLgrSeq": 68996076 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBdANmzNNUu3sSPo15TR5eY2s43hPH9yFG", "RootIndex": "3079F0EE47FE60D4BD322D42362A3AFF50A26C342CB99C6C154AC2E56C087FD0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3079F0EE47FE60D4BD322D42362A3AFF50A26C342CB99C6C154AC2E56C087FD0" } }, { "ModifiedNode": { "FinalFields": { "Account": "r43hxvGDZqmKmLugK8oJ32r2f4rxuvUntb", "Balance": "1465435580", "Flags": 0, "MessageKey": "02000000000000000000000000D1188832FB86BF4E2B1D10CCB0CE740B60CE1122", "OwnerCount": 455, "Sequence": 59395120 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "309F5E03D894218F00289070357D326A575E0A03C5D5BC4BF5FFE0B5A027CC3E", "PreviousFields": { "Balance": "1445435580", "OwnerCount": 457 }, "PreviousTxnID": "18A3A8FA64C226D2F7AADFC1223108B379230883079DC8A82F508D55A6F575F5", "PreviousTxnLgrSeq": 69063753 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "10", "IndexPrevious": "e", "Owner": "rC4M78e2ktZz8QwB5SUSEeeeSi5rcnxrJ", "RootIndex": "35E481FF021EB94C809B1D4A952A1AE9563777CCB354A61030354C2CEF3080EE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "30AAA8E0C661481428DF58E6B12329B642C295201DBAF2DF2917B99A60E00167" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1995960136522766e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "d7e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpf1wWbuPjafvAgD4f9vtX88Ut9qurPRHS", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "30AD07EA17EEB836E2AB328FB7F5CE1EC90CB65274F46EFAF519763E5D5B22A1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3295960136522766e-4" } }, "PreviousTxnID": "D913546BE47A1E1AE28EE0C3334CB4261105DCA1F525825FDF9F55CEB56A20CF", "PreviousTxnLgrSeq": 69024497 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "396", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDqBWAYNudfa8rBsr7YDsdDxeAoNRsxfPV", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "30B319F2E6008FA0BAB83918821AA9A07C38323300BF509DA3961F2B2F234975", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "38929949330" } }, "PreviousTxnID": "9F8B22D2928CF33951231980AB44775FFFAF61525F79C8C29965FA28E3F80530", "PreviousTxnLgrSeq": 68246086 } }, { "DeletedNode": { "FinalFields": { "Account": "r4LzF7yH5ewjqEVaTpufYTzwH8KyimRrrq", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652218F2CED8BE9A6", "BookNode": "0", "Expiration": 722876948, "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "44A9AAA1B6C0DA28B7D0ADAEE31E06F91BB31253624C79A9A79B749B8D9B2FF1", "PreviousTxnLgrSeq": 67974335, "Sequence": 67717880, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "30CF07B124040E6D869C366E70431A687EEAE16FA02924B2FF7F946026EA675E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7728059.243109986" }, "TakerPays": "73000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r9TcqWtCqzG7xnhLcYPUbKsV691wNPzMMw", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653056C8AA1AC1F44", "BookNode": "0", "Expiration": 725659570, "Flags": 0, "OwnerNode": "a", "PreviousTxnID": "67F188C5689579094FB4286DD4D83C2CCBCF96D77ACA895BAB7311891F1246B5", "PreviousTxnLgrSeq": 68662575, "Sequence": 67460660, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3116FF8DD0F1D142BCDFAD668C40D7337F4A7FDFDD91E49531C6A0F04A3B1BF8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6484500000" }, "TakerPays": "99000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "raentKRvbeEBLCQQUC5vbc8FH6zFuzaNEJ", "Balance": "139557704", "Flags": 0, "OwnerCount": 16, "Sequence": 67761116 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "311DBA218000BD6B4EA2A5F778BCA7EB0BA3015B69B9B752E295A36C2AB36C5D", "PreviousFields": { "Balance": "82719978", "OwnerCount": 17 }, "PreviousTxnID": "D757E0F1A3DC2F5808CF00CDA39CF15C0D0FC40C948D6CB1E5ECEA46564CECBF", "PreviousTxnLgrSeq": 69044023 } }, { "ModifiedNode": { "FinalFields": { "Account": "rhMycFXh1AtyNRL2JeLJmhps2ufxBKY3Wy", "Balance": "326269725", "Flags": 0, "OwnerCount": 157, "Sequence": 67131748 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "312CF8F18C49B50133AC81732CD0D86AAF045797DB72E08103A2D986BAF605AC", "PreviousFields": { "OwnerCount": 158 }, "PreviousTxnID": "761D12C84ED05D82B8709B6AFABDC2F4346A93663DBFB1E4F40BA710F447FE07", "PreviousTxnLgrSeq": 68953175 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "22", "IndexPrevious": "20", "Owner": "r43hxvGDZqmKmLugK8oJ32r2f4rxuvUntb", "RootIndex": "CC1F170977F938874418B74EFA4CADE426A50A337BC3FE9C2A800D4BD7F67127" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "31427284B4A04C1A2A9075225DD74F77CC98B351F471CE1F6B7C669B841031B9" } }, { "DeletedNode": { "FinalFields": { "Account": "raHjNXUyRvwxN5Vr5NtQ5pbFVgbM7kqLrP", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CB032035736DB", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "35A35BF67C2103B846338F72BD912987747339945D27620CF7A11B933F82539F", "PreviousTxnLgrSeq": 69027789, "Sequence": 66646314, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "316EEB4D7D38972F8F61C3BCF6EF4DC2E83DEF735C5D7BB42D980AF23DD4BF5A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4215723962800000e-4" }, "TakerPays": "1505615701" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r4o8fw9WzkMQTvfvxZFVhkY8Txt3eN8Wct", "Balance": "1317355027", "Flags": 0, "OwnerCount": 4, "Sequence": 67794280 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "31AACA49165E02A08B84F36FEFD4F2C32CA357B7BBC1EB6B3AFEA97623A27FF7", "PreviousFields": { "Balance": "19997492", "OwnerCount": 5 }, "PreviousTxnID": "427CFF8FCC7EFADA5E33FA9CDFBB38FC5CB672C9021BA1FFC9CB0926A8D06ED6", "PreviousTxnLgrSeq": 68898281 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJWkGGCNuazEf7ch7C9bZkiiYy62Z95SA9", "Balance": "261341955", "Flags": 0, "OwnerCount": 124, "Sequence": 67239609 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "31EAE3BE043D422E1632B4E606BA6336657BC4135391321CD0DA50D569E615B7", "PreviousFields": { "OwnerCount": 125 }, "PreviousTxnID": "228AAB1DA2BB45485A022A07AD1E491B2C81D18448BA5E57DFBAEA511CCC82CC", "PreviousTxnLgrSeq": 68984170 } }, { "DeletedNode": { "FinalFields": { "Account": "r9MQ7Hek3iMwBnYRuHTuuG3ssJu48PHaxJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "414828D1EEA4A7A6A12639230924371F50A749E2BCF5EADAE5AAA7B1C741DA75", "PreviousTxnLgrSeq": 68364039, "Sequence": 67390511, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "31F19B8D934D7FA630E99AEA905CB0DA4C461EE53A94DE1F1A0941B33BD1FB2F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rQpXmMNyGKtsYHwkG7Y3n8sXSXo2cmB1Nt", "Balance": "155872784", "Flags": 0, "OwnerCount": 28, "Sequence": 67709971 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "31F3BC30DF885F36A864565CE4ABFD94CF39A24A6BA010081E9749846F8767F0", "PreviousFields": { "Balance": "113872784", "OwnerCount": 29 }, "PreviousTxnID": "7509A5E2343CBD58F19D70DC20FB819C52C8866F792C55B72A78A2669947EE75", "PreviousTxnLgrSeq": 68897310 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r4xMZEgWZaocA566U2xgUqKcTnXKZkBLLi", "RootIndex": "32298EC78896480064883C20BD203E919AE73A775474829A2966BE2C05E66A77" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "32298EC78896480064883C20BD203E919AE73A775474829A2966BE2C05E66A77" } }, { "DeletedNode": { "FinalFields": { "Account": "rK699XAUEcMK6msaRDV46mATmAqNN9nj24", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365313566130B7C9B1", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "0371F06E2E0E74F5D997FC44D48A038D825FA0876C4E68E1A31EB6778BCB1D73", "PreviousTxnLgrSeq": 68948327, "Sequence": 64217429, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6924386366.397586" }, "TakerPays": "376894349" }, "LedgerEntryType": "Offer", "LedgerIndex": "3262164AEC94B2165DABCDA2B30E7DDA860F9B333CE0828C18B16BCC8871F576" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJ72ZDPTsPvQBUxDvaQd9t2mbD8BrogpBS", "Balance": "374537326", "Flags": 0, "OwnerCount": 8, "Sequence": 67691003 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3288D99867BC8D616D0932ABFCA37174DD833829F94D96DF789FE9B307A8AF5C", "PreviousFields": { "Balance": "228490722", "OwnerCount": 9 }, "PreviousTxnID": "B370CDBCE97D514F7B5C954C6EF2E575AC12EC8545262DB0340FA3353B71632B", "PreviousTxnLgrSeq": 69059418 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c01", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfc7iQscNnWECTgwfRg4T6MExyVTCiTWTV", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "328DED236F66E9D8982EF51B80346E15213879835669ABDE1B268CF87D66CFD1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "93431878392" } }, "PreviousTxnID": "D48F641BA568AE214C1CF626EC15517E19166DE9F1629AD955D995478CD548D6", "PreviousTxnLgrSeq": 68015398 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "raLEGx6aGsVshgdT3oGzM2nyv8oAruC8Wf", "RootIndex": "13523ED3B75624DDAD43C86F5E745EEEE8D74C60D863A52CF9D783B05C9D425D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "32D232D4E4084B552305AAEB22E3412D90D8B7E5BC72D905ABA556D6760BB6E5" } }, { "DeletedNode": { "FinalFields": { "Account": "rLCKThc3nyrBN63QzPHKoHHPA2iN8RH9gp", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "E4BD1109870C39DA34F5D362ECF8541FC87BC72476B534560414B1BB94E51829", "PreviousTxnLgrSeq": 68975087, "Sequence": 67704218, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "32E8F26320B6B9EA1027D26796A3BD6518A8965BB1BFD53A0A4DBC95943F8C5A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12000000000" }, "TakerPays": "60000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e6b", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpVr26FVpK1G1u8vyMwsKnpXn7iycrYise", "value": "9999610698224590e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3300F250113E6E9DE80D75EFEFF4E076DA82E341D58389DD84D1097E45981DD2", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2239826471.975726" } }, "PreviousTxnID": "4764518ACD64A6F10BDBB9BE3589ADA0312F0493F0AA0D51540768E84357CFC7", "PreviousTxnLgrSeq": 68884252 } }, { "DeletedNode": { "FinalFields": { "Account": "rKjRbDnEwfSRjozGgD1M2dBU54xVtv57aQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "05E02BB8F32C6B81564FCADED6419F207D545023FBB44203B1DEA46D615EDECC", "PreviousTxnLgrSeq": 68883822, "Sequence": 63167743, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3359E918C33C8975ED5C1C858DEC6134CEA9B7D6E5A5BE6F729E629D59E6C0DA", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "300000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1835698004287651e-3" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "42e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "value": "1000000000000000" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "343FA5022B2468EAC06DEA06652981CDF3934204EA0798B8A6D2126F8BA25DC0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2978907871287651e-3" } }, "PreviousTxnID": "2DF8A2FE1F6962DBA117F34104091F76B7B0D7B5973D5FB74FDDD4FFD166533E", "PreviousTxnLgrSeq": 68897069 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBVauSrW9MhaNcszTL125KttqSixQmUDuK", "Balance": "121438330", "Flags": 0, "OwnerCount": 24, "Sequence": 67761586 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "348F495C9A1055B39EDDE6169141D0D0E84976DFAF33CD270810094434FA2D60", "PreviousFields": { "Balance": "60785469", "OwnerCount": 25 }, "PreviousTxnID": "19E789000D7B0627D33585A721EC822550F91AA4711C48411A8C57766984BA31", "PreviousTxnLgrSeq": 69044001 } }, { "ModifiedNode": { "FinalFields": { "Account": "raANwNJ9aqncwhGT1Eh9mksqTvAMm3WZG3", "Balance": "158094654", "Flags": 0, "OwnerCount": 36, "Sequence": 67554136 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3491E150DBFC5A9373C500689FFE1F1C5A3761F9119405A10807626D06CA07D6", "PreviousFields": { "Balance": "135594654", "OwnerCount": 37 }, "PreviousTxnID": "A0E4373D4648B121F1F8244ACDE4443452FE60916FD123FF69AF54FAC42DA865", "PreviousTxnLgrSeq": 69059677 } }, { "DeletedNode": { "FinalFields": { "Account": "r9edE9m7sNZEwgT6foU8ahfA1ocrNify92", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E9004CEE310DE", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "EDA524EF8CEA48D24836861E2C7EC79BD662AA787FD0DDF54105273F9ADCCFA7", "PreviousTxnLgrSeq": 68997637, "Sequence": 67529715, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1158243266760922e-3" }, "TakerPays": "4747639149" }, "LedgerEntryType": "Offer", "LedgerIndex": "3498D7083D22154CD67B549D9BE4602FE09C086498DEDDC5083C1B316FA535A5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1159149885074611e-3" }, "TakerPays": "4751355378" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "7", "Owner": "r9guPT5E5ZDd4hPpLJC6UnXCGoRB8tZ2Jr", "RootIndex": "FF1632262D5EE66AC3F4AC627288D38E7C565B39D4C05F5722F4C468445CC1A8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "34BC769BF6CFF709F0F2890ADBCBC99CC261E529B737CCEB484D775A4FCB8FA3" } }, { "ModifiedNode": { "FinalFields": { "Account": "raDJvZX8gbRfZ3hUWimZPdVcDRzsZQdhmr", "Balance": "2090263532", "Flags": 0, "MessageKey": "020000000000000000000000003DB4BD44D6AF755BC4C4659E85E070BF00B22815", "OwnerCount": 588, "Sequence": 63094242 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "34F4D028DE429203466CEDE16B37E746DDCA4636291C0AFD84C39C469A78DD2A", "PreviousFields": { "Balance": "1890263532", "OwnerCount": 590 }, "PreviousTxnID": "A1531C2E47013B297142023F136F9C0EA33305F4B175EA3A8D8C4C0769E96DC2", "PreviousTxnLgrSeq": 69064094 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNk5vizuipEGcr9cNVXnh1eBjhaMFqFs42", "Balance": "17082053193", "Flags": 0, "OwnerCount": 162, "Sequence": 67689580 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3512809FC0F5BD40D11DD304481AD61B33423A8689298031DA769CE4773693E6", "PreviousFields": { "Balance": "16992053193", "OwnerCount": 163 }, "PreviousTxnID": "5329C39ACE75EA7141E7650141DCFC5D575EEBAFA5A54F6EC507942A6DDBAE03", "PreviousTxnLgrSeq": 69057833 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rPfw6T9Nu154bW5Yqyd351rebEphbe3Fhm", "RootIndex": "35453FBF6BEA29FC95F598D196825A011D68A23D85A2509D90DAF9C02A1A7262" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "35453FBF6BEA29FC95F598D196825A011D68A23D85A2509D90DAF9C02A1A7262" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rnhFkVQVhLHoMBNc5aUNk5fRvZfXmt16nz", "RootIndex": "1B1AC455FA19BA9056546A5552C78046F3720AD8F648D59F17EB86A6777B50CB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "35510CBA6FE7359ED8928BFE2D8363F2DACA84863910F4591DDD0C48B7C43496" } }, { "DeletedNode": { "FinalFields": { "Account": "rBHSrXq2LzGniUp4zypCRk1isLw1ywLPHv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531C6BF526340000", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "538C8026D2791193094972A9F87032199CE10EB602E2C706268553F32B656F0A", "PreviousTxnLgrSeq": 68998288, "Sequence": 68976410, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3554ED296313AC462096713728AA6FBF09ED5AE5AB6F87C0C6E6C6821B3E0788", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "50000000000" }, "TakerPays": "4000000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rnhd3RdnLUZY4sYxS2p5zTJk24zHB7VyUo", "RootIndex": "357D4447B4656DBE99D38DAE94198FAA8D003993BD75253C02C8292D55FC4B2C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "357D4447B4656DBE99D38DAE94198FAA8D003993BD75253C02C8292D55FC4B2C" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2459239618536001e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKMLJSbumUE4mnXET6X1DDFF6JsN8wE8x9", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "a80" }, "LedgerEntryType": "RippleState", "LedgerIndex": "359C720C68A4FC1A2840FFF62F1EF4EFA4E946E0CF9A05AC63FFD04DE5F6C5A6", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4459239618536001e-4" } }, "PreviousTxnID": "56E3A8FC6124E1B37100E9FEEADB7BB28DB30C2DEC93957E85C6C9AA8DF7CA31", "PreviousTxnLgrSeq": 69048812 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rno35bcvBqLMETwksdhSiUuDQquXyoBtem", "RootIndex": "0E1B1783E006D11D441B6ACD97226A2821D329C78EAEF5A35F7BAC5DDD1777F1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "35ADD7FC447868673CBCEA0E9997FC110120D82DE23341F1794F424D8A725129" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "2d5", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDwdy5963o51eDFKzgJ23VJUy44AX3QrS6", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "35B7C29DCF857B0F26454DA183D189C8A7E9D900D72EE075DECC179F23B05586", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "F1C1411336FDFCA202457CE456579FC11EED4D5082FCFC0717E09CE64CA9BED4", "PreviousTxnLgrSeq": 67951443 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rPVXceb6wrQp9apSTtyZmWcxKmYRBnCsdt", "RootIndex": "5FD3FE72869B748A67BCA2E1EEF95480080E23C9D9CFC33AFDF58AA02D82E93D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "35C930D8EA842F3C67EA707593BC46D76037D63E96DF560C38DE753FA5AB1C6F" } }, { "DeletedNode": { "FinalFields": { "Account": "rp9kJTnnfXrjwVFxGRWfjUbJdmxkGP4cif", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212795F58AD955E", "BookNode": "0", "Flags": 0, "OwnerNode": "7", "PreviousTxnID": "EE2B8A727FABC68DF29D7302B85C37D7E6A9247229655EC4EFD9DC8D1AE4F569", "PreviousTxnLgrSeq": 68971394, "Sequence": 65950481, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "366CE3869B3979BE2BC732D0DBFF3C88C55CC772CF186D216369B1D58D232AFD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1003886481267931e-4" }, "TakerPays": "522020970" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rB3bSANCCKpiQa4aMd7b4vQZ3pMTh8UXZh", "Balance": "5916763306", "Flags": 0, "OwnerCount": 6, "Sequence": 67122275 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3677FB81FC7F2E06B59908F869D64F71C4767DC9CB961948863CA5C535F64DDE", "PreviousFields": { "Balance": "26722923", "OwnerCount": 7 }, "PreviousTxnID": "92124DB0EE6FC777F0F53CEB778D5B15A3D11D0B286DAA1A42F09B2BAC5E8F14", "PreviousTxnLgrSeq": 69004726 } }, { "DeletedNode": { "FinalFields": { "Account": "ra76UpbMwxu2GePpQeV7dogXZUxvn8upup", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "B919B73FF44A7A6780DF0F4C44419052D6F870BD88F3D4F99F64D8E6365031EB", "PreviousTxnLgrSeq": 68968639, "Sequence": 67417514, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "36A801BED7018F447260FF99C5330C36326B773AB5C94C4EB5C8BA9C93281FBD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4000000000" }, "TakerPays": "40000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c7e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9ma91EcMDXDCLQZDvceT9tDwHRT41gumt", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "36B637EAC2C6E3C04AF0BAD04A618F9F9B7E30523A92375238429E3412DB17A5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7786389866" } }, "PreviousTxnID": "482E5B69208C60845C39D333ACBC222CB4AEAA7B5463553680D6CEC5A10D5540", "PreviousTxnLgrSeq": 68783250 } }, { "DeletedNode": { "FinalFields": { "Account": "rEjghQohwSDxD7d3NbTdrzRLGRRsGf7qwN", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530886C98B760000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "5A53C44B1272FBFA83F536C3E9EE5E6C3C056F82DB99225A4F0C41E76571C5A6", "PreviousTxnLgrSeq": 68898286, "Sequence": 67416501, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "36CBEE605B80FC44A33D1EB767F3D302497181C4EBD05F0799459F0D787E2F25", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "50000000000" }, "TakerPays": "1200000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rwJrcmU1fHLmHgWcKC1D4bZQNkUGJs165m", "Balance": "254839044", "Flags": 0, "OwnerCount": 82, "Sequence": 66648184 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "36F509580B6867321DD80528AC594F0249F80C001BEAE10BD01232C3C4A7D169", "PreviousFields": { "OwnerCount": 83 }, "PreviousTxnID": "E5ADEF07D1BC485105108C689C4B85EA60DFA5A43E68CB80960DFD1F81315A2E", "PreviousTxnLgrSeq": 69049168 } }, { "DeletedNode": { "FinalFields": { "Account": "rBCS9nAyaFuM8LDym5gJGRxEqmmH9mRhxW", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531C6BF526297A08", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "7CDEE8CE18B6F82C6FD071899C5B9716D3699029497DD1F4528155D4A43193FF", "PreviousTxnLgrSeq": 68897571, "Sequence": 66613799, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "372073DB25588502757B6C4FB1E3796DA335D70E729CE6632B1D06A7D9A4D104", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1160000000100000e-4" }, "TakerPays": "9280000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rG7WNJTTMRQma1eeWs5CDv8LwsLb3QQhvv", "Balance": "83073296", "Flags": 0, "OwnerCount": 9, "Sequence": 65803332 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "37294041C758143D17F6FE565ECA238CFE6BAA4829F1BC705D86C8AB9BF89D3C", "PreviousFields": { "Balance": "83073294", "OwnerCount": 10 }, "PreviousTxnID": "D313BE6AB77AEFD855AF91C8D43F0224C040213C0CF6B81E51FF19901DBB6BC8", "PreviousTxnLgrSeq": 69058925 } }, { "ModifiedNode": { "FinalFields": { "Account": "rshXc1NnrPiNRvKbbmnfgQpiSGYugiFUG7", "Balance": "174584346", "Flags": 0, "OwnerCount": 21, "Sequence": 68652679 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "375E17027669463A8D2902A408D862B08F6D4AFEF275F85ADB76833B596E4DBF", "PreviousFields": { "Balance": "54584346", "OwnerCount": 22 }, "PreviousTxnID": "1278A29C7D1F23A47D5E6E05B85425CA638DDF8D3FE5B6A01D62D55666926C8C", "PreviousTxnLgrSeq": 69044441 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-22217969598" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJNmHPHrMr649at3SBHakJ38mRAQZA9pvs", "value": "9999999999999999e-1" }, "HighNode": "5", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "7fe" }, "LedgerEntryType": "RippleState", "LedgerIndex": "378BE16FA5CAD961450095B8675E2CE5C78D5841A5FB449B73FF228DC1337AB1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-23357969598" } }, "PreviousTxnID": "9F3466E05B9BCA757F65A3FC5F336674F6A24BC1E7040F7F7DB69BC607960496", "PreviousTxnLgrSeq": 68983839 } }, { "DeletedNode": { "FinalFields": { "Account": "rHyR27TRJ73Eu8bqe5wBxX64hJ9Xf2c5XQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207D0E369505300", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "27F6E4A95B8EC6202B7089D3D770C03DF3477F152A9790D2B8B0974BEF4ED823", "PreviousTxnLgrSeq": 69059675, "Sequence": 68895669, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "379CB700213CFD41AC4CB3E297B79E074B9CF0EE7E43E10DA751598B1BDFACE2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "50000000000" }, "TakerPays": "109999999" } } }, { "ModifiedNode": { "FinalFields": { "Account": "raxn3rqqdW28ZVrFAQ33AUrvdaTSv34DSX", "Balance": "304479087", "Flags": 0, "OwnerCount": 117, "Sequence": 66385982 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "37E74ED11B4CCC317350459D6811CBF6447CB692FF139982C273C9E50739C49C", "PreviousFields": { "Balance": "249977158", "OwnerCount": 119 }, "PreviousTxnID": "34D01B5B063282F1BE3AD1E0B237C09836D3141DC37E458A4F06DA7C215DF1B0", "PreviousTxnLgrSeq": 69032062 } }, { "ModifiedNode": { "FinalFields": { "Account": "rh9MmnkJaQ1P1Y6ZzmRFpQAc9UdH6pKTiS", "Balance": "6176844903", "Flags": 0, "OwnerCount": 855, "Sequence": 66703893 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "380CB21754B74991B3CEDFCE3BF09F0BB9A6E4B3C4D5B38D985F323B9E793357", "PreviousFields": { "Balance": "5768292903", "OwnerCount": 856 }, "PreviousTxnID": "4C4A4C213ED8A6E15C0DB296DD3297CC7CD1ECA10F00AC35A6984D46100319C4", "PreviousTxnLgrSeq": 69064166 } }, { "ModifiedNode": { "FinalFields": { "Account": "r9Bq12mZUmUByGGcnu8tvj2KYAcJQ4zbTL", "Balance": "45665719", "Flags": 0, "OwnerCount": 3, "Sequence": 67987245 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "382806442C620866CE07AF63D4F5379D06F2DA2396EB8002E9339C2E1BABE519", "PreviousFields": { "Balance": "20111377", "OwnerCount": 4 }, "PreviousTxnID": "1EEAD6B80071AD27F40D538959A67C30FF7C4AC6984A9630F7C851EA1256215D", "PreviousTxnLgrSeq": 69024498 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "b", "IndexPrevious": "9", "Owner": "rpRWz81LgJfwcxBFMMxwnMttsHr8VoMZeR", "RootIndex": "73815C0BF6187B3A7D4124647C6F5850F8897D70DA13A17A02C9783120AFFF80" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "382DB5BD62B8B07F972833037B078B552565A80188BA251FB205C4CD92F41CB3" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJxQUBBc7qcHrGcjrb265KwXeZrVio5Eri", "Balance": "887258312", "Flags": 0, "OwnerCount": 74, "Sequence": 67219951 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "382EDB603C36AD25AEAFCDF978A4569E84C45203EE496DB9E2C75E719B420761", "PreviousFields": { "Balance": "585161975", "OwnerCount": 76 }, "PreviousTxnID": "E4850422EBE6F47D2D564BD3F89A4F7E4218FEB68D6B764FB52AD50F822B2728", "PreviousTxnLgrSeq": 69062810 } }, { "DeletedNode": { "FinalFields": { "Account": "rGCr7TstZbRvToumrTKaUcTX9JGKVLsCVB", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7655B5EF72", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "B66403357ECCB9B67CE2603B4E3C0B3E308FA55F2C9CB7243C6B6A309BD49896", "PreviousTxnLgrSeq": 68927042, "Sequence": 67407740, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3845206F7C2CE62098FDCCF572B69FC0ADDF99352170D80F27B2F92A27C5E64F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1079467827.39087" }, "TakerPays": "7556274" } } }, { "DeletedNode": { "FinalFields": { "Account": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222FE85D709A000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "F5162A9D8043DEB1E2188917E38549177D8BBD44D83910F8DB7D8E96D5C3D5AA", "PreviousTxnLgrSeq": 68888983, "Sequence": 67528315, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3853B0652F5B819099B5612580F0861CDB1F67020F684AA738E66EE822BB8912", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7800000000" }, "TakerPays": "76830000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "7", "Owner": "r9ny1UWruE383T7YTyQgiH4re75gzGpKqa", "RootIndex": "556D277A7E0323C2C5C8464B98717FE842BB5233833B666B51AEE761ADF7D55E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3894F5BCCCB75490787EEA1061F49E9B2165E7F2E5D20E908F5A18B39D733978" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rKnBQjFdG2pPCrKiUmeZZZ6YjmuCyWVta", "RootIndex": "6766479642E25EFBCC51417BFC1F19E6A52F36DC3960CAF93371EF91CF0E9647" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "389750B46C6C7A55D6EEA7639E2E3762863B551865DC39E60D85A0CDA46E4C90" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rhw4L75RKqQwheqkwPMM7sQYti6hmLWUni", "RootIndex": "1CC9934F3EDB91CB64C5440A8A35F4A4DEE1825C9A67162BA67C3F229B1949A4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "38DD15D05DEE165F57AF01391105AFCF45497285F8443ECE239730A01096BDD3" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "raxn3rqqdW28ZVrFAQ33AUrvdaTSv34DSX", "RootIndex": "02D86EA2A8285DAA5E91B63BC2954A5B009A46FEFE0EC79D7E7F156E34E33A03" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "38F1DA21F50DC376CA189F3399606391F9D9703C5B7CA0B69CF7857F16891BDB" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rNoN8BUzTSY5oyJmAMiKNGo1k8PSxhyJzc", "RootIndex": "B34A4E63D0AD73600B4D08C86ACA9A1100442DC13674F78E2029B00697973C9B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "391645D68C9EA330E2944A0FC09947FB09CE035D66446DACF60AF5961F535098" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30147865322.1396" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNCESwgSpY1pUyhQGzGd7T38zXXzxUCLLj", "value": "1000000000000000e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ea2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "395BDFAC537942B952150F922FCE2FA01C753FC3BA9A07CF4783321477C891B5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1507393266106982e-4" } }, "PreviousTxnID": "A3A49BA56F58691FDFD4F098579EEEAC4501C061E8F953C2E5FC4AFF1F35DE07", "PreviousTxnLgrSeq": 68997438 } }, { "ModifiedNode": { "FinalFields": { "Account": "r4zXDbBBSbrguDq5pTzabnMgXY7n5qg2jb", "Balance": "650224018", "Flags": 0, "OwnerCount": 153, "Sequence": 67256161 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "397497360EF1D9D1B1EFBD7F857C0B66FEEEC8B92807D6C4A1BDF68A2E3D9186", "PreviousFields": { "OwnerCount": 155 }, "PreviousTxnID": "DDE62909D482F96A31DEF6E3CD3D24C41B8F400289054DABCACAC41195D0ABFC", "PreviousTxnLgrSeq": 69061661 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r3Xud98xTUTiXxGp2LbmFtFTWRWeaZSCad", "RootIndex": "397D669A2C93ABFD206376DDB58FF394D4AC0E718882E8D528018B1872CB3444" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "397D669A2C93ABFD206376DDB58FF394D4AC0E718882E8D528018B1872CB3444" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "f1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raxn3rqqdW28ZVrFAQ33AUrvdaTSv34DSX", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "39B795BD4A769BE5C2C03CF8A416B62671AF8A8B0FB356326688FC80A7FCAD8E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "B0024ACBC897D271593DB39D52FD162B89F22BB66291C008387C69E03338E53C", "PreviousTxnLgrSeq": 67948956 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "c", "IndexPrevious": "a", "Owner": "rUEnyBAH4xxjS4ZkMrki8GnNvsvysjSuZy", "RootIndex": "8DC41A53F94F2624AF80BB59B57FDCC68C069F704552E53600F7C9CC86046299" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "39F35E57D387E2427360B0B1971624504B299123BA8B00D0A5AA50D68C779851" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rJCvziKjUwgoNgwNNcy2SwqVMwPFxqBjvn", "RootIndex": "39F43F1315D3BFCDE1F85476AADE48D3252FE92344ED68A031A933F4603012AB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "39F43F1315D3BFCDE1F85476AADE48D3252FE92344ED68A031A933F4603012AB" } }, { "ModifiedNode": { "FinalFields": { "Account": "r4AXMmLxiAtMf5yvyqqCZeHVhswjdmNgBx", "Balance": "1129171297", "Flags": 0, "OwnerCount": 55, "Sequence": 66594836 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "39F4E2867CC7B45858C10E431F0A9A40E3AD39C9B1910059526F3BA21B0532A7", "PreviousFields": { "Balance": "127997432", "OwnerCount": 56 }, "PreviousTxnID": "FB794FF231053A4B66DA9324803E165F882D0A8BF6F0CA9F53A5300F63A0F709", "PreviousTxnLgrSeq": 69063852 } }, { "DeletedNode": { "FinalFields": { "Account": "rGcsBzn4XYzjM7nAXBUU163LfyStL1PZsA", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5E620E7DB231", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "188F8177BC40136BE45B0CF9267CF6450A70DE108153E9FEC57C9E860C51B36E", "PreviousTxnLgrSeq": 69007789, "Sequence": 67544523, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "38049133595.14459" }, "TakerPays": "121757227" }, "LedgerEntryType": "Offer", "LedgerIndex": "3A0D77E635D5089BA67624F9C9A1EE2A20A31E15124D87CBA8BC9417E900708F" } }, { "DeletedNode": { "FinalFields": { "Account": "rJQe5K8Fxn2ktEMbwaWibo9LEYKHjqDzzw", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652126E7561184000", "BookNode": "0", "Flags": 131072, "OwnerNode": "17", "PreviousTxnID": "732EE1A4CF16BAAE08806421A9B656DA890441372EAA88FA5B0713575546BB55", "PreviousTxnLgrSeq": 68999984, "Sequence": 66694101, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3A0E42C7D8212638340A9DBF86D666A39FBA143EFA5F93798520B1EA32E0B1F0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "51880000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "7", "Owner": "rhMycFXh1AtyNRL2JeLJmhps2ufxBKY3Wy", "RootIndex": "DE24D095136B94CEA3BB840A3B096E199560C67829EA2C0480A95604884D1269" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3A30DEE57712782C8FCBA6660CFA945F79810C0BB5BCAE8626D42EBD74DF77E5" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "d", "IndexPrevious": "b", "Owner": "rJKHj2kBpPFHbEu4m2uuSuh5rQEcAYwJ8Z", "RootIndex": "0DF3691A44BF6069F191C640E51333717CAB481B573621B2287E5E6B69E5AEA4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3A330762922907368E14B55B9F1E43606857E67228B3BFF2BCA9C5C383EE115A" } }, { "ModifiedNode": { "FinalFields": { "Account": "rNARwAxVp9C26pcBpRbFHdw6P5Sxa4q7kr", "Balance": "80267371", "Flags": 0, "OwnerCount": 31, "Sequence": 67347513 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3A33219C632686BE51B056BBD30C4BE23CC61A7297125AC680ACD0669885109C", "PreviousFields": { "OwnerCount": 32 }, "PreviousTxnID": "849D1952DF39889CF0502ECF389386E5BA2C0D4F82BAF91B758617D14BA71CAE", "PreviousTxnLgrSeq": 69006437 } }, { "ModifiedNode": { "FinalFields": { "Account": "raZrDVYBJ5whjdgJ1V6FtiYixKesEfDyKJ", "Balance": "32485664450", "Flags": 0, "MessageKey": "0200000000000000000000000094E2CCA8C5430C24EB02A86DBB4F42BC5896D081", "OwnerCount": 562, "Sequence": 58008910 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3A42F2419F212115B3D02C834E481045496F517044FC64602A2D8CFD14C50940", "PreviousFields": { "Balance": "31880148019", "OwnerCount": 563 }, "PreviousTxnID": "77389E14149B623A9B4A0B4028EA2F3C7243D34828C150A03C551C33CEC97091", "PreviousTxnLgrSeq": 69059832 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rMDc7eVhCw5jjCXU5DGpn2tUV9D7aBBFLx", "RootIndex": "538D3642C1D106AB920C3EA40313AEBC4D95C5B870A96109ABC83FD42E359D7C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3A8085792BB941DC06C8A0571C6BE67AAA843B7822FCBE69B2FC92607D29E467" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "9113032894.7" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "586", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnpQiciqw8RGKo3NmqAuyZXScNoCNmQSL6", "value": "1000000000000000e-4" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3A89202A005FFD6EC3586A9705E3E3D9E5CC01637C5119252C6B41556D0181A5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "27791482403.49754" } }, "PreviousTxnID": "181DA9D348F1C67DF01074FEB07826CB4D748F7846C543E95947860DFC4224B7", "PreviousTxnLgrSeq": 69052947 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rGCr7TstZbRvToumrTKaUcTX9JGKVLsCVB", "RootIndex": "125CAE2FAA187FB7F957C39D75BEE2639F45E0CBC1998B2EBB75D38C6D8F1CD9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3A985F3013C5170F8CCB63DEB8CAD244D977C3D5DB8DFFFD1A758FF676B9C3AD" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-98135766.0049721" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4LzF7yH5ewjqEVaTpufYTzwH8KyimRrrq", "value": "9999999999999990e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "90f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3A9C1F693453C8896BFC78E24B6FF9811D7323903451848B05128F531F0AA6C9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-105863825.248082" } }, "PreviousTxnID": "99A8717E6896F088193B992735E7478B0CFDCE04294DFA558D5C80F0D088ECB4", "PreviousTxnLgrSeq": 67974219 } }, { "ModifiedNode": { "FinalFields": { "Account": "rEkvHXE15kSe5Vh1b7RQrDqKrMUqAzsjGW", "Balance": "267427559", "Flags": 0, "OwnerCount": 58, "Sequence": 67132159 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3AA578E27806254ECAD0080963DA8954E9E5D2CB510D3EF4537B97DEA2C35FE7", "PreviousFields": { "Balance": "182851722", "OwnerCount": 59 }, "PreviousTxnID": "D53F6602300E9E12C00E1DACDDB767893785801A5206F0338007A326DEB90229", "PreviousTxnLgrSeq": 69056718 } }, { "ModifiedNode": { "FinalFields": { "Account": "rPy5zQthBW1gHiWbdHmbPkGtF9jM5XQGNs", "Balance": "125565629", "Flags": 0, "OwnerCount": 27, "Sequence": 67541002 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3B08A1CB0D4A0F84E3889BFF7AAD28205095DA6FBAE56C99F521CAF19EA893B4", "PreviousFields": { "Balance": "66187325", "OwnerCount": 28 }, "PreviousTxnID": "6F44D727E773BF79A844B972B21D82AF1336DEBBC657A7B678B6CF58B5EA4F08", "PreviousTxnLgrSeq": 69053384 } }, { "ModifiedNode": { "FinalFields": { "Account": "r31dxSZgmArpDtwoLPAftYtU8bHauuxwA5", "Balance": "56978474", "Flags": 0, "OwnerCount": 5, "Sequence": 68766345 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3B482058938F96D3C1373BD0B0382DBF718351187F51955865FA9D1004E67C6A", "PreviousFields": { "Balance": "25887579", "OwnerCount": 6 }, "PreviousTxnID": "E05B0BBA53D7211EB6AF7876209F249B18CB7AC9BD1271A2BF511DCDF998F020", "PreviousTxnLgrSeq": 69026209 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUEnyBAH4xxjS4ZkMrki8GnNvsvysjSuZy", "Balance": "1429216663", "Flags": 0, "OwnerCount": 303, "Sequence": 66504749 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3B7337AFBD86F9BF2CDB02DD212D14C9AC008CC99B5016AC7951DD11A6B357A3", "PreviousFields": { "Balance": "1403170888", "OwnerCount": 304 }, "PreviousTxnID": "3A6CC361AFA82874FE1A534D2BD6EB84F15787B27FF56D94E4D093AD288AF2F6", "PreviousTxnLgrSeq": 69063393 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfzG9eLEj6jZUbign4K98pmLSQt717FVaj", "Balance": "64663507", "Flags": 0, "OwnerCount": 9, "Sequence": 68887829 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3B9A52DEC6C6C30591ECFF175EDB3CA15232DC751B8E3D2A253CF1F96FB32AC6", "PreviousFields": { "Balance": "31715616", "OwnerCount": 10 }, "PreviousTxnID": "25C30A7F8A64636EEDF0C39ACB2F735E701A560729027F80A4A529BB579F7963", "PreviousTxnLgrSeq": 69007450 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUkBkCrKSXyNbUcj7hNC684Z2TrzouvZBr", "Balance": "185003120", "Flags": 0, "OwnerCount": 6, "Sequence": 67458716 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3BA2AA4A0FB49E543CED096FD31CE4E3E1CD7C965E8AC19E48B6071E7BC25E14", "PreviousFields": { "Balance": "28545977", "OwnerCount": 7 }, "PreviousTxnID": "B12E639C3D165CB56C840F7A8CEEE8F5126232672F53C44566429C891AB77BC0", "PreviousTxnLgrSeq": 68911732 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "f", "IndexPrevious": "d", "Owner": "rpzdffxTgRvMawxbRSs9c26T1FTEjfgznz", "RootIndex": "34462DA9C9AE1247915240AF40DD5D4D7A0EB387151B892062B71DF45EE49138" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3BAFE1B8690FB7D7A4326A7DA0E932243381F9978751480E915F4980AC38B390" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJMPwHXPwcnQCNmNbaRq2Lf5nbsivkCJrH", "Balance": "341619473", "Flags": 0, "OwnerCount": 141, "Sequence": 67216411 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3BB1B482C5D0C2E3BF026D3B6507FABCA73F455FFC7DC5C59122AB89DA534E99", "PreviousFields": { "OwnerCount": 142 }, "PreviousTxnID": "01580243FCF422F17903FA905A6ECCBCFFE5807AC61C9F6A96CEE5563988ECB2", "PreviousTxnLgrSeq": 69040905 } }, { "DeletedNode": { "FinalFields": { "Account": "r98DGNQEGR9x2bhRVBbuiHAqxq2aDD6pKa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521144995DE0F31C", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "C63619F313EE594CE542ACA3C1A3120F6CC5A9AE4BE30B6D4CFA781766220328", "PreviousTxnLgrSeq": 68976750, "Sequence": 67202745, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3BBB37AE9D62FD277B105FF1A170945D550C8036A552928FE6B13B5D65173C5C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4841200573376926e-4" }, "TakerPays": "2353065587" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r3pJZNxQwVRMyeohSyy5C9ZCJzvRWVAXLg", "Balance": "299655605", "Flags": 0, "OwnerCount": 72, "Sequence": 67434618 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3BCF443355E98B4529C8ED16299D3FF6AB66A7EB0FC8470F02297F746EBC9145", "PreviousFields": { "Balance": "159024730", "OwnerCount": 73 }, "PreviousTxnID": "3D430682971BEB67F6E19CE13E4DA7F98129B10E6BADC09F7E521CB650E2ABD2", "PreviousTxnLgrSeq": 69063131 } }, { "DeletedNode": { "FinalFields": { "Account": "r3VQGy3EVus3nKJz33du7UqZDMFEnVmHLL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521264D1E0C0AD70", "BookNode": "0", "Expiration": 726771908, "Flags": 0, "OwnerNode": "6d", "PreviousTxnID": "00CB001DA986E663228737910E461C510C0079BCB6A53C331A2E8A9F4F1AFA04", "PreviousTxnLgrSeq": 68945821, "Sequence": 68248234, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "19072058.823" }, "TakerPays": "98743" }, "LedgerEntryType": "Offer", "LedgerIndex": "3BE2070FBEF55BACE1B41055C398DF3933F1236323F7ED26F9A3A175EF03A100", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9724954411.5183" }, "TakerPays": "50350000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "8", "Owner": "rKeFfq8ZvHbFWbsQBAeTB5Ng7aGtoLN84K", "RootIndex": "58A8C15F8CC7918E70D676CAE346D516C526A39F891659E227CD5E3A3E605221" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3C066125508FB9207CDDA41A7C930C95DA2035DB4AA51650FD2FF012A36479C5" } }, { "ModifiedNode": { "FinalFields": { "Account": "r92aDr7NzvcY9DSKLE8V5q7dvnu7LvVjWB", "Balance": "1045607581", "Flags": 0, "OwnerCount": 12, "Sequence": 67564135 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3CB655F4ACF27546038CF034CB2DCA0703B7783B729C9A5D044F7ADA9F37C34C", "PreviousFields": { "OwnerCount": 13 }, "PreviousTxnID": "4528134A74154FAF4A435B612F5A1AFE3D824D90D42A6C4F1643D323191F421E", "PreviousTxnLgrSeq": 69051030 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfc7iQscNnWECTgwfRg4T6MExyVTCiTWTV", "RootIndex": "3C129B878FB44E2055C3C0E05026BC761694C10C2B0255B9B6FB70012D43555E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3CDB39F9E02F79CA82186E23ACE57A3C1260FDF2B33A9A292EBCE997A3A818F5" } }, { "ModifiedNode": { "FinalFields": { "Account": "r3pDCAfw2nB715iBJVMix9M8adFpHyfGRN", "Balance": "479390728", "Flags": 0, "OwnerCount": 38, "Sequence": 68179464 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3CEFA7472FBCE0A2A50CEB492426DC09ED7D0BF8DCA297673E79ED30D0C60D80", "PreviousFields": { "Balance": "215390728", "OwnerCount": 40 }, "PreviousTxnID": "107D9347E7502E436A0A5370B0A4F8D419C4B80CDFADFCC3ABB3017B6DCECA4E", "PreviousTxnLgrSeq": 69063680 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "2d4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLaYDDZDLBvzSGxKhxDEKovMrQ3CoDXQV", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3CF18443D636F681249A125BFE3362B66A8D8D41DEDD0BD61CC5FB9C23130DD7", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "51995FB803845C35768F4812BF22BD523E1BF2035C6443824E0F3A1F28DB0D2E", "PreviousTxnLgrSeq": 67951438 } }, { "DeletedNode": { "FinalFields": { "Account": "rNPZ49ucC4zKoBPgyAsSC7oMSSoh1icnZK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA92DF12D2", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "80FB9B27D39D324D4486AE832D7B4A65D5E12672BC73B9E1BCE07C295189D494", "PreviousTxnLgrSeq": 68998519, "Sequence": 67158824, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3D0557EB58D7BF07B6432C4C9423152813249D8BFE3FFB416DB787F60E6435D2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1277712118733569e-4" }, "TakerPays": "511084847" } } }, { "DeletedNode": { "FinalFields": { "Account": "rNRoroUiCSQM3hcrEkwV5p6uCx8WSm3Mjy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E57D4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "7CC1DC1F311D944CEDE487BA9F5474A7A3AF2C782F3D728306A913A94D3E1BA8", "PreviousTxnLgrSeq": 68996564, "Sequence": 66470072, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3D0FBC6EDAF332D372A5E3906F7DFA02837AA523CB54D5AE261E841DF71DC549", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8000000000" }, "TakerPays": "36000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rMrt91RkHZwmYfUbVX72iwmbiaRxnKXjo9", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAEF31E3", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "7A2BCDD33BC5C0869B16414F408A73D3929671C2653D30CC93C235CEE90341BE", "PreviousTxnLgrSeq": 68964605, "Sequence": 65789702, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3D1AAC59A2FDD1419379E015150D037836D2507A171B789CD2A95239B83E7B94", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6453287172753466e-4" }, "TakerPays": "5807958455" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e95", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rh1bgyeVNDBauF3vXuASW2L8MWrdq8XYko", "value": "9999610698224583e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3D33FBBE6208B8622D1B873D6BA729BC66790E84B135065CF3734768C3C209B1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "30771947410.9589" } }, "PreviousTxnID": "888E8581E66F46458CC4D61AFF548E9DE8565B21035F8F94F6DBD640666A2DFF", "PreviousTxnLgrSeq": 68994737 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rGRyfRcJ7cSYSu6rw5VpNJReEZt9Gzy9a7", "RootIndex": "A84E96499A7672D22BBC809E15BE6C7AF5F5754462DBE246FCA564DE0499D669" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3D4389AA9A0C292C55B4DE713250B791776C994D1BFB371509D72C37A59557F3" } }, { "ModifiedNode": { "FinalFields": { "Account": "rUdhzvzWjHpSjP6CGksiit3bdgGLV5DXZv", "Balance": "23350710025", "Flags": 0, "OwnerCount": 57, "Sequence": 67546192 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3D8A9D72E8D20B9319ABC3339E8EBAE43CA61FA8C2A8C0E02C40302403211C05", "PreviousFields": { "Balance": "22750710025", "OwnerCount": 61 }, "PreviousTxnID": "2B6F49331D45A7EB98EAED58E7A9F0545B7F7467FD588A2B24D3E60E071075A3", "PreviousTxnLgrSeq": 69031362 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rwSQqB6yNHd2tiXUhJ2wkULgq3dFua1r41", "RootIndex": "CE6352F3CE91F872B5D403EBC3ED991F2E309EBFDCBA87F4273CA93E344E695A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3D8F602397870D60AA32F742F6182D2A5DBAB5FE452F59C846DDF9E2C20C358B" } }, { "DeletedNode": { "FinalFields": { "Account": "rHvia9Ti9HmM9QGixKxxKf9kYS9LUxTrjq", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652097A88283040DC", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "B5AD7E28E35B322ED65F04F6B50C0A16CB42937AF8340BD185AAA76023BDA3F6", "PreviousTxnLgrSeq": 69025849, "Sequence": 67121142, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3DB43519524539905FF0FC66DB6973E4932FAFBD631F8A29C5B45A6A473217C0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2446244798712641e-4" }, "TakerPays": "652658112" } } }, { "DeletedNode": { "FinalFields": { "Account": "rJyPfhC1DLsG22KEG4jS5mDrGtoDcwZDty", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530498E2D91E9F1D", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "D90DA6502BBA6534E18F46F32C739F6EBE6B50719F9A65A3F6130B5425337DA3", "PreviousTxnLgrSeq": 68153641, "Sequence": 67175991, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4282294426.3" }, "TakerPays": "55412889" }, "LedgerEntryType": "Offer", "LedgerIndex": "3DCEB085A260B46D2F797EFDCD9A8E5C77B590DB1AC6078D60AA41E9059311E2" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rfXqSEeWLr4MYYLsESHbsyh3CZhAitzYVg", "RootIndex": "43F6B52E4C07481E02B9C2573351D31C4CA312B6ED70E1C11A3AB101BA9A2980" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3DD2888693AAEB79946D5C2817D4847802E93FF3D4B2AE3C672133EE9AE427F1" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "161537611.0459" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "54e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHwM7GiRubuut3pJW2ycC4e6vaarV5xp7", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3DEA06F30B8A72C0C796AF04782A1A33DA0063F6A21C76AE698F1BF5C93E9275", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "94783576292.6939" } }, "PreviousTxnID": "CEF5CBBBED4ABAAA6FF6A8DA8347862A3E389A63C8D6A1897D88545C68B7A920", "PreviousTxnLgrSeq": 68883633 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rEkvHXE15kSe5Vh1b7RQrDqKrMUqAzsjGW", "RootIndex": "C2C984AB11E70690A2D4C53BAB0AFA414775BC226B99BC9EF7829CA2D47E4C2B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3DFE2B257E5F9B633AD2FD3A9C57F6DD82DF0E55381FDF1BE6BF98DC50159F81" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rpcz3Nun3FcRunaTBPPZ6VK8De82hr2DzG", "RootIndex": "324B0F4AC27D871A33DA4F27ECEC6CD9612E5F65D525E9549ED360D8F84427C1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3E06256A6A22BE6D4C17C811DBF5EF26E1520D4461D2F350075BF2F05D202CC1" } }, { "DeletedNode": { "FinalFields": { "Account": "rh9MmnkJaQ1P1Y6ZzmRFpQAc9UdH6pKTiS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208577E59EEC000", "BookNode": "0", "Flags": 131072, "OwnerNode": "25", "PreviousTxnID": "D277A3539CE1420C19C5F9D3DA02B8BAD70BFFB5C694479AC10EC42A29E0C176", "PreviousTxnLgrSeq": 69038589, "Sequence": 66703759, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3E2343D9FC4FEF4B9FCCD5BA5FEB3B3A3364BFD8C550EE2004D557F1A64B5237", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1740000000000000e-4" }, "TakerPays": "408552000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rExSJvWnn93G5NfnzZ3YKuPgpQnr8wBsrE", "Balance": "106708836005", "Flags": 0, "OwnerCount": 258, "Sequence": 63810446 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3E48570B16D412B9A14DF0544C463E64379C51D42C7C4A10D5EDE81F4CD0E6D9", "PreviousFields": { "Balance": "102930975239", "OwnerCount": 260 }, "PreviousTxnID": "6CBF760ED0E3A6F950EE97458A6F9A735DD3217463EF69D4B749DA8495418288", "PreviousTxnLgrSeq": 69064082 } }, { "DeletedNode": { "FinalFields": { "Account": "rJFmgWo13y1o6C42H1LC7qDWcu7Z38QaAd", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "EB20D0C490FF834EE159D2F49171E1276216D29E230C2B4127516E85DCD12BD2", "PreviousTxnLgrSeq": 68897699, "Sequence": 66550662, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3E50AA5003041D593CD5C40533289B5B2E40D2429C55133D8B41095160225166", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "40000000000" }, "TakerPays": "320000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rMDc7eVhCw5jjCXU5DGpn2tUV9D7aBBFLx", "Balance": "509530431", "Flags": 0, "OwnerCount": 113, "Sequence": 66970290 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3EAC03A78BFB672F3E9B7ECD730F269DD5B9F294FD7B48E3FEE56A69F598C535", "PreviousFields": { "OwnerCount": 115 }, "PreviousTxnID": "2ACEDE5F970DB0B0AAF3478FBA6D1AE44B770855B4A4863C03B69554C4B4B808", "PreviousTxnLgrSeq": 69045551 } }, { "DeletedNode": { "FinalFields": { "Account": "rPc9ia41Ad7unkvCE7gKKZPovAuCBPt63E", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E4E4A980", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "DBA2005B081D693B0AA0119EA1F03FF96471C9FC3FE582E78110B32CD5A2EB33", "PreviousTxnLgrSeq": 68986215, "Sequence": 66718055, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3EAD99F9EB55A550444875D6A12F5A0A46309A6C617EDE91E02C85C68E1BA2DE", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "449999999" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "f05", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUqgMfiCKp2L5Y1zobkQTgSdVYLp1PASt5", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3EC41271221820336D64EEA56C48153D52D760A58B078A151DC179A7AD4C63EC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4223866751872249e-4" } }, "PreviousTxnID": "AF0FA5F6924B70D611931AFA16296A8A9A4FBC0A48749D2F33FDFB070FF7E25A", "PreviousTxnLgrSeq": 69021100 } }, { "DeletedNode": { "FinalFields": { "Account": "rPCYDR6z5MW5EvxVzPhVa6cfLyckEDWs5T", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305A618B886FDFE", "BookNode": "0", "Flags": 131072, "OwnerNode": "f", "PreviousTxnID": "852C7441C19B7AFBDA6D1D519EB7321CEF9C4DD8A890D0F51A31CD4E0FC4D2C5", "PreviousTxnLgrSeq": 68915408, "Sequence": 67105315, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3EDB314E340D01087B75854EAD6DCC88B559D031AA798DBD13ABBDDD2F3C2A26", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "123797238" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rJNmHPHrMr649at3SBHakJ38mRAQZA9pvs", "Balance": "612032230", "Flags": 0, "OwnerCount": 284, "Sequence": 66004548 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3EDEA9C0AEE2A95DA55851558428B56EC3962B0C11C202BB0336E86C1E09135F", "PreviousFields": { "Balance": "592032230", "OwnerCount": 285 }, "PreviousTxnID": "701185994EB20326D5698429D9F045C0B540CF84221E26773189EA3CCE013E73", "PreviousTxnLgrSeq": 69062790 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "9", "Owner": "rJjTUAWDqunqKUB8SgYHV8QNTmvGArX4Lv", "RootIndex": "D98CD6748A45C1154A0D6C7F78EE70B37CDF8627B89AA865F3955BE0A64F320F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3F0250BA8C7F5CD78022624C13859BB1E814529FDE563151BD0EB1C7A85474E4" } }, { "DeletedNode": { "FinalFields": { "Account": "rQnNwoWPxGyxMoLogTPHYeK1hGYwJ3b9Sz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652149B11BA8EB0E4", "BookNode": "0", "Flags": 0, "OwnerNode": "2", "PreviousTxnID": "6D9B0CDB3B4F1476C6F8E28C13B2467C5C3BAA44015B9D19A26083A7C5C29FCB", "PreviousTxnLgrSeq": 68923053, "Sequence": 67671641, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3F57960ABFD7B6C036B6582196FFBFEA7752CE77AE13CB38B04F789D7E186E6D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "31784313725.49019" }, "TakerPays": "184349019" } } }, { "DeletedNode": { "FinalFields": { "Account": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8BABF205", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "C9F9D99911988F5E21D13BC564A501C62EDDE959F2CA2B6CDA03ADB184D4E2C5", "PreviousTxnLgrSeq": 68983986, "Sequence": 68499488, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "35262773016.58055" }, "TakerPays": "152299916" }, "LedgerEntryType": "Offer", "LedgerIndex": "3F98D05931905BDA1D031395CEE082A83FD430674178B4637FB867711FBD2097" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "value": "9999610698224570e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e8a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3FCA2553700CE5EAF5FC76F098CF2B3ABEDD367C59D8ED11B482E43097311A86", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-279913459.29345" } }, "PreviousTxnID": "E417C9DE099FA7843976A7600F48E096AF8E0B781CF41A3082F1E8169F00044F", "PreviousTxnLgrSeq": 69059893 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsHib22BtXCKbRdrodUNNXdxumiaPqZQVk", "Balance": "291661726", "Flags": 0, "OwnerCount": 5, "Sequence": 68089120 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3FCF06331A7D0D81CB551E946EBEEB272BB0AB6F229133A4C3EF568E047FA48A", "PreviousFields": { "Balance": "221661726", "OwnerCount": 6 }, "PreviousTxnID": "E6A6537BA7B409AB7C1162D066057D9CAB61701D331AC4E18F76790CA76B9A79", "PreviousTxnLgrSeq": 69064174 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a26", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpBHrwSGdQm3hE3f6988mSgV9LAzuBsx9A", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3FCFF2C36753AA9801B5BDAB527E57F5AEE90F88DE36EEAF40E05557EEF858D9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "A43BAAC12674166364EB5EBCF7C39B6CB4E7F5AB3EE7A0E60049DE3E86452ADA", "PreviousTxnLgrSeq": 68898851 } }, { "DeletedNode": { "FinalFields": { "Account": "rHwM7GiRubuut3pJW2ycC4e6vaarV5xp7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210251A9C6B398E", "BookNode": "0", "Flags": 0, "OwnerNode": "3", "PreviousTxnID": "1F9417BC9D8CC0DFEC6C84EB6CC29EF5D3FE33286AD76224495A10B9FCB156CC", "PreviousTxnLgrSeq": 68987580, "Sequence": 67173377, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "3FF7DD8C4008CD1E45CA73383AD018FA5CE244069C05863A3DA7D3FD9CFB2D54", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "94622038681.648" }, "TakerPays": "430000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rHwM7GiRubuut3pJW2ycC4e6vaarV5xp7", "Balance": "644591328", "Flags": 0, "OwnerCount": 96, "Sequence": 67173394 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "3FFB2F904137D89D329C055F6DACFEBA947D6622D40284407665575547979CF3", "PreviousFields": { "Balance": "214591328", "OwnerCount": 97 }, "PreviousTxnID": "BAF5AE1028D4901BA70683FB3EE3731BCD79E71C5849ADB60C839B3237A2A1A1", "PreviousTxnLgrSeq": 69062643 } }, { "DeletedNode": { "FinalFields": { "Account": "rwhKYMZGMmf9zeLdZWq4rs31DQeaxn65R2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EEBE0B40E8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "1A8461A0502B98A0CED1BE9D049A3E8C394B06E90BE7A8161F6DE7F9E6193235", "PreviousTxnLgrSeq": 68999070, "Sequence": 67373555, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "400F307AB9C3D69174B06AA94922B1838676CC8273EC55B3CF3B05E50BB37A61", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6500000000" }, "TakerPays": "27300000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rsZ4iqWpnTmdfE4nDDEiaGAn8z97ZV4Zm2", "RootIndex": "401B71FBC28C9ADC161A6D14C584C3B9C7B0BB4BB6C59A35A17559E5CAAA422B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "401B71FBC28C9ADC161A6D14C584C3B9C7B0BB4BB6C59A35A17559E5CAAA422B" } }, { "ModifiedNode": { "FinalFields": { "Account": "rNdfpBhUB1ygnu4z7ebbqLBQH5K8zejbu6", "Balance": "6383347939", "Flags": 0, "OwnerCount": 45, "Sequence": 67194496 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "401C2A10B0DD1CD72762BA66B0B94EC68C3A1F1464A586CF1C188053021E9052", "PreviousFields": { "Balance": "154556047", "OwnerCount": 46 }, "PreviousTxnID": "E374DF7BF00C304396407592BFA738F1006CF4A2BD0482E9F20840F6739604DC", "PreviousTxnLgrSeq": 69045336 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2225708790" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4DDKcQaxRVhr17DMzNSrAYBvarHRXBJg5", "value": "9999999999999999e-1" }, "HighNode": "3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "758" }, "LedgerEntryType": "RippleState", "LedgerIndex": "401C62E908889BB9D485383F8BC653AB78E24D6D8DD3B69BFB4444C7B7F90C12", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-6139277172.004735" } }, "PreviousTxnID": "D0B8A8A92C2BB260410FC71278BEEB806FFC524AD157D37E64903522C5B9B93B", "PreviousTxnLgrSeq": 68990978 } }, { "DeletedNode": { "FinalFields": { "Account": "raxn3rqqdW28ZVrFAQ33AUrvdaTSv34DSX", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680F3FE73", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "A983A4525293DB762BB415D97787ABF69E6C0B86D5A5E89D476903B8CD3D6524", "PreviousTxnLgrSeq": 68900282, "Sequence": 66385964, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "40249B1AA4C530A08A372F9EED3E81DC390FF562424636E9AC55FC12A994405F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "54501929" } } }, { "DeletedNode": { "FinalFields": { "Account": "rLFVckNbciXAqgedJM92yZX7653rXcn4JZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937B9A90D", "BookNode": "0", "Expiration": 725900449, "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "00282453105F44AA900624EEFD88707D8E2A3BA01EA543A4EC331AE4C20EC9CD", "PreviousTxnLgrSeq": 68724066, "Sequence": 65356284, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "403C46371D9D6CDA49A309939242D7FFE64D639C85D658C342AC7B859381D411", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "11785989866" }, "TakerPays": "589299493" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rah3AgBTwgnCvR5aJfj4p6Gy98hZt57gXD", "RootIndex": "93F9F6AF2DDABD7559F4DFA5B2579FAC06CCDB9C82DDF7925B360FCB0F9B41C2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4076F33DE286AB35B6C36E1FDCC0DFC9AB1F1FF56AD45A5AFF00AD0CAEFB43AF" } }, { "ModifiedNode": { "FinalFields": { "Account": "rLgitcbChWYinjw7tiwK6wQw2mN6pEyWzw", "Balance": "31437026868", "Flags": 0, "OwnerCount": 14, "Sequence": 68303395 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4077A3EC0C92AF2F54AD2D323B7A3DF8A74E32C59170A2532507C25035F94779", "PreviousFields": { "Balance": "20761267830", "OwnerCount": 15 }, "PreviousTxnID": "5BFC5AE78C283665A537E5E8F23C0374A6258BEFB6EF2EE3FED9E13C4863F18E", "PreviousTxnLgrSeq": 69064022 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBVauSrW9MhaNcszTL125KttqSixQmUDuK", "RootIndex": "40B5021548C24CD8915E0AF6ACD84367EF690FC6720E67396ABD150F7BA30E6F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "40B5021548C24CD8915E0AF6ACD84367EF690FC6720E67396ABD150F7BA30E6F" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1223344117964717e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "dc9", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsHib22BtXCKbRdrodUNNXdxumiaPqZQVk", "value": "9999844278072650e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "40DFA787DFD0D4F215F65A2F4DDD2C82DB18E108239817B61C5C510BD8317A80", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1579857382310429e-4" } }, "PreviousTxnID": "C585DE9EFC655D44508F2D2F70B1B8E51A298DB5B652C32AAB4C4215A52AA71A", "PreviousTxnLgrSeq": 69064076 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rh2ExLW6MJMJdoX7386pzfkNbhHSjqVWtC", "RootIndex": "40F288A40D9B7CC2F9DEACEDE64CD9F9C4E501DFC1C88AEFACB7A823A40DDA69" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "40F288A40D9B7CC2F9DEACEDE64CD9F9C4E501DFC1C88AEFACB7A823A40DDA69" } }, { "ModifiedNode": { "FinalFields": { "Account": "rBCcUJicoai17VVsbUKJ7BGqDa7dQ3549N", "Balance": "3351610618", "Flags": 0, "OwnerCount": 50, "Sequence": 60850431 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "40FDEA6F82435EC4BE9691961302348A6BCC912019F6974A42FE6AB39BDD4654", "PreviousFields": { "Balance": "3098401432", "OwnerCount": 51 }, "PreviousTxnID": "39081772BA21556F706D1311B1EFDCE7A35CCDAB3388AF767B68D2AFDC8CDD7B", "PreviousTxnLgrSeq": 69059173 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-3836844060741216e-3" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMDVXgBGXnNiVt8b9uXXwhQC5W2xZXPweh", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "43b" }, "LedgerEntryType": "RippleState", "LedgerIndex": "411C37CCBC68FE18CA42515E19B0A93C99228460D70ABBD497554EA5112B22AD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4036844060741216e-3" } }, "PreviousTxnID": "383364AA21EE5026DD631B0A111DECB5777BC47C7C0261F83B458AFF267E2D2A", "PreviousTxnLgrSeq": 68883373 } }, { "ModifiedNode": { "FinalFields": { "Account": "rspLJnfzomVceQKCn6ExME3gJEUuhUZxdV", "Balance": "2852702772", "Flags": 0, "OwnerCount": 227, "Sequence": 67373864 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "41554F0E7ED13739F6ED665299CACAA020FF640062C052743DB4CE8A724D33B8", "PreviousFields": { "Balance": "1802655238", "OwnerCount": 229 }, "PreviousTxnID": "4D5B655449BE049C4A9E814BE2A014D5373964BB8126FA816C0C5D9895F50000", "PreviousTxnLgrSeq": 69062676 } }, { "DeletedNode": { "FinalFields": { "Account": "r4VjGvXZQwpAy5iqMCt6kbSbFb7Bi8RYEG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213BCBC4C8A7050", "BookNode": "0", "Expiration": 726681314, "Flags": 0, "OwnerNode": "1", "PreviousTxnID": "573B05743FF228C76D45A3E5EE570F30B3FF353FD9B89C7605CDFA7E17D465CA", "PreviousTxnLgrSeq": 68922725, "Sequence": 67388818, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "16900062250" }, "TakerPays": "93888996" }, "LedgerEntryType": "Offer", "LedgerIndex": "41645688F463DDB09DA06C22571DB726F3F45B882D392180991F2CF53B9D6684", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "27000068400" }, "TakerPays": "150000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rGBMsWXEYwQCyqK6QsrivTQsACXbfL1735", "Balance": "202249019", "Flags": 0, "OwnerCount": 54, "Sequence": 67792811 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "41CC22596F5DB845677D35E307201E1B41D00387A93FF63E205FEC2ED1194EBB", "PreviousFields": { "Balance": "122249019", "OwnerCount": 55 }, "PreviousTxnID": "B0AED90B0582F9831ABA7079B1087946EB0A728398CA064ECB77B0332CD7DCDB", "PreviousTxnLgrSeq": 69055562 } }, { "DeletedNode": { "FinalFields": { "Account": "rEq5qRY3MvKgqLUDbPF81FQQe9iEfS4xPs", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E53F8CFB", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "74C9EA25DFE4DF056A0B9B34A9A3FD0863202504802C9470E3EBEFE228764C26", "PreviousTxnLgrSeq": 69032728, "Sequence": 67431667, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "41F47B6919AA62812A71C85A5F012076538E68F3644FB7FA4341662107D4E29B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1137995447689225e-4" }, "TakerPays": "512097951" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rJfV6qTHdF774uGTdRHQMxb8NSF6TWu4uR", "RootIndex": "420253B840E1FF7CEDB7B989FF087F45F6484E817058D442D630ED0F858DDA49" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "420253B840E1FF7CEDB7B989FF087F45F6484E817058D442D630ED0F858DDA49" } }, { "DeletedNode": { "FinalFields": { "Account": "rN57KF6tqiqqc4agjC6nvZeQzovWYEPDCT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C41361BE61000", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "F5DD6000A26133E8C56EE29F87EA56B33F3147BF2DD677BDAC5BD9DD0A8EA98D", "PreviousTxnLgrSeq": 68897697, "Sequence": 66619024, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4221A7164097BFAE3D437F0893CFC89C1FD4ECC4AF758EBF6472FA2320FB78E4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "79530000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rPKNCAkooJFM3LJ17zG3wJyxrjnNuHkkYh", "Balance": "649003848", "Flags": 0, "OwnerCount": 47, "Sequence": 67345100 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4266C10F3125384D6382973152A97446ED604384F34C0B2D34168C915BF51944", "PreviousFields": { "Balance": "109704355", "OwnerCount": 48 }, "PreviousTxnID": "E0CF338773D92F7B3A1873161FA4D8A9B27F4473544DCEC2A40B156CBDDB1214", "PreviousTxnLgrSeq": 69033321 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfq8N8xR3stwknY7Smup425CUFCjsTwcWP", "Balance": "302094631", "Flags": 0, "OwnerCount": 89, "Sequence": 67058233 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "42AACE71F94CD570757FBADEC3F883EE310D143BC17311C5308F1A3C5874BC90", "PreviousFields": { "OwnerCount": 90 }, "PreviousTxnID": "0F804F750501754C2762FCB8416A7B0E089C143CA0D54928200DDA962308C819", "PreviousTxnLgrSeq": 69062108 } }, { "DeletedNode": { "FinalFields": { "Account": "raZJeAMN8WHNBRrVCc5RXYfD7mAuKctiwE", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26EFD05C2", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "3EFF777C44B30FC741D3EA4810B6F66A95ADF68F194D104696A7F490E0E749F1", "PreviousTxnLgrSeq": 68892805, "Sequence": 67450374, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "42C36791DB8A284739FF1E0C0B6F3F526A8213FDE1431F8228273474720F9A76", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989900" }, "TakerPays": "778598989" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "25000000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ee3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9vQtUmSgHmDFpc6K7BKLj5JvGBEbvwP9Q", "value": "1000000000000000e-1" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "42EE357291E384AA7DAF6B8F604F4C536C7569369A481AD6422FFD4739B376C7", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "65051845672.48726" } }, "PreviousTxnID": "E85100D7D28974D43CC85801527E745F139C70DA00C905A3AAA8A9E9B12DB4C9", "PreviousTxnLgrSeq": 68922338 } }, { "DeletedNode": { "FinalFields": { "Account": "rEm8Pg6dKSuFWvEJK2Fnv8EvmkSTuNFJew", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "0D73060D27C751E34F142118ADE47E94C7C9087DB43753F1EEECD12E6E68AD41", "PreviousTxnLgrSeq": 68898503, "Sequence": 67761558, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "42F8DC08657188881789F809CB00D5BF0CB83A0837E410B2D110025FA4172B1B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "60652861" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "9", "Owner": "r4YqG4eX9uskEYbdZVejyRmkBgM9pSo8q5", "RootIndex": "2B92635D6FBEB0B0ADD7B4A53C3C278BB763383142F889F71BD25BFCAE9D641F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4300CFCE635ED5EC35506305A4F4B5183338AD533F890899392B4D0B7389DA2E" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1963937061140000e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "5e3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "value": "9999999999999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4356E2C63A62AFFA982456E139C2046729AA6BF8A3111CB743752DFA2689C732", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2503937061140000e-4" } }, "PreviousTxnID": "C0979582A99968A0BAFF23B63046649B992A6345AB8B892D891FE5B60F727EE5", "PreviousTxnLgrSeq": 69031084 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "d", "IndexPrevious": "b", "Owner": "rPvqZW8q9bpYrAKjGhtL7AZAq8bvqEQDuq", "RootIndex": "7CE92CB8321AA7D751ACFFDFA2859B616098A007419237F182BE91B34724F79F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "43778649A9821ED6AF613F46424E2B3EEEAF855FF2440C3A14DD0BC9226F791C" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rasT449dxdmpB7Ak1GqwE9TdrkZEty1tAZ", "RootIndex": "654FDFFA8EEF6C4BF65DD5CA7898A39066C444D2C935E530452CCD81B683D8A2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "437920AA7DD1D9ABFBC30056C0C788E3CF35ADE840E4E33853389DF0555D4636" } }, { "DeletedNode": { "FinalFields": { "Account": "rLN2tJYrH11YA3EqyNw6csgsBEnZ9TeaWF", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAFA8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "5212E616793BD21E5999A32312AB56A6BB09EDC22F6CADC6D749127E15E19002", "PreviousTxnLgrSeq": 68654466, "Sequence": 60035720, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "43827EE3752409C5429C59DC7E716709573142589ADDF0399A07AEFCA20BB88E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "900000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "24596927696.24683" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "db3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBMPrNjN4FCHpC3wWAdrorVra71nhSRkuK", "value": "9999922137971320e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "43D20AE025050FBC035862C3235ACFD18B10C5A4DD9220F57B6B7C32E0399816", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "55104744993.91729" } }, "PreviousTxnID": "688D763E4B789FE7334F6033430C5C5B81C5FBB506A2A7452DB221A67DA19A60", "PreviousTxnLgrSeq": 68990605 } }, { "ModifiedNode": { "FinalFields": { "Account": "rng5s7vNgzx4BPJzacK2YWUqR5u1aygzWw", "Balance": "1236631477", "Flags": 0, "OwnerCount": 253, "Sequence": 66390043 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "43DB95322735A8D186323BE789E3D3C3AD0D1F0AA1C027EDA6FFED1363AC1A07", "PreviousFields": { "OwnerCount": 254 }, "PreviousTxnID": "3BB7CB4526FDFB1ED40E76C3840ACCF91B3035D1E26AB87E13624C2AE1D77E28", "PreviousTxnLgrSeq": 69062985 } }, { "ModifiedNode": { "FinalFields": { "Account": "rwEP45SodNayAXhoEQeJmXaky391SxGRZz", "Balance": "24000000", "Flags": 0, "OwnerCount": 7, "Sequence": 67338133 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "43E8BC6EEAE7521F93FDE76D3B92D60B999759B05146A8D1658D24CFE089EBA9", "PreviousFields": { "OwnerCount": 8 }, "PreviousTxnID": "7E2F30911A74C52DDF7EC21AEA442C80FE45591975DB74DA8FC59783F1750E3F", "PreviousTxnLgrSeq": 69056674 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "41595659804.925" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e0f", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rs4wbWdssBMJRgn4tJak3eq1JgrJ7Pgfnk", "value": "9999688558266541e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4400E414AA33A2BF1C337F1DEE04CA059C6790AE66F6EDEA20FD5DF8D8C42CF6", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1303186471049250e-4" } }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e2f", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3VQGy3EVus3nKJz33du7UqZDMFEnVmHLL", "value": "9999688558266523e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "44288A74E1742748E2604D78AE1690453237E67E555FBC58EC0DF78C23FE5001", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "9705882352.6953" } }, "PreviousTxnID": "A815BC460615D7E28A7B11F98EE1B23D3134E74AA1C460BD8592E602707BF14E", "PreviousTxnLgrSeq": 68945813 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNLPZmai318pizfUNmkebSrtsR5mFvVVWt", "Balance": "4644852511", "Flags": 0, "OwnerCount": 85, "Sequence": 65894241 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "446035CC41F0CC3D213898A6892E36BDCA662F0B7C4937E1F6E50532BD2516CC", "PreviousFields": { "Balance": "4574852511", "OwnerCount": 86 }, "PreviousTxnID": "DF81ADCB2EA506F974116933762452B39AFAC246C624161F0FEF180A9D97631A", "PreviousTxnLgrSeq": 69052733 } }, { "DeletedNode": { "FinalFields": { "Account": "r48QoxLkkqiwjzhposyFj61op7AtvR5aLq", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72F0A4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "ED542BB8AABF500A270637C12C4DBA01F6C028506420D5C7E4794FC0091FD2AF", "PreviousTxnLgrSeq": 68912437, "Sequence": 67928318, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "446E5FEDE0ED829B8C7E78EFAC8B32E41055FE87C35BA87E3150FAF563BACA26", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "16155000000" }, "TakerPays": "105007500" } } }, { "DeletedNode": { "FinalFields": { "Account": "rLhtdRdeGcT6UeQivqPu9DBXWHZ1SDpsar", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72E0D7063", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "DDF60FEA029E9D73CF0D7141B037895D936DD8CCEBA23575B2EDC93C449B00FD", "PreviousTxnLgrSeq": 69051376, "Sequence": 67537008, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "449B8E9989920AECD1F0AE9CE23F4349AAF52F7C87F40EE5E68D169AD36F5E3F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "50608934" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rf4YQSYpheUvWxMx5rmSgr4vdyvu7tWUp4", "Balance": "719075998", "Flags": 0, "OwnerCount": 78, "Sequence": 66770783 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "44C227ADC68B2E4C465574C022AD438BA223C621CD07E7401E956F11FB00E04F", "PreviousFields": { "Balance": "574493186", "OwnerCount": 79 }, "PreviousTxnID": "0F8DADAD6CFB2CC755AC8AF9B22C5DDD74826BDB4C26487665E7DC001F6729E0", "PreviousTxnLgrSeq": 69060173 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsPnG9Kmz7rf9fXRZ7zrVb8tmmjUkUEpin", "Balance": "4232134595", "Flags": 0, "OwnerCount": 139, "Sequence": 66616050 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "44F2C14394BF3A1A0D1FE04FFD105D2CD668D6C546B17D08A90882CE0E9E62B9", "PreviousFields": { "Balance": "1232134595", "OwnerCount": 140 }, "PreviousTxnID": "D13B8E9D35264E2DBCA4A7040AA414FB49C3A819BD99F4C4814CBB24DF1D79C7", "PreviousTxnLgrSeq": 69050223 } }, { "DeletedNode": { "FinalFields": { "Account": "r3LLQmhVJiQ3r5e3QCo15yaDumDNp7Gn1r", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF51F195426", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "213551F5874F0FF8B7EEC34EE14E793F59ADDD7928C1C9948F1BFF02B0D854A2", "PreviousTxnLgrSeq": 68155562, "Sequence": 67712563, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4529206E5B9CE24592708139DAF822B4509998592E01963871FE5A51C10A41F5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3892994933" }, "TakerPays": "31143959" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e37", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raA94X4CEVD8GVTSQWjafELaah67aqrvjG", "value": "9999688558266536e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "452BD091A52731D4F5D6CCF8740BB387336466C2DB08FC35FFDB5883650DEA49", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10000000000" } }, "PreviousTxnID": "E644339C3577108557CE43BC89F2FD81B5D0250CA56B9E05C6B9B24CD0C6CFA0", "PreviousTxnLgrSeq": 68922765 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "a", "IndexPrevious": "8", "Owner": "rNRaTAdpRUh1YNTBdCu6JXdQZX2pfWo3FU", "RootIndex": "9098256A5DEEA0F5D5C994D730FBC32CC7236986BDA78E4AC0AA970E60489392" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4597089783E8E9BB77A583B190265A6CDDBE31B3B04541DACD6651A32DC0F834" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGzfdR9pNTEgc3qiShH9q3zp7KpVXgVUq8", "value": "9999766418165223e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "dfc" }, "LedgerEntryType": "RippleState", "LedgerIndex": "45C1748293055A7C2AF915BCB156732FEA8690439977C393C55F3291B884578F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-6133123803798006e-4" } }, "PreviousTxnID": "97FE6E520473447D0DABD446F445E5214896753CDB3CD1F20856556862E64395", "PreviousTxnLgrSeq": 69014749 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2371724461875721e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "971", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9MQ7Hek3iMwBnYRuHTuuG3ssJu48PHaxJ", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "45D8D388CA2B140369FDBD1FF354F0D749165D97011D7DB90263B14C8F4FB287", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2571724461875721e-4" } }, "PreviousTxnID": "3532A72678C9AA10F7CC68612C82AFE3FF9B04531039B345465867FE31D32891", "PreviousTxnLgrSeq": 68898845 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "rNNzeaYd4nSmhTirshmVBdK1zfHApVy7Hy", "RootIndex": "4612233145B490B4E804E9FEA67B0920580CC3208735ED64609843255DACCEBF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4612233145B490B4E804E9FEA67B0920580CC3208735ED64609843255DACCEBF" } }, { "ModifiedNode": { "FinalFields": { "Account": "rpiGc7vb6vr5hWMxqK2NgEVpQkYhBXreac", "Balance": "70000000", "Flags": 0, "OwnerCount": 29, "Sequence": 65841671 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "46129DB98683CEF4CAE8CBA8A5F83BD22256180268B0FE7EFCCF70FE2DF14C71", "PreviousFields": { "OwnerCount": 30 }, "PreviousTxnID": "EC63CDF8C58052DD9392595C5830D6D5FE55DAD88CE58547D504836179737145", "PreviousTxnLgrSeq": 68789701 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "f05", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9ny1UWruE383T7YTyQgiH4re75gzGpKqa", "value": "1000000000000000e-1" }, "LowNode": "8" }, "LedgerEntryType": "RippleState", "LedgerIndex": "46295C586016E6BF2C977A2A273C0CB4AF65531084D033F08F13BFCC1A44542D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "15366462099.11738" } }, "PreviousTxnID": "249D5DE9ED966468146810488DE133CD966EE7A9E2987C313E5A85432F7E7DFE", "PreviousTxnLgrSeq": 68998380 } }, { "ModifiedNode": { "FinalFields": { "Account": "raqKMtQVnQPuQpPLBoeyPbjYHSokvu1R1z", "Balance": "1772958759", "Flags": 0, "OwnerCount": 69, "Sequence": 63203977 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4651F4BCD70769E66B9C89EE0B47933CFA03F068A63A877B6375C3A1BAEE51EA", "PreviousFields": { "Balance": "1741328759", "OwnerCount": 70 }, "PreviousTxnID": "5515AD5102254770E1F5116B2480702FA982D7B7EC04CD411AE2DFE20DDFB92C", "PreviousTxnLgrSeq": 69047993 } }, { "DeletedNode": { "FinalFields": { "Account": "raqKMtQVnQPuQpPLBoeyPbjYHSokvu1R1z", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652167976A6D96000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "2DCEFFF824013D1F973CE963518127E9A05EEC2B0EDB2D37F151F1AF56B2EE9E", "PreviousTxnLgrSeq": 69032117, "Sequence": 63203970, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "46529BBA74B19566E314A38BB66347A6C130831630428A43F69C55E1261B53ED", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "31630000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rBBS1EhebBUcDs7gDa4ZuoTfmBwsRGqycY", "Balance": "511506036", "Flags": 0, "OwnerCount": 83, "Sequence": 67855206 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "46674EF605C230646F82AB3F586DA9F21CE8C64CC84EFD426E565E575A51CFE7", "PreviousFields": { "Balance": "259506036", "OwnerCount": 84 }, "PreviousTxnID": "ED38ECE5C30E080FFB953A7798A43024119E842FBF3F332DDFB8282FAC7FB128", "PreviousTxnLgrSeq": 69061251 } }, { "DeletedNode": { "FinalFields": { "Account": "rKso7KmktCCYBfe79sNAFnfKffvansBBRz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D3D0C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "1E0DEACD6A19BD3039922C1548ED9B4A346369FCFA0E83BD2C6661C764DFEA75", "PreviousTxnLgrSeq": 68902155, "Sequence": 67328568, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "30000000000" }, "TakerPays": "225000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "46796EBBF32BA7E44D4E48280415EA5792FB29B7B62086E839CBF3875690D8DD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "70000000000" }, "TakerPays": "525000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPCYDR6z5MW5EvxVzPhVa6cfLyckEDWs5T", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "285" }, "LedgerEntryType": "RippleState", "LedgerIndex": "46E45EF010B9E3989AE4BA7B7BABF245835E5D89F21C9A07120903B51004120A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "631A05073785C1C84CC0DEE5F2F336F2B6F363094011360A13F415F2AB18E235", "PreviousTxnLgrSeq": 67951007 } }, { "DeletedNode": { "FinalFields": { "Account": "rwLffu7VZ4rMMa5thTQppfL9g4FMB1sNys", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72F0A4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "BB2D3141D7E6D4E504AB361697C1E6FC0811A913546A1A7ED627036922DBC881", "PreviousTxnLgrSeq": 68926256, "Sequence": 67708646, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "46F8F4F471922C3F207E57DBA4F1F8AA9006B63967636AB9B31F441CDAFC380D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2700000000000000e-4" }, "TakerPays": "1755000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "a", "IndexPrevious": "8", "Owner": "rhEwjxZkMbARLTQmMsR7N6MxRDUUKLF1RP", "RootIndex": "E1E11D5BE84E0A02540797FDFB7974852AC4411932D9CE7091665DEBD5AE1988" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "471DCACB6DD84F57B8A4D40B734D0747DC515F9FBBCDE533519EDD249F6B4FC0" } }, { "ModifiedNode": { "FinalFields": { "Account": "rM4cm11HCu1riLq9BwfzciDUZqfX2Phq52", "Balance": "487153276", "Flags": 0, "OwnerCount": 159, "Sequence": 67380536 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4722F91B16CC9165FF1A9F84623778D174459E5B277D1C0801792150F44F7730", "PreviousFields": { "Balance": "477343276", "OwnerCount": 160 }, "PreviousTxnID": "61B54E913ADBA95E9E48589C53A60D9D793864A6CACA41CD0D55F0D1D483EBE8", "PreviousTxnLgrSeq": 69064115 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rwuaSP5dsGLmc6gNnv3bWEjmtkexmA4H3G", "RootIndex": "964A381F0461CF85145D1EBB52588ADACF9F135FBFF41A6E0201F524CC6B0619" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "473FB07F1E6E36C74FA7B9BF613FD13BB6743544EF0F1656877A9645AF6A605C" } }, { "DeletedNode": { "FinalFields": { "Account": "r4AXMmLxiAtMf5yvyqqCZeHVhswjdmNgBx", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D8B5BA1A7A5F6", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "81465FDACF594537BAB0FE3ADD626EB1948DB71EBFA7AA6738DFE7077054F5C5", "PreviousTxnLgrSeq": 68984288, "Sequence": 66594825, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "476F993E4C031918571A30CAC430422BF7A0A562DD925F7A2527C3451C19BE9E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1203912777297306e-4" }, "TakerPays": "1001173865" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-24597395601.47615" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4izcArVy7Ccp9j1VEwnbso67AsYhaEjdJ", "value": "9999688558266540e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e0a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "477EE29267290B77EAB5532B2A2A91C426F7FC6DAF4EDCEA53913D4671F337D7", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-36097395601.47615" } }, "PreviousTxnID": "A830CA632AAF8C0884CF524610631D7FFF6BDC514A17D451BB33C2DB15E3525E", "PreviousTxnLgrSeq": 68992849 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfKEwoau3VsYDkabUXs7KbivzJXUE1iw9W", "Balance": "396563329", "Flags": 0, "OwnerCount": 52, "Sequence": 67016780 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4799CAEB5E14DB419DCF01D386F0D13F14F4E73F5E1005F184A216436748C66B", "PreviousFields": { "OwnerCount": 53 }, "PreviousTxnID": "387070A0D6D633345D4C2EACE13985596B4864BDC4E90DCF6E1245AF02231600", "PreviousTxnLgrSeq": 69046295 } }, { "DeletedNode": { "FinalFields": { "Account": "rDvF12VVLg8CD36Ba9U4HUB5q7AWai6BFi", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522374C1D28416E2", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "12B63AC69F8F2491BEAF743651CE1A905F5CC7600364B73876173D31B1EC011A", "PreviousTxnLgrSeq": 68904301, "Sequence": 64346992, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "479AF52A537315086038FC7E3EE90D46BF4322ACA8AE28F9FF9D2514E4142CAF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "51178984798.99995" }, "TakerPays": "510766268" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rBefpcbGP1mhJhuLmYSbPSj4oDTufciZDH", "Balance": "53180298", "Flags": 0, "OwnerCount": 5, "Sequence": 67337575 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "47A1320EFB85F5B24832F339080B4BE26740E0249813ACEDDA15BDBFF5C62BEC", "PreviousFields": { "Balance": "22359106", "OwnerCount": 6 }, "PreviousTxnID": "07D3D67D3EDF315B18BBA927A8ED09ED3DF28DDB57CBD7D255E2E61207AFB105", "PreviousTxnLgrSeq": 69000345 } }, { "DeletedNode": { "FinalFields": { "Account": "rxAPteBXbVsr6qvwqA54qERcdkojkjdmC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "409AFFE3FFB4B199CCC34B28F9D084A2873B9DFB2DB68D86D46CFF66629AB525", "PreviousTxnLgrSeq": 68898827, "Sequence": 66533122, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "47B162C4049F095F13046F957DB6563301D9141721E17A3B4D1989A73C0EAED0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "200000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rBVRpQjDpGqLs588dtthtZhrPJCcM4w3TS", "Balance": "2478679017", "Flags": 0, "OwnerCount": 86, "Sequence": 65828951 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "47DB49EAB2E575C9A1866B507500D5D499F445944E78F5B1EADEF4F2C0CB4F42", "PreviousFields": { "Balance": "1478679017", "OwnerCount": 87 }, "PreviousTxnID": "666F271B171C71C5498E9F0A2B82853364E140C51832310D0FB483ACDFA88118", "PreviousTxnLgrSeq": 69059690 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "22", "IndexPrevious": "20", "Owner": "rGKv1gHL1ANheQZ4GMCikKaGYoKJC6o6wG", "RootIndex": "9B85DCA279361327B6D3207A5E1E4942FC42DCF2CD820BD76421DBC1502F414C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "480FEFAEAED8060A52EAB6BCB8E3DC8D761524A69857D0C12A555EF080F1C936" } }, { "ModifiedNode": { "FinalFields": { "Account": "rQKYm7pcdeXMPEgGTRUAAuoziWwhhW3DC2", "Balance": "4426279002", "Flags": 0, "OwnerCount": 53, "Sequence": 67340134 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "483E2A16172DC49C4972165FAD4761D54AFFE548B9693A86DAD0BB5EDD32A280", "PreviousFields": { "Balance": "922583563", "OwnerCount": 54 }, "PreviousTxnID": "33755612739532DF5292A0E0355926BA844141B1388A36492733B144309FFD0D", "PreviousTxnLgrSeq": 69052237 } }, { "DeletedNode": { "FinalFields": { "Account": "rHm3si5FLgHjXC7E2qXKwNDGAe5khVpEHg", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EEBE0B3FC2D8C", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "A58FC7813AFC9DB58BF50CBE26E5151FD1AA6552F5B560453AA7911556EDDE30", "PreviousTxnLgrSeq": 68986618, "Sequence": 67647502, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "48631088694DB8D61D070B70CD4954AE20D7DA6C1BD63758C5B86B958D065B80", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3810005946327354e-4" }, "TakerPays": "1600202497" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "984", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r33yXJH6HkJc128VKpjvrcdC89M4zDaP9f", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "489DA6DFEA4DAF6592C99C25069F6F3BE5509829DF4F937984FB25A1D6E0DDD0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "F9F76D516BF1935EB2C10110A2963A38A11CBCB44971F577AA2E8AB2F5D56C1A", "PreviousTxnLgrSeq": 67991922 } }, { "DeletedNode": { "FinalFields": { "Account": "rGgjwqb3Lg3yvrb1CRRqcTghWvU4r7fvFX", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F1937C8", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "50F6208030AA879EC4FDCC4AFE83AC9909075E1C05904E46B076E8E9AD8FF449", "PreviousTxnLgrSeq": 68892659, "Sequence": 66228534, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "48B667164D5F52B02FFF28496FB80A7AB19232B70E212344B8428F44E4F1768B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2335796960300000e-4" }, "TakerPays": "2312438990" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rQHTzMfwiuyHEaGpCTUE68vbkTR6tXahXr", "value": "1000000000000000" }, "HighNode": "4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "213" }, "LedgerEntryType": "RippleState", "LedgerIndex": "48FE715EE7A0075D3FE57443067FBACC5AE78C6A9724ABEBA3C8DDF4F69B3919", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10294850770.45" } }, "PreviousTxnID": "D459DBC36D225EBFFD32B0092F8AD3BF4F8E86AB7CA7E12454532AB9023341ED", "PreviousTxnLgrSeq": 67962530 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "10", "IndexPrevious": "e", "Owner": "raZrDVYBJ5whjdgJ1V6FtiYixKesEfDyKJ", "RootIndex": "8F15310ADF42F6B0A2399DF68DE09CDD703BC88D41D804DAEC79CF628720D4C2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4911E3FA71ACAAE4DDFD34BE2A886C8EA1ED481C875E03F6710F1E77687BA070" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBHSrXq2LzGniUp4zypCRk1isLw1ywLPHv", "RootIndex": "4926917EAFC7AB01C49E48AB5A409A91B1CB5321B6D797FEECBBD903E42B39C1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4926917EAFC7AB01C49E48AB5A409A91B1CB5321B6D797FEECBBD903E42B39C1" } }, { "DeletedNode": { "FinalFields": { "Account": "rpiGc7vb6vr5hWMxqK2NgEVpQkYhBXreac", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26AB38C66", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "0ECF66AC86F7964E076F0F9ED7A694E7888FEE268E61DEA12954C988DBB4014F", "PreviousTxnLgrSeq": 68001098, "Sequence": 65841605, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "77859898" }, "LedgerEntryType": "Offer", "LedgerIndex": "496177104A1374E7A941C0CB21D9939CF783AC80736343A19D7D057390AA226E" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "c", "IndexPrevious": "a", "Owner": "rKBwHqR3S55CpYFoX1bucD2PFMgSjPAFvu", "RootIndex": "6F077ABB3B7731F2A7E7617CACA64E33B4378B3A2B968CC99920A844B092BEF3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "496EAF1F15E1E87CE6F8DCEB87D8F44F88B9A31111C7F5A685DCAC4B20CA4F37" } }, { "ModifiedNode": { "FinalFields": { "Account": "rPBCCKXYaB9eBeVKenvGeGKywHUVHFQmSS", "Balance": "1921911594", "Flags": 0, "OwnerCount": 97, "Sequence": 67544565 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "497A6B5A0BC60C9F3172EF793EBA323687E5AA11F07E3866653AA5C0E3F2A9A3", "PreviousFields": { "Balance": "1822911595", "OwnerCount": 98 }, "PreviousTxnID": "B2355A18F142850A5245B8177A9193E5EA25274AF4EE13E1A75ED9CA8338E8E1", "PreviousTxnLgrSeq": 69063608 } }, { "ModifiedNode": { "FinalFields": { "Account": "rwLffu7VZ4rMMa5thTQppfL9g4FMB1sNys", "Balance": "3067005969", "Flags": 0, "OwnerCount": 24, "Sequence": 67708656 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "49A9AC74C788E462179C7079972F202CC4FDA7CDCA60049F8884789AAE02B647", "PreviousFields": { "Balance": "850560278", "OwnerCount": 26 }, "PreviousTxnID": "92B523A8E14B39FDF6B12C2DB139C0A684FE3328AFC4284816D0BB03408D343F", "PreviousTxnLgrSeq": 69037003 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rsPnG9Kmz7rf9fXRZ7zrVb8tmmjUkUEpin", "RootIndex": "0B1726BBF0395A3738D3D2B9E648D661AC987625B70539C098BB2EC701A544C6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "49BFF89D316AD338B5769E8B0A5F9CB239396194673B49569F772909051851E1" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rLhtdRdeGcT6UeQivqPu9DBXWHZ1SDpsar", "RootIndex": "819524B5D5170FE01E874038237ADBB1373C43B820BA33D4344091A4F16A372B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "49C32B27FD73AC5AF17E30525013B600964663CB2AE64FC25F79DC00D102E6CB" } }, { "DeletedNode": { "FinalFields": { "Account": "rPVXceb6wrQp9apSTtyZmWcxKmYRBnCsdt", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF9738EC434DA", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "F2454167CD6EEFF5E4418A049E418A18213F7173CFE06ADB0D290EB97CC8BA8E", "PreviousTxnLgrSeq": 68891294, "Sequence": 66622440, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "49FC05D91F63E70E885F6172C43D382DC0C208F8BE8EF49C0BFD5CD6E2933854", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "785989866" }, "TakerPays": "7073908" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rpJZ3qkUBb3m68p3YrzJE7onMcswN4XDY8", "Balance": "152000000", "Flags": 0, "OwnerCount": 16, "Sequence": 67512249 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4A00B99AEAFCF5A25FD64FD9D770C90E5749F2C66DF3C4EAD3AD8EC612FAB4ED", "PreviousFields": { "Balance": "44000000", "OwnerCount": 17 }, "PreviousTxnID": "E85A7296D57B33DF2147B5D636DDF38E2A966CDC32CADFD49372919CC7B13124", "PreviousTxnLgrSeq": 69061191 } }, { "DeletedNode": { "FinalFields": { "Account": "rnhd3RdnLUZY4sYxS2p5zTJk24zHB7VyUo", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207D0E358EB049A", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "387B6506959224B09CE7CEB4421CC335F242E07C18A25A5B87CA04BD48F32189", "PreviousTxnLgrSeq": 69044815, "Sequence": 67654185, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4A18EF698D71DC2C87FF0551884136984FD4512B6F30DF9E0957CCFBB0701C92", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3068903138.888889" }, "TakerPays": "6751586" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r3ccw1UCPwayXhAVmy6oC4yQTSPeG71bx", "Balance": "87141204", "Flags": 0, "OwnerCount": 20, "Sequence": 66775166 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4A48268166A0DFEB96C5549876AD7AD7CD2891E24A2A7F7AE550CE8593C103E6", "PreviousFields": { "Balance": "67141204", "OwnerCount": 21 }, "PreviousTxnID": "15302716AB5A8DE67F89E7C7DD7939677DA98C29AA7415181442573D3F19447D", "PreviousTxnLgrSeq": 69063989 } }, { "DeletedNode": { "FinalFields": { "Account": "r9MQ7Hek3iMwBnYRuHTuuG3ssJu48PHaxJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F286980", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "A9626A2BE2F46D093CFBCCAE0041EDE3847A9077384C242E5FCD80EE4399C05A", "PreviousTxnLgrSeq": 68003874, "Sequence": 67390416, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4A4A92EFAC53D2294B990200D860DA32D42E1CC6D521AA10940A10C57DEC1A00", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "999999999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rabF4KeYghT7RWidbkeS75fLWQzrDixwpH", "RootIndex": "4A79BBEF8D725F8255F407C41FEBD3F8239FBD468B13E36F568F4B8E6C2B5382" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4A79BBEF8D725F8255F407C41FEBD3F8239FBD468B13E36F568F4B8E6C2B5382" } }, { "DeletedNode": { "FinalFields": { "Account": "rBMPrNjN4FCHpC3wWAdrorVra71nhSRkuK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F689E93", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "D1EA05734846F516E188995ED2E66E26B95CA3CC3822F06F2C00B84D33E40095", "PreviousTxnLgrSeq": 68895125, "Sequence": 67579981, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4A977EC80BED9564BCDB5634C1104BF4EB7D4410A4D31B511AF5A1DFFF6C549B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15253908648.83523" }, "TakerPays": "1525390864" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rp9kJTnnfXrjwVFxGRWfjUbJdmxkGP4cif", "RootIndex": "9818A0E9F8B2E4FD17CE73D3763A1878DFE404B32FC8BA5DCC913038A3133760" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4AA7891201D2228103E79DB9BC63C4BD05A05220591BBECD7704A2799983458D" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "r4A2sUYHaLAGsDxfwUSv7GXTyYRsoBfQin", "RootIndex": "5EFD0A90FF4AD5FFD97A0821FF1183192FC13A98174BD184E63638165FB2BF6C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4ABD26C15F24C8DCE9527B60A1AEA9B1FA424E6C3CD70A84FE5FD4D0F3A65046" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rNvk1SNQZhU6fsyMuaTeLucyw5x5uxfxQy", "RootIndex": "FBF78B62F4B918982A3BE4E93BD211976B210B4D2C75A82824C4A406842DA574" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4ACC3D0BD5C7D54B896341A64F3576C19DFF91A9133A160681333C171A7C552A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rUqaUzkL9NU9wp7BReWWPJQddAErF45hkE", "RootIndex": "4ADA68FFFB87B0F17745B3D95CFE0038883C0A8E14E1761BC46C690DFC7B94E2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4ADA68FFFB87B0F17745B3D95CFE0038883C0A8E14E1761BC46C690DFC7B94E2" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "5c6", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBLh3SrV1ALEEfJiHKYiaSxoRxG7R9SuEh", "value": "1000000000000000e-4" }, "LowNode": "5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4B0D5B4463C5D3D1B5F4AAA78A1F7D0EB1CB11B256631851A4555EFAA0249CA1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "93431878392" } }, "PreviousTxnID": "8FB40638327699C7B8F24E57D9847D12A3B91AE8B4C8225F542FFAEC291B1AE4", "PreviousTxnLgrSeq": 68090143 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNirEvsSGiRDGtL68t6MJwfAyU1MExreYv", "Balance": "370381812", "Flags": 0, "OwnerCount": 58, "Sequence": 67544637 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4B0E4B374B526C54080609F53DB31E03A69028970E5C2B37FA1F1E59586B7919", "PreviousFields": { "Balance": "146499850", "OwnerCount": 59 }, "PreviousTxnID": "3E30DB711255765C22F8A3962EDD85E05581A011F36EFB7DB3E6484AC8DEB9B1", "PreviousTxnLgrSeq": 69061300 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfTkTBbkD6NFaNLprSDfnC3CJEtNwgqYwy", "RootIndex": "4B0F31CD816344C24538F1615958610DA40A8454D4FF64D12DA4215BFF402DA4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4B0F31CD816344C24538F1615958610DA40A8454D4FF64D12DA4215BFF402DA4" } }, { "ModifiedNode": { "FinalFields": { "Account": "rLVGNfLJYnQtqJDuNWkpu1yaSBnrrSGPdt", "Balance": "260015483", "Flags": 0, "OwnerCount": 64, "Sequence": 67363445 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4B13E1FE228BA4846D6E998E8225427430DCEC484A1AC01CAE9186B9BEA11930", "PreviousFields": { "Balance": "189365483", "OwnerCount": 65 }, "PreviousTxnID": "FA533CAF923F3FF9A80705AF6E792A8616A284511F57C480868BBF901D3D0299", "PreviousTxnLgrSeq": 69059874 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3Xud98xTUTiXxGp2LbmFtFTWRWeaZSCad", "Balance": "90859045", "Flags": 0, "OwnerCount": 13, "Sequence": 67537417 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4B46C561D787FCE784A8F03C01CC2242A2F0165B1B237672311921D245B3ED2C", "PreviousFields": { "Balance": "76859045", "OwnerCount": 14 }, "PreviousTxnID": "53149904186436D8AFCCE116B58CABCAC1D0A5A777CE5FCC85F86624A2BD8EBF", "PreviousTxnLgrSeq": 68994565 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDvF12VVLg8CD36Ba9U4HUB5q7AWai6BFi", "Balance": "1753159516", "Flags": 0, "OwnerCount": 65, "Sequence": 64347088 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4B79D30A801999B679C38CB9A67B24DDE01B137E50ABE8DE69988333E62ED224", "PreviousFields": { "Balance": "1174393248", "OwnerCount": 67 }, "PreviousTxnID": "BC74D0A9E4EDA5D6E4E11A9DB5410D8367AA0E2F9F34E8312365067BD5A8C814", "PreviousTxnLgrSeq": 69059910 } }, { "DeletedNode": { "FinalFields": { "Account": "ra2BXpvnVUqyCNaxAUf9Co2AxYzuey129Y", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "3D5002CBE52C8C8895106E106203B2439D38BD923326986397F35287303BD6C4", "PreviousTxnLgrSeq": 68883712, "Sequence": 67609020, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4B7AA7CE374C513F44EA9EEFFBE942B42583CE17F3325771F43C3676DEF1A666", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1800000000" }, "TakerPays": "14400000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGR9AifcxWmhBqTR2JWAPooQsR9kW5yzj6", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "98a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4B8296210D50FE257D5E5B5E32EFCF38A75FDE5478CA32D9F5E236281901FEEC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "B0C7A92FF510142A86FDF9397B7D65D638E96FD8263E0F33873BF345E223772A", "PreviousTxnLgrSeq": 67991593 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGZkP89rxHSHy1opAagx8cUx4JdMhr9v4", "Balance": "1272600839", "Flags": 0, "OwnerCount": 74, "Sequence": 66951176 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4BA4C4C256592E5A880B9FC6DC350C29D402EE35438CB528F1B275E85B3E2908", "PreviousFields": { "Balance": "756600839", "OwnerCount": 75 }, "PreviousTxnID": "C96AF805DA0893DDF5B14F95A229CEB8FCA7D4A906F80C9E94F0A4C70EBA70D4", "PreviousTxnLgrSeq": 69063985 } }, { "ModifiedNode": { "FinalFields": { "Account": "rjD7dFqNXSEK4juN3ntGwbYn1P3xjepVf", "Balance": "1304425789", "Flags": 0, "OwnerCount": 61, "Sequence": 67707161 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4BB7FA98D2EBD7F97E5F47A70058C826D3F0338C333865EFCCA4E4B717496BB9", "PreviousFields": { "Balance": "1265528567", "OwnerCount": 62 }, "PreviousTxnID": "4A2C7C22BA14BAC393F9E1E88D5219F15AF82FAB60E95FD7C4E4C8C6278F0B32", "PreviousTxnLgrSeq": 68667171 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNtB5pUvufMkzs55wL88pVuh3xt7LVW2mR", "Balance": "293539450", "Flags": 0, "OwnerCount": 79, "Sequence": 67385936 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4BE66C0DF1E17EDED170B3319C6F427611D0CB1A8E5C94A1F4D0ADF84D575B51", "PreviousFields": { "Balance": "176739450", "OwnerCount": 80 }, "PreviousTxnID": "14C3EE2428E7A7830E55F893663F7B688923D198636EEEF4904AEEFAA228EA93", "PreviousTxnLgrSeq": 69064150 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMMTgtHSock7M74yRKkp4ug6i14nGeCJhW", "value": "1000000000000000e-4" }, "HighNode": "5", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "a72" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4C0950AF58C175F31C4DC4C511ABC9354804565B9FE80C37725D1C7DB1E725B4", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-27000434730.43863" } }, "PreviousTxnID": "2F49AD0AAC90C7B2EAC64E01FB56221BF5E622E30BD743EB8290D9E037020491", "PreviousTxnLgrSeq": 69062242 } }, { "DeletedNode": { "FinalFields": { "Account": "rpWE8DQzMegfBwaPaQhF9EGfxWWxvqRwk5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5261A126C", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "CA235A6BB92DD1492486E3F007C23317A46FF4F6A6B8DD6CE28C90840D1AFC1D", "PreviousTxnLgrSeq": 68814473, "Sequence": 67603188, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1527891765324528e-4" }, "TakerPays": "1222313412" }, "LedgerEntryType": "Offer", "LedgerIndex": "4C22DE87DAAF9B449F7B612D1465CC9891A6659CEB2975E5F76428835F9A9D2F" } }, { "DeletedNode": { "FinalFields": { "Account": "rE2zUmDvH8vtBsGPBTdLSJW8rDLNVy8g4V", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652187152CE99C92A", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "ED0D9427327AF4A41060266802D47544E003ABB90E3103F3727BE4EE9E12C7B2", "PreviousTxnLgrSeq": 68946094, "Sequence": 67407794, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4C57490A81F59085354E592EBA426698F5B9CF39151FFF995B523E140757B9DA", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10300120049.77974" }, "TakerPays": "70864825" } } }, { "DeletedNode": { "FinalFields": { "Account": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365306651729AB2880", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "558E3042166379EC784E8154E45E316D059B7742C81BDCB0E54C8D5CAEF9B882", "PreviousTxnLgrSeq": 67960095, "Sequence": 1036, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4CB5AF6F93CC1B0C7D78E2DADA32359D0DA48C1C6B290653B4BCFC1A29462F5F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1111111100000000e-4" }, "TakerPays": "2000000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rJd8ipxtKA6u9iXpvCJYQrsES2Q4FsySHR", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA931A0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "C016250EFFD5BAEAF03E6565DE04B559241BF8A11FB33DC67B0CC3C60371CFDC", "PreviousTxnLgrSeq": 69006201, "Sequence": 68739604, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4CB92A8A384214BB975537D73F72C4C8C848A2E0F67D925BE0E52BEDB39F6EBD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8000000000" }, "TakerPays": "32000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rKWwHEb7RPAjRUVyvtfHVUJ1WZjECFhjbE", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365317AF4C4A1AF100", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "D3FE8E97942564B04F1ECCAAF659B242719A4FF9C0E20AD705A28C93C9D1DB1B", "PreviousTxnLgrSeq": 68787903, "Sequence": 66665407, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4CC25120BE89CFD062EEBEA03EAFC3C1A9322BC57D18CF2A085FF67BA16BE8A7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15000000000" }, "TakerPays": "999999999" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r9dqJno4U42mpcjAymrrUS11q5rAWazGfP", "Balance": "2404570042", "Flags": 0, "OwnerCount": 30, "Sequence": 67682951 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4CCAAC4CF0D94C077E2F9CA67BDB334159042AB591F690F960A3C5C29EDB8A58", "PreviousFields": { "Balance": "2072504924", "OwnerCount": 31 }, "PreviousTxnID": "86035DDAEA62CD5174BDF5800B0271EAB6BC3AA9583843BFD84EF15610D39D07", "PreviousTxnLgrSeq": 69046172 } }, { "DeletedNode": { "FinalFields": { "Account": "rUyceekfg9mU133ecSKptNTpj4nYnFMi58", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308E1BC95FA5F00", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "061881001F217F9FFC3291E504A2D350554F20EAE3AF0E817ABE28F5992D37C7", "PreviousTxnLgrSeq": 68893756, "Sequence": 67404799, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4D0797FA13DCFB1706691DC869940549FEAD5D9246536A06504313F7AA991EE1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000" }, "TakerPays": "24999999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "6", "IndexPrevious": "4", "Owner": "rwJrcmU1fHLmHgWcKC1D4bZQNkUGJs165m", "RootIndex": "01E34EB3EC1E65D67D914A6A34159F3501A27EDE06C74AE4991535532C4547AB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4D3BC5DF909D4C1E362E443C7564F247B627C7185687754F856FC0C07095CFF5" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rpRu4PM7TpS2K481Ac6ESUDRf5QmAfc6M2", "RootIndex": "6A5D500F375C617BF499C475923E1C77F57802A6727E94312C931EAEEE17E5FD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4D49D79023ED5F7581C9ACE2970C3785E49BD120F43419DC9A3B19A400D1A861" } }, { "DeletedNode": { "FinalFields": { "Account": "rMAWeQvUd5zQpyY9hSdaUMRMTQHcgAXvj5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212795F57D93AF3", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "AAFB91896FF69B856294CBB8FE43AB3288CB226462EF2922E9856E45A3FFC20F", "PreviousTxnLgrSeq": 68996610, "Sequence": 67781446, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7952966309.5386" }, "TakerPays": "41355424" }, "LedgerEntryType": "Offer", "LedgerIndex": "4D620092B79ADDAD1A6D4FED8B1FB19BC10AFF4AD44D5A93D1B07B548C5F96C8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "44675377257.14286" }, "TakerPays": "232311961" } } }, { "DeletedNode": { "FinalFields": { "Account": "rDqBWAYNudfa8rBsr7YDsdDxeAoNRsxfPV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365319EF4FB2D8B8F0", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "5D9B7650015371FF5CD604AA4BCE1B7D2BD79BDE53FAFD0FB0C914099BDA6894", "PreviousTxnLgrSeq": 68246243, "Sequence": 67406147, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4D775ACF02DF5A6CF7AC81C075B36F48C9663981552BB47B1F1A1A9AA6F7F570", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "38929949330" }, "TakerPays": "2841886301" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rMhxYNNMAgwGdSciDqnCb8tVqJZ22VCCL", "Balance": "1711470059", "Flags": 0, "OwnerCount": 10, "Sequence": 68815979 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4D8FC4075BA27E8346A15533D0E1FCCB2CB4FBEF8F4A54EA4A9223978F0CF3C3", "PreviousFields": { "Balance": "735167343", "OwnerCount": 11 }, "PreviousTxnID": "591AF6843E6CE5467BD8ADE5737482C122DA75BEDCD032595EBECDB808C78752", "PreviousTxnLgrSeq": 69055709 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rzNhpkxVUc86h9CJyB1qssHYenzkVpyn7", "RootIndex": "2817F24AED7221724CD05BED3BE3723199992CD9AC95B71F7FF08C542CF79EAA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4DBE6DBFBE579FECACA0B37345BDB674B4113368B515B28BB38767B75E284EC0" } }, { "DeletedNode": { "FinalFields": { "Account": "r3PYAn9d1DTFzJ9kuvFnhudgwsVZ6pm5hT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C65AEC38C6200", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "D11C8EAC4351BDB75B8DD49611886F0EE73421821AF335E86B2602825598981A", "PreviousTxnLgrSeq": 69036956, "Sequence": 67442364, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4DC371DD15F3DCEBE1C5EE206C4B5CE46EC6BC9A8A7D3F02688A17D6D8E1F1CF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1700000000000000e-4" }, "TakerPays": "593215170" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "9", "IndexPrevious": "7", "Owner": "rUyceekfg9mU133ecSKptNTpj4nYnFMi58", "RootIndex": "CEB5317C13A49202EBDCCCE351F27F8433B69F262723A1CAD1421E08286DD1CD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4E1A9C6AD874856F05DDC6671F0035A39D1FF256CB222D200A7CC601E8686804" } }, { "DeletedNode": { "FinalFields": { "Account": "rJWkGGCNuazEf7ch7C9bZkiiYy62Z95SA9", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F269EF9228", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "2EB0CE7E729CFDF46AC17FE3BFEA1158E9D8D97B98078F11CD0B1D94AC985FF4", "PreviousTxnLgrSeq": 67966759, "Sequence": 67239474, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989876" }, "TakerPays": "77859898" }, "LedgerEntryType": "Offer", "LedgerIndex": "4E1B0844A836CA8857755CC72A5D2F704DA71FE6E1490472D18BF7A5C822771F" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rGdg98Rr24zGwE9rmiPzKi8GkmkhyHyAL1", "RootIndex": "5A369437417287EDD35070A07CF60A49636B8F5B02220F99E6A9A49AF433CE78" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4E246605563664359B9C9D007D5C8A6E4B3B6013C389204851B1EBC8247A2357" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLtYxg3QjyCpbY68rJg6XCeecMyCnzBNCt", "value": "1000000000000000" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "2db" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4E4BECB56AEE0F9AA0097E7E0EFE6FEF03D24EFC4438512DB0185C5DB64D90F3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "9BDA807693B9890BAC18A9C5D5E0B94444CD5AB11D76A41F6CB0A7D1CF7ECD00", "PreviousTxnLgrSeq": 67951481 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsMSXmszPAgaY8sipuVq6gfdgUX3zpX6am", "Balance": "130001470", "Flags": 0, "OwnerCount": 27, "Sequence": 67479734 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4E669F67DFD47A5552BA8E80BBAECB4A244EA1040D6699517176B510B776EE7A", "PreviousFields": { "Balance": "113751470", "OwnerCount": 28 }, "PreviousTxnID": "64B14FC4004720E15721394461E16A7F86FCAFE91BF869DBB5C8FFB16B662E70", "PreviousTxnLgrSeq": 69062545 } }, { "ModifiedNode": { "FinalFields": { "Account": "rN3pszUgbBgf7yZ9jxiHTXwStoE32PDsHm", "Balance": "574767656", "Flags": 0, "OwnerCount": 224, "Sequence": 67231722 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4EB2580B2588F3AF6A7962CD0326D2D5D93C3DFFE99DB1BF9C749DA8F86EBEC5", "PreviousFields": { "Balance": "512479737", "OwnerCount": 225 }, "PreviousTxnID": "C0EF98655C267249852166FE51ED5BF54659358996455152CDE2419E74CC6A74", "PreviousTxnLgrSeq": 69054945 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "14000000000.07" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "7de", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwNMX6iAFTsFK2PG8PCNG4AJ5b8UyrSx8p", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4EC6DE0E6A84B8AAF1102474324438F121D95B2DCBDFA0126C007B169B402F7E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "15000000000.07" } }, "PreviousTxnID": "B26DC325A1D9E9B83A748A6D7631D27156356D35C839A5C414EC90AAE9D2391E", "PreviousTxnLgrSeq": 68885942 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "504", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGZkP89rxHSHy1opAagx8cUx4JdMhr9v4", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4ECC9C9E4762D87C13BC514737767686BBCAC84A31603379DA6F419A83711CF5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "43000000000" } }, "PreviousTxnID": "CFC95D9C93F4541AA703BCE9A6C735C7CFA64E3B8276A2D37CAA3780386047A3", "PreviousTxnLgrSeq": 68898713 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3pUPUHoXbK4o5wjfPWjqQe4Xh2wu2KWvq", "Balance": "310927167", "Flags": 0, "OwnerCount": 19, "Sequence": 67672856 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4EDFD2A9087989FA1AD241ABA85238E331CC9D66184ED8A54CDEF4F765938CB7", "PreviousFields": { "Balance": "195806997", "OwnerCount": 20 }, "PreviousTxnID": "59B05A5F63B90A03B9C7AA79C60C372E02A3E5466469AEA8EA899460A6CDFC4B", "PreviousTxnLgrSeq": 69063609 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBqYpFjv2TLUiwx2Lr5vgGxoEgjhq1XnB5", "RootIndex": "4EF58F2E451042038788FF67528BE45B3D79C528B53126910288A332095FD950" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4EF58F2E451042038788FF67528BE45B3D79C528B53126910288A332095FD950" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNYRNtrFPumPwsB7zbi3VjZLg6WLWBUJvy", "value": "9999688558266538e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e19" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4F26B8F8DA9F2B268A2C2D5F306DA2DD7D0D683F4D74972EB29F0F867CC0039A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-88997878564" } }, "PreviousTxnID": "F943A48993EECEF3E07DE71DB0539CB3D4D3B65E1DE835917F1762F979C4AC07", "PreviousTxnLgrSeq": 69030176 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "c", "IndexPrevious": "a", "Owner": "rQHTzMfwiuyHEaGpCTUE68vbkTR6tXahXr", "RootIndex": "0BBEE197AC5093D5305EA586C019C4E1CC9B89AFDF5B68BCBC4AA0F62455020E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4F39574DD11CC4486D0301C30C84206666AC1BA4DAA13E9A78D2F432D8BB8912" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "r3Tj4vpfRp2r95SM97TwEFGCUZayDqKM4h", "RootIndex": "EFBAA4BC6C4607A926A936E8BF420AB3BFDB602F725917A7702229AE08351CE5" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4F3B9F22D5173020B2D6ABA24819F93FA9F6F6296A56DC56ED3748F22A93C96E" } }, { "ModifiedNode": { "FinalFields": { "Account": "rGEpUHYXy3Lt8KvmaKG9wGEB51H1nGAcJ", "Balance": "87051447", "Flags": 0, "OwnerCount": 17, "Sequence": 68786199 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4F7A88421C161B91BEEC4931D86C56F6F8C112619CFFEB50C7E875ED693688C9", "PreviousFields": { "Balance": "56277602", "OwnerCount": 18 }, "PreviousTxnID": "3D65188DD75B5B8B6581DF380E1CA1F0EE5E533D14EEC2BBC58349190CFD8ADE", "PreviousTxnLgrSeq": 69052280 } }, { "DeletedNode": { "FinalFields": { "Account": "rpPjK8mxW6UndeHNvtgJPSaQjARCSXGCWY", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213B7B20FF80987", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "0846E46667BDCE728864A5940E56AB1A739C01DFC227A7FE8FD11B8A6B2E705E", "PreviousTxnLgrSeq": 69030835, "Sequence": 65071357, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4F7C25EDE4091BFBD35F5DE9A4517E960859E034DF614CE278E208C81CF21309", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "17785989866" }, "TakerPays": "98712243" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rDrVDF6etbhSYtnBoqxbRd4CyGHQ5YNR4z", "RootIndex": "C26BB1FB2C7C120E678C1812EFAB137AAADBF055C2B13ABA2DA8C6403B5047A6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "4FD56040F39FB63846CD1954B85ACE9054D5E7E8CC0DC3B045BD99C86ED0096C" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rESTNm5GsJf8WQEnEmszRCsiEzHuFAcgQk", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "3f6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "4FED93C7F9F35DCC1DF9DB3A395B1B81733D7AA4B1267CA7CE4E20EDACB1D296", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "19B6F0D0816D4C17E3F993EC0217D4357A9731081306CCED2EB90C4845000118", "PreviousTxnLgrSeq": 67975549 } }, { "DeletedNode": { "FinalFields": { "Account": "rsMSXmszPAgaY8sipuVq6gfdgUX3zpX6am", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72F0A4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "B8C3D1E0B275D2A2AA642341AB08EC6A097B40F3A187A0B8F24605CA06EC84C3", "PreviousTxnLgrSeq": 68904147, "Sequence": 67479722, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "4FF31B3934B1B8696EC698023257EF425B19119A45D6FCE559AB80AF0A47BAAB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2500000000" }, "TakerPays": "16250000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rU7MhPtUbjCow4e3Hoqxv9PVQ7ebo3mLen", "Balance": "120699265", "Flags": 0, "OwnerCount": 24, "Sequence": 67761564 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "4FFBBAFBA0DAC877BF7FB14FCDE83B8F9C5BEA1B658948FBB7ECDF8DB7A0B998", "PreviousFields": { "Balance": "60046404", "OwnerCount": 25 }, "PreviousTxnID": "BEFA8BD15E74719118E9FF63CB192D9A3E34A98B41018AAA9F9CA6EEBD3548E8", "PreviousTxnLgrSeq": 69043963 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "14853116203.45242" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e93", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rajb91Ucmbfxe1KoUEpAtJi8eo5bQVWeUW", "value": "9999610698224583e-1" }, "LowNode": "4" }, "LedgerEntryType": "RippleState", "LedgerIndex": "50BFEDD2E61550FEE607AB898C5310F4E1B8FDF23BED3C84DB42645D3C9E04AD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "17474254357.00284" } }, "PreviousTxnID": "2DF8A2FE1F6962DBA117F34104091F76B7B0D7B5973D5FB74FDDD4FFD166533E", "PreviousTxnLgrSeq": 68897069 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "20204735610.13077" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "7c0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rasT449dxdmpB7Ak1GqwE9TdrkZEty1tAZ", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "50CCD437BD26AAFED346E869E7E79E6F00AEC8D6282B50DF11E9FF00C9408693", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "50204735610.13077" } }, "PreviousTxnID": "93A554565DE6A6E9D68CD71CA38842CC0036DA3B444DCB89B45D5A70051AA999", "PreviousTxnLgrSeq": 68999467 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHycUxo3HpqiVRhve7H8L4y94dvPHTubXw", "Balance": "216006459", "Flags": 0, "OwnerCount": 96, "Sequence": 67540349 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "50F4BA1E5E8F856D17577DC9810FBB9D8A262F8E3E1CDAB254D45979F9BBBA64", "PreviousFields": { "OwnerCount": 97 }, "PreviousTxnID": "1C3113321B760B7AAAA1AAEA1AE716891186FDF746A1BC188DA3B87D7B49424F", "PreviousTxnLgrSeq": 69062746 } }, { "ModifiedNode": { "FinalFields": { "Account": "rT8my4rryyrydKwE4W9LqQNosfNjZQb3r", "Balance": "468372728", "Flags": 0, "OwnerCount": 95, "Sequence": 66283086 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5129055654679FACF46B3CBB4CCE160E253967675B94B791F7B2CBDB261ED21F", "PreviousFields": { "Balance": "231372729", "OwnerCount": 96 }, "PreviousTxnID": "38A70B8A798A6151E43753BDC6C93C1EE888998C6F920913BAD1426828D54510", "PreviousTxnLgrSeq": 69061892 } }, { "DeletedNode": { "FinalFields": { "Account": "rPvqZW8q9bpYrAKjGhtL7AZAq8bvqEQDuq", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4E0B01B5", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "A7ECE0EAF3D23A92E76E817897E93DAE9A385C51F27E31AFE50837B5D0588243", "PreviousTxnLgrSeq": 68899307, "Sequence": 66726717, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "512E5FE7C23AFA5B2250FF3F64E02E02809A3F22600847CE377AE765DA2A9409", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6052088387.79299" }, "TakerPays": "40548992" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "19466614452.53472" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ec3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsRPHwDyRv18j1hT1wkQEHCvtCpgKYYyGc", "value": "9999610698224570e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "51351F7BD041B29995F36E180E5CF73753C220238F910BDD0214C8EA59FA2D00", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "39732064390.03472" } }, "PreviousTxnID": "3129C385DDB284EBEC832AE14AB8332EE0D5638C7AE75CC72F34DFBFB036C411", "PreviousTxnLgrSeq": 68993241 } }, { "ModifiedNode": { "FinalFields": { "Account": "r91eSWyof8C4aiDL2gM1xTdmc9GJy3rTWb", "Balance": "324196364", "Flags": 0, "OwnerCount": 54, "Sequence": 67326843 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "518134975C0643509E01AF086AD0D863C4AE27E554E14718E61AE5CCBDBF0260", "PreviousFields": { "Balance": "149196364", "OwnerCount": 55 }, "PreviousTxnID": "5CB9AA8033C9E8F12C9D5E1AF933849EAC489EAA405BD77925F3D62B31D20975", "PreviousTxnLgrSeq": 69063964 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "raQmxvieBXeCfDzRKXdekiw7qucsszMReU", "RootIndex": "F46DCA30B7BAB7E35524290031C9B722FCCC4A3E5A8A8C252060452A5FF5194A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5198D18EE1F4F95BB01F5C604ADE87568E7AF7BB2619F4465FF7F2C5A0B9184B" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLK9N8ay11j21CKs3ryC5kp7SYR5piJByc", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "3f0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "51B894CBF7DEB83C69CB3208075C319397A64C3712B02A80E04901E3322E3281", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "0251C2B8EC5120F6FDCD04D0FE909563DE1CB74606AD7C404C761D2A9076EB1A", "PreviousTxnLgrSeq": 67975483 } }, { "ModifiedNode": { "FinalFields": { "Account": "rxAPteBXbVsr6qvwqA54qERcdkojkjdmC", "Balance": "354757820", "Flags": 0, "OwnerCount": 33, "Sequence": 66533152 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "51C3950ED5304F31AD6F959F9E2013D139B772C6C6C44FFB43F45E186A4B5931", "PreviousFields": { "Balance": "154757820", "OwnerCount": 34 }, "PreviousTxnID": "10E879069FC939DB2F2B53CDC251501F02E1D0568E67B10995010029E1CCEA77", "PreviousTxnLgrSeq": 69059802 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "65976621524.3744" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e5d", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rp8YVv74whPGdy9huBZHuPy5D3CRKgFFsj", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "51ED77332C9736D4AE9149D38799E04CFDCFF18E92308BE7FE85E49C141B53A8", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1009766215243744e-4" } }, "PreviousTxnID": "B3926E1ED48FCB36A84764BCFE5DC548BE48876B46C3FF2AAAB95115986823C8", "PreviousTxnLgrSeq": 68999990 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJjrokNPSa5xiAbh8N8cqmhVc4ma95FBpt", "Balance": "1194043675", "Flags": 0, "OwnerCount": 54, "Sequence": 65343275 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5222FAC93B4F1FFAC6B0FC4571BBB535C918EC3E438F188C8B0AD3081EF66980", "PreviousFields": { "Balance": "1133858386", "OwnerCount": 55 }, "PreviousTxnID": "A11C67B7AE58C31529C59735B9D7C21D23534BE1D5F688B8CE0EB4882DC99C4E", "PreviousTxnLgrSeq": 69059772 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "RootIndex": "66D464CDDDD7F3DC24B0EC5937101EA52CC0AF5FB4540A5943652C56DF458154" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "52336374168545FF11AF982F9CDC207E884316D10C5A28EA9BD56963F50288C4" } }, { "DeletedNode": { "FinalFields": { "Account": "r93dgTvDnFJsP2YGRiJvd89D1xLTmgR4fp", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A981478FCD46A", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "4230C60E87BCF2B65030F8F8FC990ECE435D621587DFC444573EB6BAC6CD0219", "PreviousTxnLgrSeq": 69052046, "Sequence": 68599301, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5238CF1CD1AEF394EF4BF59F942F2B20D9DD096F29D5E66EDA1582815D3E5EA0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "74715871844.66" }, "TakerPays": "222800000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rGdg98Rr24zGwE9rmiPzKi8GkmkhyHyAL1", "Balance": "1151220667", "Flags": 0, "OwnerCount": 33, "Sequence": 67164997 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "527192498CBFF8BD4D498260F18C32D23106005E468CFCB12F89ED2F0728524E", "PreviousFields": { "Balance": "151220667", "OwnerCount": 34 }, "PreviousTxnID": "F894E92C3482EC09A0716D685675FFA9FFEE33A20982553AB745A28A9E077EFE", "PreviousTxnLgrSeq": 68990525 } }, { "DeletedNode": { "FinalFields": { "Account": "rpUjTJzaJN22XoKjav3YSk3GH9t3GZqK8N", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA50921E1", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "5D57CCD2EE9D8C7FB7B1C124A5747F3C880C59428C63FC8F25148D391DBEA723", "PreviousTxnLgrSeq": 68890957, "Sequence": 67522645, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "528E2D3FE6EF6346B81E173F6C9DED9FA2F22FEDDEE56CA56ACE4114E8848402", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "77859899" } } }, { "DeletedNode": { "FinalFields": { "Account": "rsWg26FevrM9h2PFcanVpvpaLNuoGpLnrB", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937E08000", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "1E63D9C71BA5E435C690DDE49C3CC7E4034057BB224CD25F276D0BD856E786F3", "PreviousTxnLgrSeq": 68784970, "Sequence": 67689871, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "52AD4450C9C569225D443CF0ADEE258DE108BD9434F75360D21B925558F055AD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "250000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rwuaSP5dsGLmc6gNnv3bWEjmtkexmA4H3G", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAF5ED5C", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "A4463D7D7DBF76E3A6CB206FB46BC4CDCA4CF94B39291E538F6CE9CD43F37E4F", "PreviousTxnLgrSeq": 68163479, "Sequence": 67153717, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "52C5ECD1D67FE0B789CE1DA81BFB02F37A8186B225E93D205E7F0038A7F52F2A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "93431878392" }, "TakerPays": "8408869055" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rwhKYMZGMmf9zeLdZWq4rs31DQeaxn65R2", "RootIndex": "3836C97E94B06D6514DA0DDA5F224B7BF880338C0E321D44E28B3E67B6E1AB44" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "52DC5F364D964273612FC9C795E1460224484731AACAAC164CD0CF466CBA4582" } }, { "DeletedNode": { "FinalFields": { "Account": "rHT6EWF9zJzwNtHQsxyrRMSQL4h5GhkcUn", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C0B2FE1C9E000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "8EADD69F2A06AFFE8D2BEC7E5A07BE0F170AAC405E0509809E1DF11FC51EB9A0", "PreviousTxnLgrSeq": 69011679, "Sequence": 67682074, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "530A6334C8FE495F7E47CD5FB42ECDF1C9883EAD31047B75DBC2E1CA5AB8CAF9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000000000e-4" }, "TakerPays": "678000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r3XYRBp1PnkL2JesUDNw5zo4yxmkYQD9dK", "Balance": "190353869", "Flags": 0, "OwnerCount": 36, "Sequence": 67819170 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "53128BD1EBBBC592E0DB4D38A83CD6CA66C19619A4B3CC034AF1330B4461F95C", "PreviousFields": { "OwnerCount": 37 }, "PreviousTxnID": "37D8AFC8414C580CBBFE8C923E409B94D9EEE38C956CF89E0A0C59C7E4CC4DEF", "PreviousTxnLgrSeq": 69047806 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLHtFMi1ohYj9RynpB1wRfEAaLtjXkdRH9", "value": "9999844278063876e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "dea" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5314E58AF6DB5ABAD964CAB4564609854A845294FD704B6BD9EC6180A6D6037B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-44020340038.61044" } }, "PreviousTxnID": "001C79AD997F4EAA594FF866E94549603F902CCF63C7A91A4C707E62EDF37C17", "PreviousTxnLgrSeq": 69034878 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-37182500900" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKTKekwyDDoxNtZZTwXL9ebqeVYRp47BVq", "value": "9999999999999990e-1" }, "HighNode": "7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "d7f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5319E699AAF1025DEECE5709CD0A21E2FE2AE4BE788E725543DAA7A97C0A522B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-49182500900" } }, "PreviousTxnID": "97FE6E520473447D0DABD446F445E5214896753CDB3CD1F20856556862E64395", "PreviousTxnLgrSeq": 69014749 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "30600802112.45234" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "8d9", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "ra1aHhcQxB9sHWm7ppBMKEQWs4FTfRGZAg", "value": "1000000000000000e-4" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "53267F52A04F5E01907DD011ADC0D5A687607E9F0CE67C9A7DD05EA5E17C2F76", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "44400802112.45234" } }, "PreviousTxnID": "DAC56E9CE200345EA3FA9579F17EF48D644FFE307FAB52A4A8BAB49AA2F49BAB", "PreviousTxnLgrSeq": 68998978 } }, { "ModifiedNode": { "FinalFields": { "Account": "rQHTzMfwiuyHEaGpCTUE68vbkTR6tXahXr", "Balance": "1064272262", "Flags": 0, "OwnerCount": 366, "Sequence": 66480021 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5326C6BBB57C59ADF30C8524D0F9046255795536BE27D88DEAF49229C0136E51", "PreviousFields": { "Balance": "961323755", "OwnerCount": 367 }, "PreviousTxnID": "4376A2814CF3AC2C5DFEA95DD318A4D31E6854941635BDBCD82A2D9446B627CE", "PreviousTxnLgrSeq": 69050055 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rshXc1NnrPiNRvKbbmnfgQpiSGYugiFUG7", "RootIndex": "5371C9F890D7AF078B7B0F50065283D655DC3B5E38232877050FD7CD5BA42E96" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5371C9F890D7AF078B7B0F50065283D655DC3B5E38232877050FD7CD5BA42E96" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMGXtc2jn88JResx6QRWgyxUvdrXRwmZ7J", "value": "1000000000000000e-4" }, "HighNode": "5", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "93f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "537C0C76D10BF702CE337FD6CE5DD84CD0785E9FA9F14F0246A84572C659382E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-45870196148.47777" } }, "PreviousTxnID": "58732A21CF85D8615C1DE685C3393865723F1B0D329D7EAC8110A7C8654D4EA6", "PreviousTxnLgrSeq": 69018517 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "9", "IndexPrevious": "7", "Owner": "rGhP8A7jhRj3qkYPUR35bRvLCJyxh7xmGq", "RootIndex": "222749D87615438C32FA8B74492200C6F6C356D8E5283B7A8AE2028C137969CC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5384FC6610187967B8B7901BB7586DBE2C31187313BA9D428E3583B409B9B3C6" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJeogNqHS69HkL8Le6zZoezAhGwpU4WPsc", "Balance": "837875193", "Flags": 0, "OwnerCount": 176, "Sequence": 67482353 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "538BFAE6F3EF6C63D785C5BBC35EDC5846B9B08CF3AD6FBD4E0BC5AE84A92D99", "PreviousFields": { "Balance": "430686106", "OwnerCount": 177 }, "PreviousTxnID": "EC896F1685107751C100CB7038A38A35E6C58E776B189206F9299E102DEC73D1", "PreviousTxnLgrSeq": 69061757 } }, { "DeletedNode": { "FinalFields": { "Account": "rjuBmfDDfaXxXRPhcGsGb3qSjdrEUwMGT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652128B8FF5B1A999", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "1FA10D85CB20F3FB21D6536A0C809D0A0C48B7DEAA3D1E81D0C9D0B546F66ECC", "PreviousTxnLgrSeq": 69003586, "Sequence": 67439598, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5068318489052185e-4" }, "TakerPays": "2645662251" }, "LedgerEntryType": "Offer", "LedgerIndex": "53DD464690B4C0F4332C69C640434B305F8FFE5594E1258AC4CF24BF0E70B7CD" } }, { "DeletedNode": { "FinalFields": { "Account": "r4DDKcQaxRVhr17DMzNSrAYBvarHRXBJg5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26343AE24", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "6F182E5A2A2634EC3308E58C12348DEA3DC552908A53F6D828D74B6F2377C54C", "PreviousTxnLgrSeq": 68897430, "Sequence": 67317094, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5400AD1F59D710095F69294C1C012076F89992B53CE8B62234E8D79FEDD20A9E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3913568382.004735" }, "TakerPays": "39135683" } } }, { "DeletedNode": { "FinalFields": { "Account": "rw4M6hoNYisxYmeppD3bkmf1TuTcQrdsit", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E32B478974000", "BookNode": "0", "Flags": 0, "OwnerNode": "a", "PreviousTxnID": "348BDB29FF6A501E24CBA369B5EC28B4F1E2A8781B1D808BA8356292E6C8D426", "PreviousTxnLgrSeq": 68892627, "Sequence": 66943991, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5447E40FC0127E4BD60A061E206EB2E3F01C1B13375D78513EE6B4FA3E8658DC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "85000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "ra1aHhcQxB9sHWm7ppBMKEQWs4FTfRGZAg", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EEBE0B40E8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "3697D406C815E63469505CD737CDFA86C91FD9237F095341CB288EA276E35DFB", "PreviousTxnLgrSeq": 68999005, "Sequence": 66996681, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "544D271A1E6B97E226E8FE04F7C3888618CE660AD8773D414B81517584EE52A5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6500000000" }, "TakerPays": "27300000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rKeFfq8ZvHbFWbsQBAeTB5Ng7aGtoLN84K", "Balance": "1146089545", "Flags": 0, "OwnerCount": 143, "Sequence": 66392609 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5450075C7864EA7D257DD5DA4A2B5BD082771A4656C945BC5FD2B75EFD0D186E", "PreviousFields": { "Balance": "823184545", "OwnerCount": 144 }, "PreviousTxnID": "E62BB85BAA0DA3A2048374FB0FDFF3232341366BFF0479EE581B4B25EE87E1E4", "PreviousTxnLgrSeq": 69039110 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-76466058.394161" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJmWpXLdftZbNdPMYkezgKmEya6R6cAt7T", "value": "1000000000000000e-1" }, "HighNode": "7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "eeb" }, "LedgerEntryType": "RippleState", "LedgerIndex": "545C374CB66C75E415BE7FFFAA388414E2D1D8A508E25E29391208343FF839FD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9076466058.394161" } }, "PreviousTxnID": "25F9D815597E02DA7DD3007F40F176BF8FD0F7A24BC3B5653A231E44A13B8555", "PreviousTxnLgrSeq": 68991117 } }, { "DeletedNode": { "FinalFields": { "Account": "rwBDva3asfNrXQeBmnkV3xbMnw7xi5A3dE", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26E726166", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "7D5E7B1FEBEBC77792F2BEA0E3DD4772E1153B5B60A55E70EFE8207277D7040C", "PreviousTxnLgrSeq": 69005360, "Sequence": 67471067, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5460B845E939FB47E7BBC044CAB10318788A6AEEF8FE1DC4D242CDF3D2956C9E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "37614271082.48669" }, "TakerPays": "376142710" } } }, { "ModifiedNode": { "FinalFields": { "Account": "raQmxvieBXeCfDzRKXdekiw7qucsszMReU", "Balance": "2820245447", "Flags": 0, "OwnerCount": 54, "Sequence": 67458273 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5492FC825D6A7EC4456646F79B48E2CA28C772B1232087DE7BEF779AC4CC76FD", "PreviousFields": { "Balance": "120245447", "OwnerCount": 55 }, "PreviousTxnID": "886E6DBCC54947370EB5A2C8E66661F6CF831BE70F34C27FD6C75051285515B9", "PreviousTxnLgrSeq": 69055705 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsqgHRLHgg1vHi8iA1w1J9amuuUAjwEzwa", "Balance": "303777399", "Flags": 0, "OwnerCount": 24, "Sequence": 67757363 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "54AB2CAE916654E3A300C857D5B5617F3EFAB2A3316FFA47892FEAAF91E379D1", "PreviousFields": { "Balance": "62406163", "OwnerCount": 25 }, "PreviousTxnID": "A5B73FBA7EE7D865CD4C95DEA517DCD0E4B9CE2E7FDBEF415FB6045CAE5B4C27", "PreviousTxnLgrSeq": 69020500 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "218", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raKckiVpb6sE7hq7y1VGpF9YdGAVSbJJLu", "value": "1000000000000000" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "54C862B6DFC3465BC0D9FE3570C6D2B0B04048DE3E87A44106AB4DFB71C3CF27", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "D6F0BA3F9BE663BF601CF4748AE37B91ABBA711D173CE1343904D27344DFBDAD", "PreviousTxnLgrSeq": 67950397 } }, { "DeletedNode": { "FinalFields": { "Account": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F5904616287F9", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "360FDEF594EE00214774ADA86DF70782C047E7F844799405216A580F02EA739A", "PreviousTxnLgrSeq": 68983541, "Sequence": 68499481, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2771014299093231e-4" }, "TakerPays": "1197078177" }, "LedgerEntryType": "Offer", "LedgerIndex": "54E485B2F00403F6C75CD27498F4E75E1120A3140B212D197F2A8CC031D530FA" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHXRGGkmL2bGwkbsz9mnpVi3eAZt5bThdo", "RootIndex": "551CED7A60E875E6C1EA375C44A9ED46D17D7FE47D56F7B75BAF7CE4193B14E6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "551CED7A60E875E6C1EA375C44A9ED46D17D7FE47D56F7B75BAF7CE4193B14E6" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rJ72ZDPTsPvQBUxDvaQd9t2mbD8BrogpBS", "RootIndex": "5525B77252E339AA4D8E9945A8CD8C662F6A25140E5C86EA9A567338DA48BB67" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5525B77252E339AA4D8E9945A8CD8C662F6A25140E5C86EA9A567338DA48BB67" } }, { "DeletedNode": { "FinalFields": { "Account": "rNvk1SNQZhU6fsyMuaTeLucyw5x5uxfxQy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521087E0FC23D000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "8E4B49A0F348EEEB606881444DA8027E310EC3A92AAE7BD078026BE5F7FA0325", "PreviousTxnLgrSeq": 68967943, "Sequence": 67175580, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5525CA7A1F6D40DF239C96D3F029E3014A9A6993343934B131601FEA4D29AB9D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "23265000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "18", "IndexPrevious": "16", "Owner": "rphnh8aG8oBCdrBcgxYgNY8yVqi3b3XqbT", "RootIndex": "F2BB8A5F4368D2D144DC15771F84601A2E2479FE8FE94437BFB57598407A5CC8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "554808AD50DD4A54936FA08A96000F988B310BD6BC533F250736A263A88251E3" } }, { "DeletedNode": { "FinalFields": { "Account": "rhMycFXh1AtyNRL2JeLJmhps2ufxBKY3Wy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305543DF6C9B894", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "6ED68E76A38025A066EF7790CD58A28966A484CB5721E976C5928FFF623B706D", "PreviousTxnLgrSeq": 68152669, "Sequence": 67131649, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15571979732" }, "TakerPays": "233579695" }, "LedgerEntryType": "Offer", "LedgerIndex": "5548BCD23C467981D0B117F894DC2A07FF3E9B66D778575307A24B8B84BDCF0A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBR21hAWPJuTd1btLDfunkJUeRSWsEaLpb", "RootIndex": "5579D6BE4B30C16217FB379825F02E501E11FFF601C2ECB80C6B91B2AD79AF4C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5579D6BE4B30C16217FB379825F02E501E11FFF601C2ECB80C6B91B2AD79AF4C" } }, { "ModifiedNode": { "FinalFields": { "Account": "r9ma91EcMDXDCLQZDvceT9tDwHRT41gumt", "Balance": "423589999", "Flags": 0, "OwnerCount": 159, "Sequence": 67518301 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "55B1C1C31815D2E269C2FCE3F1569CE490F52F1ACF216519A03A2DD49D470AD3", "PreviousFields": { "Balance": "345726101", "OwnerCount": 160 }, "PreviousTxnID": "AB457CBFA27B38A510E50696108F353D1DD46B4E634A6680B9AA60D72CFF79C0", "PreviousTxnLgrSeq": 69062420 } }, { "DeletedNode": { "FinalFields": { "Account": "rnfuLKZgLhpw1UJorfJH8G1ukEyA7JLf3n", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C4E67046", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "7DABBFD23C91B23097A02E5AE0C10C540C5A460F9AE181AECA9F35D2DD1F251D", "PreviousTxnLgrSeq": 68790847, "Sequence": 67152415, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "55C69CE840994089C769E6DC9E29606FB8F7090325D8AB6FB674199200FDA3B3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "70073908" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDAsQhHKNqg4ueKpzLPYbR7bzmjDve6dVF", "RootIndex": "55E0D6DFFD6693781CC1FBC766C9DD5210B434F4969E7D58623C106EAF981B95" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "55E0D6DFFD6693781CC1FBC766C9DD5210B434F4969E7D58623C106EAF981B95" } }, { "DeletedNode": { "FinalFields": { "Account": "rJw1L2RZTiPTQJSF7KmstuGrdNrTmdvAjb", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308E1BC8811FCAA", "BookNode": "0", "Flags": 131072, "OwnerNode": "10", "PreviousTxnID": "7C3BC7A50FEAF9833DC6ED2B16D1F356B012A67DCFDDAC47EADE442DEA40AB28", "PreviousTxnLgrSeq": 68896666, "Sequence": 66304744, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "55EC08E86D9E3208EF45B63291181D07B8B9B3FAEC61F6C727D4CF23AA4BDDD1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "300000000" }, "TakerPays": "7499999" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rG7WNJTTMRQma1eeWs5CDv8LwsLb3QQhvv", "value": "9999610698224570e-1" }, "HighNode": "5", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e92" }, "LedgerEntryType": "RippleState", "LedgerIndex": "55EE335C6A896E3151F77B37CA676522A90D41D1ACE1C7ED39091733A5CF11A8", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-830.7192" } }, "PreviousTxnID": "E30918B56B543B285E2C3E074B179F4CDA562D2635E1C0385CD631231D586585", "PreviousTxnLgrSeq": 69041261 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "8", "Owner": "rnpQiciqw8RGKo3NmqAuyZXScNoCNmQSL6", "RootIndex": "3BAE5382ECF21938C83A0CF16589FEA1A9FC7295B48D3681E479ECFBFBED2C7A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5632091CE8EB509E65002759539D2E764BDD861EE881AC2C5A1C91CB240E47AF" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "rpPjK8mxW6UndeHNvtgJPSaQjARCSXGCWY", "RootIndex": "99AF7B99261FF23F60A67CE18698CE7475AAC67BD8BB447EB1D20564B0134CA9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5671FFE431E1136F1FF4B4EC6E724B8E1C74D291654BCCF3E55FBD4A056A4F5B" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-52288918928" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHa9ikQjRRPKoFgcqN3dwTb27vvL1Ezo6D", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "380" }, "LedgerEntryType": "RippleState", "LedgerIndex": "56D58ADE427A8A55CAE5918E567B4F5113183C6535A0EA7AA731EC7F24A971FD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-62288918928" } }, "PreviousTxnID": "2CBED246A79872FEA3384473165FE0C1677689B7B473D8370F7B7A6B2148E054", "PreviousTxnLgrSeq": 68898941 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsGTbAufvBkkN5xpaKZtEMCagAW5SkJEUL", "Balance": "1343827294", "Flags": 0, "OwnerCount": 400, "Sequence": 65899782 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "56E4E6216CF3C87059552EF851E894E8336A20276FC04DC237EE235A7D0B6E30", "PreviousFields": { "Balance": "1263908002", "OwnerCount": 401 }, "PreviousTxnID": "D21FBFC20EAD2CA2A0DD23749B7C760648441C34A63238BE25709C7908D72378", "PreviousTxnLgrSeq": 69063962 } }, { "DeletedNode": { "FinalFields": { "Account": "rMMTgtHSock7M74yRKkp4ug6i14nGeCJhW", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207AB995C11F000", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "A4D8A02FCE983488B325B7927A17930B434CE8BC8EE056960B34461641D10DE7", "PreviousTxnLgrSeq": 69062416, "Sequence": 66483832, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5999565269.56137" }, "TakerPays": "12953061" }, "LedgerEntryType": "Offer", "LedgerIndex": "56E67A2C29A1B6361C3D773BB1A29DF6522167B155D2C5B541ADAF2C066CE15A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "33000000000" }, "TakerPays": "71247000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rUHsUfjv1Ai9KiT6R3WzLcAKvvPLao6fiK", "Balance": "2344386676", "Flags": 0, "OwnerCount": 34, "Sequence": 67546038 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "56E8FCA1E9174CD5F3FAD773A50BA159741E33B81F77E45FA26775F49541EE51", "PreviousFields": { "Balance": "242169413", "OwnerCount": 35 }, "PreviousTxnID": "52425D867B045998AA8AB676C818D7626C542ECCD3D8FD7B28352875798F43D8", "PreviousTxnLgrSeq": 69063174 } }, { "ModifiedNode": { "FinalFields": { "Account": "rH5oQKTQ5VaFHC8MFN912377XMG5EH3vTB", "Balance": "2373673994", "Flags": 0, "OwnerCount": 74, "Sequence": 59805865 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5701B833079E17C6DD81EC5E3B52543F768C35E649CADE9CFFD6B7F442C05274", "PreviousFields": { "Balance": "1672934907", "OwnerCount": 75 }, "PreviousTxnID": "FB1D04FE2805BE1DCDB6145399A9B596625B962DFEE33839F9B6B71B8553EA8C", "PreviousTxnLgrSeq": 69013114 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "r3pJZNxQwVRMyeohSyy5C9ZCJzvRWVAXLg", "RootIndex": "78CBD081AF7E6C1B921632E0BAB9DCF2EFF3182214530373A7B80E94AAC434A1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5757AD9C1584F8A09CFBB1E59F21AD30EBF6BFB7B4D772F219923B7D8B1DBC62" } }, { "DeletedNode": { "FinalFields": { "Account": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082E90F8EAF000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "128A9895BFE89D20E9ADD5562E39571EB7297BB1A35B2103C965476116913ADC", "PreviousTxnLgrSeq": 69054947, "Sequence": 67440527, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "579C0F424D74034B0B936A7502630D5E80EB4FAB1D6904A23FE867BD7EE64A4D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "230300000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJ72ZDPTsPvQBUxDvaQd9t2mbD8BrogpBS", "value": "9999688558266544e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e0c" }, "LedgerEntryType": "RippleState", "LedgerIndex": "57B445E88A6D6122D24CA35BAE19E42B9B59AA35BB5DB478DAA48789E45312FB", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-18486911984.01258" } }, "PreviousTxnID": "D2A5F5FF65BD43467BA37C85551751B2A0BE6CF806C236588602E36898A3DCDE", "PreviousTxnLgrSeq": 68898357 } }, { "ModifiedNode": { "FinalFields": { "Account": "rnfs5ayanPy2X7aQERUoayaokxjuH361V8", "Balance": "481026137", "Flags": 0, "OwnerCount": 199, "Sequence": 66388648 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "57B899CC1CFAF4E7B42A0AA68D9BAEC45C87095000D92C3D81C56F5C2F746A96", "PreviousFields": { "Balance": "421026137", "OwnerCount": 200 }, "PreviousTxnID": "C384940E7821A53AA10117FC011AF3E6D00C2F76695D9E36DD7DF3CB5980B838", "PreviousTxnLgrSeq": 69064107 } }, { "DeletedNode": { "FinalFields": { "Account": "raZrDVYBJ5whjdgJ1V6FtiYixKesEfDyKJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531BA123E9BED563", "BookNode": "0", "Flags": 131072, "OwnerNode": "f", "PreviousTxnID": "D6237430901199F6D6CF5A5DABEDE2A521A62E9DA81A77B98D49C9E9E87CBE2B", "PreviousTxnLgrSeq": 68244830, "Sequence": 58008817, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "57EFBABCB1DE594D5949511FE21A9CFFC87547B1934726815E14F58D06D6DEBA", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "605516431" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rDvF12VVLg8CD36Ba9U4HUB5q7AWai6BFi", "RootIndex": "4FFE7D1F9644F106891D5B975BA035F2208D2A54722F844DF8EC86BE38AA4C59" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "58099AB338C45AEBE656623A84B428CDF343F94B9F40D1F22D4E15BB43608BB0" } }, { "DeletedNode": { "FinalFields": { "Account": "r3PYAn9d1DTFzJ9kuvFnhudgwsVZ6pm5hT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA8F09440D200", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "B6833536FCAD011B885A6C25FBCB456017E22B52B1A35DA56817720EC004E856", "PreviousTxnLgrSeq": 69051350, "Sequence": 67442398, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "581F8E42E84AB3176014D76515A93632DDB4802B90E4806D6014E30A5DAED929", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1700000000000000e-4" }, "TakerPays": "510085170" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rGx2XhvjUKvW7Wkz67b5ERSKhb7m4fZmrj", "RootIndex": "09225BF2C508B65A0FFA23B6E4498C3941EA7B44250905AC032AFE23833714CB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5823E6BEC0E4B20A168546DC933DC9BBFA6BE78C290C980380F43AD949B878BD" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rGEVM6YhWfikBZiXgWRdcUk7XpAyAnUHZw", "RootIndex": "B1045716CDA5F99BADD0318E448E5E76C61DD6396B53000B7E795C15D98D831C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5835DF5DC2F9BBED84E9BA590926A3C1F2AA9478DD723C22BD2F1FBDEA9E23C3" } }, { "ModifiedNode": { "FinalFields": { "Account": "rEXcziBZ9tEnmNVrcdbQATJPr8JRHuRrZV", "Balance": "405030363", "Flags": 0, "OwnerCount": 57, "Sequence": 67346396 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "584C0D9BD9D093A09DE72B5D7F7DFCAEEB6C159EB84A34669BAF76097C95C844", "PreviousFields": { "Balance": "135244207", "OwnerCount": 58 }, "PreviousTxnID": "69668FD1EE8F5BAF3D32665D87C6E7AAEC96FEAD39CFA4CFF20CB1F3B90C22A8", "PreviousTxnLgrSeq": 69050089 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHm3si5FLgHjXC7E2qXKwNDGAe5khVpEHg", "Balance": "1618202482", "Flags": 0, "OwnerCount": 3, "Sequence": 67647503 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "585CC24C0F3927FD82A91CD2089BC69D35C3D31A383DCC0D1CC2C682C2B5F579", "PreviousFields": { "Balance": "17999985", "OwnerCount": 4 }, "PreviousTxnID": "A58FC7813AFC9DB58BF50CBE26E5151FD1AA6552F5B560453AA7911556EDDE30", "PreviousTxnLgrSeq": 68986618 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "88.65468" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "5f3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBZXb3rXDo251L4ZJdQCa8AUjP7kc9ifCT", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "58751980262694F1C7E529BED65BB4BFD9108DEE713E430D3F144C9EAF360031", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "25258903885.65865" } }, "PreviousTxnID": "C1002ECF311684424992B98550304F6B8ADBE3FF43CC0089574A618228B2DE28", "PreviousTxnLgrSeq": 69048549 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rESTNm5GsJf8WQEnEmszRCsiEzHuFAcgQk", "RootIndex": "6C045C15ECB589291DD16E5D78CB16805A235EF820D705342B201395585A8431" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "589C75E473C4146F90B53F22A3673741C8B451F09B24824DA539C284F655F059" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rHwM7GiRubuut3pJW2ycC4e6vaarV5xp7", "RootIndex": "24721651BF8787E2B69BF5D5E620A00BCBB5DDFC82952D4B754F4A255D053406" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "58BD142B0118B421682172C88FDDED9C31E08CEC996889263CEEBF35E55BC51C" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r5EHmNdKr1SRiA1DrtKBo18DYRrE5ncHF", "RootIndex": "58CDB2F7E8857D61B216B3B9D86476A9383504379078D157C6124995CC070665" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "58CDB2F7E8857D61B216B3B9D86476A9383504379078D157C6124995CC070665" } }, { "DeletedNode": { "FinalFields": { "Account": "rGBdiULuYdTBGGX2JWzmjRXscUacAHsm3i", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535CF88C59A", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "5FE9577A1A7F6DD8E02AFB3DE747C8C9D4038C68619054B041AAF89BD3E02E42", "PreviousTxnLgrSeq": 68913833, "Sequence": 67472001, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "58FDBB5769B51C4BD538A5071650A39695F7966BC3510587AA00F66B6EBDCAFF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9673050892.636902" }, "TakerPays": "72547881" } } }, { "DeletedNode": { "FinalFields": { "Account": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8C572843", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "BE790D120D7B7E8B4B95D8FACEDA9C93D164E3F0A43C1BB693A25136A283448F", "PreviousTxnLgrSeq": 68983929, "Sequence": 68499487, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "52836228616.34266" }, "TakerPays": "228199671" }, "LedgerEntryType": "Offer", "LedgerIndex": "5905F01E76FDC7FD2F66E3E0409BF469D6688945570857C330A326354D440130" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJjTUAWDqunqKUB8SgYHV8QNTmvGArX4Lv", "Balance": "198985102", "Flags": 0, "OwnerCount": 59, "Sequence": 67287290 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5921643A2E106669012B98B045967A157D92B79B333ABB30F79984C3ED8AE3F9", "PreviousFields": { "OwnerCount": 60 }, "PreviousTxnID": "E48EB544CB03CB704F3466A27F8C4C2F322367955C8852D4A5923D3EA6CB5E5E", "PreviousTxnLgrSeq": 69058439 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e02", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUMbRuiufkSUvwXG6HBXYHTW9TpioNBKjo", "value": "9999999999999990e-1" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "592CBB41581458D589DA0573318DEA2B789EA60D846D698CC08D102052703EE0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "750B386214D8A46A8DCC77F80C1D72929FFCC110A10469B6E49768D2E23116E7", "PreviousTxnLgrSeq": 68085363 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGCr7TstZbRvToumrTKaUcTX9JGKVLsCVB", "value": "9999999999999999e-1" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "44c" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5967A5DE9EF81B00E98FEDA248A8E4AB260417252B20CD88C24B42A8AD3FB472", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1079467827.39087" } }, "PreviousTxnID": "84E16E67AD7ABB661A6781C9F20DBB8EA73CD7CE76207803D9E23B373DFE0E7F", "PreviousTxnLgrSeq": 68898799 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "aa4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3NPSAnK3n8wx7pdeCje64yvei4xLBrgd", "value": "9999999999999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5995C30B6B918990349B965D9707AFB5B001E7E1712905B511DC19722219C448", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "23357969598" } }, "PreviousTxnID": "72515FAF306BBC816B1220004C67E03A27899E592D4822C6D194039C2C7F903C", "PreviousTxnLgrSeq": 68664162 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eca", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r7ouMSA1S6pggGmsYRZewYQzCP7XgLiEx", "value": "1000000000000000e-1" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "59D605E229028D55B81B79C62502F59C0BF8979A1387AF70F5B24A8150F548A3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6500000000" } }, "PreviousTxnID": "3D5F06E17BD07B74C4DA10E175D327B577E56ECE0780547B1AF520834E814B3A", "PreviousTxnLgrSeq": 68874064 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsj4wU1Tv93ES5J3AZrWVcgaKXV9b5aNKc", "Balance": "9491596132", "Flags": 0, "OwnerCount": 354, "Sequence": 66179898 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5A0BABA4B362A652ADAB5817130F7101C6ADF07A3CA0BFFAD86299AB8DE9C2EE", "PreviousFields": { "Balance": "9091596132", "OwnerCount": 355 }, "PreviousTxnID": "3E52048F141D9B0B50F954058D618F45110DA36BF9D8CA80C2AE0C4345DECC91", "PreviousTxnLgrSeq": 69059835 } }, { "DeletedNode": { "FinalFields": { "Account": "rnZj4CQouegP4s5Hu2LxBbjCfGSWQuzRAp", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C35634F844000", "BookNode": "0", "Expiration": 726830421, "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "B3638F0294BAD3383C8E8D78792565DA81E89EFBF58439E1932091830C950283", "PreviousTxnLgrSeq": 68960703, "Sequence": 58648415, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5A12E4AB483D7951BF03379EB3B143CC5BA7A3A87FE01201663E26D07F4A3CEF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1290000000000000e-4" }, "TakerPays": "1024260000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rEX4EMcBRESCnk2kKB1Yhzc5KSCib7Qh1W", "Balance": "298470079", "Flags": 0, "OwnerCount": 86, "Sequence": 66347424 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5A228EA6953C00782C6627757121488FCC366D8FA9D6AB76BE4A804A3F674E72", "PreviousFields": { "Balance": "204192846", "OwnerCount": 88 }, "PreviousTxnID": "8680F759DAEFE043ABB5E07F1B1649EA88F1E6D7DB085ECDF60E8C831035889C", "PreviousTxnLgrSeq": 69063645 } }, { "DeletedNode": { "FinalFields": { "Account": "rT8my4rryyrydKwE4W9LqQNosfNjZQb3r", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C110213BD1FAB", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "358D701CC129B7D4A82FCC60586D296A34DDB70B1803DC2E6B1E542FE2FCF8F8", "PreviousTxnLgrSeq": 68898182, "Sequence": 66283045, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5A31BA94B1973C262DF530F3096710A50C358346974B6BC95AF8E39038615844", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "30000000000" }, "TakerPays": "236999999" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rPSYhGCFb4y7ntd2VaJzTS4eqiw91wynZn", "Balance": "1000440305", "Flags": 0, "OwnerCount": 179, "Sequence": 66692750 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5A4650BBAB37FF90D2D1EA576D55087D3193DDB96481BC29DF7FB8D58C7EA834", "PreviousFields": { "Balance": "923940305", "OwnerCount": 180 }, "PreviousTxnID": "1BE91702B500B35789B6EE211361185CCC7E475BCAB4D229399F557A2CCDF83A", "PreviousTxnLgrSeq": 69062056 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "72786189866" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c0e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpFYhEoT7AeTuaAZYwU25Gjn3i2VygsMnP", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5A5DB84C18200C607BAB32B17EB2AB9208D44DB2DF98CD1F8B8A7B4C6AF6421A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "77786189866" } }, "PreviousTxnID": "4CC29E5F72326E675D729AB100A4EC8FC2F102042515ED8C233DD11F40979446", "PreviousTxnLgrSeq": 68129455 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUATLa1awouAR8jS1DwtsXuy8EXCjdktgU", "Balance": "1044373994", "Flags": 0, "OwnerCount": 265, "Sequence": 66417126 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5A8D10108D9995B5C85BC68AC210DF030C3085870E63F7B471A5912B88E28032", "PreviousFields": { "Balance": "969373994", "OwnerCount": 266 }, "PreviousTxnID": "AD7F0277D6DA73EFCE42959232ACB2110A68CC16CEE697E3CB69875DD6C730A9", "PreviousTxnLgrSeq": 69064158 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rLBBX2NYwmoiRB68BQP3eo15BbaYtR8qdK", "RootIndex": "5A96B9D4912C38778B67037F2162083266E2BB39493040126D7BD46328685FCA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5A96B9D4912C38778B67037F2162083266E2BB39493040126D7BD46328685FCA" } }, { "DeletedNode": { "FinalFields": { "Account": "rUV7WQGpjkPJNuAuggRRFLYVoaegHzuxoy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520822BE2BCE35C3", "BookNode": "0", "Flags": 0, "OwnerNode": "3", "PreviousTxnID": "6D7F359D759EFA286A4A2EB4B325A134DAE6E966B961FEA082D567AC30FA5E12", "PreviousTxnLgrSeq": 69034242, "Sequence": 66502072, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "55013829115.2405" }, "TakerPays": "125981668" }, "LedgerEntryType": "Offer", "LedgerIndex": "5A9748CD6324AAF1DA5B77B8D17DF4451A58E5660B737BF8680C2EAC650E6F95" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10121816808.56715" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e15", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3fU9zQRHEWPbnN3r9TcM1d6NSRsBvUjau", "value": "9999688558266531e-1" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5AC40AC71C985B1A50EF819D771233D0F22258869FC7F47CBE83A160C1A14805", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "18121816808.56715" } }, "PreviousTxnID": "D0AF1D10D96F5290BC1B5E4FAFF70301A8FF552AD3E10BE9AB8743CDEB733929", "PreviousTxnLgrSeq": 69019381 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "acd", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnu8qs15n6d9Xj21aBXxjdgyWz5cqNXqkf", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5ACE3BD2FA006E00822C16F2966ACB627D9149C93E0FF64CC5CA7AA739260F82", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10000000000" } }, "PreviousTxnID": "1C741B2524125CF6DC6B88A971D376378847CC8047464782765FD3C025E2639A", "PreviousTxnLgrSeq": 69030154 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-225989866" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGx2XhvjUKvW7Wkz67b5ERSKhb7m4fZmrj", "value": "1000000000000000e-4" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "60d" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5AE7490BC6B51FC082E359885AE0485FDE3268DF0703938E58E9FB0867C2EF8D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "073493880F8302CCC77C8D5E9179D2412CABE6B1122342F3015013C416FE39C2", "PreviousTxnLgrSeq": 67998761 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7586289866" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNk5vizuipEGcr9cNVXnh1eBjhaMFqFs42", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "93c" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5AEAF5FE5F9CFC48C12BFF66E95535D1F0CDB7C234501BB34D5D4EEA867DAA32", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-8586289866" } }, "PreviousTxnID": "9D8C8C469059F979C797CFA232E225A59A685F7040F279DB0DB01972E46E732E", "PreviousTxnLgrSeq": 68348032 } }, { "DeletedNode": { "FinalFields": { "Account": "rEJjxWqDiG1H1PDqXXnwdHjxAUTnVGmrDS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652168F4A8FAA9085", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "E0E0C7E9AC57D620B05F97E35A1929BD6FEE3E004944CCF8F62CA84B975CC94C", "PreviousTxnLgrSeq": 68914826, "Sequence": 66994164, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5B423F81DC1F2A7E9CEB2B495B4ED52D35C15F42FB5DC3B2AB472E4509CEA154", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6343856961.979338" }, "TakerPays": "40283491" } } }, { "DeletedNode": { "FinalFields": { "Account": "rfBvZMQKX3gxybSQAt116zqUxXKu7a8BmY", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE767A76687C", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "C560E237906573699477296898FD68CCA336FC010E7CACC757E6D1679053BF76", "PreviousTxnLgrSeq": 68900875, "Sequence": 67523724, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5B5F24F7C45D7CF2117246244353F777324C62FA1CDE5C5E44E41D86B86C5C06", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8484865427.359063" }, "TakerPays": "59394057" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20000000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMq6uX75yyCP9KjWCxYghLf9xsr3rQCbJv", "value": "1000000000000000e-4" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "681" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5B6F60A6D309D1F090F70F4E4CF74C3E052B4B3A6E0DC8F1A5C97450472A099F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30000000000" } }, "PreviousTxnID": "BB0829C3A2F5A368833AD7400289B072203DFFDC1442819F2AAD3A6EA8EA278B", "PreviousTxnLgrSeq": 69056325 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUg2bKuyZzQLPopT6uNZK7w4zvJHLB5LV", "Balance": "120788529", "Flags": 0, "OwnerCount": 24, "Sequence": 67761591 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5B6F87B542DFE1639B211DB808910B105114B9542EF203234E5B869612F26B54", "PreviousFields": { "Balance": "60135668", "OwnerCount": 25 }, "PreviousTxnID": "1D1E511C96E6BFA2227E3EE2DF59E1516CD4897DD770BDD2678D38EFE7B9F00E", "PreviousTxnLgrSeq": 69044018 } }, { "DeletedNode": { "FinalFields": { "Account": "rs4wbWdssBMJRgn4tJak3eq1JgrJ7Pgfnk", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208DF0180B023FE", "BookNode": "0", "Expiration": 727079302, "Flags": 0, "OwnerNode": "4", "PreviousTxnID": "D49B8156F4278396E5B8FD416D2DEB91B3AC4F601FAD93A18EAA18BC24855804", "PreviousTxnLgrSeq": 69023879, "Sequence": 67390766, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5BB79A4C83DD409C4E3ACB31E35BCBCD3F0E5DC48BE246956BBFCA0C5F402BD7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "40048100000" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rKU9ca11NtN2HFEaNj3WhV7dS13vpDeS46", "RootIndex": "BEF85A853C42B021D826AAD6C42D40F1BE784663EFD594507B927A4D8E782818" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5BBFBD4CCD0E87358B079FEFD8281BBFB7A229CC195138024A51236DAD2A9BAC" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "raf2m8Ki2PVqjTU3YsKK5R62dAhiYXepcz", "RootIndex": "41525F45DEF6E2E8D39EBFBD63DEC532EB4E7B61705DF8E51D1A9601DB8D6FA2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5BC174388B1640F0ED80C00855C20E27DF71C8D80EF03F2D4B3AF39633B477C5" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rUrtZA3gFTbfu9vkdygv2jzgBoFRYMNv5L", "RootIndex": "05F1DCC4EFD3E83FF10B0E8CF7236652AA877A8594CBDC241A45CEDA73CD867A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5BC8A0D5DF767CFFA089A01F77A259EB0729EED839167789024A0A22866C160A" } }, { "ModifiedNode": { "FinalFields": { "Account": "rfzxSb2zMhKDqCsD81pZt7Bjkvak4NBwFx", "Balance": "20267277794", "Flags": 0, "MessageKey": "0200000000000000000000000034FD3666475676CB7BFAE4E97B21344A0AB70815", "OwnerCount": 90, "Sequence": 462 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5BCF66C7B4E584C4DE10D6FD6EE12B9C3ED22142714FFC8F6A54015B911E46CD", "PreviousFields": { "Balance": "19650627396", "OwnerCount": 91 }, "PreviousTxnID": "A62122A176F72CE081CF2433ED195021BBBB2ED7AF38DB0BE373F6AC34ABB29B", "PreviousTxnLgrSeq": 69051325 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1967564523398910e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e41", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnMENGbcT6QgrfDGjz7UJvyMryD8YPdi3y", "value": "1000000000000000e-1" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5C2C5C77432792B2BB45604F19C7F97C6C1ED3CB9D8C90406250BD9E67B73BF1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2527394002524802e-3" } }, "PreviousTxnID": "808483DE8C02BB3297A29B4BECB913C6DC226D403087E9AFA8A0E7947CD351A3", "PreviousTxnLgrSeq": 68991025 } }, { "DeletedNode": { "FinalFields": { "Account": "rphnh8aG8oBCdrBcgxYgNY8yVqi3b3XqbT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652164FA070E876B7", "BookNode": "0", "Flags": 131072, "OwnerNode": "16", "PreviousTxnID": "27AB9D6349662DC8F53E4CD2615F83CCA6A4F04A3F570A3DFE4053103E20E85C", "PreviousTxnLgrSeq": 68910115, "Sequence": 66157558, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5C346EC12ED9BEAFF75E429B3E19886BAF7252571165670C88C0EB20DCC58494", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "45888888888" }, "TakerPays": "288182222" } } }, { "DeletedNode": { "FinalFields": { "Account": "rDfGPHrMgjFmWvA3TRkx5rcD85Y9sNizB2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "8FD8CBE2A181BE8E12B9B9457BE4AE1503FA0090DF27A6A61526262A814AF767", "PreviousTxnLgrSeq": 68913256, "Sequence": 67704666, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5C9435AFB0879AE8E584666986371405B6C7175574924D8299DE3ADEF056D1D2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "80000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rBZXb3rXDo251L4ZJdQCa8AUjP7kc9ifCT", "RootIndex": "16F46DA771BDA4EBCDA7F4B003022DCA7C535694D53FE00128BB583064393B9D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5CBF86BDD4E232A7A7E427E14F74E2145523AD9DFE51AEF462D7A81F77C52F2A" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1010510358.76" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eff", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsz7uAUXWXXeEfR55mUHFiWbdTomtXqdcv", "value": "1000000000000000e-4" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5D46BB26BA48FD71E3198D0E5D5A2BAD45FF17474F0420C0FE1FC9872D39869F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3666010358.76" } }, "PreviousTxnID": "B37E2D9B367BB41978656FF34304ECD6D498B5A3801038C364744F8BC3A411F3", "PreviousTxnLgrSeq": 69052938 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rhxWqi4kQsADuck5wUsbXCcR2Pq44kbjZs", "RootIndex": "BBB08F79F963AF6B4C516719878E6EBE29C60FF1A4A16406714BE58FB9AB4CEB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5D57B69DC00B62AB8F0AD9BFB6EE68E732375CA83B2522E4F4DCFFE04AD7DB07" } }, { "ModifiedNode": { "FinalFields": { "Account": "rXEUqWCmmyBxf2PUjPFAj5b5DuydWyRe4", "Balance": "1344254296", "Flags": 0, "OwnerCount": 469, "Sequence": 67494369 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5D5A83F4F61408125C30C771ED507D7969625321A8D6E9A8B50FE06B16414058", "PreviousFields": { "Balance": "1291004296", "OwnerCount": 470 }, "PreviousTxnID": "62408E6825CDA85B1780AAE5FBC02E99956FBEFE8954BABF41D59B4BDF0F4741", "PreviousTxnLgrSeq": 69063890 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "edf", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfzG9eLEj6jZUbign4K98pmLSQt717FVaj", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5D611AA4DD5CEA87E00C112C407E3C0A3BDF0ADDE50FDDF35A724B970B9C9B71", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3450040988.952056" } }, "PreviousTxnID": "B20592FBA6913E38EEBE9A40AAE74A042EC5328B5E4AE6E347AA9B3DE489742A", "PreviousTxnLgrSeq": 68897428 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r35RUZ6PjS9JT6pHG6298ES1abD9uv43D4", "RootIndex": "21DDD8D6E58359D2128337D5775CFEAF2254A2568CF0259BCCEF54386755E27D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5D835312EDEC37923A5B2709D5E63E6B36FD91CDFB3FA7CE6B0B36D44F19792C" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "r3XYRBp1PnkL2JesUDNw5zo4yxmkYQD9dK", "RootIndex": "5D8CC11278E5FEB2763C28AC51C6FBE52875DD2B64A13FF8AE490ABD4CDFB37B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5D8CC11278E5FEB2763C28AC51C6FBE52875DD2B64A13FF8AE490ABD4CDFB37B" } }, { "DeletedNode": { "FinalFields": { "Account": "rMDc7eVhCw5jjCXU5DGpn2tUV9D7aBBFLx", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C773B26B", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "FC9B48A77A7B8BF081904BC1C1C877A8670659CC821A9EB1F23EEAB83A56C5C3", "PreviousTxnLgrSeq": 68790599, "Sequence": 66970267, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2802956351.76" }, "TakerPays": "25226607" }, "LedgerEntryType": "Offer", "LedgerIndex": "5DBF569F9A8163B65EF6F8C1E3C99B2A1A85CC6F5E32FC217D24DF8EFC1D42D5" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJqAwcpzstjreWoBc7wGXRtWoxSeXTUzf9", "Balance": "216975438", "Flags": 0, "OwnerCount": 76, "Sequence": 66945455 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5DF8A7C885CEA369B09EE89CA46FF8C14D5496B76CB947D61C63042654347BB4", "PreviousFields": { "OwnerCount": 77 }, "PreviousTxnID": "30B598BA8D89AA5DC3128057255C5F2A298F2D212E25C931BC84B1ACE95C5BBD", "PreviousTxnLgrSeq": 69061763 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMrFWesXLbeMANpexJkZdYYtCwhqot4x6B", "Balance": "233454516", "Flags": 0, "OwnerCount": 58, "Sequence": 67169694 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5E49A960325597FD80AA1444C3BBABEEF25CF63BA0425836FC335D5A1EC28FF8", "PreviousFields": { "Balance": "132236648", "OwnerCount": 59 }, "PreviousTxnID": "81958D59B62C1B5F8D078BE6C8156E32C4970195F5B0F8028E616A6F59D0DE1B", "PreviousTxnLgrSeq": 69063407 } }, { "DeletedNode": { "FinalFields": { "Account": "rKnBQjFdG2pPCrKiUmeZZZ6YjmuCyWVta", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304DD19260B3894", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "E08EB20092A1808696B2689CEF5BC90F152A6158E2C9AE916D6EB3BFCA9BA170", "PreviousTxnLgrSeq": 68996871, "Sequence": 67618627, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5E4E162F93BCAA99E3252B7CC56BB57081FF7DD4539A22CCDE260A66A8A72721", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7607438921.424369" }, "TakerPays": "104145838" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rMQF7GUuJQHvrEkXkcySkEvb4fbsGoqGqC", "Balance": "93765771", "Flags": 0, "OwnerCount": 20, "Sequence": 67874802 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5E6A48EE8FA911ADD44ACC1465F0602A57A1317A0469331C1ABFDDF93A4EAA6C", "PreviousFields": { "Balance": "53994864", "OwnerCount": 21 }, "PreviousTxnID": "7EB09A168D9C693AC60BB3E1A2172B5A174E80AAA0C8972F417CEC1F3DE15408", "PreviousTxnLgrSeq": 69056398 } }, { "DeletedNode": { "FinalFields": { "Account": "r9guPT5E5ZDd4hPpLJC6UnXCGoRB8tZ2Jr", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F46D3C47B7E57", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "13A0BC1E6B6DC82737F8D0567CB6F710AB37B5A80D2D2A10ABCF283A23D06C60", "PreviousTxnLgrSeq": 68995349, "Sequence": 66262546, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5E84449038336BF94D98C75EA3F03E2CDEE40DD6A75DC37E008DD312D5F0C21A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "69459496293.10345" }, "TakerPays": "298675834" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "30000000000.00001" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "119", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rw4M6hoNYisxYmeppD3bkmf1TuTcQrdsit", "value": "9999999997999993e-1" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5EA8E30B92890C13EB1C73227C831330D522783DE93567FECBE06917E2CBB7B5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "40000000000.00001" } }, "PreviousTxnID": "BC0F15BA00DEDA07EFFBA3E1DAFC052DA2F7392487E9FFD5452155207B66C7A1", "PreviousTxnLgrSeq": 68898795 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-19587476070.79549" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPpC3LrzwLjh2qU7XtQKFb4GCZyAUHz7Ss", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5EACB38897EE45CFB760AF48EE19325BFD7BAF04CD362541E8B97E0EBB42D11A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-39587476070.79549" } }, "PreviousTxnID": "35DAD3D0D11A733E488EFFF538CE3DC2966C83B7337D72004954AD0B15CB1BA6", "PreviousTxnLgrSeq": 68911170 } }, { "DeletedNode": { "FinalFields": { "Account": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C6E526BD31DD9", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "9F47BFFC0BD06F16BFBF47071CF2592955DC41460608AECCA8C740159CC96F32", "PreviousTxnLgrSeq": 68997825, "Sequence": 68499498, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2023211571390819e-4" }, "TakerPays": "707921728" }, "LedgerEntryType": "Offer", "LedgerIndex": "5EAE5045091A22E077098C1F389A470BCD63F0D0C9C2682C7AB39984089ACCAB" } }, { "ModifiedNode": { "FinalFields": { "Account": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "Balance": "4042182496", "Flags": 0, "OwnerCount": 56, "Sequence": 67440552 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5EAE79BB92CF47C3D201FA254C316350ABF1645BA8A02CFB40989C6E60B90A12", "PreviousFields": { "Balance": "1564232791", "OwnerCount": 65 }, "PreviousTxnID": "A96B3E08E70DF94456BFFE1E41142A2BDC7B5F502DC3ED521B740FB11536C58A", "PreviousTxnLgrSeq": 69064170 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1c", "IndexPrevious": "1a", "Owner": "rXEUqWCmmyBxf2PUjPFAj5b5DuydWyRe4", "RootIndex": "C2718000B71B3F14AD3AB69A2DF9E90EB9388E89585E06471C80CEF064ECB87A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5ED024B8375A469FE964BF598723E4030D28BDB2C98EBC474C68208B7FF9160D" } }, { "DeletedNode": { "FinalFields": { "Account": "rMQGzm5niy3VzeWEqokwb28toV137fbiYJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26ECE7CFE", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "76B7361BD0BA084A3E812C66432C5BE7C63F8337B827176B70500F489EDB3DF7", "PreviousTxnLgrSeq": 68897474, "Sequence": 67388241, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "5EDFE008A895A2D5154753EC4ED49FFFAEAFD166909D658E0C5C1CAA9A6EB877", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4658203417.403399" }, "TakerPays": "465820341" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rnu8qs15n6d9Xj21aBXxjdgyWz5cqNXqkf", "RootIndex": "7E67DB50F68702F824C2AF5F07783547A5B3F50A8AB812EB8534B9A01400D0F1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5EE396E4E68949A98C10191C7C03E6EF6C95ECB4FD3E836AB070F7713A5946CA" } }, { "ModifiedNode": { "FinalFields": { "Account": "rHvia9Ti9HmM9QGixKxxKf9kYS9LUxTrjq", "Balance": "679550538", "Flags": 0, "OwnerCount": 7, "Sequence": 67121143 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5F2F00F49C4626E9A2972DD9F5E4D3B944F06A5432D5ADDE93CAEDD6EB333874", "PreviousFields": { "Balance": "26892426", "OwnerCount": 8 }, "PreviousTxnID": "B5AD7E28E35B322ED65F04F6B50C0A16CB42937AF8340BD185AAA76023BDA3F6", "PreviousTxnLgrSeq": 69025849 } }, { "DeletedNode": { "FinalFields": { "Account": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5D793A6F0E26", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "2C74AC18FA0A06F46BB657186737975CE45597015683142258F65E67AE010B7E", "PreviousTxnLgrSeq": 68998336, "Sequence": 68499499, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2020412436797885e-4" }, "TakerPays": "646329937" }, "LedgerEntryType": "Offer", "LedgerIndex": "5F6BD955706940FB7EACCA6C3CA4A91D8C8658716EECA663EDC3B3BA1F1A791A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2023211571390819e-4" }, "TakerPays": "647225381" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "40000000000.00001" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "769", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUXKKLv8kzkXLnNpe2aGq2PyRKuotFQEPi", "value": "1000000000000000e-4" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5F79BE61D868C19EC7A83534C96179BF00CC350542025EACE12D9301A7AD9EEA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "50000000000.00001" } }, "PreviousTxnID": "F8643A8CF4717DF4F2E8940EBD1F7382475163645FE34F2019B4A152FF8C779F", "PreviousTxnLgrSeq": 68950640 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBYvQ1bajMk5CQ8MTa6whA9MZ4uuJGwtEh", "Balance": "1360812448", "Flags": 0, "OwnerCount": 77, "Sequence": 66621836 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5F807AFD302BCA639AC0985E6E829D320EBB22B8E39BCCEEF08E50CED6BA1D0B", "PreviousFields": { "OwnerCount": 78 }, "PreviousTxnID": "4880294E99996ED6C3EE34F35B5B444725283F01E814324778B81B2A535AFDC1", "PreviousTxnLgrSeq": 69046030 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4500000000000001e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "832", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rzHXP1zuBviNtiogFMnNDcoUg88bprjNy", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5F9277456B02B6A000677A7FFC73E6A421B1BC7768C5D6E81A5BE637D8512C9B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5577859898660001e-4" } }, "PreviousTxnID": "9A0B213036969F296F3A02A010008C62A181BCF515FB0A0586C8247AF61BB86F", "PreviousTxnLgrSeq": 68872762 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-16850856281.4153" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJ7DCt3RdTywMMwKTq2Pm8srSeU4GvmSiW", "value": "1000000000000000e-4" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "dbc" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5FEBD555741477119CACD0914F16056FB5C7EC8B7EE3562FFB1A566B5CDDD409", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-28405963602.8653" } }, "PreviousTxnID": "E6D608C37C8E78239295015C2996EC4FA6FAF38E00B36855AA5F50EA9BDCA869", "PreviousTxnLgrSeq": 69030724 } }, { "DeletedNode": { "FinalFields": { "Account": "rsE3JJ4VxxndQwzRusS99pmAeYN3bEYZmc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BE3888733A87B", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "9A82302BA34AD3C3BE6B4715D6007F162C3A163A5196DFB6D469875891EF9CFA", "PreviousTxnLgrSeq": 68898113, "Sequence": 926, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6001A6F2994F882A3ABE57CACD4E8B47E71BF7D13C044A3A5F3A446B23A7CD6A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6557705056.239346" }, "TakerPays": "51477984" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rsydLXavwRHUq9TWdwYqPpYViuFBNuYQYs", "Balance": "1325153503", "Flags": 0, "OwnerCount": 118, "Sequence": 1353 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "600275321B3DFD7C412262F8D90C4338C970017E1EFE949B5F79049CD3ABF37A", "PreviousFields": { "Balance": "550525372", "OwnerCount": 119 }, "PreviousTxnID": "E394176B24A0465C6D4C6309A645591A50A1950E484C38E6C2FCED06A922E78F", "PreviousTxnLgrSeq": 69055523 } }, { "DeletedNode": { "FinalFields": { "Account": "r7ouMSA1S6pggGmsYRZewYQzCP7XgLiEx", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A388A43C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "166C59DA7D3EB25A3360ED42A7AFB1E9D725A98B22CB49A46AC35368FD0ED203", "PreviousTxnLgrSeq": 68944629, "Sequence": 67326978, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "600B5914D558DDC5A3D1E6F97C1E5BDAE6E5A7AF3E82B2796D818EF1CCC37D81", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6500000000" }, "TakerPays": "35750000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNdfpBhUB1ygnu4z7ebbqLBQH5K8zejbu6", "value": "1000000000000000" }, "HighNode": "4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "736" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6049BAD7E42287A6AC379816E740920C4E48AC5F89279EFE64F28451B30A0B5C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-62287918928" } }, "PreviousTxnID": "D23FF4FA46F90D809C120AA95FF188314EE3265AD1605D3125AC6E2C47E60868", "PreviousTxnLgrSeq": 68176004 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsNTEynqepWnCvBMLb8x3tekWQXG2TxfEM", "Balance": "1971297482", "Flags": 0, "OwnerCount": 28, "Sequence": 67692617 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6049DE89D3C23841EC03A3A2EC37B199706FB559A6F6B1631E660BF81660B84C", "PreviousFields": { "OwnerCount": 29 }, "PreviousTxnID": "80A013F5F5A63595E10C9823F258AAD52ADB3E8470788A8271AA2049B9262BA5", "PreviousTxnLgrSeq": 69054102 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLkaQPNxjeDmFBqhQ2GszmgT4wxykPCP5K", "Balance": "421110966", "Flags": 0, "OwnerCount": 55, "Sequence": 67329984 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "607A3964FA2345D3ABEBF418300C29FDAEE190955C257734F6348D919EBA509C", "PreviousFields": { "Balance": "375873682", "OwnerCount": 56 }, "PreviousTxnID": "9D56C4199266C91697B49CBD057756D5ACEFE373B63DDCE2BACEEB61D80F8CD4", "PreviousTxnLgrSeq": 69061277 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGgtpbT9ffSEHApdNkRC4Mu9tsYPRMKx6D", "Balance": "761031456", "Flags": 0, "OwnerCount": 237, "Sequence": 66749151 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6091CB3554A765885B657EC10E485278487739FBA1698D0FF63FDA49F4E9324A", "PreviousFields": { "Balance": "488521811", "OwnerCount": 238 }, "PreviousTxnID": "FF5B3425509EDE7EB17F082A2E5370FBB7CE505101C760D4F85043B3C975D93A", "PreviousTxnLgrSeq": 69063853 } }, { "DeletedNode": { "FinalFields": { "Account": "r3BA8VZ9TV8U5qgd72SX4Ct2iAgQGwcfZ6", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "9F740DA744A681155ADAA74B8332D9405DDCB7A888029B75CAE7E0296DDC4C96", "PreviousTxnLgrSeq": 69025110, "Sequence": 67759030, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "60D28AD0A19D3770E30D2E823059FADD053DAF46D7993FF1486AC97656DA5A5F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000" }, "TakerPays": "12000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rNwUjKvVAQ9nhmVW9gF5Hn5414X637aY4U", "RootIndex": "60E0430D6852673CBEFF9C18F3E285A089AB525447D5FE7E4CEA5614DC4AFF36" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "60E0430D6852673CBEFF9C18F3E285A089AB525447D5FE7E4CEA5614DC4AFF36" } }, { "DeletedNode": { "FinalFields": { "Account": "r3pJZNxQwVRMyeohSyy5C9ZCJzvRWVAXLg", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520775F059D6CF3C", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "3D430682971BEB67F6E19CE13E4DA7F98129B10E6BADC09F7E521CB650E2ABD2", "PreviousTxnLgrSeq": 69063131, "Sequence": 67434617, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "60F6B7057B2D97DE4CB448DE1C87DA8C912516EAB993BF68574607935FA92F5F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "66967083434.5683" }, "TakerPays": "140630875" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rBnj6UP9thqpSLVq1rEKinhuhmFHmhaC8m", "Balance": "313859645", "Flags": 0, "OwnerCount": 121, "Sequence": 67351919 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "60FA7CADC60E869A6E81A5A9D816361D1432D28B754DA10841259C8CBE0A9742", "PreviousFields": { "Balance": "288209645", "OwnerCount": 122 }, "PreviousTxnID": "1A9ECD7019C6EDAE8775315CE26C95A204C09A488D846D9CDC9F210CAF6DB84F", "PreviousTxnLgrSeq": 69060811 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rEgSssemRh6cSEJYWAyA6Q9uEm6XjBUZ2H", "RootIndex": "60FB2DC16D2F719EC16B27D9032E9D030828153511216DC4921E3324CDD5ECA9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "60FB2DC16D2F719EC16B27D9032E9D030828153511216DC4921E3324CDD5ECA9" } }, { "DeletedNode": { "FinalFields": { "Account": "rnEA5VmDp13iDZdcGUg2X2nzYkaKKDrf86", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F4F033E564FFF", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "B6A36A57C6B27FB5A8FD14C2ED79E90C6D0C6C654BC8EAAF0EDAB530C00BD5F6", "PreviousTxnLgrSeq": 68984656, "Sequence": 67525841, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "611CF799EFEBBDDAF4BB1DC7EF0B6934241472F8D3CE4328D587E4073AE81C7E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "45000000000.00001" }, "TakerPays": "193905000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rHa9ikQjRRPKoFgcqN3dwTb27vvL1Ezo6D", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE76816D8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "92F52B390378160D94A5ACC8F3F3B64E17F409F6527D6A0426D29C71A7A5A17C", "PreviousTxnLgrSeq": 68899398, "Sequence": 66151073, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6120E9F41A1BBE124E5A8EEC8883D29D5426B340BB55F9A68E451DEA24E74F31", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "70000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rK699XAUEcMK6msaRDV46mATmAqNN9nj24", "RootIndex": "613794F00661A31D8D903013256064E384B2DE4E19DBC3A9E7C2CF77175951F4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "613794F00661A31D8D903013256064E384B2DE4E19DBC3A9E7C2CF77175951F4" } }, { "DeletedNode": { "FinalFields": { "Account": "r3NPSAnK3n8wx7pdeCje64yvei4xLBrgd", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219EF4FB2B186E3", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "82EA0D0B018BB7193B74190129360056942D7F89354F9EECFBF7F3D67370A229", "PreviousTxnLgrSeq": 68919858, "Sequence": 65010496, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6147E5930EB98814D31EF8B6D293E3C933042C05F01F7CBC8164010DAB8A9BA8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "23357969598" }, "TakerPays": "170513178" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "1", "Owner": "rjuBmfDDfaXxXRPhcGsGb3qSjdrEUwMGT", "RootIndex": "3EBD0269886564ECFADEA9BF8E2DBA5273B4856E73D2471EA83285030CA72701" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "615F86D468853A22DBA3EDD12E004984AB1A65E8B12E291D793C713520A3A22A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1a", "Owner": "rDYvWkTQaaoWiWYo2r5fKuqEoop8WK9crS", "RootIndex": "E1DE01C4AFE3D247DC9BB884A93C70E2712C759B255FEE34EAB1B5DB398531BF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "616BE2B44A069CA81CF805D5FC4094424A8EC406922E79ED9738C1E295B4C8F8" } }, { "DeletedNode": { "FinalFields": { "Account": "rah3AgBTwgnCvR5aJfj4p6Gy98hZt57gXD", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217ED725CD6FC6C", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "03BCB26DD5732200E0577A909B35115B6CD8B7A0E14399C6871A083083850CAF", "PreviousTxnLgrSeq": 68920426, "Sequence": 66615315, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "61ACB6C3C396C3EFEF432109E35B7632FABC30AE7DBF44D4CD84A466BD853403", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "52438641" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-11447985419.683" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4KDwn1x7ihYbekn13gYAoV9fFnjwFa28R", "value": "9999610698224570e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e86" }, "LedgerEntryType": "RippleState", "LedgerIndex": "61CAB811C063DAD305D02D6A4627B2EBA8791BCD9D8CF57AB019442D7B656B4A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4600000000000002e-4" } }, "PreviousTxnID": "91E342A8852B6ED049D382E1DD4D616BE4AE6F2166752A5FE3C7B0661493FCF6", "PreviousTxnLgrSeq": 68909670 } }, { "ModifiedNode": { "FinalFields": { "Account": "rCeRsWQYvZrkA8s3jZYXBYw7gXH7cbVNF", "Balance": "201891605", "Flags": 0, "OwnerCount": 46, "Sequence": 67345644 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "61CCA504FA44331DBF5CEC814C836B0A9C0F8143ADCFDFD300076FF6F2117CB2", "PreviousFields": { "Balance": "104399955", "OwnerCount": 47 }, "PreviousTxnID": "6E5AF323268538D46B0CFAE9737463B70FF76B098CCB2BC0788A9B0D45A6C075", "PreviousTxnLgrSeq": 69062807 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHvia9Ti9HmM9QGixKxxKf9kYS9LUxTrjq", "RootIndex": "61F41F70C38D78E9D61D1E60EEB4DF6FE10AA9A1EEBC792F3B9928FA778C3FD8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "61F41F70C38D78E9D61D1E60EEB4DF6FE10AA9A1EEBC792F3B9928FA778C3FD8" } }, { "DeletedNode": { "FinalFields": { "Account": "rGpBZrDTpimasSJEWV5hxH75LsivV5Hz4v", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAF14706", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "8D6A1051EC7443D08A63149E81293345DDB1D969EBB354BCD3A941E879194F17", "PreviousTxnLgrSeq": 68780815, "Sequence": 67162902, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6206482B798B78B73D84EC654DCE8236198376B6173CCE5EEBC15F60B888EC68", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "34936388591.2351" }, "TakerPays": "3144274973" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rBhRwsAuVFJ3VY37rd5R9YzqrCRjVXQggX", "RootIndex": "6FC9EF6C5004916ACE8FBE87BFA8A5686F116A5545BFD52C690AAA553BE7EF29" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "620D58A5DDBA8707EF052EB82812BAC77D372F81967C6385ED07864339DCA243" } }, { "ModifiedNode": { "FinalFields": { "Account": "rsVD9Hdd3p4LMC7vUwvx75uNLY3d3eiE2b", "Balance": "813318409", "Flags": 0, "OwnerCount": 48, "Sequence": 60707300 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "62766A76113728F27B9341FC8F96AA5D5453DB0B615C61C6764BCE5D0E6E86D2", "PreviousFields": { "Balance": "713318409", "OwnerCount": 49 }, "PreviousTxnID": "29EA85AD8B0AF86D3CA0F08CBEF55238CB460011BDCD6BFE6FB9BE1364985C41", "PreviousTxnLgrSeq": 69060035 } }, { "ModifiedNode": { "FinalFields": { "Account": "rp8YVv74whPGdy9huBZHuPy5D3CRKgFFsj", "Balance": "284997457", "Flags": 0, "OwnerCount": 5, "Sequence": 68428937 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "627EDA43F754398ECF002908FFA4E6A75AF6A2349F4814F7B58B233812223A5C", "PreviousFields": { "Balance": "22497457", "OwnerCount": 6 }, "PreviousTxnID": "794C5B85C86C382EC0FAF16F5FE152D0D0D8D32933C25BE62071ED915F93E6FA", "PreviousTxnLgrSeq": 69000033 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDTDTzVK47KCcGmiywZHhKsDP7323fqGGL", "Balance": "209000005", "Flags": 0, "OwnerCount": 5, "Sequence": 67690772 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6287446C7AD0E616C670ABADDE667D8605A86A9821A3CEA39AB96B38C2F1A56B", "PreviousFields": { "Balance": "121000005", "OwnerCount": 6 }, "PreviousTxnID": "36FB0260067CA051B5B727AE5BBA623F748C876A8D4F247B06AA6533A856FF0E", "PreviousTxnLgrSeq": 69026477 } }, { "DeletedNode": { "FinalFields": { "Account": "rh8TcfXzDZdQBB8R9aQfE2zUUwpd1zbEWv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF525E7B4C4", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "0F63EFF163C7F4DB4C33397A1CBB5A494B585BFB5F82555FC75F42D7FD61FF4C", "PreviousTxnLgrSeq": 68966721, "Sequence": 64540127, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "630DA31978E1C92B0E8FC5D4B8FCF8F2BFA56C185CD1003247DC9390BC1BD76F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1999999999999999e-4" }, "TakerPays": "1599999999" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-95154275776.6183" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNLPZmai318pizfUNmkebSrtsR5mFvVVWt", "value": "9999999997999990e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "a87" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6319D24DE547B9BB8B5D18A923F6940306E393A40F33061EC81FCFF69D86D53B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1021542757766183e-4" } }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "DeletedNode": { "FinalFields": { "Account": "rNd3R5EaqkBC3EguG1mmwhjpKqLDTjBNwQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219945C964845C8", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "8686590E91E2FF5608EEAA7CE440C573186B69ECB2BCB63C6CD52E32DD86FC6F", "PreviousTxnLgrSeq": 68899484, "Sequence": 67165961, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "632703F92C45F65D170D0FF6B3B11A9FF9895D822B41A6508237C431082160DB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4282294426.3" }, "TakerPays": "30832519" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rnW1sfCjjdMou7RKC2PquXVchHYBMAHqTD", "Balance": "722360146", "Flags": 0, "OwnerCount": 148, "Sequence": 67671028 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "633669723E2A7510394D053F1121267DE2CB45C67BED9A6429F168B5CBFFC9FA", "PreviousFields": { "OwnerCount": 150 }, "PreviousTxnID": "5831DA125A74766867F409F1CE3819AA5F6058F98AE53FE47A41C631CB713D3C", "PreviousTxnLgrSeq": 69064154 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPvqZW8q9bpYrAKjGhtL7AZAq8bvqEQDuq", "value": "1000000000000000e-4" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "4b5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "636A4745BBB8A8CE50C1582236A66E53DBA6A459DACC4700655DE1769BC4B3FF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-6052088387.79299" } }, "PreviousTxnID": "0E0548E23D1C6188ED7AFA3B100ACDAB6E3F1A66D1ACC1E775CB4F23C70FA6BF", "PreviousTxnLgrSeq": 68899240 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rhdw3T1ko64kaipD1T8uJmSkV3mUtRWqiY", "RootIndex": "636DF6DBBA54E903896FB59E376FD4E72E2346AA454C10B77F23ABE9B79DFAFC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "636DF6DBBA54E903896FB59E376FD4E72E2346AA454C10B77F23ABE9B79DFAFC" } }, { "ModifiedNode": { "FinalFields": { "Account": "rabF4KeYghT7RWidbkeS75fLWQzrDixwpH", "Balance": "245427965", "Flags": 0, "OwnerCount": 4, "Sequence": 68100910 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "63A8DF4E002A586E5D39C36D6A3099A36BD8A2121284E7B788EB9E55095B4FDA", "PreviousFields": { "Balance": "25297991", "OwnerCount": 5 }, "PreviousTxnID": "C7DCD6CF47787E7C14D4D80D67786538B80237E0B22217E1DB70A21FA013CB6A", "PreviousTxnLgrSeq": 69004265 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "16", "IndexPrevious": "14", "Owner": "rspLJnfzomVceQKCn6ExME3gJEUuhUZxdV", "RootIndex": "AD218E1062EA54E07D8608504C3D1CA576AC3AE053FF09FB69944F0B26F56EDE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "63B8F3EEB9BD5634EFDC2571031A24B926EACE4CE8637C262DBBA327A98FEDB1" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJmWpXLdftZbNdPMYkezgKmEya6R6cAt7T", "Balance": "349576322", "Flags": 0, "OwnerCount": 114, "Sequence": 66802001 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "63C696E11A82417535D9DEF21F7B87E95161EE8F3A7EEA624A52DBC636842BD8", "PreviousFields": { "Balance": "307076322", "OwnerCount": 116 }, "PreviousTxnID": "3FC10F3206E39BB2D06765B4E92D0276431F260186F662A39335FA8D81CD6B42", "PreviousTxnLgrSeq": 69064056 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "790", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpRfuSRwU9nUefy8T4z4RXUEDU2baW1qhk", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "640F03396D985F44A62DD1D252A2796A5F8DB87F5F12BEE708281DED03B66EC7", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1490974072105691e-4" } }, "PreviousTxnID": "DCF554102D3055F9BCC255CD927D0AC5A22A5BF3F4DF81158C8920277DC01C2F", "PreviousTxnLgrSeq": 69000160 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "r3fU9zQRHEWPbnN3r9TcM1d6NSRsBvUjau", "RootIndex": "96F453737F99FE5B7EFA37F51C9FB5123F9BECD5C130EB44E85246057E3D9B8E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "64142FC3EF1EEB56AED9F79A1C01518BD1ECB8C395C95946F90F7AB3BEFCC1D2" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "22042659578.51898" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "789", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r35RUZ6PjS9JT6pHG6298ES1abD9uv43D4", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "642563ED975C1490D83B12887700F5701878FC58CAB05129FCE3CDEF59C00849", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "28202659706.47188" } }, "PreviousTxnID": "DBA0AC828B31A14291AD91D928ED52729D6ED45696933EA879F0E87DBC9B5D03", "PreviousTxnLgrSeq": 69017533 } }, { "DeletedNode": { "FinalFields": { "Account": "raDJvZX8gbRfZ3hUWimZPdVcDRzsZQdhmr", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520BD7A5E3062101", "BookNode": "0", "Flags": 0, "OwnerNode": "15", "PreviousTxnID": "6D37CC9B08F3904D9AEDBE269795FF86C4391745171F89B997727074DB6DA2BF", "PreviousTxnLgrSeq": 69044376, "Sequence": 63094222, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "646BDC32EC84EA5E96D30C9934A7161CA66647805C2C22E16B263BFCCE3E9125", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "30000010000" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "5ae", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUATLa1awouAR8jS1DwtsXuy8EXCjdktgU", "value": "1000000000000000e-4" }, "LowNode": "a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6480BDACBA8BF8F6C87E1CE4B5E05D9077AD3E0DA5A5D36DA70FCEA7BE521435", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "15000000000" } }, "PreviousTxnID": "59C7FB4099E0280FB860A84591990A6BC5F6414C64AE0868DD0A8A71E13DDE01", "PreviousTxnLgrSeq": 68963775 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4900000000000000e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "768", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUs2aUqfDfjTN9HWdhXzRZZJkHm5rGUUdS", "value": "1000000000000000e-3" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "64A8E2CD4AE9ADE4139A32C296855F8F089B0B5C041286D33299906D146D3AB6", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5000000000000000e-4" } }, "PreviousTxnID": "7D299457B7D992D572AFF954F09B1E4D3053853436BAEEBED020E590BEE2F0CA", "PreviousTxnLgrSeq": 68240127 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "9", "IndexPrevious": "7", "Owner": "rNPZ49ucC4zKoBPgyAsSC7oMSSoh1icnZK", "RootIndex": "ACE3C7274FA617F4C91C8FBC01DF140279E5380DBEAE2064592E9CFF7B8EBF42" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "64BC844065CBAEF4C64DE8535D52609DDE461C09E8C09832405F4D1A3889FC5D" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1022222224" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e9f", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rphnh8aG8oBCdrBcgxYgNY8yVqi3b3XqbT", "value": "9999610698224573e-1" }, "LowNode": "15" }, "LedgerEntryType": "RippleState", "LedgerIndex": "65264BBE95E1F0172A7C121F4BF93680DFBE9CF61D92B04E5F4F22EB8E90B3FF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "91800000000" } }, "PreviousTxnID": "9BDA787FF19D4ABD1832FC7895A5237B42F5198A9034265C6093C7AEBD551635", "PreviousTxnLgrSeq": 68915922 } }, { "DeletedNode": { "FinalFields": { "Account": "rdjYAQLjaChAyFx1sVLn4uy3mrSZy2f24", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530CCA2E512C0002", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "DB6DDD93313449331077B45EBFDDF458F0038E9BA2A35903B5CF576BB6E5B2B6", "PreviousTxnLgrSeq": 68790526, "Sequence": 66163698, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2856458885260000e-4" }, "TakerPays": "10283251986" }, "LedgerEntryType": "Offer", "LedgerIndex": "65280C235F73F514C0022970BC815A1E7889C8636025699A23158DD2E85C0F95" } }, { "ModifiedNode": { "FinalFields": { "Account": "rfFFmdT4f2Qj6gSS7daVrQDpJw4tF62Ke2", "Balance": "1335413975", "Flags": 0, "OwnerCount": 20, "Sequence": 67946821 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "653F2822726898FF1B577C5B9DFA21E1713812E417BE5191002389A9CBCF3FD9", "PreviousFields": { "Balance": "1002083975", "OwnerCount": 21 }, "PreviousTxnID": "5B8FC9F2CD85A59E4062E822E9132C2ED18796EF7579892E65C16C9FD047A572", "PreviousTxnLgrSeq": 69028614 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-8092318979.92423" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rENubezZP8CRwDNdupJB2J8D1GxukZ7hjv", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "5c2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "654CF717DE0BFD62BD7CE1CA892FD0248CC172DE0F9DC717E1CC54346548ED58", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10092318979.92423" } }, "PreviousTxnID": "EED6D7C512E7C36E4BA157FF239CE9A8341118ECE893D5577113A63865C20486", "PreviousTxnLgrSeq": 68892094 } }, { "DeletedNode": { "FinalFields": { "Account": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973D057CA81", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "A7A37662FDDEFABC9514176B3C91655C0918B81A6A2221C1B58EB28F5CA4C5F1", "PreviousTxnLgrSeq": 67960040, "Sequence": 1033, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "65922A01F3CD5229CBA1F5279A1CEF39B84BFD4DD56DCC7EDDBFB7D3EBD53795", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1111111100000000e-4" }, "TakerPays": "10000000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r9vQtUmSgHmDFpc6K7BKLj5JvGBEbvwP9Q", "Balance": "1159375906", "Flags": 0, "OwnerCount": 89, "Sequence": 67374381 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "65A67937DE564E805EFB294623E5D535993A1CA8E0C9D9B50B4B70D13B7E3919", "PreviousFields": { "Balance": "846971510", "OwnerCount": 90 }, "PreviousTxnID": "1E3C22C30CD28413A8BA2981C55A4241CF4B8DB4FB082CAE91F428C58AB032F2", "PreviousTxnLgrSeq": 69057997 } }, { "DeletedNode": { "FinalFields": { "Account": "rPy5zQthBW1gHiWbdHmbPkGtF9jM5XQGNs", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365209F295CADCF4AE", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "DAAF0C99509DF89D19140EAB3B637EBF44CA59A597F50E4F4C646FAD332C1552", "PreviousTxnLgrSeq": 69053358, "Sequence": 67541000, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "663596AE07BF5903566B7EF23C9AB5473EA58ACB3A418338F7E2A1B96532ACD2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "21206537461.53846" }, "TakerPays": "59378304" } } }, { "DeletedNode": { "FinalFields": { "Account": "rNCESwgSpY1pUyhQGzGd7T38zXXzxUCLLj", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B7092AC0111E7", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "57E70C36009EE1DFC23A6C0A65E9AFE86FD4B84F75E8AAA03448C4B230C316A1", "PreviousTxnLgrSeq": 69047568, "Sequence": 68401370, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "667E1D7EE4448F15DE6CFADA7D20582939DA8B0E2F4CA41734B14378A6B285E4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1205914612885586e-4" }, "TakerPays": "388304505" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "10", "Owner": "rM4cm11HCu1riLq9BwfzciDUZqfX2Phq52", "RootIndex": "4CAB8979C4DC13C79115E4C8A1B15ACDCB1CCC26283D38D0BEA94FB6885F1E91" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6684E48CC6091E12A6981827DD713807B5FE004CF0723BF2C38D819438C49F79" } }, { "ModifiedNode": { "FinalFields": { "Account": "rEcDGbmwatAptdvR3tfMRJqfm6taVzHAYP", "Balance": "66255293", "Flags": 0, "OwnerCount": 24, "Sequence": 66780419 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "66904DD8BE98633678D501DCE58B4905ABB2B0591D4B7AD95E22F06572CAD85A", "PreviousFields": { "OwnerCount": 25 }, "PreviousTxnID": "BEFF2904452962076C60AD851A28DCD1E55E3883801C4F456E4E79F8DB8CC883", "PreviousTxnLgrSeq": 69061642 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHXRGGkmL2bGwkbsz9mnpVi3eAZt5bThdo", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "d20" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6694402DF26A4CB45CBEE40147B298F11350B2A204E3DADC49A1F92AF08BB94B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "1D4F185771E3EAC49FE67081FE1104F22B6531FCDE5033BE24AAC443E2F2F542", "PreviousTxnLgrSeq": 67961302 } }, { "DeletedNode": { "FinalFields": { "Account": "rfzG9eLEj6jZUbign4K98pmLSQt717FVaj", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365221EDAC9DECFB5F", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "DCB34F7374BECAE32F24BD578FAB3D5CED922D29B6F583D894E040CFD068B5CF", "PreviousTxnLgrSeq": 68897461, "Sequence": 68887819, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "66AD778B02684197F8816FB143849BE6E6589C43FBD14E32F9301B9B03D5829B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3450040988.952056" }, "TakerPays": "32947891" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ddb", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rXEUqWCmmyBxf2PUjPFAj5b5DuydWyRe4", "value": "9999999999999990e-1" }, "LowNode": "a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "66BDB2646BDB456670654A4B5674568412E107969FCBFEFE016F31E7EFBFE2BA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7100000000" } }, "PreviousTxnID": "5714BB309949AB8BDBEA106B04A8D817897BFCEE1EAC1C49CAFD463539E1550C", "PreviousTxnLgrSeq": 69036855 } }, { "DeletedNode": { "FinalFields": { "Account": "rnYbiXaSpChddFy4fdVYDtNscUsAfgaA4U", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A4D88DDD94000", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "BD80532DA173919846D0B6D193D598B0800A8AE32C0DA870EC6DDFA7BF799AC2", "PreviousTxnLgrSeq": 69001870, "Sequence": 66933286, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "66C8DA4CACFE590A30DFDF2BBDFCE0F936246732A054D8556EB5207BD341917E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "290000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "9", "Owner": "rN5wcyJZjT6Qd7sJZiQg2SHVtjnmqiq7W2", "RootIndex": "AC1C2122603D517DA5B0E93F6AA6F318948548D896759590525371C276913B96" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "66CBB310173875873C771C999D1B5B615EB319FAF08E35871CBB782B4BA8A4C2" } }, { "DeletedNode": { "FinalFields": { "Account": "rGdg98Rr24zGwE9rmiPzKi8GkmkhyHyAL1", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530625E354F030E8", "BookNode": "0", "Flags": 0, "OwnerNode": "1", "PreviousTxnID": "57509ECC5D9BD7559E10F2C2BA985E730F042880A32882E3F88858AAE6A7A36D", "PreviousTxnLgrSeq": 68934524, "Sequence": 67164991, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "66DE46BDF19F053CCC55BE5E6331BC4CCC0DF7F009B31B3922216E31E73502DF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "57786493906.667" }, "TakerPays": "1000000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rpGhnBcEyRdDNyy4AD2BwyZgWE4ERu8eqC", "Balance": "138863547", "Flags": 0, "OwnerCount": 53, "Sequence": 67343101 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "66EBA59928574265178EAA0735330AAC046BE0E334FCE88B20D551A34D201850", "PreviousFields": { "Balance": "120863547", "OwnerCount": 54 }, "PreviousTxnID": "A4F41D5399FE145DCAB34939817AE0F544D1BA94FB33802BF9ED6C1A16DAFC61", "PreviousTxnLgrSeq": 69060091 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGPEKNaNPYojt4sFbUzodh9SUNxixCwoBC", "Balance": "4888165532", "Flags": 0, "OwnerCount": 87, "Sequence": 67759758 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "66FCE29FEF9AC7E6865C4C2A81BB582DD28600B1BE7BD0C32E1F90A0636BD43D", "PreviousFields": { "Balance": "3938165533", "OwnerCount": 91 }, "PreviousTxnID": "C084BA4A0C0330562CE0978F1406224609D1107807D7EAA4DECA56C5320F9752", "PreviousTxnLgrSeq": 69060047 } }, { "ModifiedNode": { "FinalFields": { "Account": "r9MQ7Hek3iMwBnYRuHTuuG3ssJu48PHaxJ", "Balance": "6240657936", "Flags": 0, "OwnerCount": 33, "Sequence": 67390595 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "671ECC60E276BF948FD6EF76113CB88F65B1DBE3D121E0883641FCABA6A96125", "PreviousFields": { "Balance": "5140657937", "OwnerCount": 35 }, "PreviousTxnID": "96EA1450140558153915443528B63537B0CD1B86763F2BD0E3EA18AFF67E9E8E", "PreviousTxnLgrSeq": 69054481 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2613413885313101e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHT6EWF9zJzwNtHQsxyrRMSQL4h5GhkcUn", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "780" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6752DDA57EDD9DCEE7582210B9966BA8766DDFF45AE5FE4E2D28E349A4C7D8E9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4613413885313101e-4" } }, "PreviousTxnID": "165AC428DFDBFCFC0A814C518B40503B4BC4B07A0548096DA1C198ABC5A7BD97", "PreviousTxnLgrSeq": 69035473 } }, { "DeletedNode": { "FinalFields": { "Account": "ra4q61eeGoZx4cAJKPHQdyukvugrB2jhgW", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214401C59CFC0F4", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "780E34E13E5FEF85CD15699419598ED7F774BB1A7E6DBF18B7EF62B53B6614D2", "PreviousTxnLgrSeq": 68916364, "Sequence": 68759779, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "67559494572EA930E71DCE8E365DF701F6CFF56BA3DEE8628758897593481C69", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "55766237.75333621" }, "TakerPays": "317867" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c87", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwSQqB6yNHd2tiXUhJ2wkULgq3dFua1r41", "value": "9999999997999991e-1" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "67605178B68165A686D31BB87F921DB56E2C733CE2A11789C717499F837F7892", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "378E136ABC2268FEC046C606BC7390D8E0D554508109D82E3665E64BEEC8591E", "PreviousTxnLgrSeq": 67980720 } }, { "DeletedNode": { "FinalFields": { "Account": "rEkvHXE15kSe5Vh1b7RQrDqKrMUqAzsjGW", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5216083D0", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "A899AF0C68558E077F4F68FCEF94F988368AFE130FCF8072E0BA1E07563E6EDA", "PreviousTxnLgrSeq": 68900035, "Sequence": 67132137, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "67A2641BC84C3BB910193F5B92147CC5B6F43047545CD9766B78EDAA59EA5856", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10571979732" }, "TakerPays": "84575837" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rEpLbrik9r6KpjVbWXA71SVQnMCkY8BEUK", "RootIndex": "67DA852CEEA5CF72AC059074116DAA72295B70EC317168C1A63BE6D554AC81DE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "67DA852CEEA5CF72AC059074116DAA72295B70EC317168C1A63BE6D554AC81DE" } }, { "DeletedNode": { "FinalFields": { "Account": "rJfV6qTHdF774uGTdRHQMxb8NSF6TWu4uR", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF514E44B95", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "153E788B54D8A9BDF5D8FC57252BFB7F681BDF2AB124E9DB270CFBAADAF76A1B", "PreviousTxnLgrSeq": 68918504, "Sequence": 63563010, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "67EC8633A7E982B58F57B3FD46E8BDBEA2C4100613022905F933261EC132E7DB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2335796959.8" }, "TakerPays": "18686375" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "284128133.14" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e7a", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r93dgTvDnFJsP2YGRiJvd89D1xLTmgR4fp", "value": "9999610698222767e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "67F51238B7B0B99887E7FAFED2E845B0E1C89D3807FF5AF7A6BAA155107C36D2", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "74999999977.8" } }, "PreviousTxnID": "33BB5DEEC2392CCE623157B3071AC108CCC903D1D793339B4CAF8710F840F39D", "PreviousTxnLgrSeq": 69038927 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rLC5cTyVFPDTN4nuTcM9F2MAzhbkS7a78Q", "RootIndex": "6833052DA6D4052358878DD9FD2276CEABD39CACA5C7A8A6BA29D03FFC91F0FE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6833052DA6D4052358878DD9FD2276CEABD39CACA5C7A8A6BA29D03FFC91F0FE" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6447726607220657e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e41", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDzBkddc4AVrm4RWuXJRhH1rrkDpKNFwTg", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "683E951D60F1AB3DC1BD246CFC8EA2E8C1338446078B7B869EE492C130DB2B80", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7947726607220657e-4" } }, "PreviousTxnID": "48C140CC2CA353858C4C311A5D146514E8F131DD62F00433B7F510EFA6DD7D2D", "PreviousTxnLgrSeq": 69044256 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2325000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e7c", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rhASEa6rnfc5WHFbd2ZdExhwyfBu27pitp", "value": "1000000000000000e-1" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "684202B97A548A8F1F5EFD00C286FAA875064297046DE38AB66C953D0A7A6A7D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4550000000" } }, "PreviousTxnID": "0B17BFA781F574C5E75C6C07C12AE515D9D8B8BFECE4115F51802E83A6139037", "PreviousTxnLgrSeq": 69033800 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfXqSEeWLr4MYYLsESHbsyh3CZhAitzYVg", "Balance": "256771648", "Flags": 0, "OwnerCount": 95, "Sequence": 67866274 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "68774683D6ECEEC1D2472B830E55C4844590E58EFDB63AADBA246E79E17B00ED", "PreviousFields": { "Balance": "202048885", "OwnerCount": 96 }, "PreviousTxnID": "6F4920CFAF2D651A8E73B46B788147BC19D65395D7C64F110B46D12504097340", "PreviousTxnLgrSeq": 68931851 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDSSG7NwYYV545mfcRdVExpAU6ys9CqoCk", "Balance": "3353942747", "Flags": 0, "OwnerCount": 551, "Sequence": 63855064 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "688FCA6C84FE95CFC1F9B398FCD8C906A2D2AECDAC05520E2FAF79CDB29DDA48", "PreviousFields": { "Balance": "3276082848", "OwnerCount": 552 }, "PreviousTxnID": "E0F02138B65B1A577DE909B7368844C3E974EC7AEF5807BB7E74982D49224EC5", "PreviousTxnLgrSeq": 69060034 } }, { "ModifiedNode": { "FinalFields": { "Account": "r9bsFjjrcnmfwEe83kG4LNhBUAcL3af2Bf", "Balance": "217806645", "Flags": 0, "OwnerCount": 86, "Sequence": 67373419 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "68B2BF8B9E9E743EC32EC8D56BE7F1260DA7361A16C435721AEE31D79168B2E6", "PreviousFields": { "OwnerCount": 87 }, "PreviousTxnID": "D1A4D846D1475FC67E6A353EE7ECE50C8C27DBB33655647CC0240EEB5AE71293", "PreviousTxnLgrSeq": 69061950 } }, { "DeletedNode": { "FinalFields": { "Account": "rqben5VgPyij1hAY4bi4yPyp3vf6GgY3z", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D9312F37AD5", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "4570CF185E03AE6CAB826F7A9DDA38442F875F2AE625292CB1611517E6181646", "PreviousTxnLgrSeq": 68967298, "Sequence": 67935105, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "68C3B8D9F77D0F3DCD605E7A8F46C3E3518DAA2F240C5ED06D0CAE0360DEE736", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "14999999999.85" }, "TakerPays": "71999999" } } }, { "DeletedNode": { "FinalFields": { "Account": "rnYFf4DWQj3Eip1R5mVvocQxtcBcvTvRo7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218289060790000", "BookNode": "0", "Flags": 131072, "OwnerNode": "e", "PreviousTxnID": "F6C1B89D445C92E0CCAE5E8F7FF40FD64A50BE8262A3D398106C9E073924D45E", "PreviousTxnLgrSeq": 68899272, "Sequence": 66696414, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "68F019DF04C05A0E18B68092F2BFC8C154122D74880892A3F47BB0463EE2C97D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "80000000000" }, "TakerPays": "544000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ecf", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBefpcbGP1mhJhuLmYSbPSj4oDTufciZDH", "value": "9999610698104608e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "68F2C9396DE930BFC347BECA8FDEC673C28AF50869679937FC9BE9D491E273F6", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3951941647.058824" } }, "PreviousTxnID": "E684B8F98BFFE435832AE40AB4478EC3415499193F29FAF1C8F2463590853A61", "PreviousTxnLgrSeq": 68898333 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsSog5gEY6GuTeCP4TAgdK7HkUHiSNxZqL", "Balance": "1438283131", "Flags": 0, "OwnerCount": 57, "Sequence": 64558158 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "69160660C75B23CC248CDCD61304597E107A6091EBB055889E08EDE448AEF24E", "PreviousFields": { "Balance": "1381283131", "OwnerCount": 58 }, "PreviousTxnID": "0CA95010A8E06EA13AEFFE56EBB3DFD58DA40887849D9BD7A28178EC4D2E1151", "PreviousTxnLgrSeq": 69062745 } }, { "ModifiedNode": { "FinalFields": { "Account": "r4LzF7yH5ewjqEVaTpufYTzwH8KyimRrrq", "Balance": "170423284", "Flags": 0, "OwnerCount": 79, "Sequence": 67717947 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6926F8BB2E845351B585195B18647ED90D282BBDC9BF593C74499C9D2281BBB7", "PreviousFields": { "Balance": "170350284", "OwnerCount": 80 }, "PreviousTxnID": "EA0391A838002567887C398D38FEA95C787F816A65D7E44758BC1CA0A80B0B37", "PreviousTxnLgrSeq": 68747509 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10685999940.9528" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKjRbDnEwfSRjozGgD1M2dBU54xVtv57aQ", "value": "9999999999999990e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ccd" }, "LedgerEntryType": "RippleState", "LedgerIndex": "69310530B582A1FD37A87261F6D3A677EAD5CA714C13025C829BC4640D5E52F5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-15685999940.9528" } }, "PreviousTxnID": "FFF9F1A17DBE7551391C8766ADBFBED35CB0CCD595368649E9AA542A48DF4EBE", "PreviousTxnLgrSeq": 68883780 } }, { "ModifiedNode": { "FinalFields": { "Account": "rD3MRnTt6tvvtt7o7F5p8B49toAUWnoLmu", "Balance": "1233471878", "Flags": 0, "OwnerCount": 206, "Sequence": 61714010 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6931B54157A53A9399319445CA748CC74454F59D41D6687CA7DE605B469BB48B", "PreviousFields": { "Balance": "1094871878", "OwnerCount": 207 }, "PreviousTxnID": "A48542544864D946B9452E52C29C0979AF478B2021ADF69510659B17CA9148FE", "PreviousTxnLgrSeq": 69059519 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1260000000000000e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "3e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rh9MmnkJaQ1P1Y6ZzmRFpQAc9UdH6pKTiS", "value": "1000000000000000" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "69353C86A3B3BD9049988DBDE5F05B178670173D2A5FDA7A1A2FB808E86F0BD0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3000000000000000e-4" } }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "DeletedNode": { "FinalFields": { "Account": "rnW1sfCjjdMou7RKC2PquXVchHYBMAHqTD", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211BA60E96DE000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "FA1A6D1BCAB18D715A95741AE430DEE7804231654DB5EE256035CA78593E8010", "PreviousTxnLgrSeq": 68979201, "Sequence": 67670931, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8000000000" }, "TakerPays": "39920000" }, "LedgerEntryType": "Offer", "LedgerIndex": "697C767F4180E0E0353249D1DC23B1E7B0E2DEFB5A3FBFA32C549B751F349DCF" } }, { "ModifiedNode": { "FinalFields": { "Account": "rEqtQj662PMqja6Cb3pyK5V6xi2RGbcFxD", "Balance": "8134218822", "Flags": 0, "OwnerCount": 118, "RegularKey": "r92rqNabrq4AXQnJF8aveTnYJAvmhoU4MU", "Sequence": 63323954 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "69B5B02A16D0F9233CF64BABE0DC02290B6DFCA89F034F486B6E504B87DF384B", "PreviousFields": { "Balance": "860565809", "OwnerCount": 119 }, "PreviousTxnID": "3AC4B7EFF8AD1051D38C353154EED9F03502786E4CCCE55B47B7581D80C6F463", "PreviousTxnLgrSeq": 69058503 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rfKEwoau3VsYDkabUXs7KbivzJXUE1iw9W", "RootIndex": "26667297A5FBE6705D3476B3393D6010EF27E466B9543C1F12BC7E2B1C4656FB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "69C94A0A1F7D95010481A7398D9920057A62DED8D4C155B7E6CCC9FA9BB35585" } }, { "ModifiedNode": { "FinalFields": { "Account": "rLCKThc3nyrBN63QzPHKoHHPA2iN8RH9gp", "Balance": "598340872", "Flags": 0, "OwnerCount": 79, "Sequence": 67704275 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "69D3902A4A4F72694820C115AE488C6C9E2BCA7131D2703FCE62E04201C2C358", "PreviousFields": { "Balance": "538340872", "OwnerCount": 80 }, "PreviousTxnID": "C6D113DCE7A4DF29197DACA42E1C297C54C68AE5469991535B844935EA1244B2", "PreviousTxnLgrSeq": 69063194 } }, { "DeletedNode": { "FinalFields": { "Account": "rh8MNcxKuDcaMRuSj6P2rcMGxDiBqyZJJT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207741EB09897CE", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "CA76B05CA68830AE0056C64E53023A31C460203542E3D40D44C49F99F62E4D2F", "PreviousTxnLgrSeq": 69064150, "Sequence": 67381323, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6A1484ECD49A42CAC0DE456C26D1ADE32054FC8917B3738B174CE619F030C858", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2241619378153860e-4" }, "TakerPays": "470291745" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfzG9eLEj6jZUbign4K98pmLSQt717FVaj", "RootIndex": "6A321A71A1B5F55229FF516A16B0A34F7A2E74E047769CB3FA9BC8618D239565" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6A321A71A1B5F55229FF516A16B0A34F7A2E74E047769CB3FA9BC8618D239565" } }, { "ModifiedNode": { "FinalFields": { "Account": "rEnJLGTTfay1rUmQqsB9PPMrhNo3sFkT5g", "Balance": "238808259", "Flags": 0, "OwnerCount": 34, "Sequence": 67815719 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6A3C769525AB288A19C7ED7D593821453067B20AEE6DBF5D872D5360C2FDB52B", "PreviousFields": { "Balance": "82531221", "OwnerCount": 35 }, "PreviousTxnID": "370E39F81B730F2EB30C145D39419240D1CA7ADE6004E89828EF7DBA8E40920D", "PreviousTxnLgrSeq": 69054463 } }, { "DeletedNode": { "FinalFields": { "Account": "rsPnG9Kmz7rf9fXRZ7zrVb8tmmjUkUEpin", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "A68616BFFAD5D355673A9355884E76BC0CEF94D7BF2151AEACA4E22A38CC105C", "PreviousTxnLgrSeq": 69043654, "Sequence": 66616043, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6A578C206D336F5FB06102C51A61D4B8AC4EB77DBC4615BF7178CA88B660E090", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000000000e-4" }, "TakerPays": "3000000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10337704892.96638" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLVGNfLJYnQtqJDuNWkpu1yaSBnrrSGPdt", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "45b" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6A9C6468E8C51345124F244105A992A94A1AB1F0ECB05A613F3F260BABA99558", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-19337704892.96638" } }, "PreviousTxnID": "D6433B40E73E3EF29BB3A5ECAFDFD0BE7FAE583BD9AE3CC6A69E16DD69D0E89C", "PreviousTxnLgrSeq": 68898383 } }, { "DeletedNode": { "FinalFields": { "Account": "rpq6ooRTok73Udp4D58zesfDJeYM1t5s8C", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653060A241807135E", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "D7F6DFFBC279ED6121930AED15D80800564E80556F14A1E15BE8386EB8165D2C", "PreviousTxnLgrSeq": 68156360, "Sequence": 66716681, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "31143959469" }, "TakerPays": "529447310" }, "LedgerEntryType": "Offer", "LedgerIndex": "6AA18CDFFDE14A5217993060A8036AFE365D9B91CA1F7D6F379CF2F50E45632C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "62287918938" }, "TakerPays": "1058894621" } } }, { "DeletedNode": { "FinalFields": { "Account": "rNvk1SNQZhU6fsyMuaTeLucyw5x5uxfxQy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520925F2E84BF000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "B8BFD91CD9F3082A69B09B197FDDAABD5FAF51D74D12DCD0CFFD597ABF777EB0", "PreviousTxnLgrSeq": 69035316, "Sequence": 67175629, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6ABC4E8529B35250F115C264C55151DA6D9E7BD654FD415E2074ED12E5922A5A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "29100000000" }, "TakerPays": "74932500" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r48QoxLkkqiwjzhposyFj61op7AtvR5aLq", "Balance": "161007410", "Flags": 0, "OwnerCount": 21, "Sequence": 67928324 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6AC56FB8AD2E9D76935D5764A71F5BD75953E46FBF3D794AF92E9C8C105292C7", "PreviousFields": { "Balance": "55999910", "OwnerCount": 22 }, "PreviousTxnID": "33D52B94E3BA532EC59F78CE04F1101488B5A07A0A33DA64530A584230861DB7", "PreviousTxnLgrSeq": 69030108 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3892994933" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "781", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3LLQmhVJiQ3r5e3QCo15yaDumDNp7Gn1r", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6AFB49A72EA7AC3234E5CDE93AE7FC0C1D0FE24039F77564A15727EFBE0DB26F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "B1F4D84EAF91BE5AF8809B7A2E12FF6D9329B231D6840BE7E50A5965AA32DD32", "PreviousTxnLgrSeq": 67996444 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rB4BbxNJ7Hv7i63EwPcEZjuP8YHizdkkvd", "RootIndex": "D431FA5CCED016A40E3A7282CAA6051122AC68AEE0C6A0246FBF4B542EE46595" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6B0448749419022B8FBEBCF449A4D5F1845A9AA31782F84215951EED892B8CDE" } }, { "ModifiedNode": { "FinalFields": { "Account": "raKckiVpb6sE7hq7y1VGpF9YdGAVSbJJLu", "Balance": "1201225243", "Flags": 0, "OwnerCount": 380, "Sequence": 66680949 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6B0FC9EFB9C71771937B41648FB233E0E88EB5C4BF0FBC304FF192C993337A35", "PreviousFields": { "Balance": "1144543237", "OwnerCount": 381 }, "PreviousTxnID": "B6C19E03E942C9F85970DEF1F58A37CF707F62CBBA9B9038F0246DC8D9C3035F", "PreviousTxnLgrSeq": 69060783 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "9", "IndexPrevious": "7", "Owner": "rnYbiXaSpChddFy4fdVYDtNscUsAfgaA4U", "RootIndex": "152B711B52510B654637BFE18671A971ABFCBC75AE22A96810BEE51E9554D656" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6B1434ECC6E83B670CAF4D278ED7A8697885EDEFA18B92856D3867E4B5C9FF43" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rGEpUHYXy3Lt8KvmaKG9wGEB51H1nGAcJ", "RootIndex": "6B246A6A492C99BDD253671B20EC0A68B1F6BE69F70AF586BA20B57A8A839839" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6B246A6A492C99BDD253671B20EC0A68B1F6BE69F70AF586BA20B57A8A839839" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfB3HqBHHTi5TCaXxjo9yMh4r2kfuC3pbz", "RootIndex": "9E4478D670B47B148749C69D0620068BB3D8982BFBE077E9BC60A7ED6D76B954" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6B407541C3B31A798B6F3619A8570576DE1B856327D1114B59223889E7A8F83E" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-3107820999421803e-3" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLgitcbChWYinjw7tiwK6wQw2mN6pEyWzw", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e59" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6B42309ECDD74F8825971FFB8338C03680CF44DFBB111363DA4354FB06F314CB", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5201107085316804e-3" } }, "PreviousTxnID": "453E8F20B0562FE34F105FCEC41787E0353B355F6206A3F237C2D450A195648B", "PreviousTxnLgrSeq": 69057854 } }, { "DeletedNode": { "FinalFields": { "Account": "rBdANmzNNUu3sSPo15TR5eY2s43hPH9yFG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E90EDA38BAF0F", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "B34365158B1E56DB6F9024727525365EBA67FA4635A457FBD5A1F306D74F1CA8", "PreviousTxnLgrSeq": 68991133, "Sequence": 67499172, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1305027537495764e-3" }, "TakerPays": "5350612903" }, "LedgerEntryType": "Offer", "LedgerIndex": "6B57A05A5E079F887E971B91ABFCCB3E6A353D779457CAE6D2DC2806BDD62276" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ef2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "ra4q61eeGoZx4cAJKPHQdyukvugrB2jhgW", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6B5F189AAD3BE961A92CD5BFEFA446B90910D42239EE13D0CFA5C1A76A0B9197", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "55766237.75333621" } }, "PreviousTxnID": "5169F8A2A58227889BC7FD2F237A947D27882ED3A61448CFA2894EB6241594E4", "PreviousTxnLgrSeq": 68916017 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfFFmdT4f2Qj6gSS7daVrQDpJw4tF62Ke2", "RootIndex": "6B86B5ACBF75649A472974F6B3A1035B7A1B81406B8A1CD51A8285DE8D3F6DAB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6B86B5ACBF75649A472974F6B3A1035B7A1B81406B8A1CD51A8285DE8D3F6DAB" } }, { "DeletedNode": { "FinalFields": { "Account": "r4VjGvXZQwpAy5iqMCt6kbSbFb7Bi8RYEG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C3788097C0A3", "BookNode": "0", "Expiration": 726800511, "Flags": 0, "OwnerNode": "1", "PreviousTxnID": "8DCFF0FC7AF26FB37604C52FBF1179040D3108AC4E7F0307871ED75E029AB80D", "PreviousTxnLgrSeq": 68953081, "Sequence": 67388822, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6C3A2FF0CF08DAFC4B9BBD1BCB38AA22C50E1572A8DD4B1A10B6A1D5B0D8D5F2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000006150" }, "TakerPays": "50000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rJqAwcpzstjreWoBc7wGXRtWoxSeXTUzf9", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26AB38C66", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "7C789F0BF122E6C3467FB0AF54B0D9DC7362FAC30EAE8E1EA6AA68E9B109F6ED", "PreviousTxnLgrSeq": 68790316, "Sequence": 66945436, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "77859898" }, "LedgerEntryType": "Offer", "LedgerIndex": "6C67C9B5B753D00979831829F5F757DBDF823519866D4344A7EA1682A9F48FDA" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rpFYhEoT7AeTuaAZYwU25Gjn3i2VygsMnP", "RootIndex": "69400FA06D625B6350459C2B5DF74C0C76A59CC29DFAE6CFDDC3ABF74954B6EB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6C74341F407E17C69850AD443D08C11674A112768DB79790254A8BE0A0EE851E" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "d", "IndexPrevious": "b", "Owner": "rKWwHEb7RPAjRUVyvtfHVUJ1WZjECFhjbE", "RootIndex": "A5F836F8900235B3CB951574D43741D3DEF032AF351B24A8F224D5A0FCE7A242" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6D0AF77E78E2B1FFE0902CA7157CCA0E17D045892ECD7166A428A3A0D3198B19" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ee8", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGEpUHYXy3Lt8KvmaKG9wGEB51H1nGAcJ", "value": "9999999999999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6D2DB78FFA3F5FD3B08EC3ADDD45479BAD94D930287D060220CFB586E354D9D6", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4555713689.655172" } }, "PreviousTxnID": "28B813CCD15A308933E4C3C46BE26FD14310A535E0FC50553135AB7F054C75EE", "PreviousTxnLgrSeq": 68899328 } }, { "DeletedNode": { "FinalFields": { "Account": "rJMPwHXPwcnQCNmNbaRq2Lf5nbsivkCJrH", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD493F3645", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "06FB52AF1C4864C6DDEAA840CC39E13420034F655786C8FF3E94E6E98F3558C2", "PreviousTxnLgrSeq": 68155838, "Sequence": 67216328, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5060893412.900001" }, "TakerPays": "101217868" }, "LedgerEntryType": "Offer", "LedgerIndex": "6D5EE6505D0C89738CB62FE778844283A2286D648A6F57D6DA1488CA6F85694E" } }, { "ModifiedNode": { "FinalFields": { "Account": "rhASEa6rnfc5WHFbd2ZdExhwyfBu27pitp", "Balance": "153119804", "Flags": 0, "OwnerCount": 64, "Sequence": 67430949 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6D9AD70F1A52E78AC9EAD2AEFFDB86FF1A37D27A82C7D15E453C09C152BED654", "PreviousFields": { "Balance": "141994804", "OwnerCount": 65 }, "PreviousTxnID": "58051584F401B268AD9E0B2530E23734EADB6AF13AB045452CE58CDAA6696E21", "PreviousTxnLgrSeq": 69062343 } }, { "DeletedNode": { "FinalFields": { "Account": "rfBvZMQKX3gxybSQAt116zqUxXKu7a8BmY", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652093CAFAC6A8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "08982A2D43153FE20CCD0AF3DC0D51A16C1101D6143FE5E1E862277C2EDDFF53", "PreviousTxnLgrSeq": 69053280, "Sequence": 67523779, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6DB50FF7374B6F0937441E6BE7B2B4CCDAAD821AD32ECE8990AE62D2FAC5D2F7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "14000000000" }, "TakerPays": "36400000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rajb91Ucmbfxe1KoUEpAtJi8eo5bQVWeUW", "RootIndex": "9E832999199458B73CF9879A9E057FF7C9A03FA7123D9173857BAB7076E3663E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6DC0EE8EBA6B09ED36B47CDC5CAA93E80317F88F8C6F318E7301EF1F3DD0BA44" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rBzk3TdhfdbidCHeKWfmQ5dy9AuAtGbXeY", "RootIndex": "C7D98479E3BDF2F01C7F49643BA7AC13D7E365C9AE6B30C241ABE52700AABD01" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6DEC784124AC59EA1A0E6BC0A4B38706C8CDF01AA6F51310C797EFC2F427AEED" } }, { "DeletedNode": { "FinalFields": { "Account": "rLCRC3mUAkWe4R8EwjZ43BGQs7hmpdGrbE", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E8CBEB2C6A41F", "BookNode": "0", "Flags": 131072, "OwnerNode": "10", "PreviousTxnID": "9EA59A4C2591D5C59C3935546ED42621A2958576710C4B6CFECBF376A0A01A6B", "PreviousTxnLgrSeq": 68901075, "Sequence": 66153654, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6DFE81EE2582C8BA4B84462E8F4AEE42889EFC9B56D451111F5EEB30BDE6211B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "24264973447" }, "TakerPays": "208654506" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHSPavv1zYMxcqPUHEeQqwMSQgSzadAjM4", "value": "1000000000000000" }, "HighNode": "4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "214" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6E183DAC81FB48B845E861EDBA39F859A1047760A9811437A0BC867DF8F44829", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-8001600000" } }, "PreviousTxnID": "40E76D634D370CA7865BBEB85D53D891900F6E86E0C2B7A90AFB45E41BC76818", "PreviousTxnLgrSeq": 68898848 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "7", "Owner": "rnfs5ayanPy2X7aQERUoayaokxjuH361V8", "RootIndex": "B2BEFF6BFED4415F30EF0E72FE72BFD41503DD6570CDF9668285A862AD28A5EF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6E3E45F30E3EAA8EA22FD39581AB0D3897A97C65FE9D9B091A1EEEE3A09938C6" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "983", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBVauSrW9MhaNcszTL125KttqSixQmUDuK", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6E473C81B0E1DF1B3DCC86D0460F158F07EE7278EA4E0F6C5B1F3E13B74F6238", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "BDB1E6A3BA1575C9312E6877ED88612D47B2FF4617B77A88E60E5D506846C0E0", "PreviousTxnLgrSeq": 67991913 } }, { "DeletedNode": { "FinalFields": { "Account": "rKycDDwvkpARRr8dccx6mTKBBr6W1GkGjK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365318DE76816D8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "4A3FDD868A85D49B293A8ACBF045B3017DBA0FDB6E1260B1C42470454856C1A9", "PreviousTxnLgrSeq": 68803251, "Sequence": 67284830, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6E62D9123507CFC58BDC9B614C37EE512DF2195382594FB4306564A253B6F4B4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000" }, "TakerPays": "140000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "55310179829.91486" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "73d", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsE3JJ4VxxndQwzRusS99pmAeYN3bEYZmc", "value": "9999999999999999e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6EC04CB3286D90048557DDE79D5C3CEF3E682A8CE17E94C4031C3DCEC765AE92", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1208872303923083e-4" } }, "PreviousTxnID": "436154BAEA9CA9756228BD045A1B3F9107125E0CFB054C6D017BA67C660376F7", "PreviousTxnLgrSeq": 68966795 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-35573129284.06597" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGpBZrDTpimasSJEWV5hxH75LsivV5Hz4v", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "248" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6EDD224DE476D8355CFA18DEC3085901B46EA8D11B1FCC806982A67AEE423E3C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-70509517875.30107" } }, "PreviousTxnID": "7E8E72D93BD6E071C60F2CBDAD0457B3F2C8822DA630148ADFF31D08BEB86CCE", "PreviousTxnLgrSeq": 68993672 } }, { "DeletedNode": { "FinalFields": { "Account": "rPG9SrHPEhwbExniY48qKCqDqjGKyVn38w", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "4CEED23F8A3F6996F2E7DB38DD16004D7FB577DF5F3F1B314020F0C748392622", "PreviousTxnLgrSeq": 68899367, "Sequence": 67109444, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "6F0190DAE6F59C4E9D5A1CB8B349C562E2B8BB014B36A07419E580F204AC5DE8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "60000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rBZXb3rXDo251L4ZJdQCa8AUjP7kc9ifCT", "Balance": "216307241", "Flags": 0, "OwnerCount": 66, "Sequence": 67536213 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6F0FF7E3753DBF46EB2E0FC1E6D00837796AAA6FAD569BAEE112483AB86ECD7F", "PreviousFields": { "Balance": "161612550", "OwnerCount": 67 }, "PreviousTxnID": "D88A6A365E36DA1EB42A907CF75683184B68EC4A8E73895CCEA6148C839A3C5D", "PreviousTxnLgrSeq": 69062470 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1650000000000000e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN8rfe7hU4CCkmEiDkj9fg8pgBp5fa8p2j", "value": "1000000000000000" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "626" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6F117A3BB50A37286B3B640CE1965D64B2703F0E57C90793EF560AD57CC8C4D0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2150000000000000e-4" } }, "PreviousTxnID": "001C79AD997F4EAA594FF866E94549603F902CCF63C7A91A4C707E62EDF37C17", "PreviousTxnLgrSeq": 69034878 } }, { "ModifiedNode": { "FinalFields": { "Account": "rET8MUZc1VEcHkQqQWeRmvbWZcrtHy24iB", "Balance": "206894982", "Flags": 0, "OwnerCount": 24, "Sequence": 59759824 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6F233F3405943EC24EA471AC6F1E27B376B4C66AC4E706EAD7B68322F6AFFBB2", "PreviousFields": { "Balance": "188208607", "OwnerCount": 25 }, "PreviousTxnID": "7FD1979025AC60864F12C3EBCE606FE29E3D5EC13F1270A1CEAD8ED1152D2CB0", "PreviousTxnLgrSeq": 69063498 } }, { "DeletedNode": { "FinalFields": { "Account": "rhoYhs7WCmQKMPR22kQ5DhXw3pXQsjUsmi", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652121553F9BA6A14", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "F64D5D25A3F1297F513C06BE52235DA5FDEF4C96BDE207A27611FAE45FB1A513", "PreviousTxnLgrSeq": 68997760, "Sequence": 66912762, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "84365223821.75485" }, "TakerPays": "429418989" }, "LedgerEntryType": "Offer", "LedgerIndex": "6F4113641CC97924147D096DC6D75ABA81081286F057BDBCBC5C203668D04007" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rpeh8BoXFBaV9nkmRvyHWMt9tGagwWhk5s", "RootIndex": "B073EC6C2768F994C5455EB4C115936827172A56C38FC7FCA0D7F3D3F78146D5" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6F4CAA16C43EE37AE2F2C4DDFA68782CC91BA40C40611496BA34F48EDAA791FD" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1190605514080986e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPG9SrHPEhwbExniY48qKCqDqjGKyVn38w", "value": "9999999997999991e-1" }, "HighNode": "3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "a35" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6F5019B040EE62F9604AB6998AB7E9E8C44E508B05566996853ADD723EA32CCF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1390605514080986e-4" } }, "PreviousTxnID": "808483DE8C02BB3297A29B4BECB913C6DC226D403087E9AFA8A0E7947CD351A3", "PreviousTxnLgrSeq": 68991025 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGcsBzn4XYzjM7nAXBUU163LfyStL1PZsA", "value": "1000000000000000e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ee7" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6F5E4E03254213D49687510AC6EFA9EFC3E3788909000D7B639670B2B9B223D2", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-38049133595.14459" } }, "PreviousTxnID": "F3CBABE5339DD833CE01D9A8D348F1985A5CD3CCDAA961C8DB52B2AF3B8AE4E7", "PreviousTxnLgrSeq": 69000185 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "6ad", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnfuLKZgLhpw1UJorfJH8G1ukEyA7JLf3n", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6F86F71142AEFA3E8A835136853C843BE2C55D6AA544D8F181B60E17A59D40B2", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "D02B73DDFE174DAA22062702DBA03D4833F558DC66CADDB9475A03F2712505CD", "PreviousTxnLgrSeq": 68000148 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rn9Yx4G5KM8ie2sm6Qaju7xPbvQPFiUu2f", "RootIndex": "114AF222D2F86ABC1BD7FAAD8A4A1799C87B04A644333C7554EC673709A47A42" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6F8AE73CF7A14934F3FDAFB05BAC94D2B9CB1F48672A658EAB6CECA1E98D3C18" } }, { "ModifiedNode": { "FinalFields": { "Account": "rGT6ze5CuPEUzsk92YnLLkEqjv6qqhabrF", "Balance": "36449651155", "Flags": 0, "OwnerCount": 202, "Sequence": 82867 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6FBA665E0EB2633A6007080596D5F2E449DEB386D25E91EB97E2A91CE185E266", "PreviousFields": { "Balance": "36099086061", "OwnerCount": 204 }, "PreviousTxnID": "EA29A8A9A4B9956A10BF3A164D4508196E628641780E3143FC8FD29D2E0B770B", "PreviousTxnLgrSeq": 69063739 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "2", "Owner": "r4LzF7yH5ewjqEVaTpufYTzwH8KyimRrrq", "RootIndex": "6FC994FEC547EACA8EC3EDF9E9DAD45B9E5F4CA1359C07982857E8477889CFBE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "6FC994FEC547EACA8EC3EDF9E9DAD45B9E5F4CA1359C07982857E8477889CFBE" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEq5qRY3MvKgqLUDbPF81FQQe9iEfS4xPs", "value": "9999688558266524e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e27" }, "LedgerEntryType": "RippleState", "LedgerIndex": "6FC9B2744313A41445385A975B074CC4DD32220B5D814AA4EEFD946EDDE6EF2A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1137995447689225e-4" } }, "PreviousTxnID": "C7A184DDC8B7DAD511A8AC0B69F9365C142F8B3A9075D03C66D46ABC0DAE9B67", "PreviousTxnLgrSeq": 68996703 } }, { "ModifiedNode": { "FinalFields": { "Account": "rKB9EELQpLTeDNb3H5HJT7QbCPdA1NzDQ7", "Balance": "1522226280", "Flags": 0, "OwnerCount": 151, "Sequence": 67528783 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "6FEA86A43F385AB36163AE78438E3BE042B03816E597AE0EAA0F85A52C947D3F", "PreviousFields": { "Balance": "697347358", "OwnerCount": 152 }, "PreviousTxnID": "992BF755326FA2FDE48C327185E8BC1A5821393FD587BA81125CD202BC7FDB52", "PreviousTxnLgrSeq": 69047372 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rNtB5pUvufMkzs55wL88pVuh3xt7LVW2mR", "RootIndex": "E91A334F6A2597D0DFCCC2ECFCC5C0AB959E62A57F719C4734BDA123F9940F9B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "700CDA826D29516B88CE366265311FDBFAF632C8C712C5C1FCB37B19D8CB2171" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "b", "IndexPrevious": "9", "Owner": "rw4M6hoNYisxYmeppD3bkmf1TuTcQrdsit", "RootIndex": "B586125DCE895C5DC6986542080DFE7CFE1F5AD351B0EC8501BACD4C23B77003" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "701F2158D1D86162D320757256C526C412F6F4827DF122BBD289DCC23EF8A05A" } }, { "ModifiedNode": { "FinalFields": { "Account": "rhw4L75RKqQwheqkwPMM7sQYti6hmLWUni", "Balance": "240282356", "Flags": 0, "OwnerCount": 75, "Sequence": 66981513 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "703034F73B7DA3169A55838796F2037FB90C7C7F33CA65BB7B55E3948D1C4CBE", "PreviousFields": { "Balance": "177994438", "OwnerCount": 76 }, "PreviousTxnID": "6AF9C5E8546627FC91E90953B4535F070B98B205DF5920215453B0D3512EE185", "PreviousTxnLgrSeq": 69050053 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "8052382742854580e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "509", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3mZ69KGMSXXfdFe2xxeNvSkA98mQQ52aF", "value": "1000000000000000e-4" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "707C3F46A9A27190D9EF9B0F7C51F78B325DCD2EAB24BF6CAB03ECF81CA1DF67", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1203108284768164e-3" } }, "PreviousTxnID": "E7EAD1870F80793443B24B458B003896E207AB7B24CDE9C2766373A7FE5864AF", "PreviousTxnLgrSeq": 69062949 } }, { "DeletedNode": { "FinalFields": { "Account": "rHmYEsWRfXC1YbFEKeJRWu9d7tdZ6x1od5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C6B89625", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "4E0110B7EEFC3AA8E55C664BB613D4342548340EFA0F0711005F4A66BD746CB3", "PreviousTxnLgrSeq": 68895634, "Sequence": 67441236, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7112F3D73AABF3CF3563CFA7DA4C4B892D74B050E6E0B2AA0C350D3FB290322E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "14000000000" }, "TakerPays": "125999999" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rK699XAUEcMK6msaRDV46mATmAqNN9nj24", "Balance": "17999970", "Flags": 0, "OwnerCount": 2, "Sequence": 64217434 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "714CE2E276548B1FEC7B1B063435FFFE608593DB80DDAB9CBCA4E407681457FC", "PreviousFields": { "OwnerCount": 3 }, "PreviousTxnID": "C15641B5B16AB5B9930A9B95B7C1BAFD7B7ED9DC9BDB0CD9B401523073F76E66", "PreviousTxnLgrSeq": 68973407 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-26" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJ7kEdYrtovE89yxzJ14DgPYCR58odZYVi", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "73b" }, "LedgerEntryType": "RippleState", "LedgerIndex": "71607AB8E7660ACA44F92D8889015F95F18A906C332C2756262E01D389182D68", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1734116626" } }, "PreviousTxnID": "D273FF3FD32364ADC757161B0C6099A36A6FD87B6AB11538F7DB81DC8D3D8311", "PreviousTxnLgrSeq": 68233139 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "rp9kJTnnfXrjwVFxGRWfjUbJdmxkGP4cif", "RootIndex": "9818A0E9F8B2E4FD17CE73D3763A1878DFE404B32FC8BA5DCC913038A3133760" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7178E21819C392285EB2CFE071FD8C3E6E08025D89D4599960650E2F773D28F0" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rNARwAxVp9C26pcBpRbFHdw6P5Sxa4q7kr", "RootIndex": "F60DDE8BBB749FBF5681513B29ABCD5E2DAD11319E7F35249CDAEDB3578891C2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "71A5C0FEB9DD341F0D49890645793BD2B34BDC4A724F9340AE426CB35D753CC8" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "4ea", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpRWz81LgJfwcxBFMMxwnMttsHr8VoMZeR", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "71C953C88D2BBB607F6194E0CA68F211FD67B020A3982B3C35E4AD2D30EC3F2B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "22785989866" } }, "PreviousTxnID": "147FEE90BE9A6CC7583EAD653F2111AE1BB23677683E20A01763AC9C863BE21E", "PreviousTxnLgrSeq": 69026899 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10789996000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEkvHXE15kSe5Vh1b7RQrDqKrMUqAzsjGW", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "168" }, "LedgerEntryType": "RippleState", "LedgerIndex": "71E50F19D341701CB6F88AD1FFAADA2BBD388851C313F4120E27611400B22437", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-21361975732" } }, "PreviousTxnID": "808483DE8C02BB3297A29B4BECB913C6DC226D403087E9AFA8A0E7947CD351A3", "PreviousTxnLgrSeq": 68991025 } }, { "ModifiedNode": { "FinalFields": { "Account": "raA94X4CEVD8GVTSQWjafELaah67aqrvjG", "Balance": "699977610", "Flags": 0, "OwnerCount": 24, "Sequence": 67107713 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "71F191292990EDE424B2E01336E1F1D1B8BFD32D5EDFED52400D74385BCA0F05", "PreviousFields": { "Balance": "641077610", "OwnerCount": 25 }, "PreviousTxnID": "6B6CAF5F81622D45086503FD33571F6FBBC7CB58081DB8DB18708484AB4B6F9F", "PreviousTxnLgrSeq": 69059689 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20015213305.23436" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rQ34CimjrmwQA4bz3qCwGRHPFuo8rbnVWv", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "a62" }, "LedgerEntryType": "RippleState", "LedgerIndex": "723398A36EFE9A53B8911B0C4FBFFCAF06CA4D971D20E7D1A1F827F05616EE19", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30015213305.23436" } }, "PreviousTxnID": "6EADCCDDF9793F04A515942A418682FB277BA688962D0F9F2E3EE1975BF3C8FC", "PreviousTxnLgrSeq": 68941355 } }, { "ModifiedNode": { "FinalFields": { "Account": "rESTNm5GsJf8WQEnEmszRCsiEzHuFAcgQk", "Balance": "354101657", "Flags": 0, "OwnerCount": 88, "Sequence": 66677076 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "72384BFD4E86CCD693177D4FF18224CFA82C41800CA74E708247622D9363C5F2", "PreviousFields": { "Balance": "276669988", "OwnerCount": 89 }, "PreviousTxnID": "32DAEDEE82BA0E1F0A853F02A8CCCF877AD723312E30E64F24B88450C9E34D1D", "PreviousTxnLgrSeq": 69063887 } }, { "DeletedNode": { "FinalFields": { "Account": "rpcz3Nun3FcRunaTBPPZ6VK8De82hr2DzG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218D9017E1BC6C0", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "669DC83EE13E4D214DEF26406BD0D5830734669D03139E304A49A312FDA45E2F", "PreviousTxnLgrSeq": 68900820, "Sequence": 66971096, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "724136825A68BB4EEB56077668FB3A007299743A69C6EF15EE60D63254A544A7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8000000000" }, "TakerPays": "55951999" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rnfuLKZgLhpw1UJorfJH8G1ukEyA7JLf3n", "Balance": "339230029", "Flags": 0, "OwnerCount": 85, "Sequence": 67152473 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "725D88270316B1C2FE6FB957393680ADCAEF0157DC2F50E6B864336EA30DE7E0", "PreviousFields": { "Balance": "269156121", "OwnerCount": 86 }, "PreviousTxnID": "31601F03D0E696F235DC95B645D3202F4146126AC6487B93AB98CED1B07B81C3", "PreviousTxnLgrSeq": 69052150 } }, { "DeletedNode": { "FinalFields": { "Account": "rEnJLGTTfay1rUmQqsB9PPMrhNo3sFkT5g", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD4908585C", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "82491D13E1DF657FADF4A3FE420527A34EACDA85287C12141B5D2D966BE67EE5", "PreviousTxnLgrSeq": 68893019, "Sequence": 67815701, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "726E71A9710259A50C571BDD355F6DC48F4C446923E2F3C0EA1DA03427D6E2BF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7813851933.965517" }, "TakerPays": "156277038" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r3yLxRMK4K5z8UzzYC9tQASyFZ7p6EQDwz", "Balance": "1807707037", "Flags": 0, "OwnerCount": 9, "Sequence": 68723103 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "72B7C6B982DBC92595A5610369CF0D0EE73ED4DE9AB4D16AB571B61F71D198C6", "PreviousFields": { "Balance": "47707037", "OwnerCount": 10 }, "PreviousTxnID": "48C140CC2CA353858C4C311A5D146514E8F131DD62F00433B7F510EFA6DD7D2D", "PreviousTxnLgrSeq": 69044256 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "r4zXDbBBSbrguDq5pTzabnMgXY7n5qg2jb", "RootIndex": "7701B90FA50AF135326B1DBE0C8B8A71C4E95CA5C6E659E479DEA0D12D2873BB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7343EA475AB28C653F0FF622EC32896DBF990DD84CE4E124B091E4354F986AFD" } }, { "DeletedNode": { "FinalFields": { "Account": "rMAWeQvUd5zQpyY9hSdaUMRMTQHcgAXvj5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D9314988D96", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "E142BB3F18896B94F8B2DAFB4ABD4B239B57E99409A70BBEB94C114E48DBA623", "PreviousTxnLgrSeq": 68996600, "Sequence": 67781445, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "73550653FA272E7AB7EA433B1D63678FCE36E84523B9817C6D91AC62A1FF87A7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "24571457491.42857" }, "TakerPays": "117942995" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-15623452549.18812" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r43hxvGDZqmKmLugK8oJ32r2f4rxuvUntb", "value": "9999688558266545e-1" }, "HighNode": "18", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "de0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "736D02E12B0A2B624080B8430B722EF5949130227A812EF08B08322A8455EBE0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-22623452549.18812" } }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "DeletedNode": { "FinalFields": { "Account": "rUATLa1awouAR8jS1DwtsXuy8EXCjdktgU", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "13", "PreviousTxnID": "1358850657A6B3F2077CBC160AF62E22D7C18FF3494C4EFCB50E848CAB58B5B2", "PreviousTxnLgrSeq": 69001393, "Sequence": 66416971, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "73AE017A37DB0BA93EE66880F47F107DA9046FB80F5D6DCDB91158358DC8B3A0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15000000000" }, "TakerPays": "75000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rPSYhGCFb4y7ntd2VaJzTS4eqiw91wynZn", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653056F86E281A000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "CFC7EE8314D386FCE75D466229842902E0DD45B686BC1B0D24961DA604745236", "PreviousTxnLgrSeq": 68161757, "Sequence": 66692714, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "73D5BE8EE4DBDD4C07F14675CAC804C563E2B9B0EC12039481CC8E194E9062CA", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "76500000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rLPotHoaZNMvAKnTE1xUaVYsHVKKf3SzYY", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAFA8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "3678FE2F7710251F66B53D9E22FEA7F45E938ADA897857B1F3D22C5445F93207", "PreviousTxnLgrSeq": 67963531, "Sequence": 67243573, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7800000000" }, "TakerPays": "70200000" }, "LedgerEntryType": "Offer", "LedgerIndex": "73D6D492646E8BCA03146200DBB64B9E2C2B3D84BBCF386085C0B6E782BD048E" } }, { "ModifiedNode": { "FinalFields": { "Account": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "Balance": "812672879", "Flags": 0, "OwnerCount": 84, "Sequence": 67528382 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "741ADD8FF8E160352F742F6456A2263EE612EF1E388915881BA8EF51AC32FD3C", "PreviousFields": { "Balance": "238330880", "OwnerCount": 92 }, "PreviousTxnID": "56CCFA47B8FFE18287032B90BC0FADAA7C96AFC6BB687F31DF7FCABF5B861A08", "PreviousTxnLgrSeq": 69047015 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "raA94X4CEVD8GVTSQWjafELaah67aqrvjG", "RootIndex": "747530E895B533D4235B360BB1C6EEE7FAA50741FC94754B01148198B95E234D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "747530E895B533D4235B360BB1C6EEE7FAA50741FC94754B01148198B95E234D" } }, { "ModifiedNode": { "FinalFields": { "Account": "rELkNgURGeR4vEFUEYHNATaS9pwPk4KFEm", "Balance": "424134322", "Flags": 0, "OwnerCount": 73, "Sequence": 66617441 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "74C50B79B937BBDC1A3332905769143C92405ED35214932822E7A2DBD036A2F2", "PreviousFields": { "Balance": "369795899", "OwnerCount": 74 }, "PreviousTxnID": "49AD33DB8375ECB48BA9886B8B7A014AD67AE1BFFD4EF905D347D50819C94BF8", "PreviousTxnLgrSeq": 69042991 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEgSssemRh6cSEJYWAyA6Q9uEm6XjBUZ2H", "value": "9999610698104599e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ee5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "75110EF1ADEF0B1B639825E31EC75B0D3ABEA94267C8EADAB956586AC8F4CA1B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10618837198.62227" } }, "PreviousTxnID": "0BBAD2F76CBB3DF0110393E17C1B5F34C6F0E5732EC76B4DFB936D29F1488048", "PreviousTxnLgrSeq": 68965200 } }, { "DeletedNode": { "FinalFields": { "Account": "rnG1UdmTmDXHaQp1vVp4jsH5ZhJKp97TjH", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "73BAABCDD08503A8D225A788DE49CA9365F7E4E536CDA51481FFD90FCB519E6A", "PreviousTxnLgrSeq": 69006307, "Sequence": 67436924, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7514565BA333EF7F0878A3F7E52824974993520B0807AD38242EBA822587EC0E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15000000000" }, "TakerPays": "90000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r3BA8VZ9TV8U5qgd72SX4Ct2iAgQGwcfZ6", "Balance": "211832417", "Flags": 0, "OwnerCount": 86, "Sequence": 67759033 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "751CF572DAEAC96A9FBB505759C8478604824C9BE610F0D5AD6153DBBF5680B4", "PreviousFields": { "Balance": "199832417", "OwnerCount": 87 }, "PreviousTxnID": "F0B1D136DE7521C65E25EDDEF2967D44AC513950F559636E5DA070270783DEA5", "PreviousTxnLgrSeq": 69046497 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rJ7kEdYrtovE89yxzJ14DgPYCR58odZYVi", "RootIndex": "8347945E60697A8732B603AF820BE3A1FAC0EDA5DC36E0509C963480B9E3806D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "759A575EF5DF8A17C0F49F0A980DF0C94CBB3EDE37F169296367629155113512" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "11", "Owner": "rUrv5jwSUrmeGJa5Uj6DB3mBGojLFsRg7L", "RootIndex": "7158D5C041A634E75B206384DB0ECB69970DBEC4A266AC2C694B821EB74C935C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "75A40FA729DC38A2FA15D0BA8E312638329A78E4C2C243822F47BC1F0DB9C952" } }, { "ModifiedNode": { "FinalFields": { "Account": "rKHBZ7opA2ryRMocKk5wEW85wXpUNGNV4Z", "Balance": "100726158", "Flags": 0, "OwnerCount": 38, "Sequence": 67431702 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "75A50BD9DA26A8DDF3AEE8C9E84D86A596E8E8893C76950FB8383C78FB867CEE", "PreviousFields": { "OwnerCount": 39 }, "PreviousTxnID": "BF4699C503483EDD9DD41B491B12F030B962FCA643ADABE431B739528FFD1BE7", "PreviousTxnLgrSeq": 69048699 } }, { "ModifiedNode": { "FinalFields": { "Account": "rwyhjUuEiNmgv4AG4ptie2eAWqN4kfraxv", "Balance": "308091588", "Flags": 0, "OwnerCount": 76, "Sequence": 67423810 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "75A8A75CDDF13FF49C051D71634CED84661CD904A7A3B82EEF413C3899643E69", "PreviousFields": { "Balance": "248091588", "OwnerCount": 77 }, "PreviousTxnID": "32A39C8D8049A5C4D37019698BBE8CD4B1CCE76834D2E08E6C883792BE1FBAFF", "PreviousTxnLgrSeq": 69051864 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a16", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfB3HqBHHTi5TCaXxjo9yMh4r2kfuC3pbz", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "75CFBC951171E18A7A88B5FA0BABBC2BB967040B59801C282EF4931200CD58D6", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "4AB61DD85D413F344C743897C37B4AD274C47B17928F8D8A3DF39F010E2BD6C4", "PreviousTxnLgrSeq": 68056536 } }, { "DeletedNode": { "FinalFields": { "Account": "rnB62vv6d8dQV13A3nHQQ7LEGy8DEWkLuG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210E6594DD97A8E", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "F9D43823B3DBA2F170CFED4129C427F733D21F961F8EDA574BD9D617FFFF32FE", "PreviousTxnLgrSeq": 69015693, "Sequence": 67267235, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7601AB28D26CAE9613BF7732F4E3BED6B4F71E9C54237009A723B3C5C0F79341", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "21022223000" }, "TakerPays": "100000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGRyfRcJ7cSYSu6rw5VpNJReEZt9Gzy9a7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F0237F86A", "BookNode": "0", "Flags": 0, "OwnerNode": "1", "PreviousTxnID": "BF93F4B94907A61AD9EECC9FBEB5D4302701CE5FC5ABCD66A53A14E66AF52E76", "PreviousTxnLgrSeq": 68945021, "Sequence": 67157705, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7612C1D53057B2205AE8169E3C66B0F8E6845BA19E37C97D10901F63FA025692", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4696497466.5" }, "TakerPays": "36632680" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-8227743808.16774" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJKHj2kBpPFHbEu4m2uuSuh5rQEcAYwJ8Z", "value": "1000000000000000" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7628D277681B33176825AF975ACC4B2F7EC9DE4FB947260E3FDF75C1A2821600", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-15227743808.16774" } }, "PreviousTxnID": "F025E6AEE40190DBE2EF37B72D79E510C669FAFE8D2282152D92ED790E7D26BC", "PreviousTxnLgrSeq": 69048358 } }, { "ModifiedNode": { "FinalFields": { "Account": "rpBHrwSGdQm3hE3f6988mSgV9LAzuBsx9A", "Balance": "303340867", "Flags": 0, "OwnerCount": 52, "Sequence": 67835829 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "764F77A14312808A5816BE903E890A31B006FF1E75382CE289DB988FE7F9D304", "PreviousFields": { "Balance": "269316092", "OwnerCount": 54 }, "PreviousTxnID": "8A066FFCD1C7253A584AF0465D4767F39333458035330276E18C0383032C50AE", "PreviousTxnLgrSeq": 69061301 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "0", "Owner": "rGcsBzn4XYzjM7nAXBUU163LfyStL1PZsA", "RootIndex": "DF602990F43B7FB67389C7BFE7856720D77BF1C6F6B79E5C296ADD20B56E72C4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "765556B8754B0C7791CC758AD9C8619BEA9A4DBEBCFA9BA9C87C277C6080A75A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r31dxSZgmArpDtwoLPAftYtU8bHauuxwA5", "RootIndex": "7666D9CFD3C006C701B811909B864EA98D6DAC81451576E716405E44A98BF2BB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7666D9CFD3C006C701B811909B864EA98D6DAC81451576E716405E44A98BF2BB" } }, { "ModifiedNode": { "FinalFields": { "Account": "rKWwHEb7RPAjRUVyvtfHVUJ1WZjECFhjbE", "Balance": "4991894065", "EmailHash": "477423F6C713212926D91233DFB4CC7A", "Flags": 0, "OwnerCount": 284, "Sequence": 66665473 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "766E40F9AFAC5858914C400153A015084A20B45A857A0BAB815881783432619B", "PreviousFields": { "Balance": "3991894066", "OwnerCount": 285 }, "PreviousTxnID": "415A476CF196EC0B8262FED8308C6A8E0671CFB0D5B4AC0C3F691611C75D608B", "PreviousTxnLgrSeq": 69063013 } }, { "DeletedNode": { "FinalFields": { "Account": "rUrbD1rAAkr84UER2ZUxTP5ohhSKzvC8tc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520DF6506DF6EBA9", "BookNode": "0", "Flags": 131072, "OwnerNode": "11", "PreviousTxnID": "9427EE6D1C51FDBE8E3AD044704C77AD91703D8E1FC8A5E069E4E095E1D5D2C2", "PreviousTxnLgrSeq": 69017065, "Sequence": 65999123, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "76966322D4BBB7657E0F2C87F0B91C0ACE3EAD65A9F9F2B09FD881CE3AF023A7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2994999114539000e-4" }, "TakerPays": "1177034652" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEnJLGTTfay1rUmQqsB9PPMrhNo3sFkT5g", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "a0a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "76AD5A21D6ACEFA23C05D781C9156731C94BCB3FF78F9CBC67E31F2AF8C0F618", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7813851933.965517" } }, "PreviousTxnID": "0122A9BAAFC20EBA66EB9AF5E9E2368A6B9BF465E0589881CE7FD5F4FBB8D367", "PreviousTxnLgrSeq": 68651778 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "657", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rn9Yx4G5KM8ie2sm6Qaju7xPbvQPFiUu2f", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "76C9B4587C37D2C54D16354B002BB98588FF9B28104E83B7C7A1F1391AC04EEA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10000000000" } }, "PreviousTxnID": "F6CC9A5BE062A0E8A6258FD605804A964193B9A8BE13149AF207C3253BC68477", "PreviousTxnLgrSeq": 68898727 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "17", "IndexPrevious": "15", "Owner": "rphnh8aG8oBCdrBcgxYgNY8yVqi3b3XqbT", "RootIndex": "F2BB8A5F4368D2D144DC15771F84601A2E2479FE8FE94437BFB57598407A5CC8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "771A50227A76D0A8940D031C6BD9AA54B0C13AB03184D54952E2589D07FD0CB2" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "b", "IndexPrevious": "9", "Owner": "rEr5Zbwd9Lurx4VHEvWWZFQb3owfVABck7", "RootIndex": "0CF2D53ABB32D420D9441E4A9BB61ABCF2E0D777F95842B333AEE141E38AA6AD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "777E1D3C566222B190BE82113A0B309E0649937EE57B8B917D316671AE81AD07" } }, { "ModifiedNode": { "FinalFields": { "Account": "rGJ5He1dXx78w8pGB7zHH9K7dWd9pF8p39", "Balance": "322464761", "Flags": 0, "OwnerCount": 55, "Sequence": 67090027 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "77854B19E45F3127FE88D2F9163BFC1C343238337B09C47F090C3326F81FFBD3", "PreviousFields": { "Balance": "124464762", "OwnerCount": 57 }, "PreviousTxnID": "737A7F3655D7791A13A854BF11C7CC76E13743750BF44842ED8A24F938610ED0", "PreviousTxnLgrSeq": 69044008 } }, { "ModifiedNode": { "FinalFields": { "Account": "rnGd8yRrg47RWDTtRdVRDJvjXHtqgL5yNW", "Balance": "499983679", "Flags": 0, "OwnerCount": 82, "Sequence": 67584542 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "778C058A704ADFA52FE2CD40810E780EF3A3FFCCBA35C1CECCAFA8EF32A77376", "PreviousFields": { "Balance": "244983679", "OwnerCount": 83 }, "PreviousTxnID": "9FDD780531927E1D433FE4FFC7FF85084AB4A3D7DDB0B58AD644F667121E6094", "PreviousTxnLgrSeq": 69052459 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUNU8n4sX1Wo1ksPNPQheA5s6nZCe88iPW", "Balance": "249468612", "Flags": 0, "OwnerCount": 84, "Sequence": 67719901 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "77C0B3EC9C116F3EB7B1705259752B9225C73F53870DAB0781E830536E58D765", "PreviousFields": { "Balance": "230782237", "OwnerCount": 85 }, "PreviousTxnID": "D6D8F4A51E2D68D9D0798C79A454E8B2A8154D25380C1F37CC42B3540C99BD0B", "PreviousTxnLgrSeq": 69057041 } }, { "DeletedNode": { "FinalFields": { "Account": "rNYRNtrFPumPwsB7zbi3VjZLg6WLWBUJvy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A200F55008CDB", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "BA9D4C6B1A425B3142A30240A63F02DADA1B2B8F11F574EB3016F8687431D7EF", "PreviousTxnLgrSeq": 69032311, "Sequence": 67349213, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "77F2B6D66150E5F18FC171EB3E4A1557713E934F8EFADCDDF1F4238410A52B74", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "88997878564" }, "TakerPays": "253643953" } } }, { "DeletedNode": { "FinalFields": { "Account": "rHAYfZTYakQQ5NJCP8BD21nrQeQmDyst5a", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26CC60F80", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "EAE0A7FDB30C2E48C449C4ACD7899A03DC753685289FC97AF2BA4F40982DD218", "PreviousTxnLgrSeq": 68900339, "Sequence": 66939972, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "782D6FA1B1835A15F04C6A341AC8759A487DB4CE4A96FDF894D57F36E0A835F9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000" }, "TakerPays": "199999999" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "102", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUrv5jwSUrmeGJa5Uj6DB3mBGojLFsRg7L", "value": "1000000000000000" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "783874E55D556B30B0C49A286EDC6DF1542CADAFE2616781E13673E8E1079CCF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1919157614683850e-3" } }, "PreviousTxnID": "5DD6E87D20912C7ED949A85BDF26D5FDF13EAD57064BC337B7BCD663A8353858", "PreviousTxnLgrSeq": 68997590 } }, { "ModifiedNode": { "FinalFields": { "Account": "rKBxw9iprFx2LgVfPdthKb6oWUYBLVm4Jw", "Balance": "256964674", "Flags": 0, "OwnerCount": 114, "Sequence": 63654658 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "785807E7C59A18FEE80687641ECE40CC580A51A4520E32AD9E18D1EBA07444C0", "PreviousFields": { "OwnerCount": 115 }, "PreviousTxnID": "2F5320822DAA0EEB163FFAEF8288EFCCFAC4E48BA6180074403DBD0E5E25612A", "PreviousTxnLgrSeq": 69032240 } }, { "DeletedNode": { "FinalFields": { "Account": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082CBF4F083980", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "F59FF0C91F2B2880FE785BF365D7E90E5183302B92E74A7753DF09EEA6069786", "PreviousTxnLgrSeq": 69054939, "Sequence": 67440525, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "787192DD6FFD8F911FC344941124428331367C7B27A91AD36A05DB215C34D9B6", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "230099999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "10", "IndexPrevious": "e", "Owner": "rpq6ooRTok73Udp4D58zesfDJeYM1t5s8C", "RootIndex": "F6C1A9A92D2C7D9C2BD5ABE956113762015D91AABDC214A09E7CD9FD9E0E6AB6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "788453A22BCCCA8BE9D2A7C7157DA4C2A21633EA79965732C489B399CB22C485" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "aea", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnEA5VmDp13iDZdcGUg2X2nzYkaKKDrf86", "value": "9999999999999990e-1" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "78A98DB0B65F6BD633ED7064F9960235A62FC187666704D1551FD293BA0B2D30", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "67893772307.69231" } }, "PreviousTxnID": "BE193169BEA1B9BBDD7F7085C706ADB3744C821C219F146D0AC588457B9417DA", "PreviousTxnLgrSeq": 69021401 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "812", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDsyrKqgbAuWUu1fmJx84Vgm3X4H53rztM", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "78AF1B7A89B3A3656078063366E5688C559409C1F06121FB80140D98180E7989", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "23357969598" } }, "PreviousTxnID": "C2F23DAEBAEFFA5AABC0C8CAF2BD281966760C7AA834ECBA569114ABFA61E42A", "PreviousTxnLgrSeq": 68722542 } }, { "DeletedNode": { "FinalFields": { "Account": "raentKRvbeEBLCQQUC5vbc8FH6zFuzaNEJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219EF4FB2B186E3", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "DAF4886479CD0EEE98F672614A751A326E4DC8F47DA52A1CBC0D27E9E59A320C", "PreviousTxnLgrSeq": 68899331, "Sequence": 67761103, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "78B04B7DE40644E054EC85595C290F21A320E039AEDCFEE4D0B8B8996F1FE868", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "56837726" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9537368080951350e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJCvziKjUwgoNgwNNcy2SwqVMwPFxqBjvn", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e13" }, "LedgerEntryType": "RippleState", "LedgerIndex": "78E3399E66ABC371AD2AE251ED7C1D549209D32D9FA683FD82EBB4E3ABC7EB35", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1053736808095135e-3" } }, "PreviousTxnID": "0027456DECEAFE17BCC3A5D112CBDBC038D33C4A2F008F17919D308A3896405E", "PreviousTxnLgrSeq": 68896658 } }, { "DeletedNode": { "FinalFields": { "Account": "rwVWFLRidfTH7DD1LgcTg4gunGXVos3zVD", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5950DF00", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "CAB8C787FABD6B410529C350DB4A5C6E783495739B9F367C6B73902CAFA6E118", "PreviousTxnLgrSeq": 68152463, "Sequence": 67374396, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "98999999" }, "LedgerEntryType": "Offer", "LedgerIndex": "7932385822531804DD5F2E42F8BCFEBCB9F9BBA40A5477FA8AB49D4E8A569067" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rKso7KmktCCYBfe79sNAFnfKffvansBBRz", "RootIndex": "16079EB94DDBB6FE7530302438BA31C473A6838AC7E1AE6CCEF6D1F2F1E20535" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "795B5A991DA670B08110E6E5E39D7F01493FFA216269BA47C7DED4E46D4C74A9" } }, { "ModifiedNode": { "FinalFields": { "Account": "rs9woHiJb73K8uqmCAUx7hRfW2a2WR5cwi", "Balance": "51181468", "Flags": 0, "OwnerCount": 14, "Sequence": 67697702 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7983DE528B09B80E4970EEC0F7BC18E6E23EF2AC3A3AB7B819F08668032DFA31", "PreviousFields": { "OwnerCount": 15 }, "PreviousTxnID": "5AA9C99C9543F7F578A26896936B7142E84EBF343CF3ACECACB02DAFA8DBBB6F", "PreviousTxnLgrSeq": 69061753 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rPKNCAkooJFM3LJ17zG3wJyxrjnNuHkkYh", "RootIndex": "B6A91DEF09FBF8A924167A6E2F93134904B4D16A38925AB9261AA4FFA6326A62" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "79C91AA1E14953A34F6713B4A8347F507AB4493AE8ECDB2427C8D7C1726597C7" } }, { "DeletedNode": { "FinalFields": { "Account": "rhhokxTQGXV3zHGWJqy1SiJ19yYTSFeGHU", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A388A43C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "00735EB4D7A8D877833091398A4482B298CF53DE2E763ABFDB427124BE94174A", "PreviousTxnLgrSeq": 68935436, "Sequence": 67971467, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "79E4BDE324A1E592F413002A2D96628EF0AA85B32556B44CC8A8478C00A4BE13", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "31000000000" }, "TakerPays": "170500000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rhdw3T1ko64kaipD1T8uJmSkV3mUtRWqiY", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "B5C0B40831AB5AD3C20F77C970B2631776F2B5795DB4799059D26D9DEED98CD5", "PreviousTxnLgrSeq": 68898367, "Sequence": 67761533, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "79E8C7BEAC8187802BE3EBE6325B3E51ED5458B44360F68E19A7ECC686EA93CA", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "60652861" } } }, { "DeletedNode": { "FinalFields": { "Account": "rh4Vn8BNfpDZecwkh39GQvYJ7b7osZfML2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973BAB167B5", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "9C76EBA6F7669A420CCB7EED18AF92BCF3BC5D40A4CA8D463DA17F136DC15463", "PreviousTxnLgrSeq": 68030654, "Sequence": 55497883, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3503695439.7" }, "TakerPays": "31533258" }, "LedgerEntryType": "Offer", "LedgerIndex": "79ED33233BB472B288020E3B46F7E90BEDF5E4B2C7C09F64301E746B0E69398E" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJQTrHKExfeCjschk5MGwPZuditZ8vdWnD", "Balance": "1067129868", "Flags": 0, "OwnerCount": 126, "Sequence": 65794778 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7A04E58647BBAEE34D9D8E93B165F200C0135A4801DC7EFF9A13DF23296C0B2C", "PreviousFields": { "Balance": "949293848", "OwnerCount": 127 }, "PreviousTxnID": "4BDFAB54A720546BEA410BC6307B54B228120922BE57C0E130E68156C13F5AA3", "PreviousTxnLgrSeq": 69057309 } }, { "DeletedNode": { "FinalFields": { "Account": "rNwUjKvVAQ9nhmVW9gF5Hn5414X637aY4U", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "3C4E13A2A268B8586BBB7B94B0D368BA1F68B97D80099F8F1780C6D2D757F021", "PreviousTxnLgrSeq": 68898480, "Sequence": 67761546, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7A1F574F498D63D2D6AFF4517BD89053EB4FC17D523F5FDCF92B8400E1C26273", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "60652861" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLxd1PUJT8xrZ59tUuPANfL87xkBXnkeKi", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "a34" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7A56906489BC0209B86EDD364FB14CCB6831A69844ED690775C415E80CD4B2E7", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2000000000" } }, "PreviousTxnID": "78CE36F7364C65340D3E19565BE48E67C832B95CEEF98DEFC0D456302E078BB6", "PreviousTxnLgrSeq": 68901632 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "rNdfpBhUB1ygnu4z7ebbqLBQH5K8zejbu6", "RootIndex": "9EB7953F11C36BF90CDE8F39E7CAE7BD3A72A8B205F5373E8D6910EDDCDD5B45" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7A77A42B2465D5445FE9A4CA334A2E0B8846AC91ABE8CDAFDDBEAF49E1F44633" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMGX6LAGxRUHd4g3yW1ukFhThgiCxMioX3", "value": "9999688558266535e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ead" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7A958B9F93228247CC9E258B52137D88FF159AC0C8D07BF2847B0AA2A4AAADAA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-34911374032.31382" } }, "PreviousTxnID": "CB354DAED6E268FAE9259928E0B5665F0DF0607FFC11E1DB86D167A1E3E02FAE", "PreviousTxnLgrSeq": 69050997 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "73c", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsydLXavwRHUq9TWdwYqPpYViuFBNuYQYs", "value": "9999999999999999e-1" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7A990387B33C77B112E1BBC77FD424328E7AE55AA70212E31439A190521DAEA1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "9D81F64D573F6E381DB1CC6536CE1AFB0951E86BBEA12D7C73A3AA573281FD9B", "PreviousTxnLgrSeq": 67996814 } }, { "DeletedNode": { "FinalFields": { "Account": "rEX4EMcBRESCnk2kKB1Yhzc5KSCib7Qh1W", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD49724577", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "5CDE33FAB2025DBD47939D993851ED4E64B04734DA2F4C8672C5148F0414E8F4", "PreviousTxnLgrSeq": 68854810, "Sequence": 66347319, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "32000000028.02702" }, "TakerPays": "640000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "7AA08CD01EEB6AD1C3CA097FA5982D07C2A5A1520FDCC5D71019CBE4BBA34E89" } }, { "DeletedNode": { "FinalFields": { "Account": "rfFFmdT4f2Qj6gSS7daVrQDpJw4tF62Ke2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365307E514419EB000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "68B7E52EDE61BDD0888E76E806FCD8432BBA48A1A79790D2BA7EC73D29B57185", "PreviousTxnLgrSeq": 69008532, "Sequence": 67946809, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7AB7B5292B4DD71477BE24A0D29FF04F689C769BB45873534B23DCE6F703D393", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15000000000" }, "TakerPays": "333330000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rn9Yx4G5KM8ie2sm6Qaju7xPbvQPFiUu2f", "Balance": "318130072", "Flags": 0, "OwnerCount": 92, "Sequence": 67611663 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7AC649661C0AE3CBD80F770C99D8DA0CB3EF26EF991E40F3102777F894FC6611", "PreviousFields": { "Balance": "250130072", "OwnerCount": 93 }, "PreviousTxnID": "2F2DDC0246C28EFE51CFFE0DE408F3EB2831DBC6AF91A8352EF4522AE28FA43B", "PreviousTxnLgrSeq": 69059960 } }, { "DeletedNode": { "FinalFields": { "Account": "rEXcziBZ9tEnmNVrcdbQATJPr8JRHuRrZV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132AB951C972F9", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "D4A1F942A5140D2AC861065183AD3596A61B18B2D27A05985AF57C29A6BAAF82", "PreviousTxnLgrSeq": 68929476, "Sequence": 67346294, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7ACA943D5C449D3663DAD99F88079CAAFAD040C1FC60E4BE17FFC7260C4C5974", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "50006701881.61506" }, "TakerPays": "269786156" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6228791892.8" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "743", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUNU8n4sX1Wo1ksPNPQheA5s6nZCe88iPW", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7B46C36AE3B09BC9A21C0C69A912BFFE924A34F1CEE000F39D016C19C5D0DD8E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "D66E446D2BC157BA05283C14CEE44095864ACCCF7D60072D2698292FF94D99E9", "PreviousTxnLgrSeq": 67996891 } }, { "DeletedNode": { "FinalFields": { "Account": "rNvk1SNQZhU6fsyMuaTeLucyw5x5uxfxQy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F195A3C4BA000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "D3D446E8178C5AFDDDD7AE21775D0E6AFC922F195A6F22C2FB244B3AF6501615", "PreviousTxnLgrSeq": 68997192, "Sequence": 67175602, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7B4D4DE74D566D7E8B7AE1998485B7F47B19D10845A20FF78BBB0B021BFBF776", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "85000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rGpBZrDTpimasSJEWV5hxH75LsivV5Hz4v", "Balance": "3434702462", "Flags": 0, "OwnerCount": 120, "Sequence": 67162978 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7B66F60C05D431F17461943665B89289E30DD0FEDEA13C5CBC3C71A493EF48E3", "PreviousFields": { "Balance": "290427489", "OwnerCount": 121 }, "PreviousTxnID": "2AC93156DD0F70A6A68FEF6846F14F71693757D14AFCF1672036C33A03B5AF83", "PreviousTxnLgrSeq": 69062573 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMrFWesXLbeMANpexJkZdYYtCwhqot4x6B", "value": "1000000000000000e-4" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "4f9" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7B683DA9ACC91D0688D4CD54623FD084F3D03BA06615899FFC6B7475B91B2D28", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-15571979732" } }, "PreviousTxnID": "2B231DDAACC71E9DD8E8EF3FF50AAB2C96EDF14AFAE9C33E44E24CB9ADA48AE2", "PreviousTxnLgrSeq": 67978331 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHjXAcTNUKjFvrozV8KizwezuEk9tnhqwF", "Balance": "8488878489", "Flags": 0, "OwnerCount": 29, "Sequence": 67016855 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7BB0FF0CC3F0275CF7BD11D5EEDF9645543DE4AC8874BA26A35CD1BE8024409F", "PreviousFields": { "Balance": "80009434", "OwnerCount": 30 }, "PreviousTxnID": "DAD0204DA133A7E8720D43991E07D32B83300BFDF703307EDCAB2C196CCFCBF7", "PreviousTxnLgrSeq": 69046304 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "r4izcArVy7Ccp9j1VEwnbso67AsYhaEjdJ", "RootIndex": "AA82B46213CA15B706EAD293B0FAD436615E74187D0D68F2C6F15D10DD0DB148" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7BB30BA7BC9516FF00EB096190587D66F95C57CE830A820298332AB46F770645" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rLHtFMi1ohYj9RynpB1wRfEAaLtjXkdRH9", "RootIndex": "6D33CFBB7310E0D2037FA2FA806D026ADC75C59B8E7ED1E2C08EAC26908C2ADD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7C14A35CC4324D87FCC0D2960BBDE2C48946E00632445197733E362DFE5D74D5" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1000039373124402e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e35", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUsSyZqiqCSZoqNqjd6PqcEQ3BBaXyS7wF", "value": "9999999999999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7C4D7A3E9D9D19318514774C238D7CEE84CE3BB7F110B84BAFA05EC5D76B824B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2261386282538256e-4" } }, "PreviousTxnID": "9F737FD5CDB18A91EE93FEBF05F11FF1F9480D821BE86C141F37C862DC375E86", "PreviousTxnLgrSeq": 69032307 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEX4EMcBRESCnk2kKB1Yhzc5KSCib7Qh1W", "value": "1000000000000000e-4" }, "HighNode": "9", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "771" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7C5BFB3EC1F8FACB7FDA3FDDDDC3B5DD947F41D687625428F32BD7ABD450BCC5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9620125742.31273" } }, "PreviousTxnID": "ADBCEF93D68B05B5EB99A7C29EDDD27784943F2B14AC63E3382649662727D498", "PreviousTxnLgrSeq": 68994702 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "8", "IndexPrevious": "6", "Owner": "rw2K4HQDujtogHECEi9ubWzeVVHr2bBN16", "RootIndex": "757018D77A04F7302FEEE0EAFB04D594BB60FF68FE0F8E54F22B14F6B7EC8D3D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7C63A9095A1355F8D181E7EE85314BC9D01BF70EF85B526DF8DEB37D2819EA3B" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "r9vQtUmSgHmDFpc6K7BKLj5JvGBEbvwP9Q", "RootIndex": "CDA8F570986694DFE278D8997A252089A5415C798C141695C00C72BA00BCCC6E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7C6A27186787D89FA95FFCA1B5736A0CFCD7A311F031D515A850A3755002E5E1" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "c", "IndexPrevious": "a", "Owner": "rng5s7vNgzx4BPJzacK2YWUqR5u1aygzWw", "RootIndex": "505B13F06252F6E2CB16363706654A775E84B41B5B66D1C212AFFAD829BB573D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7C7F8C10BBE35E63306AA495059D623F5B52623050E9EFCC481278DD0634DC78" } }, { "DeletedNode": { "FinalFields": { "Account": "rNvk1SNQZhU6fsyMuaTeLucyw5x5uxfxQy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521385AC630A7000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "4594C1D77CD4671DF1FC0812C44F34FD03BD773CEE43ACACC7D300C2FBA804F0", "PreviousTxnLgrSeq": 68920014, "Sequence": 67175542, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7C9626090ED078B581E8D9AA3051C4B2C24F03066EA70C353EE2AA4E988A3A71", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000" }, "TakerPays": "10990000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r9TcqWtCqzG7xnhLcYPUbKsV691wNPzMMw", "Balance": "1254006737", "Flags": 0, "OwnerCount": 257, "Sequence": 67460885 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7CA1379D839C95CA45AE6DBF8F0908B21AE1A39D7A84B9A9DDABF23714008A51", "PreviousFields": { "Balance": "855006737", "OwnerCount": 259 }, "PreviousTxnID": "8875C660A1DCAA5002AAE8FBBB319F461AD4502067D5CA03320A4C4A2D6BD32C", "PreviousTxnLgrSeq": 69059911 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGQaGNPT8u7Wt1RoqJEhBgAPyc9ek5RfCL", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "9da" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7CAD8F7249A03D3F22F4893551847F82979428D6153A09B1D1922E517599A750", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30000000000" } }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "ModifiedNode": { "FinalFields": { "Account": "rfB3HqBHHTi5TCaXxjo9yMh4r2kfuC3pbz", "Balance": "195576992", "Flags": 0, "OwnerCount": 38, "Sequence": 67353737 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7CB32092794AD7D5592550B4A1C310B304052EC4C18AE3EAADA210F6C23CD1E3", "PreviousFields": { "Balance": "94359124", "OwnerCount": 39 }, "PreviousTxnID": "C2A487AEC0FD28A28EC69A709051ED5F1A224697564534EE9EFFCD8F1006EB20", "PreviousTxnLgrSeq": 69054837 } }, { "DeletedNode": { "FinalFields": { "Account": "rNqG1shTsAyEcTFcAeBxGsLpmaNAGbcESv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652237DDA206E2CC9", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "590855290BFE6680695DD6107B7ED83D556C7B89A321178DCAE5BEF21C9CB129", "PreviousTxnLgrSeq": 67965711, "Sequence": 65794870, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7CD98F82BC64599B88E992E447FC54581104E7AB650A716D79391687617F2E65", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "35572979732" }, "TakerPays": "355374067" } } }, { "DeletedNode": { "FinalFields": { "Account": "rng5s7vNgzx4BPJzacK2YWUqR5u1aygzWw", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F398DDF", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "C721EEC9FD9D0BD58F8250DFAA1D90566E210EDAF07774F3D947D12A195C5A42", "PreviousTxnLgrSeq": 67957214, "Sequence": 66389327, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "46715939196" }, "TakerPays": "462487798" }, "LedgerEntryType": "Offer", "LedgerIndex": "7CE0EC88CC0A56B877AEAC0F1FFBAD241168A1B7FA1486BCFD65CDCD9709318B" } }, { "ModifiedNode": { "FinalFields": { "Account": "r9ny1UWruE383T7YTyQgiH4re75gzGpKqa", "Balance": "1848835550", "Flags": 0, "OwnerCount": 128, "Sequence": 66266574 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7D1D8FA99B496B2B483C3EDA24F24284F864ACFA5E29C560CBE25A3F26C926BF", "PreviousFields": { "Balance": "1799708971", "OwnerCount": 129 }, "PreviousTxnID": "9B070D2AD40EC365BBD09FEF950A3F03437DD908B8BDC13C967018056BF18EA8", "PreviousTxnLgrSeq": 69063666 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "127", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwFqpfxexbDa1fUuG87ceDdbe1JnugjWUV", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7D439994609798B6ECCFA934DF08FF9402E182B3089480A65B43DF18D30B3C6D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "A277B76710F2B0FBEE56A4F25E76154317487B09E70512F8812C472C3036C42D", "PreviousTxnLgrSeq": 67949212 } }, { "ModifiedNode": { "FinalFields": { "Account": "rf7hbrdWs2saBvmLubvuzHJuDhDwJf2Fuf", "Balance": "1289408093", "Flags": 0, "OwnerCount": 54, "Sequence": 67205587 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7D6F31C765F369B9B96F3120951DC77C7F99FB2F5F8EAC2A351A0C1C49D6F6C8", "PreviousFields": { "Balance": "121509613", "OwnerCount": 55 }, "PreviousTxnID": "64A9122B715030FC427A0A7A4FEDE976A1F0799D4D9812B85182BE1112CF6355", "PreviousTxnLgrSeq": 69043417 } }, { "DeletedNode": { "FinalFields": { "Account": "rwLffu7VZ4rMMa5thTQppfL9g4FMB1sNys", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212795F58D50000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "80CD6EC1E9D4EB842148311C17936A5736CEC03B227AF02F840039E01E293CB9", "PreviousTxnLgrSeq": 68945547, "Sequence": 67708645, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7DB3B665270D15BA51A67A4BECDAC195804958CE1AE9CA4B2CF5641ED4DBAF88", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "88739555961.5384" }, "TakerPays": "461445691" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rKHBZ7opA2ryRMocKk5wEW85wXpUNGNV4Z", "RootIndex": "86DF7C6A79719A6A410BB255EE019BAC195118ACAF1DD7E435A4F2527BC84590" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7DC17439405299B422EBDBC8673C53575E96600BA24BDBAF821760E11D3E8380" } }, { "DeletedNode": { "FinalFields": { "Account": "rDrVDF6etbhSYtnBoqxbRd4CyGHQ5YNR4z", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEE538000", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "85E0103CCB26C8E7C61023E21572C85A9E8AEA176750DD9EC6C29F0904F276FC", "PreviousTxnLgrSeq": 69042278, "Sequence": 67610497, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7DD9D50FE157E29A9C5CB8ED6DB2190F7824767A904A218C33A7C3C18DC44237", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "25000000000" }, "TakerPays": "75000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "d69", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r5EHmNdKr1SRiA1DrtKBo18DYRrE5ncHF", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7DF873D150D2B5B4ECB09207CDBBA3F2F96244A0F159A831DC6AA72027BF42DD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "80431878392" } }, "PreviousTxnID": "90A65424FAADE0A2AFFB6AA617486FD4804CD0979DE80CD1267CB313461560B2", "PreviousTxnLgrSeq": 68003120 } }, { "DeletedNode": { "FinalFields": { "Account": "rp8YVv74whPGdy9huBZHuPy5D3CRKgFFsj", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D3D0C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "8FFFBCEF36E7189B5C78D7C6A35612743A878EA78B2F3C8FC1F6E646D8360365", "PreviousTxnLgrSeq": 68912672, "Sequence": 68428927, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7E19C1D571DAD309D5A480BFFBD7643AE41F2CBBBE53152156DDCB197753296F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "35000000000" }, "TakerPays": "262500000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "97c", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rhdw3T1ko64kaipD1T8uJmSkV3mUtRWqiY", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7E44B7A9C1A173147A47E79A298AEB4090C6A3FCDD542C8A0ADEA148DFB3C360", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "2FD9A5A7126F8376ACC800347D96EC12CE0555D205B295FD97A4D1F4952C87CD", "PreviousTxnLgrSeq": 67991835 } }, { "DeletedNode": { "FinalFields": { "Account": "rEcDGbmwatAptdvR3tfMRJqfm6taVzHAYP", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530AA87BEE0967B6", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "96F244B6803BA3C8C22AE73D0D26C0031512C5D1235EC378F7918CF810BFCA5C", "PreviousTxnLgrSeq": 68216510, "Sequence": 66780299, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "19357969598" }, "TakerPays": "580739087" }, "LedgerEntryType": "Offer", "LedgerIndex": "7E4E5EE322023E9506C8002FBFFC704162F3DC338E4BB68D03D219E0B3266903" } }, { "DeletedNode": { "FinalFields": { "Account": "rHkAKrt7sjtM7vfLuUmVeJ98jp42mstkTU", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680F3FE73", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "06A29CD004246F8EEDF1025BDCC2E985BF19B42DEDB68DADF6097B0755D684AB", "PreviousTxnLgrSeq": 68929600, "Sequence": 67553391, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7E4F024443F1DF0D9CB8CE87356B3A0BC08523421025B576AB68E15B379B0DDB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "54501929" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rwJECKX27rvudR1C4R2QCUZwatR9zkC4u5", "Balance": "223282259", "Flags": 0, "OwnerCount": 6, "Sequence": 67403550 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7E8184DA79C9C039951B43EA1487614F91860DBF649CD517D3A87326168CEAE7", "PreviousFields": { "Balance": "41095929", "OwnerCount": 7 }, "PreviousTxnID": "A0D5D4CEA466D342E8079DA176CDDE29C34489AF0517C96A7B253A1275E2EFFA", "PreviousTxnLgrSeq": 68995535 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGcsBzn4XYzjM7nAXBUU163LfyStL1PZsA", "Balance": "143317830", "Flags": 0, "OwnerCount": 18, "Sequence": 67544557 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7E8B6CD964678C3F4A97FD68EDF65B8985C04090E4E3CE09A9C899BC0686B492", "PreviousFields": { "Balance": "51999910", "OwnerCount": 20 }, "PreviousTxnID": "83AE629DCEAC1D31D70F84A446557F73B16AC91722D58B356BC41B1515FFC8CF", "PreviousTxnLgrSeq": 69056297 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUMbRuiufkSUvwXG6HBXYHTW9TpioNBKjo", "Balance": "897137153", "Flags": 0, "OwnerCount": 123, "Sequence": 67543023 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7EFC42EDA28E88CFF0E4E019EFC04F8D3447EE486FBC09E28E62FA5CC0BA4470", "PreviousFields": { "Balance": "344331873", "OwnerCount": 124 }, "PreviousTxnID": "A53182EE247BEB68152FFDFE278E99C59E10920F29BF35503D25387AF3B73052", "PreviousTxnLgrSeq": 69064104 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "rG9EpCkxGBXowufUGyrVF8tT7ovkHBdMb4", "RootIndex": "7F26F6481D7ED7FF15D4E0C01A8DF34D9CC9C9483AE7DD1BC60B6096E2EF79B5" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7F26F6481D7ED7FF15D4E0C01A8DF34D9CC9C9483AE7DD1BC60B6096E2EF79B5" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "14", "IndexPrevious": "12", "Owner": "rUATLa1awouAR8jS1DwtsXuy8EXCjdktgU", "RootIndex": "3F5FF4445C04C9BB107724C4C5AFA2F49088FF2A0E8023C45CA4C1C5D99DF9D1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7F34926CEEB4485D3B128095D340085E38583A023A2BCC0EBD76A50951927812" } }, { "DeletedNode": { "FinalFields": { "Account": "rfJYknVqAa2EmEKkKsR2CjJVBKedFU9DNZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD494E4985", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "26405877333708CA625E51E689F96934A113ACFD5103AC13B67C5889DF810EFF", "PreviousTxnLgrSeq": 68863238, "Sequence": 65822918, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7F362D1523DDEE7308CA78F10958A72B8C46A58FC3B5FFD27AE5C31EBC8FA01A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "23357969598" }, "TakerPays": "467159391" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r3yLxRMK4K5z8UzzYC9tQASyFZ7p6EQDwz", "RootIndex": "7F4122E7EFD9DE68953AA21B58BB1B9C777E0EF91FD13251FD22DA1513CD32B1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7F4122E7EFD9DE68953AA21B58BB1B9C777E0EF91FD13251FD22DA1513CD32B1" } }, { "ModifiedNode": { "FinalFields": { "Account": "ragafgjLrLnN1rYkR4FpKXjmiTqDQqDio3", "Balance": "1086030668", "Flags": 0, "OwnerCount": 26, "Sequence": 67291868 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7F4623A177DCBAF070EF54E07254F506B8960FC502C8DF30971D03084FE020F5", "PreviousFields": { "Balance": "321639926", "OwnerCount": 27 }, "PreviousTxnID": "C406A605ABE6694B9F1F882BDCCD9D7420BBAB7F35B9B0AF545E29FE7EA8F351", "PreviousTxnLgrSeq": 69055957 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNwUjKvVAQ9nhmVW9gF5Hn5414X637aY4U", "Balance": "120734026", "Flags": 0, "OwnerCount": 24, "Sequence": 67761568 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "7F6A1E507E759C5CDF3E30223703698279832635D429855B952AED141715680B", "PreviousFields": { "Balance": "60081165", "OwnerCount": 25 }, "PreviousTxnID": "19D8692061DBBC8CB91464E9FD11F35C2E706096BE807DCE59AAE763CBCD451D", "PreviousTxnLgrSeq": 69043974 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rMBUa2qAaU6K8DRTyQsfmeRUtu6j7m8ovB", "RootIndex": "7F7428ED50097606393BDD06F33774D550D2BEF20DDA71EEE15302F8911B4C1D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7F7428ED50097606393BDD06F33774D550D2BEF20DDA71EEE15302F8911B4C1D" } }, { "DeletedNode": { "FinalFields": { "Account": "rGgtpbT9ffSEHApdNkRC4Mu9tsYPRMKx6D", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26E010D29", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "5952EF0FE41A55DD416380613536CA4BADF7D9B48F52D2548BC46293FF2B1DB8", "PreviousTxnLgrSeq": 68892689, "Sequence": 66749100, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7F82F32469E119FCDB42458B82E16085C71FCEF7D6738F13D0E5E2DED8D8588E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2725096458" }, "TakerPays": "272509645" } } }, { "DeletedNode": { "FinalFields": { "Account": "rKso7KmktCCYBfe79sNAFnfKffvansBBRz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365314401EAB384000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "BAFCD4A98A40E354CB29AA35D50583F8A6B151C63622FFCC05D8E486AE525F4A", "PreviousTxnLgrSeq": 68908246, "Sequence": 67328571, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7000000000" }, "TakerPays": "399000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "7F8D96C8DB3CD843709B298CAE9635F1FB49FEF39F3203FB5E162B8453FFD3D7" } }, { "DeletedNode": { "FinalFields": { "Account": "rGcsBzn4XYzjM7nAXBUU163LfyStL1PZsA", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520886C98A7A03D0", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "4DA8C60A7F154630197334D463B6B17333BA85B9EA0044E6AD267B7886827A23", "PreviousTxnLgrSeq": 69049191, "Sequence": 67544554, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "7F998251B8048A336786F899A0BFA676ACF2B97B8B66B546AA87A49A50DB2B87", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "38049133595.14459" }, "TakerPays": "91317920" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "865", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfh8snfXUdwqc25vUfwxJxJnVM1n1dJvoh", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7FBC6DF91B50A991466EE892A7DFC3383DE4B4C1FBB2A6D96ECF2CEE3938AB6A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "55366778430.76617" } }, "PreviousTxnID": "F28B11E71CEE69D3F8A468D0B62C1CEE006B9077B486FA2FC86820226F573C9B", "PreviousTxnLgrSeq": 68992400 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-45000000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPSYhGCFb4y7ntd2VaJzTS4eqiw91wynZn", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "330" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7FD85B313984BD8AE5608DB7F5B97C816BC9BAAAF1C3411EE64714A6A33E0F47", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-50000000000" } }, "PreviousTxnID": "695B1FB9A346CCB8CA3DDD3A34278B072B4FA94AA3ECD4308A0857AAC3FDB4AD", "PreviousTxnLgrSeq": 68864694 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rQpXmMNyGKtsYHwkG7Y3n8sXSXo2cmB1Nt", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "6f6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7FFCC308B23928B8DB2DE501C2146B2E9727996520B162BD93CFBB9D2FEEAC84", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4200000000" } }, "PreviousTxnID": "0B014FD8B59B84832E9E745332EF326EC196AA924A4C62F400497B650EF61039", "PreviousTxnLgrSeq": 68897291 } }, { "DeletedNode": { "FinalFields": { "Account": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530398DD06E53B14", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "D1823B7676DFAC0B0096ADDF64D95F555315927B27C8E1620359E8CA8891D734", "PreviousTxnLgrSeq": 67960068, "Sequence": 1035, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8045B44E45B9728571CE7AB49B565A786B522881610943403A7863F075AFFCE9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "98765432000" }, "TakerPays": "1000000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rwCDD5H9MDWdQE4y15hzipJWXjZpoZWPgL", "Balance": "2584999915", "Flags": 0, "OwnerCount": 158, "Sequence": 66575925 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "805BF930A067AD08F4392673D3B6C7138F8AA3ECEAD17BB22E400A55D52B3BB4", "PreviousFields": { "Balance": "1834999915", "OwnerCount": 159 }, "PreviousTxnID": "D8C6511F207339C5CEE27E775CF84EC16C2F19A4C00A1F8DAEB57D2D264B3D3F", "PreviousTxnLgrSeq": 69061957 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rQDZDYodywYJULXJtv68QyoDbkV5EZgh9s", "RootIndex": "C687A17AB679EAD7A3113AB4C76E18D263AF25FAF0801D234F6C8FC386C6EA4C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8065D87766E864BD8684659B24667BD9ECDBD27EC4E80962BB74AAF74F969E82" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "5d0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rhPNtVD6tfZTrxvebJaquV8Bh5F2Kh8cMa", "value": "1000000000000000e-4" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "80AA807BFC1960FE2BB37FC9B6D2124417D74ED12259DA91B921810FF669905C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7982434333.333333" } }, "PreviousTxnID": "5A897BC35CB11AFA4FAC976724C40DB8A4E287FAC8031D1AEEA734E2058811DA", "PreviousTxnLgrSeq": 68898843 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLBBX2NYwmoiRB68BQP3eo15BbaYtR8qdK", "Balance": "875989992", "Flags": 0, "MessageKey": "02000000000000000000000000BCB153A85FA710C009011C6121EAFE56005DE94E", "OwnerCount": 16, "Sequence": 57721432 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "80C5D0CC2C3AE510B6C050003C607B4D8BEE4904A486F43C3FBF874DDF38D449", "PreviousFields": { "Balance": "97391006", "OwnerCount": 17 }, "PreviousTxnID": "F36C7B7BA543B234B3F0D158058767201F9AA9DED5CAD83717CB4C41901F465F", "PreviousTxnLgrSeq": 68917036 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e1d", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rhEwjxZkMbARLTQmMsR7N6MxRDUUKLF1RP", "value": "9999610698224573e-1" }, "LowNode": "9" }, "LedgerEntryType": "RippleState", "LedgerIndex": "80C9FE569674D8637000BCD7913F2C733FA3360A615966993966ECC81CEC6DD3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6217617997.5" } }, "PreviousTxnID": "4B839DACC05ECDDE78293722AAE3A688426A91BE29975654572646ADE8A91962", "PreviousTxnLgrSeq": 68900449 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rMQF7GUuJQHvrEkXkcySkEvb4fbsGoqGqC", "RootIndex": "80DDFC72E77B84862203F72FBFC8E36E77067ABA54C9858FA0F09212D548F54C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "80DDFC72E77B84862203F72FBFC8E36E77067ABA54C9858FA0F09212D548F54C" } }, { "DeletedNode": { "FinalFields": { "Account": "rJRfgew5k5b2Qgj5r9gn2L6w66hE5vwYnH", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521146DF6B8AF000", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "94490BDCD4E41D740A342CE4DAE16A13C1BC6CFB9D152F786B81DD0909938F58", "PreviousTxnLgrSeq": 68963722, "Sequence": 67406172, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "80DF51EA094A5FCF15DD41CB4FB883C7060ADE2E1810EF293EF97665085E49BF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "24315000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rEpLbrik9r6KpjVbWXA71SVQnMCkY8BEUK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F45EAEF101030", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "10143FF79F62E270C5824A4D3DC37DBE544F8B840AF2D83B93E69A3D7F5FC296", "PreviousTxnLgrSeq": 69033409, "Sequence": 66709819, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8187AC2256CD8352BE5783A86B236B708B6147167250EFD3F536E26DB6C49669", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "38009048040.74152" }, "TakerPays": "163400897" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rUqaUzkL9NU9wp7BReWWPJQddAErF45hkE", "Balance": "2496602453", "Flags": 0, "OwnerCount": 5, "Sequence": 67136334 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "819A88F54C170951E4C8241B2F21E816EA9A25894B7D4DE721AE6BB9BFFF9C2E", "PreviousFields": { "OwnerCount": 6 }, "PreviousTxnID": "A36DC976F26B77DACF7014CCAEA917C9B47E9E06EB190E7304E1BE849C1C0368", "PreviousTxnLgrSeq": 68872572 } }, { "DeletedNode": { "FinalFields": { "Account": "rCeRsWQYvZrkA8s3jZYXBYw7gXH7cbVNF", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214F51BF3FF5BDF", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "09B304270FA8C1E9CE62CB10243DCF3E279FA63936C1374EA257A0DD0853A7C7", "PreviousTxnLgrSeq": 68915434, "Sequence": 67345641, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "819B3A705BDB51750701F1313F4F658E1B8F2A91E95EE9406A927E5F0508BFC5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "16526809794.79221" }, "TakerPays": "97491650" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-15000000000.00001" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKWwHEb7RPAjRUVyvtfHVUJ1WZjECFhjbE", "value": "1000000000000000e-4" }, "HighNode": "8", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ab4" }, "LedgerEntryType": "RippleState", "LedgerIndex": "81FDC9492186D80109269682F51453AFAC4795913F0DAC329A8EE57A838D7961", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30000000000.00001" } }, "PreviousTxnID": "944EE0B29A27A0CE7E2524FF19A4355D10A1D6B025887496BE736AF39E9AB821", "PreviousTxnLgrSeq": 68156008 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-8000000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNRoroUiCSQM3hcrEkwV5p6uCx8WSm3Mjy", "value": "1000000000000000" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "21a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "82099AA0E08B9B3D9D30F7DFA49F767E741E76E6BE6C0680A5E3CFC5F0127DCD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-16000000000" } }, "PreviousTxnID": "808483DE8C02BB3297A29B4BECB913C6DC226D403087E9AFA8A0E7947CD351A3", "PreviousTxnLgrSeq": 68991025 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "8", "Owner": "rpf1wWbuPjafvAgD4f9vtX88Ut9qurPRHS", "RootIndex": "31CE1877F3B4F67708C9EE7C271B150FDA1A6ED7BE46B6E8DBC5C3E81EFE0EA7" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "822FE3C241F3FCCA17AA22511EEC4329DE4F53D9750E4306BA7DC085F5A041D0" } }, { "DeletedNode": { "FinalFields": { "Account": "ra1aHhcQxB9sHWm7ppBMKEQWs4FTfRGZAg", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211BA60E96DE000", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "492DA9B66DEF0BE2A0B8FE189DC4C46B5B79372757270A2A4088A0E997EAE032", "PreviousTxnLgrSeq": 68977699, "Sequence": 66996671, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8252964656CCC80EF99EB80976891A0486375B447258860EF46BC8099A5CC3A1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4700000000" }, "TakerPays": "23453000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "c", "IndexPrevious": "a", "Owner": "raPCjF9ftTRB7LYgehLYKBtzf8Eg4qp8Kv", "RootIndex": "A7960A534522E4BCDB4C30980E365099588C49DBE83951DE28A21AD227BE00CC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "825A247D4A1F08927A3FEA3B8639A216D4A61D49D8B98ABC33B0AD4E209995CA" } }, { "DeletedNode": { "FinalFields": { "Account": "rhhokxTQGXV3zHGWJqy1SiJ19yYTSFeGHU", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CACD0C69", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "4159DDE08CBFCD9DA3C2690393212E5DF630959C7AB2E966A8F0DB9CB0CD1DE7", "PreviousTxnLgrSeq": 68908066, "Sequence": 67971447, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000.00001" }, "TakerPays": "9000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "826E7A377913EAE49998D26BA231A7CECD2BE3C35B6B443B6DC5481030E7AFBD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "71523946801.44991" }, "TakerPays": "643715521" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "55", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpq6ooRTok73Udp4D58zesfDJeYM1t5s8C", "value": "1000000000000000" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "82748DCDC6F0AA1962E688C862F788EBE37939AE5144C727759A586F2A7A1D36", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "62287918938" } }, "PreviousTxnID": "97746552002BA699CF12EAC5091836C075243E8420AFA432FEE4B13267380E53", "PreviousTxnLgrSeq": 67951707 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1100000000.60139" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "50a", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3Xud98xTUTiXxGp2LbmFtFTWRWeaZSCad", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "82869352DC95874AC0466D989D5F4E67E1FDA7F9DBD3AD1713C6DCBB64E4F45B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3100000000.60139" } }, "PreviousTxnID": "186B85B812A2352491A19436FB3A2107F0D70A499D217B42A2CCC78FACD6D3FF", "PreviousTxnLgrSeq": 68991727 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "6", "IndexPrevious": "4", "Owner": "raxn3rqqdW28ZVrFAQ33AUrvdaTSv34DSX", "RootIndex": "02D86EA2A8285DAA5E91B63BC2954A5B009A46FEFE0EC79D7E7F156E34E33A03" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "829CA83608D6E69E957C5C6DD82C58844BB463667DAAEB227700717F1641893A" } }, { "ModifiedNode": { "FinalFields": { "Account": "rHLNuze17yJvjKohtAWTiakAUWFDp81Nbv", "Balance": "191107345", "Flags": 0, "OwnerCount": 8, "Sequence": 67600409 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "82D3DB9F92A9F0580715E6F6BBD355007923E0DD90F5EEBF8C9B5A2734FC8DE4", "PreviousFields": { "Balance": "32111688", "OwnerCount": 9 }, "PreviousTxnID": "79181504B0F5C539876518664B5255CD2128A97D822D9858ADCF7EC39A2E958F", "PreviousTxnLgrSeq": 68976059 } }, { "DeletedNode": { "FinalFields": { "Account": "rpRfuSRwU9nUefy8T4z4RXUEDU2baW1qhk", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A8B615973FF05", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "36198BECE1E2A83261A761E496FE1DF9A426AA5082A3B325A98CAB89046E80EE", "PreviousTxnLgrSeq": 69000219, "Sequence": 67425371, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "82F3142D0435D536AF8875C5D1225C7B9F85040C0C84D8698F41319293D0D837", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1490974072105691e-4" }, "TakerPays": "442521104" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rnMENGbcT6QgrfDGjz7UJvyMryD8YPdi3y", "RootIndex": "B57F3AF80428C52158504EA9D04C53ABD6428548C31854742B1FDE8268E4B7DA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "82F583404FA632F15A8A369E3C16502EEAEF3BE11041841B859C2113473BA7D8" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLV3c2Bymn4fq7kyrqysEd1ddizDxvwS1m", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "c15" }, "LedgerEntryType": "RippleState", "LedgerIndex": "82F6B221A8D16A489867BD4021F1775A0321B232DD2C268E52526C93482FE713", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4000000000" } }, "PreviousTxnID": "2AC3F37B10B166412364C8CDDB3268B1E2A04EC25B21EBC71C71F67F84B66CF2", "PreviousTxnLgrSeq": 68889039 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUs2aUqfDfjTN9HWdhXzRZZJkHm5rGUUdS", "Balance": "2526000014", "Flags": 0, "MessageKey": "02000000000000000000000000FFE94AB4BF5CE179FF2025AC6F903765B3473674", "OwnerCount": 7, "Sequence": 305 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "832718468229563ED6807FB6DEF71A67BA08D485CA7FC983FDE6B5D062CB10F1", "PreviousFields": { "Balance": "2026000014", "OwnerCount": 8 }, "PreviousTxnID": "51DFA167541535AB6EBC7A1AEEC9403A16663EC6EC1C3634D67C481FBBEF08F8", "PreviousTxnLgrSeq": 68896673 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJyPfhC1DLsG22KEG4jS5mDrGtoDcwZDty", "Balance": "164217340", "Flags": 0, "OwnerCount": 75, "Sequence": 67176130 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "834578D2E90D35892E83098EC37C284A2ED10240E6BCFEF26A568815956239A9", "PreviousFields": { "OwnerCount": 76 }, "PreviousTxnID": "80677E853ED7C6D13B9359DD7D38FC44F43CC88B94D62CAD74CB074570956226", "PreviousTxnLgrSeq": 69047865 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rs9woHiJb73K8uqmCAUx7hRfW2a2WR5cwi", "RootIndex": "36AB760CF003A8D07EB6C8B0F9440F476A1973BD64C45107C2414434B6C002DF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "836FA34D61D7DB07D2CE525B3BE4603942CBD67A7F20D671C9664438B9BA9EF2" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "rfe2f8LznaFRfwdoiZGPxej6zbdYAYe4Rq", "RootIndex": "2A4B85379B845F7F383582E27CD8430960B518B4B2CD8A480CF98E3540081D27" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8370DC1BD87256B701E5F5ECB13590DA9F66A1D12547ECD37D1AFB9533C28DAD" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "10", "Owner": "rUrbD1rAAkr84UER2ZUxTP5ohhSKzvC8tc", "RootIndex": "2E290E48C7A786F18B6FAFED5F9AFCBF8782742E78D855EFE4A70296B8E7D431" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8375557C868738896F8AC99588FA4D715AB965136E595F440F1E22C974BBAD70" } }, { "DeletedNode": { "FinalFields": { "Account": "rN3pszUgbBgf7yZ9jxiHTXwStoE32PDsHm", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5249C5DE5", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "53B9FA58BF0539F3AF9F2846F088F29AA60539BAD38383DB95E9873DA42E8473", "PreviousTxnLgrSeq": 69005187, "Sequence": 67231709, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "839C646DFA0BD084DE9A91F8FB4AEE21F120EBCEEA2F1FA237DBC452784C2DE7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989901" }, "TakerPays": "62287919" } } }, { "DeletedNode": { "FinalFields": { "Account": "rwxKxP668nq2w99VM8SpeaXBwUVkcpcV3m", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD494E4986", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "C3171E8717F6895516BA8AFD1E35A092CB81D80332DA4236294715A516387792", "PreviousTxnLgrSeq": 68789750, "Sequence": 67089663, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "155719797" }, "LedgerEntryType": "Offer", "LedgerIndex": "83B110863CCB1421D65B9261EC769C0ABA26D16AC5556D5C9F9445A4268C5EEE" } }, { "ModifiedNode": { "FinalFields": { "Account": "rnYbiXaSpChddFy4fdVYDtNscUsAfgaA4U", "Balance": "568929483", "Flags": 0, "OwnerCount": 99, "Sequence": 66933320 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "83F08097E3816A191D59AC1E68B52E839EB2C00CEA7CDFF89D1DCB862387371F", "PreviousFields": { "Balance": "267264650", "OwnerCount": 101 }, "PreviousTxnID": "1210263D7E0F4EAA7B660FB1ECDE34E586C441B7E5158590BFBD04D553BE86B1", "PreviousTxnLgrSeq": 69047090 } }, { "DeletedNode": { "FinalFields": { "Account": "raKfcCtqnoopzuWrRWY88p5hbTBmF7RzTj", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "5214C9EBF8555E675A69E17976FADEAEEC78B968A55C6B84D7D855B282AEED1C", "PreviousTxnLgrSeq": 68896932, "Sequence": 67579508, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "83FFBCB0C9342FEE0127B164C4696ED930BE3E3B1F3A531C1089693B911F22FC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "100000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rNoN8BUzTSY5oyJmAMiKNGo1k8PSxhyJzc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305543DF667BB76", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "32889A27618BF2DEF78ACBE128C257BE32949B3ABF425B86727BE90D9C4AC01B", "PreviousTxnLgrSeq": 68989814, "Sequence": 67232090, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "84081C05B0EB4D1F8591DE68B6DD7378D1205B6B83145F884223BC9F8FF85752", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "116789847" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rLVaKJ42tddq3vJAFiPibubt2HbBpTHuX7", "Balance": "700316587", "Flags": 0, "OwnerCount": 194, "Sequence": 66153452 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "840CBCC7F5DF512533C7694C8F0CC91E501860758C450A655F4D8726940EEAF9", "PreviousFields": { "Balance": "425804081", "OwnerCount": 195 }, "PreviousTxnID": "2A60A1C7F35738A18BB24D1B26979F06CA2E949BCDF0F132757C22D3C5790B7A", "PreviousTxnLgrSeq": 69054761 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "286", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raZrDVYBJ5whjdgJ1V6FtiYixKesEfDyKJ", "value": "1000000000000000e-4" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8422632F10E09E4D583E4B1CEE79BB0800D50B2651B40C474DBF6F77231CCD8D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "910FD11A4E65611A5EBFF1B41726DA7178043A810B90755223F7BF2776E86DB0", "PreviousTxnLgrSeq": 67951015 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLV3c2Bymn4fq7kyrqysEd1ddizDxvwS1m", "Balance": "137462107", "Flags": 0, "OwnerCount": 39, "Sequence": 67840013 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8456D9CE776766DEC4402055CA7E26F015A26E946A19C7C23FF6155553C12CB6", "PreviousFields": { "Balance": "113462107", "OwnerCount": 40 }, "PreviousTxnID": "71C7E352A8EB9DF81C9A6AEBDEE17AA302AD274F1B3CED616B9BA266F1D27C68", "PreviousTxnLgrSeq": 69044091 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMAWeQvUd5zQpyY9hSdaUMRMTQHcgAXvj5", "Balance": "402899532", "Flags": 0, "OwnerCount": 39, "Sequence": 67781451 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "847DF98C3CB0D7A12ED29CCBCCC6C75BA73DEEF924D28D2044B12C2B136A0057", "PreviousFields": { "Balance": "94000000", "OwnerCount": 41 }, "PreviousTxnID": "48C140CC2CA353858C4C311A5D146514E8F131DD62F00433B7F510EFA6DD7D2D", "PreviousTxnLgrSeq": 69044256 } }, { "DeletedNode": { "FinalFields": { "Account": "rsE3JJ4VxxndQwzRusS99pmAeYN3bEYZmc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652197913B6C1F5DB", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "E111061D3A118C6C8FF3D7CC7657E0DCE980EABA927A47AC9E792083768855E3", "PreviousTxnLgrSeq": 68898533, "Sequence": 930, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "847ED804A83382F7ECA02A429768814081A85384F369B2E4BEB0C8334C6709B7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "59019345506.15411" }, "TakerPays": "423168707" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rnZj4CQouegP4s5Hu2LxBbjCfGSWQuzRAp", "Balance": "1048860160", "Flags": 0, "MessageKey": "02000000000000000000000000B82A5EE17A6F59E28353C69D4ABFFD82A49F6CF5", "OwnerCount": 5, "Sequence": 58648416 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "848CF9354D2FB1A5D71789482D18F1370B3E93EF0FE5B5E650F1D5A358AB1DB1", "PreviousFields": { "Balance": "24600160", "OwnerCount": 6 }, "PreviousTxnID": "B3638F0294BAD3383C8E8D78792565DA81E89EFBF58439E1932091830C950283", "PreviousTxnLgrSeq": 68960703 } }, { "DeletedNode": { "FinalFields": { "Account": "r3PYAn9d1DTFzJ9kuvFnhudgwsVZ6pm5hT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E5AD072D1D200", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "CC75D9CF2D09DFA5969BAEED8AE384BDA381C92F3001D440C4E6FE68D6BD0AFE", "PreviousTxnLgrSeq": 68998256, "Sequence": 67442320, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "84916C9E9E0016004F870DAFE0FCC72EACE465E4F0F9081657B48E7A177F7001", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4000000000000000e-4" }, "TakerPays": "1616200400" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHNNQAEvRxzWoi2ukxZ371fsjJjxRva3pd", "RootIndex": "8499563283A0131C4FA7C01EACDF2B957751C9A3EFDC7B5082684968A3A8DE24" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8499563283A0131C4FA7C01EACDF2B957751C9A3EFDC7B5082684968A3A8DE24" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "0", "Owner": "ragafgjLrLnN1rYkR4FpKXjmiTqDQqDio3", "RootIndex": "84E22F5D4D00F5706F0B2BB3572C89842EF0F3EADFDC609C01B7DE2CE627C4E2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "84E22F5D4D00F5706F0B2BB3572C89842EF0F3EADFDC609C01B7DE2CE627C4E2" } }, { "DeletedNode": { "FinalFields": { "Account": "rUkBkCrKSXyNbUcj7hNC684Z2TrzouvZBr", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DC0E7B06", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "B12E639C3D165CB56C840F7A8CEEE8F5126232672F53C44566429C891AB77BC0", "PreviousTxnLgrSeq": 68911732, "Sequence": 67458715, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "84E9B716AEE608212F5234E4C55F7064B619E58F2FE56CA6E863CE6F3B682A69", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "26076190543.44082" }, "TakerPays": "156457143" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "9", "Owner": "rN3pszUgbBgf7yZ9jxiHTXwStoE32PDsHm", "RootIndex": "9431555908FE08280B63758C2D040DFB9247E35910D3000079F501258E5CD504" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "85019A2578D910C9CE7ADFABDCEA0AE0FF678A1D591D8F8D56505DDB2D4990B5" } }, { "DeletedNode": { "FinalFields": { "Account": "rBhRwsAuVFJ3VY37rd5R9YzqrCRjVXQggX", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE76816D8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "20C7463ADBF11D083F8EEA8782D5F2F7FB5829C2DEEEF833BD5D366A42E9200E", "PreviousTxnLgrSeq": 68899109, "Sequence": 66546612, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "85053725FE4EE14EAD15029B232A6CD61270D1BC3E766CC6BEA081DBDBC480B3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "35000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4696497466.5" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGRyfRcJ7cSYSu6rw5VpNJReEZt9Gzy9a7", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "58c" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8514F86C52743D78568BE8327439DC9E77CB0B4E0E4BE283F9A93B8E93F3E392", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-28789492399.5" } }, "PreviousTxnID": "D4B463265A37414CB5564AF7E8478CA2E15E6F11BAFD1EA5A0D72F3BAFC66951", "PreviousTxnLgrSeq": 68993144 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "569", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rCeRsWQYvZrkA8s3jZYXBYw7gXH7cbVNF", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8534ABC91D7F948E7A91F34F85B47D72B7A6810CE21D4CF3B96878D441C023EF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "16526809794.79221" } }, "PreviousTxnID": "F02DBBA33986BAFAA9A845E690E22C993A6C716CBA6FA555D3E18D86ABEED40A", "PreviousTxnLgrSeq": 68915427 } }, { "DeletedNode": { "FinalFields": { "Account": "rfJ35bQofteAs3h4aCA77V5wSHRsHChttf", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521421326D4C2000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "E7663EEF35618A4117F92C1848A4ADB47EAB187C05D2ED9D7686BE89E1BAB83E", "PreviousTxnLgrSeq": 68918819, "Sequence": 66166926, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8559F96A91C29DBEC63189C99A51928AD9FCC12724B973E9D0F2B69C2BDD6423", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "56660000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10533676354.1841" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e11", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfe2f8LznaFRfwdoiZGPxej6zbdYAYe4Rq", "value": "9999688558266539e-1" }, "LowNode": "5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8571A9910ED75F7EDB89390872671C83FD2975E7DC72476D42713BACF9664C84", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1105336763541841e-4" } }, "PreviousTxnID": "5A71BEE13C8413F9AF852DEDCBBFB34BBC8AD9D54DC60DCE9371DD120C17C1C2", "PreviousTxnLgrSeq": 69002433 } }, { "ModifiedNode": { "FinalFields": { "Account": "rhdw3T1ko64kaipD1T8uJmSkV3mUtRWqiY", "Balance": "155228739", "Flags": 0, "OwnerCount": 30, "Sequence": 67761561 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "85947F25D833C07EE55F3441EF69ACA4F8951A338256AB010B1843719308AF18", "PreviousFields": { "Balance": "94575878", "OwnerCount": 31 }, "PreviousTxnID": "FFEAD34A4246978A8B98A5B078BC93286105F3C6A0AB1ECAC4DD9D4FC574DAE2", "PreviousTxnLgrSeq": 69043939 } }, { "ModifiedNode": { "FinalFields": { "Account": "rno35bcvBqLMETwksdhSiUuDQquXyoBtem", "Balance": "508671965", "Flags": 0, "OwnerCount": 110, "Sequence": 66320194 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "85C6C4D5582A83E1D32FF14824F9F9C5991D50C5F402D8CB530E99E8415B0C67", "PreviousFields": { "Balance": "237588965", "OwnerCount": 112 }, "PreviousTxnID": "800E5DB33332BA6307BEA14A1B67F5F3814CD384E6173E1047E0C975127EAA9F", "PreviousTxnLgrSeq": 69061453 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rE2zUmDvH8vtBsGPBTdLSJW8rDLNVy8g4V", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e46" }, "LedgerEntryType": "RippleState", "LedgerIndex": "85CC9612F9B6B6EAE748E04AC4B5E5A649C2DDC945FC13038D341FA3721788BB", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10300120049.77974" } }, "PreviousTxnID": "6B24E83CE005A22EFC422D5F8F5EB0CE12EB013E31A37AB639FAFBBEA6CC7001", "PreviousTxnLgrSeq": 68945962 } }, { "ModifiedNode": { "FinalFields": { "Account": "rnB62vv6d8dQV13A3nHQQ7LEGy8DEWkLuG", "Balance": "571507151", "Flags": 0, "OwnerCount": 125, "Sequence": 67267248 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "860B107B649B37A4A1C06211AFCBAB6D9EA743970E70932FEA2D067F9C227E40", "PreviousFields": { "Balance": "311507151", "OwnerCount": 128 }, "PreviousTxnID": "252532292EE765FDEB1B512DC1A33AB3E680D25D5228A47608F5AB27F5C9B90D", "PreviousTxnLgrSeq": 69062643 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "Balance": "83742140", "Flags": 0, "OwnerCount": 16, "Sequence": 68499511 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "860D050668EFAFB1B3E3496528EDC356FA5F74F4699913C35940340F0BCC00FA", "PreviousFields": { "Balance": "82846696", "OwnerCount": 24 }, "PreviousTxnID": "E417C9DE099FA7843976A7600F48E096AF8E0B781CF41A3082F1E8169F00044F", "PreviousTxnLgrSeq": 69059893 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLC5cTyVFPDTN4nuTcM9F2MAzhbkS7a78Q", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "97c" }, "LedgerEntryType": "RippleState", "LedgerIndex": "86236DF3510F1D51819E8FAE1AD46FD1EAED78E601B0805C7905BF2BB18E7DFE", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "FA449661B456829E2C4A43794792CD293F247E1BA35825AE64ED714D4B80064C", "PreviousTxnLgrSeq": 67991835 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLzgqyEetWAoARj7XcpWExwpRCvYq5zHi6", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "a1d" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8635942E1AFE2416BAA12D6E349C45253888D4958AEA3445B8B56F66226C43BD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5269682218.30986" } }, "PreviousTxnID": "21D877D2DC69DE6BD82E20DC9E35FB68BC05233C03BF102B48F9EDC1E97C2FD7", "PreviousTxnLgrSeq": 68905410 } }, { "DeletedNode": { "FinalFields": { "Account": "rGa2XHaY793GMxMeexFcabjrc4w5vyrmPJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA926C20E0", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "7E74DB20F0FFC6D7C679F858493C8C7312B86E0100E452243770C6E626AFE68E", "PreviousTxnLgrSeq": 69030733, "Sequence": 68329269, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "40122950364.29873" }, "TakerPays": "160491801" }, "LedgerEntryType": "Offer", "LedgerIndex": "863B3F22C11D66E6A65038C38327CA5DB8A199F7D5D9D540A841BEDD213327A5" } }, { "DeletedNode": { "FinalFields": { "Account": "rhxWqi4kQsADuck5wUsbXCcR2Pq44kbjZs", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEB9338FA", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "6EBF48A1E63A155AAFE6D05B1FE88CE966ADB702765137BE5A47B7EED70BB203", "PreviousTxnLgrSeq": 69030312, "Sequence": 67431411, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "863F47399AF73290B43A5EE1D753A4CAF0E9D1E62AB3AD53B7BA74603A84C30F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "17796971607.14286" }, "TakerPays": "53390914" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rfBvZMQKX3gxybSQAt116zqUxXKu7a8BmY", "Balance": "301190272", "Flags": 0, "OwnerCount": 71, "Sequence": 67523781 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "867BA5F0CD204D856470B06A4FCE5266D9AB8081FAF2C36680B078DA555248D5", "PreviousFields": { "Balance": "205396215", "OwnerCount": 73 }, "PreviousTxnID": "2D54418111A8DC318E8F0AD8C15271DA134FAF2CA97FFCAD795638AAFD0A3345", "PreviousTxnLgrSeq": 69055872 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rK3ctAQ3dxZmdQZ7JJt2PZBU7GZPwAkK1P", "RootIndex": "D2689873B8ACA42E1A4604F10FC3C663F623BFD2C84AC17B6197EC559A740086" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8685E9B25619DB6065EFB28795F249E8E399BC8C306F49A9D7B731FDCE6A7BDA" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rp8YVv74whPGdy9huBZHuPy5D3CRKgFFsj", "RootIndex": "868E54E8A65BB2C7FF4E79BBCE20741C77C54AEDE82EB60F8D88D98C0E147585" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "868E54E8A65BB2C7FF4E79BBCE20741C77C54AEDE82EB60F8D88D98C0E147585" } }, { "DeletedNode": { "FinalFields": { "Account": "rBqYpFjv2TLUiwx2Lr5vgGxoEgjhq1XnB5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653044364C4981A17", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "6AB5075304315CF845F71EE85F34298FEF2C3403DA8AC09BC6E8BA9D6EE85B50", "PreviousTxnLgrSeq": 68897281, "Sequence": 67575738, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "86C9ADA7563DE9C86B507639D89C74687722BA3AC0F101F105F78D6B71549B49", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5015645579.68313" }, "TakerPays": "60187746" } } }, { "DeletedNode": { "FinalFields": { "Account": "rPEfUi18WaHNarXbyX5UCcVACd1ZZhxAig", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "AB3026534174EA55615CF7A6BA32FB46D42BE7EF139EE5A1CB2949452856775A", "PreviousTxnLgrSeq": 68900301, "Sequence": 67880199, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "86D29CE4BBEA1555F7016FA2D47762F8A756281C71ADBDB8A0A0EA9C41F8C7DC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7000000000" }, "TakerPays": "70000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rsz7uAUXWXXeEfR55mUHFiWbdTomtXqdcv", "RootIndex": "6B1A8966F63AE3E365D4667F939E0C3217E9F5EB0AD711A4B4BD227C2033D772" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "86E44DF94A15B8F3ED773B4A917761BD204AAE543491B1E9CC6A3657D4102E2B" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-93931878392" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKKDmfji3MYEAtBZY3AQj8ghcuH1HXYpZC", "value": "9999844278063879e-1" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "dee" }, "LedgerEntryType": "RippleState", "LedgerIndex": "86E64FAF0D2AD1701FF3BCFF499F3054EFD9BAE56E3B4C7B690D20010DC4A489", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1878637567840000e-4" } }, "PreviousTxnID": "72677DBC7314391985E9B04A91511477181CCB34E3602FEBAAC1B4DE5C0B35D6", "PreviousTxnLgrSeq": 68300957 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "39605283980" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "d79", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsSog5gEY6GuTeCP4TAgdK7HkUHiSNxZqL", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "86EA9B02F2E2C3B4753F322B6137E97708EE634C4A099BEC4F133F15BEC55435", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "46616283980" } }, "PreviousTxnID": "7240CECAFA90526AB38573D46C46414C322C53222E4E025E8D4386F472CB9108", "PreviousTxnLgrSeq": 68991132 } }, { "DeletedNode": { "FinalFields": { "Account": "rUqgMfiCKp2L5Y1zobkQTgSdVYLp1PASt5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A7EA5B89873A8", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "A88BDE5802B04335FBFA0FE8B9454D1C21E0E60A0499C93813BF31302F2224EE", "PreviousTxnLgrSeq": 69022227, "Sequence": 68911099, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4223866751872249e-4" }, "TakerPays": "1247730238" }, "LedgerEntryType": "Offer", "LedgerIndex": "871DA06C6E14187FB2DD123794433720565AD2AE51138BB730688FE6FE7B8CE9" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "r4szgdizaCzaf1H9hBme8BYyQPhf2CbvXC", "RootIndex": "0D22EFCA118613C39DA5B28B851BF0A1E8EBB55EEDBD607D12F348CB747DADD3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "87424BE758AACD23A4790CB004E064C751F9237B5AB90531738FEDFB43576375" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rh8MNcxKuDcaMRuSj6P2rcMGxDiBqyZJJT", "RootIndex": "913268632F4A3E6A5B9454E6FE3F13666EFACB1D6A9A4A191E2A0FE4C4B0C81A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8765FB8150C0C410DBCF5A22E2E544958A19E20986AA63EA7D7E8FBF03B6EAA3" } }, { "ModifiedNode": { "FinalFields": { "Account": "rUZdJF5FhJJwrdjrcJ8vjfo7NySmeGRxxa", "Balance": "153161594", "Flags": 0, "OwnerCount": 38, "Sequence": 67514543 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8784B17391838ED62133AA32CDCA0550D1518B4A229979CACB06A3DD34035F03", "PreviousFields": { "Balance": "100994122", "OwnerCount": 39 }, "PreviousTxnID": "E69B3B4230393A676295E6565203205AB800F2A0EF38C3594A2AC14D7AB1604C", "PreviousTxnLgrSeq": 69059734 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "8", "Owner": "rnYbiXaSpChddFy4fdVYDtNscUsAfgaA4U", "RootIndex": "152B711B52510B654637BFE18671A971ABFCBC75AE22A96810BEE51E9554D656" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "878582434173CD65A843015D1C6CC4D1CF4BBF47ED0E220D5A0415DF64B3924B" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rDqBWAYNudfa8rBsr7YDsdDxeAoNRsxfPV", "RootIndex": "4CB1DAEE1D7D97E751FBBABF16B30C68868C3C4244711D396885A266F2F94586" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "87C5FE100D6C54EAEC1AF2251FBB068EDFEA580B7641FAAE486D5F39B896F18C" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6674878755" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "2b7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNaQPWNXMaNzEWKoidMaJqNskRUFKbKWM2", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "87CC9A3B26E79B8852CEE7B1EB303EAFBCCBBF04AE67E9C6689BB6775610282D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "DACDAD389A410CFBB5924928897DB266E68DA71FFD58FD18DCFD78D18625ACEB", "PreviousTxnLgrSeq": 67951283 } }, { "DeletedNode": { "FinalFields": { "Account": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652083062A19C7980", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "681D48844F978B4024393C6CBBB0E04224C32858E20A112660ED744DEA0137B3", "PreviousTxnLgrSeq": 69054955, "Sequence": 67440529, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "87E300A8B48E83199DC4B727C48E24A458DA4ECA2D2D6D1FA1F22BE7CB99C5B1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "230499999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "c", "IndexPrevious": "a", "Owner": "rN57KF6tqiqqc4agjC6nvZeQzovWYEPDCT", "RootIndex": "1DCC68268A7A870DCA81274691F301FB726081AD3A7170228907117D0396B6AE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "87E9C8BADE36FF3CCC278023F1D39B4CBCE164B1F0114C0B3C273D0F7B0D0E44" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "a", "Owner": "rNRoroUiCSQM3hcrEkwV5p6uCx8WSm3Mjy", "RootIndex": "56F60B4F769FC14452A80F52D16A02B10E336AB237D09646305DD4391D2EA5D0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "87FDBAA893AE7D8F5912B8547D9C77EA1FFF32534F27DCCF6A3659CF40B0A63E" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "6", "IndexPrevious": "4", "Owner": "rJMPwHXPwcnQCNmNbaRq2Lf5nbsivkCJrH", "RootIndex": "9FD2F72C0A5A9F055E703ED269845D5AFFCBD636254479210E616CF71A4C76C6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "880027D54033FFAA829C0D39BC98CA43E2214DBD7C9E44F063338DA715FE7541" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r9pfHFFyEEhtaDaMgVNtZZ8Ks7YL98ziRB", "RootIndex": "CFD3A32EDC18870A02CFD9305B7F13DDB32BD7EC94A7D002F599C866AB73B9B3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8811449595C6934ABB4778A69A152CEA19997C7E6D772C9490920AAC04FD4162" } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "882A4C42FCA1F3055E308EBF7C0F3B7A3AB1E85BB7A8B95D99935DA131C8AAA4", "PreviousTxnID": "0F80DCB7411CCFC171B51C7A608592E5525355A45084E2B341D56976F1FB9FF6", "PreviousTxnLgrSeq": 69064099 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rnSxpc5YM8agfwsEHN3F3EKN9WQ8yyTcAf", "RootIndex": "35876A279C896F0CD345A1FDFA956BE85B33848369E57B552C9689C3BE88D58D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8865360868D8A199EF359A60B94F9EA22DD43172FDF01B1273B0B48CFF37F9AD" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rBCS9nAyaFuM8LDym5gJGRxEqmmH9mRhxW", "RootIndex": "FDE97CE583D1CC3FE574513FB53B62A12747B92A843FE66F53B697BF997AC2E0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8896191552FE76CAD254C5E11172246F47203B8F30532B5A6B8BF4D7BFBD2EF4" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rGzfdR9pNTEgc3qiShH9q3zp7KpVXgVUq8", "RootIndex": "88B7EF612DE2A1B4CEFF2D6A0D902153A178A99FD5C9286BD24FEBDD27EC2C6F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "88B7EF612DE2A1B4CEFF2D6A0D902153A178A99FD5C9286BD24FEBDD27EC2C6F" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPEfUi18WaHNarXbyX5UCcVACd1ZZhxAig", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "b3d" }, "LedgerEntryType": "RippleState", "LedgerIndex": "88F6AC142F4E27B323FFA6B27F77068F293F92B87DCCF510A6C78A401AABD1B3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7000000000" } }, "PreviousTxnID": "4AEDD7751B0232B279503041CE1B19E166CC6371BB7231F160322D800F326A8E", "PreviousTxnLgrSeq": 68896658 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rG9EpCkxGBXowufUGyrVF8tT7ovkHBdMb4", "value": "1000000000000000e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ea2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "88FC01BA8DEAB2EA4DD057513E4F29DD913B5216C73C698C09BEDAA5C1112220", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5000484098.059855" } }, "PreviousTxnID": "9E4433C194C444E0085D3BA061B98A3510BD1B870DBF755876C2B75EFD32BC5B", "PreviousTxnLgrSeq": 68826636 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "4f8", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rzNhpkxVUc86h9CJyB1qssHYenzkVpyn7", "value": "1000000000000000e-4" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "891ADF0559484D08CEC06E3E2E73F7FC847C3ACE1F63E7EBF9E614893EE6B1D9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "24000000000" } }, "PreviousTxnID": "9260FDAC058C2890C9674AB53AE6CF6B4D9491A4B6876DAB1F3C7C461FF87B03", "PreviousTxnLgrSeq": 68922656 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rfBJiQAjbS9cyzVGKRxbde3eV4Sr5xeC8u", "RootIndex": "5928A0484E51AF53259A51A045404251E44460EF455087FD87F2A12DDE20DDED" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8925581CCC9FE857D6C9B1CE510A7874ED884B85A0CA43F1CEEBE414DAE6D200" } }, { "DeletedNode": { "FinalFields": { "Account": "rJeogNqHS69HkL8Le6zZoezAhGwpU4WPsc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DBD3A64D", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "0473C7A8F3DFBEF0A70256CF8A11549A4A3C91D2CB962A33C84A66DC78176164", "PreviousTxnLgrSeq": 68893782, "Sequence": 67482258, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8926AD74285397F1EAC70A2CFA5E38E2AE748676F010E5EF8B0939C981A777C7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6786484799" }, "TakerPays": "407189087" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rLMqPYdzd1JeWQ6PsjxFt4jXMZo8vDgJrS", "Balance": "664595546", "Flags": 0, "OwnerCount": 205, "Sequence": 67313187 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "892B1ABFD267DBE881333A3150915EDDBA49954E144F95DE2B2FCF73891D975E", "PreviousFields": { "OwnerCount": 206 }, "PreviousTxnID": "245A80CF3EA784328D18EE9179529021EBB9303C49BED4B5AEC78B0177D2BC09", "PreviousTxnLgrSeq": 69062235 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rsF1oN5xbuJQ3wPD87jjDvEde3VKwSrAue", "RootIndex": "7B23157E8DC0899570B1F4E9D7C4E4A516A0E980392CDF2FE45FCE6D033CA58B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "892E483C1DC20143827F8A7B6F14F8E2747634FB4420FF9B909CB021C6B225CE" } }, { "DeletedNode": { "FinalFields": { "Account": "rQHTzMfwiuyHEaGpCTUE68vbkTR6tXahXr", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26BACCE73", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "7394D2B21158D9B35478FA56A4A695C659B493B399BF03FEAEE0439EB3423290", "PreviousTxnLgrSeq": 68006033, "Sequence": 66479762, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "893481062AAB185C694E2EC4DFE8396D3B2FEBE7907B04A5B01FEBAD3D698D21", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10294850770.45" }, "TakerPays": "102948507" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rGa2XHaY793GMxMeexFcabjrc4w5vyrmPJ", "RootIndex": "FCE92AC28CC9019A6E1459DE331C9059643F6DA22439C6248BAA6A5DBB9AE592" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "89B5EFF641A4A18CB75417B731ED94D455390044E1430465291DF8F126384D4A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "10", "IndexPrevious": "e", "Owner": "rHSPavv1zYMxcqPUHEeQqwMSQgSzadAjM4", "RootIndex": "297A635A0AB0922FE2A5CCDA560BA80D2E6E2210EEFF005AE361D519B20AAE41" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "89F51E0731B5E013EAFD9B0EBBC73C17D072596605E46BC4BB41C4E98C55A0AB" } }, { "DeletedNode": { "FinalFields": { "Account": "rPhzFvrw8hkGkdzQvSRjuHuESLDqnd6xDg", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D3D0C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "A022EFF24BF32D9958F06055075FA2DAD97275339C07CEEB3F557C9CB9F2393F", "PreviousTxnLgrSeq": 68898865, "Sequence": 66579244, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8A121CA58272C19B18E151B34ADD107F66E894C0C3AC4EC50E6D2D7444F34E0D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "750000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rsSog5gEY6GuTeCP4TAgdK7HkUHiSNxZqL", "RootIndex": "B2291B76ED4C844B1CE294C9B015E0019F5A207C29D406EA0BCD8D5DD2831C05" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8A136E5F2DF65608CBFE73158E60E890DBD2B31898983DFEFE4377080145D27F" } }, { "ModifiedNode": { "FinalFields": { "Account": "rfFmXF3uT3Qc76CAH2cVExQXN6t7KFERu6", "Balance": "533675667", "Flags": 0, "OwnerCount": 67, "Sequence": 66750625 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8A23808A8390B0354479BBBA3C13BADBE785B4258E3E4B0BF1A855B8514750B6", "PreviousFields": { "Balance": "323675667", "OwnerCount": 68 }, "PreviousTxnID": "3E242503E6183410AA6BB739EB75BBB1A4ED88EF97ACD384EA2BF351064249A6", "PreviousTxnLgrSeq": 69061831 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rMQGzm5niy3VzeWEqokwb28toV137fbiYJ", "RootIndex": "EFA6610BBABD663B21AFE7873CE5471AF3890518000784C17D02786B2A373F9E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8A2607C6BBD3355B45919C3235AB40DD46461DBAA66EA87132F4A0F2F1BF2809" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "3e0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDSSG7NwYYV545mfcRdVExpAU6ys9CqoCk", "value": "10000000000" }, "LowNode": "5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8A5D4BFDFCF76B1D8FAB3B1D69D5ABD623E4926F37A3CC8C8BBA147D16A72F23", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "99EE605FC6ABB4514BAC6C3D644160D34C6F127E91B8F75D250C7B0E782CFC89", "PreviousTxnLgrSeq": 67975429 } }, { "DeletedNode": { "FinalFields": { "Account": "rshXc1NnrPiNRvKbbmnfgQpiSGYugiFUG7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "B035BAB85F286AB483CED796BCF07393BCD4FDF24FF802BB9F92D918C24AD026", "PreviousTxnLgrSeq": 69013489, "Sequence": 68652658, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8A9460AB9A4851BAD956745BE60C9E7B3B1A0C025A6957A1B75BFBA58BE25DA2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "120000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHLNuze17yJvjKohtAWTiakAUWFDp81Nbv", "value": "9999688558266536e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e1f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8A9F76BBCC87868C9CE8F332ADF384365C8109D4E6ED13241160D3201244455C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20126032579.61783" } }, "PreviousTxnID": "9780B7D2E906D67428496565FE2AF60C2A4F47408DBA9A9A3DE477DC67652717", "PreviousTxnLgrSeq": 68897717 } }, { "DeletedNode": { "FinalFields": { "Account": "rszRAoxvAYy352HATq5bx3YGKpMBjeW1L7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E31CBA1CC3078", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "003DCF455112328F0E9FC49E8D8A39638300F298A6571DA1F2CABE3C3AD4E5B6", "PreviousTxnLgrSeq": 68897755, "Sequence": 66950901, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8AC73984EC36E252149F55CDAF18D774505C5844F820DC076DE8CD8FD8AEA0CB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "21481866193" }, "TakerPays": "182574380" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "12", "IndexPrevious": "10", "Owner": "rMRX7LEEzj9s3Hm3fysfBXnkNzAaRbDawT", "RootIndex": "39A4AB7B883B53EA6C4EB60BD48C7A448D85D4AE2D233BCD0E3DCD995CA633F3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8B31778ADE46838C5C420390D9560238F710B4C8B444E13C7C816947FE9AF83F" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "f", "IndexPrevious": "d", "Owner": "rN9HGJaVB4wFwWcj5tTqzkWtHjxxCZiHA7", "RootIndex": "822DAE42C141FBF63DDD163252EF9D5036D48DE0657E692DF45149A6AE4B9056" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8B4C8E645A1BD6ED4F1DD03742270B19BE3682FDF7C6F5353648E2F1506EF4BC" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "a", "IndexPrevious": "8", "Owner": "rN8rfe7hU4CCkmEiDkj9fg8pgBp5fa8p2j", "RootIndex": "29319BA089997650595D4CC417AA8C13A285061CF448C6EAC54550D3B3AF010B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8B4CBA396D004AB680970E33DB1DA74247CC9A3C2BBDF9E0D7B8066D085B1839" } }, { "ModifiedNode": { "FinalFields": { "Account": "rMQGzm5niy3VzeWEqokwb28toV137fbiYJ", "Balance": "659971687", "Flags": 0, "OwnerCount": 40, "Sequence": 67388282 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8B867D35BC96DE01DF14DAE5796EBBE4BA57CFF0DFED34B2A8B7E6BD645CEAD5", "PreviousFields": { "Balance": "93999973", "OwnerCount": 42 }, "PreviousTxnID": "E0CD6355792E4552EB5D98BD0BB0C6A44E8BF580F6FE881DE4F7B92AA303D934", "PreviousTxnLgrSeq": 69015120 } }, { "DeletedNode": { "FinalFields": { "Account": "rKKDmfji3MYEAtBZY3AQj8ghcuH1HXYpZC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72EB13AE1", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "8D49E8F83AC72530FA22131C8EA5B5D6AF0502CBE36BDB79CE576626E381DC62", "PreviousTxnLgrSeq": 68901392, "Sequence": 67520685, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8B8D8F8F42E1FF80FAA4587C1FC8FFBAB971E106F90027EAAE98E7BBEA1F3DAF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "93931878392" }, "TakerPays": "610557209" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c46", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUHsUfjv1Ai9KiT6R3WzLcAKvvPLao6fiK", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8BB77FAEC89C7554884EE7FD0B37D74431208754A4682986158567B9CDB73BFC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "23357969598" } }, "PreviousTxnID": "6607AA8B47C5A09703328966E4927134A00FE7D8885B444A13056980C5C28219", "PreviousTxnLgrSeq": 68037331 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rpq6ooRTok73Udp4D58zesfDJeYM1t5s8C", "RootIndex": "F6C1A9A92D2C7D9C2BD5ABE956113762015D91AABDC214A09E7CD9FD9E0E6AB6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8BE5BFE77F3685C37CDCE09721109C400B880C8277F19EE7646028FF798E78CA" } }, { "DeletedNode": { "FinalFields": { "Account": "rJ72ZDPTsPvQBUxDvaQd9t2mbD8BrogpBS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C1102138DB094", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "7E2BE5B6405D855D4F2D5513F091672FA5AE73C61D02376CE36E832BECD14C16", "PreviousTxnLgrSeq": 68898385, "Sequence": 67690999, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8BF23735D3443BDF3E5AA7D1ABA2255ADE16A82C94D44BF681AB2597FBA57529", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "18486911984.01258" }, "TakerPays": "146046604" } } }, { "DeletedNode": { "FinalFields": { "Account": "rNRaTAdpRUh1YNTBdCu6JXdQZX2pfWo3FU", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA50921E1", "BookNode": "0", "Expiration": 722773776, "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "C7E72DBC181B92CF27855A6CC85AFBEB92509A36B2C1A5DAA05443C7365417C2", "PreviousTxnLgrSeq": 67956978, "Sequence": 66712392, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4594452384.39426" }, "TakerPays": "45944524" }, "LedgerEntryType": "Offer", "LedgerIndex": "8C1483697D24A7FBF6FDE4B55B8864FF2DF00F68111FC8B3029897A6AF8AD3B3" } }, { "ModifiedNode": { "FinalFields": { "Account": "ra1aHhcQxB9sHWm7ppBMKEQWs4FTfRGZAg", "Balance": "497558237", "Flags": 0, "OwnerCount": 187, "Sequence": 66996722 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8C90372D6DB0365FE7ED337653D6EB2EEF5CF2047C3D3A722C45B7EC3D7689C5", "PreviousFields": { "Balance": "421585238", "OwnerCount": 190 }, "PreviousTxnID": "7EC6F3D6D4BBC32FD55EA7C6000870115DE6EDE068BC51D17815B75AD4205206", "PreviousTxnLgrSeq": 69064134 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e7c", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnhd3RdnLUZY4sYxS2p5zTJk24zHB7VyUo", "value": "9999610698224578e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8C9BF9E020CB909E4D14AD041AD58987B6C89951271AFF4F5E5DDF9AE6F6AC67", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3068903138.888889" } }, "PreviousTxnID": "9C14B9C58E532284B858272D5667323B8AA6C95E2DEEF0AC61A6338E0AA70391", "PreviousTxnLgrSeq": 69044783 } }, { "DeletedNode": { "FinalFields": { "Account": "r4xMZEgWZaocA566U2xgUqKcTnXKZkBLLi", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218838370809FAB", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "A6EDF3153C643918A17F2499D422F7D94FB1B774876122BB1567F9BC5CE342BA", "PreviousTxnLgrSeq": 68987190, "Sequence": 68654325, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8CBFA863AEA59F688B763BA6C6C0B6BC88DB59C1ACEDE517889AD1BD30F16F77", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "19362565818.18181" }, "TakerPays": "133601704" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "r9dgnNCff83iCn4xXUpnLndv4tuCY23b4P", "RootIndex": "8CE812238140B6B595CADE333259D8A0841974062BA3A453D8C0D1C9B904C324" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8CE812238140B6B595CADE333259D8A0841974062BA3A453D8C0D1C9B904C324" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "2d8", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3uzGoy1vgEEdULUkLBRJXaYfww3nzYP27", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8CED23452B605752FA85A849A96E94D64627C7DC9DDECE2EBA5144DB8D0A331F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "3C11F606F47ECC87332393BE1EB6C14B9F4F6D43076BC5B18039680F9178B199", "PreviousTxnLgrSeq": 67951466 } }, { "DeletedNode": { "FinalFields": { "Account": "r9N61ut2QDA3sThiawsRjj3A7gvz4ZGM2L", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521658B8BCA70338", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "295F948E361781843BE241B720AC4E49759181DE1DA86E0B3C36F1678D50FF64", "PreviousTxnLgrSeq": 68899294, "Sequence": 67750589, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8CEE3776B78F8A70DCBFEC5F0DB7D358FB7CF2F9D2F5C041975E365631D39D60", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3033952329.40077" }, "TakerPays": "19083560" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rszRAoxvAYy352HATq5bx3YGKpMBjeW1L7", "Balance": "465753428", "Flags": 0, "OwnerCount": 124, "Sequence": 66950961 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8D04C98DC1B2E0B97A5E40C6D7D946AB3560572B36127A29250679DAC3F05E9F", "PreviousFields": { "Balance": "283179048", "OwnerCount": 125 }, "PreviousTxnID": "7DD92C5AD42CBE0DE25E4060F637A1C45C79DF52B7FE6C27827B00EBAB81E286", "PreviousTxnLgrSeq": 69051610 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rpVr26FVpK1G1u8vyMwsKnpXn7iycrYise", "RootIndex": "8ADEF44B796026E475DAE5AA81BEEC7626F4A38334479937A63C4357851DFDE3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8D075886A0361A596F66E24EF123B6B3D164B2BDE5F1FCB10341B43934EC8C3A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "RootIndex": "DAE42822BBC8D9446224B0B3E53894A733650689371B860F29D7E9E0A7FA8F93" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8D3199661AC9CB3F7C87D09BEA1C0E852843E3A1EAB8434200739DAFE5398A98" } }, { "ModifiedNode": { "FinalFields": { "Account": "rD5TVx1akARpWNKumsadd69Wask2L69v7E", "Balance": "410867584", "Flags": 0, "OwnerCount": 96, "Sequence": 66269678 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8D5D1646D76E4A68E16A80CA2DC64633A97EECA440F486B63E59A16B017BEFAC", "PreviousFields": { "Balance": "377367584", "OwnerCount": 97 }, "PreviousTxnID": "E29BEBE65EFB01F04F2CD7CB0040055A0E1954F4E725278619BE8E480199C94F", "PreviousTxnLgrSeq": 69050021 } }, { "DeletedNode": { "FinalFields": { "Account": "rMQF7GUuJQHvrEkXkcySkEvb4fbsGoqGqC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C6F3B4077238D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "63E8C55B83ACBD791A5AA523742EA23C1678A71D5DF48C42C66E75512E98F71F", "PreviousTxnLgrSeq": 69016825, "Sequence": 67874792, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8D7CFF0C7D38324E823F8F360B039258AA43A694142A90D96F9009A3C5C8DCA7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "11363116299.24879" }, "TakerPays": "39770907" } } }, { "DeletedNode": { "FinalFields": { "Account": "r4YqG4eX9uskEYbdZVejyRmkBgM9pSo8q5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B0CE5D27A000", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "1520050B0B4709A81B5283D0ACA3EF45086FC7F3F600ECF89D6BCAC7D123056D", "PreviousTxnLgrSeq": 68968010, "Sequence": 66712890, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8DAB0437ACC31CC6FDA4F3E22CD83AA5616CD44BD0ED296995EF641CA907644E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1150000000000000e-4" }, "TakerPays": "540270000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rJFmgWo13y1o6C42H1LC7qDWcu7Z38QaAd", "RootIndex": "C72A94BAD2392E314FD33F4CBEC4BABDCDB843A045D21A7466319730886A6ABC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8DAD8B2CA755F6F8EC5C1FE855CB7005ED76C828B5A611FB0DF64FCE08BBBAD6" } }, { "ModifiedNode": { "FinalFields": { "Account": "rDDmwBnxoXcq7PLUXTvsfVHhEqGpNCS138", "Balance": "121063052", "Flags": 0, "OwnerCount": 45, "Sequence": 67491463 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8DD6CD17EB2465E85E28661A73E05D2E20585FB90223D831662670C594045D7B", "PreviousFields": { "Balance": "112063052", "OwnerCount": 46 }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "DeletedNode": { "FinalFields": { "Account": "rnu8qs15n6d9Xj21aBXxjdgyWz5cqNXqkf", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA931A0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "E7BD2BB3D90389AD6C2B245CDED88A9A3AEBDC13653F03A1E889FE044CE40B2E", "PreviousTxnLgrSeq": 69034075, "Sequence": 65843928, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8E12430D1D0505781E08ED9C20107C8E04FAD1EB8786B7724A62769AA968074A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "40000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPWjueM7txwURGpJDWF9yQRn8cVmWQTDnE", "value": "1000000000000000e-1" }, "HighNode": "8", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e85" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8E12FEC126E3F9A8D8329228DBA8D32AB0030BA3806360F97E0A7AD769FE04CA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-14389666508.9877" } }, "PreviousTxnID": "C089CBB86E6B11FC075BD5B440D012BF7BD82B006EAEC586B292293F817DD3ED", "PreviousTxnLgrSeq": 68764399 } }, { "ModifiedNode": { "FinalFields": { "Account": "rPCYDR6z5MW5EvxVzPhVa6cfLyckEDWs5T", "Balance": "1903875184", "Flags": 0, "OwnerCount": 452, "Sequence": 67105346 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8E2D61BC636AF10B44C218A2244434C5DA671C39E91964F18273A00760B63691", "PreviousFields": { "Balance": "1780077946", "OwnerCount": 453 }, "PreviousTxnID": "B85477204508E4DF79AFE567FF78AD205DC4D6B21EAB0CC3FAF110C293CC8370", "PreviousTxnLgrSeq": 69063937 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGFCR192crZ5FBYgZPMAZCeBzTrkqeFXqh", "Balance": "266813611", "Flags": 0, "OwnerCount": 8, "Sequence": 68269308 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8E445B71D47D118CA0556D76C6495CEF414F97BE6B558F89E3FCBEDD3AA797D6", "PreviousFields": { "Balance": "36972639", "OwnerCount": 9 }, "PreviousTxnID": "BA4BB119A1FA9FB2DAC355A626C52C5664BBE0F58F9ECB30133765EA181670A7", "PreviousTxnLgrSeq": 69051503 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "8", "IndexPrevious": "6", "Owner": "r7ouMSA1S6pggGmsYRZewYQzCP7XgLiEx", "RootIndex": "5B0234A08B0BAEC66DF1010AA5B53F83613F75D1E0DE932093290E8D886277F9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8E4475FC008DEEC090A198432AA80462AD2D48759ED86A570031FEB73F523018" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "96.888" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e52", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raHjNXUyRvwxN5Vr5NtQ5pbFVgbM7kqLrP", "value": "9999610698359899e-1" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8E4DAAF3BAAC6F7304C22A1AE48F2430B12E5902FF093AA34562E6D2B1E7F7AC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4215723963768880e-4" } }, "PreviousTxnID": "02E4E599E593D70FFC488B55C8380965951235055DC8B814C324EC7670D07507", "PreviousTxnLgrSeq": 69025909 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rG7WNJTTMRQma1eeWs5CDv8LwsLb3QQhvv", "RootIndex": "E13AABA1FCD0DC872BE8B14C112C1DB85B441745E3A0795FCAE47C3BF53FA1AA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8E51FDB1AA650991645977F670AC664FF9F40B3B06F5534FABEB8CE319AA4017" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rdjYAQLjaChAyFx1sVLn4uy3mrSZy2f24", "RootIndex": "8E8236388A2E99B8D577AB0340D86082C0EACC6A7CABC290976AD2A9E58E4419" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8E8236388A2E99B8D577AB0340D86082C0EACC6A7CABC290976AD2A9E58E4419" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rpCmDBk3dADpY9cb77D1hA4NHYnn7YbJM1", "RootIndex": "102FCB13221B1FA7DBC279908C881637EC908E7CFC9002AB945E38628851B30F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8EC9FF1230C493D2FECE02C6BA5A7684C74210A863C3214CA5254755F098FFCB" } }, { "ModifiedNode": { "FinalFields": { "Account": "rsz7uAUXWXXeEfR55mUHFiWbdTomtXqdcv", "Balance": "189526572", "Flags": 0, "OwnerCount": 74, "Sequence": 67858764 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8F22FF94B8C9738548F7AE7A8A697F784B1CC7302F451CF6332ED1D7D0749FF7", "PreviousFields": { "Balance": "174390223", "OwnerCount": 75 }, "PreviousTxnID": "06381B33EE4B3D61BABE3C6AF2CA3933AC63AC21ED6D0EA30EFF6CF2188E39D2", "PreviousTxnLgrSeq": 69063826 } }, { "DeletedNode": { "FinalFields": { "Account": "raxn3rqqdW28ZVrFAQ33AUrvdaTSv34DSX", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26AB38C66", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "FDB80739A2E6E0CFEF0753FBAD11F4E0944C70E51DBF77000D455F02502B529F", "PreviousTxnLgrSeq": 67971771, "Sequence": 66385850, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "77859898" }, "LedgerEntryType": "Offer", "LedgerIndex": "8F34A5485D6A6FF2569181DF6393526FC7A7FEC8CEDB31741ACB385C65B239CE" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ee0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rh8MNcxKuDcaMRuSj6P2rcMGxDiBqyZJJT", "value": "1000000000000000e-1" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8F6D83ECFF6AC96D378CEEF3FCAD43BF3BB2D1D63450E137460B5FA5BF3854AB", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2241619378153860e-4" } }, "PreviousTxnID": "669A0EE9EE4902211601661BFA84B651F4FE399E98089349002242BA3BE2E0D3", "PreviousTxnLgrSeq": 69053203 } }, { "ModifiedNode": { "FinalFields": { "Account": "rnEA5VmDp13iDZdcGUg2X2nzYkaKKDrf86", "Balance": "461056355", "Flags": 0, "OwnerCount": 25, "Sequence": 67525877 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8F86D31780CC8598B47FEDAE66D116C2D36741FB86D372EBC3541574F19298EB", "PreviousFields": { "Balance": "86290553", "OwnerCount": 27 }, "PreviousTxnID": "EBF38113476922BF5BA289940F1027132C7C63950F87B6BCB010666188546340", "PreviousTxnLgrSeq": 69063697 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "13244028037.43416" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "835", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rC4M78e2ktZz8QwB5SUSEeeeSi5rcnxrJ", "value": "9999999999999999e-1" }, "LowNode": "9" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8FC8CAEC43FDB7D05FE0F882BFC25B68DC1F078433F7A770FA6A12DC48579D46", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "54488056074.86833" } }, "PreviousTxnID": "808483DE8C02BB3297A29B4BECB913C6DC226D403087E9AFA8A0E7947CD351A3", "PreviousTxnLgrSeq": 68991025 } }, { "DeletedNode": { "FinalFields": { "Account": "rNdfpBhUB1ygnu4z7ebbqLBQH5K8zejbu6", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26FAD66FA", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "AA0224E4EFB45ED6D563E06971CBF6F0B8283D89B8025C802D230D821E528F14", "PreviousTxnLgrSeq": 68198420, "Sequence": 67194292, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "8FEFDF70C04F4A464A40F28CE9099FC44FBB2D88106B42CB9B9762B0F1046351", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "62287918928" }, "TakerPays": "6228791892" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rfq8N8xR3stwknY7Smup425CUFCjsTwcWP", "RootIndex": "C9B0218036E7A5B704E0BEFC8D5439F67D44ECED18963082896AF65D15B592EA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "8FF429FE29E036AF74AD3DC6A130EF06875D79CDAEF8B249B199AFD98AD22EB2" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "11", "IndexPrevious": "f", "Owner": "rJw1L2RZTiPTQJSF7KmstuGrdNrTmdvAjb", "RootIndex": "5D4B721E3B76FE2E0C14041755528E25EBBB73DF149D73622C0E7A024CC0EB64" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "90014A87370B98AE491643529966A9D4B4A7566F30FEE3E586E7956D6FB0CD8A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "6", "IndexPrevious": "4", "Owner": "rJQTrHKExfeCjschk5MGwPZuditZ8vdWnD", "RootIndex": "02462BE928A166B37F37B65644E7812B423EFA3A719D16843C93395E577601F7" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "902B1B5AA65BB76588C0504E372312140AC838CEB9BFE88F3279972AD463D4EB" } }, { "DeletedNode": { "FinalFields": { "Account": "ra1aHhcQxB9sHWm7ppBMKEQWs4FTfRGZAg", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222761927657C27", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "45D4ED30B65E2110D25338EA6644B9ACC19CE6AEF589C9AB2D0BC43F17554D59", "PreviousTxnLgrSeq": 68897156, "Sequence": 66996590, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "902CAA2A22E92E3831B22A3D6B06BE8F81C718B54D76995A124F836BE8B7BE73", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2600000000" }, "TakerPays": "25219999" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEJjxWqDiG1H1PDqXXnwdHjxAUTnVGmrDS", "value": "1000000000000000e-4" }, "HighNode": "7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e21" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9066C6B5865670FAA951BF0737EC7147A03C93F42E77B65FF8A23B303DC5A77F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-6343856961.979338" } }, "PreviousTxnID": "D0A839E1B9D5B1A150C4B07F1B39E7D501953279E19F512ED5AD33D494B947EA", "PreviousTxnLgrSeq": 68899027 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rDwdy5963o51eDFKzgJ23VJUy44AX3QrS6", "RootIndex": "0CD447767BB3C0A3D243BA94388B837204C6852387EAFF4B9A44A0A48C80C5CD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9078B56B66F334C0268F806D7E9B889D5FA9CC2D9EEE25E0A031CE2F3CAC4440" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLBBX2NYwmoiRB68BQP3eo15BbaYtR8qdK", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "5c5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "907A824516AE3E05C26B9840906A35FE583440DDB29D6955D983EFCAE97880E4", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "9E0FDE600D96D3A7FD8CC4F2E9A4F8112D7454008FA2C312BF96F37F1E9613FE", "PreviousTxnLgrSeq": 68000502 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rNCESwgSpY1pUyhQGzGd7T38zXXzxUCLLj", "RootIndex": "90ACB709A496171CD81FFBDB666F63DE3FD1FBC6269F7A9E5F77A2BA51EA5E95" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "90ACB709A496171CD81FFBDB666F63DE3FD1FBC6269F7A9E5F77A2BA51EA5E95" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "7", "Owner": "rJmWpXLdftZbNdPMYkezgKmEya6R6cAt7T", "RootIndex": "0A887E6C4C421FD4F584746E5932C3025BEBA2E192D8324A0EEA33EBC4EDBD6B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "90BC8F9E74CA0FD6BC40433A2AD516FB56A9879DDFC0E83560D9F7223714725D" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "b", "Owner": "rHHviosMrm1hi4Nfm7MTipMw2oeEQRTeod", "RootIndex": "D328BE27A8ADCB49C5630044BC76FEEF5D15AA7B44CDE83B9594167A145F8DD8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "90D3DCE2DEB33AB44424764DF2E008B78A19FAFFD62349422D26132241A574A0" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eeb", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDTDTzVK47KCcGmiywZHhKsDP7323fqGGL", "value": "9999610698224570e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "911124D021EF469698FF1C1ACD8B52413C8703EDDF43E5537B9DB954F4F6CD6B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "11000000000" } }, "PreviousTxnID": "E644339C3577108557CE43BC89F2FD81B5D0250CA56B9E05C6B9B24CD0C6CFA0", "PreviousTxnLgrSeq": 68922765 } }, { "DeletedNode": { "FinalFields": { "Account": "rGRyfRcJ7cSYSu6rw5VpNJReEZt9Gzy9a7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D9316EC0000", "BookNode": "0", "Flags": 0, "OwnerNode": "2", "PreviousTxnID": "D7AF23B03AAD8D8801BD8B1200D65E7A132D5936C895ECB91B93F0207535CD41", "PreviousTxnLgrSeq": 68990951, "Sequence": 67157738, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9143CDC59F5331B73E9CB8C3D35BB4721AD4567F9B290396EBB942A50F435A51", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4700000000" }, "TakerPays": "22560000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rLFVckNbciXAqgedJM92yZX7653rXcn4JZ", "RootIndex": "C8327D5445C44DCB81098FC212E068E5256E06DE1F6B3D91B2C54E3A3A49629D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9160C72A389C43454DD96628309622BAB1DAC3420F651664770A5E9B015D94B2" } }, { "ModifiedNode": { "FinalFields": { "Account": "r4DDKcQaxRVhr17DMzNSrAYBvarHRXBJg5", "Balance": "169734298", "Flags": 0, "OwnerCount": 59, "Sequence": 67317148 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "916311337B94228EB104F9CB7DA0FD22EB3BF6C44CF6C040BF26747F78EF82FC", "PreviousFields": { "Balance": "130598615", "OwnerCount": 60 }, "PreviousTxnID": "71DA9DA69E4D326252F42FD26963C499CA75F4963BE4EE027496D288195FBA73", "PreviousTxnLgrSeq": 69063539 } }, { "DeletedNode": { "FinalFields": { "Account": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049159B00C8AA4", "BookNode": "0", "Expiration": 723610848, "Flags": 0, "OwnerNode": "c", "PreviousTxnID": "799B6BE0F830A026BBB49806F9092AE5FA3826A62E7FBE8AAECBEFAEC0312CB0", "PreviousTxnLgrSeq": 68154171, "Sequence": 1412, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "919A80E2A54ACE706274991FEF8315F5E19DB913BE6DE1FF87A205A98F5E68C7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1555555540000000e-4" }, "TakerPays": "2000000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rpUjTJzaJN22XoKjav3YSk3GH9t3GZqK8N", "RootIndex": "919A94F94235AB5BD99971FA41095BA95FA3E89503A417650FB6A12FF2BFC102" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "919A94F94235AB5BD99971FA41095BA95FA3E89503A417650FB6A12FF2BFC102" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ecd", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rshXc1NnrPiNRvKbbmnfgQpiSGYugiFUG7", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "919D5CAE5C652CA11EA1D2203CA59EEA018B7473BBADF1DC3820A109264E9C2C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "20000000000" } }, "PreviousTxnID": "9260FDAC058C2890C9674AB53AE6CF6B4D9491A4B6876DAB1F3C7C461FF87B03", "PreviousTxnLgrSeq": 68922656 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4282294426.3" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "1e8", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsGTbAufvBkkN5xpaKZtEMCagAW5SkJEUL", "value": "1000000000000000" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "91E441E3B42DC84C570950E2A99CFA8181150D71832E20A6FE351BA18BB756AD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "13354149C4A4F58B8F896F37A14B9C5D638BF3762182FB18A729E90B5BD74E61", "PreviousTxnLgrSeq": 68000941 } }, { "DeletedNode": { "FinalFields": { "Account": "rPBCCKXYaB9eBeVKenvGeGKywHUVHFQmSS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5950DF00", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "D592CC5B0A72F16D6AE93B2EC7688651A87BD79A0090816A7D195ADB05BDBCD1", "PreviousTxnLgrSeq": 68897310, "Sequence": 67544539, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "92079FE6B2192331C0AF6AF63A7E953807B1807B251D60447B1985276D5AA2F3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "98999999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "d", "IndexPrevious": "b", "Owner": "rC4M78e2ktZz8QwB5SUSEeeeSi5rcnxrJ", "RootIndex": "35E481FF021EB94C809B1D4A952A1AE9563777CCB354A61030354C2CEF3080EE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "92086C0FAA586D21483CDCF40C6B51A1578EFED9B29FE40EFC04EBBE721FC8F1" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rLMqPYdzd1JeWQ6PsjxFt4jXMZo8vDgJrS", "RootIndex": "35ECD189742E7DD941ED19DCBCEAEF9F6EB3B0FBCD808AB016BB4AF60C450C73" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "920FA960F27604DCFD59498902F4AD179541853CF064800A043BB28D82F2AD64" } }, { "DeletedNode": { "FinalFields": { "Account": "rA1sVxrZ16rSr1SrxUfsHAR592J2X4yVf", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26F41D1BF", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "E88BB803B4AFDAD373C05447312D91DDBD44DDB07AD1F276761C2CEB00AFC589", "PreviousTxnLgrSeq": 68155502, "Sequence": 67344711, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "79184989866" }, "TakerPays": "791849898" }, "LedgerEntryType": "Offer", "LedgerIndex": "9249BCFBB196AD755BB464AF08D9FCB5C682157CE3059195F9F6BF89D6C18237" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "rPSYhGCFb4y7ntd2VaJzTS4eqiw91wynZn", "RootIndex": "646052D076294C36B492BF0EC95E7B772400818712A8359B9AF4ACCEFD64520B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9255C41DD68271203C4642857456BF845D2BFCE9B49AA1BC2651992B314B66F8" } }, { "ModifiedNode": { "FinalFields": { "Account": "rhEwjxZkMbARLTQmMsR7N6MxRDUUKLF1RP", "Balance": "1457879430", "Flags": 0, "OwnerCount": 386, "Sequence": 67389570 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "92A9E2244C25C6575A8A190C70E026839E87D546661810815EBA0AAD661D9EC9", "PreviousFields": { "Balance": "836117630", "OwnerCount": 387 }, "PreviousTxnID": "CCDDE6CAB175FE323E92982D6CECD8E16AB1A401426433AFFF06BFD1C18F0D44", "PreviousTxnLgrSeq": 69062660 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "rzHXP1zuBviNtiogFMnNDcoUg88bprjNy", "RootIndex": "9301032EEFBFA85B0DC8595A1F5F8CF18CCEDCEF79BD9492DFDB8FF49927596E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9301032EEFBFA85B0DC8595A1F5F8CF18CCEDCEF79BD9492DFDB8FF49927596E" } }, { "ModifiedNode": { "FinalFields": { "Account": "rGgYjYE7aH7sY7uc9BHpks2NDgVkptYkDh", "Balance": "229406384", "Flags": 0, "OwnerCount": 80, "Sequence": 67480751 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9304B837C1754EBA6E88B3E1764EA4A07D2BA9044AB93024852E05C17B7F10DC", "PreviousFields": { "Balance": "174406384", "OwnerCount": 82 }, "PreviousTxnID": "B1B56A1D184D85814FA0054EACB5EE5EA4549CF137E01227597259FD3A06BFEB", "PreviousTxnLgrSeq": 69044856 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-31039046763.62662" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4F6d9gkY5JPEkDEmUwcLgGX2NSV6o7DyR", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "97" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9327C09BBF37F75EE8AE4716DBB97CFFA9DA48E6B7BFD3B06A75AA9A2BEA6E42", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-52815511103.62662" } }, "PreviousTxnID": "6BC19370431EAFA2D1FFE741C0B7BED3D3858CD4AADF5B6D7C3A5AF73D5148A3", "PreviousTxnLgrSeq": 68899329 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rQDZDYodywYJULXJtv68QyoDbkV5EZgh9s", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "4fc" }, "LedgerEntryType": "RippleState", "LedgerIndex": "934A31616874C89536E2303D8F46CD7AA1D00A856E0C165DF489DE476EEC867F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-88771558812.8656" } }, "PreviousTxnID": "82573BAB4354466C679F0B35F488861B2CFB2C244907229E05E76C15D35DC191", "PreviousTxnLgrSeq": 68943397 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rUN6cc1UZw3jJRFAQpzYZdwA75aKR6qJE1", "RootIndex": "CA453E2FFF0E501AEC3B4107651F9B86D9B639E2D060D2F4914252D88D6BFE2A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "934AF0C5D050E8991E13DFE10FC6ABBEF2EE44C03C4A3D548B6DCAD3D95FDED3" } }, { "DeletedNode": { "FinalFields": { "Account": "rqben5VgPyij1hAY4bi4yPyp3vf6GgY3z", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5203F5780", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "0CA439269500896934E2A54594889A2557C95248020B1EC0F631A1D22C8B3AD9", "PreviousTxnLgrSeq": 68966843, "Sequence": 67935100, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1666666666.65" }, "TakerPays": "13333333" }, "LedgerEntryType": "Offer", "LedgerIndex": "936E83C62FF02F3C06AA8C3212C6FE0E8D1699A25E6B975C51AD0BE41EAB7770", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9999999999.9" }, "TakerPays": "79999999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rsVD9Hdd3p4LMC7vUwvx75uNLY3d3eiE2b", "RootIndex": "EC9547207E43DF1A900D61C038EC301960A5207C188041B2F544A5122E56D8D5" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "939AED08E4C535E088A6B559E89B9E8E814F6CD56CAC6ACE791BEC2FD8B22248" } }, { "DeletedNode": { "FinalFields": { "Account": "rDjnNyWymW4pUzukDcEtmySixuXR4RLsKV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "BookNode": "0", "Expiration": 723722272, "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "D6BF189A67B22328859061BB42BFE663CF74485CDBA408B27FF3C03B199E6FE2", "PreviousTxnLgrSeq": 68181227, "Sequence": 67708007, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785000000" }, "TakerPays": "62280000" }, "LedgerEntryType": "Offer", "LedgerIndex": "93AA9A62BFF21C35FF1ABDB5157EC3A120B78CB7CDF4D0838AE4FF647E2DEF31" } }, { "ModifiedNode": { "FinalFields": { "Account": "rwCzLwdFp6DLPMfZRTUN67UB79XbbmYt2o", "Balance": "1306985341", "Flags": 0, "OwnerCount": 28, "Sequence": 67150583 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "93C73C5D1F627738BA38ACA7A02F35D044806D3B7AC6CA5433B5D365DA750DA6", "PreviousFields": { "Balance": "506985341", "OwnerCount": 30 }, "PreviousTxnID": "653636FD029FF6A3620E6BD82B418A9E43310B41015D22FA3E21896C708CB5AE", "PreviousTxnLgrSeq": 69059990 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "r9bsFjjrcnmfwEe83kG4LNhBUAcL3af2Bf", "RootIndex": "69F140EA77614B7B841610309B586AE7A0CB3AD0F2CB745A7E58C197ACBFC5F6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "944CAE81374047E51BA3367DC4D499F12D508A04DA759249B31F1DEAEAEC35D4" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-93432078395.2398" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEay1pxUyiL4ru86hJLv4bKCzwm8EL4Mzw", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "38a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "948DFAB6CC809B3D558C128B998D5ADD9FD58AB68332B76C5471FA7104088192", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1902670783952398e-4" } }, "PreviousTxnID": "2BB96DD689AFCE2E32AA99C1DFEDBD9B58E5519471F251591F02E07DCBE96264", "PreviousTxnLgrSeq": 68899342 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rpGhnBcEyRdDNyy4AD2BwyZgWE4ERu8eqC", "RootIndex": "A1780603D2E9336F99886893CA98C7CE6D392E960F3F4E5A5857558BC2359694" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "94C597C44370A412A14C057EDCF14D8768A0844D54208DCAFFD3558F4E7A8B27" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10000000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGBMsWXEYwQCyqK6QsrivTQsACXbfL1735", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "92d" }, "LedgerEntryType": "RippleState", "LedgerIndex": "94C8059F56E24652176CC82847785B1F82D469C8C9D326AC1EF3B2ACF32B90FF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-18000000000" } }, "PreviousTxnID": "20431A60B0E053A70C6756B4BBADEF5E600E86C214481A81FF4853DAC6CB63DB", "PreviousTxnLgrSeq": 69044755 } }, { "DeletedNode": { "FinalFields": { "Account": "rEX4EMcBRESCnk2kKB1Yhzc5KSCib7Qh1W", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222D10C4DFAF288", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "C7FE316A4199CF549AC2AF21FAAA652329EFFD7136697CF76A64C79591287656", "PreviousTxnLgrSeq": 68893616, "Sequence": 66347337, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10379874285.71429" }, "TakerPays": "101722767" }, "LedgerEntryType": "Offer", "LedgerIndex": "94D4C8513842EEA02FFEB4C46C146A6BA41D71A8DE49DFDCB070CF0743414BC0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000028.02702" }, "TakerPays": "196000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r3LLQmhVJiQ3r5e3QCo15yaDumDNp7Gn1r", "Balance": "261258148", "Flags": 0, "OwnerCount": 96, "Sequence": 67712627 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "94E775542858A07F1738DEE32FE0995B874FA42A04C91F39FAA5797BF4ED7663", "PreviousFields": { "Balance": "230114189", "OwnerCount": 97 }, "PreviousTxnID": "FA574AFBC02737EC092414A0450818391304DC48E13EE6E3954D2B8C945B21E0", "PreviousTxnLgrSeq": 68931794 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNd3R5EaqkBC3EguG1mmwhjpKqLDTjBNwQ", "Balance": "243217443", "Flags": 0, "OwnerCount": 93, "Sequence": 67165982 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "94F506D0B3736425AB5EFEC62706D517D44A8178A04C40FD16BF441F2C57D3EC", "PreviousFields": { "Balance": "212384924", "OwnerCount": 94 }, "PreviousTxnID": "85BE0D0C16A38ACF9DEE3916CEC2FA1AB095EFAC97EF90C3186B41B04623A27F", "PreviousTxnLgrSeq": 69041987 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "11", "IndexPrevious": "f", "Owner": "rUrbD1rAAkr84UER2ZUxTP5ohhSKzvC8tc", "RootIndex": "2E290E48C7A786F18B6FAFED5F9AFCBF8782742E78D855EFE4A70296B8E7D431" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "94FE7889AEBB155E78418A93E7538F936323B6E122D62C47F158DE88951A8DC2" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "9", "IndexPrevious": "7", "Owner": "rGgtpbT9ffSEHApdNkRC4Mu9tsYPRMKx6D", "RootIndex": "0883E16B78022D74DB60B47419958512856D653369DAA24FA8FC34C555DE1EB0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9523F6313DF8EF1C22648D40137466A7596C05131185A88919681531994FCADE" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r92aDr7NzvcY9DSKLE8V5q7dvnu7LvVjWB", "RootIndex": "954F697E3FB5849BD3C39C9599DD08FAD9B82BBFB818268AA5C43D09E57540BB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "954F697E3FB5849BD3C39C9599DD08FAD9B82BBFB818268AA5C43D09E57540BB" } }, { "DeletedNode": { "FinalFields": { "Account": "rMQGzm5niy3VzeWEqokwb28toV137fbiYJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365307A369E1A90D10", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "FC632F710DC2D8DA027DDCD0054A531A5DA89C3E583DB0DD997423F1661BB1D5", "PreviousTxnLgrSeq": 68988365, "Sequence": 67388262, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9555EF4180859DB6C70622285B55DAB22629990685FB217306259F1937F871AE", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4658203417.403399" }, "TakerPays": "100151373" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rQnNwoWPxGyxMoLogTPHYeK1hGYwJ3b9Sz", "Balance": "246697559", "Flags": 0, "OwnerCount": 25, "Sequence": 67671655 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9579B24648F90EC091D3C7475635E759E26AF5A224C0B612CF0849656E3C0984", "PreviousFields": { "Balance": "62348540", "OwnerCount": 26 }, "PreviousTxnID": "D951CA8640C0507AB3A3C2D234822601E3F8A4D9EF2C9CBC8BF2286A76F7FD4B", "PreviousTxnLgrSeq": 69045719 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "a", "IndexPrevious": "8", "Owner": "rL92EVWszBA1ZbZADyficMkRFVvpV15sEE", "RootIndex": "D5D0C8099CD01562CFCBE8898E941B29B2113B8C1B2E1EE2866D72652B49FCAC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "95A0001F1DF5CC0FA204CE64CDBECB020A6639B8EFE937D50D18FB2C9C9CBF55" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rUqgMfiCKp2L5Y1zobkQTgSdVYLp1PASt5", "RootIndex": "95FD43EFCFAB57F3215722595C919358CE09EA214E56AB90D3077D9F0CE91A43" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "95FD43EFCFAB57F3215722595C919358CE09EA214E56AB90D3077D9F0CE91A43" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rnZj4CQouegP4s5Hu2LxBbjCfGSWQuzRAp", "RootIndex": "9609C8EBCC4605ACC569C7CD2DD72AE8B16E5AF521552A4A55C3C68D6C08F7B7" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9609C8EBCC4605ACC569C7CD2DD72AE8B16E5AF521552A4A55C3C68D6C08F7B7" } }, { "ModifiedNode": { "FinalFields": { "Account": "rsF1oN5xbuJQ3wPD87jjDvEde3VKwSrAue", "Balance": "2662627254", "Flags": 0, "OwnerCount": 224, "Sequence": 66174095 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "96245166AA6BFE2DB05BF6FA4D3DC87F85EA309E1D51DB685F1499F421BE0AB1", "PreviousFields": { "Balance": "1121001261", "OwnerCount": 225 }, "PreviousTxnID": "92698924CBBC0BB712378F662BFF74D811CD8339A24C4B7815CB2CE1FE296D52", "PreviousTxnLgrSeq": 69061627 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNqG1shTsAyEcTFcAeBxGsLpmaNAGbcESv", "Balance": "829374067", "Flags": 0, "OwnerCount": 231, "Sequence": 65795242 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "962F7231B19544370AF777A8EA4F0A4D39957DA9F903BDDDAB5BE0E336880EA0", "PreviousFields": { "Balance": "474000000", "OwnerCount": 232 }, "PreviousTxnID": "F4DF0A62AD26DA05F81AE6E514DBBB509B624AEEC6374EB275D832B2D1B2DBEC", "PreviousTxnLgrSeq": 69061696 } }, { "DeletedNode": { "FinalFields": { "Account": "rpFYhEoT7AeTuaAZYwU25Gjn3i2VygsMnP", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "9D788653D29AE5B70877217B97E02949CF62447FE1A6ED96A64CB558120A631D", "PreviousTxnLgrSeq": 68148387, "Sequence": 67371826, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9635B3718CA312A35EE2F58CF2427FC9CB536C86C293E9B373C81D2A6D34A6C3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "50000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eee", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwBDva3asfNrXQeBmnkV3xbMnw7xi5A3dE", "value": "1000000000000000e-1" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "96404B44CFE3431E4B56CF16873DB1CF79BDB2FB976CB9F509B6F00BAD4939AB", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "37614271082.48669" } }, "PreviousTxnID": "8AF462F67C22FD41ABE8B62B47362827D6F581EEF8D066CB190FB8BE0E501BF6", "PreviousTxnLgrSeq": 69005311 } }, { "ModifiedNode": { "FinalFields": { "Account": "raPCjF9ftTRB7LYgehLYKBtzf8Eg4qp8Kv", "Balance": "876293123", "Flags": 0, "OwnerCount": 409, "Sequence": 67504932 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9662775CA7B01A70BC23367A94C8DB860922DEE5ACCAFC9FEE176C725F065A62", "PreviousFields": { "OwnerCount": 410 }, "PreviousTxnID": "A7A644A2C1BBA75B452E110A717BC3CD33B89F20676DAD330EA43EB00A5BC0F1", "PreviousTxnLgrSeq": 69018808 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGUKHhcBwNpS8WUqpxNsFW6Yhy6ZwEuATq", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "984" }, "LedgerEntryType": "RippleState", "LedgerIndex": "966823C5C97A693AC4EC66CB0328D38A294F42D816C0BBB9F0B8D1E00E997803", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "6B73FFE2B19658B848FE5C3D42FBDE14E43C9FFF55903687B68378F4FE40848E", "PreviousTxnLgrSeq": 67991927 } }, { "DeletedNode": { "FinalFields": { "Account": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304D4E9ACE50000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "C36B2B1D5595DDF0B6BD7C8871C11439908323E675F3BC0E3D76FFBF49CCAE42", "PreviousTxnLgrSeq": 68889017, "Sequence": 67528318, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "967B7F95D0E4CCFBF5E78781F4FC2DC0D1A51321722460CBC409E9E45CC0C5E7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "68000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rphnh8aG8oBCdrBcgxYgNY8yVqi3b3XqbT", "Balance": "2309245316", "Flags": 0, "OwnerCount": 191, "Sequence": 66157881 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9681CD5A7800ACF9B405D76027D4A7A84148C40E060EF0D89EF12CB4EA1ED308", "PreviousFields": { "Balance": "1756757317", "OwnerCount": 193 }, "PreviousTxnID": "C5375CE0975CE0C4996065F9B2113E4830C461DFB6EAAAE34C7EC8782B76EC0A", "PreviousTxnLgrSeq": 69063669 } }, { "DeletedNode": { "FinalFields": { "Account": "rLxd1PUJT8xrZ59tUuPANfL87xkBXnkeKi", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "61AD844E51164912D0BDE0962AB8DDE81A70761F543C724600AFC13BE9809CB8", "PreviousTxnLgrSeq": 69006510, "Sequence": 67646644, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "96B500C2B70F292FD3273F75797086BB92C3765AF2BB4A2618B610FE138D57E7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000" }, "TakerPays": "10000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rUrtZA3gFTbfu9vkdygv2jzgBoFRYMNv5L", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653074876D147C837", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "CD7A9DD0366FFFC9936758787B6336800F7A7F8EB166FF790AC3488751850E09", "PreviousTxnLgrSeq": 68942739, "Sequence": 67387659, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "96C0827547DA2A3A37744EE2529D9A4C748C935472F9F4E9292134A03E9DE40C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10827596337.80048" }, "TakerPays": "221965724" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGMM3Ag2DiYP71uk8mWQi8fafCQczx8ouK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531AA535D3D0C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "C1801D52079FF0BBC2778F4864854C7C48EDC1E1D0EDA5E65EAEF9E5730A4E4F", "PreviousTxnLgrSeq": 68899493, "Sequence": 66413129, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "96C4D7EBBD6665BC93142EB680EAADA44C24D3D91F61F8CA8F3164FB70B26962", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "30000000000" }, "TakerPays": "2250000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rsdrgJ5xtkPpnWfJeeshHZLWmQEMS3cFzQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DCA70000", "BookNode": "0", "Expiration": 722826231, "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "7F793704F8B164E18821AD14096E8734BD1DAAE6A6DFFCB85F8B44827429E359", "PreviousTxnLgrSeq": 67961797, "Sequence": 67219916, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "96CF5B8D5BCFA894D33E413C95355AD07B81D9E226CE55B60CD20805C31A9DA7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "300000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rMWLJFUZZk4ueZuy4yiLPJa23dGih6phUa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F269000AF9", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "D265635453FD4CB02C0B4C8D0602991CA1EE0BC7D0FD4BCA20FD564BA83C23B1", "PreviousTxnLgrSeq": 68154279, "Sequence": 67175788, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3503695439.7" }, "TakerPays": "35036954" }, "LedgerEntryType": "Offer", "LedgerIndex": "96DB0A7C3B3620DCA7F215195024D3C073111AE6955BCC1FA19B94D7EEE5B8CC" } }, { "ModifiedNode": { "FinalFields": { "Account": "rQHveZ6yCKwNSGRiu4QnTSjJbLRfgBr72p", "Balance": "5113811531", "EmailHash": "36C976B27D0946011AF72AF219A9D5C7", "Flags": 0, "OwnerCount": 349, "Sequence": 66308805 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9700341ABB2B9277846F407BC29EA2028EA821EF45294E3B207D4D800CAC75D5", "PreviousFields": { "Balance": "713811531", "OwnerCount": 350 }, "PreviousTxnID": "6A2BEDED0DF7C0EB98B4A7060EB16E637027CE1C78BD923A4A9BED0D2D4DFC60", "PreviousTxnLgrSeq": 69059991 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-84765750330.1656" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNirEvsSGiRDGtL68t6MJwfAyU1MExreYv", "value": "1000000000000000e-4" }, "HighNode": "4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ea5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9708030D0AEDC4CE8566CCAC8A478DF1B240188C810F7E718DDF64DCF86AD27C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1096691943831776e-4" } }, "PreviousTxnID": "E5FA059CC9D9E47042AC426F0B89D1EB105E67D8E9DAE407244B1B196B0C50A8", "PreviousTxnLgrSeq": 68996643 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBLh3SrV1ALEEfJiHKYiaSxoRxG7R9SuEh", "Balance": "1042161240", "Flags": 0, "OwnerCount": 140, "Sequence": 66512368 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9716F9A47F27E835558DA00CD490CD1451E573028C86651537F9C3A058B91656", "PreviousFields": { "Balance": "836611108", "OwnerCount": 141 }, "PreviousTxnID": "B12353F83B0F7D36442C0E6E1102314EA3003BBD3F2EAFFB6D6F3A1EABCB675A", "PreviousTxnLgrSeq": 69061304 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e97", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsRPr4ZrFePB3e3SVXBMHpwLCfc97qZq7p", "value": "9999610698224583e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "971C375B114CCB84878CE442C4E17F6CBC58271E7FF8A5A7ED3FC81A5793C4DE", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3500000000" } }, "PreviousTxnID": "202F976F658DEF73049F918F5D60C05DE871BE89E1BC09ED8C3D341EF4D32E64", "PreviousTxnLgrSeq": 68922054 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rD3MRnTt6tvvtt7o7F5p8B49toAUWnoLmu", "RootIndex": "5CF9C55A92529BDDD9DF7B17B697B7FC8E12F711D70E611FD818532D15244F1A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "971C8B78E2B1CC3F0DE1ACF21C9C7F16579DA0DDA58001903855584BD5C98E9E" } }, { "ModifiedNode": { "FinalFields": { "Account": "rMrt91RkHZwmYfUbVX72iwmbiaRxnKXjo9", "Balance": "7700963240", "Flags": 0, "OwnerCount": 75, "Sequence": 65789738 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "977D5C90FEF5AACECF2B6E2E131B008D9F15BE6CBDF2FB8EAADD275E9A8265C8", "PreviousFields": { "Balance": "1893004785", "OwnerCount": 76 }, "PreviousTxnID": "38D7E21A60BB649B4847B24A233B21C94D17C4E03E012F3FB58BF483BF420237", "PreviousTxnLgrSeq": 69059678 } }, { "DeletedNode": { "FinalFields": { "Account": "rpzdffxTgRvMawxbRSs9c26T1FTEjfgznz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213E52B99EB9871", "BookNode": "0", "Flags": 131072, "OwnerNode": "e", "PreviousTxnID": "E151A98FEF531DB12146E3EC960B4A05FEE44EA657B53607351D880FECD666AC", "PreviousTxnLgrSeq": 68932702, "Sequence": 67340276, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "981A12891820FE38A57C9991900C3F1B714C35B8B0E468890628DC9A08EDB0F4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "18819970939.1982" }, "TakerPays": "105391837" } } }, { "DeletedNode": { "FinalFields": { "Account": "rhJfzjX6NrYjiR8yGumtJSHuuLxn2JbgvT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "39636BB2AE8111D3DEFC20EEF42EA7867106AF1570AD710B97B0FB726990B4A9", "PreviousTxnLgrSeq": 68898584, "Sequence": 67761574, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "983E2A84CDBCFAD9E97AD7088FE6C00E59D8C2479E60B6CF75D680F0CF3439DF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "60652861" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rsE3JJ4VxxndQwzRusS99pmAeYN3bEYZmc", "Balance": "998646691", "Flags": 0, "MessageKey": "0200000000000000000000000029EFB067C9B7D60BC35CA48F813737C5673C3D14", "OwnerCount": 254, "Sequence": 1051 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "984E52BE42DF4E96F6F68A67A2D4D1CC03E2FFE10AE13F11D6658E01AEABF169", "PreviousFields": { "Balance": "524000000", "OwnerCount": 256 }, "PreviousTxnID": "81A8E249B5B4F9D742FD01FC8D74D500EA6870115BD141F1EB64EECC475F8246", "PreviousTxnLgrSeq": 69063917 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rEq5qRY3MvKgqLUDbPF81FQQe9iEfS4xPs", "RootIndex": "7787CB610ADB8D1C155B39BB9AC48CF012DA01CD6C45C61962C140939933E099" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9874767677DB5C63CD9DF2A60672861987EE6E6414652475993C9EC9EDE2F200" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rsj4wU1Tv93ES5J3AZrWVcgaKXV9b5aNKc", "RootIndex": "F0BAF029BC53E4EA7C57BC1A89BB8503E933A24F526AB31DD2B52C45E2C38DA9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "98769AE6EA290A0A54E8B4FECC6BC16458F2C082D6DADF83C50C6227235ED615" } }, { "ModifiedNode": { "FinalFields": { "Account": "rUrv5jwSUrmeGJa5Uj6DB3mBGojLFsRg7L", "Balance": "24330902273", "Flags": 0, "OwnerCount": 286, "Sequence": 66532154 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "988079068A8068865A1534C87ED025359E16ABC5FF2D46A595EC99A847BBA15B", "PreviousFields": { "Balance": "648497308", "OwnerCount": 287 }, "PreviousTxnID": "43895DE34E48A8A2AEB743793414D6FA4EA099E71D2782605D2B0B626C9BB109", "PreviousTxnLgrSeq": 69055912 } }, { "DeletedNode": { "FinalFields": { "Account": "rhw4L75RKqQwheqkwPMM7sQYti6hmLWUni", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF51F195426", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "86ADE075450F228C7A7CC02400B32F7EE16D11B26CE88231309A9886407AF451", "PreviousTxnLgrSeq": 68901889, "Sequence": 66981496, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "98CADF82CD5E8CF1449BC6F95D11A08B9471187B760A4F22FEBEDA82915FDA9B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "62287918" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLhtdRdeGcT6UeQivqPu9DBXWHZ1SDpsar", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "756" }, "LedgerEntryType": "RippleState", "LedgerIndex": "990AB02A9D1634BDEDB83F8E730D24ACF520818E0EB556307C354E681A74EA8A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "B8216F0AC76D28E1ADE05E50FD241E89F4BEE2C86FB3FF43E2C0FC59E37FC49E", "PreviousTxnLgrSeq": 67996133 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rKjRbDnEwfSRjozGgD1M2dBU54xVtv57aQ", "RootIndex": "B55BDC16459D6B04340E95F9F6499866323CD481D43B98208AFB4BA4CE112D91" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "991A1E71A3EB5F3AC99EEF9BF58BD9EBDEB617F7315E5CA0AEC2AD3239A2C8A2" } }, { "DeletedNode": { "FinalFields": { "Account": "raUCqTN33sgqfhC1KVtqhCVX6iHkHAbUzp", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E57D4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1c", "PreviousTxnID": "70C5C6E5E01F277EE3BBADBCDDCB29F2E3C012B60629B34DC321C1F4FD67DE79", "PreviousTxnLgrSeq": 69043908, "Sequence": 66813305, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9935089D97B6CC89DCCFD1643D433F77C8864C6DD1A9820F4E3643480EE75E85", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2500000000000000e-4" }, "TakerPays": "1125000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNwUjKvVAQ9nhmVW9gF5Hn5414X637aY4U", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "982" }, "LedgerEntryType": "RippleState", "LedgerIndex": "994410FC512FEFCBC252CE72F14EFFA136FAD766D07431E27C59433AADF4CEDF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "BB4E731A38255337862A89A8A7FBD89620D2B62C6FE470DB67382A6A309C56B6", "PreviousTxnLgrSeq": 67991902 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "14", "IndexPrevious": "12", "Owner": "rBnj6UP9thqpSLVq1rEKinhuhmFHmhaC8m", "RootIndex": "134B6C0E7D25CA2E7B791BD87B4E37D5170A0C65A730E01FCB43C1BEF419B95F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "99480949D0EA0487BB1A2E4291A79DC24AA83ECE1510B2F03CA65CD07828E955" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rKbNu1SDc3i5dWHdp3uLxWVn2tsA4ovDJR", "RootIndex": "5D9E40EDEF763A4AA40AEA25345CFF6688062761CB4CC26A1CD1540B62B6E6A2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "99738564CE639301422420411DB320B28A64E2EA267322FFBD698CA340F9BD46" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r3pUPUHoXbK4o5wjfPWjqQe4Xh2wu2KWvq", "RootIndex": "998707FF17E7F4684004DB112F68AE41338EF5807ECFD8C153A2C0F0114F22B0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "998707FF17E7F4684004DB112F68AE41338EF5807ECFD8C153A2C0F0114F22B0" } }, { "DeletedNode": { "FinalFields": { "Account": "ragafgjLrLnN1rYkR4FpKXjmiTqDQqDio3", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D79B6A189ADB4", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "E92391277729DDC276793D8A531C5C181C4EB864F3E7DB114B7FE93D92C4A238", "PreviousTxnLgrSeq": 69011401, "Sequence": 67291849, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "998EF00558A8C094E8C1DB99F4783C044C000AC8FBBD54B800A51A4B3253D391", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2015266918855906e-4" }, "TakerPays": "764390742" } } }, { "DeletedNode": { "FinalFields": { "Account": "rpRWz81LgJfwcxBFMMxwnMttsHr8VoMZeR", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "9250907F408C34F67684C860698A1E1070D62D20CDC79DDBEE05C3693476C4AB", "PreviousTxnLgrSeq": 69048287, "Sequence": 67502999, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "999E0FFBEF87240409805F454AC97DB836336C8A721DAAFC6C5CC42FB00B7D04", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15000000000" }, "TakerPays": "150000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rMMTgtHSock7M74yRKkp4ug6i14nGeCJhW", "Balance": "339482681", "Flags": 0, "OwnerCount": 128, "Sequence": 66483833 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "99B2F9EC8D7E42C2A42675C58E8BD64FB566C93F0E957DC185E489905A5F718D", "PreviousFields": { "Balance": "281188742", "OwnerCount": 129 }, "PreviousTxnID": "A4D8A02FCE983488B325B7927A17930B434CE8BC8EE056960B34461641D10DE7", "PreviousTxnLgrSeq": 69062416 } }, { "DeletedNode": { "FinalFields": { "Account": "rUtzPhAd4njQGteZHqi7hbd8CRtZGfQtp3", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D5E935F2", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "A0BEAAD0DB0DB2FF034D385715BD86D4A1D7427BF3BE585824A945F0939F005C", "PreviousTxnLgrSeq": 68896073, "Sequence": 67342389, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "99B3BDF64D771A12266EA793912A4F8F5F43664FFE43290F5C7909476A3EE81D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989876" }, "TakerPays": "101217868" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rNNzeaYd4nSmhTirshmVBdK1zfHApVy7Hy", "Balance": "182478327", "Flags": 0, "OwnerCount": 39, "Sequence": 67492599 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "99B45F4FA105DFB17D80BA076B29FB57E78BAB49AC97800F27FD95208CDD20FC", "PreviousFields": { "OwnerCount": 40 }, "PreviousTxnID": "7DDCA3E6AE5A9A6F9D2315AAB1F8329D8F8ED370BDCE7F2F11CE51F013E9516A", "PreviousTxnLgrSeq": 69058664 } }, { "DeletedNode": { "FinalFields": { "Account": "rJjrokNPSa5xiAbh8N8cqmhVc4ma95FBpt", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "FD33246A0CC19DB05F0C850C4805D8E2654045CAC29E43F4B837A2BE5D052025", "PreviousTxnLgrSeq": 69014183, "Sequence": 65343271, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "99EC1210C28796DA017F882DB10AB5799D92428B8847E8402D816BE0AAB77FD1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12037057800" }, "TakerPays": "60185289" } } }, { "DeletedNode": { "FinalFields": { "Account": "rHNNQAEvRxzWoi2ukxZ371fsjJjxRva3pd", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365209C51C4521E000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "EBE669768796C393CF45104C07C8084CB6A9EDA9443141522A6B2E67E936E12D", "PreviousTxnLgrSeq": 69017368, "Sequence": 67949455, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "99F97970C212B87070E719B0574BED0FD2F6E1E01B83A92251D6A592D3E3195E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000" }, "TakerPays": "5500000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rB4BbxNJ7Hv7i63EwPcEZjuP8YHizdkkvd", "Balance": "77162676", "Flags": 0, "OwnerCount": 9, "Sequence": 67744148 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9A6EE49A49DE32CCF272A5C42C0AC46261DA4A4B571F1A07A657B030346EC11B", "PreviousFields": { "Balance": "58884548", "OwnerCount": 10 }, "PreviousTxnID": "CAE8836EA5152715C60B986F3D9EB5C9339D7F4D5DA7A623E5177F24A985CAF6", "PreviousTxnLgrSeq": 69012697 } }, { "DeletedNode": { "FinalFields": { "Account": "rLkhJhEaChEegzryMAeps63ghhG1yXzifL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B2A00671C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "920B46BBB932481A24DDB11367690C051B4AA98F6B4BBE0142E552223C37725A", "PreviousTxnLgrSeq": 68963973, "Sequence": 67425984, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9A808A3B7CF27796DD5DECB9186389C0E42079A879B062C211B1B6D9A72B4EC4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4630429646808511e-4" }, "TakerPays": "2176301934" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rKSMqUYHyLXFtWPy1JugFqgds23UipQsGZ", "Balance": "360871494", "Flags": 0, "OwnerCount": 23, "Sequence": 67142043 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9A81D02CFDE7457004FBD2D1F514D031E4731D39AF2A4845986F919294EA0D54", "PreviousFields": { "Balance": "259871494", "OwnerCount": 24 }, "PreviousTxnID": "20C4C01404E8C5160C7464F5A40AAED5B3A50ED78C660D75756333D410847D26", "PreviousTxnLgrSeq": 69063831 } }, { "DeletedNode": { "FinalFields": { "Account": "rsF1oN5xbuJQ3wPD87jjDvEde3VKwSrAue", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DC8B34F3", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "BD798775B01C5708C96B29B3F890EDDC2FE974C2DB63D540A0FDB3FFE3540CF3", "PreviousTxnLgrSeq": 68892810, "Sequence": 66173983, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9A887A1E8FE3815E31C9F6AB544C8F985D557C37758DCE927C95762A27F978FA", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "25693766557.8" }, "TakerPays": "1541625993" } } }, { "DeletedNode": { "FinalFields": { "Account": "rNPZ49ucC4zKoBPgyAsSC7oMSSoh1icnZK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937B4B295", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "37E81D9850EC01FFFE4B283EBD2D4291017035F64E9E817C0995AAB60A370A02", "PreviousTxnLgrSeq": 68997083, "Sequence": 67158822, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1277712118733569e-4" }, "TakerPays": "638856059" }, "LedgerEntryType": "Offer", "LedgerIndex": "9AAA19A07998249432B449CF6A220517CA0F4E118E0ECC575292E9A488561416" } }, { "DeletedNode": { "FinalFields": { "Account": "rpJZ3qkUBb3m68p3YrzJE7onMcswN4XDY8", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132F4579C98000", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "FBBE6F007F68D31C9633FBCD4B980B49A21377F4C12F312CADAFE70BB68456BF", "PreviousTxnLgrSeq": 68963662, "Sequence": 67512201, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9AC668E1A76D23D00A6726D08C3F24953F08F010FF8D201C7F0AF7FCF86184FF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "108000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rwBDva3asfNrXQeBmnkV3xbMnw7xi5A3dE", "Balance": "611985279", "Flags": 0, "OwnerCount": 101, "Sequence": 67471075 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9AF6A4C025FD110DB6C57270170487F29BD4CAF05BBD26249CD4D851209701C0", "PreviousFields": { "Balance": "235842569", "OwnerCount": 102 }, "PreviousTxnID": "5036B1C6C2C477DB1F6E03FC06472E6ABD6DC6B98EFE6E7D1692D824AA3E3CB0", "PreviousTxnLgrSeq": 69053344 } }, { "ModifiedNode": { "FinalFields": { "Account": "rh8MNcxKuDcaMRuSj6P2rcMGxDiBqyZJJT", "Balance": "505938482", "Flags": 0, "OwnerCount": 10, "Sequence": 67381324 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9B0A9D247F63BEA48A8A6CAE19C904AE11F258710BBC1DE96EDC29BE8F55B8D8", "PreviousFields": { "Balance": "35646737", "OwnerCount": 11 }, "PreviousTxnID": "CA76B05CA68830AE0056C64E53023A31C460203542E3D40D44C49F99F62E4D2F", "PreviousTxnLgrSeq": 69064150 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-147708029.8498" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN9HGJaVB4wFwWcj5tTqzkWtHjxxCZiHA7", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "b9" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9B22D1DE8AC140C2915598E3360A6BA5EA9F2B814EC5B86D9C6769D822E2225C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-50147708029.8498" } }, "PreviousTxnID": "BEFF0BCBB661694F8EC4ABB7011BB5F0A198EAF107B095FDF602571E898C02DD", "PreviousTxnLgrSeq": 69041203 } }, { "DeletedNode": { "FinalFields": { "Account": "rEqtQj662PMqja6Cb3pyK5V6xi2RGbcFxD", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531D972EDA1C31C1", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "2CCE4DE1D0088B5EB91CAAC104F987F868FBC1D99B5D76E6F85C4F32373A31D1", "PreviousTxnLgrSeq": 68885491, "Sequence": 63323939, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9B3EC95BC51ADE2B6A5768F14B4AFECA3D74CBF6561072B891B71D09CCB40D8F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "87329228405.93906" }, "TakerPays": "7273653013" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rQKYm7pcdeXMPEgGTRUAAuoziWwhhW3DC2", "value": "1000000000000000e-4" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "c16" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9B48F8863F2DA60B608BAA75C6D075132EDFB89A996EA464C583E865879B38F0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-38929949330" } }, "PreviousTxnID": "05C5C30C69D81D2BBF94AF65C04012BD492287E4AA22C60A7CD7FAED405EEE44", "PreviousTxnLgrSeq": 68048591 } }, { "DeletedNode": { "FinalFields": { "Account": "rLkaQPNxjeDmFBqhQ2GszmgT4wxykPCP5K", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208DFEAF20D8980", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "0A0E0771F6EC02D17D0A6A45E3A03D5E2460B6F3307AB9A2054024828E1F3808", "PreviousTxnLgrSeq": 69023482, "Sequence": 67329967, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9B5CB223A2134AF22D042C953E4FE250EDFEFCD8733E130108D0CAF873252631", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "18109401193.39236" }, "TakerPays": "45237284" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rsdrgJ5xtkPpnWfJeeshHZLWmQEMS3cFzQ", "Balance": "3922303039", "Flags": 0, "OwnerCount": 141, "Sequence": 67220066 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9B7793B5E2C55059F724F41C8A3263AB0AC9FCC1FF32EEC9240F2BC5AD95082B", "PreviousFields": { "Balance": "2722303039", "OwnerCount": 147 }, "PreviousTxnID": "EC8D815D4B605034695CD235AF5687F05AB7069C7CD95D8DC655561FF727B932", "PreviousTxnLgrSeq": 69059883 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "r9dqJno4U42mpcjAymrrUS11q5rAWazGfP", "RootIndex": "5FFFA0BFC44FC5D1597847CF3660D72650B7F97BCB7EFFBCC1388CA0DD17779B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9B7E718EA22238292A5E1D4922B9F71A322C09FA3C17E1283868935E3129BDB3" } }, { "ModifiedNode": { "FinalFields": { "Account": "rLFVckNbciXAqgedJM92yZX7653rXcn4JZ", "Balance": "1277425520", "Flags": 0, "OwnerCount": 94, "Sequence": 65356327 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9B8A2184B22A7ED23250C92DCA1459367C58701BF6A7607F02E63E8DF6AEFB9F", "PreviousFields": { "Balance": "688126027", "OwnerCount": 95 }, "PreviousTxnID": "FCBB8A0A4BC0328D6B74FAF0DFC8DA885B92214FAD76B4D10145E0E9A1918F10", "PreviousTxnLgrSeq": 69057313 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDzBkddc4AVrm4RWuXJRhH1rrkDpKNFwTg", "Balance": "3639142363", "Flags": 0, "OwnerCount": 17, "Sequence": 67765546 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9B92D19B552307A64586C2DADB6C5AF307F777736090F295F4A123DC73EB41F2", "PreviousFields": { "Balance": "639142363", "OwnerCount": 18 }, "PreviousTxnID": "43C5F44729B2CCB921633FE83F8881D270BAF1C39FC8759BD3FF98B9ADAC56AD", "PreviousTxnLgrSeq": 69063610 } }, { "DeletedNode": { "FinalFields": { "Account": "rB3bSANCCKpiQa4aMd7b4vQZ3pMTh8UXZh", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521B094132B647E5", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "A13746181E87B812A43A943CC5580576560B0E50D381513B23F4952830E0BCBC", "PreviousTxnLgrSeq": 69004695, "Sequence": 67122272, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9B93C5D73CD35B9F428F7B0BCD0A3957C0036E77666E61D0F93CC63B9B0B0A88", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7739869097729994e-4" }, "TakerPays": "5890040383" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "rUHsUfjv1Ai9KiT6R3WzLcAKvvPLao6fiK", "RootIndex": "9BC4C67F74E7F3C97E4C52C13E4F636F36CEAB670A0A3FCB3414FB8228511E4F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9BC4C67F74E7F3C97E4C52C13E4F636F36CEAB670A0A3FCB3414FB8228511E4F" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "9", "IndexPrevious": "7", "Owner": "rJNmHPHrMr649at3SBHakJ38mRAQZA9pvs", "RootIndex": "3979C9A1AE3575D06CBB842919BDA117CD454A8844FF04B7C42BD99F2F1D1194" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9BEDDC79ED2A02BBA3CFAB9A51D135EB464BF1D9A4B9A54EAF06297EA63BEAA7" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "rKso7KmktCCYBfe79sNAFnfKffvansBBRz", "RootIndex": "16079EB94DDBB6FE7530302438BA31C473A6838AC7E1AE6CCEF6D1F2F1E20535" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9BEF657B245A43369A33A499D82F05F11D6EB41106DE242723A6A7242BFE298D" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNPZ49ucC4zKoBPgyAsSC7oMSSoh1icnZK", "value": "9999999999999990e-1" }, "HighNode": "7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "deb" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9C02327708D9B0B45A75AEFA2FE0486F73AFEFC1E199C2C1169AFFC4C91BEF9B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1277712118733569e-4" } }, "PreviousTxnID": "4A0963CE9709FF0825ECA449B68E553525DF56B2551897391BC4B2B04D3EE220", "PreviousTxnLgrSeq": 68819471 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLK9N8ay11j21CKs3ryC5kp7SYR5piJByc", "Balance": "220408579", "Flags": 0, "OwnerCount": 72, "Sequence": 67342157 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9C5AAC02B3D1A819CEF124726C74FDDC27E11F7A26E5A0A8AA596347FA723C69", "PreviousFields": { "Balance": "158120661", "OwnerCount": 73 }, "PreviousTxnID": "4B86F2C03C5568ADD20A6F6F68E906178F82A869049C4B54EAAE8FB9C1BF5B5E", "PreviousTxnLgrSeq": 69044399 } }, { "ModifiedNode": { "FinalFields": { "Account": "rwSQqB6yNHd2tiXUhJ2wkULgq3dFua1r41", "Balance": "1007011966", "Flags": 0, "OwnerCount": 119, "Sequence": 66556566 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9C78A9437E472C5CB5002F432C3098A17DA94187E9DBF12CC733C45106697443", "PreviousFields": { "Balance": "306272879", "OwnerCount": 120 }, "PreviousTxnID": "E6EDD6724049CC6F86B8F70E78826FF0AE3865EA62BE6095287C83AB8FC295FE", "PreviousTxnLgrSeq": 69063410 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e13", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rB3bSANCCKpiQa4aMd7b4vQZ3pMTh8UXZh", "value": "9999688558266536e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9C8B9692546BF2815B2707BD87D75D02588446ABE187625D3601E521E088FA5B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7739869097729994e-4" } }, "PreviousTxnID": "56F4083A63946E0829B045C44616DCB48ACA54EFF149D833D1F3E00CF27E95AE", "PreviousTxnLgrSeq": 68994858 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rfJYknVqAa2EmEKkKsR2CjJVBKedFU9DNZ", "RootIndex": "08D8D63AC3BF8FC407330424DD03928293CDC76DC7BCE02BA8215F54917755FC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9C8D8B90FDD3AB0C8A3E778718FF74D8931D5AB8C3FCD712297F7FCDE0A1BAC3" } }, { "DeletedNode": { "FinalFields": { "Account": "rKSMqUYHyLXFtWPy1JugFqgds23UipQsGZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211F0F2C01DA000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "F345A0FFFB68EABC3E854C38099E5708FC0A1D8BFB16087A184F70046074C866", "PreviousTxnLgrSeq": 69008604, "Sequence": 67141902, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9CD8E51BCBF23CC3FDE74FE213B85DF57EA40B94869B2656BC91ED7C5BB41A9E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "101000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rKSMqUYHyLXFtWPy1JugFqgds23UipQsGZ", "RootIndex": "36F0CE76856282FD5688883C9E4875860EC98A50CDF84A00CEF2BF3766F8DF9D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9CE5386C6893F1C03BCDB8326BF0F4AF5452C16910A760B4DC1AF08ACCCE39C6" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rBE6UN87gwvyAuud7dSn2d6zdBUWCjgqRG", "RootIndex": "883470D8A12AFA64F5B68BCF971659D5AF42CF33921F15A3EADE907DE45BF439" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9D060CD639FF17151790CE55FFF967BF44664694B168F166346049D3C52380A9" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "c", "IndexPrevious": "a", "Owner": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "RootIndex": "96587E178090E46CE3C330C5FAA7424BD6415AE2A0F93B1137608016E9EF3245" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9D267D64EA07EDDF1BEE7A862D6374D7134FC4F40B9898E66FD3A3C26F62D6BB" } }, { "DeletedNode": { "FinalFields": { "Account": "rsz7uAUXWXXeEfR55mUHFiWbdTomtXqdcv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214401E94C6246C", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "BFCBF6F78F7568F52DD85C0D273F8B79DF1E1BD31393E3A3DB9B0FF8BEBDB67A", "PreviousTxnLgrSeq": 68978315, "Sequence": 67858741, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9D435C5C56015FC223707A1E4D1C1AD342FACD97731D978908C00F9734498684", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2655500000" }, "TakerPays": "15136349" } } }, { "DeletedNode": { "FinalFields": { "Account": "rBVauSrW9MhaNcszTL125KttqSixQmUDuK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "5F7C9AB3F6EEE4EE36B4907D798D56E8B00877E73F7476D30F9E26E4B8567011", "PreviousTxnLgrSeq": 68898528, "Sequence": 67761564, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9D54A3FC8D3F093E0A8031017400D689058DF73797448852CFDF3B340DED9EA7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "60652861" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "b67", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpPjK8mxW6UndeHNvtgJPSaQjARCSXGCWY", "value": "1000000000000000e-4" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9D746CDFA1CDE3A6FC9313F9309B1764ACC27EEABD47ADE6B50E603833CD2F42", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "17785989866" } }, "PreviousTxnID": "AFFC0064D8C0D922FB2617EB86EDA60E2626C5702AE91E7392991E250A2E37D5", "PreviousTxnLgrSeq": 67991304 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e1e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpGhnBcEyRdDNyy4AD2BwyZgWE4ERu8eqC", "value": "1000000000000000" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9D8AE339263662BFDDBC45A143D3E01E07C2A69EC16E1A5221FB3688590A6821", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2000000000" } }, "PreviousTxnID": "6894D7161ADADA4E13ED16495F4F5986AC0E9D98B56F70293FE182F60BFDCB6D", "PreviousTxnLgrSeq": 68855589 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfn3KpY6HS6aE1vviRjhHfNn3BfuSrhmzv", "RootIndex": "9D906F0C37ACE6A66F3FFF3CEEE8EAC384C77E7CA4D99CC6F54F724886CFB764" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9D906F0C37ACE6A66F3FFF3CEEE8EAC384C77E7CA4D99CC6F54F724886CFB764" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "14", "IndexPrevious": "12", "Owner": "ra5BMHvXy7Y97xhxSLKZWCDPpbqc9fvWdq", "RootIndex": "410B277ACD7A896B9AD3D6B7603DDAE8143F5291D8852E06014C8C267F07D5BD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9D949CA3ABC42E4E984B54E8B68A942DC8338D8C7882D557BEA169F40AEEE6D1" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "ra4q61eeGoZx4cAJKPHQdyukvugrB2jhgW", "RootIndex": "9DAAE7C90496EC9EFC31F1BF5236460290B065A425FE1F522047B37F448F0A59" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9DAAE7C90496EC9EFC31F1BF5236460290B065A425FE1F522047B37F448F0A59" } }, { "DeletedNode": { "FinalFields": { "Account": "rET8MUZc1VEcHkQqQWeRmvbWZcrtHy24iB", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520886C986447D13", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "256BDB67BB91DCE08DBAC26ED26E5E383639B1D009EEF4585FCC43329357E80E", "PreviousTxnLgrSeq": 69029430, "Sequence": 59759820, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9DC89AD792605BD70C0990998D3C3BD49D32F85C64702D8A89C079052E16B49E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "18686375" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a65", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwuaSP5dsGLmc6gNnv3bWEjmtkexmA4H3G", "value": "1000000000000000e-4" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9DEC85EBDC8F66EC00397F63B0F2C1BEB336AF9DB35349581B9F4F59517994A3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "93431878392" } }, "PreviousTxnID": "7CE68D393ABC6645FB14E1BFEC45B1FF58A6C86248A0ACC31C01E8D80BB366C7", "PreviousTxnLgrSeq": 67972262 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "dfb", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnSxpc5YM8agfwsEHN3F3EKN9WQ8yyTcAf", "value": "9999766418165221e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9DF28B0E15E496ABEBB38C569BE966EF091BE191E6D59CC2F403CE9F417E343C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "33333333405" } }, "PreviousTxnID": "B59FE9F337697F22D81D534EF4B6C28C0D22E686AC7222D1AA9752FF19C164DB", "PreviousTxnLgrSeq": 68152140 } }, { "DeletedNode": { "FinalFields": { "Account": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8C570EE4", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "F6EF85C2092A315BF38968D003DD4A266A7150681B099C3BD76F6B5DE0C9AA13", "PreviousTxnLgrSeq": 68983895, "Sequence": 68499486, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1057882247718264e-4" }, "TakerPays": "456899342" }, "LedgerEntryType": "Offer", "LedgerIndex": "9E15CC6E06E3772D9D3F252B78C3E8A7BAB4E486218C50267C72A975E2CF79B1" } }, { "DeletedNode": { "FinalFields": { "Account": "rUEnyBAH4xxjS4ZkMrki8GnNvsvysjSuZy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D4F54CA852C5E", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "85C5581CD0A69B298EABE54A6698E7195BA47D52146F29DA764AD6FFF4753D87", "PreviousTxnLgrSeq": 68897679, "Sequence": 66504627, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9E3CC2EEE7C78F29A734179A60255311B5D2B832DF99B489FDFDEC02F9A3C2F8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3157063667.673492" }, "TakerPays": "26045775" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "350", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfJYknVqAa2EmEKkKsR2CjJVBKedFU9DNZ", "value": "1000000000000000e-4" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9E3D02CE57A51541E2D53E9EDCB5059A1E14CCBA0B495EEB1BDA7834A151CF2A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "23357969598" } }, "PreviousTxnID": "77FF4E1BDEB05CC6108843AFB82C172546E5DB8DC3A9EC6A191EA6A4DD283499", "PreviousTxnLgrSeq": 68003285 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e9d", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsWg26FevrM9h2PFcanVpvpaLNuoGpLnrB", "value": "9999610698224570e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9E3D72C3EE4DD0EE5028104578F960F505AC9460A94CFE39150014CFA5E674BD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5000000000" } }, "PreviousTxnID": "6DF7FC82EEBA1C7F5519B14586DA1E03226E64461B9E6C84A355881C70BCF1F9", "PreviousTxnLgrSeq": 68784902 } }, { "ModifiedNode": { "FinalFields": { "Account": "rG9EpCkxGBXowufUGyrVF8tT7ovkHBdMb4", "Balance": "118147276", "Flags": 0, "OwnerCount": 36, "Sequence": 68040425 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9E4181732F71A538F09216C46E23F65812F2F1EDC524FC5ABB0918BC691BE85D", "PreviousFields": { "Balance": "93144856", "OwnerCount": 37 }, "PreviousTxnID": "90295ED3F638E300F4F521836A18696CA80208418B049CB3DF80BA783AAF1CE1", "PreviousTxnLgrSeq": 69023985 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMRX7LEEzj9s3Hm3fysfBXnkNzAaRbDawT", "Balance": "2784265047", "Flags": 0, "OwnerCount": 493, "Sequence": 65793814 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9E4E7FC2D565D623F9F29025D912EECC3BE244D756B25A03B1BC159746133F41", "PreviousFields": { "Balance": "2284265048", "OwnerCount": 494 }, "PreviousTxnID": "C9CBE362E321728AA0F0276F6A60BAB76234D46842107FD9D7338AEE2DAB9FB4", "PreviousTxnLgrSeq": 69061071 } }, { "DeletedNode": { "FinalFields": { "Account": "rw4jQ2pSNGhFQDoQyNpP6FJ1nArCWCZjKM", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CC11602BE6000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "2083719A353AB8D514172F34370F48AEB91701AFE159134CF060688C316F4FE5", "PreviousTxnLgrSeq": 69000834, "Sequence": 67525539, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9E50B0D9449F3951CFDC6CCB08A6E7FDDE376888B092F3BB1A8964A8D7B1F40E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "42000000000" }, "TakerPays": "150780000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r9pfHFFyEEhtaDaMgVNtZZ8Ks7YL98ziRB", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7D7041F62", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "E176EE802B521C4085CB3F6DFD6EB4FCE51647F1F527AF48B5236CB91FD344D2", "PreviousTxnLgrSeq": 68909240, "Sequence": 67689824, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9EC2C6B334D44B7C12069E325217B77D444B0A19D8283B3773A34BB2FDAFE776", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3334588052.553338" }, "TakerPays": "20007528" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r4xMZEgWZaocA566U2xgUqKcTnXKZkBLLi", "Balance": "274726385", "Flags": 0, "OwnerCount": 15, "Sequence": 68654336 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9EF596BF1DF627FFBAD365F490CEB4C2E279D13784745F85B3A32565D8E61B32", "PreviousFields": { "Balance": "101524681", "OwnerCount": 17 }, "PreviousTxnID": "339FBBF2DCE579BA7075DCC5EB887498E28C2B2192F94F4B44955EA0E22947CC", "PreviousTxnLgrSeq": 69042446 } }, { "DeletedNode": { "FinalFields": { "Account": "rNVK54FFqQPyc5jFNayw1WrW2m54SRAMWv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365317AF4C4A80AAAB", "BookNode": "0", "Expiration": 723706139, "Flags": 0, "OwnerNode": "1", "PreviousTxnID": "914211D61688C96195CA88507D4ABA24F2D97A24B49E9BC0B9F076394F4684E7", "PreviousTxnLgrSeq": 68177282, "Sequence": 67622062, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9EFC0E8B2D96F427B55F77418D948F825AD3BBAA327F91BF9FC400E0C20813CF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1500000000" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rpeh8BoXFBaV9nkmRvyHWMt9tGagwWhk5s", "Balance": "471718192", "Flags": 0, "OwnerCount": 102, "Sequence": 67385082 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9F3C1566ECDEC9F776B28B57902B845AE8BE56C5AB15145B43635EB3DCE6905F", "PreviousFields": { "Balance": "315998395", "OwnerCount": 103 }, "PreviousTxnID": "C8FF4E93F2B32C5061021F83FB8BD9A05E87E32F1F92F6991BCA285F02CDFE98", "PreviousTxnLgrSeq": 68999414 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rE9hwGp3avccRZY3PerkKL1cJ25z9X22QZ", "RootIndex": "72F425B2FF57C96BB28DC6DD6FB29F482672C6BE10E87D2D779255A80CB56024" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9F548A3BE2B9C56906FAC1AF51098417F7C92721E9319D5A7654E23C57973883" } }, { "DeletedNode": { "FinalFields": { "Account": "rwNMX6iAFTsFK2PG8PCNG4AJ5b8UyrSx8p", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531AA535D3D0C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "3233ED955DF7026B395032E03DF6FB1B8ABBDB3F5FEF6382CB8A2FB755FC56DB", "PreviousTxnLgrSeq": 68886120, "Sequence": 67440196, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "9F6FCB41967DC8C60A1E490D19EE502D223A056E0CD890E06884743FCED2489E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000" }, "TakerPays": "75000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHm3si5FLgHjXC7E2qXKwNDGAe5khVpEHg", "RootIndex": "9F8253051FCC91213E8F62731FBBDE71C94B40363E6C6F1A6EFD4A63FBDA259A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9F8253051FCC91213E8F62731FBBDE71C94B40363E6C6F1A6EFD4A63FBDA259A" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "1b1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "ra5BMHvXy7Y97xhxSLKZWCDPpbqc9fvWdq", "value": "1000000000000000" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9F983BC108F2442BF821FD3D94081F7CA0D1BE94C5FFD7E8079A283DA0293E44", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "CF58E607FDD653D68F3489010ACADB7A55F3B922AD9A35B9A6CCCCE671067229", "PreviousTxnLgrSeq": 67949938 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "d87", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rjD7dFqNXSEK4juN3ntGwbYn1P3xjepVf", "value": "9999999997999465e-1" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "9FACE1E7A4E566BD247BD401FA51DDEA5B96D2F7431D7C34F9ADB8F8144A6ED0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3889722226.893519" } }, "PreviousTxnID": "85E08C2C0DEB33C9BFAEDF0496FDBF9C3F315CC9F87ADE5B755DC6A6704AEF68", "PreviousTxnLgrSeq": 67965349 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJCvziKjUwgoNgwNNcy2SwqVMwPFxqBjvn", "Balance": "1022876742", "Flags": 0, "OwnerCount": 21, "Sequence": 67662870 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9FB4165747112BAE88B0B7810E95C846BDCB0E58820281D7CD4211563C2BEFD2", "PreviousFields": { "Balance": "222876742", "OwnerCount": 22 }, "PreviousTxnID": "D420A52E6E0F312643920456A5183D708838D8820262896082D14B578E9F041D", "PreviousTxnLgrSeq": 69044838 } }, { "ModifiedNode": { "FinalFields": { "Account": "rN9HGJaVB4wFwWcj5tTqzkWtHjxxCZiHA7", "Balance": "1189273666", "Flags": 0, "OwnerCount": 174, "Sequence": 67322479 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9FFEE8311247DAC4B31B322F04DABF6095D323A9F251A81278B12EF266E9040F", "PreviousFields": { "Balance": "789273666", "OwnerCount": 175 }, "PreviousTxnID": "EBCB5BCC26D9E3BA59CB33BC24B4FABC1794627C5F877D03A19711FB196AF2D9", "PreviousTxnLgrSeq": 69063680 } }, { "ModifiedNode": { "FinalFields": { "Account": "rEq5qRY3MvKgqLUDbPF81FQQe9iEfS4xPs", "Balance": "554674643", "Flags": 0, "OwnerCount": 15, "Sequence": 67431670 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A00EA8CE5B53F735DD7726C3EFECC59ECDAA1776D26793DD6D30D1B2A22149D4", "PreviousFields": { "Balance": "42576692", "OwnerCount": 16 }, "PreviousTxnID": "9567A1FFB83FD1AA82AF35CF823D250AA5B838F68B69059D7B93A91F0334DF0B", "PreviousTxnLgrSeq": 69051437 } }, { "DeletedNode": { "FinalFields": { "Account": "rzHXP1zuBviNtiogFMnNDcoUg88bprjNy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26F639113", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "51074135D36D3A8FADE14CCA0263E7D943C8F517CDAF767D46D61A9098FB15AE", "PreviousTxnLgrSeq": 68170974, "Sequence": 67764236, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A00FDD8001AC5F421C519479AE0753D00BD73E70D5F46C1FE05A7FC9A75D5B5C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1077859898660000e-4" }, "TakerPays": "1077859898" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "9610735646.15" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e1f", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpzdffxTgRvMawxbRSs9c26T1FTEjfgznz", "value": "1000000000000000e-4" }, "LowNode": "a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A0299D5672F94EFF061A731BEFF56C3B7CE2F0B34BF8B306842AAA8EB157F72B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "28430706585.3482" } }, "PreviousTxnID": "181DA9D348F1C67DF01074FEB07826CB4D748F7846C543E95947860DFC4224B7", "PreviousTxnLgrSeq": 69052947 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "8", "Owner": "rPWjueM7txwURGpJDWF9yQRn8cVmWQTDnE", "RootIndex": "903860054369EB5E000575BA61FE04684BAF0296B94620205D653E4481FE45D8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A036C77E7F7784EFC82B26848F2AF2E734FB02E152E7B4C7FE449B7DA4A7B854" } }, { "ModifiedNode": { "FinalFields": { "Account": "r9pfHFFyEEhtaDaMgVNtZZ8Ks7YL98ziRB", "Balance": "108487708", "Flags": 0, "OwnerCount": 31, "Sequence": 67689880 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A048D955CD50A4D4BA8F4811A07BBCC85570687F17E3E5617FA0EAB41195AD74", "PreviousFields": { "Balance": "88480180", "OwnerCount": 32 }, "PreviousTxnID": "90426316EE57BF8A4FD97373E18948CE87C28E61229B7229D93A70200357F158", "PreviousTxnLgrSeq": 69051771 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsRPr4ZrFePB3e3SVXBMHpwLCfc97qZq7p", "Balance": "243954098", "Flags": 0, "OwnerCount": 16, "Sequence": 67107838 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A08E6903854E92C042259EF18CA4D83CA52FA0DB2A48F088313F00043244312D", "PreviousFields": { "Balance": "223129098", "OwnerCount": 17 }, "PreviousTxnID": "5D966F6F4ABA5A175AD4EF7156DDDEA4014F3981264279D2C03D79D5394C873D", "PreviousTxnLgrSeq": 69059589 } }, { "DeletedNode": { "FinalFields": { "Account": "rN5wcyJZjT6Qd7sJZiQg2SHVtjnmqiq7W2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26E8FD300", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "A8160635641B08B0A33C6FBAF775655C11CCD1563F5D1624CD49CC81200635AE", "PreviousTxnLgrSeq": 68902389, "Sequence": 66720603, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "499999999" }, "LedgerEntryType": "Offer", "LedgerIndex": "A08F25EF219A6A3D71BCA8D867AA742D8F78EE273E45020A3DEB99A63266EB00" } }, { "DeletedNode": { "FinalFields": { "Account": "rnDZQsMj4ttxiiL23S8LEAzhbhNtK3P6ap", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD494E4986", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "00094CC849E8FE94F9042FE672F9AA8EB8C101F075EA37E607DCF8B5DCB6A959", "PreviousTxnLgrSeq": 68152674, "Sequence": 67108881, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A093691D25BA5C1B3F7C4F8DF6243D30B426720C6132DEBDF064844EA6D21A36", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "155719797" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e26", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBE6UN87gwvyAuud7dSn2d6zdBUWCjgqRG", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A0B45FDEE7A80068C7F95DEC7A4D3FED20DF02FFF2A06D9790131E45ADF9BCCB", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "34510797078.40518" } }, "PreviousTxnID": "A194AD311FBF745DDF5030868B84F5BDCF4C2EBF13F9BBA8B223311EBF53E364", "PreviousTxnLgrSeq": 69044920 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "9", "Owner": "rszRAoxvAYy352HATq5bx3YGKpMBjeW1L7", "RootIndex": "63632A6A77C73734541C586B0AF86C2932DDA8A1BC33996D0BAD887B111E53F6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A0C6B1D149693A85893D950BBB24886737AB84646D30CEE246F6C69B4DFE9B3C" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rEoF1AJrncEkjDkmoQNYxvCp49Wyn6RFvc", "RootIndex": "89CBA147B92B0DE652E4119078318EC3C7690068FB422F738C4280E1F1219FDD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A0D9199272D583905E991D63E7B3566D3A9CA41A2B7DAD74B405FDFBA0161375" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rLK9N8ay11j21CKs3ryC5kp7SYR5piJByc", "RootIndex": "31FAC236F1327A8B8E03CADD3342A9921CCE9A77DBA14A460C80DA47511C6A2B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A122E9B3DE7909E3DBA62FF873A71E15CF1661CDDFC204F632148719DF947EC0" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20000000030.97925" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4oX1kuULiPWPRA2hwV1R7K8kB9gUxqTtv", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "4df" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A15DCE1A9E392CF44A1A1FD0028D57E02EF609F196F6A541F26D55533C220645", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-83189677055.16001" } }, "PreviousTxnID": "A2E9900C0FC14BE06EC622B5CD4864D6A785C9F7402AD07B58D7F7A17CCCA93B", "PreviousTxnLgrSeq": 68966225 } }, { "DeletedNode": { "FinalFields": { "Account": "rDsyrKqgbAuWUu1fmJx84Vgm3X4H53rztM", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937A5B4ED", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "BE37C92576C2663379388445C263F9959AD3387324E635FECE6F3A7BCFC67D90", "PreviousTxnLgrSeq": 68855825, "Sequence": 67693671, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A16AD2E4186931DE8EC281CB92A820F567F06171B2D93573CCD591D40FD2A444", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "23357969598" }, "TakerPays": "1167898479" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "c", "IndexPrevious": "a", "Owner": "rhoYhs7WCmQKMPR22kQ5DhXw3pXQsjUsmi", "RootIndex": "8F1778720AED549F5E26C11363918B910D1C40E5CABD1C8A1EE600D72082C662" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A16E6C377922B0C0BAFFCA9A5316AA57FE3387BE72A92EF42D760FBD8687C471" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rsNTEynqepWnCvBMLb8x3tekWQXG2TxfEM", "RootIndex": "A18B25639CB03250F9E0990A3DA19648A457BC49D1F55A4C6579DA7B75F878FA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A18B25639CB03250F9E0990A3DA19648A457BC49D1F55A4C6579DA7B75F878FA" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rs4wbWdssBMJRgn4tJak3eq1JgrJ7Pgfnk", "RootIndex": "AF9F90BB4444829CEB4E4E4198ADE9408CBBFD7038DB631FD87CE91722AF7055" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A1A3C59AA579169117044BFE394790AF5EB5C296530E288BF81A536F1052B60C" } }, { "ModifiedNode": { "FinalFields": { "Account": "rfe2f8LznaFRfwdoiZGPxej6zbdYAYe4Rq", "Balance": "4190423086", "Flags": 0, "OwnerCount": 53, "Sequence": 66686339 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A1A666F70A88FDE22138B7CB9F81F912EC2292CEA579E2EFD5343A2663FC3749", "PreviousFields": { "Balance": "3640423086", "OwnerCount": 54 }, "PreviousTxnID": "A3112E405E6C6F72B2C51D9155736BD2C6C6251F787D66BF160C1CEFFB50EB66", "PreviousTxnLgrSeq": 69063911 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-19940808093.24649" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJQe5K8Fxn2ktEMbwaWibo9LEYKHjqDzzw", "value": "1000000000000000" }, "HighNode": "4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "5f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A1B06E1E84CA951F9688321A724BF4B9E4159D1E77F521E2C4EDB2F4C393D1BB", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-29940808093.24649" } }, "PreviousTxnID": "5CB20763C11F5175D015753F3B942FDF07F673E7EA2CEF0EC8020CCE69D08D91", "PreviousTxnLgrSeq": 68995009 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "9", "IndexPrevious": "7", "Owner": "ra1aHhcQxB9sHWm7ppBMKEQWs4FTfRGZAg", "RootIndex": "A3F6CFCB36517239CD869C18F5C4463E8F6891EDCDBF24A29C719AED42CF02CC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A224E2F6245202DDFC9113864B4BB9BF57FE2ABA5D2A48F816105D8A730C1B50" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10000000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e3b", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnGd8yRrg47RWDTtRdVRDJvjXHtqgL5yNW", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A23D608C6750551DFF56EDE0CC4AC75C6A7CFF1FCAB969F53411F61E89FEE60A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "40000000000" } }, "PreviousTxnID": "0D836E3B286B09944D76CA1A59EE3F239A9A99DAA73A637B98EE4DD5FD7CF2E9", "PreviousTxnLgrSeq": 68487694 } }, { "DeletedNode": { "FinalFields": { "Account": "rUdhzvzWjHpSjP6CGksiit3bdgGLV5DXZv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 0, "OwnerNode": "2", "PreviousTxnID": "0DC59691D0BD489ABF497FC11CAC8EBCCDEC01AD8A6C327CCA723BC0334980F4", "PreviousTxnLgrSeq": 68778772, "Sequence": 67546185, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A258BBD173BB1EC6346611A30914787CAD143F4817080BD9378C678B282B1A1C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "ra2BXpvnVUqyCNaxAUf9Co2AxYzuey129Y", "Balance": "327085734", "Flags": 0, "OwnerCount": 149, "Sequence": 67609065 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A2885BFCB6A9332557D131762F3011EADA740CB40254D93DFF28DE82D6BA26D5", "PreviousFields": { "Balance": "312685734", "OwnerCount": 150 }, "PreviousTxnID": "F91406D00597008711FFB469EE9A9A2BA8A4890971E34F4B1DE44F136F8B8A41", "PreviousTxnLgrSeq": 69062039 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "9dd", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "racxdehrfnx9kEzWRF2vcMPCzx8WRfF6G9", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A28A1BF4784F0CE8C0A6AA4E9C699D95DB8B1DB9D14CCB0E92CB6523C54B1C23", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "6BB0777805DCB6E0FDAD5EF995C82DC581B7EFD3B2A18D8F610745285C32C052", "PreviousTxnLgrSeq": 67970876 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "4a1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3Gqpysb37rsJfn8RTCG6bSmigvzYPbWa4", "value": "9999999999999958e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A29338A5A4B759008030F07AB7F1AA66ABA489FDD804850A6A1DE3E1410BECF6", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7365224861.568448" } }, "PreviousTxnID": "B29EA50F46ABE8D2C2BF148F0E4CFE0E1C5A45255087FC278565509DE6920CC8", "PreviousTxnLgrSeq": 68902192 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-19749999763.16335" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLCKThc3nyrBN63QzPHKoHHPA2iN8RH9gp", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "972" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A2D6981E72360E4FD1D64E548CF4A91789758CBB7A129372280B7F2806BDAE32", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-31749999763.16335" } }, "PreviousTxnID": "2E0BEF5256305F682A0466471CE585A66A508C0D719353DCA446285DDD2A7523", "PreviousTxnLgrSeq": 68971804 } }, { "DeletedNode": { "FinalFields": { "Account": "raQmxvieBXeCfDzRKXdekiw7qucsszMReU", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAFA8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "9699B21DE420359C3E0D27A399762A11EF6A6B675EB093A03F0E1AA1D9FD5E4D", "PreviousTxnLgrSeq": 68856378, "Sequence": 67458235, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A2DB4D287B62872BB9E2C8D914A75C7C753E4B8A0F43EB982D2E84D4826D785A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "30000000000" }, "TakerPays": "2700000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rJQe5K8Fxn2ktEMbwaWibo9LEYKHjqDzzw", "Balance": "1992744679", "Flags": 0, "OwnerCount": 524, "Sequence": 66694147 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A2EA5A19106582BE4D5CA7028E1AAEF54526366B757270A5167521F1C3687C1A", "PreviousFields": { "Balance": "1940864679", "OwnerCount": 525 }, "PreviousTxnID": "6CE2012424C6230531C93E16107197465A2AB75E639E2E217E18A1FF6A5A5327", "PreviousTxnLgrSeq": 69059168 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rPc9ia41Ad7unkvCE7gKKZPovAuCBPt63E", "RootIndex": "C00C03EF344B97E9DDE9D36F7F85E6B261FFF9B1CC18D44FA106B63838DA70E8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A2FD32BE2154348ED8F1723B0BDAF8A303E5CE4A6AE9F9AF094E39C5FB44CF9F" } }, { "DeletedNode": { "FinalFields": { "Account": "rfn3KpY6HS6aE1vviRjhHfNn3BfuSrhmzv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B159F9AE2ECF6", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "6653C7EB53479B76D6C2DAE746163AF22DC10DA00055310E755839902D5CD2B0", "PreviousTxnLgrSeq": 69031588, "Sequence": 68449354, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A35399D240C10AC8308DF50A6E9D4485D2B9627549E6415EC76E01AF226D84A2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8800001000" }, "TakerPays": "27456003" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ea9", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rqben5VgPyij1hAY4bi4yPyp3vf6GgY3z", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A35BB9EF1ADB94E58FD8F2D8359B4AB8933B38BA63B3BB4E6E289C0F891CC4BE", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "33333333333" } }, "PreviousTxnID": "4C35B128DF9AE413D59B0FBA7333E17946B5C3378ABEBCDA94C6965F7323E748", "PreviousTxnLgrSeq": 68792593 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6071166604.82374" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ebf", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3pDCAfw2nB715iBJVMix9M8adFpHyfGRN", "value": "9999610698104584e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A36AA1A700F58C47EC5CED6A6CD82B0B6DF4D900EFEAF166D185EDA11FF69F3E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "26071166604.82374" } }, "PreviousTxnID": "AC0849BA9437A4829BC26C3F9E0FE6B81CEAC222E4B79681156BF6450BB7BD3F", "PreviousTxnLgrSeq": 68914890 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rpRfuSRwU9nUefy8T4z4RXUEDU2baW1qhk", "RootIndex": "22E325E36150B95B5063CB0358868DC0DC3F9BA49650791B1EB2F8FC4D7EEABE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A3CC222F09DFCC1DD7F1C6DE98F68CB1BFEF67991A7E697E53D251E552351902" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHyR27TRJ73Eu8bqe5wBxX64hJ9Xf2c5XQ", "value": "1000000000000000e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ee2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A445D4189239D8E8D245858737EDDDEB7E00764D937A725F8CB6CFC4F57FCB12", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-50000000000" } }, "PreviousTxnID": "33BB5DEEC2392CCE623157B3071AC108CCC903D1D793339B4CAF8710F840F39D", "PreviousTxnLgrSeq": 69038927 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rQDGBD8WCV3szWgH9rvyhjPHPX66KPGVnd", "value": "9999610698224589e-1" }, "HighNode": "3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e6c" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A4524F6FCA8CB13186DE816BFAECBA4325D03780764AC99B99CA4B894A0242DB", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-11444749501.19" } }, "PreviousTxnID": "F41CF735189E8775D0096342A3A5871046C404F98194BBB2540D7C3104F9B910", "PreviousTxnLgrSeq": 68898515 } }, { "DeletedNode": { "FinalFields": { "Account": "rEoF1AJrncEkjDkmoQNYxvCp49Wyn6RFvc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365216345785D8A000", "BookNode": "0", "Flags": 0, "OwnerNode": "6", "PreviousTxnID": "281347F2D5790B43F578CAC10CFE652745CD5E083A375D92A42216B0AE0B357C", "PreviousTxnLgrSeq": 68996885, "Sequence": 67287667, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A476A3E60C879CE2AE8B6B4915B7147DCC6FA9E803C5DFB1EA99A05D7AD33835", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "49600000000" }, "TakerPays": "310000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "RootIndex": "DAE42822BBC8D9446224B0B3E53894A733650689371B860F29D7E9E0A7FA8F93" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A48005BCE76214A92D0D7DAA0F862DF45816769F9873DAE7244A4DE29006F764" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rUg2bKuyZzQLPopT6uNZK7w4zvJHLB5LV", "RootIndex": "A49DBA4C896E5CBE0B1BEFCA1354963C26585F46C509547842A83E21D1A28E04" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A49DBA4C896E5CBE0B1BEFCA1354963C26585F46C509547842A83E21D1A28E04" } }, { "ModifiedNode": { "FinalFields": { "Account": "rEay1pxUyiL4ru86hJLv4bKCzwm8EL4Mzw", "Balance": "831543657", "Flags": 0, "OwnerCount": 64, "Sequence": 67325256 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A4A85C842B519584176FA08FB90A184ADFC01D29D620EB5F8DD186E2308F577E", "PreviousFields": { "Balance": "153698657", "OwnerCount": 65 }, "PreviousTxnID": "FB6EF0E44AC6B3BADAE66745279443100E7328102FEF07C1623B4BFBB2E30485", "PreviousTxnLgrSeq": 69063761 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "13", "IndexPrevious": "11", "Owner": "rDSSG7NwYYV545mfcRdVExpAU6ys9CqoCk", "RootIndex": "80880B09794A9560ACC8DCA596479D6499085A386CECB1E62B1021BEEFBF0FC3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A4B2A072E5F5704CE8FD121064B6D14810AF64492D38F4E203343878D01A1496" } }, { "DeletedNode": { "FinalFields": { "Account": "rNirEvsSGiRDGtL68t6MJwfAyU1MExreYv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF05B7C717688", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "2B6359C2FE92EDE73D4E259286A22F1B95EB5927365FD4AFAD017F4557963EB2", "PreviousTxnLgrSeq": 68898711, "Sequence": 67544609, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A4B8692180D30516FAECA13294564DCC2E7B675604EE3CE7B79393CF1882AEF1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "24903444053.01201" }, "TakerPays": "223881962" } } }, { "DeletedNode": { "FinalFields": { "Account": "rD5TVx1akARpWNKumsadd69Wask2L69v7E", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A4C376E4E33F1", "BookNode": "0", "Flags": 0, "OwnerNode": "9", "PreviousTxnID": "70AFEB67C0B4B2097C4A0784E82C8F35B444DC94F730AC13AFAC316DBC6A3E59", "PreviousTxnLgrSeq": 69024565, "Sequence": 66269662, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A4EFF93C1F56CAC095BF99424136495A0F4B7491B13136AD11D9D8BB3F7F5638", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "11557500000" }, "TakerPays": "33500000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "23401884889.582" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eb6", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwsVYq1xyweADXhtBLLfr2X9FL57DnGTk3", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A4F13AFC64DB09E617B928404D9090B77FB81EA6329E77C9B3C8695B24A7D2F5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "25500000000" } }, "PreviousTxnID": "2C6210D0035C1FAC126CB13759A1BAA5BCA893BA6FD598FB977C5A2BECCCEF12", "PreviousTxnLgrSeq": 68992730 } }, { "DeletedNode": { "FinalFields": { "Account": "rJ5v25nqLv1P2Fij67kW1QE6iWqthP89v9", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304281BDA0E6C6B", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "B576349CB857CAE5C980EB209BB89B68E66296DA278CC7D37B573CA821B14373", "PreviousTxnLgrSeq": 68886473, "Sequence": 66614772, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A582C8341F945AADA7628A22B747C9F88420F2FC8B412021690DFC2517621718", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "91096081" } } }, { "DeletedNode": { "FinalFields": { "Account": "rnSxpc5YM8agfwsEHN3F3EKN9WQ8yyTcAf", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530FFCB9E572F348", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "FE1194FECDA187EFFF39758778EC5B991FB8DD0C6DFBAE9A058428CDF00BCB72", "PreviousTxnLgrSeq": 68885072, "Sequence": 67372679, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A59A6B152A2DFDA544F7B7EF6294CA81465F88060312958118553E4A62315878", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "33333333405" }, "TakerPays": "1500000003" } } }, { "DeletedNode": { "FinalFields": { "Account": "rsdrgJ5xtkPpnWfJeeshHZLWmQEMS3cFzQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD498D0000", "BookNode": "0", "Expiration": 722825150, "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "AF3DB2E35A31999FA01A69667BF91E3ADEB758519D572B5EF6ADB28472AD8325", "PreviousTxnLgrSeq": 67961527, "Sequence": 67219913, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A5E92766C10185BBFE2CF1E6487A34BDACAA884DA66E87571BC7BAE9369BE2A9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9000000000" }, "TakerPays": "180000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rKTKekwyDDoxNtZZTwXL9ebqeVYRp47BVq", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E32B478974000", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "0CF94EB4B06168F7AF6785929CC77CB71B6E0F18A0396B5283F6F14C67D16FA9", "PreviousTxnLgrSeq": 68883941, "Sequence": 66512340, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A60B8092B78C8BB2429BF2ED5DFE2D1BFBA492AF07325C9F21B57E1B0F72DECC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12000000000" }, "TakerPays": "102000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rC4M78e2ktZz8QwB5SUSEeeeSi5rcnxrJ", "Balance": "946891922", "Flags": 0, "OwnerCount": 211, "Sequence": 66527175 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A60EF52B86FE705191F52D4AFBF196550104B30B26A48881505EC907450D089E", "PreviousFields": { "Balance": "632997727", "OwnerCount": 214 }, "PreviousTxnID": "EEF1D1B99391834037449CC492BE6542D1A67D211B76CB2D8ECCB6D92819A29D", "PreviousTxnLgrSeq": 69063828 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "20108393198.77231" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "59c", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUrtZA3gFTbfu9vkdygv2jzgBoFRYMNv5L", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A635BDCA41431CD271092535A6D2F7BCED7765C5F69E1B2A3332B8E66D3F107E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "30935989536.57279" } }, "PreviousTxnID": "E3AD283C9617060D2D1FED441EFBE9726F080D930F989ED0F376EC78295D2F1C", "PreviousTxnLgrSeq": 68939846 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "Owner": "r9edE9m7sNZEwgT6foU8ahfA1ocrNify92", "RootIndex": "A7F6B4896A9411DAFD99903813D058FEE281A7575316127C4C3971444E1802F6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A64235A795777BB3B3561EFED34D75A6C8489A63D94D2A1DA425C3802E5F751C" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "11", "Owner": "rpTLVf85qXWoPWNyeUXnTkc1isdAWLCYh6", "RootIndex": "00482C4BB6DBE57ACFC95A6AE413CA707E0E8FC3427DF34DCF950E33BE8A3671" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A6A01AFA1B26772A7D84BD21D403319D85B3FD1EA14944220D0A93793C93900B" } }, { "DeletedNode": { "FinalFields": { "Account": "r3Gqpysb37rsJfn8RTCG6bSmigvzYPbWa4", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5E3A6735", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "15D58BCD2BE1162625685FF5CBD956286E1913DCA332FA7B6577354118E08579", "PreviousTxnLgrSeq": 68902233, "Sequence": 67430613, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A6A2B3F242A7FFDEC049AB9AD939F7892DFAA7C59528068D687F4C61B5F3AF7C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7365224861.568448" }, "TakerPays": "72915726" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rJFmgWo13y1o6C42H1LC7qDWcu7Z38QaAd", "Balance": "1830225932", "Flags": 0, "OwnerCount": 64, "Sequence": 66550708 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A6DCEC1E63DC054EA23A1E8D33C7A78BB61EE895BB5A972814553EEFE29560E8", "PreviousFields": { "Balance": "1510225932", "OwnerCount": 65 }, "PreviousTxnID": "2069ECE0A887FB3BEB37EE752ECC942BEFED022FAC74B8559AC544C5FF4F8BB1", "PreviousTxnLgrSeq": 69063408 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "a", "Owner": "rMrt91RkHZwmYfUbVX72iwmbiaRxnKXjo9", "RootIndex": "2DCE653DA8040F38D2A133192FB23D6A31171489C76E8C4873E775525AF64637" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A6F6BEC078D424C49F0FB405474832144AAC20503CEA74FD3B1F5A97C160472D" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "b", "IndexPrevious": "9", "Owner": "raBj3rXVSVdcA66ge5mMyS1iWzMFSyxmB6", "RootIndex": "4055FB48F322A08E99C1FCA77D7AD19784377E9B1E21FEA735B436716693D21F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A7084642202371A37CAEEC18109B314B4BB2016E1C89C736C4439FFCA3888A68" } }, { "ModifiedNode": { "FinalFields": { "Account": "rhxWqi4kQsADuck5wUsbXCcR2Pq44kbjZs", "Balance": "253695775", "Flags": 0, "OwnerCount": 65, "Sequence": 67431414 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A73067CFD6C84522F3ED0C2C0F2A57CEE91D66F846DA69B0FBE0B06A4787ADB0", "PreviousFields": { "Balance": "200304861", "OwnerCount": 66 }, "PreviousTxnID": "BB42CF884B6F900D5BBDBD689BF59FC422F5C29A50E32485244C7AF32E297CBA", "PreviousTxnLgrSeq": 69063545 } }, { "DeletedNode": { "FinalFields": { "Account": "rGJ5He1dXx78w8pGB7zHH9K7dWd9pF8p39", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "50ACFB65011D41507415148EEF3ED8C08BC5B25A3960B2D2F7A81515A1D3A39D", "PreviousTxnLgrSeq": 68876447, "Sequence": 67090000, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "22000000000" }, "TakerPays": "220000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "A74936AC59606665B40FA9275B322F632E5D73844D9C424B50560DE1A0E6C2CA" } }, { "DeletedNode": { "FinalFields": { "Account": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CC45E4884000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "B2DC679B509411CD9CA69F2B95EB17798EC8E8808A41CB09FD92E243931D271C", "PreviousTxnLgrSeq": 68900183, "Sequence": 67528327, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A79067C31C0083C5CBC67FC42A949B7060293D36E98D1B29E4B45FEE4A228101", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "34900000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r33yXJH6HkJc128VKpjvrcdC89M4zDaP9f", "Balance": "121527745", "Flags": 0, "OwnerCount": 21, "Sequence": 67761617 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A7EE622AFE4D63967C6704F5F6A7BCC5F80B5D4858BEF44455F9526B1A6ECBC8", "PreviousFields": { "Balance": "60874884", "OwnerCount": 22 }, "PreviousTxnID": "70F595C1C55B0D64679C9CEA9B3C29F8D16AAF21A291014BDC9556213E2F4731", "PreviousTxnLgrSeq": 69044055 } }, { "DeletedNode": { "FinalFields": { "Account": "rnEA5VmDp13iDZdcGUg2X2nzYkaKKDrf86", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C110215B9BFFE", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "DD53BB45E3C5833A3EC50558D5E4FAECCF8664F214315B453EAA55D0DC49F2B0", "PreviousTxnLgrSeq": 68932365, "Sequence": 67525827, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "18106227692.30771" }, "TakerPays": "143039198" }, "LedgerEntryType": "Offer", "LedgerIndex": "A80DF912740DA45865DC78BD1F6025892904583D3E13CE26BF0AEE84D537FBCB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "41000000000.00001" }, "TakerPays": "323900000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r98DGNQEGR9x2bhRVBbuiHAqxq2aDD6pKa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E718D01261361", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "C1D4827EF4940F7635B3366B2ACE8384176F755B3D9E463AD3FF809C5BD340A0", "PreviousTxnLgrSeq": 68997788, "Sequence": 67202779, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A83044815C39EFFED830CEAF8B9F4A9DC8EF04FFA32A32B7A9488A8DFA500285", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3321412528840000e-4" }, "TakerPays": "1350320296" } } }, { "DeletedNode": { "FinalFields": { "Account": "r9ma91EcMDXDCLQZDvceT9tDwHRT41gumt", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26AB39D69", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "3AA110944AC3F2DDD2A17D436EC18083179C60426CCA20E5F6AA23E52F872783", "PreviousTxnLgrSeq": 68901295, "Sequence": 67518236, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "A832FAE6C64A1BE78EC5E0A29CAB871F1936845F33AFEAAEED4D5AB460590C1D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7786389866" }, "TakerPays": "77863898" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7000000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPVXceb6wrQp9apSTtyZmWcxKmYRBnCsdt", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "6ec" }, "LedgerEntryType": "RippleState", "LedgerIndex": "A873C7EAF6D63D7BA47E5511409D758297751D832096141D91708582DF1BFEA4", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "05046DB0D93993F17D1496CB86B4C173798DDCD5D18825DB20A3B7FF2CD3978F", "PreviousTxnLgrSeq": 67994399 } }, { "ModifiedNode": { "FinalFields": { "Account": "rKTKekwyDDoxNtZZTwXL9ebqeVYRp47BVq", "Balance": "511202660", "Flags": 0, "OwnerCount": 130, "Sequence": 66512409 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A8BEA3312D3713064AE079EE0FFF99669EEFD0DC887D1030E9CDA99BD912E94B", "PreviousFields": { "Balance": "409202660", "OwnerCount": 131 }, "PreviousTxnID": "0A9FAFA7D0F6F9B9A7D9411AEB1E07C7496D3D3D03C5AEF768EE1FEDE8C83D85", "PreviousTxnLgrSeq": 69061652 } }, { "DeletedNode": { "FinalFields": { "Account": "rfq8N8xR3stwknY7Smup425CUFCjsTwcWP", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222D10C4D5C0D80", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "DA12E33D26557082ABE1A896E82F16D47F53642810A8875D81F3518DD8EE8075", "PreviousTxnLgrSeq": 68790474, "Sequence": 67058113, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "32700391407.10224" }, "TakerPays": "320463835" }, "LedgerEntryType": "Offer", "LedgerIndex": "A8CED4E76946778300D7FC69C4F99406BFF30DABC72D85B66518165C2DD4EFC1" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "9", "IndexPrevious": "7", "Owner": "rLPotHoaZNMvAKnTE1xUaVYsHVKKf3SzYY", "RootIndex": "E92946311A8D67A1A6C44AFF7C7607F050F7AB45D969D3FF60C22B6F235ABDA7" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A8D01DC20ACEA4E4C8BEF9CCCF614EFF60A4DA431520114594B4732EA5003377" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rh4Vn8BNfpDZecwkh39GQvYJ7b7osZfML2", "RootIndex": "D266B60DEDCB58F1302E2EC326F65DAD99442B0A3892B33AF70A030F8003B091" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A9385503D7853551C83EC33251A2FAC4368E7E95EA6C67E951A803DA7F215921" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rHycUxo3HpqiVRhve7H8L4y94dvPHTubXw", "RootIndex": "15A63197DC120F0DBF4D6554AD08D374F15ED4242DB6396F1A24D4B4D45765E9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "A9C033C58B66508F715351E4F289EE730DC9A67997DE4E2613E65BDBC57A6F72" } }, { "ModifiedNode": { "FinalFields": { "Account": "rB7sr2UvCBewPJXg9My4kjDFWDF9URdRuJ", "Balance": "343730068", "Flags": 0, "OwnerCount": 110, "Sequence": 67712961 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A9F8127E33CFA44B2962E5680498D35AAD667FF520C32B9742D8C99ED1DEB62F", "PreviousFields": { "Balance": "291684269", "OwnerCount": 112 }, "PreviousTxnID": "CAF5ABF46EFCCC0A3C15A89E368E4A6F120A60A72971FFA2C496259AD7C8BED5", "PreviousTxnLgrSeq": 68986684 } }, { "DeletedNode": { "FinalFields": { "Account": "rLBBX2NYwmoiRB68BQP3eo15BbaYtR8qdK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F4B69DB", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "28544CEA162AC5EBE12B811ECAC9E6BA9FBDBCE647A72F29A1641165B0CC4078", "PreviousTxnLgrSeq": 68816537, "Sequence": 57721429, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AA015C4DCD58F7DE97ABCB9BB7195E9BAAC643AC28D19F8C3428A5E47EAC9414", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "778598986" } } }, { "DeletedNode": { "FinalFields": { "Account": "rJxQUBBc7qcHrGcjrb265KwXeZrVio5Eri", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207AB995BE77C8B", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "BD4228BA16A8C66F3AB238BCB006141DB267D30AB9C8FD3F1798AAB7A11907B9", "PreviousTxnLgrSeq": 69056140, "Sequence": 67219935, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AA386AECC4E77D658361699869EF2A727F2C7F3095CE56CCB57C65C4F68D57FC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1399241951779892e-4" }, "TakerPays": "302096337" } } }, { "DeletedNode": { "FinalFields": { "Account": "rsGTbAufvBkkN5xpaKZtEMCagAW5SkJEUL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653081A8EB110F5C0", "BookNode": "0", "Flags": 131072, "OwnerNode": "e", "PreviousTxnID": "375C126DAF43BA6AE280D4CC1796FF9A7DE4026ABE1422AE4CC9582909841257", "PreviousTxnLgrSeq": 68012566, "Sequence": 65899667, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AA4C1856FAA418889095EE7BCC8B2BEB5F7FDB3F8317229408E60D5D758E867E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3503695439.7" }, "TakerPays": "79919292" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rPpC3LrzwLjh2qU7XtQKFb4GCZyAUHz7Ss", "RootIndex": "4FDE2CF0716C44802B12BE3CB7A54B50CAC3131F61FBC907E69D3CDE73876EC4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AA736B186E2671E9B6D14C9FFC00DB0CFBDCB0005166D023EA0635580359128D" } }, { "DeletedNode": { "FinalFields": { "Account": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082DA82445E000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "AFFD3B8701CEFFAF22F9B56F13DC912BEEB1963B0F2266C70B8574D89E5DBBA3", "PreviousTxnLgrSeq": 69054943, "Sequence": 67440526, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AABD41976A4B8CE8B26AAB4CE3B781308F9666D9BBC5EF8C5C8D551F08ECAED3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "230200000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rK1QTLhkJgn7zvG8ZcGJea3XzWfj45xhRE", "RootIndex": "B6EF8BFF123234E8BA582113E1AECDF652ECB60A8C5C4B8D2FEEC7CE39044E48" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AAC2C8603AD1304B7F5C9DF934BC741FE66901B81B429C79A44049292B9E2A7F" } }, { "DeletedNode": { "FinalFields": { "Account": "rUrbD1rAAkr84UER2ZUxTP5ohhSKzvC8tc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C1102156D74C0", "BookNode": "0", "Flags": 131072, "OwnerNode": "10", "PreviousTxnID": "4175C06286D47269B3EE92C550849E3D8FE6C16FC2BB1F489BC4956AC50599E2", "PreviousTxnLgrSeq": 68905676, "Sequence": 65999090, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AAC5013CEF59F7F78CB705D3F468C646DB30413EA4B44AC54288E2F2B36C61F2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000000000e-4" }, "TakerPays": "1579999999" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN5wcyJZjT6Qd7sJZiQg2SHVtjnmqiq7W2", "value": "1000000000000000" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "1ea" }, "LedgerEntryType": "RippleState", "LedgerIndex": "AAC6BC14218B57416AAAC179F729FAB74C123008A91C654B34503F78E7711107", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10000000000" } }, "PreviousTxnID": "7045A5C5E72727C9B23D96F1BD652DF60FBF6E333F9614D8DEE3577FCF87EE5E", "PreviousTxnLgrSeq": 68070769 } }, { "DeletedNode": { "FinalFields": { "Account": "rwmZ1gXEQzFAzzEmYyGjHDhmccg5SGj7WS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531717B72E63E229", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "4121990F92979EFF352AFA25CA3E0355A6B418C70D9CF1DE36BE743C0188496B", "PreviousTxnLgrSeq": 68892751, "Sequence": 66329417, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7021934395.5" }, "TakerPays": "456425735" }, "LedgerEntryType": "Offer", "LedgerIndex": "AACAC003EBC79103AD050DC075D62E3D8380F86FC8581DAB76FFDBD4F25F20FB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7796019890" }, "TakerPays": "506741292" } } }, { "DeletedNode": { "FinalFields": { "Account": "rsVD9Hdd3p4LMC7vUwvx75uNLY3d3eiE2b", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "5A1C3AFAE17B4FA3BCEE9348C758048143B0F2674F200538DE46907149F99071", "PreviousTxnLgrSeq": 68008819, "Sequence": 60706988, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AACEE75C8C6A113E2CBD304F68B2E5E19EA1A691B5E3C4A66803B1C3EBE55C24", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "racxdehrfnx9kEzWRF2vcMPCzx8WRfF6G9", "Balance": "109053134", "Flags": 0, "OwnerCount": 35, "Sequence": 67791226 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AB139C83D14AAA75827D87A2F32D98F1420D0C6CC70F072F2C1574A7CE4047FE", "PreviousFields": { "Balance": "88030962", "OwnerCount": 36 }, "PreviousTxnID": "8FBAC469CDE97C930941360C6EB21D0B7ECB6B21E845144E9A7D995110359A09", "PreviousTxnLgrSeq": 69064147 } }, { "ModifiedNode": { "FinalFields": { "Account": "rh8TcfXzDZdQBB8R9aQfE2zUUwpd1zbEWv", "Balance": "3826872428", "Flags": 0, "OwnerCount": 20, "Sequence": 64540141 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AB1DF9F9B36046643FE7EC17B2DBABD53F3BFB9A088454340B027E0C7E340C90", "PreviousFields": { "Balance": "2226872429", "OwnerCount": 21 }, "PreviousTxnID": "1F53C9F4ED52A9F4678FF0303A126FDB51D1A3F12033F248189173F5EC404372", "PreviousTxnLgrSeq": 69053899 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1200365875950437e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEqtQj662PMqja6Cb3pyK5V6xi2RGbcFxD", "value": "1000000000000000e-4" }, "HighNode": "3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "63b" }, "LedgerEntryType": "RippleState", "LedgerIndex": "AB4868A49FC4EE506D33226E7F5A6636297AB18DB7C0BFB3A0AA4BBAE609F0A2", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2073658160009827e-4" } }, "PreviousTxnID": "ED77B637E0DD68C6625AFB28964A9BB217C7FE9187110F2223E9CAFF656AA0CF", "PreviousTxnLgrSeq": 69015706 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rT8my4rryyrydKwE4W9LqQNosfNjZQb3r", "RootIndex": "CEECA269517637364CD26024750DB8696D0B6049357AD74598E564C1029C25CA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AB5FA1569EAFE69DE5D8B3765F617E0FD60F2D4CA6C803D6A0FDA6B134ABD31E" } }, { "DeletedNode": { "FinalFields": { "Account": "rDwdy5963o51eDFKzgJ23VJUy44AX3QrS6", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4F367603", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "4B2B153BDAB1F289FA5E237CDC8612A5CE1BBDE7A73D577CBF958B85B4DEA666", "PreviousTxnLgrSeq": 68950129, "Sequence": 66614439, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "ABADAAD3D2BD68291348D6993D8F71D972428E0672158BFB2F47DAEC531F7BD4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "52166132" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "raKfcCtqnoopzuWrRWY88p5hbTBmF7RzTj", "RootIndex": "ABC961C8C3C4D4C719CB2A456199B453E04E61649B1B7FBE6F708C323ABE5F6D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "ABC961C8C3C4D4C719CB2A456199B453E04E61649B1B7FBE6F708C323ABE5F6D" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "6", "IndexPrevious": "4", "Owner": "rMrFWesXLbeMANpexJkZdYYtCwhqot4x6B", "RootIndex": "5EAFDFBD8C1EDCD776A74B3FBB62C79A93496BE28DCE4F3741091AEA2C08B08F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AC06E3F7B84A78DDBC749CD9ABD645E5B9133319EEC5AFA427BED9C8F419CFD7" } }, { "DeletedNode": { "FinalFields": { "Account": "rMRX7LEEzj9s3Hm3fysfBXnkNzAaRbDawT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C3793747E980", "BookNode": "0", "Flags": 131072, "OwnerNode": "11", "PreviousTxnID": "BE50BF6A18751D8F90461B455FDA7BB30BB780AEB043056B49AB572B772A68CA", "PreviousTxnLgrSeq": 68901742, "Sequence": 65793745, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AC32F292830AD50E2616BD2CC904CBD642C232673F69F27FDCCC04249DC999A2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "499999999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "177", "Owner": "rGT6ze5CuPEUzsk92YnLLkEqjv6qqhabrF", "RootIndex": "2279C9615150BD251FCF0F1A84C119C6B19DDF9460D01E9492930D3887126F83" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AC3A86606DE6F09E0145927A474FBC2E986ED9D1871DF40A012DA433E0EEFC4A" } }, { "ModifiedNode": { "FinalFields": { "Account": "rfc7iQscNnWECTgwfRg4T6MExyVTCiTWTV", "Balance": "8502484222", "Flags": 0, "OwnerCount": 40, "Sequence": 66755402 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AC6AF63A5A58D38D7DC15DDEDF895C773A68CA0C096CDAAD8F8F5AC6E1DB142F", "PreviousFields": { "Balance": "93615167", "OwnerCount": 41 }, "PreviousTxnID": "A2961E5675266689ACF53144E868BEBECAEFCEFD7DE62DBE6E245E22169B63E5", "PreviousTxnLgrSeq": 69043123 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rNYRNtrFPumPwsB7zbi3VjZLg6WLWBUJvy", "RootIndex": "73E830BB83876DC36209608EBC560F237C937805C716E48A17394AA18A99FDE4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AC6B6A78BECB85C2CE19382E1C87F03DD7C29A1A76BDF856916364E21E4A632D" } }, { "ModifiedNode": { "FinalFields": { "Account": "rPpC3LrzwLjh2qU7XtQKFb4GCZyAUHz7Ss", "Balance": "533134700", "Flags": 0, "OwnerCount": 52, "Sequence": 66167450 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AC82C65A1D67CBB2C7C0F71ED6771857558EA9923CEE67C726F552139BD3C6A5", "PreviousFields": { "Balance": "359384700", "OwnerCount": 54 }, "PreviousTxnID": "EC9800021EEAAF4DA8448FEA622F8EDE3F6F6FD543E22F0A8C33731F61D2687F", "PreviousTxnLgrSeq": 69052417 } }, { "DeletedNode": { "FinalFields": { "Account": "rBR21hAWPJuTd1btLDfunkJUeRSWsEaLpb", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5E620C9389BA", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "7A3B74E9CB0A60419B5E53DA4003A8B3B6CB27D68516E3213BD819DDF89E66B1", "PreviousTxnLgrSeq": 68999875, "Sequence": 68736088, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "ACC2BC434B268D2AD3D7851071F1FCCE6C2FF0A926F2E9FE9FF0214C025ABC09", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4407112250" }, "TakerPays": "14102759" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rnhFkVQVhLHoMBNc5aUNk5fRvZfXmt16nz", "Balance": "389983985", "Flags": 0, "OwnerCount": 70, "Sequence": 66616955 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "ACD1174EFFE7094AE4D489C9C9F3826AF28EB5F46E85E3531EE481280293BC34", "PreviousFields": { "Balance": "315324129", "OwnerCount": 71 }, "PreviousTxnID": "863E7529AE38B3841114E21C2A0EAAB9038900896CD2BFB20F61B2837E02BE50", "PreviousTxnLgrSeq": 69042936 } }, { "DeletedNode": { "FinalFields": { "Account": "rMhxYNNMAgwGdSciDqnCb8tVqJZ22VCCL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521270470A2507A1", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "EE00895C53E2144F335276F88057648D8987809A96E1A3FB645DD9D5E39BE270", "PreviousTxnLgrSeq": 69050058, "Sequence": 68815969, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "ACE84A25149F8AB1557128EB749289AE39560A7DFF85A6FC60AB6A2271AA8DE3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1881122768316515e-4" }, "TakerPays": "976302716" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rUqgMfiCKp2L5Y1zobkQTgSdVYLp1PASt5", "Balance": "1182324424", "Flags": 0, "OwnerCount": 22, "Sequence": 68911114 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "ACED16143A52490714A31F34E03E162308E68B874B0C88E2E6CA84B9495B3792", "PreviousFields": { "Balance": "62999735", "OwnerCount": 24 }, "PreviousTxnID": "FB922312EC0F3FF3F290B77EB5366FA4427BBD20EBFE89184E3E3E1ADB02AFCF", "PreviousTxnLgrSeq": 69063115 } }, { "DeletedNode": { "FinalFields": { "Account": "r91eSWyof8C4aiDL2gM1xTdmc9GJy3rTWb", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "BB9E48320EC13D7FA3C68846BBF53CC1E159D4577F935CC9C189EE2AF6B20586", "PreviousTxnLgrSeq": 68897281, "Sequence": 67326801, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "ACF7EC5A7BD0F14FD4B40B40C6936813E612AA6FE5127F8A633D4709711824F4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3500000000" }, "TakerPays": "175000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1352639.19146298" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKVDELWvNMyoxDQenRjpToSvsLL7RwR62h", "value": "9999610698104588e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "eee" }, "LedgerEntryType": "RippleState", "LedgerIndex": "AD1F840E5D3229D563D767584A6A0F2D92E16FDF1010E9D7BB2C976754FBC91A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-27052783.8292595" } }, "PreviousTxnID": "E2EB830BA8DB5FF1030E90A86113769DFA44528887C78BEFB8C715706449A03F", "PreviousTxnLgrSeq": 69015401 } }, { "DeletedNode": { "FinalFields": { "Account": "rUdhzvzWjHpSjP6CGksiit3bdgGLV5DXZv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD498D0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "CAE0B53B094E0F0AB105D742B42CCCC662C209C4DF74225B2605ED8FACFE3B22", "PreviousTxnLgrSeq": 68153687, "Sequence": 67546156, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AD7A7E6CB64517501978135BB4003D58F2391E3C57113CBD9B973230B260C743", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "200000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGUKHhcBwNpS8WUqpxNsFW6Yhy6ZwEuATq", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "A04365550568C002CA297CA78CE3B7A34FD8B2AFD93CC9ED2A343DB038A65032", "PreviousTxnLgrSeq": 68898688, "Sequence": 67761584, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AD81FF3F50E2B4481C6037CCB3D318638EE12636D86CA9F45B316788D5EAFB65", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "60652861" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "7", "Owner": "r4AXMmLxiAtMf5yvyqqCZeHVhswjdmNgBx", "RootIndex": "77A732DDF8DAA8C78458615090A9E405573E65BF66E0377D7F884433D6EA71CD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AD8D35CFA04997CEB1832ADF8BD32A69559C4A9AE1D24C815C80B5EB0F1E85E9" } }, { "ModifiedNode": { "FinalFields": { "Account": "rHSPavv1zYMxcqPUHEeQqwMSQgSzadAjM4", "Balance": "959355194", "Flags": 0, "OwnerCount": 361, "Sequence": 66504597 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AD90456C4D8A640DFB4A316D9E5CD5EF76909A1B87B25125102543FC72BECB19", "PreviousFields": { "Balance": "879339194", "OwnerCount": 362 }, "PreviousTxnID": "92670D1C3AEA124E0964DA82C6F9691FA1AE3740B2090278F93EC5C1358BA03D", "PreviousTxnLgrSeq": 69045518 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUrbD1rAAkr84UER2ZUxTP5ohhSKzvC8tc", "Balance": "4530859626", "Flags": 0, "OwnerCount": 177, "Sequence": 65999151 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "ADA4836710DD8C06B7F4318E32993976A8524558D8D4CC0DAF77A8EC0C54C032", "PreviousFields": { "Balance": "1773824975", "OwnerCount": 179 }, "PreviousTxnID": "2EE88F62487E1125C372F0CA14EEC81E26F399821B137BAE2AA245199D692142", "PreviousTxnLgrSeq": 69061585 } }, { "ModifiedNode": { "FinalFields": { "Account": "rpRu4PM7TpS2K481Ac6ESUDRf5QmAfc6M2", "Balance": "676840329", "Flags": 0, "OwnerCount": 67, "Sequence": 67535493 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "ADB664312900A06C5DDB828E9E3099DEA04DFBC3A4083697CECACDA6AD11F741", "PreviousFields": { "Balance": "176812970", "OwnerCount": 68 }, "PreviousTxnID": "E366384E7730647482B0C466A7FD85A7D287A995C2F76151DFC823A5569D8C5A", "PreviousTxnLgrSeq": 69062190 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rKBxw9iprFx2LgVfPdthKb6oWUYBLVm4Jw", "RootIndex": "BB87AC457B10ABAED9248B71C6956FAE7B2EE3DA4165293F687461B0BA13E113" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "ADC1C77B1B5DC3183A137726A329B0EC9D1B89C438FA348D3D42AEB4EFCF3B45" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rKMLJSbumUE4mnXET6X1DDFF6JsN8wE8x9", "RootIndex": "A5A81EBCC403E31A2D6E774240319A07F8419AB85B1F7B753CCDA82E06EE6DAF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "ADC5D5CFB78426D57BE8F0990711EFFCF5AFD6E4177D1FD6A78A4373050F812E" } }, { "ModifiedNode": { "FinalFields": { "Account": "rfh8snfXUdwqc25vUfwxJxJnVM1n1dJvoh", "Balance": "852195383", "Flags": 0, "OwnerCount": 165, "Sequence": 67755993 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "ADCA0C47DBAC77D73177039FEEE2861AC45B23A5C1DFB7C881A2F1244FDA17F9", "PreviousFields": { "Balance": "575361491", "OwnerCount": 166 }, "PreviousTxnID": "F19DC6D5DCBDF663917BE73CF3ADD8E3F15244DB4736AE0F9B10DD4794D3E10A", "PreviousTxnLgrSeq": 69054166 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "42510580779.17469" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e15", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnfs5ayanPy2X7aQERUoayaokxjuH361V8", "value": "9999688558266533e-1" }, "LowNode": "7" }, "LedgerEntryType": "RippleState", "LedgerIndex": "AE1349DFCE283224BC4812ED1BD1D2BBC575AE9A488C53F0F1D470014B0012C8", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "55105844569.37469" } }, "PreviousTxnID": "20FF240E7DDABBC74AA136159C5F6715FFC79C79F45D3C44C1169CE93CDFDF1E", "PreviousTxnLgrSeq": 69004178 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rUMbRuiufkSUvwXG6HBXYHTW9TpioNBKjo", "RootIndex": "20A5EF47432509ACB7D925234F9CE7113F81D8D345FB3B0CC81E187E8018F983" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AE30F3553DE5B49D98A325A1E7076D0E6FC5DFF1A1C0838076DF9E6D72E5E53D" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2230920909.37003" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rM4cm11HCu1riLq9BwfzciDUZqfX2Phq52", "value": "1000000000000000e-4" }, "HighNode": "9", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "d58" }, "LedgerEntryType": "RippleState", "LedgerIndex": "AE3E28C53ABAEEFA714856982489C9E47505CE4A57D53DBDA640AE8941DAA80A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7230920909.37003" } }, "PreviousTxnID": "F746F87C6C716EDE09F65DA4119B2BCD07D2BD1EB0AD7B1280CF410C6F47CD7C", "PreviousTxnLgrSeq": 68937558 } }, { "DeletedNode": { "FinalFields": { "Account": "racxdehrfnx9kEzWRF2vcMPCzx8WRfF6G9", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520997A2B8020583", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "000AE05262D8BE1CBEC1B5478DA9F3DA9E0052A82F2E39607A4915B21F278299", "PreviousTxnLgrSeq": 69064082, "Sequence": 67791222, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AE5634CE5A7BD7441A688B98F40246543C74A8AFA4255D308B9579C167A1AA06", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "21022172" } } }, { "DeletedNode": { "FinalFields": { "Account": "rnZhNn5hFGdBk7UTE5hLjBZFNrYGSs1wHQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521965FA4145F334", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "BBB51DC4162838AE538E60EA631B4CA8C0ABEBD22B9A49322A8AB48D18D31423", "PreviousTxnLgrSeq": 68920271, "Sequence": 66615471, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AE60E03EB8FA917AF2C34378CEA770BDC0D9D365DDE293BCF3329D18BF94C239", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "55662041" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rnsZFHUhKJoPt3oh269oP51G4j5HDCNNBg", "Balance": "96387164", "Flags": 0, "OwnerCount": 26, "Sequence": 67560842 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AE86EB63687CEC5B03FFC678C93D2D3134AFFED3D884797E76B6E1083CC313CC", "PreviousFields": { "Balance": "90087164", "OwnerCount": 27 }, "PreviousTxnID": "40A744E1E373E4100502B4FE3D1D0DF327486533047B388A037D3038A1B8A982", "PreviousTxnLgrSeq": 69063683 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "7", "Owner": "rHWCQnGF4sc9MqnA8GpZC9L8SZmzv5zkMp", "RootIndex": "05471B1C8987924ECD993A8762A05730F606BF815585D1E19268698094358CA9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AEADB1B5A8BA7D707C40AFBF4CD7CE43E83474CD7105D7F0793CADB7A120398C" } }, { "DeletedNode": { "FinalFields": { "Account": "rHunttX1NcJT4kdqXJZaqjkU7zeMmJuauN", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937BD4C21", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "FFEC191BC7AD105E09FE0B0031680A4404FF474A0793248035DD051BF40C5615", "PreviousTxnLgrSeq": 68984895, "Sequence": 67298198, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AEB01992869204610B64C1F752701E634500CF77106FBD6B21B26D7470845A78", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1154462616532678e-4" }, "TakerPays": "577231308" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rNh79kZDsubi13bjTw64kBsKVWepnDT2J7", "RootIndex": "AEC1865E1AE4C97E43BB52AA94E6C8129306456F042655EEF195D2B2ACC44C32" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AEC1865E1AE4C97E43BB52AA94E6C8129306456F042655EEF195D2B2ACC44C32" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJKHj2kBpPFHbEu4m2uuSuh5rQEcAYwJ8Z", "Balance": "1110794353", "Flags": 0, "OwnerCount": 241, "RegularKey": "rGe6YD14SMJXSasbTw6fNHnK9ZdLh2PMUw", "Sequence": 67088091 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AF0CC7D79604789E89BD7E613AE87C5C6AA7062C5FE0D87DAB4C71728466A803", "PreviousFields": { "Balance": "1047794354", "OwnerCount": 242 }, "PreviousTxnID": "2CCF77BE0CD2F714D45815FEBABEE8EF8C0A63F0F1E75BF540F9B873DB9DE98B", "PreviousTxnLgrSeq": 69062258 } }, { "DeletedNode": { "FinalFields": { "Account": "rnMENGbcT6QgrfDGjz7UJvyMryD8YPdi3y", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EE00DE7A899C6", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "1A3DE882FF56D5A6DDDC6D669E3D0AA690BFCF88262F5CE09C907ACD94386D8C", "PreviousTxnLgrSeq": 68991027, "Sequence": 65874419, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AF308EB1FE236CECCB5C85CA29D3F976B897B676182059E349FB5B4C49CB71D0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2330637550184911e-3" }, "TakerPays": "9758379422" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "r9ma91EcMDXDCLQZDvceT9tDwHRT41gumt", "RootIndex": "E84198B4FF4468455435404C697CB18F9483D4FE07B84FF5B0B96B52E6BD82A5" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AF32405B0199F472BFE15959859DCCAE0D0594931A116E7B588FBAD9883B8703" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rJyPfhC1DLsG22KEG4jS5mDrGtoDcwZDty", "RootIndex": "B1AD0C2B8ABA43A1A20BFF038C25F1FB4D6ABE5515DDBA7F6C012ABC0C2A65FE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AF4FA158C7F1B71803B89F6AB02E0F0C537A96CF60E28D79B5F45CBB723BC3E1" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rK4qafqqEtLjM1CRfcgY1H8Z4zGTRATkaV", "RootIndex": "97447826D498C40E1DDA4F747302D6EC4C3A752C79E350DF6C0634300F151E97" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AF5AE3222D847B304A909EC3AB869DE31F6D4526C0D37BBF1D79AD04D4F4F726" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rGBMsWXEYwQCyqK6QsrivTQsACXbfL1735", "RootIndex": "42469046D2E5AA198F9AADD2A8E482559FB62C2729B49873395851272413EA21" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AF5C5D2D9988F7990310276D85AE314EA926E14ACFEF2F62540FD0353F137BD2" } }, { "DeletedNode": { "FinalFields": { "Account": "r36sopaDwMDWZS4XNkCM27TNVkdywisWY4", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C750D7496027A", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "ACAFB3C529222162D87E31CC9A9E65A91B0F0E781E5A454FB8E7FF0FA38A4A81", "PreviousTxnLgrSeq": 68908256, "Sequence": 66335281, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AF667C5193E979C70281FA26E20C76D9946887E0878AC24CD28336DC7CC1253C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "85645888526" }, "TakerPays": "686023567" } } }, { "DeletedNode": { "FinalFields": { "Account": "rfB3HqBHHTi5TCaXxjo9yMh4r2kfuC3pbz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D602B014", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "25FE96CFBA96E7A634DFE61F5D2D680D82958ADE86DFD521852A2FF6A328C81B", "PreviousTxnLgrSeq": 68930026, "Sequence": 67353729, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AF713E27111CE45715CA7FFBCD98DB12F67EB38C6294858C917EA3B74B581360", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "101217868" } } }, { "DeletedNode": { "FinalFields": { "Account": "rphnh8aG8oBCdrBcgxYgNY8yVqi3b3XqbT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214EB1AD36964E5", "BookNode": "0", "Flags": 131072, "OwnerNode": "17", "PreviousTxnID": "5D0DA11BFC5319F2C5A9828E8B3F79DF1B38E2ABF40AE567F707C0391FE136F2", "PreviousTxnLgrSeq": 68916064, "Sequence": 66157580, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AF7170A0168D392EB63A6A36C0EAA8F53BBEBA8D237872F5B1CA8A3FB36A8611", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "44888888888" }, "TakerPays": "264305777" } } }, { "DeletedNode": { "FinalFields": { "Account": "rajb91Ucmbfxe1KoUEpAtJi8eo5bQVWeUW", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F263939894", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "7A9FE96E7DD399634FB7CCC6DB8DCB27C42E2865D82B8C4462190C2AF3B68F74", "PreviousTxnLgrSeq": 68984152, "Sequence": 67452144, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AF792B7BD5119FF3947954EBA38321D69767FF62C0943C7A37ED20DBCC66E9D6", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2621138153.550426" }, "TakerPays": "26211381" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rpRWz81LgJfwcxBFMMxwnMttsHr8VoMZeR", "Balance": "670436147", "Flags": 0, "OwnerCount": 190, "Sequence": 67503019 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AF9152523C881D5B803A712329C5B2051C7E7ADD2291C2F6CC4446B801EF4840", "PreviousFields": { "Balance": "520436147", "OwnerCount": 191 }, "PreviousTxnID": "1A9C24B9EF73C904C554B42406EC79BB515ED1A2C68C8CA8F3514566F108CFF1", "PreviousTxnLgrSeq": 69063465 } }, { "ModifiedNode": { "FinalFields": { "Account": "rKU9ca11NtN2HFEaNj3WhV7dS13vpDeS46", "Balance": "329409970", "Flags": 0, "OwnerCount": 40, "Sequence": 66579423 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "AFC5014331711CD0D82784F8E9E8F44CC6DB1724C601008956EAE7AF64D64D00", "PreviousFields": { "Balance": "93999970", "OwnerCount": 41 }, "PreviousTxnID": "7C2C6EF171BF2614814766A208D60FCF3CF43EA244F2D18E5B917C8EC3E8CAAB", "PreviousTxnLgrSeq": 69052449 } }, { "DeletedNode": { "FinalFields": { "Account": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082AEDA5BE1980", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "B1E052C8204C099B1B00AEB29C6F9207D0E134660CB07D3C9171A7A0BA99258F", "PreviousTxnLgrSeq": 69054925, "Sequence": 67440523, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "AFE973474106FB0CB6095BE9E9FBA7163F7E98B39673CBF8793AA8DAA95841BC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "229899999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "11", "IndexPrevious": "f", "Owner": "rLCRC3mUAkWe4R8EwjZ43BGQs7hmpdGrbE", "RootIndex": "48904606066E01C0AC1C8A2C06861877BB1701F06A48B39197DB50A0FC2A27D9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B01C1E990BA3A8DDF82305984B0F830BCC40D92A0B8296BC366E2B75205C1067" } }, { "ModifiedNode": { "FinalFields": { "Account": "rfqL99qLpPmC72SjLCaytr5g27EUH35RyB", "Balance": "43317922", "Flags": 0, "OwnerCount": 6, "Sequence": 68690193 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B0217911A578A470BAD61E8005FF21C84891E531185EB32B50DD8D2045C3BB07", "PreviousFields": { "Balance": "36454411", "OwnerCount": 7 }, "PreviousTxnID": "7AD7D502FA0A915FE89222EF82F470B1F2195490CF069FB990E712412041F79B", "PreviousTxnLgrSeq": 69062099 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "762", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUN6cc1UZw3jJRFAQpzYZdwA75aKR6qJE1", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B07046D5366B5337798B28D9C6E4EDF002CD83377441940467A18EB42CAC91B1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "E335A9EC405E9D0A41BBA19622A0ACA0FF5DB96B45865746ADDC124D91FA51F5", "PreviousTxnLgrSeq": 67996259 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKeFfq8ZvHbFWbsQBAeTB5Ng7aGtoLN84K", "value": "9999610698104588e-1" }, "HighNode": "9", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "f04" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B08C7400FBAF68E96336545BAC9421ABD2E37BA6A76BE5140D6E57A20C87ACB1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-95000000000" } }, "PreviousTxnID": "1F11386540F90AE3904AD07DF396F2F1EA22CBB2F0B48818BF51843EC8A74E2A", "PreviousTxnLgrSeq": 68994970 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "66666666656.66702" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "285", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUtzPhAd4njQGteZHqi7hbd8CRtZGfQtp3", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B0957AB6E53D7E82F6F3C99258598C68BC2F15FBFA00281229CF45C270C927C4", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "74452656532.66702" } }, "PreviousTxnID": "BAF328A6B41E162D30C3B702202E6092527BFDA4C3C73CE9A220DD9F3DC3C93E", "PreviousTxnLgrSeq": 68789862 } }, { "DeletedNode": { "FinalFields": { "Account": "rUN6cc1UZw3jJRFAQpzYZdwA75aKR6qJE1", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365303B1DFDE1A28C3", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "CC44EA8E0981DC2963BED2EDF212B97519D135E308F2F9F6F60FCA57618A1D5B", "PreviousTxnLgrSeq": 68293495, "Sequence": 66466048, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "80974294" }, "LedgerEntryType": "Offer", "LedgerIndex": "B0B531DD54210A60ECF7D0038134DE9D9F4AF9DFF8B8B317712883AFB68DC6AF" } }, { "DeletedNode": { "FinalFields": { "Account": "rfnaFsTkxCWYtenT3MxsFxjjrX4F7itNzd", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C3793559C633", "BookNode": "0", "Expiration": 727092416, "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "2E59D774B34618E98B44938E22DFF68301D3230880A18FF2B8C87D2E29A517F6", "PreviousTxnLgrSeq": 69027209, "Sequence": 66195679, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B0D2990A51F37C008637BE4912833D0EE29656F8482AD5F859C6A6E1EF1EC7B0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "38929949" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e96", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rf4YQSYpheUvWxMx5rmSgr4vdyvu7tWUp4", "value": "1000000000000000e-1" }, "LowNode": "9" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B0DD29558D3EC6865D4FD3AE56B9E04850CED45AE9616C379090780C771C9126", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "23547689385.47486" } }, "PreviousTxnID": "E225DD02DD44BA6693210A9E4698091E9B998CE6E2E897E6D1AFD860D1CF7404", "PreviousTxnLgrSeq": 68991202 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMp5QYssUeXAdg9G7b6XQPCEb1uHCjZ7XQ", "Balance": "230742365", "Flags": 0, "OwnerCount": 72, "Sequence": 67402973 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B140B1BEEFC36984045BA16FE64B7C94148364246D4ACF4194DBE4F52FBE6348", "PreviousFields": { "Balance": "157999955", "OwnerCount": 73 }, "PreviousTxnID": "DBD9FA755AA7B6032049EBE6181FAEE07C62FBA17155657902BE1326C60DCF8D", "PreviousTxnLgrSeq": 69044261 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rhJfzjX6NrYjiR8yGumtJSHuuLxn2JbgvT", "RootIndex": "B1624334045BF7CAFBC380078A90DCE1AF7ED5EF21BEB18E2F71E8D7C24AD86C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B1624334045BF7CAFBC380078A90DCE1AF7ED5EF21BEB18E2F71E8D7C24AD86C" } }, { "ModifiedNode": { "FinalFields": { "Account": "r4A2sUYHaLAGsDxfwUSv7GXTyYRsoBfQin", "Balance": "547836348", "Flags": 0, "OwnerCount": 63, "Sequence": 67453691 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B16A78C9255A008381549DE5FC038449E98B0DAE3244063212FDB0D0FE5DBAA0", "PreviousFields": { "Balance": "486885388", "OwnerCount": 65 }, "PreviousTxnID": "73E11175DEF3DC2D7C97D4D6C353920765EB0A3625A115A79F4D791F61FD4C9A", "PreviousTxnLgrSeq": 68998438 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rnEA5VmDp13iDZdcGUg2X2nzYkaKKDrf86", "RootIndex": "7356E72D3065E18CE5DDBB1BA10B86FA8033B69D418C3A44909943600A403951" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B16EC8C4DFFE12F1E0BC89C37D10BA25CC90CD6AF51603A8E5FA09A10A5DA8C0" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rJ5v25nqLv1P2Fij67kW1QE6iWqthP89v9", "RootIndex": "929FF0523F677A57D6EA77BB605C9A6B8FB372A30E4E0F42BE715D692A07A854" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B1841A004A2005EE49BBD519966518C4B1BB1D0C7CEC9C17B2ADD9E1C7D4C09C" } }, { "ModifiedNode": { "FinalFields": { "Account": "rNWUPV44ECUZNuemMektfAsccCmYRnZXK5", "Balance": "218258373", "Flags": 0, "OwnerCount": 13, "Sequence": 67770367 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B1A11B03284D2319DFA7EF904DBAA60D136CBB3E90068D061366927C035B85CD", "PreviousFields": { "Balance": "101258373", "OwnerCount": 14 }, "PreviousTxnID": "C8C5423DBDB8D7204DB660E6002F6A93D0A1217DE848D5EE4A7FAAC6AD7319B7", "PreviousTxnLgrSeq": 69053693 } }, { "DeletedNode": { "FinalFields": { "Account": "rN5wcyJZjT6Qd7sJZiQg2SHVtjnmqiq7W2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212D452694F4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "DD4A2167B6CF2FA5FB68D12E71F38370C30B46E962389ED84F4FF90B9854304A", "PreviousTxnLgrSeq": 68922727, "Sequence": 66720606, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B1B0CFE8A04C42D057403E34BE85835FAC827D17CF5E0DDEEBB7F99246E01A89", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "53000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rpTLVf85qXWoPWNyeUXnTkc1isdAWLCYh6", "Balance": "402083229", "Flags": 0, "OwnerCount": 109, "Sequence": 66958604 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B1BCFBD13D1AE199ED3A68D50803A8366F2DAF94082A053E844C380868F25A6C", "PreviousFields": { "Balance": "250011868", "OwnerCount": 110 }, "PreviousTxnID": "E3C77BA6D977A21882070CA0A5CF04B4FE1696844AA69D53E3E6825842106195", "PreviousTxnLgrSeq": 69061171 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rnsZFHUhKJoPt3oh269oP51G4j5HDCNNBg", "RootIndex": "3D58FC1DD46594FCBDBD5BEEFCE3468E41327D40CE6B29EAED990FE79BBC0942" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B1E09B3B66405D8A33C2A393C5D218CF7E9D1734AA2C7144A631E901E69C7814" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rUsSyZqiqCSZoqNqjd6PqcEQ3BBaXyS7wF", "RootIndex": "F72CEB2A2E3A8BE2722A230A07BF079D3B4084BCAEDC35AC9A08210546DE4F7E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B1E95674FCE3677B7F88DAD1800C30F14B9C4D0F9BB5829C6FC4C0B831479C56" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rMDVXgBGXnNiVt8b9uXXwhQC5W2xZXPweh", "RootIndex": "92F75029D63DD9B73E65849378C2A30DFDE879EBC18C4AF20E89CBF91E4C06FF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B22D85721878E987AA1E7D88C130BB86FE092942180318CA2B3F797EDAE76766" } }, { "DeletedNode": { "FinalFields": { "Account": "rKbNu1SDc3i5dWHdp3uLxWVn2tsA4ovDJR", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652102A336DA1175E", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "3CF67658E06148E078CCC0299538934B9AC4D1A7DEB1BAECDABB22392E134920", "PreviousTxnLgrSeq": 68994891, "Sequence": 66971898, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B239633A8EF058570EFC567D0AF72962D7F505325F17A1E4AB34416809921F70", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5286145175551453e-4" }, "TakerPays": "2405196054" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eef", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9edE9m7sNZEwgT6foU8ahfA1ocrNify92", "value": "9999688558266535e-1" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B239BEFC9877E02C9F895B754A252F459B2C6E322B2BD5CB6C3EDDD75A11094F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "906618313.6899364" } }, "PreviousTxnID": "9F737FD5CDB18A91EE93FEBF05F11FF1F9480D821BE86C141F37C862DC375E86", "PreviousTxnLgrSeq": 69032307 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1200000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJw1L2RZTiPTQJSF7KmstuGrdNrTmdvAjb", "value": "1000000000000000e-1" }, "HighNode": "f", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ec2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B256510C23DBA8A1982309CFB23F3E2C3F268B21DC575BAE4777E319CBB3999E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1500000000" } }, "PreviousTxnID": "DA7AE41EC4DB698EDB83AB71658D9124D1890DAFEEE20247862C171CDFCDD143", "PreviousTxnLgrSeq": 68856847 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGFCR192crZ5FBYgZPMAZCeBzTrkqeFXqh", "value": "9999610698093259e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "f0a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B268BFC23469EDC4E47525500D296F758E9B205001B67E7BB4A0E7A324BB5594", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1057712712014134e-4" } }, "PreviousTxnID": "8E3532A1C597EF35CD18504F3112F841005C988FD9BEBFD8A21B8DB8345A3C1C", "PreviousTxnLgrSeq": 69051471 } }, { "DeletedNode": { "FinalFields": { "Account": "rUZdJF5FhJJwrdjrcJ8vjfo7NySmeGRxxa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4F367754", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "6EDDF9EC84ED8BCF03276734C1B2C5A6F85EDF2EB14F6990DF00ADFC7C2ACB4D", "PreviousTxnLgrSeq": 68915035, "Sequence": 67514505, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B26A8CDCA19F5522B2E1AD2A4D2776A33153D1968D05D847FB2036983922DB2E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7786189866" }, "TakerPays": "52167472" } } }, { "DeletedNode": { "FinalFields": { "Account": "r92aDr7NzvcY9DSKLE8V5q7dvnu7LvVjWB", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652237DDA213826B2", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "02E5AF5E95D034CCBE67E47DA984830168EDBB680C4002789B145AB9A9876901", "PreviousTxnLgrSeq": 68791855, "Sequence": 67564119, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "93431878392" }, "TakerPays": "933384465" }, "LedgerEntryType": "Offer", "LedgerIndex": "B2747258B50FEC57BAF8F8A36731A77E943EECED51F531DCFC002C71DD368F40" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eee", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rspLJnfzomVceQKCn6ExME3gJEUuhUZxdV", "value": "1000000000000000" }, "LowNode": "15" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B28A198B0E5E2B6BC1DDBDD22FDB2BAE1205E3864749126D2903FEBDDAA1FF09", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1981221762375000e-4" } }, "PreviousTxnID": "CA5B43D9AF07FA006DBE42651EBADDD3D62589019C3AA1862E7EE5DDC38F7E16", "PreviousTxnLgrSeq": 68992630 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e16", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBnj6UP9thqpSLVq1rEKinhuhmFHmhaC8m", "value": "1000000000000000" }, "LowNode": "e" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B2D8B30084A908D4566EE483DF67802F52A19D1D810AB03FD2FE0A749506474F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5000000000" } }, "PreviousTxnID": "135E5D3C4CB555A8AA96469D18DC1FCEAE11241439254CEF19D780248E1E92E0", "PreviousTxnLgrSeq": 69012951 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDAsQhHKNqg4ueKpzLPYbR7bzmjDve6dVF", "Balance": "110632777", "Flags": 0, "OwnerCount": 24, "Sequence": 67964046 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B31272BC3D35C0B8393445E4486DBAD742FF489A422F50CF8C244F6627DD87AF", "PreviousFields": { "Balance": "62199484", "OwnerCount": 25 }, "PreviousTxnID": "475AC94A2FE5A6F26463E770F9E0CC9240C95015774391E3B2DB4B600DF9A180", "PreviousTxnLgrSeq": 69054371 } }, { "DeletedNode": { "FinalFields": { "Account": "rfBJiQAjbS9cyzVGKRxbde3eV4Sr5xeC8u", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D62A723F", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "197CA8DCB5F7DCC82FEADCF18F1E517BE1774CF12355731830625BB0275820B0", "PreviousTxnLgrSeq": 68885680, "Sequence": 67345365, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7822869773.491423" }, "TakerPays": "101697307" }, "LedgerEntryType": "Offer", "LedgerIndex": "B31FE66B629D6E3990BCF2AC2F709C37210CE0220D34C9E08817C99B9B170696" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rPEfUi18WaHNarXbyX5UCcVACd1ZZhxAig", "RootIndex": "C3C657077DA0F734A83D9757B0A3A3806B690B11DE9DDA92C1ECE36CC657A2D8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B3B4370B73A90AAC9A4E3F2516B464F7AB7A731B7ABA4DA71EBBC5D67E5C41F4" } }, { "DeletedNode": { "FinalFields": { "Account": "rBHSrXq2LzGniUp4zypCRk1isLw1ywLPHv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531B9AC619E7A000", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "CD8BFD57DEE21961443D122605EF4FC7816A339F752C7B9665DE8E200B5C91FD", "PreviousTxnLgrSeq": 68998262, "Sequence": 68976409, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B3EF807A1D058346AC07E38FA50310DE21EA9FF857C485548A9FBE6163D4BBC5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2500000000000000e-4" }, "TakerPays": "19425000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rp9kJTnnfXrjwVFxGRWfjUbJdmxkGP4cif", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652124C5DB20CA245", "BookNode": "0", "Flags": 0, "OwnerNode": "6", "PreviousTxnID": "E5104C434C370B17FFD78E79DE235721ED32FED008AD1F42147EA676E869A645", "PreviousTxnLgrSeq": 68945840, "Sequence": 65950390, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B3F173EF264FD9CC081B3B1630F0B02405755764106CFFDA499D4AC41205AEE5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "56322504556.15402" }, "TakerPays": "290089898" } } }, { "DeletedNode": { "FinalFields": { "Account": "rJ7DCt3RdTywMMwKTq2Pm8srSeU4GvmSiW", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132F457705EC89", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "44D83B5CE09F3A6D6E8C3F6780664B335F959CAB6964A6605A20D0F3EBB16FCB", "PreviousTxnLgrSeq": 68951062, "Sequence": 67713485, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B41BC134F14C0715ED87271870F7900FCEC7F90D8CF0F5EF84F3F99730477230", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "11555107321.45" }, "TakerPays": "62397579" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r4o8fw9WzkMQTvfvxZFVhkY8Txt3eN8Wct", "RootIndex": "B43224E3C2E2886DDB4211B40B75D9837F1BBCF6DF5C88D3BD30BF8ECF7C460F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B43224E3C2E2886DDB4211B40B75D9837F1BBCF6DF5C88D3BD30BF8ECF7C460F" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rET8MUZc1VEcHkQqQWeRmvbWZcrtHy24iB", "RootIndex": "7245A43D78BA163FD6AF6F8B48C225AC69747628C52EFFBA3490F8290BC90D6E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B454CE6856947CB6115F232C8D78531F19B413BA7F0BA3AF6A2FE6450CC1389C" } }, { "ModifiedNode": { "FinalFields": { "Account": "rwVWFLRidfTH7DD1LgcTg4gunGXVos3zVD", "Balance": "100129556", "Flags": 0, "OwnerCount": 35, "Sequence": 67374453 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B490B4639819467E840B84CECD7A3916BE92432CCA2A3A273C8CEE4630E20532", "PreviousFields": { "OwnerCount": 36 }, "PreviousTxnID": "9B4BF4F0B1FEB00C13001E6E79EC4FF7F3C6E9DAD48E14E95ABA9AACC957E0A4", "PreviousTxnLgrSeq": 69034950 } }, { "DeletedNode": { "FinalFields": { "Account": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208314B76DA2000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "63FBA7CD441493CE06CFFF10F4058CFBFEDF3CFF5B8A81BF3773EF8E0F8B90BB", "PreviousTxnLgrSeq": 69054961, "Sequence": 67440530, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B4A65A5FCDBF1A25361A72D5CDC45CCCB34C72A652ED9F565487CDEAE8042243", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3000000000000000e-4" }, "TakerPays": "691800000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "5a7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnDZQsMj4ttxiiL23S8LEAzhbhNtK3P6ap", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B4BB57B3E5242CD67D754E9B8485D7DF3BCBBBD965CA91EBA1EBBDD8B5019287", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "CB9FDDDE7F18F96F3C47C29148C8C737C8C874CCFD0D00002E60D1313188ADF9", "PreviousTxnLgrSeq": 67979116 } }, { "DeletedNode": { "FinalFields": { "Account": "rUsSyZqiqCSZoqNqjd6PqcEQ3BBaXyS7wF", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208E1BC9BC57DA1", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "7A51347004F17F9B58453D3EB2A372751750C9F6F06FF27FA5B2407C8A6C9175", "PreviousTxnLgrSeq": 69031944, "Sequence": 68183518, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B4C975A304E57EF9FD6E0E29B888E55871CD3C46A9DFE258BF386674F567B0BA", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1261346909413854e-4" }, "TakerPays": "315336727" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rLaYDDZDLBvzSGxKhxDEKovMrQ3CoDXQV", "Balance": "412002719", "Flags": 0, "OwnerCount": 85, "Sequence": 66614083 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B50CFCD9689FC313FD2EA213CE60570358B41509B15420EC834286BA284C6B4D", "PreviousFields": { "Balance": "357664296", "OwnerCount": 86 }, "PreviousTxnID": "C804878352BAE75B0329E87891D8360D2B93EDFB101A8B487534B90E07F4CA3A", "PreviousTxnLgrSeq": 69042591 } }, { "DeletedNode": { "FinalFields": { "Account": "rQDGBD8WCV3szWgH9rvyhjPHPX66KPGVnd", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CA53A3244AD8", "BookNode": "0", "Expiration": 726586372, "Flags": 0, "OwnerNode": "3", "PreviousTxnID": "0F4C7D367D8AFB4D8DA8C9C53BDDE2DBD0071A4745F2D999867486160F20DE58", "PreviousTxnLgrSeq": 68898563, "Sequence": 67652587, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "14351124.845" }, "TakerPays": "100140" }, "LedgerEntryType": "Offer", "LedgerIndex": "B59A36CACFB721C87E3BC97815EB8BFEC41E3759DD0E7DF46DC2D9E7C4405EDF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "11459100626.035" }, "TakerPays": "79960000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rUtzPhAd4njQGteZHqi7hbd8CRtZGfQtp3", "Balance": "379675486", "Flags": 0, "OwnerCount": 43, "Sequence": 67342425 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B59F59102A982C93C40133CB1ABC4FE237FA7498804EE27DA28E77F3A3FF5617", "PreviousFields": { "Balance": "278457618", "OwnerCount": 44 }, "PreviousTxnID": "B8383AC8211A6A9E084F854212EC99B39AC5F75ABA5D1591B773305BD2E99C00", "PreviousTxnLgrSeq": 69037079 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rsHib22BtXCKbRdrodUNNXdxumiaPqZQVk", "RootIndex": "B5AADF861DE67E55952DA3BCC451E1047C7A9EB279A9740B203770B53EE42549" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B5AADF861DE67E55952DA3BCC451E1047C7A9EB279A9740B203770B53EE42549" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1788210152010003e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e3a", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDvF12VVLg8CD36Ba9U4HUB5q7AWai6BFi", "value": "9999688558258524e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B5B240B4BBEBBE7E49E70B39B3630DFE8DBC2D0A40C95804BF0E9FC851EBF1E0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2500000000000002e-4" } }, "PreviousTxnID": "3217A621DD403AB641B580415E83D845CB7D86BCCDE971B6A4E0C3AECB200697", "PreviousTxnLgrSeq": 68998050 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1005000885461523e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "368", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUrbD1rAAkr84UER2ZUxTP5ohhSKzvC8tc", "value": "1000000000000000e-4" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B5DF313E91D90FAC69C222FBC005A21785C2E02FD5ECD3799B83E6BB87798624", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6000000000000523e-4" } }, "PreviousTxnID": "2EE88F62487E1125C372F0CA14EEC81E26F399821B137BAE2AA245199D692142", "PreviousTxnLgrSeq": 69061585 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eaf", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDfGPHrMgjFmWvA3TRkx5rcD85Y9sNizB2", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B5F07CD9B0141D0720F85132DC343CB8933EFA0BFAECF00AE6B2927CD383C01E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "19404401334" } }, "PreviousTxnID": "A8ECE98747476325D091FFD8A6E38C27A81F7B244031851C956CE80DD2FEE002", "PreviousTxnLgrSeq": 68898804 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rwJECKX27rvudR1C4R2QCUZwatR9zkC4u5", "RootIndex": "EDB0423262CD73AAD1446CAD39046F1D38C304BA8503D15AEC577D81ABC11DF6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B5F523900500CA5E5769BFEA63E5A51AE26CE5F4B59EBC99F0002299E2815AAA" } }, { "ModifiedNode": { "FinalFields": { "Account": "rPVXceb6wrQp9apSTtyZmWcxKmYRBnCsdt", "Balance": "484555023", "Flags": 0, "OwnerCount": 64, "Sequence": 66622494 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B5F7607F9EE8CA6F3DAEAA97E3FAD8B6DFB41D472C91D504EF75320CE45A7CF0", "PreviousFields": { "Balance": "477481115", "OwnerCount": 65 }, "PreviousTxnID": "7CD6DBF3994F6FFCB0E51057462DBD4D3E1743F66F6FCAFBBF9139CF7072924C", "PreviousTxnLgrSeq": 69030335 } }, { "DeletedNode": { "FinalFields": { "Account": "rHWCQnGF4sc9MqnA8GpZC9L8SZmzv5zkMp", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652121E6C45EE4903", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "3934EEF20709669AD888D8391597AC782C3F624F80AC12F2FD8A632317DDBF81", "PreviousTxnLgrSeq": 68962257, "Sequence": 67003947, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B633AE6F92A84831B1C5725FA4CF904D96708948809C951ECFDB961D9C9ACCA5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "39708548" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rEEmAELYEW2kQQRJEXhN9qJnzZmUnLxhJd", "Balance": "40554104", "Flags": 0, "OwnerCount": 12, "Sequence": 68870179 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B6A10F18BCA546CD6EAB122521DDA0B5FA4AFEF39B3CFAD2D4BCD8DCF0935EE5", "PreviousFields": { "Balance": "37461805", "OwnerCount": 13 }, "PreviousTxnID": "92E2221EE3DB45EEA817BFE431E39883D87D09A4476AEE13CCAC85B65F95C2E3", "PreviousTxnLgrSeq": 69008880 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsZ4iqWpnTmdfE4nDDEiaGAn8z97ZV4Zm2", "Balance": "73348924", "Flags": 0, "OwnerCount": 5, "Sequence": 68647808 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B6A1EA89F39275C3DD11C7C6E28373927376D6C603A7720443F0A10D0BEA5C93", "PreviousFields": { "Balance": "53779035", "OwnerCount": 6 }, "PreviousTxnID": "E6DD32D945C4423C7935DA116882E4B1FF629A916F53704A21DF0A1450769AE8", "PreviousTxnLgrSeq": 69056103 } }, { "DeletedNode": { "FinalFields": { "Account": "r43hxvGDZqmKmLugK8oJ32r2f4rxuvUntb", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520BD7A625405555", "BookNode": "0", "Expiration": 727073894, "Flags": 0, "OwnerNode": "21", "PreviousTxnID": "F6C9494114547F4F8A13E57815C68D51155698FE26F388CB97E61DF732ADFE55", "PreviousTxnLgrSeq": 69022504, "Sequence": 59395071, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B6CEC8580D642808C52796C0F1BB694C0E99651D560EE7FB7B0FD097973657EC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3000000000" }, "TakerPays": "10000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5285989866" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNWUPV44ECUZNuemMektfAsccCmYRnZXK5", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "c1b" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B6DF998C126D0F87DAF2147DF0E3656F7135CF3CB86F4B348606051AFEF13AC0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-14285989866" } }, "PreviousTxnID": "47891BC7F37E8CC18354B1464ADE114946F3BC20C6E299751BF6B14B26926EFF", "PreviousTxnLgrSeq": 69052304 } }, { "ModifiedNode": { "FinalFields": { "Account": "rEgSssemRh6cSEJYWAyA6Q9uEm6XjBUZ2H", "Balance": "81361082", "Flags": 0, "OwnerCount": 5, "Sequence": 68766420 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B729507BD3D5C5F1DFA0D59AAC1D636F591EDF2397D2A3A6FD8FCFA0BD5475CA", "PreviousFields": { "Balance": "31558736", "OwnerCount": 6 }, "PreviousTxnID": "5A60738DBDBADF316EAFFBB45F10F35AB132208230A6EA282EA012244CDF815A", "PreviousTxnLgrSeq": 68965212 } }, { "ModifiedNode": { "FinalFields": { "Account": "r9UmfXWeEUHZ9nUzywkmpHorhBLB9uhjpc", "Balance": "2342165814", "Flags": 524288, "OwnerCount": 164, "Sequence": 66690700 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B762FC583E1A1E1257ACF14FD25C3D8661A2138F3C82A7C6E94311219D49DF3D", "PreviousFields": { "Balance": "555083166" }, "PreviousTxnID": "AE426FF2885A6DB0D852EB75CA7423A6AA60FA686A10D96E48C02257E85EB272", "PreviousTxnLgrSeq": 69064015 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLN2tJYrH11YA3EqyNw6csgsBEnZ9TeaWF", "Balance": "1549936370", "Flags": 0, "MessageKey": "0200000000000000000000000070AE77566AF1B83C83E4C4EDFC47B9D4AB05D6BF", "OwnerCount": 127, "Sequence": 60035870 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B766C1F970D3C5360550D3C9DA3A4A434F7942247C19EC1C4DEB013719D48441", "PreviousFields": { "Balance": "649936370", "OwnerCount": 128 }, "PreviousTxnID": "A163F042C7E794943E7F4D0D53EC2C73AC96DF93C8841225E2A5C55985905B20", "PreviousTxnLgrSeq": 69053206 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ec4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "ragafgjLrLnN1rYkR4FpKXjmiTqDQqDio3", "value": "9999610698104590e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B7715FA3B95824F1CCB0AE1F1EAF0E2375FD52750F7A174F35EC98DF41A8859C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2015266918855906e-4" } }, "PreviousTxnID": "32E49E61B2023D17C9CA3D4BAF845C7E43BEDB5D4E6642EF376D93545CFF5EFC", "PreviousTxnLgrSeq": 68970093 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5060893422" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGgtpbT9ffSEHApdNkRC4Mu9tsYPRMKx6D", "value": "1000000000000000" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "44" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B78C6E9F6E06D1926B4E7FDC22EE6FC6922CA1F770EF103853196398581E078E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989880" } }, "PreviousTxnID": "943FBFC7B4F383A2C36AB01B17324A0CEFE77D816FC45DE810725A12CC10BF50", "PreviousTxnLgrSeq": 68023619 } }, { "DeletedNode": { "FinalFields": { "Account": "rQHveZ6yCKwNSGRiu4QnTSjJbLRfgBr72p", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531F438DAA060000", "BookNode": "0", "Flags": 131072, "OwnerNode": "e", "PreviousTxnID": "8B0BFCD70C2CFE9D91504A48F88A708CDD6DA0B639FFA3AD5907B5F108A01967", "PreviousTxnLgrSeq": 68764400, "Sequence": 66308718, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B7BD611EC809BA85A96A61409188F479A36E2218D4445732AF63517A3157B68E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "50000000000" }, "TakerPays": "4400000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "raentKRvbeEBLCQQUC5vbc8FH6zFuzaNEJ", "RootIndex": "B7C5D11CAFC0B77CA0E1713000AAF267F5665EBC9CC7941756A9003DAD6AEC30" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B7C5D11CAFC0B77CA0E1713000AAF267F5665EBC9CC7941756A9003DAD6AEC30" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4o8fw9WzkMQTvfvxZFVhkY8Txt3eN8Wct", "value": "9999610698104584e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "eab" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B7DCCDE36BF4D26EC12A7A32E0AF8A30764D484D73D8310C46E257BB9DD4A845", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1663278891609035e-4" } }, "PreviousTxnID": "393FD0EA5ACCFBA41C93F4ACCE6C68B7AB63A99085D4E92BDAC492507E2B6566", "PreviousTxnLgrSeq": 68897827 } }, { "DeletedNode": { "FinalFields": { "Account": "r4A2sUYHaLAGsDxfwUSv7GXTyYRsoBfQin", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E90EDA145D160", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "3A08230AD8D82463DF5FACF3710627ADF74D9FC70DDCF9D2B35F2ECA630BBE65", "PreviousTxnLgrSeq": 68998120, "Sequence": 67453687, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B7EEE4644E37CB35E3C9A4DC1FF4F0C3B061A79D2D1387BC0A17806392125D51", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "14866087945.17969" }, "TakerPays": "60950960" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rJfV6qTHdF774uGTdRHQMxb8NSF6TWu4uR", "Balance": "210581468", "Flags": 0, "OwnerCount": 23, "Sequence": 63563012 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B7FA12072A22E8C57A66EAE8E1EED4E3129FD767E923B8FC8D48B7388D89841A", "PreviousFields": { "Balance": "191895093", "OwnerCount": 24 }, "PreviousTxnID": "BD66C735333F6F4843281B540C888FA52B247C22711E2C7B975DF3A989F505D7", "PreviousTxnLgrSeq": 68919886 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "70714878917.9686" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "147", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rT8my4rryyrydKwE4W9LqQNosfNjZQb3r", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B806C37998DD532B664D5D6167C7DFBB67E112A954C883911D74D6366044C1C3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1007148789179686e-4" } }, "PreviousTxnID": "2390CBC6C5CF0753E49ED7F2EB8ED3E90E58DEADE2DB5E4A0F060332871B69D0", "PreviousTxnLgrSeq": 68898455 } }, { "DeletedNode": { "FinalFields": { "Account": "rJmWpXLdftZbNdPMYkezgKmEya6R6cAt7T", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "E839ED88D2BFCD4E10D0F8B17F5B698804DB4E6222ED43FF5056C808E19278CD", "PreviousTxnLgrSeq": 68997933, "Sequence": 66801944, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B82327B539EC8164E8823627B3000BB0CE2E1CD325C795BE9875442C255647BC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4000000000" }, "TakerPays": "20000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rhft58oDqDyMaUZZCKeBgEY4ewRC5HSpqM", "Balance": "1291898681", "Flags": 0, "OwnerCount": 148, "Sequence": 67660688 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B85BE9E44B2BD946EA320449C0635D030F172D03C49589347378E75912805A64", "PreviousFields": { "Balance": "1287032501", "OwnerCount": 149 }, "PreviousTxnID": "639A4D648A64BBB023F303FA712FA787D3C152EF3CEB8552576711E18F6FC9AF", "PreviousTxnLgrSeq": 69050464 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-31929949365" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN57KF6tqiqqc4agjC6nvZeQzovWYEPDCT", "value": "1000000000000000e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "1f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B877934AE760CD5A73F4488F76706F432A7860A91BE75EBDF34BA6676B0668EF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-41929949365" } }, "PreviousTxnID": "CEABDAFD9DC3334B03A318BE6035D7F3F4E41D88D90A74B34143407624F91744", "PreviousTxnLgrSeq": 68984391 } }, { "DeletedNode": { "FinalFields": { "Account": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521F9E80BA804000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "EB7B01023306CDD73CFA1E841CC5BA66810347A4FCD7D1092E7FAD8CB8C55142", "PreviousTxnLgrSeq": 68888977, "Sequence": 67528314, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B889602320C0162EE6B380A8F14C1551C89B3CB4D5EF3318947A95BF5537FCF8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7800000000" }, "TakerPays": "69420000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rEX4EMcBRESCnk2kKB1Yhzc5KSCib7Qh1W", "RootIndex": "FA78FAC2BE9D71BDF083111D3833CD6B559B363385B4985FA838F265CE9C2269" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B8C008693E221DEA129E0F979636A5D9764168200E7935F033F7EB37D875C907" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "12964050663.35446" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c37", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9TcqWtCqzG7xnhLcYPUbKsV691wNPzMMw", "value": "1000000000000000e-4" }, "LowNode": "5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B8DC66D3A12C0A1E79AD703BCCD66AFE71EA24CB5461EB14683264CD87A88A65", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "29228550663.35446" } }, "PreviousTxnID": "B6856A12CD8D0F4D2A42A576B87947E2AE97FC212828AE1B5E01E16A455332BA", "PreviousTxnLgrSeq": 68721983 } }, { "DeletedNode": { "FinalFields": { "Account": "r3Xud98xTUTiXxGp2LbmFtFTWRWeaZSCad", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE76816D8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "67535BFB111778CD6986C5B2C72901BD3C8994B03ED44B813598E123FA9C8105", "PreviousTxnLgrSeq": 68991790, "Sequence": 67537413, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B93BF62324D85CDC48234409861B99566F987F98FCA1853D6CB1516360B27A6F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000" }, "TakerPays": "14000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rMd7wG9Hzf5YXsqZ48kNRFLARM49oydLry", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5504854E", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "14C4AD0A96B9A20D8023411B5B2012A2D8A5FA30F9C6CB14CF3AF2FD9958B641", "PreviousTxnLgrSeq": 68153219, "Sequence": 67169221, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4671593919.6" }, "TakerPays": "46248779" }, "LedgerEntryType": "Offer", "LedgerIndex": "B953C6F5E2ACA2113620D4C36724853A35518BA0D8449E5A836712EAC1191E80" } }, { "DeletedNode": { "FinalFields": { "Account": "rasT449dxdmpB7Ak1GqwE9TdrkZEty1tAZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEE538000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "8304F06F75F19AD7038B1AD524CDD41C010DD89B65C8119AAD09C0E5E8CFA6D2", "PreviousTxnLgrSeq": 69001709, "Sequence": 67132367, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B96CF9BE2E64EE83FA7F183204B5186A9F0B6F91959759FDD51A98BAF24FA2DD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "30000000000" }, "TakerPays": "90000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "raPCjF9ftTRB7LYgehLYKBtzf8Eg4qp8Kv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA50921E1", "BookNode": "0", "Expiration": 723609811, "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "0F1496BFBCB467344F56DE1BA4F836FCEBF093CD1568682D6A2C0BAA6FC93DF0", "PreviousTxnLgrSeq": 68153919, "Sequence": 67504834, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "77859899" }, "LedgerEntryType": "Offer", "LedgerIndex": "B987C86EECE65EB3902DAA5977A303754398490EFDBB55DA22E732132E52061A" } }, { "DeletedNode": { "FinalFields": { "Account": "rsRPr4ZrFePB3e3SVXBMHpwLCfc97qZq7p", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365215237E5469E000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "829AAA251E96F0E26850D9E6D76724A640B77D83A10509906D1ED1AE7A3C6E94", "PreviousTxnLgrSeq": 68923032, "Sequence": 67107805, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "B9952B4218580DCFD4E30B9CB8B78F449FC83A965ED1B154D6F4040E0F4D2D77", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3500000000" }, "TakerPays": "20825000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rs4wbWdssBMJRgn4tJak3eq1JgrJ7Pgfnk", "Balance": "502658385", "Flags": 0, "OwnerCount": 45, "Sequence": 67390807 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B9A0AC25F74927E066E219B162346CC6152B2E85FAA5B2321B7B130DBE26EE53", "PreviousFields": { "Balance": "197658385", "OwnerCount": 48 }, "PreviousTxnID": "5B2C7C6AE769486A012572D032F95EE782414D2DB548A1D2126C514CF1783A67", "PreviousTxnLgrSeq": 69064124 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHunttX1NcJT4kdqXJZaqjkU7zeMmJuauN", "Balance": "619235477", "Flags": 0, "OwnerCount": 15, "Sequence": 67298201 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B9ACD4B7D2F3ECAF4FD3B07CDD4074B4F7CFFFF61979EB25DF51B2F84733F046", "PreviousFields": { "Balance": "42004169", "OwnerCount": 16 }, "PreviousTxnID": "0A1C781C0FB151519D8302BA3216DD3E70137CA7825B1FECDEF28BA9C3A4ECF7", "PreviousTxnLgrSeq": 68985825 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "23", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3pszUgbBgf7yZ9jxiHTXwStoE32PDsHm", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B9C451B350CC334170F9D7009630F86C7A2B945D1BCB3BF75B2BC8AB35D84148", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989901" } }, "PreviousTxnID": "5E0BE2E6592FCA4F6E7E63700FDBE6A970FA987C8F86E4C2246ADE97B3CFCD59", "PreviousTxnLgrSeq": 68118009 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9guPT5E5ZDd4hPpLJC6UnXCGoRB8tZ2Jr", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "B9D0BF58E93DC85855CE8232A0DBB658C7DCFA0424FF610C1CEC8C22EBD67CCC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "69459496293.10345" } }, "PreviousTxnID": "808483DE8C02BB3297A29B4BECB913C6DC226D403087E9AFA8A0E7947CD351A3", "PreviousTxnLgrSeq": 68991025 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989876" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rP7b2urRNSZ6dfigtcEaChxF14R3kK8djd", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "8b" }, "LedgerEntryType": "RippleState", "LedgerIndex": "BA1F1C04C91C703DFC1F901AFDA06C1147311C95E306C469CCEE4DFC7909CBFC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-17785989876" } }, "PreviousTxnID": "A05CE7E09F65F77C44B71B3222940C3080F637E7455902592F5F7B1FC4010A01", "PreviousTxnLgrSeq": 68997800 } }, { "ModifiedNode": { "FinalFields": { "Account": "rnDZQsMj4ttxiiL23S8LEAzhbhNtK3P6ap", "Balance": "1429024850", "Flags": 0, "OwnerCount": 81, "Sequence": 67108971 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BA20B207F53CA3FF9FE22FBC1403F9F4EBD9EB279B9BEDA9549B1D9EE6EF94AD", "PreviousFields": { "Balance": "1273305053", "OwnerCount": 82 }, "PreviousTxnID": "9D143B485E54B7D5C5168D54D0377814733CA47B6E902D995A0ADB05D1C76AC1", "PreviousTxnLgrSeq": 69054335 } }, { "ModifiedNode": { "FinalFields": { "Account": "rhrguNtFAs4pp6FD4n2Uz2M5PQACwnWdrC", "Balance": "316670977", "Flags": 0, "OwnerCount": 100, "Sequence": 67583972 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BA29945221113DCAF0230AA2DB742E0561286920260C0E5E857FAD0305054DC0", "PreviousFields": { "Balance": "240670977", "OwnerCount": 101 }, "PreviousTxnID": "27853E6341E41E9E5EEAFE9DF15B52A6052A82701B5049FC85A6C9D110194711", "PreviousTxnLgrSeq": 69058622 } }, { "ModifiedNode": { "FinalFields": { "Account": "rpCmDBk3dADpY9cb77D1hA4NHYnn7YbJM1", "Balance": "11429323153", "Flags": 0, "OwnerCount": 91, "Sequence": 67934636 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BA535FE5694F1B812FA3519B4CEF35B78BEC4F807FB3DCBE9720217E6E6A8F01", "PreviousFields": { "Balance": "8429323153", "OwnerCount": 92 }, "PreviousTxnID": "72DA3173627D3DA54F78EE63E90BB2C578A60534A404BC162DD03DD0BD9233EB", "PreviousTxnLgrSeq": 69059900 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGhP8A7jhRj3qkYPUR35bRvLCJyxh7xmGq", "Balance": "2324794953", "Flags": 0, "OwnerCount": 126, "Sequence": 66928988 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BA59863925A53801482D5D5D54B53B6E3A94BB58ED226D37E3144F432F34F19C", "PreviousFields": { "Balance": "2129794953", "OwnerCount": 127 }, "PreviousTxnID": "2FF954051BCD09E34CA4F4D64CDEE2E6AD6C59CDEB47A71872C72526C88FB2A2", "PreviousTxnLgrSeq": 69062082 } }, { "DeletedNode": { "FinalFields": { "Account": "rEr5Zbwd9Lurx4VHEvWWZFQb3owfVABck7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7671E371EA", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "A56D317BF191ACAFE8D7C4E166E37D0B72FB902C6676102BE39DCDCDC7C24E53", "PreviousTxnLgrSeq": 68899850, "Sequence": 67171799, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3052218542.247303" }, "TakerPays": "21365529" }, "LedgerEntryType": "Offer", "LedgerIndex": "BA65E02EFBAFB618A5D2F9F7DE20EAB8B26675B9A73B7DA593203E69090FE235" } }, { "DeletedNode": { "FinalFields": { "Account": "rNtB5pUvufMkzs55wL88pVuh3xt7LVW2mR", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214BF72F57D0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "F5A6EBD117447C1E43090805BED729963C1716B3104B58ED582FEFFEDF0279F0", "PreviousTxnLgrSeq": 68943834, "Sequence": 67385849, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BA6E52EDE5731DA29EF70432127F6BEFE6EAFD573A890BFF59F424A04DAA32A4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "116800000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rUs2aUqfDfjTN9HWdhXzRZZJkHm5rGUUdS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937E08000", "BookNode": "0", "Expiration": 724555998, "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "B6F867F368A79CC423C4D27AF9CAE606E47C7DC0DE9A0B64D37FB3C5F6CDAC2A", "PreviousTxnLgrSeq": 68385879, "Sequence": 251, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BA73AC407C64EA6E91147CDA5C98D4BDCD6EB80A499B79ADFF22FBFB951ECA16", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "500000000" } } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5206f86db90ca000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365206F86DB90CA000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365206F86DB90CA000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5206f9c1f5bcf5ec", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365206F9C1F5BCF5EC", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365206F9C1F5BCF5EC" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207069de14715b8", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207069DE14715B8", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207069DE14715B8" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207741eb09897ce", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207741EB09897CE", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207741EB09897CE" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520774aa6359e0f7", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520774AA6359E0F7", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520774AA6359E0F7" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520775933743d7c6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520775933743D7C6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520775933743D7C6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207759337c8bfba", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207759337C8BFBA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207759337C8BFBA" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207759337cca14f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207759337CCA14F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207759337CCA14F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520775f059d6cf3c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520775F059D6CF3C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520775F059D6CF3C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520775f05a074000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520775F05A074000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520775F05A074000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207ab995be77c8b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207AB995BE77C8B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207AB995BE77C8B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207ab995c11f000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207AB995C11F000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207AB995C11F000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207ac823076a9d4", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207AC823076A9D4", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207AC823076A9D4" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207b162d153ed82", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207B162D153ED82", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207B162D153ED82" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207b854fcea8d40", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207B854FCEA8D40", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207B854FCEA8D40" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207ce28eb76d7d3", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207CE28EB76D7D3", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207CE28EB76D7D3" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207cf11c11b6f58", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207CF11C11B6F58", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207CF11C11B6F58" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207cffa95dc7000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207CFFA95DC7000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207CFFA95DC7000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207d0e358eb049a", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207D0E358EB049A", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207D0E358EB049A" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207d0e369505300", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207D0E369505300", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207D0E369505300" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5207d0e36a35fbbc", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207D0E36A35FBBC", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207D0E36A35FBBC" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5208077540dd5b6e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208077540DD5B6E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208077540DD5B6E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52080fa4b992eeea", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652080FA4B992EEEA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652080FA4B992EEEA" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520822be2bce35c3", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520822BE2BCE35C3", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520822BE2BCE35C3" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52082aeda5be1980", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082AEDA5BE1980", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082AEDA5BE1980" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52082bd67afbc000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082BD67AFBC000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082BD67AFBC000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52082cbf4f083980", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082CBF4F083980", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082CBF4F083980" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52082da82445e000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082DA82445E000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082DA82445E000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52082e90f8eaf000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082E90F8EAF000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082E90F8EAF000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52082f79cd900000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082F79CD900000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082F79CD900000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52083062a19c7980", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652083062A19C7980", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652083062A19C7980" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5208314b76da2000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208314B76DA2000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208314B76DA2000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520832344b7f3000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520832344B7F3000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520832344B7F3000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5208577e59eec000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208577E59EEC000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208577E59EEC000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520859500338e000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520859500338E000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520859500338E000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520886c986447d13", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520886C986447D13", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520886C986447D13" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520886c98a7a03d0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520886C98A7A03D0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520886C98A7A03D0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5208df0180b023fe", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208DF0180B023FE", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208DF0180B023FE" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5208dfeaf20d8980", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208DFEAF20D8980", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208DFEAF20D8980" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5208e1bc9bc57da1", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208E1BC9BC57DA1", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208E1BC9BC57DA1" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5208e1bc9bf04000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208E1BC9BF04000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208E1BC9BF04000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520925f2e84bf000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520925F2E84BF000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520925F2E84BF000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52093cafac6a8000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652093CAFAC6A8000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652093CAFAC6A8000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52096a29349ebba2", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652096A29349EBBA2", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652096A29349EBBA2" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52096a2934a7a000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652096A2934A7A000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652096A2934A7A000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52096eb55a2f4b0d", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652096EB55A2F4B0D", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652096EB55A2F4B0D" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52097a88283040dc", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652097A88283040DC", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652097A88283040DC" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520997a2b8020583", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520997A2B8020583", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520997A2B8020583" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5209c51c4521e000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365209C51C4521E000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365209C51C4521E000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5209c8456e33ad92", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365209C8456E33AD92", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365209C8456E33AD92" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5209f295cadcf4ae", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365209F295CADCF4AE", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365209F295CADCF4AE" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520a200f55008cdb", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A200F55008CDB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A200F55008CDB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520a268e386a6baf", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A268E386A6BAF", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A268E386A6BAF" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520a4c376e4e33f1", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A4C376E4E33F1", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A4C376E4E33F1" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520a4d88ddd6ba09", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A4D88DDD6BA09", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A4D88DDD6BA09" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520a4d88ddd94000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A4D88DDD94000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A4D88DDD94000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520a569d5c23e278", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A569D5C23E278", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A569D5C23E278" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520a7ea5b89873a8", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A7EA5B89873A8", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A7EA5B89873A8" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520a8b615973ff05", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A8B615973FF05", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A8B615973FF05" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520a981478fcd46a", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A981478FCD46A", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A981478FCD46A" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520aa87be977daad", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BE977DAAD", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BE977DAAD" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520aa87beb9338fa", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEB9338FA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEB9338FA" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520aa87bedfe7b42", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEDFE7B42", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEDFE7B42" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520aa87bee2b596e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEE2B596E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEE2B596E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520aa87bee538000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEE538000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEE538000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520aa8f09440d200", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA8F09440D200", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA8F09440D200" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520b036efeb9b289", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B036EFEB9B289", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B036EFEB9B289" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520b036efecdc000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B036EFECDC000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B036EFECDC000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520b159f9ae2ecf6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B159F9AE2ECF6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B159F9AE2ECF6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520b5abeba22641f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5ABEBA22641F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5ABEBA22641F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520b5ba7901040b2", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5BA7901040B2", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5BA7901040B2" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520b5d793a6f0e26", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5D793A6F0E26", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5D793A6F0E26" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520b5e620c9389ba", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5E620C9389BA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5E620C9389BA" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520b5e620e7db231", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5E620E7DB231", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B5E620E7DB231" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520b7092ac0111e7", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B7092AC0111E7", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B7092AC0111E7" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520b8bdb94bfc03d", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B8BDB94BFC03D", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B8BDB94BFC03D" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520bd7a5e3062101", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520BD7A5E3062101", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520BD7A5E3062101" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520bd7a625405555", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520BD7A625405555", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520BD7A625405555" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520c0b2fe1c9e000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C0B2FE1C9E000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C0B2FE1C9E000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520c135f5b977000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C135F5B977000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C135F5B977000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520c1448303c8000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C1448303C8000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C1448303C8000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520c65aec38c6200", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C65AEC38C6200", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C65AEC38C6200" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520c6697980b4c60", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C6697980B4C60", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C6697980B4C60" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520c6e526bd31dd9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C6E526BD31DD9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C6E526BD31DD9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520c6f3b4077238d", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C6F3B4077238D", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C6F3B4077238D" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520cb032035736db", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CB032035736DB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CB032035736DB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520cc11602be6000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CC11602BE6000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CC11602BE6000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520cca2e51310000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CCA2E51310000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CCA2E51310000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520cf7a7d9495220", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CF7A7D9495220", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CF7A7D9495220" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520d252161a9790f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D252161A9790F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D252161A9790F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520d252161ab4000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D252161AB4000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D252161AB4000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520d79b6a189adb4", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D79B6A189ADB4", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D79B6A189ADB4" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520d7dc0fe0610c5", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D7DC0FE0610C5", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D7DC0FE0610C5" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520d7f2b9d42a180", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D7F2B9D42A180", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D7F2B9D42A180" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520d7f86e851e335", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D7F86E851E335", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D7F86E851E335" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520df6506df6eba9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520DF6506DF6EBA9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520DF6506DF6EBA9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e08810ab6ba60", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E08810AB6BA60", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E08810AB6BA60" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e277c2048d010", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E277C2048D010", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E277C2048D010" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e35fa926c20e0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA926C20E0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA926C20E0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e35fa92df12d2", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA92DF12D2", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA92DF12D2" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e35fa931a0000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA931A0000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA931A0000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e491404a45000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E491404A45000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E491404A45000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e5ad072d1d200", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E5AD072D1D200", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E5AD072D1D200" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e718d01261361", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E718D01261361", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E718D01261361" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e77ead1966568", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E77EAD1966568", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E77EAD1966568" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e7c76f9083900", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E7C76F9083900", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E7C76F9083900" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e83bd9e123480", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E83BD9E123480", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E83BD9E123480" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e9004cee310de", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E9004CEE310DE", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E9004CEE310DE" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e90eda145d160", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E90EDA145D160", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E90EDA145D160" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520e90eda38baf0f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E90EDA38BAF0F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E90EDA38BAF0F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520ee00de7a899c6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EE00DE7A899C6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EE00DE7A899C6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520ee99adc0ca200", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EE99ADC0CA200", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EE99ADC0CA200" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520eebe0b13c1e42", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EEBE0B13C1E42", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EEBE0B13C1E42" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520eebe0b3fc2d8c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EEBE0B3FC2D8C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EEBE0B3FC2D8C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520eebe0b40e8000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EEBE0B40E8000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520EEBE0B40E8000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f0d876fe4f21f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F0D876FE4F21F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F0D876FE4F21F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f195a3c4ba000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F195A3C4BA000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F195A3C4BA000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f42479ccf8c22", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F42479CCF8C22", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F42479CCF8C22" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f45eaef101030", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F45EAEF101030", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F45EAEF101030" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f46d3c47b7e57", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F46D3C47B7E57", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F46D3C47B7E57" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f4f033e564fff", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F4F033E564FFF", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F4F033E564FFF" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f581b8a061067", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8A061067", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8A061067" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f581b8babf205", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8BABF205", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8BABF205" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f581b8c570ee4", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8C570EE4", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8C570EE4" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f581b8c572843", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8C572843", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8C572843" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f5904616287f9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F5904616287F9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F5904616287F9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520f867de43305c1", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F867DE43305C1", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F867DE43305C1" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520ffcb9de60f32c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9DE60F32C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9DE60F32C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520ffcb9e04e6616", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E04E6616", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E04E6616" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520ffcb9e4e4a980", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E4E4A980", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E4E4A980" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520ffcb9e53f8cfb", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E53F8CFB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E53F8CFB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520ffcb9e548aaf9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E548AAF9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E548AAF9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "520ffcb9e57d4000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E57D4000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E57D4000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5210251a9c6b398e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210251A9C6B398E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210251A9C6B398E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521026111ae8a3ff", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521026111AE8A3FF", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521026111AE8A3FF" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52102a336da1175e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652102A336DA1175E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652102A336DA1175E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52105738c73fc200", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652105738C73FC200", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652105738C73FC200" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521057acf5f78000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521057ACF5F78000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521057ACF5F78000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521087e0fc23d000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521087E0FC23D000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521087E0FC23D000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5210a987b567ea45", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210A987B567EA45", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210A987B567EA45" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5210b0ce5d27a000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B0CE5D27A000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B0CE5D27A000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5210b27184ec2ab6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B27184EC2AB6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B27184EC2AB6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5210b2a0061dd26d", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B2A0061DD26D", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B2A0061DD26D" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5210b2a00671c000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B2A00671C000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B2A00671C000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5210e6594dd97a8e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210E6594DD97A8E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210E6594DD97A8E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5210ec8e43498d3e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210EC8E43498D3E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210EC8E43498D3E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52110d930d1dac0e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D930D1DAC0E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D930D1DAC0E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52110d9312f37ad5", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D9312F37AD5", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D9312F37AD5" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52110d9314988d96", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D9314988D96", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D9314988D96" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52110d9316ec0000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D9316EC0000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D9316EC0000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521144995de0f31c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521144995DE0F31C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521144995DE0F31C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521146df6b8af000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521146DF6B8AF000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521146DF6B8AF000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521168861d612556", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521168861D612556", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521168861D612556" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211688627664000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211688627664000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211688627664000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211ba60e96de000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211BA60E96DE000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211BA60E96DE000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211c3788097c0a3", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C3788097C0A3", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C3788097C0A3" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211c3791ffa13a6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C3791FFA13A6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C3791FFA13A6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211c37932085ec6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37932085EC6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37932085EC6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211c3793559c633", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C3793559C633", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C3793559C633" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211c37937a69a7c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937A69A7C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937A69A7C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211c37937b4b295", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937B4B295", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937B4B295" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211c37937b61ae4", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937B61AE4", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937B61AE4" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211c37937bd4c21", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937BD4C21", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937BD4C21" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211c37937e08000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211f0f2bf24816a", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211F0F2BF24816A", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211F0F2BF24816A" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5211f0f2c01da000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211F0F2C01DA000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211F0F2C01DA000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52121553f9ba6a14", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652121553F9BA6A14", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652121553F9BA6A14" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52121e6c45ee4903", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652121E6C45EE4903", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652121E6C45EE4903" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52121e6c485a47a1", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652121E6C485A47A1", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652121E6C485A47A1" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521239b533b2a000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521239B533B2A000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521239B533B2A000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52124c5db20ca245", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652124C5DB20CA245", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652124C5DB20CA245" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521264d1e0c0ad70", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521264D1E0C0AD70", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521264D1E0C0AD70" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52126e7561184000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652126E7561184000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652126E7561184000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521270470a2507a1", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521270470A2507A1", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521270470A2507A1" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5212795f57d93af3", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212795F57D93AF3", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212795F57D93AF3" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5212795f58ad955e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212795F58AD955E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212795F58AD955E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5212795f58d50000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212795F58D50000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212795F58D50000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52128b8ff5b1a999", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652128B8FF5B1A999", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652128B8FF5B1A999" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5212d452694ab9aa", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212D452694AB9AA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212D452694AB9AA" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5212d452694f4000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212D452694F4000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212D452694F4000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52132ab951c972f9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132AB951C972F9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132AB951C972F9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52132ab9523e86a8", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132AB9523E86A8", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132AB9523E86A8" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52132f4573ed3217", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132F4573ED3217", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132F4573ED3217" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52132f457705ec89", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132F457705EC89", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132F457705EC89" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52132f4579c98000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132F4579C98000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132F4579C98000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52135cbf0206a000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652135CBF0206A000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652135CBF0206A000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521385ac630a7000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521385AC630A7000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521385AC630A7000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52138a3886e8497e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3886E8497E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3886E8497E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52138a3886f4085d", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3886F4085D", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3886F4085D" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52138a3887c7f795", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3887C7F795", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3887C7F795" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52138a3888e0eccc", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3888E0ECCC", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A3888E0ECCC" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52138a388a1cdac6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A388A1CDAC6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A388A1CDAC6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52138a388a43c000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A388A43C000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A388A43C000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5213b7b20ff80987", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213B7B20FF80987", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213B7B20FF80987" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5213b7b21280e000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213B7B21280E000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213B7B21280E000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5213bcbc4c8a7050", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213BCBC4C8A7050", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213BCBC4C8A7050" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5213e52b99eb9871", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213E52B99EB9871", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213E52B99EB9871" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5213f93e2cd6c4e8", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213F93E2CD6C4E8", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213F93E2CD6C4E8" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521421326d4c2000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521421326D4C2000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521421326D4C2000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5214401c59cfc0f4", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214401C59CFC0F4", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214401C59CFC0F4" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5214401e94c6246c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214401E94C6246C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214401E94C6246C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5214401eaa3e7408", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214401EAA3E7408", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214401EAA3E7408" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52149b11ba8eb0e4", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652149B11BA8EB0E4", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652149B11BA8EB0E4" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5214bf72f57d0000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214BF72F57D0000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214BF72F57D0000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5214eb1ad36964e5", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214EB1AD36964E5", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214EB1AD36964E5" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5214ecec7dba2000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214ECEC7DBA2000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214ECEC7DBA2000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5214f51bf3ff5bdf", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214F51BF3FF5BDF", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365214F51BF3FF5BDF" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521521aca596e533", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521521ACA596E533", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521521ACA596E533" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5215237e5469e000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365215237E5469E000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365215237E5469E000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521550f7d7041f62", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7D7041F62", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7D7041F62" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521550f7dc0e7b06", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DC0E7B06", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DC0E7B06" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521550f7dca70000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5215d04c24d3fa3b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365215D04C24D3FA3B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365215D04C24D3FA3B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5215f59634a8ee00", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365215F59634A8EE00", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365215F59634A8EE00" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521630c824c63105", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521630C824C63105", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521630C824C63105" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521634577fe2bf00", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521634577FE2BF00", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521634577FE2BF00" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5216345785d8a000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365216345785D8A000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365216345785D8A000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52164fa070e876b7", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652164FA070E876B7", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652164FA070E876B7" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521658b8bca70338", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521658B8BCA70338", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521658B8BCA70338" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521661d10886fbab", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521661D10886FBAB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521661D10886FBAB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521661d10e08e7bb", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521661D10E08E7BB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521661D10E08E7BB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52166b5dccc05505", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652166B5DCCC05505", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652166B5DCCC05505" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52166cbb05d13878", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652166CBB05D13878", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652166CBB05D13878" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52167976a6d96000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652167976A6D96000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652167976A6D96000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52168f4a8faa9085", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652168F4A8FAA9085", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652168F4A8FAA9085" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521717b72848fc10", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72848FC10", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72848FC10" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521717b72cb9cc92", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72CB9CC92", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72CB9CC92" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521717b72e0d7063", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72E0D7063", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72E0D7063" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521717b72eb13ae1", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72EB13AE1", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72EB13AE1" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521717b72f0a4000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72F0A4000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72F0A4000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5217bf8ee56570ff", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217BF8EE56570FF", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217BF8EE56570FF" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5217cd9d4d6ae4cb", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4D6AE4CB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4D6AE4CB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5217cd9d4d8e38f4", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4D8E38F4", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4D8E38F4" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5217cd9d4e0b01b5", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4E0B01B5", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4E0B01B5" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5217cd9d4f367603", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4F367603", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4F367603" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5217cd9d4f367754", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4F367754", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4F367754" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5217ed725cd6fc6c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217ED725CD6FC6C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217ED725CD6FC6C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5217fb16d3acd435", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217FB16D3ACD435", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217FB16D3ACD435" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5217ffa2f2b82aec", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217FFA2F2B82AEC", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217FFA2F2B82AEC" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52182890519e2186", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652182890519E2186", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652182890519E2186" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218289060790000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218289060790000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218289060790000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52185609e7b1f881", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652185609E7B1F881", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652185609E7B1F881" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52187152ce99c92a", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652187152CE99C92A", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652187152CE99C92A" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218838370809fab", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218838370809FAB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218838370809FAB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521883837089c902", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521883837089C902", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521883837089C902" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218ad59a69c2000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218AD59A69C2000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218AD59A69C2000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218b3b7771f9000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218B3B7771F9000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218B3B7771F9000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218c32d93484ee1", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218C32D93484EE1", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218C32D93484EE1" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218ca53a3244ad8", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CA53A3244AD8", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CA53A3244AD8" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218cb5d0dc89d26", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CB5D0DC89D26", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CB5D0DC89D26" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218cc45e4884000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CC45E4884000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218CC45E4884000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218d9017e1bc6c0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218D9017E1BC6C0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218D9017E1BC6C0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218de7655b5ef72", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7655B5EF72", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7655B5EF72" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218de7671e371ea", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7671E371EA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7671E371EA" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218de767a76687c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE767A76687C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE767A76687C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218de767b78b070", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE767B78B070", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE767B78B070" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218de7680dabccf", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680DABCCF", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680DABCCF" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218de7680ddb897", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680DDB897", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680DDB897" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218de7680f3fe73", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680F3FE73", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680F3FE73" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5218de76816d8000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE76816D8000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE76816D8000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521965fa4145f334", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521965FA4145F334", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521965FA4145F334" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52197913b6c1f5db", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652197913B6C1F5DB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652197913B6C1F5DB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5219945c964845c8", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219945C964845C8", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219945C964845C8" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5219dd1f143f11d7", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219DD1F143F11D7", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219DD1F143F11D7" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5219ef4fb2b186e3", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219EF4FB2B186E3", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219EF4FB2B186E3" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5219ef4fb2d2a8f4", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219EF4FB2D2A8F4", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219EF4FB2D2A8F4" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521a88e80eadb86c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521A88E80EADB86C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521A88E80EADB86C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521aa535cf88c59a", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535CF88C59A", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535CF88C59A" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521aa535d1081d26", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D1081D26", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D1081D26" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521aa535d23bee1c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D23BEE1C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D23BEE1C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521aa535d3d0bfe9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D3D0BFE9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D3D0BFE9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521aa535d3d0c000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D3D0C000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D3D0C000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ad73b83473000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AD73B83473000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AD73B83473000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521b094132b647e5", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521B094132B647E5", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521B094132B647E5" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521b541cf380c4ec", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521B541CF380C4EC", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521B541CF380C4EC" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521b5b1bf4c53ffe", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521B5B1BF4C53FFE", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521B5B1BF4C53FFE" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521bacf6b65eda6d", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521bb52622f29071", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB52622F29071", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB52622F29071" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521bb60f00a3f64b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F00A3F64B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F00A3F64B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521bb60f0237f86a", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F0237F86A", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F0237F86A" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521bb60f02705778", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F02705778", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F02705778" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521bb60f04e2021e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F04E2021E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F04E2021E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521bb60f0515c11b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F0515C11B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F0515C11B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521be0ce0f610676", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BE0CE0F610676", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BE0CE0F610676" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521be3888733a87b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BE3888733A87B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BE3888733A87B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521be3888d7ca000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BE3888D7CA000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BE3888D7CA000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c07e9bfa2deb8", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C07E9BFA2DEB8", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C07E9BFA2DEB8" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c0c790bbbe1ce", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C0C790BBBE1CE", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C0C790BBBE1CE" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c1102138db094", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C1102138DB094", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C1102138DB094" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c110213bd1fab", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C110213BD1FAB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C110213BD1FAB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c110214914003", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C110214914003", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C110214914003" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c1102149a6bd3", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C1102149A6BD3", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C1102149A6BD3" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c1102156d74c0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C1102156D74C0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C1102156D74C0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c110215b9bffe", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C110215B9BFFE", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C110215B9BFFE" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c35634f844000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C35634F844000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C35634F844000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c3e7b96c68cd0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C3E7B96C68CD0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C3E7B96C68CD0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c3e7b9a8661b9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C3E7B9A8661B9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C3E7B9A8661B9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c41361be61000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C41361BE61000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C41361BE61000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c5c7f072a4973", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C5C7F072A4973", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C5C7F072A4973" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6af509180800", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6AF509180800", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6AF509180800" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6b0c5020e93f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6B0C5020E93F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6B0C5020E93F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6bf514e44b95", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF514E44B95", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF514E44B95" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6bf51f195426", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF51F195426", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF51F195426" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6bf5203f5780", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5203F5780", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5203F5780" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6bf5216083d0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5216083D0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5216083D0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6bf5249c5de5", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5249C5DE5", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5249C5DE5" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6bf524bb86ea", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF524BB86EA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF524BB86EA" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6bf525e7b4c4", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF525E7B4C4", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF525E7B4C4" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6bf526054994", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526054994", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526054994" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6bf5261a126c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5261A126C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF5261A126C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c6bf526340000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521c750d7496027a", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C750D7496027A", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C750D7496027A" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521cc6e8361b3181", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521CC6E8361B3181", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521CC6E8361B3181" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ce2440fee14d0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521CE2440FEE14D0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521CE2440FEE14D0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521d4f54ca852c5e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D4F54CA852C5E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D4F54CA852C5E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521d8b5ba1a7a5f6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D8B5BA1A7A5F6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D8B5BA1A7A5F6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521d94ce37663689", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D94CE37663689", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D94CE37663689" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521d9b1f5d20d555", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D9B1F5D20D555", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D9B1F5D20D555" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521dfc22a1e78000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521DFC22A1E78000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521DFC22A1E78000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521e31cba1cc3078", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E31CBA1CC3078", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E31CBA1CC3078" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521e32b4780a2147", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E32B4780A2147", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E32B4780A2147" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521e32b478974000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E32B478974000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E32B478974000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521e8cbeb2c6a41f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E8CBEB2C6A41F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E8CBEB2C6A41F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521f9d97df990136", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521F9D97DF990136", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521F9D97DF990136" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521f9e80b451ed76", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521F9E80B451ED76", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521F9E80B451ED76" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521f9e80ba804000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521F9E80BA804000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521F9E80BA804000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521fb87cfd4c2220", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FB87CFD4C2220", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FB87CFD4C2220" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff05b7c717688", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF05B7C717688", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF05B7C717688" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff9738ec434da", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF9738EC434DA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF9738EC434DA" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973bab167b5", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973BAB167B5", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973BAB167B5" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973bc8ad6e9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973BC8AD6E9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973BC8AD6E9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973be1fccf6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973BE1FCCF6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973BE1FCCF6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973c276ac49", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C276AC49", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C276AC49" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973c4e67046", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C4E67046", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C4E67046" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973c6b89625", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C6B89625", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C6B89625" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973c773b26b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C773B26B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C773B26B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973c844eb2f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C844EB2F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C844EB2F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973cacd0c69", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CACD0C69", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CACD0C69" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973caef31e3", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAEF31E3", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAEF31E3" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973cafa8000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAFA8000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAFA8000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "521ff973cb83d440", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CB83D440", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CB83D440" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52215c27be70e000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652215C27BE70E000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652215C27BE70E000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52218f2ced8be9a6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652218F2CED8BE9A6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652218F2CED8BE9A6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5221c0331cb28f20", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365221C0331CB28F20", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365221C0331CB28F20" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5221edac9decfb5f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365221EDAC9DECFB5F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365221EDAC9DECFB5F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52221125046f5a60", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652221125046F5A60", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652221125046F5A60" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522219547c0a0c49", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522219547C0A0C49", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522219547C0A0C49" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5222761927657c27", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222761927657C27", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222761927657C27" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52227619283ed8be", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652227619283ED8BE", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652227619283ED8BE" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522276193cb22408", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522276193CB22408", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522276193CB22408" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5222d10c4d5c0d80", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222D10C4D5C0D80", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222D10C4D5C0D80" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5222d10c4dfaf288", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222D10C4DFAF288", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222D10C4DFAF288" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5222fe85d709a000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222FE85D709A000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365222FE85D709A000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52232b168aa1b000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232B168AA1B000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232B168AA1B000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52232bff5504854e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5504854E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5504854E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52232bff5950df00", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5950DF00", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5950DF00" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52232bff5e3a6735", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5E3A6735", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5E3A6735" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52232bff5f1937c8", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F1937C8", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F1937C8" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52232bff5f2e7b65", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F2E7B65", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F2E7B65" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52232bff5f398ddf", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F398DDF", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F398DDF" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52232bff5f46c000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F46C000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F46C000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522354ecbea090f2", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522354ECBEA090F2", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522354ECBEA090F2" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522374c1d28416e2", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522374C1D28416E2", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522374C1D28416E2" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52237dda206e2cc9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652237DDA206E2CC9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652237DDA206E2CC9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "52237dda213826b2", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652237DDA213826B2", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652237DDA213826B2" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386099206bd71", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386099206BD71", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386099206BD71" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f25c99a9b5", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F25C99A9B5", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F25C99A9B5" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26343ae24", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26343AE24", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26343AE24" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f263939894", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F263939894", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F263939894" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f269000af9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F269000AF9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F269000AF9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f269ef9228", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F269EF9228", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F269EF9228" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26ab38c66", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26AB38C66", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26AB38C66" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26ab39d69", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26AB39D69", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26AB39D69" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26ba20215", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26BA20215", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26BA20215" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26bacce73", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26BACCE73", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26BACCE73" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26ce23fb5", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26CE23FB5", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26CE23FB5" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26d0e8e1a", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26D0E8E1A", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26D0E8E1A" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26d99583b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26D99583B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26D99583B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26dd87dd0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26DD87DD0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26DD87DD0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26e726166", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26E726166", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26E726166" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26ebe57ec", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26EBE57EC", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26EBE57EC" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26f41d1bf", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26F41D1BF", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26F41D1BF" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26f639113", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26F639113", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26F639113" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26fb27747", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26FB27747", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26FB27747" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26fb3ef51", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26FB3EF51", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26FB3EF51" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "522386f26fb49887", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26FB49887", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26FB49887" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53038d7ea4c68000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53038d7ea50921e1", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA50921E1", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA50921E1" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53038d7ea7607d3b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA7607D3B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA7607D3B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530398dd06e53b14", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530398DD06E53B14", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530398DD06E53B14" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5303b1dfde1a28c3", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365303B1DFDE1A28C3", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365303B1DFDE1A28C3" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530415eb3d7de000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530415EB3D7DE000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530415EB3D7DE000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5304281bda0e6c6b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304281BDA0E6C6B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304281BDA0E6C6B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53044364c3223e89", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653044364C3223E89", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653044364C3223E89" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53044364c4981a17", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653044364C4981A17", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653044364C4981A17" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53044364c5bb0000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653044364C5BB0000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653044364C5BB0000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5304625103a6f78e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304625103A6F78E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304625103A6F78E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5304879b1216b000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304879B1216B000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304879B1216B000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53049159b00c8aa4", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049159B00C8AA4", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049159B00C8AA4" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530498e2d91e9f1d", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530498E2D91E9F1D", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530498E2D91E9F1D" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53049e57d5e935f2", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D5E935F2", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D5E935F2" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53049e57d602b014", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D602B014", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D602B014" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53049e57d62a723f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D62A723F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D62A723F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53049e57d6354000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D6354000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653049E57D6354000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5304d4e9ace50000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304D4E9ACE50000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304D4E9ACE50000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5304dd19260b3894", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304DD19260B3894", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365304DD19260B3894" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530500fa7be8b448", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530500FA7BE8B448", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530500FA7BE8B448" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53054b25a8b72000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653054B25A8B72000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653054B25A8B72000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5305543df667bb76", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305543DF667BB76", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305543DF667BB76" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5305543df6c9b894", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305543DF6C9B894", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305543DF6C9B894" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5305543df729c000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305543DF729C000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305543DF729C000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53056c8aa1ac1f44", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653056C8AA1AC1F44", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653056C8AA1AC1F44" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53056f86e281a000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653056F86E281A000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653056F86E281A000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5305a618b886fdfe", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305A618B886FDFE", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305A618B886FDFE" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5305e087f66d6352", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305E087F66D6352", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305E087F66D6352" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5305ebd312a02aaa", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305EBD312A02AAA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305EBD312A02AAA" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53060a241807135e", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653060A241807135E", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653060A241807135E" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53060b0cecc35000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653060B0CECC35000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653060B0CECC35000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530625e354f030e8", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530625E354F030E8", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530625E354F030E8" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53063b9ad03cce98", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653063B9AD03CCE98", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653063B9AD03CCE98" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5306651729ab2880", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365306651729AB2880", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365306651729AB2880" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53071afd4908585c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD4908585C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD4908585C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53071afd493f3645", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD493F3645", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD493F3645" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53071afd494e4985", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD494E4985", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD494E4985" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53071afd494e4986", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD494E4986", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD494E4986" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53071afd4969aa80", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD4969AA80", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD4969AA80" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53071afd49724577", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD49724577", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD49724577" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53071afd498d0000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD498D0000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD498D0000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53074876d147c837", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653074876D147C837", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653074876D147C837" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5307a369e1a90d10", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365307A369E1A90D10", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365307A369E1A90D10" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5307e514419eb000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365307E514419EB000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365307E514419EB000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53081a8eb110f5c0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653081A8EB110F5C0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653081A8EB110F5C0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53082bd67afbc000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653082BD67AFBC000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653082BD67AFBC000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530886c98b760000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530886C98B760000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530886C98B760000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5308e1bc8811fcaa", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308E1BC8811FCAA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308E1BC8811FCAA" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5308e1bc95fa5f00", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308E1BC95FA5F00", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308E1BC95FA5F00" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5308e1bc9bf04000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308E1BC9BF04000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308E1BC9BF04000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5308f3ed38d58000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308F3ED38D58000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308F3ED38D58000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530aa87bee0967b6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530AA87BEE0967B6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530AA87BEE0967B6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530aa87bf01d4380", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530AA87BF01D4380", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530AA87BF01D4380" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530ae5dc6daab62f", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530AE5DC6DAAB62F", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530AE5DC6DAAB62F" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530b4ee0e7f53a0d", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530B4EE0E7F53A0D", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530B4EE0E7F53A0D" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530c6f3b4043f786", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530C6F3B4043F786", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530C6F3B4043F786" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530cb7fdb44b2703", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530CB7FDB44B2703", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530CB7FDB44B2703" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530cca2e512c0002", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530CCA2E512C0002", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530CCA2E512C0002" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530d529ae9e86000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530D529AE9E86000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530D529AE9E86000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530e35fa929c930b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530E35FA929C930B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530E35FA929C930B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530e35fa92a49095", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530E35FA92A49095", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530E35FA92A49095" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530e35fa931a0000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530E35FA931A0000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530E35FA931A0000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530ffcb9e572f348", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530FFCB9E572F348", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530FFCB9E572F348" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "530ffcb9e82be540", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530FFCB9E82BE540", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530FFCB9E82BE540" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5310eaed59c99e7a", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365310EAED59C99E7A", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365310EAED59C99E7A" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5311c3793747e980", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C3793747E980", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C3793747E980" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5311c37937a5b4ed", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937A5B4ED", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937A5B4ED" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5311c37937b60f36", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937B60F36", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937B60F36" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5311c37937b9a90d", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937B9A90D", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937B9A90D" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5311c37937e08000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937E08000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937E08000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5313566130b7c9b1", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365313566130B7C9B1", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365313566130B7C9B1" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5314401eab384000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365314401EAB384000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365314401EAB384000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53153ec73fc1c000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653153EC73FC1C000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653153EC73FC1C000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531550f7dbd3a64d", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DBD3A64D", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DBD3A64D" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531550f7dc8b34f3", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DC8B34F3", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DC8B34F3" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531550f7dca70000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DCA70000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DCA70000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5316542c978f166b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365316542C978F166B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365316542C978F166B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531717b72e63e229", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531717B72E63E229", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531717B72E63E229" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531722cfb7aa4c44", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531722CFB7AA4C44", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531722CFB7AA4C44" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5317af4c4a1af100", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365317AF4C4A1AF100", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365317AF4C4A1AF100" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5317af4c4a80aaab", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365317AF4C4A80AAAB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365317AF4C4A80AAAB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5318de76816d8000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365318DE76816D8000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365318DE76816D8000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5319396991888143", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365319396991888143", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365319396991888143" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5319ef4fb2d8b8f0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365319EF4FB2D8B8F0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365319EF4FB2D8B8F0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531a5cda496c4f40", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531A5CDA496C4F40", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531A5CDA496C4F40" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531a95be1f80789c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531A95BE1F80789C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531A95BE1F80789C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531aa535d3d0c000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531AA535D3D0C000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531AA535D3D0C000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531b9ac619e7a000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531B9AC619E7A000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531B9AC619E7A000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531ba123e9bed563", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531BA123E9BED563", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531BA123E9BED563" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531c6bf526297a08", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531C6BF526297A08", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531C6BF526297A08" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531c6bf526340000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531C6BF526340000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531C6BF526340000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531d972eda1c31c1", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531D972EDA1C31C1", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531D972EDA1C31C1" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531f438daa060000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531F438DAA060000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531F438DAA060000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531ff973ca4247f9", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CA4247F9", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CA4247F9" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531ff973cac4eecd", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAC4EECD", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAC4EECD" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531ff973cadf102b", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CADF102B", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CADF102B" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531ff973caf14706", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAF14706", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAF14706" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531ff973caf5ed5c", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAF5ED5C", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAF5ED5C" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531ff973cafa8000", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAFA8000", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAFA8000" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "531ff973d057ca81", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973D057CA81", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973D057CA81" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "53212bf3b80c09e6", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653212BF3B80C09E6", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653212BF3B80C09E6" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "5323589012483c32", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365323589012483C32", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365323589012483C32" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26cc60f80", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26CC60F80", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26CC60F80" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26e010d29", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26E010D29", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26E010D29" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26e8fd300", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26E8FD300", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26E8FD300" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26ece7cfe", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26ECE7CFE", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26ECE7CFE" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26efd05c2", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26EFD05C2", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26EFD05C2" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26f286980", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F286980", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F286980" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26f37abc0", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F37ABC0", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F37ABC0" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26f4b69db", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F4B69DB", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F4B69DB" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26f689e93", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F689E93", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F689E93" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26f7882d5", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F7882D5", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F7882D5" } }, { "DeletedNode": { "FinalFields": { "ExchangeRate": "532386f26fad66fa", "Flags": 0, "RootIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26FAD66FA", "TakerGetsCurrency": "5852534849420000000000000000000000000000", "TakerGetsIssuer": "8FF8C5A97FB5754F54249351C23672E353FC5137", "TakerPaysCurrency": "0000000000000000000000000000000000000000", "TakerPaysIssuer": "0000000000000000000000000000000000000000" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26FAD66FA" } }, { "DeletedNode": { "FinalFields": { "Account": "r4xMZEgWZaocA566U2xgUqKcTnXKZkBLLi", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CCA2E51310000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "958219424CF50797305097779A362C0FA61AAFA3A696ECF4E428992D035FEDE1", "PreviousTxnLgrSeq": 69002514, "Sequence": 68654331, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BA84C6C972DB9DCA081379D2ECFBC547AA4CCF262E19D55C639DE941D3E19E70", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "11000000000" }, "TakerPays": "39600000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rJsM7f8iBRAiXz3bMUaiCsxHujM8UpirwN", "RootIndex": "663FA034C4BB538F3FFE388BCABE3AA3C52FB791DB97130D2746281C3D384C33" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BA84E750740BA8D64C94F8D094C9948D569E48C018C960A978366B684186D35C" } }, { "ModifiedNode": { "FinalFields": { "Account": "rLxd1PUJT8xrZ59tUuPANfL87xkBXnkeKi", "Balance": "222967641", "Flags": 0, "OwnerCount": 76, "Sequence": 67646745 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BACF4F063A24F84F4A243E58D3AECEB99DC12A61A07A21F631D12B4E7CD6A89B", "PreviousFields": { "Balance": "212967641", "OwnerCount": 77 }, "PreviousTxnID": "1B1DFC71A23606D10491B443805F89DCD3FACDB68F9B9ADE9E2849D7FA185AA2", "PreviousTxnLgrSeq": 69063804 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1379519077703356e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a86", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rhrguNtFAs4pp6FD4n2Uz2M5PQACwnWdrC", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "BAE7F0319883272F93B0D40386D7D9B6F43865EBC11FF1A30A5CF994E77489BD", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1579551077703356e-4" } }, "PreviousTxnID": "7240CECAFA90526AB38573D46C46414C322C53222E4E025E8D4386F472CB9108", "PreviousTxnLgrSeq": 68991132 } }, { "ModifiedNode": { "FinalFields": { "Account": "r9edE9m7sNZEwgT6foU8ahfA1ocrNify92", "Balance": "61891103", "Flags": 0, "OwnerCount": 20, "Sequence": 67529738 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BAF05820D4E3B69DCB11B4E50CD8A9119AD6F0F7C2666121AA554ECD44FC01A0", "PreviousFields": { "Balance": "58174874", "OwnerCount": 21 }, "PreviousTxnID": "296A8916DE56BECE86727F3D9867347152254C4619D40FCB012037723F4AC0A1", "PreviousTxnLgrSeq": 69054508 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rh1bgyeVNDBauF3vXuASW2L8MWrdq8XYko", "RootIndex": "BAFC9C2EA25691545CCE70F214BCF8D438C660B64327B432F27359EE6F917F54" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BAFC9C2EA25691545CCE70F214BCF8D438C660B64327B432F27359EE6F917F54" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-28465116118" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNH6NhWEAVCRPrcDv9NYJdPKv4YTHn1EgA", "value": "9999999999999990e-1" }, "HighNode": "3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e01" }, "LedgerEntryType": "RippleState", "LedgerIndex": "BB018F18FEFCAE8AB52E9B32670D460D3497246F1FDBD96D8623B28220ED0F72", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-38465116118" } }, "PreviousTxnID": "9495535B1CFF845B129B1D935BA078ACFD806B12673F30ABC2B380FB0B4B5742", "PreviousTxnLgrSeq": 69048803 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLtYxg3QjyCpbY68rJg6XCeecMyCnzBNCt", "Balance": "473727214", "Flags": 0, "OwnerCount": 73, "Sequence": 66617298 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BB0A9EE33A87183DD44A233249E699586567E54900BBDBA12F69C05A3E8CC410", "PreviousFields": { "Balance": "419388791", "OwnerCount": 74 }, "PreviousTxnID": "55E1E7D013027542696D05DE57D79793656219A981D6D59E816E4174C90E33FC", "PreviousTxnLgrSeq": 69042972 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rBzk3TdhfdbidCHeKWfmQ5dy9AuAtGbXeY", "RootIndex": "C7D98479E3BDF2F01C7F49643BA7AC13D7E365C9AE6B30C241ABE52700AABD01" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BB0C0EBD589BA4C2919F743C381CDEF4AC8822414E40B4EC9EAEA6F9D5027B2C" } }, { "DeletedNode": { "FinalFields": { "Account": "rGPEKNaNPYojt4sFbUzodh9SUNxixCwoBC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAFA8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "A7205046B7475E7F0487ADF25FB90C5BD42697172484EB9216332B4636E30EDB", "PreviousTxnLgrSeq": 68899305, "Sequence": 67759694, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BB28DDEE92EBB6F6A3A12E4BB7A78113DEDDE7647CA1D46A240C845FC226DD54", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "180000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rsdrgJ5xtkPpnWfJeeshHZLWmQEMS3cFzQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305543DF729C000", "BookNode": "0", "Expiration": 722826075, "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "209BD13BE549DAEA272AE79F21DDD3C0DE7E146532EBB8D6EF7081443B2F997F", "PreviousTxnLgrSeq": 67961757, "Sequence": 67219915, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BB63655AC526D20CDC1FB8F92AB312514EE58661EF8BEE15FD28CDEC31EC0712", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "75000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHkAKrt7sjtM7vfLuUmVeJ98jp42mstkTU", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "d47" }, "LedgerEntryType": "RippleState", "LedgerIndex": "BB734ABBC593A4CA72996AC2DA03ACFA1563C984F892B7976F9624451786504C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "21AD0638A5544BCFE983EA251DE916EE7E0F759B88CF7492CBBABE47E8AC39EC", "PreviousTxnLgrSeq": 67960523 } }, { "DeletedNode": { "FinalFields": { "Account": "rJxQUBBc7qcHrGcjrb265KwXeZrVio5Eri", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207CFFA95DC7000", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "17B3ED1BADFC542255B86B68D3A9C51D4D10CD91010AADD0450C8CE6B862BE21", "PreviousTxnLgrSeq": 69050912, "Sequence": 67219921, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1399241951779892e-4" }, "TakerPays": "307693304" }, "LedgerEntryType": "Offer", "LedgerIndex": "BB943EBA222E5DF7A00D4BEC46C384A523D9B7ECE74B8B9E41BBA7550FDFDA1B" } }, { "DeletedNode": { "FinalFields": { "Account": "rp6kmTUHj7Q6CeSZDrqNLRbtvhdbb6N5gY", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973C4E67046", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "41FCBFA734C00CF226A3F8A5AEA679389E01C99CF4A0A63153B3EF32FCBD1BBB", "PreviousTxnLgrSeq": 68143271, "Sequence": 66758998, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BBDDBEDB635975A11ADCFF8113AEEE90D4777EF60439E6EC5A2206318BD0E3A9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "70073908" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGEVM6YhWfikBZiXgWRdcUk7XpAyAnUHZw", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973BE1FCCF6", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "A56CCC0320A234578A5821B9BCF5E13E28907E454ECC3C0CB931EEE25E715965", "PreviousTxnLgrSeq": 68904952, "Sequence": 67349483, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BBFFCE1B6C829D2090AFE9D09202F733BC4C6BA789EC093E89B5C74C652AB501", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4122243321" }, "TakerPays": "37100189" } } }, { "DeletedNode": { "FinalFields": { "Account": "rfqL99qLpPmC72SjLCaytr5g27EUH35RyB", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C3791FFA13A6", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "870C32E99CD307EA97AE83AE72283B9A56BB08E65CCDD8CE8DEDF663B39E835A", "PreviousTxnLgrSeq": 69033105, "Sequence": 68690185, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BC86A1FD332EB34363890BF2A647AAB03C57131BCEE9E691CCAD5245A748688E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1372702310.084407" }, "TakerPays": "6863511" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rUrtZA3gFTbfu9vkdygv2jzgBoFRYMNv5L", "Balance": "961849737", "Flags": 0, "OwnerCount": 166, "Sequence": 67387693 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BC86A2534EEF426E08EC04E94D34CB9BE285CEECA028382D69454584296EA13D", "PreviousFields": { "Balance": "739884013", "OwnerCount": 167 }, "PreviousTxnID": "852369106AB738017857C0E86F798759018F0F7FEBDD3810D5C5F6F0690206B1", "PreviousTxnLgrSeq": 69053331 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJfV6qTHdF774uGTdRHQMxb8NSF6TWu4uR", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "64e" }, "LedgerEntryType": "RippleState", "LedgerIndex": "BCAB82698497C7F3570F7C6CD74BF013BECB040B7CE5190D12F4E0F6D461C800", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2335796959.8" } }, "PreviousTxnID": "AD1E67130A2F7D54C86783399389C126B13685DEE35008885979EA9BD9340726", "PreviousTxnLgrSeq": 68893631 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rGtD3bMYvE4snnRuTS2n3CBfSLeUMBpSyM", "RootIndex": "BD24AD4AA7048396565BEBCE589672A3AB9116311BF74458A10B93BF037386A6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BD24AD4AA7048396565BEBCE589672A3AB9116311BF74458A10B93BF037386A6" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rNaQPWNXMaNzEWKoidMaJqNskRUFKbKWM2", "RootIndex": "9FF2AA7E1402EC69FAB027EC505F9CFF63C4F4E9349BC4104C9B2A3B0CA6C627" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BD43F7C050FEF00658B1354B9019DF45C85B074D4C3990286C3DC6CFBAF5F18B" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1141059609281884e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c09", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnB62vv6d8dQV13A3nHQQ7LEGy8DEWkLuG", "value": "9999999997999990e-1" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "BD449F1F673462FF4E0FBDC48B1B6A3D24CB0F9A06E58B21F4C57B8C6FF519FA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1567442101281884e-4" } }, "PreviousTxnID": "F78340A27570A4D742A969741E982BAD9E904EC87DA5B614571FCA0855A14711", "PreviousTxnLgrSeq": 68991155 } }, { "ModifiedNode": { "FinalFields": { "Account": "rKBwHqR3S55CpYFoX1bucD2PFMgSjPAFvu", "Balance": "1061224776", "Flags": 0, "OwnerCount": 223, "Sequence": 66598806 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BD4B4D7BA3378D740C5AD49D0E051E7342267C8022551633A032EAD3EBB8ED9B", "PreviousFields": { "Balance": "870474776", "OwnerCount": 224 }, "PreviousTxnID": "DE4AEEB8B49DE84B2E50F10DAA236FF2C7C271343E588B4B7C145A775412AF16", "PreviousTxnLgrSeq": 69060611 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "r4oX1kuULiPWPRA2hwV1R7K8kB9gUxqTtv", "RootIndex": "A3B1F6D0FF2E707695C2D4510271209AFFFF2B1E1508ABBDBACEA795726F8681" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BD6A3E1A621A6EED3BCA6C89B78D13E4F490A92BB44463CA1956AF0E078DA202" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "25900393251.81851" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c4b", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raBj3rXVSVdcA66ge5mMyS1iWzMFSyxmB6", "value": "1000000000000000e-4" }, "LowNode": "8" }, "LedgerEntryType": "RippleState", "LedgerIndex": "BD8ECCC081F57E08143EE0093825C822B9186E7DB3949F61D3BCB55DFFDC2425", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "51800786503.63701" } }, "PreviousTxnID": "D5AA6A7660D0FDCF7338B7C04212046BD6365C47E13C3AB5C2E57FD97A53EEE8", "PreviousTxnLgrSeq": 68890971 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rGJ5He1dXx78w8pGB7zHH9K7dWd9pF8p39", "RootIndex": "0CAADCB94F5B620D79AE79E43431CE4FCAB7101989DCB63C3663426C9C796CF4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BDA38FD2C72F79E748BD590B878BC4193E855825094AA02873DD0556231C7D46" } }, { "ModifiedNode": { "FinalFields": { "Account": "rPWjueM7txwURGpJDWF9yQRn8cVmWQTDnE", "Balance": "411390316", "Flags": 0, "OwnerCount": 63, "Sequence": 66692585 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BE4FB0AE7A12288D8FC776FFE1BFAB251C7CD7A3FEF8C38E77D9AC7C284477DB", "PreviousFields": { "Balance": "332247151", "OwnerCount": 64 }, "PreviousTxnID": "D98EB692F39DA035D71D7577D6BDAF22F3015F8A1E1F49F64F60111C0638D45E", "PreviousTxnLgrSeq": 69063041 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2000000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "cf2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3ccw1UCPwayXhAVmy6oC4yQTSPeG71bx", "value": "1000000000000000e-4" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "BE5AB4A2BEC7BDFBAC7B60E66FBAF11165FA4573FF1710E138FC6F1008526900", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7000000000" } }, "PreviousTxnID": "808483DE8C02BB3297A29B4BECB913C6DC226D403087E9AFA8A0E7947CD351A3", "PreviousTxnLgrSeq": 68991025 } }, { "DeletedNode": { "FinalFields": { "Account": "rfzxSb2zMhKDqCsD81pZt7Bjkvak4NBwFx", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F2E7B65", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "4EEBE75450E9C961947A356EFC20F431D754F105699A6C98903194CA3CF18665", "PreviousTxnLgrSeq": 68132572, "Sequence": 350, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3970854831660000e-4" }, "TakerPays": "3931146282" }, "LedgerEntryType": "Offer", "LedgerIndex": "BE6E693DC8A566FAB08CD80511CAD5EBC58C3171A888F1D7B2EC3CF2848AE063", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4593734020940000e-4" }, "TakerPays": "4547796680" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rBqYpFjv2TLUiwx2Lr5vgGxoEgjhq1XnB5", "Balance": "246272522", "Flags": 0, "OwnerCount": 10, "Sequence": 67575744 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BF0B2CEB8FDBF05C6B2A329721D4FAC8DDA6349E25308056D6659A1BDADAB630", "PreviousFields": { "Balance": "186084776", "OwnerCount": 11 }, "PreviousTxnID": "4A49A4FA6E1C18087FB2A9312CAA3A52BB0790C912F9E161708023563331F717", "PreviousTxnLgrSeq": 69038958 } }, { "DeletedNode": { "FinalFields": { "Account": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530FFCB9E82BE540", "BookNode": "0", "Expiration": 723610786, "Flags": 0, "OwnerNode": "c", "PreviousTxnID": "773631472FB3AC276B5F2F24795D2872ACCEEDE0B2CB0EE4B9E9E7241546878C", "PreviousTxnLgrSeq": 68154156, "Sequence": 1410, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BF613C9E8ADC4973DF39502318E3170565577C278A068FFAC0AC82C764A5F36A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2222222200000000e-4" }, "TakerPays": "10000000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rEm8Pg6dKSuFWvEJK2Fnv8EvmkSTuNFJew", "RootIndex": "BF694D360CA30A020AA6FB07412E4C8A1F61997422D59F6C700BDFCBB6951210" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BF694D360CA30A020AA6FB07412E4C8A1F61997422D59F6C700BDFCBB6951210" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "Owner": "rHT6EWF9zJzwNtHQsxyrRMSQL4h5GhkcUn", "RootIndex": "AE8E968D356039CE6C3DD4DEBBE04C7FDB0F5829F8DF71FA3C13E37F94987D73" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BF7DDD5E9EE7BE7B23B32B9B30F4763940A685D7206831E23C777DE5DD69919A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rNd3R5EaqkBC3EguG1mmwhjpKqLDTjBNwQ", "RootIndex": "98E93E4172A84BB79DF8544244015E8A8964B8EE3862871CF5DAAB95E7742C5E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BF87975D08C91DF25CC60BA451D20371A73A87987482A38B971FA2EA0D880F77" } }, { "DeletedNode": { "FinalFields": { "Account": "rBHSrXq2LzGniUp4zypCRk1isLw1ywLPHv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAFA8000", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "45D6EBC235C7C45292C728D1A6C3359712F82A24230713906A4056A06EE2F845", "PreviousTxnLgrSeq": 68998226, "Sequence": 68976407, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BF95ED4A88F89CD0333DA27D684E4682379FB7D310EE3FE3B5F774E1F9BB6A97", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2500000000000000e-4" }, "TakerPays": "2250000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rUNU8n4sX1Wo1ksPNPQheA5s6nZCe88iPW", "RootIndex": "21EC3AB803915CC45A15A79C86DFB0C4220BECDAAC33BF25038A520C1899C0D9" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BFBAD9B02A5784C5FF910E4E775159A86DDA3F03F8315D62A3B0AA70FB58F983" } }, { "DeletedNode": { "FinalFields": { "Account": "rMq6uX75yyCP9KjWCxYghLf9xsr3rQCbJv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521634577FE2BF00", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "A481A1BAD29AA1E3D2E50219736C51E82E736B73EBFC4E41A1FA6EC8D5B52165", "PreviousTxnLgrSeq": 68899275, "Sequence": 67526023, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BFC57D3560303B463076BE1A809AE56193AB4962520F89D6DE2F0191F2739B0E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "62499999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "17", "IndexPrevious": "15", "Owner": "rspLJnfzomVceQKCn6ExME3gJEUuhUZxdV", "RootIndex": "AD218E1062EA54E07D8608504C3D1CA576AC3AE053FF09FB69944F0B26F56EDE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "BFC897FE9747514FAC8273DB59990F467E54438B4A5210765B2EF46B2BFD36E2" } }, { "DeletedNode": { "FinalFields": { "Account": "rQ34CimjrmwQA4bz3qCwGRHPFuo8rbnVWv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B036EFECDC000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "7BBF8B5137A027B06FF3B1CAE12F607BC5962B0041E30569AEB8E64F7780EA14", "PreviousTxnLgrSeq": 69000053, "Sequence": 67515989, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "BFDCF724D24AFA6ABB1B67BDB042967AA26348E40D116A76FD677723A4854B66", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "31000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rsWg26FevrM9h2PFcanVpvpaLNuoGpLnrB", "RootIndex": "C006F4C77DE22291CAACC660CE47C1C7A5F5AE66252448DEBFEE20EA663C73E0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C006F4C77DE22291CAACC660CE47C1C7A5F5AE66252448DEBFEE20EA663C73E0" } }, { "DeletedNode": { "FinalFields": { "Account": "r98DGNQEGR9x2bhRVBbuiHAqxq2aDD6pKa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E83BD9E123480", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "26E3844B7D6BEADB2C72A2C76C4D21D2E6BB9AA584FF4064C186594975905CED", "PreviousTxnLgrSeq": 68997514, "Sequence": 67202775, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C017AD83725363E2AE7184B6D4B86490161D4A2EFAA811143C29C6001C9341A8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000000000e-4" }, "TakerPays": "2042750049" } } }, { "DeletedNode": { "FinalFields": { "Account": "r4o8fw9WzkMQTvfvxZFVhkY8Txt3eN8Wct", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F0515C11B", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "427CFF8FCC7EFADA5E33FA9CDFBB38FC5CB672C9021BA1FFC9CB0926A8D06ED6", "PreviousTxnLgrSeq": 68898281, "Sequence": 67794279, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C062DB44B61FB1B1BF9D9C87E3B3E87E438F43E709C387F2B4F715822250A380", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1663278891609035e-4" }, "TakerPays": "1297357535" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rPDEk87BWPzJVDg22rmwGBu7gxKdkQrJEc", "Balance": "2568308110", "Flags": 0, "OwnerCount": 8, "Sequence": 67489222 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C06F588BD207939CD7DD39498A70C82ED255850FFFD11C3AFBD4BCB12C08BA74", "PreviousFields": { "Balance": "2320483742", "OwnerCount": 9 }, "PreviousTxnID": "A17AB2E93C15843C7EBC764920F5EEB478092EC6DF6B1C99C4F927C9AAAEA84B", "PreviousTxnLgrSeq": 69026131 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ea2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r31dxSZgmArpDtwoLPAftYtU8bHauuxwA5", "value": "9999610698224579e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C0840CC9BF8FC0CD1F060A50B83E07E548E04036EB6A411078798B45A045FC39", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4145452681.330667" } }, "PreviousTxnID": "58D269E83245F4341DBA6F089F482E6C76D18BBB9600B4F9A88C48BB1AAA0955", "PreviousTxnLgrSeq": 68899337 } }, { "ModifiedNode": { "FinalFields": { "Account": "rwhKYMZGMmf9zeLdZWq4rs31DQeaxn65R2", "Balance": "447780856", "Flags": 0, "OwnerCount": 139, "Sequence": 67373628 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C08E9F0CDEE87BA1BEE9EA8E73EC2972257DAB1F88ECE8BAF78F20A290FDB3F0", "PreviousFields": { "Balance": "372240857", "OwnerCount": 142 }, "PreviousTxnID": "41C9F93089285CC4368575FB98C1D819260140E3B43C2263C94762DBD433C6B8", "PreviousTxnLgrSeq": 69063590 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rwxKxP668nq2w99VM8SpeaXBwUVkcpcV3m", "RootIndex": "B3BFA19C120BB0871A150611D157ACF0E1CA70C968987A5B6147F53339BAF801" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C097130BB10BBBADBCC9C0AE7AFC21BF29DA4C7ED5C38873158746110612F000" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHunttX1NcJT4kdqXJZaqjkU7zeMmJuauN", "RootIndex": "B0A9321C09B1FC9C78F62B36A640FADFEB328A9D87D8B12D7254421D6358AB20" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C0DE1A4DB9CBA4DE2D40AAB2B75AFCD01B6BC196B285597880506DB17D1DF707" } }, { "ModifiedNode": { "FinalFields": { "Account": "rBMPrNjN4FCHpC3wWAdrorVra71nhSRkuK", "Balance": "1964892522", "Flags": 0, "OwnerCount": 63, "Sequence": 67580083 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1014A2615C8FC6EAC543363C30B88D85FAACC786DBF2087FC22441D1B6B0A30", "PreviousFields": { "Balance": "286962572", "OwnerCount": 65 }, "PreviousTxnID": "768290E49BB4EFFE5872014B51BB07362C66E3A72457A96931AE3FE9E8A21486", "PreviousTxnLgrSeq": 69062475 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHa9ikQjRRPKoFgcqN3dwTb27vvL1Ezo6D", "Balance": "1110542184", "Flags": 0, "OwnerCount": 235, "Sequence": 66151105 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1375F96C2B21C6D00F9F39BB3B14BB19A21DA229EC77F21116C22053A23988D", "PreviousFields": { "Balance": "1040542184", "OwnerCount": 236 }, "PreviousTxnID": "CA2D3ACE1A33A3B769342C0577A1161EEF1710A87B394416AFE9D6F0333E147C", "PreviousTxnLgrSeq": 69050284 } }, { "ModifiedNode": { "FinalFields": { "Account": "rpRfuSRwU9nUefy8T4z4RXUEDU2baW1qhk", "Balance": "928063022", "Flags": 0, "OwnerCount": 110, "Sequence": 67425389 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C17C046449A844F08F4363B7CF94EEA6C0D04D0DC0610CA7C30450194C4DB785", "PreviousFields": { "Balance": "485541918", "OwnerCount": 111 }, "PreviousTxnID": "00438595EFABF602060FD60D9F2A16D7ADDEA796308CC37D73CF9F15B0078CED", "PreviousTxnLgrSeq": 69062211 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHyR27TRJ73Eu8bqe5wBxX64hJ9Xf2c5XQ", "RootIndex": "D57DEC33C61D8B2FB7DC2C83830302F49F6894AD32F96A6532CADBA601B28498" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C185617BB236D990878969CF81A4C4F11D8265DAF2E5D1BB4AB495A8E42A0483" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNoN8BUzTSY5oyJmAMiKNGo1k8PSxhyJzc", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "693" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C19FC07A82F746DECE078D0C41A29C62B70510A0BD4BB735CDB4842367680D20", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "5350D9E7A6802CA5E50932497AB9DDE66538C67AD2A6933E6983A6074254A624", "PreviousTxnLgrSeq": 67997978 } }, { "ModifiedNode": { "FinalFields": { "Account": "rP7b2urRNSZ6dfigtcEaChxF14R3kK8djd", "Balance": "381188880", "Flags": 0, "OwnerCount": 64, "Sequence": 67293332 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1A2F18603CABB6CF41C59C27E62CB7426D6C86E4F18EF97F13CD8B67B119EAB", "PreviousFields": { "Balance": "331188880", "OwnerCount": 65 }, "PreviousTxnID": "09C4CD4C3E4C7227F77AF398FC9CE1542E125442E34EC79E95F67580AFECB7C7", "PreviousTxnLgrSeq": 69047632 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDHvd9BAsKFcmRyCA3Y6iYEMi7n3xzR5Uu", "Balance": "198999424", "Flags": 0, "OwnerCount": 78, "Sequence": 66975947 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C1A86E7C7246E16BF0CEDFA346E2195B112F76E1497D27E4854A4E4EF063A387", "PreviousFields": { "OwnerCount": 79 }, "PreviousTxnID": "ABF35E0A9933190A9F02A3C0B08AF43CBC3C74EB1ABC5020DA669466363225A2", "PreviousTxnLgrSeq": 69053009 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rJjrokNPSa5xiAbh8N8cqmhVc4ma95FBpt", "RootIndex": "E121E72FEC56B65768C3BF4DB7B717F9F5D68926613ADE62DBEE61FAACDB31EB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C1B643A4C891E6A3532F59CF56319CECE3486B3D4125518CF0B6608AB444690C" } }, { "DeletedNode": { "FinalFields": { "Account": "rENubezZP8CRwDNdupJB2J8D1GxukZ7hjv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "7B27038D17F193061F85A7782C1EE3DC574CCAEDA742D466CA49A804B9CBCCD8", "PreviousTxnLgrSeq": 68918407, "Sequence": 67385223, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C1C961FE0A6BD5C192A88EF20F139C12F5D0C3CC0CFBE01973F3DEF6C78A1060", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000" }, "TakerPays": "20000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "6", "IndexPrevious": "4", "Owner": "ra2BXpvnVUqyCNaxAUf9Co2AxYzuey129Y", "RootIndex": "83943904179137B1F69967B4B27179F0AD665CA820E7B76F40ABF1A34ED9A06F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C1D569FB08EDFE0B7CD889E4B3E7D79225ED2DD41A3602382E281065184D17DF" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2000000000000005e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGdg98Rr24zGwE9rmiPzKi8GkmkhyHyAL1", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "610" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C1DC6A3661D1EA58D8A3CF4C9A744E8613BE6556E6D4A297EECE5DB13ABAB7D1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2577864939066675e-4" } }, "PreviousTxnID": "EC22390883A03F7AADABD64B115864975879BC884F887086D9A9FE4817369240", "PreviousTxnLgrSeq": 68287627 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHmYEsWRfXC1YbFEKeJRWu9d7tdZ6x1od5", "RootIndex": "C1DE3D1530025F6F24249008A49A3C05EEE2B76C7608A95F427F3E9C9731504F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C1DE3D1530025F6F24249008A49A3C05EEE2B76C7608A95F427F3E9C9731504F" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "180003.27114" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ec9", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "ra2BXpvnVUqyCNaxAUf9Co2AxYzuey129Y", "value": "1000000000000000e-1" }, "LowNode": "5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C1EE83341AF874D700F9719DE9ABE108D5FE797FA21B399B63FDBBF2A07AD88D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1800180003.27114" } }, "PreviousTxnID": "500D9E9581E7011991194C044DD2675E5BB22F17F6394E6EF0087CC7F66FA567", "PreviousTxnLgrSeq": 68883687 } }, { "DeletedNode": { "FinalFields": { "Account": "r3pDCAfw2nB715iBJVMix9M8adFpHyfGRN", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653060B0CECC35000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "5891C4E1FAADC0E2226F5F313E8DC2FDD425E555D04F80104C7ADD7CF23B8775", "PreviousTxnLgrSeq": 68912847, "Sequence": 68179410, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C20D0A7E2790F559ECA7A0EEACB781024C94B4247EE0AE1408D97F80BB18868E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "170100000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r3mZ69KGMSXXfdFe2xxeNvSkA98mQQ52aF", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207069DE14715B8", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "E7EAD1870F80793443B24B458B003896E207AB7B24CDE9C2766373A7FE5864AF", "PreviousTxnLgrSeq": 69062949, "Sequence": 67138991, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C23A3275DFF048E68D6BB2B94010CCC5EF7122494F53D006361DE00534A7D657", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1961082847651630e-4" }, "TakerPays": "387823743" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rELkNgURGeR4vEFUEYHNATaS9pwPk4KFEm", "value": "1000000000000000" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "2dd" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C23E88425FD607DCF463E3E5DA0C225E04A74C48796160A21AB7759D684C152E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "302A0883B80D7C9D3B67BC434C35646F6E06FE253E28B97D551F979509BCBE20", "PreviousTxnLgrSeq": 67951491 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGzfdR9pNTEgc3qiShH9q3zp7KpVXgVUq8", "Balance": "1980613045", "Flags": 0, "OwnerCount": 6, "Sequence": 68014237 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C2537D67ADCD065905018FCC548B49AAE292E5085400D2D2CDCB26162A0C88D5", "PreviousFields": { "Balance": "202007142", "OwnerCount": 7 }, "PreviousTxnID": "01059C1530A7C7F4B64AF6D7181D19536572836F2305944DFB35752B198330A9", "PreviousTxnLgrSeq": 69046055 } }, { "DeletedNode": { "FinalFields": { "Account": "rN8rfe7hU4CCkmEiDkj9fg8pgBp5fa8p2j", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530E35FA931A0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "796ED0EB080AAD1D815D3789258F402919B4E9EBA600AEA833E3B8FB9EE2361C", "PreviousTxnLgrSeq": 68857104, "Sequence": 65991542, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C26816E733D7E79139CE79D3A75F39466BC25A85F3C44E8B2C019961F43ADC26", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "800000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rpVr26FVpK1G1u8vyMwsKnpXn7iycrYise", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F25C99A9B5", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "E1EFD9D5FB229150F9C61ED40008BB2054E31A64C01F73D7C946F662FF9C1649", "PreviousTxnLgrSeq": 68890128, "Sequence": 68152825, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C28D3B78AA605D8E78A0BFC2DD5836B9A95C7586DC928DDC5CCA9404DD46FC85", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2239826471.975726" }, "TakerPays": "22398264" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rMd7wG9Hzf5YXsqZ48kNRFLARM49oydLry", "Balance": "80377788", "Flags": 0, "OwnerCount": 31, "Sequence": 67169264 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C2A4D53791C95BEACD04B38C4785E4179C94F8FE1E3AA1CF4EF98332E813384A", "PreviousFields": { "OwnerCount": 32 }, "PreviousTxnID": "AEE9D9610EA1CB8DF6B5C73E2633598D84ADFA4272C3BE2B01BE32C77E730F61", "PreviousTxnLgrSeq": 69007137 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rMGXtc2jn88JResx6QRWgyxUvdrXRwmZ7J", "RootIndex": "F2D8BD5D58352ADA453B124A947D1303E552DD845CA7BE553DA65150154E8432" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C2BAE0DFE207AFE2CE4A3513E428E3B4C73D32F8A7DB110DC71504B3014D356D" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rLN2tJYrH11YA3EqyNw6csgsBEnZ9TeaWF", "RootIndex": "A8831B2F5F0F8E214DD933E68CA6542ED8B1ACBAA01DC6C6ECA39F58388B6570" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C2BC9EAF46E573693270E01E1DD17A3F2E11091D5ADD709F008CDB3DB1D124D6" } }, { "DeletedNode": { "FinalFields": { "Account": "rfTkTBbkD6NFaNLprSDfnC3CJEtNwgqYwy", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F02705778", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "06AAB8562369FFECF0D8A2459EB725B4CFC5C3D668876ED39B13FD74B3F3590B", "PreviousTxnLgrSeq": 68899748, "Sequence": 68037543, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C2CF9E2597B42AC228B4573850AD3E9FEF894BE818384B374E6949AD3B526FD7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20188409096.34552" }, "TakerPays": "157469590" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-857969648" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGMM3Ag2DiYP71uk8mWQi8fafCQczx8ouK", "value": "1000000000000000" }, "HighNode": "3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "18" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C309629BAF6FDAC2F6AB7C0B89F2A4FC081A76F0804C587194D18A556540D203", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30857969648" } }, "PreviousTxnID": "42D5A63F4127A84160502CB5ABF21B099F1D0BB02E930D6FC7127766508C6F9B", "PreviousTxnLgrSeq": 68899471 } }, { "ModifiedNode": { "FinalFields": { "Account": "rwsVYq1xyweADXhtBLLfr2X9FL57DnGTk3", "Balance": "173694266", "EmailHash": "3AD80D314A1F13CFA8E0CEF721C57D78", "Flags": 0, "OwnerCount": 9, "Sequence": 67647723 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C32906B773563756D7949631661492EF4ADBBBB67AC3BFB0711CE04BBCC6D592", "PreviousFields": { "Balance": "160476141", "OwnerCount": 10 }, "PreviousTxnID": "6643B9686B5C8C23D5C40E067E8604B54580640C64D999A26026296C1C6E6441", "PreviousTxnLgrSeq": 69058218 } }, { "DeletedNode": { "FinalFields": { "Account": "rB7bqYSsffBTNfLgyyyXyWL2e1bg2djJq2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680F3FE73", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "4A690EADEB4144AB458B2E6B748658BD31DA2B6BC2461F0FBF3E625FA9CF6497", "PreviousTxnLgrSeq": 68899306, "Sequence": 67458424, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C37E85C73FE9C316E2C2465DDE7C90586DA0C9D15DE70D1E3B50760CF562757B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "54501929" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "f", "IndexPrevious": "d", "Owner": "rsGTbAufvBkkN5xpaKZtEMCagAW5SkJEUL", "RootIndex": "8912016F1A68D2FE13794AD46A10697AFEFF1DE7A3B2F73EE2D1CAFA00C65FA4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C39F11241A3D185E0BF72D9A5C48436F71BEEF1B146861B4C90F95861466BD12" } }, { "DeletedNode": { "FinalFields": { "Account": "rG9EpCkxGBXowufUGyrVF8tT7ovkHBdMb4", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37932085EC6", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "49249ED35A43FBBDE31A32B081BD57252EDE07DCDA95B60C6267C1E09C6FE803", "PreviousTxnLgrSeq": 69022245, "Sequence": 68040415, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C3A85DEBA21DB513530A592999BDF11FA79461EE27ACFCD2D615255BDB06958A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000484098.059855" }, "TakerPays": "25002420" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rGCr7TstZbRvToumrTKaUcTX9JGKVLsCVB", "Balance": "129743393", "Flags": 0, "OwnerCount": 50, "Sequence": 67407795 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C3A88C9A2C5366B1DABFAC62B1F4902B3F2E809B1329F5B4B8EC53F3C5405AD6", "PreviousFields": { "Balance": "122187119", "OwnerCount": 51 }, "PreviousTxnID": "1E2517751069B71C09FB4F6544937888AB43F1C494EEE06DC4EAE146E9C933D0", "PreviousTxnLgrSeq": 69063931 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-6285989866" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNVK54FFqQPyc5jFNayw1WrW2m54SRAMWv", "value": "9999999999999999e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "807" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C3B88BC9928F0034F168D1A4B274AF1395295B614FCFAB226CF256B1E4428C85", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "E677D013B2E51A310A1EEA054C2A1C3FF519948943A2C8062D619223E1B333B6", "PreviousTxnLgrSeq": 67993354 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHvia9Ti9HmM9QGixKxxKf9kYS9LUxTrjq", "value": "9999610698104581e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "efb" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C3F273D53C140A0E79C585D53FAFB9CE4B37220539B934AEEE9719F60398571A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2446244798712641e-4" } }, "PreviousTxnID": "616DF96DE8C38210397A28F96A0545A5E70BA7B28FF08575757D925936DB97F6", "PreviousTxnLgrSeq": 69005405 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1883385918.700632" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eda", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNh79kZDsubi13bjTw64kBsKVWepnDT2J7", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C41A498EE46D1C9C3972111916FD9C3F4961884B6AA85A5D453EEE4BABED81A9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3424338034.00115" } }, "PreviousTxnID": "CFC95D9C93F4541AA703BCE9A6C735C7CFA64E3B8276A2D37CAA3780386047A3", "PreviousTxnLgrSeq": 68898713 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKso7KmktCCYBfe79sNAFnfKffvansBBRz", "value": "1000000000000000e-4" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "427" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C4219E01A98702DFB84F6B761F8370C2DDFAAE36290B2BCFA7C1FAF6B60ACA5D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-40000000000" } }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "983", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rhJfzjX6NrYjiR8yGumtJSHuuLxn2JbgvT", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C42B6682D93A743C2B61B08B6D37940E4FCCA26474A1A595FDEB399FC17752D3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "ACCB634527D0ABA2ADA92E06DE7EBEA0107AE2A2D08C7CABD11142BF8C237256", "PreviousTxnLgrSeq": 67991917 } }, { "DeletedNode": { "FinalFields": { "Account": "r4F6d9gkY5JPEkDEmUwcLgGX2NSV6o7DyR", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAFA8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "f", "PreviousTxnID": "01024000CF81DE6A574EAA68EF0E631DD618579C41768D7CCC426BF41B844D03", "PreviousTxnLgrSeq": 68963654, "Sequence": 67033158, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C44EF3BD84E920871E8C41B9E9342288DA34ED8322C76E6C666E98626A51F6D7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "90000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rDDmwBnxoXcq7PLUXTvsfVHhEqGpNCS138", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAFA8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "D6037A5196F01466A19835034B8B6CF1034FB740A16B88644D4F2FF4277AAD9C", "PreviousTxnLgrSeq": 68897982, "Sequence": 67491437, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C4647D367E9CE7223EDA3C782D8699D49F32085BCE1CD599E5F45620071F7CB5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000" }, "TakerPays": "9000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rUMbRuiufkSUvwXG6HBXYHTW9TpioNBKjo", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365319396991888143", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "2DF142737ACD2D06264BDA4AD9CF5E081AA8BE8B1CF79BD55ECD3F45AC50DE5D", "PreviousTxnLgrSeq": 68268414, "Sequence": 67542739, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C480AC3D7E72FF9C1FFB92D8F61C393F622E6EFB7064A305F4D1CB5DF724EA2A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "552805280" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "50000000000.0001" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "2be", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raf2m8Ki2PVqjTU3YsKK5R62dAhiYXepcz", "value": "9999999999999990e-1" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C4AFDA1B91ADF5B13B0F66CDFDC9409262C079EFBDD8081144300C3ACA6DF1C4", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1000000000000001e-4" } }, "PreviousTxnID": "801BB1939B0F6893E18FF4B4530A77AC2D89E4AB2EB435C89858E19029551818", "PreviousTxnLgrSeq": 68934810 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "r3LLQmhVJiQ3r5e3QCo15yaDumDNp7Gn1r", "RootIndex": "F11A48781EDE5617A25255BB7D135268E996D1AB5C6E6237E74499CD81EC6BAE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C4BDFE12E470AC2586C8B4BE90A4282C080AC0558F35523D4322B6922328C6F6" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKU9ca11NtN2HFEaNj3WhV7dS13vpDeS46", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "df1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C4C54C55F63A47EE4DCE10C4C6B069759DD28D80694CE84B86932BCDDCE7C0ED", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-30000000000.00007" } }, "PreviousTxnID": "7DADA3F95041FBF018C504F2139E89455DC1595BC79768B4A3DAC251E04D5241", "PreviousTxnLgrSeq": 68909412 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5000000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "980", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUEnyBAH4xxjS4ZkMrki8GnNvsvysjSuZy", "value": "1000000000000000e-4" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C4C8AAF8CA6612768A630A7BB2060F093C23CC916C694DACA9BE8AA24160EB25", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "8157063667.673492" } }, "PreviousTxnID": "8D7D3088CC140D858BD7076B52D6D2EF309B89C4FC0642B17D7E603C4B3F0ABE", "PreviousTxnLgrSeq": 68991214 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "raANwNJ9aqncwhGT1Eh9mksqTvAMm3WZG3", "RootIndex": "F073B3C09A2EFBE4B7E3EFEB745817D40C89B4A4F26611936E4F9E94700EFEC3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C527BD0C9C86838604AC24CF026DA3988A2B6A4633422A5E5B483C34BAED8E23" } }, { "ModifiedNode": { "FinalFields": { "Account": "rDqBWAYNudfa8rBsr7YDsdDxeAoNRsxfPV", "Balance": "3020405329", "Flags": 0, "OwnerCount": 74, "Sequence": 67406215 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C5306E59A8AFC72DB64A87CFB99E478FD5DE1B40B00668D64CE01B9CAF20AF50", "PreviousFields": { "Balance": "178519028", "OwnerCount": 75 }, "PreviousTxnID": "4B32F3365615386ECB469FA9F5E9457197F0519C3DFBAA261AC6833FFF66BF5E", "PreviousTxnLgrSeq": 68827080 } }, { "ModifiedNode": { "FinalFields": { "Account": "rpf1wWbuPjafvAgD4f9vtX88Ut9qurPRHS", "Balance": "2983506409", "Flags": 0, "OwnerCount": 152, "Sequence": 66662475 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C556EECE1F7073BCE8B2799D386575A98832431F598BA1CD8E31909F8D83B553", "PreviousFields": { "Balance": "2385506409", "OwnerCount": 153 }, "PreviousTxnID": "7261EDE1DDD00CE11ACBC0736AEFECDCB8354790733FDACBDF78B75D907C0A89", "PreviousTxnLgrSeq": 69064169 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rPDEk87BWPzJVDg22rmwGBu7gxKdkQrJEc", "RootIndex": "C56A2D860119AC4FA1171C968429F2611E1A315D7ADF1DA52C226BA195092B6A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C56A2D860119AC4FA1171C968429F2611E1A315D7ADF1DA52C226BA195092B6A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "raHjNXUyRvwxN5Vr5NtQ5pbFVgbM7kqLrP", "RootIndex": "96965012ABDE7042FEA777766C925CC26D22AD3B79FB94F61B59945DF1415B8D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C5723212472883DC17E189D01E1F58C3A493F7E3C466657579154B87988F3792" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "2a3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDYvWkTQaaoWiWYo2r5fKuqEoop8WK9crS", "value": "1000000000000000" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C5966601A4949FA24F29642619960B356616419EF08CC799AD18B1D97BB9A58B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "96000000000" } }, "PreviousTxnID": "D0B8A8A92C2BB260410FC71278BEEB806FFC524AD157D37E64903522C5B9B93B", "PreviousTxnLgrSeq": 68990978 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4AXMmLxiAtMf5yvyqqCZeHVhswjdmNgBx", "value": "1000000000000000e-4" }, "HighNode": "8", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e51" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C5A272099C7916B2F6EB1C8E87B2B37F9CE8634D88984E9B9A7ADFB5E40F5453", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1203912777297306e-4" } }, "PreviousTxnID": "CA3B5C153AE6690AB1F5AF8D33D74DE06EA3EDFE28C2E73788416C43B76AB5B9", "PreviousTxnLgrSeq": 68983402 } }, { "ModifiedNode": { "FinalFields": { "Account": "rKnBQjFdG2pPCrKiUmeZZZ6YjmuCyWVta", "Balance": "1423556490", "Flags": 0, "OwnerCount": 75, "Sequence": 67618672 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C5A81F0A93BDAB00A0D25F7B63765EE8DA907A61D570CCFA4C8C688F08F0282E", "PreviousFields": { "Balance": "1319410652", "OwnerCount": 76 }, "PreviousTxnID": "545F159B1C0FEAA18D6E07E30588B343393383E4F786FD5DE8F1580930E7D407", "PreviousTxnLgrSeq": 69062221 } }, { "ModifiedNode": { "FinalFields": { "Account": "rwNMX6iAFTsFK2PG8PCNG4AJ5b8UyrSx8p", "Balance": "584016482", "Flags": 0, "OwnerCount": 48, "Sequence": 67440231 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C61906968518B943B59479AD72782C776A66E5925ADCA9B28B2F529F0C04DCA3", "PreviousFields": { "Balance": "509016482", "OwnerCount": 49 }, "PreviousTxnID": "37FF7DD928FBDBAA8796C5316C8EA0398CA173100F1A98EAA17093A2D1A95202", "PreviousTxnLgrSeq": 69058151 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "7", "Owner": "rJRfgew5k5b2Qgj5r9gn2L6w66hE5vwYnH", "RootIndex": "FB2C3B7E31FCCFA114D49C5C8ED61A74681ED0D6B8C99A9B5CA8DA3CD9F96750" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C6472B1C063088EA3CC8CFB7ECE59DF2955DF10F476F698C61F08ABA88944EB1" } }, { "ModifiedNode": { "FinalFields": { "Account": "r93dgTvDnFJsP2YGRiJvd89D1xLTmgR4fp", "Balance": "697823181", "Flags": 0, "OwnerCount": 8, "Sequence": 68599303 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C6AB77FCFD2E35221D096651ED4D124B8BC9AD9C7C84BCC46BA401AEF25D138E", "PreviousFields": { "Balance": "475023181", "OwnerCount": 9 }, "PreviousTxnID": "D0748D93255C0E9E3CC4ED0CCA26930DC2E75F6604DFBE63B3E1378FC623105B", "PreviousTxnLgrSeq": 69054012 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "8", "Owner": "rKTKekwyDDoxNtZZTwXL9ebqeVYRp47BVq", "RootIndex": "DCCA60E3E1964A54B3182684812441B5D49D258AFEA56F5FF52660497E96F4DA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C6D29CF176CD593ADCF2D4F13BB63C802EA0C223FF3AEA2AEDFAD37C273EB4CC" } }, { "ModifiedNode": { "FinalFields": { "Account": "rnYFf4DWQj3Eip1R5mVvocQxtcBcvTvRo7", "Balance": "1227634848", "Flags": 0, "OwnerCount": 174, "Sequence": 66696550 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C70A32F04E4FD9C4470693E1D7F97D30575A8F17FE6F04DCDD30DBE10B8FA540", "PreviousFields": { "Balance": "683634848", "OwnerCount": 175 }, "PreviousTxnID": "20448399746789B24952425A467618096281748C439D4F787B576BA549721655", "PreviousTxnLgrSeq": 69059337 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "b", "IndexPrevious": "9", "Owner": "rHa9ikQjRRPKoFgcqN3dwTb27vvL1Ezo6D", "RootIndex": "8F56785A06DB367335F88FF617BA5F08B87056EA85A600BBDD30350BCA3A390E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C73EA4C88A7CD42E3A313D83A2BAC67F6FD39AB7C67C8C8FE2CC0A6C91B5898E" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rpJZ3qkUBb3m68p3YrzJE7onMcswN4XDY8", "RootIndex": "6FA9D99EC09B4FD3F0F04A429B48B3EAF214D34ED59D5912C7EC9FB1E2F4760F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C7472F10060C84DC91A23D3076B066E1BC97AB1F35402DBFEF7C162717BE58C5" } }, { "ModifiedNode": { "FinalFields": { "Account": "rDwdy5963o51eDFKzgJ23VJUy44AX3QrS6", "Balance": "319163345", "Flags": 0, "OwnerCount": 75, "Sequence": 66614450 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C76BEA6F89B341BD4D7DAF574589AEF808C1BC13A245C5054BF05E1E27884ECD", "PreviousFields": { "Balance": "266997213", "OwnerCount": 76 }, "PreviousTxnID": "E3493A8897EB95F7F501B52C8354D342D2DBCAC908AF36EDBB98A3CFF7B93132", "PreviousTxnLgrSeq": 69042648 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "a", "Owner": "rfJmPRPCTwt45woergVCBhkHWjxVBevfan", "RootIndex": "2F4DBC6422F0834B916C245AD82063F5074636B254CA1E00EEAFD1EEC76FB5FD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C76CE4C80687FF800AF143CA8B1B688C58EE88F08238A6657D048E19D6203F41" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rw4jQ2pSNGhFQDoQyNpP6FJ1nArCWCZjKM", "RootIndex": "355D67B27A28FBB67B6FEA3014C59A84FAB917D19F6EDDEBA1476AE6E8BB871D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C79515013E225B904F485178F21F25008CA21FBCDE44B725F754D8C960EEDC7F" } }, { "DeletedNode": { "FinalFields": { "Account": "rDzBkddc4AVrm4RWuXJRhH1rrkDpKNFwTg", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD498D0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "6A73722C05DB65E94BC278CF674ECC96F084A563189F73DD7D365FB6C0D49A01", "PreviousTxnLgrSeq": 69042096, "Sequence": 67765527, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C7BADA5915D2B77ED3A47F376C6EAFB33416CE7E86474006583B955874185BF8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1500000000000000e-4" }, "TakerPays": "3000000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGBMsWXEYwQCyqK6QsrivTQsACXbfL1735", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "B0AED90B0582F9831ABA7079B1087946EB0A728398CA064ECB77B0332CD7DCDB", "PreviousTxnLgrSeq": 69055562, "Sequence": 67792810, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C7F205156FDEE9F0F977BEAA23A0A0E3FB30C403C30E813E43F211AD0B876D27", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8000000000" }, "TakerPays": "80000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "9", "IndexPrevious": "7", "Owner": "rN8rfe7hU4CCkmEiDkj9fg8pgBp5fa8p2j", "RootIndex": "29319BA089997650595D4CC417AA8C13A285061CF448C6EAC54550D3B3AF010B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C808929C73397F9A92EDFE37F83198FC591D06FD1121BEAE53EA70B00458B325" } }, { "DeletedNode": { "FinalFields": { "Account": "rDAsQhHKNqg4ueKpzLPYbR7bzmjDve6dVF", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BB60F00A3F64B", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "43EF834490199BCBA467CE0DD8AA0FD560BF69926A4C6B678AAE237C8DB079A0", "PreviousTxnLgrSeq": 68898350, "Sequence": 67963994, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C82F27EFF0C24B0EB6F9B6FF159B7BCF5B73BE6D03D5FDB896D636E72212922C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6209396600" }, "TakerPays": "48433293" } } }, { "DeletedNode": { "FinalFields": { "Account": "ra5BMHvXy7Y97xhxSLKZWCDPpbqc9fvWdq", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531722CFB7AA4C44", "BookNode": "0", "Flags": 131072, "OwnerNode": "13", "PreviousTxnID": "A152DE7CF1C8DB136A1FE16CCFAAC5E5D234BFCBFDA0B73FF116D1E3E652C19B", "PreviousTxnLgrSeq": 68899009, "Sequence": 66693300, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C83AF0E0B3D9CB6776052ED072E153FC62DC73D5744B26BBA2941B463858508C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "507039232" } } }, { "DeletedNode": { "FinalFields": { "Account": "rDfGPHrMgjFmWvA3TRkx5rcD85Y9sNizB2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26D99583B", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "C2F0C0BA591C6B620DCE1E703C640AFD2246C1C1697561EB778E3713D0888F60", "PreviousTxnLgrSeq": 68913274, "Sequence": 67704667, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C8555F94BE1E04A437ED6FD37552575532BE962D8F125E396AB60CF6F326D778", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9404401334" }, "TakerPays": "94044013" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "r36sopaDwMDWZS4XNkCM27TNVkdywisWY4", "RootIndex": "C87DC2EF0221FE52370B0097A66AA258805E2CB1F64250BF4B66E722AC9B3656" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C87DC2EF0221FE52370B0097A66AA258805E2CB1F64250BF4B66E722AC9B3656" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "1ed", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rhw4L75RKqQwheqkwPMM7sQYti6hmLWUni", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C88D437CA163B8375D0B3945DF36EA6CFB33E287E1C75F4847A5C4C63EEFFBAC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "AAF67E3035224E5D0F1DC745CA4E0974C99CDB8B78D33336BF674F6282DD20ED", "PreviousTxnLgrSeq": 67950183 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "48726337904.94435" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e0d", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rno35bcvBqLMETwksdhSiUuDQquXyoBtem", "value": "9999999999999990e-1" }, "LowNode": "5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C8938DA1A85F655BDC44CDB906A6670893B3FAF76B3ED9B2998A1AAAF0431C56", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "95726337904.94435" } }, "PreviousTxnID": "CAADBA21BD9F870233B289C581BE7474219F3813C87FEA14D2E3AB274CA7221E", "PreviousTxnLgrSeq": 69049149 } }, { "DeletedNode": { "FinalFields": { "Account": "r98DGNQEGR9x2bhRVBbuiHAqxq2aDD6pKa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E7C76F9083900", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "9E5CC2D92E998CC4CA2A9D0AA4D4936A63B1F54A4C401B46823248E7E542B2C3", "PreviousTxnLgrSeq": 68997636, "Sequence": 67202778, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C8C0B061C0C7E888174DE45DC3F17E2485994FC9F180D4069CDBF0D463F126C7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2100000000000000e-4" }, "TakerPays": "856275021" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c0f", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnZj4CQouegP4s5Hu2LxBbjCfGSWQuzRAp", "value": "9999999997999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C91E7DC14EAE48B9D300761E64D863BF8757F4B60319411E9A20676D33AD29E2", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1290000000000000e-4" } }, "PreviousTxnID": "A456A697F7C160189DE6EE7A02669EF2ED2E30E2448D608FC1D066BFB005DC9B", "PreviousTxnLgrSeq": 68944682 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rLCKThc3nyrBN63QzPHKoHHPA2iN8RH9gp", "RootIndex": "8AA09E294E4F2F8DE804A857AC98496D6CBD57C43D479840C056D5DC3BE5DDCD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C953E01CAE8191EDEB9EE29C6DD5A89430FF5107EFD7D79ECB8E4CCBC093C7E7" } }, { "DeletedNode": { "FinalFields": { "Account": "r3PYAn9d1DTFzJ9kuvFnhudgwsVZ6pm5hT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520C6697980B4C60", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "7F98E16EAD79E0FDEAAFC6C36BC73108E23AB0B986B4C042565AFDC8E62AF5EE", "PreviousTxnLgrSeq": 69014371, "Sequence": 67442335, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C96272E75E25A61C1F37B1D1D37B3247CEB0FF4AD61CF2D6B49F6AE9ACF5EBD8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4000000000000000e-4" }, "TakerPays": "1396200399" } } }, { "DeletedNode": { "FinalFields": { "Account": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F42479CCF8C22", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "7C64AAA010E1CBB24C477465D1E18D7083897440E351123CBCAEF5DED32745B6", "PreviousTxnLgrSeq": 68985152, "Sequence": 68499493, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "52894159590.99591" }, "TakerPays": "227180415" }, "LedgerEntryType": "Offer", "LedgerIndex": "C9830F4BD364954DF67671E75EC5AFC33EE59E8A230C3E74644A5093133E2109" } }, { "DeletedNode": { "FinalFields": { "Account": "rPG9SrHPEhwbExniY48qKCqDqjGKyVn38w", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652132F4579C98000", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "868DEF74EEE34B36BD8B99F316F804967E83EDC7718050A88E56822F8475FEA1", "PreviousTxnLgrSeq": 68927491, "Sequence": 67109490, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C98CBE28BD0284A3D29D9E268DE346D8A401BF911AE8793026AD46E1D390F566", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "54000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rHkAKrt7sjtM7vfLuUmVeJ98jp42mstkTU", "Balance": "111259980", "Flags": 0, "OwnerCount": 19, "Sequence": 67553404 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C993A23E31E8EC1A217B4E8411539277762AEC976F2808D06DBD75781B368B92", "PreviousFields": { "Balance": "56758051", "OwnerCount": 20 }, "PreviousTxnID": "08D0FB5144D2BEF2CDE6F1E74763B861DA17CF3C99C8C55DBB07AF581066CB7F", "PreviousTxnLgrSeq": 69056885 } }, { "DeletedNode": { "FinalFields": { "Account": "rfJmPRPCTwt45woergVCBhkHWjxVBevfan", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C3E7B9A8661B9", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "F4DC491902EED8C076F1FBED9689ED73C89E06DFB2C9C241EC10CA72AD5F63C4", "PreviousTxnLgrSeq": 69023921, "Sequence": 66581210, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3057270714.014688" }, "TakerPays": "24305302" }, "LedgerEntryType": "Offer", "LedgerIndex": "C99F6DAC532825B9A962BFC06856743A3CC3799988E0023FEC3C024A6B1274F9" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rEcDGbmwatAptdvR3tfMRJqfm6taVzHAYP", "RootIndex": "C9B4DFFBEF2E2E6CA3D5A382E6C5EEBC9D530B18A077D6574557FF5C26AAC073" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C9B4DFFBEF2E2E6CA3D5A382E6C5EEBC9D530B18A077D6574557FF5C26AAC073" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPKNCAkooJFM3LJ17zG3wJyxrjnNuHkkYh", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "40a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "C9B83D5F71E017252D2CA52330D6E2EFDBDEC7917DB3CCFCB89763D4946B1B30", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10785989866" } }, "PreviousTxnID": "BD96B7E9E56E7977862A72F035D087DD3ED252FB88CEBD9C95B888D4684938D4", "PreviousTxnLgrSeq": 68016259 } }, { "DeletedNode": { "FinalFields": { "Account": "rUXKKLv8kzkXLnNpe2aGq2PyRKuotFQEPi", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72F0A4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "15", "PreviousTxnID": "4DC69C80F6E76153F73E6FE6E25C688DFB822EACAF4C319B7C35BA3788AAA270", "PreviousTxnLgrSeq": 68899479, "Sequence": 67508115, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C9B89BFEF67B69BAED93738F159DED9133B86DB192BBEE5F62D7F54FB2B1DA24", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "65000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rqben5VgPyij1hAY4bi4yPyp3vf6GgY3z", "RootIndex": "3D984CFC6F978C84DEB973573CFCB5C7D5779BCD4BF65FD287E9E20D65DD50D0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "C9D16BCCCF84F74C0BACF8016F51796A48CC51948749684FA4EFFE0AE2A3C0F8" } }, { "DeletedNode": { "FinalFields": { "Account": "rGzfdR9pNTEgc3qiShH9q3zp7KpVXgVUq8", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A4D88DDD6BA09", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "97FE6E520473447D0DABD446F445E5214896753CDB3CD1F20856556862E64395", "PreviousTxnLgrSeq": 69014749, "Sequence": 68014233, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "C9D86EDE3575864F4BBE23DEB20F6A579EF3EAA55B34F62149E706EA9198A701", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6133123803798006e-4" }, "TakerPays": "1778605903" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rpUjTJzaJN22XoKjav3YSk3GH9t3GZqK8N", "Balance": "110033128", "Flags": 0, "OwnerCount": 9, "Sequence": 67522652 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C9DF7041A41F438E7EE97AFAE4D962411A6E615597F1FD8154C346724005E8DE", "PreviousFields": { "Balance": "32173229", "OwnerCount": 10 }, "PreviousTxnID": "3DB970221F69568C00C0D1D43D715542BF2C0A412F0BD8D04C8DD1106259D423", "PreviousTxnLgrSeq": 69002860 } }, { "ModifiedNode": { "FinalFields": { "Account": "r4F6d9gkY5JPEkDEmUwcLgGX2NSV6o7DyR", "Balance": "746236413", "Flags": 0, "OwnerCount": 205, "Sequence": 67033242 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CA55F655BEC8F29A747A4E88BF6DF2C0DFF2AA714FF3AF853324DA7CBD118C76", "PreviousFields": { "Balance": "567912931", "OwnerCount": 207 }, "PreviousTxnID": "51CBBA2C4153202DBA3C7E88AD28BAD50C6AD68E332CD9683661E98AF695B7F5", "PreviousTxnLgrSeq": 69064157 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6003542045095089e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "555", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUdhzvzWjHpSjP6CGksiit3bdgGLV5DXZv", "value": "9000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CAB1F1967D65E6842D130B313E2427EBFD85F4342AE33F859D40A90B6634A98D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6453542045095089e-4" } }, "PreviousTxnID": "26BBE139F9AECE7C6D97238FBC1AA9B38709302475276CD1A150B41FE985713F", "PreviousTxnLgrSeq": 68882778 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r4YqG4eX9uskEYbdZVejyRmkBgM9pSo8q5", "value": "1000000000000000e-4" }, "HighNode": "6", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "620" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CAC079F53D0540262DED7FFA18868FE28B4A3303D3DD5D0939585C6193F5F9B2", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1150000000000000e-4" } }, "PreviousTxnID": "D3CC007FE0851B1A403A994DE1EC50DFC8CA29A7BCDD3C8BA9BFF006D7220547", "PreviousTxnLgrSeq": 68967614 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rB7bqYSsffBTNfLgyyyXyWL2e1bg2djJq2", "RootIndex": "94950F18E099DC547192CAE58BA974E504D0FE8ADAB4B1365736D317E4A67C1A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CAD0C76876CA5C7978AAFC0D6464E96978D0CD679C9F38ADA5D17631336CF33C" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-86.71358" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJjrokNPSa5xiAbh8N8cqmhVc4ma95FBpt", "value": "9999610698104580e-1" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "efd" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CAE788DC1DEBD6AC7A3A4A01E9C33254151F72E19977E4A0BA084B7489C5A6FF", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-12037057886.71358" } }, "PreviousTxnID": "04D53FC7571AB9B44C770FEC37900FA8371E580757B76C1469BD6E4D9A7E1271", "PreviousTxnLgrSeq": 68954165 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rwNMX6iAFTsFK2PG8PCNG4AJ5b8UyrSx8p", "RootIndex": "9D109A2F971E2300104AB0976A60A0D1CF4BC4175C647FA9050197B1DCB569C4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CB006B747B0BB7D0CB707F1FB7FDEF5050D2C1274CE3C3F56C8B3A250E0F4FB0" } }, { "DeletedNode": { "FinalFields": { "Account": "rNaQPWNXMaNzEWKoidMaJqNskRUFKbKWM2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36532386F26F37ABC0", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "47BE8F1DDDF9FE1C2B365306DD3B4881DC4A6B3FE06C8EB57E3B17BBF0416F5A", "PreviousTxnLgrSeq": 68785849, "Sequence": 67342450, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "CB2D2BDB12F5D947111D0E69D9BBBFBB50FE63C77830681BA17F033EEFA65625", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1111111111" }, "TakerPays": "111111111" } } }, { "DeletedNode": { "FinalFields": { "Account": "rE9hwGp3avccRZY3PerkKL1cJ25z9X22QZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26D0E8E1A", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "6759046F33C2283E762F428DB509860A4B75796C1E40A8E6526932F979828E08", "PreviousTxnLgrSeq": 68906700, "Sequence": 67489273, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "CB360E20A4A30A5259B69D19CD7F3220532F0381A1C68E97FA057066FFB8FDB6", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7071979732" }, "TakerPays": "70719797" } } }, { "DeletedNode": { "FinalFields": { "Account": "rQJFPnXAsdHvbAL8JeEYNu5FQDW4mHL5MK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531A95BE1F80789C", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "6942187070915CA2528309656D60D1D31284B4B9CB3C00B27B7030BAE68B7683", "PreviousTxnLgrSeq": 68139641, "Sequence": 68012561, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "CB37471A8829D425CEA59F0E764C247D2CA72C497AE69E426436BC9BC5B4DB5E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8976620852354655e-4" }, "TakerPays": "67171992791" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rnSxpc5YM8agfwsEHN3F3EKN9WQ8yyTcAf", "Balance": "1556488159", "Flags": 0, "OwnerCount": 21, "Sequence": 67372683 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CB6E45708264F17197A621EF14472659B7D46FC296141A861096CA150C87405C", "PreviousFields": { "Balance": "56488156", "OwnerCount": 22 }, "PreviousTxnID": "44D301AF05A3646A52D76A37C73BF6BDABB0F56F247AF4AF59EF956D21BB844B", "PreviousTxnLgrSeq": 69010534 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHWCQnGF4sc9MqnA8GpZC9L8SZmzv5zkMp", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "397" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CB7341F2C0E1E31482A43C5288757CA21F794E45775190B216ED2510135D6C97", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "F567A6AB46DA99B1DEA1B144F15866D92E2C3E260C2CEC5FF03C46041FE67D84", "PreviousTxnLgrSeq": 67952818 } }, { "ModifiedNode": { "FinalFields": { "Account": "rK3ctAQ3dxZmdQZ7JJt2PZBU7GZPwAkK1P", "Balance": "466153793", "Flags": 0, "OwnerCount": 125, "Sequence": 67101579 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CBE651E15673C3714EB3ADE5BB7C4E2171D2E42423EED574158592F8523F9C63", "PreviousFields": { "Balance": "361821529", "OwnerCount": 126 }, "PreviousTxnID": "E994798488A9094802332384AF8C8D2CCD5DD82AF7EB62DB2B7391E2FB8486B7", "PreviousTxnLgrSeq": 69062175 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "b9b", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpUjTJzaJN22XoKjav3YSk3GH9t3GZqK8N", "value": "9999999997999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CC6739A573CE9BA0FAE0896B5647F076A5C3359B3494232E72F00B25FADA0558", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "8CAE0F664C0A9E3BCD2B22A86CDC88D6CCEF68F4B0C239E78A679F31B07EF5EA", "PreviousTxnLgrSeq": 67989835 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGR9AifcxWmhBqTR2JWAPooQsR9kW5yzj6", "Balance": "119128288", "Flags": 0, "OwnerCount": 17, "Sequence": 67761127 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CC9C30F0FE68F3D7492FC40065E7D277EFFA489FE314D75451459DE2B91F8254", "PreviousFields": { "Balance": "62290562", "OwnerCount": 18 }, "PreviousTxnID": "6107FABD5B10791089166742C40654CF4C0148676665A2EDC637F52EDA1DE88A", "PreviousTxnLgrSeq": 69044032 } }, { "DeletedNode": { "FinalFields": { "Account": "rsqgHRLHgg1vHi8iA1w1J9amuuUAjwEzwa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211F0F2BF24816A", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "501DD5A8B8DA7752D6B3F99DFA040C2AECAA6DCF72F90DDE36B24728C659B1B6", "PreviousTxnLgrSeq": 68997685, "Sequence": 67757361, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "CCA52DB79109BE9E20A3AEEF1D8B244B5F07F914B63A243C3B78494E031EBB3E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "47796284510.95766" }, "TakerPays": "241371236" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rUV7WQGpjkPJNuAuggRRFLYVoaegHzuxoy", "Balance": "251597228", "Flags": 0, "OwnerCount": 74, "Sequence": 66502085 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CCB1ACCBF2B1F4139081999FF7E8F5A38E954A3F10F28F74F4C04398B8F2FF26", "PreviousFields": { "OwnerCount": 75 }, "PreviousTxnID": "9429FBC054F517951CA9ACC6E848B3D96694A55E04C43FB30757AAC4FCD66979", "PreviousTxnLgrSeq": 69054080 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "97790989866.0001" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "722", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBVRpQjDpGqLs588dtthtZhrPJCcM4w3TS", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CCD89C48B1756CA9820B801F9776B3FDBFC7640FB3EFC1AAC694737BF942088F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1977909898660001e-4" } }, "PreviousTxnID": "34EEC2B5C7963F9EFA5DBA466DF7CF40A6F9C8601DCD9673ADBE2E91B30AD40D", "PreviousTxnLgrSeq": 69034828 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rh8TcfXzDZdQBB8R9aQfE2zUUwpd1zbEWv", "RootIndex": "CCF7CAAEDA563E2EE8E5601ED1B2C468B33A0A4B363717CFD75F642D019EAF3C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CCF7CAAEDA563E2EE8E5601ED1B2C468B33A0A4B363717CFD75F642D019EAF3C" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-26.4578" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGT6ze5CuPEUzsk92YnLLkEqjv6qqhabrF", "value": "1000000000" }, "HighNode": "15e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e47" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CD247640805102BF596E37ACABDF17E21A8DB0C77B7306EAE05474ACFD366E77", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1669675636272625e-4" } }, "PreviousTxnID": "7E0B9225093C20C42C87EEA711E8F540C9369FECAF150DC935E05E9834BB2E24", "PreviousTxnLgrSeq": 69060910 } }, { "ModifiedNode": { "FinalFields": { "Account": "rw4jQ2pSNGhFQDoQyNpP6FJ1nArCWCZjKM", "Balance": "242910408", "Flags": 0, "OwnerCount": 35, "Sequence": 67525552 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CD323F542E272061FE9C8485C636C48B3D4DA036FECE2E043DA250AA3FD45100", "PreviousFields": { "Balance": "92130408", "OwnerCount": 36 }, "PreviousTxnID": "756B9BC0B305899AA9685B911DF84C3EE10746A336FB54910F08FBD7155C90E9", "PreviousTxnLgrSeq": 69045060 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rNLPZmai318pizfUNmkebSrtsR5mFvVVWt", "RootIndex": "5780FB0F3FE8B0C7F5FF3142720439CE6F3716974498691002F935E07AA57FA2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CD45016AF0662894CCF1DDDC43B4436EB7C3525F3393DEC8A853AEC958CD96AB" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rEjghQohwSDxD7d3NbTdrzRLGRRsGf7qwN", "RootIndex": "D9582BEF294ED1F3D9197CFCA66E68A2BF45C66399BFC6D96A6D348F3062C625" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CD840984BA1E1E6D763FF7911C888B508FD247AE0ED3B23362851EA95A05497F" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "b", "IndexPrevious": "9", "Owner": "rDHvd9BAsKFcmRyCA3Y6iYEMi7n3xzR5Uu", "RootIndex": "A7A2869683F03624291831F9BF8299457F946C0C7A6371F84AEFA4278FB94030" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CDCB79B029361CDCF24752D3439BDD17CC584F8033CA9E23CA7D708062C34BF2" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPfw6T9Nu154bW5Yqyd351rebEphbe3Fhm", "value": "9999688558266531e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e35" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CDFB9D7D8786612D6596DEFAA29D507C75FA688D728ECB4C409F7201D1492C89", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1052737689222326e-3" } }, "PreviousTxnID": "CEAE8D00E18896E3D2CC38713D38F6C704070FD599FAD8AE515BFFBAECD5D330", "PreviousTxnLgrSeq": 69018503 } }, { "DeletedNode": { "FinalFields": { "Account": "rEEmAELYEW2kQQRJEXhN9qJnzZmUnLxhJd", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937A69A7C", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "2B7F2F410DC7BEB1E95D69ECE1B0E7CAEC63FDD49ABDE37FE0E611AB745D57B9", "PreviousTxnLgrSeq": 68976739, "Sequence": 68870167, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "CE2D31250916C8035ADD8E18952B384242614FD0AC845C7AC0374EAD25DE7FDF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "618459800.4693254" }, "TakerPays": "3092299" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGPEKNaNPYojt4sFbUzodh9SUNxixCwoBC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C3793747E980", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "A79A92D4F774991ADE2C351BBB7EB959D4E00D0BCC4C774707369AB17D11858E", "PreviousTxnLgrSeq": 68899318, "Sequence": 67759695, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "CE43C7DAE796830B2C66A1A1444DFB1E66F87B6B9C481174F09B36F89BB96BAF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "499999999" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rNWUPV44ECUZNuemMektfAsccCmYRnZXK5", "RootIndex": "CE4F3D0673201BE77C103FDE4FDA75403DA0E7996E4ED53B4A9E03944485927F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CE4F3D0673201BE77C103FDE4FDA75403DA0E7996E4ED53B4A9E03944485927F" } }, { "ModifiedNode": { "FinalFields": { "Account": "r7ouMSA1S6pggGmsYRZewYQzCP7XgLiEx", "Balance": "373413782", "Flags": 0, "OwnerCount": 156, "Sequence": 67327086 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CE73BC1CC673CD5C1DEA1666BFDB03E32A81EBB9B3299419D0243FEB0B373FFD", "PreviousFields": { "Balance": "337663782", "OwnerCount": 157 }, "PreviousTxnID": "A7CA5A26782F12A9B6787B35CF91C606082AB99B16FEB23CEF9FC1DD9D295936", "PreviousTxnLgrSeq": 69063545 } }, { "ModifiedNode": { "FinalFields": { "Account": "rwxKxP668nq2w99VM8SpeaXBwUVkcpcV3m", "Balance": "164075161", "Flags": 0, "OwnerCount": 76, "Sequence": 67089747 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CF3753B58AD978CFBD0B666944A6C73674E9D88F2C98B663B450CBC842F54111", "PreviousFields": { "OwnerCount": 77 }, "PreviousTxnID": "7420C598E713B025134EAB65B9260C01CE41C4E74688145BBBBD82D409E59BAA", "PreviousTxnLgrSeq": 69054535 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "8", "IndexPrevious": "6", "Owner": "rNqG1shTsAyEcTFcAeBxGsLpmaNAGbcESv", "RootIndex": "A5A6B3A52D385A5C88A3DE7AF2B54FCE07675FEB2A441BF7394D1A23E7F4A41F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "CF425167E6DB153313C5EE0C84BC14734420E3E80FCE91A162729B714CFFA8DF" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMQF7GUuJQHvrEkXkcySkEvb4fbsGoqGqC", "value": "1000000000000000e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e95" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CF7D3708010A6A2622E7CECA3BD98BE8071E275ADFA872A5B110B0FEDD7996E4", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-11363116299.24879" } }, "PreviousTxnID": "58985D120D0E0AEC734DFDF6156065C3E097C41585CE6B37F7F17C04342B755B", "PreviousTxnLgrSeq": 69009799 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "50000000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "22", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfFmXF3uT3Qc76CAH2cVExQXN6t7KFERu6", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CF899941F2858BD766E7E5D79D43C98596F7152859AD48A5016EE552F69442AC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "85000000000" } }, "PreviousTxnID": "35881D8C79F1149C09F4A24D9E996A6E179A515C99083F4C195790815BD46086", "PreviousTxnLgrSeq": 68898844 } }, { "DeletedNode": { "FinalFields": { "Account": "rw2K4HQDujtogHECEi9ubWzeVVHr2bBN16", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653071AFD494E4986", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "36C162A5A383C24C1F7802DE2E31041519587F4401583CCB927E9C362292C278", "PreviousTxnLgrSeq": 68014673, "Sequence": 67133094, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "CF931A4F79EFF99005A6B14730F85AE74D8F07E0932E71D8D2740B44A5A6C092", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "155719797" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGBdiULuYdTBGGX2JWzmjRXscUacAHsm3i", "value": "1000000000000000e-1" }, "HighNode": "7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ef1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CF9AF5FAE47FA273B93F7CBE38E20F542F40854C7AB0746022E28904C7BD3002", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-9673050892.636902" } }, "PreviousTxnID": "458F5AC844803A4769404B8C3E7898BDE24E7EF8C8348B914C3AF9A3111D6691", "PreviousTxnLgrSeq": 68913678 } }, { "ModifiedNode": { "FinalFields": { "Account": "rEr5Zbwd9Lurx4VHEvWWZFQb3owfVABck7", "Balance": "229738969", "Flags": 0, "OwnerCount": 85, "Sequence": 67171899 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D006721649D1DA6DBE0514083C7B53A9AD52045423C59F1FCB3CE83B71574DAC", "PreviousFields": { "OwnerCount": 86 }, "PreviousTxnID": "3311ED835E884373D14892CB60ABDBC6082AB11F08F4E870621A3C4DA2AF864D", "PreviousTxnLgrSeq": 69064069 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "7d3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBCw1uH84iKcSRVjY8ALzx66Q9ZVNMgYsn", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D033D47C02906A6EFB6040BA572AE4011D8CF6426EFF3DB4E85BADDA6DBCC8D8", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10899881300.38661" } }, "PreviousTxnID": "7BF06CF58BF1CAC23343F204F6C4BDCD2FC3A41011B15D4349979406F5AC6DDE", "PreviousTxnLgrSeq": 68898991 } }, { "ModifiedNode": { "FinalFields": { "Account": "rnu8qs15n6d9Xj21aBXxjdgyWz5cqNXqkf", "Balance": "2321801418", "Flags": 0, "OwnerCount": 65, "Sequence": 65843935 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D05A408889E3B6549BA06CAEA7415978C4FC6FBA376E284A3B611A2729E25A6F", "PreviousFields": { "Balance": "2281801418", "OwnerCount": 66 }, "PreviousTxnID": "7C3718CE7B06AEC2263B2816AC06A27525A347F1A729918B82C3E6B7516DB140", "PreviousTxnLgrSeq": 69060233 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rET8MUZc1VEcHkQqQWeRmvbWZcrtHy24iB", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "674" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D079840DF7F7BF703F5AD78DFEBC5D35FDA4429739568F11A611DE7BBF737068", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "0DA75B26906D95158968BF8C8C7B806E2AFC7CABDD5EF65826297912FF9EBEE7", "PreviousTxnLgrSeq": 67997700 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-61899805292.0632" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJFmgWo13y1o6C42H1LC7qDWcu7Z38QaAd", "value": "1000000000000000e-4" }, "HighNode": "3", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "95b" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D0932E763D688F72EE4FEE8212AD7C0D2F7279A4C9464797662B66099E48999A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1018998052920632e-4" } }, "PreviousTxnID": "FD6F2334FCD1BC9F3E4585C047777D8FD583B0C149C4F04887247CCD111090EA", "PreviousTxnLgrSeq": 68608964 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "16", "IndexPrevious": "14", "Owner": "raDJvZX8gbRfZ3hUWimZPdVcDRzsZQdhmr", "RootIndex": "2758016F666FB17E482B50140E033BD14C888C9BEC5F42A65A10265F73BF0EBE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D0997989931C799ABAFF978FFB87A4F29F8CBC8BE5E360880FBB99725B833B64" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e1e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r87fNs5eU59kPhMXgYHVziF6Q5icW4WHW", "value": "9999688558266535e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D0B35FF4136A79F9B5FA8BD254ACD782A4CDA294AC5EE550F36AAA8A8CE2AE8F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "87056888288.88889" } }, "PreviousTxnID": "4188F759144079497EB2EBC5075C543AB3B6CF3E275407F7C79321665BE0671F", "PreviousTxnLgrSeq": 68948273 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c1b", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raQmxvieBXeCfDzRKXdekiw7qucsszMReU", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D0E7511C396A982E5DFFA7E35B400A2467D8B3DB96A6E768BDF843D4BC753F65", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "30000000000" } }, "PreviousTxnID": "68F7874FCE1959F4ABDCF29B686AAAAA0D04E5332F0EA0C24B2C6D11923CF431", "PreviousTxnLgrSeq": 68781520 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "30000000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "9ab", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raKfcCtqnoopzuWrRWY88p5hbTBmF7RzTj", "value": "9999999999999994e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D0F86709E0963FE9A11695F553AEEE94EE1CAA119BBDFABF986D0A5E418DE8AC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "40000000000" } }, "PreviousTxnID": "B408ADF887CF0963FB20B492F40032DB56BEED8FB5D4A0F433A4FC49FE4E3F0F", "PreviousTxnLgrSeq": 68988572 } }, { "ModifiedNode": { "FinalFields": { "Account": "rhoYhs7WCmQKMPR22kQ5DhXw3pXQsjUsmi", "Balance": "139282956", "Flags": 0, "OwnerCount": 62, "Sequence": 66912789 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D100E95209093B62569C79946E83D44680D82D233048DE92E24DAE58EB8E6B8D", "PreviousFields": { "OwnerCount": 63 }, "PreviousTxnID": "CCC18A81902E4B15A9F7B6E346ADE503C6DFDDFDBDBDA18C7CE6BA30AE62E240", "PreviousTxnLgrSeq": 69063547 } }, { "DeletedNode": { "FinalFields": { "Account": "rGR9AifcxWmhBqTR2JWAPooQsR9kW5yzj6", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219EF4FB2B186E3", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "44F714A13131C4F2C05226E60EB13D1E7B169C11B2E4AB81FEDF63E654B75224", "PreviousTxnLgrSeq": 68899319, "Sequence": 67761116, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D12BC6517B5A9E3CB07452C3E4E68CBDC913A89788FC1402036A4318B190EE68", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "56837726" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "722", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rB7sr2UvCBewPJXg9My4kjDFWDF9URdRuJ", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D13E11273E9FBDFC30FFDD31AD18E9775D4D4FEEBD6FD2F68D863F0F97D2B78D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "513620AE72A42B0EFB2A5773876E9EDCEED1C941BC6B89F45A93C26B31F743C0", "PreviousTxnLgrSeq": 67996541 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rfFmXF3uT3Qc76CAH2cVExQXN6t7KFERu6", "RootIndex": "9F8E203987726F03EE5723FBB065F0389EBC89700944ADF33E5561F7DEBAB24D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D14245B3C0E426B04A97BCF2B9B8482436939AD48A29A8580FDE2BDE5A590E09" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rPG9SrHPEhwbExniY48qKCqDqjGKyVn38w", "RootIndex": "8A5B90E725262E19E3ECC448D1F18BFB28143392D05B5B62D395D8E0E6CAED25" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D1486C38A7F2447E6C985289D50177B3A1717BA707E34E2B5C2E360F848BF524" } }, { "DeletedNode": { "FinalFields": { "Account": "rGQaGNPT8u7Wt1RoqJEhBgAPyc9ek5RfCL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA931A0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "F14E7940BEB0C16ECD7A6A99822EF7EA02C0A445C9C813F221DAA96A3ABE5B73", "PreviousTxnLgrSeq": 68998723, "Sequence": 65975079, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D14FABA94C0056F23730FD9C75681D75DEE1B0DE26F8D4961E89693DABDCCEC0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "40000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rDSSG7NwYYV545mfcRdVExpAU6ys9CqoCk", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA50921E1", "BookNode": "0", "Expiration": 724069451, "Flags": 131072, "OwnerNode": "12", "PreviousTxnID": "86F5BE961303FB4C09013B0608D7ACAB8FAD07E19574CB81460972C1AF0D659C", "PreviousTxnLgrSeq": 68266103, "Sequence": 63854595, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D15546DA4616AC1ECB01996AA3BECF2EEB57C3C93795515F7D121C801098B488", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "77859899" } } }, { "DeletedNode": { "FinalFields": { "Account": "rHSPavv1zYMxcqPUHEeQqwMSQgSzadAjM4", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "f", "PreviousTxnID": "B694B38173AD7693FC003208B1444290F88CBFA88D897C47F550A9ECD314C6A8", "PreviousTxnLgrSeq": 68899046, "Sequence": 66504538, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D15FBEB5A965296377FF411C1422833D5F5F5B4BC922DDFD6F7877473833591D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "8001600000" }, "TakerPays": "80016000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r98DGNQEGR9x2bhRVBbuiHAqxq2aDD6pKa", "Balance": "11697244003", "Flags": 0, "OwnerCount": 28, "Sequence": 67202853 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D166D99CCD9A16D34132592237EBD171D29AAC714CA1E55ADDF16C14B8EDF479", "PreviousFields": { "Balance": "2492777146", "OwnerCount": 34 }, "PreviousTxnID": "ABA43842E02F6C815C0FABEC0F2550B5FC423A062F1761D3D2C6C6E881C8349A", "PreviousTxnLgrSeq": 69054684 } }, { "ModifiedNode": { "FinalFields": { "Account": "rKjRbDnEwfSRjozGgD1M2dBU54xVtv57aQ", "Balance": "705034662", "Flags": 0, "OwnerCount": 62, "Sequence": 63167865 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D185A70349D09FF40866058E0360A5DCCAB6A67BBF8EDF070E7C1892FEE10AF1", "PreviousFields": { "Balance": "405034662", "OwnerCount": 63 }, "PreviousTxnID": "E0AA24B1FDF5CEB7B0857F2952E12AA97CCC931915DF3EC5073A0F6849967934", "PreviousTxnLgrSeq": 69062326 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "21f", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBhRwsAuVFJ3VY37rd5R9YzqrCRjVXQggX", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D19C96B7231C7CB0A02DBC9DB803DF34CE630D6CF8F595F6C32C1DC069E66906", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5000000000" } }, "PreviousTxnID": "812306C620D96A902013A3B71AF4A64E55572E4FC63CF3940AACFC5B17316850", "PreviousTxnLgrSeq": 68898788 } }, { "DeletedNode": { "FinalFields": { "Account": "rKHBZ7opA2ryRMocKk5wEW85wXpUNGNV4Z", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D252161AB4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "C6BD8C0E26F87969983661D755499CA1EF21F928158F8C85F50F5F26830DBEE2", "PreviousTxnLgrSeq": 69007411, "Sequence": 67431692, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1900000000000000e-4" }, "TakerPays": "703000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "D1D1EFC8CC99C5D018548165F80A180F32B807D9F1377E320A9AC7806D025578" } }, { "DeletedNode": { "FinalFields": { "Account": "rGKv1gHL1ANheQZ4GMCikKaGYoKJC6o6wG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521B5B1BF4C53FFE", "BookNode": "0", "Flags": 0, "OwnerNode": "21", "PreviousTxnID": "DFA4D80D1520E90E178AA6EE4609DB623962E1A02B202761D31C87F07F1B9653", "PreviousTxnLgrSeq": 69001448, "Sequence": 66128536, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12681332857.14286" }, "TakerPays": "97646263" }, "LedgerEntryType": "Offer", "LedgerIndex": "D1DAA1C9E44AAF492DCB69A0DAA48C6E719F6776462BA4A6318C647ECC63CEF2" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-11004498571.54081" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rK1QTLhkJgn7zvG8ZcGJea3XzWfj45xhRE", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e48" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D2317ECAD57A1FF076CC687FE0C444CCB541717D2262E7773683C16543B8A4AA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-21004498571.54081" } }, "PreviousTxnID": "2947C1C85F084B8F7E1151CDB06526B8B294125BE5508DC666387F1E113B65C4", "PreviousTxnLgrSeq": 69040374 } }, { "DeletedNode": { "FinalFields": { "Account": "r98DGNQEGR9x2bhRVBbuiHAqxq2aDD6pKa", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E77EAD1966568", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "83CAD6D7A9551AFBE7896111B31BF7CA46CD063959FB7C6D00898DFA3F38A8A9", "PreviousTxnLgrSeq": 68997627, "Sequence": 67202777, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D26B350E1D2AE9860AA15E93AD6369F4AE882E82B46ACB12197EF7E38CB73C63", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1350000000000000e-4" }, "TakerPays": "549787513" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rNPZ49ucC4zKoBPgyAsSC7oMSSoh1icnZK", "Balance": "804191947", "Flags": 0, "OwnerCount": 129, "Sequence": 67158863 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D2746AF08EEE8FACFDC6CBDA04341ED0D149364568EE070907B61A62FBDDF259", "PreviousFields": { "Balance": "293107100", "OwnerCount": 131 }, "PreviousTxnID": "8FF793C623F0BAB3ED178A4B05B14964F840E4E8D64DCF28396DC02E9543D046", "PreviousTxnLgrSeq": 69058044 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "806", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfnaFsTkxCWYtenT3MxsFxjjrX4F7itNzd", "value": "9999999999999998e-1" }, "LowNode": "4" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D2768D5FB1F3D0F09815B6FCAE7CD53E284B003C867F0BE7BD08E53F2C796FB9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "D2DBD99F7AD33CF4DC00A97385092B59AC6D512479EE8F2263A8017E6A738E46", "PreviousTxnLgrSeq": 67993345 } }, { "ModifiedNode": { "FinalFields": { "Account": "raUCqTN33sgqfhC1KVtqhCVX6iHkHAbUzp", "Balance": "2427442866", "Flags": 0, "OwnerCount": 474, "Sequence": 66813342 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D29D1FB347450063F2EDAA240EE5257299EF189115BDEDBBF9277E0DC0D82395", "PreviousFields": { "Balance": "1302442866", "OwnerCount": 475 }, "PreviousTxnID": "561F997165794767DFAF77E7BD0B37BD583358E02F3293512C339B112A15201F", "PreviousTxnLgrSeq": 69064132 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-13000000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNtB5pUvufMkzs55wL88pVuh3xt7LVW2mR", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "704" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D2A332AF4649069AAD5BD0FE254E144A82F0AF99DDCE6444E965355ADA42CCC2", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-33000000000" } }, "PreviousTxnID": "F8643A8CF4717DF4F2E8940EBD1F7382475163645FE34F2019B4A152FF8C779F", "PreviousTxnLgrSeq": 68950640 } }, { "DeletedNode": { "FinalFields": { "Account": "rN9HGJaVB4wFwWcj5tTqzkWtHjxxCZiHA7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "BookNode": "0", "Flags": 131072, "OwnerNode": "e", "PreviousTxnID": "080A3A7C67F474EB08B0FE5299AA60BBBD6C4C558384A0B224CA233E5E5EA4AF", "PreviousTxnLgrSeq": 68899623, "Sequence": 67322279, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D2ACD663E3AC92BFD6D5CFFB7E5D12DFB96798795703C2A238DDEAA7B3ADEC22", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "50000000000" }, "TakerPays": "400000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1761678744468903e-3" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKbNu1SDc3i5dWHdp3uLxWVn2tsA4ovDJR", "value": "9000000000000000e-3" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "dfd" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D2C6B46DF4FA1FFA1D4D75204B15FB73D4CBB64D225593701DA46E95556792FA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2290293262024048e-3" } }, "PreviousTxnID": "E38A79F8A844A4F1B2CC9F531556F6824B3D8FD7885D8AC189C03309AA02D515", "PreviousTxnLgrSeq": 68996360 } }, { "DeletedNode": { "FinalFields": { "Account": "rQKYm7pcdeXMPEgGTRUAAuoziWwhhW3DC2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CADF102B", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "20E2ED91AA85F62EC68A773DB361606FDC9E209C4293DC5C062CF99461E24E00", "PreviousTxnLgrSeq": 68162979, "Sequence": 67339933, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D2E298E9AAA921840B45437DB33FC621CF55AC386223C1291E9EAD460277E5DC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "38929949330" }, "TakerPays": "3503695439" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "43000000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a79", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rw4jQ2pSNGhFQDoQyNpP6FJ1nArCWCZjKM", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D2FE7AB8412541B707082E292D088A85BF5DA4F8A8C857C2B6EF9A298A63078E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "85000000000" } }, "PreviousTxnID": "4CC219CFE4E4E6E29E152A45B270B9DFF5BAB8D4FF056EB200FF58AD34779CC1", "PreviousTxnLgrSeq": 68995313 } }, { "DeletedNode": { "FinalFields": { "Account": "rQDZDYodywYJULXJtv68QyoDbkV5EZgh9s", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26FB49887", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "DE5F4AFC1C7787CF06260F79CB385A2DB6B25E176DEC0A93F59710D4F0D9397E", "PreviousTxnLgrSeq": 68163156, "Sequence": 67423791, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "23283611196.2436" }, "TakerPays": "232836112" }, "LedgerEntryType": "Offer", "LedgerIndex": "D3107639A9D008C6453D7278A38C696B4DDD2E35EE36164136ED4CD77C1E2C34", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1120551700091092e-4" }, "TakerPays": "1120551700" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r3uzGoy1vgEEdULUkLBRJXaYfww3nzYP27", "Balance": "498555194", "Flags": 0, "OwnerCount": 77, "Sequence": 66616846 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D32547FE7D6919AE985D68326F87307B9F3B9DD513DF33C9F6D252AF46330B91", "PreviousFields": { "Balance": "429267671", "OwnerCount": 78 }, "PreviousTxnID": "918EE7331045270D1FF392BB884907A5B012ECF7A9B6D4FEBD83B9CBBE2BE92A", "PreviousTxnLgrSeq": 69042918 } }, { "DeletedNode": { "FinalFields": { "Account": "rpq6ooRTok73Udp4D58zesfDJeYM1t5s8C", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522276193CB22408", "BookNode": "0", "Flags": 131072, "OwnerNode": "f", "PreviousTxnID": "7F765B8F0FB70684AF05704EC1AD81A23620963BD5EC2B2249593BE767522B81", "PreviousTxnLgrSeq": 68893038, "Sequence": 66716888, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D341A2B7D35896ADB344FC2C25AFE301078C3EE9A77F9018A9C12FE077E70412", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "31143959469" }, "TakerPays": "302096406" } } }, { "DeletedNode": { "FinalFields": { "Account": "rD3MRnTt6tvvtt7o7F5p8B49toAUWnoLmu", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652232BFF5F46C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "8D185EEDF7519871980CB6AE0DFC681A4D330D9528CFC709A7C269AE567E7DA1", "PreviousTxnLgrSeq": 68876550, "Sequence": 61713954, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D35D9FFD7C27DC3286561ED773EF6EA3E0A72621AE3D3BC019BE4E971373A4AA", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "14000000000" }, "TakerPays": "138600000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rEoF1AJrncEkjDkmoQNYxvCp49Wyn6RFvc", "Balance": "884231247", "Flags": 0, "OwnerCount": 171, "Sequence": 67287695 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3921BDD0FFE6EBF36F27B35C6DCD281EA234618232113A8752EEC175A3F3095", "PreviousFields": { "Balance": "574231247", "OwnerCount": 172 }, "PreviousTxnID": "552F0D7EE12A75884A571FECA324F12F77646D2F5C926B42C617769C91A021AC", "PreviousTxnLgrSeq": 69061394 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUN6cc1UZw3jJRFAQpzYZdwA75aKR6qJE1", "Balance": "276845282", "Flags": 0, "OwnerCount": 71, "Sequence": 66466115 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D3B9FA8F9665D02B459867474BA180D004019D8C74B85FFD4151746DA5B0AD78", "PreviousFields": { "Balance": "195870988", "OwnerCount": 73 }, "PreviousTxnID": "0DA984FAF4974D602682BFD3E5F8A2A81851F35150281354B02A55CA8E777CC8", "PreviousTxnLgrSeq": 68967465 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rDDmwBnxoXcq7PLUXTvsfVHhEqGpNCS138", "RootIndex": "DB5498426E8160A18D6F1F4BCC69058548EFAF20D0CF7BB48D69A8C21EF0115B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D3E8907571DDBAE308F037E5D31B011C469B2C84B22B0322916D0AE2B4C01357" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "r3ccw1UCPwayXhAVmy6oC4yQTSPeG71bx", "RootIndex": "56BBDD035A3685687FD39FB2F05FFFDB09919CB0EAE1A67A28748AFD85FCE148" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D4375054334AE11B1E8F83CE90EFDF6FABF30AB8A7E14C488B46136F7774F9E5" } }, { "ModifiedNode": { "FinalFields": { "Account": "rB7bqYSsffBTNfLgyyyXyWL2e1bg2djJq2", "Balance": "301699133", "Flags": 0, "OwnerCount": 100, "Sequence": 67458605 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D47508EE7A99BB540CFB08BB22C71623F00A6CB0586AD676E861C5A52A510B3A", "PreviousFields": { "Balance": "247197204", "OwnerCount": 101 }, "PreviousTxnID": "BFD4EF60BE755443B027B5C60A7ED333CFCAA47E86A81E66F0812814B345AB1A", "PreviousTxnLgrSeq": 69049420 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rLaYDDZDLBvzSGxKhxDEKovMrQ3CoDXQV", "RootIndex": "C2F900A554A61DF453F79DB8EE957D0971AB45CE74745521C10035D46846C1BB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D47DC00A59F044DEC9CDFAA69486AADC49CD754B045CCF5B0ABBA6DC3E5BAE60" } }, { "ModifiedNode": { "FinalFields": { "Account": "rUsSyZqiqCSZoqNqjd6PqcEQ3BBaXyS7wF", "Balance": "497961260", "Flags": 0, "OwnerCount": 52, "Sequence": 68183534 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D48410E94DF86569A3CC266C6B9FF2C62AD1789025BE1B38EA8154D8D33BEB1B", "PreviousFields": { "Balance": "182624533", "OwnerCount": 53 }, "PreviousTxnID": "3D63F9035C67515E690E07AD7D415221191B1DBB2B9D13E3BD8317F760CAA58B", "PreviousTxnLgrSeq": 69054556 } }, { "DeletedNode": { "FinalFields": { "Account": "rwEP45SodNayAXhoEQeJmXaky391SxGRZz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207AC823076A9D4", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "7FE8A61BE268FCA5D4562B2A26953818673CC846724B4A7A9A7924FAF7AF4D40", "PreviousTxnLgrSeq": 69054519, "Sequence": 67338129, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "64954469571.23688" }, "TakerPays": "140301654" }, "LedgerEntryType": "Offer", "LedgerIndex": "D489E6BDC142A46E0E17A1C77D1FED3CCEA2A06F91648E1F411E8808B5E47B5D" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "edd", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "ra76UpbMwxu2GePpQeV7dogXZUxvn8upup", "value": "9999610698104599e-1" }, "LowNode": "b" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D4CC10292E9AEBDCA0CFA06818B9ED3DB3FEDF815C0E9B06283E615D9413F27A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4000000000" } }, "PreviousTxnID": "CAFF29DAD2E270525F7F3027A0D1AA259D010F5CDC4425D13463A135003CFF32", "PreviousTxnLgrSeq": 68968517 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDTDTzVK47KCcGmiywZHhKsDP7323fqGGL", "RootIndex": "D4CCC5BDD14A627E1777A5BA176A4C51CA125F9960967B2BB5BF34ED990A81EB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D4CCC5BDD14A627E1777A5BA176A4C51CA125F9960967B2BB5BF34ED990A81EB" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rEay1pxUyiL4ru86hJLv4bKCzwm8EL4Mzw", "RootIndex": "CFFEEF616109CA39B4A595E7CF7A8F51ED7782820790F6D9155BE7D7F4514DBA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D4D7BC31DAABD0969118C1DE7381DA394EC795227FEFAB20E5FADC8A2056F61C" } }, { "DeletedNode": { "FinalFields": { "Account": "r3yLxRMK4K5z8UzzYC9tQASyFZ7p6EQDwz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "6C3414A6890F08C10ACCED00940B86B643C744FBA160AEE1B1FA0E46911A27F5", "PreviousTxnLgrSeq": 69009898, "Sequence": 68723095, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D4DBD7313BF02ADF55178A12F88B2FC60FF4528A5D6569DB13AAB3F369AD64DB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2200000000000000e-4" }, "TakerPays": "1760000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rC4M78e2ktZz8QwB5SUSEeeeSi5rcnxrJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE7680DABCCF", "BookNode": "0", "Flags": 131072, "OwnerNode": "f", "PreviousTxnID": "05282A41851EACD505B7BA4BDE0E593B8A2BE0E6AAFE30A280F7EC12BA727C44", "PreviousTxnLgrSeq": 68993559, "Sequence": 66527151, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D4E12CB8732DA67CFF3661A0BA7B1CF2912FAD85D3C25F28BFF381766CDC7453", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "27244028037.43417" }, "TakerPays": "190708196" } } }, { "DeletedNode": { "FinalFields": { "Account": "r3mZ69KGMSXXfdFe2xxeNvSkA98mQQ52aF", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520774AA6359E0F7", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "D188111495523252DBD78E47C192348B206D1FB727E0A4EEB3DF34A291AC9EA0", "PreviousTxnLgrSeq": 69062976, "Sequence": 67138992, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D4F34817EF94A251FA21179461A580450F24E289337E874273A22E6C67B4096D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2017617257175439e-4" }, "TakerPays": "423417157" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJRfgew5k5b2Qgj5r9gn2L6w66hE5vwYnH", "value": "9999688558266543e-1" }, "HighNode": "7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e0a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D50B6BFC4F6358D007E91503CF64BAEC3C6DAA3D6CF7444D2C7649C550F4B88B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5000000000" } }, "PreviousTxnID": "A2E8F7DA2A37DD0747CEE82BD8A5C1E118067FABC383C94C5FDA5C7154F58ECC", "PreviousTxnLgrSeq": 68963672 } }, { "DeletedNode": { "FinalFields": { "Account": "rabF4KeYghT7RWidbkeS75fLWQzrDixwpH", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F0D876FE4F21F", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "C7DCD6CF47787E7C14D4D80D67786538B80237E0B22217E1DB70A21FA013CB6A", "PreviousTxnLgrSeq": 69004265, "Sequence": 68100909, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D55E6213FC3E3B62839C88E20F05085543D3C7918B28CBA48118956753ADBFF6", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "51954206753.96992" }, "TakerPays": "220129974" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r9Bq12mZUmUByGGcnu8tvj2KYAcJQ4zbTL", "RootIndex": "D56482477DDA92454D6BAAD29619A6E72B2513FF6C39A159CF919E7D41036298" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D56482477DDA92454D6BAAD29619A6E72B2513FF6C39A159CF919E7D41036298" } }, { "ModifiedNode": { "FinalFields": { "Account": "rK1QTLhkJgn7zvG8ZcGJea3XzWfj45xhRE", "Balance": "237854332", "Flags": 0, "OwnerCount": 35, "Sequence": 68264092 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D564F74C3D2C67EE3A46C73E899307AAC8F4B17035CEAB80684B56FB13789BDA", "PreviousFields": { "Balance": "137854332", "OwnerCount": 36 }, "PreviousTxnID": "8D1CFAD43C50C1081595098A789860ADC4400D5C17C6366AB40D27B13E08E142", "PreviousTxnLgrSeq": 69061163 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ec4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3PWgfzUbXKYDoLD6p49JqiabjfQCj14AZ", "value": "9999610698104595e-1" }, "LowNode": "16" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D57F2C5B6AC38844FA2E7D4029520B9B06F821D2D9DE9AF5685B94086045D5E8", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "21246268571.42857" } }, "PreviousTxnID": "27B69C8FFEF9205D09AC6F0061077D16F24CC001693F21E2E14E3BA14C5B1611", "PreviousTxnLgrSeq": 68991108 } }, { "DeletedNode": { "FinalFields": { "Account": "rpRu4PM7TpS2K481Ac6ESUDRf5QmAfc6M2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C5C7F072A4973", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "5CB5E8CB1E53CB9A4D79893271D96AC547280A04C389698884CB90DE1B43748A", "PreviousTxnLgrSeq": 68933852, "Sequence": 67535477, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D587CD45740FC71EC896D1A886B4303AAA01261EBD82EEE7A34A057F5368D8DE", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "62636522495.38577" }, "TakerPays": "500027359" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a9e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpTLVf85qXWoPWNyeUXnTkc1isdAWLCYh6", "value": "9999999997999990e-1" }, "LowNode": "a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D5B204897C74F46C5BB1A846865AEBD8589992EAAAA34A251F643ED10E907A4A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "50690453760.81191" } }, "PreviousTxnID": "AA1FF585028526E600F71F5F83A38B7AA9AB45B29B11DEA26D6E7DDBEDAA45E1", "PreviousTxnLgrSeq": 69031479 } }, { "DeletedNode": { "FinalFields": { "Account": "rfFmXF3uT3Qc76CAH2cVExQXN6t7KFERu6", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "3D169B5E21CABACB8749A83BEFBEA768F5F9F54B3E68DFEB9E02FC4948D17536", "PreviousTxnLgrSeq": 68909117, "Sequence": 66750607, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D5F80137589E0A408923A0DE6BDA6AA006382640DD3869FEB1F260F917DD15E1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "35000000000" }, "TakerPays": "210000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rDfGPHrMgjFmWvA3TRkx5rcD85Y9sNizB2", "Balance": "326355217", "Flags": 0, "OwnerCount": 48, "Sequence": 67704735 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D679139311BA0AF406B8DF1FEE066092D7C1F36473BF29BCF638E027DC333B81", "PreviousFields": { "Balance": "152311204", "OwnerCount": 50 }, "PreviousTxnID": "CAE858D9338E4A3000D0B531B1C8465C157E8BB3E0BAB29DAA41A3C759579AFB", "PreviousTxnLgrSeq": 69062648 } }, { "ModifiedNode": { "FinalFields": { "Account": "rp9kJTnnfXrjwVFxGRWfjUbJdmxkGP4cif", "Balance": "2338423387", "Flags": 0, "OwnerCount": 71, "Sequence": 65950737 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D69C532329A751ADBE92922419BEC9C795C71089431893BDEA4F78E96E17322F", "PreviousFields": { "Balance": "1526312519", "OwnerCount": 73 }, "PreviousTxnID": "0AC7C45CC50134D086965A13E008A62B9CD7B9628A14F1DC908E6B09BD8C9374", "PreviousTxnLgrSeq": 69060124 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10000000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "8a1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsVD9Hdd3p4LMC7vUwvx75uNLY3d3eiE2b", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D69E67163274C88EE6CFD0C25394CC50DD23E5E88A88E4B79BA7CCEE1B0B728B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "20000000000" } }, "PreviousTxnID": "6DBAFA31DF04431A80D24DAB4B6CBEC785A8A2B187BABABFC356B618CD707A0F", "PreviousTxnLgrSeq": 68008736 } }, { "DeletedNode": { "FinalFields": { "Account": "rno35bcvBqLMETwksdhSiUuDQquXyoBtem", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E491404A45000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "42272CB514F19553DBB83BC813EB679130905652D57F9EF4FEC5275D28F77194", "PreviousTxnLgrSeq": 69010509, "Sequence": 66320168, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D6B05B3529298663070B01C2B117B2E6E3FFB69EC821027E709BC5ACAF8BF420", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "19000000000" }, "TakerPays": "76399000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rGUKHhcBwNpS8WUqpxNsFW6Yhy6ZwEuATq", "RootIndex": "D6F86D56C05B551AF23E94FC9D5103FD0C4626DDDE6A75A8219231CD7326A10F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D6F86D56C05B551AF23E94FC9D5103FD0C4626DDDE6A75A8219231CD7326A10F" } }, { "DeletedNode": { "FinalFields": { "Account": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530415EB3D7DE000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "9D5B1F8B67009DD6C9F5CD78FF19A3921FA4B41282A0EF512380711EC6FC4726", "PreviousTxnLgrSeq": 68888992, "Sequence": 67528316, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D717D3AFDB29704542023B017851D86B5935F1A4D29F34B12572DCB450E9BFEC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7800000000" }, "TakerPays": "89700000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rBMPrNjN4FCHpC3wWAdrorVra71nhSRkuK", "RootIndex": "5F32B3FAC2601679419448D5B22508C12EDA500D212EA4354D6F307E0612C1D0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D7376435C6724BD08F0D0FF61988B77DC2AE53242A837D185CD86376074CB957" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "r3BA8VZ9TV8U5qgd72SX4Ct2iAgQGwcfZ6", "RootIndex": "B215DB1350EC7729A029AE7D8D505F84D3C53084D618446FD444638C719E8457" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D7392B6A5768CA4CEEC9724B6F0AD472CC3CEF2FC8D1AFB7EE020E871B2A78D3" } }, { "ModifiedNode": { "FinalFields": { "Account": "rKMLJSbumUE4mnXET6X1DDFF6JsN8wE8x9", "Balance": "7527999970", "Flags": 0, "OwnerCount": 7, "Sequence": 67332299 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D7601F533F016DA9033B5D0064CCAE4CB6E17791080E9C861908A5F18FE1AE33", "PreviousFields": { "Balance": "27999970", "OwnerCount": 8 }, "PreviousTxnID": "3E22500DAA4875CF0434B312955B16EF2DAD131CCEE40348AB3E9CD554CB0278", "PreviousTxnLgrSeq": 69058173 } }, { "ModifiedNode": { "FinalFields": { "Account": "ra76UpbMwxu2GePpQeV7dogXZUxvn8upup", "Balance": "117042717", "Flags": 0, "OwnerCount": 32, "Sequence": 67417545 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D7A56D937B1693EFBBE0057AD2B8E744E02FED28605A10632B2521A4687E66B7", "PreviousFields": { "Balance": "77042717", "OwnerCount": 33 }, "PreviousTxnID": "749B8A9CBE31A2E6F9860CEE99CC6A98D68A167A61794BC15FD715C2E1E8D993", "PreviousTxnLgrSeq": 69044573 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDrVDF6etbhSYtnBoqxbRd4CyGHQ5YNR4z", "Balance": "484319092", "Flags": 0, "OwnerCount": 77, "Sequence": 67610498 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D80F96D3A9D131BD1F7C96B285E818523D145761FB02E762769F612C4178A08A", "PreviousFields": { "Balance": "409319092", "OwnerCount": 78 }, "PreviousTxnID": "85E0103CCB26C8E7C61023E21572C85A9E8AEA176750DD9EC6C29F0904F276FC", "PreviousTxnLgrSeq": 69042278 } }, { "DeletedNode": { "FinalFields": { "Account": "rLK9N8ay11j21CKs3ryC5kp7SYR5piJByc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF51F195426", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "D3494F2E2BCA42907CB05D4E018220D1367137B63A9A00368973F11D19AE151D", "PreviousTxnLgrSeq": 68887403, "Sequence": 67342132, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "D82F4F78C4B57C2147279D1168ED7C528376146EB76599A7EB8B52D0056B0AF3", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "62287918" } } }, { "DeletedNode": { "FinalFields": { "Account": "rsZ4iqWpnTmdfE4nDDEiaGAn8z97ZV4Zm2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521026111AE8A3FF", "BookNode": "0", "Expiration": 726991923, "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "DB8FD1D0B6691660AC10A938EBA7E1AEFDEE25781A38A5217262380196FE7502", "PreviousTxnLgrSeq": 69001636, "Sequence": 68647787, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "17694624518.96603" }, "TakerPays": "80430111" }, "LedgerEntryType": "Offer", "LedgerIndex": "D83909BA6A049C7614536372009DCECF30CA47F98C9D553249783FEA8714DBE2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "22000000050" }, "TakerPays": "100000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rKso7KmktCCYBfe79sNAFnfKffvansBBRz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAFA8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "B15047AFF0B83C3115DF065A7599DE6EA4779F062827754B7169C52D8C3116E6", "PreviousTxnLgrSeq": 68152239, "Sequence": 67328483, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "16000000000" }, "TakerPays": "144000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "D848AA21973212C7650925898BD0EC483DE94C079C7A5B2FA6D105AFCBA614DB" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rLzgqyEetWAoARj7XcpWExwpRCvYq5zHi6", "RootIndex": "C014BABE56CC7D50F3F6EDE6A4AD421B025A5575F5537DE2E40D07C3ED867BC2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D850D8C271B7D71A8C7967507B16C41C9750164D1433CB06425E9DBF02523858" } }, { "ModifiedNode": { "FinalFields": { "Account": "rwuaSP5dsGLmc6gNnv3bWEjmtkexmA4H3G", "Balance": "9771243922", "Flags": 0, "OwnerCount": 119, "Sequence": 67153814 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D85E4E503086E6AB42EB914D0A3A8FAC5518901FE65562DF08A78CABAC65BC3A", "PreviousFields": { "Balance": "1362374867", "OwnerCount": 120 }, "PreviousTxnID": "ABBA7F210211453EFC9BAC35A35A5650C277FD3A5F88CDC88EA31CB5F3510A0E", "PreviousTxnLgrSeq": 69040963 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "3", "Owner": "rwyhjUuEiNmgv4AG4ptie2eAWqN4kfraxv", "RootIndex": "83E554D5DB56D78E3EF9E0A9EE9AC072F330EE2C12CBE8A9A91A35EBCED7E2A3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D8771EDC8602179D9591D16181D5E039A6BA3E4EF1A8B350ABB0DCEECB000DA8" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "16918525174.51235" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ede", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfFFmdT4f2Qj6gSS7daVrQDpJw4tF62Ke2", "value": "9999610698104599e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D88AAFFEFFA9DD0F199A394DB23CD83BC1C75431A7F7E0642EB08289AE722C8A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "31918525174.51235" } }, "PreviousTxnID": "9D80CA0B235D902B1A997716C85793E5394EF1083E8AED57C0D684BCB584EB81", "PreviousTxnLgrSeq": 69002039 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "2", "Owner": "rGRyfRcJ7cSYSu6rw5VpNJReEZt9Gzy9a7", "RootIndex": "A84E96499A7672D22BBC809E15BE6C7AF5F5754462DBE246FCA564DE0499D669" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D8DCFD199B374C1930D74B52DC45918BC169AC36EEDFA479505CAA1742BE6F2B" } }, { "ModifiedNode": { "FinalFields": { "Account": "r4KVUoogBDoZS9NZAzs37JTgpCoCwbBsSk", "Balance": "176999376", "Flags": 0, "OwnerCount": 38, "Sequence": 67523041 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D8FF9A9BB757D00CAD9FD82481AEE752E6A0ADE47A66E65CF469E62592D511C5", "PreviousFields": { "Balance": "150706877", "OwnerCount": 39 }, "PreviousTxnID": "7E49304617A2BF5E92C3B0CEDD16B54B6FD9D53773FA9D263EE2070FFB1F0CD3", "PreviousTxnLgrSeq": 69061777 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "d", "Owner": "rnYFf4DWQj3Eip1R5mVvocQxtcBcvTvRo7", "RootIndex": "418A4755DC3A9AA54BFC1B2CFB262CD85E63CEF774F58DB05FAB8B62F138785F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D9035EA682AEBC44ACCBC27162654CDA6E9C9C2AA49DAFD58BEC99A68A57B6EE" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "30500000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "b03", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfBvZMQKX3gxybSQAt116zqUxXKu7a8BmY", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9117E3DF3BDDEBF6AC23A8593C6CDB0D11AF467EA104B56AA1EBDF862108568", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "52984865427.35906" } }, "PreviousTxnID": "C1CFE2BD8E01A493419EA51348130A8ABAD1A1DD56DA59FE20C387896BF3382E", "PreviousTxnLgrSeq": 69044440 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rQDGBD8WCV3szWgH9rvyhjPHPX66KPGVnd", "RootIndex": "0D153DF9DBBF66F333E86D8C71EB5817DC187F8FE208FCF7D578FB95A7C1AA9F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D931028C2E3BDA75596087832520087920B624BE242AFBD0072802F0100FD78D" } }, { "ModifiedNode": { "FinalFields": { "Account": "rGa2XHaY793GMxMeexFcabjrc4w5vyrmPJ", "Balance": "230627653", "Flags": 0, "OwnerCount": 60, "Sequence": 68329288 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D931F677042F76BD1CD5EA53B563C81998E4F6D83D00C174667C1F0F10B3CA64", "PreviousFields": { "OwnerCount": 61 }, "PreviousTxnID": "81C5A3FB63363AF823526F6C9352949B780BC90A9D2E0A469935A193C6DF4C49", "PreviousTxnLgrSeq": 69060229 } }, { "ModifiedNode": { "FinalFields": { "Account": "raf2m8Ki2PVqjTU3YsKK5R62dAhiYXepcz", "Balance": "588769330", "Flags": 0, "OwnerCount": 97, "Sequence": 66240376 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D95659214EFFDB23D8A7697521AA56F141ACFF5F4DB7AB9426A5D67AE905B6B0", "PreviousFields": { "Balance": "213769330", "OwnerCount": 98 }, "PreviousTxnID": "370141B3140CA46BA3DD95B2D4F94012D24AD833FF5F7FD058071A8E4179FF83", "PreviousTxnLgrSeq": 69063965 } }, { "DeletedNode": { "FinalFields": { "Account": "rBE6UN87gwvyAuud7dSn2d6zdBUWCjgqRG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530CB7FDB44B2703", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "2FE4B1D7B39DD4ADDD402BE880B24BC4C6D2BB6BA0BC342866FD8FD1120D3C8C", "PreviousTxnLgrSeq": 68798341, "Sequence": 67882060, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "21393102921.90061" }, "TakerPays": "765873084" }, "LedgerEntryType": "Offer", "LedgerIndex": "D9575ED57FC62291B1F1DB13B7C388969B3D7AB842D1628F7DBE3DB59FF4873C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "27951950000.30579" }, "TakerPays": "1000679810" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rsRPr4ZrFePB3e3SVXBMHpwLCfc97qZq7p", "RootIndex": "D9887139D4489D414A1F1C23BA8C5E1D0907CED117FAA9A18AF0F5C2509473A4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D9887139D4489D414A1F1C23BA8C5E1D0907CED117FAA9A18AF0F5C2509473A4" } }, { "ModifiedNode": { "FinalFields": { "Account": "rhhokxTQGXV3zHGWJqy1SiJ19yYTSFeGHU", "Balance": "921377273", "Flags": 0, "OwnerCount": 39, "Sequence": 67971524 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D995AD8C445BAE95E11AE46EF8EED5EB83A355E7E7D373C0DA8C0E673909B5C4", "PreviousFields": { "Balance": "116161752", "OwnerCount": 41 }, "PreviousTxnID": "C6F03DE78A51C5F8E805B954AAF63C860B878DF1776525FF8AA3FE3879F94574", "PreviousTxnLgrSeq": 69054603 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rhhokxTQGXV3zHGWJqy1SiJ19yYTSFeGHU", "RootIndex": "547559F67012C957E6A228A7386FBBE51085DC8AC65874F5E8A72AF2265C84EF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D9A8DFCB54458970457A4B4110D66F45166B1950337CFFFF2028D62DFD980035" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHjXAcTNUKjFvrozV8KizwezuEk9tnhqwF", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "c44" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9B41650FBE5193793FB428EADF3662C203F683A5522C0BF038D038A739A7608", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-93431878392" } }, "PreviousTxnID": "676555F24390D06C0D1CD2DDC53A3EA81C0A92CFA86761838530EA71E99A00D5", "PreviousTxnLgrSeq": 67993409 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "9e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBCS9nAyaFuM8LDym5gJGRxEqmmH9mRhxW", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "D9C305058EEDD77755CA1FF33A5EA7AF3507EB2B267051FB7C92F242C22192BE", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1160000000100000e-4" } }, "PreviousTxnID": "3689C71B44808467C1DEA8E11CE1C301EEC98BBD867A63DF18BDB4A97FC621C5", "PreviousTxnLgrSeq": 68479901 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "8", "IndexPrevious": "6", "Owner": "rfnaFsTkxCWYtenT3MxsFxjjrX4F7itNzd", "RootIndex": "AD76F0D28735B56964A06E2EFBFCFA189FF574B28441B57584A38ADFB255B36C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D9C8747116645827E63FFC91FFEB24598C3BA7983468EB620D62B7571469443E" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rfBvZMQKX3gxybSQAt116zqUxXKu7a8BmY", "RootIndex": "9C3DD226AC51C8C86EAEDD68D82521B499EEB42D63C2D3967D7D18EF8762AF42" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D9F4C4B1427B2E8D8E03AC7227D23C1769C5662DB783409F0236DF4E041262B0" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rfzxSb2zMhKDqCsD81pZt7Bjkvak4NBwFx", "RootIndex": "4FF70DBD786C45192D180C6A6BE109AA83482180250C6392FCE9DC183AAB1C93" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D9FC514428635022583A21F919769378AFB77AA269CBA8CD97BDB1DB4E875D49" } }, { "ModifiedNode": { "FinalFields": { "Account": "r4szgdizaCzaf1H9hBme8BYyQPhf2CbvXC", "Balance": "447156096", "Flags": 0, "OwnerCount": 167, "Sequence": 67374746 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D9FCC2279E0657D88448CC29586C8990B8D88B5F6A92B62AD6041F06D04E27B8", "PreviousFields": { "OwnerCount": 168 }, "PreviousTxnID": "E6ABB4E9719BAE6798412E129D66785349CF556021A9FD4B2E81894CE691FD94", "PreviousTxnLgrSeq": 69063864 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rELkNgURGeR4vEFUEYHNATaS9pwPk4KFEm", "RootIndex": "2A6288EBDA89E3F06C4381AA313EAE8D181B24AF317BEF98220D7E214689B910" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D9FF0F505420679D6FF7BF24E927B4E654C8DA2996C8DAF30161863CBA33B24E" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "97c", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rU7MhPtUbjCow4e3Hoqxv9PVQ7ebo3mLen", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DA2403337272BA8E8D9C2917A4B4AB659AB4601224754CDCFCDC8F60C56FD37C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "34FDD5EDB31ACC9E97FE77567823669B215622AE74CED583192A86AB78061C0B", "PreviousTxnLgrSeq": 67991839 } }, { "DeletedNode": { "FinalFields": { "Account": "rGPEKNaNPYojt4sFbUzodh9SUNxixCwoBC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72F0A4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "713A47BB313F05AA0BDCBCFEBB71C2ACA07BFF77908B8E74BE9F853680BFBC8A", "PreviousTxnLgrSeq": 68899733, "Sequence": 67759700, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DA29C0B2B8539CA72300D4F8AA47224540A639BB0CA7DC9991000EBB5EFC91ED", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20000000000" }, "TakerPays": "130000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "c1e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBCcUJicoai17VVsbUKJ7BGqDa7dQ3549N", "value": "9999999997999716e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DA5BEE34313731C9B50C9C9DEB8CA157FCE35F3472412592F5399EA1F966E473", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "34686189866" } }, "PreviousTxnID": "59656CD743F534862B89600BCC26EF1FBA0784B18B1656314970551E25C5593A", "PreviousTxnLgrSeq": 68967452 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rLV3c2Bymn4fq7kyrqysEd1ddizDxvwS1m", "RootIndex": "D33A50C61957D523AC0692C327FB725E92C9442A3C0783B6966FE4775FFD8FDD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DA6BE87B519F05B7839AD9327B5B17858943CC35B55A3892AE9BB6D5ED5A54C1" } }, { "ModifiedNode": { "FinalFields": { "Account": "rGBdiULuYdTBGGX2JWzmjRXscUacAHsm3i", "Balance": "541250501", "Flags": 0, "OwnerCount": 185, "Sequence": 67472015 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DAB263A445D59C899620DF963F8CAAA1E64E9FBC39A897F2F342521F1D9BF9F1", "PreviousFields": { "Balance": "468702620", "OwnerCount": 186 }, "PreviousTxnID": "4FB151234CE2DB87B589C1155065C5D6AD038E4FFF09F345A09D42D7A0693504", "PreviousTxnLgrSeq": 69055108 } }, { "ModifiedNode": { "FinalFields": { "Account": "r9guPT5E5ZDd4hPpLJC6UnXCGoRB8tZ2Jr", "Balance": "750370300", "Flags": 0, "OwnerCount": 183, "Sequence": 66262580 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DABE57732A558E33B07C78D82FBEF8FFC505F889B98D5CE2F8B07F23E79B33B7", "PreviousFields": { "Balance": "451694466", "OwnerCount": 184 }, "PreviousTxnID": "75B66EA52B65849D8D6AA69C02FC51286E4DB718DAD07CAE790D963631DFA1C4", "PreviousTxnLgrSeq": 69062826 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHkAKrt7sjtM7vfLuUmVeJ98jp42mstkTU", "RootIndex": "DB041AE19EA1F2CB71DD02AA4A55C51BCC0C0DFE186843F924CBF58D27DE4AC1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DB041AE19EA1F2CB71DD02AA4A55C51BCC0C0DFE186843F924CBF58D27DE4AC1" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "8", "Owner": "rD5TVx1akARpWNKumsadd69Wask2L69v7E", "RootIndex": "9D60DE0B7E5634BB6478CE270B2A1DCD9697E715AEEAE2FE790D28958B771C06" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DB0FBEF519E4A1E1B9B05155BBB7770442A0C81516BB115D529995BD95ECD16E" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rEqtQj662PMqja6Cb3pyK5V6xi2RGbcFxD", "RootIndex": "268F6EA48A0DB75EA0EC76970EB4AE1DA30C34BE8723A509E1EF28522812FF30" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DB2BEB5A7A21D0C3222F0A6FC52EA1DB6E73C0C2D9B1AC1197F926C992EC4D45" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e9d", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3PYAn9d1DTFzJ9kuvFnhudgwsVZ6pm5hT", "value": "9999610698224571e-1" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DB354DA8A8D3FB83C5DAA3CABDA2F28A3DCBAA0D54250605558848086A6AC9C1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1370092458610283e-3" } }, "PreviousTxnID": "2A7C22F1828F3B0D0B460032011033F17BC1A38A103F5F1E893C87652F060852", "PreviousTxnLgrSeq": 69035653 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-59836781628.249" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMX68jd5whLXjPmrgvjHYKwZHcbQ3HiYuV", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "670" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DB3ADF75620C031FFBA4AABD00FE9411EB77FF5AB79E1C02F654FCEC0AA740FE", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1149367816282490e-4" } }, "PreviousTxnID": "87C99AD51179943B14EC08C6339D1DE85DE494564DA9EDA5A11D8A17143CD956", "PreviousTxnLgrSeq": 69003884 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "15575802303.73057" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "d54", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBzk3TdhfdbidCHeKWfmQ5dy9AuAtGbXeY", "value": "9999999999999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DB412140129609E602627A2CD3EF46B4A088CF5EFB94CAFE82CE8EC341160E2D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "32329313567.72859" } }, "PreviousTxnID": "0889E88F8756CE2CFBE7EE477DF45C14E96DC26E51AA55B31E03FF023A912A6B", "PreviousTxnLgrSeq": 68998813 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "7e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rp6kmTUHj7Q6CeSZDrqNLRbtvhdbb6N5gY", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DBA0C3718EBA9A02C9AB179A1DF095450EDA7B9A3A4F0B028A5E0EE3378BCFA3", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "6239E55D06801771880245FBE80FD18B98C185CAC489BB3231BA1D6C6D7AFF28", "PreviousTxnLgrSeq": 67948391 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "RootIndex": "DBA91302EE48ABBCED5A0C5432D339EB92E1CA72AEC970A8D1C4BCACB1357DE4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DBA91302EE48ABBCED5A0C5432D339EB92E1CA72AEC970A8D1C4BCACB1357DE4" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rP7b2urRNSZ6dfigtcEaChxF14R3kK8djd", "RootIndex": "B12325434CF43805290AD5A0D2F314D21BE2EED106352DE89ABE3D9B3EE7DD17" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DBC29A348E599BE3FEAE64BDBC06683456F8AB8CBABD39CAAAB8D96AC92F5DD1" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "41", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwmZ1gXEQzFAzzEmYyGjHDhmccg5SGj7WS", "value": "1000000000000000" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DBF5345B90072C80325004D39FA076410F93670F32F0B55B40D5EDCC26538FEA", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "8570105384.5" } }, "PreviousTxnID": "ACE91315EFAB5221D4B3AD6897CDDCA99F9AEDE7B90584C8A64F8C2D137377DB", "PreviousTxnLgrSeq": 68944464 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLkhJhEaChEegzryMAeps63ghhG1yXzifL", "Balance": "10626198189", "Flags": 0, "OwnerCount": 6, "Sequence": 67426008 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DC01710A12D9E59AC076589B10AD3F40D943D6E6463986D949727A309D637327", "PreviousFields": { "Balance": "4129896255", "OwnerCount": 8 }, "PreviousTxnID": "BAE24BF37064E2D87E987C5D9DD1B161F08DF6DA23D1D6ED59E91DDA8C2CC3B1", "PreviousTxnLgrSeq": 69047074 } }, { "ModifiedNode": { "FinalFields": { "Account": "rEm8Pg6dKSuFWvEJK2Fnv8EvmkSTuNFJew", "Balance": "126700403", "Flags": 0, "OwnerCount": 25, "Sequence": 67761579 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DC693E5D2797D00800ECBE4BB409C4AF94B9611BD2CD122733674391B7F69686", "PreviousFields": { "Balance": "66047542", "OwnerCount": 26 }, "PreviousTxnID": "1932180EDDD1669CBFFB0E69703E55F5BADBCCF2F8FDF54831A3E623E63EB6F2", "PreviousTxnLgrSeq": 69043983 } }, { "ModifiedNode": { "FinalFields": { "Account": "rPfw6T9Nu154bW5Yqyd351rebEphbe3Fhm", "Balance": "3972572292", "Flags": 0, "OwnerCount": 9, "Sequence": 67371482 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DC8F6FB901B363C7F6E27F50ED598E9B20933EC77E23F4EDE1000E3BCCBBE861", "PreviousFields": { "Balance": "77442842", "OwnerCount": 10 }, "PreviousTxnID": "CCD8D6CE4CFB9F3BA7B454BBAC75594ECF79A31BDA20AA2900E9808611FFCA05", "PreviousTxnLgrSeq": 69061239 } }, { "DeletedNode": { "FinalFields": { "Account": "rpTLVf85qXWoPWNyeUXnTkc1isdAWLCYh6", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEDFE7B42", "BookNode": "0", "Flags": 131072, "OwnerNode": "12", "PreviousTxnID": "CD986945135D97A8D512C31CC3CE5D22CD812B7D786F99092446347732A778AE", "PreviousTxnLgrSeq": 69039647, "Sequence": 66958499, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DCCB8934E89AF640FA92E829CEC813D2D4E66361A773D2FD55E2AA7349617D57", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "50690453760.81191" }, "TakerPays": "152071361" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0.00089" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "75c", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpRu4PM7TpS2K481Ac6ESUDRf5QmAfc6M2", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DCDA8703EB3BB76BC0370427A3DC34B34EF741966A58AEFFE05B85D4B21CE4E9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "62636522495.38666" } }, "PreviousTxnID": "65FC4E5C83B77C13056BC6AF748FD5CF55329089AA977B831F1FBBD1ACB8FDC1", "PreviousTxnLgrSeq": 68671077 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUyceekfg9mU133ecSKptNTpj4nYnFMi58", "Balance": "533757697", "Flags": 0, "OwnerCount": 196, "Sequence": 67405033 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DCED78533FF2186BB06B2B6B32AD07B31B468AA2C4EE795DC5F1FDEA45A210E2", "PreviousFields": { "Balance": "508757698", "OwnerCount": 197 }, "PreviousTxnID": "8533F65F955286582C3CA0B99DE9B181EB4DDDC076BBA19CEA0619C5C8FDFBF4", "PreviousTxnLgrSeq": 69064003 } }, { "DeletedNode": { "FinalFields": { "Account": "r4oX1kuULiPWPRA2hwV1R7K8kB9gUxqTtv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526054994", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "5B1D7AB8761178D4C1EA186FCE1DE2815F0ECCA3870EDC388464C229CECF7731", "PreviousTxnLgrSeq": 68924507, "Sequence": 64612992, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DD1E865EF22C6B0385254953FF0A7E64F9BCD67C3992EDEF31A1943DEB0A5FF9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "63189677024.18076" }, "TakerPays": "505517416" } } }, { "DeletedNode": { "FinalFields": { "Account": "rHHviosMrm1hi4Nfm7MTipMw2oeEQRTeod", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E08810AB6BA60", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "6E0C3354A279764646F674FF4924C92B8FDA9E7E04F1520D6E5E33D87011382A", "PreviousTxnLgrSeq": 69005497, "Sequence": 65851910, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DD3D9B0FD681DF5383CD27ACA566A6DCCF278C4C3F6D3AB3EDC72AE2496934B6", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4000000000000000e-4" }, "TakerPays": "1579999999" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rLC5cTyVFPDTN4nuTcM9F2MAzhbkS7a78Q", "Balance": "120829007", "Flags": 0, "OwnerCount": 24, "Sequence": 67761564 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DD73091817C7C5B3B5A93D1A81EB9710A01447CDE230C26B7A02CAE33B791B85", "PreviousFields": { "Balance": "60176146", "OwnerCount": 25 }, "PreviousTxnID": "A3974C34DE6838ED67D661859B7C4AB045F5BF733AFF5FCD1FDB7BAFB8DB8696", "PreviousTxnLgrSeq": 69043953 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rf7hbrdWs2saBvmLubvuzHJuDhDwJf2Fuf", "RootIndex": "F4EE25DE003B423FA80F05E7BAB2DB928DC5BFC17DEA7FE9615655975A32D167" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DD9788D3CAA096862DAEFA05CD944958F87564615BE89DEA425BCD21DAF7DB70" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-80000000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPBCCKXYaB9eBeVKenvGeGKywHUVHFQmSS", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "5f9" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DDA9CEA893A4BB5F2F1DFB90F6A14BB84D0271DA01DD0C8571B89EE1432DF387", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-90000000000" } }, "PreviousTxnID": "CE207A497A10FCD735EA5C45C4C9B93C4DBD95A51FDE62FE89EC561B471B1DC1", "PreviousTxnLgrSeq": 68898909 } }, { "DeletedNode": { "FinalFields": { "Account": "rB7sr2UvCBewPJXg9My4kjDFWDF9URdRuJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217BF8EE56570FF", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "70557FF322026052EF9A7CA8695860B8521ACA2F630ADA55A9A687ADB0A713FD", "PreviousTxnLgrSeq": 68899773, "Sequence": 67712956, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DDC4C57D70997FE08DF919551CAB6DDE5A39776A32D6ED67859A43CE7D7D0009", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "52045799" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rwFqpfxexbDa1fUuG87ceDdbe1JnugjWUV", "Balance": "700021280", "Flags": 0, "OwnerCount": 188, "Sequence": 66775824 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DDEC08F945472ED48FB22091FF0503E2AE6B03A21263B2C512999881A028A6AB", "PreviousFields": { "Balance": "388581686", "OwnerCount": 189 }, "PreviousTxnID": "7341F3B38E38012EB952A61A7170D6812CBB03662835FC929A66B5EC7877E407", "PreviousTxnLgrSeq": 69061642 } }, { "DeletedNode": { "FinalFields": { "Account": "rJmWpXLdftZbNdPMYkezgKmEya6R6cAt7T", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E57D4000", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "0151E33F72D7FF0DBAA3FC35D28D4C2FBD0DD114684B738B851682E155B2D92E", "PreviousTxnLgrSeq": 68997843, "Sequence": 66801940, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DDFC884E806AB25252A480060E78F4DF8C49AD1390EA445AD95D7BA873861E5A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "22500000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r9bsFjjrcnmfwEe83kG4LNhBUAcL3af2Bf", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652185609E7B1F881", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "EE5328FBDA3DAF0DABD9746F345A20D0FC98263C50C2A36E4AA60DEA8B2CFF08", "PreviousTxnLgrSeq": 68901627, "Sequence": 67373381, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "14814768066.07065" }, "TakerPays": "101481161" }, "LedgerEntryType": "Offer", "LedgerIndex": "DE720C14A5139844938BC20AB05F40418D6ABFB0C1BC1E50B86D3228200EF9B9" } }, { "DeletedNode": { "FinalFields": { "Account": "rUNU8n4sX1Wo1ksPNPQheA5s6nZCe88iPW", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653044364C3223E89", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "A298E9263785938037A3FA4208A9DB0720BB6BE34CF69EFFB32D3097F774A1C3", "PreviousTxnLgrSeq": 68887595, "Sequence": 67719854, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DE8B336EDAC05DE0C6756C48FCF01FBF9C1F2DA762FF23BA2E351044102669A4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1557197973.2" }, "TakerPays": "18686375" } } }, { "DeletedNode": { "FinalFields": { "Account": "rEay1pxUyiL4ru86hJLv4bKCzwm8EL4Mzw", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218DE76816D8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "3509EFF5A8CDB971F4A82CFF872FD50195AC35241C7A41E7E9B79E885DAC9321", "PreviousTxnLgrSeq": 68920604, "Sequence": 67325229, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DEA35D7E0EE11418BF67CFCF92B26120B370B7D3C86542E15D68501CC49C490D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "96835000000" }, "TakerPays": "677845000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rw4M6hoNYisxYmeppD3bkmf1TuTcQrdsit", "Balance": "334403081", "Flags": 0, "OwnerCount": 93, "Sequence": 66944038 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DEE249204D363AE09D5CA232EC265378443C8C434DB08C5DC3FE26F28970FC04", "PreviousFields": { "Balance": "249403081", "OwnerCount": 94 }, "PreviousTxnID": "BCE59C76B035090E32B1E69F246718767FEC51122E19D690949E3AD66A413C1A", "PreviousTxnLgrSeq": 69052130 } }, { "DeletedNode": { "FinalFields": { "Account": "rHjXAcTNUKjFvrozV8KizwezuEk9tnhqwF", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAF5ED5C", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "07EE253471004121E900776190938E3D07C0524F4491586539693E6AC9281678", "PreviousTxnLgrSeq": 68864051, "Sequence": 67016809, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DEE98ED9C34274E73AAE5901BF369831AC9C5D08D98FCB5F7D8CA57B38C726E7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "93431878392" }, "TakerPays": "8408869055" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "f08", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfqL99qLpPmC72SjLCaytr5g27EUH35RyB", "value": "100000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DEFEB3C770FB683A5BA4E802DE678E765F4684C95B68D45428C360115A2C2CFE", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1372702310.084407" } }, "PreviousTxnID": "1AFC25FE8D6FA718C0D127B0EE3287CD68323546D214B00762E952515BED8D99", "PreviousTxnLgrSeq": 69030107 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rUkBkCrKSXyNbUcj7hNC684Z2TrzouvZBr", "RootIndex": "DF08C1B165581DC397ADAA4521261618E0D652A1917825484382C9267459DAD4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DF08C1B165581DC397ADAA4521261618E0D652A1917825484382C9267459DAD4" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10000000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKBwHqR3S55CpYFoX1bucD2PFMgSjPAFvu", "value": "1000000000000000" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "62" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DF32273F7E3ACE150E616CDAEDFFABF06FCA128EE073A8C726B115810B5C4EF5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-45000000000" } }, "PreviousTxnID": "CB2E3B11CF383DF48358E7B7A5E119CAE17A41BED50D8E173556D23A459EF9CD", "PreviousTxnLgrSeq": 68960075 } }, { "DeletedNode": { "FinalFields": { "Account": "rpGhnBcEyRdDNyy4AD2BwyZgWE4ERu8eqC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAFA8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "8E32B6E7F020C67EEDA8124BDE8433CEC9F3D5761B0156DBF5BE391E37CA0281", "PreviousTxnLgrSeq": 68855708, "Sequence": 67343010, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DF71A481F5A382C51F856CF66F1BCF8AAC92FA036076305F8735465DF248BE3F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000" }, "TakerPays": "18000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eff", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsZ4iqWpnTmdfE4nDDEiaGAn8z97ZV4Zm2", "value": "9999610698104581e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DF93D1F864AFE2024D208FAF24F7C5DEE781AF446574236E29BA0BD1E3D00C6A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4305375531.03397" } }, "PreviousTxnID": "8DBFBC3A449AA85D99080281BE6438C1AB1DBB57ED53EEDACAF42870198FA8C2", "PreviousTxnLgrSeq": 69055885 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKB9EELQpLTeDNb3H5HJT7QbCPdA1NzDQ7", "value": "1000000000000000" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "520" }, "LedgerEntryType": "RippleState", "LedgerIndex": "DFBD289A04B1DB9A43D559FB2F854097E20A21B7AAED5AB43E12136F97AD9418", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-86829360313.06875" } }, "PreviousTxnID": "F5284D8B19CB1B938F0C2D294A6A41331F25383A5D7B3650621A2F12EB202C03", "PreviousTxnLgrSeq": 68805233 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "rwCDD5H9MDWdQE4y15hzipJWXjZpoZWPgL", "RootIndex": "5C497004025E481D99951F27D169B3A9A7836E83D5BF283C3947FB333CF29E9A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "DFC85D8958649303487713A26C25BF044F09ADEEDFAC1D3904833C34F6DCCBAD" } }, { "DeletedNode": { "FinalFields": { "Account": "rLgitcbChWYinjw7tiwK6wQw2mN6pEyWzw", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652121E6C485A47A1", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "49185BF88702E80545BA375DC09EE9B3F865388E4634B09D4B72889BECB14641", "PreviousTxnLgrSeq": 69041979, "Sequence": 68303392, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "DFF7D32F01605A2724E483C82D26F4E059D03E6069C5018F3E1388BA579B80AE", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2093286085895001e-3" }, "TakerPays": "10675759038" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-10000000028.00811" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLN2tJYrH11YA3EqyNw6csgsBEnZ9TeaWF", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "8af" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E025CCC26F285900290B8E2E6613D0D0F2721F2E1AF95628DC46F75E1F471D29", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20000000028.00811" } }, "PreviousTxnID": "7F8D4F6F86286F174177FAD7A617BFFFF4004E1459F8A05A68061103BDFE2B29", "PreviousTxnLgrSeq": 68933433 } }, { "ModifiedNode": { "FinalFields": { "Account": "rE9hwGp3avccRZY3PerkKL1cJ25z9X22QZ", "Balance": "227223049", "Flags": 0, "OwnerCount": 61, "Sequence": 67489335 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E029A18C7B53A82203BA76EF4242B122ED56C1CF3039A07355831D017F38D062", "PreviousFields": { "Balance": "156503252", "OwnerCount": 62 }, "PreviousTxnID": "055987671FC2FD6F1EEADEE882830781F66BA6EDD8FC2CCEC28C2A260746EB8B", "PreviousTxnLgrSeq": 69054285 } }, { "DeletedNode": { "FinalFields": { "Account": "rQpXmMNyGKtsYHwkG7Y3n8sXSXo2cmB1Nt", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "7509A5E2343CBD58F19D70DC20FB819C52C8866F792C55B72A78A2669947EE75", "PreviousTxnLgrSeq": 68897310, "Sequence": 67709970, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E02DBDA97E34CC85189450B5736460AC8DBED23A8A0A27CE12DDF7C523DBB1B2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4200000000" }, "TakerPays": "42000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rwhKYMZGMmf9zeLdZWq4rs31DQeaxn65R2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652227619283ED8BE", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "ADAE16478CD9348AEC40BCDCC7FB61FDF362EE2CD57B3C92936E230F6F0F75CD", "PreviousTxnLgrSeq": 68897062, "Sequence": 67373478, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E059658079C9BF8D2E9E42DB1B42FB7791D893C0FC04430CDD034421C9EE9C06", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2700000000" }, "TakerPays": "26189999" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5220583333781078e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "240", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsdrgJ5xtkPpnWfJeeshHZLWmQEMS3cFzQ", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E06FCD34D3E99DB59C1FD4E6A514EA82F362A70ADB1BD39C5C1228B7C4A129FC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5830583333781078e-4" } }, "PreviousTxnID": "D3CDC856AF92D20F70839DED08FE0259F5448A4703691E13A9F4F7024BE68119", "PreviousTxnLgrSeq": 68777424 } }, { "DeletedNode": { "FinalFields": { "Account": "raKckiVpb6sE7hq7y1VGpF9YdGAVSbJJLu", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219DD1F143F11D7", "BookNode": "0", "Flags": 131072, "OwnerNode": "11", "PreviousTxnID": "E6F45582A0EB74AF16D8BCDB7E81F919B2E54D5F087056043EF600F591E71AD9", "PreviousTxnLgrSeq": 68916101, "Sequence": 66680879, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E09B6EA9E20E0D517CE00EA309F1BD4298A713A163DA8F1A79D26AC42A63F3EA", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "56682006" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rKzptAtXDpvuPnT8Es2c3Tq8URKvEWYomC", "RootIndex": "E0A63D6AABC4C248425387BB32F2C06177715A4BC721A4EC06AEC677E2A84236" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E0A63D6AABC4C248425387BB32F2C06177715A4BC721A4EC06AEC677E2A84236" } }, { "ModifiedNode": { "FinalFields": { "Account": "rNVK54FFqQPyc5jFNayw1WrW2m54SRAMWv", "Balance": "274471898", "Flags": 0, "OwnerCount": 80, "Sequence": 67622176 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E0AEFD3F21695F79C0F4B76AD55C6D79635F3B4505DD5FB4F256F02FC962FA46", "PreviousFields": { "Balance": "174471898", "OwnerCount": 81 }, "PreviousTxnID": "933EF962E02E1FA2EB83B67272B60E6BBD0AD4B4E602735F3991EC2DA47AA8AF", "PreviousTxnLgrSeq": 69055668 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "740631051.08894" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "710", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rw2K4HQDujtogHECEi9ubWzeVVHr2bBN16", "value": "1000000000000000e-4" }, "LowNode": "6" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E0BBC79561E7BEDFEAE2137BC4250F6C3FDCF75F6FAD9B7187567BF1BD675AB6", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "8526620917.08894" } }, "PreviousTxnID": "B658782ADA4DC872EC0CEFB0A791F7A4C6BC6B819DA297869C845C4FDCF89BD1", "PreviousTxnLgrSeq": 68893731 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "15599091822.58119" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a52", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBBS1EhebBUcDs7gDa4ZuoTfmBwsRGqycY", "value": "9999999997999990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E0CC4EAD52E8441635F78289FAD20782D63B7F0030A42F3DC013F6EF9E2CB432", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "25599091822.58119" } }, "PreviousTxnID": "E84AB1F19919BBBBBCF7AC07FBC33B2D4D577FF442967CAFF0182CC35D32864F", "PreviousTxnLgrSeq": 68163867 } }, { "DeletedNode": { "FinalFields": { "Account": "rMDVXgBGXnNiVt8b9uXXwhQC5W2xZXPweh", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653153EC73FC1C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "4D3CD4CB2FAEFD80B290F469FEDF779AF8D91A9430DD57BA46684D3E3EBC0328", "PreviousTxnLgrSeq": 68646276, "Sequence": 65101957, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E0CE2BEF2388F912842F372B7978714013B5360483B191846C8B05C0FA7F6E08", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2000000000000000e-4" }, "TakerPays": "11960000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rHQELpjMXco8drUJVmfUq89kCZbDdWBr3A", "Balance": "182337601", "Flags": 0, "OwnerCount": 74, "Sequence": 67416896 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E0D085461C3B004C9A543ABD08C90451372F396C14B55B78750D4FCD5D1AFB1C", "PreviousFields": { "Balance": "168445601", "OwnerCount": 75 }, "PreviousTxnID": "5D70C94A90CCDC5EE4B148FEBDF51BDBCFC4E9A6CDD0C7A1EF8D2645DB685542", "PreviousTxnLgrSeq": 69060475 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1000000000000001e-4" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rPhzFvrw8hkGkdzQvSRjuHuESLDqnd6xDg", "value": "9999999997999990e-1" }, "HighNode": "9", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "c0d" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E0E6DDBBA91C4E099D5B07DE009E816818C32C4A9776BD744766F3D7DCA481F2", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2000000000000001e-4" } }, "PreviousTxnID": "78AF119688FB3832EDC86386F14682A486B3A12AEF10181C45EFA4DB8D5FD5CA", "PreviousTxnLgrSeq": 68878301 } }, { "DeletedNode": { "FinalFields": { "Account": "rHXRGGkmL2bGwkbsz9mnpVi3eAZt5bThdo", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365218C32D93484EE1", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "387764D69FE7A46C47F7D554E4F14BB1A0984F8C180A5F22E35CE8C3613D26BC", "PreviousTxnLgrSeq": 68899246, "Sequence": 66754971, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E120F4E51DB62F98D82B8DD20E39125146D37D2E09748A810D768B35C4D2728E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "54268349" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "f05", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBR21hAWPJuTd1btLDfunkJUeRSWsEaLpb", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E12DEABBD6CDDF2630E9A03833C8A2F9D82ED0A030C0CB47E28C697CF65040F5", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "4407112250" } }, "PreviousTxnID": "497E3C6D56CAF25E26BDAEB2BB587B8BACFFF6E46282C124171DB208D4421070", "PreviousTxnLgrSeq": 68999127 } }, { "DeletedNode": { "FinalFields": { "Account": "rGRyfRcJ7cSYSu6rw5VpNJReEZt9Gzy9a7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212795F58D50000", "BookNode": "0", "Flags": 0, "OwnerNode": "2", "PreviousTxnID": "95E5C927439C29D0924163CA3C466CD932A4AB7439B24CFE4014D6A45B8A3A92", "PreviousTxnLgrSeq": 68993207, "Sequence": 67157740, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E1330A4BB22D65E613A8FF12CEEF9747ECB3E21F6592611508BD96C269D7CF7D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "52000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "78999999999.9999" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "26e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rszRAoxvAYy352HATq5bx3YGKpMBjeW1L7", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E138EAFDA1853BA27921849D1855189B0D320DE01E092BFF22E8C867824D479D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1004818661929999e-4" } }, "PreviousTxnID": "AA37FA1E0C47B57073A9DAC0826483531EF068A44EBEB445AC558F09FB03CAEF", "PreviousTxnLgrSeq": 68999693 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLhtdRdeGcT6UeQivqPu9DBXWHZ1SDpsar", "Balance": "385009283", "Flags": 0, "OwnerCount": 98, "Sequence": 67537012 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E14EF9B98967CE48D8A33027D63798D875EC5A07E4ACD5D8E4780C33D49EA36E", "PreviousFields": { "Balance": "334400349", "OwnerCount": 99 }, "PreviousTxnID": "1B5A46387350DBAF55ED76707614F9F45B7FF86CA2C2C1CD1D732D96BE07F624", "PreviousTxnLgrSeq": 69056018 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-32.4754" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJQTrHKExfeCjschk5MGwPZuditZ8vdWnD", "value": "1000000000000000e-1" }, "HighNode": "5", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "edd" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E15C49A21987EB6A3629919E8AD9B97A25EBE3169445C0AC8F9FA928F81C6602", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-14925373100" } }, "PreviousTxnID": "8B509AC6E7505DB9785E21055AE2A2E5DE011C4AEB5B3F5AE49E940407C90D39", "PreviousTxnLgrSeq": 68893899 } }, { "DeletedNode": { "FinalFields": { "Account": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520832344B7F3000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "424681321C6CE35319123C3B94327FA26369D9CC13FD7E0EF415984059B7A24F", "PreviousTxnLgrSeq": 69054965, "Sequence": 67440531, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2242524024388910e-4" }, "TakerPays": "517350292" }, "LedgerEntryType": "Offer", "LedgerIndex": "E16E1A628DE89D25B60915E023F44499C383DC974DE522FA0CB2621887A7CB2F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3000000000000000e-4" }, "TakerPays": "692100000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r3PWgfzUbXKYDoLD6p49JqiabjfQCj14AZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365213F93E2CD6C4E8", "BookNode": "0", "Flags": 131072, "OwnerNode": "18", "PreviousTxnID": "69A7B10CC73A95B6E6A478620F9AC405B58B1FB6401A035910C4936930BE8EDF", "PreviousTxnLgrSeq": 68992512, "Sequence": 65987196, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E16EF8EB7644332239E71C3C1CE1559BCF5ACCC1DCF6F296798D3D8A5C9167B2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "21246268571.42857" }, "TakerPays": "119448009" } } }, { "DeletedNode": { "FinalFields": { "Account": "rBZXb3rXDo251L4ZJdQCa8AUjP7kc9ifCT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207B162D153ED82", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "95377F54B3BB7C871C263703B574D0A7E32B99346A7B35717400A8D46DFC5EB0", "PreviousTxnLgrSeq": 69052056, "Sequence": 67536202, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E1C213F4E448F8FF5938BE92D4A8BF0A32879C72759846466027F8D7E18A90A7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "25258903797.00397" }, "TakerPays": "54694691" } } }, { "DeletedNode": { "FinalFields": { "Account": "rnB62vv6d8dQV13A3nHQQ7LEGy8DEWkLuG", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521630C824C63105", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "0EB390321A4BF30E6EADFD757F07865E09003D503BA3A22D3AF8DC5C9BFC0534", "PreviousTxnLgrSeq": 68970574, "Sequence": 67267211, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E1CDD54853E481E00F38FFC7AD1DC2762046035089237A35670A8C92181AB00B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9606016200" }, "TakerPays": "60000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "raZJeAMN8WHNBRrVCc5RXYfD7mAuKctiwE", "Balance": "858589634", "Flags": 0, "OwnerCount": 22, "Sequence": 67450381 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E1CE37410DA031B52CF99C17B528C8C3ADFC52F6A9A73E021B3DA12F5CE7E4A2", "PreviousFields": { "Balance": "79990645", "OwnerCount": 23 }, "PreviousTxnID": "E524296147A3F53F0E6A8A69947B7C2DF372715F1EAFB786C653E63F5D2EC8CE", "PreviousTxnLgrSeq": 69043701 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rwCzLwdFp6DLPMfZRTUN67UB79XbbmYt2o", "RootIndex": "E1E2D0727CCAA91B19E959F0214AF0F5BEE3939F4063F0797F4EA5D632927E76" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E1E2D0727CCAA91B19E959F0214AF0F5BEE3939F4063F0797F4EA5D632927E76" } }, { "DeletedNode": { "FinalFields": { "Account": "rhrguNtFAs4pp6FD4n2Uz2M5PQACwnWdrC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520D7F86E851E335", "BookNode": "0", "Flags": 0, "OwnerNode": "4", "PreviousTxnID": "9569AEC3F4DABF485E8AF2A1997BC04CAD4FCE8565333FB8AEDC2A3841F4AC8A", "PreviousTxnLgrSeq": 68998156, "Sequence": 67583954, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E1FE4D257DDD402206811967546C04DD0FDD164434BE8E6C76CEA53AC14C2B83", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20003200000" }, "TakerPays": "76000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rDYvWkTQaaoWiWYo2r5fKuqEoop8WK9crS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Expiration": 726953086, "Flags": 131072, "OwnerNode": "1b", "PreviousTxnID": "0A41AF90A6B8C3E32E7EBAD59941DB760390FA644792251E292A797DC450CC63", "PreviousTxnLgrSeq": 68991789, "Sequence": 60413066, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E215F54CE8A721ED6B7BA30E68521F463D4B7805447D262EE79E87619F6444C4", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "96000000000" }, "TakerPays": "480000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "8", "IndexPrevious": "6", "Owner": "rBYvQ1bajMk5CQ8MTa6whA9MZ4uuJGwtEh", "RootIndex": "51F44E1D742C2DC27B600E180498EF71F8C1D2425EBA974B5F75FAA3DB4D2C1B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E21B18A733D29F0C693F495BDF722C27292D516FA9B52CDF629AE843DBC6A942" } }, { "ModifiedNode": { "FinalFields": { "Account": "r4YqG4eX9uskEYbdZVejyRmkBgM9pSo8q5", "Balance": "18744766828", "Flags": 0, "OwnerCount": 100, "Sequence": 66712938 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E257BE38539FF75E95F5B28E8DC8C408810A0B5C6B20C7CEEC69BBB3559A5C78", "PreviousFields": { "Balance": "18204496828", "OwnerCount": 101 }, "PreviousTxnID": "FC9034720C4EEB31FD9BB060FB5203BE9A2D9B52043298A0FA4111905B4891D3", "PreviousTxnLgrSeq": 69063821 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3NPSAnK3n8wx7pdeCje64yvei4xLBrgd", "Balance": "7755412077", "Flags": 0, "OwnerCount": 37, "Sequence": 65010505 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E261BBC0AB459335BFA90342FEC5417EEBFFDE37B5A8C9FA45DDB2AADD7DD48E", "PreviousFields": { "Balance": "7584898899", "OwnerCount": 38 }, "PreviousTxnID": "739899E2889FC7E6B6BF5B34F48468455D71F965E3156B80FD526BAE9A714946", "PreviousTxnLgrSeq": 69059888 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3VQGy3EVus3nKJz33du7UqZDMFEnVmHLL", "Balance": "589501504", "Flags": 0, "OwnerCount": 62, "Sequence": 68254318 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E284D51C209558ECD6F76130D2C4EB9509DE0D89D3ECE877224D2240473C7AF4", "PreviousFields": { "Balance": "539250247", "OwnerCount": 63 }, "PreviousTxnID": "7830B07EDCA8B036CB17D8710D03645F78BD1FE37BAF43AB495033F97D9AD477", "PreviousTxnLgrSeq": 69064107 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "racxdehrfnx9kEzWRF2vcMPCzx8WRfF6G9", "RootIndex": "8F06349C4000BEC4B40F76117FFF9D862C81ED87C866EC2DD44867047E950A14" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E2BD88529960D47387ACAFAEFC79A716C5B28ACA7AA61D1239076D76F78C745F" } }, { "ModifiedNode": { "FinalFields": { "Account": "rah3AgBTwgnCvR5aJfj4p6Gy98hZt57gXD", "Balance": "515770778", "Flags": 0, "OwnerCount": 83, "Sequence": 66615326 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E2E83D606579726D53D0C81E9279A21A05C5E9FA3B7D063643AB9796AF9EA191", "PreviousFields": { "Balance": "463332137", "OwnerCount": 84 }, "PreviousTxnID": "B268CF6985240F394778508AAF9F7A32CE602CC92FDB7E0C134A408663EE8F3F", "PreviousTxnLgrSeq": 69042880 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "9517358514187970e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "40a", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rsj4wU1Tv93ES5J3AZrWVcgaKXV9b5aNKc", "value": "1000000000000000e-1" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E30857A67323A50351A777ACFE53E2FF43B68440F6872D1AA5D4ACB9ADBB4265", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1005291407071273e-3" } }, "PreviousTxnID": "F4F32746DD86895901581BFCDE39C84F5EB62E1836FEBA314CE21AA9776D06FB", "PreviousTxnLgrSeq": 68990970 } }, { "DeletedNode": { "FinalFields": { "Account": "rUqgMfiCKp2L5Y1zobkQTgSdVYLp1PASt5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652096A29349EBBA2", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "B61CE651A85D7565108BF5E2CD3AEB35922E80C5ABDF892233A06C4AF2AD689F", "PreviousTxnLgrSeq": 69023343, "Sequence": 68911100, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E31981C4E8416CFFA2B7EAADD665B035AA9A21441DE32C0E731D5BA77508D41A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4223866751872249e-4" }, "TakerPays": "1119324689" } } }, { "DeletedNode": { "FinalFields": { "Account": "rwmZ1gXEQzFAzzEmYyGjHDhmccg5SGj7WS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530E35FA92A49095", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "F56087D4B41142079CA24AF9C09B5BB7C278D3AA23812E029EEA99B2A3B0EDFC", "PreviousTxnLgrSeq": 68790485, "Sequence": 66329297, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E331062135992CC715EF84C0EEF385EBAA80E9D59C209EFBC0F8188C6CD0821A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7796019890" }, "TakerPays": "311840795" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rfqL99qLpPmC72SjLCaytr5g27EUH35RyB", "RootIndex": "E35EE0B07D2D3249FCBC44CF807E156C72E6955D46EDE045688DF1500B3CA8C8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E35EE0B07D2D3249FCBC44CF807E156C72E6955D46EDE045688DF1500B3CA8C8" } }, { "ModifiedNode": { "FinalFields": { "Account": "rzHXP1zuBviNtiogFMnNDcoUg88bprjNy", "Balance": "2287546992", "Flags": 0, "OwnerCount": 43, "Sequence": 67764300 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E37438FD4C88BAB2D5E134752FB04C7C74E6A6633DA7F1432111EF8B31254A41", "PreviousFields": { "Balance": "1209687094", "OwnerCount": 44 }, "PreviousTxnID": "174467C74786737F7B8AF11A77F738D7BC3F91E22493193EFC4D86D9A264BC22", "PreviousTxnLgrSeq": 69042821 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMWLJFUZZk4ueZuy4yiLPJa23dGih6phUa", "Balance": "168251050", "Flags": 0, "OwnerCount": 78, "Sequence": 67175933 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E38FE3D599DB83246FFC603C046CB11C88A13FF954A882C5725DB461A24A2B43", "PreviousFields": { "OwnerCount": 79 }, "PreviousTxnID": "F6BE1E919CAA037CC9FE0614BBE27F2DAA233F264D1C4BC3DF8B8AF6FBA90DA4", "PreviousTxnLgrSeq": 69049466 } }, { "ModifiedNode": { "FinalFields": { "Account": "rajb91Ucmbfxe1KoUEpAtJi8eo5bQVWeUW", "Balance": "328782857", "Flags": 0, "OwnerCount": 88, "Sequence": 67452145 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E3A9AD9AB982E5281A169633D1D2676EE4E7B34846BF056B1C1B7CDA16BA2486", "PreviousFields": { "Balance": "302571476", "OwnerCount": 89 }, "PreviousTxnID": "7A9FE96E7DD399634FB7CCC6DB8DCB27C42E2865D82B8C4462190C2AF3B68F74", "PreviousTxnLgrSeq": 68984152 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "c", "Owner": "rUtzPhAd4njQGteZHqi7hbd8CRtZGfQtp3", "RootIndex": "ABF7E9358917BE7F15BD1467140B164619B871E1D12F35DC5BE54CB372B04FFF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E3C4A21D84B2FF6962F4E035E33C3736AB889BCD48D0274C8ABE6E6D6FB4C626" } }, { "ModifiedNode": { "FinalFields": { "Account": "rNH6NhWEAVCRPrcDv9NYJdPKv4YTHn1EgA", "Balance": "359641989", "Flags": 0, "OwnerCount": 34, "Sequence": 67414050 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E3C7CA82579F5C2063BA39D1ED4C903FF350CCCE7611DE26699D3CA1E6629D4D", "PreviousFields": { "Balance": "159641989", "OwnerCount": 35 }, "PreviousTxnID": "81FE8A7E9AD50F315CCFBFB7D7C40049E1B99ED9F6D5E11BFA91D9B99667744F", "PreviousTxnLgrSeq": 69048810 } }, { "DeletedNode": { "FinalFields": { "Account": "r3uzGoy1vgEEdULUkLBRJXaYfww3nzYP27", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521F9D97DF990136", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "05F5D206816A34A1914B32CF46551DB4F57FE12F454AE039FB3EC298A21D64A8", "PreviousTxnLgrSeq": 68897267, "Sequence": 66616836, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E3CD4DE322EA3969632388372BA800C1C494495AB6F4BBB9DE7EFAC6ED9DD161", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "69287523" } } }, { "DeletedNode": { "FinalFields": { "Account": "r4szgdizaCzaf1H9hBme8BYyQPhf2CbvXC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA50921E1", "BookNode": "0", "Expiration": 723032671, "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "8C9C2501C5ED634AC1036EFC970B34FE6FB89148C1EE4C06A4CC78EAC9D0FCF7", "PreviousTxnLgrSeq": 68012935, "Sequence": 67374620, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "77859899" }, "LedgerEntryType": "Offer", "LedgerIndex": "E3CF6463510345803170CB78A76626B1C0ED1602AF6E946B67FEE720359AABA7" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "1", "Owner": "rNH6NhWEAVCRPrcDv9NYJdPKv4YTHn1EgA", "RootIndex": "91A47673249253B17C01F28B2A121A151D9C38BD926F37AAFE431637827CB588" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E3EE230068CFA336B198EC3A0959F6587ECB3BF797B7A6DF6D22CDE1C08A50E4" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rsdrgJ5xtkPpnWfJeeshHZLWmQEMS3cFzQ", "RootIndex": "A8237F06A28C001193A1DAC1678AC2EECC1AFE82BBE54533320C77BFC5D63572" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E40D328CCA9349E6F7411D2970387BE049C6DC1FB4E22FABC491B49FC44A1C68" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGtD3bMYvE4snnRuTS2n3CBfSLeUMBpSyM", "value": "9999688558266536e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e13" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E433D4316303956DF57D0AE95D08A795E15D1C0D590EA212909FF79C38CB821C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-14128771526" } }, "PreviousTxnID": "702B1E0EA65C4681CFB8842624A1AB82ABD2B0F42D4A9047348800A63A8C3D01", "PreviousTxnLgrSeq": 69019398 } }, { "DeletedNode": { "FinalFields": { "Account": "rspLJnfzomVceQKCn6ExME3gJEUuhUZxdV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365212D452694AB9AA", "BookNode": "0", "Flags": 131072, "OwnerNode": "16", "PreviousTxnID": "F8DF0D407A0EF5EFBD0F4C174C716A115BA82098DCD128575B7E867473554A67", "PreviousTxnLgrSeq": 69005596, "Sequence": 67373812, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E43DA89159D068490168C7A1B1089E1362CACDD693C1466F124EF71679A12BF1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1981221762375000e-4" }, "TakerPays": "1050047534" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGgYjYE7aH7sY7uc9BHpks2NDgVkptYkDh", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652138A388A43C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "5769760B0BE9728F459645DF00F695824A6E08EFCD48A01B47C49BA477E95037", "PreviousTxnLgrSeq": 68938929, "Sequence": 67480735, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E46A44BDA71C6F31D53E99FF2B8A99590AEA805AEAB5E67C9AE9D9A5183E6716", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "55000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652082BD67AFBC000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "30B824E907EC9FFD0DF331DE52E5CC9B9E4DD65A67315D512D2EF62A00054B7F", "PreviousTxnLgrSeq": 69054932, "Sequence": 67440524, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E47C5912F93B02062653738571FFB14F69E28185A8CCAE4B8D5402748620423F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "230000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rJsM7f8iBRAiXz3bMUaiCsxHujM8UpirwN", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973BC8AD6E9", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "83C828CD41A029B54D032538E4458921862E96A07B7C468D09F4749E47D91206", "PreviousTxnLgrSeq": 68895508, "Sequence": 67366317, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "2069278611.241868" }, "TakerPays": "18623507" }, "LedgerEntryType": "Offer", "LedgerIndex": "E47D2004979AA3C1FC864A13CE1415F480E15A3C7A48FEAFEA2C8FF030712584" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "881", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r9pfHFFyEEhtaDaMgVNtZZ8Ks7YL98ziRB", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E49C0D293275A05DF84335DCB4A28521D92F7B0A4529E59D5B39148657E233D0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "3334588052.553338" } }, "PreviousTxnID": "52161BB0E181646D75553F4AC44C2A2C5B034A597C86C76FB31A1DEE2C3CCDAF", "PreviousTxnLgrSeq": 68747197 } }, { "ModifiedNode": { "FinalFields": { "Account": "rwmZ1gXEQzFAzzEmYyGjHDhmccg5SGj7WS", "Balance": "599156327", "Flags": 0, "OwnerCount": 102, "Sequence": 66329437 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E4C690BB52CF80135CB5B6B1BFD9A359187E1BB17D2B99ECB0AF3B5A5D814C81", "PreviousFields": { "Balance": "236999975", "OwnerCount": 104 }, "PreviousTxnID": "524B475D6A7893DEDA78735D85C897C6033F8D309D3ADF86208D59E1467286F9", "PreviousTxnLgrSeq": 69011029 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "7", "Owner": "rMMTgtHSock7M74yRKkp4ug6i14nGeCJhW", "RootIndex": "D6E618C6B2EFD3EE511493F4CAA56E51387934AF90D414125C9CA3D253456A05" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E4CF0FF9082E1FCA5131D2CC6C0B34574D71F34CB303D9C2BCD116A7E597E6BD" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "9", "Owner": "rf4YQSYpheUvWxMx5rmSgr4vdyvu7tWUp4", "RootIndex": "C6EA667846AE73390055A474451A779EDF7660685085B83CA1ABA251716BFA15" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E4E2277C51E090B08D8031D937C36E5606E27ECAFA4971184DA4E8CDEE9A650A" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "e", "IndexPrevious": "c", "Owner": "rKB9EELQpLTeDNb3H5HJT7QbCPdA1NzDQ7", "RootIndex": "75E80E4ED280762F7C81337664E6CBE0CB29167C106421C9487E1CBE0497F196" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E4F21641E7C1E0F453A4C69BCFE1B170600592B8FE4E2F0EBC3079C8BF33BB46" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "7ac", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rfJ35bQofteAs3h4aCA77V5wSHRsHChttf", "value": "1000000000000000e-4" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E51492034BFCEBAA9401FBE041C9D3AC3AEFAB0A425FA5EB466E625714B5AE23", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10000000000" } }, "PreviousTxnID": "DA7D0770E86A7997A59E2BE71BF1BCF11DC6280D729E417B757A8B8CAC282A98", "PreviousTxnLgrSeq": 68898802 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3Gqpysb37rsJfn8RTCG6bSmigvzYPbWa4", "Balance": "405078852", "Flags": 0, "OwnerCount": 160, "Sequence": 67430775 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E5616E4E2712CCB429155501236DD6A8D34AB8EF2B3C657676A1C0F7738BE8DE", "PreviousFields": { "Balance": "332163126", "OwnerCount": 161 }, "PreviousTxnID": "79D9573502F72EE02C5856E1B0E5D0F1A108F1979DFB20724611D5DF4D1956F9", "PreviousTxnLgrSeq": 69062753 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rwLffu7VZ4rMMa5thTQppfL9g4FMB1sNys", "RootIndex": "E56B405953A627751DAAC35913263424A4E5ACF3745D7659105C999AD9255CBE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E56B405953A627751DAAC35913263424A4E5ACF3745D7659105C999AD9255CBE" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rNk5vizuipEGcr9cNVXnh1eBjhaMFqFs42", "RootIndex": "350213DAAAB3C58FEF1A618DFED595F851D9125E7C57501F8E17493A7F335EFD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E582BBC6D945416F4EBCA4BF21C149FD73CB206444E2EF6EF9396F9524E67313" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "64a", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raqKMtQVnQPuQpPLBoeyPbjYHSokvu1R1z", "value": "1000000000000000" }, "LowNode": "2" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E58A2E9090EA69D4CA3C90FCC94A050874AD99513E60D5F75D1C338AB869C45C", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "12785989866" } }, "PreviousTxnID": "65CFCEB0B320C3B77E1ACEFCF3A88CB531A8510887B589F53E954E933A429765", "PreviousTxnLgrSeq": 68874810 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1b", "Owner": "raUCqTN33sgqfhC1KVtqhCVX6iHkHAbUzp", "RootIndex": "09B006752712F520BF9D397955754E5C3229F296934DD135743B74E4B737D5CF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E59B9BECC40F2C27149046E754293982C006D43B1B13570D16DFFBD6AAF791C6" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "r4DDKcQaxRVhr17DMzNSrAYBvarHRXBJg5", "RootIndex": "E25BE2786459F3746C5DD7E4BDED5FD36FEC77521E5E02FBFDF4E5BF9E864A3B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E5B2C42707D15FC35B0F252E9D0DE657CB6528A7286285E5C79555914CB29326" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20000000000" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGhP8A7jhRj3qkYPUR35bRvLCJyxh7xmGq", "value": "1000000000000000" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "315" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E5CEA562D36EE5400561289E9D2D59E4A5DAF3B6577092ED98EACF1EFB61540D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-50000000000" } }, "PreviousTxnID": "1DE72AB0B210EE24B8D4B7CD4DD4EAD373A949CED29D433C79DBEABED6B0A8A5", "PreviousTxnLgrSeq": 68510294 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBE6UN87gwvyAuud7dSn2d6zdBUWCjgqRG", "Balance": "542526320", "Flags": 0, "OwnerCount": 28, "Sequence": 67882083 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E5E17F9DF40B9E5AB66E7F4C2BB0D64163B64C06529F2A186A975AAB4041EA70", "PreviousFields": { "Balance": "71805136", "OwnerCount": 30 }, "PreviousTxnID": "24CBAF2455DAC4C58E64097427FF3C6E2F18DB251F8CE6F393A144D6240E9717", "PreviousTxnLgrSeq": 69061759 } }, { "DeletedNode": { "FinalFields": { "Account": "rExSJvWnn93G5NfnzZ3YKuPgpQnr8wBsrE", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365209C8456E33AD92", "BookNode": "0", "Flags": 0, "OwnerNode": "d2", "PreviousTxnID": "E231854200533AEC153ACBF3EF81AAD07F17069F6EE10322EFBA590C6C2CEB30", "PreviousTxnLgrSeq": 69059556, "Sequence": 63810433, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1751319103039126e-2" }, "TakerPays": "48222139234" }, "LedgerEntryType": "Offer", "LedgerIndex": "E5E9F43CB3645CE7F7AA78BA18E13958036B9B953A6269C2633C5CB3D83B8C2F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1815886987650000e-2" }, "TakerPays": "50000000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rwCzLwdFp6DLPMfZRTUN67UB79XbbmYt2o", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520A268E386A6BAF", "BookNode": "0", "Expiration": 727132261, "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "8ED817FF881C00DDBBB0CD423B24F9BC9735C6B6903467BF7540D9CBE7432CA7", "PreviousTxnLgrSeq": 69037326, "Sequence": 67150577, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E617793E1191498E4FEF0A554E24D47438EA9DECFF7313A26B536C44FFAA82C8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1050000300000000e-4" }, "TakerPays": "300000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rhft58oDqDyMaUZZCKeBgEY4ewRC5HSpqM", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26CE23FB5", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "1C876137E8F67F9D3844F2031223171796B39446D68A5BB9579D6FE90950E6D6", "PreviousTxnLgrSeq": 68308111, "Sequence": 67660556, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12543364457.7085" }, "TakerPays": "125433644" }, "LedgerEntryType": "Offer", "LedgerIndex": "E639DAF64AD2363E14CC8459E075F9E23F31440EDCC3DEA5E29941BBB3B02FE9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "13029982462.74282" }, "TakerPays": "130299824" } } }, { "DeletedNode": { "FinalFields": { "Account": "rh2ExLW6MJMJdoX7386pzfkNbhHSjqVWtC", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365217CD9D4D8E38F4", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "D135B80C27AEC611FE776935D9403C4AAE3954B92569CBF86C77DC1E609A99E3", "PreviousTxnLgrSeq": 68946709, "Sequence": 68087680, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E663F9FE4980BF9F2C1D1F7CDA3E2253A61E51CF982E78FE9EB537A356126CEC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "21000000128.28504" }, "TakerPays": "140700000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNd3R5EaqkBC3EguG1mmwhjpKqLDTjBNwQ", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "591" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E67B2259E2484A0E8486901B9CB4CA420EBFFAF9D875A76817424E93DC825A65", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4282294426.3" } }, "PreviousTxnID": "B3739FA58E9D4DBE25B7C801AC01365A5A0B9CB05A671F2846834F6E090C8253", "PreviousTxnLgrSeq": 68874417 } }, { "ModifiedNode": { "FinalFields": { "Account": "rNh79kZDsubi13bjTw64kBsKVWepnDT2J7", "Balance": "60578720", "Flags": 0, "OwnerCount": 19, "Sequence": 68590621 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E6B0F7B035D44677B9E2CB5C5D74577D927A4F04387FA3C1DDEC9B3AD303B962", "PreviousFields": { "Balance": "50100246", "OwnerCount": 20 }, "PreviousTxnID": "068A2FFF3B9E708D37A431A131A3D69E3A2A883752FA778780BEC4A3C2A78A56", "PreviousTxnLgrSeq": 68941997 } }, { "DeletedNode": { "FinalFields": { "Account": "rnsZFHUhKJoPt3oh269oP51G4j5HDCNNBg", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520775F05A074000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "21A0E34A99306E333A1AA64B46CEC95A7AEC951C6AE926E42058DAF282C75DE7", "PreviousTxnLgrSeq": 69053350, "Sequence": 67560835, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E6B731BBFF1D4272CC4CB8000D58079E5A5AD3A46FAC4D23FEA73B5BA68C0F4B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "3000000000" }, "TakerPays": "6300000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rUHsUfjv1Ai9KiT6R3WzLcAKvvPLao6fiK", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAC4EECD", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "2C5AC6BD8636FCBF64123DDA74A27B0A575640D13161C34C9318CADBFB05A58D", "PreviousTxnLgrSeq": 68163043, "Sequence": 67545781, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E6EDE133CC29F607C101C045D324CAA9E23EE4B94B6A870A60E2CB4A64072D7B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "23357969598" }, "TakerPays": "2102217263" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rwFqpfxexbDa1fUuG87ceDdbe1JnugjWUV", "RootIndex": "8DB5A79C2172A7530D5E3FEBE2C161C4B5728277A8CBF702D3C7856C54D95257" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E6FF0B68B8166670A76ED42D9CF613754340F4EDF71EE4B1705CF74CC4A1D374" } }, { "ModifiedNode": { "FinalFields": { "Account": "rMDVXgBGXnNiVt8b9uXXwhQC5W2xZXPweh", "Balance": "17086351878", "Flags": 0, "OwnerCount": 61, "Sequence": 65102029 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E710C11F2C84C56422842F8E5A56CF40466EA8A3870DBFC7AA876D4E353068EC", "PreviousFields": { "Balance": "5126351878", "OwnerCount": 62 }, "PreviousTxnID": "F85E16D725D1812A3643482AEE4E6B85CD36B57D4F80778A5774D2D7B389C492", "PreviousTxnLgrSeq": 69047787 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBR21hAWPJuTd1btLDfunkJUeRSWsEaLpb", "Balance": "36509842", "Flags": 0, "OwnerCount": 4, "Sequence": 68736089 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E73154EEE343052E3EAB590286B792D85009BAADEFD111784EE481D8C304913C", "PreviousFields": { "Balance": "22407083", "OwnerCount": 5 }, "PreviousTxnID": "7A3B74E9CB0A60419B5E53DA4003A8B3B6CB27D68516E3213BD819DDF89E66B1", "PreviousTxnLgrSeq": 68999875 } }, { "DeletedNode": { "FinalFields": { "Account": "rXEUqWCmmyBxf2PUjPFAj5b5DuydWyRe4", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D3D0C000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1b", "PreviousTxnID": "398A1218188DEC7866DA90EB0DC9FED5C3CBA218DA27F4F382D07A204B4BBDA3", "PreviousTxnLgrSeq": 68899150, "Sequence": 67494061, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "13240000000" }, "TakerPays": "99300000" }, "LedgerEntryType": "Offer", "LedgerIndex": "E760345C34346A46BF176A0994F9D5A0DC2A682B51D2B43A6104882B8D9ADBE2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20340000000" }, "TakerPays": "152550000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rN5wcyJZjT6Qd7sJZiQg2SHVtjnmqiq7W2", "Balance": "302867136", "Flags": 0, "OwnerCount": 113, "Sequence": 66720646 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E7A3775557B3D51EFACA0E2869905A8C89B995301BE0D05A538C8A45CB21A9F8", "PreviousFields": { "Balance": "249867136", "OwnerCount": 115 }, "PreviousTxnID": "61A6EC99D60F23568EFFFBA5DA8279BEAEC1DD642B194FBAEFB5691B07A4193D", "PreviousTxnLgrSeq": 69055407 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rhft58oDqDyMaUZZCKeBgEY4ewRC5HSpqM", "RootIndex": "E1DC9A5583BD967813C61E0F432CDB55806C6AE6BA9EA7F91E5B2445F675E02D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E7AA66935964B49DEA025145D33316622560D64EC96393C645429082B33804C2" } }, { "DeletedNode": { "FinalFields": { "Account": "rnW1sfCjjdMou7RKC2PquXVchHYBMAHqTD", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "9F2F7FD1BF6B73EAAB7BF95E93CBD62CBA9DE680231B7333AF323C2A50E1D4ED", "PreviousTxnLgrSeq": 69008791, "Sequence": 67670955, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "16000000000" }, "TakerPays": "80000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "E7B93DB93FCE8BBC24DE6A4CA43D6192DFFF384ACA43461AD8DF45368903DDCE" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rKKDmfji3MYEAtBZY3AQj8ghcuH1HXYpZC", "RootIndex": "4299234E2142A7B1FC4F9C2A2517C2CD6534496F8FB123CA2D6594BFC8D9D438" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E7DDFAAB3D418BED671F1A7E41427B47006685008D658692A125DA7ED8C3C570" } }, { "ModifiedNode": { "FinalFields": { "Account": "rpWE8DQzMegfBwaPaQhF9EGfxWWxvqRwk5", "Balance": "48239335", "Flags": 0, "OwnerCount": 17, "Sequence": 67603206 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E8068E0CF4A221A185F61758412A998C920E229B7667594965F01136A5F5A19D", "PreviousFields": { "OwnerCount": 18 }, "PreviousTxnID": "BD14F594C65A1D8B7501CC8C81127DC4B617B7834BB31E4F794498854F58451E", "PreviousTxnLgrSeq": 69050409 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rEXcziBZ9tEnmNVrcdbQATJPr8JRHuRrZV", "RootIndex": "DF1803FC45993B40EABCF24BED4F16087F77D973171DF6FD84865F783E562099" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E81335A111D6E84E9C585BA75862B8226ECC180F8299B84D73E2CCE8B3226558" } }, { "DeletedNode": { "FinalFields": { "Account": "r4zXDbBBSbrguDq5pTzabnMgXY7n5qg2jb", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653082BD67AFBC000", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "1F0AE8279F154B0328779E0DF6B460260FD77D6590C74EE5B085A4A0EAE1BA03", "PreviousTxnLgrSeq": 68242137, "Sequence": 67256051, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4700000000" }, "TakerPays": "108100000" }, "LedgerEntryType": "Offer", "LedgerIndex": "E852B5641D35E5A778940BB0F8C57ADE3B9A7AB0B576E7FC59B8A751B3BDFED9" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "5", "Owner": "rwmZ1gXEQzFAzzEmYyGjHDhmccg5SGj7WS", "RootIndex": "69E89C157CA91FB591176DA4FD3243BE1161E93F06665447AAA51FF4FD4E2CBE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E85B5B778BA714DE6442A2F6509B32BA0C903CA3DF0B310930B9089A3A94F2C0" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rnB62vv6d8dQV13A3nHQQ7LEGy8DEWkLuG", "RootIndex": "CABB5C6F0F0DFD993B47105A363276F87CC9E63DFAEB06D01FF2B1C2E237CD0F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E8601375E0FF51BEE96F474C994DE4BB8DEA63F59778AC0860ED1E9878CD19E6" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "7", "IndexPrevious": "5", "Owner": "rJ7DCt3RdTywMMwKTq2Pm8srSeU4GvmSiW", "RootIndex": "E5D5ED9679E603030EEC08424E520B4CCA806554FCE917118400D2C6D3626999" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E86EC84D9BF52D212A0984D0915695853959299F94E7F0162CDAA708A6CDB0F0" } }, { "DeletedNode": { "FinalFields": { "Account": "rJCvziKjUwgoNgwNNcy2SwqVMwPFxqBjvn", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "9B08848746301635118852921D3490E142FE51E76F06F22EC1E9F3C0C1782757", "PreviousTxnLgrSeq": 68912200, "Sequence": 67662842, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E87CEA09FF075EAF573B6CEC2C4A82335DAB58A913F3838A7B65587DC66E2D00", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000000e-4" }, "TakerPays": "800000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rLkhJhEaChEegzryMAeps63ghhG1yXzifL", "RootIndex": "E8AA0C2CFF0B2DAA0B33FCABB4C2845B9FB2F6DCF4AE9C633A23896BEB4C0EF0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E8AA0C2CFF0B2DAA0B33FCABB4C2845B9FB2F6DCF4AE9C633A23896BEB4C0EF0" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "r4KVUoogBDoZS9NZAzs37JTgpCoCwbBsSk", "RootIndex": "EA39E8BBCA82B39759053A55ACBA766EF447ED6439A43BF0EF30AD02F7F472F6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E8E4B62B31B50AC55FACDAEAD9CEC72D548A7585AE6A513766BB2E3C5F541AF4" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1597177877054002e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eb", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rf7hbrdWs2saBvmLubvuzHJuDhDwJf2Fuf", "value": "1000000000000000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E8E775520F2A0DEEE70D9CECEFBA81CDE674697BB8D1DB92ADA5FD0837E9AA04", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2765076357154002e-4" } }, "PreviousTxnID": "4B839DACC05ECDDE78293722AAE3A688426A91BE29975654572646ADE8A91962", "PreviousTxnLgrSeq": 68900449 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2392994933" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rHAYfZTYakQQ5NJCP8BD21nrQeQmDyst5a", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "349" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E8F8E3CC531F5BB49EEA470A32539EDF460638B2D8BEBBC58DEBD6AD4F2A0D65", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-4392994933" } }, "PreviousTxnID": "A2B107BE9137FB9E10BEBA93B301A4E70C179FBAF575E2B040B414E37D23E119", "PreviousTxnLgrSeq": 68835953 } }, { "DeletedNode": { "FinalFields": { "Account": "rHycUxo3HpqiVRhve7H8L4y94dvPHTubXw", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521521ACA596E533", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "9CD2AB2DAACDF0BFE91048B2BA95F86CF464EC21FBA19C7CA29A4799B8CE835C", "PreviousTxnLgrSeq": 68908157, "Sequence": 67540268, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "46311067" }, "LedgerEntryType": "Offer", "LedgerIndex": "E93934AC91C1F8315FCC42D14F70F0B3161E85599F5DC90219FA8AB48DB6B34B" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ecf", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rBqYpFjv2TLUiwx2Lr5vgGxoEgjhq1XnB5", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E93AF07130908FF3779413C7C48325A3AB27FCE609DB458447A8574158E62148", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5015645579.68313" } }, "PreviousTxnID": "373A715D7D6E174B5F24D14B54EC51E3416385AC65DA58E55F9E8000B25AF23E", "PreviousTxnLgrSeq": 68897249 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJw1L2RZTiPTQJSF7KmstuGrdNrTmdvAjb", "Balance": "560519792", "Flags": 0, "OwnerCount": 196, "Sequence": 66304837 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E94156242C71088943DB7BB8235230F4E37A23697B0626120FC02EF4DDA155BC", "PreviousFields": { "Balance": "553019793", "OwnerCount": 197 }, "PreviousTxnID": "B86B0A31E75FBEDD8A45C0C7B5601056EC0E2D85920E7CC8DB262B360E58BD5F", "PreviousTxnLgrSeq": 69063150 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rEm8Pg6dKSuFWvEJK2Fnv8EvmkSTuNFJew", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "983" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E94DEC16A6927F88CFCC73125B77730D27832D9EBB21C8814EF4A30F43C28F9E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "7187B7E570FA93F164D70BCB9FA9918E3FBD2ADC410C0542193F7A174C77C794", "PreviousTxnLgrSeq": 67991918 } }, { "ModifiedNode": { "FinalFields": { "Account": "rQ34CimjrmwQA4bz3qCwGRHPFuo8rbnVWv", "Balance": "589905402", "Flags": 0, "OwnerCount": 84, "Sequence": 67516024 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E952F1FB67F957E78FEBFBF4E481E828DC957E4DC4CBAFE72DA21ECF51BED0DC", "PreviousFields": { "Balance": "558905402", "OwnerCount": 85 }, "PreviousTxnID": "EDC1B84CF479041D047D8198FC4C77CE7228AC88090F03BA88B8915ADDC7BBDD", "PreviousTxnLgrSeq": 69064051 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLFVckNbciXAqgedJM92yZX7653rXcn4JZ", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "a29" }, "LedgerEntryType": "RippleState", "LedgerIndex": "E95E174D06FD7F40454E00BB5714D99E725FFD2CF7CAD6AD46C4B9B1CA0B7E51", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-11785989866" } }, "PreviousTxnID": "DED43F4CFB2BFC781E5A16C2D56381C464F88DE0DCD26348F85E8E3F23D32892", "PreviousTxnLgrSeq": 67976321 } }, { "DeletedNode": { "FinalFields": { "Account": "rsdrgJ5xtkPpnWfJeeshHZLWmQEMS3cFzQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365308E1BC9BF04000", "BookNode": "0", "Expiration": 722943636, "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "D6D83B09479BA5CB4258F778CA18E3BF5F5FD89B34940EC186204F4C0EDBBF17", "PreviousTxnLgrSeq": 67990892, "Sequence": 67219931, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "E9645BD7ADB7BCBDF04ABD4442D5F1B593A399F9CDBD61D9B53417FDF3338101", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15000000000" }, "TakerPays": "375000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "r3PYAn9d1DTFzJ9kuvFnhudgwsVZ6pm5hT", "Balance": "5379964871", "Flags": 0, "OwnerCount": 73, "Sequence": 67442412 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E96F696927286787031D65AED13941FE2E534485897657F9383CEB8F2326E730", "PreviousFields": { "Balance": "298450406", "OwnerCount": 79 }, "PreviousTxnID": "BD3F981121EC07A4A7F0D5680EB14351FF66381C2BFD285F4BE9D34B5D0456FC", "PreviousTxnLgrSeq": 69057899 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "rpiGc7vb6vr5hWMxqK2NgEVpQkYhBXreac", "RootIndex": "EA2624CAB17FD41EE945154C6F08D36CEEDBCAC92A27C07B9734F3D80EA23693" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EA2624CAB17FD41EE945154C6F08D36CEEDBCAC92A27C07B9734F3D80EA23693" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rQJFPnXAsdHvbAL8JeEYNu5FQDW4mHL5MK", "RootIndex": "EA27628F694215BBD1481EEE30755A374ED523A80DF0FFE28CDD53BB947C4469" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EA27628F694215BBD1481EEE30755A374ED523A80DF0FFE28CDD53BB947C4469" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGgjwqb3Lg3yvrb1CRRqcTghWvU4r7fvFX", "value": "1000000000000000" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "97" }, "LedgerEntryType": "RippleState", "LedgerIndex": "EAAFC604700E4CBCE17A922C7E4680675EC3ACE0EBC8600CD62BDD970722388D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-2335796960300000e-4" } }, "PreviousTxnID": "B89483264348EF709A3D8AEAC1455648BF41D1194C63A89FECC49A88186684A3", "PreviousTxnLgrSeq": 68149775 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-59612345091.43746" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLCRC3mUAkWe4R8EwjZ43BGQs7hmpdGrbE", "value": "1000000000000000" }, "HighNode": "4", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "24" }, "LedgerEntryType": "RippleState", "LedgerIndex": "EAF5709BA602E9E9369E3FFF43EF1A136B94ACF2994203CC048118CC71E9612E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-83877318538.43746" } }, "PreviousTxnID": "DB57296ADDC1B28924426F94EAD261E0243E92567DDEC56B1DF0325E04A3E6C2", "PreviousTxnLgrSeq": 68991226 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rnfuLKZgLhpw1UJorfJH8G1ukEyA7JLf3n", "RootIndex": "772B12EA93B0BCF688AE7516C76D212E7FD4065D8BC680102FA909316843D98A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EB025BF53D9B8A26C779AE8693C8E827369E61607EC77FF241D777B2646055D6" } }, { "ModifiedNode": { "FinalFields": { "Account": "rpq6ooRTok73Udp4D58zesfDJeYM1t5s8C", "Balance": "4815342050", "Flags": 0, "OwnerCount": 228, "Sequence": 66716947 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EB040A78B87C8DD2DF67A2879A11B1D70D18DF566FE54D1B2F719ED983E905A7", "PreviousFields": { "Balance": "3983798333", "OwnerCount": 230 }, "PreviousTxnID": "C893A1222FB9AF98EB9CC4309D0AF51A07E081A34C29AD79BBFEBE8915283B75", "PreviousTxnLgrSeq": 69031708 } }, { "DeletedNode": { "FinalFields": { "Account": "raANwNJ9aqncwhGT1Eh9mksqTvAMm3WZG3", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "A078CBC46521928CBCF55F58A3DEA79AD487A82C2B773C5ED67EDC1DF29EBCC2", "PreviousTxnLgrSeq": 69037718, "Sequence": 67554132, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EB0F25085D9CA664EDC8CA43A609280A5C7E0502AA7691AB5A36250A19BBE0D8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4500000000" }, "TakerPays": "22500000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rGT6ze5CuPEUzsk92YnLLkEqjv6qqhabrF", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520775933743D7C6", "BookNode": "0", "Flags": 0, "OwnerNode": "178", "PreviousTxnID": "8624687F0AFBDF1774622312CF9EFC8491E103675C84C664D38FBD41D389A7D9", "PreviousTxnLgrSeq": 69060957, "Sequence": 82846, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EB52A4927B6FA3749DEE3A13D406DD93392243EB223CF00FC110FEEFCD5975DC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1669675636008047e-4" }, "TakerPays": "350565094" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rEpLbrik9r6KpjVbWXA71SVQnMCkY8BEUK", "Balance": "1331938933", "Flags": 0, "OwnerCount": 27, "Sequence": 66709824 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EB59B50749CD9424FE5D1DFD8FDCAA7B5E619601EBD3E70F2E438C0D0015883F", "PreviousFields": { "Balance": "932983170", "OwnerCount": 29 }, "PreviousTxnID": "60E9C8F079DD91F86DD104AA0C120C55D9A71804397461B263591282595A6BB8", "PreviousTxnLgrSeq": 69038193 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rMp5QYssUeXAdg9G7b6XQPCEb1uHCjZ7XQ", "value": "1000000000000000e-1" }, "HighNode": "7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ed1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "EB9AD722FAA25A38486888B4CF0F579F56AAD8D77BA7BE9D25644AE6C217114B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-12123735000" } }, "PreviousTxnID": "A76AA6CCCA8EE6AF7B2507C333FADF4022C102C2474B1C8596702EE3976969FA", "PreviousTxnLgrSeq": 68899338 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGKv1gHL1ANheQZ4GMCikKaGYoKJC6o6wG", "Balance": "1205971084", "Flags": 0, "OwnerCount": 230, "Sequence": 66128613 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EBAA6D4600A1032634CC0528166699E358F18BADC9B9A250DD9793DA4B782A2C", "PreviousFields": { "Balance": "1137127649", "OwnerCount": 232 }, "PreviousTxnID": "2C4D04FBA0E4253A2B296B9F8EC9CB03428BBA382113A0B2A1B316758A97932E", "PreviousTxnLgrSeq": 69064079 } }, { "ModifiedNode": { "FinalFields": { "Account": "raBj3rXVSVdcA66ge5mMyS1iWzMFSyxmB6", "Balance": "4469338589", "Flags": 0, "OwnerCount": 148, "Sequence": 66229774 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EBB166066ACFC5AA4B682E8991BAC4D4C581D990FBCD155E1E46374618AFBD7A", "PreviousFields": { "Balance": "4262161344", "OwnerCount": 149 }, "PreviousTxnID": "751591231D7FC2498BCFECC98BB9C953D8DD953216397FCDA02D13BFADB2F61C", "PreviousTxnLgrSeq": 69062290 } }, { "ModifiedNode": { "FinalFields": { "Account": "ratboJVqeveTRpRvto7G811syRvhgQXBtB", "Balance": "112000000", "Flags": 0, "OwnerCount": 51, "Sequence": 67114056 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EBBD56F7E5F12EF70EF8F6CC5DB3BDC52D55BBE1A1B08CC62E463AE18545FAD3", "PreviousFields": { "Balance": "469126481054", "Sequence": 67114055 }, "PreviousTxnID": "56CF52A58604568870E2FE9CF1F12B0F62005E1B40A9402960F6710B9EB71477", "PreviousTxnLgrSeq": 69064067 } }, { "DeletedNode": { "FinalFields": { "Account": "rC4M78e2ktZz8QwB5SUSEeeeSi5rcnxrJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF526340000", "BookNode": "0", "Flags": 131072, "OwnerNode": "f", "PreviousTxnID": "DF5DC2A8664DC1DF3F9E8877565DE2D43FADA1A5E7A591E80A8AF46A29D2499A", "PreviousTxnLgrSeq": 68918617, "Sequence": 66527130, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EC03ED9BFADAFEF5B9F3760D3C552553EEB3B9E0FD5E387F43F0CA9A56F27A22", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7000000000" }, "TakerPays": "56000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rNCESwgSpY1pUyhQGzGd7T38zXXzxUCLLj", "Balance": "418304475", "Flags": 0, "OwnerCount": 8, "Sequence": 68401371 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EC1758CC807887F7773E3B21C2A141BC9439551C90089015D19CACE211A04A6B", "PreviousFields": { "Balance": "29999970", "OwnerCount": 9 }, "PreviousTxnID": "57E70C36009EE1DFC23A6C0A65E9AFE86FD4B84F75E8AAA03448C4B230C316A1", "PreviousTxnLgrSeq": 69047568 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rDjnNyWymW4pUzukDcEtmySixuXR4RLsKV", "RootIndex": "0789197202F766CEB7B1164E9C3D1944318F2BFC048EC133C1FC04A6C9A59B63" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EC2C9F892DC48902D7FEC1415A9C6B74A96A6148FC7F866442461B826C52F9F4" } }, { "DeletedNode": { "FinalFields": { "Account": "rfc7iQscNnWECTgwfRg4T6MExyVTCiTWTV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CAF5ED5C", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "095A785424E6676E800521F24A4B4AE5D02B0CA72A2518804661180CA0D09557", "PreviousTxnLgrSeq": 68856320, "Sequence": 66755367, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EC39FB6C7E0DD42D954E3C6B27596AFA336FEDD2152E594E1429AB326C8FDC9B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "93431878392" }, "TakerPays": "8408869055" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rUV7WQGpjkPJNuAuggRRFLYVoaegHzuxoy", "RootIndex": "CE46CA8CEC46D9F3C4334B96FFC38EBD5878CE754BBF0F82BD31D17CA58A40A1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EC44D6870AE4ED302B0D998EE99D23E53AB0E0EF8A27B4AA5A04C0EE64FDDD8D" } }, { "DeletedNode": { "FinalFields": { "Account": "rfh8snfXUdwqc25vUfwxJxJnVM1n1dJvoh", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937B61AE4", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "24E320046566AB66F79C4779E636EC131698633D53A1BCAE3BA956625690FBF1", "PreviousTxnLgrSeq": 68995200, "Sequence": 67755960, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EC6CC9D2F880E4ECE107CD903DBFDD3B5E8FEC579FEB140899EAF8420F085268", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "55366778430.76617" }, "TakerPays": "276833892" } } }, { "DeletedNode": { "FinalFields": { "Account": "r4izcArVy7Ccp9j1VEwnbso67AsYhaEjdJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520FFCB9E04E6616", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "1670A9DFEEBD425B3A667DF423CCAB36FF2C7CCAD6564E9D214B6A197C63AE6E", "PreviousTxnLgrSeq": 68995527, "Sequence": 66579208, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EC9A3308402659C2C422459E01029F69E1F1BF6DB6CEBCF1476DF88CE9738DC7", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "11500000000" }, "TakerPays": "51749999" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rBhRwsAuVFJ3VY37rd5R9YzqrCRjVXQggX", "Balance": "704181227", "Flags": 0, "OwnerCount": 131, "Sequence": 66546632 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "ED18914290C0ACCAF96409E3B2F41A85B7874B6F60A929CABDEAF3E0DE02E69F", "PreviousFields": { "Balance": "669181227", "OwnerCount": 132 }, "PreviousTxnID": "A082DE9BE69E9F42D7CB26E75639298DB028F19FC94A6864343CE182086024EC", "PreviousTxnLgrSeq": 69057321 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "0", "Owner": "rDzBkddc4AVrm4RWuXJRhH1rrkDpKNFwTg", "RootIndex": "ED463693B2074F9DA3E0D4AF394565D7167C1BFD49666719E6988BC45F80EBBB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "ED463693B2074F9DA3E0D4AF394565D7167C1BFD49666719E6988BC45F80EBBB" } }, { "DeletedNode": { "FinalFields": { "Account": "rHv2LE2MKKrQ83NMbQ2vv1DUDjByosxthL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F42479CCF8C22", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "86FDC905412D5E006B19310C69C6A28C1D0C9D83BD77174287F5208A5005423A", "PreviousTxnLgrSeq": 68985130, "Sequence": 68499492, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "52894159590.99591" }, "TakerPays": "227180415" }, "LedgerEntryType": "Offer", "LedgerIndex": "ED5A76E73EFA7B88221E45DCB55E4AFAFF90B505DE7A0485B48C3BE9C5F645A9" } }, { "ModifiedNode": { "FinalFields": { "Account": "rN57KF6tqiqqc4agjC6nvZeQzovWYEPDCT", "Balance": "812882086", "Flags": 0, "OwnerCount": 161, "Sequence": 66619161 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EDAC1403D38F67D6F82891180ED537680895AB2C23888088B5422D901F6E2DCE", "PreviousFields": { "Balance": "733352086", "OwnerCount": 162 }, "PreviousTxnID": "253C5D04BD3732A3E98EF26689A104B9450110C638CA3ACE0E0AEF2267F1D89B", "PreviousTxnLgrSeq": 69056061 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLzgqyEetWAoARj7XcpWExwpRCvYq5zHi6", "Balance": "110663040", "Flags": 0, "OwnerCount": 27, "Sequence": 67630747 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EDAD78A572890826ED0968BB1076673895AAB7592F5F3B844AFD7BA325359492", "PreviousFields": { "Balance": "68769067", "OwnerCount": 28 }, "PreviousTxnID": "448A0EE217C0D2584FE3F2CDE6726C8F5AC36E5EF3DDBCB358AB2A168FCA6566", "PreviousTxnLgrSeq": 69016019 } }, { "DeletedNode": { "FinalFields": { "Account": "rwhKYMZGMmf9zeLdZWq4rs31DQeaxn65R2", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211688627664000", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "BFACA7FF16F076DDE4C1E3EC7537CF6F92C34409F37CFBE038992C3F78FFEF42", "PreviousTxnLgrSeq": 68968563, "Sequence": 67373539, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EDB474EC9928DC6EB4B919853CDE5E01C0B0CFD8252745BB6E2B41CDD9DE5500", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4500000000" }, "TakerPays": "22050000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rN8rfe7hU4CCkmEiDkj9fg8pgBp5fa8p2j", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6AF509180800", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "CB2A08CE3FD3A3D656F97228EF972A63059335AD19958510478AD1BE2D4CE3C8", "PreviousTxnLgrSeq": 68871643, "Sequence": 65991553, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EE002DA507CB49CC0FFF5654CFFA29063F2F22528F2EF6656A90D90678530676", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "30000000000" }, "TakerPays": "239967000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rMp5QYssUeXAdg9G7b6XQPCEb1uHCjZ7XQ", "RootIndex": "F26B16EFD1DE964AA42AF2688529D63366E9DCB512BC900517542A1B92B928F8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EE3D34AED5FB455BBDEC166F933BB1945F0A85D655A8C394D432FDEC7A3B7EB1" } }, { "DeletedNode": { "FinalFields": { "Account": "rDWTpV5omq7rh5Wnro4noWmWFEFcRx17ma", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207759337CCA14F", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "7212637992CC348035D0758E69888B7823ECD26263740EDB527126999B9395B6", "PreviousTxnLgrSeq": 69055718, "Sequence": 68039697, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EE535CBCD03E81E7E8A8680EB7E69E289D1F3AAA4EA80D6BB0F1199CF5AB7D3C", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1259233038597572e-4" }, "TakerPays": "264388568" } } }, { "DeletedNode": { "FinalFields": { "Account": "rLVaKJ42tddq3vJAFiPibubt2HbBpTHuX7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36530C6F3B4043F786", "BookNode": "0", "Flags": 131072, "OwnerNode": "d", "PreviousTxnID": "ED5AF5C0127A90356E1F5700EA4A0707C15C01C3FD9669344023BCB49153464F", "PreviousTxnLgrSeq": 67982175, "Sequence": 66153109, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EE5A1BC248C62FE879CD48123E0663A435AA5D721C63E5DE7B18B74284831D4D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7843214474" }, "TakerPays": "274512506" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rGx2XhvjUKvW7Wkz67b5ERSKhb7m4fZmrj", "Balance": "29128941793", "Flags": 0, "MessageKey": "02000000000000000000000000D877FEC5D6670F9BBFD5F648C5BD18A6F70BBE93", "OwnerCount": 138, "Sequence": 57919756 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EE6E921432FC357CD35AAF4768EBA85DD5B87005DCDC7FEC1ED8AF592C64C49A", "PreviousFields": { "Balance": "28768941793", "OwnerCount": 139 }, "PreviousTxnID": "40DA8EFB751ED5217825936700F5B7C20BE4DB43E895BA8F9F80004795F353F3", "PreviousTxnLgrSeq": 69059831 } }, { "DeletedNode": { "FinalFields": { "Account": "rGRyfRcJ7cSYSu6rw5VpNJReEZt9Gzy9a7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72848FC10", "BookNode": "0", "Flags": 0, "OwnerNode": "1", "PreviousTxnID": "065C99BCB3212BCFA0FE5D045A16ADC88FE42398BF3270536770830105CF0F8F", "PreviousTxnLgrSeq": 68944915, "Sequence": 67157704, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EEAE1F802DA41F2C06BE1838D906C24ED5DCA9BB82C1B37D36F82852829CE58E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4696497466.5" }, "TakerPays": "30527233" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "d", "IndexPrevious": "b", "Owner": "razceqmpdpjLd5o52i1GiaZJhmB8SEbfCa", "RootIndex": "96587E178090E46CE3C330C5FAA7424BD6415AE2A0F93B1137608016E9EF3245" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EEAE835B6F897CAF230BC5585B096BC4DDA0F9E60D1F9D411D3CA032E0261ECD" } }, { "ModifiedNode": { "FinalFields": { "Account": "rnG1UdmTmDXHaQp1vVp4jsH5ZhJKp97TjH", "Balance": "295043145", "Flags": 0, "OwnerCount": 58, "Sequence": 67436927 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EED9389328F3940B08A67F18A175289120C179A7698DE2AF30D26BE6CB379CB3", "PreviousFields": { "Balance": "205043145", "OwnerCount": 59 }, "PreviousTxnID": "18F3523710A12AB25FECFA61198230B207E82FAC4F339704D9E38C617B2744AF", "PreviousTxnLgrSeq": 69048816 } }, { "ModifiedNode": { "FinalFields": { "Account": "rEJjxWqDiG1H1PDqXXnwdHjxAUTnVGmrDS", "Balance": "504498616", "Flags": 0, "OwnerCount": 123, "Sequence": 66994189 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "EF2090878DB52A088ECAC05313D8C3DF6F3D4413E97C1498BD45BEB2CB33AD19", "PreviousFields": { "Balance": "464215125", "OwnerCount": 124 }, "PreviousTxnID": "F07D5CBA537E520F4056548D76294CB88DBFAB29FF7D06A92ABB3C684354BA77", "PreviousTxnLgrSeq": 69063857 } }, { "DeletedNode": { "FinalFields": { "Account": "rGx2XhvjUKvW7Wkz67b5ERSKhb7m4fZmrj", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365310EAED59C99E7A", "BookNode": "0", "Flags": 0, "OwnerNode": "4", "PreviousTxnID": "FBF584B8DDB5DDE345CCF1E5E91E32DBA50E288B8D5491226B98C9BE06C7D79E", "PreviousTxnLgrSeq": 68152992, "Sequence": 57919740, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EF25E4D3839817FEB662202AA9B51826C9D1DE4915FBC3D2970327D83B570BAB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7560000000" }, "TakerPays": "360000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r4F6d9gkY5JPEkDEmUwcLgGX2NSV6o7DyR", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D1081D26", "BookNode": "0", "Flags": 131072, "OwnerNode": "f", "PreviousTxnID": "762D5B9D2381D87664B4B7B33C5673873811C0464C2D19108E07DA26DDD0DCA7", "PreviousTxnLgrSeq": 68898929, "Sequence": 67033114, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EF47BE7863C33092A727FFB898AEAEB0BC8ED83C01B67647CC6B39FB113D209A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "11776464340" }, "TakerPays": "88323482" } } }, { "DeletedNode": { "FinalFields": { "Account": "raDJvZX8gbRfZ3hUWimZPdVcDRzsZQdhmr", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521D9B1F5D20D555", "BookNode": "0", "Flags": 0, "OwnerNode": "15", "PreviousTxnID": "2371117B6C8311CDC6489D724DBEAE30BBEC4DF200CD7AD64814D855191B8A97", "PreviousTxnLgrSeq": 68940596, "Sequence": 63094144, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EF67859E3061F67152D776B2C3DD52D8DD785364E31DD67A54C12AA11D0F2475", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12000000000" }, "TakerPays": "100000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "a", "IndexPrevious": "8", "Owner": "rJeogNqHS69HkL8Le6zZoezAhGwpU4WPsc", "RootIndex": "D4067DA76B6281392EA725986DB115B74AD2AC493C4209ECAD673437A7ECF4E8" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EFADE49401D67814B429B67CA795B10D10EFBEB12827E576CB03B88723087D91" } }, { "DeletedNode": { "FinalFields": { "Account": "rwCzLwdFp6DLPMfZRTUN67UB79XbbmYt2o", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E277C2048D010", "BookNode": "0", "Expiration": 726960596, "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "E95F036F8D81184ADFD35D0EC65F8C979F3034705A1B3DC2582B2FC83DC5F90C", "PreviousTxnLgrSeq": 68993708, "Sequence": 67150570, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "EFBFF91C3DC1357CF26A17C369AAB100B62A70AD052A703E405B66C75568C3A9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1255000000000000e-4" }, "TakerPays": "500000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rwBDva3asfNrXQeBmnkV3xbMnw7xi5A3dE", "RootIndex": "4F5D20D768F152B9A7D0444D2147BF8B092D22F6D2CBAB97858DF00512679F5F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EFFAE2662AA213CCADCBB41F1B0045E4B03A2834FD787579D7CA8F492C29839B" } }, { "ModifiedNode": { "FinalFields": { "Account": "rDsyrKqgbAuWUu1fmJx84Vgm3X4H53rztM", "Balance": "1320572671", "Flags": 0, "OwnerCount": 19, "Sequence": 67693693 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F00C606821F7CD2ABEF3FAC9C8EF69C827A7863AF0F298DCA7877E7E1A5414C0", "PreviousFields": { "Balance": "152674192", "OwnerCount": 20 }, "PreviousTxnID": "6CDAE8B9F35E9F61EE13768A0C33DB52C04D4D0E9EC5867F3F444B55BA0F8DCB", "PreviousTxnLgrSeq": 69038993 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rMd7wG9Hzf5YXsqZ48kNRFLARM49oydLry", "RootIndex": "F01D831E5929BB9B1BDE5B219B842309E5AB88FFAD6444768CC553195EBDC2CF" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F01D831E5929BB9B1BDE5B219B842309E5AB88FFAD6444768CC553195EBDC2CF" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ee9", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rabF4KeYghT7RWidbkeS75fLWQzrDixwpH", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F03A4A94663DA9E6550FEA337C7F197C057FA15FCE663C33F55720F70107C6E9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "51954206753.96992" } }, "PreviousTxnID": "E947AC76AE8E5D01C2D677E4B3D10E21C77CB8FA38AB46601370B5DB0959974E", "PreviousTxnLgrSeq": 68994795 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "17", "Owner": "r3PWgfzUbXKYDoLD6p49JqiabjfQCj14AZ", "RootIndex": "91311DD5E22ED89862DA57132F1044EFAC4073DA17BB86BF87ECD9E8EA12207A" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F05163D86F978387BA87CAD6D4883CE5E31D7241FEB1CBED566D8156DFA1D205" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rsqgHRLHgg1vHi8iA1w1J9amuuUAjwEzwa", "RootIndex": "F0689228E94BABEDEB9D2CC8BFBEA77A169D0C56E101AEA4176CDD3C9710ECAB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F0689228E94BABEDEB9D2CC8BFBEA77A169D0C56E101AEA4176CDD3C9710ECAB" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-6.5345" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rQJFPnXAsdHvbAL8JeEYNu5FQDW4mHL5MK", "value": "9999844278063880e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "de9" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F069D687B2BC722F64FFBA0CA2DF92F94477EDFDEF57A86905B8CBCBC474C89A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-8976620852420000e-4" } }, "PreviousTxnID": "C08E88ABF33CD6450C3F5BAB3493F933E2E1BAADF1FC02DC884F16EE7AB31A08", "PreviousTxnLgrSeq": 68106003 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eaf", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3oDrfWCL4zZRGoUNRd8Ywu9PJWFZXc764", "value": "1000000000000000e-1" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F0EF1188AE8A27C55E18CCF352745264B45908587853DCD09E61B6DFCEE3FAC0", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1075747597561109e-3" } }, "PreviousTxnID": "AAA6B3F4E712515016025AE646CF58387C2C4CA3BF519B0DA94A7183144284F0", "PreviousTxnLgrSeq": 69038149 } }, { "DeletedNode": { "FinalFields": { "Account": "r43hxvGDZqmKmLugK8oJ32r2f4rxuvUntb", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365208E1BC9BF04000", "BookNode": "0", "Expiration": 727141464, "Flags": 0, "OwnerNode": "21", "PreviousTxnID": "CB6FFF0B9D6ECECBD939A20C8417B54328288FF46D2852F9944AF277E6E11CE6", "PreviousTxnLgrSeq": 69039669, "Sequence": 59395086, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F0FF01F5593EECA1D75E45E1A313D091464C019A38FB5F03C5619EFACF7DBCAC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4000000000" }, "TakerPays": "10000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rBzk3TdhfdbidCHeKWfmQ5dy9AuAtGbXeY", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365316542C978F166B", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "4AC9452409F80E6F049D9843708D86D88EEBD7E2104F8464758B3A488023C6FA", "PreviousTxnLgrSeq": 68849287, "Sequence": 67686264, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F11540523963232BE186161585FA0D57D688E2368D4CE247B1A78230F0A7AABC", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "6505349450" }, "TakerPays": "408861212" } } }, { "DeletedNode": { "FinalFields": { "Account": "rpf1wWbuPjafvAgD4f9vtX88Ut9qurPRHS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521057ACF5F78000", "BookNode": "0", "Flags": 131072, "OwnerNode": "9", "PreviousTxnID": "BDA73511034A0D229F84468149F0943F605CB7A88251BCB3643207C8E830F375", "PreviousTxnLgrSeq": 68973656, "Sequence": 66662286, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F12212E980C856EC4F16FED488A16B785EDE64958762B3E3E899F7C38D72638D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1300000000000000e-4" }, "TakerPays": "598000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rH5oQKTQ5VaFHC8MFN912377XMG5EH3vTB", "RootIndex": "59586C41D128239E26E8F6A1487B0156E67DF0858F55A36F2990C23746830A62" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F12DB581676234E5A5D643AC5CB490970E5AE727F95EC6E0BD04392FE695FC9A" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10857969598" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "777", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rD3MRnTt6tvvtt7o7F5p8B49toAUWnoLmu", "value": "1000000000000000e-4" }, "LowNode": "5" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F136BD807F24BEE1DE0211DB86A2EACC51C750C993A1817EEDA8D7DD1DBCC6C9", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "24857969598" } }, "PreviousTxnID": "2BAAAC68E2A59B461E4AED59BA528BE51CABDCC1FA72F503CC26D7C8979833A0", "PreviousTxnLgrSeq": 68754160 } }, { "DeletedNode": { "FinalFields": { "Account": "rwSQqB6yNHd2tiXUhJ2wkULgq3dFua1r41", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531FF973CA4247F9", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "22638EC4CD71DE65078C12357D4D67FD1511F5CC3E7D89136442367B4BE39C03", "PreviousTxnLgrSeq": 68807250, "Sequence": 66556530, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F1442C60EEC0CCFE73928F8A0A1D3161A69F610E4E152B95FC550D8E6258C96B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "700739087" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rN8rfe7hU4CCkmEiDkj9fg8pgBp5fa8p2j", "Balance": "1888057384", "Flags": 0, "OwnerCount": 196, "Sequence": 65991642 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F17C56C3632380A4EA2B1DAE944661682DAFD7E64DFE19C36EABA89D87EF3A90", "PreviousFields": { "Balance": "848090384", "OwnerCount": 198 }, "PreviousTxnID": "866161997777B3700454D72E4907FC105CB03C7A5DBBE280431A6D22AECDC7A1", "PreviousTxnLgrSeq": 69059752 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-8782581081197079e-3" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rLkhJhEaChEegzryMAeps63ghhG1yXzifL", "value": "1000000000000000e-4" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e0f" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F1AE76F162AE1A6906BA98BD1C2971CEB8D289A7FD064AC879E3320361F3F45D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1020562404587793e-2" } }, "PreviousTxnID": "D9E39997C9D11617132FB59D670289A433D89CC67FDD4AE6481865B4B3E7FA77", "PreviousTxnLgrSeq": 68991405 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rE2zUmDvH8vtBsGPBTdLSJW8rDLNVy8g4V", "RootIndex": "F1CBCF1693AEAA3424011E6D73262EA0B66B980EDF9AE0AFBD7706A35CE35F68" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F1CBCF1693AEAA3424011E6D73262EA0B66B980EDF9AE0AFBD7706A35CE35F68" } }, { "DeletedNode": { "FinalFields": { "Account": "rMrFWesXLbeMANpexJkZdYYtCwhqot4x6B", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72E0D7063", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "2DB3BD0A3799BEE060F6579084BA2233F3A891BD228A11F2346D585D654639DA", "PreviousTxnLgrSeq": 68901474, "Sequence": 67169655, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F1D6EC9F7F641F8186B616759B2C6C8F093A236ED019D4A72D6D248FBB0346BB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "15571979732" }, "TakerPays": "101217868" } } }, { "DeletedNode": { "FinalFields": { "Account": "rwCDD5H9MDWdQE4y15hzipJWXjZpoZWPgL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D3D0BFE9", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "EA12A86D815F4DDBF93D41187A216B4126A9FBCF1F40082B211C5BCCB49A961C", "PreviousTxnLgrSeq": 68898952, "Sequence": 66575876, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F227FAFBF6D1A815C6D776661866C3C7CA089C9DE246FB8B4CA57EEC1B2D2859", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000000000003e-4" }, "TakerPays": "750000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rzNhpkxVUc86h9CJyB1qssHYenzkVpyn7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521717B72CB9CC92", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "5F7EBBA59AAA45F4B82148A83F76224E2DEC23D25BEAEAC8120917856A7827A8", "PreviousTxnLgrSeq": 68901488, "Sequence": 66818317, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "24177849067.5" }, "TakerPays": "157156018" }, "LedgerEntryType": "Offer", "LedgerIndex": "F25641EA39A100751C233432738DB32381A84D82246554DE25545779BBB44FD0" } }, { "DeletedNode": { "FinalFields": { "Account": "rC4M78e2ktZz8QwB5SUSEeeeSi5rcnxrJ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522219547C0A0C49", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "C52DA239505C446F94913D77E992F43E4DBCC7F85671E76D59EE6A8CC5C71FB1", "PreviousTxnLgrSeq": 68153356, "Sequence": 66526943, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F27249A39B5B5A0C436BF5439317E1EE46A2ACDFB2712BE64FC51EFFE524BDE9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7000000000" }, "TakerPays": "67185999" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rBCS9nAyaFuM8LDym5gJGRxEqmmH9mRhxW", "Balance": "9490274531", "Flags": 0, "OwnerCount": 93, "Sequence": 66613840 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F27DAD190F4EF0F00798851837BF58B0B45C42CCD398BBD2D6D9890747BCE253", "PreviousFields": { "Balance": "210274531", "OwnerCount": 94 }, "PreviousTxnID": "B0AB2693CCD9B31AF91C6AB09EDF5591265478FD54BF5B01F35EC6A9CAC1FCB0", "PreviousTxnLgrSeq": 69063564 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "f", "IndexPrevious": "d", "Owner": "rQHveZ6yCKwNSGRiu4QnTSjJbLRfgBr72p", "RootIndex": "016BB46A51876D79719BD124CB169E9E012536A44B336026E4BB4F4BD4FDA0DA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F291940BB052C9D9B671455979D82F55992E14AA40C3C6C75414AFF2A1557D8E" } }, { "DeletedNode": { "FinalFields": { "Account": "rUg2bKuyZzQLPopT6uNZK7w4zvJHLB5LV", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521BACF6B65EDA6D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "95A4F6782EF08E30784EEFE1F7591A2D87A62DA0C641CCB522733A1CD8FDD7C5", "PreviousTxnLgrSeq": 68898557, "Sequence": 67761569, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F2A608D1806EE6C912D35DA677574779FE69F1A447D46414774337B4651190FE", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "60652861" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rJxQUBBc7qcHrGcjrb265KwXeZrVio5Eri", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "252" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F2BAAF8D446B4E283225CE8FDBFB213E392F649B3F31B54AAAC09515CA5C2624", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1399241951779892e-4" } }, "PreviousTxnID": "17B3ED1BADFC542255B86B68D3A9C51D4D10CD91010AADD0450C8CE6B862BE21", "PreviousTxnLgrSeq": 69050912 } }, { "ModifiedNode": { "FinalFields": { "Account": "rhPNtVD6tfZTrxvebJaquV8Bh5F2Kh8cMa", "Balance": "238057738", "Flags": 0, "OwnerCount": 92, "Sequence": 67342444 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F2D39F1D25073978D69D6C60833E9D21072EC159FEBD4CBCC7D5CBF882F6FA79", "PreviousFields": { "Balance": "207732470", "OwnerCount": 93 }, "PreviousTxnID": "0D391F30E541586FAB6AB0D748E467C0AE2055804481FD86C95F5063571302BE", "PreviousTxnLgrSeq": 69060889 } }, { "DeletedNode": { "FinalFields": { "Account": "rKBwHqR3S55CpYFoX1bucD2PFMgSjPAFvu", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652135CBF0206A000", "BookNode": "0", "Flags": 131072, "OwnerNode": "b", "PreviousTxnID": "C436302CD376344AECBA7DEC9FEF60EAAF1E929C3EE3BC71F6FD75ECB8E1485A", "PreviousTxnLgrSeq": 68920816, "Sequence": 66598743, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F2F609800586A798A92B40E1BBF0CAA22B486E09B404362280AE28C4F9DBC1CD", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "35000000000" }, "TakerPays": "190750000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rKso7KmktCCYBfe79sNAFnfKffvansBBRz", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36531550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "B6E15C2F6618E26C37C22680912B728E663B261F2255529A319E299FEC052295", "PreviousTxnLgrSeq": 68908186, "Sequence": 67328570, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7000000000" }, "TakerPays": "420000000" }, "LedgerEntryType": "Offer", "LedgerIndex": "F3179F4250E80AB8211B8EAB685D653AACA66D27AB47999588F8E46266E43EAB" } }, { "ModifiedNode": { "FinalFields": { "Account": "rHWCQnGF4sc9MqnA8GpZC9L8SZmzv5zkMp", "Balance": "500047171", "Flags": 0, "OwnerCount": 178, "Sequence": 67003962 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F329AAC795EF6F971DED3E89C0C49217EED935A1FA573C5D8CA142D21150E861", "PreviousFields": { "Balance": "460338623", "OwnerCount": 179 }, "PreviousTxnID": "277A0EE276F9FC2E8E073C8085F5AE30C6F1D6C8D27555183E3DEE174B94E27B", "PreviousTxnLgrSeq": 69063186 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "b", "Owner": "rBLh3SrV1ALEEfJiHKYiaSxoRxG7R9SuEh", "RootIndex": "145A63BA58D07F394744D411C0B65EE08EEC04A8FF6F6CCC0A75C60C1D219DF3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F32A408377A6E3EADBF6380D4710F659ADA9AD548CA39E88D82C36E57F9BFEE0" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-64310875416.80327" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rNvk1SNQZhU6fsyMuaTeLucyw5x5uxfxQy", "value": "9999999999999999e-1" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "7be" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F35853E525E7F6033A659F91D5CD34137FF7767966FBC14ABBAC3AECDD213D2B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1398051114528393e-4" } }, "PreviousTxnID": "CD8B2215F1EAD3C790737A632696B9EC00E6D81F137A21EEF6D116031F43D130", "PreviousTxnLgrSeq": 69034903 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5453047829.19538" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "b41", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raLEGx6aGsVshgdT3oGzM2nyv8oAruC8Wf", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F359D345CA29E9D6D06CF6A11F938F7E575FEDC70F3519AEECEBB470714E2FB1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10453047829.19538" } }, "PreviousTxnID": "0E9E993D9F3BFDAB358AFAB36921020AD4385266A9975F09552D8184312DCCF7", "PreviousTxnLgrSeq": 68935064 } }, { "DeletedNode": { "FinalFields": { "Account": "r3PYAn9d1DTFzJ9kuvFnhudgwsVZ6pm5hT", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652105738C73FC200", "BookNode": "0", "Flags": 131072, "OwnerNode": "6", "PreviousTxnID": "8988DF9AFA041B5FB778C9BC089A646AEB566B6DA1AAA5B731EA52F0720E88CD", "PreviousTxnLgrSeq": 68996931, "Sequence": 67442313, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4000000000000000e-4" }, "TakerPays": "1839800400" }, "LedgerEntryType": "Offer", "LedgerIndex": "F35AAFB219ABFA8C3D850C0407A15CDAC6DEB58871C508A6AD01A2F1B51B7099" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rGBdiULuYdTBGGX2JWzmjRXscUacAHsm3i", "RootIndex": "E6806997B4E76B4BEC40379FB5AA94551C8A3B90106E7DD563F87DC67E347A38" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F39032E4A53CE29BEE68E1F591BD406E001A599D166AC18A65C2B6C33EE9CECB" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "b", "IndexPrevious": "9", "Owner": "r9TcqWtCqzG7xnhLcYPUbKsV691wNPzMMw", "RootIndex": "5DC485ABC7A2E6B34161FBB30CB1334DB53EF761F249FAA4D3013B790D6B9D4D" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F3971BA7B677FBC86DDDECBC2E6138273C504614334ACAD856CDE13EC1166560" } }, { "DeletedNode": { "FinalFields": { "Account": "r9dqJno4U42mpcjAymrrUS11q5rAWazGfP", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521661D10E08E7BB", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "248CDB74469B40BE06594BA3065D0D639500093730880A2159C15DEC15E64C05", "PreviousTxnLgrSeq": 68899602, "Sequence": 67682925, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F3AEF7D6E076B6FCD49AF0C234C455458F423ED4C65BB8D322F1DBB78F98BD7A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "52708748895.93176" }, "TakerPays": "332065118" } } }, { "DeletedNode": { "FinalFields": { "Account": "rpq5MrSjiQgMj3Rk8Kvf1L3Gzh4xp1CUdZ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653054B25A8B72000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "9A437E9D01068D6B872F840A9F9EC0ED1EDD1B752A66251A9FCB6947D35CDD31", "PreviousTxnLgrSeq": 68152278, "Sequence": 67528140, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F40B9879ADA5C9AB3A621CDC472DF438AEC8568349EAA18463343C7487B8F037", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "74500000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rB4BbxNJ7Hv7i63EwPcEZjuP8YHizdkkvd", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520F581B8A061067", "BookNode": "0", "Flags": 0, "OwnerNode": "1", "PreviousTxnID": "666E8716A9CE63E74288A7736D7D7322BC624427F5C5B0CE2F91CC91C15DFA68", "PreviousTxnLgrSeq": 68983927, "Sequence": 67744143, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F4240923952AFA90D12A8968EC86E4A410276E488BAE5B526BA873200316F20E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4232027829.6021" }, "TakerPays": "18278128" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rKycDDwvkpARRr8dccx6mTKBBr6W1GkGjK", "RootIndex": "9D2A4AB4EF36737A95B07DD172152D11A82FA2E7562C01788D8CE003B357F4A5" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F432805CB11B0311F9C5240F63639CF4E5E7A7BC5EF0E1CF2CDEE085771FF59D" } }, { "DeletedNode": { "FinalFields": { "Account": "rsydLXavwRHUq9TWdwYqPpYViuFBNuYQYs", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365323589012483C32", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "C221F5F563BB11B31419C1AF4FCD11FE45C12E697F076B29F45EA631579FEC7B", "PreviousTxnLgrSeq": 68885765, "Sequence": 1329, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F43DD8730F6A6E7055828CF6180A96C2686A96C5F0DB23E71642FD7119ED1B71", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7785989866" }, "TakerPays": "774628131" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "983", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rUg2bKuyZzQLPopT6uNZK7w4zvJHLB5LV", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F4441AD8F7532ACA1CE43F24F926D0322C20258AD1F1EE637C4E2CA3F2669AC1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "37195B8A10194BF064517BC0AB984E7B3672EED2402ACEBC7758E34229B8A6D4", "PreviousTxnLgrSeq": 67991918 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e73", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rpcz3Nun3FcRunaTBPPZ6VK8De82hr2DzG", "value": "9999610698224585e-1" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F45B1E41749FBBD8E710CC5384A8D65C7CB2AFA48077E84DB597C2C5351EBD95", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "8000000000" } }, "PreviousTxnID": "B960D6BCBB3A98F44F07DF440927653CC3A4F92C9E042E51AC13EF2EB999CDE9", "PreviousTxnLgrSeq": 68898578 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGRyfRcJ7cSYSu6rw5VpNJReEZt9Gzy9a7", "Balance": "335568921", "Flags": 0, "OwnerCount": 50, "Sequence": 67157756 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F4BF9FD325791D50731691ABF04E755C7F3B9565E09F8579B77F280D3788DBEE", "PreviousFields": { "Balance": "193849008", "OwnerCount": 54 }, "PreviousTxnID": "34756C16724DD305B580255336EFD1CBC5696C602774446C29CB4619BE0E9A71", "PreviousTxnLgrSeq": 69035985 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rBVRpQjDpGqLs588dtthtZhrPJCcM4w3TS", "RootIndex": "EDCD2C67AAA207787207EDD455638F4224091709F9614F298B970719FCC14597" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F4C0D8A19A216E4774A8E898A9B409BE048C701590A6363291D5655D9F8A952D" } }, { "DeletedNode": { "FinalFields": { "Account": "r5EHmNdKr1SRiA1DrtKBo18DYRrE5ncHF", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210B2A0061DD26D", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "DD89102FB2AB3E4D9763A20F13C09EA1694964772B13EE5D6FD241215BB4A37A", "PreviousTxnLgrSeq": 68964002, "Sequence": 67580210, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F4F995D86437FF3F6E6CBBE0E58DBBAE90386603BB669CFE64C73942ADEF1683", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "80431878392" }, "TakerPays": "378029828" } } }, { "DeletedNode": { "FinalFields": { "Account": "r3ccw1UCPwayXhAVmy6oC4yQTSPeG71bx", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520E35FA931A0000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "B34E1234D251125152363210428861C3926A5321C397815AA14BDA90974F5CCE", "PreviousTxnLgrSeq": 68995011, "Sequence": 66775157, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F515F414F3E9DE110C240A432A6426183C956D81496A6B46BD356501E1871E89", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "20000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rnZhNn5hFGdBk7UTE5hLjBZFNrYGSs1wHQ", "Balance": "364503993", "Flags": 0, "OwnerCount": 83, "Sequence": 66615478 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F524F2951FFFAEF2901946E1077CE81FF733EB9D7F4564CC59ACB8C4273FD97D", "PreviousFields": { "Balance": "308841952", "OwnerCount": 84 }, "PreviousTxnID": "67FEBBF10E4DFAFB95AE44F8762E027466984991868974518DE2D4287AE551FB", "PreviousTxnLgrSeq": 69042899 } }, { "DeletedNode": { "FinalFields": { "Account": "rBLh3SrV1ALEEfJiHKYiaSxoRxG7R9SuEh", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207D0E36A35FBBC", "BookNode": "0", "Flags": 131072, "OwnerNode": "c", "PreviousTxnID": "04C0BE719D12AEABF9996B5D7E549B66E4179E2E43C4C607831681D522136020", "PreviousTxnLgrSeq": 69054140, "Sequence": 66512350, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F532A413B7EF975099B6C822924DB23987FFE37EE3B7F72144CD04902909D322", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "93431878392" }, "TakerPays": "205550132" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "2d7", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnZhNn5hFGdBk7UTE5hLjBZFNrYGSs1wHQ", "value": "1000000000000000" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F54C9DE65D128D62CC9192AD52DD520D44143E7A4954A6E0F14DBFE99D33823D", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "7785989866" } }, "PreviousTxnID": "522FEC1CE42DE6642CE32A0329096A5DCA8F3086BC55193557DBFEBA7B2BE6D4", "PreviousTxnLgrSeq": 67951463 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rwEP45SodNayAXhoEQeJmXaky391SxGRZz", "RootIndex": "F567F88C26768854A347B854EE17868F3E164FB862E133884D02D557D96D98CD" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F567F88C26768854A347B854EE17868F3E164FB862E133884D02D557D96D98CD" } }, { "DeletedNode": { "FinalFields": { "Account": "rsRPHwDyRv18j1hT1wkQEHCvtCpgKYYyGc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C6BF524BB86EA", "BookNode": "0", "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "2A76D4FC5433065CC1B9911753D078A8D588545585A12487322AF73D1FC50D82", "PreviousTxnLgrSeq": 68944574, "Sequence": 58601480, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F57EDF450C5243F6ABBD0CA7E7491C50BC1F067FE3AF36CA48FF66439D54DF70", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20265449937.5" }, "TakerPays": "162123599" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rh4Vn8BNfpDZecwkh39GQvYJ7b7osZfML2", "Balance": "25057459457", "Flags": 0, "MessageKey": "0200000000000000000000000042278FAD44C545A47E6A6C2E77EAAB7F260C855E", "OwnerCount": 100, "Sequence": 55498223 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F59269BB631ABDEF6AC0A4B996D9C39A1CD637DFBDDF4099F272BC6FC27E766A", "PreviousFields": { "OwnerCount": 101 }, "PreviousTxnID": "3A705AEA1E3687F62CE5F896BD07DDA2CC86F2BDA6F0ED1BA7088D700AA09262", "PreviousTxnLgrSeq": 69060060 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "adb", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "r3pJZNxQwVRMyeohSyy5C9ZCJzvRWVAXLg", "value": "1000000000000000e-4" }, "LowNode": "1" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F5CAEECA1E181F0136146CA35CBC33EFAC7CDB93AA6EF307762E95744A488933", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "66967083434.5683" } }, "PreviousTxnID": "5CD654D09A776E82CF497EF8087098C7596DE4E260C528B3DE4E154F055E2938", "PreviousTxnLgrSeq": 68954106 } }, { "DeletedNode": { "FinalFields": { "Account": "rsj4wU1Tv93ES5J3AZrWVcgaKXV9b5aNKc", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521A88E80EADB86C", "BookNode": "0", "Flags": 0, "OwnerNode": "d", "PreviousTxnID": "CB550AA10C1BE50DBD6994F996835C5D901A3684D4047807DCF98E8EABF52196", "PreviousTxnLgrSeq": 68898484, "Sequence": 66179841, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F5D60BA680A75353CD61145184936E8604C21B02AB518DBDC5AE2027F01E49E0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "53555555652.476" }, "TakerPays": "400000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r9N61ut2QDA3sThiawsRjj3A7gvz4ZGM2L", "RootIndex": "F5FCD1BC682C2BA34809D1E5BA6E21692B0FD2CD31A08421987F179D2D4905AC" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F5FCD1BC682C2BA34809D1E5BA6E21692B0FD2CD31A08421987F179D2D4905AC" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5723195665851508e-4" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "a21", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rwCzLwdFp6DLPMfZRTUN67UB79XbbmYt2o", "value": "9999999999999993e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F600D3B5F6AD1B4CB3346B5AB587F3E076A55DA032C48FD1254D388333835073", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "8028195965851508e-4" } }, "PreviousTxnID": "165AC428DFDBFCFC0A814C518B40503B4BC4B07A0548096DA1C198ABC5A7BD97", "PreviousTxnLgrSeq": 69035473 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rH5oQKTQ5VaFHC8MFN912377XMG5EH3vTB", "value": "1000000000000000e-1" }, "HighNode": "5", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e7d" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F6292A52D5F02D9950D89C19C443819E05DBF73D06816821CC4E88EF4CF38A9E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7785989866" } }, "PreviousTxnID": "28C9A91C491E3A5E84D257F67EA2969375F95338924604A782694D1324B4366B", "PreviousTxnLgrSeq": 68745630 } }, { "DeletedNode": { "FinalFields": { "Account": "rBCcUJicoai17VVsbUKJ7BGqDa7dQ3549N", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365219EF4FB2D2A8F4", "BookNode": "0", "Flags": 0, "OwnerNode": "1", "PreviousTxnID": "EFC50CAD32296AB6E5E2EE653992F5344D36B1313D0381BF203D254608443B94", "PreviousTxnLgrSeq": 68967493, "Sequence": 60850415, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F62B916F71B255F86DBD24C2A6C103128B6E68A34E80112697F70B4768667025", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "34686189866" }, "TakerPays": "253209186" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rwVWFLRidfTH7DD1LgcTg4gunGXVos3zVD", "RootIndex": "12A63094B61A6C1AB3D6326624A2827F97C9A75D5F11DBFED3FA3A595F310611" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F63C7A117B298913A3A641DEAC89A2DBC1C24D0549E8107A4D387F349CA46525" } }, { "DeletedNode": { "FinalFields": { "Account": "rwyhjUuEiNmgv4AG4ptie2eAWqN4kfraxv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "3BC41019C222C40FF7B4BF5BFA98D0F29FA7181457421B9A680446B474A77962", "PreviousTxnLgrSeq": 68991542, "Sequence": 67423784, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F654D8BCA7E17F8A7DB191F7655E2367E6357C3FD85DEDEE793256FA63E3CADF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "60000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rExSJvWnn93G5NfnzZ3YKuPgpQnr8wBsrE", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365207759337C8BFBA", "BookNode": "0", "Flags": 0, "OwnerNode": "d2", "PreviousTxnID": "DE23A942478463D9F47282674131BD9DA86C8244B5C7F2EF205B52088874A6BD", "PreviousTxnLgrSeq": 69059548, "Sequence": 63810432, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F666E7CE70A261D239961075E896D97F3E5F122D203318A27E206065647CA66B", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "9525623957766000e-4" }, "TakerPays": "2000000000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rpVr26FVpK1G1u8vyMwsKnpXn7iycrYise", "Balance": "144606234", "Flags": 0, "OwnerCount": 49, "Sequence": 68152830 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F66C8D7B04EF1614D498324E205091B995126B8243D4909C6FA1207954613444", "PreviousFields": { "Balance": "122207970", "OwnerCount": 50 }, "PreviousTxnID": "AA76C092B0A4EC07645C1CAE8BBB89BF23E2FC04854AE31825D73506F3FF4303", "PreviousTxnLgrSeq": 69025620 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6209396600" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "d9e", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDAsQhHKNqg4ueKpzLPYbR7bzmjDve6dVF", "value": "9999999997869990e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F6A3E3661971389D676A325B7B0F6B00A32C9A4709CDD26D89B8DEA2E8B421EE", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "12418793200" } }, "PreviousTxnID": "5E98A57553FCB3B3B19CE10C8836332D3DCABEB2C3C42478C0405B9C16F53DAE", "PreviousTxnLgrSeq": 68792573 } }, { "DeletedNode": { "FinalFields": { "Account": "rM4cm11HCu1riLq9BwfzciDUZqfX2Phq52", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365206F86DB90CA000", "BookNode": "0", "Flags": 131072, "OwnerNode": "11", "PreviousTxnID": "5547D43A6B7C010BFCAC2829529065681624031B6E2EC416213572DD7B81BF93", "PreviousTxnLgrSeq": 69063905, "Sequence": 67380535, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F6B97396712DD7B1201AC8B03931CB267C360BC2CECA70501AEE4F9E93D6AA24", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "9810000" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rNYRNtrFPumPwsB7zbi3VjZLg6WLWBUJvy", "Balance": "650641355", "Flags": 0, "OwnerCount": 42, "Sequence": 67349223 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F6D6EEEA78ED627A45935CA6CB8D6487D1C6FD7D9E833C343948C066FD88EF7A", "PreviousFields": { "Balance": "396997402", "OwnerCount": 43 }, "PreviousTxnID": "F31E1F4670964522440F5F3E1A4A6E3E902E440E1F06B3461B31E8ED3529DBAC", "PreviousTxnLgrSeq": 69061981 } }, { "DeletedNode": { "FinalFields": { "Account": "rMGXtc2jn88JResx6QRWgyxUvdrXRwmZ7J", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520B036EFEB9B289", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "4D2DF5F52510E75F80F548291F82233717D47B41215398B59F97BB5EE3214209", "PreviousTxnLgrSeq": 69026936, "Sequence": 66730948, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F6F6DBAE1044E890B15DBAF8A8007D21F2332ED8F3256224978BC30262308E1E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "45870196148.47777" }, "TakerPays": "142197608" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rGJ5He1dXx78w8pGB7zHH9K7dWd9pF8p39", "value": "9999610698224570e-1" }, "HighNode": "2", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "ece" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F6F83DAB5598C5027A188CA2DC0C7F2760FD094286BEED2FB7E2BD400B5E45C6", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-22000000000" } }, "PreviousTxnID": "04BCA32619265B6D9B71C3E3DA6071708497537E45667534C9E5282ECA7DAFCE", "PreviousTxnLgrSeq": 68876375 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "6e", "IndexPrevious": "6c", "Owner": "r3VQGy3EVus3nKJz33du7UqZDMFEnVmHLL", "RootIndex": "A98675C13BD32C8572AE6D528C4523442B9A3581AA406007D2023DD9CCC2AFF6" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F74CF2789D0C2ED4148A90A6E13EB176F601F87DC3B80E412FE6DFF2A4791981" } }, { "DeletedNode": { "FinalFields": { "Account": "rsdrgJ5xtkPpnWfJeeshHZLWmQEMS3cFzQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3653038D7EA4C68000", "BookNode": "0", "Expiration": 722871486, "Flags": 131072, "OwnerNode": "4", "PreviousTxnID": "D99734E4329673B880E2376A7D483790F5AB1724E9CCBE543EC575BFE611200C", "PreviousTxnLgrSeq": 67972990, "Sequence": 67219921, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F76CBE8AAED197A9E152D3682C35F5AF3145D089313FCA4A22366BF625C3C14D", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "22000000000" }, "TakerPays": "220000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHjXAcTNUKjFvrozV8KizwezuEk9tnhqwF", "RootIndex": "F77D4217703505508D8AF80B1D37DCBC8A501C7FB82E80468BBDC1A591C90E58" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F77D4217703505508D8AF80B1D37DCBC8A501C7FB82E80468BBDC1A591C90E58" } }, { "ModifiedNode": { "FinalFields": { "Account": "rDYvWkTQaaoWiWYo2r5fKuqEoop8WK9crS", "Balance": "2193253250", "Flags": 0, "OwnerCount": 231, "Sequence": 60413128 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F78807BC06F8E712CA31F4820AABD94661F7B04604C5D25E592C070023C5ACF4", "PreviousFields": { "Balance": "1713253250", "OwnerCount": 232 }, "PreviousTxnID": "81A190FA085CB2CE9377B707852BF370BF619F3D524FC2F944664EE10BBD46F0", "PreviousTxnLgrSeq": 69063595 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "1", "Owner": "rnGd8yRrg47RWDTtRdVRDJvjXHtqgL5yNW", "RootIndex": "845085A3B75429A5A7E088B33A7688D408133AEFE07C378D8205406310ADFCBA" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F80F53ACCB8E9AB7D1B9585962143598944E87754CCFB2D150302DF0F4DF03F5" } }, { "DeletedNode": { "FinalFields": { "Account": "rnGd8yRrg47RWDTtRdVRDJvjXHtqgL5yNW", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521E32B478974000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "124B6C279D45870882A93A99A9F028FBE70606D45E471395DBB497A573006AFC", "PreviousTxnLgrSeq": 68900271, "Sequence": 67584484, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F81246E71867D9DACDE44D9B3EFCED4CD7E2EBAE6AC4EE4ABE8D4A66450324EB", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "30000000000" }, "TakerPays": "255000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rfJ35bQofteAs3h4aCA77V5wSHRsHChttf", "RootIndex": "9698DF9BF541AAF2F6FF7A544B60D0F592043CF2085DBCDE51D8FC9A4D3B39EB" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F82AE9C61BD193F9C195A05D8DDD55005C5DE8854E9AE415F74322BB5D6F66F2" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "2", "Owner": "rCeRsWQYvZrkA8s3jZYXBYw7gXH7cbVNF", "RootIndex": "EEF9E6B53A499188E997BF7D533D7507207F8DE2D687DE9FE8740031D6518B1B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F835C8D7C3850C920295C571BC513F3CC57D28896C37B251566C6482CC799256" } }, { "DeletedNode": { "FinalFields": { "Account": "rf4YQSYpheUvWxMx5rmSgr4vdyvu7tWUp4", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365215D04C24D3FA3B", "BookNode": "0", "Flags": 131072, "OwnerNode": "a", "PreviousTxnID": "65B1DF3CCA20E2D8E99FC4C46341D16CE8A0442D3CB0B61B1963DE601529FAAA", "PreviousTxnLgrSeq": 68995240, "Sequence": 66770778, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F84FDD020FFAE5EBFCDCD1109CEB08A16C99C3B6C2FD13B31EE3FA5A8286C4C1", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "23547689385.47486" }, "TakerPays": "144582812" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "56f", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnG1UdmTmDXHaQp1vVp4jsH5ZhJKp97TjH", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "F8502F20C92CE631C9967FEC3CCD1A574695A7565D28CA05DFF25287A7E387DC", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "15000000000" } }, "PreviousTxnID": "808483DE8C02BB3297A29B4BECB913C6DC226D403087E9AFA8A0E7947CD351A3", "PreviousTxnLgrSeq": 68991025 } }, { "DeletedNode": { "FinalFields": { "Account": "rUdhzvzWjHpSjP6CGksiit3bdgGLV5DXZv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365305EBD312A02AAA", "BookNode": "0", "Flags": 0, "OwnerNode": "2", "PreviousTxnID": "0C052BCF7423A99C981A9A6703B0C5F54FB2BC758C552ACE72255C8F160746E0", "PreviousTxnLgrSeq": 68907396, "Sequence": 67546187, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F8A1CDB3D755543CB5B2C000ED083A0DE6F22925699A72B3049687F741F2D83F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12000000000" }, "TakerPays": "200000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "r31dxSZgmArpDtwoLPAftYtU8bHauuxwA5", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521AA535D23BEE1C", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "D37A3E731538898F22A78F15F3350AB71A6E506269AE7C20067F4D68F5F8D162", "PreviousTxnLgrSeq": 68942825, "Sequence": 68766342, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F8E25F37E83DF4D84EF911F89F5B36D5A3F5A05A860F207FDFA206873AF1C3D2", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "4145452681.330667" }, "TakerPays": "31090895" } } }, { "DeletedNode": { "FinalFields": { "Account": "rLHtFMi1ohYj9RynpB1wRfEAaLtjXkdRH9", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520AA87BEE2B596E", "BookNode": "0", "Flags": 131072, "OwnerNode": "3", "PreviousTxnID": "76996946B7DED49FAF8FF86A7CC1F9AA5376F7175AF98CD4F72DBEB6DB3737F7", "PreviousTxnLgrSeq": 69039313, "Sequence": 67312577, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F910DF4AB04E11FD23C3926245FFD54B8921C404836842AAC5447D42476E94FF", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "44020340038.61044" }, "TakerPays": "132061020" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rL92EVWszBA1ZbZADyficMkRFVvpV15sEE", "Balance": "849368815", "Flags": 0, "OwnerCount": 161, "Sequence": 67153723 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F927645C4A950F930C396A1B07C46115A88C8B190C65AE5D153897AEAEF5E969", "PreviousFields": { "Balance": "628076741", "OwnerCount": 162 }, "PreviousTxnID": "11ECE292072C83EFDB2E7AAF807B9070EDE8AA4B8C62B68C14D845FF35860403", "PreviousTxnLgrSeq": 69061368 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rB3bSANCCKpiQa4aMd7b4vQZ3pMTh8UXZh", "RootIndex": "F983D0FC7AD794C525D6952D8E90BD3F03351AD0B34229FFA62BDC707A96BEF4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F983D0FC7AD794C525D6952D8E90BD3F03351AD0B34229FFA62BDC707A96BEF4" } }, { "ModifiedNode": { "FinalFields": { "Account": "rMBUa2qAaU6K8DRTyQsfmeRUtu6j7m8ovB", "Balance": "294982031", "Flags": 0, "OwnerCount": 21, "Sequence": 65872990 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F9A2EF1012F8C7F45875D501DAA95AFE16BEDC625109EEB62F81DA5398E3397B", "PreviousFields": { "Balance": "192396704", "OwnerCount": 22 }, "PreviousTxnID": "B1090CCD00EC86128E5F989DEBF5EEE4B02CDEB215B34A3A1FC90D7652628637", "PreviousTxnLgrSeq": 69036544 } }, { "ModifiedNode": { "FinalFields": { "Account": "r3Tj4vpfRp2r95SM97TwEFGCUZayDqKM4h", "Balance": "4165840697", "Flags": 0, "OwnerCount": 60, "Sequence": 66932237 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "F9C8242487AFC2761CD9687462E35A4AC0A2DF6C24A605FD77D2F4F26740BE34", "PreviousFields": { "OwnerCount": 61 }, "PreviousTxnID": "AAEA0A4056FEC5EF7E3E3BA7A765206B4D508AA41CB26338CA7E179C1BB327FD", "PreviousTxnLgrSeq": 69058206 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "6", "Owner": "rGQaGNPT8u7Wt1RoqJEhBgAPyc9ek5RfCL", "RootIndex": "7F01E74706516AC43C1C1D253E6887968B43326AE119A44CD7F7F2493FA1840C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "F9C93D018D546A296BAA834EDF3A86C6403DB454A1690C2BBD38A4D21EF8349D" } }, { "DeletedNode": { "FinalFields": { "Account": "rnfs5ayanPy2X7aQERUoayaokxjuH361V8", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365210EC8E43498D3E", "BookNode": "0", "Flags": 131072, "OwnerNode": "8", "PreviousTxnID": "967C43D35C91801601845D9F405A8426FF7010165E49C4B456489AC6B8EC9397", "PreviousTxnLgrSeq": 69011171, "Sequence": 66388635, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "F9F8FA918FE65477B5482BFDCE4BE0D49AE741EB3F2409880CEBD7A6D72E2482", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12595263790.2" }, "TakerPays": "60000000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "ecc", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rDWTpV5omq7rh5Wnro4noWmWFEFcRx17ma", "value": "1000000000000000e-1" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FA10184BA1FFD92A81F4DA1FEE3D81D1EECFA24350FBF3F0D77D0AF1625BEFB1", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1259233038597572e-4" } }, "PreviousTxnID": "CDF4417E7AF4E7185FA640BC72A1C1D197C654297E1F7D371C4C8DA8DA6E2440", "PreviousTxnLgrSeq": 69055526 } }, { "DeletedNode": { "FinalFields": { "Account": "r3pDCAfw2nB715iBJVMix9M8adFpHyfGRN", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652215C27BE70E000", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "38B021A2DA6CA2D069DA5888EFCE6643F80E789B92197300777D9E3B6DA89339", "PreviousTxnLgrSeq": 68914781, "Sequence": 68179413, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "FA1D6819A88FD3D6B284B77E764FD592FA6C057B0870EEA413F06DE6CCDA828E", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10000000000" }, "TakerPays": "93900000" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-21300841370.77" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rL92EVWszBA1ZbZADyficMkRFVvpV15sEE", "value": "1000000000000000" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FA9804A088D433B9F7F8CF6CBBACE2CFFD8EEFA2C4E3069867E19091A318F1F7", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-47335203046.15556" } }, "PreviousTxnID": "A0E7DBE8FC7987B06441A635280F610E38E864C44C7062F01DADAAC808F4A812", "PreviousTxnLgrSeq": 68898097 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "f0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "raUCqTN33sgqfhC1KVtqhCVX6iHkHAbUzp", "value": "1000000000000000" }, "LowNode": "4" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FAB38F899A1ED8BBD133B4747358DCBD041721EEE6E353894A77AFADED25926A", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2500000000000001e-4" } }, "PreviousTxnID": "C1CFE2BD8E01A493419EA51348130A8ABAD1A1DD56DA59FE20C387896BF3382E", "PreviousTxnLgrSeq": 69044440 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "45a", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rhxWqi4kQsADuck5wUsbXCcR2Pq44kbjZs", "value": "1000000000000000e-4" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FB0BE097392E4347B57866F498E41960B1CC4DD5C3C0E0904F1192D6E582E05F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "17796971607.14286" } }, "PreviousTxnID": "B989E7D61DEB7431C9B6A89F65C579FD96C5447DC4F8D97089667E2454E64DD5", "PreviousTxnLgrSeq": 69001414 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rsMSXmszPAgaY8sipuVq6gfdgUX3zpX6am", "RootIndex": "FB0C930D229EC7F7DCB63C8FA74ADF9E3BA084978D2CB5300D3485589DB917F1" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FB0C930D229EC7F7DCB63C8FA74ADF9E3BA084978D2CB5300D3485589DB917F1" } }, { "ModifiedNode": { "FinalFields": { "Account": "rfBJiQAjbS9cyzVGKRxbde3eV4Sr5xeC8u", "Balance": "286900818", "Flags": 0, "OwnerCount": 119, "Sequence": 67345415 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FB0D8180543E6E031B9EE2E6F96FB02316518F9736F779D99863684E2E864763", "PreviousFields": { "OwnerCount": 120 }, "PreviousTxnID": "0915BAD5049E1F483694D62C1582A57EE14093AA28987BB73A8BD47DD6FDAC26", "PreviousTxnLgrSeq": 69050243 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "4", "IndexPrevious": "2", "Owner": "rLxd1PUJT8xrZ59tUuPANfL87xkBXnkeKi", "RootIndex": "BB44AFCA9833E9B766CD8076DE58B4EB2B6ED2CF2F8F25BDF2EDDA3B3ECF1038" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FB0EDEAB097AEB8FD6F4A15B0C43DAC931395E987EE055AFF231B45D1400C6C9" } }, { "DeletedNode": { "FinalFields": { "Account": "rHLNuze17yJvjKohtAWTiakAUWFDp81Nbv", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521C1102149A6BD3", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "308856FA2B0CF30B0D16B9CB8ED3890CD6C491F0C2BE3EA444681A3D727E417A", "PreviousTxnLgrSeq": 68899136, "Sequence": 67600387, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "FB2A523E44C93FD3F04A422C304E26DD16A7000A00AC56D5E9246F8134AFB90F", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "20126032579.61783" }, "TakerPays": "158995657" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rKycDDwvkpARRr8dccx6mTKBBr6W1GkGjK", "Balance": "442524897", "Flags": 0, "OwnerCount": 140, "Sequence": 67284856 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FB53FFCCE7F02BE4E1A548A29DC04373B57B4E0C106D83A907C6EDD32F01C910", "PreviousFields": { "Balance": "302524897", "OwnerCount": 141 }, "PreviousTxnID": "B5AF9369A4BCBD399CAA37F0A4D5873BA5569F683B3842EF36CB3A39E61CB41F", "PreviousTxnLgrSeq": 68998332 } }, { "DeletedNode": { "FinalFields": { "Account": "rPpC3LrzwLjh2qU7XtQKFb4GCZyAUHz7Ss", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521FF973CAFA8000", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "812A8420FA3CE2737FFE4770DA14337557C35D7930E6AB60C5066C5B39B86192", "PreviousTxnLgrSeq": 68897530, "Sequence": 66167437, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "FB640E14EEF0211E0006379B604FFB8BD1CB99FC710282EC35195F7CB550B2D9", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7500000000" }, "TakerPays": "67500000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "18", "IndexPrevious": "16", "Owner": "rJQe5K8Fxn2ktEMbwaWibo9LEYKHjqDzzw", "RootIndex": "E6D34864018C9F13656A4C426A5F67B0F387E54B9025AB2739C3F3EE0C12F066" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FB98E4F980519D1E265C325C6D1AF292C33EFC7BEFCCED6E2A380AF8E0ACA7C5" } }, { "ModifiedNode": { "FinalFields": { "Account": "rpPjK8mxW6UndeHNvtgJPSaQjARCSXGCWY", "Balance": "1111461549", "EmailHash": "B81E734D9ABC73F492B03F3FA64738B9", "Flags": 0, "OwnerCount": 170, "Sequence": 65071380 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FBAC8261A04F8E7ACFA4E081A84271935B28A86838FBB80927A5E850846A3825", "PreviousFields": { "Balance": "1012749306", "OwnerCount": 171 }, "PreviousTxnID": "C808D2DF130FA1A53C11A290ADB274446EED42B7F199AD06C5D65FCEE2D78857", "PreviousTxnLgrSeq": 69060061 } }, { "DeletedNode": { "FinalFields": { "Account": "rLMqPYdzd1JeWQ6PsjxFt4jXMZo8vDgJrS", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36520CF7A7D9495220", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "7B703669F73830CC5366C1FD656EB9CDE8F754A654E735A2747283BB0F807B31", "PreviousTxnLgrSeq": 68998919, "Sequence": 67313185, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1000000008880000e-4" }, "TakerPays": "365000003" }, "LedgerEntryType": "Offer", "LedgerIndex": "FC18D942E1F13C3FFFC20D470675FBD2A49ABDBAC055DD8D851CAB6322E97C6A" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "12000000000" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "eac", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rnsZFHUhKJoPt3oh269oP51G4j5HDCNNBg", "value": "1000000000000000e-4" }, "LowNode": "3" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FC5FE637B5781BF48A7222D06B37CF677CB89BA0DF22E92179DE863DCD6F1E1B", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "15000000000" } }, "PreviousTxnID": "6BAE5C9F2A7E2D3E1C7000FFBD2D8279453DB7A0DFD4E238E2F1C60E7F69D6BF", "PreviousTxnLgrSeq": 69048674 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGQaGNPT8u7Wt1RoqJEhBgAPyc9ek5RfCL", "Balance": "363904169", "Flags": 0, "OwnerCount": 100, "Sequence": 65975098 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FC69CE7BFA0D8B533C48FB5B58644D913682A9E9C666165FFE4A53E759D57BA4", "PreviousFields": { "Balance": "277904169", "OwnerCount": 103 }, "PreviousTxnID": "7A97DA203132D6753FEE14F538A75B089B4E8A05F0DF4FE8AAD1B2AA7EBDF58A", "PreviousTxnLgrSeq": 69053423 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHmYEsWRfXC1YbFEKeJRWu9d7tdZ6x1od5", "Balance": "169119529", "Flags": 0, "OwnerCount": 11, "Sequence": 67441237 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FC992407B7BCA9BE5FB5C6270B6735C028AAEDBA3972B280021C6F3FCED70F42", "PreviousFields": { "Balance": "43119530", "OwnerCount": 12 }, "PreviousTxnID": "4E0110B7EEFC3AA8E55C664BB613D4342548340EFA0F0711005F4A66BD746CB3", "PreviousTxnLgrSeq": 68895634 } }, { "ModifiedNode": { "FinalFields": { "Account": "rMX68jd5whLXjPmrgvjHYKwZHcbQ3HiYuV", "Balance": "647232440", "Flags": 0, "OwnerCount": 42, "Sequence": 66684957 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FC9F433AACA96D46C68AE4837A0D3CEC7607DEA0B584A23B572980996EB47F79", "PreviousFields": { "Balance": "96232440", "OwnerCount": 43 }, "PreviousTxnID": "ED8E722A4012E3FA53F1D6E3D2021A16BE6ADE37484EE0F1F6BCD8E66A608BF7", "PreviousTxnLgrSeq": 69051654 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "6324477355801603e-2" }, "Flags": 1114112, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "HighNode": "e05", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "ratboJVqeveTRpRvto7G811syRvhgQXBtB", "value": "9999766418165218" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FCA52802504DD82C5B40C82272DDA405B8087E4BC4099622B7A9D507F169340F", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "2420649370899242e-2" } }, "PreviousTxnID": "C636EF65AFFE1010834C9BF83EE32454CC3F0F7BE67CAC8F4579AF75C8D340DE", "PreviousTxnLgrSeq": 69053288 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "16", "IndexPrevious": "14", "Owner": "rUXKKLv8kzkXLnNpe2aGq2PyRKuotFQEPi", "RootIndex": "B19D49639DBBD3E310A17B9630DFB53128EF44F922ED843151E4C05E264308B5" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FCD2346FEA42CDE1E87EABBC8FDC6601276337BBDEC988EAA17EFD1483E4542D" } }, { "ModifiedNode": { "FinalFields": { "Account": "rEjghQohwSDxD7d3NbTdrzRLGRRsGf7qwN", "Balance": "1928717580", "Flags": 0, "OwnerCount": 72, "Sequence": 67416512 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FCF23FC5CE45331A40A6ACB7030DEEBAC1B256EED3E16FA80D914765EFE8DEEE", "PreviousFields": { "Balance": "728717580", "OwnerCount": 73 }, "PreviousTxnID": "E47B8D82121F6404104BD95755104EA7FD5D14CBE9AB27BB814D82D5F046A754", "PreviousTxnLgrSeq": 69060091 } }, { "DeletedNode": { "FinalFields": { "Account": "rPKNCAkooJFM3LJ17zG3wJyxrjnNuHkkYh", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365311C37937B60F36", "BookNode": "0", "Flags": 131072, "OwnerNode": "5", "PreviousTxnID": "72996685291032F7ACDB7FE835F1BD43DD2B76850E252C52C30B73B80801FD65", "PreviousTxnLgrSeq": 68771159, "Sequence": 67345008, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "FD0897AD964BAC978D0B38CAD323F6CF61BBF9ABE67D6F6E45830DE036A455A5", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10785989866" }, "TakerPays": "539299493" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexPrevious": "4", "Owner": "rMDc7eVhCw5jjCXU5DGpn2tUV9D7aBBFLx", "RootIndex": "538D3642C1D106AB920C3EA40313AEBC4D95C5B870A96109ABC83FD42E359D7C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FD0C01BAE4D97B6BD52D8FC34A9C6CFB316952917AFDE801954A639C3C011596" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "0", "IndexPrevious": "0", "Owner": "rMGX6LAGxRUHd4g3yW1ukFhThgiCxMioX3", "RootIndex": "FD41EBB4B23FFA050A1B002B6D22992D1F0E8CBF979FE068AFADE43D6F2728D0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FD41EBB4B23FFA050A1B002B6D22992D1F0E8CBF979FE068AFADE43D6F2728D0" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r93dgTvDnFJsP2YGRiJvd89D1xLTmgR4fp", "RootIndex": "FD716AB3D63987A1C9C2B2F5ADE48809DF2F63DA9BBBA770FD9F102FFF3B7E7C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FD716AB3D63987A1C9C2B2F5ADE48809DF2F63DA9BBBA770FD9F102FFF3B7E7C" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rE9hwGp3avccRZY3PerkKL1cJ25z9X22QZ", "value": "1000000000000000e-4" }, "HighNode": "1", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "b38" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FDBD4E543F974A7D75E44AD00D05C0D56A015DBCD34A6856C239E2A67CFF6A8E", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-7071979732" } }, "PreviousTxnID": "F508E7760F1874784F4F2F921E829F082E7744120ED863CDCC78ADD7D9718772", "PreviousTxnLgrSeq": 68239815 } }, { "ModifiedNode": { "FinalFields": { "Account": "rQJFPnXAsdHvbAL8JeEYNu5FQDW4mHL5MK", "Balance": "67203992761", "Flags": 0, "OwnerCount": 10, "Sequence": 68012574 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FDDA0592269D15BD67FB374FB718381666BC03E35D7C9C38DE5B8ACD87D253F7", "PreviousFields": { "Balance": "31999970", "OwnerCount": 11 }, "PreviousTxnID": "33B848527F013D46E84431A863B6CFE38AC5E846949C5A8E20995EB312F7D2DC", "PreviousTxnLgrSeq": 68637577 } }, { "ModifiedNode": { "FinalFields": { "Account": "rJDQRE86NN3S8bhRYMZK2cWwdGd7nV7zBc", "Balance": "569765131", "Flags": 0, "OwnerCount": 56, "Sequence": 66611037 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FDF17955CFD34B7F3D355352991D5B2E5F6D4B0BA3A4D8A006630402445C606A", "PreviousFields": { "OwnerCount": 57 }, "PreviousTxnID": "20F11AB01FAF404EE4723FE922C990D4518AE30B460AA0A4EDEDB5F19B0B7D40", "PreviousTxnLgrSeq": 69051865 } }, { "ModifiedNode": { "FinalFields": { "Account": "rPEfUi18WaHNarXbyX5UCcVACd1ZZhxAig", "Balance": "351117639", "Flags": 0, "OwnerCount": 74, "Sequence": 67880207 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FE0B804317E643378028A4D13391C33DBD72CFBCE6BC4A689227DF603A41A5CD", "PreviousFields": { "Balance": "281117639", "OwnerCount": 75 }, "PreviousTxnID": "EDFB89E9ED922344319DC57E6DCC5689A41A32CF2F5203CCD590EB5F2C91AED9", "PreviousTxnLgrSeq": 69045014 } }, { "DeletedNode": { "FinalFields": { "Account": "rMBUa2qAaU6K8DRTyQsfmeRUtu6j7m8ovB", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36522386F26FB27747", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "D41F4DA95169F9C985B81018AFEA4176D380B540F9E61F822188D0DFE625639F", "PreviousTxnLgrSeq": 68897816, "Sequence": 65872968, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "FE1E29601915536D492BBBC93D4C44EE27992BD2EA23DD83ACA8F960C728A533", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "10258532700.97713" }, "TakerPays": "102585327" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "8", "IndexPrevious": "6", "Owner": "rMq6uX75yyCP9KjWCxYghLf9xsr3rQCbJv", "RootIndex": "3F6991DA82A0ADDF447AF90B0B4E3FD9AC1F3B79F4786CE20157084B6C95FBFE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FE4BCED0AF70053D6BE921F44A99CB6A14268FA95FE18E0BB71A36DD59E189EA" } }, { "DeletedNode": { "FinalFields": { "Account": "raLEGx6aGsVshgdT3oGzM2nyv8oAruC8Wf", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B365211C37937E08000", "BookNode": "0", "Flags": 131072, "OwnerNode": "1", "PreviousTxnID": "DF919F768F106C9587EA958F9A28E26BA512FA677344E0E72BA695EDF0A76011", "PreviousTxnLgrSeq": 69006298, "Sequence": 67515272, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "FE559DDA11ECD85EF39420FF12317237AB4A2E40947B9163D4BBD4DB05E93949", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5000000000" }, "TakerPays": "25000000" } } }, { "DeletedNode": { "FinalFields": { "Account": "rsSog5gEY6GuTeCP4TAgdK7HkUHiSNxZqL", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521CE2440FEE14D0", "BookNode": "0", "Flags": 0, "OwnerNode": "2", "PreviousTxnID": "2021E43A1B40609762AFE0E9509DC5E938754D2B34C26257144A92787F543159", "PreviousTxnLgrSeq": 68898828, "Sequence": 64558117, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "FE69B3DD5ABE6594215AFFBF8C401068A15B0A67C244158619A3E4779D5558D8", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "7011000000" }, "TakerPays": "57000000" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "3", "IndexPrevious": "1", "Owner": "rGJ5He1dXx78w8pGB7zHH9K7dWd9pF8p39", "RootIndex": "0CAADCB94F5B620D79AE79E43431CE4FCAB7101989DCB63C3663426C9C796CF4" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FE6E000E277A5FEE6E833FCCD65E72EF89C81BB7D5667B2F027E024D7A31B12F" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r48QoxLkkqiwjzhposyFj61op7AtvR5aLq", "RootIndex": "FE6F561DC598A340CA32BDC0CB235546A149B7DE54118ED4EB622E199F3B4964" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FE6F561DC598A340CA32BDC0CB235546A149B7DE54118ED4EB622E199F3B4964" } }, { "ModifiedNode": { "FinalFields": { "Account": "rNvk1SNQZhU6fsyMuaTeLucyw5x5uxfxQy", "Balance": "371031123", "Flags": 0, "OwnerCount": 27, "Sequence": 67175633 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FE78F790EDF140D76F9C8C52B7DBBD9ABC220BF84D2CAD20FF65A750AF87F769", "PreviousFields": { "Balance": "79380613", "OwnerCount": 33 }, "PreviousTxnID": "DB890F3039CF51D18A818EDD255ADC29F56A941ED4F920F51298BB0AB8067100", "PreviousTxnLgrSeq": 69062911 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "5", "IndexPrevious": "3", "Owner": "rGpBZrDTpimasSJEWV5hxH75LsivV5Hz4v", "RootIndex": "032FE28E618B9F91A37CDA10F7464FA39569FFA42F58B27BBFFE4F9C5C666A7B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FECB5AB6CDDCDF3FFEBDE9ECD3F85D72EEEBBD75D99772CE4EE56F2F755ED630" } }, { "DeletedNode": { "FinalFields": { "Account": "rBzk3TdhfdbidCHeKWfmQ5dy9AuAtGbXeY", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652110D930D1DAC0E", "BookNode": "0", "Flags": 131072, "OwnerNode": "2", "PreviousTxnID": "0640D4466AF934B06D90AA8B3018C5DCACE74DEB0BD2C1B2DC5F8FA28897555A", "PreviousTxnLgrSeq": 68975968, "Sequence": 67686292, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "FED2364707C620B1FED6D01F4596540487B7B0EE6E7408CB6331A08772376766", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "5300011848.321095" }, "TakerPays": "25440056" } } }, { "DeletedNode": { "FinalFields": { "Account": "rMp5QYssUeXAdg9G7b6XQPCEb1uHCjZ7XQ", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B36521550F7DCA70000", "BookNode": "0", "Flags": 131072, "OwnerNode": "7", "PreviousTxnID": "4D8A9D871D27C5A8607A93F3C994B814C3C5B883A64089F9183611FA257BA241", "PreviousTxnLgrSeq": 68899576, "Sequence": 67402899, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "FED7FDDEE251908F2940EE38280B56A5444A224B2091AAA2182CA8F8E42CB2D0", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "12123735000" }, "TakerPays": "72742410" } } }, { "DeletedNode": { "FinalFields": { "Account": "rNh79kZDsubi13bjTw64kBsKVWepnDT2J7", "BookDirectory": "BA7AE28C2DAFF1D49F3CEC7DE8733F8733B20C5DD5631B3652182890519E2186", "BookNode": "0", "Flags": 131072, "OwnerNode": "0", "PreviousTxnID": "FC72C6FB7660C95BAA33F693B3E9B5DDDC95D08DFF63C357DA97EC4A84286269", "PreviousTxnLgrSeq": 68899621, "Sequence": 68590611, "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "TakerPays": "0" }, "LedgerEntryType": "Offer", "LedgerIndex": "FEFEB61BCA1DA2D42FA38FB6DD1D96EC0A5E7D7F7F7FC79A45555B8884D7809A", "PreviousFields": { "TakerGets": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "1540952115.300518" }, "TakerPays": "10478474" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rLHtFMi1ohYj9RynpB1wRfEAaLtjXkdRH9", "Balance": "210058467", "Flags": 0, "OwnerCount": 32, "Sequence": 67312581 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FF4AFFB473AB191C9183EC39AC9AA08B40632FDC742EA63A46B2FF97BEA74171", "PreviousFields": { "Balance": "77997447", "OwnerCount": 33 }, "PreviousTxnID": "B87BB717D3530DCC75F6840787A4DC282A8E0DBFAB9B89D8AC3923C2921F651F", "PreviousTxnLgrSeq": 69060488 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "IndexNext": "1", "IndexPrevious": "1", "Owner": "r3pDCAfw2nB715iBJVMix9M8adFpHyfGRN", "RootIndex": "FF62A8BB05596318A12B832A18442A9073B9ED33C3790D3A1274C5AA06D09719" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FF62A8BB05596318A12B832A18442A9073B9ED33C3790D3A1274C5AA06D09719" } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rKSMqUYHyLXFtWPy1JugFqgds23UipQsGZ", "value": "1000000000000000e-1" }, "HighNode": "0", "LowLimit": { "currency": "5852534849420000000000000000000000000000", "issuer": "rN3EeRSxh9tLHAUDmL7Chh3vYYoUafAyyM", "value": "0" }, "LowNode": "e4a" }, "LedgerEntryType": "RippleState", "LedgerIndex": "FF9CC005E6D3C61507CBF2D9EAB01BBB9B8F628F775DBC8A500B7C98AB860727", "PreviousFields": { "Balance": { "currency": "5852534849420000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-20000000000" } }, "PreviousTxnID": "F4F32746DD86895901581BFCDE39C84F5EB62E1836FEBA314CE21AA9776D06FB", "PreviousTxnLgrSeq": 68990970 } }, { "ModifiedNode": { "FinalFields": { "Account": "rBdANmzNNUu3sSPo15TR5eY2s43hPH9yFG", "Balance": "48439131", "Flags": 0, "OwnerCount": 15, "RegularKey": "rhH4nF33W41CQvBQmJpKafvMsCm4MqHkGG", "Sequence": 67499230 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FFA44267E6E567139C8EEA12DE7904D0C3781DFF33E14CB56DE56311073AB663", "PreviousFields": { "OwnerCount": 16 }, "PreviousTxnID": "9846949DA2F230AC8CB96A5368EA775887C0BD496212441ADDBE81774E89142B", "PreviousTxnLgrSeq": 69058368 } }, { "ModifiedNode": { "FinalFields": { "Account": "rK4qafqqEtLjM1CRfcgY1H8Z4zGTRATkaV", "Balance": "661316266", "Flags": 0, "OwnerCount": 64, "Sequence": 66367897 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FFBA78307E7CC74B4AD94363B995A0D3D7FF645FBA2D62867E0000ACA0459CDD", "PreviousFields": { "Balance": "146099868", "OwnerCount": 65 }, "PreviousTxnID": "F38F9541AB57A2E7B943E984BEE98107E10B32DFA32E02B4A51ABCF7B9407988", "PreviousTxnLgrSeq": 69060904 } } ], "TransactionIndex": 61, "TransactionResult": "tesSUCCESS" }, "hash": "9BE43A0058FF4C358015CD89CE754AFEF201A6FF3D7E2C868B8C7E61DB00BD68", "ledger_index": 69064176, "date": "2022-01-17T02:30:40Z" } ================================================ FILE: src/containers/shared/components/Transaction/OfferCreate/test/mock_data/OfferCreateWithPermissionedDomainID.json ================================================ { "close_time_iso": "2025-07-15T22:40:03Z", "ctid": "C0000D9300000000", "hash": "4AB4B6EAD6DC2B0E2F33C23E2BE1817DABCECA699BE57B63899B76E62C1640A7", "ledger_hash": "BEC40D84F40B0083F84EC9C1EC7A53F0C92769AC3EABA9AC10916D4D9CA465F3", "ledger_index": 3475, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "Offer", "LedgerIndex": "0684AD6414D9CCEC55E18162F4124E6629AD53C8903CCC83E84BD74894A62E90", "NewFields": { "Account": "rD7ShWxq6xRYWDSDfzhKbfaJDerxd7nnds", "AdditionalBooks": [ { "Book": { "BookDirectory": "388D3A4BB364B8B11197652606B9399655A9A08161BE176B53038D7EA4C68000", "BookNode": "0" } } ], "BookDirectory": "AFC38A27663E8753D1FA2326C75B9D183856E30FC16F2D0253038D7EA4C68000", "DomainID": "4A4879496CFF23CA32242D50DA04DDB41F4561167276A62AF21899F83DF28812", "Flags": 262144, "Sequence": 3465, "TakerGets": "1000", "TakerPays": { "currency": "USD", "issuer": "rnybsH3BZKKCG7fwPzTeLtGejnq6UQyNCC", "value": "10" } } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "388D3A4BB364B8B11197652606B9399655A9A08161BE176B53038D7EA4C68000", "NewFields": { "ExchangeRate": "53038d7ea4c68000", "RootIndex": "388D3A4BB364B8B11197652606B9399655A9A08161BE176B53038D7EA4C68000", "TakerPaysCurrency": "0000000000000000000000005553440000000000", "TakerPaysIssuer": "36943628426726193A3EB3C628482B35A80FFE32" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rD7ShWxq6xRYWDSDfzhKbfaJDerxd7nnds", "Balance": "399999280", "Flags": 0, "OwnerCount": 3, "Sequence": 3466 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5CBB1A27E8A59B788FD46B2A32F31110EAE289CF601FAD08565817225D7AD1FE", "PreviousFields": { "Balance": "399999520", "OwnerCount": 2, "Sequence": 3465 }, "PreviousTxnID": "ABBDB5E274696F92DB268C467C87987F14229B5F8B765B8A4330A97C92822000", "PreviousTxnLgrSeq": 3471 } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "AFC38A27663E8753D1FA2326C75B9D183856E30FC16F2D0253038D7EA4C68000", "NewFields": { "DomainID": "4A4879496CFF23CA32242D50DA04DDB41F4561167276A62AF21899F83DF28812", "ExchangeRate": "53038d7ea4c68000", "RootIndex": "AFC38A27663E8753D1FA2326C75B9D183856E30FC16F2D0253038D7EA4C68000", "TakerPaysCurrency": "0000000000000000000000005553440000000000", "TakerPaysIssuer": "36943628426726193A3EB3C628482B35A80FFE32" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rD7ShWxq6xRYWDSDfzhKbfaJDerxd7nnds", "RootIndex": "EC4CED1E3336B3608A91A66606B83B10E48ABA96674BAE6B87ABB623067EF4E3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "EC4CED1E3336B3608A91A66606B83B10E48ABA96674BAE6B87ABB623067EF4E3", "PreviousTxnID": "ABBDB5E274696F92DB268C467C87987F14229B5F8B765B8A4330A97C92822000", "PreviousTxnLgrSeq": 3471 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rD7ShWxq6xRYWDSDfzhKbfaJDerxd7nnds", "DomainID": "4A4879496CFF23CA32242D50DA04DDB41F4561167276A62AF21899F83DF28812", "Fee": "240", "Flags": 1048576, "LastLedgerSequence": 3494, "Sequence": 3465, "SigningPubKey": "ED845F5404ACF32C68932F00DC15F4E072002DEF9EB8F4E56D6875B8CB56FE3A21", "TakerGets": "17588363594", "TakerPays": { "currency": "USD", "issuer": "rnybsH3BZKKCG7fwPzTeLtGejnq6UQyNCC", "value": "10" }, "TransactionType": "OfferCreate", "TxnSignature": "C6BA6FB0E3A9405F045CBF2FA6CA1064EBE1E3EE659FA518186EF15CB118D4EDBF898DD5F71A312AEE833C8AC1CFF2F92D1980B94E637696B147014651F38904", "ctid": "C0000D9300000000", "date": 805934403, "ledger_index": 3475 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/OracleDelete/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { OracleSet } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { t } = useTranslation() const { OracleDocumentID } = data.instructions return ( {OracleDocumentID} ) } ================================================ FILE: src/containers/shared/components/Transaction/OracleDelete/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import type { OracleDelete } from 'xrpl' import { TransactionTableDetailProps } from '../types' export const TableDetail = ({ instructions: tx, }: TransactionTableDetailProps) => { const { t } = useTranslation() return (
    {t('oracle_document_id')}: {tx.OracleDocumentID}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/OracleDelete/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const OracleDeleteTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.CANCEL, category: TransactionCategory.DEX, } ================================================ FILE: src/containers/shared/components/Transaction/OracleDelete/test/OracleDeleteSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import OracleDelete from './mock_data/OracleDelete.json' const renderComponent = createSimpleRenderFactory(Simple) describe('OracleDelete: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(OracleDelete) expectSimpleRowText(container, 'oracle-document-id', '1') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/OracleDelete/test/OracleDeleteTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import OracleDelete from './mock_data/OracleDelete.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('OracleDelete: TableDetail', () => { it('renders', () => { const { container, unmount } = renderComponent(OracleDelete) expect(container).toHaveTextContent('oracle_document_id: 1') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/OracleDelete/test/mock_data/OracleDelete.json ================================================ { "tx": { "Account": "rnuj2NkRxGbGpUK8u9hqEJA1zGRWyxHGvC", "Fee": "10", "Flags": 0, "LastLedgerSequence": 670056, "OracleDocumentID": 1, "Sequence": 670033, "SigningPubKey": "ED9376FE6E9063CB291C1031FC07A3B349D9FC45F2D71001B9CC7318F32C3A8F72", "TransactionType": "OracleDelete", "TxnSignature": "B1BD6A7AA9A0B3779D4EBE0652931D22792931B2F853C38E14BCFC2FD981FF3AFAA4921748B0321C8F0088180703425A8421606FCAFA028BF09F6E9A636DEC0D", "ctid": "C00A395600000002", "date": 768949530, "inLedger": 670038, "ledger_index": 670038 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rnuj2NkRxGbGpUK8u9hqEJA1zGRWyxHGvC", "Balance": "99999970", "Flags": 0, "OwnerCount": 0, "Sequence": 670034 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "05CC65869680974EF73B8C16A8D59DE7CE9C6B3B012328B11FCC28232B552EA6", "PreviousFields": { "Balance": "99999980", "OwnerCount": 1, "Sequence": 670033 }, "PreviousTxnID": "F5729FD72193989887718F13A28F2F8A33C03FD8299DC0C00F9952B28C8DA7EA", "PreviousTxnLgrSeq": 670036 } }, { "DeletedNode": { "FinalFields": { "AssetClass": "63757272656E6379", "Flags": 0, "LastUpdateTime": 1715634318, "Owner": "rnuj2NkRxGbGpUK8u9hqEJA1zGRWyxHGvC", "OwnerNode": "0", "PreviousTxnID": "F5729FD72193989887718F13A28F2F8A33C03FD8299DC0C00F9952B28C8DA7EA", "PreviousTxnLgrSeq": 670036, "PriceDataSeries": [ { "PriceData": { "AssetPrice": "67", "BaseAsset": "BTC", "QuoteAsset": "EUR", "Scale": 2 } }, { "PriceData": { "AssetPrice": "2e6", "BaseAsset": "XRP", "QuoteAsset": "USD", "Scale": 1 } } ], "Provider": "70726F7669646572" }, "LedgerEntryType": "Oracle", "LedgerIndex": "2E0AC1D6AFC11AD78E48BE575761F75C0326F0547EE178CBB5D67F61691E13E7" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rnuj2NkRxGbGpUK8u9hqEJA1zGRWyxHGvC", "RootIndex": "D745822C67049231E61684BF1F68DACFE522A3172FE4B635FE3966B218E90E2F" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D745822C67049231E61684BF1F68DACFE522A3172FE4B635FE3966B218E90E2F" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "DEBA9881129F2191619045FC07B294107342410BF4E447CEEB801BFC75CC2342", "ledger_index": 670038, "date": 768949530 } ================================================ FILE: src/containers/shared/components/Transaction/OracleSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { MILLIS_PER_SECOND } from '../../../../../rippled/lib/convertRippleDate' import { localizeDate } from '../../../utils' import { DATE_OPTIONS } from '../../../transactionUtils' import { useLanguage } from '../../../hooks' import Currency from '../../Currency' export const Simple: TransactionSimpleComponent = ({ data, }: TransactionSimpleProps) => { const { t } = useTranslation() const language = useLanguage() const { oracleDocumentID, provider, uri, lastUpdateTime, assetClass, priceDataSeries, } = data.instructions return ( <> {oracleDocumentID} {provider && ( {provider} )} {uri && ( {uri} )} {localizeDate( new Date(lastUpdateTime * MILLIS_PER_SECOND), language, DATE_OPTIONS, )} {assetClass && ( {assetClass} )} {priceDataSeries.map((priceDataObj) => (
    {priceDataObj.assetPrice ?? t('deleted')}
    /
    ))}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/OracleSet/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { useLanguage } from '../../../hooks' import { DATE_OPTIONS } from '../../../transactionUtils' import { localizeDate } from '../../../utils' import { MILLIS_PER_SECOND } from '../../../../../rippled/lib/convertRippleDate' import Currency from '../../Currency' export const TableDetail = ({ instructions: tx, }: TransactionTableDetailProps) => { const { t } = useTranslation() const language = useLanguage() return ( <>
    {t('oracle_document_id')}: {tx.oracleDocumentID}
    <> {tx.provider && ( <> {t('provider')}: {tx.provider} )} {tx.assetClass && ( <> {t('asset_class')}: {tx.assetClass} )} <> {t('last_update_time')}: {localizeDate( new Date(tx.lastUpdateTime * MILLIS_PER_SECOND), language, DATE_OPTIONS, )}
    {t('trading_pairs')}: {tx.priceDataSeries.map((priceDataObj, index) => ( <> <> {priceDataObj.assetPrice ?? t('deleted')} / {index < tx.priceDataSeries.length - 1 && ', '} ))}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/OracleSet/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' import { parser } from './parser' export const OracleSetTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.CREATE, category: TransactionCategory.DEX, parser, } ================================================ FILE: src/containers/shared/components/Transaction/OracleSet/parser.ts ================================================ import type { OracleSet } from 'xrpl' import { convertHexToString } from '../../../../../rippled/lib/utils' import { convertScaledPrice } from '../../../utils' export function parser(tx: OracleSet) { const priceDataSeries = tx.PriceDataSeries.map((priceDataObj) => ({ baseAsset: priceDataObj.PriceData.BaseAsset, quoteAsset: priceDataObj.PriceData.QuoteAsset, assetPrice: priceDataObj.PriceData.AssetPrice && priceDataObj.PriceData.Scale ? convertScaledPrice( priceDataObj.PriceData.AssetPrice, priceDataObj.PriceData.Scale, ) : undefined, })) return { oracleDocumentID: tx.OracleDocumentID, provider: convertHexToString(tx.Provider), uri: convertHexToString(tx.URI), lastUpdateTime: tx.LastUpdateTime, assetClass: convertHexToString(tx.AssetClass), priceDataSeries, } } ================================================ FILE: src/containers/shared/components/Transaction/OracleSet/test/ConvertScalePrice.test.ts ================================================ import { convertScaledPrice } from '../../../../utils' const numberToHex = (number: number | bigint) => number.toString(16) describe('convertScaledPrice', () => { describe('with hex string input (Price Oracles)', () => { it('should convert scaled hex price to decimal string', () => { expect(convertScaledPrice(numberToHex(5083), 4)).toEqual('0.5083') expect(convertScaledPrice(numberToHex(12), 3)).toEqual('0.012') expect(convertScaledPrice(numberToHex(12), 11)).toEqual('0.00000000012') expect(convertScaledPrice(numberToHex(1234567891234), 6)).toEqual( '1234567.891234', ) expect(convertScaledPrice(numberToHex(1000000000000), 0)).toEqual( '1000000000000', ) expect(convertScaledPrice(numberToHex(1234123412341234), 1)).toEqual( '123412341234123.4', ) expect( convertScaledPrice(numberToHex(12341234123412341234n), 12), ).toEqual('12341234.123412341234') // 2^54 expect(convertScaledPrice(numberToHex(18014398509481984), 10)).toEqual( '1801439.8509481984', ) }) it('should handle hex strings that look like decimal numbers', () => { // 256 in hex is "100", 4096 in hex is "1000" expect(convertScaledPrice('100', 0)).toEqual('256') expect(convertScaledPrice('1000', 0)).toEqual('4096') }) }) describe('with number input (MPT amounts)', () => { it('should convert scaled number to decimal string', () => { expect(convertScaledPrice(1000000, 6)).toEqual('1') expect(convertScaledPrice(1500000, 6)).toEqual('1.500000') expect(convertScaledPrice(123456789, 4)).toEqual('12345.6789') expect(convertScaledPrice(100, 2)).toEqual('1') expect(convertScaledPrice(1, 3)).toEqual('0.001') }) it('should handle scale of 0', () => { expect(convertScaledPrice(1000000, 0)).toEqual('1000000') expect(convertScaledPrice(42, 0)).toEqual('42') }) it('should handle large numbers', () => { // 2^54 expect(convertScaledPrice(18014398509481984, 10)).toEqual( '1801439.8509481984', ) }) }) describe('with bigint input (MPT amounts)', () => { it('should convert scaled bigint to decimal string', () => { expect(convertScaledPrice(1000000n, 6)).toEqual('1') expect(convertScaledPrice(12341234123412341234n, 12)).toEqual( '12341234.123412341234', ) }) }) }) ================================================ FILE: src/containers/shared/components/Transaction/OracleSet/test/OracleSetSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import OracleSet from './mock_data/OracleSet.json' const renderComponent = createSimpleRenderFactory(Simple) describe('OracleSet: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(OracleSet) expectSimpleRowText(container, 'oracle-document-id', '1') expectSimpleRowText(container, 'provider', 'provider') expectSimpleRowText( container, 'last-update-time', 'May 13, 2024 at 9:05:10 PM', ) expectSimpleRowText(container, 'asset-class', 'currency') expectSimpleRowText( container, 'trading-pairs', '74.2\uE900 XRP/USD1.03BTC/AUDT', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/OracleSet/test/OracleSetTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import OracleSet from './mock_data/OracleSet.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('OracleDelete: TableDetail', () => { it('renders', () => { const { container, unmount } = renderComponent(OracleSet) expect(container).toHaveTextContent( 'oracle_document_id: 1' + 'provider: provider' + 'asset_class: currency' + 'last_update_time: May 13, 2024 at 9:05:10 PM' + 'trading_pairs: 74.2\uE900 XRP/USD, 1.03BTC/AUDT', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/OracleSet/test/mock_data/OracleSet.json ================================================ { "tx": { "Account": "rnuj2NkRxGbGpUK8u9hqEJA1zGRWyxHGvC", "AssetClass": "63757272656E6379", "Fee": "10", "Flags": 0, "LastLedgerSequence": 670052, "LastUpdateTime": 1715634310, "OracleDocumentID": 1, "PriceDataSeries": [ { "PriceData": { "AssetPrice": "2e6", "BaseAsset": "XRP", "QuoteAsset": "USD", "Scale": 1 } }, { "PriceData": { "AssetPrice": "67", "BaseAsset": "BTC", "QuoteAsset": "4155445400000000000000000000000000000000", "Scale": 2 } } ], "Provider": "70726F7669646572", "Sequence": 670031, "SigningPubKey": "ED9376FE6E9063CB291C1031FC07A3B349D9FC45F2D71001B9CC7318F32C3A8F72", "TransactionType": "OracleSet", "TxnSignature": "BAF0D415F9F4DC3F135EA4BD2EE442CDACF70A7BF3BD40A2EAF9D880CD8DEA039036B7D698BC7B5720B4AE6930A4A594168AE676C910510DE0F0C5CD653D5703", "ctid": "C00A395200060002", "date": 768949520, "inLedger": 670034 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rnuj2NkRxGbGpUK8u9hqEJA1zGRWyxHGvC", "Balance": "99999990", "Flags": 0, "OwnerCount": 1, "Sequence": 670032 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "05CC65869680974EF73B8C16A8D59DE7CE9C6B3B012328B11FCC28232B552EA6", "PreviousFields": { "Balance": "100000000", "OwnerCount": 0, "Sequence": 670031 }, "PreviousTxnID": "E78F232A23A3C4F6CD093755669A1A08B61AFBE659D8AFA18F2A0DD7C77D646A", "PreviousTxnLgrSeq": 670031 } }, { "CreatedNode": { "LedgerEntryType": "Oracle", "LedgerIndex": "2E0AC1D6AFC11AD78E48BE575761F75C0326F0547EE178CBB5D67F61691E13E7", "NewFields": { "AssetClass": "63757272656E6379", "LastUpdateTime": 1715634310, "Owner": "rnuj2NkRxGbGpUK8u9hqEJA1zGRWyxHGvC", "PriceDataSeries": [ { "PriceData": { "AssetPrice": "2e4", "BaseAsset": "XRP", "QuoteAsset": "USD", "Scale": 1 } }, { "PriceData": { "AssetPrice": "64", "BaseAsset": "BTC", "QuoteAsset": "EUR", "Scale": 2 } } ], "Provider": "70726F7669646572" } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D745822C67049231E61684BF1F68DACFE522A3172FE4B635FE3966B218E90E2F", "NewFields": { "Owner": "rnuj2NkRxGbGpUK8u9hqEJA1zGRWyxHGvC", "RootIndex": "D745822C67049231E61684BF1F68DACFE522A3172FE4B635FE3966B218E90E2F" } } } ], "TransactionIndex": 6, "TransactionResult": "tesSUCCESS" }, "hash": "6156D7F1B95A9300D34B1E81B602BB9AFD4043B09BACD8A6126A86A7FAC01F47", "date": 768949520, "ledger_index": 670034 } ================================================ FILE: src/containers/shared/components/Transaction/Payment/Description.tsx ================================================ import { Trans, useTranslation } from 'react-i18next' import type { Payment } from 'xrpl' import { Account } from '../../Account' import { TransactionDescriptionProps } from '../types' import { isPartialPayment } from './parser' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const Description = ({ data }: TransactionDescriptionProps) => { const { t } = useTranslation() const partial = isPartialPayment(data.tx.Flags) return ( <>
    , destination: , }} />
    {data.tx.SourceTag != null && (
    {t('the_source_tag_is')} {data.tx.SourceTag}
    )} {data.tx.DestinationTag != null && (
    {t('the_destination_tag_is')} {data.tx.DestinationTag}
    )}
    {`${t('payment_desc_line_4')}${partial ? ' up to' : ''}`}{' '} {data.tx.SendMax && ( <> {t('payment_desc_line_5')}{' '} )}
    {data?.meta?.delivered_amount && (
    {t('payment_desc_line_6')}{' '}
    )} {data.tx.DomainID !== undefined && (
    {t('domain_id')} {': '} {data.tx.DomainID}
    )} ) } ================================================ FILE: src/containers/shared/components/Transaction/Payment/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { Amount } from '../../Amount' import { PaymentInstructions } from './types' import { TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { CredentialIDs } from '../CredentialIDs' export const Simple = (props: TransactionSimpleProps) => { const { data } = props const { t } = useTranslation() const { amount, convert } = data.instructions const renderPartial = () => { const { partial } = data.instructions return partial ? (
    {t('partial_payment_allowed')}
    ) : null } const renderPayment = () => { const { max, destination, sourceTag, partial, domainID, credentialIDs } = data.instructions return ( <> {max && ( )} {renderPartial()} {sourceTag !== undefined && ( {sourceTag} )} {/* Note: domainID is not relevant for self-destined payment transactions */} {domainID !== undefined && ( {domainID} )} {credentialIDs && credentialIDs.length > 0 && ( )} ) } return convert ? ( <> {renderPartial()} ) : ( renderPayment() ) } ================================================ FILE: src/containers/shared/components/Transaction/Payment/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import { TransactionTableDetailProps } from '../types' import { PaymentInstructions } from './types' import { Account } from '../../Account' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { convert, amount, destination, partial, sourceTag, domainID, credentialIDs, } = instructions const renderPartial = () => (
    {t('partial_payment_allowed')}
    ) const renderCredentialIDs = () => { if (!credentialIDs || credentialIDs.length === 0) { return null } return (
    {t('credential_ids')}: {credentialIDs.map((id) => (
    {id}
    ))}
    ) } if (convert) { return (
    {t('convert_maximum')} {t('to')} {partial && renderPartial()} {renderCredentialIDs()}
    ) } return (
    {t('send')} {t('to')} {sourceTag !== undefined && (
    {t('source_tag')} {': '} {sourceTag}
    )} {domainID !== undefined && (
    {t('domain_id')} {': '} {domainID}
    )} {renderCredentialIDs()} {partial && renderPartial()}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/Payment/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { Description } from './Description' import { parser } from './parser' import { TableDetail } from './TableDetail' export const PaymentTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.SEND, category: TransactionCategory.PAYMENT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/Payment/parser.ts ================================================ // import type { Payment } from 'xrpl' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { PaymentInstructions } from './types' import { Amount, ExplorerAmount } from '../../../types' const formatFailedPartialAmount = (d: Amount): ExplorerAmount => ({ ...formatAmount(d), amount: 0, }) export const isPartialPayment = (flags: any) => 0x00020000 & flags // TODO: use MPTAmount type from xrpl.js export const parser = (tx: any, meta: any): PaymentInstructions => { const max = tx.SendMax ? formatAmount(tx.SendMax) : undefined const partial = !!isPartialPayment(tx.Flags) const failedPartial = partial && meta.TransactionResult !== 'tesSUCCESS' const amount = failedPartial ? formatFailedPartialAmount(tx.Amount) : formatAmount(partial ? meta.delivered_amount : tx.Amount) const dt = tx.DestinationTag !== undefined ? `:${tx.DestinationTag}` : '' const destination = `${tx.Destination}${dt}` if (tx.Account === tx.Destination) { return { amount, convert: max, destination, partial, domainID: tx.DomainID, credentialIDs: tx.CredentialIDs, } } return { amount, max, destination: `${tx.Destination}${dt}`, sourceTag: tx.SourceTag, partial, domainID: tx.DomainID, credentialIDs: tx.CredentialIDs, } } ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/PaymentDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { Description } from '../Description' import mockPayment from './mock_data/Payment.json' import mockPaymentConvert from './mock_data/PaymentWithConvert.json' import mockPaymentDestinationTag from './mock_data/PaymentWithDestinationTag.json' import mockPaymentPartial from './mock_data/PaymentWithPartial.json' import mockPaymentSendMax from './mock_data/PaymentWithSendMax.json' import mockPaymentSourceTag from './mock_data/PaymentWithSourceTag.json' import mockPermDomainID from './mock_data/PaymentWithPermDomainID.json' import { createDescriptionRenderFactory } from '../../test' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('Payment: Description', () => { it('renders', () => { const { container, unmount } = renderComponent(mockPayment) expect( container.querySelector('[data-testid="from-to-line"]'), ).toHaveTextContent( `The payment is from rNQEMJA4PsoSrZRn9J6RajAYhcDzzhf8ok to rHoPwMC75KVUhBMeV3uDMybKG5JND74teh`, ) expect( container.querySelector('[data-testid="source-tag-line"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="destination-tag-line"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent(`It was instructed to deliver \uE9002,421.8268 XRP`) expect( container.querySelector('[data-testid="delivered-line"]'), ).toHaveTextContent(`The actual amount delivered was \uE9002,421.8268 XRP`) unmount() }) it('renders with failed partial conversion', () => { const { container, unmount } = renderComponent(mockPaymentConvert) expect( container.querySelector('[data-testid="from-to-line"]'), ).toHaveTextContent( `The payment is from r9x5PHDiwuvbpYB3uvGAqEUVV5wxHayQEx to r9x5PHDiwuvbpYB3uvGAqEUVV5wxHayQEx`, ) expect( container.querySelector('[data-testid="source-tag-line"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="destination-tag-line"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( `It was instructed to deliver up to 1,140.00 YCN.r8HgVGenRTAiNSM5iqt9PX2D2EczFZhZr by spending up to \uE9001,140.00 XRP`, ) expect( container.querySelector('[data-testid="delivered-line"]'), ).not.toBeInTheDocument() unmount() }) it('renders with destination tag', () => { const { container, unmount } = renderComponent(mockPaymentDestinationTag) expect( container.querySelector('[data-testid="from-to-line"]'), ).toHaveTextContent( `The payment is from rDAE53VfMvftPB4ogpWGWvzkQxfht6JPxr to rHWcuuZoFvDS6gNbmHSdpb7u1hZzxvCoMt`, ) expect( container.querySelector('[data-testid="source-tag-line"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="destination-tag-line"]'), ).toHaveTextContent(`The destination tag is 381702`) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent(`It was instructed to deliver \uE9001,531.267 XRP`) expect( container.querySelector('[data-testid="delivered-line"]'), ).toHaveTextContent(`The actual amount delivered was \uE9001,531.267 XRP`) unmount() }) it('renders with send max', () => { const { container, unmount } = renderComponent(mockPaymentSendMax) expect( container.querySelector('[data-testid="from-to-line"]'), ).toHaveTextContent( `The payment is from r3RaNVLvWjqqtFAawC6jbRhgKyFH7HvRS8 to rprcTynT68nYdKzDTefAZG9HjSHiYcnP4b`, ) expect( container.querySelector('[data-testid="destination-tag-line"]'), ).toHaveTextContent(`The destination tag is 0`) expect( container.querySelector('[data-testid="source-tag-line"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( `It was instructed to deliver 17,366,599.150289 XRdoge.rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjA by spending up to 17,366,599.150289 XRdoge.rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjA`, ) expect( container.querySelector('[data-testid="delivered-line"]'), ).toHaveTextContent( `The actual amount delivered was 17,366,599.150289 XRdoge.rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjA`, ) unmount() }) it('renders with partial', () => { const { container, unmount } = renderComponent(mockPaymentPartial) expect( container.querySelector('[data-testid="from-to-line"]'), ).toHaveTextContent( `The payment is from rGTurN94Nn3RkJGSqy9MwmQCLpXZkELbnq to rMQ4oGC8fasuJwfdrfknFTttDbf8cR3D2j`, ) expect( container.querySelector('[data-testid="destination-tag-line"]'), ).toHaveTextContent(`The destination tag is 0`) expect( container.querySelector('[data-testid="source-tag-line"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( `It was instructed to deliver up to 0.001043 xCoin.rXCoYSUnkpygdtfpz3Df8dKQuRZjM9UFi`, ) expect( container.querySelector('[data-testid="delivered-line"]'), ).toHaveTextContent( `The actual amount delivered was 0.00104196 xCoin.rXCoYSUnkpygdtfpz3Df8dKQuRZjM9UFi`, ) unmount() }) it('renders with SourceTag', () => { const { container, unmount } = renderComponent(mockPaymentSourceTag) expect( container.querySelector('[data-testid="source-tag-line"]'), ).toHaveTextContent(`The source tag is 20648`) expect( container.querySelector('[data-testid="destination-tag-line"]'), ).toHaveTextContent(`The destination tag is 412453880`) unmount() }) it(`renders with Permissioned Domain ID`, () => { const { container } = renderComponent(mockPermDomainID) expect( container.querySelector('[data-testid="domain-id-line"]'), ).toHaveTextContent( `Domain ID: D3261DF48CDA3B860ED3FA99F02138856393CD44556E028D5CB66192A18A8D02`, ) }) }) ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/PaymentSimple.test.tsx ================================================ import { useQuery } from 'react-query' import { createSimpleRenderFactory, expectSimpleRowLabel, expectSimpleRowText, } from '../../test' import { Simple } from '../Simple' import mockPayment from './mock_data/Payment.json' import mockPaymentConvert from './mock_data/PaymentWithConvert.json' import mockPaymentDestinationTag from './mock_data/PaymentWithDestinationTag.json' import mockPaymentPartial from './mock_data/PaymentWithPartial.json' import mockPaymentSendMax from './mock_data/PaymentWithSendMax.json' import mockPaymentSourceTag from './mock_data/PaymentWithSourceTag.json' import mockPaymentMPT from './mock_data/PaymentMPT.json' import mockPermDomainID from './mock_data/PaymentWithPermDomainID.json' import mockPaymentWithCredentialIDs from './mock_data/PaymentWithCredentialIDs.json' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) const renderComponent = createSimpleRenderFactory(Simple) describe('Payment: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockPayment) expectSimpleRowText(container, 'amount', `\uE9002,421.8268 XRP`) expectSimpleRowLabel(container, 'amount', `send`) expectSimpleRowText( container, 'destination', `rHoPwMC75KVUhBMeV3uDMybKG5JND74teh`, ) unmount() }) it('renders with failed partial conversion', () => { const { container, unmount } = renderComponent(mockPaymentConvert) expectSimpleRowLabel(container, 'max', `convert_maximum`) expectSimpleRowText(container, 'max', `\uE9001,140.00 XRP`) expectSimpleRowLabel(container, 'amount', `convert_to`) expectSimpleRowText( container, 'amount', `0.00 YCN.r8HgVGenRTAiNSM5iqt9PX2D2EczFZhZrpartial_payment_allowed`, ) expect( container.querySelector('[data-testid="destination"]'), ).not.toBeInTheDocument() unmount() }) it('renders with destination tag', () => { const { container, unmount } = renderComponent(mockPaymentDestinationTag) expectSimpleRowText(container, 'amount', `\uE9001,531.267 XRP`) expectSimpleRowLabel(container, 'amount', `send`) expectSimpleRowText( container, 'destination', `rHWcuuZoFvDS6gNbmHSdpb7u1hZzxvCoMt:381702`, ) unmount() }) it('renders with send max', () => { const { container, unmount } = renderComponent(mockPaymentSendMax) expectSimpleRowText( container, 'max', `17,366,599.150289 XRdoge.rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjA`, ) expectSimpleRowLabel(container, 'max', `using_at_most`) expectSimpleRowText( container, 'amount', `17,366,599.150289 XRdoge.rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjA`, ) expectSimpleRowLabel(container, 'amount', `send`) expectSimpleRowText( container, 'destination', `rprcTynT68nYdKzDTefAZG9HjSHiYcnP4b:0`, ) unmount() }) it('renders with partial', () => { const { container, unmount } = renderComponent(mockPaymentPartial) expectSimpleRowText( container, 'amount', `0.00104196 xCoin.rXCoYSUnkpygdtfpz3Df8dKQuRZjM9UFipartial_payment_allowed`, ) expectSimpleRowLabel(container, 'amount', `delivered`) expectSimpleRowText( container, 'destination', `rMQ4oGC8fasuJwfdrfknFTttDbf8cR3D2j:0`, ) unmount() }) it('renders with SourceTag', () => { const { container, unmount } = renderComponent(mockPaymentSourceTag) expectSimpleRowText(container, 'source-tag', `20648`) unmount() }) it('renders direct MPT payment', () => { const data = { assetScale: 3, } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const { container, unmount } = renderComponent(mockPaymentMPT) expectSimpleRowText( container, 'amount', `0.1 000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F`, ) expectSimpleRowLabel(container, 'amount', `send`) expectSimpleRowText( container, 'destination', `rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu`, ) unmount() }) it(`renders with Permissioned Domain ID`, () => { const { container, unmount } = renderComponent(mockPermDomainID) expectSimpleRowText( container, 'domain-id', `D3261DF48CDA3B860ED3FA99F02138856393CD44556E028D5CB66192A18A8D02`, ) expectSimpleRowLabel(container, 'domain-id', `domain_id`) unmount() }) it('renders with CredentialIDs', () => { const { container, unmount } = renderComponent(mockPaymentWithCredentialIDs) expectSimpleRowText(container, 'amount', `\uE9002,421.8268 XRP`) expectSimpleRowLabel(container, 'amount', `send`) expectSimpleRowText( container, 'destination', `rHoPwMC75KVUhBMeV3uDMybKG5JND74teh`, ) // Check credential IDs as individual rows expectSimpleRowText( container, 'credential-id-0', '7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955', ) expectSimpleRowLabel(container, 'credential-id-0', 'credential_ids') expectSimpleRowText( container, 'credential-id-1', '8B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A956', ) expectSimpleRowLabel(container, 'credential-id-1', '') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/PaymentTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockPayment from './mock_data/Payment.json' import mockPaymentConvert from './mock_data/PaymentWithConvert.json' import mockPaymentDestinationTag from './mock_data/PaymentWithDestinationTag.json' import mockPaymentPartial from './mock_data/PaymentWithPartial.json' import mockPaymentSendMax from './mock_data/PaymentWithSendMax.json' import mockPaymentSourceTag from './mock_data/PaymentWithSourceTag.json' import mockPermDomainID from './mock_data/PaymentWithPermDomainID.json' import mockPaymentCredentialIDs from './mock_data/PaymentWithCredentialIDs.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('Payment: TableDetail', () => { it('renders', () => { const { container, unmount } = renderComponent(mockPayment) // styling makes this look okay expect(container.querySelector('.payment')).toHaveTextContent( `send\uE9002,421.8268 XRPtorHoPwMC75KVUhBMeV3uDMybKG5JND74teh`, ) unmount() }) it('renders with failed partial conversion', () => { const { container, unmount } = renderComponent(mockPaymentConvert) // styling makes this look okay expect(container.querySelector('.payment')).toHaveTextContent( `convert_maximum1,140.00 XRPto0.00 YCN.r8HgVGenRTAiNSM5iqt9PX2D2EczFZhZrpartial_payment_allowed`, ) unmount() }) it('renders with destination tag', () => { const { container, unmount } = renderComponent(mockPaymentDestinationTag) // styling makes this look okay expect(container.querySelector('.payment')).toHaveTextContent( `send1,531.267 XRPtorHWcuuZoFvDS6gNbmHSdpb7u1hZzxvCoMt:381702`, ) unmount() }) it('renders with send max', () => { const { container, unmount } = renderComponent(mockPaymentSendMax) // styling makes this look okay expect(container.querySelector('.payment')).toHaveTextContent( `send17,366,599.150289 XRdoge.rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjAtorprcTynT68nYdKzDTefAZG9HjSHiYcnP4b:0`, ) unmount() }) it('renders with partial', () => { const { container, unmount } = renderComponent(mockPaymentPartial) // styling makes this look okay expect(container.querySelector('.payment')).toHaveTextContent( `send0.00104196 xCoin.rXCoYSUnkpygdtfpz3Df8dKQuRZjM9UFitorMQ4oGC8fasuJwfdrfknFTttDbf8cR3D2j:0partial_payment_allowed`, ) unmount() }) it('renders with SourceTag', () => { const { container, unmount } = renderComponent(mockPaymentSourceTag) expect(container.querySelector('.st')).toHaveTextContent( 'source_tag: 20648', ) unmount() }) it(`renders with Permissioned Domain ID`, () => { const { container } = renderComponent(mockPermDomainID) expect(container.querySelector('.domain-id')).toHaveTextContent( `domain_id: D3261DF48CDA3B860ED3FA99F02138856393CD44556E028D5CB66192A18A8D02`, ) }) it('renders with CredentialIDs', () => { const { container, unmount } = renderComponent(mockPaymentCredentialIDs) expect(container.querySelector('.credential-ids')).toBeInTheDocument() expect(container.querySelector('.credential-ids .label')).toHaveTextContent( 'credential_ids:', ) const credentialIds = container.querySelectorAll('.credential-id') expect(credentialIds).toHaveLength(2) expect(credentialIds[0]).toHaveTextContent( '7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955', ) expect(credentialIds[1]).toHaveTextContent( '8B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A956', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/mock_data/Payment.json ================================================ { "hash": "F4AD54E6FE56B53F8FB8B422C4E9636D6AD56682EA45FF3C8AFBC66EF2D82612", "ledger_index": 37432866, "date": "2018-03-23T13:34:51+00:00", "tx": { "TransactionType": "Payment", "Flags": 2147483648, "Sequence": 31030, "Amount": "2421826800", "Fee": "150000", "SigningPubKey": "0287A3059E24E773CB585A77D59771E54DDABEACD9503650269BA4E3413CA35036", "TxnSignature": "30450221008D56168A5794D1F87D29F83D241477710AA32027F89D68925166477529D0CD50022043E2BFEEE543AA983BA036D3BC2303A6EB13DB7BC0770FBFD9E855DB04BBADED", "Account": "rNQEMJA4PsoSrZRn9J6RajAYhcDzzhf8ok", "Destination": "rHoPwMC75KVUhBMeV3uDMybKG5JND74teh" }, "meta": { "TransactionIndex": 7, "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "62B63A85C9753AD909B67225CBCC5271C3DDED972DDB89A74BC4347D1C62B4A0", "NewFields": { "Sequence": 231, "Balance": "2421826800", "Account": "rHoPwMC75KVUhBMeV3uDMybKG5JND74teh" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37432853, "PreviousTxnID": "884A9090391E30E7AD2789A20425E99192A227358DE4117D1469108DB3DFE5D7", "LedgerIndex": "B8B66C89364DF501737D1AE9A5B4583E8945B8B27CB81FDAB39A50FBAF57B639", "PreviousFields": { "Sequence": 31030, "Balance": "27121947538132" }, "FinalFields": { "Flags": 131072, "Sequence": 31031, "OwnerCount": 0, "Balance": "27119525561332", "Account": "rNQEMJA4PsoSrZRn9J6RajAYhcDzzhf8ok" } } } ], "TransactionResult": "tesSUCCESS", "delivered_amount": "2421826800" } } ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentMPT.json ================================================ { "tx": { "Account": "rsC4dnxCb66FQT4XmCUeuQ7dYeqNio4rWg", "Amount": { "mpt_issuance_id": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F", "value": "100" }, "DeliverMax": { "mpt_issuance_id": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F", "value": "100" }, "Destination": "rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu", "Fee": "10", "Flags": 2147483648, "Sequence": 964, "SigningPubKey": "ED35B07F41420220332C35B9F4D1F7AF26E67EBD5AD6C9E106D0F774DA15924169", "TransactionType": "Payment", "TxnSignature": "2C5CB9740457222F928667DC1196060EF7E61B4E3A8824727AE63ACCFDE35ED5CBEE69E982423592DF0464C57C2C445B4271573DE7A3346630024287844F2502", "ctid": "C00003C900000000", "date": 1727802036000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "AssetScale": 3, "Flags": 34, "Issuer": "rsC4dnxCb66FQT4XmCUeuQ7dYeqNio4rWg", "MPTokenMetadata": "7B226E616D65223A2255532054726561737572792042696C6C20546F6B656E222C2273796D626F6C223A225553544254222C22646563696D616C73223A322C22746F74616C537570706C79223A313030303030302C22697373756572223A225553205472656173757279222C22697373756544617465223A22323032342D30332D3235222C226D6174757269747944617465223A22323032352D30332D3235222C226661636556616C7565223A2231303030222C22696E74657265737452617465223A22322E35222C22696E7465726573744672657175656E6379223A22517561727465726C79222C22636F6C6C61746572616C223A22555320476F7665726E6D656E74222C226A7572697364696374696F6E223A22556E6974656420537461746573222C22726567756C61746F7279436F6D706C69616E6365223A2253454320526567756C6174696F6E73222C22736563757269747954797065223A2254726561737572792042696C6C222C2265787465726E616C5F75726C223A2268747470733A2F2F6578616D706C652E636F6D2F742D62696C6C2D746F6B656E2D6D657461646174612E6A736F6E227D", "MaximumAmount": "9223372036854775807", "OutstandingAmount": "100", "OwnerNode": "0", "Sequence": 963 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "1CFF89335B544E0D6EEC35D74C0D26FF407DC02670F1C4E35A36CC875D34B1C3", "PreviousFields": { "OutstandingAmount": "0" }, "PreviousTxnID": "6329586F264E4A6E2224318DCFC9B5F28048D84060B78A92CFFE65840DF8D970", "PreviousTxnLgrSeq": 966 } }, { "ModifiedNode": { "FinalFields": { "Account": "rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu", "Flags": 0, "MPTAmount": "100", "MPTokenIssuanceID": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "3BAA73912496683A414494218D3CCA33D02F80D588F80C1257C691448E00E486", "PreviousFields": {}, "PreviousTxnID": "60F99C8A23C4A366D19F43EA4BD43414AD4D4B7C21D0228FB7539D1C893E4A74", "PreviousTxnLgrSeq": 967 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsC4dnxCb66FQT4XmCUeuQ7dYeqNio4rWg", "Balance": "99999980", "Flags": 0, "OwnerCount": 1, "Sequence": 965 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "77ECC02B8A7F16EB19A7BFBE8494E959497B4EC7734088583BD4F6B8C82878A5", "PreviousFields": { "Balance": "99999990", "Sequence": 964 }, "PreviousTxnID": "6329586F264E4A6E2224318DCFC9B5F28048D84060B78A92CFFE65840DF8D970", "PreviousTxnLgrSeq": 966 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "delivered_amount": { "mpt_issuance_id": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F", "value": "100" } }, "hash": "CD9EC015E68D3027919598E0466CFEF19950D0BC688A568DF8822A8BB0AFF98F", "ledger_index": 11707, "date": 1712072515000 } ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentWithConvert.json ================================================ { "tx": { "Account": "r9x5PHDiwuvbpYB3uvGAqEUVV5wxHayQEx", "Amount": { "currency": "YCN", "issuer": "r8HgVGenRTAiNSM5iqt9PX2D2EczFZhZr", "value": "1140" }, "Destination": "r9x5PHDiwuvbpYB3uvGAqEUVV5wxHayQEx", "Fee": "11", "Flags": 2147942400, "LastLedgerSequence": 44987082, "Paths": [ [ { "currency": "EUR", "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", "type": 48, "type_hex": "0000000000000030" }, { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y", "type": 48, "type_hex": "0000000000000030" }, { "currency": "XRP", "type": 16, "type_hex": "0000000000000010" }, { "currency": "YCN", "issuer": "r8HgVGenRTAiNSM5iqt9PX2D2EczFZhZr", "type": 48, "type_hex": "0000000000000030" } ], [ { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y", "type": 48, "type_hex": "0000000000000030" }, { "currency": "EUR", "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", "type": 48, "type_hex": "0000000000000030" }, { "currency": "XRP", "type": 16, "type_hex": "0000000000000010" }, { "currency": "YCN", "issuer": "r8HgVGenRTAiNSM5iqt9PX2D2EczFZhZr", "type": 48, "type_hex": "0000000000000030" } ], [ { "currency": "BTC", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "type": 48, "type_hex": "0000000000000030" }, { "currency": "BTC", "issuer": "rchGBxcD1A1C2tdxF6papQYZ8kjRKMYcL", "type": 48, "type_hex": "0000000000000030" }, { "currency": "XRP", "type": 16, "type_hex": "0000000000000010" }, { "currency": "YCN", "issuer": "r8HgVGenRTAiNSM5iqt9PX2D2EczFZhZr", "type": 48, "type_hex": "0000000000000030" } ], [ { "currency": "BTC", "issuer": "rchGBxcD1A1C2tdxF6papQYZ8kjRKMYcL", "type": 48, "type_hex": "0000000000000030" }, { "currency": "BTC", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "type": 48, "type_hex": "0000000000000030" }, { "currency": "XRP", "type": 16, "type_hex": "0000000000000010" }, { "currency": "YCN", "issuer": "r8HgVGenRTAiNSM5iqt9PX2D2EczFZhZr", "type": 48, "type_hex": "0000000000000030" } ], [ { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y", "type": 48, "type_hex": "0000000000000030" }, { "currency": "USD", "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", "type": 48, "type_hex": "0000000000000030" }, { "currency": "XRP", "type": 16, "type_hex": "0000000000000010" }, { "currency": "YCN", "issuer": "r8HgVGenRTAiNSM5iqt9PX2D2EczFZhZr", "type": 48, "type_hex": "0000000000000030" } ], [ { "currency": "USD", "issuer": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", "type": 48, "type_hex": "0000000000000030" }, { "currency": "CNY", "issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y", "type": 48, "type_hex": "0000000000000030" }, { "currency": "XRP", "type": 16, "type_hex": "0000000000000010" }, { "currency": "YCN", "issuer": "r8HgVGenRTAiNSM5iqt9PX2D2EczFZhZr", "type": 48, "type_hex": "0000000000000030" } ] ], "SendMax": "1140000000", "Sequence": 671728, "SigningPubKey": "038C165E0B29398F710353498F310ACB81AE338A8C7A76433CDD0B0DA3263A32BF", "TransactionType": "Payment", "TxnSignature": "3045022100A51940B612A8EEDCBB35215CC43E44CFC0B006B09FF747A2C1605F491CE0228602202A92AE92DB31028E96F107352AC6E847866BDB62C1BFF079BBE0FC461A2CB090" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "r9x5PHDiwuvbpYB3uvGAqEUVV5wxHayQEx", "Balance": "1146735992", "Flags": 0, "OwnerCount": 2, "Sequence": 671729 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A5A15466F20EFCB711175AF99121BF5B9FE450B02E630C9B73800036A537404C", "PreviousFields": { "Balance": "1146736003", "Sequence": 671728 }, "PreviousTxnID": "EAF0DE120A76A0D389122B0AF554F02613319C12465E915109B5B561CAB178E0", "PreviousTxnLgrSeq": 44987079 } } ], "TransactionIndex": 26, "TransactionResult": "tecPATH_DRY" }, "hash": "DA9E41A957D5683DA87B830057E98C755BCFDD247892A7E96603A68C6ED416BA", "ledger_index": 44987080, "date": "2019-02-08T15:42:11Z" } ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentWithCredentialIDs.json ================================================ { "hash": "F4AD54E6FE56B53F8FB8B422C4E9636D6AD56682EA45FF3C8AFBC66EF2D82612", "ledger_index": 37432866, "date": "2018-03-23T13:34:51+00:00", "tx": { "TransactionType": "Payment", "Flags": 2147483648, "Sequence": 31030, "Amount": "2421826800", "Fee": "150000", "SigningPubKey": "0287A3059E24E773CB585A77D59771E54DDABEACD9503650269BA4E3413CA35036", "TxnSignature": "30450221008D56168A5794D1F87D29F83D241477710AA32027F89D68925166477529D0CD50022043E2BFEEE543AA983BA036D3BC2303A6EB13DB7BC0770FBFD9E855DB04BBADED", "Account": "rNQEMJA4PsoSrZRn9J6RajAYhcDzzhf8ok", "Destination": "rHoPwMC75KVUhBMeV3uDMybKG5JND74teh", "CredentialIDs": [ "7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955", "8B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A956" ] }, "meta": { "TransactionIndex": 7, "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "62B63A85C9753AD909B67225CBCC5271C3DDED972DDB89A74BC4347D1C62B4A0", "NewFields": { "Sequence": 231, "Balance": "2421826800", "Account": "rHoPwMC75KVUhBMeV3uDMybKG5JND74teh" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37432853, "PreviousTxnID": "884A9090391E30E7AD2789A20425E99192A227358DE4117D1469108DB3DFE5D7", "LedgerIndex": "B8B66C89364DF501737D1AE9A5B4583E8945B8B27CB81FDAB39A50FBAF57B639", "PreviousFields": { "Sequence": 31030, "Balance": "27121947538132" }, "FinalFields": { "Flags": 131072, "Sequence": 31031, "OwnerCount": 0, "Balance": "27119525561332", "Account": "rNQEMJA4PsoSrZRn9J6RajAYhcDzzhf8ok" } } } ], "TransactionResult": "tesSUCCESS", "delivered_amount": "2421826800" } } ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentWithDestinationTag.json ================================================ { "tx": { "Account": "rDAE53VfMvftPB4ogpWGWvzkQxfht6JPxr", "Amount": "1531267000", "Destination": "rHWcuuZoFvDS6gNbmHSdpb7u1hZzxvCoMt", "DestinationTag": 381702, "Fee": "3000", "Flags": 0, "LastLedgerSequence": 74682640, "Sequence": 69408381, "SigningPubKey": "036085B9E6A6C3628E94FB87914AD5CBABB1DD5FA510D50D742919DC5684A43900", "TransactionType": "Payment", "TxnSignature": "304402207B3A985AF751A7AE4867721C5769C995EDC375A63A72DF079B9C9CC6C3410E1102200270DB15C2260EB7A1005DD736C6526FE4E41C138455F70DB0E97834685ACD56", "date": "2022-09-27T19:03:12Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHWcuuZoFvDS6gNbmHSdpb7u1hZzxvCoMt", "Balance": "15510910711950", "Flags": 0, "OwnerCount": 0, "Sequence": 506441 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "61DD66AC4A3CAEBEA666DA86741503C5A9C0A68F54EEFFC8E32A123814B414B5", "PreviousFields": { "Balance": "15509379444950" }, "PreviousTxnID": "18A1718BFE41D672ED6FD4575FAA0EDC4D6B0F0A6957146498E8142A716EBD1D", "PreviousTxnLgrSeq": 74682577 } }, { "ModifiedNode": { "FinalFields": { "Account": "rDAE53VfMvftPB4ogpWGWvzkQxfht6JPxr", "Balance": "242300673818330", "Flags": 0, "OwnerCount": 0, "Sequence": 69408382 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9840CEB0F4EC2594DD96CC4CE410D5F3F73B674EFF6D286CA25B47CF2975E886", "PreviousFields": { "Balance": "242302205088330", "Sequence": 69408381 }, "PreviousTxnID": "012B564766F874CD627FE50F5A82EE4899D33FECC8FF27D0BC2C10DA06EC9930", "PreviousTxnLgrSeq": 74682623 } } ], "TransactionIndex": 16, "TransactionResult": "tesSUCCESS", "delivered_amount": "1531267000" }, "hash": "589640406AC52E6092623A3124900877F7B63AB250E2ED97888B8CA364C3AD8D", "ledger_index": 74682627, "date": "2022-09-27T19:03:12Z" } ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentWithPartial.json ================================================ { "tx": { "Account": "rGTurN94Nn3RkJGSqy9MwmQCLpXZkELbnq", "Amount": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rXCoYSUnkpygdtfpz3Df8dKQuRZjM9UFi", "value": "0.001043" }, "Destination": "rMQ4oGC8fasuJwfdrfknFTttDbf8cR3D2j", "DestinationTag": 0, "Fee": "20", "Flags": 2147614720, "Memos": [ { "Memo": { "MemoData": "476F6F64206A6F622120596F7520736F6C766564207468652070757A7A6C652E203A2920596F752063616E277420757365207468652066617563657420666F7220746865206E65787420323420686F757273", "MemoFormat": "4E6F7465" } } ], "Sequence": 69762637, "SigningPubKey": "0290358266C61E825B8B9B2CE5593C7E0167185EE8B29B06D972311541E3B98624", "TransactionType": "Payment", "TxnSignature": "304502210082011CDF57A70E7F0D66B35E65D06112D069ADD24C4030BD0FA6635ACCAFFB4D022054EEC7E8B26F2EC8CE2D5CF04D9E593275F9CECBADB06B7E67ACBB661AAF79E3", "date": "2022-09-27T19:05:42Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1.043812187812185" }, "Flags": 2228224, "HighLimit": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rMQ4oGC8fasuJwfdrfknFTttDbf8cR3D2j", "value": "10000000" }, "HighNode": "1", "LowLimit": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rXCoYSUnkpygdtfpz3Df8dKQuRZjM9UFi", "value": "0" }, "LowNode": "b45" }, "LedgerEntryType": "RippleState", "LedgerIndex": "21374E660A219F160C89993D917372A1C48890E8583E606F68E507B2228B6570", "PreviousFields": { "Balance": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-1.042770229770227" } }, "PreviousTxnID": "FDFC47880EC5EB93E8C237583C6016F50AC06112F418664FF2EE651FB0B5C1D6", "PreviousTxnLgrSeq": 74659674 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-511674.8896548626" }, "Flags": 2228224, "HighLimit": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rGTurN94Nn3RkJGSqy9MwmQCLpXZkELbnq", "value": "9989807.154550577" }, "HighNode": "0", "LowLimit": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rXCoYSUnkpygdtfpz3Df8dKQuRZjM9UFi", "value": "0" }, "LowNode": "554" }, "LedgerEntryType": "RippleState", "LedgerIndex": "3EEAB6A08D18FF8A91210D0AA1C7D3F9BAF2EC32F649A83C10D87B02066100AD", "PreviousFields": { "Balance": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-511674.8906978626" } }, "PreviousTxnID": "A6F6879F11E1815E9D173E8B166D078F555E636E1468BCA6B1783700C29745F5", "PreviousTxnLgrSeq": 74682619 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGTurN94Nn3RkJGSqy9MwmQCLpXZkELbnq", "Balance": "61172780", "Flags": 0, "OwnerCount": 1, "Sequence": 69762638 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "9D68BEA42D63DF3FBA14967604AF362A0FFC01A1E7C4BEA63EF8C136EDBC186B", "PreviousFields": { "Balance": "61172800", "Sequence": 69762637 }, "PreviousTxnID": "A6F6879F11E1815E9D173E8B166D078F555E636E1468BCA6B1783700C29745F5", "PreviousTxnLgrSeq": 74682619 } } ], "DeliveredAmount": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rXCoYSUnkpygdtfpz3Df8dKQuRZjM9UFi", "value": "0.001041958041958041" }, "TransactionIndex": 28, "TransactionResult": "tesSUCCESS", "delivered_amount": { "currency": "78436F696E000000000000000000000000000000", "issuer": "rXCoYSUnkpygdtfpz3Df8dKQuRZjM9UFi", "value": "0.001041958041958041" } }, "hash": "439B1D82C4739E4B3DD1FE440AE0EBE62E30C64FA7FF7DC0423B95CAF2FEB384", "ledger_index": 74682666, "date": "2022-09-27T19:05:42Z" } ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentWithPermDomainID.json ================================================ { "close_time_iso": "2025-07-17T02:25:45Z", "ctid": "C0000DB400000000", "hash": "777CC3B0ED9A1A673C420AD594FF18888697F41850B5B8BE41E79A694DF3DD92", "ledger_hash": "E52B5E1FA25C0AE68C48C9BB8F675EAD32D0529B308F9A9679327F377A9DB975", "ledger_index": 3508, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rH6ydZEEw1W5ZDqkvAk1bke4ZowPruoqyq", "Balance": "399997040", "Flags": 0, "OwnerCount": 2, "Sequence": 3498 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "81010CF8EF0F2BD3265FE224AAED1255CBBDFAE5214AC279302B279CDCBDA142", "PreviousFields": { "Balance": "399998280", "Sequence": 3497 }, "PreviousTxnID": "9B43B469D76BBD06731F6F151AD97A441D76F6A7361BE122B8FE1D03404F686D", "PreviousTxnLgrSeq": 3507 } }, { "ModifiedNode": { "FinalFields": { "Account": "rpuLuDBt44msP6f7oppAVsKJoUMaMAvnrF", "Balance": "400001280", "Flags": 0, "OwnerCount": 2, "Sequence": 3498 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D81C23D4E6CF1942E42264DA67EDF98CB98363104D0E06E152E7A745121DF5AE", "PreviousFields": { "Balance": "400000280" }, "PreviousTxnID": "9B43B469D76BBD06731F6F151AD97A441D76F6A7361BE122B8FE1D03404F686D", "PreviousTxnLgrSeq": 3507 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "delivered_amount": "1000" }, "tx": { "Account": "rH6ydZEEw1W5ZDqkvAk1bke4ZowPruoqyq", "Amount": "1000", "Destination": "rpuLuDBt44msP6f7oppAVsKJoUMaMAvnrF", "DomainID": "D3261DF48CDA3B860ED3FA99F02138856393CD44556E028D5CB66192A18A8D02", "Fee": "240", "Flags": 0, "LastLedgerSequence": 3527, "Sequence": 3497, "SigningPubKey": "EDAD68C65420D3738D936A3542D8DB8232670F9F38F6649B158F0AD6590FC2B403", "TransactionType": "Payment", "TxnSignature": "1F7CC0297BCF0D1DA60C8C0AD53F2D78E493C179E51E0B59B7F9C74B9CA686C672B91C2BB45D530FB06EA906AF6E8D9EB67C28C11C0C2D8EB9503A198AA8B80B", "ctid": "C0000DB400000000", "date": 806034345, "ledger_index": 3508 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentWithSendMax.json ================================================ { "tx": { "Account": "r3RaNVLvWjqqtFAawC6jbRhgKyFH7HvRS8", "Amount": { "currency": "5852646F67650000000000000000000000000000", "issuer": "rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjA", "value": "17366599.150289" }, "Destination": "rprcTynT68nYdKzDTefAZG9HjSHiYcnP4b", "DestinationTag": 0, "Fee": "40000", "Flags": 2147483648, "LastLedgerSequence": 74682649, "SendMax": { "currency": "5852646F67650000000000000000000000000000", "issuer": "rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjA", "value": "17366599.150289" }, "Sequence": 63622107, "SigningPubKey": "EDEBA43507DFB9789CB377D547561967AE9E6B393C011F0A5A45D2CD6D644CDC3C", "TransactionType": "Payment", "TxnSignature": "B938F6BE36F988D5CA634A6180ED25114640F9AABEE6E267A232B7DB8D1C3C1202C13D02190DA5FC1B4B41AA64C357819C1A9B9017D3481A841EABFAAA52BF0C", "date": "2022-09-27T19:03:30Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "r3RaNVLvWjqqtFAawC6jbRhgKyFH7HvRS8", "Balance": "10107960000", "Flags": 655360, "OwnerCount": 49, "Sequence": 63622108 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "32B7CD6E9A603D127BE7EB6946441BA098C44E4CF29243DDD6DC5465D7FAA1C4", "PreviousFields": { "Balance": "10108000000", "Sequence": 63622107 }, "PreviousTxnID": "065F6D748CDC7D7552E3BC3AE704E16F5F40B3B85FE8212E1EB04A92942511F9", "PreviousTxnLgrSeq": 74682551 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852646F67650000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "17366599.150289" }, "Flags": 1114112, "HighLimit": { "currency": "5852646F67650000000000000000000000000000", "issuer": "rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjA", "value": "0" }, "HighNode": "956", "LowLimit": { "currency": "5852646F67650000000000000000000000000000", "issuer": "rprcTynT68nYdKzDTefAZG9HjSHiYcnP4b", "value": "99594110060.12813" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "8A176A04AB432E61FC9619A0F6705A1139F167C11193CE4E9243EBFAB6974B46", "PreviousFields": { "Balance": { "currency": "5852646F67650000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" } }, "PreviousTxnID": "95801B9E6A733C8CB7F1E23D7BA53D87D4E12195448B0933B29FB734938CD001", "PreviousTxnLgrSeq": 74682072 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "5852646F67650000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "18159637014.6892" }, "Flags": 1114112, "HighLimit": { "currency": "5852646F67650000000000000000000000000000", "issuer": "rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjA", "value": "0" }, "HighNode": "539", "LowLimit": { "currency": "5852646F67650000000000000000000000000000", "issuer": "r3RaNVLvWjqqtFAawC6jbRhgKyFH7HvRS8", "value": "99999950000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "CF9289B3AA47DAE4400EFBCF511284C3A3899F26F61D385DBCC69BBBFA0D2DCE", "PreviousFields": { "Balance": { "currency": "5852646F67650000000000000000000000000000", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "18177003613.83948" } }, "PreviousTxnID": "AFD4338B87609F444367B82F188C6D9ED5E65D1245140F61250CE67CB01F50E2", "PreviousTxnLgrSeq": 74682083 } } ], "TransactionIndex": 31, "TransactionResult": "tesSUCCESS", "delivered_amount": { "currency": "5852646F67650000000000000000000000000000", "issuer": "rLqUC2eCPohYvJCEBJ77eCCqVL2uEiczjA", "value": "17366599.150289" } }, "hash": "AABF5991C4540CB1DF7D4F5DC8FEA8AC1F2DB4ECB7BFEBC96B8752CECF482325", "ledger_index": 74682631, "date": "2022-09-27T19:03:30Z" } ================================================ FILE: src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentWithSourceTag.json ================================================ { "tx": { "Account": "rAPERVgXZavGgiGv6xBgtiZurirW2yAmY", "Amount": "7022", "Destination": "rEb8TK3gBgk5auZkwc6sHnwrGVJH8DuaLh", "DestinationTag": 412453880, "Fee": "12", "Flags": 2147483648, "LastLedgerSequence": 74707042, "Sequence": 6902959, "SigningPubKey": "03D0F8AD5451AF33C55C20FED9A9C70E887958CA9A224CEB3413FED4FF5280DE3D", "SourceTag": 20648, "TransactionType": "Payment", "TxnSignature": "30440220613E6F791432AE3F770B329B095D012A3803B8B1A863F9BBF26667AB6F528BCE02202ADA66E48C5406910EAE8FD69BC0D0DD99445B90491CC10D00570D79DF156122", "date": "2022-09-28T21:09:21Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rAPERVgXZavGgiGv6xBgtiZurirW2yAmY", "Balance": "200406835", "Flags": 0, "MessageKey": "020000000000000000000000004A68BF6B449628C7307522C4ED724B54892EAF6B", "OwnerCount": 0, "Sequence": 6902960 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "13BB764C1AF64C2C906232D832B7D5943BFCB2935AE40BAFAD91A1722FD74839", "PreviousFields": { "Balance": "200413869", "Sequence": 6902959 }, "PreviousTxnID": "5381FDC5BDD3BCD0E7A5308935FB17C445C89698E4EE7A5F6FF2206FD3B0911E", "PreviousTxnLgrSeq": 74707022 } }, { "ModifiedNode": { "FinalFields": { "Account": "rEb8TK3gBgk5auZkwc6sHnwrGVJH8DuaLh", "Balance": "2141312206", "Flags": 131072, "OwnerCount": 0, "Sequence": 460789 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E50C9EE857E177CE38071B8930F66053C9C86DF9B8ADEDA632CB9DFF50EC0033", "PreviousFields": { "Balance": "2141305184" }, "PreviousTxnID": "D06049F6D65CB38E96D7592AF33313C03BB50B9DF43E7E206C488D87DBA83F68", "PreviousTxnLgrSeq": 74707038 } } ], "TransactionIndex": 40, "TransactionResult": "tesSUCCESS", "delivered_amount": "7022" }, "hash": "6E0EC20AE77ED25731B21B5B0B8FF7EA36605CBAA9C7D77725B6EC4D43E5C009", "ledger_index": 74707040, "date": "2022-09-28T21:09:21Z" } ================================================ FILE: src/containers/shared/components/Transaction/Payment/types.ts ================================================ import { ExplorerAmount } from '../../../types' export interface PaymentInstructions { partial: boolean amount: ExplorerAmount max?: ExplorerAmount convert?: ExplorerAmount destination: string sourceTag?: number domainID?: string credentialIDs?: string[] } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/Description.tsx ================================================ import { useTranslation } from 'react-i18next' import type { PaymentChannelClaim } from 'xrpl' import { findNode, normalizeAmount } from '../../../transactionUtils' import { Account } from '../../Account' import { TransactionDescriptionProps } from '../types' import { useLanguage } from '../../../hooks' export const Description = ({ data, }: TransactionDescriptionProps) => { const { t } = useTranslation() const language = useLanguage() const deleted = findNode(data.meta, 'DeletedNode', 'PayChannel') const modified = findNode(data.meta, 'ModifiedNode', 'PayChannel') const node = deleted || modified const change = node && node.PreviousFields && node.PreviousFields.Balance ? node.FinalFields.Balance - node.PreviousFields.Balance : null return ( <>
    {t('transaction_initiated_by')}
    {t('update_payment_channel')}{' '} {data.tx.Channel}
    {data.tx.Balance && (
    {t('the_channel_balance_is')} {' '} {normalizeAmount(data.tx.Balance, language)} XRP {change && ( {' ('} {t('increased_by')} {' '} {normalizeAmount(change, language)} XRP ) )}
    )} {deleted && (
    {t('payment_channel_closed_description')}
    )} ) } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { TransactionSimpleProps } from '../types' import { PaymentChannelClaimInstructions } from './types' import { CredentialIDs } from '../CredentialIDs' export const Simple = ({ data, }: TransactionSimpleProps) => { const { t } = useTranslation() const { channelAmount, claimed, totalClaimed, source = '', destination = '', channel, renew, close, deleted, credentialIDs, } = data.instructions const dParts = destination.split(':') const sParts = source.split(':') return ( <> {channelAmount && ( )} {claimed && ( )} {totalClaimed && ( )} {source && ( {sParts[1] && :{sParts[1]}} )} {destination && ( {dParts[1] && :{dParts[1]}} )} {channel && ( {channel} )} {renew && ( {t('renew_channel')} )} {close && ( {t('close_request')} )} {deleted && ( {t('payment_channel_closed')} )} {credentialIDs && credentialIDs.length > 0 && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import { TransactionTableDetailProps } from '../types' import { PaymentChannelClaimInstructions } from './types' import { Account } from '../../Account' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { source, destination, claimed, channelAmount, remaining, renew, close, deleted, } = instructions return (
    {source && (
    {t('source')}
    )} {destination && (
    {t('destination')}
    )} {claimed && (
    {t('claimed')} {remaining && channelAmount && ( <> {' '} ( {t('out_of')}{' '} {t('remaining')}) )}
    )} {channelAmount && !claimed && (
    {t('channel_amount')}
    )} {renew && (
    {t('renew_channel')}
    )} {close && (
    {t('close_request')}
    )} {deleted && (
    {t('payment_channel_closed')}
    )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' import { TableDetail } from './TableDetail' import { Description } from './Description' export const PaymentChannelClaimTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.FINISH, category: TransactionCategory.PAYMENT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/parser.ts ================================================ import type { PaymentChannelClaim, TransactionMetadata } from 'xrpl' import { PaymentChannelClaimInstructions } from './types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { findNode } from '../../../transactionUtils' const hasRenew = (flags: number): boolean => !!(0x00010000 & flags) const hasClose = (flags: number) => !!(0x00020000 & flags) const getDetails = (node: any) => { const st = node.FinalFields.SourceTag ? `:${node.FinalFields.SourceTag}` : '' const dt = node.FinalFields.DestinationTag ? `:${node.FinalFields.DestinationTag}` : '' return { source: `${node.FinalFields.Account}${st}`, destination: `${node.FinalFields.Destination}${dt}`, channel: node.LedgerIndex, } } export const parser = ( tx: PaymentChannelClaim, meta: TransactionMetadata, ): PaymentChannelClaimInstructions => { let node = findNode(meta, 'ModifiedNode', 'PayChannel') const data: PaymentChannelClaimInstructions = { channel: tx.Channel, totalClaimed: tx.Balance ? formatAmount(tx.Balance) : undefined, renew: hasRenew(typeof tx.Flags === 'number' ? tx.Flags : 0) || undefined, close: hasClose(typeof tx.Flags === 'number' ? tx.Flags : 0) || undefined, credentialIDs: (tx as any).CredentialIDs, // Cast to any to include CredentialIDs } if (node) { const details = getDetails(node) const amount = node.FinalFields.Amount const total = node.FinalFields.Balance const claimed = node.PreviousFields.Balance ? total - node.PreviousFields.Balance : null const remaining = amount - total return Object.assign(data, details, { channelAmount: formatAmount(amount), claimed: claimed ? formatAmount(claimed) : undefined, remaining: formatAmount(remaining), }) } node = findNode(meta, 'DeletedNode', 'PayChannel') if (node) { const details = getDetails(node) const returned = node.FinalFields.Amount - node.FinalFields.Balance return Object.assign(data, details, { channelAmount: formatAmount(node.FinalFields.Amount), totalClaimed: formatAmount(node.FinalFields.Balance), returned: returned ? formatAmount(returned) : undefined, deleted: true, }) } return data } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/test/PaymentChannelClaimDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test/createWrapperFactory' import mockPaymentChannelClaim from './mock_data/PaymentChannelClaim.json' import mockPaymentChannelClaimClosed from './mock_data/PaymentChannelClaimClosed.json' import mockPaymentChannelClaimCloseDenied from './mock_data/PaymentChannelClaimCloseDenied.json' import mockPaymentChannelClaimWithDestinationTag from './mock_data/PaymentChannelClaimWithDestinationTag.json' import { Description } from '../Description' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('PaymentChannelClaim: Description', () => { it('renders a claim', () => { const { container, unmount } = renderComponent(mockPaymentChannelClaim) expect( container.querySelector('[data-testid="account-line"]'), ).toHaveTextContent( `The transaction was initiated by rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN`, ) expect( container.querySelector('[data-testid="channel-line"]'), ).toHaveTextContent( `It will update the payment channel 50107651E7163E294CE0EAD8A20BF7CC046304480FCC9C74A49FFAB3F46FB98E`, ) expect( container.querySelector('[data-testid="balance-line"]'), ).toHaveTextContent( `The channel balance claimed is \uE90049.65716XRP (increased by \uE9000.01XRP)`, ) expect( container.querySelector('[data-testid="closed-line"]'), ).not.toBeInTheDocument() unmount() }) it('renders tx with channel being closed', () => { const { container, unmount } = renderComponent( mockPaymentChannelClaimClosed, ) expect( container.querySelector('[data-testid="account-line"]'), ).toHaveTextContent( `The transaction was initiated by rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B`, ) expect( container.querySelector('[data-testid="channel-line"]'), ).toHaveTextContent( `It will update the payment channel 3BDB4F92432BCEB2385D3BAA60E8AAEC9B552890A240AEE4AA9E88C9E6C517E8`, ) expect( container.querySelector('[data-testid="balance-line"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="closed-line"]'), ).toHaveTextContent( `The payment channel will be closed, any remaining balance will be returned to the source account`, ) unmount() }) it('renders tx requesting channel be closed but not closing it', () => { const { container, unmount } = renderComponent( mockPaymentChannelClaimCloseDenied, ) expect( container.querySelector('[data-testid="account-line"]'), ).toHaveTextContent( `The transaction was initiated by rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B`, ) expect( container.querySelector('[data-testid="channel-line"]'), ).toHaveTextContent( `It will update the payment channel 3BDB4F92432BCEB2385D3BAA60E8AAEC9B552890A240AEE4AA9E88C9E6C517E8`, ) expect( container.querySelector('[data-testid="balance-line"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="closed-line"]'), ).not.toBeInTheDocument() unmount() }) it('renders tx with destination tag', () => { const { container, unmount } = renderComponent( mockPaymentChannelClaimWithDestinationTag, ) expect( container.querySelector('[data-testid="account-line"]'), ).toHaveTextContent( `The transaction was initiated by rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn`, ) expect( container.querySelector('[data-testid="channel-line"]'), ).toHaveTextContent( `It will update the payment channel 5DB01B7FFED6B67E6B0414DED11E051D2EE2B7619CE0EAA6286D67A3A4D5BDB3`, ) expect( container.querySelector('[data-testid="balance-line"]'), ).toHaveTextContent( `The channel balance claimed is \uE9001.00XRP (increased by \uE9001.00XRP)`, ) expect( container.querySelector('[data-testid="closed-line"]'), ).not.toBeInTheDocument() unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/test/PaymentChannelClaimSimple.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockPaymentChannelClaim from './mock_data/PaymentChannelClaim.json' import mockPaymentChannelClaimClosed from './mock_data/PaymentChannelClaimClosed.json' import mockPaymentChannelClaimCloseDenied from './mock_data/PaymentChannelClaimCloseDenied.json' import mockPaymentChannelClaimWithDestinationTag from './mock_data/PaymentChannelClaimWithDestinationTag.json' import mockPaymentChannelClaimWithCredentialIDs from './mock_data/PaymentChannelClaimWithCredentialIDs.json' import { expectSimpleRowLabel, expectSimpleRowNotToExist, expectSimpleRowText, } from '../../test' const renderComponent = createSimpleRenderFactory(Simple, i18n) describe('PaymentChannelClaim: Simple', () => { it('renders a claim', () => { const { container, unmount } = renderComponent(mockPaymentChannelClaim) expectSimpleRowLabel(container, 'amount', 'channel amount') expectSimpleRowText(container, 'amount', '\uE90070.00 XRP') expectSimpleRowLabel(container, 'claimed', 'amount claimed') expectSimpleRowText(container, 'claimed', '\uE9000.01 XRP') expectSimpleRowLabel(container, 'total', 'total claimed') expectSimpleRowText(container, 'total', '\uE90049.65716 XRP') expectSimpleRowLabel(container, 'source', 'source') expectSimpleRowText( container, 'source', 'rnNzy3iPc7gPEAJbAdXwxY1UTBamBqTYhR:1002539517', ) expectSimpleRowLabel(container, 'destination', 'destination') expectSimpleRowText( container, 'destination', 'rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN', ) expectSimpleRowLabel(container, '.channel', 'Channel ID') expectSimpleRowText( container, '.channel', '50107651E7163E294CE0EAD8A20BF7CC046304480FCC9C74A49FFAB3F46FB98E', ) expectSimpleRowNotToExist(container, 'renew') expectSimpleRowNotToExist(container, 'close-request') expectSimpleRowNotToExist(container, 'closed') unmount() }) it('renders tx with channel being closed', () => { const { container, unmount } = renderComponent( mockPaymentChannelClaimClosed, ) expectSimpleRowText(container, 'amount', '\uE90010.00 XRP') expectSimpleRowNotToExist(container, 'claimed') expectSimpleRowText(container, 'total', '\uE9000.34 XRP') expectSimpleRowText( container, 'source', 'rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B:2647131528', ) expectSimpleRowText( container, 'destination', 'rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN', ) expectSimpleRowText( container, '.channel', '3BDB4F92432BCEB2385D3BAA60E8AAEC9B552890A240AEE4AA9E88C9E6C517E8', ) expectSimpleRowNotToExist(container, 'renew') expectSimpleRowText(container, 'close-request', 'close channel request') expectSimpleRowText(container, 'closed', 'payment channel closed') unmount() }) it('renders tx requesting channel be closed but not closing it', () => { const { container, unmount } = renderComponent( mockPaymentChannelClaimCloseDenied, ) expectSimpleRowText(container, 'amount', '\uE90010.00 XRP') expectSimpleRowNotToExist(container, 'claimed') expectSimpleRowNotToExist(container, 'total') expectSimpleRowText( container, 'source', 'rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B:2647131528', ) expectSimpleRowText( container, 'destination', 'rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN', ) expectSimpleRowText( container, '.channel', '3BDB4F92432BCEB2385D3BAA60E8AAEC9B552890A240AEE4AA9E88C9E6C517E8', ) expectSimpleRowNotToExist(container, 'renew') expectSimpleRowText(container, 'close-request', 'close channel request') expectSimpleRowNotToExist(container, 'closed') unmount() }) it('renders tx with destination tag', () => { const { container, unmount } = renderComponent( mockPaymentChannelClaimWithDestinationTag, ) expectSimpleRowText(container, 'amount', '\uE900100.00 XRP') expectSimpleRowText(container, 'claimed', '\uE9001.00 XRP') expectSimpleRowText(container, 'total', '\uE9001.00 XRP') expectSimpleRowText( container, 'source', 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', ) expectSimpleRowText( container, 'destination', 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn:20170428', ) expectSimpleRowText( container, '.channel', '5DB01B7FFED6B67E6B0414DED11E051D2EE2B7619CE0EAA6286D67A3A4D5BDB3', ) expectSimpleRowNotToExist(container, 'renew') expectSimpleRowNotToExist(container, 'close-request') expectSimpleRowNotToExist(container, 'closed') unmount() }) it('renders tx with CredentialIDs', () => { const { container, unmount } = renderComponent( mockPaymentChannelClaimWithCredentialIDs, ) expectSimpleRowText(container, 'amount', '\uE90070.00 XRP') expectSimpleRowText(container, 'claimed', '\uE9000.01 XRP') expectSimpleRowText(container, 'total', '\uE90049.65716 XRP') expect( container.querySelector('[data-testid="credential-id-0"]'), ).toBeInTheDocument() expect( container.querySelector('[data-testid="credential-id-1"]'), ).toBeInTheDocument() expect( container.querySelector('[data-testid="credential-id-0"] .value'), ).toHaveTextContent( '7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955', ) expect( container.querySelector('[data-testid="credential-id-1"] .value'), ).toHaveTextContent( '8B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A956', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/test/PaymentChannelClaimTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test/createWrapperFactory' import { TableDetail } from '../TableDetail' import mockPaymentChannelClaim from './mock_data/PaymentChannelClaim.json' import mockPaymentChannelClaimClosed from './mock_data/PaymentChannelClaimClosed.json' import mockPaymentChannelClaimCloseDenied from './mock_data/PaymentChannelClaimCloseDenied.json' import mockPaymentChannelClaimWithDestinationTag from './mock_data/PaymentChannelClaimWithDestinationTag.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('PaymentChannelClaim: TableDetail', () => { it('renders a claim', () => { const { container, unmount } = renderComponent(mockPaymentChannelClaim) expect(container.querySelector('[data-testid="source"]')).toHaveTextContent( 'sourcernNzy3iPc7gPEAJbAdXwxY1UTBamBqTYhR:1002539517', ) expect( container.querySelector('[data-testid="destination"]'), ).toHaveTextContent('destinationrK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN') expect( container.querySelector('[data-testid="claimed"]'), ).toHaveTextContent( 'claimed\uE9000.01 XRP (\uE90020.34284 XRP of \uE90070.00 XRP remaining)', ) expect( container.querySelector('[data-testid="channel-amount"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="renew"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="close-request"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="closed"]'), ).not.toBeInTheDocument() unmount() }) it('renders tx with channel being closed', () => { const { container, unmount } = renderComponent( mockPaymentChannelClaimClosed, ) expect(container.querySelector('[data-testid="source"]')).toHaveTextContent( 'sourcerH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B:2647131528', ) expect( container.querySelector('[data-testid="destination"]'), ).toHaveTextContent('destinationrK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN') expect( container.querySelector('[data-testid="claimed"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="channel-amount"]'), ).toHaveTextContent('channel amount\uE90010.00 XRP') expect( container.querySelector('[data-testid="renew"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="close-request"]'), ).toHaveTextContent('close channel request') expect(container.querySelector('[data-testid="closed"]')).toHaveTextContent( 'payment channel closed', ) unmount() }) it('renders tx requesting channel be closed but not closing it', () => { const { container, unmount } = renderComponent( mockPaymentChannelClaimCloseDenied, ) expect(container.querySelector('[data-testid="source"]')).toHaveTextContent( 'sourcerH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B:2647131528', ) expect( container.querySelector('[data-testid="destination"]'), ).toHaveTextContent('destinationrK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN') expect( container.querySelector('[data-testid="claimed"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="channel-amount"]'), ).toHaveTextContent('channel amount\uE90010.00 XRP') expect( container.querySelector('[data-testid="renew"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="close-request"]'), ).toHaveTextContent('close channel request') expect( container.querySelector('[data-testid="closed"]'), ).not.toBeInTheDocument() unmount() }) it('renders tx with destination tag', () => { const { container, unmount } = renderComponent( mockPaymentChannelClaimWithDestinationTag, ) expect(container.querySelector('[data-testid="source"]')).toHaveTextContent( 'sourcerN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', ) expect( container.querySelector('[data-testid="destination"]'), ).toHaveTextContent( 'destinationrf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn:20170428', ) expect( container.querySelector('[data-testid="claimed"]'), ).toHaveTextContent( 'claimed\uE9001.00 XRP (\uE90099.00 XRP of \uE900100.00 XRP remaining)', ) expect( container.querySelector('[data-testid="channel-amount"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="renew"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="close-request"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="closed"]'), ).not.toBeInTheDocument() unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/test/mock_data/PaymentChannelClaim.json ================================================ { "hash": "B576A11C6AE8830A1C1B77C27567D62E39A03E62DBE8FC1A09D463C2400B808A", "ledger_index": 37564494, "date": "2018-03-29T01:38:11+00:00", "tx": { "TransactionType": "PaymentChannelClaim", "Flags": 2147483648, "Sequence": 1103, "LastLedgerSequence": 37564495, "Channel": "50107651E7163E294CE0EAD8A20BF7CC046304480FCC9C74A49FFAB3F46FB98E", "Balance": "49657160", "Fee": "12", "PublicKey": "ED46FF956B8EEC4BA614B1A6B0B4343D623AE37A891A0461F1F51464CFC3442CF7", "SigningPubKey": "03D488B5AA26C87CB14BF23D470520F592A0006A916F5FEEAAB48335D8811A2E9F", "TxnSignature": "304402205E511EE2CA9BEE36F4078C24E8849A87565692938DB6C1998B449EE4A4A7BFF402201B9B78A1CE11522CCEB973FFA0BC55D8F561657A5383331EAADC6F0D67F2C347", "Signature": "55C8169517E6353A7168B4F6BE202C0C4D0828CBC3556D4576A3FF67D117F678AEC624FC98417460FA172F313FD920030C8C50B38542BD8744F578A568FB730B", "Account": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN" }, "meta": { "TransactionIndex": 10, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37563014, "PreviousTxnID": "6540E08162D034074B36A130C3683147C5BAC4E081138A97AABC4425ED264DDB", "LedgerIndex": "1779FCFCF53ACAF81150E49FCDA32AE74B3DB67FCA77C054E0DEA3DEC4EFE053", "PreviousFields": { "Sequence": 1103, "Balance": "284620533" }, "FinalFields": { "Flags": 0, "Sequence": 1104, "OwnerCount": 50, "Balance": "284630521", "Account": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN" } } }, { "ModifiedNode": { "LedgerEntryType": "PayChannel", "PreviousTxnLgrSeq": 37539781, "PreviousTxnID": "9CB070C9F40DB0D50D70E1EB1E4C69D8B48DBDDDE06263711D01595F68722936", "LedgerIndex": "50107651E7163E294CE0EAD8A20BF7CC046304480FCC9C74A49FFAB3F46FB98E", "PreviousFields": { "Balance": "49647160" }, "FinalFields": { "Flags": 0, "SourceTag": 1002539517, "SettleDelay": 3600, "OwnerNode": "0000000000000001", "Amount": "70000000", "Balance": "49657160", "PublicKey": "ED46FF956B8EEC4BA614B1A6B0B4343D623AE37A891A0461F1F51464CFC3442CF7", "Account": "rnNzy3iPc7gPEAJbAdXwxY1UTBamBqTYhR", "Destination": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN" } } } ], "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/test/mock_data/PaymentChannelClaimCloseDenied.json ================================================ { "tx": { "Account": "rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B", "Channel": "3BDB4F92432BCEB2385D3BAA60E8AAEC9B552890A240AEE4AA9E88C9E6C517E8", "Fee": "12", "Flags": 2147614720, "LastLedgerSequence": 66063111, "Sequence": 3614, "SigningPubKey": "02A479536261866C8135FC26C63D031B2445D78AAAAEEF1DDA10898DD2047535AD", "TransactionType": "PaymentChannelClaim", "TxnSignature": "3045022100E7D7050A39B555CF3DBEE44BACC70EDEB1E2E8927E473B35F051AB3C6AEB069202200E3513ACF8A776518809757283FB2741D46F84C83DE490D8E18760F6AF949DCF", "date": "2021-09-01T15:21:50Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B", "Amount": "10000000", "Balance": "340000", "Destination": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN", "Expiration": 683828501, "Flags": 0, "OwnerNode": "0", "PublicKey": "ED81562211742AA0D8C6D6B0744D68AC28495A22AD45F1231DBB67A2FB85BB84CD", "SettleDelay": 3600, "SourceTag": 2647131528 }, "LedgerEntryType": "PayChannel", "LedgerIndex": "3BDB4F92432BCEB2385D3BAA60E8AAEC9B552890A240AEE4AA9E88C9E6C517E8", "PreviousFields": {}, "PreviousTxnID": "AA69E6C88FB2AA55755F6375B3AEE7A212083D5573F791D785742EF2D67F965F", "PreviousTxnLgrSeq": 44846252 } }, { "ModifiedNode": { "FinalFields": { "Account": "rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B", "Balance": "57106640", "Flags": 0, "OwnerCount": 4, "Sequence": 3615 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CE3A99805F4E7F9C23EC89E2206ECD6EBAB69ED2C60E8C909792F25FDDF92D6C", "PreviousFields": { "Balance": "57106652", "Sequence": 3614 }, "PreviousTxnID": "4BBA4BF89C262D89937F97B25332F26518D3E7579F438BB927FBE0F09123EC68", "PreviousTxnLgrSeq": 66063108 } } ], "TransactionIndex": 43, "TransactionResult": "tesSUCCESS" }, "hash": "88C6D876E6F8BD76945FBA14FACE7C4F301628D42E5B2C7A8BED263A869F8E2F", "ledger_index": 66063110, "date": "2021-09-01T15:21:50Z" } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/test/mock_data/PaymentChannelClaimClosed.json ================================================ { "tx": { "Account": "rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B", "Channel": "3BDB4F92432BCEB2385D3BAA60E8AAEC9B552890A240AEE4AA9E88C9E6C517E8", "Fee": "12", "Flags": 2147614720, "LastLedgerSequence": 66064744, "Sequence": 3622, "SigningPubKey": "02A479536261866C8135FC26C63D031B2445D78AAAAEEF1DDA10898DD2047535AD", "TransactionType": "PaymentChannelClaim", "TxnSignature": "304402201735A804AA7B85712825AECD2BDAE1F89FEA21D05C832E9F27C70E56BE00A555022021D9984149D014AB4D1DD17469CA7CF5A0AA588A8188C15F36434640E5EBEBBF", "date": "2021-09-01T17:05:32Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "1779FCFCF53ACAF81150E49FCDA32AE74B3DB67FCA77C054E0DEA3DEC4EFE053", "PreviousTxnID": "DCF58B05CCBAEA5C9E4A5FDC16584EAA8EAA837D512BD519ECA9856EC57D88B3", "PreviousTxnLgrSeq": 62501650 } }, { "DeletedNode": { "FinalFields": { "Account": "rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B", "Amount": "10000000", "Balance": "340000", "Destination": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN", "Expiration": 683828501, "Flags": 0, "OwnerNode": "0", "PreviousTxnID": "88C6D876E6F8BD76945FBA14FACE7C4F301628D42E5B2C7A8BED263A869F8E2F", "PreviousTxnLgrSeq": 66063110, "PublicKey": "ED81562211742AA0D8C6D6B0744D68AC28495A22AD45F1231DBB67A2FB85BB84CD", "SettleDelay": 3600, "SourceTag": 2647131528 }, "LedgerEntryType": "PayChannel", "LedgerIndex": "3BDB4F92432BCEB2385D3BAA60E8AAEC9B552890A240AEE4AA9E88C9E6C517E8" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B", "RootIndex": "44CA66F24CE13ABE62EFD98624730E36AB0C175456D801BE10409A53CA207EF2" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "44CA66F24CE13ABE62EFD98624730E36AB0C175456D801BE10409A53CA207EF2" } }, { "ModifiedNode": { "FinalFields": { "Account": "rH11fDGhbVH5NVXNXkGAMTmfWhUHjCtA3B", "Balance": "76726544", "Flags": 0, "OwnerCount": 5, "Sequence": 3623 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CE3A99805F4E7F9C23EC89E2206ECD6EBAB69ED2C60E8C909792F25FDDF92D6C", "PreviousFields": { "Balance": "67066556", "OwnerCount": 6, "Sequence": 3622 }, "PreviousTxnID": "EA3144420F4A2B64638AF7956F04BBDCE339C3FCF4EBF88E1F012ED0D3A32B61", "PreviousTxnLgrSeq": 66064741 } } ], "TransactionIndex": 52, "TransactionResult": "tesSUCCESS" }, "hash": "46526A19F87D089097DCD048AA9CFC30DCC0D6CA413665C8F6F646A0C9614EFE", "ledger_index": 66064743, "date": "2021-09-01T17:05:32Z" } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/test/mock_data/PaymentChannelClaimWithCredentialIDs.json ================================================ { "hash": "B576A11C6AE8830A1C1B77C27567D62E39A03E62DBE8FC1A09D463C2400B808A", "ledger_index": 37564494, "date": "2018-03-29T01:38:11+00:00", "tx": { "TransactionType": "PaymentChannelClaim", "Flags": 2147483648, "Sequence": 1103, "LastLedgerSequence": 37564495, "Channel": "50107651E7163E294CE0EAD8A20BF7CC046304480FCC9C74A49FFAB3F46FB98E", "Balance": "49657160", "Fee": "12", "PublicKey": "ED46FF956B8EEC4BA614B1A6B0B4343D623AE37A891A0461F1F51464CFC3442CF7", "SigningPubKey": "03D488B5AA26C87CB14BF23D470520F592A0006A916F5FEEAAB48335D8811A2E9F", "TxnSignature": "304402205E511EE2CA9BEE36F4078C24E8849A87565692938DB6C1998B449EE4A4A7BFF402201B9B78A1CE11522CCEB973FFA0BC55D8F561657A5383331EAADC6F0D67F2C347", "Signature": "55C8169517E6353A7168B4F6BE202C0C4D0828CBC3556D4576A3FF67D117F678AEC624FC98417460FA172F313FD920030C8C50B38542BD8744F578A568FB730B", "Account": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN", "CredentialIDs": [ "7B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A955", "8B685088D546B9E8905D26206F452BB2F44D9A33C9BD9BCF280F7BA39015A956" ] }, "meta": { "TransactionIndex": 10, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37563014, "PreviousTxnID": "6540E08162D034074B36A130C3683147C5BAC4E081138A97AABC4425ED264DDB", "LedgerIndex": "1779FCFCF53ACAF81150E49FCDA32AE74B3DB67FCA77C054E0DEA3DEC4EFE053", "PreviousFields": { "Sequence": 1103, "Balance": "284620533" }, "FinalFields": { "Flags": 0, "Sequence": 1104, "OwnerCount": 50, "Balance": "284630521", "Account": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN" } } }, { "ModifiedNode": { "LedgerEntryType": "PayChannel", "PreviousTxnLgrSeq": 37539781, "PreviousTxnID": "9CB070C9F40DB0D50D70E1EB1E4C69D8B48DBDDDE06263711D01595F68722936", "LedgerIndex": "50107651E7163E294CE0EAD8A20BF7CC046304480FCC9C74A49FFAB3F46FB98E", "PreviousFields": { "Balance": "49647160" }, "FinalFields": { "Flags": 0, "SourceTag": 1002539517, "SettleDelay": 3600, "OwnerNode": "0000000000000001", "Amount": "70000000", "Balance": "49657160", "PublicKey": "ED46FF956B8EEC4BA614B1A6B0B4343D623AE37A891A0461F1F51464CFC3442CF7", "Account": "rnNzy3iPc7gPEAJbAdXwxY1UTBamBqTYhR", "Destination": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN" } } } ], "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/test/mock_data/PaymentChannelClaimWithDestinationTag.json ================================================ { "tx": { "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "Amount": "1000000", "Balance": "1000000", "Channel": "5DB01B7FFED6B67E6B0414DED11E051D2EE2B7619CE0EAA6286D67A3A4D5BDB3", "Fee": "10", "Flags": 2147483648, "PublicKey": "023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6", "Sequence": 372, "Signature": "304402204EF0AFB78AC23ED1C472E74F4299C0C21F1B21D07EFC0A3838A420F76D783A400220154FB11B6F54320666E4C36CA7F686C16A3A0456800BBC43746F34AF50290064", "SigningPubKey": "03AB40A0490F9B7ED8DF29D246BF2D6269820A0EE7742ACDD457BEA7C7D0931EDB", "TransactionType": "PaymentChannelClaim", "TxnSignature": "304502210096B933BC24DA77D8C4057B4780B282BA66C668DFE1ACF4EEC063AD6661725797022037C8823669CE91AACA8CC754C9F041359F85B0B32384AEA141EBC3603798A24C", "date": "2017-04-29T03:26:41Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "AccountTxnID": "C9FE08FC88CF76C3B06622ADAA47AE99CABB3380E4D195E7751274CFD87910EB", "Balance": "76111927", "Domain": "6D64756F31332E636F6D", "EmailHash": "98B4375E1D753E5B91627516F6D70977", "Flags": 8519680, "MessageKey": "0000000000000000000000070000000300", "OwnerCount": 9, "Sequence": 373, "TransferRate": 4294967295 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8", "PreviousFields": { "AccountTxnID": "8FED577E905FD91185DE7FEF9BF7D7987BE0E25892C33E75906356EBAACE09B6", "Balance": "75111937", "Sequence": 372 }, "PreviousTxnID": "3F93C482C0BC2A1387D9E67DF60BECBB76CC2160AE98522C77AF0074D548F67D", "PreviousTxnLgrSeq": 29380080 } }, { "ModifiedNode": { "FinalFields": { "Account": "rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH", "Amount": "100000000", "Balance": "1000000", "Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "DestinationTag": 20170428, "Flags": 0, "OwnerNode": "0", "PublicKey": "023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6", "SettleDelay": 86400 }, "LedgerEntryType": "PayChannel", "LedgerIndex": "5DB01B7FFED6B67E6B0414DED11E051D2EE2B7619CE0EAA6286D67A3A4D5BDB3", "PreviousFields": { "Balance": "0" }, "PreviousTxnID": "3F93C482C0BC2A1387D9E67DF60BECBB76CC2160AE98522C77AF0074D548F67D", "PreviousTxnLgrSeq": 29380080 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "C9FE08FC88CF76C3B06622ADAA47AE99CABB3380E4D195E7751274CFD87910EB", "ledger_index": 29385089, "date": "2017-04-29T03:26:41Z" } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelClaim/types.ts ================================================ import { ExplorerAmount } from '../../../types' export interface PaymentChannelClaimInstructions { channelAmount?: ExplorerAmount claimed?: ExplorerAmount remaining?: ExplorerAmount totalClaimed?: ExplorerAmount source?: string destination?: string channel?: string renew?: boolean close?: boolean deleted?: boolean credentialIDs?: string[] } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/Description.tsx ================================================ import { useTranslation } from 'react-i18next' import type { PaymentChannelCreate } from 'xrpl' import { localizeDate, localizeNumber } from '../../../utils' import { convertRippleDate } from '../../../../../rippled/lib/convertRippleDate' import { DATE_OPTIONS, findNode } from '../../../transactionUtils' import { Account } from '../../Account' import { useLanguage } from '../../../hooks' import { TransactionDescriptionProps } from '../types' import { Amount } from '../../Amount' export const Description = ({ data, }: TransactionDescriptionProps) => { const language = useLanguage() const { t } = useTranslation() const { tx } = data const cancelAfter = tx.CancelAfter && localizeDate(convertRippleDate(tx.CancelAfter), language, DATE_OPTIONS) const node = findNode(data.meta, 'CreatedNode', 'PayChannel') return ( <>
    {`${t('the_account')} `} {` ${t('create_payment_channel')} `}
    {node && (
    {t('the_channel_id_is')} {node.LedgerIndex}
    )}
    {t('the_channel_amount_is')}{' '}
    {tx.SettleDelay && (
    {t('channel_settle_delay')}{' '} {localizeNumber(tx.SettleDelay, language)} {t('seconds')}
    )} {tx.CancelAfter && (
    {t('describe_cancel_after')} {` ${cancelAfter} ${DATE_OPTIONS.timeZone}`}
    )} ) } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { DATE_OPTIONS } from '../../../transactionUtils' import { localizeNumber, localizeDate } from '../../../utils' import { Account } from '../../Account' import { Amount } from '../../Amount' import { SimpleRow } from '../SimpleRow' import { useLanguage } from '../../../hooks' import { TransactionSimpleProps } from '../types' import { PaymentChannelCreateInstructions } from './types' export const Simple = ({ data, }: TransactionSimpleProps) => { const language = useLanguage() const { t } = useTranslation() const { amount, source, destination, delay, cancelAfter, channel } = data.instructions return ( <> {delay && ( {localizeNumber(delay, language)} {t('seconds_short')} )} {cancelAfter && ( {localizeDate(new Date(cancelAfter), language, DATE_OPTIONS)}{' '} {DATE_OPTIONS.timeZone} )} {channel && ( {channel} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { PaymentChannelCreateInstructions } from './types' import { Amount } from '../../Amount' import { Account } from '../../Account' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { amount, source, destination } = instructions return (
    {t('source')}
    {t('destination')}
    {t('channel_amount')}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' import { parser } from './parser' export const PaymentChannelCreateTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.CREATE, category: TransactionCategory.PAYMENT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/parser.ts ================================================ import type { PaymentChannelCreate } from 'xrpl' import { convertRippleDate } from '../../../../../rippled/lib/convertRippleDate' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { findNode } from '../../../transactionUtils' export const parser = (tx: PaymentChannelCreate, meta: any) => { const st = tx.SourceTag ? `:${tx.SourceTag}` : '' const dt = tx.DestinationTag ? `:${tx.DestinationTag}` : '' const node = findNode(meta, 'CreatedNode', 'PayChannel') return { amount: formatAmount(tx.Amount), source: `${tx.Account}${st}`, destination: `${tx.Destination}${dt}`, pubkey: tx.PublicKey, delay: tx.SettleDelay, cancelAfter: tx.CancelAfter ? convertRippleDate(tx.CancelAfter) : undefined, channel: node && node.LedgerIndex, } } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/test/PaymentChannelCreateDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test' import mockPaymentChannelCreate from './mock_data/PaymentChannelCreate.json' import mockPaymentChannelCreateFailed from './mock_data/PaymentChannelCreateFailed.json' import mockPaymentChannelCreateWithDestinationTag from './mock_data/PaymentChannelCreateWithDestinationTag.json' import { Description } from '../Description' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('PaymentChannelCreate: Description', () => { it('renders', () => { const { container, unmount } = renderComponent(mockPaymentChannelCreate) expect( container.querySelector('[data-testid="accounts-line"]'), ).toHaveTextContent( `The account rJnQrhRTXutuSwtrwxYiTkHn4Dtp8sF2LM:2460331042 will create a payment channel to rUXYat4hW2M87gHoqKK7fC4cqrT9C6V7d7`, ) expect( container.querySelector('[data-testid="channel-line"]'), ).toHaveTextContent( `The channel ID is 15AB9EE9344C42C05164E6A1F2F08B35F35D7B9D66CCB9697452B0995C8F8242`, ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent(`The channel amount is \uE9001.00 XRP`) expect( container.querySelector('[data-testid="delay-line"]'), ).toHaveTextContent(`The channel has a settlement delay of 3,600 seconds`) expect( container.querySelector('[data-testid="cancel-line"]'), ).not.toBeInTheDocument() unmount() }) it('renders failed tx', () => { const { container, unmount } = renderComponent( mockPaymentChannelCreateFailed, ) expect( container.querySelector('[data-testid="accounts-line"]'), ).toHaveTextContent( `The account rMphibGfHpLDU4DzVCspzLYVuMNpmzN6n8:2810223114 will create a payment channel to rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN`, ) expect( container.querySelector('[data-testid="channel-line"]'), ).not.toBeInTheDocument() expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent(`The channel amount is \uE90010.00 XRP`) expect( container.querySelector('[data-testid="delay-line"]'), ).toHaveTextContent(`The channel has a settlement delay of 3,600 seconds`) expect( container.querySelector('[data-testid="cancel-line"]'), ).not.toBeInTheDocument() unmount() }) it('renders tx with destination tag', () => { const { container, unmount } = renderComponent( mockPaymentChannelCreateWithDestinationTag, ) expect( container.querySelector('[data-testid="accounts-line"]'), ).toHaveTextContent( `The account rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH will create a payment channel to rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn:20170428`, ) expect( container.querySelector('[data-testid="channel-line"]'), ).toHaveTextContent( `The channel ID is 5DB01B7FFED6B67E6B0414DED11E051D2EE2B7619CE0EAA6286D67A3A4D5BDB3`, ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent(`The channel amount is \uE900100.00 XRP`) expect( container.querySelector('[data-testid="delay-line"]'), ).toHaveTextContent(`The channel has a settlement delay of 86,400 seconds`) expect( container.querySelector('[data-testid="cancel-line"]'), ).not.toBeInTheDocument() unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/test/PaymentChannelCreateSimple.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createSimpleRenderFactory, expectSimpleRowLabel, expectSimpleRowNotToExist, expectSimpleRowText, } from '../../test' import mockPaymentChannelCreate from './mock_data/PaymentChannelCreate.json' import mockPaymentChannelCreateFailed from './mock_data/PaymentChannelCreateFailed.json' import mockPaymentChannelCreateWithDestinationTag from './mock_data/PaymentChannelCreateWithDestinationTag.json' import { Simple } from '../Simple' const renderComponent = createSimpleRenderFactory(Simple, i18n) describe('PaymentChannelCreate: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockPaymentChannelCreate) expectSimpleRowLabel(container, 'amount', 'Amount') expectSimpleRowText(container, 'amount', '\uE9001.00 XRP') expectSimpleRowLabel(container, 'source', 'source') expectSimpleRowText( container, 'source', 'rJnQrhRTXutuSwtrwxYiTkHn4Dtp8sF2LM:2460331042', ) expectSimpleRowLabel(container, 'destination', 'destination') expectSimpleRowText( container, 'destination', 'rUXYat4hW2M87gHoqKK7fC4cqrT9C6V7d7', ) expectSimpleRowLabel(container, 'delay', 'Settlement Delay') expectSimpleRowText(container, 'delay', '3,600 sec.') expectSimpleRowLabel(container, '.channel', 'Channel ID') expectSimpleRowText( container, '.channel', '15AB9EE9344C42C05164E6A1F2F08B35F35D7B9D66CCB9697452B0995C8F8242', ) unmount() }) it('renders failed tx', () => { const { container, unmount } = renderComponent( mockPaymentChannelCreateFailed, ) expectSimpleRowText(container, 'amount', '\uE90010.00 XRP') expectSimpleRowText( container, 'source', 'rMphibGfHpLDU4DzVCspzLYVuMNpmzN6n8:2810223114', ) expectSimpleRowText( container, 'destination', 'rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN', ) expectSimpleRowText(container, 'delay', '3,600 sec.') expectSimpleRowNotToExist(container, '.channel') unmount() }) it('renders tx with destination tag', () => { const { container, unmount } = renderComponent( mockPaymentChannelCreateWithDestinationTag, ) expectSimpleRowText(container, 'amount', '\uE900100.00 XRP') expectSimpleRowText( container, 'source', 'rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', ) expectSimpleRowText( container, 'destination', 'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn:20170428', ) expectSimpleRowText(container, 'delay', '86,400 sec.') expectSimpleRowText( container, '.channel', '5DB01B7FFED6B67E6B0414DED11E051D2EE2B7619CE0EAA6286D67A3A4D5BDB3', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/test/PaymentChannelCreateTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import mockPaymentChannelCreate from './mock_data/PaymentChannelCreate.json' import mockPaymentChannelCreateFailed from './mock_data/PaymentChannelCreateFailed.json' import mockPaymentChannelCreateWithDestinationTag from './mock_data/PaymentChannelCreateWithDestinationTag.json' import { TableDetail } from '../TableDetail' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('PaymentChannelCreate: TableDetail', () => { it('renders', () => { const { container, unmount } = renderComponent(mockPaymentChannelCreate) expect(container.querySelector('[data-testid="source"]')).toHaveTextContent( 'sourcerJnQrhRTXutuSwtrwxYiTkHn4Dtp8sF2LM:2460331042', ) expect( container.querySelector('[data-testid="destination"]'), ).toHaveTextContent('destinationrUXYat4hW2M87gHoqKK7fC4cqrT9C6V7d7') expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( '\uE9001.00 XRP', ) unmount() }) it('renders failed tx', () => { const { container, unmount } = renderComponent( mockPaymentChannelCreateFailed, ) expect(container.querySelector('[data-testid="source"]')).toHaveTextContent( 'sourcerMphibGfHpLDU4DzVCspzLYVuMNpmzN6n8:2810223114', ) expect( container.querySelector('[data-testid="destination"]'), ).toHaveTextContent('destinationrK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN') expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( '\uE90010.00 XRP', ) unmount() }) it('renders tx with destination tag', () => { const { container, unmount } = renderComponent( mockPaymentChannelCreateWithDestinationTag, ) expect(container.querySelector('[data-testid="source"]')).toHaveTextContent( 'sourcerN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH', ) expect( container.querySelector('[data-testid="destination"]'), ).toHaveTextContent( 'destinationrf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn:20170428', ) expect(container.querySelector('[data-testid="amount"]')).toHaveTextContent( '\uE900100.00 XRP', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/test/mock_data/PaymentChannelCreate.json ================================================ { "hash": "6B0290096EE6AE136C60F1A6C2C6CE51006BE1B581DD833250F05482D778DEA9", "ledger_index": 35982312, "date": "2018-01-21T00:00:00+00:00", "tx": { "TransactionType": "PaymentChannelCreate", "Flags": 2147483648, "SourceTag": 2460331042, "Sequence": 21, "LastLedgerSequence": 35982313, "SettleDelay": 3600, "Amount": "1000000", "Fee": "12", "PublicKey": "EDA77EDD1D4BC31E7D104D345A0E74508CC66285E9263E8D229F6FC51E70078BA0", "SigningPubKey": "036F7E0C4361596CAC3D4435C1FE087C9E41D9769FD219519BEF3733D8CACE03CA", "TxnSignature": "3045022100908F55BA9A90D377E0C4AC0C823CB0D02AF316882CF34940B33CAB49DDBF8DB1022077D4A891C55204F2B2A97B4C91CC7FA5FD8DBEE7FABECE12ACB65A7BCB388FFE", "Account": "rJnQrhRTXutuSwtrwxYiTkHn4Dtp8sF2LM", "Destination": "rUXYat4hW2M87gHoqKK7fC4cqrT9C6V7d7" }, "meta": { "TransactionIndex": 0, "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "PayChannel", "LedgerIndex": "15AB9EE9344C42C05164E6A1F2F08B35F35D7B9D66CCB9697452B0995C8F8242", "NewFields": { "SourceTag": 2460331042, "SettleDelay": 3600, "Amount": "1000000", "PublicKey": "EDA77EDD1D4BC31E7D104D345A0E74508CC66285E9263E8D229F6FC51E70078BA0", "Account": "rJnQrhRTXutuSwtrwxYiTkHn4Dtp8sF2LM", "Destination": "rUXYat4hW2M87gHoqKK7fC4cqrT9C6V7d7" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 35982310, "PreviousTxnID": "E2D4BC42A95E66F6AE737A40938915672A8345FEA630FEF1F392518544CEC398", "LedgerIndex": "2E5E4BEDEBBFAA768B4AD0B0732CA774AB5C225551009EA5E2F84FAEB06A7304", "PreviousFields": { "Sequence": 21, "OwnerCount": 7, "Balance": "492078743" }, "FinalFields": { "Flags": 0, "Sequence": 22, "OwnerCount": 8, "Balance": "491078731", "Account": "rJnQrhRTXutuSwtrwxYiTkHn4Dtp8sF2LM" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 35982310, "PreviousTxnID": "E2D4BC42A95E66F6AE737A40938915672A8345FEA630FEF1F392518544CEC398", "LedgerIndex": "4577D22E8C48C0F478B95ED04213CD21A0DEA93A6F9756B3B832CA96227765EA" } }, { "ModifiedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "9B84088FE84F4DBF6CD5C3EA957E8CD9BC8B73C0DEA754442D065A2950EFA969", "FinalFields": { "Flags": 0, "RootIndex": "9B84088FE84F4DBF6CD5C3EA957E8CD9BC8B73C0DEA754442D065A2950EFA969", "Owner": "rJnQrhRTXutuSwtrwxYiTkHn4Dtp8sF2LM" } } } ], "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/test/mock_data/PaymentChannelCreateFailed.json ================================================ { "tx": { "Account": "rMphibGfHpLDU4DzVCspzLYVuMNpmzN6n8", "Amount": "10000000", "Destination": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN", "Fee": "12", "Flags": 2147483648, "LastLedgerSequence": 41685537, "PublicKey": "EDD1A0776D0ED2DB7D5D902EAD9FA5DA5F48C2617ECF96B1FC50BC77C0AF9CFCCB", "Sequence": 2, "SettleDelay": 3600, "SigningPubKey": "0317F3AFB6C18B774ABEB358AE60E670921BF2B0D5791A581B9D4B0AF2CDA2929F", "SourceTag": 2810223114, "TransactionType": "PaymentChannelCreate", "TxnSignature": "3045022100E779A52BE51B601A3B4E10ED82FA5ED18D1C85F1CAA16366ED2BF6DB13B328E502205866DE995B49180D2952AE3A365CE2A104D21C43CA730541161629BD80A9D95E", "date": "2018-09-21T11:43:02Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rMphibGfHpLDU4DzVCspzLYVuMNpmzN6n8", "Balance": "39999976", "Flags": 0, "OwnerCount": 1, "Sequence": 3 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "71EBC5CDFFE25A80A8D04D9DEAFFEF0127CD6EF940311E20BEC0679C16AB32F9", "PreviousFields": { "Balance": "39999988", "Sequence": 2 }, "PreviousTxnID": "B24450EF9CE1D8A2AF18DA5625152EC72D93959BC6473E8D9C34D5051CACFFB1", "PreviousTxnLgrSeq": 41685413 } } ], "TransactionIndex": 40, "TransactionResult": "tecUNFUNDED" }, "hash": "689E7B2030D8E8C23CB0D2C6F86F8A46C0DFE018A2F0FCD773347590CAD8632F", "ledger_index": 41685536, "date": "2018-09-21T11:43:02Z" } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/test/mock_data/PaymentChannelCreateWithDestinationTag.json ================================================ { "tx": { "Account": "rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH", "Amount": "100000000", "Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "DestinationTag": 20170428, "Fee": "10", "Flags": 2147483648, "PublicKey": "023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6", "Sequence": 39, "SettleDelay": 86400, "SigningPubKey": "023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6", "TransactionType": "PaymentChannelCreate", "TxnSignature": "304402204C0850DFA1526E7C523284BF0944E59A72362F9F21CF056376CA1B9119E2B5C3022052E37B45BB82D15CCA742B26566904445A0530AABA60568E16FB1EBE60024824", "date": "2017-04-28T22:32:00Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8", "PreviousTxnID": "8FED577E905FD91185DE7FEF9BF7D7987BE0E25892C33E75906356EBAACE09B6", "PreviousTxnLgrSeq": 29380025 } }, { "CreatedNode": { "LedgerEntryType": "PayChannel", "LedgerIndex": "5DB01B7FFED6B67E6B0414DED11E051D2EE2B7619CE0EAA6286D67A3A4D5BDB3", "NewFields": { "Account": "rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH", "Amount": "100000000", "Destination": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn", "DestinationTag": 20170428, "PublicKey": "023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6", "SettleDelay": 86400 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH", "Balance": "942868460", "Flags": 0, "OwnerCount": 3, "Sequence": 40 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B1CB040A17F9469BC00376EC8719535655824AD16CB5F539DD5765FEA88FDBE3", "PreviousFields": { "Balance": "1042868470", "OwnerCount": 2, "Sequence": 39 }, "PreviousTxnID": "AE8C1F8D44D809F12E5FCF5457E8B28CC3E5FB6A87DF5F52686E32064F4AB1DB", "PreviousTxnLgrSeq": 29380069 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH", "RootIndex": "E590FC40B4F24D18341569BD3702A2D4E07E7BC04D11CE63608B67979E67030C" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E590FC40B4F24D18341569BD3702A2D4E07E7BC04D11CE63608B67979E67030C" } } ], "TransactionIndex": 16, "TransactionResult": "tesSUCCESS" }, "hash": "3F93C482C0BC2A1387D9E67DF60BECBB76CC2160AE98522C77AF0074D548F67D", "ledger_index": 29380080, "date": "2017-04-28T22:32:00Z" } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelCreate/types.ts ================================================ import { ExplorerAmount } from '../../../types' export interface PaymentChannelCreateInstructions { amount: ExplorerAmount source: string destination: string channel: string delay: number cancelAfter: string } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelFund/Description.tsx ================================================ import { useTranslation } from 'react-i18next' import type { PaymentChannelFund } from 'xrpl' import { findNode } from '../../../transactionUtils' import { Amount } from '../../Amount' import { TransactionDescriptionProps } from '../types' export const Description = ({ data, }: TransactionDescriptionProps) => { const { t } = useTranslation() const node = findNode(data.meta, 'ModifiedNode', 'PayChannel') return ( <>
    {t('update_payment_channel')}{' '} {data.tx.Channel}
    {data.tx.Amount && (
    {t('increase_channel_amount_by')}{' '} {node && ( {` ${t('from')} `} {` ${t('to')} `} )}
    )} ) } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelFund/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { TransactionSimpleProps } from '../types' import { PaymentChannelFundInstructions } from './types' import { Amount } from '../../Amount' import { SimpleRow } from '../SimpleRow' export const Simple = ({ data, }: TransactionSimpleProps) => { const { t } = useTranslation() const { channelAmount, increase, totalClaimed, source = '', destination = '', channel, } = data.instructions return ( <> {increase && ( )} {channelAmount && ( )} {totalClaimed && ( )} {source && ( )} {destination && ( )} {channel && ( {channel} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelFund/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' import { Description } from './Description' export const PaymentChannelFundTransaction: TransactionMapping = { Description, Simple, action: TransactionAction.SEND, category: TransactionCategory.PAYMENT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelFund/parser.ts ================================================ import type { PaymentChannelFund, TransactionMetadata } from 'xrpl' import { PaymentChannelFundInstructions } from './types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' const findNode = ( meta: TransactionMetadata, nodeType: 'DeletedNode' | 'ModifiedNode', ) => { const metaNode = meta.AffectedNodes.find( (node) => node[nodeType] && node[nodeType].LedgerEntryType === 'PayChannel', ) return metaNode ? metaNode[nodeType] : null } const getDetails = (node: any): PaymentChannelFundInstructions => { const st = node.FinalFields.SourceTag ? `:${node.FinalFields.SourceTag}` : '' const dt = node.FinalFields.DestinationTag ? `:${node.FinalFields.DestinationTag}` : '' return { source: `${node.FinalFields.Account}${st}`, destination: `${node.FinalFields.Destination}${dt}`, } } export const parser = ( tx: PaymentChannelFund, meta: TransactionMetadata, ): PaymentChannelFundInstructions => { const node = findNode(meta, 'ModifiedNode') const channel = { ...(node && getDetails(node)), channel: tx.Channel, } channel.increase = formatAmount(tx.Amount) if (node) { channel.channelAmount = formatAmount(node.FinalFields.Amount) channel.totalClaimed = formatAmount(node.FinalFields.Balance) } return channel } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelFund/test/PaymentChannelFundDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test/createWrapperFactory' import mockPaymentChannelFund from './mock_data/PaymentChannelFund.json' import mockPaymentChannelFundFailed from './mock_data/PaymentChannelFundFailed.json' import { Description } from '../Description' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('PaymentChannelFund: Description', () => { it('renders a Fund', () => { const { container, unmount } = renderComponent(mockPaymentChannelFund) expect( container.querySelector('[data-testid="channel-line"]'), ).toHaveTextContent( `It will update the payment channel 4BEAC9E4C10674AB698EAC0F2D78A4FF507428370578A59B04883E7EB8D82260`, ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( `It will increase the channel amount by \uE9001.00 XRP from \uE90074.00 XRP to \uE90075.00 XRP`, ) unmount() }) it('renders failed tx', () => { const { container, unmount } = renderComponent(mockPaymentChannelFundFailed) expect( container.querySelector('[data-testid="channel-line"]'), ).toHaveTextContent( `It will update the payment channel 933F93F7113A2F94B7838D64D0D2A244C57EFD6411C16FFF5FA293D200EF5876`, ) expect( container.querySelector('[data-testid="amount-line"]'), ).toHaveTextContent( `It will increase the channel amount by \uE90020.00 XRP`, ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelFund/test/PaymentChannelFundSimple.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockPaymentChannelFund from './mock_data/PaymentChannelFund.json' import mockPaymentChannelFundFailed from './mock_data/PaymentChannelFundFailed.json' import { expectSimpleRowLabel, expectSimpleRowNotToExist, expectSimpleRowText, } from '../../test' const renderComponent = createSimpleRenderFactory(Simple, i18n) describe('PaymentChannelFund: Simple', () => { it('renders a fund', () => { const { container, unmount } = renderComponent(mockPaymentChannelFund) expectSimpleRowLabel(container, 'increase', 'channel amount increase') expectSimpleRowText(container, 'increase', '+\uE9001.00 XRP') expectSimpleRowLabel(container, 'channel-amount', 'channel amount') expectSimpleRowText(container, 'channel-amount', '\uE90075.00 XRP') expectSimpleRowLabel(container, 'total', 'total claimed') expectSimpleRowText(container, 'total', '\uE90061.859345 XRP') expectSimpleRowLabel(container, 'source', 'source') expectSimpleRowText( container, 'source', 'rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN:3839231768', ) expectSimpleRowLabel(container, 'destination', 'destination') expectSimpleRowText( container, 'destination', 'rBFpf3YQQrcR1HnCt5AhYpNVvXUh4W89Dr', ) expectSimpleRowLabel(container, '.channel', 'Channel ID') expectSimpleRowText( container, '.channel', '4BEAC9E4C10674AB698EAC0F2D78A4FF507428370578A59B04883E7EB8D82260', ) unmount() }) it('renders failed tx', () => { const { container, unmount } = renderComponent(mockPaymentChannelFundFailed) expectSimpleRowLabel(container, 'increase', 'channel amount increase') expectSimpleRowText(container, 'increase', '+\uE90020.00 XRP') expectSimpleRowNotToExist(container, 'channel-amount') expectSimpleRowNotToExist(container, 'total') expectSimpleRowNotToExist(container, 'source') expectSimpleRowNotToExist(container, 'destination') expectSimpleRowNotToExist(container, 'source') expectSimpleRowText( container, '.channel', '933F93F7113A2F94B7838D64D0D2A244C57EFD6411C16FFF5FA293D200EF5876', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelFund/test/mock_data/PaymentChannelFund.json ================================================ { "hash": "56C30DEB930917C85C07AA91E48DAD849B3F68EB51AC244C20CD925BACE89ED5", "ledger_index": 36435648, "date": "2018-02-09T00:06:22+00:00", "tx": { "TransactionType": "PaymentChannelFund", "Flags": 2147483648, "Sequence": 593, "LastLedgerSequence": 36435649, "Channel": "4BEAC9E4C10674AB698EAC0F2D78A4FF507428370578A59B04883E7EB8D82260", "Amount": "1000000", "Fee": "12", "SigningPubKey": "03D488B5AA26C87CB14BF23D470520F592A0006A916F5FEEAAB48335D8811A2E9F", "TxnSignature": "3045022100F801125D3F6A64A7B3BDCF17DC07365C89BAE2D84590E986310E34ADDA33F60E022063667A423E05A44F5BA4C474B94589397F64ED9E0AE366B4E1BEF162EEF58157", "Account": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN" }, "meta": { "TransactionIndex": 2, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 36435648, "PreviousTxnID": "BF6B24B492A4236CC138F375A5EB98A9C52F257204935457CDE28A5B0B28B14F", "LedgerIndex": "1779FCFCF53ACAF81150E49FCDA32AE74B3DB67FCA77C054E0DEA3DEC4EFE053", "PreviousFields": { "Sequence": 593, "Balance": "283417527" }, "FinalFields": { "Flags": 0, "Sequence": 594, "OwnerCount": 50, "Balance": "282417515", "Account": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN" } } }, { "ModifiedNode": { "LedgerEntryType": "PayChannel", "PreviousTxnLgrSeq": 36435648, "PreviousTxnID": "BF6B24B492A4236CC138F375A5EB98A9C52F257204935457CDE28A5B0B28B14F", "LedgerIndex": "4BEAC9E4C10674AB698EAC0F2D78A4FF507428370578A59B04883E7EB8D82260", "PreviousFields": { "Amount": "74000000" }, "FinalFields": { "Flags": 0, "SourceTag": 3839231768, "SettleDelay": 3600, "OwnerNode": "0000000000000001", "Amount": "75000000", "Balance": "61859345", "PublicKey": "ED1E97883F12E98C222752A93375481288158401948D2FD8C070AC8D7B5E9E0D7C", "Account": "rK6g2UYc4GpQH8DYdPG7wywyQbxkJpQTTN", "Destination": "rBFpf3YQQrcR1HnCt5AhYpNVvXUh4W89Dr" } } } ], "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelFund/test/mock_data/PaymentChannelFundFailed.json ================================================ { "tx": { "Account": "rnNzy3iPc7gPEAJbAdXwxY1UTBamBqTYhR", "Amount": "20000000", "Channel": "933F93F7113A2F94B7838D64D0D2A244C57EFD6411C16FFF5FA293D200EF5876", "Fee": "12", "Flags": 2147483648, "LastLedgerSequence": 29704605, "Sequence": 13, "SigningPubKey": "0389AFC598BDF777F2EDEF5C4140689819AC50C59D030B48C84EDA0F50D633E68B", "TransactionType": "PaymentChannelFund", "TxnSignature": "30440220176BCD35897E3928F533FB54044EBC82AEFB9B1EB64EE4AEC601D089A133B3F5022037D660874C6EC440DB499221EA5E21BE77F338D2F93D33288BA6988286E1471B", "date": "2017-05-12T09:29:41Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rnNzy3iPc7gPEAJbAdXwxY1UTBamBqTYhR", "Balance": "13886332216", "Flags": 0, "OwnerCount": 6, "Sequence": 14 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C2DC646AA232F1F1D8F7901A56A10BE277D44FEA77C501C1BB15125FDF5F7128", "PreviousFields": { "Balance": "13886332228", "Sequence": 13 }, "PreviousTxnID": "8C271FA6F9FFEE3EE738836234DBA8109AAD4B40B826A8AD973339F699631A73", "PreviousTxnLgrSeq": 29689286 } } ], "TransactionIndex": 50, "TransactionResult": "tecNO_ENTRY" }, "hash": "0038436F4891822B2518501F22E34277E3BADEA8FD70DF00651AA76A4F65AF27", "ledger_index": 29704603, "date": "2017-05-12T09:29:41Z" } ================================================ FILE: src/containers/shared/components/Transaction/PaymentChannelFund/types.ts ================================================ import { ExplorerAmount } from '../../../types' export interface PaymentChannelFundInstructions { channelAmount?: ExplorerAmount increase?: ExplorerAmount totalClaimed?: ExplorerAmount source?: string destination?: string channel?: string } ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainDelete/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { type PermissionedDomainDelete } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { DomainID: domainID } = data.instructions return ( {domainID} ) } export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainDelete/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { type PermissionedDomainDelete } from 'xrpl' import { TransactionTableDetailProps } from '../types' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { DomainID: domainID } = instructions return (
    {t('domain_id')}: {domainID}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainDelete/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const PermissionedDomainDeleteTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.CANCEL, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainDelete/test/PermissionedDomainDeleteSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import PermissionedDomainDelete from './mock_data/PermissionedDomainDelete.json' const renderComponent = createSimpleRenderFactory(Simple) describe('PermissionedDomainDeleteSimple: Renders', () => { it('renders', () => { const { container, unmount } = renderComponent(PermissionedDomainDelete) expectSimpleRowText( container, 'domain-id', 'F075484241C8FD27C750F1DD93E0B5E0A42D9ADFE5E7B2313DD927E3DE0DBA6E', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainDelete/test/PermissionedDomainDeleteTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import PermissionedDomainDelete from './mock_data/PermissionedDomainDelete.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('PermissionedDomainDeleteTableDetail ', () => { it('renders PermissionedDomainDeleteTableDetail', () => { const { container, unmount } = renderComponent(PermissionedDomainDelete) expect( container.querySelector('[data-testid="domain-id"]'), ).toHaveTextContent( 'domain_id: F075484241C8FD27C750F1DD93E0B5E0A42D9ADFE5E7B2313DD927E3DE0DBA6E', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainDelete/test/mock_data/PermissionedDomainDelete.json ================================================ { "close_time_iso": "2025-01-21T01:51:40Z", "ctid": "C000005A0000F7E0", "hash": "1008A97884DD03C3B4812C53D01B2482F55B9C2E1E1323DE468B862BA002A771", "ledger_hash": "E60EC716557B89B709B037D2AE8252A909020E31CAE0C4659FB2739F47997979", "ledger_index": 90, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rhBPeJFG9pxvU22AxkzBpt6zzyk89xhdr3", "Balance": "1999997599", "Flags": 0, "OwnerCount": 3, "Sequence": 77 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5A8ABEB4FA540056A51E0D25177DB7E672E6D7E947DF5D347B9E1489D106F873", "PreviousFields": { "Balance": "1999997799", "OwnerCount": 4, "Sequence": 76 }, "PreviousTxnID": "676E4F1DF5DC4F9C2223DDE9999EF5A8392B310C49B84C7AB04BA10A6CDABFE4", "PreviousTxnLgrSeq": 89 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rhBPeJFG9pxvU22AxkzBpt6zzyk89xhdr3", "RootIndex": "D9B8A922B4C857D4BA2CED2870A54D0DF9A45F7D9F7A145B627E291CCBD73FEE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D9B8A922B4C857D4BA2CED2870A54D0DF9A45F7D9F7A145B627E291CCBD73FEE", "PreviousTxnID": "676E4F1DF5DC4F9C2223DDE9999EF5A8392B310C49B84C7AB04BA10A6CDABFE4", "PreviousTxnLgrSeq": 89 } }, { "DeletedNode": { "FinalFields": { "AcceptedCredentials": [ { "Credential": { "CredentialType": "4964656E74697479446F63756D656E74", "Issuer": "rhBPeJFG9pxvU22AxkzBpt6zzyk89xhdr3" } } ], "Flags": 0, "Owner": "rhBPeJFG9pxvU22AxkzBpt6zzyk89xhdr3", "OwnerNode": "0", "PreviousTxnID": "676E4F1DF5DC4F9C2223DDE9999EF5A8392B310C49B84C7AB04BA10A6CDABFE4", "PreviousTxnLgrSeq": 89, "Sequence": 75 }, "LedgerEntryType": "PermissionedDomain", "LedgerIndex": "F075484241C8FD27C750F1DD93E0B5E0A42D9ADFE5E7B2313DD927E3DE0DBA6E" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rhBPeJFG9pxvU22AxkzBpt6zzyk89xhdr3", "DomainID": "F075484241C8FD27C750F1DD93E0B5E0A42D9ADFE5E7B2313DD927E3DE0DBA6E", "Fee": "200", "Flags": 0, "LastLedgerSequence": 109, "NetworkID": 63456, "Sequence": 76, "SigningPubKey": "ED0FD90553E43698CA5878F9AE1063AF1178728324356BFF116D3331B243F11FDD", "TransactionType": "PermissionedDomainDelete", "TxnSignature": "9C248D71E6221DBBE2F65DB2D3B7B0B0DF8FA11057A60719CCBE6A257D6255068E39D82C740ED7B05B3C99A4A591DA59847C0222A6B5F8DC90C480D249F30E01", "date": 790739500, "ledger_index": 90 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { type PermissionedDomainSet } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { AcceptedCredentials: acceptedCredentials } = data.instructions return ( {acceptedCredentials.map((credential) => (
    {credential.Credential.CredentialType} {credential.Credential.Issuer}
    ))}
    ) } export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainSet/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { type PermissionedDomainSet } from 'xrpl' import { TransactionTableDetailProps } from '../types' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { AcceptedCredentials: acceptedCredentials } = instructions return (
    {acceptedCredentials.map((credential) => (
    {t('credential_type')}: {credential.Credential.CredentialType}
    {t('credential_issuer')}: {credential.Credential.Issuer}
    ))}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainSet/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const PermissionedDomainSetTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.MODIFY, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainSet/test/PermissionedDomainSetSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import PermissionedDomainSet from './mock_data/PermissionedDomainSet.json' const renderComponent = createSimpleRenderFactory(Simple) describe('PermissionedDomainSetSimple: Renders', () => { it('renders', () => { const { container, unmount } = renderComponent(PermissionedDomainSet) expectSimpleRowText( container, 'cred-type', '4964656E74697479446F63756D656E74', ) expectSimpleRowText( container, 'cred-issuer', 'rUVQzukKnGSw4qNjEvBxLxquaLaMwzVBab', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainSet/test/PermissionedDomainSetTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import PermissionedDomainSet from './mock_data/PermissionedDomainSet.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('PermissionedDomainSetTableDetail', () => { it('renders PermissionedDomainSetTableDetail', () => { const { container, unmount } = renderComponent(PermissionedDomainSet) expect( container.querySelector('[data-testid="cred-type"]'), ).toHaveTextContent('credential_type: 4964656E74697479446F63756D656E74') expect( container.querySelector('[data-testid="cred-issuer"]'), ).toHaveTextContent('credential_issuer: rUVQzukKnGSw4qNjEvBxLxquaLaMwzVBab') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/PermissionedDomainSet/test/mock_data/PermissionedDomainSet.json ================================================ { "close_time_iso": "2025-01-19T02:21:39Z", "ctid": "C00000400000F7E0", "hash": "561E23C018C9D6B9A1C03F1AD90E2DEB57DEF5ADA0C3886004F3B1423948A9A7", "ledger_hash": "D9408AA31B24A03E999C13FE93B0D43174FD1CC4BACE884B012E7FAB255BDEED", "ledger_index": 64, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "PermissionedDomain", "LedgerIndex": "1FF57AD569BC5258A4D3C5AAB77DDEBB68E286F72D8EAB49DEE3DD35C2C5A4AF", "NewFields": { "AcceptedCredentials": [ { "Credential": { "CredentialType": "4964656E74697479446F63756D656E74", "Issuer": "rUVQzukKnGSw4qNjEvBxLxquaLaMwzVBab" } } ], "Owner": "rUVQzukKnGSw4qNjEvBxLxquaLaMwzVBab", "Sequence": 50 } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rUVQzukKnGSw4qNjEvBxLxquaLaMwzVBab", "RootIndex": "3ECFCBD5393D4EBA88476B159B542BD7D2159D72BF35488ED294E90931567D93" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3ECFCBD5393D4EBA88476B159B542BD7D2159D72BF35488ED294E90931567D93", "PreviousTxnID": "E3A10DD121B54CB7D8922A77D26C9D766FD8A07850287F278F9313057D664DD4", "PreviousTxnLgrSeq": 63 } }, { "ModifiedNode": { "FinalFields": { "Account": "rUVQzukKnGSw4qNjEvBxLxquaLaMwzVBab", "Balance": "1999997799", "Flags": 0, "OwnerCount": 4, "Sequence": 51 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DBACFFF9DBF52B26633B4CED74BD43E8AEF09C20F46C80D83C3A3230BD4E3985", "PreviousFields": { "Balance": "1999997999", "OwnerCount": 3, "Sequence": 50 }, "PreviousTxnID": "E3A10DD121B54CB7D8922A77D26C9D766FD8A07850287F278F9313057D664DD4", "PreviousTxnLgrSeq": 63 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "AcceptedCredentials": [ { "Credential": { "CredentialType": "4964656E74697479446F63756D656E74", "Issuer": "rUVQzukKnGSw4qNjEvBxLxquaLaMwzVBab" } } ], "Account": "rUVQzukKnGSw4qNjEvBxLxquaLaMwzVBab", "Fee": "200", "Flags": 0, "LastLedgerSequence": 83, "NetworkID": 63456, "Sequence": 50, "SigningPubKey": "ED7EE9DDAFF54720AD642944B666CC359091F170BA49C084C3E59803ACDBB17647", "TransactionType": "PermissionedDomainSet", "TxnSignature": "B505D12FEDCBAEE792FE5317253E633C094F5D7D8B6D3C9A54B4EAF1F56B2D7F537356D1292A2BAFAE163343BD659F05BF8C916EBA0B10B54D78F20B33B93205", "date": 790568499, "ledger_index": 64 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/README.md ================================================ # How Transactions Are Defined Each transaction has its properties defined in `./{TransactionType}/index.ts`. - **Description**: A React component that defines the "Description" portion of a transaction's "Detailed" tab. - **Simple**: A React component that defines the left column of a transaction's "Simple" tab. - **TableDetail**: A React component that defines the body of transaction on the account, ledger, token, or nft page. - **action**: A TransactionCategory value used to determine shape color of the transaction. - **category**: A TransactionCategory value used to determine the color of the transaction. - **parser**: An optional function which takes a transaction object and meta nodes. It returns additional properties to map onto a transaction. This is run when a transaction is received from the server and is useful for transforming complex properties derived from nodes. This object is then provided in `./index.ts` The transaction needs to have its display value defined in `/public/locales/en-US/translations.json` with the key `"transaction_{TransactionType}"`. The helper methods `getAction` and `getCategory` are available to find out how a transaction is defined and falls back to OTHER. ================================================ FILE: src/containers/shared/components/Transaction/SetFee/Description.tsx ================================================ import { Trans } from 'react-i18next' import { TransactionDescriptionProps } from '../types' import { parser } from './parser' import { Amount } from '../../Amount' export const Description = ({ data }: TransactionDescriptionProps) => { const { fee, reserve, increment } = parser(data.tx) return ( <>
    , }} />
    , increment: , }} />

    Fees]} />
    ) } ================================================ FILE: src/containers/shared/components/Transaction/SetFee/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { SetFeeInstructions } from './types' export const Simple = ({ data, }: TransactionSimpleProps) => { const { t } = useTranslation() const { fee, reserve, increment } = data.instructions return ( <> ) } ================================================ FILE: src/containers/shared/components/Transaction/SetFee/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' import { Description } from './Description' export const SetFeeTransaction: TransactionMapping = { Description, Simple, action: TransactionAction.MODIFY, category: TransactionCategory.ACCOUNT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/SetFee/parser.ts ================================================ import { isPreAmendment, SetFee, SetFeeInstructions } from './types' export const parser = (tx: SetFee): SetFeeInstructions => { if (isPreAmendment(tx)) { return { fee: parseInt(tx.BaseFee, 16).toString(), reserve: tx.ReserveBase.toString(), increment: tx.ReserveIncrement.toString(), } } return { fee: tx.BaseFeeDrops, reserve: tx.ReserveBaseDrops, increment: tx.ReserveIncrementDrops, } } ================================================ FILE: src/containers/shared/components/Transaction/SetFee/test/SetFeeDescription.test.tsx ================================================ import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import i18nTestConfigEnUS from '../../../../../../i18n/testConfigEnglish' import SetFeePreAmendment from './mock_data/SetFee_PreAmendment.json' import SetFeePostAmendment from './mock_data/SetFee_PostAmendment.json' const renderComponent = createDescriptionRenderFactory( Description, i18nTestConfigEnUS, ) function testDescription(container: Element) { expect( container.querySelector('[data-testid="fees-line"]'), ).toHaveTextContent( `Future transactions will require a minimum fee of \uE9000.00001 XRP.`, ) expect( container.querySelector('[data-testid="reserves-line"]'), ).toHaveTextContent( `Accounts must now hold a base of \uE90010.00 XRP and an additional \uE9002.00 XRP for each additional object that account owns.`, ) expect( container.querySelector('[data-testid="documentation-line"]'), ).toHaveTextContent(`Visit the docs: Fees`) } describe('SetFee: Description', () => { it('renders Description for transaction before XRPFees amendment', () => { const { container, unmount } = renderComponent(SetFeePreAmendment) testDescription(container) unmount() }) it('renders Description for transaction after XRPFees amendment', () => { const { container, unmount } = renderComponent(SetFeePostAmendment) testDescription(container) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/SetFee/test/SetFeeSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowLabel, expectSimpleRowText, } from '../../test' import { Simple } from '../Simple' import i18nTestConfigEnUS from '../../../../../../i18n/testConfigEnglish' import SetFeePreAmendment from './mock_data/SetFee_PreAmendment.json' import SetFeePostAmendment from './mock_data/SetFee_PostAmendment.json' const renderComponent = createSimpleRenderFactory(Simple, i18nTestConfigEnUS) function testSimple(container: Element) { expectSimpleRowLabel(container, `base-fee`, 'Base Fee') expectSimpleRowText(container, `base-fee`, `\uE9000.00001 XRP`) expectSimpleRowLabel(container, `reserve`, 'Reserve') expectSimpleRowText(container, `reserve`, `\uE90010.00 XRP`) expectSimpleRowLabel(container, `reserve-increment`, 'Reserve Increment') expectSimpleRowText(container, `reserve-increment`, `\uE9002.00 XRP`) } describe('SetFee: Simple', () => { it('renders Simple for transaction before XRPFees amendment', () => { const { container, unmount } = renderComponent(SetFeePreAmendment) testSimple(container) unmount() }) it('renders Simple for transaction after XRPFees amendment', () => { const { container, unmount } = renderComponent(SetFeePostAmendment) testSimple(container) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/SetFee/test/mock_data/SetFee_PostAmendment.json ================================================ { "tx": { "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp", "BaseFeeDrops": "10", "Fee": "0", "LedgerSequence": 66462465, "ReserveBaseDrops": "10000000", "ReserveIncrementDrops": "2000000", "Sequence": 0, "SigningPubKey": "", "TransactionType": "SetFee", "date": 1632045932000, "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "BaseFeeDrops": "10", "Flags": 0, "ReferenceFeeUnits": 10, "ReserveBaseDrops": "10000000", "ReserveIncrementDrops": "2000000" }, "LedgerEntryType": "FeeSettings", "LedgerIndex": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A651", "PreviousFields": { "ReserveBaseDrops": "20000000", "ReserveIncrementDrops": "5000000" } } } ], "TransactionIndex": 28, "TransactionResult": "tesSUCCESS" }, "hash": "5922A0BA30621C60B2B6DDBC3FF6B5BB509EB3685C4C3D56696A9FE4FE6D48A3", "ledger_index": 66462465, "date": 1632045932000 } ================================================ FILE: src/containers/shared/components/Transaction/SetFee/test/mock_data/SetFee_PreAmendment.json ================================================ { "tx": { "Account": "rrrrrrrrrrrrrrrrrrrrrhoLvTp", "BaseFee": "a", "Fee": "0", "LedgerSequence": 66462465, "ReferenceFeeUnits": 10, "ReserveBase": 10000000, "ReserveIncrement": 2000000, "Sequence": 0, "SigningPubKey": "", "TransactionType": "SetFee", "date": 1632045932000, "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "BaseFee": "a", "Flags": 0, "ReferenceFeeUnits": 10, "ReserveBase": 10000000, "ReserveIncrement": 2000000 }, "LedgerEntryType": "FeeSettings", "LedgerIndex": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A651", "PreviousFields": { "ReserveBase": 20000000, "ReserveIncrement": 5000000 } } } ], "TransactionIndex": 28, "TransactionResult": "tesSUCCESS" }, "hash": "5922A0BA30621C60B2B6DDBC3FF6B5BB509EB3685C4C3D56696A9FE4FE6D48A3", "ledger_index": 66462465, "date": 1632045932000 } ================================================ FILE: src/containers/shared/components/Transaction/SetFee/types.ts ================================================ import { TransactionCommonFields } from '../types' export interface SetFeePreAmendment extends TransactionCommonFields { BaseFee: string ReferenceFeeUnits: number ReserveBase: number ReserveIncrement: number BaseFeeDrops?: never ReserveBaseDrops?: never ReserveIncrementDrops?: never } export interface SetFeePostAmendment extends TransactionCommonFields { BaseFee?: never ReferenceFeeUnits?: never ReserveBase?: never ReserveIncrement?: never BaseFeeDrops: string ReserveBaseDrops: string ReserveIncrementDrops: string } export const isPreAmendment = ( tx: SetFeePreAmendment | SetFeePostAmendment, ): tx is SetFeePreAmendment => (tx as SetFeePostAmendment).BaseFee !== undefined export type SetFee = SetFeePreAmendment | SetFeePostAmendment export interface SetFeeInstructions { fee: string reserve: string increment: string } ================================================ FILE: src/containers/shared/components/Transaction/SetHook/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { buildHookFlags } from '../../../transactionUtils' import { Account } from '../../Account' import { SimpleGroup } from '../SimpleGroup' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { HookData, SetHookInstructions } from './types' import { hookOnToTxList } from './utils' export const Simple = ({ data, }: TransactionSimpleProps) => { const { hooks } = data.instructions const { t } = useTranslation() const renderHook = (hook: HookData) => ( {hook.HookHash ?? 'undefined'} {hook.HookOn && ( {/* // TODO: use the transaction badges here instead of just text */} {hookOnToTxList(hook.HookOn)?.join(', ') ?? None} )} {hook.HookGrants && ( {hook.HookGrants.map((hookGrant) => { const grant = hookGrant.HookGrant return (
    {grant.HookHash}
    {grant.Authorize && }
    ) })}
    )} {hook.HookNamespace && ( {hook.HookNamespace} )} {hook.Flags && ( {buildHookFlags(hook.Flags).join(', ')} )} {hook.HookApiVersion != null && ( {hook.HookApiVersion} )}
    ) return <>{hooks.map(renderHook)} } ================================================ FILE: src/containers/shared/components/Transaction/SetHook/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const SetHookTransaction: TransactionMapping = { Simple, action: TransactionAction.CREATE, category: TransactionCategory.ACCOUNT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/SetHook/parser.ts ================================================ import { SetHook, SetHookInstructions } from './types' export const parser = (tx: SetHook, meta: any): SetHookInstructions => { const hooks = tx.Hooks.map((hook) => hook.Hook) const affectedNodes = meta.AffectedNodes.filter( (node: any) => node.CreatedNode?.LedgerEntryType === 'Hook' || (node.ModifiedNode?.LedgerEntryType === 'Hook' && !!node.ModifiedNode?.PreviousFields?.Hooks), ) const hashes = affectedNodes.flatMap((node: any) => (node.ModifiedNode?.FinalFields ?? node.CreatedNode?.NewFields)?.Hooks?.map( (hook: any) => hook.Hook.HookHash, ), ) // TODO: there may be bugs here when a `HookHash` is already specified in a hook // It's difficult to understand what situation that would be in, so this is left here for now hashes.forEach((element, index) => { if (hooks[index] != null) hooks[index].HookHash = element }) return { hooks: hooks.filter((hook) => hook.CreateCode || hook.HookHash) } } ================================================ FILE: src/containers/shared/components/Transaction/SetHook/test/SetHookSimple.test.tsx ================================================ import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockSetHook from './mock_data/SetHook.json' import mockSetHook2 from './mock_data/SetHook2.json' import mockSetHookFailure from './mock_data/SetHookFailure.json' import { expectSimpleRowText } from '../../test/expectations' const renderComponent = createSimpleRenderFactory(Simple) describe('SetHookSimple', () => { it('renders', () => { const { container } = renderComponent(mockSetHook) const groups = container.querySelectorAll('.group') expect(groups).toHaveLength(2) const hook1 = groups[0] const hook2 = groups[1] expectSimpleRowText( hook1, 'hook-hash', '4E57C7FE7A84ABFA53CFE411DE9BA3420B94F55038BF238EBE1EB89095ABA4DE', ) expectSimpleRowText(hook1, 'hook-on', 'Invoke') expectSimpleRowText( hook1, 'hook-namespace', '0000000000000000000000000000000000000000000000000000000000000000', ) expectSimpleRowText(hook1, 'hook-flags', 'hsfOverride') expectSimpleRowText(hook1, 'hook-api-version', '0') expectSimpleRowText( hook2, 'hook-hash', 'C04E2043B656B578CB30E9FF465304AF402B7AFE38B6CE2D8CEFECDD669E3424', ) expectSimpleRowText(hook2, 'hook-on', '98') expectSimpleRowText( hook2, 'hook-namespace', '0000000000000000000000000000000000000000000000000000000000000000', ) expectSimpleRowText(hook2, 'hook-flags', 'hsfOverride') expectSimpleRowText(hook2, 'hook-api-version', '0') }) it('renders a different SetHook tx', () => { const { container } = renderComponent(mockSetHook2) const groups = container.querySelectorAll('.group') expect(groups).toHaveLength(1) const hook = groups[0] expectSimpleRowText( hook, 'hook-hash', '548BBB700F5841C2D41E227456E8A80E6A6335D1149BA3B5FF745A00CC0EBECE', ) const grants = hook.querySelectorAll('.grant') expect(grants).toHaveLength(2) const grant1 = grants[0] const grant2 = grants[1] expect(grant1.querySelector('.hash')).toHaveTextContent( '096A70632BBB67488F4804AE55604A01F52226BD556E3589270D0D30C9A6AF81', ) expect(grant1.querySelector('.account')).toHaveTextContent( 'rQUhXd7sopuga3taru3jfvc1BgVbscrb1X', ) // .account IS the link itself (an anchor element with class account) expect(grant1.querySelector('a.account')).toBeInTheDocument() expect(grant2.querySelector('.hash')).toHaveTextContent( '3F47684053E1A653E54EAC1C5F50BCBAF7F69078CEFB5846BB046CE44B8ECDC2', ) expect(grant2.querySelector('.account')).toHaveTextContent( 'raPSFU999HcwpyRojdNh2i96T22gY9fgxL', ) // .account IS the link itself (an anchor element with class account) expect(grant2.querySelector('a.account')).toBeInTheDocument() }) it('renders a failed SetHook tx', () => { const { container } = renderComponent(mockSetHookFailure) const groups = container.querySelectorAll('.group') expect(groups).toHaveLength(1) const hook = groups[0] expectSimpleRowText(hook, 'hook-hash', 'undefined') expectSimpleRowText(hook, 'hook-on', 'Payment') expectSimpleRowText( hook, 'hook-namespace', 'CAE662172FD450BB0CD710A769079C05BFC5D8E35EFA6576EDC7D0377AFDD4A2', ) expectSimpleRowText(hook, 'hook-flags', 'hsfOverride') expectSimpleRowText(hook, 'hook-api-version', '0') }) }) ================================================ FILE: src/containers/shared/components/Transaction/SetHook/test/mock_data/SetHook.json ================================================ { "tx": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Fee": "7644020", "Flags": 0, "Hooks": [ { "Hook": { "CreateCode": "0061736D0100000001420960027F7F017F60037F7F7F017E60037F7F7E017E60027F7F017E60047F7F7F7F017E60017F017E6000017E60057F7F7F7F7F017E60097F7F7F7F7F7F7F7F7F017E02BC021403656E76025F67000003656E760A6F74786E5F6669656C64000103656E7606616363657074000203656E7608726F6C6C6261636B000203656E760C686F6F6B5F6163636F756E74000303656E76057374617465000403656E760974726163655F6E756D000203656E760C6574786E5F72657365727665000503656E760973746174655F736574000403656E760A6C65646765725F736571000603656E760C6574786E5F64657461696C73000303656E760D6574786E5F6665655F62617365000303656E7604656D6974000403656E76096F74786E5F736C6F74000503656E760D736C6F745F7375626669656C64000103656E760D736C6F745F7375626172726179000103656E7604736C6F74000103656E76057472616365000703656E760B7574696C5F6B65796C6574000803656E7608736C6F745F7365740001030201050503010002063F0A7F0141F08A040B7F0041EC0A0B7F004180080B7F0041F08A040B7F004180080B7F0041B0090B7F0041D0090B7F0041A0090B7F004180080B7F0041F0090B07080104686F6F6B00140AB6D20001B2D20002047F017E230041B0186B22012400200120003602A41841012200200010001A2001200141A2186A410241828004100137039818200120012D00A31820012D00A2184110746A3602941820012802941841E30047044041002200200042CC0010021A0B41BC094114418180201001421452044041002200200042CF0010031A0B20014180186A411410041A200141002200200041D009412010053703F81741900A410C20012903F81710061A20012903F817427B510440410510071A200141053A00F717200141F7176A410141D009412010085004404100200042E20010031A0B41D00941FF013A000041A009410841D009412010085004404100200042E60010031A0B41D00941003A0000200141003602F017034041E980808078410610001A024020012802F01741054F0D0041EF0920012802F01741016A3A000020012802F017410574418C086A411441D00941201008421452044041002200200042F00010031A0B41EF09410120012802F0174105744180086A41201008420152044041002200200042F40010031A0B2001200141F0156A22003602EC1520014280C0F4C198AF0B3703C8152001410022023602C415200120023602C015200110093E02BC15200141D0156A411410041A200141003A00BB1520012802EC1541123A000020012802EC1520012D00BB154108763A000120012802EC1520012D00BB153A0002200120012802EC1541036A3602EC1520014180808080783602B415200141023A00B31520012802EC1520012D00B315410F7141206A3A000020012802EC1520012802B4154118763A000120012802EC1520012802B4154110763A000220012802EC1520012802B4154108763A000320012802EC1520012802B4153A0004200120012802EC1541056A3602EC15200120012802C0153602AC152001410322033A00AB1520012802EC1520012D00AB15410F7141206A3A000020012802EC1520012802AC154118763A000120012802EC1520012802AC154110763A000220012802EC1520012802AC154108763A000320012802EC1520012802AC153A0004200120012802EC1541056A3602EC15200120023602A415200141043A00A31520012802EC1520012D00A315410F7141206A3A000020012802EC1520012802A4154118763A000120012802EC1520012802A4154110763A000220012802EC1520012802A4154108763A000320012802EC1520012802A4153A0004200120012802EC1541056A3602EC15200120012802C41536029C152001410E3A009B1520012802EC1520012D009B15410F7141206A3A000020012802EC15200128029C154118763A000120012802EC15200128029C154110763A000220012802EC15200128029C154108763A000320012802EC15200128029C153A0004200120012802EC1541056A3602EC15200120012802BC1541016A360294152001411A3A00931520012802EC15412022023A000020012802EC1520012D0093153A000120012802EC152001280294154118763A000220012802EC152001280294154110763A000320012802EC152001280294154108763A000420012802EC152001280294153A0005200120012802EC1541066A3602EC15200120012802BC1541056A36028C152001411B3A008B1520012802EC1520023A000020012802EC1520012D008B153A000120012802EC15200128028C154118763A000220012802EC15200128028C154110763A000320012802EC15200128028C154108763A000420012802EC15200128028C153A0005200120012802EC1541066A3602EC152001410122023A008A15200120012903C8153703801520012802EC1520012D008A15410F7141E0006A3A000020012802EC15200129038015423888423F8342407D3C000120012802EC1520012903801542308842FF01833C000220012802EC1520012903801542288842FF01833C000320012802EC1520012903801542208842FF01833C000420012802EC1520012903801542188842FF01833C000520012802EC1520012903801542108842FF01833C000620012802EC1520012903801542088842FF01833C000720012802EC1520012903801542FF01833C0008200120012802EC1541096A3602EC15200120012802EC153602FC142001410822043A00FB14200142003703F01420012802EC1520012D00FB14410F7141E0006A3A000020012802EC1520012903F014423888423F8342407D3C000120012802EC1520012903F01442308842FF01833C000220012802EC1520012903F01442288842FF01833C000320012802EC1520012903F01442208842FF01833C000420012802EC1520012903F01442188842FF01833C000520012802EC1520012903F01442108842FF01833C000620012802EC1520012903F01442088842FF01833C000720012802EC1520012903F01442FF01833C0008200120012802EC1541096A3602EC1520012802EC1541F3003A000020012802EC1541213A000120012802EC15200537030220012802EC15200537030A20012802EC15200537031220012802EC152005370319200120012802EC1541236A3602EC15200120023A00EF1420012802EC1520012D00EF144180016A3A000020012802EC15411422023A000120012802EC1520012903D01537030220012802EC1520012903D81537030A20012802EC1520012802E015360212200120012802EC1541166A3602EC15200120033A00EE1420012802EC1520012D00EE144180016A3A000020012802EC1520023A000120012802EC1520012802F01741057429038C0837030220012802EC1520012802F0174105742903940837030A20012802EC1520012802F01741057428029C08360212200120012802EC1541166A3602EC15200120012802EC1541F8012202100A3703E014200120002002100B3703D814200120043A00D714200120012903D8143703C81420012802FC1420012D00D714410F7141E0006A3A000020012802FC1420012903C814423888423F8342407D3C000120012802FC1420012903C81442308842FF01833C000220012802FC1420012903C81442288842FF01833C000320012802FC1420012903C81442208842FF01833C000420012802FC1420012903C81442188842FF01833C000520012802FC1420012903C81442108842FF01833C000620012802FC1420012903C81442088842FF01833C000720012802FC1420012903C81442FF01833C0008200120012802FC1441096A3602FC142001200141A0146A412020002002100C37039814200520012903981459044041002200200042FD0010031A0B419D0A410B20012903981410061A200120012802F01741016A3602F0170C010B0B41002200200042820110021A0B024020012903801841BC09290300520D0020012903881841C409290300520D0020012802901841CC09280200470D004100200042890110021A0B20014100200041B009412010053703901420012903901442005304404100200042920110031A0B4101100D42015204404100200042960110031A0B41014193803C4102100E42025204404100200042970110031A0B4102220041002000100F420252044041002200200042990110031A0B41024198801C4103100E4203520440410022002000429A0110031A0B41024199801C4104100E4204520440410022002000429B0110031A0B2001200141900C6A2200418008410410103703880C41A90A41052202200020012903880CA7410110111A20014100220020004103101042FF01833703800C41AE0A200220012903800C10061A024020012903800C420159044020012903800C4219570D010B4100200042A40110031A0B2001200141DC0B6A3602CC0B2001027F410820012903800C4201510D001A4120411420012903800C420259047F20012903800C4205570520000B4101711B0B3A00CB0B41B00920012903800C3C000020012802CC0B41016B20012D00CB0B41016A4104101020012D00CB0B41016AAC5204404100200042B10110031A0B20012802CC0B41016B41003A00002001200141A00B6A20012D00CB0B41B00922004120220210053703980B20012802CC0B20012D00CB0B20002002100820012D00CB0BAD52044041002200200042BA0110031A0B024020012903980B20012D00CB0BAD520D0020012903A00B20012802CC0B290300520D0020012903A80B20012802CC0B290308520D0020012903B00B20012802CC0B290310520D0020012903B80B20012802CC0B290318520D0020012903C00B20012802CC0B290320520D0020012903C80B20012802CC0B290328520D0020012903D00B20012802CC0B290330520D0020012903D80B20012802CC0B290338520D0041002200200042BF0110021A0B20012903980B4200550440200141003A00970B200120012903800C3C00BF0B0240200141970B6A4101200141A00B6A41201005500D0020012D00970B450D00200120012D00970B41016B3A00970B200141970B6A4101200141A00B6A4120100850044041002200200042CF0110031A0B0B0B200141003A00960B200120012802CC0B2D001F3A00950B20012802CC0B20012903800C3C001F200141960B6A4101220020012802CC0B412010051A200120012D00960B20006A3A00960B200141960B6A410120012802CC0B4120100850044041002200200042DB0110031A0B20012802CC0B20012D00950B3A001F2001027F410020012802CC0B29030041F009290300520D001A410020012802CC0B29030841F809290300520D001A410020012802CC0B29031041800A290300520D001A410020012802CC0B29031841880A290300520D001A410020012802CC0B29032041900A290300520D001A410020012802CC0B29032841980A290300520D001A410020012802CC0B29033041A00A290300520D001A20012802CC0B29033841A80A290300510B4101713602900B41B40A410F20012802900BAC10061A41C40A4105220020012D00960BAD10061A41900A410C20012903F81710061A41AE0A200020012903800C10061A024020012903F81720012D00960BAD52044020012903800C4205570D0120012D00960BB720012903F817B9449A9999999999E93FA266450D010B41CA0A411141DC0A4110410010111A024020012903800C420151044041D00941FF013A000020012802CC0B410841D0094120100850044041002200200042F40110031A0B0C010B024020012903800C4205570440200120012903800C42027D3C008F0B200141E00A6A4122410120014180186A411441002200200020002000101242225204404100200042FD0110031A0B200141E00A6A41224105101342055204404100200042FE0110031A0B4105418B803C4106100E42065204404100200042810210031A0B410620012D008F0B4107100F42075104404107419F80144108100E42085204404100200042890210031A0B200141C00A6A412041081010422052044041002000428A0210031A0B024020012903C00A20012802CC0B290300520D0020012903C80A20012802CC0B290308520D0020012903D00A20012802CC0B290310520D0020012903D80A20012802CC0B290318520D0020012903E00A20012802CC0B290320520D0020012903E80A20012802CC0B290328520D0020012903F00A20012802CC0B290330520D0020012903F80A20012802CC0B290338520D0041002000428E0210021A0B0B200141E00A6A4122411820012802CC0B41204100200020002000101242225204404100200042920210031A0B200141E00A6A41224109101342095204404100200042950210031A0B410110071A200141A00A6A21022001027F417F20012802900B0D001A20012802CC0B0B3602BC0A2002027F20012D008F0B45044020012802BC0A0C010B41000B360200200241046A2200027F20012D008F0B410146044020012802BC0A0C010B41000B360200200041046A2200027F20012D008F0B410246044020012802BC0A0C010B41000B360200200041046A027F20012D008F0B410346044020012802BC0A0C010B41000B36020020014100220036029C022001200141A0026A220236029802200110093E02FC0120014180026A411410041A200141163A00FB0120012802980241123A000020012802980220012D00FB014108763A000120012802980220012D00FB013A0002200120012802980241036A3602980220014180808080783602F401200141023A00F30120012802980220012D00F301410F7141206A3A000020012802980220012802F4014118763A000120012802980220012802F4014110763A000220012802980220012802F4014108763A000320012802980220012802F4013A0004200120012802980241056A36029802200120003602EC01200141043A00EB0120012802980220012D00EB01410F7141206A3A000020012802980220012802EC014118763A000120012802980220012802EC014110763A000220012802980220012802EC014108763A000320012802980220012802EC013A0004200120012802980241056A36029802200120012802FC0141016A3602E4012001411A3A00E301200128029802412022033A000020012802980220012D00E3013A000120012802980220012802E4014118763A000220012802980220012802E4014110763A000320012802980220012802E4014108763A000420012802980220012802E4013A0005200120012802980241066A36029802200120012802FC0141056A3602DC012001411B3A00DB0120012802980220033A000020012802980220012D00DB013A000120012802980220012802DC014118763A000220012802980220012802DC014110763A000320012802980220012802DC014108763A000420012802980220012802DC013A0005200120012802980241066A3602980220012001280298023602D401200141083A00D301200142003703C80120012802980220012D00D301410F7141E0006A3A000020012802980220012903C801423888423F8342407D3C000120012802980220012903C80142308842FF01833C000220012802980220012903C80142288842FF01833C000320012802980220012903C80142208842FF01833C000420012802980220012903C80142188842FF01833C000520012802980220012903C80142108842FF01833C000620012802980220012903C80142088842FF01833C000720012802980220012903C80142FF01833C0008200120012802980241096A3602980220012802980241F3003A000020012802980241213A00012001280298022005370302200128029802200537030A20012802980220053703122001280298022005370319200120012802980241236A36029802200141013A00C70120012802980220012D00C7014180016A3A000020012802980241143A000120012802980220012903800237030220012802980220012903880237030A200128029802200128029002360212200120012802980241166A36029802200141800820012802980220026B6B3602C001200120012802980220012802C001100A3703B801200120012802980220012903B801A76A360298022001200128029802220241016A36029802200241FB013A0000200120012802A00A3602B4012001200128029802220241016A36029802200241EE013A0000200020012802B4014704402001200128029802220041016A36029802200041223A00002001200128029802220041016A360298022000410022003A00002001200128029802220241016A36029802200220003A00002001200128029802220241016A36029802200220003A00002001200128029802220041016A36029802200041013A0000024020012802B401417F4604402001200128029802220041016A36029802200041FB003A00002001200128029802220041016A36029802200041003A00000C010B2001200128029802220041016A360298022000411F3A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A00000B0B2001200128029802220041016A36029802200041E1013A0000200120012802A40A3602B0012001200128029802220041016A36029802200041EE013A000020012802B00104402001200128029802220041016A36029802200041223A00002001200128029802220041016A360298022000410022003A00002001200128029802220241016A36029802200220003A00002001200128029802220241016A36029802200220003A00002001200128029802220041016A36029802200041013A0000024020012802B001417F4604402001200128029802220041016A36029802200041FB003A00002001200128029802220041016A36029802200041003A00000C010B2001200128029802220041016A360298022000411F3A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A00000B0B2001200128029802220041016A36029802200041E1013A0000200120012802A80A3602AC012001200128029802220041016A36029802200041EE013A000020012802AC0104402001200128029802220041016A36029802200041223A00002001200128029802220041016A360298022000410022003A00002001200128029802220241016A36029802200220003A00002001200128029802220241016A36029802200220003A00002001200128029802220041016A36029802200041013A0000024020012802AC01417F4604402001200128029802220041016A36029802200041FB003A00002001200128029802220041016A36029802200041003A00000C010B2001200128029802220041016A360298022000411F3A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A00000B0B2001200128029802220041016A36029802200041E1013A0000200120012802AC0A3602A8012001200128029802220041016A36029802200041EE013A000020012802A80104402001200128029802220041016A36029802200041223A00002001200128029802220041016A360298022000410022003A00002001200128029802220241016A36029802200220003A00002001200128029802220241016A36029802200220003A00002001200128029802220041016A36029802200041013A0000024020012802A801417F4604402001200128029802220041016A36029802200041FB003A00002001200128029802220041016A36029802200041003A00000C010B2001200128029802220041016A360298022000411F3A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A00000B0B2001200128029802220041016A36029802200041E1013A00002001200128029802220041016A36029802200041F1013A00002001200128029802200141A0026A22006B36029C0220012000200128029C02100B3703A001200141083A009F01200120012903A0013703900120012802D40120012D009F01410F7141E0006A3A000020012802D401200129039001423888423F8342407D3C000120012802D40120012903900142308842FF01833C000220012802D40120012903900142288842FF01833C000320012802D40120012903900142208842FF01833C000420012802D40120012903900142188842FF01833C000520012802D40120012903900142108842FF01833C000620012802D40120012903900142088842FF01833C000720012802D40120012903900142FF01833C0008200120012802D40141096A3602D4012001200141F0006A41202000200128029C02100C370368419D0A410B200129036810061A0C010B41EF0920012903800C42067D3C00002001200141CC006A411441D0094120100542145136023C02400240200128023C450D0020012802900B0D000C010B20012903F817420057044041002200200042C20210031A0B0240200128023C0440200120012903F81742017D3703F8170C010B200120012903F81742017C3703F8170B200141F8176A410141F00941201008420152044041002200200042C90210031A0B0B200128023C044020014101360238034041CF82808078411A10001A0240200128023841194A0D00200120012802383A0040200141106A41202200200141406B200010054220510440200141003A000F2001410F6A4101200141106A412010054201510440024020012D000F41014D0440410022002000200141106A41201008504504404100200042DA0210031A0B0C010B200120012D000F41016B3A000F2001410F6A4101200141106A41201008420152044041002200200042DF0210031A0B0B0B410022002000200141406B41201008504504404100200042E40210031A0B0B2001200128023841016A3602380C010B0B0B20012802900B45044041EF0920012903800C42067D3C000020012802CC0B411441D00941201008421452044041002200200042EE0210031A0B41EF094101200141D00B6A41201008421452044041002200200042F10210031A0B0B0B0B0B41002200200042F80210021A20012903A8182105200141B0186A240020050B0BEC010600418C080B14C2F107E6E864D3906D0A088446FDDF8A7B2F569C0041AC080B149EEA73F5F0627E69397EC72E9A3C7804C0F2BF690041CC080B14C3E8E29AB62847275CED36EBF4E928DC25A07F240041EC080B14B7DA762DB9902E85199666B2E6C3009C5E27576900418C090B1CD70EF4D5021C7C646A98E84F60FED364A004453253CBD7A6250D78800041900A0B5B6D656D6265725F636F756E7400656D69745F726573756C740064756D7000746F70696300746F7069635F646174615F7A65726F00766F7465730022416374696F6E696E6720766F7465732200416374696F6E696E6720766F746573", "Flags": 1, "HookApiVersion": 0, "HookNamespace": "0000000000000000000000000000000000000000000000000000000000000000", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF", "HookHash": "4E57C7FE7A84ABFA53CFE411DE9BA3420B94F55038BF238EBE1EB89095ABA4DE" } }, { "Hook": { "CreateCode": "0061736D0100000001530C60017F017E60027F7F017F60037F7F7F017E60037F7F7E017E60027F7F017E60097F7F7F7F7F7F7F7F7F017E6000017E60047F7F7F7F017E60037E7E7F017E60027F7E017E60027E7E017E60037E7F7F017E02FF021703656E760C6574786E5F72657365727665000003656E76025F67000103656E760A6F74786E5F6669656C64000203656E7606616363657074000303656E760C686F6F6B5F6163636F756E74000403656E760B7574696C5F6B65796C6574000503656E7608736C6F745F736574000203656E760D736C6F745F7375626669656C64000203656E7604736C6F74000203656E76106C65646765725F6C6173745F74696D65000603656E7608726F6C6C6261636B000303656E760974726163655F6E756D000303656E760A6C65646765725F736571000603656E76057374617465000703656E760D666C6F61745F636F6D70617265000803656E7609666C6F61745F6F6E65000603656E7609666C6F61745F736574000903656E760C666C6F61745F646976696465000A03656E760E666C6F61745F6D756C7469706C79000A03656E7609666C6F61745F696E74000B03656E760C6574786E5F64657461696C73000403656E760D6574786E5F6665655F62617365000403656E7604656D697400070302010005030100020621057F0141A08A040B7F00419D0A0B7F004180080B7F0041A08A040B7F004180080B07080104686F6F6B00170AF0980001EC980002047F017E230041A0066B2201240020012000360294064101220010001A2000200010011A200120014180066A41104182800410023703F805200120012D00810620012D0080064110746A3602F40520012802F40541E200470440418008411E421810031A0B200141E0056A411422004181802010021A200141C0056A200010041A024020012903C00520012903E005520D0020012903C80520012903E805520D0020012802D00520012802F005470D00419E08411D422210031A0B20014190056A2202412222034103200141E0056A41144100220020002000200010051A200220034101220010061A200041E4800C41021007420252044041BB084121422D10031A0B410141E38008410310071A200041E48008410410071A200041828018410510071A200041E280084106220010071A20014100220220022000100837038805200110092001290388057D37038005200129038005423C530440200141E0046A220041166A41002901F608370100200041106A20022903F008370300200041086A20022903E808370300200020022903E0083703002001423C2001290380057D37038005200120012D00EE04AD20012903800542C0843D7F420A817C3C00EE04200120012D00EF04AD20012903800542A08D067F420A817C3C00EF04200120012D00F004AD2001290380054290CE007F420A817C3C00F004200120012D00F104AD20012903800542E8077F420A817C3C00F104200120012D00F204AD20012903800542E4007F420A817C3C00F204200120012D00F304AD200129038005420A7F420A817C3C00F304200120012D00F404AD200129038005420A817C3C00F4042000411E42C600100A1A0B2001410022002000410210083703D804200120002000410310083703D0042001200020004104220210083703C8042001200020004105220010083703C00441FE08410B20012903D804100B1A418A09200020012903D004100B1A419009200220012903C804100B1A024020012903D004420055044020012903C8044200550D010B419509411B42D500100A1A0B2001100C3703B804200120012903B80420012903D0047D3703B00420012903B0044200570440419509411B42DD00100A1A0B2001100C20012903C8047D3703A804200120012903C00442FFFFFFFFFFFFFFFF1F833703C004200120012903C00442C0843D7F3703C00441B009410320012903C004100B1A41FE08410B20012903D804100B1A024020012903C0044200570D0020012903A8044200570D00200120012903D80420012903C00420012903A8047E7C3703D8040B41FE08410B20012903D804100B1A200141FF013A008004200141002200200020014180046A4120100D3703F8030240024020012903F8034200570D0020012903F80342004102100E2005520D0020012903F803100F4104100E500D010B200142D5AA81AAE2F4F5E5D3003703F8030B20012903F8034200570440419509411B42FB00100A1A0B2001410020012903D80410103703F00320012903F0034200570440419509411B42FF00100A1A0B2001410020012903B00410103703E80320012903E8034200570440419509411B428201100A1A0B200120012903F00320012903E80310113703E003200120012903F80320012903E00310123703E00341B409410A20012903E003100B1A200120012903E0034106410010133703D80341BF09410C20012903D803100B1A2001200141E0016A22023602DC01200120012903D8033703B801200120003602B401200120003602B0012001100C3E02AC01200141C0016A411410041A200141003A00AB0120012802DC0141123A000020012802DC0120012D00AB014108763A000120012802DC0120012D00AB013A0002200120012802DC0141036A3602DC0120014180808080783602A401200141023A00A30120012802DC0120012D00A301410F7141206A3A000020012802DC0120012802A4014118763A000120012802DC0120012802A4014110763A000220012802DC0120012802A4014108763A000320012802DC0120012802A4013A0004200120012802DC0141056A3602DC01200120012802B00136029C012001410322033A009B0120012802DC0120012D009B01410F7141206A3A000020012802DC01200128029C014118763A000120012802DC01200128029C014110763A000220012802DC01200128029C014108763A000320012802DC01200128029C013A0004200120012802DC0141056A3602DC012001200036029401200141043A00930120012802DC0120012D009301410F7141206A3A000020012802DC012001280294014118763A000120012802DC012001280294014110763A000220012802DC012001280294014108763A000320012802DC012001280294013A0004200120012802DC0141056A3602DC01200120012802B40136028C012001410E3A008B0120012802DC0120012D008B01410F7141206A3A000020012802DC01200128028C014118763A000120012802DC01200128028C014110763A000220012802DC01200128028C014108763A000320012802DC01200128028C013A0004200120012802DC0141056A3602DC01200120012802AC0141016A360284012001411A3A00830120012802DC01412022003A000020012802DC0120012D0083013A000120012802DC012001280284014118763A000220012802DC012001280284014110763A000320012802DC012001280284014108763A000420012802DC012001280284013A0005200120012802DC0141066A3602DC01200120012802AC0141056A36027C2001411B3A007B20012802DC0120003A000020012802DC0120012D007B3A000120012802DC01200128027C4118763A000220012802DC01200128027C4110763A000320012802DC01200128027C4108763A000420012802DC01200128027C3A0005200120012802DC0141066A3602DC012001410122003A007A200120012903B80137037020012802DC0120012D007A410F7141E0006A3A000020012802DC012001290370423888423F8342407D3C000120012802DC01200129037042308842FF01833C000220012802DC01200129037042288842FF01833C000320012802DC01200129037042208842FF01833C000420012802DC01200129037042188842FF01833C000520012802DC01200129037042108842FF01833C000620012802DC01200129037042088842FF01833C000720012802DC01200129037042FF01833C0008200120012802DC0141096A3602DC01200120012802DC0136026C2001410822043A006B2001420037036020012802DC0120012D006B410F7141E0006A3A000020012802DC012001290360423888423F8342407D3C000120012802DC01200129036042308842FF01833C000220012802DC01200129036042288842FF01833C000320012802DC01200129036042208842FF01833C000420012802DC01200129036042188842FF01833C000520012802DC01200129036042108842FF01833C000620012802DC01200129036042088842FF01833C000720012802DC01200129036042FF01833C0008200120012802DC0141096A3602DC0120012802DC0141F3003A000020012802DC0141213A000120012802DC01200537030220012802DC01200537030A20012802DC01200537031220012802DC012005370319200120012802DC0141236A3602DC01200120003A005F20012802DC0120012D005F4180016A3A000020012802DC01411422003A000120012802DC0120012903C00137030220012802DC0120012903C80137030A20012802DC0120012802D001360212200120012802DC0141166A3602DC01200120033A005E20012802DC0120012D005E4180016A3A000020012802DC0120003A000120012802DC0120012903E00537030220012802DC0120012903E80537030A20012802DC0120012802F005360212200120012802DC0141166A3602DC01200120012802DC0141F801220010143703502001200220001015370348200120043A004720012001290348370338200128026C20012D0047410F7141E0006A3A0000200128026C2001290338423888423F8342407D3C0001200128026C200129033842308842FF01833C0002200128026C200129033842288842FF01833C0003200128026C200129033842208842FF01833C0004200128026C200129033842188842FF01833C0005200128026C200129033842108842FF01833C0006200128026C200129033842088842FF01833C0007200128026C200129033842FF01833C00082001200128026C41096A36026C2001200141106A412020022000101637030841CC09410B2001290308100B1A2001290308200555044041D8094129429A0110031A0B41810A411C429E01100A1A2001290398062105200141A0066A240020050B0BA40201004180080B9C025265776172643A2050617373696E67206E6F6E2D636C61696D2074786E005265776172643A2050617373696E67206F7574676F696E672074786E005265776172643A2050617373696E67207265776172642073657475702074786E0000000000596F75206D75737420776169742030303030303030207365636F6E647300616363756D756C61746F72006669727374006C617374005265776172643A20417373657274696F6E206661696C7572652E0062616C0078666C5F726577617264007265776172645F64726F707300656D69745F726573756C74005265776172643A20456D6974746564207265776172642074786E207375636365737366756C6C792E005265776172643A20456D697420726577617264206661696C65642E", "Flags": 1, "HookApiVersion": 0, "HookNamespace": "0000000000000000000000000000000000000000000000000000000000000000", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFBFFFFF", "HookHash": "C04E2043B656B578CB30E9FF465304AF402B7AFE38B6CE2D8CEFECDD669E3424" } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } } ], "LastLedgerSequence": 1955551, "NetworkID": 21338, "Sequence": 52, "SigningPubKey": "03799CADC441958EF655C7CF893638E8DF9F157925C0AD98981DFC55BC323FCBCE", "TransactionType": "SetHook", "TxnSignature": "3045022100FD1802C00CBEBB5CEF19C30A0023EFE12C807413D946B8194583CC100F1D12D9022079D049CE87CBCA8D157F6D5E8C077BD14B8DEBFA7B40EC37E53D758A6906CC3D", "ctid": "C01DD6CD0000535A", "date": 1680778612000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "1008078901610", "Flags": 1114112, "OwnerCount": 2, "RegularKey": "rDADDYfnLvVY9FBnS8zFXhwYFHPuU5q2Sk", "Sequence": 53 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8", "PreviousFields": { "Balance": "1008086545630", "Sequence": 52 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Flags": 0, "Hooks": [ { "Hook": { "Flags": 0, "HookHash": "4E57C7FE7A84ABFA53CFE411DE9BA3420B94F55038BF238EBE1EB89095ABA4DE", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF" } }, { "Hook": { "Flags": 0, "HookHash": "C04E2043B656B578CB30E9FF465304AF402B7AFE38B6CE2D8CEFECDD669E3424", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFBFFFFF" } }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} } ], "OwnerNode": "0" }, "LedgerEntryType": "Hook", "LedgerIndex": "469372BEE8814EC52CA2AECB5374AB57A47B53627E3C0E2ACBE3FDC78DBFEC7B", "PreviousFields": { "Hooks": [ { "Hook": { "HookHash": "4E57C7FE7A84ABFA53CFE411DE9BA3420B94F55038BF238EBE1EB89095ABA4DE" } }, { "Hook": { "HookHash": "C04E2043B656B578CB30E9FF465304AF402B7AFE38B6CE2D8CEFECDD669E3424" } }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} } ] } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "12E9523791E48ABF1F8FF24771EF641F7E4BBE9D77BFA03AB1036517C041E569", "ledger_index": 1955533, "date": 1680778612000 } ================================================ FILE: src/containers/shared/components/Transaction/SetHook/test/mock_data/SetHook2.json ================================================ { "tx": { "Account": "rGVHr1PrfL93UAjyw3DWZoi9adz2sLp2yL", "Fee": "20", "Flags": 0, "Hooks": [ { "Hook": { "HookGrants": [ { "HookGrant": { "Authorize": "rQUhXd7sopuga3taru3jfvc1BgVbscrb1X", "HookHash": "096A70632BBB67488F4804AE55604A01F52226BD556E3589270D0D30C9A6AF81" } }, { "HookGrant": { "Authorize": "raPSFU999HcwpyRojdNh2i96T22gY9fgxL", "HookHash": "3F47684053E1A653E54EAC1C5F50BCBAF7F69078CEFB5846BB046CE44B8ECDC2" } } ], "HookHash": "548BBB700F5841C2D41E227456E8A80E6A6335D1149BA3B5FF745A00CC0EBECE" } } ], "LastLedgerSequence": 1976819, "NetworkID": 21338, "Sequence": 1784919, "SigningPubKey": "025137610C314DA06E4CD804541F2A7CDD0483EB85BA3F74067A026B5F170C8047", "TransactionType": "SetHook", "TxnSignature": "30450221008A7DD8DE50A7D107CF36DEA92D06B64926E865EADA243F18901DD7D9FB9D450D02203505F2C40D516D9208DF3172B6A45CB74C8DB0C18260C180B3185C7C872E0BAE", "ctid": "C01E29E10000535A", "date": 1680842731000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rGVHr1PrfL93UAjyw3DWZoi9adz2sLp2yL", "Flags": 0, "Hooks": [ { "Hook": { "HookGrants": [ { "HookGrant": { "Authorize": "rQUhXd7sopuga3taru3jfvc1BgVbscrb1X", "HookHash": "096A70632BBB67488F4804AE55604A01F52226BD556E3589270D0D30C9A6AF81" } }, { "HookGrant": { "Authorize": "raPSFU999HcwpyRojdNh2i96T22gY9fgxL", "HookHash": "3F47684053E1A653E54EAC1C5F50BCBAF7F69078CEFB5846BB046CE44B8ECDC2" } } ], "HookHash": "548BBB700F5841C2D41E227456E8A80E6A6335D1149BA3B5FF745A00CC0EBECE" } }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} } ], "OwnerNode": "0" }, "LedgerEntryType": "Hook", "LedgerIndex": "0BCDDA47012D784783CE787017E103BA542DFC451168074C9AA4704016893ED4", "PreviousFields": { "Hooks": [ { "Hook": { "Flags": 0, "HookHash": "548BBB700F5841C2D41E227456E8A80E6A6335D1149BA3B5FF745A00CC0EBECE" } }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} } ] } } }, { "ModifiedNode": { "FinalFields": { "Account": "rGVHr1PrfL93UAjyw3DWZoi9adz2sLp2yL", "Balance": "9879550122", "Flags": 0, "HookNamespaces": [ "01EAF09326B4911554384121FF56FA8FECC215FDDE2EC35D9E59F2C53EC665A0" ], "HookStateCount": 74, "OwnerCount": 78, "Sequence": 1784920 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BB71F3181F2B9D63FF4D7439AB82C32ABE4ED8F70CE00E0EFC68FD9C37149435", "PreviousFields": { "Balance": "9879550142", "OwnerCount": 76, "Sequence": 1784919 } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "62A6257455F2366CC54DE43EE40258E51FD1695459521D48DE70ECB4D53D677E", "ledger_index": 1976801, "date": 1680842731000 } ================================================ FILE: src/containers/shared/components/Transaction/SetHook/test/mock_data/SetHookFailure.json ================================================ { "tx": { "Account": "rXKD82Qx77BCMVNgQYak5i5bh8KDXVfvm", "Fee": "133020", "Flags": 0, "Hooks": [ { "Hook": { "CreateCode": "0061736D01000000011C0460057F7F7F7F7F017E60037F7F7E017E60027F7F017F60017F017E02230303656E76057472616365000003656E7606616363657074000103656E76025F670002030201030503010002062B077F0141C088040B7F004180080B7F0041B2080B7F004180080B7F0041C088040B7F0041000B7F0041010B07080104686F6F6B00030AC1800001BD800001017F230041106B220124002001200036020C41A00841114180084110410010001A4190084110420910011A4101410110021A200141106A240042000B0B3801004180080B31426173652E633A2043616C6C65642E00626173653A2046696E69736865642E0022426173652E633A2043616C6C65642E22", "Flags": 1, "HookApiVersion": 0, "HookNamespace": "CAE662172FD450BB0CD710A769079C05BFC5D8E35EFA6576EDC7D0377AFDD4A2", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFE" } } ], "LastLedgerSequence": 4597710, "NetworkID": 21338, "Sequence": 4398843, "SigningPubKey": "032CDB60825AEE26E28B4BC916212BC206EF6992ED090728402554F6BEC3A169CF", "TransactionType": "SetHook", "TxnSignature": "304502210080A3AF02FC52935BFA746B374F38DBBF371DC69EC544A9230467993FA40384ED02205D544A5A4B924101C4F3E22CB89E95D21AC640DC8915C474AC046F4288F52B26", "ctid": "C04627BC0000535A", "date": 1688754701000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rXKD82Qx77BCMVNgQYak5i5bh8KDXVfvm", "Balance": "1199990", "Flags": 0, "ImportSequence": 39203734, "OwnerCount": 0, "Sequence": 4398844 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B0B02F51EDE6BD9F0D7247955474A5B28AB8F9683811AFB3E9AFEF162440C8C5", "PreviousFields": { "Balance": "1333010", "Sequence": 4398843 } } } ], "TransactionIndex": 0, "TransactionResult": "tecINSUFFICIENT_RESERVE" }, "hash": "3015BB519D32BDD58CF2867E5F512A0D0532D9E9C93361EC51DA7C70B80549D3", "ledger_index": 4597692, "date": 1688754701000 } ================================================ FILE: src/containers/shared/components/Transaction/SetHook/test/utils.test.ts ================================================ import { hookOnToTxList } from '../utils' describe('SetHook utils', () => { it('hookOnToTxList', () => { expect( hookOnToTxList( '0000000000000000000000000000000000000000000000000000000000000000', ), ).toEqual(['All transactions']) expect( hookOnToTxList( '0xfffffffffffffffffffffffffffffffffffffff7ffffffffffffffffff9affeb', ), ).toEqual([ 'Invoke', 'AccountDelete', 'CheckCancel', 'CheckCreate', 'EscrowCancel', 'EscrowFinish', ]) expect( hookOnToTxList( '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff', ), ).toEqual(undefined) }) }) ================================================ FILE: src/containers/shared/components/Transaction/SetHook/types.ts ================================================ interface HookGrant { HookGrant: { HookHash: string Authorize?: string } } interface HookParameter { HookParameter: { HookParameterName: string HookParameterValue: string } } export interface HookData { HookHash?: string CreateCode?: string Flags?: number HookOn?: string HookNamespace?: string HookApiVersion?: number HookParameters?: HookParameter[] HookGrants?: HookGrant[] } interface Hook { Hook: HookData } export interface SetHook { TransactionType: 'SetHook' Hooks: Hook[] } export interface SetHookInstructions { hooks: HookData[] } ================================================ FILE: src/containers/shared/components/Transaction/SetHook/utils.ts ================================================ import { zeroPad } from '../../../transactionUtils' // TODO: import from ripple-binary-codec const TRANSACTION_TYPES: Record = { Invalid: -1, Payment: 0, EscrowCreate: 1, EscrowFinish: 2, AccountSet: 3, EscrowCancel: 4, SetRegularKey: 5, NickNameSet: 6, OfferCreate: 7, OfferCancel: 8, Contract: 9, TicketCreate: 10, TicketCancel: 11, SignerListSet: 12, PaymentChannelCreate: 13, PaymentChannelFund: 14, PaymentChannelClaim: 15, CheckCreate: 16, CheckCash: 17, CheckCancel: 18, DepositPreauth: 19, TrustSet: 20, AccountDelete: 21, SetHook: 22, NFTokenMint: 25, NFTokenBurn: 26, NFTokenCreateOffer: 27, NFTokenCancelOffer: 28, NFTokenAcceptOffer: 29, Invoke: 99, EnableAmendment: 100, SetFee: 101, UNLModify: 102, EmitFailure: 103, } const transactionMap = Object.entries(TRANSACTION_TYPES).reduce( (flipped, [key, value]) => { // eslint-disable-next-line no-param-reassign -- fine for a reduce flipped[value] = key return flipped }, {} as Record, ) const maxTransactionValue: number = 103 function hex2bin(input) { const hex = input.replace('0x', '').toLowerCase() let bin = '' for (let i = 0; i < hex.length; i += 1) { const binFragment = parseInt(hex[i], 16).toString(2) bin += binFragment.padStart(4, '0') } return bin } export function hookOnToTxList(hookOn?: string): string[] | undefined { if (hookOn == null) return undefined if ( hookOn === '0000000000000000000000000000000000000000000000000000000000000000' ) return ['All transactions'] const bits = hex2bin(hookOn).split('') const txs = bits .map((value, i) => { const bin = zeroPad(1, 256 - i, true) const int = Math.log2(parseInt(bin, 2)) // const type = i < 8 ? 'universal' : (i < 16 ? 'type_specific' : 'reserved'); const flagOn = int === 22 ? '1' : '0' if (value === flagOn && int < maxTransactionValue) return transactionMap[int] || int return undefined }) .filter((d) => Boolean(d)) as string[] return txs.length === 0 ? undefined : txs } ================================================ FILE: src/containers/shared/components/Transaction/SetRegularKey/Description.tsx ================================================ import { useTranslation } from 'react-i18next' import type { SetRegularKey } from 'xrpl' import { TransactionDescriptionProps } from '../types' export const Description = ({ data, }: TransactionDescriptionProps) => { const { t } = useTranslation() const key = data.tx.RegularKey return key ? (
    {t('set_regular_key_description')}{' '} {key}
    ) : (
    {t('unset_regular_key_description')}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/SetRegularKey/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { SetRegularKey } from 'xrpl' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' export const Simple = ({ data }: TransactionSimpleProps) => { const { RegularKey: key } = data.instructions const { t } = useTranslation() let label = '' let value = t('unset_regular_key') let className: string | undefined = 'unset' if (key) { className = undefined label = t('regular_key') value = key } return ( {value} ) } ================================================ FILE: src/containers/shared/components/Transaction/SetRegularKey/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import type { SetRegularKey } from 'xrpl' import { TransactionTableDetailProps } from '../types' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { RegularKey: key } = instructions return key ? (
    {t('regular_key')}: {key}
    ) : (
    {t('unset_regular_key')}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/SetRegularKey/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { Description } from './Description' import { TableDetail } from './TableDetail' export const SetRegularKeyTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.MODIFY, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/SetRegularKey/test/SetRegularKeyDescription.test.tsx ================================================ import SetRegularKey from './mock_data/SetRegularKey.json' import SetRegularKeyUnset from './mock_data/SetRegularKeyUnsetKey.json' import { Description } from '../Description' import { createDescriptionRenderFactory } from '../../test' const renderComponent = createDescriptionRenderFactory(Description) describe('SetRegularKey: Description', () => { it('renders description for transaction', () => { const { container, unmount } = renderComponent(SetRegularKey) expect(container.innerHTML).toBe( `
    set_regular_key_description rULyyLRoZ47P33Vapew67VoiRqPrZ2ejbp
    `, ) unmount() }) it('renders description for transaction that unsets key', () => { const { container, unmount } = renderComponent(SetRegularKeyUnset) expect(container.innerHTML).toBe(`
    unset_regular_key_description
    `) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/SetRegularKey/test/SetRegularKeySimple.test.tsx ================================================ import SetRegularKey from './mock_data/SetRegularKey.json' import SetRegularKeyUnset from './mock_data/SetRegularKeyUnsetKey.json' import { Simple } from '../Simple' import { createSimpleRenderFactory } from '../../test' const renderComponent = createSimpleRenderFactory(Simple) describe('SetRegularKey: Simple', () => { it('renders Simple for transaction', () => { const { container, unmount } = renderComponent(SetRegularKey) // The SimpleRow doesn't have a data-testid, so we use the row structure const row = container.querySelector('.row') expect(row?.querySelector('.label')).toHaveTextContent('regular_key') expect(row?.querySelector('.value')).toHaveTextContent( 'rULyyLRoZ47P33Vapew67VoiRqPrZ2ejbp', ) unmount() }) it('renders Simple for transaction that unsets key', () => { const { container, unmount } = renderComponent(SetRegularKeyUnset) expect(container.querySelector('.unset')).toHaveTextContent( 'unset_regular_key', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/SetRegularKey/test/SetRegularKeyTableDetail.test.tsx ================================================ import SetRegularKey from './mock_data/SetRegularKey.json' import SetRegularKeyUnset from './mock_data/SetRegularKeyUnsetKey.json' import { TableDetail } from '../TableDetail' import { createTableDetailRenderFactory } from '../../test' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('SetRegularKeyTable: Detail', () => { it('renders Simple for transaction', () => { const { container, unmount } = renderComponent(SetRegularKey) expect(container.querySelector('.setregularkey')).toBeInTheDocument() expect(container.querySelector('.label')).toHaveTextContent('regular_key') expect(container.querySelector('.key')).toHaveTextContent( 'rULyyLRoZ47P33Vapew67VoiRqPrZ2ejbp', ) unmount() }) it('renders Simple for transaction that unsets key', () => { const { container, unmount } = renderComponent(SetRegularKeyUnset) expect(container.querySelector('.unset')).toBeInTheDocument() expect(container).toHaveTextContent('unset_regular_key') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/SetRegularKey/test/mock_data/SetRegularKey.json ================================================ { "hash": "B10C4D6361B12B7F530ED6748293F869B50805BB66569577D2A4C0C1DF0F7E17", "ledger_index": 37395801, "date": "2018-03-22T00:30:40+00:00", "tx": { "TransactionType": "SetRegularKey", "Flags": 2147483648, "Sequence": 241, "LastLedgerSequence": 37395803, "Fee": "12", "SigningPubKey": "02BCECFFE1500B42FF986A6B3DA4FCA5A7151612DFB789F1686459E23AF8E4FA58", "TxnSignature": "304402205EA3A2DBE71F9C1B5C1476C330E12AE17FF4B675BA66CC827352B252A7FCDAF002205CD260A8AF4E41356D7D33A6841452C182E03477DD797A121F518313587E2ACB", "Account": "rJULrKT4wYLmKUdQoxT4cT36jX7U1F5HPY", "RegularKey": "rULyyLRoZ47P33Vapew67VoiRqPrZ2ejbp" }, "meta": { "TransactionIndex": 15, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 35590787, "PreviousTxnID": "AAECDADC5812CFF3DCE3519D87C454EA17779E118253E501839621D857591BD4", "LedgerIndex": "FE291E930877788ED7459851C4FA446ED76B70CDD52CF7418DC810B2878B907B", "PreviousFields": { "Flags": 0, "Sequence": 281, "Balance": "1343294223" }, "FinalFields": { "Flags": 65536, "Sequence": 2, "OwnerCount": 0, "Balance": "1343294211", "Account": "rJULrKT4wYLmKUdQoxT4cT36jX7U1F5HPY", "RegularKey": "rULyyLRoZ47P33Vapew67VoiRqPrZ2ejbp" } } } ], "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/SetRegularKey/test/mock_data/SetRegularKeyUnsetKey.json ================================================ { "tx": { "Account": "rE12hfBBrbHQqvwdMA79myJY9zptfcYVet", "Fee": "10", "Flags": 0, "LastLedgerSequence": 30470857, "Sequence": 30470836, "SigningPubKey": "EDDFECD12D5FD37077317FB606ECAD376EA86C13483F05277FE6D21E6D5F5B7392", "TransactionType": "SetRegularKey", "TxnSignature": "E1DE9E330BB0CDCADB2D8ADF1272B0D7FAB4D05B94737322C75A1A7EA199E77989A47195E433A948B2B6699952CE7CE0C98D981F886442DD9FB8DD982EDC560C", "date": "2022-08-19T21:56:31Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rE12hfBBrbHQqvwdMA79myJY9zptfcYVet", "Balance": "999999990", "Flags": 65536, "OwnerCount": 0, "Sequence": 30470837 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8E374AFB0800E189D0384D3176F2AA54E18CCF1270193E162B07120FD8242855", "PreviousFields": { "Balance": "1000000000", "Flags": 0, "Sequence": 30470836 }, "PreviousTxnID": "E7A64C3635B9FA5CD235DAB9443A2B849653DBAA168BA05211D0C66918C3C1CA", "PreviousTxnLgrSeq": 30470836 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "1D25137B9384C89C7991C1EC702EAD285AB964F172B2D2AF9CBC51F63BD14AC4", "ledger_index": 30470839, "date": "2022-08-19T21:56:31Z" } ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/Description.tsx ================================================ import { useTranslation } from 'react-i18next' import type { SignerListSet } from 'xrpl' import { Account } from '../../Account' import { TransactionDescriptionProps } from '../types' export const Description = ({ data, }: TransactionDescriptionProps) => { const { tx } = data const { t } = useTranslation() return tx.SignerQuorum === 0 ? (
    {t('unset_signer_list_description')}
    ) : ( <>
    {t('set_signer_list_description', { quorum: tx.SignerQuorum })}:
      {tx.SignerEntries?.map((d) => (
    • {` - ${t('weight')}: `} {d.SignerEntry.SignerWeight}
    • ))}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { SignerListSetInstructions } from './types' export const Simple = ({ data, }: TransactionSimpleProps) => { const { quorum, maxSigners, signers } = data.instructions const { t } = useTranslation() return signers?.length ? ( <>
      {signers.map((d) => (
    • {` ${t('weight')}: `} {d.weight}
    • ))}
    {quorum} {t('out_of')} {maxSigners} ) : ( {t('unset_signer_list')} ) } ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionTableDetailProps } from '../types' import { SignerListSetInstructions } from './types' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { quorum, maxSigners, signers } = instructions return signers?.length ? ( <> {t('signers')}:{' '} {signers.length} {' - '} {t('quorum')}:{' '} {`${quorum}/${maxSigners}`} ) : (
    {t('unset_signer_list')}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { Description } from './Description' import { parser } from './parser' import { TableDetail } from './TableDetail' export const SignerListSetTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.MODIFY, category: TransactionCategory.ACCOUNT, parser, } ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/parser.ts ================================================ import type { SignerListSet } from 'xrpl' import { SignerListSetInstructions } from './types' import { TransactionParser } from '../types' import { formatSignerList } from '../../../../../rippled/lib/formatSignerList' export const parser: TransactionParser< SignerListSet, SignerListSetInstructions > = (tx) => formatSignerList(tx) ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/test/SignerListSetDescription.test.tsx ================================================ import mockSignerListSetClear from './mock_data/SignerListSetClear.json' import mockSignerListSet from './mock_data/SignerListSet.json' import { Description } from '../Description' import { createDescriptionRenderFactory } from '../../test' const renderComponent = createDescriptionRenderFactory(Description) describe('SignerListSet: Description', () => { it('renders', () => { const { container, unmount } = renderComponent(mockSignerListSet) expect(container.querySelector('div')).toHaveTextContent( 'set_signer_list_description:', ) const signers = container.querySelectorAll('.signers li') expect(signers[0]).toHaveTextContent( 'rK8MWkYVgHR6VmPH6WpWcvVce9evvMpKSv - weight: 2', ) expect(signers[1]).toHaveTextContent( 'rLoRH7XuBgz2kTP1ACkoyVYk9hsLggVvbP - weight: 1', ) expect(signers[2]).toHaveTextContent( 'rL6SsrxyVp1JLNEZsX1hFWHcP2iJcZJ2dy - weight: 1', ) unmount() }) it('renders when signer list is cleared', () => { const { container, unmount } = renderComponent(mockSignerListSetClear) expect(container).toHaveTextContent('unset_signer_list_description') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/test/SignerListSetSimple.test.tsx ================================================ import { Simple } from '../Simple' import mockSignerListSetClear from './mock_data/SignerListSetClear.json' import mockSignerListSet from './mock_data/SignerListSet.json' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' const renderComponent = createSimpleRenderFactory(Simple) describe('SignerListSet: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockSignerListSet) expect( container.querySelector('[data-testid="quorum"] .value'), ).toHaveTextContent('3 out_of 4') const signers = container.querySelectorAll( '[data-testid="signers"] .value li', ) expect(signers[0]).toHaveTextContent( 'rK8MWkYVgHR6VmPH6WpWcvVce9evvMpKSv weight: 2', ) expect(signers[1]).toHaveTextContent( 'rLoRH7XuBgz2kTP1ACkoyVYk9hsLggVvbP weight: 1', ) expect(signers[2]).toHaveTextContent( 'rL6SsrxyVp1JLNEZsX1hFWHcP2iJcZJ2dy weight: 1', ) unmount() }) it('renders when signer list is cleared', () => { const { container, unmount } = renderComponent(mockSignerListSetClear) expect(container).toHaveTextContent('unset_signer_list') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/test/SignerListSetTableDetail.test.tsx ================================================ import { TableDetail } from '../TableDetail' import mockSignerListSetClear from './mock_data/SignerListSetClear.json' import mockSignerListSet from './mock_data/SignerListSet.json' import { createTableDetailRenderFactory } from '../../test' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('SignerListSet: TableDetail', () => { it('renders', () => { const { container, unmount } = renderComponent(mockSignerListSet) expect(container).toHaveTextContent('signers: 3 - quorum: 3/4') unmount() }) it('renders when signer list is cleared', () => { const { container, unmount } = renderComponent(mockSignerListSetClear) expect(container).toHaveTextContent('unset_signer_list') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/test/mock_data/SignerListSet.json ================================================ { "hash": "5988C2790600974A277DE9748BB2D52D3531A8CC6C7C5DB6A1CEF6486FC86A31", "ledger_index": 37375929, "date": "2018-03-21T04:32:01+00:00", "tx": { "TransactionType": "SignerListSet", "Flags": 0, "Sequence": 251, "SignerQuorum": 3, "Fee": "10000", "SigningPubKey": "022B4444D353A98D3A3BCCA5D9683004FEF876DB5D5038CC9091DA4DB040595F5E", "TxnSignature": "3045022100A364318D2F6A37BF4221D2086121E9154723FA57F9F549EFF878577F3CE2C139022018A115B24F4F084645A2A0BA4605F8DC30C421BF055C04E44AC3E7A08277894F", "Account": "radE4Xd2RpQTBAx6YkpWbb7Z3fkcAgsHpK", "SignerEntries": [ { "SignerEntry": { "SignerWeight": 2, "Account": "rK8MWkYVgHR6VmPH6WpWcvVce9evvMpKSv" } }, { "SignerEntry": { "SignerWeight": 1, "Account": "rLoRH7XuBgz2kTP1ACkoyVYk9hsLggVvbP" } }, { "SignerEntry": { "SignerWeight": 1, "Account": "rL6SsrxyVp1JLNEZsX1hFWHcP2iJcZJ2dy" } } ] }, "meta": { "TransactionIndex": 22, "AffectedNodes": [ { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37356198, "PreviousTxnID": "DCA0D15C6D6FA40FCCAABD185FEE0568657648F2D65BD0BF2A6BFF1EBF802E1A", "LedgerIndex": "B5530506FA862EEE6BC12C49D58CAA6B21A3F1DC948740C48AB3C4D2C5FAF1CE", "PreviousFields": { "Sequence": 291, "Balance": "30000000" }, "FinalFields": { "Flags": 0, "Sequence": 2, "OwnerCount": 0, "Balance": "29990000", "Account": "radE4Xd2RpQTBAx6YkpWbb7Z3fkcAgsHpK" } } } ], "TransactionResult": "tecINSUFFICIENT_RESERVE" } } ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/test/mock_data/SignerListSetClear.json ================================================ { "tx": { "Account": "rfqdGwfvJa4aigQuUtSQ8w41Hwp3cNeaB5", "Fee": "40", "Flags": 0, "Sequence": 30736717, "SignerQuorum": 0, "Signers": [ { "Signer": { "Account": "rfB488TCijrPy8bL61FcjEUFd85g4J71pn", "SigningPubKey": "ED0615EDB8827E8EF390B74184F6EA457CB2F05D9A8282E9230AB7CB63601C0AF0", "TxnSignature": "87844C2CBD75FB8C8B7776C2F0930EF3993011A079F499FFC2376CE7AADAAC11C76D1CD5DE3B5D669E077DB32AA561651E8EA0CB509824815334360D2941970A" } }, { "Signer": { "Account": "rPMiudFt7phyRFU1JguSjEjKj9iRCoYiSM", "SigningPubKey": "EDB4B8DAF41E246A17AE204D98EDFB1CA649B05968D88459CD2808456608044CF3", "TxnSignature": "07CA5BD5F4406CF654CD160093E008864C60B973C1346E12F8EB977B8062B151B53D357F666530AA2FA4A295548BA9423ABBBAF9BC5DF0CB6DFC6008123B330D" } } ], "SigningPubKey": "", "TransactionType": "SignerListSet", "date": "2022-08-29T19:19:03Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rfqdGwfvJa4aigQuUtSQ8w41Hwp3cNeaB5", "Balance": "999999950", "Flags": 0, "OwnerCount": 0, "Sequence": 30736718 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DD6EE44028F30E5557965EC805D022B3B1CAF36543A2B849BA283DDFC615175A", "PreviousFields": { "Balance": "999999990", "OwnerCount": 1, "Sequence": 30736717 }, "PreviousTxnID": "DD54ACD593E5D51CEF1852D75F64C0527DCCF953379D369EE9700BE97582383D", "PreviousTxnLgrSeq": 30736725 } }, { "DeletedNode": { "FinalFields": { "Flags": 65536, "OwnerNode": "0", "PreviousTxnID": "DD54ACD593E5D51CEF1852D75F64C0527DCCF953379D369EE9700BE97582383D", "PreviousTxnLgrSeq": 30736725, "SignerEntries": [ { "SignerEntry": { "Account": "rfB488TCijrPy8bL61FcjEUFd85g4J71pn", "SignerWeight": 1 } }, { "SignerEntry": { "Account": "rPMiudFt7phyRFU1JguSjEjKj9iRCoYiSM", "SignerWeight": 1 } } ], "SignerListID": 0, "SignerQuorum": 2 }, "LedgerEntryType": "SignerList", "LedgerIndex": "F20512913DEDE42B2A899648F6395D451D28A6F92399F7D7CFD8AE8A5265381E" } }, { "DeletedNode": { "FinalFields": { "Flags": 0, "Owner": "rfqdGwfvJa4aigQuUtSQ8w41Hwp3cNeaB5", "RootIndex": "FB4A6DC18FC438747FFDD0AFE9B3728D582F981C29D864D3F11E8C20577A40B0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "FB4A6DC18FC438747FFDD0AFE9B3728D582F981C29D864D3F11E8C20577A40B0" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "AB715572A238301FA8F29F06726290B6FE46C92C3E09083C0348D2393C908627", "ledger_index": 30736727, "date": "2022-08-29T19:19:03Z" } ================================================ FILE: src/containers/shared/components/Transaction/SignerListSet/types.ts ================================================ export interface SignerInstruction { account: string weight: number } export interface SignerListSetInstructions { quorum: number maxSigners: number signers: SignerInstruction[] } ================================================ FILE: src/containers/shared/components/Transaction/SimpleGroup.tsx ================================================ export type SimpleGroupProps = React.PropsWithChildren<{ children: any title?: string }> export const SimpleGroup = ({ children, title }: SimpleGroupProps) => (
    {title &&
    {title}
    } {children}
    ) ================================================ FILE: src/containers/shared/components/Transaction/SimpleRow.tsx ================================================ import { PropsWithChildren } from 'react' import classnames from 'classnames' export type SimpleRowProps = PropsWithChildren<{ className?: string label: string 'data-testid'?: string }> export const SimpleRow = (props: SimpleRowProps) => { const { label, children, className, 'data-testid': dataTestId } = props return (
    {label}
    {children}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/TicketCreate/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { TicketCreate } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { TicketCount } = data.instructions return ( {TicketCount} ) } export { Simple } ================================================ FILE: src/containers/shared/components/Transaction/TicketCreate/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import type { TicketCreate } from 'xrpl' import { TransactionTableDetailProps } from '../types' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() const { TicketCount } = instructions return (
    {t('ticket_count')}: {TicketCount}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/TicketCreate/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const TicketCreateTransaction: TransactionMapping = { Simple, TableDetail, action: TransactionAction.CREATE, category: TransactionCategory.ACCOUNT, } ================================================ FILE: src/containers/shared/components/Transaction/TicketCreate/test/TicketCreateSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import TicketCreate from './mock_data/TicketCreate.json' const renderComponent = createSimpleRenderFactory(Simple) describe('TicketCreate: Simple', () => { it('renders ticket count', () => { const { container, unmount } = renderComponent(TicketCreate) expectSimpleRowText(container, 'ticket-count', '1') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/TicketCreate/test/TicketCreateTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import TicketCreate from './mock_data/TicketCreate.json' const renderComponent = createTableDetailRenderFactory(TableDetail) describe('TicketCreate: TableDetail', () => { it('renders', () => { const { container, unmount } = renderComponent(TicketCreate) expect(container).toHaveTextContent('ticket_count: 1') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/TicketCreate/test/mock_data/TicketCreate.json ================================================ { "hash": "F4AD54E6FE56B53F8FB8B422C4E9636D6AD56682EA45FF3C8AFBC66EF2D82612", "ledger_index": 37432866, "date": "2018-03-23T13:34:51+00:00", "tx": { "Account": "rP1TMyJHp5QceDoh9MdxLhYaJL2yCwPom", "Fee": "12", "Flags": 2147483648, "LastLedgerSequence": 27, "Sequence": 47, "SigningPubKey": "03A3D6C689BDB3B65BED054E06BFC2DA6B43FD45C0CA8D1C7322AC4FAD9D4E37BB", "TicketCount": 1, "TransactionType": "TicketCreate", "TxnSignature": "304402201ACAAABFE49DA1BA7F7DE66E45A20D4C35799804E9906CEA666CB38529C56F1802206E6100902CF62F77729A587688757D1596AC6C2635961F1FD0D076F4C100AAB2" }, "meta": { "TransactionIndex": 7, "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "Ticket", "LedgerIndex": "5F08C48A615894960BBBA4E8C40DBF01D7674224F4440D5BFAB4D58100E6F087", "NewFields": { "Account": "rP1TMyJHp5QceDoh9MdxLhYaJL2yCwPom", "TicketSequence": 48 } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rP1TMyJHp5QceDoh9MdxLhYaJL2yCwPom", "RootIndex": "D73D45E604CE9BB51B30887337D87C27AEA5502973B451C58ED4E9248ED0A10B" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D73D45E604CE9BB51B30887337D87C27AEA5502973B451C58ED4E9248ED0A10B" } }, { "ModifiedNode": { "FinalFields": { "Account": "rP1TMyJHp5QceDoh9MdxLhYaJL2yCwPom", "Balance": "1999919712", "Flags": 0, "OwnerCount": 15, "Sequence": 49, "TicketCount": 15 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FF9B577663B13A39A4747AD29A05ACFBBE8936DBA1FC1624C12C454E754E0467", "PreviousFields": { "Balance": "1999919724", "OwnerCount": 14, "Sequence": 47, "TicketCount": 14 }, "PreviousTxnID": "1C6EA0D4EAC873FDBCF8638CDDB922A3DF585367A6412EC43E2157F322393C50", "PreviousTxnLgrSeq": 22 } } ], "TransactionResult": "tesSUCCESS", "delivered_amount": "2421826800" } } ================================================ FILE: src/containers/shared/components/Transaction/TrustSet/Description.tsx ================================================ import { Trans } from 'react-i18next' import type { TrustSet } from 'xrpl' import { Account } from '../../Account' import { normalizeAmount } from '../../../transactionUtils' import { useLanguage } from '../../../hooks' import { TransactionDescriptionProps } from '../types' export const Description = ({ data, }: TransactionDescriptionProps) => { const language = useLanguage() const { tx } = data const amount = normalizeAmount(tx.LimitAmount, language) const { currency, issuer } = tx.LimitAmount return (
    It establishes {{ amount } as any} as the maximum amount of {{ currency } as any} from that is willing to hold
    ) } ================================================ FILE: src/containers/shared/components/Transaction/TrustSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { TrustSet } from 'xrpl' import { Amount } from '../../Amount' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const { LimitAmount } = data.instructions return ( ) } ================================================ FILE: src/containers/shared/components/Transaction/TrustSet/TableDetail.tsx ================================================ import { useTranslation } from 'react-i18next' import type { TrustSet } from 'xrpl' import { TransactionTableDetailProps } from '../types' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { t } = useTranslation() return (
    {t('set_limit')}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/TrustSet/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { Description } from './Description' import { TableDetail } from './TableDetail' export const TrustSetTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.MODIFY, category: TransactionCategory.DEX, } ================================================ FILE: src/containers/shared/components/Transaction/TrustSet/test/TrustSetDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import mockTrustSet from './mock_data/TrustSet.json' import { Description } from '../Description' import { createDescriptionRenderFactory } from '../../test' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('TrustSet: Description', () => { it('renders description for authorize', () => { const { container, unmount } = renderComponent(mockTrustSet) expect(container.innerHTML).toBe( `
    It establishes CN¥1,000,000,000.00 as the maximum amount of CNY from that is willing to hold
    `, ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/TrustSet/test/TrustSetSimple.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockTrustSet from './mock_data/TrustSet.json' import { expectSimpleRowLabel, expectSimpleRowText } from '../../test' const renderComponent = createSimpleRenderFactory(Simple, i18n) describe('TrustSet: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockTrustSet) expectSimpleRowLabel(container, 'amount', 'Set Trust Limit') expectSimpleRowText( container, 'amount', `CN¥1,000,000,000.00 CNY.razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA`, ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/TrustSet/test/TrustSetTableDetail.test.tsx ================================================ import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockTrustSet from './mock_data/TrustSet.json' import i18n from '../../../../../../i18n/testConfigEnglish' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('TrustSet: TableDetail', () => { it('renders', () => { const { container, unmount } = renderComponent(mockTrustSet) expect(container.querySelector('.label')).toHaveTextContent( 'Set Trust Limit', ) expect(container.querySelector('.amount')).toHaveTextContent( 'CN¥1,000,000,000.00 CNY.razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/TrustSet/test/mock_data/TrustSet.json ================================================ { "hash": "B18F78D2380E10F542F97B87047404142653984FDB26CADE4342D39C00D4DFC8", "ledger_index": 37470157, "date": "2018-03-25T03:03:41+00:00", "tx": { "TransactionType": "TrustSet", "Flags": 2147614720, "Sequence": 261, "LastLedgerSequence": 37470164, "LimitAmount": { "value": "1000000000", "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA" }, "Fee": "12", "SigningPubKey": "02FFC308078225AB4447DBE14832E9DBF277943843D730353BADFD1FAB3231A8D9", "TxnSignature": "30440220352B22464E56C62850ECBDCE83E059247044AF1568C234E7D9F968E902561C3E0220416A0E3A4F90112D46E5A31E972A6DE9AE18BAF3B633C701017633AC367162A7", "Account": "rhr8s3nSVJUFwkApgLP32XyYQXZ28Xphfc", "Memos": [ { "Memo": { "MemoType": "636C69656E74", "MemoData": "7274312E312E33322D6275676669782D322D67653135323239372D6469727479" } } ] }, "meta": { "TransactionIndex": 36, "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "5D193A93BFC1CF2E80AA6191CC235E2DD5B426DB0082C5D2789425A3D7EB6F4B", "NewFields": { "RootIndex": "5D193A93BFC1CF2E80AA6191CC235E2DD5B426DB0082C5D2789425A3D7EB6F4B", "Owner": "rhr8s3nSVJUFwkApgLP32XyYQXZ28Xphfc" } } }, { "CreatedNode": { "LedgerEntryType": "RippleState", "LedgerIndex": "5DCC9786FDDEC880D7D60FAF0218BB3A534257E2D5F4247DB1CEACF136EE62C5", "NewFields": { "Flags": 1114112, "HighNode": "00000000000004BB", "Balance": { "value": "0", "currency": "CNY", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji" }, "LowLimit": { "value": "1000000000", "currency": "CNY", "issuer": "rhr8s3nSVJUFwkApgLP32XyYQXZ28Xphfc" }, "HighLimit": { "value": "0", "currency": "CNY", "issuer": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA" } } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37470094, "PreviousTxnID": "981C3B9DBB84A0EC62221F1EDB8D66B42865F546211BF13D6EB79CC0B009B39E", "LedgerIndex": "7A5C344F34A4F509CA0F211A23B076D9153061ABE9A4CF1C68D359EC7E9443D4", "PreviousFields": { "Sequence": 271, "OwnerCount": 0, "Balance": "31000000" }, "FinalFields": { "Flags": 0, "Sequence": 2, "OwnerCount": 1, "Balance": "30999988", "Account": "rhr8s3nSVJUFwkApgLP32XyYQXZ28Xphfc" } } }, { "ModifiedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "B5893F42A404E7E9D720AD5453F0856F2496C3F895667634AC5D353092E06A02", "FinalFields": { "Flags": 0, "IndexPrevious": "00000000000004BA", "RootIndex": "494660EA99CF2FE02C1D8235791BD46F80D84253D413A5C67AF7E276E9C7404F", "Owner": "razqQKzJRdB4UxFPWf5NEpEG3WMkmwgcXA" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "PreviousTxnLgrSeq": 37469798, "PreviousTxnID": "91CAD179B766842DDD054EDE6120871CDFBF92555492320D629B26BF56072EAE", "LedgerIndex": "D9A4529146AB12ABD244CCC0ED0523CF5C6BA97043999AB27C1D4EB567929069" } } ], "TransactionResult": "tesSUCCESS" } } ================================================ FILE: src/containers/shared/components/Transaction/UNLModify/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { encodeNodePublic } from 'ripple-address-codec' import { hexToBytes } from '@xrplf/isomorphic/utils' import type { UNLModify } from 'xrpl' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleProps } from '../types' import { RouteLink } from '../../../routing' import { VALIDATOR_ROUTE } from '../../../../App/routes' export const Simple = ({ data }: TransactionSimpleProps) => { const { t } = useTranslation() const tx = data.instructions const encoded = encodeNodePublic(hexToBytes(tx.UNLModifyValidator)) return ( <> {encoded} {tx.UNLModifyDisabling ? 'DISABLE' : 'ENABLE'} ) } ================================================ FILE: src/containers/shared/components/Transaction/UNLModify/index.ts ================================================ import type { UNLModify } from 'xrpl' import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' export const UNLModifyTransaction: TransactionMapping = { Simple, action: TransactionAction.MODIFY, category: TransactionCategory.PSEUDO, parser: (tx: UNLModify): UNLModify => tx, } ================================================ FILE: src/containers/shared/components/Transaction/UNLModify/test/UNLModifySimple.test.tsx ================================================ import { render } from '@testing-library/react' import i18n from '../../../../../../i18n/testConfigEnglish' import { expectSimpleRowLabel, expectSimpleRowText } from '../../test' import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockUNLModifyEnable from './mock_data/UNLModifyEnable.json' import mockUNLModifyDisable from './mock_data/UNLModifyDisable.json' import { SimpleTab } from '../../../../../Transactions/SimpleTab' import { QuickHarness } from '../../../../../test/utils' import summarizeTransaction from '../../../../../../rippled/lib/txSummary' const renderSimple = createSimpleRenderFactory(Simple, i18n) describe('UNLModify: Simple', () => { it('renders tx that enables a validator', () => { const { container } = renderSimple(mockUNLModifyEnable) expectSimpleRowLabel(container, 'validator', 'Validator') expectSimpleRowText( container, 'validator', 'nHUXeusfwk61c4xJPneb9Lgy7Ga6DVaVLEyB29ftUdt9k2KxD6Hw', ) expectSimpleRowLabel(container, 'action', 'action') expectSimpleRowText(container, 'action', 'ENABLE') }) it('renders tx that disables a validator', () => { const { container } = renderSimple(mockUNLModifyDisable) expectSimpleRowLabel(container, 'validator', 'Validator') expectSimpleRowText( container, 'validator', 'nHUXeusfwk61c4xJPneb9Lgy7Ga6DVaVLEyB29ftUdt9k2KxD6Hw', ) expectSimpleRowLabel(container, 'action', 'action') expectSimpleRowText(container, 'action', 'DISABLE') }) it('renders tx with correct account and sequence', () => { const { container } = render( , ) expect( container.querySelector('[data-testid="account"]'), ).not.toBeInTheDocument() expectSimpleRowLabel(container, 'sequence', 'Sequence Number') expectSimpleRowText(container, 'sequence', '0') }) }) ================================================ FILE: src/containers/shared/components/Transaction/UNLModify/test/mock_data/UNLModifyDisable.json ================================================ { "tx": { "Account": "", "Fee": "0", "LedgerSequence": 68485120, "Sequence": 0, "SigningPubKey": "", "TransactionType": "UNLModify", "UNLModifyDisabling": 1, "UNLModifyValidator": "ED9AE4F5887BA029EB7C0884486D23CF281975F773F44BD213054219882C411CC7", "date": "2021-12-21T17:24:51Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "NegativeUNL", "LedgerIndex": "2E8A59AA9D3B5B186B0B9E0F62E6C02587CA74A4D778938E957B6357D364B244", "NewFields": { "ValidatorToDisable": "ED9AE4F5887BA029EB7C0884486D23CF281975F773F44BD213054219882C411CC7" } } } ], "TransactionIndex": 23, "TransactionResult": "tesSUCCESS" }, "hash": "0746806B2E9C0ED3FC279C6D773EF72F255EACEEE1975FE1F02D1FF704B15455", "ledger_index": 68485120, "date": "2021-12-21T17:24:51Z" } ================================================ FILE: src/containers/shared/components/Transaction/UNLModify/test/mock_data/UNLModifyEnable.json ================================================ { "tx": { "Account": "", "Fee": "0", "LedgerSequence": 68485376, "Sequence": 0, "SigningPubKey": "", "TransactionType": "UNLModify", "UNLModifyDisabling": 0, "UNLModifyValidator": "ED9AE4F5887BA029EB7C0884486D23CF281975F773F44BD213054219882C411CC7", "date": "2021-12-21T17:42:12Z", "warnings": [ { "id": 1004, "message": "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\"" } ] }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "DisabledValidators": [ { "DisabledValidator": { "FirstLedgerSequence": 68485376, "PublicKey": "ED9AE4F5887BA029EB7C0884486D23CF281975F773F44BD213054219882C411CC7" } } ], "Flags": 0, "ValidatorToReEnable": "ED9AE4F5887BA029EB7C0884486D23CF281975F773F44BD213054219882C411CC7" }, "LedgerEntryType": "NegativeUNL", "LedgerIndex": "2E8A59AA9D3B5B186B0B9E0F62E6C02587CA74A4D778938E957B6357D364B244", "PreviousFields": {} } } ], "TransactionIndex": 9, "TransactionResult": "tesSUCCESS" }, "hash": "BBA06528C9AAE4BE774A99783B1C7C7F60885ED57B7C4251A8A662B6449461F1", "ledger_index": 68485376, "date": "2021-12-21T17:42:12Z" } ================================================ FILE: src/containers/shared/components/Transaction/VaultClawback/Description.tsx ================================================ import { Trans } from 'react-i18next' import type { VaultClawback } from 'xrpl' import { TransactionDescriptionProps } from '../types' import { Amount } from '../../Amount' import { Account } from '../../Account' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const Description = ({ data, }: TransactionDescriptionProps) => { const { tx } = data const { Account: account, Holder: holder, Amount: amount } = tx return amount ? ( , Holder: , Amount: ( {' '} ), }} /> ) : ( , Holder: , }} /> ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultClawback/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { VaultClawback } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { Account } from '../../Account' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { VaultID: vaultId, Holder: holder, Amount: amount } = data.instructions return ( <> {vaultId} {amount && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultClawback/TableDetail.tsx ================================================ import { t } from 'i18next' import { Trans } from 'react-i18next' import type { VaultClawback } from 'xrpl' import { TransactionTableDetailProps } from '../types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { Amount } from '../../Amount' import { Account } from '../../Account' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { Holder: holder, Amount: amount } = instructions return (
    {t('claws_back')} {amount && } {t('from')}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultClawback/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const VaultClawbackTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.SEND, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/VaultClawback/test/VaultClawbackDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import mockVaultCreate from './mock_data/VaultClawback.json' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('VaultClawback: Description', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultCreate) expect(container).toHaveTextContent( 'rhPempKXKgtkfbxMR1nZdb5SG8T35vYsZJ clawbacks $5.00 USD.rhPempKXKgtkfbxMR1nZdb5SG8T35vYsZJ from raMUwNw4u59UU9WWpqZYYEj77y8yZhC6Wp', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultClawback/test/VaultClawbackSimple.test.tsx ================================================ import { expectSimpleRowText, createSimpleRenderFactory } from '../../test' import { Simple } from '../Simple' import mockVaultClawback from './mock_data/VaultClawback.json' const renderComponent = createSimpleRenderFactory(Simple) describe('VaultClawback: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultClawback) expectSimpleRowText( container, 'vault_id', 'CFE74C9608553E8BCA771DF600E96937768B9EEA7BAD3AD22BB2793A4494ABF9', ) expectSimpleRowText( container, 'holder', 'raMUwNw4u59UU9WWpqZYYEj77y8yZhC6Wp', ) expectSimpleRowText( container, 'amount', '$5.00 USD.rhPempKXKgtkfbxMR1nZdb5SG8T35vYsZJ', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultClawback/test/VaultClawbackTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockVaultClawback from './mock_data/VaultClawback.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('VaultClawbackTableDetail', () => { it('render VaultClawbackTableDetail', () => { const { container, unmount } = renderComponent(mockVaultClawback) expect(container).toHaveTextContent( 'Claws back $5.00 USD.rhPempKXKgtkfbxMR1nZdb5SG8T35vYsZJ from raMUwNw4u59UU9WWpqZYYEj77y8yZhC6Wp', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultClawback/test/mock_data/VaultClawback.json ================================================ { "close_time_iso": "2025-07-29T17:32:32Z", "ctid": "C006242600000C96", "hash": "FFC3ABE18EAF0F064F5AE82C8CACE5389C8BAC6E960EAC4A0818D54CC88DF5D1", "ledger_hash": "CF84D9C7BB15D82229742FE028A943EF12B65AD8F009A24824A6A6AE4051DEB1", "ledger_index": 402470, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 2228224, "HighLimit": { "currency": "USD", "issuer": "rExKLJMs6KNpMmBZ9XJnTMU45buVrTyyrJ", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rhPempKXKgtkfbxMR1nZdb5SG8T35vYsZJ", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "024F2773BF71DE4B3E43C83579F47BA7FB03BE80FAA055037279B64159E54A43", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-5" } }, "PreviousTxnID": "C87CDA954D97B77379E9841F75B83264688B1196C58F9AB3D42651A4ED2974B2", "PreviousTxnLgrSeq": 402468 } }, { "ModifiedNode": { "FinalFields": { "Account": "raMUwNw4u59UU9WWpqZYYEj77y8yZhC6Wp", "Flags": 0, "MPTokenIssuanceID": "00000001A407F138DEDF8AADF66EA1E3E34512CC9EDFBA4A", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "898DC8BD9A8AF25787FD29A8F928A6A49D0063ED17DDA200D45491C733021986", "PreviousFields": { "MPTAmount": "5" }, "PreviousTxnID": "C87CDA954D97B77379E9841F75B83264688B1196C58F9AB3D42651A4ED2974B2", "PreviousTxnLgrSeq": 402468 } }, { "ModifiedNode": { "FinalFields": { "Account": "rhPempKXKgtkfbxMR1nZdb5SG8T35vYsZJ", "Balance": "94999964", "Flags": 2155872256, "OwnerCount": 0, "Sequence": 402456 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B96AD86828F03B79E9F23A6F3A8DEC50478471FEA0DBA49B053BC1EDD75936FF", "PreviousFields": { "Balance": "99999964", "Sequence": 402455 }, "PreviousTxnID": "67FB26E7B4E0A217499D99571C6B315AC5BFD466280574E18547C6B5A551C4A4", "PreviousTxnLgrSeq": 402464 } }, { "ModifiedNode": { "FinalFields": { "Account": "rExKLJMs6KNpMmBZ9XJnTMU45buVrTyyrJ", "Asset": { "currency": "USD", "issuer": "rhPempKXKgtkfbxMR1nZdb5SG8T35vYsZJ" }, "AssetsAvailable": "0", "AssetsMaximum": "1000", "AssetsTotal": "0", "Data": "75706461746564206D65746164617461", "Flags": 0, "LossUnrealized": "0", "Owner": "rMUqJHdkWSUiKMXaWwv5s74eLxp7QNmMme", "OwnerNode": "0", "Sequence": 402453, "ShareMPTID": "00000001A407F138DEDF8AADF66EA1E3E34512CC9EDFBA4A", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "CFE74C9608553E8BCA771DF600E96937768B9EEA7BAD3AD22BB2793A4494ABF9", "PreviousFields": { "AssetsAvailable": "5", "AssetsTotal": "5" }, "PreviousTxnID": "C87CDA954D97B77379E9841F75B83264688B1196C58F9AB3D42651A4ED2974B2", "PreviousTxnLgrSeq": 402468 } }, { "ModifiedNode": { "FinalFields": { "Flags": 56, "Issuer": "rExKLJMs6KNpMmBZ9XJnTMU45buVrTyyrJ", "MPTokenMetadata": "7368617265206D65746164617461", "OutstandingAmount": "0", "OwnerNode": "0", "Sequence": 1 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "D2956853B8B47F4C895EC1D7D32A660C38F144A693C302044EEE3DEDF5244C50", "PreviousFields": { "OutstandingAmount": "5" }, "PreviousTxnID": "C87CDA954D97B77379E9841F75B83264688B1196C58F9AB3D42651A4ED2974B2", "PreviousTxnLgrSeq": 402468 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rhPempKXKgtkfbxMR1nZdb5SG8T35vYsZJ", "Amount": { "currency": "USD", "issuer": "rhPempKXKgtkfbxMR1nZdb5SG8T35vYsZJ", "value": "5" }, "Fee": "5000000", "Flags": 0, "Holder": "raMUwNw4u59UU9WWpqZYYEj77y8yZhC6Wp", "LastLedgerSequence": 402488, "NetworkID": 3222, "Sequence": 402455, "SigningPubKey": "ED5932C16EA38BD9F64F1C9B932BF5C77BA04D403A38C0EC416F5B100DD57308E9", "TransactionType": "VaultClawback", "TxnSignature": "A25F5EF3F04868A5349DB6B30BFB4060DE65E6EE7E0F4EA2D522717ADA6D4E0A0D5559045F30EC32B081747300C9BDE8CDFC46784310282A6324EA5C33C55D06", "VaultID": "CFE74C9608553E8BCA771DF600E96937768B9EEA7BAD3AD22BB2793A4494ABF9", "ctid": "C006242600000C96", "date": 807125552, "ledger_index": 402470 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/VaultCreate/Description.tsx ================================================ import { Trans } from 'react-i18next' import type { VaultCreate } from 'xrpl' import { TransactionDescriptionProps } from '../types' import { Account } from '../../Account' import Currency from '../../Currency' import { MPTokenLink } from '../../MPTokenLink' export const Description = ({ data, }: TransactionDescriptionProps) => { const { tx } = data const { Account: account, Asset: asset } = tx // @ts-expect-error -- necessary to check for MPT const mptIssuanceId = asset.mpt_issuance_id const isMPT = mptIssuanceId != null return ( , Asset: isMPT ? ( ) : ( ), }} /> ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultCreate/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { VaultCreate } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import Currency from '../../Currency' import { isValidJsonString } from '../../../utils' import { JsonView } from '../../JsonView' import { MPTokenLink } from '../../MPTokenLink' import { TX_FLAGS } from '../../../transactionUtils' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { Asset, AssetsMaximum, Data, MPTokenMetadata, WithdrawalPolicy, DomainID, } = data.instructions // @ts-expect-error -- necessary to check for MPT const mptIssuanceId = Asset.mpt_issuance_id const isMPT = mptIssuanceId != null return ( <> {isMPT ? ( ) : ( )} {AssetsMaximum && ( {AssetsMaximum} )} {Data && ( {isValidJsonString(Data) ? ( ) : ( Data )} )} {MPTokenMetadata && ( {isValidJsonString(MPTokenMetadata) ? ( ) : ( MPTokenMetadata )} )} {WithdrawalPolicy && ( {TX_FLAGS.VaultCreate[WithdrawalPolicy] || WithdrawalPolicy} )} {DomainID && ( DomainID )} ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultCreate/TableDetail.tsx ================================================ import { Trans } from 'react-i18next' import { t } from 'i18next' import type { VaultCreate } from 'xrpl' import { TransactionTableDetailProps } from '../types' import Currency from '../../Currency' import { MPTokenLink } from '../../MPTokenLink' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { Asset: asset } = instructions // @ts-expect-error -- necessary to check for MPT const mptIssuanceId = asset.mpt_issuance_id const isMPT = mptIssuanceId != null return (
    {t('transaction_action_CREATE')} ) : ( ), }} />
    ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultCreate/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const VaultCreateTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.CREATE, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/VaultCreate/test/VaultCreateDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import mockVaultCreate from './mock_data/VaultCreate.json' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('VaultCreate: Description', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultCreate) expect(container).toHaveTextContent( 'rpZtrvuiVDhtSDZPm7axXgNB7iW3J4avwQ created a vault for USD.rJCPrRU8kcLfqCKob1j9EivLa4wG5pF4C2', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultCreate/test/VaultCreateSimple.test.tsx ================================================ import { expectSimpleRowText, createSimpleRenderFactory, expectSimpleRowNotToExist, } from '../../test' import { Simple } from '../Simple' import mockVaultCreate from './mock_data/VaultCreate.json' const renderComponent = createSimpleRenderFactory(Simple) describe('VaultCreate: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultCreate) expectSimpleRowText( container, 'asset', 'USD.rJCPrRU8kcLfqCKob1j9EivLa4wG5pF4C2', ) expectSimpleRowText(container, 'assets_maximum', '500') expectSimpleRowText(container, 'data', '7661756C74206D65746164617461') expectSimpleRowText( container, 'mptoken_metadata', '7368617265206D65746164617461', ) expectSimpleRowText( container, 'withdrawal_policy', 'vaultStrategyFirstComeFirstServe', ) expectSimpleRowNotToExist(container, 'domain_id') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultCreate/test/VaultCreateTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockVaultCreate from './mock_data/VaultCreate.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('VaultCreateTableDetail', () => { it('render VaultCreateTableDetail', () => { const { container, unmount } = renderComponent(mockVaultCreate) expect(container).toHaveTextContent( // "create vault" is displayed on the UI 'Createvault for USD.rJCPrRU8kcLfqCKob1j9EivLa4wG5pF4C2', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultCreate/test/mock_data/VaultCreate.json ================================================ { "close_time_iso": "2025-07-28T14:33:32Z", "ctid": "C005A5B800000C96", "hash": "C3A66689AAD6A7B8BFF535C125DC251E5CC91DAEB9A1212295635219CA814F87", "ledger_hash": "D2FB9809B0A876D649AC6638EB27AB714C2104D63395F465BC83D0419E02859E", "ledger_index": 370104, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "100ECAFCB2612246420AF018FC3D0136387BB973D791895D1A70B399210C898C", "NewFields": { "Owner": "raKXA6BCRNbJyuzSB9AJ9Ykx9wi1mc4uTf", "RootIndex": "100ECAFCB2612246420AF018FC3D0136387BB973D791895D1A70B399210C898C" } } }, { "CreatedNode": { "LedgerEntryType": "RippleState", "LedgerIndex": "110E0CBEC6D61A84A4D9D99720D467F9784D721F4F936BCDEBC37E9FBC0A552F", "NewFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1114112, "HighLimit": { "currency": "USD", "issuer": "rJCPrRU8kcLfqCKob1j9EivLa4wG5pF4C2", "value": "0" }, "LowLimit": { "currency": "USD", "issuer": "raKXA6BCRNbJyuzSB9AJ9Ykx9wi1mc4uTf", "value": "0" } } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "3C4E60B37395E1247CAF623F33591E7B0C46B9D4C87FF5B25090D3554BFCC509", "NewFields": { "Owner": "rpZtrvuiVDhtSDZPm7axXgNB7iW3J4avwQ", "RootIndex": "3C4E60B37395E1247CAF623F33591E7B0C46B9D4C87FF5B25090D3554BFCC509" } } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "73B52BD94D8E722BECD2F89407DBBD850D878EFA5388D33C18213E8ED44BE4B2", "PreviousTxnID": "E41237E69B2A721B37F954C056BBEFA71DD7CA91E2CBD387406B4A76C210065E", "PreviousTxnLgrSeq": 370102 } }, { "CreatedNode": { "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "9450FA79302D108934FF1C28C90DF11D35AAE86156B311A3648D4A018CCFDB20", "NewFields": { "Flags": 56, "Issuer": "raKXA6BCRNbJyuzSB9AJ9Ykx9wi1mc4uTf", "MPTokenMetadata": "7368617265206D65746164617461", "Sequence": 1 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rpZtrvuiVDhtSDZPm7axXgNB7iW3J4avwQ", "Balance": "95000000", "Flags": 0, "OwnerCount": 1, "Sequence": 370095 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "A3AA84035B223DAF7E06CB3C6624DEC258E6A5223A4F5A14B06F20C06871593F", "PreviousFields": { "Balance": "100000000", "OwnerCount": 0, "Sequence": 370094 }, "PreviousTxnID": "39A35785F06858EC1989F0494B548AE24D6CA29362B5269BEFE18BD6015DA19D", "PreviousTxnLgrSeq": 370094 } }, { "CreatedNode": { "LedgerEntryType": "Vault", "LedgerIndex": "A441A9B4AA29709F483813F86D0B3CA680EEBA1C9B27A13900F65EC31FA929B1", "NewFields": { "Account": "raKXA6BCRNbJyuzSB9AJ9Ykx9wi1mc4uTf", "Asset": { "currency": "USD", "issuer": "rJCPrRU8kcLfqCKob1j9EivLa4wG5pF4C2" }, "AssetsMaximum": "500", "Data": "7661756C74206D65746164617461", "Owner": "rpZtrvuiVDhtSDZPm7axXgNB7iW3J4avwQ", "Sequence": 370094, "ShareMPTID": "000000013A59F2358FED3D0478E4588C67B162EFCE92E279", "WithdrawalPolicy": 1 } } }, { "CreatedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "B19746AAD9D08D9621E833D1535938491FDC1F636A23ED5C46479128357200CF", "NewFields": { "Account": "raKXA6BCRNbJyuzSB9AJ9Ykx9wi1mc4uTf", "Flags": 26214400, "OwnerCount": 2, "VaultID": "A441A9B4AA29709F483813F86D0B3CA680EEBA1C9B27A13900F65EC31FA929B1" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rJCPrRU8kcLfqCKob1j9EivLa4wG5pF4C2", "RootIndex": "E2464506C72BCF889380065B34A557024598A33171769A0DC9950F00CF922F27" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E2464506C72BCF889380065B34A557024598A33171769A0DC9950F00CF922F27", "PreviousTxnID": "E142ECAE46CE053B3A7D0EA753464665FC8EE6F83375C6DBCAA308071C5050E6", "PreviousTxnLgrSeq": 370100 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rpZtrvuiVDhtSDZPm7axXgNB7iW3J4avwQ", "Asset": { "currency": "USD", "issuer": "rJCPrRU8kcLfqCKob1j9EivLa4wG5pF4C2" }, "AssetsMaximum": "500", "Data": "7661756C74206D65746164617461", "Fee": "5000000", "Flags": 0, "LastLedgerSequence": 370122, "MPTokenMetadata": "7368617265206D65746164617461", "NetworkID": 3222, "Sequence": 370094, "SigningPubKey": "EDFDA5D690EF90A4F0C9815422C19E059FA20882EF84F2B92993A094858546AEA7", "TransactionType": "VaultCreate", "TxnSignature": "F2C2AD6C9E97C012DDF32635FE83D1C284EB826244BFC7F93BFE8D6A30E360220CE3EE14FB5117EFF00B69C347D8963AEA2AB3501F1DB6A25B0BEC9A539BE50F", "WithdrawalPolicy": 1, "ctid": "C005A5B800000C96", "date": 807028412, "ledger_index": 370104 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/VaultDelete/Description.tsx ================================================ import { Trans } from 'react-i18next' import type { VaultDelete } from 'xrpl' import { TransactionDescriptionProps } from '../types' import { Account } from '../../Account' export const Description = ({ data, }: TransactionDescriptionProps) => { const { tx } = data const { Account: account, VaultID: vaultId } = tx return ( , VaultID: {vaultId}, }} /> ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultDelete/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { VaultDelete } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { VaultID: vaultId } = data.instructions return ( {vaultId} ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultDelete/TableDetail.tsx ================================================ import { t } from 'i18next' import type { VaultDelete } from 'xrpl' import { TransactionTableDetailProps } from '../types' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { VaultID: vaultId } = instructions return (
    {t('deletes')} {t('vault_delete_table_detail')} {vaultId}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultDelete/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const VaultDeleteTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.FINISH, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/VaultDelete/test/VaultDeleteDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import mockVaultCreate from './mock_data/VaultDelete.json' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('VaultDelete: Description', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultCreate) expect(container).toHaveTextContent( 'rLR12AgChXxLoQsuLCizNCgh5pt5jPheo1 deleted a vault with ID 2AA88C4CA646645E35E38B8D51CD2CA50BDE14A3F3FFE3838F2C8DCE95C2BABD', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultDelete/test/VaultDeleteSimple.test.tsx ================================================ import { expectSimpleRowText, createSimpleRenderFactory } from '../../test' import { Simple } from '../Simple' import mockVaultDelete from './mock_data/VaultDelete.json' const renderComponent = createSimpleRenderFactory(Simple) describe('VaultDelete: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultDelete) expectSimpleRowText( container, 'vault_id', '2AA88C4CA646645E35E38B8D51CD2CA50BDE14A3F3FFE3838F2C8DCE95C2BABD', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultDelete/test/VaultDeleteTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockVaultDelete from './mock_data/VaultDelete.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('VaultDeleteTableDetail', () => { it('render VaultDeleteTableDetail', () => { const { container, unmount } = renderComponent(mockVaultDelete) expect(container).toHaveTextContent( // "deletes vault" is displayed on the UI 'deletesvault with id 2AA88C4CA646645E35E38B8D51CD2CA50BDE14A3F3FFE3838F2C8DCE95C2BABD', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultDelete/test/mock_data/VaultDelete.json ================================================ { "close_time_iso": "2025-07-29T18:04:41Z", "ctid": "C00626A700000C96", "hash": "1C6B4A727D341E73A72FA5413B0B07284D789AB4B37E2472E1CCFA8154B86786", "ledger_hash": "397ACCF91F8CF3FB26EF29872F5DD260A7FA2DB1F6852E2DC24FA90F3F616D4E", "ledger_index": 403111, "meta": { "AffectedNodes": [ { "DeletedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" }, "Flags": 1048576, "HighLimit": { "currency": "USD", "issuer": "r3gsrBk7HvrKecVHdkUmYywnMKahispvoY", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "r3r1vU5c2N5R7Ruv3v5daqfQ4MGzr9FZAZ", "value": "0" }, "LowNode": "0", "PreviousTxnID": "37729284C0A01CA720EC2F96978D8577AB7057B348234905510E97665D649A87", "PreviousTxnLgrSeq": 403109 }, "LedgerEntryType": "RippleState", "LedgerIndex": "009071D98F3BC8B763E7C89375504E810161BDE196C3FA3E225F131FF73659EC", "PreviousFields": { "Flags": 1114112 } } }, { "DeletedNode": { "FinalFields": { "Flags": 0, "Owner": "r3r1vU5c2N5R7Ruv3v5daqfQ4MGzr9FZAZ", "PreviousTxnID": "E1D5E38683094008D77E120B704E94446FA762FE4A1B0CAA7423D208748DAEF2", "PreviousTxnLgrSeq": 403102, "RootIndex": "06120FA67193028575B03EE78F230318E8303C4708AD8BDEF9EFFE327D5FCFA3" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "06120FA67193028575B03EE78F230318E8303C4708AD8BDEF9EFFE327D5FCFA3" } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "r3gsrBk7HvrKecVHdkUmYywnMKahispvoY", "RootIndex": "0BBF6DF6E7E3B213C10F0E9A3E7550DE8F9CBD2A88D19FE8F2CEB5173ADA98F7" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "0BBF6DF6E7E3B213C10F0E9A3E7550DE8F9CBD2A88D19FE8F2CEB5173ADA98F7", "PreviousTxnID": "E1D5E38683094008D77E120B704E94446FA762FE4A1B0CAA7423D208748DAEF2", "PreviousTxnLgrSeq": 403102 } }, { "DeletedNode": { "FinalFields": { "Account": "r3r1vU5c2N5R7Ruv3v5daqfQ4MGzr9FZAZ", "Asset": { "currency": "USD", "issuer": "r3gsrBk7HvrKecVHdkUmYywnMKahispvoY" }, "AssetsAvailable": "0", "AssetsMaximum": "1000", "AssetsTotal": "0", "Data": "75706461746564206D65746164617461", "Flags": 0, "LossUnrealized": "0", "Owner": "rLR12AgChXxLoQsuLCizNCgh5pt5jPheo1", "OwnerNode": "0", "PreviousTxnID": "37729284C0A01CA720EC2F96978D8577AB7057B348234905510E97665D649A87", "PreviousTxnLgrSeq": 403109, "Sequence": 403093, "ShareMPTID": "000000014CF362539B39EF0FB60A5BC07247E9498609049D", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "2AA88C4CA646645E35E38B8D51CD2CA50BDE14A3F3FFE3838F2C8DCE95C2BABD" } }, { "DeletedNode": { "FinalFields": { "Flags": 0, "Owner": "rLR12AgChXxLoQsuLCizNCgh5pt5jPheo1", "PreviousTxnID": "E1D5E38683094008D77E120B704E94446FA762FE4A1B0CAA7423D208748DAEF2", "PreviousTxnLgrSeq": 403102, "RootIndex": "42C42D53D121FA35E66FDE1F2A326C3D0DE072321C719CF30B5009BC247D0CA0" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "42C42D53D121FA35E66FDE1F2A326C3D0DE072321C719CF30B5009BC247D0CA0" } }, { "ModifiedNode": { "FinalFields": { "Account": "rLR12AgChXxLoQsuLCizNCgh5pt5jPheo1", "Balance": "85000000", "Flags": 0, "OwnerCount": 0, "Sequence": 403096 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "BE2D185528E7B5A33A35E1ED9C902A8D7217B8DB0EAD0AF8F405B739DA1CFA35", "PreviousFields": { "Balance": "90000000", "OwnerCount": 1, "Sequence": 403095 }, "PreviousTxnID": "16D095B9D78138E4335CD48D67F3D2ABF72B4C704452A20AC26B86CF81BC5413", "PreviousTxnLgrSeq": 403104 } }, { "DeletedNode": { "FinalFields": { "Account": "r3r1vU5c2N5R7Ruv3v5daqfQ4MGzr9FZAZ", "Balance": "0", "Flags": 26214400, "OwnerCount": 0, "PreviousTxnID": "E1D5E38683094008D77E120B704E94446FA762FE4A1B0CAA7423D208748DAEF2", "PreviousTxnLgrSeq": 403102, "Sequence": 0, "VaultID": "2AA88C4CA646645E35E38B8D51CD2CA50BDE14A3F3FFE3838F2C8DCE95C2BABD" }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "C2D6260E51B848509F5F984283170AA6032B302CAD5A7D72F8A8D427ED6AF127", "PreviousFields": { "OwnerCount": 2 } } }, { "DeletedNode": { "FinalFields": { "Flags": 56, "Issuer": "r3r1vU5c2N5R7Ruv3v5daqfQ4MGzr9FZAZ", "MPTokenMetadata": "7368617265206D65746164617461", "OutstandingAmount": "0", "OwnerNode": "0", "PreviousTxnID": "37729284C0A01CA720EC2F96978D8577AB7057B348234905510E97665D649A87", "PreviousTxnLgrSeq": 403109, "Sequence": 1 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "D6ADE074F02694A042C292F1381DCA59ABE8CD52BA8769D029C6ED83CB0B9113" } }, { "ModifiedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "E4D60A5BAA8D59B7F390AE5ED245AE40C274352555D3E5EEE7F95F818EDDE3B6", "PreviousTxnID": "37729284C0A01CA720EC2F96978D8577AB7057B348234905510E97665D649A87", "PreviousTxnLgrSeq": 403109 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rLR12AgChXxLoQsuLCizNCgh5pt5jPheo1", "Fee": "5000000", "Flags": 0, "LastLedgerSequence": 403129, "NetworkID": 3222, "Sequence": 403095, "SigningPubKey": "ED5AD76AF3C2D749B6C84474E05209FC3E5D87DE2599F7DE3E7E6F31D9D47FB691", "TransactionType": "VaultDelete", "TxnSignature": "D6A3F0AADD0ECEE2D51E051157EF582D8C1EFD84897A912557148FC963D9B93DFD725996F90ED2DF7F0922B34E47D28869E408EDD9F7CA2CEA681023EE57B70D", "VaultID": "2AA88C4CA646645E35E38B8D51CD2CA50BDE14A3F3FFE3838F2C8DCE95C2BABD", "ctid": "C00626A700000C96", "date": 807127481, "ledger_index": 403111 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/VaultDeposit/Description.tsx ================================================ import { Trans } from 'react-i18next' import type { VaultDeposit } from 'xrpl' import { TransactionDescriptionProps } from '../types' import { Amount } from '../../Amount' import { Account } from '../../Account' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const Description = ({ data, }: TransactionDescriptionProps) => { const { tx } = data const { Account: account, VaultID: vaultId, Amount: amount } = tx return ( , Amount: ( ), VaultID: {vaultId}, }} /> ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultDeposit/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { VaultDeposit } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { VaultID: vaultId, Amount: amount } = data.instructions return ( <> {vaultId} ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultDeposit/TableDetail.tsx ================================================ import { t } from 'i18next' import type { VaultDeposit } from 'xrpl' import { TransactionTableDetailProps } from '../types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { Amount } from '../../Amount' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { VaultID: vaultId, Amount: amount } = instructions return (
    {t('send')} {`${t('to')} ${t('vault_id')}`} {vaultId}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultDeposit/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const VaultDepositTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.SEND, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/VaultDeposit/test/VaultDepositDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import mockVaultCreate from './mock_data/VaultDeposit.json' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('VaultDeposit: Description', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultCreate) expect(container).toHaveTextContent( 'rsuz1RpQHqLXnMqtPuP7qWFpccTKN651VK deposits $10.00 USD.rLm1zd4jWxwkoUcvbkRevwt7WC3GffF8B9 into Vault ID C70AAB4EB1823B744559AF64D495AD084AC4113C2CFA4F71EB8DD8BB811137C2', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultDeposit/test/VaultDepositSimple.test.tsx ================================================ import { expectSimpleRowText, createSimpleRenderFactory } from '../../test' import { Simple } from '../Simple' import mockVaultDeposit from './mock_data/VaultDeposit.json' const renderComponent = createSimpleRenderFactory(Simple) describe('VaultDeposit: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultDeposit) expectSimpleRowText( container, 'vault_id', 'C70AAB4EB1823B744559AF64D495AD084AC4113C2CFA4F71EB8DD8BB811137C2', ) expectSimpleRowText( container, 'amount', '$10.00 USD.rLm1zd4jWxwkoUcvbkRevwt7WC3GffF8B9', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultDeposit/test/VaultDepositTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockVaultDeposit from './mock_data/VaultDeposit.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('VaultDepositTableDetail', () => { it('render VaultDepositTableDetail', () => { const { container, unmount } = renderComponent(mockVaultDeposit) expect(container).toHaveTextContent( 'Send$10.00 USD.rLm1zd4jWxwkoUcvbkRevwt7WC3GffF8B9to Vault IDC70AAB4EB1823B744559AF64D495AD084AC4113C2CFA4F71EB8DD8BB811137C2', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultDeposit/test/mock_data/VaultDeposit.json ================================================ { "close_time_iso": "2025-07-29T15:13:41Z", "ctid": "C006195000000C96", "hash": "33AA1B997DE5C986FA3DBA11FBE33AEBB6CADF48709FECFE86071517EA0AA83D", "ledger_hash": "C9DF7EC190B5C53D9A108A3B95EA70AF8B51B25B1132480DDB173CC430917AA6", "ledger_index": 399696, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "MPToken", "LedgerIndex": "29D0BE848B064BFDAEE197630604C0030931C0C85C6D1E36212E85E13F4E9B44", "NewFields": { "Account": "rsuz1RpQHqLXnMqtPuP7qWFpccTKN651VK", "MPTAmount": "10", "MPTokenIssuanceID": "000000016280D64707D6DEE9A005C1F3E4BDF750D1103CAB" } } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "990" }, "Flags": 65536, "HighLimit": { "currency": "USD", "issuer": "rLm1zd4jWxwkoUcvbkRevwt7WC3GffF8B9", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rsuz1RpQHqLXnMqtPuP7qWFpccTKN651VK", "value": "1000" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "5C7F7D47416E8B351E663A15CD8CED360F7E21E4D4831B81CF91DDA26AFFB101", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "1000" } }, "PreviousTxnID": "ED08BDCE7E722DF2F32C8AE11943BEC73A387D57641ACEE819C6ADD38F9D32AA", "PreviousTxnLgrSeq": 399692 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10" }, "Flags": 1114112, "HighLimit": { "currency": "USD", "issuer": "rLm1zd4jWxwkoUcvbkRevwt7WC3GffF8B9", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "r9yqZZsoqNfurRrrKcot8vsPThNEAy26e6", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "7C031D7DD4883D49E03982A0413312CA7E8173F034773C1EACBDC210C40510B7", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "0" } }, "PreviousTxnID": "991FC86BFF463DF5CC1D1A1BCA805D80B6B107BBF84AF918427446094D4EECBA", "PreviousTxnLgrSeq": 399693 } }, { "ModifiedNode": { "FinalFields": { "Flags": 56, "Issuer": "r9yqZZsoqNfurRrrKcot8vsPThNEAy26e6", "MPTokenMetadata": "7368617265206D65746164617461", "OutstandingAmount": "10", "OwnerNode": "0", "Sequence": 1 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "AC5B35F62CD94D42F05546C42EC573486BF57FE1204511E04798895C3168B4BE", "PreviousFields": { "OutstandingAmount": "0" }, "PreviousTxnID": "991FC86BFF463DF5CC1D1A1BCA805D80B6B107BBF84AF918427446094D4EECBA", "PreviousTxnLgrSeq": 399693 } }, { "ModifiedNode": { "FinalFields": { "Account": "r9yqZZsoqNfurRrrKcot8vsPThNEAy26e6", "Asset": { "currency": "USD", "issuer": "rLm1zd4jWxwkoUcvbkRevwt7WC3GffF8B9" }, "AssetsAvailable": "10", "AssetsMaximum": "1000", "AssetsTotal": "10", "Data": "75706461746564206D65746164617461", "Flags": 0, "LossUnrealized": "0", "Owner": "rpCPL444BWuq8QeYRfdxZtEvGk8q78wdtz", "OwnerNode": "0", "Sequence": 399683, "ShareMPTID": "000000016280D64707D6DEE9A005C1F3E4BDF750D1103CAB", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "C70AAB4EB1823B744559AF64D495AD084AC4113C2CFA4F71EB8DD8BB811137C2", "PreviousFields": { "AssetsAvailable": "0", "AssetsTotal": "0" }, "PreviousTxnID": "CFD574ED6554C7333E1776AF82DDDE26376486A54829B08C28953658FEC2CC11", "PreviousTxnLgrSeq": 399694 } }, { "ModifiedNode": { "FinalFields": { "Account": "rsuz1RpQHqLXnMqtPuP7qWFpccTKN651VK", "Balance": "94999988", "Flags": 0, "OwnerCount": 2, "Sequence": 399687 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "D5C5F2BE731D123C24411AC0FCA67D4D7F5409E967760B67DF1BC830E98840FC", "PreviousFields": { "Balance": "99999988", "OwnerCount": 1, "Sequence": 399686 }, "PreviousTxnID": "27580794DAF3E5134D493B4CFF01B058CB42A662B66875BEAA0CE585B43A0DCF", "PreviousTxnLgrSeq": 399690 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rsuz1RpQHqLXnMqtPuP7qWFpccTKN651VK", "RootIndex": "E9DE719C20FECAAD87143F6C43A6826D32CBD6CA869E3A5761383993CB6B751E" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "E9DE719C20FECAAD87143F6C43A6826D32CBD6CA869E3A5761383993CB6B751E", "PreviousTxnID": "27580794DAF3E5134D493B4CFF01B058CB42A662B66875BEAA0CE585B43A0DCF", "PreviousTxnLgrSeq": 399690 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rsuz1RpQHqLXnMqtPuP7qWFpccTKN651VK", "Amount": { "currency": "USD", "issuer": "rLm1zd4jWxwkoUcvbkRevwt7WC3GffF8B9", "value": "10" }, "Fee": "5000000", "Flags": 0, "LastLedgerSequence": 399714, "NetworkID": 3222, "Sequence": 399686, "SigningPubKey": "ED35A3E6817AB138294A4556C35C9E821232261F5B30A34E56B37C6AAE45342551", "TransactionType": "VaultDeposit", "TxnSignature": "38E017D21758FFEC46A8BC572E7F63B3A523656A094E85123790DB9DC434FF5D81F1153E632E94823515AB76D33A63D3F5F28D540369370A189B77E76262EA0B", "VaultID": "C70AAB4EB1823B744559AF64D495AD084AC4113C2CFA4F71EB8DD8BB811137C2", "ctid": "C006195000000C96", "date": 807117221, "ledger_index": 399696 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/VaultSet/Description.tsx ================================================ import { Trans } from 'react-i18next' import type { VaultSet } from 'xrpl' import { TransactionDescriptionProps } from '../types' import { isValidJsonString } from '../../../utils' import { JsonView } from '../../JsonView' export const Description = ({ data, }: TransactionDescriptionProps) => { const { tx } = data const { Data, AssetsMaximum: assetsMaximum, DomainID: domainId } = tx return (
    {Data && (
    {isValidJsonString(Data) ? ( ) : ( {Data} )}
    ), }} />
    )} {assetsMaximum && (
    {assetsMaximum}, }} />
    )} {domainId && (
    {domainId}, }} />
    )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultSet/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { VaultSet } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { isValidJsonString } from '../../../utils' import { JsonView } from '../../JsonView' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { VaultID, Data, AssetsMaximum, DomainID } = data.instructions return ( <> {VaultID} {AssetsMaximum && ( {AssetsMaximum} )} {Data && ( {isValidJsonString(Data) ? ( ) : ( Data )} )} {DomainID && ( DomainID )} ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultSet/TableDetail.tsx ================================================ import { t } from 'i18next' import type { VaultSet } from 'xrpl' import { TransactionTableDetailProps } from '../types' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { VaultID: vaultId, Data: data, AssetsMaximum: assetsMaximum, DomainID: domainId, } = instructions return ( <>
    {t('vault_id')}: {vaultId}
    <> {data && ( <> {t('data')}: {data} )} {assetsMaximum && ( <> {t('assets_maximum')}: {assetsMaximum} )} {domainId && ( <> {t('domain_id')}: {domainId} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultSet/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const VaultSetTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.MODIFY, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/VaultSet/test/VaultSetDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import mockVaultSet from './mock_data/VaultSet.json' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('VaultSet: Description', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultSet) expect(container.querySelector('[data-testid="data"]')).toHaveTextContent( `It sets the Vault Data to 75706461746564206D65746164617461`, ) expect( container.querySelector('[data-testid="assets_maximum"]'), ).toHaveTextContent(`It sets the Vault Assets Maximum to 1000`) expect( container.querySelector('[data-testid="domain_id"]'), ).not.toBeInTheDocument() unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultSet/test/VaultSetSimple.test.tsx ================================================ import { expectSimpleRowText, createSimpleRenderFactory, expectSimpleRowNotToExist, } from '../../test' import { Simple } from '../Simple' import mockVaultSet from './mock_data/VaultSet.json' const renderComponent = createSimpleRenderFactory(Simple) describe('VaultSet: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultSet) expectSimpleRowText( container, 'vault_id', '47148BAF6D14F8456F859A4DFCF2B2921512E44C5E1EADD72D34F33F6ED2AA00', ) expectSimpleRowText(container, 'assets_maximum', '1000') expectSimpleRowText(container, 'data', '75706461746564206D65746164617461') expectSimpleRowNotToExist(container, 'domain_id') unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultSet/test/VaultSetTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockVaultSet from './mock_data/VaultSet.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('VaultSetTableDetail', () => { it('render VaultSetTableDetail', () => { const { container, unmount } = renderComponent(mockVaultSet) expect(container).toHaveTextContent( 'Vault ID: 47148BAF6D14F8456F859A4DFCF2B2921512E44C5E1EADD72D34F33F6ED2AA00Data: 75706461746564206D65746164617461Assets Maximum: 1000', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultSet/test/mock_data/VaultSet.json ================================================ { "close_time_iso": "2025-07-28T15:55:32Z", "ctid": "C005AC1F00000C96", "hash": "E2AB3949F9A631B2C31BC8DF18F98BCD1B0FF9BF926C1864FF43560E67EFF011", "ledger_hash": "8CF6E10DC61FF65C4B98B2DDE2A0656B3641790637802F49B25EBD49DB41F9AC", "ledger_index": 371743, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rpKtkZCSwsae7ZtonSR8o85ZP1GvqVzAuw", "Asset": { "currency": "USD", "issuer": "rHn1ezxvdeoeLpqzFC1HX72WRZkz3rkrWJ" }, "AssetsAvailable": "0", "AssetsMaximum": "1000", "AssetsTotal": "0", "Data": "75706461746564206D65746164617461", "Flags": 0, "LossUnrealized": "0", "Owner": "rLGsxBVz897uvV65y63FueQcJ3uKs6dV5y", "OwnerNode": "0", "Sequence": 371733, "ShareMPTID": "000000010E8AD00F08548712886AE47C160A87B6F7F15A27", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "47148BAF6D14F8456F859A4DFCF2B2921512E44C5E1EADD72D34F33F6ED2AA00", "PreviousFields": { "AssetsMaximum": "500", "Data": "7661756C74206D65746164617461" }, "PreviousTxnID": "72F0DBFAF6F3BAB986D76AA7339B890ACB2266260F6C6ED70EC6FFC9FA853BE9", "PreviousTxnLgrSeq": 371742 } }, { "ModifiedNode": { "FinalFields": { "Account": "rLGsxBVz897uvV65y63FueQcJ3uKs6dV5y", "Balance": "90000000", "Flags": 0, "OwnerCount": 1, "Sequence": 371735 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "DB0E420F3B8D24A91B34C2DC8B15F9E39AA45EE830CB64CDA461C8A74C389C04", "PreviousFields": { "Balance": "95000000", "Sequence": 371734 }, "PreviousTxnID": "72F0DBFAF6F3BAB986D76AA7339B890ACB2266260F6C6ED70EC6FFC9FA853BE9", "PreviousTxnLgrSeq": 371742 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rLGsxBVz897uvV65y63FueQcJ3uKs6dV5y", "AssetsMaximum": "1000", "Data": "75706461746564206D65746164617461", "Fee": "5000000", "Flags": 0, "LastLedgerSequence": 371762, "NetworkID": 3222, "Sequence": 371734, "SigningPubKey": "EDEE722FE7746F8D30007EAC64C7E00D82F633BDB1D7B7D8764A64779ED0BC35D6", "TransactionType": "VaultSet", "TxnSignature": "DCB0B0F2EC3650CDED8EA00FC09EB542AF6840ABB5EC74AE094103749E53174F571F5522EF0CBE78DA5C5D3EA1DC29277A9C68CF2ABD67EC84C9772E1BFB3A0C", "VaultID": "47148BAF6D14F8456F859A4DFCF2B2921512E44C5E1EADD72D34F33F6ED2AA00", "ctid": "C005AC1F00000C96", "date": 807033332, "ledger_index": 371743 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/VaultWithdraw/Description.tsx ================================================ import { Trans } from 'react-i18next' import { t } from 'i18next' import type { VaultWithdraw } from 'xrpl' import { TransactionDescriptionProps } from '../types' import { Amount } from '../../Amount' import { Account } from '../../Account' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const Description = ({ data, }: TransactionDescriptionProps) => { const { tx } = data const { Account: account, VaultID: vaultId, Amount: amount, Destination: destination, } = tx return ( , Amount: ( ), VaultID: {vaultId}, Destination: destination ? ( <> {t('to')} ) : ( ), }} /> ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultWithdraw/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import type { VaultWithdraw } from 'xrpl' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { Account } from '../../Account' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { VaultID: vaultId, Amount: amount, Destination: destination, } = data.instructions return ( <> {vaultId} {destination && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultWithdraw/TableDetail.tsx ================================================ import { t } from 'i18next' import type { VaultWithdraw } from 'xrpl' import { TransactionTableDetailProps } from '../types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { Amount } from '../../Amount' import { Account } from '../../Account' import { shortenVaultID } from '../../../utils' export const TableDetail = ({ instructions, }: TransactionTableDetailProps) => { const { VaultID: vaultId, Amount: amount, Destination: destination, } = instructions return (
    {t('withdraws')} {`${t('from')} ${t('vault_id')}`} {shortenVaultID(vaultId)} {destination && ( <> ${t('to')} )}
    ) } ================================================ FILE: src/containers/shared/components/Transaction/VaultWithdraw/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Description } from './Description' import { Simple } from './Simple' import { TableDetail } from './TableDetail' export const VaultWithdrawTransaction: TransactionMapping = { Description, Simple, TableDetail, action: TransactionAction.SEND, category: TransactionCategory.OTHER, } ================================================ FILE: src/containers/shared/components/Transaction/VaultWithdraw/test/VaultWithdrawDescription.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createDescriptionRenderFactory } from '../../test' import { Description } from '../Description' import mockVaultCreate from './mock_data/VaultWithdraw.json' const renderComponent = createDescriptionRenderFactory(Description, i18n) describe('VaultWithdraw: Description', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultCreate) expect(container).toHaveTextContent( 'rQEzyNVohiNuWwYFnwUMEWeyK3KvACUbyB withdraws $5.00 USD.rMab3itPzruo5HLEVherc93Prf4tg5d7dx from Vault ID FCC4FB21E6F5B3E60661730C7F6F13A100E1E89FF4CF854D9A9B2F3DF967FD77', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultWithdraw/test/VaultWithdrawSimple.test.tsx ================================================ import { expectSimpleRowText, createSimpleRenderFactory } from '../../test' import { Simple } from '../Simple' import mockVaultWithdraw from './mock_data/VaultWithdraw.json' const renderComponent = createSimpleRenderFactory(Simple) describe('VaultWithdraw: Simple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockVaultWithdraw) expectSimpleRowText( container, 'vault_id', 'FCC4FB21E6F5B3E60661730C7F6F13A100E1E89FF4CF854D9A9B2F3DF967FD77', ) expectSimpleRowText( container, 'amount', '$5.00 USD.rMab3itPzruo5HLEVherc93Prf4tg5d7dx', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultWithdraw/test/VaultWithdrawTableDetail.test.tsx ================================================ import i18n from '../../../../../../i18n/testConfigEnglish' import { createTableDetailRenderFactory } from '../../test' import { TableDetail } from '../TableDetail' import mockVaultWithdraw from './mock_data/VaultWithdraw.json' const renderComponent = createTableDetailRenderFactory(TableDetail, i18n) describe('VaultWithdrawTableDetail', () => { it('render VaultWithdrawTableDetail', () => { const { container, unmount } = renderComponent(mockVaultWithdraw) expect(container).toHaveTextContent( // "withdraws $5.00" is displayed on the UI 'withdraws$5.00 USD.rMab3itPzruo5HLEVherc93Prf4tg5d7dxfrom Vault IDFCC4FB21...67FD77', ) unmount() }) }) ================================================ FILE: src/containers/shared/components/Transaction/VaultWithdraw/test/mock_data/VaultWithdraw.json ================================================ { "close_time_iso": "2025-07-29T16:47:21Z", "ctid": "C006209F00000C96", "hash": "372CD0ABA6ED9E375A3042AC8F47D5C6A25D4C88077547C1FE2991B3CF3A1382", "ledger_hash": "6DBE1C014D47E0D8BA4267C1D54E51B539EAA01AAAD417403B78DA474C850485", "ledger_index": 401567, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 56, "Issuer": "rER4URMRoAvPPbPVWqycZdK85rhJwRnQCB", "MPTokenMetadata": "7368617265206D65746164617461", "OutstandingAmount": "5", "OwnerNode": "0", "Sequence": 1 }, "LedgerEntryType": "MPTokenIssuance", "LedgerIndex": "259D6E5DB97AC2329F153BD53077B9EF08C73ED6A8F95C88DBDA9FAF60E18DA4", "PreviousFields": { "OutstandingAmount": "10" }, "PreviousTxnID": "2FED432AF524C5CD3D54EC462FD5ADFC77757A8CFFBF1448621AA46F2F941DF5", "PreviousTxnLgrSeq": 401565 } }, { "ModifiedNode": { "FinalFields": { "Account": "rQEzyNVohiNuWwYFnwUMEWeyK3KvACUbyB", "Flags": 0, "MPTAmount": "5", "MPTokenIssuanceID": "000000019E2D7036879DFC217D7D2A92CC7349EEB0D703AA", "OwnerNode": "0" }, "LedgerEntryType": "MPToken", "LedgerIndex": "267C99D9B622D5F661117E51E0F58BDB03D3F077F381EB395CCD6AC8BE882AE9", "PreviousFields": { "MPTAmount": "10" }, "PreviousTxnID": "2FED432AF524C5CD3D54EC462FD5ADFC77757A8CFFBF1448621AA46F2F941DF5", "PreviousTxnLgrSeq": 401565 } }, { "ModifiedNode": { "FinalFields": { "Account": "rQEzyNVohiNuWwYFnwUMEWeyK3KvACUbyB", "Balance": "89999988", "Flags": 0, "OwnerCount": 2, "Sequence": 401557 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "544FECF19CF124E5D93D1A7D4973BDAA536C6D3DF8579A3E975445AD27542F52", "PreviousFields": { "Balance": "94999988", "Sequence": 401556 }, "PreviousTxnID": "2FED432AF524C5CD3D54EC462FD5ADFC77757A8CFFBF1448621AA46F2F941DF5", "PreviousTxnLgrSeq": 401565 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-995" }, "Flags": 131072, "HighLimit": { "currency": "USD", "issuer": "rQEzyNVohiNuWwYFnwUMEWeyK3KvACUbyB", "value": "1000" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rMab3itPzruo5HLEVherc93Prf4tg5d7dx", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "62D2CA23FC334A9E56B4EEC9E1F069862D31ED8BEB2A0DBB4A0FAD56E08B8DD4", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "-990" } }, "PreviousTxnID": "2FED432AF524C5CD3D54EC462FD5ADFC77757A8CFFBF1448621AA46F2F941DF5", "PreviousTxnLgrSeq": 401565 } }, { "ModifiedNode": { "FinalFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "5" }, "Flags": 1114112, "HighLimit": { "currency": "USD", "issuer": "rMab3itPzruo5HLEVherc93Prf4tg5d7dx", "value": "0" }, "HighNode": "0", "LowLimit": { "currency": "USD", "issuer": "rER4URMRoAvPPbPVWqycZdK85rhJwRnQCB", "value": "0" }, "LowNode": "0" }, "LedgerEntryType": "RippleState", "LedgerIndex": "69D9A5B5C98036058C4BF3FA2C18469268E377416535A7EC57D6AB795F6600D3", "PreviousFields": { "Balance": { "currency": "USD", "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji", "value": "10" } }, "PreviousTxnID": "2FED432AF524C5CD3D54EC462FD5ADFC77757A8CFFBF1448621AA46F2F941DF5", "PreviousTxnLgrSeq": 401565 } }, { "ModifiedNode": { "FinalFields": { "Account": "rER4URMRoAvPPbPVWqycZdK85rhJwRnQCB", "Asset": { "currency": "USD", "issuer": "rMab3itPzruo5HLEVherc93Prf4tg5d7dx" }, "AssetsAvailable": "5", "AssetsMaximum": "1000", "AssetsTotal": "5", "Data": "75706461746564206D65746164617461", "Flags": 0, "LossUnrealized": "0", "Owner": "rEBAjhUfR1dPfiBKbBtYqyRrXTpyPLFBcM", "OwnerNode": "0", "Sequence": 401553, "ShareMPTID": "000000019E2D7036879DFC217D7D2A92CC7349EEB0D703AA", "WithdrawalPolicy": 1 }, "LedgerEntryType": "Vault", "LedgerIndex": "FCC4FB21E6F5B3E60661730C7F6F13A100E1E89FF4CF854D9A9B2F3DF967FD77", "PreviousFields": { "AssetsAvailable": "10", "AssetsTotal": "10" }, "PreviousTxnID": "2FED432AF524C5CD3D54EC462FD5ADFC77757A8CFFBF1448621AA46F2F941DF5", "PreviousTxnLgrSeq": 401565 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "tx": { "Account": "rQEzyNVohiNuWwYFnwUMEWeyK3KvACUbyB", "Amount": { "currency": "USD", "issuer": "rMab3itPzruo5HLEVherc93Prf4tg5d7dx", "value": "5" }, "Fee": "5000000", "Flags": 0, "LastLedgerSequence": 401585, "NetworkID": 3222, "Sequence": 401556, "SigningPubKey": "ED7FCFBD5471DAD24425FE859842671D2285F8653790892F87E1394C0BB8BEE7E9", "TransactionType": "VaultWithdraw", "TxnSignature": "052F1DEE5A92AF3DF48EB252CBA8FC53DFB966C1B90E323CE5C7FCDFCDCB00761A4B462B115F2BAF9FA511BEFDDA1F4F33BACDCF88D03A29094189BF893C7A07", "VaultID": "FCC4FB21E6F5B3E60661730C7F6F13A100E1E89FF4CF854D9A9B2F3DF967FD77", "ctid": "C006209F00000C96", "date": 807122841, "ledger_index": 401567 }, "validated": true } ================================================ FILE: src/containers/shared/components/Transaction/XChainAccountCreateCommit/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { XChainBridge } from '../XChainBridge' import { Account } from '../../Account' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data: { instructions: { lockingDoor, lockingIssue, issuingDoor, issuingIssue, amount, bridgeOwner, otherChainDestination, }, }, } = props return ( <> ) } ================================================ FILE: src/containers/shared/components/Transaction/XChainAccountCreateCommit/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const XChainAccountCreateCommitTransaction: TransactionMapping = { Simple, action: TransactionAction.CREATE, category: TransactionCategory.XCHAIN, parser, } ================================================ FILE: src/containers/shared/components/Transaction/XChainAccountCreateCommit/parser.ts ================================================ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export function parser(tx: any, meta: any) { const affectedNodes = meta.AffectedNodes const bridgeMeta = affectedNodes.filter( (node: any) => node.ModifiedNode && node.ModifiedNode.LedgerEntryType === 'Bridge', )[0] // TODO: somehow get the bridge owner via ledger_entry // AffectedNodes won't contain the bridge owner if the transaction fails return { lockingDoor: tx.XChainBridge.LockingChainDoor, lockingIssue: tx.XChainBridge.LockingChainIssue, issuingDoor: tx.XChainBridge.IssuingChainDoor, issuingIssue: tx.XChainBridge.IssuingChainIssue, amount: formatAmount(tx.Amount), otherChainDestination: tx.Destination, bridgeOwner: bridgeMeta?.ModifiedNode?.FinalFields?.Account, } } ================================================ FILE: src/containers/shared/components/Transaction/XChainAccountCreateCommit/test/XChainAccountCreateCommitSimple.test.tsx ================================================ import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockXChainAccountCreateCommit from './mock_data/XChainAccountCreateCommit.json' import mockXChainAccountCreateCommitInsufficientFunds from './mock_data/XChainAccountCreateCommitInsufficientFunds.json' import { expectSimpleRowText } from '../../test/expectations' const renderComponent = createSimpleRenderFactory(Simple) describe('XChainAccountCreateCommitSimple', () => { it('renders', () => { const { container } = renderComponent(mockXChainAccountCreateCommit) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'send', '\uE90010.00 XRP') expectSimpleRowText( container, 'destination', 'raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym', ) expect( container.querySelector('[data-testid="destination"] a'), ).not.toBeInTheDocument() }) it('renders failed transaction', () => { const { container } = renderComponent( mockXChainAccountCreateCommitInsufficientFunds, ) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'send', '\uE9001,000.00 XRP') expectSimpleRowText( container, 'destination', 'raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym', ) expect( container.querySelector('[data-testid="destination"] a'), ).not.toBeInTheDocument() }) }) ================================================ FILE: src/containers/shared/components/Transaction/XChainAccountCreateCommit/test/mock_data/XChainAccountCreateCommit.json ================================================ { "tx": { "Account": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Amount": "10000000", "Destination": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Fee": "10", "Flags": 0, "Sequence": 8, "SignatureReward": "100", "SigningPubKey": "026BB09608B42B5CB03F142B1325F52CF3DF5EBC4B2D3DE656F105701C28C0762C", "TransactionType": "XChainAccountCreateCommit", "TxnSignature": "3045022100A7E1180F1047C201EBF1BFB56A75BDE12B9668DD5093DFF4B3C4E97B1CB489F00220544ECF93FE65E0B33CD1C190DC471E33A529B27963A71104C3B16AEE0BD1C844", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } }, "date": "2022-08-18T17:18:20Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Balance": "979999870", "Flags": 0, "OwnerCount": 0, "Sequence": 9 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1823595D6E1D18A9B18DF8C027F0FAA37283CA1EA7765FFB1BDC0445314EC412", "PreviousFields": { "Balance": "989999980", "Sequence": 8 }, "PreviousTxnID": "1CBB9CAF7642E69C901BE990123AC4FC7309A3A2682E158F9D1A7046BDA8D787", "PreviousTxnLgrSeq": 8 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "Balance": "1020000080", "Flags": 0, "OwnerCount": 2, "Sequence": 5 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E70AB073C5D41F35709E1A493F013D106443EA1FDEF9053312C5CEF131B776C6", "PreviousFields": { "Balance": "1009999980" }, "PreviousTxnID": "A1BC2B8CF264364013083CA8E7B57C28A4E8C8FA5F4EC7E7459805283AB86CE8", "PreviousTxnLgrSeq": 7 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "Balance": "0", "Flags": 0, "MinAccountCreateAmount": "10000000", "OwnerNode": "0", "SignatureReward": "100", "XChainAccountClaimCount": "0", "XChainAccountCreateCount": "1", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "0" }, "LedgerEntryType": "Bridge", "LedgerIndex": "EFFC3B47E68E9F74206D9C2F0E14279379E483A40A435AF7C7F729FCAD663DB1", "PreviousFields": { "XChainAccountCreateCount": "0" }, "PreviousTxnID": "C048CF93B447AE8811FDB41A24E89605BABCA24582A7B70B47498D7EFDB9BD7B", "PreviousTxnLgrSeq": 4 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "C7B048D4619600A79E2080B3474303350E8C0552DBC82B72045F72A2428A96D3", "ledger_index": 9, "date": "2022-08-18T17:18:20Z" } ================================================ FILE: src/containers/shared/components/Transaction/XChainAccountCreateCommit/test/mock_data/XChainAccountCreateCommitInsufficientFunds.json ================================================ { "tx": { "Account": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Amount": "1000000000", "Destination": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Fee": "10", "Flags": 0, "Sequence": 7, "SignatureReward": "100", "SigningPubKey": "026BB09608B42B5CB03F142B1325F52CF3DF5EBC4B2D3DE656F105701C28C0762C", "TransactionType": "XChainAccountCreateCommit", "TxnSignature": "304502210083718A57DDBFAAA3D58C6ADB116B418521FB157A794FA21BA47DC675318693550220774C412491186E55925803E177969921E7706196A1647CCA06168D448446C7BF", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } }, "date": "2022-08-18T17:18:11Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Balance": "989999980", "Flags": 0, "OwnerCount": 0, "Sequence": 8 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1823595D6E1D18A9B18DF8C027F0FAA37283CA1EA7765FFB1BDC0445314EC412", "PreviousFields": { "Balance": "989999990", "Sequence": 7 }, "PreviousTxnID": "A1BC2B8CF264364013083CA8E7B57C28A4E8C8FA5F4EC7E7459805283AB86CE8", "PreviousTxnLgrSeq": 7 } } ], "TransactionIndex": 0, "TransactionResult": "tecINSUFFICIENT_FUNDS" }, "hash": "1CBB9CAF7642E69C901BE990123AC4FC7309A3A2682E158F9D1A7046BDA8D787", "ledger_index": 8, "date": "2022-08-18T17:18:11Z" } ================================================ FILE: src/containers/shared/components/Transaction/XChainAddAccountCreateAttestation/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { XChainBridge } from '../XChainBridge' import { SimpleRow } from '../SimpleRow' import { Amount } from '../../Amount' import { Account } from '../../Account' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data: { instructions: { lockingDoor, lockingIssue, issuingDoor, issuingIssue, amount, otherChainSource, destination, }, }, } = props return ( <> ) } ================================================ FILE: src/containers/shared/components/Transaction/XChainAddAccountCreateAttestation/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const XChainAddAccountCreateAttestationTransaction: TransactionMapping = { Simple, action: TransactionAction.CREATE, category: TransactionCategory.XCHAIN, parser, } ================================================ FILE: src/containers/shared/components/Transaction/XChainAddAccountCreateAttestation/parser.ts ================================================ import type { XChainAddAccountCreateAttestation } from 'xrpl' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { TransactionParser } from '../types' import { XChainAddAccountCreateAttestationInstructions } from './types' export const parser: TransactionParser< XChainAddAccountCreateAttestation, XChainAddAccountCreateAttestationInstructions > = (tx) => // TODO: get bridge owner somehow // it's not necessarily in the metadata ({ lockingDoor: tx.XChainBridge.LockingChainDoor, lockingIssue: tx.XChainBridge.LockingChainIssue, issuingDoor: tx.XChainBridge.IssuingChainDoor, issuingIssue: tx.XChainBridge.IssuingChainIssue, amount: formatAmount(tx.Amount), otherChainSource: tx.OtherChainSource, destination: tx.Destination, }) ================================================ FILE: src/containers/shared/components/Transaction/XChainAddAccountCreateAttestation/test/XChainAddAccountCreateAttestationSimple.test.tsx ================================================ import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockXChainAddAccountCreateAttestation from './mock_data/XChainAddAccountCreateAttestation.json' import mockXChainAddAccountCreateAttestationFailed from './mock_data/XChainAddAccountCreateAttestationFailed.json' import { expectSimpleRowText } from '../../test/expectations' const renderComponent = createSimpleRenderFactory(Simple) describe('XChainAddAccountCreateAttestationSimple', () => { it('renders', () => { const { container } = renderComponent(mockXChainAddAccountCreateAttestation) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rDPwN6dz3shffxodeUC9Qf5y1mEHYySKLJ', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'send', '\uE90010.00 XRP') expectSimpleRowText( container, 'other_chain_source', 'raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym', ) expectSimpleRowText( container, 'destination', 'rLbKhMNskUBYRShdbbQcFm9YhumEeUJfPK', ) expect( container.querySelector('[data-testid="destination"] a'), ).toBeInTheDocument() }) it('renders failed transaction', () => { const { container } = renderComponent( mockXChainAddAccountCreateAttestationFailed, ) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rNFrsx478pH42Vy5w4KN9Hcyh8SDrVmCfd', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'send', '\uE90010.00 XRP') expectSimpleRowText( container, 'other_chain_source', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expectSimpleRowText( container, 'destination', 'rPy1F9bQ7dNn2T3QAFRM6dFz6ygHa3MDDi', ) expect( container.querySelector('[data-testid="destination"] a'), ).toBeInTheDocument() }) }) ================================================ FILE: src/containers/shared/components/Transaction/XChainAddAccountCreateAttestation/test/mock_data/XChainAddAccountCreateAttestation.json ================================================ { "tx": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Amount": "10000000", "AttestationRewardAccount": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "AttestationSignerAccount": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Destination": "rLbKhMNskUBYRShdbbQcFm9YhumEeUJfPK", "Fee": "10", "Flags": 0, "LastLedgerSequence": 27, "OtherChainSource": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "PublicKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", "Sequence": 6, "Signature": "30450221009C9B043FA870E15966BA7C8C482F7B5978C1FBB22BD5299842C71EFCD6DE5CAE022021C15E2E556EC19C7237BAD4C98B906867163C09E64683DC9EB38598302B675B", "SignatureReward": "100", "SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", "TransactionType": "XChainAddAccountCreateAttestation", "TxnSignature": "304402206A034337FF08097F86F169A0A27039B175CD382886C56DCD33CBD9F15281BAE80220180A589CF0633A8D32CF8D9757B3CC76A68DF32265DA56C15D7BDB76FFB5BEBA", "WasLockingChainSend": 1, "XChainAccountCreateCount": "5", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rDPwN6dz3shffxodeUC9Qf5y1mEHYySKLJ", "LockingChainIssue": { "currency": "XRP" } }, "date": 1676500505000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "99999999949999940", "Flags": 0, "OwnerCount": 1, "Sequence": 7 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8", "PreviousFields": { "Balance": "99999999959999950", "Sequence": 6 }, "PreviousTxnID": "7A0127C0BFCC3127878F79B1AD6CB077A960EEC68C5BD2A2C6F9465202801C4F", "PreviousTxnLgrSeq": 7 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Flags": 0, "MinAccountCreateAmount": "5000000", "OwnerNode": "0", "SignatureReward": "100", "XChainAccountClaimCount": "5", "XChainAccountCreateCount": "0", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rDPwN6dz3shffxodeUC9Qf5y1mEHYySKLJ", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "0" }, "LedgerEntryType": "Bridge", "LedgerIndex": "469372BEE8814EC52CA2AECB5374AB57A47B53627E3C0E2ACBE3FDC78DBFEC7B", "PreviousFields": { "XChainAccountClaimCount": "4" }, "PreviousTxnID": "7A0127C0BFCC3127878F79B1AD6CB077A960EEC68C5BD2A2C6F9465202801C4F", "PreviousTxnLgrSeq": 7 } }, { "CreatedNode": { "LedgerEntryType": "AccountRoot", "LedgerIndex": "FB9D15C252CC8375FAC86AC64D0EC2DF03B86886DAB91B0229E6E93706B0E992", "NewFields": { "Account": "rLbKhMNskUBYRShdbbQcFm9YhumEeUJfPK", "Balance": "10000000", "Sequence": 8 } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "4CD0749D2821CC88F77A626A7023F4EDB0419882AF6487128909122983E21EF7", "ledger_index": 8, "date": 1676500505000 } ================================================ FILE: src/containers/shared/components/Transaction/XChainAddAccountCreateAttestation/test/mock_data/XChainAddAccountCreateAttestationFailed.json ================================================ { "tx": { "Account": "rPy1F9bQ7dNn2T3QAFRM6dFz6ygHa3MDDi", "Amount": "10000000", "AttestationRewardAccount": "rPy1F9bQ7dNn2T3QAFRM6dFz6ygHa3MDDi", "AttestationSignerAccount": "rUvV7YmtbvWyNiapRbZsj4K6Awg9Yxh1Ya", "Destination": "rPy1F9bQ7dNn2T3QAFRM6dFz6ygHa3MDDi", "Fee": "20", "LastLedgerSequence": 25, "OtherChainSource": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "PublicKey": "EDF6CEB8B9AD595A4FC86C9D83EF821B44E47DB7562B384C5692B4D8C901A22430", "Sequence": 13, "Signature": "5DF8ECA9C9D4B398E58DB2E205D2873BB484B4C8FE8835272392F1A5110B9AAF28E58AE58072E41643F83A619081CDE50AAB122B192E21708D232CA673BB8E01", "SignatureReward": "100", "SigningPubKey": "EDA24CE8D77442FBA0AF7FE196073C23E987976FD147085D41B08C4C0BCBF56541", "TransactionType": "XChainAddAccountCreateAttestation", "TxnSignature": "8670FE67798C7D6A4CEAA99F42A42D099536D52C6DBA529961CB02BD36D0605E56A032237F47A4C597CA75224112810A8AB55E770E4BD3834E99A4040BE93709", "WasLockingChainSend": 1, "XChainAccountCreateCount": "c", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rNFrsx478pH42Vy5w4KN9Hcyh8SDrVmCfd", "LockingChainIssue": { "currency": "XRP" } }, "date": 1679597991000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rPy1F9bQ7dNn2T3QAFRM6dFz6ygHa3MDDi", "Balance": "30000015", "Flags": 0, "OwnerCount": 0, "Sequence": 14 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FD8115CC13EF89062204867FAAD75826DD41DBEFEACF4A55DBFE0166294FF182", "PreviousFields": { "Balance": "30000035", "Sequence": 13 }, "PreviousTxnID": "A5348D1A3C551811EDCDBC9F98586D7FD33834EDD5FC39FFBCA326F6B894D110", "PreviousTxnLgrSeq": 22 } } ], "TransactionIndex": 20, "TransactionResult": "tecXCHAIN_ACCOUNT_CREATE_PAST" }, "hash": "4D696F9BC6802A2AAADAE7ECBB814BDD99CD0E47FEF3C86249F710C5A8B7273F", "ledger_index": 22, "date": 1679597991000 } ================================================ FILE: src/containers/shared/components/Transaction/XChainAddAccountCreateAttestation/types.ts ================================================ import type { Currency } from 'xrpl' import { ExplorerAmount } from '../../../types' export interface XChainAddAccountCreateAttestationInstructions { lockingDoor: string lockingIssue: Currency issuingDoor: string issuingIssue: Currency amount: ExplorerAmount otherChainSource: string destination: string } ================================================ FILE: src/containers/shared/components/Transaction/XChainAddClaimAttestation/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { XChainBridge } from '../XChainBridge' import { Account } from '../../Account' import { Amount } from '../../Amount' import { SimpleRow } from '../SimpleRow' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data: { instructions: { lockingDoor, lockingIssue, issuingDoor, issuingIssue, amount, otherChainSource, destination, claimId, }, }, } = props return ( <> {destination && ( )} {claimId} ) } ================================================ FILE: src/containers/shared/components/Transaction/XChainAddClaimAttestation/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const XChainAddClaimAttestationTransaction: TransactionMapping = { Simple, action: TransactionAction.CREATE, category: TransactionCategory.XCHAIN, parser, } ================================================ FILE: src/containers/shared/components/Transaction/XChainAddClaimAttestation/parser.ts ================================================ import type { XChainAddClaimAttestation } from 'xrpl' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { TransactionParser } from '../types' import { XChainAddClaimAttestationInstructions } from './types' export const parser: TransactionParser< XChainAddClaimAttestation, XChainAddClaimAttestationInstructions > = (tx) => // TODO: get bridge owner somehow // it's not necessarily in the metadata ({ lockingDoor: tx.XChainBridge.LockingChainDoor, lockingIssue: tx.XChainBridge.LockingChainIssue, issuingDoor: tx.XChainBridge.IssuingChainDoor, issuingIssue: tx.XChainBridge.IssuingChainIssue, amount: formatAmount(tx.Amount), otherChainSource: tx.OtherChainSource, destination: tx.Destination, claimId: tx.XChainClaimID, }) ================================================ FILE: src/containers/shared/components/Transaction/XChainAddClaimAttestation/test/XChainAddClaimAttestationSimple.test.tsx ================================================ import { createSimpleRenderFactory } from '../../test/createWrapperFactory' import { Simple } from '../Simple' import mockXChainAddClaimAttestation from './mock_data/XChainAddClaimAttestation.json' import mockXChainAddClaimAttestationFailed from './mock_data/XChainAddClaimAttestationFailed.json' import { expectSimpleRowText } from '../../test/expectations' const renderComponent = createSimpleRenderFactory(Simple) describe('XChainAddClaimAttestationSimple', () => { it('renders', () => { const { container } = renderComponent(mockXChainAddClaimAttestation) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'r3ZsJYkBao2qiwUCvmjfgEUquKueLAwPxQ', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'send', '\uE90010.00 XRP') expectSimpleRowText( container, 'other_chain_source', 'raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym', ) expectSimpleRowText( container, 'destination', 'rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi', ) expect( container.querySelector('[data-testid="destination"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'xchain-claim-id', '1') }) it('renders failed transaction', () => { const { container } = renderComponent(mockXChainAddClaimAttestationFailed) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rNFrsx478pH42Vy5w4KN9Hcyh8SDrVmCfd', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'send', '\uE90010.00 XRP') expectSimpleRowText( container, 'other_chain_source', 'raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym', ) expectSimpleRowText( container, 'destination', 'rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi', ) expect( container.querySelector('[data-testid="destination"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'xchain-claim-id', '3') }) }) ================================================ FILE: src/containers/shared/components/Transaction/XChainAddClaimAttestation/test/mock_data/XChainAddClaimAttestation.json ================================================ { "tx": { "Account": "rPV2mFffxz6Lm8Acx1P8qT26oq2JzwxuHg", "Amount": "10000000", "AttestationRewardAccount": "rPV2mFffxz6Lm8Acx1P8qT26oq2JzwxuHg", "AttestationSignerAccount": "rpapTCHENsVvY73EBjK8TC91bkEWgeGEma", "Destination": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "Fee": "20", "LastLedgerSequence": 16, "OtherChainSource": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "PublicKey": "ED0363D86ED103CF3EE768CC40A459A3684C46CB2D6C2F265EB29C483ECF62044C", "Sequence": 7, "Signature": "DDD0D3705359D751D63B37C00B9C83F31B0C0E5EF93F948D65C1DEDE184E87D73F70F406C8FB02B1B25564003263F544D8D9F7164057699CFDD6936236A9AF04", "SigningPubKey": "EDE023B2C4049FB44B86C5F734801161C1969B33051A25A5DEF242673D55A6D169", "TransactionType": "XChainAddClaimAttestation", "TxnSignature": "DF43CEF994849AC597FD5F73EAB7A2B6EA302B15B91C8E6CCBFC3AE1A5299C3C6241CAD0BA8C3341DB2B6488ADCE69E3FF0C5A40DA2B4A90FD9977363B87570C", "WasLockingChainSend": 1, "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "r3ZsJYkBao2qiwUCvmjfgEUquKueLAwPxQ", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "1", "date": 1676580613000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "Flags": 0, "OtherChainSource": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "OwnerNode": "0", "SignatureReward": "100", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "r3ZsJYkBao2qiwUCvmjfgEUquKueLAwPxQ", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimAttestations": [ { "XChainClaimProofSig": { "Amount": "10000000", "AttestationRewardAccount": "rBXad827GoQSdKM59v4RYehKPq3MmfRBiw", "AttestationSignerAccount": "rDu8rXLv4j7Fv5dRHUWM5mWnH43BkVkvr3", "Destination": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "PublicKey": "ED01B4A7A25F226101B9A81C39765E5EC23DCE26B95020AF69561742A7CF686E40", "WasLockingChainSend": 1 } }, { "XChainClaimProofSig": { "Amount": "10000000", "AttestationRewardAccount": "rESLaELJZzxkDaHtVfymwnK8v4WtpYpu9a", "AttestationSignerAccount": "rpkELuziXCWP5pmgkgwWyviq1wFHJnc5DY", "Destination": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "PublicKey": "ED18F1E49CE9F8F79FAD5D171A10B74A6D0BE3F79191FFF8D3190C362E4262CDDD", "WasLockingChainSend": 1 } }, { "XChainClaimProofSig": { "Amount": "10000000", "AttestationRewardAccount": "rPV2mFffxz6Lm8Acx1P8qT26oq2JzwxuHg", "AttestationSignerAccount": "rpapTCHENsVvY73EBjK8TC91bkEWgeGEma", "Destination": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "PublicKey": "ED0363D86ED103CF3EE768CC40A459A3684C46CB2D6C2F265EB29C483ECF62044C", "WasLockingChainSend": 1 } } ], "XChainClaimID": "1" }, "LedgerEntryType": "XChainOwnedClaimID", "LedgerIndex": "1B07AEFC5B2D612D4B0675A19A00424BD2544BB574E068483581FC67DDCEAAC5", "PreviousFields": { "XChainClaimAttestations": [ { "XChainClaimProofSig": { "Amount": "10000000", "AttestationRewardAccount": "rBXad827GoQSdKM59v4RYehKPq3MmfRBiw", "AttestationSignerAccount": "rDu8rXLv4j7Fv5dRHUWM5mWnH43BkVkvr3", "Destination": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "PublicKey": "ED01B4A7A25F226101B9A81C39765E5EC23DCE26B95020AF69561742A7CF686E40", "WasLockingChainSend": 1 } }, { "XChainClaimProofSig": { "Amount": "10000000", "AttestationRewardAccount": "rESLaELJZzxkDaHtVfymwnK8v4WtpYpu9a", "AttestationSignerAccount": "rpkELuziXCWP5pmgkgwWyviq1wFHJnc5DY", "Destination": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "PublicKey": "ED18F1E49CE9F8F79FAD5D171A10B74A6D0BE3F79191FFF8D3190C362E4262CDDD", "WasLockingChainSend": 1 } } ] }, "PreviousTxnID": "C1421E3F95B63CCBE72C5C6E89C64EDD908F3E224D81AB3F3A65DD34023C99D5", "PreviousTxnLgrSeq": 13 } }, { "ModifiedNode": { "FinalFields": { "Account": "rPV2mFffxz6Lm8Acx1P8qT26oq2JzwxuHg", "Balance": "9999985", "Flags": 0, "OwnerCount": 0, "Sequence": 8 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2FFAF7F72F36BA553C7555F12A82BF2B0EF13345DF37F1F11B2D91B5DD1E29E4", "PreviousFields": { "Balance": "10000005", "Sequence": 7 }, "PreviousTxnID": "9569ED0B01279B441AD3D507EA2FCB564D6C0CAB4DAB8240C2D0428E1A5FEB2E", "PreviousTxnLgrSeq": 11 } } ], "TransactionIndex": 2, "TransactionResult": "tesSUCCESS" }, "hash": "2FC69A726F4FB4141222BD0B73C7D19DC8BBCB8ACA0487BBBC8B055243360363", "ledger_index": 13, "date": 1676580613000 } ================================================ FILE: src/containers/shared/components/Transaction/XChainAddClaimAttestation/test/mock_data/XChainAddClaimAttestationFailed.json ================================================ { "tx": { "Account": "rPy1F9bQ7dNn2T3QAFRM6dFz6ygHa3MDDi", "Amount": "10000000", "AttestationRewardAccount": "rPy1F9bQ7dNn2T3QAFRM6dFz6ygHa3MDDi", "AttestationSignerAccount": "rUvV7YmtbvWyNiapRbZsj4K6Awg9Yxh1Ya", "Destination": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "Fee": "20", "LastLedgerSequence": 54, "OtherChainSource": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "PublicKey": "EDF6CEB8B9AD595A4FC86C9D83EF821B44E47DB7562B384C5692B4D8C901A22430", "Sequence": 18, "Signature": "917C77A7354920AA456DCE9144A99F2AC485B03081BB2011553131E1A594C9D145990B03E1BF00413EA3E7F093BA059BB458286174F33C3E58D2881D751B7A05", "SigningPubKey": "EDA24CE8D77442FBA0AF7FE196073C23E987976FD147085D41B08C4C0BCBF56541", "TransactionType": "XChainAddClaimAttestation", "TxnSignature": "72A59AB11BE0271F68E710D2618BB1AA311727C1EB727424FCB83ADD8FA6FC6512644F2D8F0865815283005BBD55E6BD79EE8B77AC50A162DE067F6DC98D8103", "WasLockingChainSend": 1, "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rNFrsx478pH42Vy5w4KN9Hcyh8SDrVmCfd", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "3", "date": 1679603821000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rPy1F9bQ7dNn2T3QAFRM6dFz6ygHa3MDDi", "Balance": "29999915", "Flags": 0, "OwnerCount": 0, "Sequence": 19 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "FD8115CC13EF89062204867FAAD75826DD41DBEFEACF4A55DBFE0166294FF182", "PreviousFields": { "Balance": "29999935", "Sequence": 18 }, "PreviousTxnID": "23CDA6C9589B7DE88EBC55100FCF28C902F808604FA355767DF92239A559EDED", "PreviousTxnLgrSeq": 22 } } ], "TransactionIndex": 4, "TransactionResult": "tecXCHAIN_NO_CLAIM_ID" }, "hash": "F8AFD12029ED438AEC29C3621F38C06DEC2A5195DE596D9EFC8B08B3191050F8", "ledger_index": 51, "date": 1679603821000 } ================================================ FILE: src/containers/shared/components/Transaction/XChainAddClaimAttestation/types.ts ================================================ import type { Currency } from 'xrpl' import { ExplorerAmount } from '../../../types' export interface XChainAddClaimAttestationInstructions { lockingDoor: string lockingIssue: Currency issuingDoor: string issuingIssue: Currency amount: ExplorerAmount otherChainSource: string destination?: string claimId: string | number } ================================================ FILE: src/containers/shared/components/Transaction/XChainBridge.tsx ================================================ import { useTranslation } from 'react-i18next' import type { IssuedCurrency } from 'xrpl' import { Account } from '../Account' import { Amount } from '../Amount' import Currency from '../Currency' import { SimpleGroup } from './SimpleGroup' import { SimpleRow } from './SimpleRow' export interface XChainBridgeProps { lockingDoor: string lockingIssue: IssuedCurrency issuingDoor: string issuingIssue: IssuedCurrency signatureReward?: string bridgeOwner: string } export const XChainBridge = (props: XChainBridgeProps) => { const { t } = useTranslation() const { lockingDoor, lockingIssue, issuingDoor, issuingIssue, signatureReward, bridgeOwner, } = props return ( {signatureReward && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/XChainClaim/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { Amount } from '../../Amount' import { SimpleRow } from '../SimpleRow' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { XChainBridge } from '../XChainBridge' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data } = props const { lockingDoor, lockingIssue, issuingDoor, issuingIssue, bridgeOwner, claimId, destination, amount, } = data.instructions return ( <> {claimId} ) } ================================================ FILE: src/containers/shared/components/Transaction/XChainClaim/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const XChainClaimTransaction: TransactionMapping = { Simple, action: TransactionAction.FINISH, category: TransactionCategory.XCHAIN, parser, } ================================================ FILE: src/containers/shared/components/Transaction/XChainClaim/parser.ts ================================================ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export function parser(tx: any, meta: any) { const affectedNodes = meta.AffectedNodes const modifiedAccountRoots = affectedNodes.filter( (node: any) => node.ModifiedNode && node.ModifiedNode.LedgerEntryType === 'AccountRoot', ) const doorNode = modifiedAccountRoots.filter( (node: any) => node.ModifiedNode.FinalFields.Balance < node.ModifiedNode.PreviousFields.Balance && node.ModifiedNode.FinalFields.Account !== tx.Account, )[0] return { lockingDoor: tx.XChainBridge.LockingChainDoor, lockingIssue: tx.XChainBridge.LockingChainIssue, issuingDoor: tx.XChainBridge.IssuingChainDoor, issuingIssue: tx.XChainBridge.IssuingChainIssue, bridgeOwner: doorNode?.ModifiedNode?.FinalFields?.Account, claimId: tx.XChainClaimID, destination: tx.Destination, amount: formatAmount(tx.Amount), } } ================================================ FILE: src/containers/shared/components/Transaction/XChainClaim/test/XChainClaimSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import mockXChainClaim from './mock_data/XChainClaim.json' import mockXChainClaimNoQuorum from './mock_data/XChainClaimNoQuorum.json' const renderComponent = createSimpleRenderFactory(Simple) describe('XChainClaimSimple', () => { it('renders', () => { const { container } = renderComponent(mockXChainClaim) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'amount', '\uE90010.00 XRP') expectSimpleRowText( container, 'destination', 'rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi', ) expectSimpleRowText(container, 'claim-id', '5') }) it('renders failed tx', () => { const { container } = renderComponent(mockXChainClaimNoQuorum) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rMAXACCrp3Y8PpswXcg3bKggHX76V3F8M4', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'amount', '\uE9000.01 XRP') expectSimpleRowText( container, 'destination', 'rpwoKyUQn5uGDKeF6LhxK8HWS25ZMhFpaB', ) expectSimpleRowText(container, 'claim-id', '492') }) }) ================================================ FILE: src/containers/shared/components/Transaction/XChainClaim/test/mock_data/XChainClaim.json ================================================ { "tx": { "Account": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "Amount": "10000000", "Destination": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "Fee": "10", "Flags": 0, "Sequence": 13, "SigningPubKey": "03E2494BAB52A1D9C8A7BC67773AD7893B33DBF0F836A634D8B28DD6007B1537E3", "TransactionType": "XChainClaim", "TxnSignature": "3045022100E70D47DCBD4B4961C7D452E26983BB1B453D36A74F95419BAF717A82D475353502203B068A4B6EA042DCAFFD9948E3EA73E924169F2B0CAFC0ACAEF2322A0655B02E", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "5", "date": "2022-08-16T19:25:12Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "99999997979999960", "Flags": 0, "OwnerCount": 2, "Sequence": 5 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8", "PreviousFields": { "Balance": "99999997989999960" }, "PreviousTxnID": "AB54F26CF04CC273B675C32306DEE3F3AD87C4486166F1A4FCE6874AF9CCE486", "PreviousTxnLgrSeq": 14 } }, { "DeletedNode": { "FinalFields": { "Account": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "Flags": 0, "OtherChainSource": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "OwnerNode": "0", "PreviousTxnID": "B0479E9F3586B35D8F4233ED8D99073D9787B1DD59CC354541E4A11683904CBA", "PreviousTxnLgrSeq": 16, "SignatureReward": "100", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimAttestations": [ { "XChainClaimProofSig": { "Amount": "10000000", "AttestationRewardAccount": "rGcwshLFWRu3vXxGQagvKZDCSEH9rKcdZC", "AttestationSignerAccount": "rNiotmSbcp7ZvR63u18zBqGZGzCfcyEQbm", "WasLockingChainSend": 1 } }, { "XChainClaimProofSig": { "Amount": "10000000", "AttestationRewardAccount": "rGcwshLFWRu3vXxGQagvKZDCSEH9rKcdZC", "AttestationSignerAccount": "rKMx7C1KULTnX7weCKwpq4rw6SmHqf5mv3", "WasLockingChainSend": 1 } }, { "XChainClaimProofSig": { "Amount": "10000000", "AttestationRewardAccount": "rGcwshLFWRu3vXxGQagvKZDCSEH9rKcdZC", "AttestationSignerAccount": "rMbN6bHDzLEsbB8bqXqvnDu4YJmDJrvD3R", "WasLockingChainSend": 1 } }, { "XChainClaimProofSig": { "Amount": "10000000", "AttestationRewardAccount": "rGcwshLFWRu3vXxGQagvKZDCSEH9rKcdZC", "AttestationSignerAccount": "rHtcoxJTxVQxuSgoTdfu6WvHsgkyxTgBnG", "WasLockingChainSend": 1 } }, { "XChainClaimProofSig": { "Amount": "10000000", "AttestationRewardAccount": "rGcwshLFWRu3vXxGQagvKZDCSEH9rKcdZC", "AttestationSignerAccount": "rLt7bZfaBipZ1HB8QZwviqnP2GZTruY9W5", "WasLockingChainSend": 1 } } ], "XChainClaimID": "5" }, "LedgerEntryType": "XChainClaimID", "LedgerIndex": "430067D905AAF69711BF28AF1023CADA982686854CC234ED6C9F47F1F1811FE0" } }, { "ModifiedNode": { "FinalFields": { "Account": "rGcwshLFWRu3vXxGQagvKZDCSEH9rKcdZC", "Balance": "1000000200", "Flags": 0, "OwnerCount": 0, "Sequence": 6 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "680C8B6EEE25014D885D057A272F7405B63A7872243A9B627021FB4136730E1F", "PreviousFields": { "Balance": "1000000100" }, "PreviousTxnID": "AB54F26CF04CC273B675C32306DEE3F3AD87C4486166F1A4FCE6874AF9CCE486", "PreviousTxnLgrSeq": 14 } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "RootIndex": "86213CF4452A2D17362C65C24C3EE190F0A9E60EBBE5BD5DFBF039696784E2BE" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "86213CF4452A2D17362C65C24C3EE190F0A9E60EBBE5BD5DFBF039696784E2BE" } }, { "ModifiedNode": { "FinalFields": { "Account": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "Balance": "1019999710", "Flags": 0, "OwnerCount": 3, "Sequence": 14 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B6AE0B6E0F7A38BDCA21F08466A85036DA3DA7558F44CC26FE457C3D2E8F2F87", "PreviousFields": { "Balance": "1009999820", "OwnerCount": 4, "Sequence": 13 }, "PreviousTxnID": "B0479E9F3586B35D8F4233ED8D99073D9787B1DD59CC354541E4A11683904CBA", "PreviousTxnLgrSeq": 16 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "CC2D24F25E3D21B14B13DCFE8D8124915E0A912108F6E99F8B283A3661602C4D", "ledger_index": 17, "date": "2022-08-16T19:25:12Z" } ================================================ FILE: src/containers/shared/components/Transaction/XChainClaim/test/mock_data/XChainClaimNoQuorum.json ================================================ { "tx": { "Account": "rpwoKyUQn5uGDKeF6LhxK8HWS25ZMhFpaB", "Amount": "10000", "Destination": "rpwoKyUQn5uGDKeF6LhxK8HWS25ZMhFpaB", "Fee": "20", "Flags": 2147483648, "Sequence": 454709, "SigningPubKey": "0203811EDCB57C1B6F34640DD494F04F347A45C58709ED8FFC176D5C9B6E9DF5E5", "TransactionType": "XChainClaim", "TxnSignature": "304402205FEC71E444ABE6F613ABA7052AD40106D3B694A2316AC2B020BB78C7110BE4E40220325189A44F5F7EDA7E622FEDAD1207973B7FB6E9CDE03E7EEEE6A971CDC858A1", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rMAXACCrp3Y8PpswXcg3bKggHX76V3F8M4", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "492", "date": 1681400481000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rpwoKyUQn5uGDKeF6LhxK8HWS25ZMhFpaB", "Balance": "39999960", "Flags": 0, "OwnerCount": 1, "Sequence": 454710 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "5334EC2845E583BBEC4C75EF27498BD47D643BD572DE91DF00A0AF532FEDA6B1", "PreviousFields": { "Balance": "39999980", "Sequence": 454709 }, "PreviousTxnID": "850F18C0BC4B7BFDF1F48902E9D9D4D6AFA4B0D88AA0186CAB9A2D95F6B4862F", "PreviousTxnLgrSeq": 454709 } } ], "TransactionIndex": 1, "TransactionResult": "tecXCHAIN_CLAIM_NO_QUORUM" }, "hash": "14DB8385E209E38D83F209EF6C90571B958DC711DB7741A3329F21130AB1A394", "ledger_index": 454720, "date": 1681400481000 } ================================================ FILE: src/containers/shared/components/Transaction/XChainCommit/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { XChainBridge } from '../XChainBridge' import { Account } from '../../Account' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data: { instructions: { lockingDoor, lockingIssue, issuingDoor, issuingIssue, amount, xchainClaimId, bridgeOwner, otherChainDestination, }, }, } = props return ( <> {xchainClaimId} {otherChainDestination && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/XChainCommit/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const XChainCommitTransaction: TransactionMapping = { Simple, action: TransactionAction.SEND, category: TransactionCategory.XCHAIN, parser, } ================================================ FILE: src/containers/shared/components/Transaction/XChainCommit/parser.ts ================================================ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export function parser(tx: any, meta: any) { const affectedNodes = meta.AffectedNodes const modifiedAccountRoots = affectedNodes.filter( (node: any) => node.ModifiedNode && node.ModifiedNode.LedgerEntryType === 'AccountRoot', ) const bridgeOwnerNode = modifiedAccountRoots.filter( (node: any) => node.ModifiedNode.FinalFields.Account !== tx.Account, )[0] // TODO: somehow get the bridge owner via ledger_entry // AffectedNodes won't contain the bridge owner if the transaction fails return { lockingDoor: tx.XChainBridge.LockingChainDoor, lockingIssue: tx.XChainBridge.LockingChainIssue, issuingDoor: tx.XChainBridge.IssuingChainDoor, issuingIssue: tx.XChainBridge.IssuingChainIssue, bridgeOwner: bridgeOwnerNode?.ModifiedNode?.FinalFields?.Account, amount: formatAmount(tx.Amount), xchainClaimId: tx.XChainClaimID, otherChainDestination: tx.OtherChainAccount, } } ================================================ FILE: src/containers/shared/components/Transaction/XChainCommit/test/XChainCommitSimple.test.tsx ================================================ import { Simple } from '../Simple' import mockXChainCommit from './mock_data/XChainCommit.json' import mockXChainCommitInsufficientFunds from './mock_data/XChainCommitInsufficientFunds.json' import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' const renderComponent = createSimpleRenderFactory(Simple) describe('XChainCommitSimple', () => { it('renders', () => { const { container } = renderComponent(mockXChainCommit) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'send', '\uE90010.00 XRP') expectSimpleRowText(container, 'claim-id', '4') expect( container.querySelector('[data-testid="destination"]'), ).not.toBeInTheDocument() }) it('renders failed tx', () => { const { container } = renderComponent(mockXChainCommitInsufficientFunds) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'send', '\uE90010,000.00 XRP') expectSimpleRowText(container, 'claim-id', '3') expectSimpleRowText( container, 'destination', 'rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi', ) }) }) ================================================ FILE: src/containers/shared/components/Transaction/XChainCommit/test/mock_data/XChainCommit.json ================================================ { "tx": { "Account": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Amount": "10000000", "Fee": "10", "Flags": 0, "Sequence": 9, "SigningPubKey": "026BB09608B42B5CB03F142B1325F52CF3DF5EBC4B2D3DE656F105701C28C0762C", "TransactionType": "XChainCommit", "TxnSignature": "3045022100C2FC2624BB363D58579A69DE945F93CF0AFB0A9204B3E0C188F024D2309C9D1E0220749FC80CEB3A87928A05DF0B7F3D0565E16A728B69873F055B23BD68DEC159EB", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "4", "date": "2022-08-16T19:24:50Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Balance": "959999960", "Flags": 0, "OwnerCount": 0, "Sequence": 10 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1823595D6E1D18A9B18DF8C027F0FAA37283CA1EA7765FFB1BDC0445314EC412", "PreviousFields": { "Balance": "969999970", "Sequence": 9 }, "PreviousTxnID": "4E0A1DBC0CBE847CDF191AC590B87D3BA98CFEE2223CA7C081C31562BE3FC832", "PreviousTxnLgrSeq": 9 } }, { "ModifiedNode": { "FinalFields": { "Account": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "Balance": "1039999980", "Flags": 0, "OwnerCount": 2, "Sequence": 5 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "E70AB073C5D41F35709E1A493F013D106443EA1FDEF9053312C5CEF131B776C6", "PreviousFields": { "Balance": "1029999980" }, "PreviousTxnID": "4E0A1DBC0CBE847CDF191AC590B87D3BA98CFEE2223CA7C081C31562BE3FC832", "PreviousTxnLgrSeq": 9 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "81E23574F358D7F2E50BD6451F426383040D296C8DDD96C65B895067C64CB8CF", "ledger_index": 10, "date": "2022-08-16T19:24:50Z" } ================================================ FILE: src/containers/shared/components/Transaction/XChainCommit/test/mock_data/XChainCommitInsufficientFunds.json ================================================ { "tx": { "Account": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Amount": "10000000000", "Fee": "10", "Flags": 0, "OtherChainAccount": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "Sequence": 9, "SigningPubKey": "026BB09608B42B5CB03F142B1325F52CF3DF5EBC4B2D3DE656F105701C28C0762C", "TransactionType": "XChainCommit", "TxnSignature": "3045022100B1BE73208EF76E2946D40A37AE0F8C04C8E632A64B643209E727B0183830919F022040210E9AA82723DCE6359F2AB27437567B2111FBB092C0C4E3E295ED49BACADB", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "3", "date": "2022-08-18T20:59:40Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Balance": "969999860", "Flags": 0, "OwnerCount": 0, "Sequence": 10 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "1823595D6E1D18A9B18DF8C027F0FAA37283CA1EA7765FFB1BDC0445314EC412", "PreviousFields": { "Balance": "969999870", "Sequence": 9 }, "PreviousTxnID": "C7B048D4619600A79E2080B3474303350E8C0552DBC82B72045F72A2428A96D3", "PreviousTxnLgrSeq": 9 } } ], "TransactionIndex": 0, "TransactionResult": "tecINSUFFICIENT_FUNDS" }, "hash": "3C83AB57D10C9C8BC53B940ADE64DE6D2756411B2DDFBDAAA73381FE65051D54", "ledger_index": 10, "date": "2022-08-18T20:59:40Z" } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateBridge/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { XChainBridge } from '../XChainBridge' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data: { instructions: { lockingDoor, lockingIssue, issuingDoor, issuingIssue, signatureReward, minAccountCreateAmount, bridgeOwner, }, }, } = props return ( <> {minAccountCreateAmount && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateBridge/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const XChainCreateBridgeTransaction: TransactionMapping = { Simple, action: TransactionAction.CREATE, category: TransactionCategory.XCHAIN, parser, } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateBridge/parser.ts ================================================ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export function parser(tx: any) { return { lockingDoor: tx.XChainBridge.LockingChainDoor, lockingIssue: tx.XChainBridge.LockingChainIssue, issuingDoor: tx.XChainBridge.IssuingChainDoor, issuingIssue: tx.XChainBridge.IssuingChainIssue, signatureReward: formatAmount(tx.SignatureReward), minAccountCreateAmount: formatAmount(tx.MinAccountCreateAmount), bridgeOwner: tx.Account, } } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateBridge/test/XChainCreateBridgeSimple.test.tsx ================================================ import { Simple } from '../Simple' import mockXChainCreateBridge from './mock_data/XChainCreateBridge.json' import mockXChainCreateBridgeFailed from './mock_data/XChainCreateBridgeFailed.json' import mockXChainCreateBridgeIOU from './mock_data/XChainCreateBridgeIOU.json' import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' const renderComponent = createSimpleRenderFactory(Simple) describe('XChainCreateBridgeSimple', () => { it('renders', () => { const { container, unmount } = renderComponent(mockXChainCreateBridge) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'signature-reward', '\uE9000.0001 XRP') expect( container.querySelector('[data-testid="min-create-account-amount"]'), ).not.toBeInTheDocument() unmount() }) it('renders IOU bridge', () => { const { container } = renderComponent(mockXChainCreateBridgeIOU) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'ratAutb3katzezbXX3LsX4sk4vmvhNucac', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText( container, 'locking-chain-issue', 'USD.rNhm2aTLEnSdcWQ7d6PZ5F7TX5skM7wkAS', ) expectSimpleRowText( container, 'issuing-chain-door', 'rBkRN2VHVWJVKqfnh1TovLkXo7vLP7oBcq', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).toBeInTheDocument() expectSimpleRowText( container, 'issuing-chain-issue', 'USD.rBkRN2VHVWJVKqfnh1TovLkXo7vLP7oBcq', ) expectSimpleRowText(container, 'signature-reward', '\uE9000.0001 XRP') expectSimpleRowText( container, 'min-account-create-amount', '\uE9005.00 XRP', ) }) it('renders failed tx', () => { const { container } = renderComponent(mockXChainCreateBridgeFailed) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rNFrsx478pH42Vy5w4KN9Hcyh8SDrVmCfd', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'signature-reward', '\uE9000.0001 XRP') expectSimpleRowText( container, 'min-account-create-amount', '\uE9005.00 XRP', ) }) }) ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateBridge/test/mock_data/XChainCreateBridge.json ================================================ { "tx": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Fee": "10", "Flags": 0, "Sequence": 1, "SignatureReward": "100", "SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", "TransactionType": "XChainCreateBridge", "TxnSignature": "3045022100E5B31CD70C9563521BA0F6EE3D039E9ECB76E01A11D293EF72CD521687D346DE02205815E290D062F4C0B94482D50F2EB9B512C20301854C2D1DE8C568AA2E5B2402", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } }, "date": "2022-08-16T19:23:00Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "99999999999999990", "Flags": 0, "OwnerCount": 1, "Sequence": 2 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8", "PreviousFields": { "Balance": "100000000000000000", "OwnerCount": 0, "Sequence": 1 } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D8120FC732737A2CF2E9968FDF3797A43B457F2A81AA06D2653171A1EA635204", "NewFields": { "Owner": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "RootIndex": "D8120FC732737A2CF2E9968FDF3797A43B457F2A81AA06D2653171A1EA635204" } } }, { "CreatedNode": { "LedgerEntryType": "Bridge", "LedgerIndex": "EFFC3B47E68E9F74206D9C2F0E14279379E483A40A435AF7C7F729FCAD663DB1", "NewFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "SignatureReward": "100", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } } } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "31BD5F2C0982752A20BB6A4205F7B6ED6576D08AB7927978BF282E8ABEF44467", "ledger_index": 3, "date": "2022-08-16T19:23:00Z" } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateBridge/test/mock_data/XChainCreateBridgeFailed.json ================================================ { "tx": { "Account": "rNFrsx478pH42Vy5w4KN9Hcyh8SDrVmCfd", "Fee": "10", "Flags": 0, "LastLedgerSequence": 30, "MinAccountCreateAmount": "5000000", "Sequence": 5, "SignatureReward": "100", "SigningPubKey": "039EEAC2921FED0BE867F5C6BC6206A21A7ECF720982C44A3D503B40CB1374DD6F", "TransactionType": "XChainCreateBridge", "TxnSignature": "3045022100B3127F3D6FE09CEC8DB14A262F1FEA82EB0F24D3882BB875072B82398FECD50602201F802C94B322EA90E51116A5910F8F3EA4BF951AB96EA2256A03E46B087169BD", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rNFrsx478pH42Vy5w4KN9Hcyh8SDrVmCfd", "LockingChainIssue": { "currency": "XRP" } }, "date": 1679597660000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rNFrsx478pH42Vy5w4KN9Hcyh8SDrVmCfd", "Balance": "1070000570", "Flags": 0, "OwnerCount": 2, "Sequence": 6 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "41F98EB375A0FA10B571528507E9BE0BFF807316EB0F8E64656E82DA7F755B6E", "PreviousFields": { "Balance": "1070000580", "Sequence": 5 }, "PreviousTxnID": "3DB9DF9C3412C4ABFC578E16E37EF3F25C80105F5E8BC5C99A3EF66DD62E11BA", "PreviousTxnLgrSeq": 10 } } ], "TransactionIndex": 0, "TransactionResult": "tecDUPLICATE" }, "hash": "22BF0818FA3C1E1CE203BD0012FE83454D73B11A8EC06524EEAEA98D8137A6D6", "ledger_index": 11, "date": 1679597660000 } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateBridge/test/mock_data/XChainCreateBridgeIOU.json ================================================ { "tx": { "Account": "rBkRN2VHVWJVKqfnh1TovLkXo7vLP7oBcq", "Fee": "10", "Flags": 0, "LastLedgerSequence": 44, "MinAccountCreateAmount": "5000000", "Sequence": 10, "SignatureReward": "100", "SigningPubKey": "ED04ACCCE0980432CAD6AE4C98E29E3227E763F716D273EC6C7002308ADF1CBF24", "TransactionType": "XChainCreateBridge", "TxnSignature": "081EE14993C48F6F5351E44EE738244516F75510266C806FC48DDBA138064B8F6CFA26D4B8D2847C763BA00437D1F3B04045911289D3D56A8A04C55ECA53D303", "XChainBridge": { "IssuingChainDoor": "rBkRN2VHVWJVKqfnh1TovLkXo7vLP7oBcq", "IssuingChainIssue": { "currency": "USD", "issuer": "rBkRN2VHVWJVKqfnh1TovLkXo7vLP7oBcq" }, "LockingChainDoor": "ratAutb3katzezbXX3LsX4sk4vmvhNucac", "LockingChainIssue": { "currency": "USD", "issuer": "rNhm2aTLEnSdcWQ7d6PZ5F7TX5skM7wkAS" } }, "date": "2022-11-15T22:08:50Z" }, "meta": { "AffectedNodes": [ { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "7821DED04B3BCB56A2DA2A974BB4D273C16CDD872F327145E8AD5FF23FD46EB9", "NewFields": { "Owner": "rBkRN2VHVWJVKqfnh1TovLkXo7vLP7oBcq", "RootIndex": "7821DED04B3BCB56A2DA2A974BB4D273C16CDD872F327145E8AD5FF23FD46EB9" } } }, { "CreatedNode": { "LedgerEntryType": "Bridge", "LedgerIndex": "B0B9C012173875D83723A22BE530E227E7923A6272CD1ABCEE62644C444DA542", "NewFields": { "Account": "rBkRN2VHVWJVKqfnh1TovLkXo7vLP7oBcq", "MinAccountCreateAmount": "5000000", "SignatureReward": "100", "XChainBridge": { "IssuingChainDoor": "rBkRN2VHVWJVKqfnh1TovLkXo7vLP7oBcq", "IssuingChainIssue": { "currency": "USD", "issuer": "rBkRN2VHVWJVKqfnh1TovLkXo7vLP7oBcq" }, "LockingChainDoor": "ratAutb3katzezbXX3LsX4sk4vmvhNucac", "LockingChainIssue": { "currency": "USD", "issuer": "rNhm2aTLEnSdcWQ7d6PZ5F7TX5skM7wkAS" } } } } }, { "ModifiedNode": { "FinalFields": { "Account": "rBkRN2VHVWJVKqfnh1TovLkXo7vLP7oBcq", "Balance": "49999990", "Flags": 0, "OwnerCount": 1, "Sequence": 11 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "CB0BD9623A9B2E3337D108FB089262D9AD0B58F5FF1D1D52CEC4FEC412862588", "PreviousFields": { "Balance": "50000000", "OwnerCount": 0, "Sequence": 10 }, "PreviousTxnID": "17624BFD6A71CDA94210887BA3B4F38B3630A6B416D9F81780058A12704E0C7E", "PreviousTxnLgrSeq": 10 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "81738C64A5E30F50C3A46EFC22AC677DCEFC1D0FC0BDFC896E747594EC4874DE", "ledger_index": 25, "date": "2022-11-15T22:08:50Z" } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateClaimID/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Account } from '../../Account' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { XChainBridge } from '../XChainBridge' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data: { instructions: { lockingDoor, lockingIssue, issuingDoor, issuingIssue, signatureReward, otherChainSource, bridgeOwner, claimID, }, }, } = props return ( <> {claimID && ( {claimID} )} ) } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateClaimID/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const XChainCreateClaimIDTransaction: TransactionMapping = { Simple, action: TransactionAction.CREATE, category: TransactionCategory.XCHAIN, parser, } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateClaimID/parser.ts ================================================ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export function parser(tx: any, meta: any) { const affectedNodes = meta.AffectedNodes const bridgeMeta = affectedNodes.filter( (node: any) => node.ModifiedNode && node.ModifiedNode.LedgerEntryType === 'Bridge', )[0] const claimIDMeta = affectedNodes.filter( (node: any) => node.CreatedNode && node.CreatedNode.LedgerEntryType === 'XChainOwnedClaimID', )[0] return { lockingDoor: tx.XChainBridge.LockingChainDoor, lockingIssue: tx.XChainBridge.LockingChainIssue, issuingDoor: tx.XChainBridge.IssuingChainDoor, issuingIssue: tx.XChainBridge.IssuingChainIssue, signatureReward: formatAmount(tx.SignatureReward), otherChainSource: tx.OtherChainSource, bridgeOwner: bridgeMeta?.ModifiedNode?.FinalFields?.Account, claimID: claimIDMeta?.CreatedNode?.NewFields?.XChainClaimID, } } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateClaimID/test/XChainCreateClaimIDSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import mockXChainCreateClaimID from './mock_data/XChainCreateClaimID.json' import mockXChainCreateClaimIDFailed from './mock_data/XChainCreateClaimIDFailed.json' const renderComponent = createSimpleRenderFactory(Simple) describe('XChainCreateClaimIDSimple', () => { it('renders', () => { const { container } = renderComponent(mockXChainCreateClaimID) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rNe5NbD1hqCSZPz9KM5PHm5Bf8jjHfezPE', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'signature-reward', '\uE9000.0001 XRP') expectSimpleRowText( container, 'other-chain-source', 'raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym', ) expectSimpleRowText(container, 'claim-id', '1') }) it('renders failed transaction', () => { const { container } = renderComponent(mockXChainCreateClaimIDFailed) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'signature-reward', '\uE9000.0001 XRP') expectSimpleRowText( container, 'other-chain-source', 'r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W', ) expect( container.querySelector('[data-testid="claim-id"]'), ).not.toBeInTheDocument() }) }) ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateClaimID/test/mock_data/XChainCreateClaimID.json ================================================ { "tx": { "Account": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "Fee": "10", "Flags": 0, "LastLedgerSequence": 31, "OtherChainSource": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "Sequence": 11, "SignatureReward": "100", "SigningPubKey": "03E2494BAB52A1D9C8A7BC67773AD7893B33DBF0F836A634D8B28DD6007B1537E3", "TransactionType": "XChainCreateClaimID", "TxnSignature": "3045022100A29E14930BF0BEBFB679D11594F1264302DDCEDB44C6E29FD0AB40E41604D82E022076317D6E6DA58DA5F27ECAB2809A0985560408BEA733F2A30B2B128EA6C79FDB", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rNe5NbD1hqCSZPz9KM5PHm5Bf8jjHfezPE", "LockingChainIssue": { "currency": "XRP" } }, "date": 1676584689000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Flags": 0, "MinAccountCreateAmount": "5000000", "OwnerNode": "0", "SignatureReward": "100", "XChainAccountClaimCount": "6", "XChainAccountCreateCount": "0", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rNe5NbD1hqCSZPz9KM5PHm5Bf8jjHfezPE", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "1" }, "LedgerEntryType": "Bridge", "LedgerIndex": "469372BEE8814EC52CA2AECB5374AB57A47B53627E3C0E2ACBE3FDC78DBFEC7B", "PreviousFields": { "XChainClaimID": "0" }, "PreviousTxnID": "39C8FD7CE5392C4CAF5B062453C291EE9CB321AC61F1A8CF4823171D1E2371DF", "PreviousTxnLgrSeq": 11 } }, { "CreatedNode": { "LedgerEntryType": "XChainOwnedClaimID", "LedgerIndex": "69DFF2EBBBEEA0E047FCB4FC2912014E12557AB3C84E2A874E442AC7AA25313B", "NewFields": { "Account": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "OtherChainSource": "raFcdz1g8LWJDJWJE2ZKLRGdmUmsTyxaym", "SignatureReward": "100", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rNe5NbD1hqCSZPz9KM5PHm5Bf8jjHfezPE", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "1" } } }, { "CreatedNode": { "LedgerEntryType": "DirectoryNode", "LedgerIndex": "86213CF4452A2D17362C65C24C3EE190F0A9E60EBBE5BD5DFBF039696784E2BE", "NewFields": { "Owner": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "RootIndex": "86213CF4452A2D17362C65C24C3EE190F0A9E60EBBE5BD5DFBF039696784E2BE" } } }, { "ModifiedNode": { "FinalFields": { "Account": "rJdTJRJZ6GXCCRaamHJgEqVzB7Zy4557Pi", "Balance": "9999990", "Flags": 0, "OwnerCount": 1, "Sequence": 12 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "B6AE0B6E0F7A38BDCA21F08466A85036DA3DA7558F44CC26FE457C3D2E8F2F87", "PreviousFields": { "Balance": "10000000", "OwnerCount": 0, "Sequence": 11 }, "PreviousTxnID": "39C8FD7CE5392C4CAF5B062453C291EE9CB321AC61F1A8CF4823171D1E2371DF", "PreviousTxnLgrSeq": 11 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "A968A7E7875F496781FCAB06B9894252A49A8A83E4004A37512E3366654CD5DB", "ledger_index": 12, "date": 1676584689000 } ================================================ FILE: src/containers/shared/components/Transaction/XChainCreateClaimID/test/mock_data/XChainCreateClaimIDFailed.json ================================================ { "tx": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Fee": "10", "Flags": 0, "LastLedgerSequence": 35, "OtherChainSource": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "Sequence": 28, "SignatureReward": "100", "SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", "TransactionType": "XChainCreateClaimID", "TxnSignature": "3044022055EDB73DDD26044AD04B606541D03E009D290E7DA4BFD58C47999FC83EA8901C022022F63B2959B860E11E01723664534FDC4FA8FE4EFB8C624C600755A9004F82EA", "XChainBridge": { "IssuingChainDoor": "rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "LockingChainIssue": { "currency": "XRP" } }, "date": 1679603200000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "99999987849998220", "Flags": 0, "OwnerCount": 0, "Sequence": 29 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8", "PreviousFields": { "Balance": "99999987849998230", "Sequence": 28 }, "PreviousTxnID": "4B1C32DFDB68219E30FD74781C167C4E2BB73847AE46EE7A443129E24D69181A", "PreviousTxnLgrSeq": 14 } } ], "TransactionIndex": 0, "TransactionResult": "tecNO_ENTRY" }, "hash": "EE77C65171B9C57254605F5F61605D31273CF78209093EEA142A553CD4A19656", "ledger_index": 16, "date": 1679603200000 } ================================================ FILE: src/containers/shared/components/Transaction/XChainModifyBridge/Simple.tsx ================================================ import { useTranslation } from 'react-i18next' import { Amount } from '../../Amount' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { SimpleRow } from '../SimpleRow' import { XChainBridge } from '../XChainBridge' export const Simple: TransactionSimpleComponent = ( props: TransactionSimpleProps, ) => { const { t } = useTranslation() const { data: { instructions: { lockingDoor, lockingIssue, issuingDoor, issuingIssue, signatureReward, minAccountCreateAmount, bridgeOwner, }, }, } = props return ( <> {minAccountCreateAmount && ( )} ) } ================================================ FILE: src/containers/shared/components/Transaction/XChainModifyBridge/index.ts ================================================ import { TransactionAction, TransactionCategory, TransactionMapping, } from '../types' import { Simple } from './Simple' import { parser } from './parser' export const XChainModifyBridgeTransaction: TransactionMapping = { Simple, action: TransactionAction.MODIFY, category: TransactionCategory.XCHAIN, parser, } ================================================ FILE: src/containers/shared/components/Transaction/XChainModifyBridge/parser.ts ================================================ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export function parser(tx: any) { return { lockingDoor: tx.XChainBridge.LockingChainDoor, lockingIssue: tx.XChainBridge.LockingChainIssue, issuingDoor: tx.XChainBridge.IssuingChainDoor, issuingIssue: tx.XChainBridge.IssuingChainIssue, signatureReward: formatAmount(tx.SignatureReward), minAccountCreateAmount: formatAmount(tx.MinAccountCreateAmount), bridgeOwner: tx.Account, } } ================================================ FILE: src/containers/shared/components/Transaction/XChainModifyBridge/test/XChainModifyBridgeSimple.test.tsx ================================================ import { createSimpleRenderFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import mockXChainModifyBridge from './mock_data/XChainModifyBridge.json' import mockXChainModifyBridgeMinAccountCreateAmount from './mock_data/XChainModifyBridgeMinAccountCreateAmount.json' import mockXChainModifyBridgeNoEntry from './mock_data/XChainModifyBridgeNoEntry.json' const renderComponent = createSimpleRenderFactory(Simple) describe('XChainModifyBridgeSimple', () => { it('renders', () => { const { container } = renderComponent(mockXChainModifyBridge) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'signature-reward', '\uE9000.01 XRP') }) it('renders MinAccountCreateAmount', () => { const { container } = renderComponent( mockXChainModifyBridgeMinAccountCreateAmount, ) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'rnBnyot2gCJywLxLzfHQX2dUJqZ6oghUFp', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'min-account-create-amount', '\uE900100.00 XRP', ) }) it('renders failed transaction', () => { const { container } = renderComponent(mockXChainModifyBridgeNoEntry) // check XChainBridge parts expectSimpleRowText( container, 'locking-chain-door', 'r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W', ) expect( container.querySelector('[data-testid="locking-chain-door"] a'), ).not.toBeInTheDocument() expectSimpleRowText(container, 'locking-chain-issue', '\uE900 XRP') expectSimpleRowText( container, 'issuing-chain-door', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector('[data-testid="issuing-chain-door"] a'), ).toBeInTheDocument() expectSimpleRowText(container, 'issuing-chain-issue', '\uE900 XRP') expectSimpleRowText(container, 'signature-reward', '\uE9000.0001 XRP') }) }) ================================================ FILE: src/containers/shared/components/Transaction/XChainModifyBridge/test/mock_data/XChainModifyBridge.json ================================================ { "tx": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Fee": "10", "Flags": 0, "LastLedgerSequence": 23, "Sequence": 2, "SignatureReward": "10000", "SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", "TransactionType": "XChainModifyBridge", "TxnSignature": "3045022100A63798DB1B2CD62D01E04C503623E5DFC601C1FEB94D57F080B94358F2F8FAEE022050E04955B6774B107374C556A60B6661D47C926F24B7B92D84D93546659DE29B", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } }, "date": "2022-08-18T09:11:30Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "99999999999999980", "Flags": 0, "OwnerCount": 1, "Sequence": 3 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8", "PreviousFields": { "Balance": "99999999999999990", "Sequence": 2 }, "PreviousTxnID": "31BD5F2C0982752A20BB6A4205F7B6ED6576D08AB7927978BF282E8ABEF44467", "PreviousTxnLgrSeq": 3 } }, { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "0", "Flags": 0, "OwnerNode": "0", "SignatureReward": "10000", "XChainAccountClaimCount": "0", "XChainAccountCreateCount": "0", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rGQLcxzT3Po9PsCk5Lj9uK7S1juThii9cR", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "0" }, "LedgerEntryType": "Bridge", "LedgerIndex": "EFFC3B47E68E9F74206D9C2F0E14279379E483A40A435AF7C7F729FCAD663DB1", "PreviousFields": { "SignatureReward": "100" }, "PreviousTxnID": "31BD5F2C0982752A20BB6A4205F7B6ED6576D08AB7927978BF282E8ABEF44467", "PreviousTxnLgrSeq": 3 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "ADBA23ED812B231559A1DFC76C9BCE566BB7BAEF7A737C3515911AE23050CDDA", "ledger_index": 4, "date": "2022-08-18T09:11:30Z" } ================================================ FILE: src/containers/shared/components/Transaction/XChainModifyBridge/test/mock_data/XChainModifyBridgeMinAccountCreateAmount.json ================================================ { "tx": { "Account": "rnBnyot2gCJywLxLzfHQX2dUJqZ6oghUFp", "Fee": "10", "Flags": 0, "LastLedgerSequence": 38, "MinAccountCreateAmount": "100000000", "Sequence": 5, "SigningPubKey": "032389AD44BF4CCE332D3A2333AFBA03CD2EA8EAB31A63F7EF5A608107BDFBFCD7", "TransactionType": "XChainModifyBridge", "TxnSignature": "3044022067C35109504B30AEA17D369DBFB681675E289F1D2CC1DCA1E7F117BB80DD84B002204F206366690DAF7C17CCC8957C3A20816410A5A148FE371C2369E0C0B407AAD1", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rnBnyot2gCJywLxLzfHQX2dUJqZ6oghUFp", "LockingChainIssue": { "currency": "XRP" } }, "date": "2022-09-09T20:19:00Z" }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rnBnyot2gCJywLxLzfHQX2dUJqZ6oghUFp", "Balance": "0", "Flags": 0, "MinAccountCreateAmount": "100000000", "OwnerNode": "0", "SignatureReward": "100", "XChainAccountClaimCount": "0", "XChainAccountCreateCount": "1", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "rnBnyot2gCJywLxLzfHQX2dUJqZ6oghUFp", "LockingChainIssue": { "currency": "XRP" } }, "XChainClaimID": "0" }, "LedgerEntryType": "Bridge", "LedgerIndex": "063F76476DC55CD4FC8A2B1FDD4D3AF2CAB72EB5A19C62DCB2F0CC08953B4093", "PreviousFields": { "MinAccountCreateAmount": "5000000" }, "PreviousTxnID": "CB4C23D2CD36DFF66F10B38F29B7CDCE5C44622D470CC438EEEE223832B50717", "PreviousTxnLgrSeq": 18 } }, { "ModifiedNode": { "FinalFields": { "Account": "rnBnyot2gCJywLxLzfHQX2dUJqZ6oghUFp", "Balance": "1015000070", "Flags": 0, "OwnerCount": 2, "Sequence": 6 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "8A4453D12949BE96BE6B1B63E77B165F61CDE7AE852237791F6A2D3726936E1E", "PreviousFields": { "Balance": "1015000080", "Sequence": 5 }, "PreviousTxnID": "CB4C23D2CD36DFF66F10B38F29B7CDCE5C44622D470CC438EEEE223832B50717", "PreviousTxnLgrSeq": 18 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "625C6B9481E449AEB1ED454E3643FA123B1573658187A067302F903A65911038", "ledger_index": 19, "date": "2022-09-09T20:19:00Z" } ================================================ FILE: src/containers/shared/components/Transaction/XChainModifyBridge/test/mock_data/XChainModifyBridgeNoEntry.json ================================================ { "tx": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Fee": "10", "Flags": 0, "LastLedgerSequence": 38, "Sequence": 30, "SignatureReward": "100", "SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", "TransactionType": "XChainModifyBridge", "TxnSignature": "304402200F7ECEBC9DF4AD8B651F2DD215299B9F96BE40A6CDBB9A5ABA540CADCD66D88702200C854619DCE57AAE6536C03F6B76D3CF1F382D72DD39BEE13BDC304EFB6ED500", "XChainBridge": { "IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "IssuingChainIssue": { "currency": "XRP" }, "LockingChainDoor": "r3rhWeE31Jt5sWmi4QiGLMZnY3ENgqw96W", "LockingChainIssue": { "currency": "XRP" } }, "date": 1679604320000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "99999987849998200", "Flags": 0, "OwnerCount": 0, "Sequence": 31 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8", "PreviousFields": { "Balance": "99999987849998210", "Sequence": 30 }, "PreviousTxnID": "30B1D2AE3E64B377B9D0B036F2736CE2A88AD5FD99130DFADCDC534EFAB75D2A", "PreviousTxnLgrSeq": 18 } } ], "TransactionIndex": 0, "TransactionResult": "tecNO_ENTRY" }, "hash": "72B6CC170F492FF87825A8F288B7F05EBEE321974C2D7A8E39D5034167C6DCA9", "ledger_index": 19, "date": 1679604320000 } ================================================ FILE: src/containers/shared/components/Transaction/defaultParser.ts ================================================ export const defaultParser = (tx: any): any => tx ================================================ FILE: src/containers/shared/components/Transaction/index.ts ================================================ import { AMMClawback } from './AMMClawback' import { AMMCreate } from './AMMCreate' import { AMMDeposit } from './AMMDeposit' import { AMMDeleteTransaction as AMMDelete } from './AMMDelete' import { AMMWithdraw } from './AMMWithdraw' import { AMMBid } from './AMMBid' import { AMMVote } from './AMMVote' import { AccountDeleteTransaction as AccountDelete } from './AccountDelete' import { AccountSetTransaction as AccountSet } from './AccountSet' import { BatchTransaction as Batch } from './Batch' import { CredentialAcceptTransaction as CredentialAccept } from './CredentialAccept' import { CredentialCreateTransaction as CredentialCreate } from './CredentialCreate' import { CredentialDeleteTransaction as CredentialDelete } from './CredentialDelete' import { DelegateSetTransaction as DelegateSet } from './DelegateSet' import { DIDSetTransaction as DIDSet } from './DIDSet' import { DepositPreauthTransaction as DepositPreauth } from './DepositPreauth' import { EnableAmendmentTransaction as EnableAmendment } from './EnableAmendment' import { MPTokenAuthorizeTransaction as MPTokenAuthorize } from './MPTokenAuthorize' import { MPTokenIssuanceCreateTransaction as MPTokenIssuanceCreate } from './MPTokenIssuanceCreate' import { MPTokenIssuanceDestroyTransaction as MPTokenIssuanceDestroy } from './MPTokenIssuanceDestroy' import { MPTokenIssuanceSetTransaction as MPTokenIssuanceSet } from './MPTokenIssuanceSet' import { NFTokenMintTransaction as NFTokenMint } from './NFTokenMint' import { NFTokenCancelOfferTransaction as NFTokenCancelOffer } from './NFTokenCancelOffer' import { NFTokenBurnTransaction as NFTokenBurn } from './NFTokenBurn' import { NFTokenCreateOfferTransaction as NFTokenCreateOffer } from './NFTokenCreateOffer' import { NFTokenAcceptOfferTransaction as NFTokenAcceptOffer } from './NFTokenAcceptOffer' import { OfferCancelTransaction as OfferCancel } from './OfferCancel' import { OfferCreateTransaction as OfferCreate } from './OfferCreate' import { OracleDeleteTransaction as OracleDelete } from './OracleDelete' import { OracleSetTransaction as OracleSet } from './OracleSet' import { PaymentTransaction as Payment } from './Payment' import { PaymentChannelClaimTransaction as PaymentChannelClaim } from './PaymentChannelClaim' import { PaymentChannelCreateTransaction as PaymentChannelCreate } from './PaymentChannelCreate' import { PaymentChannelFundTransaction as PaymentChannelFund } from './PaymentChannelFund' import { PermissionedDomainDeleteTransaction as PermissionedDomainDelete } from './PermissionedDomainDelete' import { PermissionedDomainSetTransaction as PermissionedDomainSet } from './PermissionedDomainSet' import { SetFeeTransaction as SetFee } from './SetFee' import { SetHookTransaction as SetHook } from './SetHook' import { SetRegularKeyTransaction as SetRegularKey } from './SetRegularKey' import { SignerListSetTransaction as SignerListSet } from './SignerListSet' import { XChainAccountCreateCommitTransaction as XChainAccountCreateCommit } from './XChainAccountCreateCommit' import { XChainAddAccountCreateAttestationTransaction as XChainAddAccountCreateAttestation } from './XChainAddAccountCreateAttestation' import { XChainAddClaimAttestationTransaction as XChainAddClaimAttestation } from './XChainAddClaimAttestation' import { XChainClaimTransaction as XChainClaim } from './XChainClaim' import { XChainCommitTransaction as XChainCommit } from './XChainCommit' import { XChainCreateBridgeTransaction as XChainCreateBridge } from './XChainCreateBridge' import { XChainCreateClaimIDTransaction as XChainCreateClaimID } from './XChainCreateClaimID' import { XChainModifyBridgeTransaction as XChainModifyBridge } from './XChainModifyBridge' import { EscrowCreateTransaction as EscrowCreate } from './EscrowCreate' import { EscrowFinishTransaction as EscrowFinish } from './EscrowFinish' import { EscrowCancelTransaction as EscrowCancel } from './EscrowCancel' import { TicketCreateTransaction as TicketCreate } from './TicketCreate' import { TrustSetTransaction as TrustSet } from './TrustSet' import { UNLModifyTransaction as UNLModify } from './UNLModify' import { ClawbackTransaction as Clawback } from './Clawback' import { VaultCreateTransaction as VaultCreate } from './VaultCreate' import { VaultSetTransaction as VaultSet } from './VaultSet' import { VaultDepositTransaction as VaultDeposit } from './VaultDeposit' import { VaultWithdrawTransaction as VaultWithdraw } from './VaultWithdraw' import { VaultClawbackTransaction as VaultClawback } from './VaultClawback' import { VaultDeleteTransaction as VaultDelete } from './VaultDelete' import { LoanBrokerSetTransaction as LoanBrokerSet } from './LoanBrokerSet' import { LoanBrokerDeleteTransaction as LoanBrokerDelete } from './LoanBrokerDelete' import { LoanBrokerCoverDepositTransaction as LoanBrokerCoverDeposit } from './LoanBrokerCoverDeposit' import { LoanBrokerCoverWithdrawTransaction as LoanBrokerCoverWithdraw } from './LoanBrokerCoverWithdraw' import { LoanBrokerCoverClawbackTransaction as LoanBrokerCoverClawback } from './LoanBrokerCoverClawback' import { LoanSetTransaction as LoanSet } from './LoanSet' import { LoanDeleteTransaction as LoanDelete } from './LoanDelete' import { LoanManageTransaction as LoanManage } from './LoanManage' import { LoanPayTransaction as LoanPay } from './LoanPay' import { TransactionAction, TransactionCategory, TransactionMapping, } from './types' export const transactionTypes: { [key: string]: TransactionMapping } = { AccountDelete, AccountSet, Batch, Clawback, CredentialAccept, CredentialCreate, CredentialDelete, DelegateSet, DIDSet, DepositPreauth, EnableAmendment, MPTokenAuthorize, MPTokenIssuanceCreate, MPTokenIssuanceDestroy, MPTokenIssuanceSet, NFTokenMint, NFTokenCancelOffer, NFTokenBurn, NFTokenCreateOffer, NFTokenAcceptOffer, OfferCancel, OfferCreate, OracleDelete, OracleSet, Payment, PaymentChannelCreate, PaymentChannelClaim, PaymentChannelFund, PermissionedDomainDelete, PermissionedDomainSet, SetFee, SetHook, SetRegularKey, SignerListSet, XChainAccountCreateCommit, XChainAddAccountCreateAttestation, XChainAddClaimAttestation, XChainClaim, XChainCommit, XChainCreateBridge, XChainCreateClaimID, XChainModifyBridge, EscrowCreate, EscrowFinish, EscrowCancel, TicketCreate, AMMCreate, AMMWithdraw, AMMDeposit, AMMBid, AMMVote, AMMDelete, AMMClawback, TrustSet, UNLModify, VaultCreate, VaultSet, VaultDeposit, VaultWithdraw, VaultClawback, VaultDelete, LoanBrokerSet, LoanBrokerDelete, LoanBrokerCoverDeposit, LoanBrokerCoverWithdraw, LoanBrokerCoverClawback, LoanSet, LoanDelete, LoanManage, LoanPay, } export const getAction = (type: string): TransactionAction => transactionTypes[type]?.action || TransactionAction.UNKNOWN export const getCategory = (type: string): TransactionCategory => transactionTypes[type]?.category || TransactionCategory.OTHER ================================================ FILE: src/containers/shared/components/Transaction/test/DefaultSimple.test.tsx ================================================ import NewEscrowCreate from './mock_data/NewEscrowCreate.json' import SetHook from './mock_data/SetHook.json' import SetHook2 from './mock_data/SetHook2.json' import TokenSwapPropose from './mock_data/TokenSwapPropose.json' import { DefaultSimple } from '../DefaultSimple' import { renderWithProviders } from './createWrapperFactory' import { expectSimpleRowText } from './expectations' import summarizeTransaction from '../../../../../rippled/lib/txSummary' function renderComponent(tx: { tx: any; meta: any }) { // eslint-disable-next-line no-param-reassign -- needed so parsers aren't triggered tx.tx.TransactionType = 'DummyTx' const data = summarizeTransaction(tx, true) return renderWithProviders() } describe('DefaultSimple', () => { it('renders Simple for basic transaction', () => { const { container } = renderComponent(NewEscrowCreate) expectSimpleRowText( container, 'Destination', 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', ) expect( container.querySelector(`[data-testid="Destination"] a`), ).toBeInTheDocument() expectSimpleRowText(container, 'Amount', '\uE9001.00 XRP') expectSimpleRowText(container, 'FinishAfter', '736447590') }) it('renders Simple for more complex transaction', () => { const { container } = renderComponent(SetHook) expect(container.querySelectorAll(`[data-testid="group"]`)).toHaveLength(10) expect( container.querySelectorAll(`[data-testid="CreateCode"]`), ).toHaveLength(10) expect(container.querySelectorAll(`[data-testid="Flags"]`)).toHaveLength(10) expect( container.querySelectorAll(`[data-testid="HookApiVersion"]`), ).toHaveLength(2) expect( container.querySelectorAll(`[data-testid="HookNamespace"]`), ).toHaveLength(2) expect(container.querySelectorAll(`[data-testid="HookOn"]`)).toHaveLength(2) expect( container.querySelectorAll(`[data-testid="CreateCode"] .value`)[0], ).toHaveTextContent( '0061736D0100000001420960027F7F017F60037F7F7F017E60037F7F7E017E60027F7F017E60047F' + '7F7F7F017E60017F017E6000017E60057F7F7F7F7F017E60097F7F7F7F7F7F7F7F7F017E02BC02' + '1403656E76025F67000003656E760A6F74786E5F6669656C64000103656E760661636365707400' + '0203656E7608726F6C6C6261636B000203656E760C686F6F6B5F6163636F756E...', ) expect( container.querySelectorAll(`[data-testid="Flags"] .value`)[0], ).toHaveTextContent('1') expect( container.querySelectorAll(`[data-testid="HookApiVersion"] .value`)[0], ).toHaveTextContent('0') expect( container.querySelectorAll(`[data-testid="HookNamespace"] .value`)[0], ).toHaveTextContent( '0000000000000000000000000000000000000000000000000000000000000000', ) expect( container.querySelectorAll(`[data-testid="HookOn"] .value`)[0], ).toHaveTextContent( 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF', ) }) it('renders Simple for more complex transaction', () => { const { container } = renderComponent(SetHook2) expect(container.querySelectorAll(`[data-testid="group"]`)).toHaveLength(1) expect( container.querySelectorAll(`[data-testid="CreateCode"]`), ).toHaveLength(1) expect(container.querySelectorAll(`[data-testid="Flags"]`)).toHaveLength(1) expect( container.querySelectorAll(`[data-testid="HookApiVersion"]`), ).toHaveLength(1) expect( container.querySelectorAll(`[data-testid="HookNamespace"]`), ).toHaveLength(1) expect(container.querySelectorAll(`[data-testid="HookOn"]`)).toHaveLength(1) expect( container.querySelectorAll(`[data-testid="HookParameters"]`), ).toHaveLength(1) expect( container.querySelectorAll(`[data-testid="CreateCode"] .value`)[0], ).toHaveTextContent( '0061736D01000000011C0460057F7F7F7F7F017E60037F7F7E017E60027F7F017F60017F017E0223' + '0303656E76057472616365000003656E7606616363657074000103656E76025F6700020302010305' + '030100020621057F0141B088040B7F0041A6080B7F004180080B7F0041B088040B7F004180080B07' + '080104686F6F6B00030AC6800001C2800002017F017E230041106B220124...', ) expect( container.querySelectorAll(`[data-testid="Flags"] .value`)[0], ).toHaveTextContent('1') expect( container.querySelectorAll(`[data-testid="HookApiVersion"] .value`)[0], ).toHaveTextContent('0') expect( container.querySelectorAll(`[data-testid="HookNamespace"] .value`)[0], ).toHaveTextContent( '4FF9961269BF7630D32E15276569C94470174A5DA79FA567C0F62251AA9A36B9', ) expect( container.querySelectorAll(`[data-testid="HookOn"] .value`)[0], ).toHaveTextContent( 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF', ) expect( container.querySelector( `[data-testid="HookParameters"] .subgroup [data-testid="HookParameterName"]`, ), ).toHaveTextContent('HookParameterName: 6E616D6531') expect( container.querySelector( `[data-testid="HookParameters"] .subgroup [data-testid="HookParameterValue"]`, ), ).toHaveTextContent('HookParameterValue: 76616C756531') }) it('renders Simple for amount', () => { const { container } = renderComponent(TokenSwapPropose) expectSimpleRowText( container, 'AccountOther', 'rPTScb8m3wq6r3Ys93Ec5at7LYDmWrtndi', ) expect( container.querySelector(`[data-testid="AccountOther"] a`), ).toBeInTheDocument() expectSimpleRowText( container, 'Amount', '€12.00 EUR.rnz5f1MFcgbVxzYhU5hUKbKquEJHJady5K', ) expectSimpleRowText( container, 'AmountOther', '$33.00 USD.rnz5f1MFcgbVxzYhU5hUKbKquEJHJady5K', ) }) }) ================================================ FILE: src/containers/shared/components/Transaction/test/createWrapperFactory.tsx ================================================ import { render, RenderResult } from '@testing-library/react' import { ReactElement } from 'react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router' import { i18n } from 'i18next' import { QueryClientProvider } from 'react-query' import defaultI18nConfig from '../../../../../i18n/testConfig' import summarizeTransaction from '../../../../../rippled/lib/txSummary' import { TransactionDescriptionComponent, TransactionSimpleComponent, TransactionTableDetailComponent, } from '../types' import { testQueryClient } from '../../../../test/QueryClient' import SocketContext from '../../../SocketContext' import MockWsClient from '../../../../test/mockWsClient' /** * Renders a component with all necessary providers for testing * @param TestComponent - react component to test * @param i18nConfig - i18next configuration to use instead of the default which outputs the key as the value */ export function renderWithProviders( TestComponent: ReactElement, i18nConfig?: i18n, socketMock?: any, ): RenderResult { const mockSocket = socketMock || new MockWsClient() return render( {TestComponent} , ) } export function createDescriptionRenderFactory( Description: TransactionDescriptionComponent, i18nConfig?: i18n, ): (tx: any) => RenderResult { return function renderDescription(tx: any) { return renderWithProviders(, i18nConfig) } } export function createSimpleRenderFactory( Simple: TransactionSimpleComponent, i18nConfig?: i18n, socketMock?: any, ): (tx: any) => RenderResult { return function renderSimple(tx: any) { const data = summarizeTransaction(tx, true) const mockSocket = socketMock || new MockWsClient() return renderWithProviders( , i18nConfig, mockSocket, ) } } export function createTableDetailRenderFactory( TableDetail: TransactionTableDetailComponent, i18nConfig?: i18n, socketMock?: any, ): (tx: any) => RenderResult { return function renderTableDetail(tx: any) { const data = summarizeTransaction(tx, true) const mockSocket = socketMock || new MockWsClient() return renderWithProviders( , i18nConfig, mockSocket, ) } } ================================================ FILE: src/containers/shared/components/Transaction/test/expectations.ts ================================================ import { RenderResult } from '@testing-library/react' // Helper to extract container from RenderResult or use directly if already an HTMLElement/Element const getContainer = (input: HTMLElement | Element | RenderResult): Element => { // Check for RenderResult if ( 'container' in input && (input as RenderResult).container instanceof HTMLElement ) { return (input as RenderResult).container } return input as Element } // For class-based selectors (e.g., '.channel'), the class is on .value element // For data-testid selectors, the testid is on the .row element const isClassSelector = (selector: string) => selector.indexOf('.') === 0 // Find value element by class - handles cases where .value has multiple classes const findValueByClass = ( container: Element, className: string, ): Element | null => { // className is like '.channel' - we look for .value elements that also have that class const classWithoutDot = className.slice(1) const valueElements = container.querySelectorAll('.value') for (const el of Array.from(valueElements)) { if (el.classList.contains(classWithoutDot)) { return el } } return null } export const expectSimpleRowLabel = ( input: HTMLElement | Element | RenderResult, key: string, text: string, ) => { const container = getContainer(input) if (isClassSelector(key)) { // Class is on .value, find the parent .row and then .label const valueElement = findValueByClass(container, key) const rowElement = valueElement?.closest('.row') expect(rowElement?.querySelector('.label')).toHaveTextContent(text) } else { expect( container.querySelector(`[data-testid="${key}"] .label`), ).toHaveTextContent(text) } } export const expectSimpleRowText = ( input: HTMLElement | Element | RenderResult, key: string, text: string, ) => { const container = getContainer(input) if (isClassSelector(key)) { // Class is on .value element itself expect(findValueByClass(container, key)).toHaveTextContent(text) } else { expect( container.querySelector(`[data-testid="${key}"] .value`), ).toHaveTextContent(text) } } export const expectSimpleRowNotToExist = ( input: HTMLElement | Element | RenderResult, key: string, ) => { const container = getContainer(input) if (isClassSelector(key)) { expect(findValueByClass(container, key)).not.toBeInTheDocument() } else { expect( container.querySelector(`[data-testid="${key}"]`), ).not.toBeInTheDocument() } } ================================================ FILE: src/containers/shared/components/Transaction/test/index.ts ================================================ export * from './createWrapperFactory' export * from './expectations' ================================================ FILE: src/containers/shared/components/Transaction/test/mock_data/NewEscrowCreate.json ================================================ { "tx": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Amount": "1000000", "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Fee": "10", "FinishAfter": 736447590, "Flags": 2147483648, "Sequence": 4, "SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", "TransactionType": "NewEscrowCreate", "TxnSignature": "30440220273DAAA2F1E9C24649D26A0833F452B9D408AF86565113B878711A4F99ED62250220472CF6BE6A43AB694856A92022F8949F7CD0527E0531C3CEFBA8134059E536FA", "date": 1683122920000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "99999999995999960", "Flags": 0, "OwnerCount": 4, "Sequence": 5 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8", "PreviousFields": { "Balance": "99999999996999970", "OwnerCount": 3, "Sequence": 4 }, "PreviousTxnID": "AA6740AAC85C442653E80FE637B3F27EFEF8CE626014109C7502033D8C6AE25A", "PreviousTxnLgrSeq": 3 } }, { "CreatedNode": { "LedgerEntryType": "Escrow", "LedgerIndex": "D052EAF42C8EDCC23CE0EF4A08C5164ED17ECFA1E66C623674553EFAD94B5E63", "NewFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Amount": "1000000", "Destination": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh" } } }, { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "RootIndex": "D8120FC732737A2CF2E9968FDF3797A43B457F2A81AA06D2653171A1EA635204" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "D8120FC732737A2CF2E9968FDF3797A43B457F2A81AA06D2653171A1EA635204" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "FE6A9F2D5949A913BA7DD8C69EA5CDF5D2B6A28976B4DC9982D1515CCFCC57C3", "ledger_index": 4, "date": 1683122920000 } ================================================ FILE: src/containers/shared/components/Transaction/test/mock_data/SetHook.json ================================================ { "tx": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Fee": "7644020", "Flags": 0, "Hooks": [ { "Hook": { "CreateCode": "0061736D0100000001420960027F7F017F60037F7F7F017E60037F7F7E017E60027F7F017E60047F7F7F7F017E60017F017E6000017E60057F7F7F7F7F017E60097F7F7F7F7F7F7F7F7F017E02BC021403656E76025F67000003656E760A6F74786E5F6669656C64000103656E7606616363657074000203656E7608726F6C6C6261636B000203656E760C686F6F6B5F6163636F756E74000303656E76057374617465000403656E760974726163655F6E756D000203656E760C6574786E5F72657365727665000503656E760973746174655F736574000403656E760A6C65646765725F736571000603656E760C6574786E5F64657461696C73000303656E760D6574786E5F6665655F62617365000303656E7604656D6974000403656E76096F74786E5F736C6F74000503656E760D736C6F745F7375626669656C64000103656E760D736C6F745F7375626172726179000103656E7604736C6F74000103656E76057472616365000703656E760B7574696C5F6B65796C6574000803656E7608736C6F745F7365740001030201050503010002063F0A7F0141F08A040B7F0041EC0A0B7F004180080B7F0041F08A040B7F004180080B7F0041B0090B7F0041D0090B7F0041A0090B7F004180080B7F0041F0090B07080104686F6F6B00140AB6D20001B2D20002047F017E230041B0186B22012400200120003602A41841012200200010001A2001200141A2186A410241828004100137039818200120012D00A31820012D00A2184110746A3602941820012802941841E30047044041002200200042CC0010021A0B41BC094114418180201001421452044041002200200042CF0010031A0B20014180186A411410041A200141002200200041D009412010053703F81741900A410C20012903F81710061A20012903F817427B510440410510071A200141053A00F717200141F7176A410141D009412010085004404100200042E20010031A0B41D00941FF013A000041A009410841D009412010085004404100200042E60010031A0B41D00941003A0000200141003602F017034041E980808078410610001A024020012802F01741054F0D0041EF0920012802F01741016A3A000020012802F017410574418C086A411441D00941201008421452044041002200200042F00010031A0B41EF09410120012802F0174105744180086A41201008420152044041002200200042F40010031A0B2001200141F0156A22003602EC1520014280C0F4C198AF0B3703C8152001410022023602C415200120023602C015200110093E02BC15200141D0156A411410041A200141003A00BB1520012802EC1541123A000020012802EC1520012D00BB154108763A000120012802EC1520012D00BB153A0002200120012802EC1541036A3602EC1520014180808080783602B415200141023A00B31520012802EC1520012D00B315410F7141206A3A000020012802EC1520012802B4154118763A000120012802EC1520012802B4154110763A000220012802EC1520012802B4154108763A000320012802EC1520012802B4153A0004200120012802EC1541056A3602EC15200120012802C0153602AC152001410322033A00AB1520012802EC1520012D00AB15410F7141206A3A000020012802EC1520012802AC154118763A000120012802EC1520012802AC154110763A000220012802EC1520012802AC154108763A000320012802EC1520012802AC153A0004200120012802EC1541056A3602EC15200120023602A415200141043A00A31520012802EC1520012D00A315410F7141206A3A000020012802EC1520012802A4154118763A000120012802EC1520012802A4154110763A000220012802EC1520012802A4154108763A000320012802EC1520012802A4153A0004200120012802EC1541056A3602EC15200120012802C41536029C152001410E3A009B1520012802EC1520012D009B15410F7141206A3A000020012802EC15200128029C154118763A000120012802EC15200128029C154110763A000220012802EC15200128029C154108763A000320012802EC15200128029C153A0004200120012802EC1541056A3602EC15200120012802BC1541016A360294152001411A3A00931520012802EC15412022023A000020012802EC1520012D0093153A000120012802EC152001280294154118763A000220012802EC152001280294154110763A000320012802EC152001280294154108763A000420012802EC152001280294153A0005200120012802EC1541066A3602EC15200120012802BC1541056A36028C152001411B3A008B1520012802EC1520023A000020012802EC1520012D008B153A000120012802EC15200128028C154118763A000220012802EC15200128028C154110763A000320012802EC15200128028C154108763A000420012802EC15200128028C153A0005200120012802EC1541066A3602EC152001410122023A008A15200120012903C8153703801520012802EC1520012D008A15410F7141E0006A3A000020012802EC15200129038015423888423F8342407D3C000120012802EC1520012903801542308842FF01833C000220012802EC1520012903801542288842FF01833C000320012802EC1520012903801542208842FF01833C000420012802EC1520012903801542188842FF01833C000520012802EC1520012903801542108842FF01833C000620012802EC1520012903801542088842FF01833C000720012802EC1520012903801542FF01833C0008200120012802EC1541096A3602EC15200120012802EC153602FC142001410822043A00FB14200142003703F01420012802EC1520012D00FB14410F7141E0006A3A000020012802EC1520012903F014423888423F8342407D3C000120012802EC1520012903F01442308842FF01833C000220012802EC1520012903F01442288842FF01833C000320012802EC1520012903F01442208842FF01833C000420012802EC1520012903F01442188842FF01833C000520012802EC1520012903F01442108842FF01833C000620012802EC1520012903F01442088842FF01833C000720012802EC1520012903F01442FF01833C0008200120012802EC1541096A3602EC1520012802EC1541F3003A000020012802EC1541213A000120012802EC15200537030220012802EC15200537030A20012802EC15200537031220012802EC152005370319200120012802EC1541236A3602EC15200120023A00EF1420012802EC1520012D00EF144180016A3A000020012802EC15411422023A000120012802EC1520012903D01537030220012802EC1520012903D81537030A20012802EC1520012802E015360212200120012802EC1541166A3602EC15200120033A00EE1420012802EC1520012D00EE144180016A3A000020012802EC1520023A000120012802EC1520012802F01741057429038C0837030220012802EC1520012802F0174105742903940837030A20012802EC1520012802F01741057428029C08360212200120012802EC1541166A3602EC15200120012802EC1541F8012202100A3703E014200120002002100B3703D814200120043A00D714200120012903D8143703C81420012802FC1420012D00D714410F7141E0006A3A000020012802FC1420012903C814423888423F8342407D3C000120012802FC1420012903C81442308842FF01833C000220012802FC1420012903C81442288842FF01833C000320012802FC1420012903C81442208842FF01833C000420012802FC1420012903C81442188842FF01833C000520012802FC1420012903C81442108842FF01833C000620012802FC1420012903C81442088842FF01833C000720012802FC1420012903C81442FF01833C0008200120012802FC1441096A3602FC142001200141A0146A412020002002100C37039814200520012903981459044041002200200042FD0010031A0B419D0A410B20012903981410061A200120012802F01741016A3602F0170C010B0B41002200200042820110021A0B024020012903801841BC09290300520D0020012903881841C409290300520D0020012802901841CC09280200470D004100200042890110021A0B20014100200041B009412010053703901420012903901442005304404100200042920110031A0B4101100D42015204404100200042960110031A0B41014193803C4102100E42025204404100200042970110031A0B4102220041002000100F420252044041002200200042990110031A0B41024198801C4103100E4203520440410022002000429A0110031A0B41024199801C4104100E4204520440410022002000429B0110031A0B2001200141900C6A2200418008410410103703880C41A90A41052202200020012903880CA7410110111A20014100220020004103101042FF01833703800C41AE0A200220012903800C10061A024020012903800C420159044020012903800C4219570D010B4100200042A40110031A0B2001200141DC0B6A3602CC0B2001027F410820012903800C4201510D001A4120411420012903800C420259047F20012903800C4205570520000B4101711B0B3A00CB0B41B00920012903800C3C000020012802CC0B41016B20012D00CB0B41016A4104101020012D00CB0B41016AAC5204404100200042B10110031A0B20012802CC0B41016B41003A00002001200141A00B6A20012D00CB0B41B00922004120220210053703980B20012802CC0B20012D00CB0B20002002100820012D00CB0BAD52044041002200200042BA0110031A0B024020012903980B20012D00CB0BAD520D0020012903A00B20012802CC0B290300520D0020012903A80B20012802CC0B290308520D0020012903B00B20012802CC0B290310520D0020012903B80B20012802CC0B290318520D0020012903C00B20012802CC0B290320520D0020012903C80B20012802CC0B290328520D0020012903D00B20012802CC0B290330520D0020012903D80B20012802CC0B290338520D0041002200200042BF0110021A0B20012903980B4200550440200141003A00970B200120012903800C3C00BF0B0240200141970B6A4101200141A00B6A41201005500D0020012D00970B450D00200120012D00970B41016B3A00970B200141970B6A4101200141A00B6A4120100850044041002200200042CF0110031A0B0B0B200141003A00960B200120012802CC0B2D001F3A00950B20012802CC0B20012903800C3C001F200141960B6A4101220020012802CC0B412010051A200120012D00960B20006A3A00960B200141960B6A410120012802CC0B4120100850044041002200200042DB0110031A0B20012802CC0B20012D00950B3A001F2001027F410020012802CC0B29030041F009290300520D001A410020012802CC0B29030841F809290300520D001A410020012802CC0B29031041800A290300520D001A410020012802CC0B29031841880A290300520D001A410020012802CC0B29032041900A290300520D001A410020012802CC0B29032841980A290300520D001A410020012802CC0B29033041A00A290300520D001A20012802CC0B29033841A80A290300510B4101713602900B41B40A410F20012802900BAC10061A41C40A4105220020012D00960BAD10061A41900A410C20012903F81710061A41AE0A200020012903800C10061A024020012903F81720012D00960BAD52044020012903800C4205570D0120012D00960BB720012903F817B9449A9999999999E93FA266450D010B41CA0A411141DC0A4110410010111A024020012903800C420151044041D00941FF013A000020012802CC0B410841D0094120100850044041002200200042F40110031A0B0C010B024020012903800C4205570440200120012903800C42027D3C008F0B200141E00A6A4122410120014180186A411441002200200020002000101242225204404100200042FD0110031A0B200141E00A6A41224105101342055204404100200042FE0110031A0B4105418B803C4106100E42065204404100200042810210031A0B410620012D008F0B4107100F42075104404107419F80144108100E42085204404100200042890210031A0B200141C00A6A412041081010422052044041002000428A0210031A0B024020012903C00A20012802CC0B290300520D0020012903C80A20012802CC0B290308520D0020012903D00A20012802CC0B290310520D0020012903D80A20012802CC0B290318520D0020012903E00A20012802CC0B290320520D0020012903E80A20012802CC0B290328520D0020012903F00A20012802CC0B290330520D0020012903F80A20012802CC0B290338520D0041002000428E0210021A0B0B200141E00A6A4122411820012802CC0B41204100200020002000101242225204404100200042920210031A0B200141E00A6A41224109101342095204404100200042950210031A0B410110071A200141A00A6A21022001027F417F20012802900B0D001A20012802CC0B0B3602BC0A2002027F20012D008F0B45044020012802BC0A0C010B41000B360200200241046A2200027F20012D008F0B410146044020012802BC0A0C010B41000B360200200041046A2200027F20012D008F0B410246044020012802BC0A0C010B41000B360200200041046A027F20012D008F0B410346044020012802BC0A0C010B41000B36020020014100220036029C022001200141A0026A220236029802200110093E02FC0120014180026A411410041A200141163A00FB0120012802980241123A000020012802980220012D00FB014108763A000120012802980220012D00FB013A0002200120012802980241036A3602980220014180808080783602F401200141023A00F30120012802980220012D00F301410F7141206A3A000020012802980220012802F4014118763A000120012802980220012802F4014110763A000220012802980220012802F4014108763A000320012802980220012802F4013A0004200120012802980241056A36029802200120003602EC01200141043A00EB0120012802980220012D00EB01410F7141206A3A000020012802980220012802EC014118763A000120012802980220012802EC014110763A000220012802980220012802EC014108763A000320012802980220012802EC013A0004200120012802980241056A36029802200120012802FC0141016A3602E4012001411A3A00E301200128029802412022033A000020012802980220012D00E3013A000120012802980220012802E4014118763A000220012802980220012802E4014110763A000320012802980220012802E4014108763A000420012802980220012802E4013A0005200120012802980241066A36029802200120012802FC0141056A3602DC012001411B3A00DB0120012802980220033A000020012802980220012D00DB013A000120012802980220012802DC014118763A000220012802980220012802DC014110763A000320012802980220012802DC014108763A000420012802980220012802DC013A0005200120012802980241066A3602980220012001280298023602D401200141083A00D301200142003703C80120012802980220012D00D301410F7141E0006A3A000020012802980220012903C801423888423F8342407D3C000120012802980220012903C80142308842FF01833C000220012802980220012903C80142288842FF01833C000320012802980220012903C80142208842FF01833C000420012802980220012903C80142188842FF01833C000520012802980220012903C80142108842FF01833C000620012802980220012903C80142088842FF01833C000720012802980220012903C80142FF01833C0008200120012802980241096A3602980220012802980241F3003A000020012802980241213A00012001280298022005370302200128029802200537030A20012802980220053703122001280298022005370319200120012802980241236A36029802200141013A00C70120012802980220012D00C7014180016A3A000020012802980241143A000120012802980220012903800237030220012802980220012903880237030A200128029802200128029002360212200120012802980241166A36029802200141800820012802980220026B6B3602C001200120012802980220012802C001100A3703B801200120012802980220012903B801A76A360298022001200128029802220241016A36029802200241FB013A0000200120012802A00A3602B4012001200128029802220241016A36029802200241EE013A0000200020012802B4014704402001200128029802220041016A36029802200041223A00002001200128029802220041016A360298022000410022003A00002001200128029802220241016A36029802200220003A00002001200128029802220241016A36029802200220003A00002001200128029802220041016A36029802200041013A0000024020012802B401417F4604402001200128029802220041016A36029802200041FB003A00002001200128029802220041016A36029802200041003A00000C010B2001200128029802220041016A360298022000411F3A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A0000200120012802B401220041016A3602B40120002D000021002001200128029802220241016A36029802200220003A00000B0B2001200128029802220041016A36029802200041E1013A0000200120012802A40A3602B0012001200128029802220041016A36029802200041EE013A000020012802B00104402001200128029802220041016A36029802200041223A00002001200128029802220041016A360298022000410022003A00002001200128029802220241016A36029802200220003A00002001200128029802220241016A36029802200220003A00002001200128029802220041016A36029802200041013A0000024020012802B001417F4604402001200128029802220041016A36029802200041FB003A00002001200128029802220041016A36029802200041003A00000C010B2001200128029802220041016A360298022000411F3A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A0000200120012802B001220041016A3602B00120002D000021002001200128029802220241016A36029802200220003A00000B0B2001200128029802220041016A36029802200041E1013A0000200120012802A80A3602AC012001200128029802220041016A36029802200041EE013A000020012802AC0104402001200128029802220041016A36029802200041223A00002001200128029802220041016A360298022000410022003A00002001200128029802220241016A36029802200220003A00002001200128029802220241016A36029802200220003A00002001200128029802220041016A36029802200041013A0000024020012802AC01417F4604402001200128029802220041016A36029802200041FB003A00002001200128029802220041016A36029802200041003A00000C010B2001200128029802220041016A360298022000411F3A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A0000200120012802AC01220041016A3602AC0120002D000021002001200128029802220241016A36029802200220003A00000B0B2001200128029802220041016A36029802200041E1013A0000200120012802AC0A3602A8012001200128029802220041016A36029802200041EE013A000020012802A80104402001200128029802220041016A36029802200041223A00002001200128029802220041016A360298022000410022003A00002001200128029802220241016A36029802200220003A00002001200128029802220241016A36029802200220003A00002001200128029802220041016A36029802200041013A0000024020012802A801417F4604402001200128029802220041016A36029802200041FB003A00002001200128029802220041016A36029802200041003A00000C010B2001200128029802220041016A360298022000411F3A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A0000200120012802A801220041016A3602A80120002D000021002001200128029802220241016A36029802200220003A00000B0B2001200128029802220041016A36029802200041E1013A00002001200128029802220041016A36029802200041F1013A00002001200128029802200141A0026A22006B36029C0220012000200128029C02100B3703A001200141083A009F01200120012903A0013703900120012802D40120012D009F01410F7141E0006A3A000020012802D401200129039001423888423F8342407D3C000120012802D40120012903900142308842FF01833C000220012802D40120012903900142288842FF01833C000320012802D40120012903900142208842FF01833C000420012802D40120012903900142188842FF01833C000520012802D40120012903900142108842FF01833C000620012802D40120012903900142088842FF01833C000720012802D40120012903900142FF01833C0008200120012802D40141096A3602D4012001200141F0006A41202000200128029C02100C370368419D0A410B200129036810061A0C010B41EF0920012903800C42067D3C00002001200141CC006A411441D0094120100542145136023C02400240200128023C450D0020012802900B0D000C010B20012903F817420057044041002200200042C20210031A0B0240200128023C0440200120012903F81742017D3703F8170C010B200120012903F81742017C3703F8170B200141F8176A410141F00941201008420152044041002200200042C90210031A0B0B200128023C044020014101360238034041CF82808078411A10001A0240200128023841194A0D00200120012802383A0040200141106A41202200200141406B200010054220510440200141003A000F2001410F6A4101200141106A412010054201510440024020012D000F41014D0440410022002000200141106A41201008504504404100200042DA0210031A0B0C010B200120012D000F41016B3A000F2001410F6A4101200141106A41201008420152044041002200200042DF0210031A0B0B0B410022002000200141406B41201008504504404100200042E40210031A0B0B2001200128023841016A3602380C010B0B0B20012802900B45044041EF0920012903800C42067D3C000020012802CC0B411441D00941201008421452044041002200200042EE0210031A0B41EF094101200141D00B6A41201008421452044041002200200042F10210031A0B0B0B0B0B41002200200042F80210021A20012903A8182105200141B0186A240020050B0BEC010600418C080B14C2F107E6E864D3906D0A088446FDDF8A7B2F569C0041AC080B149EEA73F5F0627E69397EC72E9A3C7804C0F2BF690041CC080B14C3E8E29AB62847275CED36EBF4E928DC25A07F240041EC080B14B7DA762DB9902E85199666B2E6C3009C5E27576900418C090B1CD70EF4D5021C7C646A98E84F60FED364A004453253CBD7A6250D78800041900A0B5B6D656D6265725F636F756E7400656D69745F726573756C740064756D7000746F70696300746F7069635F646174615F7A65726F00766F7465730022416374696F6E696E6720766F7465732200416374696F6E696E6720766F746573", "Flags": 1, "HookApiVersion": 0, "HookNamespace": "0000000000000000000000000000000000000000000000000000000000000000", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF" } }, { "Hook": { "CreateCode": "0061736D0100000001530C60017F017E60027F7F017F60037F7F7F017E60037F7F7E017E60027F7F017E60097F7F7F7F7F7F7F7F7F017E6000017E60047F7F7F7F017E60037E7E7F017E60027F7E017E60027E7E017E60037E7F7F017E02FF021703656E760C6574786E5F72657365727665000003656E76025F67000103656E760A6F74786E5F6669656C64000203656E7606616363657074000303656E760C686F6F6B5F6163636F756E74000403656E760B7574696C5F6B65796C6574000503656E7608736C6F745F736574000203656E760D736C6F745F7375626669656C64000203656E7604736C6F74000203656E76106C65646765725F6C6173745F74696D65000603656E7608726F6C6C6261636B000303656E760974726163655F6E756D000303656E760A6C65646765725F736571000603656E76057374617465000703656E760D666C6F61745F636F6D70617265000803656E7609666C6F61745F6F6E65000603656E7609666C6F61745F736574000903656E760C666C6F61745F646976696465000A03656E760E666C6F61745F6D756C7469706C79000A03656E7609666C6F61745F696E74000B03656E760C6574786E5F64657461696C73000403656E760D6574786E5F6665655F62617365000403656E7604656D697400070302010005030100020621057F0141A08A040B7F00419D0A0B7F004180080B7F0041A08A040B7F004180080B07080104686F6F6B00170AF0980001EC980002047F017E230041A0066B2201240020012000360294064101220010001A2000200010011A200120014180066A41104182800410023703F805200120012D00810620012D0080064110746A3602F40520012802F40541E200470440418008411E421810031A0B200141E0056A411422004181802010021A200141C0056A200010041A024020012903C00520012903E005520D0020012903C80520012903E805520D0020012802D00520012802F005470D00419E08411D422210031A0B20014190056A2202412222034103200141E0056A41144100220020002000200010051A200220034101220010061A200041E4800C41021007420252044041BB084121422D10031A0B410141E38008410310071A200041E48008410410071A200041828018410510071A200041E280084106220010071A20014100220220022000100837038805200110092001290388057D37038005200129038005423C530440200141E0046A220041166A41002901F608370100200041106A20022903F008370300200041086A20022903E808370300200020022903E0083703002001423C2001290380057D37038005200120012D00EE04AD20012903800542C0843D7F420A817C3C00EE04200120012D00EF04AD20012903800542A08D067F420A817C3C00EF04200120012D00F004AD2001290380054290CE007F420A817C3C00F004200120012D00F104AD20012903800542E8077F420A817C3C00F104200120012D00F204AD20012903800542E4007F420A817C3C00F204200120012D00F304AD200129038005420A7F420A817C3C00F304200120012D00F404AD200129038005420A817C3C00F4042000411E42C600100A1A0B2001410022002000410210083703D804200120002000410310083703D0042001200020004104220210083703C8042001200020004105220010083703C00441FE08410B20012903D804100B1A418A09200020012903D004100B1A419009200220012903C804100B1A024020012903D004420055044020012903C8044200550D010B419509411B42D500100A1A0B2001100C3703B804200120012903B80420012903D0047D3703B00420012903B0044200570440419509411B42DD00100A1A0B2001100C20012903C8047D3703A804200120012903C00442FFFFFFFFFFFFFFFF1F833703C004200120012903C00442C0843D7F3703C00441B009410320012903C004100B1A41FE08410B20012903D804100B1A024020012903C0044200570D0020012903A8044200570D00200120012903D80420012903C00420012903A8047E7C3703D8040B41FE08410B20012903D804100B1A200141FF013A008004200141002200200020014180046A4120100D3703F8030240024020012903F8034200570D0020012903F80342004102100E2005520D0020012903F803100F4104100E500D010B200142D5AA81AAE2F4F5E5D3003703F8030B20012903F8034200570440419509411B42FB00100A1A0B2001410020012903D80410103703F00320012903F0034200570440419509411B42FF00100A1A0B2001410020012903B00410103703E80320012903E8034200570440419509411B428201100A1A0B200120012903F00320012903E80310113703E003200120012903F80320012903E00310123703E00341B409410A20012903E003100B1A200120012903E0034106410010133703D80341BF09410C20012903D803100B1A2001200141E0016A22023602DC01200120012903D8033703B801200120003602B401200120003602B0012001100C3E02AC01200141C0016A411410041A200141003A00AB0120012802DC0141123A000020012802DC0120012D00AB014108763A000120012802DC0120012D00AB013A0002200120012802DC0141036A3602DC0120014180808080783602A401200141023A00A30120012802DC0120012D00A301410F7141206A3A000020012802DC0120012802A4014118763A000120012802DC0120012802A4014110763A000220012802DC0120012802A4014108763A000320012802DC0120012802A4013A0004200120012802DC0141056A3602DC01200120012802B00136029C012001410322033A009B0120012802DC0120012D009B01410F7141206A3A000020012802DC01200128029C014118763A000120012802DC01200128029C014110763A000220012802DC01200128029C014108763A000320012802DC01200128029C013A0004200120012802DC0141056A3602DC012001200036029401200141043A00930120012802DC0120012D009301410F7141206A3A000020012802DC012001280294014118763A000120012802DC012001280294014110763A000220012802DC012001280294014108763A000320012802DC012001280294013A0004200120012802DC0141056A3602DC01200120012802B40136028C012001410E3A008B0120012802DC0120012D008B01410F7141206A3A000020012802DC01200128028C014118763A000120012802DC01200128028C014110763A000220012802DC01200128028C014108763A000320012802DC01200128028C013A0004200120012802DC0141056A3602DC01200120012802AC0141016A360284012001411A3A00830120012802DC01412022003A000020012802DC0120012D0083013A000120012802DC012001280284014118763A000220012802DC012001280284014110763A000320012802DC012001280284014108763A000420012802DC012001280284013A0005200120012802DC0141066A3602DC01200120012802AC0141056A36027C2001411B3A007B20012802DC0120003A000020012802DC0120012D007B3A000120012802DC01200128027C4118763A000220012802DC01200128027C4110763A000320012802DC01200128027C4108763A000420012802DC01200128027C3A0005200120012802DC0141066A3602DC012001410122003A007A200120012903B80137037020012802DC0120012D007A410F7141E0006A3A000020012802DC012001290370423888423F8342407D3C000120012802DC01200129037042308842FF01833C000220012802DC01200129037042288842FF01833C000320012802DC01200129037042208842FF01833C000420012802DC01200129037042188842FF01833C000520012802DC01200129037042108842FF01833C000620012802DC01200129037042088842FF01833C000720012802DC01200129037042FF01833C0008200120012802DC0141096A3602DC01200120012802DC0136026C2001410822043A006B2001420037036020012802DC0120012D006B410F7141E0006A3A000020012802DC012001290360423888423F8342407D3C000120012802DC01200129036042308842FF01833C000220012802DC01200129036042288842FF01833C000320012802DC01200129036042208842FF01833C000420012802DC01200129036042188842FF01833C000520012802DC01200129036042108842FF01833C000620012802DC01200129036042088842FF01833C000720012802DC01200129036042FF01833C0008200120012802DC0141096A3602DC0120012802DC0141F3003A000020012802DC0141213A000120012802DC01200537030220012802DC01200537030A20012802DC01200537031220012802DC012005370319200120012802DC0141236A3602DC01200120003A005F20012802DC0120012D005F4180016A3A000020012802DC01411422003A000120012802DC0120012903C00137030220012802DC0120012903C80137030A20012802DC0120012802D001360212200120012802DC0141166A3602DC01200120033A005E20012802DC0120012D005E4180016A3A000020012802DC0120003A000120012802DC0120012903E00537030220012802DC0120012903E80537030A20012802DC0120012802F005360212200120012802DC0141166A3602DC01200120012802DC0141F801220010143703502001200220001015370348200120043A004720012001290348370338200128026C20012D0047410F7141E0006A3A0000200128026C2001290338423888423F8342407D3C0001200128026C200129033842308842FF01833C0002200128026C200129033842288842FF01833C0003200128026C200129033842208842FF01833C0004200128026C200129033842188842FF01833C0005200128026C200129033842108842FF01833C0006200128026C200129033842088842FF01833C0007200128026C200129033842FF01833C00082001200128026C41096A36026C2001200141106A412020022000101637030841CC09410B2001290308100B1A2001290308200555044041D8094129429A0110031A0B41810A411C429E01100A1A2001290398062105200141A0066A240020050B0BA40201004180080B9C025265776172643A2050617373696E67206E6F6E2D636C61696D2074786E005265776172643A2050617373696E67206F7574676F696E672074786E005265776172643A2050617373696E67207265776172642073657475702074786E0000000000596F75206D75737420776169742030303030303030207365636F6E647300616363756D756C61746F72006669727374006C617374005265776172643A20417373657274696F6E206661696C7572652E0062616C0078666C5F726577617264007265776172645F64726F707300656D69745F726573756C74005265776172643A20456D6974746564207265776172642074786E207375636365737366756C6C792E005265776172643A20456D697420726577617264206661696C65642E", "Flags": 1, "HookApiVersion": 0, "HookNamespace": "0000000000000000000000000000000000000000000000000000000000000000", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFBFFFFF" } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } }, { "Hook": { "CreateCode": "", "Flags": 1 } } ], "LastLedgerSequence": 1955551, "NetworkID": 21338, "Sequence": 52, "SigningPubKey": "03799CADC441958EF655C7CF893638E8DF9F157925C0AD98981DFC55BC323FCBCE", "TransactionType": "SetHook", "TxnSignature": "3045022100FD1802C00CBEBB5CEF19C30A0023EFE12C807413D946B8194583CC100F1D12D9022079D049CE87CBCA8D157F6D5E8C077BD14B8DEBFA7B40EC37E53D758A6906CC3D", "ctid": "C01DD6CD0000535A", "date": 1680778612000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "1008078901610", "Flags": 1114112, "OwnerCount": 2, "RegularKey": "rDADDYfnLvVY9FBnS8zFXhwYFHPuU5q2Sk", "Sequence": 53 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8", "PreviousFields": { "Balance": "1008086545630", "Sequence": 52 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Flags": 0, "Hooks": [ { "Hook": { "Flags": 0, "HookHash": "4E57C7FE7A84ABFA53CFE411DE9BA3420B94F55038BF238EBE1EB89095ABA4DE", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF" } }, { "Hook": { "Flags": 0, "HookHash": "C04E2043B656B578CB30E9FF465304AF402B7AFE38B6CE2D8CEFECDD669E3424", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFBFFFFF" } }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} } ], "OwnerNode": "0" }, "LedgerEntryType": "Hook", "LedgerIndex": "469372BEE8814EC52CA2AECB5374AB57A47B53627E3C0E2ACBE3FDC78DBFEC7B", "PreviousFields": { "Hooks": [ { "Hook": { "HookHash": "4E57C7FE7A84ABFA53CFE411DE9BA3420B94F55038BF238EBE1EB89095ABA4DE" } }, { "Hook": { "HookHash": "C04E2043B656B578CB30E9FF465304AF402B7AFE38B6CE2D8CEFECDD669E3424" } }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} }, { "Hook": {} } ] } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "12E9523791E48ABF1F8FF24771EF641F7E4BBE9D77BFA03AB1036517C041E569", "ledger_index": 1955533, "date": 1680778612000 } ================================================ FILE: src/containers/shared/components/Transaction/test/mock_data/SetHook2.json ================================================ { "tx": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Fee": "124531", "Flags": 0, "Hooks": [ { "Hook": { "CreateCode": "0061736D01000000011C0460057F7F7F7F7F017E60037F7F7E017E60027F7F017F60017F017E02230303656E76057472616365000003656E7606616363657074000103656E76025F6700020302010305030100020621057F0141B088040B7F0041A6080B7F004180080B7F0041B088040B7F004180080B07080104686F6F6B00030AC6800001C2800002017F017E230041106B220124002001200036020C418008411341940841124100220010001A20002000420010011A41012200200010021A200141106A240020020B0B2C01004180080B25224163636570742E633A2043616C6C65642E22004163636570742E633A2043616C6C65642E", "Flags": 1, "HookApiVersion": 0, "HookNamespace": "4FF9961269BF7630D32E15276569C94470174A5DA79FA567C0F62251AA9A36B9", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF", "HookParameters": [ { "HookParameter": { "HookParameterName": "6E616D6531", "HookParameterValue": "76616C756531" } } ] } } ], "LastLedgerSequence": 1716655, "NetworkID": 21338, "Sequence": 35, "SigningPubKey": "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", "TransactionType": "SetHook", "TxnSignature": "30450221009F547779E181441978A2E4F2C75774A07D6B654A40AC71E4D9FED65C342138390220710BD22DCB10FA609E0E85F8EC60355081921F7BC5001E826FC42A69FD3D8219", "ctid": "C01A319D0000535A", "date": 1680058650000 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Balance": "8095809079", "Flags": 0, "OwnerCount": 11, "Sequence": 36 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8", "PreviousFields": { "Balance": "8095933610", "Sequence": 35 } } }, { "ModifiedNode": { "FinalFields": { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", "Flags": 0, "Hooks": [ { "Hook": { "Flags": 0, "HookHash": "7FCD62CCB03D525CA18AA59714CA22EDB008E93BEB3ED963442EB873E5915AE0", "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF", "HookParameters": [ { "HookParameter": { "HookParameterName": "6E616D6531", "HookParameterValue": "76616C756531" } } ] } }, { "Hook": { "Flags": 0, "HookHash": "AF43D543F9D8EB03CF1A0A3C28D3264A691D9BFC23CFD40E639F3D20DD5167C5" } }, { "Hook": { "Flags": 0, "HookHash": "AF43D543F9D8EB03CF1A0A3C28D3264A691D9BFC23CFD40E639F3D20DD5167C5" } }, { "Hook": { "Flags": 0, "HookHash": "AF43D543F9D8EB03CF1A0A3C28D3264A691D9BFC23CFD40E639F3D20DD5167C5" } }, { "Hook": { "Flags": 0, "HookHash": "AF43D543F9D8EB03CF1A0A3C28D3264A691D9BFC23CFD40E639F3D20DD5167C5" } }, { "Hook": { "Flags": 0, "HookHash": "AF43D543F9D8EB03CF1A0A3C28D3264A691D9BFC23CFD40E639F3D20DD5167C5" } }, { "Hook": { "Flags": 0, "HookHash": "AF43D543F9D8EB03CF1A0A3C28D3264A691D9BFC23CFD40E639F3D20DD5167C5" } }, { "Hook": { "Flags": 0, "HookHash": "AF43D543F9D8EB03CF1A0A3C28D3264A691D9BFC23CFD40E639F3D20DD5167C5" } }, { "Hook": { "Flags": 0, "HookHash": "AF43D543F9D8EB03CF1A0A3C28D3264A691D9BFC23CFD40E639F3D20DD5167C5" } }, { "Hook": { "Flags": 0, "HookHash": "AF43D543F9D8EB03CF1A0A3C28D3264A691D9BFC23CFD40E639F3D20DD5167C5" } } ], "OwnerNode": "0" }, "LedgerEntryType": "Hook", "LedgerIndex": "469372BEE8814EC52CA2AECB5374AB57A47B53627E3C0E2ACBE3FDC78DBFEC7B" } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "044F061D19F2D24EC7CBEB84770910C72A972D2212BDF8E04FE5F47258B7F79E", "ledger_index": 1716637, "date": 1680058650000 } ================================================ FILE: src/containers/shared/components/Transaction/test/mock_data/TokenSwapPropose.json ================================================ { "tx": { "Account": "ratB3Rp7pcid4hzwSYTWiqWXYXFmWUFDv1", "AccountOther": "rPTScb8m3wq6r3Ys93Ec5at7LYDmWrtndi", "Amount": { "currency": "EUR", "issuer": "rnz5f1MFcgbVxzYhU5hUKbKquEJHJady5K", "value": "12" }, "AmountOther": { "currency": "USD", "issuer": "rnz5f1MFcgbVxzYhU5hUKbKquEJHJady5K", "value": "33" }, "Fee": "10", "Flags": 2147483648, "Sequence": 5, "SigningPubKey": "ED2D7565F8E1432940E5B3BEB4562DE99DB880323B5C8A178376D5B481A7DB6E1C", "TransactionType": "TokenSwapPropose", "TxnSignature": "153E5473EB70B6E073F22A8281AE1E5593C96369CACDC1E2DB9FA54C5B3EC7C07F458061858DD7AE061198E7CB8BF56A7034F102016DFDB5F38EF4C28466B308", "ctid": "C000005800000000", "date": 749136066 }, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Flags": 0, "Owner": "ratB3Rp7pcid4hzwSYTWiqWXYXFmWUFDv1", "RootIndex": "547794AC3EA3084040EF8EF8BB8927E1D9BC52A6EC0F03E31B32C11260FD7D51" }, "LedgerEntryType": "DirectoryNode", "LedgerIndex": "547794AC3EA3084040EF8EF8BB8927E1D9BC52A6EC0F03E31B32C11260FD7D51" } }, { "ModifiedNode": { "FinalFields": { "Account": "ratB3Rp7pcid4hzwSYTWiqWXYXFmWUFDv1", "Balance": "49999966", "Flags": 0, "OwnerCount": 3, "Sequence": 6 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "605F4818F631C60C34A29650C2783B604CDB7D00663B0C68F1A6A7775680FDF2", "PreviousFields": { "Balance": "49999976", "OwnerCount": 2, "Sequence": 5 }, "PreviousTxnID": "B25FA4890F5BFFE3A2DB62050A2ABE4792D717DF9131C7BEAF917F70CD94283A", "PreviousTxnLgrSeq": 15 } }, { "CreatedNode": { "LedgerEntryType": "TokenSwap", "LedgerIndex": "BBEA4CB206489C14E428B8CDF8CBC931E380DC66450036BD4D6C926C2CC23811", "NewFields": { "Account": "ratB3Rp7pcid4hzwSYTWiqWXYXFmWUFDv1", "AccountOther": "rPTScb8m3wq6r3Ys93Ec5at7LYDmWrtndi", "Amount": { "currency": "EUR", "issuer": "rnz5f1MFcgbVxzYhU5hUKbKquEJHJady5K", "value": "12" }, "AmountOther": { "currency": "USD", "issuer": "rnz5f1MFcgbVxzYhU5hUKbKquEJHJady5K", "value": "33" }, "TokenSwapId": "5" } } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS" }, "hash": "F84CCA4C6948B0D068A2D97A8CA92F557CE3615D98F6E90540369D4A4F122D0E", "inLedger": 88, "ledger_index": 88 } ================================================ FILE: src/containers/shared/components/Transaction/types.ts ================================================ import { FC } from 'react' import type { Memo } from 'xrpl/dist/npm/models/common' import type { TransactionMetadata } from 'xrpl' export enum TransactionCategory { DEX = 'DEX', ACCOUNT = 'ACCOUNT', PAYMENT = 'PAYMENT', NFT = 'NFT', XCHAIN = 'XCHAIN', MPT = 'MPT', PSEUDO = 'PSEUDO', OTHER = 'OTHER', } export enum TransactionAction { CREATE = 'CREATE', CANCEL = 'CANCEL', FINISH = 'FINISH', MODIFY = 'MODIFY', SEND = 'SEND', UNKNOWN = 'UNKNOWN', } export interface TransactionTableDetailProps { instructions: I } export type TransactionTableDetailComponent = FC export interface TransactionDescriptionProps { data: { tx: T meta: M } } export type TransactionDescriptionComponent = FC export interface TransactionSimpleProps { data: { instructions: I & { date: string } } } export type TransactionSimpleComponent = FC export type TransactionParser = (tx: T, meta: any) => I export interface TransactionMapping { Description?: TransactionDescriptionComponent Simple: TransactionSimpleComponent TableDetail?: TransactionTableDetailComponent parser?: TransactionParser action: TransactionAction category: TransactionCategory } export interface TransactionCommonFields { date: string Account: string TransactionType: string Fee: string Sequence: number AccountTxnID?: string Flags?: number LastLedgerSequence?: number Memos?: Memo[] Signers?: object[] SourceTag?: number SignerPubKey?: string TicketSequence?: number TxnSignature?: string } ================================================ FILE: src/containers/shared/components/Transaction/utils/vaultUtils.ts ================================================ import { getVault, getLoanBroker } from '../../../../../rippled/lib/rippled' import { formatAsset } from '../../../../../rippled/lib/txSummary/formatAmount' /** * Fetches Vault information and returns the Asset field * @param rippledSocket - The rippled WebSocket connection * @param vaultId - The VaultID to fetch * @returns Promise - The Asset field from the Vault object */ export async function getVaultAsset(rippledSocket: any, vaultId: string) { try { const vault = await getVault(rippledSocket, vaultId) return formatAsset(vault.Asset) } catch (error) { // Return XRP as fallback to maintain backward compatibility return { currency: 'XRP' } } } /** * Fetches LoanBroker information, then Vault information, and returns the Asset field * @param rippledSocket - The rippled WebSocket connection * @param loanBrokerId - The LoanBrokerID to fetch * @returns Promise - The Asset field from the associated Vault object */ export async function getVaultAssetFromLoanBroker( rippledSocket: any, loanBrokerId: string, ) { try { const loanBroker = await getLoanBroker(rippledSocket, loanBrokerId) const vaultId = loanBroker.VaultID if (!vaultId) { throw new Error('LoanBroker does not have a VaultID') } return await getVaultAsset(rippledSocket, vaultId) } catch (error) { // Return XRP as fallback to maintain backward compatibility return { currency: 'XRP' } } } ================================================ FILE: src/containers/shared/components/TransactionActionIcon/TransactionActionIcon.tsx ================================================ import { ReactElement } from 'react' import { TransactionAction } from '../Transaction/types' import { getAction } from '../Transaction' import TransactionCancelIcon from './TransactionCancelIcon.svg' import TransactionCreateIcon from './TransactionCreateIcon.svg' import TransactionFinishIcon from './TransactionFinishIcon.svg' import TransactionModifyIcon from './TransactionModifyIcon.svg' import TransactionSendIcon from './TransactionSendIcon.svg' import TransactionUnknownIcon from './TransactionUnknownIcon.svg' export type TransactionActionIconProps = | { action: TransactionAction; type?: never } | { action?: never; type: string } export const TransactionActionIcon = ({ action, type, }: TransactionActionIconProps) => { const icons: Record = { [TransactionAction.CANCEL]: , [TransactionAction.CREATE]: , [TransactionAction.FINISH]: , [TransactionAction.MODIFY]: , [TransactionAction.SEND]: , [TransactionAction.UNKNOWN]: , } let icon = type && icons[getAction(type)] if (action) { icon = icons[action] } return icon || icons[TransactionAction.UNKNOWN] } ================================================ FILE: src/containers/shared/components/TransactionActionIcon/test/TransactionActionIcon.test.tsx ================================================ import { render } from '@testing-library/react' import { TransactionActionIcon } from '../TransactionActionIcon' import { TransactionAction } from '../../Transaction/types' describe('TransactionActionIcon', () => { it('renders with an action specified ', () => { const { container } = render( , ) // SVG should be rendered expect(container.querySelector('svg')).toBeInTheDocument() }) it('renders with type specified ', () => { const { container } = render() expect(container.querySelector('svg')).toBeInTheDocument() }) it('renders with type specified that is not defined', () => { const { container } = render() expect(container.querySelector('svg')).toBeInTheDocument() }) it('renders with no action or type', () => { // @ts-expect-error const { container } = render() expect(container.querySelector('svg')).toBeInTheDocument() }) }) ================================================ FILE: src/containers/shared/components/TransactionTable/TransactionTable.tsx ================================================ import { FunctionComponent, HTMLAttributes, MouseEventHandler } from 'react' import { useTranslation } from 'react-i18next' import { TransactionTableRow } from './TransactionTableRow' import { Loader } from '../Loader' import { LoadMoreButton } from '../../LoadMoreButton' import './styles.scss' export type TransactionTableProps = HTMLAttributes & { transactions?: any[] emptyMessage?: string loading: boolean onLoadMore?: MouseEventHandler hasAdditionalResults?: boolean hasTokensColumn?: boolean hasHashColumn?: boolean } type TransactionTableComponent = FunctionComponent & {} export const TransactionTable: TransactionTableComponent = ({ hasAdditionalResults = false, emptyMessage, loading = false, onLoadMore = () => {}, transactions = [], hasTokensColumn, hasHashColumn, }: TransactionTableProps) => { const { t } = useTranslation() const renderListItem = (tx: any) => ( ) const renderLoadMore = () => hasAdditionalResults && return ( <>
    1. {hasHashColumn &&
      {t('tx_hash')}
      } {hasTokensColumn && (
      {t('token')}
      )}
      {t('account')}
      {t('transaction_type')}
      {t('status')}
      {t('transactions.date_header')}
    2. {!transactions || (!loading && transactions.length === 0) ? (
      {emptyMessage || t('no_transactions_message')}
      ) : ( transactions.map(renderListItem) )}
    {loading ? : renderLoadMore()} ) } ================================================ FILE: src/containers/shared/components/TransactionTable/TransactionTableRow.tsx ================================================ import { TxLabel } from '../TxLabel' import { TxStatus } from '../TxStatus' import { TxDetails } from '../TxDetails' import { localizeDate, shortenTxHash, DATE_OPTIONS_NUMERIC } from '../../utils' import './styles.scss' import { useLanguage } from '../../hooks' import TxToken from '../TxToken' import { RouteLink } from '../../routing' import { TRANSACTION_ROUTE } from '../../../App/routes' export interface Props { tx: any hasTokensColumn?: boolean hasHashColumn?: boolean } export const TransactionTableRow = ({ tx, hasTokensColumn, hasHashColumn, }: Props) => { const language = useLanguage() const success = tx.result === 'tesSUCCESS' const date = localizeDate(new Date(tx.date), language, DATE_OPTIONS_NUMERIC) return (
  • {hasHashColumn && (
    {shortenTxHash(tx.hash)}
    )} {hasTokensColumn && (
    )}
    {tx.account}
    {date}
    {tx.details && (
    )}
  • ) } ================================================ FILE: src/containers/shared/components/TransactionTable/styles.scss ================================================ @use 'sass:color'; @use '../../../shared/css/variables' as *; .transaction-table { width: 100%; padding: 0; margin: 0; font-size: 12px; line-height: 24px; list-style: none; table-layout: fixed; @include for-size(desktop-up) { font-size: 14px; } .upper { display: flex; align-items: stretch; padding: 12px 16px; color: $white; font-size: 14px; gap: 0 12px; @include for-size(tablet-landscape-up) { padding: 12px 32px; } } .col { display: flex; flex: 1; align-items: center; letter-spacing: 0; @extend %truncate; } .col-type { flex: 2; @include semibold; @include for-size(desktop-up) { width: 230px; } } .col-amount { flex: 2; @include medium; } .col-token { width: 40px; } .col-status { width: 50px; @include regular; .status { display: none; } @include for-size(tablet-landscape-up) { .status { display: initial; } } @include for-size(desktop-up) { width: auto; flex: 2 2; } } .col-hash { flex: 2; color: $green; @include medium; } .col-account { display: none; flex: 3; .upper & { color: $black-70; @include medium; } @include for-size(tablet-landscape-up) { display: inline-block; } } .col-date { overflow: visible; flex: 0 0 auto; justify-content: right; text-overflow: clip; white-space: normal; @include medium; @include for-size(desktop-up) { width: 185px; // We know the width because dates can only be so big flex: none; } } .details { min-height: 30px; padding: 32px; background: rgba($black-70, 0.5); color: $black-40; font-size: 10px; line-height: 12px; text-transform: uppercase; @include regular; @include for-size(tablet-landscape-up) { font-size: 12px; } &:empty { min-height: 0; padding: 0; margin-bottom: 0; } .tx-status { margin-bottom: 5px; } .currency, .account, .case-sensitive { text-transform: none; } span { display: inline-block; margin-right: 5px; &.no-space { margin-right: 0; } span { margin: 0; } } .label { @include bold; } small { margin-left: 5px; } .partial-payment, .closed, .flag, .unsetregularkey { font-style: italic; text-transform: none; } .key, .domain, .account, .email-hash, .message-key { text-transform: none; } .partial-payment, .closed { color: $red-dark; } .flag { color: $blue-purple-30; } .condition, .fulfillment { word-break: break-all; } } .transaction-li { position: relative; display: block; border-bottom: solid 1px $black-70; line-height: 20px; .transaction-address { overflow: hidden; color: $white; text-overflow: ellipsis; } @include for-size(tablet-landscape-up) { flex-direction: row; padding: 0; } &.fail { opacity: 0.8; } &:hover { .upper { background-color: rgba($black-70, 0.7); } } } .transaction-li.transaction-li-header { display: flex; padding: 0 16px 18px; font-size: 10px; gap: 0 12px; text-transform: uppercase; @include for-size(tablet-landscape-up) { padding: 12px 32px; } &:hover { background-color: inherit; } .col { color: $black-50; @include bold; } } } .empty-transactions-message { padding: 16px; color: $black-40; font-size: 16px; text-align: center; } .load-more-btn { display: block; margin: 10px auto; outline: inherit; @include bold; } ================================================ FILE: src/containers/shared/components/TransactionTable/test/TransactionTable.test.js ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router' import { QueryClientProvider } from 'react-query' import { TransactionTable } from '../TransactionTable' import i18n from '../../../../../i18n/testConfig' import mockTx from './mockTransactions.json' import { queryClient } from '../../../QueryClient' const loadMore = jest.fn() describe('Transaction Table container', () => { const renderTransactionTable = ( transactions = [], emptyMessage = undefined, loading = false, onLoadMore = loadMore, hasAdditionalResults = false, ) => render( , ) it('renders without crashing', () => { renderTransactionTable() }) it('renders multi-page content', () => { const { container } = renderTransactionTable( mockTx.transactions, undefined, false, loadMore, false, ) expect(container.querySelectorAll('.transaction-table').length).toBe(1) expect(container.querySelectorAll('.upper').length).toBe(3) expect(container.querySelectorAll('.details').length).toBe(2) expect(container.querySelectorAll('.load-more-btn').length).toEqual(0) }) it('renders single-page content', () => { const { container } = renderTransactionTable( mockTx.transactions, undefined, false, loadMore, true, ) expect(container.querySelectorAll('.transaction-table').length).toBe(1) expect(container.querySelectorAll('.upper').length).toBe(3) expect(container.querySelectorAll('.details').length).toBe(2) expect(container.querySelectorAll('.load-more-btn').length).toEqual(1) }) it('renders without details', () => { const { container } = renderTransactionTable( mockTx.transactions, undefined, false, loadMore, true, ) expect(container.querySelectorAll('.transaction-table').length).toBe(1) expect(container.querySelectorAll('.upper').length).toBe(3) expect(container.querySelectorAll('.details').length).toBe(2) }) it('renders loader', () => { const { container } = renderTransactionTable( mockTx.transactions, undefined, true, loadMore, false, ) expect(container.querySelectorAll('.loader').length).toBe(1) }) it('renders empty message', () => { const { container } = renderTransactionTable( [], undefined, false, loadMore, false, ) expect( container.querySelectorAll('.empty-transactions-message').length, ).toBe(1) }) }) ================================================ FILE: src/containers/shared/components/TransactionTable/test/mockTransactions.json ================================================ { "transactions": [ { "hash": "3247F0D70D9F241E58AA354B18B58175A466D16937CB3FE30FCD8D4027FAD850", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rENDnFwR3CPvrsPjD9XXeqVoXeVt2CpPWX", "index": 11, "fee": 0.0105, "sequence": 23906569, "date": "2019-02-08T15:42:11Z", "details": { "instructions": { "gets": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 3865.40088 }, "pays": { "currency": "XRP", "amount": 13450 }, "price": "0.287390", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" } } } }, { "hash": "3A23B3813BC69287085E2E617AD7647FE2ECD21D1965DFE559E286EAFD946F5F", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 4, "fee": 0.000012, "sequence": 2068714, "date": "2019-02-05T21:37:12Z", "details": { "instructions": { "gets": { "currency": "XRP", "amount": 6262.878992 }, "pays": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B", "amount": 1878.6976023515 }, "price": "0.299973", "firstCurrency": { "currency": "XRP" }, "secondCurrency": { "currency": "USD", "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" }, "cancel": 2068713 } } }, { "hash": "14B9395AEEE9E852643F594CB2A2EBEFEB8AA30F6BBC56BA5032F25E493A16F4", "type": "OfferCreate", "result": "tesSUCCESS", "account": "rHj9CUz5Nkz57dzBiymKyxCY8UjppjwPAZ", "index": 4, "fee": 0.000012, "sequence": 2068713, "date": "2019-02-05T21:36:50Z" } ] } ================================================ FILE: src/containers/shared/components/TxDetails.tsx ================================================ import { transactionTypes } from './Transaction' interface Props { instructions: any type: string } export const TxDetails = ({ type = '', instructions }: Props) => { // Locate the component for detail row that is unique per TransactionType. const TableDetail = transactionTypes[type]?.TableDetail if (TableDetail) { return } return null } ================================================ FILE: src/containers/shared/components/TxLabel.tsx ================================================ import { useTranslation } from 'react-i18next' import '../css/txlabel.scss' import { TransactionActionIcon } from './TransactionActionIcon/TransactionActionIcon' import { getCategory } from './Transaction' interface Props { type: string } export const TxLabel = (props: Props) => { const { t } = useTranslation() const { type } = props return (
    {t(`transaction_type_name`, { context: type, defaultValue: type })}
    ) } ================================================ FILE: src/containers/shared/components/TxStatus.tsx ================================================ /* eslint-disable react/no-unstable-nested-components */ // TODO: fix the linter issues import { useTranslation } from 'react-i18next' import SuccessIcon from '../images/success.svg' import FailIcon from '../images/ic_fail.svg' import { SUCCESSFUL_TRANSACTION } from '../transactionUtils' import '../css/txstatus.scss' export interface TxStatusProps { shorthand?: boolean status: string } export const TxStatus = ({ shorthand = false, status }: TxStatusProps) => { const { t } = useTranslation() const success = status === SUCCESSFUL_TRANSACTION const className = success ? 'success' : 'fail' const wrapperClassName = `tx-status tx-result ${className}` const Plain = ({ title, children }: any) => ( {children} ) const Success = () => ( {!shorthand && {t('success')}} ) const Fail = () => { const content = ( <> {!shorthand && {t('fail')}} {status} ) return shorthand ? ( {content} ) : ( {content} ) } return success ? : } ================================================ FILE: src/containers/shared/components/TxToken.tsx ================================================ import { Trans } from 'react-i18next' import Currency from './Currency' import '../css/txlabel.scss' interface Props { tx: any } // TODO: We should consider moving this logic to each individual parser. This would give us more customizability. function getTokenPair( type: string, fee: number, amount: { currency: string; amount: number }, amount2: { currency: string; amount: number }, ) { if ( type === 'AMMWithdraw' || type === 'AMMDeposit' || type === 'AMMCreate' || type === 'Payment' ) { const first = amount?.amount && amount.amount !== fee ? ( ) : undefined const second = amount2?.amount && amount2.amount !== fee ? ( ) : undefined if (first && second) { return ( ) } return first || second } return 'LP' } const TxToken = (props: Props) => { const { tx } = props return (
    {getTokenPair( tx.type, tx.fee, tx.details?.instructions?.amount, tx.details?.instructions?.amount2, )}
    ) } export default TxToken ================================================ FILE: src/containers/shared/components/VHSValidators/VHSValidatorsContext.tsx ================================================ import { contextFactory } from '../../helpers/contextFactory' import { VHSValidatorsHookResult } from './types' const [VHSValidatorsContext, useVHSValidators] = contextFactory({ hook: 'useVHSValidators', provider: 'VHSValidatorsProvider', }) export { VHSValidatorsContext, useVHSValidators } ================================================ FILE: src/containers/shared/components/VHSValidators/VHSValidatorsProvider.tsx ================================================ import { FC, PropsWithChildren, useContext } from 'react' import { useQuery } from 'react-query' import axios from 'axios' import { VHSValidatorsContext } from './VHSValidatorsContext' import { ValidatorResponse } from '../../vhsTypes' import Log from '../../log' import NetworkContext from '../../NetworkContext' import { VHSValidatorsHookResult } from './types' import { FETCH_INTERVAL_ERROR_MILLIS, FETCH_INTERVAL_MILLIS } from '../../utils' export const VHSValidatorsProvider: FC = ({ children }) => { const network = useContext(NetworkContext) const { data: value } = useQuery( ['fetchValidatorsData'], () => fetchVHSData(), { refetchInterval: (returnedData, _) => returnedData == null ? FETCH_INTERVAL_ERROR_MILLIS : FETCH_INTERVAL_MILLIS, refetchOnMount: true, enabled: process.env.VITE_ENVIRONMENT !== 'custom' || !!network, initialData: { unl: undefined, validators: undefined, }, }, ) function fetchVHSData(): Promise { const url = `${process.env.VITE_DATA_URL}/validators/${network}` return axios .get(url) .then((resp) => resp.data.validators) .then((validators) => { const newValidatorList: Record = {} validators.forEach((v: ValidatorResponse) => { newValidatorList[v.signing_key] = v }) return { validators: newValidatorList, unl: validators .filter((d: ValidatorResponse) => Boolean(d.unl)) .map((d: ValidatorResponse) => d.signing_key), } }) .catch((e) => { Log.error(e) return { unl: undefined, validators: undefined, } }) } return ( {children} ) } ================================================ FILE: src/containers/shared/components/VHSValidators/index.ts ================================================ export * from './types' export * from './VHSValidatorsContext' export * from './VHSValidatorsProvider' ================================================ FILE: src/containers/shared/components/VHSValidators/types.ts ================================================ import { ValidatorResponse } from '../../vhsTypes' export interface VHSValidatorsHookResult { validators?: Record unl?: string[] } ================================================ FILE: src/containers/shared/components/test/Account.test.tsx ================================================ import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router' import { cleanup, render, screen } from '@testing-library/react' import i18n from '../../../../i18n/testConfig' import { Account } from '../Account' const renderComponent = (component: JSX.Element) => render( {component} , ) const ACCOUNT = 'rHWcuuZoFvDS6gNbmHSdpb7u1hZzxvCoMt' const ACCOUNT_PLUS_DT = `${ACCOUNT}:381702` describe('Account', () => { afterEach(cleanup) it('should render with a link', () => { renderComponent() const element = screen.getByTestId('account') expect(element).toHaveClass('account') expect(element).toHaveTextContent(ACCOUNT) expect(element).toHaveAttribute('href', `/accounts/${ACCOUNT}`) expect(element).toHaveAttribute('title', ACCOUNT) expect(screen.queryByTestId('dt')).toBeNull() }) it('should render without a link', () => { renderComponent() const element = screen.getByTestId('account') expect(element).toHaveTextContent(ACCOUNT) expect(element).not.toHaveAttribute('href') expect(element).toHaveAttribute('title', ACCOUNT) expect(screen.queryByTestId('dt')).toBeNull() }) it('should render with a destination tag', () => { renderComponent() const element = screen.getByTestId('account') expect(element).toHaveClass('account') expect(element).toHaveTextContent(ACCOUNT) expect(element).toHaveAttribute('href', `/accounts/${ACCOUNT}`) expect(element).toHaveAttribute('title', ACCOUNT) expect(screen.queryByTestId('dt')).toHaveTextContent(':381702') }) it('should render with a destination tag and no link', () => { renderComponent() const element = screen.getByTestId('account') expect(element).toHaveClass('account') expect(element).toHaveTextContent(ACCOUNT) expect(element).not.toHaveAttribute('href') expect(element).toHaveAttribute('title', ACCOUNT) expect(screen.queryByTestId('dt')).toHaveTextContent(':381702') }) it('should render with a destination tag supplied separately', () => { renderComponent() const element = screen.getByTestId('account') expect(element).toHaveClass('account') expect(element).toHaveTextContent(ACCOUNT) expect(element).toHaveAttribute('href', `/accounts/${ACCOUNT}`) expect(element).toHaveAttribute('title', ACCOUNT) expect(screen.queryByTestId('dt')).toHaveTextContent(':123') }) it('should render with a destination tag supplied separately and no link', () => { renderComponent() const element = screen.getByTestId('account') expect(element).toHaveTextContent(ACCOUNT) expect(element).not.toHaveAttribute('href') expect(element).toHaveAttribute('title', ACCOUNT) expect(screen.queryByTestId('dt')).toHaveTextContent(':123') }) it('should render with displayText', () => { renderComponent( , ) const element = screen.getByTestId('account') expect(element).toHaveClass('account') expect(element).toHaveTextContent('Custom Display Name') expect(element).toHaveAttribute('href', `/accounts/${ACCOUNT}`) expect(element).toHaveAttribute('title', ACCOUNT) }) it('should render with displayText and no link', () => { renderComponent( , ) const element = screen.getByTestId('account') expect(element).toHaveTextContent('Custom Display Name') expect(element).not.toHaveAttribute('href') expect(element).toHaveAttribute('title', ACCOUNT) }) }) ================================================ FILE: src/containers/shared/components/test/Amount.test.tsx ================================================ import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router' import { cleanup, render, screen } from '@testing-library/react' import { useQuery } from 'react-query' import { Amount } from '../Amount' import i18n from '../../../../i18n/testConfig' jest.mock('react-query', () => ({ ...jest.requireActual('react-query'), useQuery: jest.fn(), })) describe('Amount', () => { afterEach(cleanup) const renderComponent = (component: JSX.Element) => render( {component} , ) it('handles currency codes that are 3 characters ', () => { const value = { amount: 95.13258522535791, currency: 'DYM', issuer: 'rGwUWgN5BEg3QGNY3RX2HfYowjUTZdid3E', } renderComponent() expect(screen.getByTestId('currency')).toHaveTextContent( 'DYM.rGwUWgN5BEg3QGNY3RX2HfYowjUTZdid3E', ) expect(screen.getByTestId('amount-localized')).toHaveTextContent( '95.13258523', ) }) it('handles currency codes with standard symbols', () => { const value = { amount: 4986.30908732758, currency: 'JPY', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', } renderComponent() expect(screen.getByTestId('currency')).toHaveTextContent( 'JPY.rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', ) expect(screen.getByTestId('amount-localized')).toHaveTextContent( '¥4,986.30908733', ) }) it('handles currency codes with standard symbols', () => { const value2 = { amount: 78.5098894970562, currency: 'GBP', issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', } renderComponent() expect(screen.getByTestId('currency')).toHaveTextContent( 'GBP.rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', ) expect(screen.getByTestId('amount-localized')).toHaveTextContent( '£78.5098895', ) }) it('handles currency codes that are 4 characters ', () => { const value = { amount: 95.13258522535791, currency: 'WOOT', issuer: 'rGwUWgN5BEg3QGNY3RX2HfYowjUTZdid3E', } renderComponent() expect(screen.getByTestId('currency')).toHaveTextContent( 'WOOT.rGwUWgN5BEg3QGNY3RX2HfYowjUTZdid3E', ) expect(screen.getByTestId('amount-localized')).toHaveTextContent( '95.13258523', ) }) it('handles currency codes that are 40 characters ', () => { const value = { amount: 3.692385398244198, currency: '0158415500000000C1F76FF6ECB0BAC600000000', issuer: 'rrh7rf1gV2pXAoqA8oYbpHd8TKv5ZQeo67', } renderComponent() expect(screen.getByTestId('currency')).toHaveTextContent( 'XAUÁ÷oöì°ºÆ.rrh7rf1gV2pXAoqA8oYbpHd8TKv5ZQeo67', ) expect(screen.getByTestId('amount-localized')).toHaveTextContent( '3.6923854', ) }) it('handles currency codes that are 40 characters and hidden issuer', () => { const value = { amount: 3.692385398244198, currency: '0158415500000000C1F76FF6ECB0BAC600000000', issuer: 'rrh7rf1gV2pXAoqA8oYbpHd8TKv5ZQeo67', } renderComponent() expect(screen.getByTestId('currency')).toHaveTextContent('XAUÁ÷oöì°ºÆ') expect(screen.getByTestId('amount-localized')).toHaveTextContent( '3.6923854', ) }) it('handles XRP-style amounts', () => { const value = '1000' renderComponent() expect(screen.getByTestId('currency')).toHaveTextContent('XRP') expect(screen.getByTestId('amount-localized')).toHaveTextContent( '\uE9000.001', ) }) it('handles modifier', () => { const value = '9000' renderComponent() expect(screen.getByTestId('currency')).toHaveTextContent('XRP') expect(screen.getByTestId('amount-localized')).toHaveTextContent( '+\uE9000.009', ) }) it('handles MPT amount', async () => { const data = { issuer: 'rL2LzUhsBJMqsaVCXVvzedPjePbjVzBCC', assetScale: 3, maxAmt: '100000000', outstandingAmt: '1043001', sequence: 2447, metadata: '{"name":"US Treasury Bill Token","symbol":"USTBT","decimals":2,"totalSupply":1000000,"issuer":"US Treasury","issueDate":"2024-03-25","maturityDate":"2025-03-25","faceValue":"1000","interestRate":"2.5","interestFrequency":"Quarterly","collateral":"US Government","jurisdiction":"United States","regulatoryCompliance":"SEC Regulations","securityType":"Treasury Bill","external_url":"https://example.com/t-bill-token-metadata.json"}', flags: [], } // @ts-ignore useQuery.mockImplementation(() => ({ data, })) const value = { amount: '1043001', currency: '0000098F03B3BCE934EE8CAA1DF25A42032388361B9E5A65', isMPT: true, } renderComponent() screen.debug() expect(screen.getByTestId('amount-localized')).toHaveTextContent( '1,043.001', ) }) }) ================================================ FILE: src/containers/shared/components/test/Currency.test.tsx ================================================ import { BrowserRouter } from 'react-router' import { cleanup, render, screen } from '@testing-library/react' import Currency from '../Currency' describe('Currency', () => { afterEach(cleanup) it('handles currency codes that are 3 characters ', () => { render() const element = screen.getByTestId('currency') expect(element).toHaveClass('currency') expect(element).toHaveTextContent('BTC') }) it('handles currency codes that are 4 characters ', () => { render() const element = screen.getByTestId('currency') expect(element).toHaveClass('currency') expect(element).toHaveTextContent('WOOT') }) it('handles currency codes that are 4 characters and include issuer ', () => { render( , ) const element = screen.getByTestId('currency') expect(element).toHaveClass('currency') expect(element).toHaveTextContent('USD.davi') }) it('handles currency codes that are 40 characters ', () => { render() const element = screen.getByTestId('currency') expect(element).toHaveClass('currency') expect(element).toHaveTextContent('XMETA') }) it('handles currency codes that are 40 characters and issuer ', () => { render( , ) const elements = screen.getAllByTestId('currency') expect(elements).toHaveLength(2) expect(elements[0]).toHaveClass('currency') expect(elements[1]).toHaveClass('currency') const meta = elements[0] const usd = elements[1] expect(meta).toHaveTextContent('XMETA.r3XwJ1hr1PtbRvbhuUkybV6tmYzzA11WcB') expect(meta).toHaveAttribute( 'href', '/token/584D455441000000000000000000000000000000.r3XwJ1hr1PtbRvbhuUkybV6tmYzzA11WcB', ) expect(usd).toHaveTextContent('USD.rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq') expect(usd).toHaveAttribute( 'href', '/token/USD.rhub8VRN55s94qWKDv6jmDy1pUykJzF3wq', ) }) it('handle non-standard currency decoded to equal or fewer than 3 characters', () => { render() const element = screen.getByTestId('currency') expect(element).toHaveClass('currency') expect(element).toHaveTextContent('FakeXRP') }) it('displays the XRP symbol when rendering XRP', () => { render() const element = screen.getByTestId('currency') expect(element).toHaveClass('currency') expect(element).toHaveTextContent('\uE900 XRP') }) it('handles MPT ID ', () => { render( , ) const mpt = screen.getByTestId('currency') expect(mpt).toHaveTextContent( '00000BDE5B4F868ECE457207E2C1750065987730B8839E0D', ) expect(mpt).toHaveAttribute( 'href', '/mpt/00000BDE5B4F868ECE457207E2C1750065987730B8839E0D', ) }) }) ================================================ FILE: src/containers/shared/components/test/DomainLink.test.tsx ================================================ import { render, screen } from '@testing-library/react' import DomainLink from '../DomainLink' describe('DomainLink', () => { it('handles domain link with only domain parameter', () => { render() const link = screen.getByRole('link') expect(link).toHaveClass('domain') expect(link).toHaveTextContent('bithomp.com') expect(link).toHaveAttribute('href', 'https://bithomp.com') }) it('handles domain link with decoded domain parameter', () => { render() const link = screen.getByRole('link') expect(link).toHaveClass('domain') expect(link).toHaveTextContent('sologenic.com') expect(link).toHaveAttribute('href', 'https://sologenic.com') }) it('handles domain link with domain parameter and classname', () => { render() const link = screen.getByRole('link') expect(link).toHaveClass('domain test') expect(link).toHaveTextContent('bithomp.com') expect(link).toHaveAttribute('href', 'https://bithomp.com') }) it('handles domain link with decoded domain parameter and classname', () => { render( , ) const link = screen.getByRole('link') expect(link).toHaveClass('domain test') expect(link).toHaveTextContent('sologenic.com') expect(link).toHaveAttribute('href', 'https://sologenic.com') }) it('handles domain link with domain provided in HEX-encoded format', () => { const url = 'https://example.com' const urlInHex = '68747470733A2F2F6578616D706C652E636F6D' render() const link = screen.getByRole('link') expect(link).toHaveClass('domain') expect(link).toHaveTextContent(url) expect(link).toHaveAttribute('href', url) }) it('handles IPFS domain link', () => { render() const link = screen.getByRole('link') expect(link).toHaveClass('domain') expect(link).toHaveTextContent('ipfs://random/metadata.json') expect(link).toHaveAttribute( 'href', 'https://ipfs.io/ipfs/random/metadata.json', ) }) it('handles domain link with protocol removal', () => { const url = 'https://example.com/' render() const link = screen.getByRole('link') expect(link).toHaveClass('domain') expect(link).toHaveTextContent('example.com') expect(link).toHaveAttribute('href', 'https://example.com/') }) it('handles domain link with displayDomain', () => { render( , ) const link = screen.getByRole('link') expect(link).toHaveClass('domain') expect(link).toHaveTextContent('Custom Display Text') expect(link).toHaveAttribute('href', 'https://bithomp.com') }) }) ================================================ FILE: src/containers/shared/components/test/Loader.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../i18n/testConfig' import { Loader } from '../Loader' describe('Loader', () => { it('renders correctly ', () => { const { container } = render( , ) expect(container.querySelectorAll('.loader')).toHaveLength(1) }) }) ================================================ FILE: src/containers/shared/components/test/NFTokenLink.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { BrowserRouter } from 'react-router' import { NFTokenLink } from '../NFTokenLink' const renderComponent = (component: JSX.Element) => render({component}) const TOKEN_ID = '000827103B94ECBB7BF0A0A6ED62B3607801A27B65F4B11F5E1D5E8A3F3D8E9A' describe('NFTokenLink', () => { it('should render with full tokenID', () => { renderComponent() const link = screen.getByRole('link') expect(link).toHaveTextContent(TOKEN_ID) expect(link).toHaveAttribute('href', `/nft/${TOKEN_ID}`) expect(link).toHaveAttribute('title', TOKEN_ID) }) it('should render with shortTokenID when provided', () => { const shortID = '000827...3D8E9A' renderComponent() const link = screen.getByRole('link') expect(link).toHaveTextContent(shortID) expect(link).toHaveAttribute('href', `/nft/${TOKEN_ID}`) expect(link).toHaveAttribute('title', TOKEN_ID) }) it('should use full tokenID when shortTokenID is empty string', () => { renderComponent() const link = screen.getByRole('link') expect(link).toHaveTextContent(TOKEN_ID) expect(link).toHaveAttribute('href', `/nft/${TOKEN_ID}`) expect(link).toHaveAttribute('title', TOKEN_ID) }) }) ================================================ FILE: src/containers/shared/components/test/TxLabel.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { TxLabel } from '../TxLabel' import i18n from '../../../../i18n/testConfigEnglish' describe('TxLabel', () => { const renderTxLabel = (type: string) => render( , ) it('renders with an action specified ', () => { const { container, unmount } = renderTxLabel('Payment') expect(container.querySelector('.tx-category-PAYMENT')).toBeInTheDocument() expect(container.querySelector('svg')).toBeInTheDocument() expect(screen.getByText('Payment')).toBeInTheDocument() unmount() const { container: container2 } = renderTxLabel('OfferCancel') expect(container2.querySelector('.tx-category-DEX')).toBeInTheDocument() expect(container2.querySelector('svg')).toBeInTheDocument() expect(screen.getByText('Offer Cancel')).toBeInTheDocument() }) it('renders with type that is not defined', () => { const { container } = renderTxLabel('WooCreate') expect(container.querySelector('.tx-category-OTHER')).toBeInTheDocument() expect(container.querySelector('svg')).toBeInTheDocument() expect(screen.getByText('WooCreate')).toBeInTheDocument() }) }) ================================================ FILE: src/containers/shared/components/test/TxStatus.test.tsx ================================================ import { render, screen } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { MemoryRouter } from 'react-router' import i18n from '../../../../i18n/testConfigEnglish' import { TxStatus } from '../TxStatus' describe('TxStatus', () => { const renderTxStatus = (status: string, shorthand = false) => render( , ) it('renders success correctly ', () => { const { container } = renderTxStatus('tesSUCCESS') expect(screen.getByText('Success')).toBeInTheDocument() expect(container.querySelector('svg.success')).toBeInTheDocument() }) it('renders success correctly without message in shorthand mode', () => { const { container } = renderTxStatus('tesSUCCESS', true) expect(screen.queryByText('Success')).not.toBeInTheDocument() expect(container.querySelector('svg.success')).toBeInTheDocument() }) it('renders failure correctly ', () => { const { container } = renderTxStatus('tecPATH_DRY') expect(screen.getByText('Fail')).toBeInTheDocument() expect(screen.getByText('tecPATH_DRY')).toBeInTheDocument() expect(container.querySelector('svg.fail')).toBeInTheDocument() expect(screen.getByRole('link')).toHaveAttribute( 'href', 'https://xrpl.org/tec-codes.html#tecPATH_DRY', ) }) it('renders failure correctly without message in shorthand mode ', () => { const { container } = renderTxStatus('tecPATH_DRY', true) expect(container.querySelector('.status-message')).not.toBeInTheDocument() expect(screen.getByText('tecPATH_DRY')).toBeInTheDocument() expect(container.querySelector('svg.fail')).toBeInTheDocument() expect(screen.queryByRole('link')).not.toBeInTheDocument() // Not a link in shorthand }) }) ================================================ FILE: src/containers/shared/components/test/TxToken.test.tsx ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import i18n from '../../../../i18n/testConfigEnglish' import TxToken from '../TxToken' import withdrawUSDMock from '../Transaction/AMMWithdraw/test/mock_data/withdraw_usd.json' import withdrawXRPMock from '../Transaction/AMMWithdraw/test/mock_data/withdraw_xrp.json' import withdrawMock from '../Transaction/AMMWithdraw/test/mock_data/withdraw.json' import paymentMock from '../Transaction/Payment/test/mock_data/Payment.json' import summarizeTransaction from '../../../../rippled/lib/txSummary' describe('TxToken', () => { const renderTxToken = (transaction: any) => render( , ) it('to render for a Payment transaction', () => { const { container } = renderTxToken(paymentMock) expect(container).toHaveTextContent('\uE900 XRP') }) it('to render for a NON Payment transaction with only issued currency', () => { const { container } = renderTxToken(withdrawUSDMock) expect(container).toHaveTextContent('USD') }) it('to render for a NON Payment transaction with only XRP', () => { const { container } = renderTxToken(withdrawXRPMock) expect(container).toHaveTextContent('\uE900 XRP') }) it('to render for a NON Payment transaction with multiple amounts', () => { const { container } = renderTxToken(withdrawMock) expect(container).toHaveTextContent('\uE900 XRP and USD') }) }) ================================================ FILE: src/containers/shared/css/box.scss ================================================ @use 'variables' as *; .box { border-radius: 4px; box-shadow: 0px 0px 5px 0px rgb(59 65 71 / 25%); } .box-header, .box-content { padding: 16px; @include for-size(desktop-up) { padding: 24px; } } .box-header { border-bottom: 1px solid $black-20; } .box-header > .icon { width: 24px; height: 24px; margin-right: 16px; float: left; } .box-header > h1 { padding: 0px; margin: 0px; font-size: 12px; line-height: 22px; @include for-size(desktop-up) { font-size: 20px; } } ================================================ FILE: src/containers/shared/css/data-tables-mobile.scss ================================================ @use 'variables' as *; // Mobile-responsive styles for data tables (DexTradeTable, HoldersTable, TransfersTable) // Base table styles table.basic { width: 100%; font-size: 14px; @include for-size(phone-only) { font-size: 12px; } th, td { padding: 8px 12px; @include for-size(phone-only) { padding: 6px 8px; } @include for-size(tablet-portrait-up) { padding: 10px 16px; } } // Mobile-specific column adjustments @include for-size(phone-only) { .count { width: 50px; min-width: 50px; } .name-col { min-width: 120px; } .tx-account { min-width: 140px; } .tx-ledger { min-width: 100px; } .tx-percent-supply { min-width: 80px; } .tx-value { min-width: 100px; } .tx-amount { min-width: 100px; } .tx-hash { min-width: 120px; } .tx-timestamp { min-width: 140px; } .tx-from, .tx-to { min-width: 120px; } .tx-rate { min-width: 100px; } } } // Specific styles for each table type .holders-table, .transfers-table, .dex-trades-table { width: 100%; -webkit-overflow-scrolling: touch; overflow-x: auto; // Custom scrollbar styling &::-webkit-scrollbar { height: 4px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { border-radius: 2px; background: $black-60; } &::-webkit-scrollbar-thumb:hover { background: $black-50; } // Hide scrollbar on mobile for cleaner look @include for-size(phone-only) { padding: 0 16px; margin: 0 -16px; -ms-overflow-style: none; // IE/Edge scrollbar-width: none; // Firefox &::-webkit-scrollbar { display: none; // Chrome/Safari } } .table-wrap { min-width: 100%; @include for-size(phone-only) { min-width: 600px; // Force horizontal scroll on mobile for better UX } } } // Token transaction table container .token-transaction-table-container { width: 100%; @include for-size(phone-only) { padding: 0 16px; margin: 0 -16px; } } // Mobile card-style layout alternative (optional) @include for-size(phone-only) { .mobile-card-view { display: none; // Hidden by default, can be toggled .card-item { padding: 16px; border: 1px solid $black-70; border-radius: 8px; margin-bottom: 12px; background: $black-90; .card-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; &:last-child { margin-bottom: 0; } .label { color: $black-40; font-size: 12px; text-transform: uppercase; @include semibold; } .value { color: $white; font-size: 14px; @include regular; text-align: right; } } } } } // Pagination mobile styles .pagination-container { display: flex; flex-direction: column; align-items: center; margin-top: 24px; gap: 16px; @include for-size(tablet-portrait-up) { flex-direction: row; justify-content: space-between; } .pagination-info { color: $black-40; font-size: 14px; @include for-size(phone-only) { font-size: 12px; text-align: center; } } .pagination-controls { display: flex; align-items: center; gap: 8px; button { padding: 8px 12px; border: 1px solid $black-70; border-radius: 4px; background: $black-90; color: $white; cursor: pointer; font-size: 14px; transition: all 0.2s ease; @include for-size(phone-only) { padding: 6px 10px; font-size: 12px; } &:disabled { cursor: not-allowed; opacity: 0.5; } &:hover:not(:disabled) { border-color: $green-30; background: rgba($green-30, 0.1); } &.active { border-color: $green-30; background: $green-30; color: $black-100; } } } } // Loading states for mobile .mobile-loading { display: flex; align-items: center; justify-content: center; padding: 40px 20px; @include for-size(phone-only) { padding: 30px 16px; } } // Empty states for mobile .mobile-empty-state { padding: 40px 20px; color: $black-40; text-align: center; @include for-size(phone-only) { padding: 30px 16px; font-size: 14px; } .empty-icon { margin-bottom: 16px; font-size: 48px; opacity: 0.5; @include for-size(phone-only) { margin-bottom: 12px; font-size: 36px; } } .empty-title { margin-bottom: 8px; color: $white; font-size: 18px; @include semibold; @include for-size(phone-only) { font-size: 16px; } } .empty-description { font-size: 14px; line-height: 1.5; @include for-size(phone-only) { font-size: 12px; } } } ================================================ FILE: src/containers/shared/css/data-tables-notice.scss ================================================ @use 'variables' as *; .notice-with-controls { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; gap: 12px; .data-notice { width: fit-content; padding: 12px 16px; border-radius: 2px; border-left: 4px solid $yellow; margin: 0; background-color: rgb(255 193 7 / 15%); color: $black-30; font-size: 13px; line-height: 16px; } .refresh-button { flex-shrink: 0; padding: 6px 12px; border: 1px solid $green-60; border-radius: 4px; background-color: transparent; color: $green-60; cursor: pointer; font-size: 16px; line-height: 1; transition: all 0.2s ease; &:hover { border-color: $green-60; background-color: $green-70; color: $white; } &:active { background-color: $green-60; } } } ================================================ FILE: src/containers/shared/css/form.scss ================================================ @use 'variables' as *; label { color: $black-40; &.selected { color: $white; font-weight: bold; } } .radio-group { label + label { margin-left: 10px; } } input { border-radius: $border-radius; &[type='text'] { &:hover, &:focus { background-color: $black-80; } &:focus { outline: solid 1px $blue-purple-40 !important; } } &[type='radio'] { height: 16px; accent-color: $green; } } ================================================ FILE: src/containers/shared/css/global.scss ================================================ // ONLY GLOBAL CSS, KEEP IT TO MINIMAL // CSS SHOULD BE SCOPPED TO COMPONENT @use 'variables' as *; @use 'form'; /** * `current_symbols` is used for currency codes missing from other fonts, currently `u+e900` (XRP) and `u+e901` (BTC). * * By using unicode-range we specify which character points this font-family can be used for. When used in a style (and * assuming this font family is first/takes precedent), only these characters will use this font-face. Anything else * will fall through to the subsequent font-family. */ @font-face { font-family: 'currency_symbols'; font-style: normal; font-weight: normal; src: url('../fonts/currency_symbols.ttf') format('truetype'), url('../fonts/currency_symbols.woff') format('woff'); unicode-range: u+e900-e901; } html { height: 100%; } body { height: 100%; color: $white; } .xrpl-explorer { height: 100%; } .app-wrapper { display: flex; min-height: 100%; flex-direction: column; } body, input { padding: 0px; margin: 0px; background-color: $black-100; font-size: 16px; -webkit-font-smoothing: antialiased; font-style: normal; letter-spacing: 0.5px; } body, input, button { font-family: 'currency_symbols', 'Work Sans', system-ui, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; } .clear { clear: both; } * { box-sizing: border-box; outline: none !important; // remove blue outline in click and focus } h2 { padding-bottom: 18px; border-bottom: 1px $black-70 solid; margin-top: 0; color: $white; font-size: 24px; @include bold; } svg.react-stockchart { z-index: auto !important; left: 0px; } div.react-stockchart div { z-index: auto !important; } .async-component-error { margin: 0px auto; color: $black-40; font-size: 16px; line-height: 24px; text-align: center; @include bold; } @mixin transaction-category($category, $color, $hover, $background) { .tx-category-#{$category} { color: $color; // Only have a hover color on anchors @at-root a#{&}:hover { color: $hover; } &.tx-label { background: $background; } } } @include transaction-category(ACCOUNT, $magenta, $magenta-30, $magenta-90); @include transaction-category(DEX, $blue, $blue-30, $blue-90); @include transaction-category(PAYMENT, $green, $green-30, $green-90); @include transaction-category( NFT, $blue-purple, $blue-purple-30, $blue-purple-90 ); @include transaction-category(XCHAIN, $yellow, $yellow-30, $yellow-90); @include transaction-category(PSEUDO, $white, $white, $black-80); @include transaction-category(OTHER, $black-50, $black-30, $black-90); @include transaction-category(MPT, $blue, $blue-30, $blue-90); .tx-result { &.success { color: $green; } &.fail { color: $orange-40; } } .label { margin-bottom: 8px; } .hidden { display: none; } .flex-table { display: flex; flex-direction: column; .row { display: flex; justify-content: space-between; margin-left: 5px; .value { font-size: 14px; } } .spacer { margin-bottom: 15px; } } .btn { padding: 12px 16px; border: solid 1px $white; border-radius: $border-radius; background: $black; color: $white; cursor: pointer; font-size: 14px; line-height: 21px; &:hover { background: $black-80; } } a, .btn-link { border: none; background: transparent; color: $green-30; text-decoration: none; &:hover { background: transparent; color: $green-50; } &.external, // Force the external icon. Useful for when the protocol is unknown like with NFTs. &[href^="http://"], &[href^="https://"] { &::after { display: inline-block; width: 1em; min-width: 1em; height: 1em; margin-left: 4px; background-color: currentcolor; content: ''; mask-image: url('../images/external_link.svg'); mask-position: center; mask-repeat: no-repeat; mask-size: contain; vertical-align: text-top; } &[data-title^='GitHub'] { &::before { display: inline-block; width: 1em; height: 1em; margin-right: 4px; background-color: currentcolor; content: ''; mask-image: url('../images/github.svg'); mask-position: center; mask-repeat: no-repeat; mask-size: contain; vertical-align: text-top; } } } } /** Workaround to have the effect nested anchor tags (invalid html). 1. Add the class `anchor-mask` to the container you would normally wrap in an tag. 2. Add the class `mask-overlay` to to the anchor. This makes the `mask-overlay` sit on top of the `anchor-mask` and then places any other "nested" anchors on top of the overlay */ .anchor-mask { position: relative; a { position: relative; z-index: 10; } a.mask-overlay { position: absolute; z-index: 5; inset: 0; } } .badge { padding: 2px 12px; border-radius: 30px; margin-left: 12px; font-size: 14px; @include bold; } .section { margin: 0 8px; @include for-size(tablet-landscape-up) { width: calc(100% - 15px); margin: 0 auto; } @include for-size(big-desktop-up) { max-width: $desktop-upper-boundary; } } .warning { display: flex; align-items: center; color: $orange; font-size: 12px; line-height: 20px; text-transform: uppercase; @include bold; img { transform: scale(0.5); } } // A transactions destination tag. Used like rafdasdfas:424242 .dt { @include medium; color: $black-40; font-size: 0.9em; } ================================================ FILE: src/containers/shared/css/info-card.scss ================================================ @use './variables' as *; /* * Shared styles for info cards that display a title with an icon and a list * of label/value rows separated by horizontal dividers. * * Usage: * @use '../shared/css/info-card'; * *
    *

    * * Title *

    *
    *
    * Label * Value *
    * ...more rows *
    *
    * * Dividers between rows are added automatically via CSS — do not include * separator elements. * * Modifier classes for values: * info-card-value-green — success/active state * info-card-value-orange — warning/attention state * info-card-value-link — clickable link appearance * * Use info-card-subtitle for secondary text within a value cell. */ .info-card { padding: 24px; border: 1px solid $black-60; border-radius: 8px; background: $black-80; .info-card-title { display: flex; align-items: center; margin: 0 0 16px; color: $white; font-size: 20px; gap: 8px; @include bold; } .info-card-icon { width: 24px; height: 24px; flex-shrink: 0; } .info-card-rows { display: flex; flex-direction: column; } .info-card-row { display: flex; align-items: flex-start; justify-content: space-between; padding: 10px 0; gap: 4px; &:not(:last-child) { border-bottom: 1px solid $black-60; } &:first-child { padding-top: 0; } &:last-child { padding-bottom: 0; } } .info-card-label { display: flex; align-items: center; color: $black-40; font-size: 14px; line-height: 1.5; text-transform: uppercase; @include semibold; .hover { width: 14px; height: 14px; margin-left: 4px; cursor: default; } } .info-card-value { color: $white; font-size: 14px; line-height: 1.5; text-align: right; word-break: break-all; @include regular; &-green { color: $green; } &-orange { color: $orange; } &-link { color: $green-30; a { color: $green-30; } } } .info-card-subtitle { margin-top: 4px; color: $black-40; font-size: 12px; line-height: 1.5; @include regular; } } ================================================ FILE: src/containers/shared/css/loader.scss ================================================ .loader { position: relative; width: 100%; height: 100%; min-height: 40px; opacity: 0.8; pointer-events: none; text-align: center; transition: opacity 0.3s ease; img { position: absolute; top: 50%; left: 50%; width: 40px; transform: translate(-50%, -50%); } } ================================================ FILE: src/containers/shared/css/simpleTab.scss ================================================ @use 'variables' as *; $index-width: 324px; .simple-body { display: flex; .index { width: $index-width; padding: 16px; border-left: 1px solid $black-70; margin-bottom: 60px; margin-left: -1px; .row { margin-bottom: 32px; &:last-child { margin-bottom: 0px; } .label { margin-bottom: 0; color: $black-40; font-size: 10px; line-height: 14px; text-transform: uppercase; } .value { overflow: hidden; color: $white; font-size: 14px; line-height: 16px; text-overflow: ellipsis; white-space: nowrap; @include medium; &.account { font-size: 12px; } } } } .rows { width: 100%; padding: 40px 16px 0; font-size: 14px; line-height: 21px; @include for-size(desktop-up) { width: calc(100% - $index-width); padding-right: 0; border-right: 1px solid $black-70; margin-bottom: 60px; } /* stylelint-disable-next-line no-descending-specificity -- more confusing to satisfy it */ .row { &:first-child { padding-top: 0; } &:not(:only-child):last-child { border-bottom: none; } display: flex; overflow: hidden; flex-wrap: wrap; justify-content: space-between; padding: 15px 0; border-bottom: 1px solid $black-70; gap: 0 5px; @include for-size(tablet-portrait-up) { padding: 15px 15px 15px 0; } .label { color: $white; text-transform: capitalize; &.unauthorize { color: $red-dark; } } .account { display: inline-block; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; white-space: nowrap; } .value { @include medium; color: $white; overflow-wrap: break-word; vertical-align: middle; &.text-truncate { @extend %truncate; } &.date { color: $black-60; @include regular; } } } } } ================================================ FILE: src/containers/shared/css/sort.scss ================================================ @use 'variables' as *; .sort-header { display: inline-flex; align-items: center; gap: 6px; vertical-align: middle; .arrow { width: 16px; height: 16px; &.asc { transform: rotate(180deg); } } } ================================================ FILE: src/containers/shared/css/table.scss ================================================ @use 'variables' as *; table.basic { overflow: hidden; width: 100%; border-top: none; margin: auto; border-collapse: collapse; color: $white; font-size: 12px; letter-spacing: 0px; text-align: left; tr { border-bottom: 1px solid $black-70; } td, th { &.right { text-align: right; } &.center { text-align: center; } &.text-truncate { @extend %truncate; } } th { padding: 22px 5px; color: $black-40; text-align: left; text-transform: uppercase; } td { padding: 15px 5px; @include for-size(tablet-portrait-up) { td { padding: 15px 10px; color: $black-40; } } } .empty-message { padding: 16px; color: $black-40; font-size: 16px; text-align: center; } } table.token-table { margin-top: 24px; font-size: 14px; .col1 { width: 180px; padding-bottom: 8px; color: $black-40; text-transform: uppercase; @include semibold; } .col2 { display: inline-block; width: 230px; padding-bottom: 8px; color: $white; overflow-wrap: break-word; } } ================================================ FILE: src/containers/shared/css/tabs.scss ================================================ @use 'variables' as *; .tabs { border-top: 1px solid $black-70; margin: 8px auto 40px; font-size: 14px; a { color: inherit; } .tab { display: inline-block; padding: 24px 24px 0; border-top: 2px solid transparent; color: $black-40; cursor: pointer; text-align: center; text-transform: capitalize; &:hover, &:focus { color: $white; @include bold; } &.selected { border-top: 2px solid $white; color: $white; @include bold; } } } ================================================ FILE: src/containers/shared/css/tooltip.scss ================================================ @use 'variables' as *; .tooltip { position: absolute; z-index: 1000; padding: 8px 12px; border-radius: 2px; background: rgb(0 0 0 / 90%); color: white; font-size: 13px; line-height: 16px; @include medium; img { height: 16px; margin: 0 5px; vertical-align: middle; } .label { text-transform: uppercase; } .pubkey { overflow: hidden; max-width: 100px; color: $black-10; font-size: 10px; letter-spacing: 0; text-overflow: ellipsis; white-space: nowrap; } .time { color: $black-40; letter-spacing: 0; } .unl { color: $green; } .tx-status::before { content: '\00a0'; } .account { color: $black-50; font-size: 10px; } &.tooltip-missing { background: rgb(120 0 0 / 90%); } &.tooltip-text { position: fixed; max-width: 300px; border: 1px solid $black-80; border-radius: 4px; background: $black-60; filter: drop-shadow(0px 1px 2px $black-70); pointer-events: none; } } ================================================ FILE: src/containers/shared/css/txlabel.scss ================================================ @use 'variables' as *; .tx-label { display: inline-flex; max-width: 100%; align-items: center; padding: 2px 8px; border: 1px solid currentcolor; border-radius: 100px; font-size: 14px; line-height: 1; @include semibold; .tx-type-name { color: $white; letter-spacing: 0; text-transform: uppercase; @extend %truncate; &::before { content: '\00a0'; } } } ================================================ FILE: src/containers/shared/css/txstatus.scss ================================================ @use 'variables' as *; .tx-status { display: inline-flex; max-width: 100%; align-items: center; svg { width: auto; height: 1em; } .status-icon { display: flex; align-items: center; } .status { @extend %truncate; display: inline-block; text-transform: capitalize; &::before { content: '\00a0'; } } .status-message { + .status-code::before { content: '\00a0-\00a0'; } } .status-code { color: inherit; } &.success { .status-code { display: none; } } // Because of an optical illusion caused by white space the link icon looks to be too lower &::after { position: relative; top: -1px; } } ================================================ FILE: src/containers/shared/css/variables.scss ================================================ // ONLY RE-USABLE VARIABLES AND MIXINS // View breakpoints $phone-upper-boundary: 415px; $tablet-portrait-upper-boundary: 600px; $tablet-landscape-upper-boundary: 900px; $desktop-upper-boundary: 1200px; // Minimum height and width $min-height: 500px; $min-width: 375px; $border-radius: 8px; // Colors $black-0: #fff; $black-10: #f5f5f7; $black-20: #e0e0e1; $black-30: #c1c1c2; $black-40: #a2a2a4; $black-50: #838386; $black-60: #454549; $black-70: #343437; $black-80: #232325; $black-90: #111112; $black-100: #000; $black: $black-100; $green-10: #d6fae7; $green-20: #adf5ce; $green-30: #84f0b6; $green-40: #5beb9d; $green-50: #32e685; $green-60: #2dcf78; $green-70: #28b86a; $green-80: #1e8a50; $green-90: #145c35; $green-100: #0a2e1b; $green: $green-50; $blue-10: #e5f5ff; $blue-20: #b2e0ff; $blue-30: #80ccff; $blue-40: #4bb7ff; $blue-50: #19a3ff; $blue-60: #008ae5; $blue-70: #006bb2; $blue-80: #004d80; $blue-90: #002e4c; $blue: $blue-50; $blue-purple-10: #f0e5ff; $blue-purple-20: #d2b2ff; $blue-purple-30: #b480ff; $blue-purple-40: #9a52ff; $blue-purple-50: #7919ff; $blue-purple-60: #5f00e5; $blue-purple-70: #4a00b2; $blue-purple-80: #350080; $blue-purple-90: #20004c; $blue-purple: $blue-purple-40; $red-purple-10: #fbe5ff; $red-purple-20: #f2b2ff; $red-purple-30: #ea80ff; $red-purple-40: #e24cff; $red-purple-50: #d919ff; $red-purple-60: #c000e5; $red-purple-70: #9500b2; $red-purple-80: #6b0080; $red-purple-90: #40004c; $red-purple: $red-purple-50; $magenta-10: #ffe5f2; $magenta-20: #ffb2d8; $magenta-30: #ff80bf; $magenta-40: #ff4ba4; $magenta-50: #ff198b; $magenta-60: #e50071; $magenta-70: #b20058; $magenta-80: #80003f; $magenta-90: #4c0026; $magenta: $magenta-50; $orange-10: #ffeee5; $orange-20: #ffccb2; $orange-30: #ffaa80; $orange-40: #ff884b; $orange-50: #ff6719; $orange-60: #e54d00; $orange-70: #b23c00; $orange-80: #802b00; $orange-90: #4c1a00; $orange: $orange-50; $yellow-10: #feffe5; $yellow-20: #fdffb2; $yellow-30: #fcff80; $yellow-40: #fbff4c; $yellow-50: #faff19; $yellow-60: #e0e500; $yellow-70: #aeb200; $yellow-80: #7d8000; $yellow-90: #4b4c00; $yellow: $yellow-50; $red: #ff668b; $red-dark: #940443; $shadows: #23292f; $white: #fff; $white-transparent: rgb(255 255 255 / 75%); // Networks $testnet: $orange; $devnet: $blue-purple-30; $xahau-mainnet: $green-40; $xahau-testnet: $magenta-30; $custom: $yellow-50; // Feature Sets $amm: $blue; $nft: $blue-purple; $mpt: $blue; // Currency colors $CURRENCY_DEFAULT: #aedbf7; $XRP_KRW: #0f72e5; $XRP_USD: #2bcb96; $XRP_BTC: #f90; $XRP_ETH: #53585d; $XRP_USDT: #91ffdb; $XRP_INR: #ff8000; $XRP_JPY: #691fdd; $XRP_AUD: #ffcd00; $XRP_MXN: #c74444; $XRP_THB: #ed1c24; $XRP_CNY: #f23548; $XRP_IDR: #ce1126; $XRP_RUB: #0039a6; $XRP_BITCNY: #f88064; $XRP_ZAR: #000; $XRP_XLM: #04b5e5; $XRP_LTC: #b8b8b8; $XRP_ADA: #2d71d0; $XRP_BRL: #009b3a; $XRP_BCH: #c8e6ad; $XRP_ETC: #42967b; $XRP_REP: #551a8b; $XRP_GBP: #00247d; $XRP_QAU: #0f73c3; $XRP_UAH: #ffd700; $XRP_CND: #00aae4; $XRP_EUR: #ffd600; $XRP_XRP: #0a93eb; $XRP_CAD: #ca3103; $XRP_OTHERS: #f52a79; // Font weights @mixin regular { font-weight: 400; } @mixin medium { font-weight: 500; } @mixin semibold { font-weight: 600; } @mixin bold { font-weight: 700; } %truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } // View bucket sizes @mixin for-size($range) { @if $range == phone-only { @media (max-width: $phone-upper-boundary) { @content; } } @else if $range == tablet-portrait-up { @media (min-width: $phone-upper-boundary) { @content; } } @else if $range == tablet-landscape-up { @media (min-width: $tablet-portrait-upper-boundary) { @content; } } @else if $range == desktop-up { @media (min-width: $tablet-landscape-upper-boundary) { @content; } } @else if $range == big-desktop-up { @media (min-width: $desktop-upper-boundary) { @content; } } } @mixin footnote { padding: 24px 0; color: $black-40; font-size: 12px; font-weight: 400; @include for-size(desktop-up) { font-size: 16px; } } ================================================ FILE: src/containers/shared/helpers/contextFactory.ts ================================================ import { createContext, useContext } from 'react' type NameProps = { hook: string provider: string } export const contextFactory = ( { hook, provider }: NameProps, initialState?: T, ) => { const Context = createContext(initialState) const useContextFactory = (): T => { const context = useContext(Context) if (context === undefined) { throw new Error(`${hook} must be used in a child of ${provider}`) } return context } return [Context, useContextFactory] as const } ================================================ FILE: src/containers/shared/helpers/index.ts ================================================ export * from './contextFactory' ================================================ FILE: src/containers/shared/hooks/index.ts ================================================ import { useTranslation } from 'react-i18next' import { useLocalStorage } from './useLocalStorage' export * from './useLocalStorage' export const useLanguage = () => useTranslation().i18n.resolvedLanguage || 'en-US' export const CUSTOM_NETWORKS_STORAGE_KEY = 'explorer-custom-networks' export const useCustomNetworks = () => useLocalStorage(CUSTOM_NETWORKS_STORAGE_KEY, []) ================================================ FILE: src/containers/shared/hooks/test/useCursorPaginatedQuery.test.tsx ================================================ import { renderHook, act, waitFor } from '@testing-library/react' import { CursorPaginationService } from '../../services/CursorPaginationService' import { useCursorPaginatedQuery } from '../useCursorPaginatedQuery' describe('useCursorPaginatedQuery', () => { let mockService: CursorPaginationService let mockGetPage: jest.Mock let mockClearCache: jest.Mock beforeEach(() => { jest.clearAllMocks() mockGetPage = jest.fn().mockResolvedValue({ items: [{ id: 1 }, { id: 2 }], totalItems: 20, hasMore: true, isLoading: false, }) mockClearCache = jest.fn() mockService = { getPage: mockGetPage, clearCache: mockClearCache, } as any }) it('fetches page 1 on initial render', async () => { const { result } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, }), ) await waitFor(() => { expect(result.current.data).toBeDefined() }) expect(mockGetPage).toHaveBeenCalledWith( 'testId', 1, 10, 'timestamp', 'desc', ) expect(result.current.page).toBe(1) expect(result.current.sortField).toBe('timestamp') expect(result.current.sortOrder).toBe('desc') }) it('uses custom initial sort field and order', async () => { const { result } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, initialSortField: 'amount', initialSortOrder: 'asc', }), ) await waitFor(() => { expect(result.current.data).toBeDefined() }) expect(mockGetPage).toHaveBeenCalledWith('testId', 1, 10, 'amount', 'asc') expect(result.current.sortField).toBe('amount') expect(result.current.sortOrder).toBe('asc') }) it('does not fetch when disabled', () => { renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, enabled: false, }), ) expect(mockGetPage).not.toHaveBeenCalled() }) it('resets page to 1 and clears cache when sort field changes', async () => { const { result } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, }), ) await waitFor(() => { expect(result.current.data).toBeDefined() }) act(() => { result.current.setPage(2) }) expect(result.current.page).toBe(2) act(() => { result.current.setSortField('amount') }) expect(result.current.page).toBe(1) expect(result.current.sortField).toBe('amount') expect(mockClearCache).toHaveBeenCalled() }) it('resets page to 1 and clears cache when sort order changes', async () => { const { result } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, }), ) await waitFor(() => { expect(result.current.data).toBeDefined() }) act(() => { result.current.setPage(3) }) act(() => { result.current.setSortOrder('asc') }) expect(result.current.page).toBe(1) expect(result.current.sortOrder).toBe('asc') expect(mockClearCache).toHaveBeenCalled() }) it('clears cache and resets page on refresh', async () => { const { result } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, }), ) await waitFor(() => { expect(result.current.data).toBeDefined() }) act(() => { result.current.setPage(5) }) act(() => { result.current.refresh() }) expect(result.current.page).toBe(1) expect(mockClearCache).toHaveBeenCalled() }) it('shows loading on sort change', async () => { const { result } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, }), ) await waitFor(() => { expect(result.current.isLoading).toBe(false) }) act(() => { result.current.setSortField('amount') }) expect(result.current.isLoading).toBe(true) }) it('shows loading on refresh', async () => { const { result } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, }), ) await waitFor(() => { expect(result.current.isLoading).toBe(false) }) act(() => { result.current.refresh() }) expect(result.current.isLoading).toBe(true) }) it('does not show loading on page change (no flash)', async () => { const { result } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, }), ) await waitFor(() => { expect(result.current.isLoading).toBe(false) }) act(() => { result.current.setPage(2) }) // isLoading stays false — previous data remains visible expect(result.current.isLoading).toBe(false) }) it('fetches new data when page changes', async () => { const { result } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, }), ) await waitFor(() => { expect(result.current.data).toBeDefined() }) mockGetPage.mockClear() act(() => { result.current.setPage(2) }) await waitFor(() => { expect(mockGetPage).toHaveBeenCalledWith( 'testId', 2, 10, 'timestamp', 'desc', ) }) }) it('sets data to undefined on fetch error', async () => { mockGetPage.mockRejectedValueOnce(new Error('fetch failed')) const { result } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, }), ) await waitFor(() => { expect(result.current.isLoading).toBe(false) }) expect(result.current.data).toBeUndefined() }) it('ignores stale response after unmount', async () => { let resolveGetPage: (value: any) => void mockGetPage.mockImplementation( () => new Promise((resolve) => { resolveGetPage = resolve }), ) const { result, unmount } = renderHook(() => useCursorPaginatedQuery({ service: mockService, id: 'testId', pageSize: 10, }), ) expect(result.current.isLoading).toBe(true) unmount() // Resolve after unmount — should not throw or update state act(() => { resolveGetPage!({ items: [{ id: 99 }], totalItems: 1, hasMore: false, isLoading: false, }) }) // No error thrown — stale response was ignored }) }) ================================================ FILE: src/containers/shared/hooks/test/useTokenToUSDRate.test.tsx ================================================ import { renderHook, waitFor } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { useTokenToUSDRate } from '../useTokenToUSDRate' import * as useXRPToUSDRateModule from '../useXRPToUSDRate' jest.mock('../useXRPToUSDRate') const mockUseXRPToUSDRate = useXRPToUSDRateModule.useXRPToUSDRate as jest.Mock // Mock global fetch const mockFetch = jest.fn() global.fetch = mockFetch const createWrapper = ( queryClient = new QueryClient({ defaultOptions: { queries: { retry: 0 } }, }), ) => ({ children }: { children: React.ReactNode }) => ( {children} ) describe('useTokenToUSDRate', () => { beforeEach(() => { jest.clearAllMocks() mockUseXRPToUSDRate.mockReturnValue(2.5) // XRP = $2.50 process.env.VITE_ENVIRONMENT = 'mainnet' }) describe('Special Currencies', () => { it('returns XRP/USD rate directly for XRP', () => { const { result } = renderHook( () => useTokenToUSDRate({ currency: 'XRP' }), { wrapper: createWrapper(), }, ) expect(result.current).toEqual({ rate: 2.5, isAvailable: true, isLoading: false, }) }) it('returns 1:1 rate for RLUSD stablecoin', () => { const { result } = renderHook( () => useTokenToUSDRate({ currency: 'RLUSD', issuer: 'rSomeIssuer' }), { wrapper: createWrapper() }, ) expect(result.current).toEqual({ rate: 1, isAvailable: true, isLoading: false, }) }) }) describe('LOS API - Positive Cases', () => { it('fetches token price and converts to USD', async () => { mockFetch.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve({ price: '0.5' }), // 0.5 XRP per token }) const { result } = renderHook( () => useTokenToUSDRate({ currency: 'USD', issuer: 'rIssuer123' }), { wrapper: createWrapper() }, ) await waitFor(() => expect(result.current.isLoading).toBe(false)) // 0.5 XRP * $2.50/XRP = $1.25 expect(result.current).toEqual({ rate: 1.25, isAvailable: true, isLoading: false, }) }) }) describe('LOS API - Negative Cases', () => { it('returns unavailable when API returns no price', async () => { mockFetch.mockResolvedValueOnce({ ok: true, json: () => Promise.resolve({}), // No price field }) const { result } = renderHook( () => useTokenToUSDRate({ currency: 'RARE', issuer: 'rIssuer456' }), { wrapper: createWrapper() }, ) await waitFor(() => expect(result.current.isLoading).toBe(false)) expect(result.current).toEqual({ rate: 0, isAvailable: false, isLoading: false, }) }) it('returns unavailable when API request fails', async () => { mockFetch.mockResolvedValueOnce({ ok: false, statusText: 'Not Found', }) const { result } = renderHook( () => useTokenToUSDRate({ currency: 'UNKNOWN', issuer: 'rIssuer789' }), { wrapper: createWrapper() }, ) await waitFor(() => expect(result.current.isLoading).toBe(false)) expect(result.current).toEqual({ rate: 0, isAvailable: false, isLoading: false, }) }) it('returns unavailable for token without issuer', () => { const { result } = renderHook( () => useTokenToUSDRate({ currency: 'FOO' }), // No issuer { wrapper: createWrapper() }, ) expect(result.current).toEqual({ rate: 0, isAvailable: false, isLoading: false, }) expect(mockFetch).not.toHaveBeenCalled() }) }) describe('Non-Mainnet Environment', () => { it('returns mock rate for tokens on non-mainnet', () => { process.env.VITE_ENVIRONMENT = 'testnet' const { result } = renderHook( () => useTokenToUSDRate({ currency: 'TEST', issuer: 'rTestIssuer' }), { wrapper: createWrapper() }, ) expect(result.current).toEqual({ rate: 1.5, isAvailable: true, isLoading: false, }) expect(mockFetch).not.toHaveBeenCalled() }) }) }) ================================================ FILE: src/containers/shared/hooks/test/useXRPToUSDRate.test.tsx ================================================ import { renderHook, waitFor } from '@testing-library/react' import { QueryClient, QueryClientProvider } from 'react-query' import { useXRPToUSDRate } from '../useXRPToUSDRate' import SocketContext from '../../SocketContext' import * as rippled from '../../../../rippled/lib/rippled' import Log from '../../log' jest.mock('../../../../rippled/lib/rippled') jest.mock('../../log') const mockedGetAccountLines = rippled.getAccountLines as jest.Mock const createWrapper = (socket: any = {}, queryClient = new QueryClient()) => ({ children }: { children: React.ReactNode }) => ( {children} ) describe('useXRPToUSDRate', () => { beforeEach(() => { jest.clearAllMocks() process.env.VITE_ENVIRONMENT = 'mainnet' }) it('returns 0.0 if no lines available', async () => { mockedGetAccountLines.mockResolvedValue({ lines: [] }) const { result } = renderHook(() => useXRPToUSDRate(), { wrapper: createWrapper(), }) await waitFor(() => expect(result.current).toBe(0.0)) }) it('returns 1.5 if not mainnet', () => { process.env.VITE_ENVIRONMENT = 'dev' const { result } = renderHook(() => useXRPToUSDRate(), { wrapper: createWrapper(), }) expect(result.current).toBe(1.5) }) it('fetches XRP/USD rate if mainnet', async () => { mockedGetAccountLines.mockResolvedValue({ lines: [{ limit: 2.3 }] }) const { result } = renderHook(() => useXRPToUSDRate(), { wrapper: createWrapper({}), }) await waitFor(() => expect(result.current).toBe(2.3)) }) it('falls back to last successful rate on error', async () => { mockedGetAccountLines .mockResolvedValueOnce({ lines: [{ limit: 2.1 }] }) .mockRejectedValueOnce(new Error('network error')) const queryClient = new QueryClient({ defaultOptions: { queries: { retry: 0 } }, }) const { result } = renderHook(() => useXRPToUSDRate(), { wrapper: createWrapper({}, queryClient), }) // First fetch succeeds await waitFor(() => expect(result.current).toBe(2.1)) // Force useQuery to refetch queryClient.invalidateQueries('XRPToUSDRate') await waitFor(() => { expect(result.current).toBe(2.1) expect(Log.error).toHaveBeenCalledTimes(1) }) }) }) ================================================ FILE: src/containers/shared/hooks/useCursorPaginatedQuery.ts ================================================ import { useState, useEffect, useCallback } from 'react' import { CursorPaginationService, PaginationResult, } from '../services/CursorPaginationService' interface UseCursorPaginatedQueryOptions { /** The pagination service instance */ service: CursorPaginationService /** Identifier passed to the service (e.g., token ID, AMM account ID) */ id: string /** Items per page */ pageSize: number /** Whether fetching is enabled */ enabled?: boolean /** Initial sort field */ initialSortField?: string /** Initial sort order */ initialSortOrder?: 'asc' | 'desc' } interface UseCursorPaginatedQueryResult { data: PaginationResult | undefined isLoading: boolean page: number setPage: (page: number) => void sortField: string setSortField: (field: string) => void sortOrder: 'asc' | 'desc' setSortOrder: (order: 'asc' | 'desc') => void refresh: () => void } /** * React bridge for CursorPaginationService. Manages page/sort/refresh state * and data fetching so each consumer doesn't duplicate ~70 lines of * useState/useEffect/useCallback boilerplate. * * Used by IOU (2), MPT (1), and AMM Pool (3) pages. * * Page changes keep previous data visible (no loading flash). * Sort changes and refresh show a loader because the cache is cleared. */ export function useCursorPaginatedQuery({ service, id, pageSize, enabled = true, initialSortField = 'timestamp', initialSortOrder = 'desc', }: UseCursorPaginatedQueryOptions): UseCursorPaginatedQueryResult { const [page, setPage] = useState(1) const [sortField, setSortFieldState] = useState(initialSortField) const [sortOrder, setSortOrderState] = useState<'asc' | 'desc'>( initialSortOrder, ) const [refreshCount, setRefreshCount] = useState(0) const [data, setData] = useState>() const [isLoading, setIsLoading] = useState(true) const setSortField = useCallback( (field: string) => { setSortFieldState(field) setPage(1) setIsLoading(true) service.clearCache() }, [service], ) const setSortOrder = useCallback( (order: 'asc' | 'desc') => { setSortOrderState(order) setPage(1) setIsLoading(true) service.clearCache() }, [service], ) const refresh = useCallback(() => { service.clearCache() setPage(1) setIsLoading(true) setRefreshCount((c) => c + 1) }, [service]) useEffect(() => { if (!enabled) { return undefined } let cancelled = false service .getPage(id, page, pageSize, sortField, sortOrder) .then((result) => { if (!cancelled) { setData(result) setIsLoading(false) } }) .catch(() => { if (!cancelled) { setData(undefined) setIsLoading(false) } }) return () => { cancelled = true } }, [enabled, service, id, page, pageSize, sortField, sortOrder, refreshCount]) return { data, isLoading, page, setPage, sortField, setSortField, sortOrder, setSortOrder, refresh, } } ================================================ FILE: src/containers/shared/hooks/useLocalStorage.ts ================================================ import { useState, useEffect } from 'react' function getStorageValue(key: string, defaultValue: T): T | undefined { // getting stored value const saved = localStorage.getItem(key) const initial = saved && JSON.parse(saved) return initial || defaultValue } export const useLocalStorage = ( key: string, defaultValue: T, ): [T | undefined, Function] => { const [value, setValue] = useState(() => getStorageValue(key, defaultValue), ) useEffect(() => { // storing input name localStorage.setItem(key, JSON.stringify(value)) }, [key, value]) return [value, setValue] } ================================================ FILE: src/containers/shared/hooks/usePreviousWithPausing.tsx ================================================ import { useLayoutEffect, useState } from 'react' /** * A hook that prevents a value from being updated until it is unpaused. * @param value - The value that is applied when paused is false * @param paused - Should the value be updated */ export function usePreviousWithPausing( value: T, paused: boolean, ): T | undefined { const [val, setVal] = useState() useLayoutEffect(() => { if (!paused) { setVal(value) } }, [paused, value]) // this code will run when the value of 'value' changes return val // in the end, return the current ref value. } ================================================ FILE: src/containers/shared/hooks/useTokenToUSDRate.ts ================================================ import { useQuery } from 'react-query' import { useXRPToUSDRate } from './useXRPToUSDRate' import Log from '../log' const FETCH_INTERVAL_MILLIS = 60 * 1000 // 1 minute /** * Fetches token price from LOS API * The API returns the price of the token in XRP */ const fetchTokenPriceInXRP = async ( currency: string, issuer: string, ): Promise => { const response = await fetch( `${process.env.VITE_LOS_URL}/tokens/${currency}.${issuer}`, ) if (!response.ok) { throw new Error(`Failed to fetch token price: ${response.statusText}`) } const data = await response.json() return Number(data?.price) || 0 } interface TokenInfo { currency: string issuer?: string } interface TokenToUSDRateResult { rate: number isAvailable: boolean isLoading: boolean } /** * Returns the current exchange rate for a token to USD. * First fetches the token price in XRP from LOS API, * then converts to USD using the XRP to USD rate. * * @param token - The token info containing currency and optional issuer * @returns Object containing the USD rate, availability status, and loading state */ export function useTokenToUSDRate( token: TokenInfo | undefined, ): TokenToUSDRateResult { const xrpToUsdRate = useXRPToUSDRate() const isMainnet = process.env.VITE_ENVIRONMENT === 'mainnet' const currency = token?.currency const issuer = token?.issuer // Only fetch for non-XRP, non-RLUSD tokens with an issuer on mainnet const shouldFetch = isMainnet && !!currency && currency !== 'XRP' && currency !== 'RLUSD' && !!issuer const { data: priceInXRP, isLoading, isFetched, } = useQuery( ['tokenPriceInXRP', currency, issuer], () => fetchTokenPriceInXRP(currency!, issuer!), { enabled: shouldFetch, refetchInterval: FETCH_INTERVAL_MILLIS, staleTime: FETCH_INTERVAL_MILLIS, onError: (error) => Log.error(error), }, ) // XRP: use direct XRP to USD rate if (currency === 'XRP') { return { rate: xrpToUsdRate, isAvailable: true, isLoading: false } } // RLUSD: stablecoin pegged 1:1 with USD if (currency === 'RLUSD') { return { rate: 1, isAvailable: true, isLoading: false } } // For non-mainnet, return a mock rate for testing if (!isMainnet && currency && issuer) { return { rate: 1.5, isAvailable: true, isLoading: false } } // For tokens that need API fetch if (shouldFetch) { // Still loading if (isLoading || !isFetched) { return { rate: 0, isAvailable: false, isLoading: true } } // Fetched successfully with a valid price if (priceInXRP && priceInXRP > 0) { return { rate: priceInXRP * xrpToUsdRate, isAvailable: true, isLoading: false, } } // Fetched but no price available return { rate: 0, isAvailable: false, isLoading: false } } // No conversion available (e.g., token without issuer on mainnet) return { rate: 0, isAvailable: false, isLoading: false } } ================================================ FILE: src/containers/shared/hooks/useXRPToUSDRate.ts ================================================ import { useContext, useState } from 'react' import { useQuery } from 'react-query' import SocketContext from '../SocketContext' import { getAccountLines } from '../../../rippled/lib/rippled' import Log from '../log' const FETCH_INTERVAL_MILLIS = 5 * 1000 // 1 minute const XRP_USD_ORACLE_ACCOUNT = 'rXUMMaPpZqPutoRszR29jtC8amWq3APkx' const fetchXRPToUSDRate = async (rippledSocket: any) => { const accountLines = await getAccountLines( rippledSocket, XRP_USD_ORACLE_ACCOUNT, 1, ) return accountLines.lines[0]?.limit ?? 0.0 } /** * Returns the current exchange rate for XRP to USD. * Retries {@link FETCH_RETRY_COUNT} times on failure and falls back to the last successful value if fetching fails. */ export function useXRPToUSDRate(): number { const isMainnet = process.env.VITE_ENVIRONMENT === 'mainnet' const rippledSocket = useContext(SocketContext) const [lastRate, setLastRate] = useState(0.0) const { data } = useQuery( ['XRPToUSDRate'], () => fetchXRPToUSDRate(rippledSocket), { enabled: isMainnet, refetchInterval: FETCH_INTERVAL_MILLIS, onSuccess: (rate: number) => setLastRate(rate), // store the last successfully fetched rate onError: (error) => Log.error(error), // do nothing, last rate stays }, ) if (!isMainnet) { return 1.5 // This is chosen randomly for non-mainnet environments } return data ?? lastRate } ================================================ FILE: src/containers/shared/log.ts ================================================ import debug from 'debug' const BASE = 'xrpl-debug' const COLOURS = { trace: 'lightblue', info: 'blue', warn: 'orange', error: 'red', } class Log { debuggers = {} getDebugger(level) { if (!this.debuggers[level]) { this.debuggers[level] = debug(`${BASE}:${level}`) this.debuggers[level].color = COLOURS[level] } return this.debuggers[level] } generateMessage(level, message, source?) { const log = this.getDebugger(level) return source ? log(source, message) : log(message) } trace(message, source?) { return this.generateMessage('trace', message, source) } info(message, source?) { return this.generateMessage('info', message, source) } warn(message, source?) { return this.generateMessage('warn', message, source) } error(message, source?) { return this.generateMessage('error', message, source) } } const logger = new Log() export default logger ================================================ FILE: src/containers/shared/losTypes.ts ================================================ interface SocialLink { type: string url: string } export interface LOSToken { currency: string issuer_account: string name?: string asset_class?: string asset_subclass?: string price_change?: number daily_trades?: string icon?: string ttl?: number social_links?: SocialLink[] trustlines: number transfer_fee?: number issuer_domain?: string issuer_name?: string tvl_xrp?: number tvl_usd?: string market_cap?: string market_cap_usd?: string holders?: number circ_supply?: string daily_volume?: string daily_volume_usd?: string supply?: string trust_level?: number price?: string price_usd?: string index: number } ================================================ FILE: src/containers/shared/metaParser.tsx ================================================ import type { BaseTransaction } from 'xrpl' import { XRP_BASE } from './transactionUtils' import { ExplorerAmount } from './types' export const LedgerEntryTypes = { AccountRoot: 'AccountRoot', RippledState: 'RippleState', AMM: 'AMM', } // TODO: fix fee logic - filter out the fee only nodes - make sure fee isnt included in xrp deposits/withdraws export function getAuthAccounts(tx: any) { return tx.AuthAccounts?.map((acc: any) => acc?.AuthAccount?.Account) } /* Gets the AMM account ID */ export function getAMMAccountID(meta: any) { const account = findNodes(meta, LedgerEntryTypes.AMM)[0] if (account) return account.FinalFields?.Account || account.NewFields?.Account return undefined } export function getLPTokenAmount(meta: any) { const lpNode = findNodes(meta, LedgerEntryTypes.AMM)[0] if (!lpNode) { return undefined } const { NewFields: newFields, FinalFields: finalFields, PreviousFields: previousFields, } = lpNode const fields = newFields ?? finalFields const amount = newFields ? Number(newFields.LPTokenBalance.value) : Math.abs( Number(finalFields.LPTokenBalance.value) - Number(previousFields?.LPTokenBalance.value ?? 0), ) return { issuer: fields.issuer, currency: fields.currency, amount, } } /* Get the amount deposited from the metadata of the transaction XRP changes to accounts exist in the AccountRoot leger objects while other asset changes can be found in RippleState changes. */ export function findAssetAmount( meta: any, asset: { currency: string; issuer?: string }, tx: BaseTransaction, ): ExplorerAmount | undefined { if (asset.currency === 'XRP') return findXRPAmount(meta, tx) const assetNode = findNodeWithAsset( meta, LedgerEntryTypes.RippledState, asset, ) const amount = assetNode?.FinalFields?.Balance ? Math.abs( Number(assetNode.FinalFields.Balance.value) - Number(assetNode.PreviousFields.Balance.value), ) : Number(assetNode?.NewFields?.Balance) return amount ? { currency: asset.currency, issuer: asset.issuer, amount } : undefined } /* All affected rippled state entries will either have their absolute asset amounts increase or decrease by the same number so we can use any returned ripple state node. i.e. if we deposit into the amm, the amm balance will go up by the same amount that the account balance decreases, therefore it doesnt matter which node we use. */ function findXRPAmount( meta: any, tx: BaseTransaction, ): ExplorerAmount | undefined { const xrp = findNodes(meta, LedgerEntryTypes.AccountRoot).filter( (n: any) => n.FinalFields?.Account === tx.Account || n.NewFields?.Account === tx.Account, )[0] let balance = Math.abs( xrp?.FinalFields?.Balance ? Number(xrp.FinalFields.Balance) - Number(xrp.PreviousFields.Balance) : Number(xrp?.NewFields?.Balance), ) balance = Math.abs(balance - Number(tx.Fee)) return balance && balance !== 0 ? { currency: 'XRP', amount: balance / XRP_BASE, } : undefined } export function findNodeWithAsset( meta: any, entryType: string, asset: { currency: string; issuer?: string; amount?: number }, ) { return findNodes(meta, entryType)?.filter( (n: any) => n.FinalFields?.Balance.currency === asset.currency || n.NewFields?.Balance.currency === asset.currency, )[0] } export function findNodes(meta: any, entryType: string) { return meta.AffectedNodes.filter( (node: any) => node.CreatedNode?.LedgerEntryType === entryType || node.ModifiedNode?.LedgerEntryType === entryType || node.DeletedNode?.LedgerEntryType === entryType, ).map( (node: any) => node.CreatedNode || node.ModifiedNode || node.DeletedNode, ) } ================================================ FILE: src/containers/shared/mptUtils.ts ================================================ /** * MPT Metadata utilities for XLS-0089 standard validation and decoding * Based on xrpl.js implementation: * https://github.com/XRPLF/xrpl.js/blob/main/packages/xrpl/src/models/utils/mptokenMetadata.ts */ import { hexToString } from '@xrplf/isomorphic/utils' const MAX_MPT_META_BYTE_LENGTH = 1024 const MPT_META_URI_FIELDS = [ { long: 'uri', compact: 'u' }, { long: 'category', compact: 'c' }, { long: 'title', compact: 't' }, ] const isString = (value: unknown): value is string => typeof value === 'string' const isRecord = (value: unknown): value is Record => typeof value === 'object' && value !== null && !Array.isArray(value) const isHex = (value: unknown): boolean => isString(value) && /^[0-9A-Fa-f]*$/u.test(value) const MPT_META_ALL_FIELDS = [ { long: 'ticker', compact: 't', validate(obj: Record): string[] { if (obj[this.long] != null && obj[this.compact] != null) { return [ `${this.long}/${this.compact}: both long and compact forms present. expected only one.`, ] } const value = obj[this.long] ?? obj[this.compact] if (!isString(value) || !/^[A-Z0-9]{1,6}$/u.test(value)) { return [ `${this.long}/${this.compact}: should have uppercase letters (A-Z) and digits (0-9) only. Max 6 characters recommended.`, ] } return [] }, }, { long: 'name', compact: 'n', validate(obj: Record): string[] { if (obj[this.long] != null && obj[this.compact] != null) { return [ `${this.long}/${this.compact}: both long and compact forms present. expected only one.`, ] } const value = obj[this.long] ?? obj[this.compact] if (!isString(value) || value.length === 0) { return [`${this.long}/${this.compact}: should be a non-empty string.`] } return [] }, }, { long: 'icon', compact: 'i', validate(obj: Record): string[] { if (obj[this.long] != null && obj[this.compact] != null) { return [ `${this.long}/${this.compact}: both long and compact forms present. expected only one.`, ] } const value = obj[this.long] ?? obj[this.compact] if (!isString(value) || value.length === 0) { return [`${this.long}/${this.compact}: should be a non-empty string.`] } return [] }, }, { long: 'asset_class', compact: 'ac', validate(obj: Record): string[] { if (obj[this.long] != null && obj[this.compact] != null) { return [ `${this.long}/${this.compact}: both long and compact forms present. expected only one.`, ] } const value = obj[this.long] ?? obj[this.compact] const MPT_META_ASSET_CLASSES = [ 'rwa', 'memes', 'wrapped', 'gaming', 'defi', 'other', ] if (!isString(value) || !MPT_META_ASSET_CLASSES.includes(value)) { return [ `${this.long}/${this.compact}: should be one of ${MPT_META_ASSET_CLASSES.join(', ')}.`, ] } return [] }, }, { long: 'issuer_name', compact: 'in', validate(obj: Record): string[] { if (obj[this.long] != null && obj[this.compact] != null) { return [ `${this.long}/${this.compact}: both long and compact forms present. expected only one.`, ] } const value = obj[this.long] ?? obj[this.compact] if (!isString(value) || value.length === 0) { return [`${this.long}/${this.compact}: should be a non-empty string.`] } return [] }, }, { long: 'desc', compact: 'd', validate(obj: Record): string[] { if (obj[this.long] != null && obj[this.compact] != null) { return [ `${this.long}/${this.compact}: both long and compact forms present. expected only one.`, ] } if (obj[this.long] === undefined && obj[this.compact] === undefined) { return [] } const value = obj[this.long] ?? obj[this.compact] if (!isString(value) || value.length === 0) { return [`${this.long}/${this.compact}: should be a non-empty string.`] } return [] }, }, { long: 'asset_subclass', compact: 'as', required: false, validate(obj: Record): string[] { if (obj[this.long] != null && obj[this.compact] != null) { return [ `${this.long}/${this.compact}: both long and compact forms present. expected only one.`, ] } const value = obj[this.long] ?? obj[this.compact] if ( (obj.asset_class === 'rwa' || obj.ac === 'rwa') && value === undefined ) { return [ `${this.long}/${this.compact}: required when asset_class is rwa.`, ] } if (obj[this.long] === undefined && obj[this.compact] === undefined) { return [] } const MPT_META_ASSET_SUB_CLASSES = [ 'stablecoin', 'commodity', 'real_estate', 'private_credit', 'equity', 'treasury', 'other', ] if (!isString(value) || !MPT_META_ASSET_SUB_CLASSES.includes(value)) { return [ `${this.long}/${this.compact}: should be one of ${MPT_META_ASSET_SUB_CLASSES.join(', ')}.`, ] } return [] }, }, { long: 'uris', compact: 'us', required: false, validate(obj: Record): string[] { if (obj[this.long] != null && obj[this.compact] != null) { return [ `${this.long}/${this.compact}: both long and compact forms present. expected only one.`, ] } if (obj[this.long] === undefined && obj[this.compact] === undefined) { return [] } const value = obj[this.long] ?? obj[this.compact] if (!Array.isArray(value) || value.length === 0) { return [`${this.long}/${this.compact}: should be a non-empty array.`] } const messages: string[] = [] for (const uriObj of value) { if ( !isRecord(uriObj) || Object.keys(uriObj).length !== MPT_META_URI_FIELDS.length ) { messages.push( `${this.long}/${this.compact}: should be an array of objects each with uri/u, category/c, and title/t properties.`, ) } else { // Check for both long and compact forms in the same URI object for (const uriField of MPT_META_URI_FIELDS) { if ( uriObj[uriField.long] != null && uriObj[uriField.compact] != null ) { messages.push( `${this.long}/${this.compact}: should not have both ${uriField.long} and ${uriField.compact} fields.`, ) break } } const uri = uriObj.uri ?? uriObj.u const category = uriObj.category ?? uriObj.c const title = uriObj.title ?? uriObj.t if (!isString(uri) || !isString(category) || !isString(title)) { messages.push( `${this.long}/${this.compact}: should be an array of objects each with uri/u, category/c, and title/t properties.`, ) } } } return messages }, }, { long: 'additional_info', compact: 'ai', required: false, validate(obj: Record): string[] { if (obj[this.long] != null && obj[this.compact] != null) { return [ `${this.long}/${this.compact}: both long and compact forms present. expected only one.`, ] } if (obj[this.long] === undefined && obj[this.compact] === undefined) { return [] } const value = obj[this.long] ?? obj[this.compact] if (!isString(value) && !isRecord(value)) { return [ `${this.long}/${this.compact}: should be a string or JSON object.`, ] } return [] }, }, ] /** * Expands compact field names to their long form equivalents. * Reverse operation of shortenKeys in xrpl.js. * * @param input - Object with potentially compact field names. * @param mappings - Array of field mappings with long and compact names. * @returns Object with expanded long field names. */ function expandKeys( input: Record, mappings: Array<{ long: string; compact: string }>, ): Record { const output: Record = {} for (const [key, value] of Object.entries(input)) { const mapping = mappings.find( ({ long, compact }) => long === key || compact === key, ) // Extra keys stays there if (mapping === undefined) { output[key] = value // eslint-disable-next-line no-continue continue } // Both long and compact forms are present if ( input[mapping.long] !== undefined && input[mapping.compact] !== undefined ) { output[key] = value // eslint-disable-next-line no-continue continue } output[mapping.long] = value } return output } /** * Decodes and parses hex-encoded MPTokenMetadata into an object. * Converts compact field names to their corresponding long-form equivalents. * * @param input - Hex encoded MPTokenMetadata. * @returns Parsed MPTokenMetadata object with long field names, or undefined if invalid. */ export function parseMPTokenMetadata( input: string | undefined, ): Record | undefined { if (!input) { return undefined } if (!isHex(input)) { return undefined } let jsonMetaData: unknown try { jsonMetaData = JSON.parse(hexToString(input) || '') } catch { return undefined } if (!isRecord(jsonMetaData)) { return undefined } let output = jsonMetaData output = expandKeys(output, MPT_META_ALL_FIELDS) if (Array.isArray(output.uris)) { output.uris = output.uris.map( (uri: Record): Record => { if (isRecord(uri)) { return expandKeys(uri, MPT_META_URI_FIELDS) } return uri }, ) } if (Array.isArray(output.us)) { output.us = output.us.map( (uri: Record): Record => { if (isRecord(uri)) { return expandKeys(uri, MPT_META_URI_FIELDS) } return uri }, ) } return output } /** * Validates MPTokenMetadata adheres to XLS-89 standard. * Takes a hex-encoded metadata string as input, returns true if compliant. * * @param input - Hex encoded MPTokenMetadata. * @returns true if MPTokenMetadata adheres to XLS-89 standard, false otherwise. */ export function isMPTokenMetadataCompliant(input: string | undefined): boolean { // Validate input exists if (!input) { return false } // Validate hex format if (!isHex(input)) { return false } // Validate byte length if (input.length / 2 > MAX_MPT_META_BYTE_LENGTH) { return false } // Parse JSON let jsonMetaData: unknown try { jsonMetaData = JSON.parse(hexToString(input) || '') } catch { return false } // Validate JSON structure if (!isRecord(jsonMetaData)) { return false } if (Object.keys(jsonMetaData).length > MPT_META_ALL_FIELDS.length) { return false } const obj = jsonMetaData for (const property of MPT_META_ALL_FIELDS) { if (property.validate(obj).length > 0) { return false } } return true } ================================================ FILE: src/containers/shared/navigate.ts ================================================ /** * Thin wrapper around window.location.assign so that it can be * mocked in tests (jsdom 26+ freezes Location properties). */ export function locationAssign(url: string): void { window.location.assign(url) } ================================================ FILE: src/containers/shared/routing.tsx ================================================ import { ReactNode, Ref } from 'react' import { generatePath, NavLink as RouterLink, useParams as useRouterParams, } from 'react-router' /** * A definition for a react-router route that allows for typed routes * * @example * export const ACCOUNT_ROUTE: RouteDefinition<{ * id?: string * tab?: 'assets' | 'transactions' * assetType?: 'issued' | 'nfts' * }> = { * path: '/accounts/:id?/:tab?/:assetType?', * } */ export interface RouteDefinition { path: string // react-router style path with replacements ex. "/ledgers/:identifier" sampleParams?: T // A phantom field used for typing the parameters on `NavigationLink` and `buildPath`. } /** * Produce a link path. In `custom` network mode it will prepend the rippled entrypoint * @param route * @param params */ export function buildPath(route: RouteDefinition, params: T) { const path = (process.env.VITE_ENVIRONMENT === 'custom' ? `/${window.location.pathname.split('/')[1]}` : '') + route.path return generatePath( path, params && Object.fromEntries(Object.entries(params)), ) } /** * A wrapper for `useRouterParams` that returns a typed object of the routes params * @param route */ export function useRouteParams(route: T) { return useRouterParams>() } export interface LinkProps< T extends RouteDefinition, K extends T['sampleParams'] = T['sampleParams'], > { children?: ReactNode to: T params?: K innerRef?: Ref [key: string]: any } /** * A wrapper for `Link` that provides a typed interface for params and uses `buildPath` to build the url/ * @param to * @param children * @param params * @param rest All other parameters pass through */ export function ExplorerLink({ to, children, params, ...rest }: LinkProps>) { const path = buildPath(to, params || {}) return ( // eslint-disable-next-line react/jsx-props-no-spreading {children} ) } export { ExplorerLink as RouteLink } ================================================ FILE: src/containers/shared/services/CursorPaginationService.ts ================================================ /** * Generic cursor-based pagination service with client-side caching and prefetching. * * Fetches data in large batches from an API, caches the results, and serves * smaller pages to the UI. When the user approaches the end of cached data, * it prefetches the next batch in the background for a seamless experience. * * Usage: * const service = new CursorPaginationService({ * fetchFn: myApiFetchFunction, * formatFn: (raw) => transformToMyItem(raw), * batchSize: 200, // items per API call * pageSize: 10, // items per UI page * }) * * const page = await service.getPage('someId', 1) * * Currently used by: * - DexTradesPaginationService (Token IOU page) * - TransfersPaginationService (Token IOU/MPT pages) */ /** * Fetch function signature matching LOS cursor-based API endpoints. * The `id` parameter is typically a token ID or account ID. */ export type PaginationFetchFn = ( id: string, size: number, cursor?: any, direction?: string, sortField?: string, sortOrder?: string, ) => Promise<{ results: any[] next_cursor?: any prev_cursor?: any }> /** Transforms a raw API result into the desired output type. */ export type PaginationFormatFn = (raw: any) => T export interface PaginationResult { items: T[] totalItems: number hasMore: boolean isLoading: boolean } interface CursorPaginationServiceOptions { fetchFn: PaginationFetchFn formatFn: PaginationFormatFn /** Number of items to fetch per API call (default: 200) */ batchSize?: number /** Number of items to display per UI page (default: 10) */ pageSize?: number /** Trigger prefetch when user reaches this fraction of cached data (default: 0.7) */ prefetchThreshold?: number } export class CursorPaginationService { /** Cached items keyed by "{id}:{sortField}:{sortOrder}" */ private cache: Map = new Map() /** Cursor for fetching the next batch (forward pagination) */ private nextCursorCache: Map = new Map() /** Cursor for fetching the previous batch (backward pagination) */ private prevCursorCache: Map = new Map() /** In-flight fetch promises to prevent duplicate requests */ private fetchingCache: Map> = new Map() /** True when the server has no more data in the forward direction */ private hasReachedEndCache: Map = new Map() /** True when the server has no more data in the backward direction */ private hasReachedStartCache: Map = new Map() private readonly fetchFn: PaginationFetchFn private readonly formatFn: PaginationFormatFn private readonly BATCH_SIZE: number private readonly PAGE_SIZE: number private readonly PREFETCH_THRESHOLD: number constructor(options: CursorPaginationServiceOptions) { this.fetchFn = options.fetchFn this.formatFn = options.formatFn this.BATCH_SIZE = options.batchSize ?? 200 this.PAGE_SIZE = options.pageSize ?? 10 this.PREFETCH_THRESHOLD = options.prefetchThreshold ?? 0.7 } /** Builds a cache key from the id and sort configuration. */ // eslint-disable-next-line class-methods-use-this private getCacheKey( id: string, sortField?: string, sortOrder?: string, ): string { const sortPart = sortField ? `:${sortField}:${sortOrder}` : '' return `${id}${sortPart}` } /** * Fetches a batch of items from the API and appends/prepends to the cache. * Updates cursors and end-of-data flags based on the response. */ private async fetchMore( id: string, sortField?: string, sortOrder?: string, direction: string = 'next', ): Promise { const cacheKey = this.getCacheKey(id, sortField, sortOrder) const cursor = direction === 'prev' ? this.prevCursorCache.get(cacheKey) : this.nextCursorCache.get(cacheKey) const response = await this.fetchFn( id, this.BATCH_SIZE, cursor, direction, sortField, sortOrder, ) const items: T[] = [] if (response && response.results) { response.results.forEach((raw: any) => { items.push(this.formatFn(raw)) }) } // Prepend for backward pagination, append for forward const existingItems = this.cache.get(cacheKey) || [] const updatedItems = direction === 'prev' ? [...items, ...existingItems] : [...existingItems, ...items] this.cache.set(cacheKey, updatedItems) // Update cursors. No cursor in the response means we've reached the boundary. if (direction === 'prev') { if (response && response.prev_cursor) { this.prevCursorCache.set(cacheKey, response.prev_cursor) } else { this.hasReachedStartCache.set(cacheKey, true) } } else if (response && response.next_cursor) { this.nextCursorCache.set(cacheKey, response.next_cursor) } else { this.hasReachedEndCache.set(cacheKey, true) } // Empty results also signal we've reached the boundary if (items.length === 0) { if (direction === 'prev') { this.hasReachedStartCache.set(cacheKey, true) } else { this.hasReachedEndCache.set(cacheKey, true) } } } /** * Returns a page of items. Fetches the first batch on initial call, * then serves from cache. Triggers a background prefetch when the user * reaches PREFETCH_THRESHOLD (80%) of cached data. */ async getPage( id: string, page: number, pageSize?: number, sortField?: string, sortOrder?: string, ): Promise> { const cacheKey = this.getCacheKey(id, sortField, sortOrder) const validPageSize = pageSize && pageSize > 0 ? pageSize : this.PAGE_SIZE const startIndex = (page - 1) * validPageSize const endIndex = startIndex + validPageSize let allItems = this.cache.get(cacheKey) || [] let hasReachedEnd = this.hasReachedEndCache.get(cacheKey) || false // Initial fetch if cache is empty if (allItems.length === 0) { await this.fetchMore(id, sortField, sortOrder) allItems = this.cache.get(cacheKey) || [] hasReachedEnd = this.hasReachedEndCache.get(cacheKey) || false } // If the requested page is beyond the cache, await any in-flight prefetch if (endIndex > allItems.length && !hasReachedEnd) { const existingFetch = this.fetchingCache.get(cacheKey) if (existingFetch) { await existingFetch allItems = this.cache.get(cacheKey) || [] hasReachedEnd = this.hasReachedEndCache.get(cacheKey) || false } } // Snapshot cache size before any background prefetch const cacheSizeBeforePrefetch = allItems.length // Prefetch the next batch in the background when approaching cache boundary const cacheThreshold = cacheSizeBeforePrefetch * this.PREFETCH_THRESHOLD if (endIndex > cacheThreshold && !hasReachedEnd) { const existingFetch = this.fetchingCache.get(cacheKey) if (!existingFetch) { const fetchPromise = this.fetchMore(id, sortField, sortOrder).finally( () => { this.fetchingCache.delete(cacheKey) }, ) this.fetchingCache.set(cacheKey, fetchPromise) } } const pageItems = allItems.slice( startIndex, Math.min(endIndex, cacheSizeBeforePrefetch), ) const hasMore = endIndex < allItems.length return { items: pageItems, totalItems: allItems.length, hasMore, isLoading: false, } } /** Clears cached data. Pass an id to clear a specific entry, or omit to clear all. */ clearCache(id?: string, sortField?: string, sortOrder?: string): void { if (id) { const cacheKey = this.getCacheKey(id, sortField, sortOrder) this.cache.delete(cacheKey) this.nextCursorCache.delete(cacheKey) this.prevCursorCache.delete(cacheKey) this.fetchingCache.delete(cacheKey) this.hasReachedEndCache.delete(cacheKey) this.hasReachedStartCache.delete(cacheKey) } else { this.cache.clear() this.nextCursorCache.clear() this.prevCursorCache.clear() this.fetchingCache.clear() this.hasReachedEndCache.clear() this.hasReachedStartCache.clear() } } /** Returns the number of items currently cached for the given id. */ getCachedItemCount( id: string, sortField?: string, sortOrder?: string, ): number { const cacheKey = this.getCacheKey(id, sortField, sortOrder) return this.cache.get(cacheKey)?.length || 0 } } ================================================ FILE: src/containers/shared/test/NumberFormattingUtils.test.ts ================================================ import { formatUsdValue, formatTokenBalance, calculateFormattedUsdBalance, parseAmount, parseCurrencyAmount, parseIntegerAmount, parsePrice, parsePercent, } from '../NumberFormattingUtils' describe('NumberFormattingUtils', () => { const lang = 'en-US' describe('formatUsdValue', () => { it('returns "--" for zero value', () => { expect(formatUsdValue(0, lang)).toBe('--') }) it('formats regular USD value (>= $1) with 2 decimals', () => { expect(formatUsdValue(1, lang)).toBe('$1.00') expect(formatUsdValue(100, lang)).toBe('$100.00') expect(formatUsdValue(23.565, lang)).toBe('$23.57') expect(formatUsdValue(5678.9, lang)).toBe('$5,678.90') }) it('formats small USD value (>= $0.0001, < $1) with 4 decimals', () => { expect(formatUsdValue(0.0001, lang)).toBe('$0.0001') expect(formatUsdValue(0.00014, lang)).toBe('$0.0001') expect(formatUsdValue(0.00015, lang)).toBe('$0.0002') expect(formatUsdValue(0.25, lang)).toBe('$0.25') expect(formatUsdValue(0.5, lang)).toBe('$0.50') expect(formatUsdValue(0.9999, lang)).toBe('$0.9999') expect(formatUsdValue(0.99995, lang)).toBe('$1.00') }) it('formats extra small USD value (< $0.0001) with up to 10 decimals', () => { expect(formatUsdValue(0.00000000051, lang)).toBe('$0.0000000005') expect(formatUsdValue(0.000001, lang)).toBe('$0.000001') expect(formatUsdValue(0.0000051, lang)).toBe('$0.0000051') expect(formatUsdValue(0.000014, lang)).toBe('$0.000014') expect(formatUsdValue(0.00005, lang)).toBe('$0.00005') }) it('handles negative values', () => { expect(formatUsdValue(-100, lang)).toBe('-$100.00') expect(formatUsdValue(-0.0001, lang)).toBe('-$0.0001') expect(formatUsdValue(-200, lang)).toBe('-$200.00') expect(formatUsdValue(-0.0005, lang)).toBe('-$0.0005') }) }) describe('formatTokenBalance', () => { it('formats large token balance (> 999) with 2 decimals', () => { expect(formatTokenBalance(1000, lang)).toBe('1,000') expect(formatTokenBalance(5000, lang)).toBe('5,000') expect(formatTokenBalance(1234567.891, lang)).toBe('1,234,567.89') }) it('formats small token balance (<= 999) with 4 decimals', () => { expect(formatTokenBalance(0, lang)).toBe('0') expect(formatTokenBalance(1, lang)).toBe('1') expect(formatTokenBalance(100, lang)).toBe('100') expect(formatTokenBalance(999, lang)).toBe('999') expect(formatTokenBalance(0.1234, lang)).toBe('0.1234') expect(formatTokenBalance(500.56784, lang)).toBe('500.5678') expect(formatTokenBalance(500.56785, lang)).toBe('500.5679') }) it('handles negative token balances', () => { expect(formatTokenBalance(-1000, lang)).toBe('-1,000') expect(formatTokenBalance(-100, lang)).toBe('-100') }) }) describe('calculateFormattedUsdBalance', () => { it('returns all "--" when price is zero', () => { const result = calculateFormattedUsdBalance(1000, 0, lang) expect(result).toEqual({ formattedUsdPrice: '--', formattedBalance: '1,000', // Balance is formatted even when price is zero formattedBalanceUsd: '--', }) }) it('calculates formatted USD balance correctly for regular values', () => { const result = calculateFormattedUsdBalance(100, 50, lang) expect(result).toEqual({ formattedUsdPrice: '$50.00', formattedBalance: '100', formattedBalanceUsd: '$5,000.00', }) }) it('calculates formatted USD balance correctly for small token balance', () => { const result = calculateFormattedUsdBalance(0.5, 100, lang) expect(result).toEqual({ formattedUsdPrice: '$100.00', formattedBalance: '0.5', formattedBalanceUsd: '$50.00', }) }) it('calculates formatted USD balance correctly for small price', () => { const result = calculateFormattedUsdBalance(1000, 0.0005, lang) expect(result).toEqual({ formattedUsdPrice: '$0.0005', formattedBalance: '1,000', formattedBalanceUsd: '$0.50', }) }) it('calculates formatted USD balance correctly for extra small price', () => { const result = calculateFormattedUsdBalance(10000, 0.00001, lang) expect(result).toEqual({ formattedUsdPrice: '$0.00001', formattedBalance: '10,000', formattedBalanceUsd: '$0.10', }) }) it('handles calculations resulting in small USD balances', () => { const result = calculateFormattedUsdBalance(10, 0.05, lang) expect(result).toEqual({ formattedUsdPrice: '$0.05', formattedBalance: '10', formattedBalanceUsd: '$0.50', }) }) it('handles calculations with decimal token balances', () => { const result = calculateFormattedUsdBalance(123.4561, 2.5, lang) expect(result).toEqual({ formattedUsdPrice: '$2.50', formattedBalance: '123.4561', formattedBalanceUsd: '$308.64', }) }) it('handles large token balances with regular prices', () => { const result = calculateFormattedUsdBalance(5000, 1.25, lang) expect(result).toEqual({ formattedUsdPrice: '$1.25', formattedBalance: '5,000', formattedBalanceUsd: '$6,250.00', }) }) it('handles calculations that result in very small USD balances', () => { const result = calculateFormattedUsdBalance(0.1, 0.0001, lang) expect(result).toEqual({ formattedUsdPrice: '$0.0001', formattedBalance: '0.1', formattedBalanceUsd: '$0.00001', }) }) it('handles zero token balance', () => { const result = calculateFormattedUsdBalance(0, 100, lang) expect(result).toEqual({ formattedUsdPrice: '$100.00', formattedBalance: '0', formattedBalanceUsd: '--', }) }) it('correctly removes commas and dollar signs in calculation', () => { // Large values that will have commas const result = calculateFormattedUsdBalance(1234, 5.671, lang) expect(result.formattedUsdPrice).toBe('$5.67') expect(result.formattedBalance).toBe('1,234') // 1234 * 5.67 = 6,996.78 expect(result.formattedBalanceUsd).toBe('$6,996.78') }) }) describe('Edge Cases', () => { it('handles very large numbers', () => { expect(formatUsdValue(1000000, lang)).toBe('$1,000,000.00') expect(formatTokenBalance(999999999, lang)).toBe('999,999,999') }) }) describe('parseAmount', () => { it('formats billions', () => { expect(parseAmount(1500000000)).toBe('1.5B') expect(parseAmount(12345678901)).toBe('12.3B') }) it('formats millions', () => { expect(parseAmount(1500000)).toBe('1.5M') expect(parseAmount(12345678)).toBe('12.3M') }) it('formats thousands (>= 10,000) with abbreviations', () => { expect(parseAmount(15000)).toBe('15.0K') expect(parseAmount(123456)).toBe('123.5K') expect(parseAmount(10000)).toBe('10.0K') }) it('formats medium numbers (1 to 9,999) with 2 decimal places and commas', () => { expect(parseAmount(9999)).toBe('9,999.00') expect(parseAmount(1234.5)).toBe('1,234.50') expect(parseAmount(123.45)).toBe('123.45') expect(parseAmount(1)).toBe('1.00') }) it('handles zero', () => { expect(parseAmount(0)).toBe('0.00') }) it('handles very small numbers with < 0.0001 threshold', () => { expect(parseAmount(0.000001)).toBe('< 0.0001') expect(parseAmount(0.0000999)).toBe('< 0.0001') }) it('handles scientific notation numbers', () => { expect(parseAmount(1e-10)).toBe('< 0.0001') }) it('formats small numbers (< 1) with 4 decimal places', () => { expect(parseAmount(0.0004231)).toBe('0.0004') expect(parseAmount(0.0001)).toBe('0.0001') expect(parseAmount(0.999)).toBe('0.9990') }) it('handles string inputs', () => { expect(parseAmount('1500000')).toBe('1.5M') expect(parseAmount('9999')).toBe('9,999.00') expect(parseAmount('0.0004231')).toBe('0.0004') expect(parseAmount('0.00005')).toBe('< 0.0001') }) }) describe('parseCurrencyAmount', () => { it('formats currency with dollar sign', () => { expect(parseCurrencyAmount(1500000)).toBe('$1.5M') expect(parseCurrencyAmount(9999)).toBe('$9,999.00') expect(parseCurrencyAmount(123.45)).toBe('$123.45') expect(parseCurrencyAmount(0)).toBe('$0.00') }) it('handles very small currency amounts with non-breaking space', () => { expect(parseCurrencyAmount(0.00005)).toBe('<\u00A0$0.0001') expect(parseCurrencyAmount(0.0004231)).toBe('$0.0004') }) it('handles string inputs', () => { expect(parseCurrencyAmount('1500000')).toBe('$1.5M') expect(parseCurrencyAmount('9999')).toBe('$9,999.00') expect(parseCurrencyAmount('0.0004231')).toBe('$0.0004') expect(parseCurrencyAmount('0.00005')).toBe('<\u00A0$0.0001') }) }) describe('parseIntegerAmount', () => { it('formats large integers (>= 10,000) with abbreviations', () => { expect(parseIntegerAmount(1500000)).toBe('1.5M') expect(parseIntegerAmount(150000)).toBe('150.0K') expect(parseIntegerAmount(2300000000)).toBe('2.3B') expect(parseIntegerAmount(12345)).toBe('12.3K') expect(parseIntegerAmount(10000)).toBe('10.0K') }) it('formats smaller integers (< 10,000) with commas', () => { expect(parseIntegerAmount(9999)).toBe('9,999') expect(parseIntegerAmount(1234)).toBe('1,234') expect(parseIntegerAmount(123)).toBe('123') }) it('handles zero', () => { expect(parseIntegerAmount(0)).toBe('0') }) it('rounds decimal values to integers', () => { expect(parseIntegerAmount(123.7)).toBe('124') expect(parseIntegerAmount(123.4)).toBe('123') }) it('handles string inputs', () => { expect(parseIntegerAmount('12345')).toBe('12.3K') expect(parseIntegerAmount('1500000')).toBe('1.5M') expect(parseIntegerAmount('9999')).toBe('9,999') }) }) describe('parsePrice', () => { it('formats very large prices (>= $1M) with abbreviations and 2 decimal places', () => { expect(parsePrice(1500000)).toBe('$1.50M') expect(parsePrice(2300000000)).toBe('$2.30B') }) it('formats high prices (>= $10,000) with no decimal places', () => { expect(parsePrice(99999)).toBe('$99,999') expect(parsePrice(50000)).toBe('$50,000') }) it('formats regular prices (1 to 9,999) with 2 decimal places and commas', () => { expect(parsePrice(9999)).toBe('$9,999.00') expect(parsePrice(1)).toBe('$1.00') }) it('formats small prices (< 1) with 4 decimal places', () => { expect(parsePrice(0.9999)).toBe('$0.9999') expect(parsePrice(0.0001)).toBe('$0.0001') }) it('handles very small prices with threshold', () => { expect(parsePrice(0.00005)).toBe('<\u00A0$0.0001') expect(parsePrice(0.000001)).toBe('<\u00A0$0.0001') }) it('handles zero', () => { expect(parsePrice(0)).toBe('$0.00') }) it('handles string inputs', () => { expect(parsePrice('1500000')).toBe('$1.50M') expect(parsePrice('12345')).toBe('$12,345') expect(parsePrice('0.1234')).toBe('$0.1234') }) }) describe('parsePercent', () => { it('formats percentages with % sign and 2 decimal places', () => { expect(parsePercent(12.345)).toBe('12.35%') expect(parsePercent(12.34)).toBe('12.34%') expect(parsePercent(-5.67)).toBe('-5.67%') }) it('handles very small percentages (< 0.01%) with default cutoff', () => { expect(parsePercent(0.005)).toBe('0.00%') expect(parsePercent(0.009)).toBe('0.00%') expect(parsePercent(-0.005)).toBe('0.00%') }) it('handles regular percentages', () => { expect(parsePercent(0.01)).toBe('0.01%') expect(parsePercent(0.1)).toBe('0.10%') expect(parsePercent(12)).toBe('12.00%') }) it('handles zero', () => { expect(parsePercent(0)).toBe('0.00%') }) it('handles custom cutoff for very small percentages', () => { expect(parsePercent(0.0001, 4, 0.0001)).toBe('0.0001%') expect(parsePercent(0.0005, 4, 0.0001)).toBe('0.0005%') expect(parsePercent(0.001, 4, 0.0001)).toBe('0.0010%') expect(parsePercent(0.005, 4, 0.0001)).toBe('0.0050%') expect(parsePercent(0.00005, 4, 0.0001)).toBe('0.0000%') expect(parsePercent(0.00009, 4, 0.0001)).toBe('0.0000%') }) it('handles custom digits parameter', () => { expect(parsePercent(12.3456, 4)).toBe('12.3456%') expect(parsePercent(12.3456, 1)).toBe('12.3%') expect(parsePercent(12.3456, 0)).toBe('12%') }) }) }) ================================================ FILE: src/containers/shared/test/SocketContext.test.ts ================================================ import { XrplClient } from 'xrpl-client' import { getSocket } from '../SocketContext' jest.mock('xrpl-client', () => ({ XrplClient: jest.fn(), })) describe('getSocket', () => { const OLD_ENV = process.env beforeEach(() => { jest.resetModules() // Most important - it clears the cache process.env = { ...OLD_ENV } // Make a copy }) afterAll(() => { process.env = OLD_ENV // Restore old environment }) describe('server defined entrypoint', () => { beforeEach(() => { process.env.VITE_RIPPLED_HOST = 'somewhere.com' process.env.VITE_P2P_RIPPLED_HOST = 'cli-somewhere.com' process.env.VITE_RIPPLED_WS_PORT = '51233' delete process.env.VITE_INSECURE_WS delete process.env.VITE_ENVIRONMENT }) it('should instantiate with environment variables', () => { const client = getSocket() expect(XrplClient).toHaveBeenNthCalledWith( 1, ['wss://somewhere.com:51233'], { tryAllNodes: true, }, ) expect(XrplClient).toHaveBeenNthCalledWith(2, [ 'wss://cli-somewhere.com:51233', ]) expect((client as any).p2pSocket).toBeDefined() }) it('should instantiate with multiple hosts', () => { process.env.VITE_RIPPLED_HOST = 'somewhere.com,elsewhere.com' const client = getSocket() expect(XrplClient).toHaveBeenNthCalledWith( 1, ['wss://somewhere.com:51233', 'wss://elsewhere.com:51233'], { tryAllNodes: true, }, ) expect(XrplClient).toHaveBeenNthCalledWith(2, [ 'wss://cli-somewhere.com:51233', ]) expect((client as any).p2pSocket).toBeDefined() }) it('should use VITE_INSECURE_WS variable to use ws', () => { process.env.VITE_INSECURE_WS = '1' const client = getSocket() expect(XrplClient).toHaveBeenNthCalledWith( 1, ['ws://somewhere.com:51233'], { tryAllNodes: true, }, ) expect(XrplClient).toHaveBeenNthCalledWith(2, [ 'ws://cli-somewhere.com:51233', ]) expect((client as any).p2pSocket).toBeDefined() }) it('should not create p2pSocket when VITE_P2P_RIPPLED_HOST is not set', () => { delete process.env.VITE_P2P_RIPPLED_HOST const client = getSocket() expect((client as any).p2pSocket).not.toBeDefined() }) }) describe('user defined entrypoint', () => { beforeEach(() => { delete process.env.VITE_RIPPLED_HOST delete process.env.VITE_P2P_RIPPLED_HOST process.env.VITE_RIPPLED_WS_PORT = '51233' delete process.env.VITE_INSECURE_WS delete process.env.VITE_ENVIRONMENT }) it('should use ignore VITE_RIPPLED_WS_PORT when supplied entry point has a port', () => { const client = getSocket('hello.com:4444') expect(XrplClient).toHaveBeenNthCalledWith(1, ['wss://hello.com:4444'], { tryAllNodes: true, }) expect((client as any).p2pSocket).not.toBeDefined() }) it('should use ws VITE_INSECURE_WS variable is true', () => { process.env.VITE_INSECURE_WS = '1' const client = getSocket('hello.com:4444') expect(XrplClient).toHaveBeenNthCalledWith(1, ['ws://hello.com:4444'], { tryAllNodes: true, }) expect((client as any).p2pSocket).not.toBeDefined() }) it('should use ws when supplied entry is for a localhost', () => { const client = getSocket('localhost') expect(XrplClient).toHaveBeenNthCalledWith(1, ['ws://localhost:51233'], { tryAllNodes: true, }) expect((client as any).p2pSocket).not.toBeDefined() }) }) }) ================================================ FILE: src/containers/shared/test/amendmentUtils.test.ts ================================================ import { getRippledVersion } from '../amendmentUtils' const versionTable = [ ['NonFungibleTokensV1_1', '1.9.2'], ['fixAmendmentMajorityCalc', '1.6.0'], ['HardenedValidations', '1.6.0'], ['fix1781', '1.6.0'], ['FlowCross', '0.70.0'], ['fixQualityUpperBound', '1.5.0'], ['RequireFullyCanonicalSig', '1.5.0'], ['Checks', '0.90.0'], ['DeletableAccounts', '1.4.0'], ['fixCheckThreading', '1.4.0'], ['fixPayChanRecipientOwnerDir', '1.4.0'], ['fixMasterKeyAsRegularKey', '1.3.1'], ['MultiSignReserve', '1.2.0'], ['fixTakerDryOfferRemoval', '1.2.0'], ['fix1578', '1.2.0'], ['DepositPreauth', '1.1.0'], ['fix1515', '1.1.0'], ['fix1543', '1.0.0'], ['fix1623', '1.0.0'], ['fix1571', '1.0.0'], ['DepositAuth', '0.90.0'], ['fix1513', '0.90.0'], ['fix1201', '0.80.0'], ['fix1512', '0.80.0'], ['fix1523', '0.80.0'], ['fix1528', '0.80.0'], ['SortedDirectories', '0.80.0'], ['EnforceInvariants', '0.70.0'], ['fix1373', '0.70.0'], ['Escrow', '0.60.0'], ['fix1368', '0.60.0'], ['PayChan', '0.33.0'], ['TickSize', '0.50.0'], ['CryptoConditions', '0.50.0'], ['Flow', '0.33.0'], ['TrustSetAuth', '0.30.0'], ['MultiSign', '0.31.0'], ['FeeEscalation', '0.31.0'], ] describe('getRippledVersion:', () => { it.each(versionTable)( `should for amendment "%s" return the version "%s"`, async (name, expectedVersion) => { const retrievedVersion = await getRippledVersion(name) return expect(retrievedVersion).toEqual(expectedVersion) }, ) }) ================================================ FILE: src/containers/shared/test/notification.test.tsx ================================================ import { render, waitFor } from '@testing-library/react' import { Notification } from '../components/Notification' describe('Notification', () => { it('renders without crashing', () => { render() }) it('disappears', async () => { const { container } = render( , ) expect(container.querySelector('.notification')).toBeInTheDocument() expect(container.querySelector('.notification')).toHaveClass('danger') expect(container.querySelector('.notification span')).toHaveTextContent( 'boo!', ) await waitFor( () => { expect(container.querySelector('.notification')).not.toBeInTheDocument() }, { timeout: 300 }, ) }) }) ================================================ FILE: src/containers/shared/test/txDetails.test.js ================================================ import { render } from '@testing-library/react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router' import i18n from '../../../i18n/testConfig' import EnableAmendment from '../../Transactions/test/mock_data/EnableAmendment.json' import { TxDetails } from '../components/TxDetails' import summarize from '../../../rippled/lib/txSummary' describe('TxDetails', () => { const renderTxDetails = (tx) => render( s} language="en-US" instructions={summarize(tx, true).details.instructions} type={tx.tx.TransactionType} /> , ) it('renders EnableAmendment without crashing', () => { renderTxDetails(EnableAmendment) }) }) ================================================ FILE: src/containers/shared/test/utils.test.ts ================================================ import { isEarlierVersion, formatLargeNumber, localizeNumber, formatPrice, getLocalizedCurrencySymbol, localizeDate, durationToHuman, formatDurationDetailed, formatAsset, shortenAccount, shortenDomain, shortenNFTTokenID, shortenMPTID, shortenLPToken, stripHttpProtocol, convertToHttpURL, } from '../utils' describe('utils', () => { it('isEarlierVersion compare versions correctly', () => { expect(isEarlierVersion('1.6.2', 'N/A')).toEqual(false) expect(isEarlierVersion('N/A', '0.9.4')).toEqual(true) expect(isEarlierVersion('N/A', 'N/A')).toEqual(false) expect(isEarlierVersion('1.9.4', '1.9.4')).toEqual(false) expect(isEarlierVersion('0.9.2', '1.8.4')).toEqual(true) expect(isEarlierVersion('1.8.2', '1.9.4')).toEqual(true) expect(isEarlierVersion('1.9.2', '1.9.4')).toEqual(true) expect(isEarlierVersion('1.9.2', '1.9.2-b1')).toEqual(false) expect(isEarlierVersion('1.9.2', '1.9.2-rc2')).toEqual(false) expect(isEarlierVersion('1.9.4-b2', '1.9.4-rc1')).toEqual(true) expect(isEarlierVersion('1.9.4-b1', '1.9.4-b2')).toEqual(true) expect(isEarlierVersion('1.9.4-rc1', '1.9.4-rc2')).toEqual(true) expect(isEarlierVersion('1.6.2', '0.9.4')).toEqual(false) expect(isEarlierVersion('1.9.4', '1.8.6')).toEqual(false) expect(isEarlierVersion('1.9.4', '1.9.2-rc5')).toEqual(false) expect(isEarlierVersion('1.8.0-rc1', '1.8.0')).toEqual(true) expect(isEarlierVersion('1.9.4-rc1', '1.9.4-b3')).toEqual(false) expect(isEarlierVersion('1.9.4-b2', '1.9.4-b1')).toEqual(false) expect(isEarlierVersion('1.9.4-rc2', '1.9.4-rc1')).toEqual(false) }) it('formatLargeNumber format numbers correctly', () => { expect(formatLargeNumber()).toEqual({ num: '0.0', unit: '' }) expect(formatLargeNumber(2000000000000)).toEqual({ num: '2.0', unit: 'T', }) expect(formatLargeNumber(3300000000)).toEqual({ num: '3.3', unit: 'B' }) expect(formatLargeNumber(44400000)).toEqual({ num: '44.4', unit: 'M' }) expect(formatLargeNumber(555500)).toEqual({ num: '555.5', unit: 'K' }) expect(formatLargeNumber(66.666, 2)).toEqual({ num: '66.67', unit: '' }) }) it('localizeNumber', () => { expect(localizeNumber()).toEqual(null) expect( localizeNumber(12.2334, 'en-US', { maximumFractionDigits: 2 }), ).toEqual('12.23') expect( localizeNumber(12.2334, 'en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 2, }), ).toEqual('$12.23') expect( localizeNumber(12.2334, 'en-US', { style: 'currency', currency: 'xrp', maximumFractionDigits: 2, }), ).toEqual('12.23') expect( localizeNumber(12.2334, 'en-US', { style: 'currency', currency: 'PRX', maximumFractionDigits: 2, }), ).toEqual('12.23') expect( localizeNumber(12.2334, 'en-US', { style: 'currency', currency: 'XRp', maximumFractionDigits: 2, }), ).toEqual('12.23') expect( localizeNumber(12.2334, 'en-US', { style: 'currency', currency: 'xrp', minimumFractionDigits: 6, }), ).toEqual('12.233400') }) it('formatPrice', () => { expect(formatPrice(22.35)).toEqual('$22.35') expect( formatPrice(22.35, { lang: 'es-MX', currency: 'BTC', decimals: 3 }), ).toEqual('₿22.4') expect( formatPrice(22.356, { lang: 'en-US', currency: 'XRP', decimals: 4, padding: 6, }), ).toEqual('\uE90022.360000') expect( formatPrice(222.05, { lang: 'en-US', currency: 'XRP', decimals: 4, padding: 6, }), ).toEqual('\uE900222.100000') expect( formatPrice(2222.05, { lang: 'en-US', currency: 'XRP', decimals: 4, padding: 6, }), ).toEqual('\uE9002,222') expect( formatPrice(2222.3, { lang: 'en-US', currency: 'XRP', decimals: 4, padding: 6, }), ).toEqual('\uE9002,222') expect( formatPrice(2222, { lang: 'en-US', currency: 'XRP', decimals: 4, padding: 6, }), ).toEqual('\uE9002,222') }) it('getLocalizedCurrencySymbol', () => { expect(getLocalizedCurrencySymbol()).toEqual('$') expect(getLocalizedCurrencySymbol('zh-Hans', 'CNY')).toEqual('¥') expect(getLocalizedCurrencySymbol('ja-JP', 'EUR')).toEqual('€') expect(getLocalizedCurrencySymbol('en-US', 'USDT')).toEqual('') expect(getLocalizedCurrencySymbol('en-US', 'BTC')).toEqual('₿') expect(getLocalizedCurrencySymbol('zh-Hans', 'XRP')).toEqual('\uE900') expect(getLocalizedCurrencySymbol('zh-Hans', 'ETH')).toEqual('\uE902') }) it('localizeDate', () => { const d = new Date('Tue Mar 20 2018') expect(localizeDate()).toEqual(null) expect(localizeDate(d)).toEqual('3/20/2018') }) test('duration to human', () => { expect(durationToHuman(30)).toBe('30.00 sec.') expect(durationToHuman(3000)).toBe('50.00 min.') expect(durationToHuman(30000)).toBe('8.33 hr.') expect(durationToHuman(300000)).toBe('3.47 d.') expect(durationToHuman(30000000)).toBe('11.38 mo.') expect(durationToHuman(300000000)).toBe('9.51 yr.') }) test('format duration detailed', () => { // Basic cases expect(formatDurationDetailed(0)).toBe('0s') expect(formatDurationDetailed(30)).toBe('30s') expect(formatDurationDetailed(60)).toBe('1min') expect(formatDurationDetailed(3600)).toBe('1hr') expect(formatDurationDetailed(86400)).toBe('1d') expect(formatDurationDetailed(3665)).toBe('1hr.1min.5s') expect(formatDurationDetailed(90061)).toBe('1d.1hr.1min.1s') expect(formatDurationDetailed(7200 + 180 + 5)).toBe('2hr.3min.5s') expect(formatDurationDetailed(604800 + 14400 + 180 + 5)).toBe( '7d.4hr.3min.5s', ) expect(formatDurationDetailed(31536000 + 86400 + 3600)).toBe('1yr.1d.1hr') expect(formatDurationDetailed(2629746)).toBe('30d.10hr.29min.6s') // Test maxUnits parameter expect(formatDurationDetailed(90061, 2)).toBe('1d.1hr') expect(formatDurationDetailed(90061, 3)).toBe('1d.1hr.1min') // Test negative values (should handle absolute value) expect(formatDurationDetailed(-3665)).toBe('1hr.1min.5s') }) }) describe('AMM utils format asset', () => { it('formats XRP asset', () => { const asset = '10000000000' const formatted = formatAsset(asset) expect(formatted).toEqual({ currency: 'XRP' }) }) it('formats non XRP asset', () => { const asset = { currency: 'USD', amount: '100000', issuer: 'your mom' } const formatted = formatAsset(asset) expect(formatted).toEqual({ currency: 'USD', issuer: 'your mom' }) }) }) describe('Shorten utils', () => { describe('shortenAccount', () => { it('shortens long account addresses', () => { const longAccount = 'rN7n7otQDd6FczFgLdlqtyMVrn5f4W01dn' expect(shortenAccount(longAccount)).toBe('rN7n7ot...W01dn') }) it('returns short account addresses unchanged', () => { const shortAccount = 'rShortAddr' expect(shortenAccount(shortAccount)).toBe(shortAccount) }) }) describe('stripHttpProtocol', () => { it('strips https:// protocol', () => { expect(stripHttpProtocol('https://www.example.com')).toBe( 'www.example.com', ) }) it('strips http:// protocol', () => { expect(stripHttpProtocol('http://example.com')).toBe('example.com') }) it('returns domain unchanged if no protocol', () => { expect(stripHttpProtocol('example.com')).toBe('example.com') }) }) describe('shortenDomain', () => { it('shortens long domain names', () => { const longDomain = 'verylongdomainnamethatexceedslimit.com' expect(shortenDomain(longDomain)).toBe('verylongdomainn...dslimit.com') }) it('returns short domain names unchanged', () => { const shortDomain = 'example.com' expect(shortenDomain(shortDomain)).toBe(shortDomain) }) }) describe('shortenNFTTokenID', () => { it('shortens long NFT token IDs', () => { const longTokenID = '000827103B94ECBB7BF0A0A6ED62B3607801A27B65F4B11F5E1D5E8A3F3D8E9A' expect(shortenNFTTokenID(longTokenID)).toBe('000827103B...8A3F3D8E9A') }) it('returns short NFT token IDs unchanged', () => { const shortTokenID = '000827103B94ECBB7BF0' expect(shortenNFTTokenID(shortTokenID)).toBe(shortTokenID) }) }) describe('shortenMPTID', () => { it('shortens long MPT token IDs', () => { const longMPTID = '00000000A8B71A79C3CE4E8A3F3D8E9A5BEB9D7C6F4B11F5E1D5E8A3F3D8E9A' expect(shortenMPTID(longMPTID)).toBe('00000000A8...8A3F3D8E9A') }) it('returns short MPT token IDs unchanged', () => { const shortMPTID = '00000000A8B71A79C3CE' expect(shortenMPTID(shortMPTID)).toBe(shortMPTID) }) }) describe('convertToHttpUrl', () => { it('converts IPFS URLs to HTTP URLs', () => { expect( convertToHttpURL( 'ipfs://QmXhvvWs3HaFkJvDuYvanj2pv31yFQGJewfEhfme1Sv47Y', ), ).toBe( 'https://ipfs.io/ipfs/QmXhvvWs3HaFkJvDuYvanj2pv31yFQGJewfEhfme1Sv47Y', ) }) it('preserves https:// URLs as-is', () => { expect(convertToHttpURL('https://example.com/logo.png')).toBe( 'https://example.com/logo.png', ) }) it('adds https:// to plain domain URLs', () => { expect(convertToHttpURL('logo.svgcdn.com/logos/openai-icon.png')).toBe( 'https://logo.svgcdn.com/logos/openai-icon.png', ) }) it('handles empty strings', () => { expect(convertToHttpURL('')).toBe('') }) it('handles other protocols', () => { expect(convertToHttpURL('ftp://example.com/file.txt')).toBe( 'ftp://example.com/file.txt', ) }) }) describe('shortenLPToken', () => { it('keeps first 10 and last 7 characters', () => { const token = '03CE60C3DB22CF7F7157810936F27A5B485C8DB9' const result = shortenLPToken(token) expect(result).toBe('03CE60C3DB...85C8DB9') expect(result.startsWith(token.substring(0, 10))).toBe(true) expect(result.endsWith(token.substring(token.length - 7))).toBe(true) }) }) }) ================================================ FILE: src/containers/shared/transactionUtils.ts ================================================ import type { TransactionMetadata, IssuedCurrencyAmount } from 'xrpl' import type { CreatedNode, DeletedNode, ModifiedNode, Node, } from 'xrpl/dist/npm/models/transactions/metadata' import { Transaction } from './types' import { localizeNumber, CURRENCY_OPTIONS } from './utils' export const SUCCESSFUL_TRANSACTION = 'tesSUCCESS' export const XRP_BASE = 1000000 export const hexMatch = /^(0x)?[0-9A-Fa-f]+$/ export const ACCOUNT_ZERO = 'rrrrrrrrrrrrrrrrrrrrrhoLvTp' export const TX_FLAGS: Record> = { all: { 0x80000000: 'tfFullyCanonicalSig', }, AccountSet: { 0x00010000: 'tfRequireDestTag', 0x00020000: 'tfOptionalDestTag', 0x00040000: 'tfRequireAuth', 0x00080000: 'tfOptionalAuth', 0x00100000: 'tfDisallowXRP', 0x00200000: 'tfAllowXRP', }, AMMDeposit: { 0x00010000: 'tfLPToken', 0x00080000: 'tfSingleAsset', 0x00100000: 'tfTwoAsset', 0x00200000: 'tfOneAssetLPToken', 0x00400000: 'tfLimitLPToken', }, AMMWithdraw: { 0x00010000: 'tfLPToken', 0x00020000: 'tfWithdrawAll', 0x00040000: 'tfOneAssetWithdrawAll', 0x00080000: 'tfSingleAsset', 0x00100000: 'tfTwoAsset', 0x00200000: 'tfOneAssetLPToken', 0x00400000: 'tfLimitLPToken', }, Batch: { 0x00010000: 'tfAllOrNothing', 0x00020000: 'fOnlyOne', 0x00040000: 'tfUntilFailure', 0x00080000: 'tfIndependent', }, LoanSet: { 0x00010000: 'tfLoanOverpayment', }, LoanManage: { 0x00010000: 'tfLoanDefault', 0x00020000: 'tfLoanImpair', 0x00040000: 'tfLoanUnimpair', }, LoanPay: { 0x00010000: 'tfLoanOverpayment', 0x00020000: 'tfLoanFullPayment', }, MPTokenAuthorize: { 0x00000001: 'tfMPTUnauthorize', }, MPTokenIssuanceCreate: { 0x00000002: 'tfMPTCanLock', 0x00000004: 'tfMPTRequireAuth', 0x00000008: 'tfMPTCanEscrow', 0x00000010: 'tfMPTCanTrade', 0x00000020: 'tfMPTCanTransfer', 0x00000040: 'tfMPTCanClawback', }, MPTokenIssuanceSet: { 0x00000001: 'tfMPTLock', 0x00000002: 'tfMPTUnlock', }, NFTokenMint: { 0x00000001: 'tfBurnable', 0x00000002: 'tfOnlyXRP', 0x00000004: 'tfTrustLine', 0x00000008: 'tfTransferable', }, NFTokenOfferCreate: { 0x00000001: 'tfSellNFToken', }, OfferCreate: { 0x00010000: 'tfPassive', 0x00020000: 'tfImmediateOrCancel', 0x00040000: 'tfFillOrKill', 0x00080000: 'tfSell', 0x00100000: 'tfHybrid', }, Payment: { 0x00010000: 'tfNoDirectRipple', 0x00020000: 'tfPartialPayment', 0x00040000: 'tfLimitQuality', }, PaymentChannelClaim: { 0x00010000: 'tfRenew', 0x00020000: 'tfClose', }, TrustSet: { 0x00010000: 'tfSetAuth', 0x00020000: 'tfSetNoRipple', 0x00040000: 'tfClearNoRipple', 0x00100000: 'tfSetFreeze', 0x00200000: 'tfClearFreeze', 0x00400000: 'tfSetDeepFreeze', 0x00800000: 'tfClearDeepFreeze', }, VaultCreate: { 1: 'vaultStrategyFirstComeFirstServe', }, XChainModifyBridge: { 0x00010000: 'tfClearAccountCreateAmount', }, } export const ACCOUNT_FLAGS: Record = { 17: 'asfAllowTrustLineLocking', 16: 'asfAllowTrustLineClawback', 15: 'asfDisallowIncomingTrustline', 14: 'asfDisallowIncomingPayChan', 13: 'asfDisallowIncomingCheck', 12: 'asfDisallowIncomingNFTokenOffer', 10: 'asfAuthorizedNFTokenMinter', 9: 'asfDepositAuth', 8: 'asfDefaultRipple', 7: 'asfGlobalFreeze', 6: 'asfNoFreeze', 5: 'asfAccountTxnID', 4: 'asfDisableMaster', 3: 'asfDisallowXRP', 2: 'asfRequireAuth', 1: 'asfRequireDest', } export const HOOK_FLAGS: Record = { 0x00000001: 'hsfOverride', 0x00000010: 'hsfNSDelete', 0x00000100: 'hsfCollect', } export const CURRENCY_ORDER = [ 'CNY', 'JPY', 'CHF', 'CAD', 'NZD', 'AUD', 'GBP', 'USD', 'EUR', 'LTC', 'ETH', 'BTC', 'XAG', 'XAU', 'XRP', ] export { CURRENCY_OPTIONS } export const DATE_OPTIONS = { hour: 'numeric', minute: 'numeric', second: 'numeric', year: 'numeric', month: 'long', day: 'numeric', hour12: true, timeZone: 'UTC', } export function groupAffectedNodes(trans: Transaction) { const group: { created: CreatedNode['CreatedNode'][] deleted: DeletedNode['DeletedNode'][] modified: ModifiedNode['ModifiedNode'][] } = { created: [], modified: [], deleted: [], } ;(trans.meta.AffectedNodes || []).forEach((node) => { if ('DeletedNode' in node && node.DeletedNode) { group.deleted.push(node.DeletedNode) } else if ('ModifiedNode' in node && node.ModifiedNode) { group.modified.push(node.ModifiedNode) } else if ('CreatedNode' in node && node.CreatedNode) { group.created.push(node.CreatedNode) } }) group.modified.sort((a, b) => a.LedgerEntryType.localeCompare(b.LedgerEntryType), ) return group } export function decodeHex(hex: string): string { let str = '' for (let i = 0; i < hex.length; i += 2) { const v = parseInt(hex.substring(i, i + 2), 16) str += v ? String.fromCharCode(v) : '' } return str } export function buildMemos(trans: Transaction) { const { Memos = [] } = trans.tx const memoList: string[] = [] Memos.forEach((data) => { if (data.Memo.MemoType && hexMatch.test(data.Memo.MemoType)) { memoList.push(decodeHex(data.Memo.MemoType)) } if (data.Memo.MemoData && hexMatch.test(data.Memo.MemoData)) { memoList.push(decodeHex(data.Memo.MemoData)) } if (data.Memo.MemoFormat && hexMatch.test(data.Memo.MemoFormat)) { memoList.push(decodeHex(data.Memo.MemoFormat)) } }) return memoList } export function buildFlags(trans: Transaction): string[] { const flags = TX_FLAGS[trans.tx.TransactionType] || {} const bits = zeroPad((trans.tx.Flags || 0).toString(2), 32).split('') return bits .map((value, i) => { const bin = zeroPad(1, 32 - i, true) const int = parseInt(bin, 2) // const type = i < 8 ? 'universal' : (i < 16 ? 'type_specific' : 'reserved'); return value === '1' ? TX_FLAGS.all[int] || flags[int] || hex32(int) : undefined }) .filter((d) => Boolean(d)) as string[] } export function buildHookFlags(flags: number): string[] { const bits = zeroPad((flags || 0).toString(2), 32).split('') return bits .map((value, i) => { const bin = zeroPad(1, 32 - i, true) const int = parseInt(bin, 2) // const type = i < 8 ? 'universal' : (i < 16 ? 'type_specific' : 'reserved'); return value === '1' ? HOOK_FLAGS[int] || hex32(int) : undefined }) .filter((d) => Boolean(d)) as string[] } function hex32(d: number): string { const int = d & 0xffffffff const hex = int.toString(16).toUpperCase() return `0x${`00000000${hex}`.slice(-8)}` } export function zeroPad( num: string | number, size: number, back = false, ): string { let s = String(num) while (s.length < (size || 2)) { s = back ? `${s}0` : `0${s}` } return s } export function normalizeAmount( amount: IssuedCurrencyAmount | number | string, language = 'en-US', ): string | null { const currency = typeof amount === 'object' ? amount.currency : 'XRP' const value = typeof amount === 'object' ? amount.value : Number(amount) / XRP_BASE const numberOption = { ...CURRENCY_OPTIONS, currency } return localizeNumber(value, language, numberOption) } export function findNode( meta: TransactionMetadata, nodeType: 'DeletedNode' | 'CreatedNode' | 'ModifiedNode', entryType: string, ): any { const metaNode = meta.AffectedNodes.find( (node: Node) => node[nodeType] && node[nodeType].LedgerEntryType === entryType, ) return metaNode ? metaNode[nodeType] : null } ================================================ FILE: src/containers/shared/types.ts ================================================ import type { TransactionMetadata, Memo, IssuedCurrencyAmount, MPTAmount, } from 'xrpl' export type Amount = IssuedCurrencyAmount | MPTAmount | string export type ExplorerAmount = { issuer?: string currency: string amount: number | string isMPT?: boolean } export interface Tx { Memos?: Memo[] TransactionType: string Flags?: number } export interface Transaction { meta: TransactionMetadata tx: Tx } // A summary of a Transaction created by summarizeTransaction export interface TransactionSummary { hash: string ctid: string type: string result: string account: string sequence: number } export interface AccountNFToken { Flags: number Issuer: string NFTokenID: string NFTokenTaxon: number URI?: string // eslint-disable-next-line camelcase nft_serial: number } ================================================ FILE: src/containers/shared/utils.js ================================================ const THOUSAND = 1000 const MILLION = THOUSAND * THOUSAND const BILLION = MILLION * THOUSAND const TRILLION = BILLION * THOUSAND const QUADRILLION = TRILLION * THOUSAND // Divisor to convert AMM trading fee integer to a percentage (e.g. 1000 → 1%) const TRADING_FEE_TO_PERCENT = 1000 // Divisor to convert AMM trading fee integer to a decimal (e.g. 1000 → 0.01) export const TRADING_FEE_BASE = TRADING_FEE_TO_PERCENT * 100 export const EXOTIC_SYMBOLS = { BTC: '\u20BF', XRP: '\uE900', ETH: '\uE902', } export const isCurrencyExoticSymbol = (currency) => currency !== undefined && typeof currency === 'string' && Object.keys(EXOTIC_SYMBOLS).includes(currency) export const getCurrencySymbol = (currency) => EXOTIC_SYMBOLS[currency] || currency export const TITLE_LENGTH = 77 export const NOT_FOUND = 404 export const SERVER_ERROR = 500 export const BAD_REQUEST = 400 export const FETCH_INTERVAL_MILLIS = 5000 export const FETCH_INTERVAL_VHS_MILLIS = 60 * 1000 // 1 minute export const FETCH_INTERVAL_NODES_MILLIS = 60000 export const FETCH_INTERVAL_ERROR_MILLIS = 300 export const FETCH_INTERVAL_XRP_USD_ORACLE_MILLIS = 60 * 1000 // 1 minute export const FETCH_INTERVAL_FEE_SETTINGS_MILLIS = 10 * 60 * 1000 // 10 minutes export const DECIMAL_REGEX = /^\d+$/ export const HASH256_REGEX = /[0-9A-Fa-f]{64}/i export const HASH192_REGEX = /[0-9A-Fa-f]{48}/i export const CURRENCY_REGEX = /^[a-zA-Z0-9]{3,}[.:+-]r[rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz]{27,35}$/ export const FULL_CURRENCY_REGEX = /^[0-9A-Fa-f]{40}[.:+-]r[rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz]{27,35}$/ export const VALIDATORS_REGEX = /^n[9H][0-9A-Za-z]{50}$/ export const CTID_REGEX = /^[cC][0-9A-Za-z]{15}$/ export const PURPLE = '#8884d8' export const GREEN_400 = '#5BEB9D' export const GREEN_500 = '#32E685' export const GREEN_800 = '#1E8A50' export const PURPLE_500 = '#7919FF' export const PURPLE_700 = '#4A00B2' export const GREY_0 = '#FFFFFF' export const GREY_400 = '#A2A2A4' export const GREY_600 = '#656E81' export const GREY_800 = '#383D47' export const BLACK_600 = '#454549' export const MAGENTA_700 = '#B20058' export const DROPS_TO_XRP_FACTOR = 1000000.0 export const ONE_TENTH_BASIS_POINT = 1000 export const ONE_TENTH_BASIS_POINT_DIGITS = 3 export const ONE_TENTH_BASIS_POINT_CUTOFF = 0.001 export const BREAKPOINTS = { desktop: 1200, landscape: 900, portrait: 600, phone: 415, } export const CURRENCY_OPTIONS = { style: 'currency', currency: '', minimumFractionDigits: 2, maximumFractionDigits: 8, } const NUMBER_DEFAULT_OPTIONS = { style: 'decimal', minimumFractionDigits: 0, maximumFractionDigits: 20, useGrouping: true, } const FORMAT_PRICE_DEFAULT_OPTIONS = { lang: 'en-US', currency: 'USD', decimals: 4, padding: 0, } export const ORACLE_ACCOUNT = 'rXUMMaPpZqPutoRszR29jtC8amWq3APkx' export const isEarlierVersion = (source, target) => { if (source === target) return false if (source === 'N/A') return true if (target === 'N/A') return false const sourceDecomp = source.split('.') const targetDecomp = target.split('.') const sourceMajor = parseInt(sourceDecomp[0], 10) const sourceMinor = parseInt(sourceDecomp[1], 10) const targetMajor = parseInt(targetDecomp[0], 10) const targetMinor = parseInt(targetDecomp[1], 10) // Compare major version if (sourceMajor !== targetMajor) { return sourceMajor < targetMajor } // Compare minor version if (sourceMinor !== targetMinor) { return sourceMinor < targetMinor } const sourcePatch = sourceDecomp[2].split('-') const targetPatch = targetDecomp[2].split('-') const sourcePatchVersion = parseInt(sourcePatch[0], 10) const targetPatchVersion = parseInt(targetPatch[0], 10) // Compare patch version if (sourcePatchVersion !== targetPatchVersion) { return sourcePatchVersion < targetPatchVersion } // Compare release version if (sourcePatch.length !== targetPatch.length) { return sourcePatch.length > targetPatch.length } if (sourcePatch.length === 2) { // Compare different release types if (sourcePatch[1][0] !== targetPatch[1][0]) { return sourcePatch[1] < targetPatch[1] } // Compare beta version if (sourcePatch[1][0] === 'b') { return ( parseInt(sourcePatch[1].slice(1), 10) < parseInt(targetPatch[1].slice(1), 10) ) } // Compare rc version return ( parseInt(sourcePatch[1].slice(2), 10) < parseInt(targetPatch[1].slice(2), 10) ) } return false } export const isValidJsonString = (str) => { try { JSON.parse(str) return true } catch (e) { return false } } // Document: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat export const localizeNumber = ( num, lang = 'en-US', options = {}, isMPT = false, ) => { const number = Number.parseFloat(num) const config = { ...NUMBER_DEFAULT_OPTIONS, ...options } if (Number.isNaN(number)) { return null } if (config.style === 'currency' && !isMPT) { try { const neg = number < 0 ? '-' : '' const d = new Intl.NumberFormat(lang, config).format(number) const index = d.search(/\d/) const symbol = d.slice(0, index).replace(/-/, '').trim() const newSymbol = EXOTIC_SYMBOLS[config.currency] || (symbol.toUpperCase() === config.currency.toUpperCase() ? '' : symbol) return `${neg}${newSymbol}${d.slice(index)}` } catch (error) { config.style = 'decimal' delete config.currency return Intl.NumberFormat(lang, config).format(number) } } return new Intl.NumberFormat(lang, config).format(number) } export function formatPrice(number, options = {}) { const { lang, currency, decimals, padding } = { ...FORMAT_PRICE_DEFAULT_OPTIONS, ...options, } return number ? localizeNumber(number.toPrecision(decimals), lang, { style: 'currency', currency, minimumFractionDigits: number.toPrecision(decimals).includes('.') ? padding : 0, }) : undefined } // Document: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat export const localizeDate = (date, lang = 'en-US', options = {}) => { // TODO: default config if (!date) { return null } return new Intl.DateTimeFormat(lang, options).format(date) } export const DATE_OPTIONS_NUMERIC = { hour: 'numeric', minute: 'numeric', second: 'numeric', year: 'numeric', month: 'numeric', day: 'numeric', hour12: true, timeZone: 'UTC', } export const getLocalizedCurrencySymbol = ( lang = 'en-US', currency = 'USD', ) => { const options = { style: 'currency', minimumFractionDigits: 0, maximumFractionDigits: 0, currency, } const formatted = localizeNumber(1, lang, options) return formatted.split('1')[0].trim() } /** * Formats small numbers (< 1) with 4 decimal places, showing trailing zeros * @param value - The numeric value to format (should be < 1) * @param lang - Language for localization * @returns Formatted string with 4 decimal places */ export const formatSmallNumber = (value, lang = 'en-US', digits = 4) => { if (value === 0) return localizeNumber(0, lang, { minimumFractionDigits: digits, maximumFractionDigits: digits, }) if (value < 0.0001) return '< 0.0001' return localizeNumber(value, lang, { minimumFractionDigits: digits, maximumFractionDigits: digits, }) } export const formatLargeNumber = (d = 0, digits = 1, lang = 'en-US') => { // For numbers >= 10,000 (5 digits), use abbreviations with 1 decimal place if (d >= 10000) { if (d >= QUADRILLION) { return { num: localizeNumber(d / QUADRILLION, lang, { minimumFractionDigits: digits, maximumFractionDigits: digits, }), unit: 'Q', } } if (d >= TRILLION) { return { num: localizeNumber(d / TRILLION, lang, { minimumFractionDigits: digits, maximumFractionDigits: digits, }), unit: 'T', } } if (d >= BILLION) { return { num: localizeNumber(d / BILLION, lang, { minimumFractionDigits: digits, maximumFractionDigits: digits, }), unit: 'B', } } if (d >= MILLION) { return { num: localizeNumber(d / MILLION, lang, { minimumFractionDigits: digits, maximumFractionDigits: digits, }), unit: 'M', } } if (d >= THOUSAND) { return { num: localizeNumber(d / THOUSAND, lang, { minimumFractionDigits: digits, maximumFractionDigits: digits, }), unit: 'K', } } } // For numbers < 10,000 (less than 5 digits), show full number with 2 decimal places and commas if (d >= 1) { return { num: localizeNumber(d, lang, { minimumFractionDigits: 2, maximumFractionDigits: 2, }), unit: '', } } // For numbers < 1, this should not be used (use formatSmallNumber instead) // But keeping legacy behavior for compatibility let variableDigits = digits let numberOfZeros = 0 let numberCopy = d while (numberCopy < 1 && variableDigits < 20) { numberCopy *= 10 numberOfZeros += 1 variableDigits = numberOfZeros > variableDigits - 1 ? variableDigits + 1 : variableDigits } // handle zeros variableDigits = Math.trunc(d.toFixed(20)) === 0 ? digits : variableDigits if (digits < variableDigits) { variableDigits = digits } return { num: d.toFixed(variableDigits), unit: '', } } export const convertHexToBigInt = (s) => BigInt(`0x${s}`) export const durationToHuman = (s, decimal = 2) => { const d = {} const seconds = Math.abs(s) if (seconds < 60) { d.num = seconds d.unit = 'sec.' } else if (seconds < 60 * 60) { d.num = seconds / 60 d.unit = 'min.' } else if (seconds < 60 * 60 * 24) { d.num = seconds / (60 * 60) d.unit = 'hr.' } else if (seconds < 60 * 60 * 24 * 180) { d.num = seconds / (60 * 60 * 24) d.unit = 'd.' } else if (seconds < 60 * 60 * 24 * 365 * 2) { d.num = seconds / (60 * 60 * 24 * 30.5) d.unit = 'mo.' } else { d.num = seconds / (60 * 60 * 24 * 365) d.unit = 'yr.' } return `${d.num.toFixed(decimal)} ${d.unit}` } /** * Converts a duration in seconds to a human-readable format with multiple time units. * * This function breaks down a duration into its constituent time units (years, months, days, * hours, minutes, seconds) and formats them in a compact, dot-separated format. * * @param {number} totalSeconds - The duration in seconds to convert * @param {number} maxUnits - Maximum number of time units to include in the output (default: 4) * @returns {string} A formatted duration string (e.g., "1d.2hr.30min.15s") * * @example * formatDurationDetailed(3665) // Returns "1hr.1min.5s" * formatDurationDetailed(90061) // Returns "1d.1hr.1min.1s" * formatDurationDetailed(90061, 2) // Returns "1d.1hr" (limited to 2 units) * formatDurationDetailed(0) // Returns "0s" */ export const formatDurationDetailed = (totalSeconds, maxUnits = 4) => { const seconds = Math.abs(totalSeconds) const units = [] // Define time units in descending order const timeUnits = [ { name: 'yr', value: 365 * 24 * 60 * 60 }, { name: 'mo', value: 30.44 * 24 * 60 * 60 }, // Average month length { name: 'd', value: 24 * 60 * 60 }, { name: 'hr', value: 60 * 60 }, { name: 'min', value: 60 }, { name: 's', value: 1 }, ] let remaining = Math.floor(seconds) for (const unit of timeUnits) { if (remaining >= unit.value && units.length < maxUnits) { const count = Math.floor(remaining / unit.value) if (count > 0) { units.push(`${count}${unit.name}`) remaining -= count * unit.value } } } // If no units were added (e.g., 0 seconds), return "0s" if (units.length === 0) { return '0s' } return units.join('.') } export const removeRoutes = (routes, ...routesToRemove) => routes.filter((route) => !routesToRemove.includes(route.title)) export const formatAsset = (asset) => typeof asset === 'string' ? { currency: 'XRP' } : { currency: asset.currency, issuer: asset.issuer, } // For AMM, the trading fee is in units of 1/100,000; a value of 1 is equivalent to a 0.001% fee. export const formatTradingFee = (tradingFee) => tradingFee !== undefined ? localizeNumber(tradingFee / TRADING_FEE_TO_PERCENT, 'en-US', { minimumFractionDigits: 0, maximumFractionDigits: 3, }) : undefined export const computeRippleStateBalanceChange = (node) => { const fields = node.FinalFields || node.NewFields const prev = node.PreviousFields const { currency } = fields.Balance const numberOption = { ...CURRENCY_OPTIONS, currency } let finalBalance = fields.Balance.value let previousBalance = prev && prev.Balance ? prev.Balance.value : 0 let account let counterAccount if (finalBalance < 0) { account = fields.HighLimit.issuer counterAccount = fields.LowLimit.issuer finalBalance = 0 - finalBalance previousBalance = 0 - previousBalance } else { account = fields.LowLimit.issuer counterAccount = fields.HighLimit.issuer } const change = finalBalance - previousBalance return { change, numberOption, previousBalance, finalBalance, currency, account, counterAccount, } } export const computeMPTokenBalanceChange = (node) => { const final = node.FinalFields || node.NewFields const prev = node.PreviousFields const prevAmount = prev && prev.MPTAmount ? prev.MPTAmount : '0' const finalAmount = final.MPTAmount ?? '0' return { previousBalance: BigInt(prevAmount), finalBalance: BigInt(finalAmount), account: final.Account, change: BigInt(finalAmount) - BigInt(prevAmount), } } export const computeMPTIssuanceBalanceChange = (node) => { const final = node.FinalFields || node.NewFields const prev = node.PreviousFields const prevAmount = prev && prev.OutstandingAmount ? prev.OutstandingAmount : '0' const finalAmount = final.OutstandingAmount ?? '0' return { previousBalance: BigInt(prevAmount), finalBalance: BigInt(finalAmount), account: final.Issuer, change: BigInt(finalAmount) - BigInt(prevAmount), } } export const renderXRP = (d, language) => { const options = { ...CURRENCY_OPTIONS, currency: 'XRP' } return localizeNumber(d, language, options) } /** * Converts a scaled integer to a its original value and return it as a string. * Formula: originalPrice = assetPrice / 10^scale * * @param {string | number | bigint} assetPrice - The scaled value. * - string: interpreted as hex (for Price Oracles - XLS-0047) * - number: interpreted as decimal * - bigint: interpreted as decimal (for MPT amounts, which can be > Number.MAX_SAFE_INTEGER) * @param {number} scale - The number of decimal places. * @returns {string} The formatted decimal string. * * @example * convertScaledPrice("5f5e100", 6) // "100" (hex string from Oracle) * convertScaledPrice(1000000, 6) // "1" (number from MPT) * * @see https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0047-PriceOracles */ export function convertScaledPrice(assetPrice, scale) { const scaledPriceInBigInt = typeof assetPrice === 'string' ? BigInt(`0x${assetPrice}`) : BigInt(assetPrice) const divisor = BigInt(10 ** scale) const integerPart = scaledPriceInBigInt / divisor const remainder = scaledPriceInBigInt % divisor const fractionalPart = (remainder * BigInt(10 ** scale)) / divisor return fractionalPart > 0 ? `${integerPart}.${fractionalPart.toString().padStart(scale, '0')}` : `${integerPart}` } export const shortenAccount = (addr = '') => addr.length > 12 ? `${addr.slice(0, 7)}...${addr.slice(-5)}` : addr export const stripHttpProtocol = (url = '') => url.replace(/^https?:\/\//, '') export const shortenDomain = ( domain = '', prefixLength = 15, suffixLength = 11, ) => domain.length > prefixLength + suffixLength ? `${domain.slice(0, prefixLength)}...${domain.slice(-suffixLength)}` : domain export const shortenNFTTokenID = (nftTokenID = '') => nftTokenID.length > 20 ? `${nftTokenID.slice(0, 10)}...${nftTokenID.slice(-10)}` : nftTokenID export const shortenMPTID = ( mptTokenID = '', prefixLength = 10, suffixLength = 10, ) => mptTokenID.length > prefixLength + suffixLength ? `${mptTokenID.slice(0, prefixLength)}...${mptTokenID.slice(-suffixLength)}` : mptTokenID export const shortenTxHash = (txHash = '') => txHash.length > 12 ? `${txHash.slice(0, 6)}...${txHash.slice(-6)}` : txHash export const shortenLoanBrokerID = (loanBrokerID = '') => loanBrokerID.length > 12 ? `${loanBrokerID.slice(0, 6)}...${loanBrokerID.slice(-6)}` : loanBrokerID export const shortenLoanID = (loanID = '') => loanID.length > 12 ? `${loanID.slice(0, 6)}...${loanID.slice(-6)}` : loanID /** * Converts URLs to HTTP/HTTPS format, handling IPFS URLs and plain domains * @param {string} url - The URL to convert (can be ipfs://, https://, http://, or plain domain) * @returns {string} The converted HTTP/HTTPS URL */ export const convertToHttpURL = (url) => { if (!url) { return url } // Handle IPFS URLs - convert to HTTP if (url.startsWith('ipfs://')) { return url.replace('ipfs://', 'https://ipfs.io/ipfs/') } // Matches a protocol (e.g. 'http://' or 'https://') at the start of a string const PROTOCOL_REGEX = /^([a-z][a-z0-9+\-.]*):\/\// // If URL already has a protocol, return as is if (PROTOCOL_REGEX.test(url)) { return url } // Otherwise, assume it's a plain domain and add https:// return `https://${url}` } /** * Truncates the vaultID to ensure better readability * @param {string} vaultID - The complete VaultID obtained from XRPL on-chain data * @returns {string} The truncated VaultID */ export const shortenVaultID = (vaultID) => `${vaultID.substring(0, 8)}...${vaultID.substring(vaultID.length - 6)}` export const shortenLPToken = (lpToken) => `${lpToken.substring(0, 10)}...${lpToken.substring(lpToken.length - 7)}` ================================================ FILE: src/containers/shared/vhsTypes.ts ================================================ export interface NodeResponse { // eslint-disable-next-line camelcase -- from VHS node_public_key: string networks?: string lat?: number long?: number // eslint-disable-next-line camelcase -- from VHS complete_ledgers?: string // eslint-disable-next-line camelcase -- from VHS complete_shards?: string version?: string ip?: string port?: number uptime?: number // eslint-disable-next-line camelcase -- from VHS country_code?: number country?: string region?: string // eslint-disable-next-line camelcase -- from VHS region_code?: number city?: string // eslint-disable-next-line camelcase -- from VHS postal_code?: number timezone?: string // eslint-disable-next-line camelcase -- from VHS server_state?: string // eslint-disable-next-line camelcase -- from VHS io_latency_ms?: number // eslint-disable-next-line camelcase -- from VHS load_factor_server?: number } export interface NodeData extends NodeResponse { // eslint-disable-next-line camelcase -- mimicking rippled validated_ledger: { // eslint-disable-next-line camelcase -- mimicking rippled ledger_index: number } // eslint-disable-next-line camelcase -- mimicking rippled load_factor: number | null } export interface ValidatorScore { missed: number total: number score: string incomplete: boolean } export interface ValidatorReport { missed: string total: string score: string incomplete: boolean chain: string date: string // eslint-disable-next-line camelcase -- mimicking rippled validation_public_key: string } export interface ValidatorResponse { // eslint-disable-next-line camelcase -- from VHS validation_public_key: string // eslint-disable-next-line camelcase -- from VHS signing_key: string // eslint-disable-next-line camelcase -- from VHS master_key?: string revoked?: boolean domain: string chain: string networks?: string // eslint-disable-next-line camelcase -- from VHS current_index: number // eslint-disable-next-line camelcase -- from VHS server_version?: string // eslint-disable-next-line camelcase -- from VHS agreement_1h: ValidatorScore | null // eslint-disable-next-line camelcase -- from VHS agreement_24h: ValidatorScore | null // eslint-disable-next-line camelcase -- from VHS agreement_30day: ValidatorScore | null partial: boolean unl: string } export interface ValidatorSupplemented extends ValidatorResponse { // eslint-disable-next-line camelcase -- mimicking rippled ledger_hash: string // eslint-disable-next-line camelcase -- mimicking rippled last_ledger_time: string amendments: Array<{ id: string; name: string }> base_fee: number reserve_base: number reserve_inc: number } export interface StreamValidator extends ValidatorResponse { // eslint-disable-next-line camelcase -- mimicking rippled ledger_index?: number // eslint-disable-next-line camelcase -- mimicking rippled ledger_hash?: string pubkey?: string time?: string base_fee?: number reserve_base?: number reserve_inc?: number } export interface FeeSettings { base_fee: number reserve_base: number reserve_inc: number } export interface AmendmentData { rippled_version: string id: string name: string threshold?: string consensus?: string deprecated: boolean date: string | null tx_hash?: string ledger_index?: number eta?: string voted?: Voter } export interface Voter { count: number validators: Array<{ signing_key: string ledger_index: string unl: string | false }> } ================================================ FILE: src/containers/test/QueryClient.ts ================================================ import { queryClient } from '../shared/QueryClient' queryClient.setDefaultOptions({ queries: { ...queryClient.defaultQueryOptions(), cacheTime: 0, }, }) export { queryClient as testQueryClient } ================================================ FILE: src/containers/test/mockWsClient.js ================================================ import EventEmitter from 'events' function wsEventToType(event) { if (event === 'ledgerClosed') { return 'ledger' } if (event === 'validationReceived') { return 'validation' } return null } /** * This is a mock WS client for testing purposes. */ class MockWsClient extends EventEmitter { /** * Construct the MockWsClient object. * @param wsUrl The URL for a WebSocket connection. If null, there is no * stream support (you can't test anything stream-related). The default is * null. */ constructor(wsUrl = null) { super() this.handlesStreams = wsUrl != null this.handlers = {} this.responses = {} this.returnError = false this.endpoint = 'wss://fakenode.ripple.com:51233' this.p2pSocket = this this.debug = false // set up the message handler for streams if (this.handlesStreams) { this.ws = new WebSocket(wsUrl) this.ws.onmessage = (message) => { const streamResult = JSON.parse(message.data) const type = wsEventToType(streamResult?.type) if (type) { this.emit(type, streamResult) } } } } setDebug(debug = true) { this.debug = debug } /** * Close the WS connection (if needed). */ close() { if (this.ws) { this.ws.close() } } /** * Set whether the `send` method should return an error. * @param returnError Whether the send method should return an error. */ setReturnError(returnError = true) { this.returnError = returnError } /** * Add a new response to the mocks. * @param command The rippled command that the message will contain. * @param response The mock response object. */ addResponse(command, response) { this.responses[command] = response } /** * Add several new responses to the mocks. * * The object should be in the shape of {command: response} where `command` * is the rippled command that the message will contain, and `response` is * the mock response object. * @param responseObj The responses to add to the mocks. */ addResponses(responseObj) { this.responses = Object.assign(this.responses, responseObj) } /** * Mocks the `send` method on XrplClient. * @param message The message to rippled. * @returns a Promise result. If `this.returnError` has been set to `true`, * the promise will be rejected with an empty shape. */ send(message) { if (this.debug) { // eslint-disable-next-line no-console -- For testing purposes console.log(message) } if (this.returnError) { return Promise.reject(new Error({})) } const { command } = message return Promise.resolve( // When an error (no result) return the whole response like xrpl-client does. this.responses[command]?.result || this.responses[command], ) } /** * Mocks the `getState` method on XrplClient. * @returns a dictionary indicating that the client is connected. */ // eslint-disable-next-line class-methods-use-this -- not needed for a mock getState() { return { online: true, server: { version: '1.9.4', }, } } /** * Mocks the `ready` method on XrplClient. * @returns a Promise that resolves with `true`. */ // eslint-disable-next-line class-methods-use-this -- not needed for a mock ready() { return Promise.resolve(true) } } export default MockWsClient ================================================ FILE: src/containers/test/utils.tsx ================================================ import { isValidElement, FC, PropsWithChildren } from 'react' import { Helmet, HelmetProvider } from 'react-helmet-async' import { I18nextProvider } from 'react-i18next' import { QueryClientProvider } from 'react-query' import { MemoryRouter, Routes, Route } from 'react-router' import type i18n from '../../i18n/testConfig' import { testQueryClient } from './QueryClient' import { AnalyticsSetPath } from '../shared/analytics' import { TooltipProvider } from '../shared/components/Tooltip' export function flushPromises() { return new Promise((resolve) => setTimeout(resolve)) } // @ts-ignore Helmet.defaultProps.defer = false export const QuickHarness: FC< PropsWithChildren<{ i18n: typeof i18n initialEntries?: string[] | undefined }> > = ({ i18n: i18nConfig, children, initialEntries }) => ( {isValidElement(children) && children?.type === Route ? ( {children} ) : ( children )} ) ================================================ FILE: src/i18n/baseConfig.ts ================================================ import { InitOptions } from 'i18next' export const supportedLanguages = { 'en-US': 'English', 'ja-JP': '日本語', 'ko-KR': '한국어', 'es-ES': 'Español', 'fr-FR': 'Français', 'ca-CA': 'Catalan', 'my-MM': 'မြန်မာ', } export const options: InitOptions = { returnNull: false, debug: process.env.NODE_ENV === 'development', fallbackLng: 'en-US', ns: ['translations'], // have a common namespace used around the full app defaultNS: 'translations', keySeparator: false, // we use content as keys interpolation: { escapeValue: false, // not needed for react!! formatSeparator: ',', }, supportedLngs: Object.keys(supportedLanguages), react: { useSuspense: true, }, backend: { loadPath: '/locales/{{lng}}/{{ns}}.json', }, load: 'currentOnly', } ================================================ FILE: src/i18n/formatters.ts ================================================ import type i18n from 'i18next' /** * * @param value text to truncate * @param _lng * @param truncateOptions.length how many characters to show * * @example * Value property in translations.json: `Hello {{value, truncate(length: 3)}}` */ const truncate = ( value: string, _lng: string | undefined, truncateOptions: { length: number }, ) => value.substring(0, truncateOptions.length) + (value.length > truncateOptions.length ? '\u2026' : '') export const configureFormatters = (instance: typeof i18n) => { instance.services.formatter?.add('truncate', truncate) } ================================================ FILE: src/i18n/index.ts ================================================ import i18n from 'i18next' import Backend from 'i18next-http-backend' import LanguageDetector from 'i18next-browser-languagedetector' import { configureFormatters } from './formatters' import { options } from './baseConfig' i18n .use(Backend) .use(LanguageDetector) .init({ ...options, detector: { excludeCacheFor: [] } } as any) configureFormatters(i18n) export default i18n ================================================ FILE: src/i18n/test/formatters.test.ts ================================================ import i18n from '../testConfigEnglish' describe('i18n formatters', () => { describe('truncate', () => { it('should truncate the value to the supplied length', () => { i18n.addResource( 'en-US', 'test', 'woo', `Hello {{value, truncate(length: 3)}}`, ) expect( i18n.t('test:woo', { value: 'World', defaultValue: 'Default' }), ).toEqual('Hello Wor\u2026') }) }) }) ================================================ FILE: src/i18n/testConfig.ts ================================================ import i18n from 'i18next' import { options } from './baseConfig' import { configureFormatters } from './formatters' i18n.init({ ...options, fallbackLng: 'cimode', debug: false, react: { useSuspense: false, }, }) configureFormatters(i18n) export default i18n ================================================ FILE: src/i18n/testConfigEnglish.ts ================================================ import i18n from './testConfig' import translations from '../../public/locales/en-US/translations.json' // Configuration which hardcodes translation to english which helps with complex interpolations // This is in a separate file until all tests can be switched over i18n.init({ lng: 'en-US', resources: { 'en-US': { translations, }, }, }) export default i18n ================================================ FILE: src/index.html ================================================ XRPL Explorer <% if(VITE_OSANO_ID) { %> <% } %> <% if (VITE_GTM_ID) { %> <% } %>
    ================================================ FILE: src/index.tsx ================================================ import { Suspense } from 'react' import { createRoot } from 'react-dom/client' import { BrowserRouter as Router } from 'react-router' import { I18nextProvider } from 'react-i18next' import { Buffer } from 'buffer' import { unregister } from './registerServiceWorker' import './containers/shared/css/global.scss' import { AppWrapper } from './containers/App' import i18n from './i18n' window.Buffer = Buffer const root = createRoot(document.getElementById('xrpl-explorer')!) const renderApp = () => { root.render( , ) } const isDevelopment = process.env.NODE_ENV === 'development' if (isDevelopment) { localStorage.setItem('debug', 'xrpl-debug:*') renderApp() } else { localStorage.removeItem('debug') renderApp() } unregister() ================================================ FILE: src/registerServiceWorker.js ================================================ // In production, we register a service worker to serve assets from local cache. // This lets the app load faster on subsequent visits in production, and gives // it offline capabilities. However, it also means that developers (and users) // will only see deployed updates on the "N+1" visit to a page, since previously // cached resources are updated in the background. // To learn more about the benefits of this model, read https://goo.gl/KwvDNy. // This link also includes instructions on opting out of this behavior. const isLocalhost = Boolean( window.location.hostname === 'localhost' || // [::1] is the IPv6 localhost address. window.location.hostname === '[::1]' || // 127.0.0.1/8 is considered localhost for IPv4. window.location.hostname.match( /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/, ), ) export default function register() { if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { // The URL constructor is available in all browsers that support SW. const publicUrl = new URL(process.env.PUBLIC_URL, window.location) if (publicUrl.origin !== window.location.origin) { // Our service worker won't work if PUBLIC_URL is on a different origin // from what our page is served on. This might happen if a CDN is used to // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374 return } window.addEventListener('load', () => { const swUrl = `${process.env.PUBLIC_URL}/service-worker.js` if (isLocalhost) { // This is running on localhost. Lets check if a service worker still exists or not. checkValidServiceWorker(swUrl) // Add some additional logging to localhost, pointing developers to the // service worker/PWA documentation. navigator.serviceWorker.ready.then(() => { console.log( 'This web app is being served cache-first by a service ' + 'worker. To learn more, visit https://goo.gl/SC7cgQ', ) }) } else { // Is not local host. Just register service worker registerValidSW(swUrl) } }) } } function registerValidSW(swUrl) { navigator.serviceWorker .register(swUrl) .then((registration) => { registration.onupdatefound = () => { const installingWorker = registration.installing installingWorker.onstatechange = () => { if (installingWorker.state === 'installed') { if (navigator.serviceWorker.controller) { // At this point, the old content will have been purged and // the fresh content will have been added to the cache. // It's the perfect time to display a "New content is // available; please refresh." message in your web app. console.log('New content is available; please refresh.') } else { // At this point, everything has been precached. // It's the perfect time to display a // "Content is cached for offline use." message. console.log('Content is cached for offline use.') } } } } }) .catch((error) => { console.error('Error during service worker registration:', error) }) } function checkValidServiceWorker(swUrl) { // Check if the service worker can be found. If it can't reload the page. fetch(swUrl) .then((response) => { // Ensure service worker exists, and that we really are getting a JS file. if ( response.status === 404 || response.headers.get('content-type').indexOf('javascript') === -1 ) { // No service worker found. Probably a different app. Reload the page. navigator.serviceWorker.ready.then((registration) => { registration.unregister().then(() => { window.location.reload() }) }) } else { // Service worker found. Proceed as normal. registerValidSW(swUrl) } }) .catch(() => { console.log( 'No internet connection found. App is running in offline mode.', ) }) } export function unregister() { if ('serviceWorker' in navigator) { navigator.serviceWorker.ready.then((registration) => { registration.unregister() }) } } ================================================ FILE: src/rippled/NFTTransactions.ts ================================================ import { encodeAccountID } from 'ripple-address-codec' import { hexToBytes } from '@xrplf/isomorphic/utils' import { getNFTTransactions as getNFTTxs } from './lib/rippled' import { formatTransaction } from './lib/utils' import summarize from './lib/txSummary' import logger from './lib/logger' import type { ExplorerXrplClient } from '../containers/shared/SocketContext' const log = logger({ name: 'NFT transactions' }) export const getNFTTransactions = ( rippledSocket: ExplorerXrplClient, tokenId: string, limit?: number, marker?: string, ) => getNFTTxs(rippledSocket, tokenId, limit, marker, undefined) .then((data) => { const transactions = data.transactions.map((tx) => { const txn = formatTransaction(tx) return summarize(txn, true) }) return { transactions, marker: data.marker, } }) .catch((error) => { log.error(error.toString()) throw error }) // Get the oldest NFT tx by having the 'forward' param set to true export const getOldestNFTTransaction = ( rippledSocket: ExplorerXrplClient, tokenId: string, ) => getNFTTxs(rippledSocket, tokenId, 1, '', true) .then((data) => { const transactions = data.transactions.map((tx) => { const txn = formatTransaction(tx) return summarize(txn, true) }) return { transaction: transactions?.length > 0 ? transactions[0] : undefined, } }) .catch((error) => { log.error(error.toString()) throw error }) export const parseIssuerFromNFTokenID = ( nftokenID: string, ): string | undefined => { const issuerPortion = nftokenID.substring(8, 48) if (issuerPortion.length < 20) { return undefined } return encodeAccountID(hexToBytes(nftokenID.substring(8, 48))) } ================================================ FILE: src/rippled/accountState.ts ================================================ import { isValidClassicAddress, isValidXAddress, xAddressToClassicAddress, } from 'ripple-address-codec' import { getAccountInfo, getAccountPaychannels, getServerInfo, getAccountTransactions, } from './lib/rippled' import logger from './lib/logger' import { formatAccountInfo, formatSignerList } from './lib/utils' import type { ExplorerXrplClient } from '../containers/shared/SocketContext' interface XAddress { classicAddress: string tag: number | false test: boolean } export interface AccountState { account: string paychannels?: { // eslint-disable-next-line camelcase total_available: number channels: any[] } signerList?: { signers: { account: string weight: number }[] quorum: number maxSigners: number } info: { accountTransactionID?: string reserve?: number sequence?: number ticketCount: number domain?: string emailHash?: string flags: string[] nftMinter?: string } xAddress?: { classicAddress: string tag: number | boolean test: boolean } deleted: boolean } const log = logger({ name: 'GetAccountState' }) async function getAccountState( account: string, rippledSocket: ExplorerXrplClient, ): Promise { let classicAddress: string let decomposedAddress: XAddress | null = null try { if (!isValidClassicAddress(account) && !isValidXAddress(account)) { throw new Error('Malformed address') } if (isValidXAddress(account)) { decomposedAddress = xAddressToClassicAddress(account) ;({ classicAddress } = decomposedAddress) const isTestnet = decomposedAddress.test if ( (isTestnet && process.env.VITE_ENVIRONMENT === 'mainnet') || (!isTestnet && (process.env.VITE_ENVIRONMENT === 'testnet' || process.env.VITE_ENVIRONMENT === 'devnet')) ) { throw Error('Address on wrong network.') } } else { classicAddress = account } } catch (error: any) { log.error(error.toString()) throw error } return getAccountInfo(rippledSocket, classicAddress) .then((info) => Promise.all([ getAccountPaychannels(rippledSocket, classicAddress, info.ledger_index), getServerInfo(rippledSocket), ]).then((data) => ({ account: info.Account as string, info: formatAccountInfo(info, data[1].info.validated_ledger), signerList: info.signer_lists?.[0] ? formatSignerList(info.signer_lists[0]) : undefined, paychannels: data[1], xAddress: decomposedAddress || undefined, deleted: false, })), ) .catch((error) => { // Check if it's a deleted account if (error.code === 404) { return getAccountTransactions(rippledSocket, classicAddress, 1).then( (data) => { if (data.transactions[0]?.tx.TransactionType === 'AccountDelete') { return { account: classicAddress, deleted: true, xAddress: decomposedAddress || undefined, info: { reserve: 0, ticketCount: 0, flags: [] }, } } throw error }, ) } log.error(error.message.toString()) throw error }) } export default getAccountState ================================================ FILE: src/rippled/accountTransactions.ts ================================================ import { isValidClassicAddress, isValidXAddress, xAddressToClassicAddress, } from 'ripple-address-codec' import { formatTransaction } from './lib/utils' import { getAccountTransactions as getAccountTxs } from './lib/rippled' import summarize from './lib/txSummary' import logger from './lib/logger' import type { ExplorerXrplClient } from '../containers/shared/SocketContext' const log = logger({ name: 'account transactions' }) export interface AccountTransactionsResult { transactions: any[] marker?: any } const getAccountTransactions = async ( account: string, currency: string | undefined, marker: any, limit: number | undefined, rippledSocket: ExplorerXrplClient, ): Promise => { // TODO: Retrieve txs for untagged X-address only? let classicAddress: string let decomposedAddress: { classicAddress: string tag: number | false test: boolean } | null = null try { if (!isValidClassicAddress(account) && !isValidXAddress(account)) { throw new Error('Malformed address') } if (isValidXAddress(account)) { decomposedAddress = xAddressToClassicAddress(account) ;({ classicAddress } = decomposedAddress) // TODO: Display tag, if present const isTestnet = decomposedAddress.test // TODO: Display tag, if present if ( (isTestnet && process.env.VITE_ENVIRONMENT === 'mainnet') || (!isTestnet && (process.env.VITE_ENVIRONMENT === 'testnet' || process.env.VITE_ENVIRONMENT === 'devnet')) ) { throw Error('Address on wrong network') } } else { classicAddress = account } } catch (error: any) { log.error(error.toString()) throw error } log.info(`get transactions: ${account} -> ${classicAddress}`) try { const data = await getAccountTxs( rippledSocket, classicAddress, limit, marker, ) const transactions = data.transactions .map((tx: any) => { const txn = formatTransaction(tx) return summarize(txn, true) }) .filter((tx: any) => { // No filter - return all transactions if (!currency) { return true } // Filter by currency (IOU) or MPT issuance ID (passed as currency) const txString = JSON.stringify(tx) return ( txString.includes(`"currency":"${currency.toUpperCase()}"`) || txString.includes(`"${currency}"`) ) }) return { transactions, marker: data.marker, } } catch (error: any) { log.error(error.toString()) throw error } } export default getAccountTransactions ================================================ FILE: src/rippled/index.ts ================================================ export { default as getAccountState } from './accountState' export { default as getAccountTransactions } from './accountTransactions' export { default as getLedger } from './ledgers' export { default as getTransaction } from './transactions' export { default as getQuorum } from './quorum' export { default as getNegativeUNL } from './nUNL' export { default as getOffers } from './offers' export { getAccountInfo, getAMMInfoByAssets } from './lib/rippled' ================================================ FILE: src/rippled/ledgers.ts ================================================ import { summarizeLedger } from './lib/summarizeLedger' import { getLedger as getRippledLedger } from './lib/rippled' import logger from './lib/logger' import type { ExplorerXrplClient } from '../containers/shared/SocketContext' const log = logger({ name: 'ledgers' }) const getLedger = async ( identifier: string | number, rippledSocket: ExplorerXrplClient, ): Promise => { const parameters: any = {} if (!isNaN(Number(identifier))) { parameters.ledger_index = Number(identifier) } else if (['validated', 'closed', 'current'].includes(String(identifier))) { // TODO: (this is not reachable as id is validated prior to reaching here) parameters.ledger_index = identifier } else if (!identifier) { parameters.ledger_index = 'validated' } else { parameters.ledger_hash = String(identifier).toUpperCase() } log.info(`get ledger: ${JSON.stringify(parameters)}`) try { const ledger = await getRippledLedger(rippledSocket, parameters) return summarizeLedger(ledger, true) } catch (error: any) { log.error(error.toString()) throw error } } export default getLedger ================================================ FILE: src/rippled/lib/convertRippleDate.ts ================================================ export const MILLIS_PER_SECOND = 1000 const EPOCH_OFFSET = 946684800000 export const convertRippleDate = (date: number) => date * MILLIS_PER_SECOND + EPOCH_OFFSET ================================================ FILE: src/rippled/lib/formatSignerList.ts ================================================ import type { SignerListSet } from 'xrpl' export const formatSignerList = (data: SignerListSet) => ({ quorum: data.SignerQuorum, maxSigners: data.SignerEntries ? data.SignerEntries.reduce( (total, d) => total + d.SignerEntry.SignerWeight, 0, ) : 0, signers: data.SignerEntries ? data.SignerEntries.map((d) => ({ account: d.SignerEntry.Account, weight: d.SignerEntry.SignerWeight, })) : [], }) ================================================ FILE: src/rippled/lib/logger.ts ================================================ /* eslint-disable no-console -- logging file */ // TODO: refactor this file to use the npm module `debug` which is already used elsewhere // and send logs in prod to the backend const logMessage = (type, options, message: string) => { console[type]({ ...options, message }) } const log = (options) => ({ info: (message) => logMessage('info', options, message), warn: (message) => logMessage('warn', options, message), error: (message) => logMessage('error', options, message), debug: (message) => logMessage('debug', options, message), }) export default log ================================================ FILE: src/rippled/lib/rippled.ts ================================================ import type { XrplClient } from 'xrpl-client' import type { ExplorerXrplClient } from '../../containers/shared/SocketContext' import { CTID_REGEX, HASH256_REGEX } from '../../containers/shared/utils' import { formatAmount } from './txSummary/formatAmount' import { Error, XRP_BASE, convertRippleDate } from './utils' const N_UNL_INDEX = '2E8A59AA9D3B5B186B0B9E0F62E6C02587CA74A4D778938E957B6357D364B244' const formatEscrow = (d: any) => ({ id: d.index, account: d.Account, destination: d.Destination, amount: d.Amount / XRP_BASE, condition: d.Condition, cancelAfter: d.CancelAfter ? convertRippleDate(d.CancelAfter) : undefined, finishAfter: d.FinishAfter ? convertRippleDate(d.FinishAfter) : undefined, }) const formatPaychannel = (d: any) => ({ id: d.index, account: d.Account, destination: d.Destination, amount: d.Amount / XRP_BASE, balance: d.Balance / XRP_BASE, settleDelay: d.SettleDelay, }) const executeQuery = async ( rippledSocket: XrplClient, params: any, ): Promise => rippledSocket.send(params).catch((error: any) => { const message = error.response && error.response.error_message ? error.response.error_message : error.toString() const code = error.response && error.response.status ? error.response.status : 500 throw new Error(message, code) }) // generic RPC query function query(rippledSocket: ExplorerXrplClient, options: any): Promise { return executeQuery(rippledSocket, options) } // If there is a separate peer to peer (not reporting mode) server for admin requests, use it. // Otherwise use the default rippledSocket for everything. function queryP2P( rippledSocket: ExplorerXrplClient, options: any, ): Promise { return executeQuery(rippledSocket.p2pSocket ?? rippledSocket, options) } // get ledger const getLedger = async ( rippledSocket: ExplorerXrplClient, parameters: any, ): Promise => { const request = { command: 'ledger', ...parameters, transactions: true, expand: true, } const resp = await query(rippledSocket, request) if (!resp) { throw new Error(`No response from rippled: ${JSON.stringify(resp)}`, 500) } if (resp.error_message === 'ledgerNotFound') { throw new Error('ledger not found', 404) } if (resp.error_message === 'ledgerIndexMalformed') { throw new Error('invalid ledger index/hash', 400) } if (resp.error_message) { throw new Error(resp.error_message, 500) } if (!resp.validated) { throw new Error('ledger not validated', 404) } return resp.ledger } // get ledger_entry const getLedgerEntry = async ( rippledSocket: ExplorerXrplClient, { index }: { index: string }, ledgerIndex?: number, ): Promise => { const request = { command: 'ledger_entry', index, ledger_index: ledgerIndex ?? 'validated', } const resp = await query(rippledSocket, request) if (resp.error_message === 'entryNotFound') { throw new Error('ledger entry not found', 404) } if (resp.error_message === 'invalidParams') { throw new Error('invalidParams for ledger_entry', 404) } if (resp.error_message === 'lgrNotFound') { throw new Error('invalid ledger index/hash', 400) } if (resp.error_message === 'malformedAddress') { throw new Error( 'The ledger_entry request improperly specified an Address field.', 404, ) } if (resp.error_message === 'malformedCurrency') { throw new Error( 'The ledger_entry request improperly specified a Currency Code field.', 404, ) } if (resp.error_message === 'malformedOwner') { throw new Error( 'The ledger_entry request improperly specified the escrow.owner sub-field.', 404, ) } if (resp.error_message === 'malformedRequest') { throw new Error( 'The ledger_entry request provided an invalid combination of fields, or provided the wrong type for one or more fields.', 404, ) } if (resp.error_message === 'unknownOption') { throw new Error( 'The fields provided in the ledger_entry request did not match any of the expected request formats.', 404, ) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return resp } // get transaction const getTransaction = async ( rippledSocket: ExplorerXrplClient, txId: string, ): Promise => { const params: any = { command: 'tx', } if (HASH256_REGEX.test(txId)) { params.transaction = txId } else if (CTID_REGEX.test(txId)) { params.ctid = txId } else { throw new Error(`${txId} not a ctid or hash`, 404) } const resp = await query(rippledSocket, params) if (resp.error === 'txnNotFound') { throw new Error('transaction not found', 404) } if (resp.error === 'notImpl') { throw new Error('invalid transaction hash', 400) } // TODO: remove the `unknown` option when // https://github.com/XRPLF/rippled/pull/4738 is in a release if (resp.error === 'wrongNetwork' || resp.error === 'unknown') { throw new Error('wrong network for CTID', 406) } if (resp.error_message) { throw new Error(resp.error_message, 500) } if (!resp.validated) { throw new Error('transaction not validated', 500) } return resp } const getAccountInfo = async ( rippledSocket: ExplorerXrplClient, account: string | unknown, includeSignerLists: boolean = true, ): Promise => { const resp = await query(rippledSocket, { command: 'account_info', api_version: 1, account, ledger_index: 'validated', signer_lists: includeSignerLists, }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return Object.assign(resp.account_data, { ledger_index: resp.ledger_index, }) } // get account escrows const getAccountEscrows = async ( rippledSocket: ExplorerXrplClient, account: string, ledgerIndex: string | number = 'validated', ): Promise => { const resp = await query(rippledSocket, { command: 'account_objects', account, ledger_index: ledgerIndex, type: 'escrow', limit: 400, }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error_message) { throw new Error(resp.error_message, 500) } if (!resp.account_objects.length) { return undefined } const escrows: any = { in: [], out: [], total: 0, totalIn: 0, totalOut: 0 } resp.account_objects.forEach((d: any) => { const amount = Number(d.Amount) escrows.total += amount if (account === d.Destination) { escrows.in.push(formatEscrow(d)) escrows.totalIn += amount } else { escrows.out.push(formatEscrow(d)) escrows.totalOut += amount } }) escrows.total /= XRP_BASE escrows.totalIn /= XRP_BASE escrows.totalOut /= XRP_BASE return escrows } // get account paychannels const getAccountPaychannels = async ( rippledSocket: ExplorerXrplClient, account: string, ledgerIndex: string | number = 'validated', ): Promise => { const list: any[] = [] let remaining = 0 const getChannels = async (marker?: any): Promise => { const resp = await query(rippledSocket, { command: 'account_objects', marker, account, ledger_index: ledgerIndex, type: 'payment_channel', limit: 400, }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error_message) { throw new Error(resp.error_message, 500) } // This isn't working, resp.marker isn't empty, but we don't enter this if block if (!resp.account_objects.length) { return undefined } list.push(...resp.account_objects) if (resp.marker) { return getChannels(resp.marker) } return undefined } await getChannels() const channels = list.map((c) => { remaining += c.Amount - c.Balance return formatPaychannel(c) }) return channels.length ? { channels, total_available: remaining / XRP_BASE, } : undefined } // get account escrows const getAccountBridges = async ( rippledSocket: ExplorerXrplClient, account: string, ledgerIndex: string | number = 'validated', ): Promise => { const resp = await query(rippledSocket, { command: 'account_objects', account, ledger_index: ledgerIndex, type: 'bridge', limit: 400, }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error === 'invalidParams') { // thrown when XChainBridge amendment is not activated // TODO: remove this when XLS-38d is live in mainnet return undefined } if (resp.error_message) { throw new Error(resp.error_message, 500) } if (!resp.account_objects.length) { return undefined } if (resp.account_objects.length >= 1) { return resp.account_objects.map((bridge: any) => ({ lockingChainDoor: bridge.XChainBridge.LockingChainDoor, lockingChainIssue: bridge.XChainBridge.LockingChainIssue, issuingChainDoor: bridge.XChainBridge.IssuingChainDoor, issuingChainIssue: bridge.XChainBridge.LockingChainIssue, minAccountCreateAmount: formatAmount(bridge.MinAccountCreateAmount), signatureReward: formatAmount(bridge.SignatureReward), xchainAccountClaimCount: bridge.XChainAccountClaimCount, xchainAccountCreateCount: bridge.XChainAccountCreateCount, xchainClaimId: bridge.XChainClaimID, })) } return undefined } // get Token balance summary const getBalances = async ( rippledSocket: ExplorerXrplClient, account: string, ledgerIndex: string | number = 'validated', ): Promise => { const resp = await queryP2P(rippledSocket, { command: 'gateway_balances', account, ledger_index: ledgerIndex, }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return resp } const getAccountTransactions = async ( rippledSocket: ExplorerXrplClient, account: string, limit: number = 20, marker: string = '', ): Promise => { const markerComponents = marker.split('.') const ledger = parseInt(markerComponents[0], 10) const seq = parseInt(markerComponents[1], 10) const resp = await query(rippledSocket, { command: 'account_tx', account, limit, ledger_index_max: -1, ledger_index_min: -1, marker: marker ? { ledger, seq, } : undefined, }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return { transactions: resp.transactions, marker: resp.marker ? `${resp.marker.ledger}.${resp.marker.seq}` : undefined, } } const getAccountNFTs = async ( rippledSocket: ExplorerXrplClient, account: string, marker: string = '', limit: number = 20, ): Promise => { const resp = await query(rippledSocket, { command: 'account_nfts', account, marker: marker || undefined, limit, // Not `limit` of NFTs, but `limit` pages of NFTs }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return resp } const getNFTsIssuedByAccount = async ( rippledSocket: ExplorerXrplClient, issuer: string, marker: string = '', limit: number = 20, ): Promise => { const resp = await query(rippledSocket, { command: 'nfts_by_issuer', issuer, marker: marker || undefined, limit, }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return resp } const getNFTInfo = async ( rippledSocket: ExplorerXrplClient, tokenId: string, ): Promise => { const resp = await queryP2P(rippledSocket, { command: 'nft_info', api_version: 2, nft_id: tokenId, }) if (resp.error === 'objectNotFound') { throw new Error('NFT not found', 404) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return resp } const getNFToffers = async ( offerCmd: string, rippledSocket: ExplorerXrplClient, tokenId: string, limit: number = 50, marker: string = '', ): Promise => { const allOffers: any[] = [] let currentMarker: string | undefined = marker do { // eslint-disable-next-line no-await-in-loop const resp = await query(rippledSocket, { command: offerCmd, nft_id: tokenId, limit, marker: currentMarker !== '' ? currentMarker : undefined, }) // The NFT does not have any offers (note that object refers to the offer rather than the NFT itself). if (resp.error === 'objectNotFound') { throw new Error(resp.error_message, 404) } if (resp.error_message) { throw new Error(resp.error_message, 500) } allOffers.push(...(resp.offers || [])) currentMarker = resp.marker } while (currentMarker) return { offers: allOffers } } const getBuyNFToffers = ( rippledSocket: ExplorerXrplClient, tokenId: string, limit: number = 50, marker: string = '', ): Promise => getNFToffers('nft_buy_offers', rippledSocket, tokenId, limit, marker) const getSellNFToffers = ( rippledSocket: ExplorerXrplClient, tokenId: string, limit: number = 50, marker: string = '', ): Promise => getNFToffers('nft_sell_offers', rippledSocket, tokenId, limit, marker) const getNFTTransactions = async ( rippledSocket: ExplorerXrplClient, tokenId: string, limit: number = 20, marker: string = '', forward: boolean = false, ): Promise => { const markerComponents = marker.split('.') const ledger = parseInt(markerComponents[0], 10) const seq = parseInt(markerComponents[1], 10) const resp = await queryP2P(rippledSocket, { command: 'nft_history', api_version: 2, nft_id: tokenId, limit, ledger_index_max: -1, ledger_index_min: -1, marker: marker ? { ledger, seq, } : undefined, forward, }) if (resp.error_message) { throw new Error(resp.error_message, 500) } return { transactions: resp.transactions, marker: resp.marker ? `${resp.marker.ledger}.${resp.marker.seq}` : undefined, } } const getNegativeUNL = async ( rippledSocket: ExplorerXrplClient, ): Promise => { const resp = await query(rippledSocket, { command: 'ledger_entry', index: N_UNL_INDEX, }) if ( resp.error === 'entryNotFound' || resp.error === 'lgrNotFound' || resp.error === 'objectNotFound' ) { return [] } if (resp.error_message) { throw new Error(resp.error_message, 500) } if (resp.node?.LedgerEntryType !== 'NegativeUNL') { throw new Error('Not a NegativeUNL', 404) } return resp } // get server info const getServerInfo = async ( rippledSocket: ExplorerXrplClient, ): Promise => { const resp = await query(rippledSocket, { command: 'server_info', }) if (resp.error !== undefined || resp.error_message !== undefined) { throw new Error(resp.error_message || resp.error, 500) } return resp } // gets server state const getServerState = async ( rippledSocket: ExplorerXrplClient, ): Promise => { const resp = await query(rippledSocket, { command: 'server_state', }) if (resp.error !== undefined || resp.error_message !== undefined) { throw new Error(resp.error_message || resp.error, 500) } return resp } const getOffers = async ( rippledSocket: ExplorerXrplClient, currencyCode: string, issuerAddress: string, pairCurrencyCode: string, pairIssuerAddress: string, ): Promise => { const resp = await query(rippledSocket, { command: 'book_offers', taker_gets: { currency: `${currencyCode.toUpperCase()}`, issuer: currencyCode.toUpperCase() === 'XRP' ? undefined : `${issuerAddress}`, }, taker_pays: { currency: `${pairCurrencyCode.toUpperCase()}`, issuer: pairCurrencyCode.toUpperCase() === 'XRP' ? undefined : `${pairIssuerAddress}`, }, }) if (resp.error !== undefined || resp.error_message !== undefined) { throw new Error(resp.error_message || resp.error, 500) } return resp } const getAMMInfo = async ( rippledSocket: ExplorerXrplClient, params: any, ): Promise => { const request = { command: 'amm_info', ledger_index: 'validated', ...params, } const resp = await query(rippledSocket, request) if (resp.error_message) { throw new Error(resp.error_message, 500) } if (!resp.validated) { throw new Error( 'Ledger is not validated. The response data is pending and might change', 500, ) } return resp } const getAMMInfoByAssets = ( rippledSocket: ExplorerXrplClient, asset: any, asset2: any, ): Promise => getAMMInfo(rippledSocket, { asset, asset2 }) const getAMMInfoByAMMAccount = ( rippledSocket: ExplorerXrplClient, ammAccount: string, ): Promise => getAMMInfo(rippledSocket, { amm_account: ammAccount }) // get feature const getFeature = async ( rippledSocket: ExplorerXrplClient, amendmentId: string, ): Promise => { const request = { command: 'feature', feature: amendmentId, } const resp = await query(rippledSocket, request) if (resp == null || resp.error_message) { return null } return resp } const getMPTIssuance = async ( rippledSocket: ExplorerXrplClient, tokenId: string | null, ): Promise => { const resp = await queryP2P(rippledSocket, { command: 'ledger_entry', mpt_issuance: tokenId, ledger_index: 'validated', include_deleted: true, }) if ( resp.error === 'entryNotFound' || resp.error === 'lgrNotFound' || resp.error === 'objectNotFound' ) { throw new Error('MPT Issuance not found', 404) } if (resp.error_message) { throw new Error(resp.error_message, 500) } if (resp.node?.LedgerEntryType !== 'MPTokenIssuance') { throw new Error('Not an MPTokenIssuance', 404) } return resp } const getAccountMPTs = async ( rippledSocket: ExplorerXrplClient, account: string, marker: string = '', ledgerIndex: string | number = 'validated', limit: number = 400, ): Promise => { const resp = await query(rippledSocket, { command: 'account_objects', account, ledger_index: ledgerIndex, type: 'mptoken', marker: marker || undefined, limit, }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error === 'invalidParams') { // For example, "error_message": "Required field 'account' missing" throw new Error(resp.error_message, 400) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return resp } const getAccountObjects = async ( rippledSocket: ExplorerXrplClient, account: string, objectType: string, marker: string = '', ledgerIndex: string | number = 'validated', limit: number = 400, ): Promise => { const resp = await query(rippledSocket, { command: 'account_objects', account, ledger_index: ledgerIndex, type: objectType, marker: marker || undefined, limit, }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error === 'invalidParams') { // For example, "error_message": "Required field 'account' missing" throw new Error(resp.error_message, 400) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return resp } const getAccountLines = async ( rippledSocket: ExplorerXrplClient, account: string, limit: number, marker: string = '', ): Promise => { const resp = await query(rippledSocket, { command: 'account_lines', account, limit, marker: marker || undefined, }) if (resp.error === 'actNotFound') { throw new Error('account not found', 404) } if (resp.error === 'invalidParams') { // For example, "error_message": "Required field 'account' missing" throw new Error(resp.error_message, 400) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return resp } /** * Fetches MPT holders using the mpt_holders Clio method * @see https://xrpl.org/docs/references/http-websocket-apis/public-api-methods/clio-methods/mpt_holders */ const getMPTHolders = (rippledSocket, mptIssuanceId, limit = 20, marker = '') => queryP2P(rippledSocket, { command: 'mpt_holders', mpt_issuance_id: mptIssuanceId, limit, marker: marker || undefined, }).then((resp) => { if (resp.error === 'objectNotFound') { throw new Error('MPT Issuance not found', 404) } if (resp.error === 'invalidParams') { throw new Error(resp.error_message, 400) } if (resp.error_message) { throw new Error(resp.error_message, 500) } return resp }) // get Vault object by VaultID const getVault = (rippledSocket, vaultId) => query(rippledSocket, { command: 'ledger_entry', index: vaultId, ledger_index: 'validated', }).then((resp) => { if (resp.error === 'entryNotFound') { throw new Error('Vault not found', 404) } if (resp.error_message === 'invalidParams') { throw new Error('invalidParams for ledger_entry', 404) } if (resp.error_message === 'lgrNotFound') { throw new Error('invalid ledger index/hash', 400) } // Handle invalid vault ID format (e.g., non-hex string like "1234") if (resp.error_message?.includes('not hex string')) { throw new Error('Invalid vault ID format', 400) } if (resp.error_message) { throw new Error(resp.error_message, 500) } if (resp.node?.LedgerEntryType !== 'Vault') { throw new Error('Not a Vault', 404) } return resp.node }) // get LoanBroker object by LoanBrokerID const getLoanBroker = (rippledSocket, loanBrokerId) => query(rippledSocket, { command: 'ledger_entry', index: loanBrokerId, ledger_index: 'validated', }).then((resp) => { if (resp.error === 'entryNotFound') { throw new Error('LoanBroker not found', 404) } if (resp.error_message === 'invalidParams') { throw new Error('invalidParams for ledger_entry', 404) } if (resp.error_message === 'lgrNotFound') { throw new Error('invalid ledger index/hash', 400) } if (resp.error_message) { throw new Error(resp.error_message, 500) } if (resp.node?.LedgerEntryType !== 'LoanBroker') { throw new Error('Not a LoanBroker', 404) } return resp.node }) export { getLedger, getLedgerEntry, getTransaction, getAccountInfo, getAccountEscrows, getAccountPaychannels, getAccountBridges, getAccountNFTs, getAccountObjects, getNFTsIssuedByAccount, getBalances, getAccountTransactions, getNegativeUNL, getServerInfo, getServerState, getOffers, getNFTInfo, getBuyNFToffers, getSellNFToffers, getNFTTransactions, getAMMInfoByAssets, getAMMInfoByAMMAccount, getFeature, getMPTIssuance, getMPTHolders, getAccountMPTs, getAccountLines, getVault, getLoanBroker, } ================================================ FILE: src/rippled/lib/summarizeLedger.ts ================================================ import summarizeTransaction from './txSummary' import { convertRippleDate } from './convertRippleDate' import { formatTransaction, XRP_BASE } from './utils' interface LedgerSummary { ledger_index: number ledger_time: number ledger_hash: string parent_hash: string close_time: number total_xrp: number total_fees: number transactions: any[] } const summarizeLedger = (ledger: any, txDetails: boolean = false) => { const transactions = ledger.transactions.map((tx: any) => { const d = formatTransaction(tx) return summarizeTransaction(d, txDetails) }) // eslint-disable-next-line camelcase -- TODO: fix later const total_fees = ledger.transactions.reduce( (sum: number, tx: any) => sum + Number(tx.Fee), 0, ) / XRP_BASE const summary: LedgerSummary = { ledger_index: Number(ledger.ledger_index), ledger_time: ledger.close_time, ledger_hash: ledger.ledger_hash, parent_hash: ledger.parent_hash, close_time: convertRippleDate(ledger.close_time), total_xrp: ledger.total_coins / XRP_BASE, // eslint-disable-next-line camelcase -- TODO: fix later total_fees, transactions: transactions.sort((a: any, b: any) => a.index - b.index), } return summary } export { summarizeLedger } ================================================ FILE: src/rippled/lib/test/rippled.test.ts ================================================ import { getVault, getLoanBroker, getMPTIssuance, getNegativeUNL, } from '../rippled' const VAULT_INDEX = 'EF98FDBA404CBEB4F746DA1026B859E260BBB459D111268F6A26BBC7C4811A04' const makeSocket = (response: any) => ({ send: jest.fn().mockResolvedValue(response) }) as any describe('getVault', () => { it('queries ledger_entry with the supplied vault id', async () => { const socket = makeSocket({ node: { LedgerEntryType: 'Vault', index: VAULT_INDEX }, }) await getVault(socket, VAULT_INDEX) expect(socket.send).toHaveBeenCalledWith({ command: 'ledger_entry', index: VAULT_INDEX, ledger_index: 'validated', }) }) it('returns resp.node when the ledger entry is a Vault', async () => { const node = { LedgerEntryType: 'Vault', Owner: 'rExampleVaultOwner', index: VAULT_INDEX, } const socket = makeSocket({ index: VAULT_INDEX, node, validated: true }) await expect(getVault(socket, VAULT_INDEX)).resolves.toEqual(node) }) it('throws when the ledger entry is not a Vault', async () => { // Real devnet response captured 2026-04-27 — this index resolves to a // PermissionedDomain, not a Vault. const socket = makeSocket({ index: VAULT_INDEX, node: { LedgerEntryType: 'PermissionedDomain', Owner: 'rKhgwxANWk65QtQziFGeh6AfYwchpnvzzk', index: VAULT_INDEX, }, validated: true, }) await expect(getVault(socket, VAULT_INDEX)).rejects.toMatchObject({ message: 'Not a Vault', code: 404, }) }) it('throws "Vault not found" when rippled returns entryNotFound', async () => { const socket = makeSocket({ error: 'entryNotFound' }) await expect(getVault(socket, VAULT_INDEX)).rejects.toMatchObject({ message: 'Vault not found', code: 404, }) }) it('throws on invalidParams', async () => { const socket = makeSocket({ error_message: 'invalidParams' }) await expect(getVault(socket, VAULT_INDEX)).rejects.toMatchObject({ message: 'invalidParams for ledger_entry', code: 404, }) }) it('throws on lgrNotFound', async () => { const socket = makeSocket({ error_message: 'lgrNotFound' }) await expect(getVault(socket, VAULT_INDEX)).rejects.toMatchObject({ message: 'invalid ledger index/hash', code: 400, }) }) it('throws "Invalid vault ID format" for non-hex ids', async () => { const socket = makeSocket({ error_message: '"1234" is not hex string', }) await expect(getVault(socket, '1234')).rejects.toMatchObject({ message: 'Invalid vault ID format', code: 400, }) }) it('throws a 500 for any other error_message', async () => { const socket = makeSocket({ error_message: 'unexpected failure' }) await expect(getVault(socket, VAULT_INDEX)).rejects.toMatchObject({ message: 'unexpected failure', code: 500, }) }) }) describe('getLoanBroker', () => { const LOAN_BROKER_INDEX = '1111111111111111111111111111111111111111111111111111111111111111' it('returns resp.node when the ledger entry is a LoanBroker', async () => { const node = { LedgerEntryType: 'LoanBroker', Owner: 'rExampleLoanBrokerOwner', index: LOAN_BROKER_INDEX, } const socket = makeSocket({ index: LOAN_BROKER_INDEX, node }) await expect(getLoanBroker(socket, LOAN_BROKER_INDEX)).resolves.toEqual( node, ) }) it('throws when the ledger entry is not a LoanBroker (e.g. Check)', async () => { const socket = makeSocket({ index: LOAN_BROKER_INDEX, node: { LedgerEntryType: 'Check', Account: 'rExampleCheckSender', index: LOAN_BROKER_INDEX, }, }) await expect( getLoanBroker(socket, LOAN_BROKER_INDEX), ).rejects.toMatchObject({ message: 'Not a LoanBroker', code: 404, }) }) it('throws "LoanBroker not found" when rippled returns entryNotFound', async () => { const socket = makeSocket({ error: 'entryNotFound' }) await expect( getLoanBroker(socket, LOAN_BROKER_INDEX), ).rejects.toMatchObject({ message: 'LoanBroker not found', code: 404, }) }) }) describe('getMPTIssuance', () => { const MPT_ID = '00002AF2588C244FE5F74BF48B5C5E2823235B243AA34634' it('returns the full response when the ledger entry is an MPTokenIssuance', async () => { const resp = { node: { LedgerEntryType: 'MPTokenIssuance', Issuer: 'rExampleMPTIssuer', Sequence: 1, }, ledger_index: 100, validated: true, } const socket = makeSocket(resp) await expect(getMPTIssuance(socket, MPT_ID)).resolves.toEqual(resp) }) it('throws when the ledger entry is not an MPTokenIssuance', async () => { const socket = makeSocket({ node: { LedgerEntryType: 'Vault', Owner: 'rExampleVaultOwner', }, validated: true, }) await expect(getMPTIssuance(socket, MPT_ID)).rejects.toMatchObject({ message: 'Not an MPTokenIssuance', code: 404, }) }) it('throws "MPT Issuance not found" when rippled returns entryNotFound', async () => { const socket = makeSocket({ error: 'entryNotFound' }) await expect(getMPTIssuance(socket, MPT_ID)).rejects.toMatchObject({ message: 'MPT Issuance not found', code: 404, }) }) }) describe('getNegativeUNL', () => { it('returns the full response when the ledger entry is a NegativeUNL', async () => { const resp = { node: { LedgerEntryType: 'NegativeUNL', DisabledValidators: [], }, validated: true, } const socket = makeSocket(resp) await expect(getNegativeUNL(socket)).resolves.toEqual(resp) }) it('throws when the ledger entry is not a NegativeUNL', async () => { const socket = makeSocket({ node: { LedgerEntryType: 'AccountRoot' }, validated: true, }) await expect(getNegativeUNL(socket)).rejects.toMatchObject({ message: 'Not a NegativeUNL', code: 404, }) }) it('returns [] when the entry is missing', async () => { const socket = makeSocket({ error: 'entryNotFound' }) await expect(getNegativeUNL(socket)).resolves.toEqual([]) }) }) ================================================ FILE: src/rippled/lib/test/utils.test.ts ================================================ import { formatAccountInfo, formatNFTInfo, formatTransferFee, formatMPTIssuance, } from '../utils' describe('rippled utils:', () => { describe('formatNFTInfo', () => { const oldResponse: any = { nft_id: '0000000025CC40A6A240DB42512BA22826B903A785EE2FA512C5D5A70000000C', ledger_index: 2436210, owner: 'rhSigFwZ9UnbiKbpaco8aSQUsNFXJVz51W', is_burned: true, flags: 3, transfer_fee: 10, issuer: 'rhSigFwZ9UnbiKbpaco8aSQUsNFXJVz51W', nft_taxon: 0, nft_sequence: 12, uri: 'ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf4dfuylqabf3oclgtqy55fbzdi', validated: true, status: 'success', warnings: [ "This is a clio server. clio only serves validated data. If you want to talk to rippled, include 'ledger_index':'current' in your request", ], minted: undefined, domain: '123456', } const newResponse = Object.assign(oldResponse, { nft_serial: 12, uri: '697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469', }) delete newResponse.nft_sequence it('should format uri and serial on clio <= 1.0.4', () => { const result = formatNFTInfo(oldResponse) expect(result.NFTId).toEqual( '0000000025CC40A6A240DB42512BA22826B903A785EE2FA512C5D5A70000000C', ) expect(result.isBurned).toEqual(true) expect(result.transferFee).toEqual(10) expect(result.flags).toEqual(['lsfOnlyXRP', 'lsfBurnable']) expect(result.NFTSerial).toEqual(12) expect(result.NFTTaxon).toEqual(0) expect(result.uri).toEqual( 'ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf4dfuylqabf3oclgtqy55fbzdi', ) }) it('should format uri and serial on clio > 1.0.4', () => { const result = formatNFTInfo(newResponse) expect(result.NFTSerial).toEqual(12) expect(result.uri).toEqual( 'ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf4dfuylqabf3oclgtqy55fbzdi', ) }) }) describe('formatAccountInfo', () => { const accountInfoData: any = { Account: 'rDb2kD2sibG5cxhz3VAoRFkmhPrca4JtL8', Balance: '99999975', Flags: 1082130432, LedgerEntryType: 'AccountRoot', OwnerCount: 0, PreviousTxnID: '6174EDD6109E08874F2B7D039084BB2612458D6E4EA26ADE55B10E2B013C2766', PreviousTxnLgrSeq: 4469249, Sequence: 4467999, index: 'A24328E84D9B832F75195C5D100F4AFABB03BF2CD8BF2687354BD933BFBAE353', } const serverInfoValidatedLedger: any = { age: 2, base_fee_xrp: 1e-6, hash: '5C68F56D909EF82D0D0BA59A783854ACEE390CF70630AF1B7E238FC448E48741', reserve_base_xrp: 1, reserve_inc_xrp: 0.2, seq: 4545199, } it('validate flags', () => { const result = formatAccountInfo( accountInfoData, serverInfoValidatedLedger, ) expect(result.flags.sort()).toEqual( ['lsfDefaultRipple', 'lsfAllowTrustLineLocking'].sort(), ) }) }) describe('formatTransferFee', () => { describe('when no transfer fee is provided', () => { it('should return "0" for null', () => { expect(formatTransferFee(null, 'IOU')).toBe('0') }) it('should return "0" for 0', () => { expect(formatTransferFee(0, 'IOU')).toBe('0') }) }) describe('when tokenType is "IOU"', () => { it('should calculate percentage for IOU tokens using billion-based formula', () => { // 0.5% transfer fee: 1000000000 + (1000000000 * 0.005) = 1005000000 expect(formatTransferFee(1005000000, 'IOU')).toBe('0.5') // 10% transfer fee: 1000000000 + (1000000000 * 0.1) = 1100000000 expect(formatTransferFee(1100000000, 'IOU')).toBe('10') }) it('should handle high precision values for IOU tokens', () => { // Test with a value that needs rounding to 7 decimal places const transferFee = 1000000000 + 12345678 // should result in 1.2345678% expect(formatTransferFee(transferFee, 'IOU')).toBe('1.2345678') }) it('should handle very small transfer fees for IOU tokens', () => { const billion = 1000000000 const transferFee = billion + 1 // 0.0000001% expect(formatTransferFee(transferFee, 'IOU')).toBe('1e-7') // JavaScript converts very small numbers to scientific notation }) }) describe('when tokenType is "MPT" or "NFT"', () => { it('should calculate percentage for MPT tokens using thousand-based formula', () => { // 0.5% transfer fee expect(formatTransferFee(5, 'MPT')).toBe('0.005') // 10% transfer fee expect(formatTransferFee(100, 'MPT')).toBe('0.1') }) it('should calculate percentage for NFT tokens using thousand-based formula', () => { expect(formatTransferFee(5, 'NFT')).toBe('0.005') expect(formatTransferFee(100, 'NFT')).toBe('0.1') }) it('should handle high precision values for MPT/NFT tokens', () => { // Test with a value that needs rounding to 3 decimal places expect(formatTransferFee(1234, 'MPT')).toBe('1.234') expect(formatTransferFee(1235, 'NFT')).toBe('1.235') // Test rounding }) it('should handle very small transfer fees for MPT/NFT tokens', () => { expect(formatTransferFee(1, 'MPT')).toBe('0.001') expect(formatTransferFee(0.5, 'NFT')).toBe('0.001') // Should round to 3 decimal places }) }) describe('edge cases', () => { it('should throw error for unsupported token types', () => { // @ts-expect-error - testing invalid token types expect(() => formatTransferFee(100, 'XRP')).toThrow( 'Unsupported Token type: XRP', ) // @ts-expect-error - testing invalid token types expect(() => formatTransferFee(100, 'INVALID')).toThrow( 'Unsupported Token type: INVALID', ) // @ts-expect-error - testing invalid token types expect(() => formatTransferFee(100, '')).toThrow( 'Unsupported Token type: ', ) // @ts-expect-error - testing invalid token types expect(() => formatTransferFee(100, null)).toThrow( 'Unsupported Token type: null', ) }) }) }) describe('formatMPTIssuance', () => { it('should format all MPT issuance fields correctly', () => { // Hex-encoded JSON: {"t":"USD","in":"Test Issuer"} const metadataHex = '7b2274223a22555344222c22696e223a225465737420497373756572227d' const mptIssuanceData: any = { Issuer: 'rMPTTestAccount123456789', AssetScale: 6, MaximumAmount: '1000000000000', OutstandingAmount: '500000000000', TransferFee: 500, Sequence: 1, Flags: 0x7f, // All flags MPTokenMetadata: metadataHex, } const result = formatMPTIssuance(mptIssuanceData) expect(result.issuer).toBe('rMPTTestAccount123456789') expect(result.assetScale).toBe(6) expect(result.maxAmt).toBe('1000000000000') expect(result.outstandingAmt).toBe('500000000000') expect(result.transferFee).toBe(500) expect(result.sequence).toBe(1) expect(result.flags).toContain('lsfMPTLocked') expect(result.flags).toContain('lsfMPTCanLock') expect(result.flags).toContain('lsfMPTRequireAuth') expect(result.flags).toContain('lsfMPTCanEscrow') expect(result.flags).toContain('lsfMPTCanTrade') expect(result.flags).toContain('lsfMPTCanTransfer') expect(result.flags).toContain('lsfMPTCanClawback') expect(result.rawMPTMetadata).toBe('{"t":"USD","in":"Test Issuer"}') expect(result.parsedMPTMetadata).toEqual({ ticker: 'USD', issuer_name: 'Test Issuer', }) // isMPTMetadataCompliant is false because the test metadata doesn't meet full XLS-89 requirements expect(result.isMPTMetadataCompliant).toBe(false) }) }) }) ================================================ FILE: src/rippled/lib/txSummary/formatAmount.ts ================================================ import type { MPTAmount } from 'xrpl' import { Amount, ExplorerAmount } from '../../../containers/shared/types' import { XRP_BASE } from '../utils' /** * Asset type definition for XRPL assets */ export interface Asset { currency: string issuer?: string isMPT?: boolean mpt_issuance_id?: string } /** * Format Asset field according to XRPL specifications * - XRP: { "currency": "XRP" } or "XRP" (string) * - IOU: { "currency": "USD", "issuer": "rXXX..." } * - MPT: { "mpt_issuance_id": "000000..." } */ export function formatAsset(asset: any): Asset { if (typeof asset === 'string') { return { currency: 'XRP' } } if (asset && typeof asset === 'object') { if (asset.mpt_issuance_id) { return { currency: asset.mpt_issuance_id, mpt_issuance_id: asset.mpt_issuance_id, isMPT: true, } } if (asset.currency) { return { currency: asset.currency, issuer: asset.issuer, } } } // Fallback to XRP if asset format is unclear return { currency: 'XRP' } } export const isXRP = (amount: Amount): boolean => typeof amount === 'string' export const isMPTAmount = (amount: Amount): amount is MPTAmount => (amount as MPTAmount).mpt_issuance_id !== undefined && (amount as MPTAmount).value !== undefined export const formatAmount = (d: Amount | number): ExplorerAmount => { if (d == null) { return d } if (typeof d === 'string' || typeof d === 'number') return { currency: 'XRP', amount: Number(d) / XRP_BASE, } return isMPTAmount(d) ? { currency: d.mpt_issuance_id, amount: d.value, isMPT: true, } : { currency: d.currency, issuer: d.issuer, amount: Number(d.value), } } /** * Formats a raw amount using the provided asset information * @param amount - The amount to format (string or number) * @param asset - The asset information containing currency and issuer * @returns ExplorerAmount - Formatted amount with correct currency */ export function formatAmountWithAsset(amount: string | number, asset: Asset) { if (amount == null || amount === undefined) { return undefined } const numericAmount = typeof amount === 'string' ? parseFloat(amount) : amount if (asset.currency === 'XRP') { return { currency: 'XRP', amount: numericAmount / XRP_BASE, } } if (asset.isMPT) { return { currency: asset.currency, amount: numericAmount, isMPT: true, } } return { currency: asset.currency, issuer: asset.issuer!, amount: numericAmount, } } export default formatAmount ================================================ FILE: src/rippled/lib/txSummary/index.ts ================================================ import type { Transaction, TransactionMetadata } from 'xrpl' import { transactionTypes } from '../../../containers/shared/components/Transaction' import { defaultParser } from '../../../containers/shared/components/Transaction/defaultParser' export interface TransactionSummary { hash: string ctid: string type: string result: string account: string index?: number fee?: number sequence?: number ticketSequence?: number isHook?: boolean date?: string details?: { instructions: any } } const getInstructions = (tx: Transaction, meta: TransactionMetadata) => { const type = tx.TransactionType const parser = transactionTypes[type]?.parser || defaultParser return parser(tx, meta) } const summarizeTransaction = (d: any, details = false): TransactionSummary => { const summary: TransactionSummary = { hash: d.hash, ctid: d.ctid, type: d.tx.TransactionType, result: d.meta.TransactionResult, account: d.tx.Account, } if (!details) { return summary } return { ...summary, index: Number(d.meta.TransactionIndex), fee: d.tx.Fee / 1000000, sequence: d.tx.Sequence, ticketSequence: d.tx.TicketSequence, isHook: !!d.tx.EmitDetails, date: d.date, details: { instructions: getInstructions(d.tx, d.meta), }, } } export default summarizeTransaction ================================================ FILE: src/rippled/lib/utils.ts ================================================ import { hexToString, hexToBytes } from '@xrplf/isomorphic/utils' import { encodeAccountID } from 'ripple-address-codec' import { decodeHex } from '../../containers/shared/transactionUtils' import { convertRippleDate } from './convertRippleDate' import { formatSignerList } from './formatSignerList' import { isMPTokenMetadataCompliant as isMPTMetadataCompliant, parseMPTokenMetadata as parseMPTMetadata, } from '../../containers/shared/mptUtils' const XRP_BASE = 1000000 const THOUSAND = 1000 const BILLION = 1000000000 type FlagMap = Record export const ACCOUNT_FLAGS: FlagMap = { 0x00010000: 'lsfPasswordSpent', 0x00020000: 'lsfRequireDestTag', 0x00040000: 'lsfRequireAuth', 0x00080000: 'lsfDisallowXRP', 0x00100000: 'lsfDisableMaster', 0x00200000: 'lsfNoFreeze', 0x00400000: 'lsfGlobalFreeze', 0x00800000: 'lsfDefaultRipple', 0x01000000: 'lsfDepositAuth', 0x04000000: 'lsfDisallowIncomingNFTokenOffer', 0x08000000: 'lsfDisallowIncomingCheck', 0x10000000: 'lsfDisallowIncomingPayChan', 0x20000000: 'lsfDisallowIncomingTrustline', 0x80000000: 'lsfAllowTrustLineClawback', 0x40000000: 'lsfAllowTrustLineLocking', } const NFT_FLAGS: FlagMap = { 0x00000001: 'lsfBurnable', 0x00000002: 'lsfOnlyXRP', 0x00000008: 'lsfTransferable', } const MPT_ISSUANCE_FLAGS: FlagMap = { 0x00000001: 'lsfMPTLocked', 0x00000002: 'lsfMPTCanLock', 0x00000004: 'lsfMPTRequireAuth', 0x00000008: 'lsfMPTCanEscrow', 0x00000010: 'lsfMPTCanTrade', 0x00000020: 'lsfMPTCanTransfer', 0x00000040: 'lsfMPTCanClawback', } const MPTOKEN_FLAGS: FlagMap = { 0x00000001: 'lsfMPTLocked', 0x00000002: 'lsfMPTAuthorized', } const hex32 = (d: number): string => { const int = d & 0xffffffff const hex = int.toString(16).toUpperCase() return `0x${`00000000${hex}`.slice(-8)}` } const zeroPad = ( num: number | string, size: number, back: boolean = false, ): string => { let s = String(num) while (s.length < (size || 2)) { s = back ? `${s}0` : `0${s}` } return s } export const buildFlags = ( flags: number | undefined, flagMap: FlagMap, ): string[] => { const bits = zeroPad((flags || 0).toString(2), 32).split('') return bits .map((value, i) => { const bin = zeroPad(1, 32 - i, true) const int = parseInt(bin, 2) return value === '1' ? flagMap[int] || hex32(int) : undefined }) .filter((d): d is string => Boolean(d)) } type TokenType = 'IOU' | 'NFT' | 'MPT' const formatTransferFee = ( transferFee: number | null | undefined, tokenType: TokenType, ): string => { if (!transferFee) { return '0' } // https://xrpl.org/docs/concepts/tokens/fungible-tokens/transfer-fees#technical-details if (tokenType === 'IOU') { const transferFeePercentage = (100 * (transferFee - BILLION)) / BILLION return parseFloat(transferFeePercentage.toFixed(7)).toString() } // MTP: https://xrpl.org/docs/references/protocol/data-types/nftoken#transferfee // NFT: https://xrpl.org/docs/concepts/tokens/fungible-tokens/multi-purpose-tokens#transfer-fees if (tokenType === 'NFT' || tokenType === 'MPT') { const transferFeePercentage = transferFee / THOUSAND return parseFloat(transferFeePercentage.toFixed(3)).toString() } throw new Error(`Unsupported Token type: ${tokenType}`) } interface AccountInfo { AccountTxnID?: string Sequence: number TicketCount?: number OwnerCount: number TickSize?: number TransferRate?: number Domain?: string EmailHash?: string Flags: number Balance: string PreviousTxnID: string PreviousTxnLgrSeq: number NFTokenMinter?: string } interface ServerInfoValidated { reserve_base_xrp?: number reserve_inc_xrp?: number } interface FormattedAccountInfo { accountTransactionID?: string sequence: number ticketCount: number ownerCount: number reserve?: number tick?: number rate: string domain?: string emailHash?: string flags: string[] balance: string previousTxn: string previousLedger: number nftMinter?: string } const formatAccountInfo = ( info: AccountInfo, serverInfoValidated: ServerInfoValidated, ): FormattedAccountInfo => ({ accountTransactionID: info.AccountTxnID, sequence: info.Sequence, ticketCount: info.TicketCount ?? 0, ownerCount: info.OwnerCount, reserve: serverInfoValidated.reserve_base_xrp && serverInfoValidated.reserve_inc_xrp ? serverInfoValidated.reserve_base_xrp + info.OwnerCount * serverInfoValidated.reserve_inc_xrp : undefined, tick: info.TickSize, rate: formatTransferFee(info.TransferRate, 'IOU'), domain: info.Domain ? hexToString(info.Domain) : undefined, emailHash: info.EmailHash, flags: buildFlags(info.Flags, ACCOUNT_FLAGS), balance: info.Balance, previousTxn: info.PreviousTxnID, previousLedger: info.PreviousTxnLgrSeq, nftMinter: info.NFTokenMinter, }) const formatTransaction = (tx: any): any => { // `tx` is the property for some v1 arrays of transactions such as account_tx and `tx_json` is used in v2 for all const txn = tx.tx || tx.tx_json || tx // `hash` is up a level on v2 responses objects const hash = txn.hash || tx.hash return { tx: { ...txn, date: txn.date ? convertRippleDate(txn.date) : undefined, }, meta: tx.meta || tx.metaData, hash, ledger_index: txn.ledger_index, date: txn.date ? convertRippleDate(txn.date) : undefined, } } class RippledError extends Error { code: number constructor(message: string, code: number) { super(message) if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor) } this.name = this.constructor.name this.code = code } } function convertHexToString(hex: string | undefined): string | undefined { return hex ? hexToString(hex) : undefined } interface NFTInfo { nft_id: string ledger_index: number owner: string is_burned: boolean flags: number transfer_fee: number issuer: string nft_taxon: number nft_serial?: number nft_sequence?: number uri: string validated: boolean status?: string warnings?: any[] } interface FormattedNFTInfo { NFTId: string ledgerIndex: number owner: string isBurned: boolean flags: string[] transferFee: number issuer: string NFTTaxon: number NFTSerial: number uri: string validated: boolean status?: string warnings?: any[] } const formatNFTInfo = (info: NFTInfo): FormattedNFTInfo => ({ NFTId: info.nft_id, ledgerIndex: info.ledger_index, owner: info.owner, isBurned: info.is_burned, flags: buildFlags(info.flags, NFT_FLAGS), transferFee: info.transfer_fee, issuer: info.issuer, NFTTaxon: info.nft_taxon, // TODO: remove `nft_sequence` support after clio update has been fully rolled out. NFTSerial: info.nft_serial ?? info.nft_sequence ?? 0, uri: info.nft_serial ? decodeHex(info.uri) : info.uri, validated: info.validated, status: info.status, warnings: info.warnings, }) interface MPTIssuanceInfo { Issuer: string AssetScale: number MaximumAmount?: string OutstandingAmount?: string TransferFee: number Sequence: number MPTokenMetadata?: string Flags: number } interface FormattedMPTIssuance { issuer: string assetScale: number maxAmt?: string outstandingAmt: string transferFee: number sequence: number metadata?: any flags: string[] rawMPTMetadata?: string parsedMPTMetadata?: Record isMPTMetadataCompliant: boolean } const formatMPTIssuance = (info: MPTIssuanceInfo): FormattedMPTIssuance => { const rawMPTMetadataHex = info.MPTokenMetadata const rawMPTMetadata = rawMPTMetadataHex ? hexToString(rawMPTMetadataHex) : undefined return { issuer: info.Issuer, assetScale: info.AssetScale, maxAmt: info.MaximumAmount ? BigInt(info.MaximumAmount).toString(10) : undefined, // default is undefined because the default maxAmt is the largest 63-bit int outstandingAmt: info.OutstandingAmount ? BigInt(info.OutstandingAmount).toString(10) : '0', transferFee: info.TransferFee, sequence: info.Sequence, rawMPTMetadata, parsedMPTMetadata: parseMPTMetadata(rawMPTMetadataHex), isMPTMetadataCompliant: isMPTMetadataCompliant(rawMPTMetadataHex), flags: buildFlags(info.Flags, MPT_ISSUANCE_FLAGS), } } interface MPTokenInfo { Account: string Flags: number MPTokenIssuanceID: string MPTAmount?: bigint } interface FormattedMPToken { account: string flags: string[] mptIssuanceID: string mptIssuer: string mptAmount: string } const formatMPToken = (info: MPTokenInfo): FormattedMPToken => ({ account: info.Account, flags: buildFlags(info.Flags, MPTOKEN_FLAGS), mptIssuanceID: info.MPTokenIssuanceID, mptIssuer: encodeAccountID( hexToBytes(info.MPTokenIssuanceID.substring(8, 48)), ), mptAmount: info.MPTAmount ? info.MPTAmount.toString(10) : '0', }) export { XRP_BASE, RippledError as Error, convertRippleDate, formatTransaction, formatSignerList, formatAccountInfo, convertHexToString, formatNFTInfo, formatMPTIssuance, formatMPToken, formatTransferFee, } ================================================ FILE: src/rippled/nUNL.ts ================================================ import { encodeNodePublic } from 'ripple-address-codec' import { hexToBytes } from '@xrplf/isomorphic/utils' import { getNegativeUNL as getRippledNegativeUNL } from './lib/rippled' import logger from './lib/logger' import type { ExplorerXrplClient } from '../containers/shared/SocketContext' const log = logger({ name: 'nunl' }) const getNegativeUNL = async ( rippledSocket: ExplorerXrplClient, ): Promise => { log.info(`getting nUNL from rippled`) try { const result = await getRippledNegativeUNL(rippledSocket) if (result === undefined || result.length === 0) return [] if (result.node === undefined) throw new Error('node is not a included in this ledger_entry') const validators = result.node.DisabledValidators if (validators !== undefined) { return validators .map((obj: any) => obj.DisabledValidator.PublicKey) .map((key: string) => encodeNodePublic(hexToBytes(key))) } return [] } catch (error: any) { log.error(error.toString()) throw error } } export default getNegativeUNL ================================================ FILE: src/rippled/offers.ts ================================================ import logger from './lib/logger' import { getOffers } from './lib/rippled' import type { ExplorerXrplClient } from '../containers/shared/SocketContext' const log = logger({ name: 'offers' }) export interface OrderBook { offers: any[] averageExchangeRate?: number highestExchangeRate?: number lowestExchangeRate?: number } const getBookOffers = async ( currencyCode: string, issuerAddress: string, pairCurrencyCode: string, pairIssuerAddress: string, rippledSocket: ExplorerXrplClient, ): Promise => { try { // log.info('fetching book offers from rippled') let orderBook: any = await getOffers( rippledSocket, currencyCode, issuerAddress, pairCurrencyCode, pairIssuerAddress, ) const { offers } = orderBook if (offers.length === 0) { return orderBook } let rateSum = 0 let highestExchangeRate = 0 let lowestExchangeRate = Number.MAX_VALUE for (const offer of offers) { const takerPays = offer.TakerPays.value || offer.TakerPays const takerGets = offer.TakerGets.value || offer.TakerGets const rate = takerPays / takerGets if (rate > highestExchangeRate) { highestExchangeRate = rate } if (rate < lowestExchangeRate) { lowestExchangeRate = rate } rateSum += rate } const averageExchangeRate = rateSum / offers.length offers.sort( (offerA: any, offerB: any) => offerA.PreviousTxnLgrSeq - offerB.PreviousTxnLgrSeq, ) orderBook = { ...orderBook, averageExchangeRate, highestExchangeRate, lowestExchangeRate, offers, } return orderBook } catch (error: any) { log.error(error.toString()) throw error } } export default getBookOffers ================================================ FILE: src/rippled/quorum.ts ================================================ import logger from './lib/logger' import { Error } from './lib/utils' import { getServerInfo } from './lib/rippled' import type { ExplorerXrplClient } from '../containers/shared/SocketContext' const log = logger({ name: 'quorum' }) const getQuorum = async ( rippledSocket: ExplorerXrplClient, ): Promise => { log.info(`fetching server_info from rippled`) try { const result = await getServerInfo(rippledSocket) if (result === undefined || result.info === undefined) { throw new Error('Undefined result from getServerInfo()', 500) } const quorum = result.info.validation_quorum if (quorum === undefined) { throw new Error('Undefined validation_quorum', 500) } return quorum } catch (error: any) { log.error(error.toString()) throw error } } export default getQuorum ================================================ FILE: src/rippled/test/accountTransactions.test.ts ================================================ import getAccountTransactions from '../accountTransactions' // Mock dependencies jest.mock('../lib/rippled', () => ({ getAccountTransactions: jest.fn(), })) jest.mock('../lib/utils', () => ({ formatTransaction: (tx: any) => tx, })) jest.mock('../lib/txSummary', () => (tx: any) => tx) jest.mock('../lib/logger', () => () => ({ info: jest.fn(), error: jest.fn(), })) // eslint-disable-next-line @typescript-eslint/no-require-imports const mockGetAccountTxs = require('../lib/rippled').getAccountTransactions describe('accountTransactions', () => { const mockSocket = {} as any const validAccount = 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh' beforeEach(() => { jest.clearAllMocks() }) it('should return all transactions when no currency filter is applied', async () => { const mockTxs = { transactions: [ { hash: 'tx1', type: 'Payment', currency: 'XRP' }, { hash: 'tx2', type: 'Payment', currency: 'USD', issuer: 'rIssuer1' }, { hash: 'tx3', type: 'MPTokenAuthorize', mpt_issuance_id: '00000001ABC123', }, ], marker: '12345.1', } mockGetAccountTxs.mockResolvedValue(mockTxs) const result = await getAccountTransactions( validAccount, undefined, // no currency filter undefined, 20, mockSocket, ) expect(result.transactions).toHaveLength(3) expect(result.transactions[0].hash).toBe('tx1') expect(result.transactions[1].hash).toBe('tx2') expect(result.transactions[2].hash).toBe('tx3') expect(result.marker).toBe('12345.1') }) it('should filter transactions by IOU currency', async () => { const mockTxs = { transactions: [ { hash: 'tx1', type: 'Payment', currency: 'XRP' }, { hash: 'tx2', type: 'Payment', currency: 'USD', issuer: 'rIssuer1' }, { hash: 'tx3', type: 'Payment', currency: 'EUR', issuer: 'rIssuer2' }, ], marker: undefined, } mockGetAccountTxs.mockResolvedValue(mockTxs) const result = await getAccountTransactions( validAccount, 'usd', // filter by USD (lowercase to test case conversion) undefined, 20, mockSocket, ) expect(result.transactions).toHaveLength(1) expect(result.transactions[0].hash).toBe('tx2') expect(result.transactions[0].currency).toBe('USD') }) it('should filter transactions by MPT issuance ID', async () => { const mptIssuanceId = '00000001ABC123DEF456' const mockTxs = { transactions: [ { hash: 'tx1', type: 'Payment', currency: 'XRP' }, { hash: 'tx2', type: 'Payment', currency: 'USD', issuer: 'rIssuer1' }, { hash: 'tx3', type: 'MPTokenAuthorize', mpt_issuance_id: mptIssuanceId, }, { hash: 'tx4', type: 'MPTokenIssuanceCreate', mpt_issuance_id: mptIssuanceId, }, ], marker: undefined, } mockGetAccountTxs.mockResolvedValue(mockTxs) const result = await getAccountTransactions( validAccount, mptIssuanceId, undefined, 20, mockSocket, ) expect(result.transactions).toHaveLength(2) expect(result.transactions[0].hash).toBe('tx3') expect(result.transactions[1].hash).toBe('tx4') }) }) ================================================ FILE: src/rippled/token.ts ================================================ import logger from './lib/logger' import { formatAccountInfo } from './lib/utils' import { getBalances, getAccountInfo, getServerInfo } from './lib/rippled' import type { ExplorerXrplClient } from '../containers/shared/SocketContext' const log = logger({ name: 'iou' }) export interface TokenData { balance: string reserve?: number sequence: number rate?: string obligations?: string domain?: string emailHash?: string previousLedger: number previousTxn: string flags: string[] } async function getToken( currencyCode: string, issuer: string, rippledSocket: ExplorerXrplClient, ): Promise { try { log.info('fetching account info from rippled') const accountInfo = await getAccountInfo(rippledSocket, issuer) const serverInfo = await getServerInfo(rippledSocket) log.info('fetching gateway_balances from rippled') const balances = await getBalances(rippledSocket, issuer) const obligations = balances?.obligations && balances.obligations[currencyCode.toUpperCase()] if (!obligations) { throw new Error('Currency not issued by account') } const { reserve, sequence, rate, domain, emailHash, balance, flags, previousTxn, previousLedger, } = formatAccountInfo(accountInfo, serverInfo.info.validated_ledger) return { reserve, sequence, rate, domain, emailHash, balance, flags, obligations, previousTxn, previousLedger, } } catch (error) { if (error) { log.error(error.toString()) } throw error } } export default getToken ================================================ FILE: src/rippled/transactions.ts ================================================ import logger from './lib/logger' import { formatTransaction } from './lib/utils' import { getTransaction as getRippledTransaction } from './lib/rippled' import summarizeTransaction from './lib/txSummary' import type { ExplorerXrplClient } from '../containers/shared/SocketContext' const log = logger({ name: 'transactions' }) export interface TransactionData { summary: any processed: any raw: any } const getTransaction = async ( transactionId: string, rippledSocket: ExplorerXrplClient, ): Promise => { log.info(`get tx: ${transactionId}`) try { const data = await getRippledTransaction(rippledSocket, transactionId) const formattedTransaction = formatTransaction(data) return { summary: summarizeTransaction(formattedTransaction, true).details, processed: formattedTransaction, raw: data, } } catch (error: any) { log.error(error.toString()) throw error } } export default getTransaction ================================================ FILE: src/setupTests.ts ================================================ import 'dotenv/config' import '@testing-library/jest-dom' import { TextEncoder, TextDecoder } from 'util' // ResizeObserver is not available in jsdom, needed by recharts and other libs /* eslint-disable class-methods-use-this */ global.ResizeObserver = class ResizeObserver { observe() {} unobserve() {} disconnect() {} } /* eslint-enable class-methods-use-this */ const mockStorage = {} window.dataLayer = window.dataLayer || [] window.localStorage = window.localStorage || { getItem: (key) => mockStorage[key], setItem: (key, value) => { mockStorage[key] = value }, removeItem: (key) => delete mockStorage[key], } jest.spyOn(console, 'error') // @ts-expect-error // eslint-disable-next-line no-console -- only for tests console.error.mockImplementation(() => {}) window.TextEncoder = TextEncoder // @ts-expect-error -- TextDecoder needs to be defined for jest window.TextDecoder = TextDecoder afterEach(() => { window.dataLayer = [] }) ================================================ FILE: testUtils/cssTransform.js ================================================ module.exports = { process() { return { code: 'module.exports = {};', } }, getCacheKey() { // The output is always the same. return 'cssTransform' }, } ================================================ FILE: testUtils/imageTransform.js ================================================ module.exports = { process() { return { code: 'module.exports = {};', } }, getCacheKey() { // The output is always the same. return 'imageTransform' }, } ================================================ FILE: testUtils/svgTransform.js ================================================ const path = require('path') // This is a custom Jest transformer turning file imports into filenames. // http://facebook.github.io/jest/docs/en/webpack.html module.exports = { process(_src, filename) { const assetFilename = JSON.stringify(path.basename(filename)) return { code: `const React = require('react'); module.exports = React.forwardRef((props, ref) => { return { $$typeof: Symbol.for('react.element'), type: 'svg', ref: ref, key: null, props: Object.assign({}, props, { children: ${assetFilename} }) }; });`, } }, } ================================================ FILE: testUtils/svgUrlTransform.js ================================================ // Mock module for SVG imports with ?url suffix // Returns a mock URL path for testing module.exports = '/mock-svg-url.svg' ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "baseUrl": "src", "target": "esnext", "module": "esnext", "declaration": true, "sourceMap": true, "outDir": "build", "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, "noImplicitReturns": true, "noImplicitAny": false, "noFallthroughCasesInSwitch": true, "moduleResolution": "node", "allowJs": true, "checkJs": false, "forceConsistentCasingInFileNames": true, "esModuleInterop": true, "jsx": "react-jsx", "lib": ["dom", "dom.iterable", "esnext"], "types": ["jest"], "typeRoots": ["./node_modules/@types", "./@types"], "skipLibCheck": true, "allowSyntheticDefaultImports": true, "resolveJsonModule": true, "isolatedModules": true, "noEmit": true }, "include": ["src", "server", "@types"] } ================================================ FILE: vite.config.js ================================================ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import viteTsconfigPaths from 'vite-tsconfig-paths' import svgrPlugin from 'vite-plugin-svgr' import { createHtmlPlugin } from 'vite-plugin-html' import EnvironmentPlugin from 'vite-plugin-environment' import autoprefixer from 'autoprefixer' import 'dotenv/config' // Populate with `version` field of package.json process.env.VITE_APP_VERSION = process.env.npm_package_version // https://vitejs.dev/config/ export default defineConfig({ // source code location root: './src', // where env vars are stored envDir: '..', build: { // where build files should be stored outDir: '../build', // empty the build directory on each build emptyOutDir: true, sourcemap: true, commonjsOptions: { transformMixedEsModules: true, }, rollupOptions: { // improve CPU usage cache: false, }, }, // relative to the root publicDir: '../public', server: { // backend settings open: true, port: 3000, proxy: { '/api': 'http://localhost:5001', }, }, resolve: { // polyfills alias: { events: 'events', }, }, optimizeDeps: { esbuildOptions: { define: { // Node.js global to browser globalThis global: 'globalThis', }, }, }, plugins: [ // export SVGs as React components by default svgrPlugin({ svgrOptions: { ref: true, }, include: '**/*.svg', }), react({ // Use React plugin in all *.jsx and *.tsx files include: '**/*.{jsx,tsx}', }), createHtmlPlugin({ inject: { data: { VITE_GTM_ID: process.env.VITE_GTM_ID, VITE_OSANO_ID: process.env.VITE_OSANO_ID, }, }, }), // use env vars EnvironmentPlugin('all'), // use TS paths viteTsconfigPaths(), ], css: { postcss: { plugins: [ autoprefixer({}), // add options if needed ], }, preprocessorOptions: { scss: { api: 'modern-compiler', silenceDeprecations: ['mixed-decls'], }, }, }, })