diff --git a/.changeset/rude-tables-share.md b/.changeset/rude-tables-share.md new file mode 100644 index 000000000000..8cb032d27917 --- /dev/null +++ b/.changeset/rude-tables-share.md @@ -0,0 +1,22 @@ +--- +"@ledgerhq/types-live": minor +"@ledgerhq/coin-algorand": patch +"@ledgerhq/coin-polkadot": patch +"@ledgerhq/coin-bitcoin": patch +"@ledgerhq/coin-evm": patch +"@actions/build-checks": patch +"@ledgerhq/native-modules-tools": patch +"ledger-live-desktop": minor +"live-mobile": minor +"@ledgerhq/live-common": minor +"@ledgerhq/ethereum-provider": patch +"@ledgerhq/dummy-wallet-app": patch +"@ledgerhq/wallet-api-exchange-module": patch +"@ledgerhq/coin-framework": minor +"@ledgerhq/live-nft-react": patch +"@ledgerhq/live-wallet": patch +"@ledgerhq/live-cli": patch +"@ledgerhq/live-env": patch +--- + +Drop technical Account#name and Account#starred fields and replace it with a new architecture: a wallet store that contains all user's data. diff --git a/.changeset/wet-apes-rest.md b/.changeset/wet-apes-rest.md new file mode 100644 index 000000000000..30f7f4e84ae1 --- /dev/null +++ b/.changeset/wet-apes-rest.md @@ -0,0 +1,5 @@ +--- +"ledger-live-desktop": patch +--- + +Remove .unit usage from account.unit diff --git a/apps/cli/package.json b/apps/cli/package.json index af23db169d22..7298fd8f24e2 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -41,6 +41,7 @@ "@ledgerhq/live-config": "workspace:^", "@ledgerhq/live-countervalues": "workspace:^", "@ledgerhq/live-env": "workspace:^", + "@ledgerhq/live-wallet": "workspace:^", "@ledgerhq/live-network": "workspace:^", "@ledgerhq/logs": "workspace:^", "@ledgerhq/types-devices": "workspace:^", diff --git a/apps/cli/src/commands/blockchain/derivation.ts b/apps/cli/src/commands/blockchain/derivation.ts index 597e33d9aa09..09cc81c5484d 100644 --- a/apps/cli/src/commands/blockchain/derivation.ts +++ b/apps/cli/src/commands/blockchain/derivation.ts @@ -6,7 +6,8 @@ import { getDerivationScheme, } from "@ledgerhq/coin-framework/derivation"; import { setEnv, getEnv } from "@ledgerhq/live-env"; -import { getAccountPlaceholderName } from "@ledgerhq/live-common/account/index"; +import { getDefaultAccountNameForCurrencyIndex } from "@ledgerhq/live-wallet/accountName"; + export default { args: [], job: () => @@ -32,11 +33,7 @@ export default { " " + (derivationMode || "default") + ": " + - getAccountPlaceholderName({ - currency, - index: 0, - derivationMode, - }) + + getDefaultAccountNameForCurrencyIndex({ currency, index: 0 }) + ": " + path ); diff --git a/apps/cli/src/commands/blockchain/estimateMaxSpendable.ts b/apps/cli/src/commands/blockchain/estimateMaxSpendable.ts index 51f747ea06c2..5d9944bc602d 100644 --- a/apps/cli/src/commands/blockchain/estimateMaxSpendable.ts +++ b/apps/cli/src/commands/blockchain/estimateMaxSpendable.ts @@ -1,14 +1,16 @@ import { concat, from } from "rxjs"; import { concatMap } from "rxjs/operators"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getAccountUnit, getAccountName } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { scan, scanCommonOpts } from "../../scan"; import type { ScanCommonOpts } from "../../scan"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; +import { AccountLike } from "@ledgerhq/types-live"; -const format = (account, value) => { - const unit = getAccountUnit(account); - const name = getAccountName(account); +const format = (account: AccountLike, value) => { + const unit = getAccountCurrency(account).units[0]; + const name = getDefaultAccountName(account); const amount = formatCurrencyUnit(unit, value, { showCode: true, disableRounding: true, diff --git a/apps/cli/src/commands/blockchain/generateTestTransaction.ts b/apps/cli/src/commands/blockchain/generateTestTransaction.ts index 391cb57ba4a0..95e17f58009e 100644 --- a/apps/cli/src/commands/blockchain/generateTestTransaction.ts +++ b/apps/cli/src/commands/blockchain/generateTestTransaction.ts @@ -10,6 +10,7 @@ import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import type { InferTransactionsOpts } from "../../transaction"; import { inferTransactions, inferTransactionsOpts } from "../../transaction"; import type { SignedOperation } from "@ledgerhq/types-live"; +import { getDefaultAccountNameForCurrencyIndex } from "@ledgerhq/live-wallet/accountName"; const toJS = obj => { if (typeof obj === "object" && obj) { @@ -118,7 +119,7 @@ ${apdus.map(a => " " + a).join("\n")} reduce((jsCodes, code) => jsCodes.concat(code), []), map( codes => `{ - name: "${account.name}", + name: "${getDefaultAccountNameForCurrencyIndex(account)}", raw: ${JSON.stringify( toAccountRaw({ ...account, diff --git a/apps/cli/src/commands/live/balanceHistory.ts b/apps/cli/src/commands/live/balanceHistory.ts index 5656eb4f4962..e7272c8cd282 100644 --- a/apps/cli/src/commands/live/balanceHistory.ts +++ b/apps/cli/src/commands/live/balanceHistory.ts @@ -11,15 +11,17 @@ import { import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { scan, scanCommonOpts } from "../../scan"; import type { ScanCommonOpts } from "../../scan"; -import type { PortfolioRange } from "@ledgerhq/types-live"; -const histoFormatters = { +import type { Account, BalanceHistory, PortfolioRange } from "@ledgerhq/types-live"; +import { getDefaultAccountNameForCurrencyIndex } from "@ledgerhq/live-wallet/accountName"; + +const histoFormatters: Record unknown> = { default: (histo, account) => histo .map( ({ date, value }) => date.toISOString() + " " + - formatCurrencyUnit(account.unit, new BigNumber(value), { + formatCurrencyUnit(account.currency.units[0], new BigNumber(value), { showCode: true, disableRounding: true, }), @@ -29,21 +31,23 @@ const histoFormatters = { asciichart: (history, account) => "\n" + "".padStart(22) + - account.name + + getDefaultAccountNameForCurrencyIndex(account) + ": " + - formatCurrencyUnit(account.unit, account.balance, { + formatCurrencyUnit(account.currency.units[0], account.balance, { showCode: true, disableRounding: true, }) + "\n" + asciichart.plot( - history.map(h => h.value.div(new BigNumber(10).pow(account.unit.magnitude)).toNumber()), + history.map( + h => h.value / new BigNumber(10).pow(account.currency.units[0].magnitude).toNumber(), + ), { height: 10, format: value => formatCurrencyUnit( - account.unit, - new BigNumber(value).times(new BigNumber(10).pow(account.unit.magnitude)), + account.currency.units[0], + new BigNumber(value).times(new BigNumber(10).pow(account.currency.units[0].magnitude)), { showCode: true, disableRounding: true, diff --git a/apps/cli/src/commands/live/exportAccounts.ts b/apps/cli/src/commands/live/exportAccounts.ts index 4a35aa8cac91..e64feb8d99b8 100644 --- a/apps/cli/src/commands/live/exportAccounts.ts +++ b/apps/cli/src/commands/live/exportAccounts.ts @@ -1,11 +1,12 @@ import { of, interval } from "rxjs"; import { reduce, mergeMap, shareReplay, tap } from "rxjs/operators"; import { dataToFrames } from "qrloop"; -import { encode } from "@ledgerhq/live-common/cross"; +import { encode } from "@ledgerhq/live-wallet/liveqr/cross"; import { asQR } from "../../qr"; import { scan, scanCommonOpts } from "../../scan"; import type { ScanCommonOpts } from "../../scan"; import { Account } from "@ledgerhq/types-live"; +import { initialState } from "@ledgerhq/live-wallet/store"; export default { description: "Export given accounts to Live QR or console for importing", args: [ @@ -27,6 +28,7 @@ export default { reduce((accounts, account) => accounts.concat(account), []), mergeMap(accounts => { const data = encode({ + walletState: initialState, accounts, settings: { pairExchanges: {}, diff --git a/apps/cli/src/commands/live/portfolio.ts b/apps/cli/src/commands/live/portfolio.ts index a0b0264074b9..d74fd6f81613 100644 --- a/apps/cli/src/commands/live/portfolio.ts +++ b/apps/cli/src/commands/live/portfolio.ts @@ -5,7 +5,7 @@ import { from } from "rxjs"; import { reduce, concatMap, map } from "rxjs/operators"; import type { Account, PortfolioRange } from "@ledgerhq/types-live"; import type { Currency } from "@ledgerhq/types-cryptoassets"; -import { flattenAccounts, getAccountName } from "@ledgerhq/live-common/account/index"; +import { flattenAccounts } from "@ledgerhq/live-common/account/index"; import { getPortfolio, getRanges } from "@ledgerhq/live-countervalues/portfolio"; import { formatCurrencyUnit, findCurrencyByTicker } from "@ledgerhq/live-common/currencies/index"; import { scan, scanCommonOpts } from "../../scan"; @@ -15,6 +15,7 @@ import { loadCountervalues, inferTrackingPairForAccounts, } from "@ledgerhq/live-countervalues/logic"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; function asPortfolioRange(period: string): PortfolioRange { const ranges = getRanges(); @@ -116,14 +117,15 @@ export default { let str = ""; accounts.forEach(top => { - str += render("Account " + getAccountName(top), [top]); + str += render("Account " + getDefaultAccountName(top), [top]); str += "\n"; if (top.subAccounts) { top.subAccounts.forEach(sub => { - str += render("Account " + getAccountName(top) + " > " + getAccountName(sub), [ - sub, - ]).replace(/\n/s, " \n"); + str += render( + "Account " + getDefaultAccountName(top) + " > " + getDefaultAccountName(sub), + [sub], + ).replace(/\n/s, " \n"); str += "\n"; }); } diff --git a/apps/cli/src/commands/ptx/swap.ts b/apps/cli/src/commands/ptx/swap.ts index 72c58f16f2f3..19dfeadf5bed 100644 --- a/apps/cli/src/commands/ptx/swap.ts +++ b/apps/cli/src/commands/ptx/swap.ts @@ -19,7 +19,6 @@ import type { } from "@ledgerhq/live-common/exchange/swap/types"; import { initSwap, getExchangeRates } from "@ledgerhq/live-common/exchange/swap/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import invariant from "invariant"; import { Account, SignedOperation, SubAccount } from "@ledgerhq/types-live"; @@ -89,11 +88,15 @@ const exec = async (opts: SwapJobOpts) => { } console.log("\t:id:\t\t", fromAccount.id); - const formattedAmount = formatCurrencyUnit(getAccountUnit(fromAccount), fromAccount.balance, { - disableRounding: true, - alwaysShowSign: false, - showCode: true, - }); + const formattedAmount = formatCurrencyUnit( + getAccountCurrency(fromAccount).units[0], + fromAccount.balance, + { + disableRounding: true, + alwaysShowSign: false, + showCode: true, + }, + ); console.log("\t:balance:\t", fromAccount.spendableBalance.toString(), ` [ ${formattedAmount} ]`); diff --git a/apps/cli/src/scan.ts b/apps/cli/src/scan.ts index 559d7be3046b..bc37b74e0e3c 100644 --- a/apps/cli/src/scan.ts +++ b/apps/cli/src/scan.ts @@ -19,8 +19,8 @@ import getAppAndVersion from "@ledgerhq/live-common/hw/getAppAndVersion"; import { withDevice } from "@ledgerhq/live-common/hw/deviceAccess"; import { delay } from "@ledgerhq/live-common/promise"; import { jsonFromFile } from "./stream"; -import { shortAddressPreview } from "@ledgerhq/live-common/account/helpers"; import fs from "fs"; + export const deviceOpt = { name: "device", alias: "d", @@ -317,21 +317,13 @@ export function scan(arg: ScanCommonOpts): Observable { }); const account: Account = { type: "Account", - name: - currency.name + - " " + - (derivationMode || "legacy") + - " " + - shortAddressPreview(xpubOrAddress), xpub: xpubOrAddress, seedIdentifier: xpubOrAddress, - starred: true, used: true, swapHistory: [], id, derivationMode, currency, - unit: currency.units[0], index, freshAddress: xpubOrAddress, freshAddressPath, diff --git a/apps/ledger-live-desktop/package.json b/apps/ledger-live-desktop/package.json index 567587dd9cde..a6ca3e63c3e8 100644 --- a/apps/ledger-live-desktop/package.json +++ b/apps/ledger-live-desktop/package.json @@ -69,6 +69,7 @@ "@ledgerhq/live-network": "workspace:^", "@ledgerhq/live-nft": "workspace:^", "@ledgerhq/live-nft-react": "workspace:^", + "@ledgerhq/live-wallet": "workspace:^", "@ledgerhq/logs": "workspace:^", "@ledgerhq/react-ui": "workspace:^", "@ledgerhq/types-cryptoassets": "workspace:^", diff --git a/apps/ledger-live-desktop/src/helpers/accountModel.ts b/apps/ledger-live-desktop/src/helpers/accountModel.ts index 2ee2f25f6d11..f0c4245675b6 100644 --- a/apps/ledger-live-desktop/src/helpers/accountModel.ts +++ b/apps/ledger-live-desktop/src/helpers/accountModel.ts @@ -3,7 +3,8 @@ */ import { createDataModel, DataModel } from "@ledgerhq/live-common/DataModel"; import { fromAccountRaw, toAccountRaw } from "@ledgerhq/live-common/account/index"; -import { Account, AccountRaw, Operation } from "@ledgerhq/types-live"; +import { Account, AccountRaw, Operation, AccountUserData } from "@ledgerhq/types-live"; +import { accountRawToAccountUserData } from "@ledgerhq/live-wallet/store"; /** * @memberof models/account @@ -15,7 +16,7 @@ export const opRetentionStategy = const opRetentionFilter = opRetentionStategy(366, 500); -const accountModel: DataModel = createDataModel({ +const accountModel: DataModel = createDataModel({ migrations: [ // 2018-10-10: change of the account id format to include the derivationMode and seedIdentifier in Account raw => { @@ -78,11 +79,15 @@ const accountModel: DataModel = createDataModel({ // ^- Each time a modification is brought to the model, add here a migration function here ], - decode: fromAccountRaw, - encode: (account: Account): AccountRaw => - toAccountRaw({ - ...account, - operations: account.operations.filter(opRetentionFilter), - }), + decode: (raw: AccountRaw) => [fromAccountRaw(raw), accountRawToAccountUserData(raw)], + encode: ([account, userData]: [Account, AccountUserData]): AccountRaw => + toAccountRaw( + { + ...account, + operations: account.operations.filter(opRetentionFilter), + }, + userData, + ), }); + export default accountModel; diff --git a/apps/ledger-live-desktop/src/renderer/actions/accounts.ts b/apps/ledger-live-desktop/src/renderer/actions/accounts.ts index 92d8d90fb12e..1db7ea27f1f8 100644 --- a/apps/ledger-live-desktop/src/renderer/actions/accounts.ts +++ b/apps/ledger-live-desktop/src/renderer/actions/accounts.ts @@ -1,27 +1,24 @@ import { Dispatch } from "redux"; -import { Account, SubAccount } from "@ledgerhq/types-live"; -import { AccountComparator } from "@ledgerhq/live-common/account/index"; +import { Account, AccountUserData } from "@ledgerhq/types-live"; +import { AccountComparator } from "@ledgerhq/live-wallet/ordering"; import { getKey } from "~/renderer/storage"; -export const replaceAccounts = (payload: Account[]) => ({ - type: "DB:REPLACE_ACCOUNTS", - payload, -}); - -export const addAccount = (payload: Account) => ({ - type: "DB:ADD_ACCOUNT", - payload, -}); - export const removeAccount = (payload: Account) => ({ type: "DB:REMOVE_ACCOUNT", payload, }); -export const setAccounts = (payload: Account[]) => ({ - type: "SET_ACCOUNTS", - payload, -}); +export const initAccounts = (data: [Account, AccountUserData][]) => { + const accounts = data.map(data => data[0]); + const accountsUserData = data.map(data => data[1]); + return { + type: "INIT_ACCOUNTS", + payload: { + accounts, + accountsUserData, + }, + }; +}; export const reorderAccounts = (comparator: AccountComparator) => (dispatch: Dispatch) => dispatch({ @@ -30,11 +27,8 @@ export const reorderAccounts = (comparator: AccountComparator) => (dispatch: Dis }); export const fetchAccounts = () => async (dispatch: Dispatch) => { - const accounts = await getKey("app", "accounts", []); - return dispatch({ - type: "SET_ACCOUNTS", - payload: accounts, - }); + const data: [Account, AccountUserData][] = await getKey("app", "accounts", []); + return dispatch(initAccounts(data)); }; type UpdateAccountAction = { @@ -61,24 +55,6 @@ export const updateAccount: UpdateAccount = payload => ({ }, }); -export const toggleStarAction = (id: string, parentId?: string): UpdateAccountAction => { - return { - type: "DB:UPDATE_ACCOUNT", - payload: { - updater: (account: Account) => { - if (parentId && account.subAccounts) { - const subAccounts: SubAccount[] = account.subAccounts.map(sa => - sa.id === id ? { ...sa, starred: !sa.starred } : sa, - ); - return { ...account, subAccounts }; - } - return { ...account, starred: !account.starred }; - }, - accountId: parentId || id, - }, - }; -}; - export const cleanAccountsCache = () => ({ type: "DB:CLEAN_ACCOUNTS_CACHE" }); export const cleanFullNodeDisconnect = () => ({ type: "DB:CLEAN_FULLNODE_DISCONNECT", diff --git a/apps/ledger-live-desktop/src/renderer/actions/general.ts b/apps/ledger-live-desktop/src/renderer/actions/general.ts index 2f86a5d51d57..3046c158b2a3 100644 --- a/apps/ledger-live-desktop/src/renderer/actions/general.ts +++ b/apps/ledger-live-desktop/src/renderer/actions/general.ts @@ -4,11 +4,7 @@ import { createSelector } from "reselect"; // TODO make a generic way to implement this for each family // eslint-disable-next-line no-restricted-imports import { isAccountDelegating } from "@ledgerhq/live-common/families/tezos/bakers"; -import { - flattenSortAccounts, - sortAccountsComparatorFromOrder, - FlattenAccountsOptions, -} from "@ledgerhq/live-common/account/index"; +import { flattenSortAccounts } from "@ledgerhq/live-wallet/ordering"; import { reorderAccounts } from "~/renderer/actions/accounts"; import { useCalculateCountervalueCallback as useCalculateCountervalueCallbackCommon, @@ -27,6 +23,9 @@ import { resolveTrackingPairs } from "@ledgerhq/live-countervalues/logic"; import { useExtraSessionTrackingPair } from "./deprecated/ondemand-countervalues"; import { useMarketPerformanceTrackingPairs } from "./marketperformance"; import { LiveConfig } from "@ledgerhq/live-config/LiveConfig"; +import { walletSelector } from "../reducers/wallet"; +import { sortAccountsComparatorFromOrder } from "@ledgerhq/live-wallet/ordering"; +import { FlattenAccountsOptions } from "@ledgerhq/live-common/account/index"; // provide redux states via custom hook wrapper @@ -48,9 +47,10 @@ export function useCalculateCountervalueCallback() { }); } export function useSortAccountsComparator() { - const accounts = useSelector(getOrderAccounts); + const orderAccounts = useSelector(getOrderAccounts); const calc = useCalculateCountervalueCallback(); - return sortAccountsComparatorFromOrder(accounts, calc); + const walletState = useSelector(walletSelector); + return sortAccountsComparatorFromOrder(orderAccounts, walletState, calc); } export function useFlattenSortAccounts(options?: FlattenAccountsOptions) { const accounts = useSelector(accountsSelector); diff --git a/apps/ledger-live-desktop/src/renderer/actions/settings.ts b/apps/ledger-live-desktop/src/renderer/actions/settings.ts index 0904cf3f9f2f..22b51f509062 100644 --- a/apps/ledger-live-desktop/src/renderer/actions/settings.ts +++ b/apps/ledger-live-desktop/src/renderer/actions/settings.ts @@ -20,6 +20,7 @@ import { SettingsState, VaultSigner, SupportedCountervaluesData, + CurrencySettings, } from "~/renderer/reducers/settings"; import { useRefreshAccountsOrdering } from "~/renderer/actions/general"; import { Language, Locale } from "~/config/languages"; @@ -375,7 +376,13 @@ export const addStarredMarketCoins = (payload: string) => ({ type: "ADD_STARRED_MARKET_COINS", payload, }); + export const removeStarredMarketCoins = (payload: string) => ({ type: "REMOVE_STARRED_MARKET_COINS", payload, }); + +export const setCurrencySettings = (payload: { key: string; value: CurrencySettings }) => ({ + type: "SET_CURRENCY_SETTINGS", + payload, +}); diff --git a/apps/ledger-live-desktop/src/renderer/actions/wallet.ts b/apps/ledger-live-desktop/src/renderer/actions/wallet.ts new file mode 100644 index 000000000000..806628353d7b --- /dev/null +++ b/apps/ledger-live-desktop/src/renderer/actions/wallet.ts @@ -0,0 +1,7 @@ +import { setAccountStarred } from "@ledgerhq/live-wallet/store"; + +export const toggleStarAction = (id: string, value: boolean) => { + const action = setAccountStarred(id, value); + action.type = "DB:" + action.type; + return action; +}; diff --git a/apps/ledger-live-desktop/src/renderer/analytics/segment.ts b/apps/ledger-live-desktop/src/renderer/analytics/segment.ts index 6dde5c765128..078dbc7d573a 100644 --- a/apps/ledger-live-desktop/src/renderer/analytics/segment.ts +++ b/apps/ledger-live-desktop/src/renderer/analytics/segment.ts @@ -19,7 +19,6 @@ import { } from "~/renderer/reducers/settings"; import { State } from "~/renderer/reducers"; import { AccountLike, Feature, FeatureId, Features, idsToLanguage } from "@ledgerhq/types-live"; -import { getAccountName } from "@ledgerhq/live-common/account/index"; import { accountsSelector } from "../reducers/accounts"; import { GENESIS_PASS_COLLECTION_CONTRACT, @@ -30,6 +29,7 @@ import createStore from "../createStore"; import { currentRouteNameRef, previousRouteNameRef } from "./screenRefs"; import { useCallback, useContext } from "react"; import { analyticsDrawerContext } from "../drawers/Provider"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; invariant(typeof window !== "undefined", "analytics/segment must be called on renderer thread"); // eslint-disable-next-line @typescript-eslint/no-var-requires const os = require("os"); @@ -232,13 +232,16 @@ function sendTrack(event: string, properties: object | undefined | null) { const confidentialityFilter = (properties?: Record | null) => { const { account, parentAccount } = properties || {}; const filterAccount = account - ? { account: typeof account === "object" ? getAccountName(account as AccountLike) : account } + ? { + account: + typeof account === "object" ? getDefaultAccountName(account as AccountLike) : account, + } : {}; const filterParentAccount = parentAccount ? { parentAccount: typeof parentAccount === "object" - ? getAccountName(parentAccount as AccountLike) + ? getDefaultAccountName(parentAccount as AccountLike) : parentAccount, } : {}; diff --git a/apps/ledger-live-desktop/src/renderer/components/AccountsList/AccountRow.tsx b/apps/ledger-live-desktop/src/renderer/components/AccountsList/AccountRow.tsx index ad1e652997d7..706565331c23 100644 --- a/apps/ledger-live-desktop/src/renderer/components/AccountsList/AccountRow.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/AccountsList/AccountRow.tsx @@ -1,4 +1,4 @@ -import React, { PureComponent } from "react"; +import React from "react"; import styled from "styled-components"; import { Account } from "@ledgerhq/types-live"; import { getEnv } from "@ledgerhq/live-env"; @@ -9,6 +9,8 @@ import CryptoCurrencyIconWithCount from "~/renderer/components/CryptoCurrencyIco import FormattedVal from "~/renderer/components/FormattedVal"; import Input from "~/renderer/components/Input"; import AccountTagDerivationMode from "../AccountTagDerivationMode"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; const InputWrapper = styled.div` margin-left: 4px; width: 100%; @@ -24,131 +26,129 @@ type Props = { onEditName?: (b: Account, a: string) => void; hideAmount?: boolean; }; -export default class AccountRow extends PureComponent { - handlePreventSubmit = (e: React.SyntheticEvent) => { + +const overflowStyles: React.CSSProperties = { + textOverflow: "ellipsis", + overflow: "hidden", + whiteSpace: "nowrap", +}; + +function AccountRow(props: Props) { + const { + account, + isChecked, + onEditName, + onToggleAccount, + accountName, + isDisabled, + isReadonly, + autoFocusInput, + hideAmount, + } = props; + + const unit = useAccountUnit(account); + + const handlePreventSubmit = (e: React.SyntheticEvent) => { e.preventDefault(); e.stopPropagation(); }; - handleKeyPress = (e: React.SyntheticEvent) => { + const handleKeyPress = (e: React.SyntheticEvent) => { // this fixes a bug with the event propagating to the Tabbable e.stopPropagation(); }; - onToggleAccount = () => { - const { onToggleAccount, account, isChecked } = this.props; - if (onToggleAccount) onToggleAccount(account, !isChecked); - }; + const onClickToggleAccount = () => onToggleAccount?.(account, !isChecked); - handleChangeName = (name: string) => { - const { onEditName, account } = this.props; - if (onEditName) onEditName(account, name); - }; + const handleChangeName = (name: string) => onEditName?.(account, name); - onClickInput = (e: React.SyntheticEvent) => { + const onClickInput = (e: React.SyntheticEvent) => { e.preventDefault(); e.stopPropagation(); }; - onFocus = (e: React.FocusEvent) => { + const onFocus = (e: React.FocusEvent) => { e.target.select(); }; - onBlur = (e: React.FocusEvent) => { - const { onEditName, account } = this.props; + const onBlur = (e: React.FocusEvent) => { const { value } = e.target; if (!value && onEditName) { // don't leave an empty input on blur - onEditName(account, account.name); + onEditName(account, getDefaultAccountName(account)); } }; - _input = null; - overflowStyles: React.CSSProperties = { - textOverflow: "ellipsis", - overflow: "hidden", - whiteSpace: "nowrap", - }; - - render() { - const { - account, - isChecked, - onEditName, - accountName, - isDisabled, - isReadonly, - autoFocusInput, - hideAmount, - } = this.props; - const tokenCount = (account.subAccounts && account.subAccounts.length) || 0; - const tag = ; - return ( - ; + return ( + + + - - - {onEditName ? ( - - - - ) : ( -
- {accountName} - {tag} -
- )} -
- {!hideAmount ? ( - + + + ) : ( +
- ) : null} - {!isDisabled && !isReadonly && } - - ); - } + > + {accountName} + {tag} +
+ )} +
+ {!hideAmount ? ( + + ) : null} + {!isDisabled && !isReadonly && } +
+ ); } + +export default React.memo(AccountRow); + const AccountRowContainer = styled(Tabbable).attrs(() => ({ horizontal: true, alignItems: "center", diff --git a/apps/ledger-live-desktop/src/renderer/components/AccountsList/index.tsx b/apps/ledger-live-desktop/src/renderer/components/AccountsList/index.tsx index 9f7c325e92e7..43735871a521 100644 --- a/apps/ledger-live-desktop/src/renderer/components/AccountsList/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/AccountsList/index.tsx @@ -1,6 +1,5 @@ -import React, { Component } from "react"; -import { TFunction } from "i18next"; -import { withTranslation } from "react-i18next"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; import { Account } from "@ledgerhq/types-live"; import Box from "~/renderer/components/Box"; import LinkWithExternalIcon from "~/renderer/components/LinkWithExternalIcon"; @@ -8,11 +7,14 @@ import FakeLink from "~/renderer/components/FakeLink"; import { SpoilerIcon } from "~/renderer/components/Spoiler"; import { openURL } from "~/renderer/linking"; import AccountRow from "./AccountRow"; +import { useSelector } from "react-redux"; +import { walletSelector } from "~/renderer/reducers/wallet"; +import { accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; export type AccountListProps = { accounts: Account[]; checkedIds?: string[]; - editedNames: { + editedNames?: { [accountId: string]: string; }; setAccountName?: (b: Account, a: string) => void; @@ -28,136 +30,114 @@ export type AccountListProps = { id: string; url: string; }; - t: TFunction; ToggleAllComponent?: React.ReactNode; }; -class AccountsList extends Component< - AccountListProps, - { - collapsed: boolean; - } -> { - static defaultProps = { - editedNames: {}, +function AccountsList({ + accounts, + checkedIds, + editedNames = {}, + setAccountName, + onToggleAccount, + onSelectAll, + onUnselectAll, + title, + emptyText, + autoFocusFirstInput, + collapsible, + hideAmount, + supportLink, + ToggleAllComponent, +}: AccountListProps) { + const { t } = useTranslation(); + const [collapsed, setCollapsed] = useState(!!collapsible); + const toggleCollapse = () => { + setCollapsed(!collapsed); }; - - state = { - collapsed: !!this.props.collapsible, - }; - - toggleCollapse = () => { - this.setState(({ collapsed }) => ({ - collapsed: !collapsed, - })); - }; - - onSelectAll = () => { - const { accounts, onSelectAll } = this.props; + const onSelectAllCb = () => { if (onSelectAll) onSelectAll(accounts); }; - - onUnselectAll = () => { - const { accounts, onUnselectAll } = this.props; + const onUnselectAllCb = () => { if (onUnselectAll) onUnselectAll(accounts); }; - - render() { - const { - accounts, - checkedIds, - onToggleAccount, - editedNames, - setAccountName, - onSelectAll, - onUnselectAll, - title, - emptyText, - autoFocusFirstInput, - collapsible, - hideAmount, - supportLink, - t, - ToggleAllComponent, - } = this.props; - const { collapsed } = this.state; - const withToggleAll = !!onSelectAll && !!onUnselectAll && accounts.length > 1; - const isAllSelected = - !checkedIds || accounts.every(acc => !!checkedIds.find(id => acc.id === id)); - return ( - - {(title || withToggleAll) && ( - - {title && ( - 1; + const isAllSelected = + !checkedIds || accounts.every(acc => !!checkedIds.find(id => acc.id === id)); + return ( + + {(title || withToggleAll) && ( + + {title && ( + + {collapsible ? : null} + {title} + + )} + {supportLink ? ( + openURL(supportLink.url)} + label={t("addAccounts.supportLinks." + supportLink.id)} + /> + ) : null} + {ToggleAllComponent || + (withToggleAll && ( + - {collapsible ? : null} - {title} - - )} - {supportLink ? ( - openURL(supportLink.url)} - label={t("addAccounts.supportLinks." + supportLink.id)} - /> - ) : null} - {ToggleAllComponent || - (withToggleAll && ( - - {isAllSelected - ? t("addAccounts.unselectAll", { - count: accounts.length, - }) - : t("addAccounts.selectAll", { - count: accounts.length, - })} - - ))} - - )} - {collapsed ? null : accounts.length ? ( - - {accounts.map((account, i) => ( - id === account.id) !== undefined} - onToggleAccount={onToggleAccount} - onEditName={setAccountName} - hideAmount={hideAmount} - accountName={ - typeof editedNames[account.id] === "string" - ? editedNames[account.id] - : account.name - } - /> + {isAllSelected + ? t("addAccounts.unselectAll", { + count: accounts.length, + }) + : t("addAccounts.selectAll", { + count: accounts.length, + })} + ))} - - ) : emptyText ? ( - - {emptyText} - - ) : null} - - ); - } + + )} + {collapsed ? null : accounts.length ? ( + + {accounts.map((account, i) => ( + id === account.id) !== undefined} + onToggleAccount={onToggleAccount} + onEditName={setAccountName} + hideAmount={hideAmount} + accountName={ + typeof editedNames[account.id] === "string" + ? editedNames[account.id] + : accountNameWithDefaultSelector(walletState, account) + } + /> + ))} + + ) : emptyText ? ( + + {emptyText} + + ) : null} + + ); } -export default withTranslation()(AccountsList); + +export default AccountsList; diff --git a/apps/ledger-live-desktop/src/renderer/components/Breadcrumb/AccountCrumb.tsx b/apps/ledger-live-desktop/src/renderer/components/Breadcrumb/AccountCrumb.tsx index 684835bf35ee..cd1ecdc0562c 100644 --- a/apps/ledger-live-desktop/src/renderer/components/Breadcrumb/AccountCrumb.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/Breadcrumb/AccountCrumb.tsx @@ -7,7 +7,6 @@ import { listSubAccounts, getAccountCurrency, findSubAccountById, - getAccountName, } from "@ledgerhq/live-common/account/index"; import { Account, AccountLike, SubAccount } from "@ledgerhq/types-live"; import { accountsSelector } from "~/renderer/reducers/accounts"; @@ -20,6 +19,8 @@ import Ellipsis from "~/renderer/components/Ellipsis"; import CryptoCurrencyIcon from "~/renderer/components/CryptoCurrencyIcon"; import { Separator, Item, TextLink, AngleDown, Check } from "./common"; import { setTrackingSource } from "~/renderer/analytics/TrackPage"; +import { walletSelector } from "~/renderer/reducers/wallet"; +import { accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; type ItemShape = { key: string; @@ -59,22 +60,28 @@ const AccountCrumb = () => { [parentId, account, accounts], ); - const renderItem = useCallback(({ item, isActive }: { item: ItemShape; isActive: boolean }) => { - const currency = getAccountCurrency(item.account); - return ( - - - - {getAccountName(item.account)} - - {isActive && ( - - - - )} - - ); - }, []); + const walletState = useSelector(walletSelector); + + const renderItem = useCallback( + ({ item, isActive }: { item: ItemShape; isActive: boolean }) => { + const currency = getAccountCurrency(item.account); + const name = accountNameWithDefaultSelector(walletState, item.account); + return ( + + + + {name} + + {isActive && ( + + + + )} + + ); + }, + [walletState], + ); const onAccountSelected = useCallback( (item: ItemShape) => { @@ -120,10 +127,10 @@ const AccountCrumb = () => { (items: (Account | SubAccount)[]) => items.map(item => ({ key: item.id, - label: getAccountName(item), + label: accountNameWithDefaultSelector(walletState, item), account: item, })), - [], + [walletState], ); const processedItems = useMemo( diff --git a/apps/ledger-live-desktop/src/renderer/components/ContextMenu/AccountContextMenu.tsx b/apps/ledger-live-desktop/src/renderer/components/ContextMenu/AccountContextMenu.tsx index 40ccc2c65a60..42f57cfd4190 100644 --- a/apps/ledger-live-desktop/src/renderer/components/ContextMenu/AccountContextMenu.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/ContextMenu/AccountContextMenu.tsx @@ -11,13 +11,15 @@ import IconBuy from "~/renderer/icons/Exchange"; import IconSwap from "~/renderer/icons/Swap"; import IconAccountSettings from "~/renderer/icons/AccountSettings"; import ContextMenuItem from "./ContextMenuItem"; -import { toggleStarAction } from "~/renderer/actions/accounts"; +import { toggleStarAction } from "~/renderer/actions/wallet"; import { useRefreshAccountsOrdering } from "~/renderer/actions/general"; import { swapSelectableCurrenciesSelector } from "~/renderer/reducers/settings"; import { isCurrencySupported } from "~/renderer/screens/exchange/config"; import { setTrackingSource } from "~/renderer/analytics/TrackPage"; import { ContextMenuItemType } from "./ContextMenuWrapper"; import { IconsLegacy } from "@ledgerhq/react-ui"; +import { accountStarredSelector } from "~/renderer/reducers/wallet"; +import { State } from "~/renderer/reducers"; type Props = { account: AccountLike; @@ -26,6 +28,7 @@ type Props = { children: React.ReactNode; withStar?: boolean; }; + export default function AccountContextMenu({ leftClick, children, @@ -38,6 +41,10 @@ export default function AccountContextMenu({ const refreshAccountsOrdering = useRefreshAccountsOrdering(); const swapSelectableCurrencies = useSelector(swapSelectableCurrenciesSelector); + const isStarred = useSelector((state: State) => + accountStarredSelector(state, { accountId: account.id }), + ); + const menuItems = useMemo(() => { const currency = getAccountCurrency(account); const mainAccount = getMainAccount(account, parentAccount); @@ -124,9 +131,7 @@ export default function AccountContextMenu({ label: "accounts.contextMenu.star", Icon: IconStar, callback: () => { - dispatch( - toggleStarAction(account.id, account.type !== "Account" ? account.parentId : undefined), - ); + dispatch(toggleStarAction(account.id, !isStarred)); refreshAccountsOrdering(); }, }); @@ -165,6 +170,7 @@ export default function AccountContextMenu({ dispatch, history, refreshAccountsOrdering, + isStarred, ]); const currency = getAccountCurrency(account); return ( diff --git a/apps/ledger-live-desktop/src/renderer/components/DeviceAction/index.tsx b/apps/ledger-live-desktop/src/renderer/components/DeviceAction/index.tsx index fcec5fb1e7c1..9abee9dd0a99 100644 --- a/apps/ledger-live-desktop/src/renderer/components/DeviceAction/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/DeviceAction/index.tsx @@ -17,7 +17,10 @@ import { setLastSeenDeviceInfo, addNewDeviceModel, } from "~/renderer/actions/settings"; -import { preferredDeviceModelSelector } from "~/renderer/reducers/settings"; +import { + storeSelector as settingsSelector, + preferredDeviceModelSelector, +} from "~/renderer/reducers/settings"; import { DeviceModelId } from "@ledgerhq/devices"; import AutoRepair from "~/renderer/components/AutoRepair"; import TransactionConfirm from "~/renderer/components/TransactionConfirm"; @@ -75,6 +78,7 @@ import { LedgerErrorConstructor } from "@ledgerhq/errors/lib/helpers"; import { TokenCurrency } from "@ledgerhq/types-cryptoassets"; import { isDeviceNotOnboardedError } from "./utils"; import { useKeepScreenAwake } from "~/renderer/hooks/useKeepScreenAwake"; +import { walletSelector } from "~/renderer/reducers/wallet"; type LedgerError = InstanceType>; @@ -227,6 +231,8 @@ export const DeviceActionDefaultRendering = ({ const dispatch = useDispatch(); const preferredDeviceModel = useSelector(preferredDeviceModelSelector); const swapDefaultTrack = useGetSwapTrackingProperties(); + const stateSettings = useSelector(settingsSelector); + const walletState = useSelector(walletSelector); const type = useTheme().colors.palette.type; @@ -363,6 +369,8 @@ export const DeviceActionDefaultRendering = ({ swapDefaultTrack, amountExpectedTo: amountExpectedTo.toString() ?? undefined, estimatedFees: estimatedFees?.toString() ?? undefined, + stateSettings, + walletState, }); } @@ -395,6 +403,8 @@ export const DeviceActionDefaultRendering = ({ amountExpectedTo: amountExpectedTo ?? undefined, estimatedFees: estimatedFees ?? undefined, swapDefaultTrack, + stateSettings, + walletState, }); } @@ -413,11 +423,7 @@ export const DeviceActionDefaultRendering = ({ } if (inWrongDeviceForAccount) { - return renderInWrongAppForAccount({ - t, - onRetry, - accountName: inWrongDeviceForAccount.accountName, - }); + return renderInWrongAppForAccount({ t, onRetry }); } if (unresponsive || error instanceof TransportPendingOperation) { diff --git a/apps/ledger-live-desktop/src/renderer/components/DeviceAction/rendering.tsx b/apps/ledger-live-desktop/src/renderer/components/DeviceAction/rendering.tsx index c5bd0bed83ce..804f8ba5f98d 100644 --- a/apps/ledger-live-desktop/src/renderer/components/DeviceAction/rendering.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/DeviceAction/rendering.tsx @@ -24,12 +24,7 @@ import { } from "@ledgerhq/live-common/errors"; import { DeviceModelId, getDeviceModel } from "@ledgerhq/devices"; import { Device } from "@ledgerhq/live-common/hw/actions/types"; -import { - getAccountUnit, - getMainAccount, - getAccountName, - getAccountCurrency, -} from "@ledgerhq/live-common/account/index"; +import { getMainAccount, getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { closeAllModal } from "~/renderer/actions/modals"; import Animation from "~/renderer/animations"; import Button from "~/renderer/components/Button"; @@ -72,6 +67,8 @@ import { ErrorBody } from "../ErrorBody"; import LinkWithExternalIcon from "../LinkWithExternalIcon"; import { closePlatformAppDrawer } from "~/renderer/actions/UI"; import { CompleteExchangeError } from "@ledgerhq/live-common/exchange/error"; +import { SettingsState, currencySettingsLocaleSelector } from "~/renderer/reducers/settings"; +import { WalletState, accountNameSelector } from "@ledgerhq/live-wallet/store"; export const AnimationWrapper = styled.div` width: 600px; @@ -828,15 +825,13 @@ export const renderError = ({ export const renderInWrongAppForAccount = ({ t, onRetry, - accountName, }: { t: TFunction; onRetry?: (() => void) | null | undefined; - accountName: string; }) => renderError({ t, - error: new WrongDeviceForAccount("", { accountName }), + error: new WrongDeviceForAccount(""), withExportLogs: true, onRetry, }); @@ -950,6 +945,8 @@ export const renderSwapDeviceConfirmation = ({ amountExpectedTo, estimatedFees, swapDefaultTrack, + stateSettings, + walletState, }: { modelId: DeviceModelId; type: Theme["theme"]; @@ -959,18 +956,32 @@ export const renderSwapDeviceConfirmation = ({ amountExpectedTo?: string; estimatedFees?: string; swapDefaultTrack: Record; + stateSettings: SettingsState; + walletState: WalletState; }) => { - const [sourceAccountName, sourceAccountCurrency] = [ - getAccountName(exchange.fromAccount), - getAccountCurrency(exchange.fromAccount), - ]; - const [targetAccountName, targetAccountCurrency] = [ - getAccountName(exchange.toAccount), - getAccountCurrency(exchange.toAccount), - ]; + const sourceAccountCurrency = getAccountCurrency(exchange.fromAccount); + const targetAccountCurrency = getAccountCurrency(exchange.toAccount); + const sourceAccountName = accountNameSelector(walletState, { + accountId: exchange.fromAccount.id, + }); + const targetAccountName = accountNameSelector(walletState, { + accountId: exchange.toAccount.id, + }); + const providerName = getProviderName(exchangeRate.provider); const noticeType = getNoticeType(exchangeRate.provider); const alertProperties = noticeType.learnMore ? { learnMoreUrl: urls.swap.learnMore } : {}; + + const unitFromExchange = currencySettingsLocaleSelector( + stateSettings, + sourceAccountCurrency, + ).unit; + const unitToExchange = currencySettingsLocaleSelector(stateSettings, targetAccountCurrency).unit; + const unitMainAccount = currencySettingsLocaleSelector( + stateSettings, + getMainAccount(exchange.fromAccount, exchange.fromParentAccount).currency, + ).unit; + return ( <> @@ -995,7 +1006,7 @@ export const renderSwapDeviceConfirmation = ({ { amountSent: ( walletSelector(state), accounts: (state, props) => props.accounts || activeAccountsSelector(state), settings: exportSettingsSelector, device: state => lastSeenDeviceSelector(state) || null, @@ -37,6 +40,7 @@ type OwnProps = { accounts?: Account[]; }; type Props = OwnProps & { + walletState: WalletState; accounts: Account[]; settings: Settings; devices: DeviceModelId[]; @@ -56,8 +60,9 @@ class QRCodeExporter extends PureComponent< constructor(props: Props) { super(props); - const { accounts, settings, device, devices } = props; + const { accounts, settings, device, devices, walletState } = props; const data = encode({ + walletState, accounts, settings, modelId: device?.modelId, diff --git a/apps/ledger-live-desktop/src/renderer/components/OperationsList/Operation.tsx b/apps/ledger-live-desktop/src/renderer/components/OperationsList/Operation.tsx index 25d6cc57feed..8c955b1cb6a2 100644 --- a/apps/ledger-live-desktop/src/renderer/components/OperationsList/Operation.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/OperationsList/Operation.tsx @@ -1,17 +1,11 @@ -import React, { PureComponent } from "react"; -import { connect } from "react-redux"; +import React from "react"; +import { useSelector } from "react-redux"; import styled from "styled-components"; import { rgba } from "~/renderer/styles/helpers"; import Box from "~/renderer/components/Box"; -import { createStructuredSelector } from "reselect"; import { TFunction } from "i18next"; import { AccountLike, Account, Operation } from "@ledgerhq/types-live"; -import { - getAccountCurrency, - getAccountName, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import ConfirmationCell from "./ConfirmationCell"; import DateCell from "./DateCell"; import AccountCell from "./AccountCell"; @@ -19,12 +13,10 @@ import AddressCell from "./AddressCell"; import AmountCell from "./AmountCell"; import { confirmationsNbForCurrencySelector } from "~/renderer/reducers/settings"; import { isConfirmedOperation } from "@ledgerhq/live-common/operation"; -const mapStateToProps = createStructuredSelector({ - confirmationsNb: (state, { account, parentAccount }) => - confirmationsNbForCurrencySelector(state, { - currency: getMainAccount(account, parentAccount).currency, - }), -}); +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; +import { State } from "~/renderer/reducers"; +import { useAccountName } from "../../reducers/wallet"; + const OperationRow = styled(Box).attrs(() => ({ horizontal: true, alignItems: "center", @@ -49,69 +41,58 @@ type OwnProps = { text?: string; editable?: boolean; }; -type Props = { - confirmationsNb: number; -} & OwnProps; -class OperationComponent extends PureComponent { - static defaultProps = { - withAccount: false, - withAddress: true, - }; +type Props = OwnProps; + +function OperationComponent({ + operation, + account, + parentAccount, + onOperationClick, + t, + text, + editable, + withAddress = true, + withAccount = false, +}: Props) { + const mainAccount = getMainAccount(account, parentAccount); + const confirmationsNb = useSelector((state: State) => + confirmationsNbForCurrencySelector(state, mainAccount), + ); + const unit = useAccountUnit(mainAccount); + const accountName = useAccountName(account); - onOperationClick = () => { - const { account, parentAccount, onOperationClick, operation } = this.props; + const onClickOnOperation = () => { onOperationClick(operation, account, parentAccount); }; - render() { - const { - account, - parentAccount, - t, - operation, - withAccount, - text, - withAddress, - confirmationsNb, - editable, - } = this.props; - const isOptimistic = operation.blockHeight === null; - const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); - const mainAccount = getMainAccount(account, parentAccount); - const isConfirmed = isConfirmedOperation(operation, mainAccount, confirmationsNb); - return ( - - - - {withAccount && } - {withAddress ? : } - - - ); - } + const isOptimistic = operation.blockHeight === null; + const currency = getAccountCurrency(account); + + const isConfirmed = isConfirmedOperation(operation, mainAccount, confirmationsNb); + return ( + + + + {withAccount && } + {withAddress ? : } + + + ); } -const ConnectedOperationComponent: React.ComponentType = - connect(mapStateToProps)(OperationComponent); -export default ConnectedOperationComponent; +export default React.memo(OperationComponent); diff --git a/apps/ledger-live-desktop/src/renderer/components/RequestAmount.tsx b/apps/ledger-live-desktop/src/renderer/components/RequestAmount.tsx index 2a82835adfc3..b6e3f3388675 100644 --- a/apps/ledger-live-desktop/src/renderer/components/RequestAmount.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/RequestAmount.tsx @@ -9,6 +9,7 @@ import InputCurrency from "~/renderer/components/InputCurrency"; import IconTransfer from "~/renderer/icons/Transfer"; import { counterValueCurrencySelector } from "~/renderer/reducers/settings"; import TranslatedError from "./TranslatedError"; +import { useAccountUnit } from "../hooks/useAccountUnit"; const ErrorContainer = styled(Box)<{ hasError: unknown; @@ -71,7 +72,8 @@ export default function RequestAmount({ validTransactionWarning, }: Props) { const fiatCurrency = useSelector(counterValueCurrencySelector); - const { cryptoUnit, fiatAmount, fiatUnit, calculateCryptoAmount } = useSendAmount({ + const cryptoUnit = useAccountUnit(account); + const { fiatAmount, fiatUnit, calculateCryptoAmount } = useSendAmount({ account, fiatCurrency, cryptoAmount, diff --git a/apps/ledger-live-desktop/src/renderer/components/SelectAccount.tsx b/apps/ledger-live-desktop/src/renderer/components/SelectAccount.tsx index ff6976cc5f15..4f7b85e3d733 100644 --- a/apps/ledger-live-desktop/src/renderer/components/SelectAccount.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/SelectAccount.tsx @@ -1,8 +1,6 @@ import { flattenAccounts, getAccountCurrency, - getAccountUnit, - getAccountName, listSubAccounts, } from "@ledgerhq/live-common/account/index"; import { TFunction } from "i18next"; @@ -10,9 +8,8 @@ import { Trans, withTranslation } from "react-i18next"; import { AccountLike, Account } from "@ledgerhq/types-live"; import styled from "styled-components"; import React, { useCallback, useState, useMemo } from "react"; -import { connect, useDispatch } from "react-redux"; +import { connect, useDispatch, useSelector } from "react-redux"; import { createFilter, components, MenuListComponentProps } from "react-select"; -import { Option as ReactSelectOption } from "react-select/src/filters"; import { createStructuredSelector } from "reselect"; import { shallowAccountsSelector } from "~/renderer/reducers/accounts"; import Box from "~/renderer/components/Box"; @@ -25,6 +22,9 @@ import Button from "~/renderer/components/Button"; import Plus from "~/renderer/icons/Plus"; import Text from "./Text"; import { openModal } from "../actions/modals"; +import { useAccountUnit } from "../hooks/useAccountUnit"; +import { WalletState, accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; +import { useAccountName, walletSelector } from "../reducers/wallet"; const mapStateToProps = createStructuredSelector({ accounts: shallowAccountsSelector, @@ -48,24 +48,40 @@ const tokenTick = ( export type Option = { matched?: boolean; account?: AccountLike; + accountName?: string; }; + const getOptionValue = (option: Option): string => (option.account && option.account.id) || ""; + +type CustomOption = { + label: string; + value: string; + data: { + account: AccountLike; + accountName: string; + }; +}; + const defaultFilter = createFilter({ - stringify: ({ data: account }) => { + stringify: ({ data: { account, accountName } }: CustomOption) => { const currency = getAccountCurrency(account); - const name = getAccountName(account); - return `${currency.ticker}|${currency.name}|${name}`; + return `${currency.ticker}|${currency.name}|${accountName}`; }, }); + const filterOption = - (o: { withSubAccounts?: boolean; enforceHideEmptySubAccounts?: boolean }) => - (candidate: ReactSelectOption, input: string) => { + (o: { + withSubAccounts?: boolean; + enforceHideEmptySubAccounts?: boolean; + walletState: WalletState; + }) => + (candidate: CustomOption, input: string) => { const selfMatches = defaultFilter(candidate, input); if (selfMatches) return [selfMatches, true]; - if (candidate.data.type === "Account" && o.withSubAccounts) { + if (candidate.data.account.type === "Account" && o.withSubAccounts) { const subAccounts = o.enforceHideEmptySubAccounts - ? listSubAccounts(candidate.data) - : candidate.data.subAccounts; + ? listSubAccounts(candidate.data.account) + : candidate.data.account.subAccounts; if (subAccounts) { for (let i = 0; i < subAccounts.length; i++) { const ta = subAccounts[i]; @@ -74,7 +90,10 @@ const filterOption = { label: ta.id, // might cause UI regression :dogkek: value: ta.id, - data: ta, + data: { + account: ta, + accountName: accountNameWithDefaultSelector(o.walletState, ta), + }, }, input, ) @@ -104,8 +123,8 @@ export const AccountOption = React.memo(function AccountOpti singleLineLayout = true, }: AccountOptionProps) { const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); - const name = getAccountName(account); + const unit = useAccountUnit(account); + const name = useAccountName(account); const nested = "TokenAccount" === account.type; const balance = account.spendableBalance || account.balance; const textContents = singleLineLayout ? ( @@ -242,6 +261,8 @@ export const RawSelectAccount = ({ }: Props & { t: TFunction; }) => { + const walletState = useSelector(walletSelector); + const [searchInputValue, setSearchInputValue] = useState(""); const filtered: Account[] = filter ? accounts.filter(filter) : accounts; const all = withSubAccounts @@ -272,14 +293,19 @@ export const RawSelectAccount = ({ const manualFilter = useCallback( () => all.reduce((result, option) => { + const accountName = accountNameWithDefaultSelector(walletState, option); const [display, match] = filterOption({ withSubAccounts, enforceHideEmptySubAccounts, + walletState, })( { - data: option, value: option.id, label: option.id, + data: { + accountName, + account: option, + }, }, searchInputValue, ); @@ -287,11 +313,12 @@ export const RawSelectAccount = ({ result.push({ matched: match && !isDisabledOption(option as { disabled?: boolean }), account: option, + accountName, }); } return result; }, [] as Option[]), - [searchInputValue, all, withSubAccounts, enforceHideEmptySubAccounts], + [searchInputValue, all, withSubAccounts, enforceHideEmptySubAccounts, walletState], ); const extraRenderers = useMemo(() => { let extraProps = {}; diff --git a/apps/ledger-live-desktop/src/renderer/components/SpendableAmount.tsx b/apps/ledger-live-desktop/src/renderer/components/SpendableAmount.tsx index 51566dfabbfd..f805e3ce23b8 100644 --- a/apps/ledger-live-desktop/src/renderer/components/SpendableAmount.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/SpendableAmount.tsx @@ -1,10 +1,10 @@ import React, { useEffect, useState } from "react"; import { Account, AccountLike, TransactionCommon } from "@ledgerhq/types-live"; import { useDebounce } from "@ledgerhq/live-common//hooks/useDebounce"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import FormattedVal from "~/renderer/components/FormattedVal"; import BigNumber from "bignumber.js"; +import { useAccountUnit } from "../hooks/useAccountUnit"; type Props = { account: AccountLike; @@ -25,6 +25,7 @@ const SpendableAmount = ({ }: Props) => { const [maxSpendable, setMaxSpendable] = useState(null); const debouncedTransaction = useDebounce(transaction, 500); + const accountUnit = useAccountUnit(account); useEffect(() => { if (!account) return; let cancelled = false; @@ -42,7 +43,7 @@ const SpendableAmount = ({ cancelled = true; }; }, [account, parentAccount, debouncedTransaction]); - const accountUnit = getAccountUnit(account); + return maxSpendable ? ( { + const accountName = useAccountName(account); const history = useHistory(); const active = pathname.endsWith(account.id); const onAccountClick = useCallback(() => { @@ -61,7 +60,7 @@ const Item = ({ account, pathname, collapsed }: Props) => { : `/account/${account.id}`, }); }, [account, history]); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); return ( @@ -70,7 +69,7 @@ const Item = ({ account, pathname, collapsed }: Props) => { - {getAccountName(account)} + {accountName} - isStarredAccountSelector(state, { - accountId, - }), + accountStarredSelector(state, { accountId }), ); + const dispatch = useDispatch(); const refreshAccountsOrdering = useRefreshAccountsOrdering(); const toggleStar: React.MouseEventHandler = useCallback( e => { track(isAccountStarred ? "Account Unstar" : "Account Star"); e.stopPropagation(); - dispatch(toggleStarAction(accountId, parentId)); + dispatch(toggleStarAction(accountId, !isAccountStarred)); refreshAccountsOrdering(); }, - [isAccountStarred, dispatch, accountId, parentId, refreshAccountsOrdering], + [dispatch, accountId, refreshAccountsOrdering, isAccountStarred], ); const MaybeButtonWrapper = yellow ? ButtonWrapper : FloatingWrapper; return ( diff --git a/apps/ledger-live-desktop/src/renderer/components/Stars/index.tsx b/apps/ledger-live-desktop/src/renderer/components/Stars/index.tsx index 03f8ad256f97..7daf48c623f5 100644 --- a/apps/ledger-live-desktop/src/renderer/components/Stars/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/Stars/index.tsx @@ -11,6 +11,9 @@ import emptyBookmarksDark from "~/renderer/images/dark-empty-bookmarks.png"; import emptyBookmarksLight from "~/renderer/images/light-empty-bookmarks.png"; import Item from "./Item"; import { starredAccountsSelector } from "~/renderer/reducers/accounts"; +import { walletSelector } from "~/renderer/reducers/wallet"; +import { accountNameSelector } from "@ledgerhq/live-wallet/store"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; const Container = styled.div` display: flex; @@ -34,12 +37,18 @@ type Props = { collapsed: boolean; }; const Stars = ({ pathname, collapsed }: Props) => { + const walletState = useSelector(walletSelector); const starredAccounts = useSelector(starredAccountsSelector); return starredAccounts && starredAccounts.length ? ( {starredAccounts.map((account, i) => ( { - onClick = () => { - const { account, parentAccount, onClick } = this.props; - onClick(account, parentAccount); - }; +function TokenRow(props: Props) { + const { account, parentAccount, onClick, range, nested, disableRounding } = props; - render() { - const { account, range, nested, disableRounding } = this.props; - const currency = getAccountCurrency(account); - const unit = currency.units[0]; - const Row = nested ? NestedRow : TableRow; - return ( - -
- - - - - - ); - } + const onClickRow = () => onClick(account, parentAccount); + + const mainAccount = getMainAccount(account, parentAccount); + const unit = useAccountUnit(account); + const currency = mainAccount.currency; + const Row = nested ? NestedRow : TableRow; + + return ( + +
+ + + + + + ); } -export default TokenRow; + +export default React.memo(TokenRow); diff --git a/apps/ledger-live-desktop/src/renderer/components/TransactionConfirm/index.tsx b/apps/ledger-live-desktop/src/renderer/components/TransactionConfirm/index.tsx index c7152542cf7d..0a23acfe4f4c 100644 --- a/apps/ledger-live-desktop/src/renderer/components/TransactionConfirm/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/TransactionConfirm/index.tsx @@ -2,7 +2,7 @@ import invariant from "invariant"; import React, { useMemo } from "react"; import styled from "styled-components"; import { Account, AccountLike, TransactionCommon } from "@ledgerhq/types-live"; -import { getAccountUnit, getMainAccount } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import { Transaction, TransactionStatus } from "@ledgerhq/live-common/generated/types"; import { Device } from "@ledgerhq/live-common/hw/actions/types"; import { getDeviceTransactionConfig } from "@ledgerhq/live-common/transaction/index"; @@ -19,6 +19,7 @@ import { getDeviceAnimation } from "../DeviceAction/animations"; import { DeviceBlocker } from "../DeviceAction/DeviceBlocker"; import ConfirmAlert from "./ConfirmAlert"; import ConfirmTitle from "./ConfirmTitle"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const FieldText = styled(Text).attrs(() => ({ ml: 1, @@ -34,24 +35,27 @@ const FieldText = styled(Text).attrs(() => ({ export type FieldComponentProps = FCPGeneric; export type FieldComponent = React.ComponentType; -const AmountField = ({ account, status: { amount }, field }: FieldComponentProps) => ( - - - -); +const AmountField = ({ account, status: { amount }, field }: FieldComponentProps) => { + const unit = useAccountUnit(account); + return ( + + + + ); +}; const FeesField = ({ account, parentAccount, status, field }: FieldComponentProps) => { const mainAccount = getMainAccount(account, parentAccount); const { estimatedFees } = status; - const feesUnit = getAccountUnit(mainAccount); + const feesUnit = useAccountUnit(mainAccount); return ( , { currencies, includeTokens }: RequestAccountParams, ) => { @@ -47,7 +49,7 @@ export const requestAccountLogic = async ( const { account, parentAccount } = await selectAccountAndCurrency(safeCurrencies, includeTokens); - return serializePlatformAccount(accountToPlatformAccount(account, parentAccount)); + return serializePlatformAccount(accountToPlatformAccount(walletState, account, parentAccount)); }; export const broadcastTransactionLogic = ( diff --git a/apps/ledger-live-desktop/src/renderer/components/Web3AppWebview/PlatformAPIWebview.tsx b/apps/ledger-live-desktop/src/renderer/components/Web3AppWebview/PlatformAPIWebview.tsx index 3ff3a419edf8..d5edaad0efe0 100644 --- a/apps/ledger-live-desktop/src/renderer/components/Web3AppWebview/PlatformAPIWebview.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/Web3AppWebview/PlatformAPIWebview.tsx @@ -37,6 +37,7 @@ import { Loader } from "./styled"; import { WebviewAPI, WebviewProps } from "./types"; import { useWebviewState } from "./helpers"; import { currentRouteNameRef } from "~/renderer/analytics/screenRefs"; +import { walletSelector } from "~/renderer/reducers/wallet"; export const PlatformAPIWebview = forwardRef( ({ manifest, inputs = {}, onStateChange }, ref) => { @@ -78,19 +79,21 @@ export const PlatformAPIWebview = forwardRef( const [widgetLoaded, setWidgetLoaded] = useState(false); - const listAccounts = useListPlatformAccounts(accounts); + const walletState = useSelector(walletSelector); + const listAccounts = useListPlatformAccounts(walletState, accounts); const listCurrencies = useListPlatformCurrencies(); const requestAccount = useCallback( (request: RequestAccountParams) => { - return requestAccountLogic({ manifest }, request); + return requestAccountLogic(walletState, { manifest }, request); }, - [manifest], + [walletState, manifest], ); const receiveOnAccount = useCallback( ({ accountId }: { accountId: string }) => receiveOnAccountLogic( + walletState, { manifest, accounts, tracking }, accountId, (account, parentAccount, accountAddress) => { @@ -114,7 +117,7 @@ export const PlatformAPIWebview = forwardRef( ); }, ), - [manifest, accounts, dispatch, tracking], + [walletState, manifest, accounts, dispatch, tracking], ); const signTransaction = useCallback( diff --git a/apps/ledger-live-desktop/src/renderer/components/Web3AppWebview/WalletAPIWebview.tsx b/apps/ledger-live-desktop/src/renderer/components/Web3AppWebview/WalletAPIWebview.tsx index d8c2b76b093c..1399a89ff688 100644 --- a/apps/ledger-live-desktop/src/renderer/components/Web3AppWebview/WalletAPIWebview.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/Web3AppWebview/WalletAPIWebview.tsx @@ -43,6 +43,7 @@ import { TrackFunction } from "@ledgerhq/live-common/platform/tracking"; import { useDappLogic } from "@ledgerhq/live-common/wallet-api/useDappLogic"; import { NoAccountOverlay } from "./NoAccountOverlay"; import { ipcRenderer } from "electron"; +import { walletSelector } from "~/renderer/reducers/wallet"; const wallet = { name: "ledger-live-desktop", version: __APP_VERSION__ }; @@ -259,7 +260,10 @@ function useWebView( // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const walletState = useSelector(walletSelector); + const { widgetLoaded, onLoad, onReload, onMessage, server } = useWalletAPIServer({ + walletState, manifest, accounts, tracking, diff --git a/apps/ledger-live-desktop/src/renderer/components/WebPlatformPlayer/TopBar.tsx b/apps/ledger-live-desktop/src/renderer/components/WebPlatformPlayer/TopBar.tsx index bc6120cc0364..fe86480314f9 100644 --- a/apps/ledger-live-desktop/src/renderer/components/WebPlatformPlayer/TopBar.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/WebPlatformPlayer/TopBar.tsx @@ -16,11 +16,12 @@ import { openPlatformAppInfoDrawer } from "~/renderer/actions/UI"; import { useSelectAccount } from "../Web3AppWebview/helpers"; import { WebviewAPI, WebviewState } from "../Web3AppWebview/types"; import Spinner from "../Spinner"; -import { getAccountName, getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; import { useDebounce } from "@ledgerhq/live-common/hooks/useDebounce"; import { useDappCurrentAccount } from "@ledgerhq/live-common/wallet-api/useDappLogic"; import { CurrentAccountHistDB, safeGetRefValue } from "@ledgerhq/live-common/wallet-api/react"; import Wallet from "~/renderer/icons/Wallet"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; import CryptoCurrencyIcon from "../CryptoCurrencyIcon"; const Container = styled(Box).attrs(() => ({ @@ -249,7 +250,7 @@ export const TopBar = ({ currency={getAccountCurrency(currentAccount)} size={16} /> - {getAccountName(currentAccount)} + {getDefaultAccountName(currentAccount)} )} diff --git a/apps/ledger-live-desktop/src/renderer/drawers/DataSelector/AccountList.tsx b/apps/ledger-live-desktop/src/renderer/drawers/DataSelector/AccountList.tsx index 6f5be6ff4eb1..d594a9181921 100644 --- a/apps/ledger-live-desktop/src/renderer/drawers/DataSelector/AccountList.tsx +++ b/apps/ledger-live-desktop/src/renderer/drawers/DataSelector/AccountList.tsx @@ -1,11 +1,11 @@ import React, { useMemo, useCallback } from "react"; import Text from "~/renderer/components/Text"; import CryptoCurrencyIcon from "~/renderer/components/CryptoCurrencyIcon"; -import { Account, AccountLike } from "@ledgerhq/types-live"; +import { Account, AccountLike, TokenAccount } from "@ledgerhq/types-live"; import { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets"; import { useGetAccountIds } from "@ledgerhq/live-common/wallet-api/react"; import { useSelector, useDispatch } from "react-redux"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { accountsSelector } from "~/renderer/reducers/accounts"; import { getAccountTuplesForCurrency } from "~/renderer/components/PerCurrencySelectAccount/state"; import { openModal } from "~/renderer/actions/modals"; @@ -19,6 +19,8 @@ import { darken } from "~/renderer/styles/helpers"; import { Observable } from "rxjs"; import { WalletAPIAccount } from "@ledgerhq/live-common/wallet-api/types"; import { useTranslation } from "react-i18next"; +import { useAccountName } from "~/renderer/reducers/wallet"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const AddIconContainer = styled.div` border-radius: 50%; @@ -42,6 +44,7 @@ export function AccountList({ currency, onAccountSelect, accounts$ }: Props) { const { t } = useTranslation(); const accountIds = useGetAccountIds(accounts$); const nestedAccounts = useSelector(accountsSelector); + const accountTuples = useMemo(() => { return getAccountTuplesForCurrency(currency, nestedAccounts, false, accountIds); }, [nestedAccounts, currency, accountIds]); @@ -77,57 +80,81 @@ export function AccountList({ currency, onAccountSelect, accounts$ }: Props) { {accountTuples.map((accountTuple, index) => { const { account, subAccount } = accountTuple; - const accountCurrency = getAccountCurrency(subAccount || account); return ( - { - if (subAccount) { - onAccountSelect(subAccount, account); - } else { - onAccountSelect(account); - } - }} - > - - - - - {`${subAccount ? `${account.name} (${accountCurrency.ticker})` : account.name}`} - - - - - - - - + /> ); })} ); } + +function Row({ + account, + subAccount, + index, + onAccountSelect, +}: { + account: Account; + subAccount: TokenAccount | null | undefined; + index: number; + onAccountSelect: (account: AccountLike, parentAccount?: Account) => void; +}) { + const accountCurrency = getAccountCurrency(subAccount || account); + const accountName = useAccountName(account); + const unit = useAccountUnit(account); + + return ( + { + if (subAccount) { + onAccountSelect(subAccount, account); + } else { + onAccountSelect(account); + } + }} + > + + + + + {`${subAccount ? `${accountName} (${accountCurrency.ticker})` : accountName}`} + + + + + + + + + ); +} diff --git a/apps/ledger-live-desktop/src/renderer/drawers/OperationDetails/index.tsx b/apps/ledger-live-desktop/src/renderer/drawers/OperationDetails/index.tsx index cc4174880186..deb2ffc54596 100644 --- a/apps/ledger-live-desktop/src/renderer/drawers/OperationDetails/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/drawers/OperationDetails/index.tsx @@ -1,7 +1,6 @@ import { findSubAccountById, getAccountCurrency, - getAccountUnit, getFeesCurrency, getFeesUnit, getMainAccount, @@ -79,6 +78,8 @@ import { TextEllipsis, } from "./styledComponents"; import { dayAndHourFormat, useDateFormatted } from "~/renderer/hooks/useDateFormatter"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; +import { useAccountName } from "~/renderer/reducers/wallet"; const mapStateToProps = ( state: State, @@ -150,13 +151,13 @@ const OperationD = (props: Props) => { const dateFormatted = useDateFormatted(date, dayAndHourFormat); const uniqueSenders = uniq(senders); const recipients = _recipients.filter(Boolean); - const { name } = mainAccount; + const name = useAccountName(mainAccount); const isNftOperation = ["NFT_IN", "NFT_OUT"].includes(operation.type); const currency = getAccountCurrency(account); const mainCurrency = getAccountCurrency(mainAccount); const { status, metadata } = useNftMetadata(contract, tokenId, currency.id); const show = useMemo(() => status === "loading", [status]); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const amount = getOperationAmountNumber(operation); const isNegative = amount.isNegative(); const marketColor = getMarketColor({ diff --git a/apps/ledger-live-desktop/src/renderer/drawers/SwapOperationDetails/index.tsx b/apps/ledger-live-desktop/src/renderer/drawers/SwapOperationDetails/index.tsx index 14afb3999da5..cce5b3eb41b6 100644 --- a/apps/ledger-live-desktop/src/renderer/drawers/SwapOperationDetails/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/drawers/SwapOperationDetails/index.tsx @@ -1,9 +1,4 @@ -import { - getAccountCurrency, - getAccountName, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import { isSwapOperationPending } from "@ledgerhq/live-common/exchange/swap/index"; import { MappedSwapOperation } from "@ledgerhq/live-common/exchange/swap/types"; import { getProviderName } from "@ledgerhq/live-common/exchange/swap/utils/index"; @@ -34,6 +29,7 @@ import { OpDetailsSection, OpDetailsTitle, } from "~/renderer/drawers/OperationDetails/styledComponents"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; import { dayFormat, useDateFormatted } from "~/renderer/hooks/useDateFormatter"; import useTheme from "~/renderer/hooks/useTheme"; import IconArrowDown from "~/renderer/icons/ArrowDown"; @@ -43,6 +39,7 @@ import IconSwap from "~/renderer/icons/Swap"; import { openURL } from "~/renderer/linking"; import { shallowAccountsSelector } from "~/renderer/reducers/accounts"; import { languageSelector } from "~/renderer/reducers/settings"; +import { useAccountName } from "~/renderer/reducers/wallet"; import { getStatusColor } from "~/renderer/screens/exchange/Swap2/History/OperationRow"; import { rgba } from "~/renderer/styles/helpers"; @@ -113,12 +110,14 @@ const SwapOperationDetails = ({ }) => { const { fromAccount, toAccount, operation, provider, swapId, status, fromAmount, toAmount } = mappedSwapOperation; + const fromAccountName = useAccountName(fromAccount); + const toAccountName = useAccountName(toAccount); const dateFormatted = useDateFormatted(operation.date, dayFormat); const language = useSelector(languageSelector); const history = useHistory(); - const fromUnit = getAccountUnit(fromAccount); + const fromUnit = useAccountUnit(fromAccount); const fromCurrency = getAccountCurrency(fromAccount); - const toUnit = getAccountUnit(toAccount); + const toUnit = useAccountUnit(toAccount); const toCurrency = getAccountCurrency(toAccount); const accounts = useSelector(shallowAccountsSelector); const normalisedFromAmount = fromAmount.times(-1); @@ -307,7 +306,7 @@ const SwapOperationDetails = ({ - openAccount(fromAccount)}>{getAccountName(fromAccount)} + openAccount(fromAccount)}>{fromAccountName} @@ -349,7 +348,7 @@ const SwapOperationDetails = ({ - openAccount(toAccount)}>{getAccountName(toAccount)} + openAccount(toAccount)}>{toAccountName} diff --git a/apps/ledger-live-desktop/src/renderer/families/algorand/AccountHeaderManageActions.ts b/apps/ledger-live-desktop/src/renderer/families/algorand/AccountHeaderManageActions.ts index 30d13892bb17..bfda7d47f065 100644 --- a/apps/ledger-live-desktop/src/renderer/families/algorand/AccountHeaderManageActions.ts +++ b/apps/ledger-live-desktop/src/renderer/families/algorand/AccountHeaderManageActions.ts @@ -1,10 +1,10 @@ import { useCallback } from "react"; import { useDispatch } from "react-redux"; import { useTranslation } from "react-i18next"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { openModal } from "~/renderer/actions/modals"; import IconCoins from "~/renderer/icons/Coins"; import { AlgorandFamily } from "./types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const AccountHeaderActions: AlgorandFamily["accountHeaderManageActions"] = ({ account, @@ -13,7 +13,7 @@ const AccountHeaderActions: AlgorandFamily["accountHeaderManageActions"] = ({ const { t } = useTranslation(); const dispatch = useDispatch(); const balance = account.balance; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const minRewardsBalance = 10 ** unit.magnitude; const onClick = useCallback(() => { diff --git a/apps/ledger-live-desktop/src/renderer/families/algorand/Rewards/ClaimRewardsFlowModal/steps/StepInfo.tsx b/apps/ledger-live-desktop/src/renderer/families/algorand/Rewards/ClaimRewardsFlowModal/steps/StepInfo.tsx index 8343f9fafeae..cb1d1054107f 100644 --- a/apps/ledger-live-desktop/src/renderer/families/algorand/Rewards/ClaimRewardsFlowModal/steps/StepInfo.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/algorand/Rewards/ClaimRewardsFlowModal/steps/StepInfo.tsx @@ -3,7 +3,6 @@ import React from "react"; import { Trans } from "react-i18next"; import { useSelector } from "react-redux"; import { StepProps } from "../types"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { localeSelector } from "~/renderer/reducers/settings"; import TrackPage from "~/renderer/analytics/TrackPage"; @@ -15,9 +14,10 @@ import Text from "~/renderer/components/Text"; import ClaimRewardsIllu from "~/renderer/images/rewards.svg"; import Image from "~/renderer/components/Image"; import AccountFooter from "~/renderer/modals/Send/AccountFooter"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; export default function StepInfo({ account, warning, error }: StepProps) { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const locale = useSelector(localeSelector); const { algorandResources } = account; const { rewards } = algorandResources || {}; diff --git a/apps/ledger-live-desktop/src/renderer/families/algorand/Rewards/index.tsx b/apps/ledger-live-desktop/src/renderer/families/algorand/Rewards/index.tsx index 0f42f7594340..689598ad2a29 100644 --- a/apps/ledger-live-desktop/src/renderer/families/algorand/Rewards/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/algorand/Rewards/index.tsx @@ -1,8 +1,4 @@ -import { - getAccountCurrency, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import { AlgorandAccount } from "@ledgerhq/live-common/families/algorand/types"; import React, { useCallback } from "react"; import { Trans } from "react-i18next"; @@ -17,6 +13,7 @@ import ToolTip from "~/renderer/components/Tooltip"; import ClaimRewards from "~/renderer/icons/ClaimReward"; import { AlgorandFamily } from "../types"; import { SubAccount } from "@ledgerhq/types-live"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type AccountBodyHeader = NonNullable; @@ -30,7 +27,7 @@ const RewardsSection = ({ const mainAccount = getMainAccount(account, parentAccount); const { rewards } = mainAccount.algorandResources || {}; const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const dispatch = useDispatch(); const onRewardsClick = useCallback(() => { dispatch( diff --git a/apps/ledger-live-desktop/src/renderer/families/algorand/operationDetails.tsx b/apps/ledger-live-desktop/src/renderer/families/algorand/operationDetails.tsx index 3c4ab28b69f5..f9a66001ca10 100644 --- a/apps/ledger-live-desktop/src/renderer/families/algorand/operationDetails.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/algorand/operationDetails.tsx @@ -1,4 +1,4 @@ -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { AlgorandAccount, AlgorandOperation } from "@ledgerhq/live-common/families/algorand/types"; import { BigNumber } from "bignumber.js"; @@ -27,6 +27,7 @@ import { ConfirmationCellProps, OperationDetailsExtraProps, } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const CellIcon = styled(Box)<{ index: number }>` flex: 1 0 50%; @@ -57,7 +58,7 @@ const OperationDetailsExtra = ({ account, operation, }: OperationDetailsExtraProps) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); const { rewards, memo, assetId } = operation.extra; return ( diff --git a/apps/ledger-live-desktop/src/renderer/families/bitcoin/CoinControlModal.tsx b/apps/ledger-live-desktop/src/renderer/families/bitcoin/CoinControlModal.tsx index 2b1082cc84cd..bcead3b0597f 100644 --- a/apps/ledger-live-desktop/src/renderer/families/bitcoin/CoinControlModal.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/bitcoin/CoinControlModal.tsx @@ -19,6 +19,7 @@ import { Transaction, TransactionStatus, } from "@ledgerhq/live-common/families/bitcoin/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { isOpened?: boolean; @@ -45,6 +46,8 @@ const CoinControlModal = ({ updateTransaction, }: Props) => { const onClickLink = useCallback(() => openURL(urls.coinControl), []); + + const unit = useAccountUnit(account); if (!account.bitcoinResources) return null; const { bitcoinResources } = account; const { utxoStrategy } = transaction; @@ -85,7 +88,7 @@ const CoinControlModal = ({ { + const unit = useAccountUnit(account); const s = getUTXOStatus(utxo, utxoStrategy); const utxoStatus = s.excluded ? s.reason || "" : ""; const input = (status.txInputs || []).find( @@ -128,7 +130,7 @@ export const CoinControlRow = ({ ({ horizontal: true, alignItems: "center", @@ -33,10 +37,16 @@ const Accounts = ({ numberOfAccountsToScan: number | undefined | null; setNumberOfAccountsToScan: (a?: number | null) => void; }) => { + const walletState = useSelector(walletSelector); + // FIXME Not using the AccountList component because styles differ quite a bit, we should unify. const accounts = useSelector(accountsSelector); const currency = getCryptoCurrencyById("bitcoin"); + const bitcoinAccounts = accounts.filter(a => getAccountCurrency(a) === currency); + const firstNonFalsyAccount = bitcoinAccounts.find(account => !!account); + const unit = useMaybeAccountUnit(firstNonFalsyAccount); + const onUpdateNumberOfAccountsToScan = useCallback( (value: string) => { if (value) { @@ -117,12 +127,12 @@ const Accounts = ({ color="palette.text.shade40" fontSize={3} > - {account.name} + {accountNameWithDefaultSelector(walletState, account)} ({ horizontal: true, @@ -51,7 +51,7 @@ const AccountBalanceSummaryFooter: CardanoFamily["AccountBalanceSummaryFooter"] const discreet = useDiscreetMode(); const locale = useSelector(localeSelector); const _spendableBalance = account.spendableBalance; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/apps/ledger-live-desktop/src/renderer/families/cardano/Delegation/Row.tsx b/apps/ledger-live-desktop/src/renderer/families/cardano/Delegation/Row.tsx index 998c5c56aee9..3f4492e01646 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cardano/Delegation/Row.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cardano/Delegation/Row.tsx @@ -1,11 +1,12 @@ import React from "react"; import styled from "styled-components"; -import { getAccountUnit, shortAddressPreview } from "@ledgerhq/live-common/account/index"; +import { shortAddressPreview } from "@ledgerhq/live-common/account/index"; import { CardanoAccount, CardanoDelegation } from "@ledgerhq/live-common/families/cardano/types"; import FormattedVal from "~/renderer/components/FormattedVal"; import Text from "~/renderer/components/Text"; import Ellipsis from "~/renderer/components/Ellipsis"; import ContextMenu from "./ContextMenu"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { delegation: CardanoDelegation; @@ -41,7 +42,7 @@ const Value = styled.div` `; const Row = ({ account, delegation }: Props) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); let name = ""; if (delegation && delegation.poolId) { name = delegation.ticker diff --git a/apps/ledger-live-desktop/src/renderer/families/cardano/DelegationFlowModal/fields/ValidatorField.tsx b/apps/ledger-live-desktop/src/renderer/families/cardano/DelegationFlowModal/fields/ValidatorField.tsx index 0db6b3096c78..924a9e0d4a97 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cardano/DelegationFlowModal/fields/ValidatorField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cardano/DelegationFlowModal/fields/ValidatorField.tsx @@ -1,5 +1,4 @@ import React, { useState, useCallback, useEffect } from "react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import styled from "styled-components"; import Box from "~/renderer/components/Box"; import Text from "~/renderer/components/Text"; @@ -17,6 +16,7 @@ import ValidatorSearchInput from "~/renderer/components/Delegation/ValidatorSear import { LEDGER_POOL_IDS } from "@ledgerhq/live-common/families/cardano/utils"; import { CardanoDelegation } from "@ledgerhq/live-common/families/cardano/types"; import BigSpinner from "~/renderer/components/BigSpinner"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { t: TFunction; @@ -29,7 +29,7 @@ type Props = { const ValidatorField = ({ account, delegation, onChangeValidator, selectedPoolId }: Props) => { const [ledgerPools, setLedgerPools] = useState>([]); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const [showAll, setShowAll] = useState( LEDGER_POOL_IDS.length === 0 || diff --git a/apps/ledger-live-desktop/src/renderer/families/cardano/DelegationFlowModal/steps/StepSummary.tsx b/apps/ledger-live-desktop/src/renderer/families/cardano/DelegationFlowModal/steps/StepSummary.tsx index 0521ac34fe13..5bbfa729d979 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cardano/DelegationFlowModal/steps/StepSummary.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cardano/DelegationFlowModal/steps/StepSummary.tsx @@ -1,7 +1,7 @@ -import React, { PureComponent } from "react"; +import React from "react"; import { Trans } from "react-i18next"; import styled from "styled-components"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import Box from "~/renderer/components/Box"; import Button from "~/renderer/components/Button"; import Ellipsis from "~/renderer/components/Ellipsis"; @@ -11,6 +11,7 @@ import CounterValue from "~/renderer/components/CounterValue"; import { StepProps } from "../types"; import CardanoLedgerPoolIcon from "../LedgerPoolIcon"; import BigNumber from "bignumber.js"; +import { useMaybeAccountUnit } from "~/renderer/hooks/useAccountUnit"; const FromToWrapper = styled.div``; const Separator = styled.div` @@ -20,86 +21,69 @@ const Separator = styled.div` margin: 15px 0; `; -export default class StepSummary extends PureComponent { - render() { - const { account, transaction, status, selectedPool } = this.props; - if (!account) return null; - if (!transaction) return null; - const { estimatedFees } = status; - const feesUnit = getAccountUnit(account); - const feesCurrency = getAccountCurrency(account); - const showDeposit = !account.cardanoResources?.delegation?.status; - const stakeKeyDeposit = account.cardanoResources?.protocolParams.stakeKeyDeposit; - return ( - - - - - - - - - - - - - {`${selectedPool.name} [${selectedPool.ticker}]`} - - - - +function StepSummary(props: StepProps) { + const { account, transaction, status, selectedPool } = props; + + const feesUnit = useMaybeAccountUnit(account); + if (!account || !transaction) return null; + + const { estimatedFees } = status; + + const feesCurrency = getAccountCurrency(account); + const showDeposit = !account.cardanoResources?.delegation?.status; + const stakeKeyDeposit = account.cardanoResources?.protocolParams.stakeKeyDeposit; + return ( + + + + + + + + + + + + + {`${selectedPool.name} [${selectedPool.ticker}]`} + + + - - - - - - - + + + + + + + - - - + + + + + + + + {selectedPool.margin} % - - - {selectedPool.margin} % - - - - {showDeposit ? ( - - - - - - - - - ) : null} + + + {showDeposit ? ( - + { disableRounding unit={feesUnit} alwaysShowValue - val={estimatedFees} + val={new BigNumber(stakeKeyDeposit)} fontSize={4} inline showCode /> - - - - - - ); - } + ) : null} + + + + + + + + + + + + + + ); } export function StepSummaryFooter({ transitionTo }: StepProps) { @@ -150,3 +151,5 @@ export function StepSummaryFooter({ transitionTo }: StepProps) { ); } + +export default React.memo(StepSummary); diff --git a/apps/ledger-live-desktop/src/renderer/families/cardano/UndelegateFlowModal/steps/StepSummary.tsx b/apps/ledger-live-desktop/src/renderer/families/cardano/UndelegateFlowModal/steps/StepSummary.tsx index 3679c7e76840..3f491b4686cf 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cardano/UndelegateFlowModal/steps/StepSummary.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cardano/UndelegateFlowModal/steps/StepSummary.tsx @@ -1,7 +1,7 @@ -import React, { PureComponent } from "react"; +import React from "react"; import { Trans } from "react-i18next"; import styled from "styled-components"; -import { getAccountUnit, getAccountCurrency } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import Box from "~/renderer/components/Box"; import Button from "~/renderer/components/Button"; import FormattedVal from "~/renderer/components/FormattedVal"; @@ -12,6 +12,7 @@ import TranslatedError from "~/renderer/components/TranslatedError"; import { StepProps } from "../types"; import BigNumber from "bignumber.js"; import Alert from "~/renderer/components/Alert"; +import { useMaybeAccountUnit } from "~/renderer/hooks/useAccountUnit"; const FromToWrapper = styled.div``; const Separator = styled.div` @@ -21,89 +22,90 @@ const Separator = styled.div` margin: 15px 0; `; -export default class StepSummary extends PureComponent { - render() { - const { account, transaction, status, error } = this.props; - const { estimatedFees, errors } = status; - if (!account) return null; - if (!transaction) return null; - const accountUnit = getAccountUnit(account); - const feesCurrency = getAccountCurrency(account); - const stakeKeyDeposit = account.cardanoResources?.protocolParams.stakeKeyDeposit; - const displayError = errors.amount?.message ? errors.amount : ""; - return ( - - {error && } +function StepSummary(props: StepProps) { + const { account, transaction, status, error } = props; + const { estimatedFees, errors } = status; + const displayError = errors.amount?.message ? errors.amount : ""; - - - - - - - - + const accountUnit = useMaybeAccountUnit(account); + if (!account || !transaction) return null; + + const feesCurrency = getAccountCurrency(account); + const stakeKeyDeposit = account.cardanoResources?.protocolParams.stakeKeyDeposit; + return ( + + {error && } + + + + + + + + - + + - - - - - - - + + + + + + - - - - - - - + + + + + + + + + - - - - - {displayError ? ( - - - - - - ) : null} - - ); - } + + + {displayError ? ( + + + + + + ) : null} + + ); } +export default React.memo(StepSummary); + export function StepSummaryFooter({ transitionTo, status, diff --git a/apps/ledger-live-desktop/src/renderer/families/casper/TransactionConfirmFields.tsx b/apps/ledger-live-desktop/src/renderer/families/casper/TransactionConfirmFields.tsx index 4334e22f3b1e..8e45025fb18c 100644 --- a/apps/ledger-live-desktop/src/renderer/families/casper/TransactionConfirmFields.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/casper/TransactionConfirmFields.tsx @@ -1,11 +1,12 @@ import invariant from "invariant"; import React from "react"; import TransactionConfirmField from "~/renderer/components/TransactionConfirm/TransactionConfirmField"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import Box from "~/renderer/components/Box"; import FormattedVal from "~/renderer/components/FormattedVal"; import { CasperFieldComponentProps } from "./types"; import { ExtraDeviceTransactionField } from "@ledgerhq/live-common/families/casper/deviceTransactionConfig"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const CasperExtendedAmountField = ({ account, @@ -15,7 +16,7 @@ const CasperExtendedAmountField = ({ }: CasperFieldComponentProps) => { invariant(transaction.family === "casper", "casper transaction"); const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const specifiedAmount = (field as ExtraDeviceTransactionField).value; return ( diff --git a/apps/ledger-live-desktop/src/renderer/families/celo/AccountBalanceSummaryFooter/AccountBalanceSummaryFooter.tsx b/apps/ledger-live-desktop/src/renderer/families/celo/AccountBalanceSummaryFooter/AccountBalanceSummaryFooter.tsx index d4d41b3752c3..111e6ff38e70 100644 --- a/apps/ledger-live-desktop/src/renderer/families/celo/AccountBalanceSummaryFooter/AccountBalanceSummaryFooter.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/celo/AccountBalanceSummaryFooter/AccountBalanceSummaryFooter.tsx @@ -1,7 +1,6 @@ import React from "react"; import { useSelector } from "react-redux"; import { Trans } from "react-i18next"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { localeSelector } from "~/renderer/reducers/settings"; import Discreet, { useDiscreetMode } from "~/renderer/components/Discreet"; @@ -10,15 +9,17 @@ import ToolTip from "~/renderer/components/Tooltip"; import { withdrawableBalance } from "@ledgerhq/live-common/families/celo/logic"; import * as S from "./AccountBalanceSummaryFooter.styles"; import { CeloFamily } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const AccountBalanceSummaryFooter: CeloFamily["AccountBalanceSummaryFooter"] = ({ account }) => { const discreet = useDiscreetMode(); const locale = useSelector(localeSelector); + const unit = useAccountUnit(account); if (account.type !== "Account") return null; const { spendableBalance, celoResources } = account; const { lockedBalance, nonvotingLockedBalance } = celoResources; const withdrawableBalanceAmount = withdrawableBalance(account); - const unit = getAccountUnit(account); + const formatConfig = { disableRounding: false, alwaysShowSign: false, diff --git a/apps/ledger-live-desktop/src/renderer/families/celo/AccountBodyHeader/Row.tsx b/apps/ledger-live-desktop/src/renderer/families/celo/AccountBodyHeader/Row.tsx index df23c1c2cfbe..13571dcf2a93 100644 --- a/apps/ledger-live-desktop/src/renderer/families/celo/AccountBodyHeader/Row.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/celo/AccountBodyHeader/Row.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { Account } from "@ledgerhq/types-live"; import { BigNumber } from "bignumber.js"; @@ -24,6 +23,7 @@ import ManageDropDown from "./ManageDropDown"; import { ModalActions } from "../modals"; import { DropDownItemType } from "~/renderer/components/DropDownSelector"; import Discreet from "~/renderer/components/Discreet"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const voteActions = (vote: CeloVote): Array<{ key: ModalActions; label: React.ReactNode }> => { const actions: Array<{ key: ModalActions; label: React.ReactNode }> = []; if (vote.activatable) @@ -53,6 +53,9 @@ export const Row = ({ account, vote, onManageAction, onExternalLink }: Props) => ); const onExternalLinkClick = () => onExternalLink(vote); const actions = voteActions(vote); + + const unit = useAccountUnit(account); + const { validatorGroups } = useCeloPreloadData(); const validatorGroup = useMemo( () => @@ -62,7 +65,6 @@ export const Row = ({ account, vote, onManageAction, onExternalLink }: Props) => ); const status = voteStatus(vote); const formatAmount = (amount: number) => { - const unit = getAccountUnit(account); return formatCurrencyUnit(unit, new BigNumber(amount), { disableRounding: false, alwaysShowSign: false, diff --git a/apps/ledger-live-desktop/src/renderer/families/celo/ActivateFlowModal/steps/StepVote.tsx b/apps/ledger-live-desktop/src/renderer/families/celo/ActivateFlowModal/steps/StepVote.tsx index fce48363dfc1..96496e3854e5 100644 --- a/apps/ledger-live-desktop/src/renderer/families/celo/ActivateFlowModal/steps/StepVote.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/celo/ActivateFlowModal/steps/StepVote.tsx @@ -12,9 +12,9 @@ import Button from "~/renderer/components/Button"; import AccountFooter from "~/renderer/modals/Send/AccountFooter"; import ErrorBanner from "~/renderer/components/ErrorBanner"; import { useCeloPreloadData } from "@ledgerhq/live-common/families/celo/react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import ActivateValidatorGroupRow from "~/renderer/families/celo/ActivateFlowModal/components/ActivateValidatorGroupRow"; import { StepProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; export const StepVoteFooter = ({ transitionTo, account, @@ -58,6 +58,8 @@ const StepVote = ({ "account with votes and transaction required", ); const bridge = getAccountBridge(account, parentAccount); + const unit = useAccountUnit(account); + const onChange = useCallback( (recipient: string) => { onChangeTransaction( @@ -81,7 +83,7 @@ const StepVote = ({ })) || [], [votes, validatorGroups], ); - const unit = getAccountUnit(account); + return ( { invariant(account && transaction && account.spendableBalance, "account and transaction required"); const bridge = getAccountBridge(account, parentAccount); - const defaultUnit = getAccountUnit(account); + const defaultUnit = useAccountUnit(account); const onChange = useCallback( (value: BigNumber) => { onChangeTransaction( diff --git a/apps/ledger-live-desktop/src/renderer/families/celo/RevokeFlowModal/fields/AmountField.tsx b/apps/ledger-live-desktop/src/renderer/families/celo/RevokeFlowModal/fields/AmountField.tsx index ce148f62bf87..01bf36a7f631 100644 --- a/apps/ledger-live-desktop/src/renderer/families/celo/RevokeFlowModal/fields/AmountField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/celo/RevokeFlowModal/fields/AmountField.tsx @@ -4,7 +4,6 @@ import { Trans } from "react-i18next"; import { TFunction } from "i18next"; import { BigNumber } from "bignumber.js"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import SpendableAmount from "~/renderer/components/SpendableAmount"; import Label from "~/renderer/components/Label"; import Box from "~/renderer/components/Box"; @@ -17,6 +16,7 @@ import { TransactionStatus, CeloAccount, } from "@ledgerhq/live-common/families/celo/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { t: TFunction; @@ -36,7 +36,7 @@ const AmountField = ({ }: Props) => { invariant(account && transaction && account.spendableBalance, "account and transaction required"); const bridge = getAccountBridge(account, parentAccount); - const defaultUnit = getAccountUnit(account); + const defaultUnit = useAccountUnit(account); const onChange = useCallback( (value: BigNumber) => { onChangeTransaction( diff --git a/apps/ledger-live-desktop/src/renderer/families/celo/RevokeFlowModal/steps/StepVote.tsx b/apps/ledger-live-desktop/src/renderer/families/celo/RevokeFlowModal/steps/StepVote.tsx index c18986449a44..dbcff570c668 100644 --- a/apps/ledger-live-desktop/src/renderer/families/celo/RevokeFlowModal/steps/StepVote.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/celo/RevokeFlowModal/steps/StepVote.tsx @@ -8,12 +8,12 @@ import Button from "~/renderer/components/Button"; import ErrorBanner from "~/renderer/components/ErrorBanner"; import RevokeVoteRow from "../components/RevokeVoteRow"; import { useCeloPreloadData } from "@ledgerhq/live-common/families/celo/react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { revokableVotes, fallbackValidatorGroup } from "@ledgerhq/live-common/families/celo/logic"; import Alert from "~/renderer/components/Alert"; import { urls } from "~/config/urls"; import * as S from "./StepVote.styles"; import { StepProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; export const StepVoteFooter = ({ transitionTo, account, @@ -53,6 +53,7 @@ const StepVote = ({ account && account.celoResources && transaction, "celo account, resources and transaction required", ); + const unit = useAccountUnit(account); const bridge = getAccountBridge(account, parentAccount); const onChange = useCallback( (recipient: string, index: number) => { @@ -78,7 +79,7 @@ const StepVote = ({ })) || [], [votes, validatorGroups], ); - const unit = getAccountUnit(account); + return ( { invariant(account && transaction && account.spendableBalance, "account and transaction required"); const bridge = getAccountBridge(account, parentAccount); - const defaultUnit = getAccountUnit(account); + const defaultUnit = useAccountUnit(account); const onChange = useCallback( (value: BigNumber) => { onChangeTransaction( diff --git a/apps/ledger-live-desktop/src/renderer/families/celo/VoteFlowModal/fields/ValidatorGroupsField.tsx b/apps/ledger-live-desktop/src/renderer/families/celo/VoteFlowModal/fields/ValidatorGroupsField.tsx index ab9f6f30aa8b..65c3f8f9c49e 100644 --- a/apps/ledger-live-desktop/src/renderer/families/celo/VoteFlowModal/fields/ValidatorGroupsField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/celo/VoteFlowModal/fields/ValidatorGroupsField.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import invariant from "invariant"; import React, { useEffect, useMemo, useRef, useState, useCallback } from "react"; import { Trans } from "react-i18next"; @@ -17,6 +16,7 @@ import { CeloAccount, TransactionStatus, } from "@ledgerhq/live-common/families/celo/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { account: CeloAccount; status: TransactionStatus; @@ -32,7 +32,7 @@ const ValidatorGroupsField = ({ invariant(account && account.celoResources, "celo account and resources required"); const [search, setSearch] = useState(""); const [showAll, setShowAll] = useState(false); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const validatorGroups = useValidatorGroups(search); const onSearch = useCallback( (evt: React.ChangeEvent) => setSearch(evt.target.value), diff --git a/apps/ledger-live-desktop/src/renderer/families/celo/WithdrawFlowModal/steps/StepAmount.tsx b/apps/ledger-live-desktop/src/renderer/families/celo/WithdrawFlowModal/steps/StepAmount.tsx index 56e38653462c..2de832a47471 100644 --- a/apps/ledger-live-desktop/src/renderer/families/celo/WithdrawFlowModal/steps/StepAmount.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/celo/WithdrawFlowModal/steps/StepAmount.tsx @@ -16,6 +16,7 @@ import ErrorBanner from "~/renderer/components/ErrorBanner"; import * as S from "./StepAmount.styles"; import { StepProps } from "../types"; import { fromNow } from "~/renderer/hooks/useDateFormatter"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; export const StepAmountFooter = ({ transitionTo, account, @@ -65,6 +66,8 @@ const StepAmount = ({ account && transaction && account.celoResources && account.celoResources.pendingWithdrawals, "account with pending withdrawals and transaction required", ); + + const unit = useAccountUnit(account); const bridge = getAccountBridge(account, parentAccount); const onChange = useCallback( (index: number) => { @@ -105,7 +108,7 @@ const StepAmount = ({ )} () => { const url = getAddressExplorer(getDefaultExplorerView(currency), address); @@ -30,6 +31,8 @@ const OperationDetailsExtra = ({ account, }: OperationDetailsExtraProps) => { const { currency } = account; + + const unit = useAccountUnit(account); const { validatorGroups } = useCeloPreloadData(); switch (type) { case "ACTIVATE": @@ -52,7 +55,7 @@ const OperationDetailsExtra = ({ ({ horizontal: true, @@ -81,11 +81,11 @@ const AccountBalanceSummaryFooter = ({ account }: Props) => { }); }, [account]); + const unit = useAccountUnit(account); if (account.type !== "Account") return null; const { spendableBalance: _spendableBalance, cosmosResources } = account; const { delegatedBalance: _delegatedBalance, unbondingBalance: _unbondingBalance } = cosmosResources; - const unit = getAccountUnit(account); const formatConfig = { disableRounding: false, alwaysShowSign: false, diff --git a/apps/ledger-live-desktop/src/renderer/families/cosmos/ClaimRewardsFlowModal/steps/StepClaimRewards.tsx b/apps/ledger-live-desktop/src/renderer/families/cosmos/ClaimRewardsFlowModal/steps/StepClaimRewards.tsx index 29e9906526c5..fdfe7d5c172c 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cosmos/ClaimRewardsFlowModal/steps/StepClaimRewards.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cosmos/ClaimRewardsFlowModal/steps/StepClaimRewards.tsx @@ -4,7 +4,6 @@ import { Trans } from "react-i18next"; import { useSelector } from "react-redux"; import { StepProps } from "../types"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { localeSelector } from "~/renderer/reducers/settings"; import TrackPage from "~/renderer/analytics/TrackPage"; @@ -19,6 +18,7 @@ import { CosmosLikeTransaction, CosmosMappedDelegation, } from "@ledgerhq/live-common/families/cosmos/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; export default function StepClaimRewards({ account, @@ -32,7 +32,7 @@ export default function StepClaimRewards({ const locale = useSelector(localeSelector); invariant(account && account.cosmosResources && transaction, "account and transaction required"); const bridge = getAccountBridge(account, parentAccount); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const updateClaimRewards = useCallback( (newTransaction: Partial) => { onUpdateTransaction(transaction => bridge.updateTransaction(transaction, newTransaction)); diff --git a/apps/ledger-live-desktop/src/renderer/families/cosmos/ClaimRewardsFlowModal/steps/StepConfirmation.tsx b/apps/ledger-live-desktop/src/renderer/families/cosmos/ClaimRewardsFlowModal/steps/StepConfirmation.tsx index 4d65b0231b4a..4c03c3c9f4df 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cosmos/ClaimRewardsFlowModal/steps/StepConfirmation.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cosmos/ClaimRewardsFlowModal/steps/StepConfirmation.tsx @@ -3,7 +3,6 @@ import { Trans } from "react-i18next"; import styled from "styled-components"; import { useSelector } from "react-redux"; import { useCosmosFamilyPreloadData } from "@ledgerhq/live-common/families/cosmos/react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { SyncOneAccountOnMount } from "@ledgerhq/live-common/bridge/react/index"; import TrackPage from "~/renderer/analytics/TrackPage"; @@ -17,6 +16,7 @@ import { OperationDetails } from "~/renderer/drawers/OperationDetails"; import { setDrawer } from "~/renderer/drawers/Provider"; import { StepProps } from "../types"; import { localeSelector } from "~/renderer/reducers/settings"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Container = styled(Box).attrs(() => ({ alignItems: "center", grow: true, @@ -31,8 +31,8 @@ function StepConfirmation({ account, optimisticOperation, error, signed, transac const currencyId = account.currency.id; const { validators } = useCosmosFamilyPreloadData(currencyId); const locale = useSelector(localeSelector); + const unit = useAccountUnit(account); if (optimisticOperation) { - const unit = account && getAccountUnit(account); const validator = transaction && transaction.validators ? transaction.validators[0] : null; const v = validator && diff --git a/apps/ledger-live-desktop/src/renderer/families/cosmos/Delegation/index.tsx b/apps/ledger-live-desktop/src/renderer/families/cosmos/Delegation/index.tsx index 4b82e6e483a4..df155112a242 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cosmos/Delegation/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cosmos/Delegation/index.tsx @@ -3,7 +3,6 @@ import { useDispatch } from "react-redux"; import { Trans } from "react-i18next"; import styled from "styled-components"; import { SubAccount } from "@ledgerhq/types-live"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { useCosmosFamilyPreloadData, useCosmosFamilyMappedDelegations, @@ -29,6 +28,7 @@ import { CosmosAccount } from "@ledgerhq/live-common/families/cosmos/types"; import { DelegationActionsModalName } from "../modals"; import cryptoFactory from "@ledgerhq/live-common/families/cosmos/chain/chain"; import { useLocalizedUrl } from "~/renderer/hooks/useLocalizedUrls"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Wrapper = styled(Box).attrs(() => ({ p: 3, @@ -53,7 +53,7 @@ const Delegation = ({ account }: { account: CosmosAccount }) => { const mappedDelegations = useCosmosFamilyMappedDelegations(account); const currencyId = account.currency.id; const { validators } = useCosmosFamilyPreloadData(currencyId); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const mappedUnbondings = mapUnbondings(unbondings, validators, unit); const onEarnRewards = useCallback(() => { dispatch( diff --git a/apps/ledger-live-desktop/src/renderer/families/cosmos/DelegationFlowModal/fields/ValidatorField.tsx b/apps/ledger-live-desktop/src/renderer/families/cosmos/DelegationFlowModal/fields/ValidatorField.tsx index 6f0c1e70887f..0c1c1dbe16d3 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cosmos/DelegationFlowModal/fields/ValidatorField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cosmos/DelegationFlowModal/fields/ValidatorField.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { useLedgerFirstShuffledValidatorsCosmosFamily } from "@ledgerhq/live-common/families/cosmos/react"; import { CosmosDelegation, @@ -16,6 +15,7 @@ import ScrollLoadingList from "~/renderer/components/ScrollLoadingList"; import Text from "~/renderer/components/Text"; import ValidatorRow from "~/renderer/families/cosmos/shared/components/CosmosFamilyValidatorRow"; import IconAngleDown from "~/renderer/icons/AngleDown"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { t: TFunction; account: Account; @@ -27,7 +27,7 @@ type Props = { const ValidatorField = ({ account, onChangeValidator, chosenVoteAccAddr }: Props) => { const [showAll, setShowAll] = useState(false); const [search, setSearch] = useState(""); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currencyId = account.currency.id; const validators = useLedgerFirstShuffledValidatorsCosmosFamily(currencyId, search); const onSearch = useCallback( diff --git a/apps/ledger-live-desktop/src/renderer/families/cosmos/RedelegationFlowModal/fields/ValidatorField.tsx b/apps/ledger-live-desktop/src/renderer/families/cosmos/RedelegationFlowModal/fields/ValidatorField.tsx index 832e9e915a7e..80cff654098c 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cosmos/RedelegationFlowModal/fields/ValidatorField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cosmos/RedelegationFlowModal/fields/ValidatorField.tsx @@ -2,7 +2,6 @@ import invariant from "invariant"; import React, { useState, useCallback } from "react"; import styled from "styled-components"; import { useLedgerFirstShuffledValidatorsCosmosFamily } from "@ledgerhq/live-common/families/cosmos/react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import Box from "~/renderer/components/Box"; import ValidatorSearchInput from "~/renderer/components/Delegation/ValidatorSearchInput"; import ScrollLoadingList from "~/renderer/components/ScrollLoadingList"; @@ -14,6 +13,7 @@ import { CosmosValidatorItem, Transaction, } from "@ledgerhq/live-common/families/cosmos/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const ValidatorsSection = styled(Box)` width: 100%; height: 100%; @@ -37,7 +37,7 @@ export default function ValidatorField({ [setSearch], ); invariant(cosmosResources, "cosmosResources required"); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const fromValidatorAddress = transaction.sourceValidator; const sortedFilteredValidators = validators.filter( v => v.validatorAddress !== fromValidatorAddress, diff --git a/apps/ledger-live-desktop/src/renderer/families/cosmos/TransactionConfirmFields.tsx b/apps/ledger-live-desktop/src/renderer/families/cosmos/TransactionConfirmFields.tsx index ba8169e373bb..03d5a7adbd4a 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cosmos/TransactionConfirmFields.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cosmos/TransactionConfirmFields.tsx @@ -2,7 +2,7 @@ import invariant from "invariant"; import React, { useMemo } from "react"; import styled from "styled-components"; import { Trans } from "react-i18next"; -import { getAccountUnit, getMainAccount } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import TransactionConfirmField from "~/renderer/components/TransactionConfirm/TransactionConfirmField"; import Text from "~/renderer/components/Text"; import WarnBox from "~/renderer/components/WarnBox"; @@ -18,6 +18,7 @@ import { import FormattedVal from "~/renderer/components/FormattedVal"; import { CosmosFieldComponentProps } from "./types"; import { CosmosAccount, Transaction } from "@ledgerhq/live-common/families/cosmos/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Info = styled(Box).attrs(() => ({ ff: "Inter|SemiBold", color: "palette.text.shade100", @@ -68,7 +69,7 @@ export const CosmosDelegateValidatorsField = ({ field, }: CosmosFieldComponentProps) => { const mainAccount = getMainAccount(account, parentAccount); - const unit = getAccountUnit(mainAccount); + const unit = useAccountUnit(mainAccount); const { validators } = transaction; const currencyId = mainAccount.currency.id; const { validators: cosmosValidators } = useCosmosFamilyPreloadData(currencyId); @@ -145,7 +146,7 @@ export const CosmosValidatorAmountField = ({ }: CosmosFieldComponentProps) => { const mainAccount = getMainAccount(account, parentAccount); invariant(transaction.family === "cosmos", "not a cosmos family transaction"); - const unit = getAccountUnit(mainAccount); + const unit = useAccountUnit(mainAccount); const { validators } = transaction; return validators && validators.length > 0 ? ( diff --git a/apps/ledger-live-desktop/src/renderer/families/cosmos/UndelegationFlowModal/fields/Amount.tsx b/apps/ledger-live-desktop/src/renderer/families/cosmos/UndelegationFlowModal/fields/Amount.tsx index c16bd67ef0a7..4f3fbf5aff11 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cosmos/UndelegationFlowModal/fields/Amount.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cosmos/UndelegationFlowModal/fields/Amount.tsx @@ -1,7 +1,6 @@ import React, { useMemo, useState, useEffect } from "react"; import { BigNumber } from "bignumber.js"; import styled from "styled-components"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { Account } from "@ledgerhq/types-live"; import { CosmosDelegationInfo, @@ -10,6 +9,7 @@ import { import Box from "~/renderer/components/Box"; import InputCurrency from "~/renderer/components/InputCurrency"; import Label from "~/renderer/components/Label"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { amount: BigNumber; @@ -27,7 +27,7 @@ export default function AmountField({ status: { errors, warnings }, label, }: Props) { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const [currentValidator, setCurrentValidator] = useState(validator); const [focused, setFocused] = useState(false); const [initialAmount, setInitialAmount] = useState(validator ? validator.amount : BigNumber(0)); diff --git a/apps/ledger-live-desktop/src/renderer/families/cosmos/UndelegationFlowModal/steps/Confirmation.tsx b/apps/ledger-live-desktop/src/renderer/families/cosmos/UndelegationFlowModal/steps/Confirmation.tsx index f4eeab83a191..9f5c64668e64 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cosmos/UndelegationFlowModal/steps/Confirmation.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cosmos/UndelegationFlowModal/steps/Confirmation.tsx @@ -12,11 +12,11 @@ import RetryButton from "~/renderer/components/RetryButton"; import SuccessDisplay from "~/renderer/components/SuccessDisplay"; import { StepProps } from "../types"; import { useCosmosFamilyPreloadData } from "@ledgerhq/live-common/families/cosmos/react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { localeSelector } from "~/renderer/reducers/settings"; import { OperationDetails } from "~/renderer/drawers/OperationDetails"; import { setDrawer } from "~/renderer/drawers/Provider"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; export default function StepConfirmation({ account, optimisticOperation, @@ -28,8 +28,8 @@ export default function StepConfirmation({ const currencyId = account.currency.id; const { validators } = useCosmosFamilyPreloadData(currencyId); const locale = useSelector(localeSelector); + const unit = useAccountUnit(account); if (optimisticOperation) { - const unit = account && getAccountUnit(account); const validator = transaction && transaction.validators ? transaction.validators[0] : null; const v = validator && diff --git a/apps/ledger-live-desktop/src/renderer/families/cosmos/operationDetails.tsx b/apps/ledger-live-desktop/src/renderer/families/cosmos/operationDetails.tsx index f69387e86c34..5eb6c205eb63 100644 --- a/apps/ledger-live-desktop/src/renderer/families/cosmos/operationDetails.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/cosmos/operationDetails.tsx @@ -1,5 +1,5 @@ /* eslint-disable consistent-return */ -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { getAddressExplorer, getDefaultExplorerView } from "@ledgerhq/live-common/explorers"; import cryptoFactory from "@ledgerhq/live-common/families/cosmos/chain/chain"; @@ -34,6 +34,7 @@ import { import { openURL } from "~/renderer/linking"; import { localeSelector } from "~/renderer/reducers/settings"; import { AmountCellExtraProps, OperationDetailsExtraProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; function getURLFeesInfo({ op, @@ -124,7 +125,7 @@ const OperationDetailsExtra = ({ type, account, }: OperationDetailsExtraProps) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); const discreet = useDiscreetMode(); const locale = useSelector(localeSelector); diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/AccountBalanceSummaryFooter.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/AccountBalanceSummaryFooter.tsx index f46fce7bc02e..5f7344795acc 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/AccountBalanceSummaryFooter.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/AccountBalanceSummaryFooter.tsx @@ -1,5 +1,4 @@ import React, { useState, useEffect, useMemo, useCallback } from "react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { BigNumber } from "bignumber.js"; import { useSelector } from "react-redux"; @@ -18,6 +17,7 @@ import { import { DelegationType } from "./types"; import { ElrondAccount } from "@ledgerhq/live-common/families/elrond/types"; import { SubAccount } from "@ledgerhq/types-live"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; interface BalanceType { tooltip: string; @@ -34,7 +34,7 @@ const Summary = (props: { account: ElrondAccount }) => { ); const discreet = useDiscreetMode(); const locale = useSelector(localeSelector); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const fetchDelegations = useCallback(() => { setBalance(account.spendableBalance); setDelegationResources(account.elrondResources ? account.elrondResources.delegations : []); diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Delegations/components/Delegation/index.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Delegations/components/Delegation/index.tsx index c8867dc5d9d9..105243ea3c09 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Delegations/components/Delegation/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Delegations/components/Delegation/index.tsx @@ -3,7 +3,6 @@ import { BigNumber } from "bignumber.js"; import { Trans } from "react-i18next"; import { useDispatch } from "react-redux"; import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import Box from "~/renderer/components/Box/Box"; import CheckCircle from "~/renderer/icons/CheckCircle"; import ToolTip from "~/renderer/components/Tooltip"; @@ -27,6 +26,7 @@ import { } from "@ledgerhq/live-common/families/elrond/types"; import { ModalsData } from "~/renderer/families/elrond/modals"; import Discreet from "~/renderer/components/Discreet"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; interface RenderDropdownItemType { isActive: boolean; @@ -141,6 +141,8 @@ const Delegation = (props: Props) => { }), [claimableRewards], ); + + const unit = useAccountUnit(account); return ( { - {amount} {getAccountUnit(account).code} + {amount} {unit.code} - {rewards} {getAccountUnit(account).code} + {rewards} {unit.code} diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/fields/DelegationSelectorField.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/fields/DelegationSelectorField.tsx index 2a2352ace7fb..9828cffeafb8 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/fields/DelegationSelectorField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/fields/DelegationSelectorField.tsx @@ -45,7 +45,7 @@ const renderItem = (item: { data: OptionType }) => { - {balance} {"EGLD"} {/* FIXME Should be getAccountUnit(account).code */} + {balance} {"EGLD"} ); diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/steps/StepClaimRewards.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/steps/StepClaimRewards.tsx index 1c8456230b0b..969b9ee9e00e 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/steps/StepClaimRewards.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/steps/StepClaimRewards.tsx @@ -4,7 +4,6 @@ import { BigNumber } from "bignumber.js"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate"; import invariant from "invariant"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import TrackPage from "~/renderer/analytics/TrackPage"; import Box from "~/renderer/components/Box"; import Button from "~/renderer/components/Button"; @@ -15,6 +14,7 @@ import ErrorBanner from "~/renderer/components/ErrorBanner"; import AccountFooter from "~/renderer/modals/Send/AccountFooter"; import { ElrondTransactionMode, Transaction } from "@ledgerhq/live-common/families/elrond/types"; import { StepProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const StepClaimRewards = (props: StepProps) => { const { @@ -57,6 +57,7 @@ const StepClaimRewards = (props: StepProps) => { }, [updateClaimRewards, transaction], ); + const unit = useAccountUnit(account); if (!transaction) return null; const key = transaction.mode === "claimRewards" ? "claimInfo" : "compoundInfo"; return ( @@ -80,7 +81,7 @@ const StepClaimRewards = (props: StepProps) => { amount: `${denominate({ input: String(transaction.amount), decimals: 4, - })} ${getAccountUnit(account).code}`, + })} ${unit.code}`, }} > diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/steps/StepConfirmation.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/steps/StepConfirmation.tsx index 0644f8473c57..32cf14dd9720 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/steps/StepConfirmation.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Claim/steps/StepConfirmation.tsx @@ -3,7 +3,6 @@ import { Trans } from "react-i18next"; import styled from "styled-components"; import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate"; import { SyncOneAccountOnMount } from "@ledgerhq/live-common/bridge/react/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import TrackPage from "~/renderer/analytics/TrackPage"; import Box from "~/renderer/components/Box"; import Button from "~/renderer/components/Button"; @@ -14,6 +13,7 @@ import BroadcastErrorDisclaimer from "~/renderer/components/BroadcastErrorDiscla import { OperationDetails } from "~/renderer/drawers/OperationDetails"; import { setDrawer } from "~/renderer/drawers/Provider"; import { StepProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Container = styled(Box).attrs(() => ({ alignItems: "center", @@ -26,13 +26,15 @@ const Container = styled(Box).attrs(() => ({ `; const StepConfirmation = (props: StepProps) => { const { optimisticOperation, error, signed, account, transaction, validators } = props; + + const unit = useAccountUnit(account); if (optimisticOperation) { const provider: string | undefined = transaction && transaction.recipient; const v = provider ? validators?.find(validator => validator.contract === provider) : undefined; const amount = `${denominate({ input: String(transaction?.amount), decimals: 4, - })} ${getAccountUnit(account).code || "EGLD"}`; + })} ${unit.code || "EGLD"}`; const titleKey = transaction?.mode === "claimRewards" ? "title" : "titleCompound"; const textKey = transaction?.mode === "claimRewards" ? "text" : "textCompound"; return ( diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Delegate/fields/ValidatorList.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Delegate/fields/ValidatorList.tsx index 15f177178462..a860b111f25a 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Delegate/fields/ValidatorList.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Delegate/fields/ValidatorList.tsx @@ -1,5 +1,4 @@ import React, { useState, useMemo, Fragment, useCallback } from "react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { Trans } from "react-i18next"; import styled from "styled-components"; import Box from "~/renderer/components/Box"; @@ -15,6 +14,7 @@ import { ElrondProvider, Transaction, } from "@ledgerhq/live-common/families/elrond/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const ValidatorsFieldContainer = styled(Box)` border: 1px solid ${p => p.theme.colors.palette.divider}; @@ -50,7 +50,7 @@ const ValidatorList = (props: Props) => { const { account, validators, onSelectValidator, transaction } = props; const [showAll, setShowAll] = useState(false); const [search, setSearch] = useState(""); - const unit = useMemo(() => getAccountUnit(account), [account]); + const unit = useAccountUnit(account); const providers = useSearchValidators(validators, search); const defaultValidator = useMemo( () => diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/fields/Amount.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/fields/Amount.tsx index 1fbc9a124a7b..7ecaf45db871 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/fields/Amount.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/fields/Amount.tsx @@ -6,8 +6,8 @@ import InputCurrency from "~/renderer/components/InputCurrency"; import Label from "~/renderer/components/Label"; import TranslatedError from "~/renderer/components/TranslatedError"; import { Unit } from "@ledgerhq/types-cryptoassets"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { ElrondAccount, TransactionStatus } from "@ledgerhq/live-common/families/elrond/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const InputLeft = styled(Box).attrs(() => ({ ff: "Inter|Medium", @@ -96,7 +96,7 @@ const AmountField = (props: Props) => { status: { errors, warnings }, label, } = props; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const [focused, setFocused] = useState(false); const onAmountChange = (amount: BigNumber, unit?: Unit) => { onChange(amount, unit); @@ -142,7 +142,7 @@ const AmountField = (props: Props) => { value={amount} onChange={onAmountChange} onChangeFocus={() => setFocused(true)} - renderLeft={{getAccountUnit(account).code}} + renderLeft={{unit.code}} renderRight={ {options.map(({ label, value }) => ( diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/fields/Validator.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/fields/Validator.tsx index 09e11ef6c7b6..dc5dcf489306 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/fields/Validator.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/fields/Validator.tsx @@ -41,7 +41,7 @@ const Item = (item: { data: DelegationType }) => { - {amount} {"EGLD"} {/* FIXME Should be getAccountUnit(account).code */} + {amount} {"EGLD"} ); diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/steps/Confirmation.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/steps/Confirmation.tsx index f1c23aa43e93..78c2548d252f 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/steps/Confirmation.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Undelegate/steps/Confirmation.tsx @@ -3,7 +3,6 @@ import { useTranslation, Trans } from "react-i18next"; import styled from "styled-components"; import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate"; import { SyncOneAccountOnMount } from "@ledgerhq/live-common/bridge/react/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import TrackPage from "~/renderer/analytics/TrackPage"; import Box from "~/renderer/components/Box"; import BroadcastErrorDisclaimer from "~/renderer/components/BroadcastErrorDisclaimer"; @@ -14,6 +13,7 @@ import SuccessDisplay from "~/renderer/components/SuccessDisplay"; import { OperationDetails } from "~/renderer/drawers/OperationDetails"; import { setDrawer } from "~/renderer/drawers/Provider"; import { StepProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Container = styled(Box).attrs(() => ({ alignItems: "center", @@ -27,13 +27,14 @@ const Container = styled(Box).attrs(() => ({ const StepConfirmation = (props: StepProps) => { const { optimisticOperation, error, signed, account, transaction, validators } = props; const { t } = useTranslation(); + const unit = useAccountUnit(account); if (optimisticOperation && transaction) { const provider: string | undefined = transaction && transaction.recipient; const v = provider ? validators.find(validator => validator.contract === provider) : undefined; const amount = `${denominate({ input: String(transaction.amount), decimals: 4, - })} ${getAccountUnit(account).code || "EGLD"}`; + })} ${unit.code || "EGLD"}`; return ( { - {balance} {"EGLD"} {/* FIXME Should be getAccountUnit(account).code */} + {balance} {"EGLD"} ); diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Withdraw/steps/StepConfirmation.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Withdraw/steps/StepConfirmation.tsx index 1b6d060f73d3..a255f29042dc 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Withdraw/steps/StepConfirmation.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Modals/Withdraw/steps/StepConfirmation.tsx @@ -3,7 +3,6 @@ import { Trans } from "react-i18next"; import styled from "styled-components"; import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate"; import { SyncOneAccountOnMount } from "@ledgerhq/live-common/bridge/react/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import TrackPage from "~/renderer/analytics/TrackPage"; import Box from "~/renderer/components/Box"; import Button from "~/renderer/components/Button"; @@ -14,6 +13,7 @@ import BroadcastErrorDisclaimer from "~/renderer/components/BroadcastErrorDiscla import { OperationDetails } from "~/renderer/drawers/OperationDetails"; import { setDrawer } from "~/renderer/drawers/Provider"; import { StepProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Container = styled(Box).attrs(() => ({ alignItems: "center", grow: true, @@ -25,11 +25,12 @@ const Container = styled(Box).attrs(() => ({ `; const StepConfirmation = (props: StepProps) => { const { optimisticOperation, error, signed, account, transaction } = props; + const unit = useAccountUnit(account); if (optimisticOperation && account && transaction) { const amount = `${denominate({ input: String(transaction.amount), decimals: 4, - })} ${getAccountUnit(account).code || "EGLD"}`; + })} ${unit.code || "EGLD"}`; return ( { const { @@ -28,6 +28,7 @@ const StepWithdraw = (props: StepProps) => { amount, name, } = props; + const unit = useAccountUnit(account); const bridge: AccountBridge = getAccountBridge(account); const onDelegationChange = useCallback( // @ts-expect-error another TS puzzle for another day @@ -63,7 +64,7 @@ const StepWithdraw = (props: StepProps) => { amount: `${denominate({ input: String(transaction.amount), decimals: 4, - })} ${getAccountUnit(account).code}`, + })} ${unit.code}`, }} > diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Unbondings/components/Unbonding/index.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Unbondings/components/Unbonding/index.tsx index 28206130c9a8..28b09d355699 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/components/Unbondings/components/Unbonding/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/components/Unbondings/components/Unbonding/index.tsx @@ -1,7 +1,6 @@ import React, { useState, useCallback, useMemo, useEffect } from "react"; import { Trans } from "react-i18next"; import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { useDispatch } from "react-redux"; import Box from "~/renderer/components/Box/Box"; import ExclamationCircleThin from "~/renderer/icons/ExclamationCircleThin"; @@ -19,6 +18,7 @@ import { } from "@ledgerhq/live-common/families/elrond/constants"; import { ElrondAccount } from "@ledgerhq/live-common/families/elrond/types"; import Discreet from "~/renderer/components/Discreet"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; // FIXME spreading UnbondingType is a bad pattern const Unbonding = ( @@ -75,6 +75,9 @@ const Unbonding = ( }), ); }, [account, contract, unbondings, amount, validator, dispatch]); + + const unit = useAccountUnit(account); + useEffect(handleCounter, [seconds]); return ( @@ -103,7 +106,7 @@ const Unbonding = ( - {balance} {getAccountUnit(account).code} + {balance} {unit.code} diff --git a/apps/ledger-live-desktop/src/renderer/families/elrond/operationDetails.tsx b/apps/ledger-live-desktop/src/renderer/families/elrond/operationDetails.tsx index d17247a1ac9b..5f1924e2d772 100644 --- a/apps/ledger-live-desktop/src/renderer/families/elrond/operationDetails.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/elrond/operationDetails.tsx @@ -1,6 +1,5 @@ /* eslint-disable consistent-return */ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { ELROND_EXPLORER_URL, @@ -30,6 +29,7 @@ import { import { openURL } from "~/renderer/linking"; import { localeSelector } from "~/renderer/reducers/settings"; import { AmountCellExtraProps, OperationDetailsExtraProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const getURLFeesInfo = ({ op }: { op: Operation; currencyId: string }): string | undefined => { if (op.fee.gt(200000)) { @@ -61,6 +61,8 @@ const OperationDetailsDelegation = (props: OperationDetailsDelegationProps) => { const formattedValidator: ElrondProvider | undefined = validators.find( v => v.contract === operation.contract, ); + + const unit = useAccountUnit(account); return ( {!isTransactionField && ( @@ -80,7 +82,7 @@ const OperationDetailsDelegation = (props: OperationDetailsDelegationProps) => { votes: `${denominate({ input: operation.extra.amount?.toString() ?? "", decimals: 4, - })} ${getAccountUnit(account).code}`, + })} ${unit.code}`, name: formattedValidator?.identity.name || operation.contract, }} > @@ -101,7 +103,7 @@ const OperationDetailsDelegation = (props: OperationDetailsDelegationProps) => { const OperationDetailsExtra = (props: OperationDetailsExtraProps) => { const { type, account, operation } = props; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const discreet = useDiscreetMode(); const locale = useSelector(localeSelector); const { validators } = useElrondPreloadData(); diff --git a/apps/ledger-live-desktop/src/renderer/families/evm/SendAmountFields/SelectFeeStrategy.tsx b/apps/ledger-live-desktop/src/renderer/families/evm/SendAmountFields/SelectFeeStrategy.tsx index 06d6a5e520ed..d2c73720d566 100644 --- a/apps/ledger-live-desktop/src/renderer/families/evm/SendAmountFields/SelectFeeStrategy.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/evm/SendAmountFields/SelectFeeStrategy.tsx @@ -6,7 +6,7 @@ import { GasOptions, Strategy, } from "@ledgerhq/coin-evm/types/index"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { Account } from "@ledgerhq/types-live"; import React, { memo, useMemo } from "react"; import { Trans } from "react-i18next"; @@ -20,6 +20,7 @@ import TachometerHigh from "~/renderer/icons/TachometerHigh"; import TachometerLow from "~/renderer/icons/TachometerLow"; import TachometerMedium from "~/renderer/icons/TachometerMedium"; import { TransactionStatus } from "@ledgerhq/live-common/generated/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { onClick: (_: { feesStrategy: Strategy }) => void; @@ -96,7 +97,7 @@ const SelectFeeStrategy = ({ transactionToUpdate, status, }: Props) => { - const accountUnit = getAccountUnit(account); + const accountUnit = useAccountUnit(account); const feesCurrency = getAccountCurrency(account); const { errors } = status; const { gasPrice: messageGas } = errors; diff --git a/apps/ledger-live-desktop/src/renderer/families/hedera/StepReceiveFunds.tsx b/apps/ledger-live-desktop/src/renderer/families/hedera/StepReceiveFunds.tsx index 8db6b09d87b3..ae2325ace9df 100644 --- a/apps/ledger-live-desktop/src/renderer/families/hedera/StepReceiveFunds.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/hedera/StepReceiveFunds.tsx @@ -1,7 +1,7 @@ import React, { useRef, useCallback, useState } from "react"; import { Trans } from "react-i18next"; import invariant from "invariant"; -import { getMainAccount, getAccountName } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import styled from "styled-components"; import TrackPage from "~/renderer/analytics/TrackPage"; import Box from "~/renderer/components/Box"; @@ -17,6 +17,7 @@ import QRCode from "~/renderer/components/QRCode"; import AccountTagDerivationMode from "~/renderer/components/AccountTagDerivationMode"; import { StepProps } from "~/renderer/modals/Receive/Body"; import { AccountLike } from "@ledgerhq/types-live"; +import { useAccountName } from "~/renderer/reducers/wallet"; const QRCodeWrapper = styled.div` border: 24px solid white; height: 208px; @@ -74,13 +75,12 @@ const StepReceiveFunds = ({ transitionTo, onResetSkip, verifyAddressError, - token, eventType, currencyName, }: StepProps) => { const mainAccount = account ? getMainAccount(account, parentAccount) : null; invariant(account && mainAccount, "No account given"); - const name = token ? token.name : getAccountName(account); + const name = useAccountName(account); const initialDevice = useRef(device); const address = mainAccount.freshAddress; const [modalVisible, setModalVisible] = useState(false); diff --git a/apps/ledger-live-desktop/src/renderer/families/near/AccountBalanceSummaryFooter.tsx b/apps/ledger-live-desktop/src/renderer/families/near/AccountBalanceSummaryFooter.tsx index 4fc3bfe976ea..f888d9aa626a 100644 --- a/apps/ledger-live-desktop/src/renderer/families/near/AccountBalanceSummaryFooter.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/near/AccountBalanceSummaryFooter.tsx @@ -2,7 +2,6 @@ import React from "react"; import styled from "styled-components"; import { useSelector } from "react-redux"; import { Trans } from "react-i18next"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { localeSelector } from "~/renderer/reducers/settings"; import Discreet, { useDiscreetMode } from "~/renderer/components/Discreet"; @@ -11,6 +10,7 @@ import Text from "~/renderer/components/Text"; import InfoCircle from "~/renderer/icons/InfoCircle"; import ToolTip from "~/renderer/components/Tooltip"; import { NearFamily } from "./types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Wrapper = styled(Box).attrs(() => ({ horizontal: true, @@ -50,7 +50,10 @@ const AmountValue = styled(Text).attrs(() => ({ const AccountBalanceSummaryFooter: NearFamily["AccountBalanceSummaryFooter"] = ({ account }) => { const discreet = useDiscreetMode(); const locale = useSelector(localeSelector); + const unit = useAccountUnit(account); + if (account.type !== "Account") return null; + const { spendableBalance: _spendableBalance, nearResources: { @@ -60,7 +63,7 @@ const AccountBalanceSummaryFooter: NearFamily["AccountBalanceSummaryFooter"] = ( pendingBalance: _pendingBalance, }, } = account; - const unit = getAccountUnit(account); + const formatConfig = { alwaysShowSign: false, showCode: true, diff --git a/apps/ledger-live-desktop/src/renderer/families/near/StakingFlowModal/fields/ValidatorField.tsx b/apps/ledger-live-desktop/src/renderer/families/near/StakingFlowModal/fields/ValidatorField.tsx index c92886e852c9..50c6d5787b12 100644 --- a/apps/ledger-live-desktop/src/renderer/families/near/StakingFlowModal/fields/ValidatorField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/near/StakingFlowModal/fields/ValidatorField.tsx @@ -1,5 +1,4 @@ import React, { useState, useCallback } from "react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { useLedgerFirstShuffledValidatorsNear } from "@ledgerhq/live-common/families/near/react"; import styled from "styled-components"; import Box from "~/renderer/components/Box"; @@ -14,6 +13,7 @@ import ValidatorRow from "~/renderer/families/near/shared/components/ValidatorRo import { Account } from "@ledgerhq/types-live"; import { NearValidatorItem } from "@ledgerhq/live-common/families/near/types"; import { FIGMENT_NEAR_VALIDATOR_ADDRESS } from "@ledgerhq/live-common/families/near/constants"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { account: Account; onChangeValidator: (a: { address: string }) => void; @@ -23,7 +23,7 @@ type Props = { const ValidatorField = ({ account, onChangeValidator, chosenVoteAccAddr }: Props) => { const [search, setSearch] = useState(""); const [showAll, setShowAll] = useState(false); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const validators = useLedgerFirstShuffledValidatorsNear(search); const renderItem = (validator: NearValidatorItem) => { return ( diff --git a/apps/ledger-live-desktop/src/renderer/families/near/UnstakingFlowModal/fields/Amount.tsx b/apps/ledger-live-desktop/src/renderer/families/near/UnstakingFlowModal/fields/Amount.tsx index 561b67e3061b..03c4a2239174 100644 --- a/apps/ledger-live-desktop/src/renderer/families/near/UnstakingFlowModal/fields/Amount.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/near/UnstakingFlowModal/fields/Amount.tsx @@ -1,12 +1,12 @@ import React, { useMemo, useState, useEffect } from "react"; import { BigNumber } from "bignumber.js"; import styled from "styled-components"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { Account } from "@ledgerhq/types-live"; import Box from "~/renderer/components/Box"; import InputCurrency from "~/renderer/components/InputCurrency"; import Label from "~/renderer/components/Label"; import { TransactionStatus } from "@ledgerhq/live-common/families/near/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { amount: BigNumber; @@ -27,7 +27,7 @@ export default function AmountField({ status: { errors, warnings }, label, }: Props) { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const [currentValidator, setCurrentValidator] = useState(validator); const [focused, setFocused] = useState(false); const [initialAmount, setInitialAmount] = useState(validator ? validator.amount : BigNumber(0)); diff --git a/apps/ledger-live-desktop/src/renderer/families/near/UnstakingFlowModal/steps/Confirmation.tsx b/apps/ledger-live-desktop/src/renderer/families/near/UnstakingFlowModal/steps/Confirmation.tsx index bfcd4c22fc2a..2455a94dd16f 100644 --- a/apps/ledger-live-desktop/src/renderer/families/near/UnstakingFlowModal/steps/Confirmation.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/near/UnstakingFlowModal/steps/Confirmation.tsx @@ -11,11 +11,11 @@ import ErrorDisplay from "~/renderer/components/ErrorDisplay"; import RetryButton from "~/renderer/components/RetryButton"; import SuccessDisplay from "~/renderer/components/SuccessDisplay"; import { StepProps } from "../types"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { localeSelector } from "~/renderer/reducers/settings"; import { OperationDetails } from "~/renderer/drawers/OperationDetails"; import { setDrawer } from "~/renderer/drawers/Provider"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; export default function StepConfirmation({ account, optimisticOperation, @@ -25,8 +25,8 @@ export default function StepConfirmation({ }: StepProps) { const { t } = useTranslation(); const locale = useSelector(localeSelector); + const unit = useAccountUnit(account); if (optimisticOperation) { - const unit = account && getAccountUnit(account); const amount = unit && transaction && diff --git a/apps/ledger-live-desktop/src/renderer/families/near/WithdrawingFlowModal/fields/Amount.tsx b/apps/ledger-live-desktop/src/renderer/families/near/WithdrawingFlowModal/fields/Amount.tsx index 561b67e3061b..03c4a2239174 100644 --- a/apps/ledger-live-desktop/src/renderer/families/near/WithdrawingFlowModal/fields/Amount.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/near/WithdrawingFlowModal/fields/Amount.tsx @@ -1,12 +1,12 @@ import React, { useMemo, useState, useEffect } from "react"; import { BigNumber } from "bignumber.js"; import styled from "styled-components"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { Account } from "@ledgerhq/types-live"; import Box from "~/renderer/components/Box"; import InputCurrency from "~/renderer/components/InputCurrency"; import Label from "~/renderer/components/Label"; import { TransactionStatus } from "@ledgerhq/live-common/families/near/types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { amount: BigNumber; @@ -27,7 +27,7 @@ export default function AmountField({ status: { errors, warnings }, label, }: Props) { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const [currentValidator, setCurrentValidator] = useState(validator); const [focused, setFocused] = useState(false); const [initialAmount, setInitialAmount] = useState(validator ? validator.amount : BigNumber(0)); diff --git a/apps/ledger-live-desktop/src/renderer/families/near/WithdrawingFlowModal/steps/Confirmation.tsx b/apps/ledger-live-desktop/src/renderer/families/near/WithdrawingFlowModal/steps/Confirmation.tsx index decfa33c8505..1a5033b8ff61 100644 --- a/apps/ledger-live-desktop/src/renderer/families/near/WithdrawingFlowModal/steps/Confirmation.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/near/WithdrawingFlowModal/steps/Confirmation.tsx @@ -11,11 +11,11 @@ import ErrorDisplay from "~/renderer/components/ErrorDisplay"; import RetryButton from "~/renderer/components/RetryButton"; import SuccessDisplay from "~/renderer/components/SuccessDisplay"; import { StepProps } from "../types"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { localeSelector } from "~/renderer/reducers/settings"; import { OperationDetails } from "~/renderer/drawers/OperationDetails"; import { setDrawer } from "~/renderer/drawers/Provider"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; export default function StepConfirmation({ account, optimisticOperation, @@ -25,8 +25,8 @@ export default function StepConfirmation({ }: StepProps) { const { t } = useTranslation(); const locale = useSelector(localeSelector); + const unit = useAccountUnit(account); if (optimisticOperation) { - const unit = account && getAccountUnit(account); const amount = unit && transaction && diff --git a/apps/ledger-live-desktop/src/renderer/families/near/operationDetails.tsx b/apps/ledger-live-desktop/src/renderer/families/near/operationDetails.tsx index fb3db0aa9a5e..6225e671f1c4 100644 --- a/apps/ledger-live-desktop/src/renderer/families/near/operationDetails.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/near/operationDetails.tsx @@ -11,6 +11,7 @@ import { import { AmountCellExtraProps, OperationDetailsExtraProps } from "../types"; import { NearAccount } from "@ledgerhq/live-common/families/near/types"; import { Operation } from "@ledgerhq/types-live"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const AmountCellExtra = ({ operation, currency, unit }: AmountCellExtraProps) => { const amount = operation.value; @@ -38,6 +39,7 @@ const OperationDetailsExtra = ({ account, }: OperationDetailsExtraProps) => { const amount = operation.value; + const unit = useAccountUnit(account); let i18nKey = ""; if (type === "STAKE") { i18nKey = "near.operationDetails.extra.stakedAmount"; @@ -53,7 +55,7 @@ const OperationDetailsExtra = ({ - + ({ horizontal: true, @@ -66,6 +66,7 @@ const AccountBalanceSummaryFooter = ({ account }: Props) => { const discreet = useDiscreetMode(); const locale = useSelector(localeSelector); const preloaded = usePolkadotPreloadData(); + const unit = useAccountUnit(account); if (account.type !== "Account") return null; const { spendableBalance: _spendableBalance, polkadotResources } = account; const { @@ -75,7 +76,7 @@ const AccountBalanceSummaryFooter = ({ account }: Props) => { } = polkadotResources; const minimumBondBalance = BigNumber(preloaded.minimumBondBalance); const hasMinBondBalance = hasMinimumBondBalance(account); - const unit = getAccountUnit(account); + const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/apps/ledger-live-desktop/src/renderer/families/polkadot/BondFlowModal/fields/AmountField.tsx b/apps/ledger-live-desktop/src/renderer/families/polkadot/BondFlowModal/fields/AmountField.tsx index 211b9c22a2af..d90b00e246d2 100644 --- a/apps/ledger-live-desktop/src/renderer/families/polkadot/BondFlowModal/fields/AmountField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/polkadot/BondFlowModal/fields/AmountField.tsx @@ -4,7 +4,6 @@ import { Trans } from "react-i18next"; import styled from "styled-components"; import { BigNumber } from "bignumber.js"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { Account } from "@ledgerhq/types-live"; import { Transaction, TransactionStatus } from "@ledgerhq/live-common/families/polkadot/types"; import SpendableAmount from "~/renderer/components/SpendableAmount"; @@ -13,6 +12,7 @@ import Box from "~/renderer/components/Box"; import InputCurrency from "~/renderer/components/InputCurrency"; import Switch from "~/renderer/components/Switch"; import Text from "~/renderer/components/Text"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const InputRight = styled(Box).attrs(() => ({ ff: "Inter|Medium", color: "palette.text.shade60", @@ -43,7 +43,7 @@ const AmountField = ({ }: Props) => { invariant(account && transaction && account.spendableBalance, "account and transaction required"); const bridge = getAccountBridge(account, parentAccount); - const defaultUnit = getAccountUnit(account); + const defaultUnit = useAccountUnit(account); const onChange = useCallback( (value: BigNumber) => { onChangeTransaction( diff --git a/apps/ledger-live-desktop/src/renderer/families/polkadot/Nomination/Row.tsx b/apps/ledger-live-desktop/src/renderer/families/polkadot/Nomination/Row.tsx index edf67216bd3a..5edab48fe480 100644 --- a/apps/ledger-live-desktop/src/renderer/families/polkadot/Nomination/Row.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/polkadot/Nomination/Row.tsx @@ -1,7 +1,6 @@ import React, { useCallback, useMemo } from "react"; import styled from "styled-components"; import { Trans } from "react-i18next"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { PolkadotValidator, @@ -19,6 +18,7 @@ import ToolTip from "~/renderer/components/Tooltip"; import ExternalLink from "~/renderer/icons/ExternalLink"; import FirstLetterIcon from "~/renderer/components/FirstLetterIcon"; import { useDateFromNow } from "~/renderer/hooks/useDateFormatter"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Wrapper = styled.div` display: flex; @@ -91,7 +91,7 @@ export function Row({ const name = validator?.identity || address; const total = validator?.totalBonded ?? null; const commission = validator?.commission ?? null; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formattedAmount = useMemo( () => value && (status === "active" || status === "inactive") @@ -201,7 +201,7 @@ export function UnlockingRow({ [completionDate], ); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formattedAmount = useMemo( () => formatCurrencyUnit(unit, amount, { diff --git a/apps/ledger-live-desktop/src/renderer/families/polkadot/Nomination/index.tsx b/apps/ledger-live-desktop/src/renderer/families/polkadot/Nomination/index.tsx index 75d4f9e5b020..3512ff566e3c 100644 --- a/apps/ledger-live-desktop/src/renderer/families/polkadot/Nomination/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/polkadot/Nomination/index.tsx @@ -3,7 +3,6 @@ import invariant from "invariant"; import { useDispatch, useSelector } from "react-redux"; import { Trans } from "react-i18next"; import styled from "styled-components"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { hasExternalController, @@ -44,6 +43,7 @@ import { PolkadotValidator, } from "@ledgerhq/live-common/families/polkadot/types"; import { SubAccount } from "@ledgerhq/types-live"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { account: PolkadotAccount | SubAccount; @@ -66,7 +66,7 @@ export type NominationValidator = const Nomination = ({ account }: { account: PolkadotAccount }) => { const discreet = useDiscreetMode(); const locale = useSelector(localeSelector); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const dispatch = useDispatch(); const { staking, validators } = usePolkadotPreloadData(); const { polkadotResources } = account; diff --git a/apps/ledger-live-desktop/src/renderer/families/polkadot/NominationFlowModal/fields/ValidatorsField.tsx b/apps/ledger-live-desktop/src/renderer/families/polkadot/NominationFlowModal/fields/ValidatorsField.tsx index 05bdefd8804b..8419a248e509 100644 --- a/apps/ledger-live-desktop/src/renderer/families/polkadot/NominationFlowModal/fields/ValidatorsField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/polkadot/NominationFlowModal/fields/ValidatorsField.tsx @@ -4,7 +4,6 @@ import React, { useCallback, useState, useRef, useEffect } from "react"; import { TFunction } from "i18next"; import { Trans } from "react-i18next"; import styled from "styled-components"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { getDefaultExplorerView, getAddressExplorer } from "@ledgerhq/live-common/explorers"; import { @@ -38,6 +37,7 @@ import Alert from "~/renderer/components/Alert"; // Specific Validator Row import ValidatorRow from "./ValidatorRow"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const DrawerWrapper = styled(Box).attrs(() => ({ horizontal: true, alignItems: "center", @@ -114,7 +114,7 @@ const ValidatorField = ({ const [search, setSearch] = useState(""); const { polkadotResources } = account; invariant(polkadotResources && nominations, "polkadot transaction required"); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/apps/ledger-live-desktop/src/renderer/families/polkadot/RebondFlowModal/fields/AmountField.tsx b/apps/ledger-live-desktop/src/renderer/families/polkadot/RebondFlowModal/fields/AmountField.tsx index 88fdf1407dd8..19deab9cb6f8 100644 --- a/apps/ledger-live-desktop/src/renderer/families/polkadot/RebondFlowModal/fields/AmountField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/polkadot/RebondFlowModal/fields/AmountField.tsx @@ -5,7 +5,6 @@ import { TFunction } from "i18next"; import styled from "styled-components"; import { BigNumber } from "bignumber.js"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { PolkadotAccount, Transaction, @@ -17,6 +16,7 @@ import Box from "~/renderer/components/Box"; import InputCurrency from "~/renderer/components/InputCurrency"; import Switch from "~/renderer/components/Switch"; import Text from "~/renderer/components/Text"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const InputRight = styled(Box).attrs(() => ({ ff: "Inter|Medium", @@ -43,7 +43,7 @@ type Props = { const AmountField = ({ account, onChangeTransaction, transaction, status }: Props) => { invariant(account && transaction && account.spendableBalance, "account and transaction required"); const bridge = getAccountBridge(account); - const defaultUnit = getAccountUnit(account); + const defaultUnit = useAccountUnit(account); const onChange = useCallback( (value: BigNumber) => { onChangeTransaction( diff --git a/apps/ledger-live-desktop/src/renderer/families/polkadot/UnbondFlowModal/fields/AmountField.tsx b/apps/ledger-live-desktop/src/renderer/families/polkadot/UnbondFlowModal/fields/AmountField.tsx index 7767a86e5bd0..ee03a79dcf1a 100644 --- a/apps/ledger-live-desktop/src/renderer/families/polkadot/UnbondFlowModal/fields/AmountField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/polkadot/UnbondFlowModal/fields/AmountField.tsx @@ -4,7 +4,6 @@ import { TFunction } from "i18next"; import styled from "styled-components"; import { BigNumber } from "bignumber.js"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { PolkadotAccount, Transaction, @@ -16,6 +15,7 @@ import Box from "~/renderer/components/Box"; import InputCurrency from "~/renderer/components/InputCurrency"; import Switch from "~/renderer/components/Switch"; import Text from "~/renderer/components/Text"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const InputRight = styled(Box).attrs(() => ({ ff: "Inter|Medium", color: "palette.text.shade60", @@ -40,7 +40,7 @@ type Props = { }; const AmountField = ({ account, onChangeTransaction, transaction, status }: Props) => { const bridge = getAccountBridge(account); - const defaultUnit = getAccountUnit(account); + const defaultUnit = useAccountUnit(account); const onChange = useCallback( (value: BigNumber) => { onChangeTransaction( diff --git a/apps/ledger-live-desktop/src/renderer/families/polkadot/operationDetails.tsx b/apps/ledger-live-desktop/src/renderer/families/polkadot/operationDetails.tsx index cf62c27cc830..665f63d45eb7 100644 --- a/apps/ledger-live-desktop/src/renderer/families/polkadot/operationDetails.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/polkadot/operationDetails.tsx @@ -24,6 +24,7 @@ import { useDiscreetMode } from "~/renderer/components/Discreet"; import { urls } from "~/config/urls"; import { SplitAddress } from "~/renderer/components/OperationsList/AddressCell"; import { AmountCellExtraProps, OperationDetailsExtraProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; function getURLFeesInfo({ op, @@ -152,6 +153,8 @@ const OperationDetailsExtra = ({ account, }: OperationDetailsExtraProps) => { const { extra } = operation; + + const unit = useAccountUnit(account); switch (type) { case "OUT": case "IN": @@ -166,7 +169,7 @@ const OperationDetailsExtra = ({ ({ horizontal: true, @@ -55,7 +55,10 @@ type Props = { const AccountBalanceSummaryFooter = ({ account }: Props) => { const discreet = useDiscreetMode(); const locale = useSelector(localeSelector); + const unit = useAccountUnit(account); + if (account.type !== "Account") return null; + const { spendableBalance: _spendableBalance, solanaResources } = account; const { stakes } = solanaResources; const _delegatedBalance = new BigNumber( @@ -64,7 +67,6 @@ const AccountBalanceSummaryFooter = ({ account }: Props) => { const _delegatedWithdrawableBalance = new BigNumber( stakes.reduce((sum, s) => sum + s.withdrawable, 0), ); - const unit = getAccountUnit(account); const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/apps/ledger-live-desktop/src/renderer/families/solana/Delegation/Row.tsx b/apps/ledger-live-desktop/src/renderer/families/solana/Delegation/Row.tsx index fbd9427b13ed..d956bc703c8a 100644 --- a/apps/ledger-live-desktop/src/renderer/families/solana/Delegation/Row.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/solana/Delegation/Row.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { stakeActions as solanaStakeActions, @@ -23,6 +22,7 @@ import Loader from "~/renderer/icons/Loader"; import { TableLine } from "./Header"; import { DelegateModalName } from "../modals"; import Discreet from "~/renderer/components/Discreet"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Wrapper = styled.div` display: flex; flex-direction: row; @@ -95,7 +95,7 @@ type Props = { export function Row({ account, stakeWithMeta, onManageAction, onExternalLink }: Props) { const { stake, meta } = stakeWithMeta; const stakeActions = solanaStakeActions(stake).map(toStakeDropDownItem); - + const unit = useAccountUnit(account); const onSelect = useCallback( (action: (typeof stakeActions)[number]) => { onManageAction(stakeWithMeta, action.key); @@ -106,7 +106,6 @@ export function Row({ account, stakeWithMeta, onManageAction, onExternalLink }: const validatorName = meta.validator?.name ?? stake.delegation?.voteAccAddr ?? "-"; const onExternalLinkClick = () => onExternalLink(stakeWithMeta); const formatAmount = (amount: number) => { - const unit = getAccountUnit(account); return formatCurrencyUnit(unit, new BigNumber(amount), { disableRounding: true, alwaysShowSign: false, diff --git a/apps/ledger-live-desktop/src/renderer/families/solana/DelegationDeactivateFlowModal/steps/StepValidator.tsx b/apps/ledger-live-desktop/src/renderer/families/solana/DelegationDeactivateFlowModal/steps/StepValidator.tsx index 672150f486cb..29fbf714cb6d 100644 --- a/apps/ledger-live-desktop/src/renderer/families/solana/DelegationDeactivateFlowModal/steps/StepValidator.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/solana/DelegationDeactivateFlowModal/steps/StepValidator.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { useValidators, useSolanaStakesWithMeta, @@ -14,9 +13,11 @@ import AccountFooter from "~/renderer/modals/Send/AccountFooter"; import ErrorDisplay from "../../shared/components/ErrorDisplay"; import ValidatorRow from "../../shared/components/ValidatorRow"; import { StepProps } from "../types"; +import { useMaybeAccountUnit } from "~/renderer/hooks/useAccountUnit"; export default function StepValidator({ account, transaction, status, error, t: _t }: StepProps) { - if (account === null || transaction === null || account?.solanaResources === undefined) { + const unit = useMaybeAccountUnit(account); + if (account === null || transaction === null || account?.solanaResources === undefined || !unit) { throw new Error("account, transaction and solana resouces required"); } const { solanaResources } = account; @@ -30,7 +31,6 @@ export default function StepValidator({ account, transaction, status, error, t: throw new Error(`stake with account address <${stakeAccAddr}> not found`); } const { stake } = stakeWithMeta; - const unit = getAccountUnit(account); const validators = useValidators(account.currency); const validator = validators.find(v => v.voteAccount === stake.delegation?.voteAccAddr); if (validator === undefined) { @@ -52,7 +52,7 @@ export default function StepValidator({ account, transaction, status, error, t: currency={account.currency} validator={validator} unit={unit} - > + /> {status.errors.fee && } ); diff --git a/apps/ledger-live-desktop/src/renderer/families/solana/DelegationReactivateFlowModal/steps/StepValidator.tsx b/apps/ledger-live-desktop/src/renderer/families/solana/DelegationReactivateFlowModal/steps/StepValidator.tsx index 791b08a1c57b..eae12d0548c9 100644 --- a/apps/ledger-live-desktop/src/renderer/families/solana/DelegationReactivateFlowModal/steps/StepValidator.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/solana/DelegationReactivateFlowModal/steps/StepValidator.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { useSolanaStakesWithMeta, useValidators, @@ -14,9 +13,11 @@ import AccountFooter from "~/renderer/modals/Send/AccountFooter"; import ErrorDisplay from "../../shared/components/ErrorDisplay"; import { StepProps } from "../types"; import ValidatorRow from "../../shared/components/ValidatorRow"; +import { useMaybeAccountUnit } from "~/renderer/hooks/useAccountUnit"; export default function StepValidator({ account, transaction, status, error }: StepProps) { - if (account === null || transaction === null || account?.solanaResources === undefined) { + const unit = useMaybeAccountUnit(account); + if (account === null || transaction === null || account?.solanaResources === undefined || !unit) { throw new Error("account, transaction and solana resouces required"); } const { solanaResources } = account; @@ -30,7 +31,6 @@ export default function StepValidator({ account, transaction, status, error }: S throw new Error(`stake with account address <${stakeAccAddr}> not found`); } const { stake } = stakeWithMeta; - const unit = getAccountUnit(account); const validators = useValidators(account.currency); const validator = validators.find(v => v.voteAccount === stake.delegation?.voteAccAddr); if (validator === undefined) { diff --git a/apps/ledger-live-desktop/src/renderer/families/solana/DelegationWithdrawFlowModal/fields/AmountField.tsx b/apps/ledger-live-desktop/src/renderer/families/solana/DelegationWithdrawFlowModal/fields/AmountField.tsx index fab2981c0d42..c8d3fcee5d9d 100644 --- a/apps/ledger-live-desktop/src/renderer/families/solana/DelegationWithdrawFlowModal/fields/AmountField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/solana/DelegationWithdrawFlowModal/fields/AmountField.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { SolanaAccount, Transaction, @@ -9,6 +8,7 @@ import React from "react"; import styled from "styled-components"; import Box from "~/renderer/components/Box"; import InputCurrency from "~/renderer/components/InputCurrency"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { account: SolanaAccount; transaction: Transaction; @@ -23,7 +23,7 @@ const InputRight = styled(Box).attrs(() => ({ }))``; export default function AmountField({ account, transaction, status }: Props) { invariant(transaction.family === "solana", "AmountField: solana family expected"); - const defaultUnit = getAccountUnit(account); + const defaultUnit = useAccountUnit(account); return ( () => { const url = getAddressExplorer(getDefaultExplorerView(currency), address); @@ -52,7 +52,7 @@ type DelegateExtraFieldsProps = { }; const DelegateExtraFields = ({ account, voteAddress, amount }: DelegateExtraFieldsProps) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formatAmount = useFormatAmount(); const preloadData = useSolanaPreloadData(account.currency); const validator = preloadData?.validators.find(v => v.voteAccount === voteAddress); @@ -97,7 +97,7 @@ type WithdrawExtraFieldsProps = { amount: BigNumber; }; const WithdrawExtraFields = ({ account, fromAddress, amount }: WithdrawExtraFieldsProps) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formatAmount = useFormatAmount(); return ( diff --git a/apps/ledger-live-desktop/src/renderer/families/solana/shared/fields/ValidatorsField.tsx b/apps/ledger-live-desktop/src/renderer/families/solana/shared/fields/ValidatorsField.tsx index 639c2e42f33d..e71d222ff698 100644 --- a/apps/ledger-live-desktop/src/renderer/families/solana/shared/fields/ValidatorsField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/solana/shared/fields/ValidatorsField.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { useValidators } from "@ledgerhq/live-common/families/solana/react"; import { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/staking"; import { SolanaAccount } from "@ledgerhq/live-common/families/solana/types"; @@ -14,6 +13,7 @@ import ScrollLoadingList from "~/renderer/components/ScrollLoadingList"; import Text from "~/renderer/components/Text"; import IconAngleDown from "~/renderer/icons/AngleDown"; import ValidatorRow from "../components/ValidatorRow"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; type Props = { account: SolanaAccount; @@ -23,7 +23,7 @@ type Props = { const ValidatorField = ({ account, onChangeValidator, chosenVoteAccAddr }: Props) => { const [search, setSearch] = useState(""); const [showAll, setShowAll] = useState(false); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const validators = useValidators(account.currency, search); const chosenValidator = useMemo(() => { if (chosenVoteAccAddr !== null) { diff --git a/apps/ledger-live-desktop/src/renderer/families/stacks/TransactionConfirmFields.tsx b/apps/ledger-live-desktop/src/renderer/families/stacks/TransactionConfirmFields.tsx index 7ffb05046f78..8ba90fc0b6d0 100644 --- a/apps/ledger-live-desktop/src/renderer/families/stacks/TransactionConfirmFields.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/stacks/TransactionConfirmFields.tsx @@ -4,9 +4,10 @@ import TransactionConfirmField from "~/renderer/components/TransactionConfirm/Tr import Text from "~/renderer/components/Text"; import { DeviceTransactionField } from "@ledgerhq/live-common/transaction/index"; import { FieldComponentProps } from "~/renderer/components/TransactionConfirm"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import Box from "~/renderer/components/Box"; import FormattedVal from "~/renderer/components/FormattedVal"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const addressStyle: React.CSSProperties = { wordBreak: "break-all", @@ -17,7 +18,7 @@ const addressStyle: React.CSSProperties = { const StacksExtendedAmountField = ({ account, status: { amount }, field }: FieldComponentProps) => { invariant(field.type === "stacks.extendedAmount", "stacks.extendedAmount field expected"); const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const specifiedAmount = field.value != null ? field.value : null; return ( diff --git a/apps/ledger-live-desktop/src/renderer/families/stellar/FeeField.tsx b/apps/ledger-live-desktop/src/renderer/families/stellar/FeeField.tsx index 0ad06893c4ec..7558bd39a584 100644 --- a/apps/ledger-live-desktop/src/renderer/families/stellar/FeeField.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/stellar/FeeField.tsx @@ -11,6 +11,7 @@ import invariant from "invariant"; import { Account } from "@ledgerhq/types-live"; import { Transaction, TransactionStatus } from "@ledgerhq/live-common/families/stellar/types"; import BigNumber from "bignumber.js"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const FeeField = ({ onChange, @@ -24,6 +25,8 @@ const FeeField = ({ status: TransactionStatus; }) => { invariant(transaction.family === "stellar", "FeeField: stellar family expected"); + + const unit = useAccountUnit(account); const bridge = getAccountBridge(account); const onFeeValueChange = useCallback( (fees: BigNumber) => { @@ -64,7 +67,7 @@ const FeeField = ({ containerProps={{ grow: true, }} - defaultUnit={account.unit} + defaultUnit={unit} value={transaction.fees} onChange={onFeeValueChange} renderRight={XLM} diff --git a/apps/ledger-live-desktop/src/renderer/families/tezos/DelegateFlowModal/steps/StepSummary.tsx b/apps/ledger-live-desktop/src/renderer/families/tezos/DelegateFlowModal/steps/StepSummary.tsx index c68b55ea6787..8ddb5a0329b1 100644 --- a/apps/ledger-live-desktop/src/renderer/families/tezos/DelegateFlowModal/steps/StepSummary.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/tezos/DelegateFlowModal/steps/StepSummary.tsx @@ -1,11 +1,7 @@ import invariant from "invariant"; import React from "react"; import styled from "styled-components"; -import { - getAccountCurrency, - getAccountName, - getAccountUnit, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { useBaker, useDelegation } from "@ledgerhq/live-common/families/tezos/bakers"; import { Baker } from "@ledgerhq/live-common/families/tezos/types"; import { Trans } from "react-i18next"; @@ -24,6 +20,8 @@ import InfoCircle from "~/renderer/icons/InfoCircle"; import BakerImage from "../../BakerImage"; import DelegationContainer from "../DelegationContainer"; import { StepProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; +import { useAccountName } from "~/renderer/reducers/wallet"; const urlDelegationHelp = "https://support.ledger.com/hc/en-us/articles/360010653260"; @@ -54,10 +52,11 @@ const StepSummary = ({ account, transaction, eventType, transitionTo }: StepProp account && transaction && transaction.family === "tezos", "step summary requires account and transaction settled", ); + const accountName = useAccountName(account); const delegation = useDelegation(account); const baker = useBaker(transaction.recipient); const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const getBakerName = (baker: Baker | undefined | null, fallback: string) => baker ? baker.name : fallback; @@ -86,7 +85,7 @@ const StepSummary = ({ account, transaction, eventType, transitionTo }: StepProp - {getAccountName(account)} + {accountName} { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); const mainAccount = getMainAccount(account, parentAccount); const name = delegation.baker ? delegation.baker.name : shortAddressPreview(delegation.address); diff --git a/apps/ledger-live-desktop/src/renderer/families/tron/AccountBalanceSummaryFooter.tsx b/apps/ledger-live-desktop/src/renderer/families/tron/AccountBalanceSummaryFooter.tsx index ec03ae048e99..b8fad007dbf2 100644 --- a/apps/ledger-live-desktop/src/renderer/families/tron/AccountBalanceSummaryFooter.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/tron/AccountBalanceSummaryFooter.tsx @@ -12,6 +12,7 @@ import ToolTip from "~/renderer/components/Tooltip"; import { localeSelector } from "~/renderer/reducers/settings"; import { TronAccount } from "@ledgerhq/live-common/families/tron/types"; import { SubAccount } from "@ledgerhq/types-live"; +import { useMaybeAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Wrapper = styled(Box).attrs(() => ({ horizontal: true, mt: 4, @@ -53,7 +54,9 @@ type Props = { const AccountBalanceSummaryFooter = ({ account }: Props) => { const discreet = useDiscreetMode(); const locale = useSelector(localeSelector); - if (account.type !== "Account") return null; + + const unit = useMaybeAccountUnit(account); + if (account.type !== "Account" || !unit) return null; const { tronResources } = account; const formatConfig = { disableRounding: true, @@ -80,9 +83,9 @@ const AccountBalanceSummaryFooter = ({ account }: Props) => { const { freeUsed, freeLimit, gainedUsed, gainedLimit } = tronResources.bandwidth; - const spendableBalance = formatCurrencyUnit(account.unit, account.spendableBalance, formatConfig); + const spendableBalance = formatCurrencyUnit(unit, account.spendableBalance, formatConfig); const frozenAmount = formatCurrencyUnit( - account.unit, + unit, BigNumber(frozenBandwidthAmount || 0) .plus(BigNumber(frozenEnergyAmount || 0)) .plus(BigNumber(delegatedFrozenBandwidthAmount || 0)) diff --git a/apps/ledger-live-desktop/src/renderer/families/tron/Votes/index.tsx b/apps/ledger-live-desktop/src/renderer/families/tron/Votes/index.tsx index 7c4524076f54..b21e4ca30b59 100644 --- a/apps/ledger-live-desktop/src/renderer/families/tron/Votes/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/tron/Votes/index.tsx @@ -9,7 +9,6 @@ import { formatVotes, getNextRewardDate, } from "@ledgerhq/live-common/families/tron/react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { getDefaultExplorerView } from "@ledgerhq/live-common/explorers"; import { openURL } from "~/renderer/linking"; @@ -35,6 +34,7 @@ import { useDateFromNow } from "~/renderer/hooks/useDateFormatter"; import { useHistory } from "react-router"; import { stakeDefaultTrack } from "~/renderer/screens/stake/constants"; import { track } from "~/renderer/analytics/segment"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const Wrapper = styled(Box).attrs(() => ({ p: 3, @@ -55,7 +55,7 @@ const Delegation = ({ account }: { account: TronAccount }) => { const diff = new Date().getTime() - lastVoteDate.getTime(); return Math.floor(diff / (1000 * 60 * 60 * 24)); }, [lastVoteDate]); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const explorerView = getDefaultExplorerView(account.currency); const { tronResources } = account; const { votes, tronPower, unwithdrawnReward } = tronResources; diff --git a/apps/ledger-live-desktop/src/renderer/families/tron/operationDetails.tsx b/apps/ledger-live-desktop/src/renderer/families/tron/operationDetails.tsx index e7a144423c02..35ad1922cdd1 100644 --- a/apps/ledger-live-desktop/src/renderer/families/tron/operationDetails.tsx +++ b/apps/ledger-live-desktop/src/renderer/families/tron/operationDetails.tsx @@ -24,6 +24,7 @@ import FormattedVal from "~/renderer/components/FormattedVal"; import CounterValue from "~/renderer/components/CounterValue"; import { useDiscreetMode } from "~/renderer/components/Discreet"; import { OperationDetailsExtraProps } from "../types"; +import { useAccountUnit } from "~/renderer/hooks/useAccountUnit"; const helpURL = "https://support.ledger.com/hc/en-us/articles/360013062139"; function getURLFeesInfo({ op }: { op: Operation; currencyId: string }): string | undefined { @@ -106,6 +107,7 @@ const OperationDetailsExtra = ({ type, account, }: OperationDetailsExtraProps) => { + const unit = useAccountUnit(account); const frozenAmount = operation.extra?.frozenAmount ? (operation.extra.frozenAmount as BigNumber) : new BigNumber(0); @@ -144,7 +146,7 @@ const OperationDetailsExtra = ({ { swapTransaction.swap.from.account && getMainAccount(swapTransaction.swap.from.account, swapTransaction.swap.from.parentAccount); const estimatedFeesUnit = mainFromAccount && getFeesCurrency(mainFromAccount); + + const unit = useMaybeAccountUnit(mainFromAccount); const estimatedFees = useMemo(() => { - const unit = mainFromAccount && getAccountUnit(mainFromAccount); return unit && BigNumber(formatCurrencyUnit(unit, swapTransaction.status.estimatedFees)); - }, [mainFromAccount, swapTransaction.status.estimatedFees]); + }, [swapTransaction.status.estimatedFees, unit]); + + const walletState = useSelector(walletSelector); useEffect(() => { if (isSwapLiveAppEnabled) { const providerRedirectURLSearch = getProviderRedirectURLSearch(); const { parentAccount: fromParentAccount } = swapTransaction.swap.from; const fromParentAccountId = fromParentAccount - ? accountToWalletAPIAccount(fromParentAccount)?.id + ? accountToWalletAPIAccount(walletState, fromParentAccount)?.id : undefined; const providerRedirectURL = `ledgerlive://discover/${getProviderName( provider ?? "", @@ -90,6 +91,7 @@ export const useSwapLiveAppHook = (props: UseSwapLiveAppHookProps) => { } } }, [ + walletState, provider, manifestID, isSwapLiveAppEnabled, diff --git a/apps/ledger-live-desktop/src/renderer/hooks/useAccountUnit.ts b/apps/ledger-live-desktop/src/renderer/hooks/useAccountUnit.ts new file mode 100644 index 000000000000..5e4ed6ed71ec --- /dev/null +++ b/apps/ledger-live-desktop/src/renderer/hooks/useAccountUnit.ts @@ -0,0 +1,16 @@ +import { useSelector } from "react-redux"; +import { accountUnitSelector } from "../reducers/settings"; +import { AccountLike } from "@ledgerhq/types-live"; +import { State } from "../reducers"; + +export function useAccountUnit(account: AccountLike) { + const unit = useSelector((state: State) => accountUnitSelector(state, account)); + return unit; +} + +export function useMaybeAccountUnit(account?: AccountLike | null) { + const unit = useSelector((state: State) => + account ? accountUnitSelector(state, account) : undefined, + ); + return unit; +} diff --git a/apps/ledger-live-desktop/src/renderer/init.tsx b/apps/ledger-live-desktop/src/renderer/init.tsx index 7b64d41a7b39..fd22c4df8d77 100644 --- a/apps/ledger-live-desktop/src/renderer/init.tsx +++ b/apps/ledger-live-desktop/src/renderer/init.tsx @@ -31,7 +31,7 @@ import { setEnvOnAllThreads } from "~/helpers/env"; import dbMiddleware from "~/renderer/middlewares/db"; import createStore from "~/renderer/createStore"; import events from "~/renderer/events"; -import { setAccounts } from "~/renderer/actions/accounts"; +import { initAccounts } from "~/renderer/actions/accounts"; import { fetchSettings, setDeepLinkUrl } from "~/renderer/actions/settings"; import { lock, setOSDarkMode } from "~/renderer/actions/application"; import { @@ -152,12 +152,13 @@ async function init() { return currency ? hydrateCurrency(currency) : null; }), ); - const accounts = await getKey("app", "accounts", []); - if (accounts) { - store.dispatch(setAccounts(accounts)); + const accountData = await getKey("app", "accounts", []); + if (accountData) { + const e = initAccounts(accountData); + store.dispatch(e); // preload currency that's not in accounts list - if (accounts.some(a => a.currency.id !== "ethereum")) { + if (e.payload.accounts.some(a => a.currency.id !== "ethereum")) { prepareCurrency(getCryptoCurrencyById("ethereum")); } } else { diff --git a/apps/ledger-live-desktop/src/renderer/logger/summarize.ts b/apps/ledger-live-desktop/src/renderer/logger/summarize.ts index 9e58e1c56b06..49ef15d30025 100644 --- a/apps/ledger-live-desktop/src/renderer/logger/summarize.ts +++ b/apps/ledger-live-desktop/src/renderer/logger/summarize.ts @@ -1,15 +1,15 @@ +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; import { Account, SubAccount } from "@ledgerhq/types-live"; function summarizeAccount(argument: Account | SubAccount) { const { type, balance, id, operations, pendingOperations } = argument; - let index, freshAddress, freshAddressPath, name, subAccounts; + let index, freshAddress, freshAddressPath, subAccounts; if (argument.type === "Account") { index = argument.index; freshAddress = argument.freshAddress; freshAddressPath = argument.freshAddressPath; - name = argument.name; subAccounts = argument.subAccounts; } @@ -17,7 +17,7 @@ function summarizeAccount(argument: Account | SubAccount) { type, balance, id, - name, + name: getDefaultAccountName(argument), index, freshAddress, freshAddressPath, diff --git a/apps/ledger-live-desktop/src/renderer/middlewares/db.ts b/apps/ledger-live-desktop/src/renderer/middlewares/db.ts index 4a1e482562f5..fd4fa58683c6 100644 --- a/apps/ledger-live-desktop/src/renderer/middlewares/db.ts +++ b/apps/ledger-live-desktop/src/renderer/middlewares/db.ts @@ -3,9 +3,11 @@ import { Middleware } from "redux"; import { setKey } from "~/renderer/storage"; import { postOnboardingSelector } from "@ledgerhq/live-common/postOnboarding/reducer"; import { actionTypePrefix as postOnboardingActionTypePrefix } from "@ledgerhq/live-common/postOnboarding/actions"; -import { accountsSelector } from "./../reducers/accounts"; + import { settingsExportSelector, areSettingsLoaded } from "./../reducers/settings"; import { State } from "../reducers"; +import { Account, AccountUserData } from "@ledgerhq/types-live"; +import { accountUserDataExportSelector } from "@ledgerhq/live-wallet/store"; let DB_MIDDLEWARE_ENABLED = true; // ability to temporary disable the db middleware from outside @@ -14,6 +16,17 @@ export const disable = (ms = 1000) => { setTimeout(() => (DB_MIDDLEWARE_ENABLED = true), ms); }; +function accountsExportSelector(state: State) { + const all: [Account, AccountUserData][] = []; + for (const account of state.accounts) { + const accountUserData = accountUserDataExportSelector(state.wallet, { account }); + if (accountUserData) { + all.push([account, accountUserData]); + } + } + return all; +} + const DBMiddleware: Middleware<{}, State> = store => next => action => { if (DB_MIDDLEWARE_ENABLED && action.type.startsWith("DB:")) { const [, type] = action.type.split(":"); @@ -22,7 +35,7 @@ const DBMiddleware: Middleware<{}, State> = store => next => action => { payload: action.payload, }); const state = store.getState(); - setKey("app", "accounts", accountsSelector(state)); + setKey("app", "accounts", accountsExportSelector(state)); // ^ TODO ultimately we'll do same for accounts to drop DB: pattern } else if (DB_MIDDLEWARE_ENABLED && action.type.startsWith(postOnboardingActionTypePrefix)) { next(action); diff --git a/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/index.tsx b/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/index.tsx index 40d9f3c8e643..2fd8b28193aa 100644 --- a/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/index.tsx @@ -6,12 +6,10 @@ import { compose } from "redux"; import { createStructuredSelector } from "reselect"; import { Account } from "@ledgerhq/types-live"; import { CryptoCurrency, CryptoOrTokenCurrency } from "@ledgerhq/types-cryptoassets"; -import { addAccounts } from "@ledgerhq/live-common/account/index"; import logger from "~/renderer/logger"; import { Device } from "@ledgerhq/live-common/hw/actions/types"; import { getCurrentDevice } from "~/renderer/reducers/devices"; import { accountsSelector } from "~/renderer/reducers/accounts"; -import { replaceAccounts } from "~/renderer/actions/accounts"; import { closeModal } from "~/renderer/actions/modals"; import Track from "~/renderer/analytics/Track"; import Stepper, { Step } from "~/renderer/components/Stepper"; @@ -22,13 +20,14 @@ import StepConnectDevice from "./steps/StepConnectDevice"; import StepImport, { StepImportFooter } from "./steps/StepImport"; import StepFinish, { StepFinishFooter } from "./steps/StepFinish"; import { blacklistedTokenIdsSelector } from "~/renderer/reducers/settings"; +import { addAccountsAction } from "@ledgerhq/live-wallet/addAccounts"; export type Props = { // props from redux device: Device | undefined | null; existingAccounts: Account[]; closeModal: (a: string) => void; - replaceAccounts: (a: Account[]) => void; + addAccountsAction: typeof addAccountsAction; blacklistedTokenIds?: string[]; } & UserProps; @@ -132,7 +131,7 @@ const mapStateToProps = createStructuredSelector({ blacklistedTokenIds: blacklistedTokenIdsSelector, }); const mapDispatchToProps = { - replaceAccounts, + addAccountsAction, closeModal, }; const INITIAL_STATE: State = { @@ -149,16 +148,14 @@ class AddAccounts extends PureComponent { state = INITIAL_STATE; STEPS = createSteps(this.props.currency && !this.props.preventSkippingCurrencySelection); handleClickAdd = async () => { - const { replaceAccounts, existingAccounts } = this.props; + const { addAccountsAction, existingAccounts } = this.props; const { scannedAccounts, checkedAccountsIds, editedNames } = this.state; - replaceAccounts( - addAccounts({ - scannedAccounts, - existingAccounts, - selectedIds: checkedAccountsIds, - renamings: editedNames, - }), - ); + addAccountsAction({ + scannedAccounts, + existingAccounts, + selectedIds: checkedAccountsIds, + renamings: editedNames, + }); }; handleStepChange = (step: St) => diff --git a/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/steps/StepImport.tsx b/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/steps/StepImport.tsx index 7854db759449..602e1362e745 100644 --- a/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/steps/StepImport.tsx +++ b/apps/ledger-live-desktop/src/renderer/modals/AddAccounts/steps/StepImport.tsx @@ -5,7 +5,7 @@ import { Trans } from "react-i18next"; import { concat, from, Subscription } from "rxjs"; import { ignoreElements, filter, map } from "rxjs/operators"; import { Account } from "@ledgerhq/types-live"; -import { isAccountEmpty, groupAddAccounts } from "@ledgerhq/live-common/account/index"; +import { isAccountEmpty } from "@ledgerhq/live-common/account/index"; import { openModal } from "~/renderer/actions/modals"; import { DeviceShouldStayInApp } from "@ledgerhq/errors"; import { getCurrencyBridge } from "@ledgerhq/live-common/bridge/index"; @@ -28,6 +28,8 @@ import InfoCircle from "~/renderer/icons/InfoCircle"; import ToolTip from "~/renderer/components/Tooltip"; import { CryptoOrTokenCurrency } from "@ledgerhq/types-cryptoassets"; import { getLLDCoinFamily } from "~/renderer/families"; +import { groupAddAccounts } from "@ledgerhq/live-wallet/addAccounts"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; type Props = AccountListProps & { defaultSelected: boolean; @@ -295,7 +297,7 @@ class StepImport extends PureComponent< {" "} - {alreadyEmptyAccount.name} + {getDefaultAccountName(alreadyEmptyAccount)} {" "} ); @@ -349,7 +351,6 @@ class StepImport extends PureComponent< onSelectAll={!selectable ? undefined : this.handleSelectAll} onUnselectAll={!selectable ? undefined : this.handleUnselectAll} ToggleAllComponent={hasMultipleSchemes && this.renderLegacyAccountsToggle()} - t={t} /> ); })} diff --git a/apps/ledger-live-desktop/src/renderer/modals/ExchangeDeviceConfirm/index.tsx b/apps/ledger-live-desktop/src/renderer/modals/ExchangeDeviceConfirm/index.tsx index e8d458187c26..17ca6091a059 100644 --- a/apps/ledger-live-desktop/src/renderer/modals/ExchangeDeviceConfirm/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/modals/ExchangeDeviceConfirm/index.tsx @@ -4,7 +4,7 @@ import styled from "styled-components"; import { Account, AccountLike } from "@ledgerhq/types-live"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { getEnv } from "@ledgerhq/live-env"; -import { getAccountName, getMainAccount } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import { AppResult, createAction } from "@ledgerhq/live-common/hw/actions/app"; import { urls } from "~/config/urls"; import DeviceAction from "~/renderer/components/DeviceAction"; @@ -26,6 +26,7 @@ import Alert from "~/renderer/components/Alert"; import TrackPage from "~/renderer/analytics/TrackPage"; import Receive2NoDevice from "~/renderer/components/Receive2NoDevice"; import { firstValueFrom } from "rxjs"; +import { useAccountName } from "~/renderer/reducers/wallet"; export const Separator = styled.div` &::after { @@ -76,7 +77,7 @@ const VerifyOnDevice = ({ device, skipDevice, }: VerifyOnDeviceProps) => { - const name = getAccountName(mainAccount); + const name = useAccountName(mainAccount); const address = mainAccount.freshAddress; const confirmAddress = useCallback(async () => { if (!device || skipDevice) return null; diff --git a/apps/ledger-live-desktop/src/renderer/modals/ExportOperations/index.tsx b/apps/ledger-live-desktop/src/renderer/modals/ExportOperations/index.tsx index 41b4b6f08a83..638e241cf6cb 100644 --- a/apps/ledger-live-desktop/src/renderer/modals/ExportOperations/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/modals/ExportOperations/index.tsx @@ -188,7 +188,6 @@ const LabelWrapper = styled(Box)` text-align: center; font-size: 13px; font-family: "Inter"; - font-weight:; `; const IconWrapperCircle = styled(Box)<{ green?: boolean }>` width: 50px; diff --git a/apps/ledger-live-desktop/src/renderer/modals/Receive/steps/StepReceiveFunds.tsx b/apps/ledger-live-desktop/src/renderer/modals/Receive/steps/StepReceiveFunds.tsx index dd5523035a3f..6f8c1a3a7803 100644 --- a/apps/ledger-live-desktop/src/renderer/modals/Receive/steps/StepReceiveFunds.tsx +++ b/apps/ledger-live-desktop/src/renderer/modals/Receive/steps/StepReceiveFunds.tsx @@ -1,7 +1,7 @@ import invariant from "invariant"; import React, { useEffect, useRef, useCallback, useState } from "react"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getMainAccount, getAccountName } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import TrackPage from "~/renderer/analytics/TrackPage"; import ErrorDisplay from "~/renderer/components/ErrorDisplay"; import { DisconnectedDevice } from "@ledgerhq/errors"; @@ -37,6 +37,7 @@ import { Device } from "@ledgerhq/live-common/hw/actions/types"; import { getLLDCoinFamily } from "~/renderer/families"; import { firstValueFrom } from "rxjs"; import { useCompleteActionCallback } from "~/renderer/components/PostOnboardingHub/logic/useCompleteAction"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; const Separator = styled.div` border-top: 1px solid #99999933; @@ -170,7 +171,7 @@ const StepReceiveFunds = (props: StepProps) => { const mainAccount = account ? getMainAccount(account, parentAccount) : null; invariant(account && mainAccount, "No account given"); - const name = token ? token.name : getAccountName(account); + const name = token ? token.name : getDefaultAccountName(account); const initialDevice = useRef(device); const address = mainAccount.freshAddress; const [modalVisible, setModalVisible] = useState(false); diff --git a/apps/ledger-live-desktop/src/renderer/modals/Receive/steps/StepReceiveStakingFlow.tsx b/apps/ledger-live-desktop/src/renderer/modals/Receive/steps/StepReceiveStakingFlow.tsx index a48f57635fc7..66e9aa8f10b7 100644 --- a/apps/ledger-live-desktop/src/renderer/modals/Receive/steps/StepReceiveStakingFlow.tsx +++ b/apps/ledger-live-desktop/src/renderer/modals/Receive/steps/StepReceiveStakingFlow.tsx @@ -10,10 +10,10 @@ import { openURL } from "~/renderer/linking"; import { withV3StyleProvider } from "~/renderer/styles/StyleProviderV3"; import Button from "~/renderer/components/ButtonV3"; import CheckBox from "~/renderer/components/CheckBox"; -import { getAccountName } from "@ledgerhq/live-common/account/index"; import { Account } from "@ledgerhq/types-live"; import { getLLDCoinFamily } from "~/renderer/families"; import { ManageAction } from "~/renderer/families/types"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; export const LOCAL_STORAGE_KEY_PREFIX = "receive_staking_"; @@ -130,7 +130,7 @@ export const StepReceiveStakingFooter = (props: StepProps) => { currency: account && "currency" in account ? account?.currency?.name : undefined, provider: providerName, modal: "receive", - account: account && getAccountName(account), + account: account && getDefaultAccountName(account), }; }, [account]); diff --git a/apps/ledger-live-desktop/src/renderer/modals/Send/fields/RecipientField.react.test.tsx b/apps/ledger-live-desktop/src/renderer/modals/Send/fields/RecipientField.react.test.tsx index df93891536b5..457c0132952c 100644 --- a/apps/ledger-live-desktop/src/renderer/modals/Send/fields/RecipientField.react.test.tsx +++ b/apps/ledger-live-desktop/src/renderer/modals/Send/fields/RecipientField.react.test.tsx @@ -39,7 +39,6 @@ const polygon = getCryptoCurrencyById("polygon"); const ethMockAccount: Account = { type: "Account", id: "js:2:ethereum:0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3:", - starred: false, used: true, seedIdentifier: "0441996d9ce858d8fd6304dd790e645500fc6cee7ae0fccfee8c8fa884dfa8ccf1f6f8cc82cc0aa71fc659c895a8a43b69f918b08a22b3a6145a0bbd93c5cb9308", @@ -47,7 +46,6 @@ const ethMockAccount: Account = { index: 0, freshAddress: "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3", freshAddressPath: "44'/60'/0'/0/0", - name: "Ethereum 1", blockHeight: 16626551, creationDate: new Date("2021-03-23T14:17:07.001Z"), balance: new BigNumber("22913015427119498"), @@ -55,11 +53,6 @@ const ethMockAccount: Account = { operations: [], operationsCount: 0, pendingOperations: [], - unit: { - name: "ether", - code: "ETH", - magnitude: 18, - }, currency: eth, lastSyncDate: new Date("2023-02-14T11:01:19.252Z"), swapHistory: [], @@ -74,7 +67,6 @@ const ethMockAccount: Account = { const polygonMockAccount: Account = { type: "Account", id: "js:2:polygon:0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3:", - starred: false, used: true, seedIdentifier: "0441996d9ce858d8fd6304dd790e645500fc6cee7ae0fccfee8c8fa884dfa8ccf1f6f8cc82cc0aa71fc659c895a8a43b69f918b08a22b3a6145a0bbd93c5cb9308", @@ -82,7 +74,6 @@ const polygonMockAccount: Account = { index: 0, freshAddress: "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3", freshAddressPath: "44'/60'/0'/0/0", - name: "Polygon 1", blockHeight: 16626551, creationDate: new Date("2021-03-23T14:17:07.001Z"), balance: new BigNumber("22913015427119498"), @@ -90,11 +81,6 @@ const polygonMockAccount: Account = { operations: [], operationsCount: 0, pendingOperations: [], - unit: { - name: "matic", - code: "MATIC", - magnitude: 18, - }, currency: polygon, lastSyncDate: new Date("2023-02-14T11:01:19.252Z"), swapHistory: [], diff --git a/apps/ledger-live-desktop/src/renderer/modals/Send/steps/StepSummary.tsx b/apps/ledger-live-desktop/src/renderer/modals/Send/steps/StepSummary.tsx index 24b07e697ab3..4bb1546421a5 100644 --- a/apps/ledger-live-desktop/src/renderer/modals/Send/steps/StepSummary.tsx +++ b/apps/ledger-live-desktop/src/renderer/modals/Send/steps/StepSummary.tsx @@ -2,9 +2,7 @@ import React from "react"; import { Trans } from "react-i18next"; import styled from "styled-components"; import { - getAccountName, getAccountCurrency, - getAccountUnit, getFeesCurrency, getFeesUnit, getMainAccount, @@ -27,6 +25,8 @@ import NFTSummary from "~/renderer/screens/nft/Send/Summary"; import { StepProps } from "../types"; import AccountTagDerivationMode from "~/renderer/components/AccountTagDerivationMode"; import { getLLDCoinFamily } from "~/renderer/families"; +import { useMaybeAccountUnit } from "~/renderer/hooks/useAccountUnit"; +import { useMaybeAccountName } from "~/renderer/reducers/wallet"; const FromToWrapper = styled.div``; const Circle = styled.div` @@ -56,14 +56,11 @@ const WARN_FROM_UTXO_COUNT = 50; const StepSummary = (props: StepProps) => { const { account, parentAccount, transaction, status, currencyName, isNFTSend } = props; + const mainAccount = account && getMainAccount(account, parentAccount); + const unit = useMaybeAccountUnit(mainAccount); + const accountName = useMaybeAccountName(account); - if (!account) { - return null; - } - - const mainAccount = getMainAccount(account, parentAccount); - - if (!mainAccount || !transaction) { + if (!account || !mainAccount || !transaction) { return null; } @@ -73,7 +70,6 @@ const StepSummary = (props: StepProps) => { const currency = getAccountCurrency(account); const feesCurrency = getFeesCurrency(mainAccount); const feesUnit = getFeesUnit(feesCurrency); - const unit = getAccountUnit(account); const utxoLag = txInputs ? txInputs.length >= WARN_FROM_UTXO_COUNT : null; const hasNonEmptySubAccounts = account.type === "Account" && @@ -133,7 +129,7 @@ const StepSummary = (props: StepProps) => { flex: 1, }} > - {getAccountName(account)} + {accountName} diff --git a/apps/ledger-live-desktop/src/renderer/modals/SettingsAccount/AccountSettingRenderBody.tsx b/apps/ledger-live-desktop/src/renderer/modals/SettingsAccount/AccountSettingRenderBody.tsx index 0f24ec382e55..f5e38f57d07b 100644 --- a/apps/ledger-live-desktop/src/renderer/modals/SettingsAccount/AccountSettingRenderBody.tsx +++ b/apps/ledger-live-desktop/src/renderer/modals/SettingsAccount/AccountSettingRenderBody.tsx @@ -1,13 +1,10 @@ -import React, { PureComponent, memo } from "react"; +import React, { memo, useState } from "react"; import styled from "styled-components"; -import get from "lodash/get"; -import { compose } from "redux"; -import { connect } from "react-redux"; -import { TFunction } from "i18next"; -import { Trans, withTranslation } from "react-i18next"; +import { useDispatch } from "react-redux"; +import { Trans, useTranslation } from "react-i18next"; import type { Account, DerivationMode } from "@ledgerhq/types-live"; -import { Unit } from "@ledgerhq/types-cryptoassets"; -import { validateNameEdition } from "@ledgerhq/live-common/account/index"; +import { validateNameEdition } from "@ledgerhq/live-wallet/accountName"; +import { setAccountName as actionSetAccountName } from "@ledgerhq/live-wallet/store"; import { AccountNameRequiredError } from "@ledgerhq/errors"; import { getEnv } from "@ledgerhq/live-env"; import { urls } from "~/config/urls"; @@ -18,51 +15,30 @@ import TrackPage from "~/renderer/analytics/TrackPage"; import Box from "~/renderer/components/Box"; import Alert from "~/renderer/components/Alert"; import Input from "~/renderer/components/Input"; -import Select from "~/renderer/components/Select"; import Spoiler from "~/renderer/components/Spoiler"; import ConfirmModal from "~/renderer/modals/ConfirmModal"; import Space from "~/renderer/components/Space"; import Button from "~/renderer/components/Button"; import { getTagDerivationMode } from "@ledgerhq/coin-framework/derivation"; -type State = { - accountName: string | undefined | null; - accountUnit: Unit | undefined | null; - accountNameError: Error | undefined | null; - isRemoveAccountModalOpen: boolean; -}; -type OwnProps = { - onClose?: () => void; - data: unknown; -}; +import { useMaybeAccountName } from "~/renderer/reducers/wallet"; + type Props = { - setDataModal: Function; - updateAccount: Function; - removeAccount: Function; - t: TFunction; -} & OwnProps; -const unitGetOptionValue = (unit: Unit) => unit.magnitude + ""; -const renderUnitItemCode = (item: { data: Unit }) => item.data.code; -const mapDispatchToProps = { - setDataModal, - updateAccount, - removeAccount, -}; -const defaultState = { - accountName: null, - accountUnit: null, - accountNameError: null, - isRemoveAccountModalOpen: false, + onClose?: () => void; + account: Account; }; -class AccountSettingRenderBody extends PureComponent { - state = { - ...defaultState, - }; - getAccount(data: unknown): Account { - const { accountName } = this.state; - const account = get(data, "account", {}); +function AccountSettingRenderBody(props: Props) { + const { onClose, account: dataAccount } = props; + + const { t } = useTranslation(); + const dispatch = useDispatch(); + const [accountName, setAccountName] = useState(null); + const [accountNameError, setAccountNameError] = useState(null); + const [isRemoveAccountModalOpen, setIsRemoveAccountModalOpen] = useState(false); + + function getAccount(): Account { return { - ...account, + ...dataAccount, ...(accountName !== null ? { name: accountName, @@ -71,196 +47,151 @@ class AccountSettingRenderBody extends PureComponent { }; } - handleChangeName = (value: string) => - this.setState({ - accountName: value, - }); + const handleChangeName = (value: string) => setAccountName(value); - handleSubmit = + const handleSubmit = (account: Account, onClose: () => void) => (e: React.SyntheticEvent) => { e.preventDefault(); - const { updateAccount, setDataModal } = this.props; - const { accountName, accountUnit } = this.state; - if (!account.name.length) { - this.setState({ - accountNameError: new AccountNameRequiredError(), - }); + + if (!accountName || !accountName.length) { + setAccountNameError(new AccountNameRequiredError()); } else { const name = validateNameEdition(account, accountName); - account = { - ...account, - unit: accountUnit || account.unit, - name, - }; - updateAccount(account); - setDataModal("MODAL_SETTINGS_ACCOUNT", { - account, - }); + dispatch(updateAccount(account)); + dispatch(actionSetAccountName(account.id, name)); + dispatch( + setDataModal("MODAL_SETTINGS_ACCOUNT", { + account, + }), + ); onClose(); } }; - handleFocus = (e: React.FocusEvent, name: string) => { + const handleFocus = (e: React.FocusEvent, name: string) => { e.target.select(); switch (name) { case "accountName": - this.setState({ - accountNameError: null, - }); + setAccountNameError(null); break; default: break; } }; - handleChangeUnit = (value?: Unit | null) => { - this.setState({ - accountUnit: value, - }); - }; - - handleOpenRemoveAccountModal = () => - this.setState({ - isRemoveAccountModalOpen: true, - }); + const handleOpenRemoveAccountModal = () => setIsRemoveAccountModalOpen(true); - handleCloseRemoveAccountModal = () => - this.setState({ - isRemoveAccountModalOpen: false, - }); + const handleCloseRemoveAccountModal = () => setIsRemoveAccountModalOpen(false); - handleRemoveAccount = (account: Account) => { - const { removeAccount, onClose } = this.props; - removeAccount(account); - this.setState({ - isRemoveAccountModalOpen: false, - }); + const handleRemoveAccount = (account: Account) => { + dispatch(removeAccount(account)); + setIsRemoveAccountModalOpen(false); onClose?.(); }; - render() { - const { accountUnit, accountNameError, isRemoveAccountModalOpen } = this.state; - const { t, onClose, data } = this.props; - if (!data) return null; - const account = this.getAccount(data); - const usefulData = { - xpub: account.xpub || undefined, - index: account.index, - freshAddressPath: account.freshAddressPath, - id: account.id, - blockHeight: account.blockHeight, - }; - const onSubmit = onClose && this.handleSubmit(account, onClose); - const tag = - account.derivationMode !== undefined && - account.derivationMode !== null && - getTagDerivationMode(account.currency, account.derivationMode as DerivationMode); - return ( - ( - <> - - - - {t("account.settings.accountName.title")} - {t("account.settings.accountName.desc")} - - - ) => - this.handleFocus(e, "accountName") - } - error={accountNameError} - id="input-edit-name" - /> - - - - - {t("account.settings.unit.title")} - {t("account.settings.unit.desc")} - - ( + <> + + + + {t("account.settings.accountName.title")} + {t("account.settings.accountName.desc")} + + + - + + + + ); } -export default withTranslation()( - connect( - createStructuredSelector({ - currencySettings: currencySettingsSelector, - settings: storeSelector, - }), - { - saveSettings, - }, - )(CurrencyRows), -); + +export default React.memo(CurrencyRows); diff --git a/apps/ledger-live-desktop/src/renderer/screens/stake/index.tsx b/apps/ledger-live-desktop/src/renderer/screens/stake/index.tsx index c9485b72a8a7..aa1d754ca43b 100644 --- a/apps/ledger-live-desktop/src/renderer/screens/stake/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/screens/stake/index.tsx @@ -8,7 +8,7 @@ import { stakeDefaultTrack } from "./constants"; import { track, trackPage } from "~/renderer/analytics/segment"; import { useDispatch } from "react-redux"; import { openModal } from "~/renderer/actions/modals"; -import { getAccountName } from "@ledgerhq/live-common/account/index"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; type Props = { currencies?: string[]; @@ -51,8 +51,8 @@ const useStakeFlow = () => { button: "asset", page: history.location.pathname, currency: account.type === "Account" && account?.currency?.family, - account: account ? getAccountName(account) : undefined, - parentAccount: parentAccount ? getAccountName(parentAccount) : undefined, + account: account ? getDefaultAccountName(account) : undefined, + parentAccount: parentAccount ? getDefaultAccountName(parentAccount) : undefined, drawer: "Select Account And Currency Drawer", }); setDrawer(); diff --git a/apps/ledger-live-desktop/src/renderer/storage.ts b/apps/ledger-live-desktop/src/renderer/storage.ts index 0e21b764e7c9..38fc1b144aa9 100644 --- a/apps/ledger-live-desktop/src/renderer/storage.ts +++ b/apps/ledger-live-desktop/src/renderer/storage.ts @@ -15,7 +15,7 @@ import { parseSatStackConfig, SatStackConfig, } from "@ledgerhq/live-common/families/bitcoin/satstack"; -import { Account, AccountRaw } from "@ledgerhq/types-live"; +import { Account, AccountRaw, AccountUserData } from "@ledgerhq/types-live"; import { DataModel } from "@ledgerhq/live-common/DataModel"; import { Announcement } from "@ledgerhq/live-common/notifications/AnnouncementProvider/types"; import { CounterValuesStatus, RateMapRaw } from "@ledgerhq/live-countervalues/types"; @@ -82,7 +82,7 @@ type Transform = { // A map of transformers. type Transforms = { - accounts: Transform; + accounts: Transform; }; const transforms: Transforms = { @@ -90,11 +90,11 @@ const transforms: Transforms = { get: raws => { // NB to prevent parsing encrypted string as JSON if (typeof raws === "string") return null; - const accounts = []; + const accounts: Array<[Account, AccountUserData]> = []; if (raws) { - for (const row of raws) { + for (const raw of raws) { try { - accounts.push(accountModel.decode(row)); + accounts.push(accountModel.decode(raw)); } catch (e) { logger.critical(e); } diff --git a/apps/ledger-live-desktop/tests/utils/waitFor.ts b/apps/ledger-live-desktop/tests/utils/waitFor.ts index 1161549aafdd..40f6d592b551 100644 --- a/apps/ledger-live-desktop/tests/utils/waitFor.ts +++ b/apps/ledger-live-desktop/tests/utils/waitFor.ts @@ -13,13 +13,13 @@ export async function waitFor( const interval = setInterval(async () => { const condition = await predicate(); if (condition) { - clearInterval(interval as any as number); + clearInterval(interval as unknown as number); resolve(true); } }, intervalMs); setTimeout(() => { - clearInterval(interval as any as number); + clearInterval(interval as unknown as number); reject(new Error("waitFor timeout")); }, timeout); }); diff --git a/apps/ledger-live-mobile/__tests__/test-renderer.tsx b/apps/ledger-live-mobile/__tests__/test-renderer.tsx index 567cbabd3edb..ac61604b0fd5 100644 --- a/apps/ledger-live-mobile/__tests__/test-renderer.tsx +++ b/apps/ledger-live-mobile/__tests__/test-renderer.tsx @@ -25,6 +25,7 @@ import { INITIAL_STATE as DYNAMIC_CONTENT_INITIAL_STATE } from "~/reducers/dynam import { INITIAL_STATE as WALLET_CONNECT_INITIAL_STATE } from "~/reducers/walletconnect"; import { INITIAL_STATE as PROTECT_INITIAL_STATE } from "~/reducers/protect"; import { INITIAL_STATE as NFT_INITIAL_STATE } from "~/reducers/nft"; +import { initialState as WALLET_INITIAL_STATE } from "@ledgerhq/live-wallet/store"; const initialState = { accounts: ACCOUNTS_INITIAL_STATE, @@ -40,6 +41,7 @@ const initialState = { postOnboarding: POST_ONBOARDING_INITIAL_STATE, protect: PROTECT_INITIAL_STATE, nft: NFT_INITIAL_STATE, + wallet: WALLET_INITIAL_STATE, }; type ExtraOptions = RenderOptions & { diff --git a/apps/ledger-live-mobile/e2e/bridge/client.ts b/apps/ledger-live-mobile/e2e/bridge/client.ts index e240c1d8b2e4..810cf9c4c7cc 100644 --- a/apps/ledger-live-mobile/e2e/bridge/client.ts +++ b/apps/ledger-live-mobile/e2e/bridge/client.ts @@ -3,7 +3,7 @@ import invariant from "invariant"; import { Subject } from "rxjs"; import { store } from "~/context/store"; import { importSettings } from "~/actions/settings"; -import { importStore as importAccounts } from "~/actions/accounts"; +import { importStore as importAccountsRaw } from "~/actions/accounts"; import { acceptGeneralTerms } from "~/logic/terms"; import { navigate } from "~/rootnavigation"; import { importBle } from "~/actions/ble"; @@ -71,7 +71,7 @@ function onMessage(event: WebSocketMessageEvent) { acceptGeneralTerms(store); break; case "importAccounts": { - store.dispatch(importAccounts({ active: msg.payload })); + store.dispatch(importAccountsRaw({ active: msg.payload })); break; } case "mockDeviceEvent": { diff --git a/apps/ledger-live-mobile/e2e/specs/delegate/cosmos.spec.ts b/apps/ledger-live-mobile/e2e/specs/delegate/cosmos.spec.ts index e2e804112801..05b60cbca9f5 100644 --- a/apps/ledger-live-mobile/e2e/specs/delegate/cosmos.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/delegate/cosmos.spec.ts @@ -10,6 +10,7 @@ import DeviceAction from "../../models/DeviceAction"; import { knownDevice } from "../../models/devices"; import { BigNumber } from "bignumber.js"; import { formattedAmount } from "../../models/common"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; let portfolioPage: PortfolioPage; let stakePage: StakePage; @@ -58,8 +59,12 @@ describe("Cosmos delegate flow", () => { const [assestsDelagated, assestsRemaining] = await stakePage.setAmount(delegatedPercent); expect(await stakePage.cosmosDelegationSummaryValidator()).toEqual("Ledger"); - expect(assestsRemaining).toEqual(formattedAmount(testedAccount.unit, remainingAmount)); - expect(assestsDelagated).toEqual(formattedAmount(testedAccount.unit, delegatedAmount, true)); + expect(assestsRemaining).toEqual( + formattedAmount(getAccountCurrency(testedAccount).units[0], remainingAmount), + ); + expect(assestsDelagated).toEqual( + formattedAmount(getAccountCurrency(testedAccount).units[0], delegatedAmount, true), + ); await stakePage.summaryContinue(); await deviceAction.selectMockDevice(); diff --git a/apps/ledger-live-mobile/e2e/specs/send/currencies.spec.ts b/apps/ledger-live-mobile/e2e/specs/send/currencies.spec.ts index 9a8c4f18f081..864481871a65 100644 --- a/apps/ledger-live-mobile/e2e/specs/send/currencies.spec.ts +++ b/apps/ledger-live-mobile/e2e/specs/send/currencies.spec.ts @@ -5,6 +5,7 @@ import { getCryptoCurrencyById, setSupportedCurrencies, } from "@ledgerhq/live-common/currencies/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { loadAccounts, loadBleState, loadConfig } from "../../bridge/server"; import PortfolioPage from "../../models/wallet/portfolioPage"; import SendPage from "../../models/trade/sendPage"; @@ -15,6 +16,7 @@ import { tapByElement } from "../../helpers"; import { Account } from "@ledgerhq/types-live"; import { CryptoCurrencyId } from "@ledgerhq/types-cryptoassets"; import Common, { formattedAmount } from "../../models/common"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; let portfolioPage: PortfolioPage; let sendPage: SendPage; @@ -63,13 +65,15 @@ describe("Send flow", () => { const halfBalance = account.balance.div(2); const amount = // half of the balance, formatted with the same unit as what the input should use - formatCurrencyUnit(account.unit, halfBalance, { useGrouping: false }); + formatCurrencyUnit(getAccountCurrency(account).units[0], halfBalance, { + useGrouping: false, + }); - const amountWithCode = formattedAmount(account.unit, halfBalance); + const amountWithCode = formattedAmount(getAccountCurrency(account).units[0], halfBalance); await portfolioPage.openViaDeeplink(); await sendPage.openViaDeeplink(); - await common.performSearch(account.name); + await common.performSearch(getDefaultAccountName(account)); await sendPage.selectAccount(account.id); await sendPage.setRecipient(account.freshAddress); await sendPage.recipientContinue(); @@ -91,7 +95,7 @@ describe("Send flow", () => { await expect(lastTransaction).toHaveText(`-${amountWithCode}`); await tapByElement(lastTransaction); await operationDetailsPage.isOpened(); - await operationDetailsPage.checkAccount(account.name); + await operationDetailsPage.checkAccount(getDefaultAccountName(account)); await operationDetailsPage.checkAmount(`-${amountWithCode}`); }, ); diff --git a/apps/ledger-live-mobile/package.json b/apps/ledger-live-mobile/package.json index ee13f0a6d740..84b85cb4fa41 100644 --- a/apps/ledger-live-mobile/package.json +++ b/apps/ledger-live-mobile/package.json @@ -88,6 +88,7 @@ "@ledgerhq/live-env": "workspace:^", "@ledgerhq/live-nft": "workspace:^", "@ledgerhq/live-nft-react": "workspace:^", + "@ledgerhq/live-wallet": "workspace:^", "@ledgerhq/logs": "workspace:^", "@ledgerhq/native-ui": "workspace:^", "@ledgerhq/react-native-hid": "workspace:^", diff --git a/apps/ledger-live-mobile/src/actions/accounts.ts b/apps/ledger-live-mobile/src/actions/accounts.ts index 23fc6df68f65..47f266e63044 100644 --- a/apps/ledger-live-mobile/src/actions/accounts.ts +++ b/apps/ledger-live-mobile/src/actions/accounts.ts @@ -1,48 +1,42 @@ -import type { Account, AccountRaw } from "@ledgerhq/types-live"; +import type { Account, AccountRaw, AccountUserData } from "@ledgerhq/types-live"; import { createAction } from "redux-actions"; import accountModel from "../logic/accountModel"; import type { AccountsDeleteAccountPayload, AccountsImportAccountsPayload, - AccountsImportStorePayload, AccountsReorderPayload, - AccountsReplaceAccountsPayload, - AccountsSetAccountsPayload, AccountsUpdateAccountWithUpdaterPayload, } from "./types"; import { AccountsActionTypes } from "./types"; import logger from "../logger"; +import { initAccounts } from "@ledgerhq/live-wallet/store"; const version = 0; // FIXME this needs to come from user data -const importStoreAction = createAction( - AccountsActionTypes.ACCOUNTS_IMPORT, -); export const importStore = (rawAccounts: { active: { data: AccountRaw }[] }) => { - const accounts = []; + const tuples: Array<[Account, AccountUserData]> = []; if (rawAccounts && Array.isArray(rawAccounts.active)) { for (const { data } of rawAccounts.active) { try { - accounts.push(accountModel.decode({ data, version })); + tuples.push(accountModel.decode({ data, version })); } catch (e) { if (e instanceof Error) logger.critical(e); } } } - return importStoreAction(accounts); + const accounts = tuples.map(([account]) => account); + const accountsUserData = tuples.map(([, userData]) => userData); + return initAccounts(accounts, accountsUserData); }; export const reorderAccounts = createAction( AccountsActionTypes.REORDER_ACCOUNTS, ); -export const importAccounts = createAction( +export const addOneAccount = createAction(AccountsActionTypes.ADD_ACCOUNT); + +export const importAccountsLiveQR = createAction( AccountsActionTypes.ACCOUNTS_USER_IMPORT, ); -export const replaceAccounts = createAction( - AccountsActionTypes.ACCOUNTS_ADD, -); -export const setAccounts = createAction( - AccountsActionTypes.SET_ACCOUNTS, -); + export const updateAccountWithUpdater = createAction( AccountsActionTypes.UPDATE_ACCOUNT, ); diff --git a/apps/ledger-live-mobile/src/actions/general.ts b/apps/ledger-live-mobile/src/actions/general.ts index 5f871f00f5ee..9c67815b09cb 100644 --- a/apps/ledger-live-mobile/src/actions/general.ts +++ b/apps/ledger-live-mobile/src/actions/general.ts @@ -3,7 +3,7 @@ import { useSelector, useDispatch } from "react-redux"; import { flattenSortAccounts, sortAccountsComparatorFromOrder, -} from "@ledgerhq/live-common/account/index"; +} from "@ledgerhq/live-wallet/ordering"; import type { FlattenAccountsOptions } from "@ledgerhq/live-common/account/index"; import type { TrackingPair } from "@ledgerhq/live-countervalues/types"; import { @@ -19,6 +19,7 @@ import { counterValueCurrencySelector, orderAccountsSelector } from "../reducers import { clearBridgeCache } from "../bridge/cache"; import { flushAll } from "../components/DBSave"; import { LiveConfig } from "@ledgerhq/live-config/LiveConfig"; +import { walletSelector } from "~/reducers/wallet"; const extraSessionTrackingPairsChanges: BehaviorSubject = new BehaviorSubject< TrackingPair[] @@ -39,7 +40,8 @@ export function useCalculateCountervalueCallback() { export function useSortAccountsComparator() { const accounts = useSelector(orderAccountsSelector); const calc = useCalculateCountervalueCallback(); - return sortAccountsComparatorFromOrder(accounts, calc); + const walletState = useSelector(walletSelector); + return sortAccountsComparatorFromOrder(accounts, walletState, calc); } export function useFlattenSortAccounts(options?: FlattenAccountsOptions) { const accounts = useSelector(accountsSelector); diff --git a/apps/ledger-live-mobile/src/actions/types.ts b/apps/ledger-live-mobile/src/actions/types.ts index f88d75cac85a..1d05e05364f7 100644 --- a/apps/ledger-live-mobile/src/actions/types.ts +++ b/apps/ledger-live-mobile/src/actions/types.ts @@ -1,9 +1,5 @@ import type { Action } from "redux-actions"; -import type { - AccountComparator, - AddAccountsProps, - ImportAccountsReduceInput, -} from "@ledgerhq/live-common/account/index"; +import type { AccountComparator } from "@ledgerhq/live-wallet/ordering"; import { Device } from "@ledgerhq/live-common/hw/actions/types"; import type { Account, @@ -37,14 +33,16 @@ import type { NftState, } from "../reducers/types"; import type { Unpacked } from "../types/helpers"; +import { HandlersPayloads } from "@ledgerhq/live-wallet/store"; +import { ImportAccountsReduceInput } from "@ledgerhq/live-wallet/liveqr/importAccounts"; // === ACCOUNTS ACTIONS === export enum AccountsActionTypes { ACCOUNTS_IMPORT = "ACCOUNTS_IMPORT", ACCOUNTS_USER_IMPORT = "ACCOUNTS_USER_IMPORT", + ADD_ACCOUNT = "ADD_ACCOUNT", REORDER_ACCOUNTS = "REORDER_ACCOUNTS", - ACCOUNTS_ADD = "ACCOUNTS_ADD", SET_ACCOUNTS = "SET_ACCOUNTS", UPDATE_ACCOUNT = "UPDATE_ACCOUNT", DELETE_ACCOUNT = "DELETE_ACCOUNT", @@ -52,28 +50,20 @@ export enum AccountsActionTypes { DANGEROUSLY_OVERRIDE_STATE = "DANGEROUSLY_OVERRIDE_STATE", } -export type AccountsImportStorePayload = Account[]; export type AccountsReorderPayload = AccountComparator; export type AccountsImportAccountsPayload = ImportAccountsReduceInput; -export type AccountsReplaceAccountsPayload = Pick< - AddAccountsProps, - "scannedAccounts" | "selectedIds" | "renamings" -> & - Partial; -export type AccountsSetAccountsPayload = Account[]; export type AccountsUpdateAccountWithUpdaterPayload = { accountId: string; updater: (arg0: Account) => Account; }; export type AccountsDeleteAccountPayload = Account; export type AccountsPayload = - | AccountsImportStorePayload + | HandlersPayloads["INIT_ACCOUNTS"] | AccountsReorderPayload | AccountsImportAccountsPayload - | AccountsReplaceAccountsPayload - | AccountsSetAccountsPayload | AccountsUpdateAccountWithUpdaterPayload - | AccountsDeleteAccountPayload; + | AccountsDeleteAccountPayload + | Account; // === APPSTATE ACTIONS === diff --git a/apps/ledger-live-mobile/src/components/AccountCard.tsx b/apps/ledger-live-mobile/src/components/AccountCard.tsx index 490feed48b03..e731c7775c18 100644 --- a/apps/ledger-live-mobile/src/components/AccountCard.tsx +++ b/apps/ledger-live-mobile/src/components/AccountCard.tsx @@ -1,6 +1,6 @@ import React, { ReactNode } from "react"; import { getAccountSpendableBalance } from "@ledgerhq/live-common/account/index"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/helpers"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; import { getTagDerivationMode } from "@ledgerhq/coin-framework/derivation"; import { AccountLike, Account, DerivationMode } from "@ledgerhq/types-live"; import { Flex, Tag, Text } from "@ledgerhq/native-ui"; @@ -12,6 +12,8 @@ import Card, { Props as CardProps } from "./Card"; import CurrencyIcon from "./CurrencyIcon"; import CurrencyUnitValue from "./CurrencyUnitValue"; import CounterValue from "./CounterValue"; +import { useMaybeAccountName } from "~/reducers/wallet"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; export type Props = CardProps & { account?: AccountLike | null; @@ -21,6 +23,7 @@ export type Props = CardProps & { useFullBalance?: boolean; AccountSubTitle?: ReactNode; iconSize?: number; + overridesName?: string; }; const AccountCard = ({ @@ -31,13 +34,17 @@ const AccountCard = ({ disabled, useFullBalance, AccountSubTitle, + overridesName, iconSize = 48, ...props }: Props) => { const { colors } = useTheme(); - if (!account) return null; + const accountNameFromStore = useMaybeAccountName(account); + const accountName = overridesName || accountNameFromStore; + const parentName = useMaybeAccountName(parentAccount); + const unit = useMaybeAccountUnit(account); + if (!account || !unit) return null; const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); const tag = account.type === "Account" && account?.derivationMode !== undefined && @@ -47,9 +54,9 @@ const AccountCard = ({ const name = account.type === "TokenAccount" ? parentAccount - ? `${parentAccount!.name} (${currency.ticker})` + ? `${parentName} (${currency.ticker})` : currency.ticker - : account.name; + : accountName; return ( >(); @@ -251,6 +249,9 @@ const GraphCardHeader = ({ }); }, [account.id, currency, navigation, parentAccount?.id]); + const accountName = useAccountName(account); + const parentAccountName = useMaybeAccountName(parentAccount); + return ( - {getAccountName(account)} + {accountName} {isToken && ( - {getAccountName(parentAccount)} + {parentAccountName} )} diff --git a/apps/ledger-live-mobile/src/components/AccountSelector.tsx b/apps/ledger-live-mobile/src/components/AccountSelector.tsx index 40cc71dac2fc..4e2472db7cd3 100644 --- a/apps/ledger-live-mobile/src/components/AccountSelector.tsx +++ b/apps/ledger-live-mobile/src/components/AccountSelector.tsx @@ -1,4 +1,4 @@ -import React, { useCallback } from "react"; +import React, { useCallback, useMemo } from "react"; import { useSelector } from "react-redux"; import { AccountLike } from "@ledgerhq/types-live"; import { Flex, Text } from "@ledgerhq/native-ui"; @@ -8,8 +8,15 @@ import AccountList from "./AccountList"; import FilteredSearchBar from "./FilteredSearchBar"; import { formatSearchResults } from "~/helpers/formatAccountSearchResults"; import { accountsSelector } from "~/reducers/accounts"; +import { walletSelector } from "~/reducers/wallet"; +import { accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; -const SEARCH_KEYS = ["name", "unit.code", "token.name", "token.ticker"]; +const SEARCH_KEYS = [ + "name", + "account.currency.units[0].code", + "account.token.name", + "account.token.ticker", +]; type Props = { list: AccountLike[]; @@ -28,6 +35,14 @@ const AccountSelector = ({ }: Props) => { const { t } = useTranslation(); const accounts = useSelector(accountsSelector); + const walletState = useSelector(walletSelector); + + const items = useMemo(() => { + return list.map(account => ({ + account, + name: accountNameWithDefaultSelector(walletState, account), + })); + }, [list, walletState]); const renderEmptySearch = useCallback( () => ( @@ -47,9 +62,11 @@ const AccountSelector = ({ ); const renderList = useCallback( - (items: AccountLike[]) => { - const formatedList = formatSearchResults(items, accounts); - + (items: { account: AccountLike }[]) => { + const formatedList = formatSearchResults( + items.map(a => a.account), + accounts, + ); return ( diff --git a/apps/ledger-live-mobile/src/components/DeviceAction/index.tsx b/apps/ledger-live-mobile/src/components/DeviceAction/index.tsx index b4c550a09c95..b5e1fb4e9cc6 100644 --- a/apps/ledger-live-mobile/src/components/DeviceAction/index.tsx +++ b/apps/ledger-live-mobile/src/components/DeviceAction/index.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from "react"; -import { useDispatch } from "react-redux"; +import { useDispatch, useSelector } from "react-redux"; import type { Action, Device } from "@ledgerhq/live-common/hw/actions/types"; import { DeviceNotOnboarded, @@ -55,6 +55,8 @@ import SkipLock from "../behaviour/SkipLock"; import DeviceActionProgress from "../DeviceActionProgress"; import { PartialNullable } from "~/types/helpers"; import ModalLock from "../ModalLock"; +import { walletSelector } from "~/reducers/wallet"; +import { settingsStoreSelector } from "~/reducers/settings"; type LedgerError = InstanceType>; @@ -231,6 +233,9 @@ export function DeviceActionDefaultRendering({ } }, [error, onError]); + const walletState = useSelector(walletSelector); + const settingsState = useSelector(settingsStoreSelector); + if (displayUpgradeWarning && appAndVersion) { return renderWarningOutdated({ t, @@ -399,6 +404,8 @@ export function DeviceActionDefaultRendering({ exchange: req?.exchange, amountExpectedTo: status.amountExpectedTo, estimatedFees: status.estimatedFees, + walletState, + settingsState, }); } diff --git a/apps/ledger-live-mobile/src/components/DeviceAction/rendering.tsx b/apps/ledger-live-mobile/src/components/DeviceAction/rendering.tsx index f058a7c9ac4a..1fbe4eb6be27 100644 --- a/apps/ledger-live-mobile/src/components/DeviceAction/rendering.tsx +++ b/apps/ledger-live-mobile/src/components/DeviceAction/rendering.tsx @@ -29,9 +29,7 @@ import { DownloadMedium } from "@ledgerhq/native-ui/assets/icons"; import BigNumber from "bignumber.js"; import { ExchangeRate, ExchangeSwap } from "@ledgerhq/live-common/exchange/swap/types"; import { - getAccountUnit, getMainAccount, - getAccountName, getAccountCurrency, getFeesCurrency, getFeesUnit, @@ -43,7 +41,7 @@ import { StackNavigationProp } from "@react-navigation/stack"; import { ParamListBase } from "@react-navigation/native"; import isFirmwareUpdateVersionSupported from "@ledgerhq/live-common/hw/isFirmwareUpdateVersionSupported"; import ProviderIcon from "../ProviderIcon"; -import { lastSeenDeviceSelector } from "~/reducers/settings"; +import { currencySettingsForAccountSelector, lastSeenDeviceSelector } from "~/reducers/settings"; import { urls } from "~/utils/urls"; import Alert from "../Alert"; import { lighten, Theme } from "../../colors"; @@ -62,6 +60,8 @@ import TermsFooter, { TermsProviders } from "../TermsFooter"; import CurrencyIcon from "../CurrencyIcon"; import ModalLock from "../ModalLock"; import Config from "react-native-config"; +import { WalletState, accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; +import { SettingsState } from "~/reducers/types"; export const Wrapper = styled(Flex).attrs({ flex: 1, @@ -241,6 +241,8 @@ export function renderConfirmSwap({ exchange, amountExpectedTo, estimatedFees, + walletState, + settingsState, }: RawProps & { device: Device; transaction: Transaction; @@ -248,10 +250,22 @@ export function renderConfirmSwap({ exchange: ExchangeSwap; amountExpectedTo?: string | null; estimatedFees?: string | null; + walletState: WalletState; + settingsState: SettingsState; }) { const providerName = getProviderName(exchangeRate.provider); const noticeType = getNoticeType(exchangeRate.provider); const alertProperties = noticeType.learnMore ? { learnMoreUrl: urls.swap.learnMore } : {}; + const fromAccountName = accountNameWithDefaultSelector(walletState, exchange.fromAccount); + const toAccountName = accountNameWithDefaultSelector(walletState, exchange.toAccount); + + const unitFrom = currencySettingsForAccountSelector(settingsState, { + account: exchange.fromAccount, + }).unit; + const unitTo = currencySettingsForAccountSelector(settingsState, { + account: exchange.toAccount, + }).unit; + return ( @@ -273,7 +287,7 @@ export function renderConfirmSwap({ @@ -283,7 +297,7 @@ export function renderConfirmSwap({ - {getAccountName(exchange.fromAccount)} + {fromAccountName} - {getAccountName(exchange.toAccount)} + {toAccountName} diff --git a/apps/ledger-live-mobile/src/components/EditFeeUnit.tsx b/apps/ledger-live-mobile/src/components/EditFeeUnit.tsx index 2bb18716e02d..8d37bb25261f 100644 --- a/apps/ledger-live-mobile/src/components/EditFeeUnit.tsx +++ b/apps/ledger-live-mobile/src/components/EditFeeUnit.tsx @@ -18,6 +18,7 @@ import QueuedDrawer from "./QueuedDrawer"; import Button from "./Button"; import { BaseComposite, StackNavigatorProps } from "./RootNavigator/types/helpers"; import { SendFundsNavigatorStackParamList } from "./RootNavigator/types/SendFundsNavigator"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: Account; @@ -44,7 +45,9 @@ export default function EditFreeUnit({ account, field }: Props) { const [transaction, setTransaction] = useState( (route.params as { transaction: Transaction })?.transaction, ); - const feeCustomUnit = (transaction as { feeCustomUnit?: Unit }).feeCustomUnit || account.unit; + + const unit = useAccountUnit(account); + const feeCustomUnit = (transaction as { feeCustomUnit?: Unit }).feeCustomUnit || unit; const editTxFeeByFamily = useEditTxFeeByFamily(); function onRequestClose() { @@ -147,7 +150,7 @@ export default function EditFreeUnit({ account, field }: Props) { )} > - {account.unit.code} + {unit.code} diff --git a/apps/ledger-live-mobile/src/components/OperationIcon.tsx b/apps/ledger-live-mobile/src/components/OperationIcon.tsx index c9337d27e181..2fbe778187d8 100644 --- a/apps/ledger-live-mobile/src/components/OperationIcon.tsx +++ b/apps/ledger-live-mobile/src/components/OperationIcon.tsx @@ -64,7 +64,7 @@ export default connect((state: State, props: OwnProps) => { const { account, parentAccount, operation } = props; const { type } = operation; const mainAccount = getMainAccount(account, parentAccount); - const currencySettings = currencySettingsForAccountSelector(state, props); + const currencySettings = currencySettingsForAccountSelector(state.settings, props); const isConfirmed = isConfirmedOperation( operation, mainAccount, diff --git a/apps/ledger-live-mobile/src/components/OperationRow/index.tsx b/apps/ledger-live-mobile/src/components/OperationRow/index.tsx index 6a850eadc3d3..bb80f7084ea2 100644 --- a/apps/ledger-live-mobile/src/components/OperationRow/index.tsx +++ b/apps/ledger-live-mobile/src/components/OperationRow/index.tsx @@ -9,12 +9,7 @@ import { isEditableOperation, isStuckOperation, } from "@ledgerhq/live-common/operation"; -import { - getMainAccount, - getAccountCurrency, - getAccountName, - getAccountUnit, -} from "@ledgerhq/live-common/account/index"; +import { getMainAccount, getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { Account, Operation, AccountLike } from "@ledgerhq/types-live"; import { Box, Flex, InfiniteLoader, Text } from "@ledgerhq/native-ui"; import { WarningMedium } from "@ledgerhq/native-ui/assets/icons"; @@ -33,6 +28,8 @@ import { UnionToIntersection } from "~/types/helpers"; import { BaseNavigation } from "../RootNavigator/types/helpers"; import { currencySettingsForAccountSelector } from "~/reducers/settings"; import type { State } from "~/reducers/types"; +import { useAccountName } from "~/reducers/wallet"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type FamilyOperationDetailsIntersection = UnionToIntersection< (typeof perFamilyOperationDetails)[keyof typeof perFamilyOperationDetails] @@ -124,10 +121,12 @@ function OperationRow({ const isNftOperation = ["NFT_IN", "NFT_OUT"].includes(operation.type) && operation.contract && operation.tokenId; + const unit = useAccountUnit(account); + const renderAmountCellExtra = useCallback(() => { const mainAccount = getMainAccount(account, parentAccount); const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); + const specific = mainAccount?.currency?.family ? (perFamilyOperationDetails[ mainAccount.currency.family as keyof typeof perFamilyOperationDetails @@ -142,14 +141,15 @@ function OperationRow({ return SpecificAmountCell ? ( ) : null; - }, [account, operation, parentAccount]); + }, [account, operation, parentAccount, unit]); const { colors } = useTheme(); const amount = getOperationAmountNumber(operation); const currency = getAccountCurrency(account); const mainAccount = getMainAccount(account, parentAccount); + const accountName = useAccountName(account); const currencySettings = useSelector((s: State) => - currencySettingsForAccountSelector(s, { + currencySettingsForAccountSelector(s.settings, { account: mainAccount, }), ); @@ -164,7 +164,6 @@ function OperationRow({ ? colors.success.c50 : colors.warning.c50; - const unit = getAccountUnit(account); const text = ; const isOptimistic = operation.blockHeight === null; const isOperationStuck = @@ -192,7 +191,7 @@ function OperationRow({ - {multipleAccounts ? getAccountName(account) : text} + {multipleAccounts ? accountName : text} {isOptimistic ? ( diff --git a/apps/ledger-live-mobile/src/components/RootNavigator/AccountSettingsNavigator.tsx b/apps/ledger-live-mobile/src/components/RootNavigator/AccountSettingsNavigator.tsx index 52931e418d56..429452e4dc2b 100644 --- a/apps/ledger-live-mobile/src/components/RootNavigator/AccountSettingsNavigator.tsx +++ b/apps/ledger-live-mobile/src/components/RootNavigator/AccountSettingsNavigator.tsx @@ -5,7 +5,6 @@ import { useTheme } from "styled-components/native"; import { ScreenName } from "~/const"; import Accounts from "~/screens/Accounts"; import AccountSettingsMain from "~/screens/AccountSettings"; -import EditAccountUnits from "~/screens/AccountSettings/EditAccountUnits"; import EditAccountName from "~/screens/AccountSettings/EditAccountName"; import AdvancedLogs from "~/screens/AccountSettings/AdvancedLogs"; import AccountOrder from "~/screens/Accounts/AccountOrder"; @@ -13,6 +12,7 @@ import AddAccount from "~/screens/Accounts/AddAccount"; import CurrencySettings from "~/screens/Settings/CryptoAssets/Currencies/CurrencySettings"; import { getStackNavigatorConfig } from "~/navigation/navigatorConfig"; import { AccountSettingsNavigatorParamList } from "./types/AccountSettingsNavigator"; +import EditCurrencyUnits from "~/screens/Settings/CryptoAssets/Currencies/EditCurrencyUnits"; const Stack = createStackNavigator(); @@ -30,13 +30,6 @@ export default function AccountSettingsNavigator() { headerRight: () => null, }} /> - + (); @@ -164,6 +165,14 @@ export default function BaseNavigator() { })} {...noNanoBuyNanoWallScreenOptions} /> + + (); @@ -154,6 +155,15 @@ export default function SettingsNavigator() { })} {...noNanoBuyNanoWallScreenOptions} /> + + + (null); useEffect(() => { @@ -67,7 +70,7 @@ export default function ValidateOnDevice({ device, message: messageData, account {t("walletconnect.stepVerification.action")} {t("walletconnect.stepVerification.accountName")} - {mainAccount.name} + {mainAccountName} {messageData.standard === "EIP712" ? ( <> diff --git a/apps/ledger-live-mobile/src/components/ValidateOnDevice.tsx b/apps/ledger-live-mobile/src/components/ValidateOnDevice.tsx index 6ce33ad02dfc..8bafebeeb9ea 100644 --- a/apps/ledger-live-mobile/src/components/ValidateOnDevice.tsx +++ b/apps/ledger-live-mobile/src/components/ValidateOnDevice.tsx @@ -4,12 +4,7 @@ import { ScrollView } from "react-native"; import { useTranslation } from "react-i18next"; import { Account, AccountLike } from "@ledgerhq/types-live"; import { Transaction, TransactionStatus } from "@ledgerhq/live-common/generated/types"; -import { - getMainAccount, - getAccountUnit, - getFeesCurrency, - getFeesUnit, -} from "@ledgerhq/live-common/account/index"; +import { getMainAccount, getFeesCurrency, getFeesUnit } from "@ledgerhq/live-common/account/index"; import { Device } from "@ledgerhq/live-common/hw/actions/types"; import { @@ -28,6 +23,7 @@ import { DataRowUnitValue, TextValueField } from "./ValidateOnDeviceDataRow"; import Animation from "./Animation"; import { getDeviceAnimation } from "~/helpers/getDeviceAnimation"; import { TitleText } from "./DeviceAction/rendering"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; export type FieldComponentProps = { account: AccountLike; @@ -46,14 +42,8 @@ const AnimationContainer = styled(Flex).attrs({ height: "150px", })``; -function AmountField({ account, parentAccount, status, field }: FieldComponentProps) { - let unit; - if (account.type === "TokenAccount") { - unit = getAccountUnit(account); - } else { - const mainAccount = getMainAccount(account, parentAccount); - unit = getAccountUnit(mainAccount); - } +function AmountField({ account, status, field }: FieldComponentProps) { + const unit = useAccountUnit(account); return ; } diff --git a/apps/ledger-live-mobile/src/components/Web3AppWebview/PlatformAPIWebview.tsx b/apps/ledger-live-mobile/src/components/Web3AppWebview/PlatformAPIWebview.tsx index 511caf2c75a2..723de03b3600 100644 --- a/apps/ledger-live-mobile/src/components/Web3AppWebview/PlatformAPIWebview.tsx +++ b/apps/ledger-live-mobile/src/components/Web3AppWebview/PlatformAPIWebview.tsx @@ -48,6 +48,7 @@ import { BaseNavigatorStackParamList } from "../RootNavigator/types/BaseNavigato import { WebviewAPI, WebviewProps } from "./types"; import { useWebviewState } from "./helpers"; import { currentRouteNameRef } from "~/analytics/screenRefs"; +import { walletSelector } from "~/reducers/wallet"; function renderLoading() { return ( @@ -81,13 +82,15 @@ export const PlatformAPIWebview = forwardRef( onStateChange, ); + const walletState = useSelector(walletSelector); + const accounts = useSelector(flattenAccountsSelector); const navigation = useNavigation< RootNavigationComposite> >(); const [device, setDevice] = useState(); - const listAccounts = useListPlatformAccounts(accounts); + const listAccounts = useListPlatformAccounts(walletState, accounts); const listPlatformCurrencies = useListPlatformCurrencies(); const requestAccount = useCallback( @@ -145,7 +148,11 @@ export const PlatformAPIWebview = forwardRef( const onSuccess = (account: AccountLike, parentAccount?: Account) => { tracking.platformRequestAccountSuccess(manifest); - resolve(serializePlatformAccount(accountToPlatformAccount(account, parentAccount))); + resolve( + serializePlatformAccount( + accountToPlatformAccount(walletState, account, parentAccount), + ), + ); }; const onClose = () => { @@ -186,12 +193,13 @@ export const PlatformAPIWebview = forwardRef( }); } }), - [manifest, accounts, navigation, tracking], + [manifest, accounts, walletState, navigation, tracking], ); const receiveOnAccount = useCallback( ({ accountId }: { accountId: string }) => receiveOnAccountLogic( + walletState, { manifest, accounts, tracking }, accountId, (account, parentAccount, accountAddress) => @@ -215,7 +223,7 @@ export const PlatformAPIWebview = forwardRef( }); }), ), - [manifest, accounts, navigation, tracking], + [walletState, manifest, accounts, navigation, tracking], ); const signTransaction = useCallback( diff --git a/apps/ledger-live-mobile/src/components/Web3AppWebview/helpers.ts b/apps/ledger-live-mobile/src/components/Web3AppWebview/helpers.ts index df72799d6cd7..8518a8d052e1 100644 --- a/apps/ledger-live-mobile/src/components/Web3AppWebview/helpers.ts +++ b/apps/ledger-live-mobile/src/components/Web3AppWebview/helpers.ts @@ -34,6 +34,7 @@ import getOrCreateUser from "../../user"; import * as bridge from "../../../e2e/bridge/client"; import Config from "react-native-config"; import { currentRouteNameRef } from "../../analytics/screenRefs"; +import { walletSelector } from "~/reducers/wallet"; export function useWebView( { @@ -106,11 +107,14 @@ export function useWebView( }; }, [webviewRef]); + const walletState = useSelector(walletSelector); + const { onMessage: onMessageRaw, onLoadError, server, } = useWalletAPIServer({ + walletState, manifest: manifest as AppManifest, accounts, tracking, diff --git a/apps/ledger-live-mobile/src/components/Web3AppWebview/liveSDKLogic.test.ts b/apps/ledger-live-mobile/src/components/Web3AppWebview/liveSDKLogic.test.ts index ad6a0295ca1e..a7c961651b57 100644 --- a/apps/ledger-live-mobile/src/components/Web3AppWebview/liveSDKLogic.test.ts +++ b/apps/ledger-live-mobile/src/components/Web3AppWebview/liveSDKLogic.test.ts @@ -101,19 +101,12 @@ const createAccount = (id: string, crypto: CryptoCurrency = defaultEthCryptoFami index: 0, freshAddress: "0x01", freshAddressPath: "44'/60'/0'/0/0", - name: "Ethereum 1", - starred: false, used: false, balance: new BigNumber("51281813126095913"), spendableBalance: new BigNumber("51281813126095913"), creationDate: new Date(), blockHeight: 8168983, currency: crypto, - unit: { - name: "satoshi", - code: "BTC", - magnitude: 5, - }, operationsCount: 0, operations: [], pendingOperations: [], @@ -147,7 +140,6 @@ function createTokenAccount(id = "32", parentId = "whatever"): TokenAccount { operationsCount: 0, operations: [], pendingOperations: [], - starred: false, balanceHistoryCache: { WEEK: { latestDate: null, balances: [] }, HOUR: { latestDate: null, balances: [] }, diff --git a/apps/ledger-live-mobile/src/components/WebPlatformPlayer/BottomBar.tsx b/apps/ledger-live-mobile/src/components/WebPlatformPlayer/BottomBar.tsx index 95eaf134cab3..28b421601bf9 100644 --- a/apps/ledger-live-mobile/src/components/WebPlatformPlayer/BottomBar.tsx +++ b/apps/ledger-live-mobile/src/components/WebPlatformPlayer/BottomBar.tsx @@ -9,9 +9,9 @@ import { safeGetRefValue, CurrentAccountHistDB } from "@ledgerhq/live-common/wal import { WebviewAPI, WebviewState } from "../Web3AppWebview/types"; import Button from "../Button"; import { Trans } from "react-i18next"; -import { getAccountName } from "@ledgerhq/live-common/account/index"; import CircleCurrencyIcon from "../CircleCurrencyIcon"; import { useSelectAccount } from "../Web3AppWebview/helpers"; +import { useMaybeAccountName } from "~/reducers/wallet"; type BottomBarProps = { manifest: AppManifest; @@ -71,6 +71,8 @@ export function BottomBar({ const { onSelectAccount } = useSelectAccount({ manifest, currentAccountHistDb }); + const currentAccountName = useMaybeAccountName(currentAccount); + return ( @@ -106,7 +108,7 @@ export function BottomBar({ } /> - {getAccountName(currentAccount)} + {currentAccountName} )} diff --git a/apps/ledger-live-mobile/src/const/navigation.ts b/apps/ledger-live-mobile/src/const/navigation.ts index a8df6f316605..9172545c72f7 100644 --- a/apps/ledger-live-mobile/src/const/navigation.ts +++ b/apps/ledger-live-mobile/src/const/navigation.ts @@ -24,6 +24,7 @@ export enum ScreenName { CryptoAssetsSettings = "CryptoAssetsSettings", CurrenciesList = "CurrenciesList", CurrencySettings = "CurrencySettings", + EditCurrencyUnits = "EditCurrencyUnits", DebugBLE = "DebugBLE", DebugBLEBenchmark = "DebugBLEBenchmark", DebugBLEDevicePairing = "DebugBLEDevicePairing", @@ -72,7 +73,6 @@ export enum ScreenName { DeviceConnect = "DeviceConnect", DisplayResult = "DisplayResult", EditAccountName = "EditAccountName", - EditAccountUnits = "EditAccountUnits", EditDeviceName = "EditDeviceName", Exchange = "Exchange", ExchangeBuy = "ExchangeBuy", diff --git a/apps/ledger-live-mobile/src/context/LedgerStore.tsx b/apps/ledger-live-mobile/src/context/LedgerStore.tsx index 2ee58d99bfc7..a075b56685d0 100644 --- a/apps/ledger-live-mobile/src/context/LedgerStore.tsx +++ b/apps/ledger-live-mobile/src/context/LedgerStore.tsx @@ -13,7 +13,7 @@ import { getProtect, } from "../db"; import { importSettings, setSupportedCounterValues } from "~/actions/settings"; -import { importStore as importAccounts } from "~/actions/accounts"; +import { importStore as importAccountsRaw } from "~/actions/accounts"; import { importBle } from "~/actions/ble"; import { updateProtectData, updateProtectStatus } from "~/actions/protect"; import { INITIAL_STATE as settingsState } from "~/reducers/settings"; @@ -99,7 +99,7 @@ export default class LedgerStoreProvider extends Component< this.props.store.dispatch(importSettings(settingsData)); const accountsData = await getAccounts(); - this.props.store.dispatch(importAccounts(accountsData)); + this.props.store.dispatch(importAccountsRaw(accountsData)); const postOnboardingState = await getPostOnboardingState(); if (postOnboardingState) { diff --git a/apps/ledger-live-mobile/src/families/algorand/Rewards/ClaimRewardsFlow/01-Started.tsx b/apps/ledger-live-mobile/src/families/algorand/Rewards/ClaimRewardsFlow/01-Started.tsx index 8f9dc35d5f3d..6b3c15588286 100644 --- a/apps/ledger-live-mobile/src/families/algorand/Rewards/ClaimRewardsFlow/01-Started.tsx +++ b/apps/ledger-live-mobile/src/families/algorand/Rewards/ClaimRewardsFlow/01-Started.tsx @@ -3,7 +3,7 @@ import React, { useCallback } from "react"; import { View, StyleSheet, SafeAreaView } from "react-native"; import { Trans } from "react-i18next"; import { useSelector } from "react-redux"; -import { getAccountUnit, getMainAccount } from "@ledgerhq/live-common/account/helpers"; +import { getMainAccount } from "@ledgerhq/live-common/account/helpers"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; @@ -25,6 +25,7 @@ import Illustration from "~/images/illustration/Illustration"; import type { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import type { AlgorandClaimRewardsFlowParamList } from "./type"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps< AlgorandClaimRewardsFlowParamList, @@ -40,7 +41,7 @@ export default function DelegationStarted({ navigation, route }: Props) { const bridge = getAccountBridge(mainAccount, undefined); invariant(mainAccount && mainAccount.algorandResources, "algorand Account required"); const { rewards } = mainAccount.algorandResources; - const unit = getAccountUnit(mainAccount); + const unit = useAccountUnit(mainAccount); const { transaction, status } = useBridgeTransaction(() => { const t = bridge.createTransaction(mainAccount); return { diff --git a/apps/ledger-live-mobile/src/families/algorand/Rewards/index.tsx b/apps/ledger-live-mobile/src/families/algorand/Rewards/index.tsx index bf497f796202..0d43d5901000 100644 --- a/apps/ledger-live-mobile/src/families/algorand/Rewards/index.tsx +++ b/apps/ledger-live-mobile/src/families/algorand/Rewards/index.tsx @@ -2,7 +2,7 @@ import invariant from "invariant"; import React, { useCallback } from "react"; import { useTranslation } from "react-i18next"; import { useNavigation } from "@react-navigation/native"; -import { getAccountUnit, getAccountCurrency } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { Box, Button, Flex, Text } from "@ledgerhq/native-ui"; import { InfoMedium } from "@ledgerhq/native-ui/assets/icons"; import { AlgorandAccount } from "@ledgerhq/live-common/families/algorand/types"; @@ -11,6 +11,7 @@ import AccountSectionLabel from "~/components/AccountSectionLabel"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import CounterValue from "~/components/CounterValue"; import { ScreenName, NavigatorName } from "~/const"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: AccountLike; @@ -21,7 +22,7 @@ const RewardsSection = ({ account }: { account: AlgorandAccount }) => { const { rewards } = account.algorandResources; const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { t } = useTranslation(); const navigation = useNavigation(); diff --git a/apps/ledger-live-mobile/src/families/algorand/SendRowsFee.tsx b/apps/ledger-live-mobile/src/families/algorand/SendRowsFee.tsx index 803837fe44f6..c322721b6802 100644 --- a/apps/ledger-live-mobile/src/families/algorand/SendRowsFee.tsx +++ b/apps/ledger-live-mobile/src/families/algorand/SendRowsFee.tsx @@ -4,7 +4,7 @@ import type { AccountLike, Account } from "@ledgerhq/types-live"; import { Trans } from "react-i18next"; import type { Transaction as AlgorandTransaction } from "@ledgerhq/live-common/families/algorand/types"; import type { Transaction } from "@ledgerhq/live-common/generated/types"; -import { getAccountUnit, getAccountCurrency } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { getMainAccount } from "@ledgerhq/live-common/account/helpers"; import { CompositeScreenProps, useTheme } from "@react-navigation/native"; import SummaryRow from "~/screens/SendFunds/SummaryRow"; @@ -19,6 +19,7 @@ import type { BaseNavigatorStackParamList } from "~/components/RootNavigator/typ import { ScreenName } from "~/const"; import type { SignTransactionNavigatorParamList } from "~/components/RootNavigator/types/SignTransactionNavigator"; import type { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { transaction: Transaction; @@ -38,7 +39,7 @@ export default function AlgorandFeeRow({ account, parentAccount, transaction }: }, []); const fees = (transaction as AlgorandTransaction).fees; const mainAccount = getMainAccount(account, parentAccount); - const unit = getAccountUnit(mainAccount); + const unit = useAccountUnit(mainAccount); const currency = getAccountCurrency(account); return ( diff --git a/apps/ledger-live-mobile/src/families/algorand/operationDetails.tsx b/apps/ledger-live-mobile/src/families/algorand/operationDetails.tsx index 976a0195dc7d..98d86bdbe748 100644 --- a/apps/ledger-live-mobile/src/families/algorand/operationDetails.tsx +++ b/apps/ledger-live-mobile/src/families/algorand/operationDetails.tsx @@ -3,7 +3,6 @@ import { View, StyleSheet } from "react-native"; import { useTranslation } from "react-i18next"; import type { Operation, OperationType } from "@ledgerhq/types-live"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { useSelector } from "react-redux"; import { IconsLegacy } from "@ledgerhq/native-ui"; import Section from "~/screens/OperationDetails/Section"; @@ -15,6 +14,7 @@ import { AlgorandOperationExtra, } from "@ledgerhq/live-common/families/algorand/types"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { operation: AlgorandOperation; @@ -23,7 +23,7 @@ type Props = { function OperationDetailsExtra({ operation, account }: Props) { const { t } = useTranslation(); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const discreet = useSelector(discreetModeSelector); const { locale } = useSettings(); const formattedRewards = operation.extra.rewards?.gt(0) diff --git a/apps/ledger-live-mobile/src/families/cardano/DelegationFlow/02-Summary.tsx b/apps/ledger-live-mobile/src/families/cardano/DelegationFlow/02-Summary.tsx index 4f0c45860f3a..bb3fa248eba8 100644 --- a/apps/ledger-live-mobile/src/families/cardano/DelegationFlow/02-Summary.tsx +++ b/apps/ledger-live-mobile/src/families/cardano/DelegationFlow/02-Summary.tsx @@ -6,7 +6,7 @@ import { Trans, useTranslation } from "react-i18next"; import { Animated, SafeAreaView, StyleSheet, View } from "react-native"; import { useSelector } from "react-redux"; import Icon from "react-native-vector-icons/Feather"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { formatCurrencyUnit, getCurrencyColor } from "@ledgerhq/live-common/currencies/index"; @@ -39,6 +39,7 @@ import { rgba } from "../../../colors"; import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { CardanoDelegationFlowParamList } from "./types"; import TranslatedError from "~/components/TranslatedError"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps< CardanoDelegationFlowParamList, @@ -291,7 +292,7 @@ function SummaryWords({ onChangePool: () => void; status: TransactionStatus; }) { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { t } = useTranslation(); const { colors } = useTheme(); const [rotateAnim] = useState(() => new Animated.Value(0)); @@ -529,7 +530,7 @@ function SummaryWords({ } const AccountBalanceTag = ({ account }: { account: AccountLike }) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { colors } = useTheme(); return ( diff --git a/apps/ledger-live-mobile/src/families/cardano/Delegations/index.tsx b/apps/ledger-live-mobile/src/families/cardano/Delegations/index.tsx index ddfd26e09e2e..81de384fca97 100644 --- a/apps/ledger-live-mobile/src/families/cardano/Delegations/index.tsx +++ b/apps/ledger-live-mobile/src/families/cardano/Delegations/index.tsx @@ -2,7 +2,7 @@ import React, { useCallback, useState, useMemo } from "react"; import { View, StyleSheet, Linking } from "react-native"; import { useNavigation, useTheme } from "@react-navigation/native"; import { useTranslation } from "react-i18next"; -import { getAccountUnit, getMainAccount } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import type { CardanoAccount, CardanoDelegation, @@ -29,6 +29,8 @@ import UndelegateIcon from "~/icons/Undelegate"; import DelegationRow from "./Row"; import PoolImage from "../shared/PoolImage"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; +import { useAccountName } from "~/reducers/wallet"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: CardanoAccount; @@ -43,7 +45,7 @@ function Delegations({ account }: Props) { const mainAccount = getMainAccount(account, undefined); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const navigation = useNavigation(); const { cardanoResources } = account; @@ -109,6 +111,8 @@ function Delegations({ account }: Props) { [account.currency], ); + const accountName = useAccountName(account); + const data = useMemo(() => { const d = delegation; @@ -154,7 +158,7 @@ function Delegations({ account }: Props) { style={[styles.valueText]} color="live" > - {account.name}{" "} + {accountName}{" "} ), }, @@ -188,7 +192,7 @@ function Delegations({ account }: Props) { : []), ] : []; - }, [delegation, t, account, onOpenExplorer, unit]); + }, [delegation, t, accountName, onOpenExplorer, unit]); const actions = useMemo(() => { return [ diff --git a/apps/ledger-live-mobile/src/families/cardano/UndelegationFlow/01-Summary.tsx b/apps/ledger-live-mobile/src/families/cardano/UndelegationFlow/01-Summary.tsx index 1d8bf09a383d..b59c6bd49c8e 100644 --- a/apps/ledger-live-mobile/src/families/cardano/UndelegationFlow/01-Summary.tsx +++ b/apps/ledger-live-mobile/src/families/cardano/UndelegationFlow/01-Summary.tsx @@ -5,11 +5,7 @@ import React, { ReactNode, useCallback, useMemo } from "react"; import { Trans, useTranslation } from "react-i18next"; import { SafeAreaView, StyleSheet, View } from "react-native"; import { useSelector } from "react-redux"; -import { - getAccountCurrency, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { formatCurrencyUnit, getCurrencyColor } from "@ledgerhq/live-common/currencies/index"; @@ -31,6 +27,7 @@ import { rgba } from "../../../colors"; import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { CardanoUndelegationFlowParamList } from "./types"; import TranslatedError from "~/components/TranslatedError"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps< CardanoUndelegationFlowParamList, @@ -193,7 +190,7 @@ const styles = StyleSheet.create({ }); function SummaryWords({ account }: { account: AccountLike; currentDelegation: CardanoDelegation }) { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { t } = useTranslation(); const { colors } = useTheme(); @@ -242,7 +239,7 @@ function SummaryWords({ account }: { account: AccountLike; currentDelegation: Ca } const AccountBalanceTag = ({ account }: { account: AccountLike }) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { colors } = useTheme(); return ( diff --git a/apps/ledger-live-mobile/src/families/celo/AccountBalanceSummaryFooter.tsx b/apps/ledger-live-mobile/src/families/celo/AccountBalanceSummaryFooter.tsx index e24e1ac95046..fcd5f15e592e 100644 --- a/apps/ledger-live-mobile/src/families/celo/AccountBalanceSummaryFooter.tsx +++ b/apps/ledger-live-mobile/src/families/celo/AccountBalanceSummaryFooter.tsx @@ -2,7 +2,6 @@ import React, { useCallback, useState } from "react"; import { ScrollView, StyleSheet } from "react-native"; import { useTranslation } from "react-i18next"; import { getCryptoCurrencyById } from "@ledgerhq/live-common/currencies/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { getCryptoCurrencyIcon } from "@ledgerhq/live-common/reactNative"; import type { Account } from "@ledgerhq/types-live"; import invariant from "invariant"; @@ -12,6 +11,7 @@ import InfoModal from "~/modals/Info"; import type { ModalInfo } from "~/modals/Info"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import InfoItem from "~/components/BalanceSummaryInfoItem"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: Account; @@ -27,7 +27,7 @@ function AccountBalanceSummaryFooter({ account }: Props) { const { spendableBalance, celoResources } = celoAccount; const { lockedBalance, nonvotingLockedBalance } = celoResources; const withdrawableBalanceAmount = withdrawableBalance(celoAccount); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const onCloseModal = useCallback(() => { setInfoName(undefined); }, []); diff --git a/apps/ledger-live-mobile/src/families/celo/Delegations/Row.tsx b/apps/ledger-live-mobile/src/families/celo/Delegations/Row.tsx index 521f1e6c2070..90246e7c26d8 100644 --- a/apps/ledger-live-mobile/src/families/celo/Delegations/Row.tsx +++ b/apps/ledger-live-mobile/src/families/celo/Delegations/Row.tsx @@ -11,6 +11,7 @@ import ArrowRight from "~/icons/ArrowRight"; import LText from "~/components/LText"; import ValidatorImage from "../../cosmos/shared/ValidatorImage"; import { formatAmount } from "./utils"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: CeloAccount; @@ -33,7 +34,7 @@ export default function DelegationRow({ const { t } = useTranslation(); const { validatorGroup, amount } = vote; const validatorName = getValidatorName(vote) ?? ""; - + const unit = useAccountUnit(account); return ( - {formatAmount(account, vote.amount ?? 0)} + {formatAmount(vote.amount ?? 0, unit)} diff --git a/apps/ledger-live-mobile/src/families/celo/Delegations/index.tsx b/apps/ledger-live-mobile/src/families/celo/Delegations/index.tsx index c44cf940062a..bd52113b98a2 100644 --- a/apps/ledger-live-mobile/src/families/celo/Delegations/index.tsx +++ b/apps/ledger-live-mobile/src/families/celo/Delegations/index.tsx @@ -37,6 +37,8 @@ import ValidatorImage from "../../cosmos/shared/ValidatorImage"; import { formatAmount } from "./utils"; import CheckCircle from "~/icons/CheckCircle"; import Loader from "~/icons/Loader"; +import { useAccountName } from "~/reducers/wallet"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: Account; @@ -130,6 +132,9 @@ function Delegations({ account }: Props) { [account.currency], ); + const accountName = useAccountName(account); + const unit = useAccountUnit(account); + const data = useMemo(() => { const v = vote; let status = null; @@ -182,7 +187,7 @@ function Delegations({ account }: Props) { style={[styles.valueText]} color="live" > - {account.name}{" "} + {accountName}{" "} ), }, @@ -227,7 +232,7 @@ function Delegations({ account }: Props) { Component: ( <> - {formatAmount(account as CeloAccount, vote.amount ?? 0)} + {formatAmount(vote.amount ?? 0, unit)} ), @@ -240,10 +245,11 @@ function Delegations({ account }: Props) { vote, t, getValidatorName, - account, + accountName, colors.green, colors.warning, colors.grey, + unit, onOpenExplorer, ]); diff --git a/apps/ledger-live-mobile/src/families/celo/Delegations/utils.tsx b/apps/ledger-live-mobile/src/families/celo/Delegations/utils.tsx index 93a0e2cc5b0f..7aaaa024279a 100644 --- a/apps/ledger-live-mobile/src/families/celo/Delegations/utils.tsx +++ b/apps/ledger-live-mobile/src/families/celo/Delegations/utils.tsx @@ -1,10 +1,8 @@ import BigNumber from "bignumber.js"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; -import { CeloAccount } from "@ledgerhq/live-common/families/celo/types"; +import { Unit } from "@ledgerhq/types-cryptoassets"; -export const formatAmount = (account: CeloAccount, amount: BigNumber) => { - const unit = getAccountUnit(account); +export const formatAmount = (amount: BigNumber, unit: Unit) => { return formatCurrencyUnit(unit, new BigNumber(amount), { disableRounding: false, alwaysShowSign: false, diff --git a/apps/ledger-live-mobile/src/families/celo/LockFlow/01-Amount.tsx b/apps/ledger-live-mobile/src/families/celo/LockFlow/01-Amount.tsx index ae2d94fd76be..0536476ce625 100644 --- a/apps/ledger-live-mobile/src/families/celo/LockFlow/01-Amount.tsx +++ b/apps/ledger-live-mobile/src/families/celo/LockFlow/01-Amount.tsx @@ -14,7 +14,7 @@ import { Trans } from "react-i18next"; import invariant from "invariant"; import { useTheme } from "@react-navigation/native"; import { useDebounce } from "@ledgerhq/live-common/hooks/useDebounce"; -import { getAccountUnit, getMainAccount } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { Transaction as CeloTransaction } from "@ledgerhq/live-common/families/celo/types"; import { accountScreenSelector } from "~/reducers/accounts"; @@ -31,6 +31,7 @@ import { getFirstStatusError, hasStatusError } from "../../helpers"; import SendRowsFee from "../SendRowsFee"; import { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { CeloLockFlowParamList } from "./types"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; type Props = BaseComposite>; @@ -108,12 +109,11 @@ export default function LockAmount({ navigation, route }: Props) { }, [account, navigation, transaction, status]); const blur = useCallback(() => Keyboard.dismiss(), []); - - if (!account || !transaction) return null; + const unit = useMaybeAccountUnit(account); + if (!account || !transaction || !unit) return null; const { useAllAmount } = transaction; const { amount } = status; - const unit = getAccountUnit(account); const error = amount.eq(0) || bridgePending ? null : getFirstStatusError(status, "errors"); const warning = getFirstStatusError(status, "warnings"); diff --git a/apps/ledger-live-mobile/src/families/celo/RevokeFlow/01-Summary.tsx b/apps/ledger-live-mobile/src/families/celo/RevokeFlow/01-Summary.tsx index 8dc29c66e4c3..4959d192f1a2 100644 --- a/apps/ledger-live-mobile/src/families/celo/RevokeFlow/01-Summary.tsx +++ b/apps/ledger-live-mobile/src/families/celo/RevokeFlow/01-Summary.tsx @@ -1,4 +1,4 @@ -import { getAccountUnit, getMainAccount } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; @@ -23,6 +23,7 @@ import Line from "../components/Line"; import Words from "../components/Words"; import type { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { CeloRevokeFlowFlowParamList } from "./types"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = BaseComposite< StackNavigatorProps @@ -210,7 +211,7 @@ function SummaryWords({ onChangeValidator: () => void; onChangeAmount: () => void; }) { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formattedAmount = formatCurrencyUnit(unit, new BigNumber(amount), { disableRounding: true, alwaysShowSign: false, diff --git a/apps/ledger-live-mobile/src/families/celo/RevokeFlow/VoteAmount.tsx b/apps/ledger-live-mobile/src/families/celo/RevokeFlow/VoteAmount.tsx index 2c0c8314fd14..32803b1eb9ca 100644 --- a/apps/ledger-live-mobile/src/families/celo/RevokeFlow/VoteAmount.tsx +++ b/apps/ledger-live-mobile/src/families/celo/RevokeFlow/VoteAmount.tsx @@ -13,7 +13,6 @@ import { useSelector } from "react-redux"; import { Trans } from "react-i18next"; import invariant from "invariant"; import { useTheme } from "@react-navigation/native"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { Transaction as CeloTransaction } from "@ledgerhq/live-common/families/celo/types"; import { accountScreenSelector } from "~/reducers/accounts"; @@ -29,6 +28,7 @@ import SendRowsFee from "../SendRowsFee"; import { getFirstStatusError } from "../../helpers"; import type { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { CeloRevokeFlowFlowParamList } from "./types"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = BaseComposite< StackNavigatorProps @@ -93,7 +93,7 @@ export default function VoteAmount({ navigation, route }: Props) { const { useAllAmount } = transaction; const { amount } = status; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const error = amount.eq(0) || bridgePending ? null : getFirstStatusError(status, "errors"); const warning = getFirstStatusError(status, "warnings"); diff --git a/apps/ledger-live-mobile/src/families/celo/SendRowsFee.tsx b/apps/ledger-live-mobile/src/families/celo/SendRowsFee.tsx index feef6ecc8909..0773c148e5b4 100644 --- a/apps/ledger-live-mobile/src/families/celo/SendRowsFee.tsx +++ b/apps/ledger-live-mobile/src/families/celo/SendRowsFee.tsx @@ -4,7 +4,7 @@ import type { Account, AccountLike } from "@ledgerhq/types-live"; import { Trans } from "react-i18next"; import type { Transaction } from "@ledgerhq/live-common/generated/types"; import type { Transaction as CeloTransaction } from "@ledgerhq/live-common/families/celo/types"; -import { getAccountUnit, getAccountCurrency } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { CompositeScreenProps, useTheme } from "@react-navigation/native"; import SummaryRow from "~/screens/SendFunds/SummaryRow"; import LText from "~/components/LText"; @@ -23,6 +23,7 @@ import type { CeloRevokeFlowFlowParamList } from "./RevokeFlow/types"; import type { CeloUnlockFlowParamList } from "./UnlockFlow/types"; import type { CeloVoteFlowParamList } from "./VoteFlow/types"; import type { CeloWithdrawFlowParamList } from "./WithdrawFlow/types"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: AccountLike; @@ -47,7 +48,7 @@ export default function CeloFeeRow({ account, transaction }: Props) { }, []); const fees = (transaction as CeloTransaction).fees; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); return ( diff --git a/apps/ledger-live-mobile/src/families/celo/UnlockFlow/01-Amount.tsx b/apps/ledger-live-mobile/src/families/celo/UnlockFlow/01-Amount.tsx index 10847b1853b4..9ebcd22b7899 100644 --- a/apps/ledger-live-mobile/src/families/celo/UnlockFlow/01-Amount.tsx +++ b/apps/ledger-live-mobile/src/families/celo/UnlockFlow/01-Amount.tsx @@ -14,7 +14,7 @@ import { Trans } from "react-i18next"; import invariant from "invariant"; import { useTheme } from "@react-navigation/native"; import { useDebounce } from "@ledgerhq/live-common/hooks/useDebounce"; -import { getAccountUnit, getMainAccount } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import { Transaction as CeloTransaction } from "@ledgerhq/live-common/families/celo/types"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { accountScreenSelector } from "~/reducers/accounts"; @@ -30,6 +30,7 @@ import { getFirstStatusError, hasStatusError } from "../../helpers"; import SendRowsFee from "../SendRowsFee"; import type { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import type { CeloUnlockFlowParamList } from "./types"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; type Props = BaseComposite< StackNavigatorProps @@ -109,11 +110,12 @@ export default function UnlockAmount({ navigation, route }: Props) { const blur = useCallback(() => Keyboard.dismiss(), []); - if (!account || !transaction) return null; + const unit = useMaybeAccountUnit(account); + + if (!account || !transaction || !unit) return null; const { useAllAmount } = transaction; const { amount } = status; - const unit = getAccountUnit(account); const error = amount.eq(0) || bridgePending ? null : getFirstStatusError(status, "errors"); const warning = getFirstStatusError(status, "warnings"); diff --git a/apps/ledger-live-mobile/src/families/celo/ValidatorRow.tsx b/apps/ledger-live-mobile/src/families/celo/ValidatorRow.tsx index d78af93e659c..ef1eda1c5830 100644 --- a/apps/ledger-live-mobile/src/families/celo/ValidatorRow.tsx +++ b/apps/ledger-live-mobile/src/families/celo/ValidatorRow.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { isDefaultValidatorGroupAddress } from "@ledgerhq/live-common/families/celo/logic"; import { AccountLike } from "@ledgerhq/types-live"; import { Text } from "@ledgerhq/native-ui"; @@ -11,6 +10,7 @@ import BigNumber from "bignumber.js"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import Touchable from "~/components/Touchable"; import ValidatorImage from "./ValidatorImage"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; const ValidatorRow = ({ onPress, @@ -26,7 +26,7 @@ const ValidatorRow = ({ amount: BigNumber; }) => { const { colors } = useTheme(); - + const unit = useAccountUnit(account); const onPressT = useCallback(() => { onPress(validator, vote); }, [onPress, validator, vote]); @@ -68,7 +68,7 @@ const ValidatorRow = ({ - + diff --git a/apps/ledger-live-mobile/src/families/celo/VoteFlow/02-Summary.tsx b/apps/ledger-live-mobile/src/families/celo/VoteFlow/02-Summary.tsx index c5d91c6bde24..d36418276fb7 100644 --- a/apps/ledger-live-mobile/src/families/celo/VoteFlow/02-Summary.tsx +++ b/apps/ledger-live-mobile/src/families/celo/VoteFlow/02-Summary.tsx @@ -1,8 +1,4 @@ -import { - getAccountCurrency, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { formatCurrencyUnit, getCurrencyColor } from "@ledgerhq/live-common/currencies/index"; @@ -35,6 +31,7 @@ import Line from "../components/Line"; import Words from "../components/Words"; import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { CeloVoteFlowParamList } from "./types"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps; @@ -280,7 +277,7 @@ function SummaryWords({ onChangeValidator: () => void; onChangeAmount: () => void; }) { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formattedAmount = formatCurrencyUnit(unit, new BigNumber(amount), { disableRounding: true, alwaysShowSign: false, @@ -309,7 +306,7 @@ function SummaryWords({ } const AccountBalanceTag = ({ account }: { account: AccountLike }) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { colors } = useTheme(); return ( diff --git a/apps/ledger-live-mobile/src/families/celo/VoteFlow/VoteAmount.tsx b/apps/ledger-live-mobile/src/families/celo/VoteFlow/VoteAmount.tsx index 57160e7d6726..c485f83ac5c2 100644 --- a/apps/ledger-live-mobile/src/families/celo/VoteFlow/VoteAmount.tsx +++ b/apps/ledger-live-mobile/src/families/celo/VoteFlow/VoteAmount.tsx @@ -13,7 +13,6 @@ import { useSelector } from "react-redux"; import { Trans } from "react-i18next"; import invariant from "invariant"; import { useTheme } from "@react-navigation/native"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { accountScreenSelector } from "~/reducers/accounts"; import { ScreenName } from "~/const"; @@ -28,6 +27,7 @@ import SendRowsFee from "../SendRowsFee"; import { getFirstStatusError } from "../../helpers"; import type { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import type { CeloVoteFlowParamList } from "./types"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = BaseComposite>; @@ -89,7 +89,7 @@ export default function VoteAmount({ navigation, route }: Props) { const { useAllAmount } = transaction; const { amount } = status; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const error = amount.eq(0) || bridgePending ? null : getFirstStatusError(status, "errors"); const warning = getFirstStatusError(status, "warnings"); diff --git a/apps/ledger-live-mobile/src/families/celo/WithdrawFlow/WithdrawAmount.tsx b/apps/ledger-live-mobile/src/families/celo/WithdrawFlow/WithdrawAmount.tsx index 07495e57ef31..38ca4bf8fffe 100644 --- a/apps/ledger-live-mobile/src/families/celo/WithdrawFlow/WithdrawAmount.tsx +++ b/apps/ledger-live-mobile/src/families/celo/WithdrawFlow/WithdrawAmount.tsx @@ -6,7 +6,6 @@ import { useSelector } from "react-redux"; import { Trans } from "react-i18next"; import invariant from "invariant"; import { useTheme } from "@react-navigation/native"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { getMainAccount } from "@ledgerhq/live-common/account/helpers"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; @@ -29,6 +28,7 @@ import Words from "../components/Words"; import ErrorAndWarning from "../components/ErrorAndWarning"; import type { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import type { CeloWithdrawFlowParamList } from "./types"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; type Props = BaseComposite< StackNavigatorProps @@ -81,7 +81,8 @@ export default function WithdrawAmount({ navigation, route }: Props) { }); }; - if (!account || !transaction) return null; + const unit = useMaybeAccountUnit(account); + if (!account || !transaction || !unit) return null; const { pendingWithdrawals } = (account as CeloAccount).celoResources; if (pendingWithdrawals) { @@ -89,7 +90,6 @@ export default function WithdrawAmount({ navigation, route }: Props) { onChange(pendingWithdrawals[0].index); } } - const unit = getAccountUnit(account); const formatAmount = (val: BigNumber) => { return formatCurrencyUnit(unit, val, { disableRounding: true, diff --git a/apps/ledger-live-mobile/src/families/celo/operationDetails.tsx b/apps/ledger-live-mobile/src/families/celo/operationDetails.tsx index a4b45fbadb0e..475cec9af4d3 100644 --- a/apps/ledger-live-mobile/src/families/celo/operationDetails.tsx +++ b/apps/ledger-live-mobile/src/families/celo/operationDetails.tsx @@ -8,7 +8,6 @@ import { OperationType } from "@ledgerhq/types-live"; import { useCeloPreloadData } from "@ledgerhq/live-common/families/celo/react"; import { CeloAccount, CeloOperation } from "@ledgerhq/live-common/families/celo/types"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { useRoute } from "@react-navigation/native"; import Section from "~/screens/OperationDetails/Section"; import { discreetModeSelector } from "~/reducers/settings"; @@ -16,6 +15,7 @@ import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { BaseNavigatorStackParamList } from "~/components/RootNavigator/types/BaseNavigator"; import { ScreenName } from "~/const"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { operation: CeloOperation; @@ -29,7 +29,7 @@ const OperationDetailsExtra = ({ operation, type, account }: Props) => { const { t } = useTranslation(); const discreet = useSelector(discreetModeSelector); const { locale } = useSettings(); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { validatorGroups: celoValidators } = useCeloPreloadData(); const { extra } = operation; const optimisticOperation = useRoute().params?.operation ?? null; diff --git a/apps/ledger-live-mobile/src/families/cosmos/AccountBalanceSummaryFooter.tsx b/apps/ledger-live-mobile/src/families/cosmos/AccountBalanceSummaryFooter.tsx index 561bd062c5ae..cd0f36a73987 100644 --- a/apps/ledger-live-mobile/src/families/cosmos/AccountBalanceSummaryFooter.tsx +++ b/apps/ledger-live-mobile/src/families/cosmos/AccountBalanceSummaryFooter.tsx @@ -2,7 +2,6 @@ import React, { useCallback, useEffect, useState } from "react"; import { ScrollView } from "react-native"; import { useTranslation } from "react-i18next"; import BigNumber from "bignumber.js"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { getCryptoCurrencyIcon } from "@ledgerhq/live-common/reactNative"; import { CosmosAccount } from "@ledgerhq/live-common/families/cosmos/types"; import { CosmosAPI } from "@ledgerhq/live-common/families/cosmos/api/Cosmos"; @@ -14,6 +13,7 @@ import InfoModal from "~/modals/Info"; import type { ModalInfo } from "~/modals/Info"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import InfoItem from "~/components/BalanceSummaryInfoItem"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: CosmosAccount; @@ -32,7 +32,7 @@ function AccountBalanceSummaryFooter({ account }: Props) { const info = useInfo(account); const { spendableBalance, cosmosResources } = account; const { delegatedBalance, unbondingBalance } = cosmosResources || {}; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const onCloseModal = useCallback(() => { setInfoName(undefined); }, []); diff --git a/apps/ledger-live-mobile/src/families/cosmos/ClaimRewardsFlow/01-SelectValidator.tsx b/apps/ledger-live-mobile/src/families/cosmos/ClaimRewardsFlow/01-SelectValidator.tsx index 236129ec5f7a..0e4452c6c16c 100644 --- a/apps/ledger-live-mobile/src/families/cosmos/ClaimRewardsFlow/01-SelectValidator.tsx +++ b/apps/ledger-live-mobile/src/families/cosmos/ClaimRewardsFlow/01-SelectValidator.tsx @@ -9,7 +9,7 @@ import type { Transaction, } from "@ledgerhq/live-common/families/cosmos/types"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getMainAccount, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { useCosmosFamilyMappedDelegations } from "@ledgerhq/live-common/families/cosmos/react"; import { useTheme } from "@react-navigation/native"; @@ -19,6 +19,7 @@ import Item from "../shared/Item"; import type { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import type { CosmosClaimRewardsFlowParamList } from "./types"; import BigNumber from "bignumber.js"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps< CosmosClaimRewardsFlowParamList, @@ -44,7 +45,7 @@ function ClaimRewardsSelectValidator({ navigation, route }: Props) { }; }).transaction as Transaction; invariant(transaction && transaction.validators, "transaction and validators required"); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const delegations = useCosmosFamilyMappedDelegations(mainAccount, "claimReward"); const onSelect = useCallback( (validator: CosmosValidatorItem, value?: BigNumber | null) => { diff --git a/apps/ledger-live-mobile/src/families/cosmos/ClaimRewardsFlow/02-SelectMethod.tsx b/apps/ledger-live-mobile/src/families/cosmos/ClaimRewardsFlow/02-SelectMethod.tsx index cec34ca3f263..050460d709c8 100644 --- a/apps/ledger-live-mobile/src/families/cosmos/ClaimRewardsFlow/02-SelectMethod.tsx +++ b/apps/ledger-live-mobile/src/families/cosmos/ClaimRewardsFlow/02-SelectMethod.tsx @@ -6,11 +6,7 @@ import { Trans } from "react-i18next"; import { useSelector } from "react-redux"; import type { CosmosAccount, Transaction } from "@ledgerhq/live-common/families/cosmos/types"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { - getAccountUnit, - getMainAccount, - getAccountCurrency, -} from "@ledgerhq/live-common/account/index"; +import { getMainAccount, getAccountCurrency } from "@ledgerhq/live-common/account/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { useTheme } from "@react-navigation/native"; import cosmosBase from "@ledgerhq/live-common/families/cosmos/chain/cosmosBase"; @@ -27,6 +23,7 @@ import TranslatedError from "~/components/TranslatedError"; import ValidatorImage from "../shared/ValidatorImage"; import type { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import type { CosmosClaimRewardsFlowParamList } from "./types"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; const options = [ { @@ -62,7 +59,7 @@ function ClaimRewardsAmount({ navigation, route }: Props) { invariant(account && account.cosmosResources, "account and cosmos transaction required"); const bridge = getAccountBridge(account, undefined); const mainAccount = getMainAccount(account, undefined); - const unit = getAccountUnit(mainAccount); + const unit = useAccountUnit(mainAccount); const currency = getAccountCurrency(mainAccount); const bridgeTransaction = useBridgeTransaction(() => { const tx = route.params.transaction; diff --git a/apps/ledger-live-mobile/src/families/cosmos/DelegationFlow/02-Summary.tsx b/apps/ledger-live-mobile/src/families/cosmos/DelegationFlow/02-Summary.tsx index 7af15e201ae9..11cdb715ff40 100644 --- a/apps/ledger-live-mobile/src/families/cosmos/DelegationFlow/02-Summary.tsx +++ b/apps/ledger-live-mobile/src/families/cosmos/DelegationFlow/02-Summary.tsx @@ -1,8 +1,4 @@ -import { - getAccountCurrency, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { formatCurrencyUnit, getCurrencyColor } from "@ledgerhq/live-common/currencies/index"; @@ -34,6 +30,7 @@ import ValidatorImage from "../shared/ValidatorImage"; import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { CosmosDelegationFlowParamList } from "./types"; import Config from "react-native-config"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps< CosmosDelegationFlowParamList, @@ -356,7 +353,7 @@ function SummaryWords({ onChangeValidator: () => void; onChangeAmount: () => void; }) { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formattedAmount = formatCurrencyUnit(unit, amount, { disableRounding: true, alwaysShowSign: false, @@ -388,7 +385,7 @@ function SummaryWords({ } const AccountBalanceTag = ({ account }: { account: AccountLike }) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { colors } = useTheme(); return ( diff --git a/apps/ledger-live-mobile/src/families/cosmos/Delegations/index.tsx b/apps/ledger-live-mobile/src/families/cosmos/Delegations/index.tsx index 1543c799e16f..377a59b11a8b 100644 --- a/apps/ledger-live-mobile/src/families/cosmos/Delegations/index.tsx +++ b/apps/ledger-live-mobile/src/families/cosmos/Delegations/index.tsx @@ -3,11 +3,7 @@ import React, { useCallback, useState, useMemo, useEffect } from "react"; import { View, StyleSheet, Linking } from "react-native"; import { useNavigation, useRoute, useTheme } from "@react-navigation/native"; import { useTranslation } from "react-i18next"; -import { - getAccountCurrency, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import { getDefaultExplorerView, getAddressExplorer } from "@ledgerhq/live-common/explorers"; import { useCosmosFamilyMappedDelegations, @@ -59,6 +55,8 @@ import AccountBanner from "~/components/AccountBanner"; import { getAccountBannerProps as getCosmosBannerProps } from "../utils"; import ValidatorImage from "../shared/ValidatorImage"; import { useCanShowStake } from "~/screens/Account/hooks/useCanShowStake"; +import { useAccountName } from "~/reducers/wallet"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: CosmosAccount; @@ -74,7 +72,7 @@ function Delegations({ account }: Props) { const delegations: CosmosMappedDelegation[] = useCosmosFamilyMappedDelegations(mainAccount); const currency = getAccountCurrency(mainAccount); - const unit = getAccountUnit(mainAccount); + const unit = useAccountUnit(account); const navigation = useNavigation(); const route = useRoute(); @@ -236,6 +234,8 @@ function Delegations({ account }: Props) { [account.currency], ); + const accountName = useAccountName(account); + const data = useMemo(() => { const d = delegation || undelegation; @@ -286,7 +286,7 @@ function Delegations({ account }: Props) { style={[styles.valueText]} color="live" > - {account.name}{" "} + {accountName}{" "} ), }, @@ -363,7 +363,7 @@ function Delegations({ account }: Props) { : []), ] : []; - }, [delegation, t, account, onOpenExplorer, undelegation]); + }, [delegation, t, account, accountName, onOpenExplorer, undelegation]); const actions = useMemo(() => { const rewardsDisabled = diff --git a/apps/ledger-live-mobile/src/families/cosmos/SendRowsFee.tsx b/apps/ledger-live-mobile/src/families/cosmos/SendRowsFee.tsx index b8159aaf56a4..a980ef9b64e1 100644 --- a/apps/ledger-live-mobile/src/families/cosmos/SendRowsFee.tsx +++ b/apps/ledger-live-mobile/src/families/cosmos/SendRowsFee.tsx @@ -4,7 +4,7 @@ import type { Account, AccountLike } from "@ledgerhq/types-live"; import { Trans } from "react-i18next"; import type { Transaction } from "@ledgerhq/live-common/generated/types"; import type { Transaction as CosmosTransaction } from "@ledgerhq/live-common/families/cosmos/types"; -import { getAccountUnit, getAccountCurrency } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { CompositeScreenProps, useTheme } from "@react-navigation/native"; import SummaryRow from "~/screens/SendFunds/SummaryRow"; import LText from "~/components/LText"; @@ -18,6 +18,7 @@ import type { SendFundsNavigatorStackParamList } from "~/components/RootNavigato import { ScreenName } from "~/const"; import type { SignTransactionNavigatorParamList } from "~/components/RootNavigator/types/SignTransactionNavigator"; import type { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: AccountLike; @@ -36,7 +37,7 @@ export default function CosmosFeeRow({ account, transaction }: Props) { Linking.openURL(urls.feesMoreInfo); }, []); const fees = (transaction as CosmosTransaction).fees; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); return ( @@ -55,7 +55,7 @@ function DelegationAmount({ navigation, route }: Props) { ); const bridge = getAccountBridge(account, undefined); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const initialValue = useMemo(() => route?.params?.value ?? BigNumber(0), [route]); const redelegatedBalance = route?.params?.redelegatedBalance ?? BigNumber(0); const mode = route?.params?.mode ?? "delegation"; diff --git a/apps/ledger-live-mobile/src/families/cosmos/shared/ValidatorRow.tsx b/apps/ledger-live-mobile/src/families/cosmos/shared/ValidatorRow.tsx index 86c79959de5f..9cc3c044e77a 100644 --- a/apps/ledger-live-mobile/src/families/cosmos/shared/ValidatorRow.tsx +++ b/apps/ledger-live-mobile/src/families/cosmos/shared/ValidatorRow.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { CosmosValidatorItem } from "@ledgerhq/live-common/families/cosmos/types"; import cosmosBase from "@ledgerhq/live-common/families/cosmos/chain/cosmosBase"; import { AccountLike } from "@ledgerhq/types-live"; @@ -9,6 +8,7 @@ import { StyleSheet, View } from "react-native"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import Touchable from "~/components/Touchable"; import ValidatorImage from "./ValidatorImage"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; const ValidatorRow = ({ onPress, @@ -22,6 +22,7 @@ const ValidatorRow = ({ const onPressT = useCallback(() => { onPress(validator); }, [validator, onPress]); + const unit = useAccountUnit(account); return ( - + diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Body/components/Drawer/hooks/useDrawerItems.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Body/components/Drawer/hooks/useDrawerItems.tsx index 70a47e3e58bf..47c630f6d259 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Body/components/Drawer/hooks/useDrawerItems.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Body/components/Drawer/hooks/useDrawerItems.tsx @@ -1,7 +1,6 @@ import React, { useCallback, useMemo } from "react"; import { useTranslation } from "react-i18next"; import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { Linking } from "react-native"; import { getAddressExplorer, getDefaultExplorerView } from "@ledgerhq/live-common/explorers"; @@ -14,6 +13,8 @@ import LText from "~/components/LText"; import Touchable from "~/components/Touchable"; import styles from "../styles"; +import { useAccountName } from "~/reducers/wallet"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Handle the hook declaration. @@ -23,7 +24,7 @@ const useDrawerItems = (data: DrawerPropsType["data"], account: ElrondAccount) = const { type, validator, claimableRewards, seconds } = data; const { t } = useTranslation(); - const unit = useMemo(() => getAccountUnit(account), [account]); + const unit = useAccountUnit(account); const [isDelegation, isUndelegation] = useMemo( () => [type === "delegation", type === "undelegation"], [type], @@ -82,6 +83,8 @@ const useDrawerItems = (data: DrawerPropsType["data"], account: ElrondAccount) = [isDelegation, claimableRewards], ); + const accountName = useAccountName(account); + /* * Compose the array of common items between the two types of drawers (validator name, validator address, account name and item status). */ @@ -128,7 +131,7 @@ const useDrawerItems = (data: DrawerPropsType["data"], account: ElrondAccount) = style={styles.valueText} color="live" > - {account.name} + {accountName} ), }, @@ -147,7 +150,7 @@ const useDrawerItems = (data: DrawerPropsType["data"], account: ElrondAccount) = ), }, ], - [validator, name, t, account.name, type, status, onExplorer], + [validator, name, t, accountName, type, status, onExplorer], ); /* diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Body/components/Rewards/Rewards.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Body/components/Rewards/Rewards.tsx index 07a3e2f8dc67..0185ee6f1a43 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Body/components/Rewards/Rewards.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Body/components/Rewards/Rewards.tsx @@ -2,11 +2,7 @@ import React, { useCallback, useMemo } from "react"; import { useNavigation } from "@react-navigation/native"; import { View } from "react-native"; import { useTranslation } from "react-i18next"; -import { - getAccountCurrency, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import BigNumber from "bignumber.js"; import type { StackNavigationProp } from "@react-navigation/stack"; @@ -21,6 +17,7 @@ import LText from "~/components/LText"; import { ScreenName, NavigatorName } from "~/const"; import styles from "./styles"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Handle the component declaration. @@ -30,7 +27,7 @@ const Rewards = (props: RewardsPropsType) => { const { account, delegations } = props; const { t } = useTranslation(); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const navigation: StackNavigationProp = useNavigation(); const currency = getAccountCurrency(getMainAccount(account, undefined)); diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Details/Details.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Details/Details.tsx index e59af815263d..94521c5f7a33 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Details/Details.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Details/Details.tsx @@ -2,7 +2,6 @@ import React, { useCallback } from "react"; import { Linking, View } from "react-native"; import { useTranslation } from "react-i18next"; import { useElrondPreloadData } from "@ledgerhq/live-common/families/elrond/react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { BigNumber } from "bignumber.js"; import { useSelector } from "react-redux"; @@ -14,6 +13,7 @@ import type { DetailsPropsType } from "./types"; import Section from "~/screens/OperationDetails/Section"; import { discreetModeSelector } from "~/reducers/settings"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Handle the component declaration. @@ -25,7 +25,7 @@ const Details = (props: DetailsPropsType) => { const discreet = useSelector(discreetModeSelector); const { locale } = useSettings(); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { extra } = operation; const contract = operation && operation.contract ? operation.contract : ""; diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Claim/components/PickMethod/PickMethod.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Claim/components/PickMethod/PickMethod.tsx index ef9b6ec7204a..3ab03bb93487 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Claim/components/PickMethod/PickMethod.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Claim/components/PickMethod/PickMethod.tsx @@ -5,11 +5,7 @@ import { Trans } from "react-i18next"; import { BigNumber } from "bignumber.js"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { handleTransactionStatus } from "@ledgerhq/live-common/families/elrond/helpers/handleTransactionStatus"; -import { - getAccountUnit, - getMainAccount, - getAccountCurrency, -} from "@ledgerhq/live-common/account/index"; +import { getMainAccount, getAccountCurrency } from "@ledgerhq/live-common/account/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { MIN_DELEGATION_AMOUNT } from "@ledgerhq/live-common/families/elrond/constants"; @@ -31,6 +27,7 @@ import { ScreenName } from "~/const"; import { TransactionMethodEnum } from "./enums"; import styles from "./styles"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Handle the component declaration. @@ -47,7 +44,7 @@ const PickMethod = (props: PickMethodPropsType) => { const mainAccount = getMainAccount(account, undefined); const currency = getAccountCurrency(mainAccount); const bridge: AccountBridge = getAccountBridge(account); - const unit = getAccountUnit(mainAccount); + const unit = useAccountUnit(mainAccount); const methods = [TransactionMethodEnum.claimRewards, TransactionMethodEnum.reDelegateRewards]; const currentDelegation = useMemo( diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Claim/components/PickValidator/PickValidator.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Claim/components/PickValidator/PickValidator.tsx index d9165836be72..06d7ffcb6498 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Claim/components/PickValidator/PickValidator.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Claim/components/PickValidator/PickValidator.tsx @@ -2,7 +2,7 @@ import React, { useMemo, useCallback } from "react"; import { View, FlatList } from "react-native"; import { useTheme } from "@react-navigation/native"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getMainAccount, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import BigNumber from "bignumber.js"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; @@ -12,6 +12,7 @@ import Item from "./components/Item"; import type { onSelectType, PickValidatorPropsType } from "./types"; import styles from "./styles"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Handle the component declaration. @@ -24,7 +25,7 @@ const PickValidator = (props: PickValidatorPropsType) => { const mainAccount = getMainAccount(account, undefined); const bridge = getAccountBridge(account, undefined); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); /* * Initialize a new transaction on mount and set the mode to "claimRewards". diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/PickAmount/PickAmount.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/PickAmount/PickAmount.tsx index 9b2086bd3b22..a4973ad85398 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/PickAmount/PickAmount.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/PickAmount/PickAmount.tsx @@ -3,7 +3,6 @@ import { View, Keyboard, TouchableOpacity, TouchableWithoutFeedback, Platform } import { Trans } from "react-i18next"; import { BigNumber } from "bignumber.js"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { useTheme } from "styled-components/native"; @@ -23,6 +22,7 @@ import KeyboardView from "~/components/KeyboardView"; import styles from "./styles"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Handle the component declaration. @@ -33,7 +33,7 @@ const PickAmount = (props: PickAmountPropsType) => { const { navigation, route } = props; const { account, validators } = route.params; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { locale } = useSettings(); const bridge = getAccountBridge(account); const transaction = route.params.transaction as Transaction; diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/PickValidator/components/Item/Item.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/PickValidator/components/Item/Item.tsx index 7bb82aec5ed3..083730a44812 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/PickValidator/components/Item/Item.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/PickValidator/components/Item/Item.tsx @@ -1,5 +1,4 @@ import React from "react"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { Text } from "@ledgerhq/native-ui"; import { useTheme } from "@react-navigation/native"; import { Trans } from "react-i18next"; @@ -16,6 +15,7 @@ import LedgerLogo from "~/icons/LiveLogo"; import type { ItemPropsType } from "./types"; import styles from "./styles"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Handle the component declaration. @@ -25,6 +25,7 @@ const Item = (props: ItemPropsType) => { const { colors } = useTheme(); const { onSelect, item, account } = props; const name = item.identity.name || item.contract; + const unit = useAccountUnit(account); /* * Return null in case the item has a setting of disabled. @@ -64,7 +65,7 @@ const Item = (props: ItemPropsType) => { diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/SetDelegation/SetDelegation.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/SetDelegation/SetDelegation.tsx index e43bebfccf1a..707f34d8aa64 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/SetDelegation/SetDelegation.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Delegate/components/SetDelegation/SetDelegation.tsx @@ -6,11 +6,7 @@ import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { handleTransactionStatus } from "@ledgerhq/live-common/families/elrond/helpers/handleTransactionStatus"; import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate"; import { getCurrencyColor } from "@ledgerhq/live-common/currencies/index"; -import { - getAccountCurrency, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import { Text } from "@ledgerhq/native-ui"; import { Trans } from "react-i18next"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; @@ -34,6 +30,7 @@ import { rgba } from "../../../../../../../colors"; import type { SetDelegationPropsType } from "./types"; import styles from "./styles"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Handle the component declaration. @@ -48,7 +45,7 @@ const SetDelegation = (props: SetDelegationPropsType) => { const color = getCurrencyColor(currency); const bridge = getAccountBridge(account); const mainAccount = getMainAccount(account, undefined); - const unit = useMemo(() => getAccountUnit(account), [account]); + const unit = useAccountUnit(account); /* * Find the validator that'll be picked by default, which is the one from Ledger. diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Undelegate/components/PickAmount/PickAmount.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Undelegate/components/PickAmount/PickAmount.tsx index 87b9369c7dfb..85d2b065f35d 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Undelegate/components/PickAmount/PickAmount.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Undelegate/components/PickAmount/PickAmount.tsx @@ -4,7 +4,6 @@ import { Trans } from "react-i18next"; import { BigNumber } from "bignumber.js"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { denominate } from "@ledgerhq/live-common/families/elrond/helpers/denominate"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { useTheme } from "styled-components/native"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; @@ -22,6 +21,7 @@ import KeyboardView from "~/components/KeyboardView"; import styles from "./styles"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Handle the component declaration. @@ -32,7 +32,7 @@ const PickAmount = (props: PickAmountPropsType) => { const { navigation, route } = props; const { amount, account, validator } = route.params; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const bridge = getAccountBridge(account, undefined); const { locale } = useSettings(); diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Withdraw/components/WithdrawFunds/WithdrawFunds.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Withdraw/components/WithdrawFunds/WithdrawFunds.tsx index 478628f2d369..851d8207b1a4 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Flows/Withdraw/components/WithdrawFunds/WithdrawFunds.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Flows/Withdraw/components/WithdrawFunds/WithdrawFunds.tsx @@ -4,11 +4,7 @@ import { Trans } from "react-i18next"; import { useTheme } from "@react-navigation/native"; import { handleTransactionStatus } from "@ledgerhq/live-common/families/elrond/helpers/handleTransactionStatus"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { - getAccountUnit, - getMainAccount, - getAccountCurrency, -} from "@ledgerhq/live-common/account/index"; +import { getMainAccount, getAccountCurrency } from "@ledgerhq/live-common/account/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import Button from "~/components/Button"; @@ -22,6 +18,7 @@ import { ScreenName } from "~/const"; import type { WithdrawFundsPropsType } from "./types"; import styles from "./styles"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Handle the component declaration. @@ -35,7 +32,7 @@ const WithdrawFunds = (props: WithdrawFundsPropsType) => { const mainAccount = getMainAccount(account, undefined); const currency = getAccountCurrency(mainAccount); const bridge = getAccountBridge(account); - const unit = getAccountUnit(mainAccount); + const unit = useAccountUnit(mainAccount); const name = validator.identity.name || validator.contract; /* diff --git a/apps/ledger-live-mobile/src/families/elrond/components/Summary/Summary.tsx b/apps/ledger-live-mobile/src/families/elrond/components/Summary/Summary.tsx index 77cb11df1c8d..731e33cdc814 100644 --- a/apps/ledger-live-mobile/src/families/elrond/components/Summary/Summary.tsx +++ b/apps/ledger-live-mobile/src/families/elrond/components/Summary/Summary.tsx @@ -2,7 +2,6 @@ import React, { useCallback, useMemo, useEffect, useState, FC } from "react"; import { ScrollView } from "react-native"; import { useTranslation } from "react-i18next"; import { BigNumber } from "bignumber.js"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import type { ElrondAccount } from "@ledgerhq/live-common/families/elrond/types"; import type { DelegationType } from "../../types"; @@ -13,6 +12,7 @@ import InfoItem from "~/components/BalanceSummaryInfoItem"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import styles from "./styles"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; /* * Create a higher order component that will return null if balance is zero (thus unable to delegate). @@ -29,7 +29,7 @@ const Summary = (props: SummaryPropsType) => { const { t } = useTranslation(); const account = props.account as ElrondAccount; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); /* * Declare the data state (for the dynamic information modal) and the delegation resources state (tracking server updates). diff --git a/apps/ledger-live-mobile/src/families/hedera/Confirmation.tsx b/apps/ledger-live-mobile/src/families/hedera/Confirmation.tsx index 65f98752e6a0..2bff086b25b5 100644 --- a/apps/ledger-live-mobile/src/families/hedera/Confirmation.tsx +++ b/apps/ledger-live-mobile/src/families/hedera/Confirmation.tsx @@ -6,11 +6,7 @@ import QRCode from "react-native-qrcode-svg"; import { Trans } from "react-i18next"; import ReactNativeModal from "react-native-modal"; import type { Account, TokenAccount } from "@ledgerhq/types-live"; -import { - getMainAccount, - getAccountCurrency, - getAccountName, -} from "@ledgerhq/live-common/account/index"; +import { getMainAccount, getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { CompositeScreenProps, useTheme } from "@react-navigation/native"; import getWindowDimensions from "~/logic/getWindowDimensions"; import { accountScreenSelector } from "~/reducers/accounts"; @@ -38,6 +34,7 @@ import type { StackNavigatorNavigation, StackNavigatorProps, } from "~/components/RootNavigator/types/helpers"; +import { useMaybeAccountName } from "~/reducers/wallet"; type ScreenProps = CompositeScreenProps< StackNavigatorProps, @@ -84,6 +81,10 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { navigation.getParent>()?.pop(); } + const accountName = useMaybeAccountName(account); + const mainAccount = account && getMainAccount(account, parentAccount); + const mainAccountName = useMaybeAccountName(mainAccount); + useEffect(() => { if (!allowNavigation) { navigation.setOptions({ @@ -101,14 +102,13 @@ export default function ReceiveConfirmation({ navigation, route }: Props) { gestureEnabled: Platform.OS === "ios", }); }, [allowNavigation, colors, navigation]); - if (!account) return null; + if (!mainAccount || !account) return null; const { width } = getWindowDimensions(); const unsafe = !route.params.device?.deviceId; const QRSize = Math.round(width / 1.8 - 16); - const mainAccount = getMainAccount(account, parentAccount); const address = mainAccount.freshAddress; const currency = getAccountCurrency(account); - const name = mainAccount.name; + const name = mainAccountName; return ( - {getAccountName(account)} + {accountName} diff --git a/apps/ledger-live-mobile/src/families/near/AccountBalanceSummaryFooter.tsx b/apps/ledger-live-mobile/src/families/near/AccountBalanceSummaryFooter.tsx index 4906d59ffc15..cf90e1be0e0f 100644 --- a/apps/ledger-live-mobile/src/families/near/AccountBalanceSummaryFooter.tsx +++ b/apps/ledger-live-mobile/src/families/near/AccountBalanceSummaryFooter.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { getCryptoCurrencyById } from "@ledgerhq/live-common/currencies/index"; import { NearAccount } from "@ledgerhq/live-common/families/near/types"; import { getCryptoCurrencyIcon } from "@ledgerhq/live-common/reactNative"; @@ -8,6 +7,7 @@ import { TFunction, useTranslation } from "react-i18next"; import { ScrollView } from "react-native"; import InfoItem from "~/components/BalanceSummaryInfoItem"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; import type { ModalInfo } from "~/modals/Info"; import InfoModal from "~/modals/Info"; @@ -23,7 +23,7 @@ function AccountBalanceSummaryFooter({ account }: Props) { const { spendableBalance, nearResources } = account; const { storageUsageBalance, stakedBalance, pendingBalance, availableBalance } = nearResources || {}; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const onCloseModal = useCallback(() => { setInfoName(undefined); }, []); diff --git a/apps/ledger-live-mobile/src/families/near/StakingFlow/02-Summary.tsx b/apps/ledger-live-mobile/src/families/near/StakingFlow/02-Summary.tsx index daeec3afd37a..731d038d12d1 100644 --- a/apps/ledger-live-mobile/src/families/near/StakingFlow/02-Summary.tsx +++ b/apps/ledger-live-mobile/src/families/near/StakingFlow/02-Summary.tsx @@ -1,8 +1,4 @@ -import { - getAccountCurrency, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { formatCurrencyUnit, getCurrencyColor } from "@ledgerhq/live-common/currencies/index"; @@ -36,6 +32,7 @@ import TranslatedError from "~/components/TranslatedError"; import { getFirstStatusError, hasStatusError } from "../../helpers"; import type { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import type { NearStakingFlowParamList } from "./types"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = BaseComposite< StackNavigatorProps @@ -348,7 +345,7 @@ function SummaryWords({ onChangeValidator: () => void; onChangeAmount: () => void; }) { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formattedAmount = formatCurrencyUnit(unit, amount, { disableRounding: true, alwaysShowSign: false, @@ -377,7 +374,7 @@ function SummaryWords({ } const AccountBalanceTag = ({ account }: { account: AccountLike }) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { colors } = useTheme(); return ( diff --git a/apps/ledger-live-mobile/src/families/near/operationDetails.tsx b/apps/ledger-live-mobile/src/families/near/operationDetails.tsx index 38e4a54c5998..f314bf8b4490 100644 --- a/apps/ledger-live-mobile/src/families/near/operationDetails.tsx +++ b/apps/ledger-live-mobile/src/families/near/operationDetails.tsx @@ -3,11 +3,11 @@ import { useTranslation } from "react-i18next"; import type { Account, Operation } from "@ledgerhq/types-live"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { BigNumber } from "bignumber.js"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { useSelector } from "react-redux"; import Section from "~/screens/OperationDetails/Section"; import { discreetModeSelector } from "~/reducers/settings"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: Account; @@ -19,11 +19,11 @@ function OperationDetailsExtra({ account, operation }: Props) { const discreet = useSelector(discreetModeSelector); const { locale } = useSettings(); + const unit = useAccountUnit(account); if (operation.type !== "STAKE") { return null; } - const unit = getAccountUnit(account); const formattedAmount = formatCurrencyUnit(unit, new BigNumber(operation.value), { disableRounding: true, alwaysShowSign: false, diff --git a/apps/ledger-live-mobile/src/families/near/shared/02-SelectAmount.tsx b/apps/ledger-live-mobile/src/families/near/shared/02-SelectAmount.tsx index 9f5f34367205..282c999fd38a 100644 --- a/apps/ledger-live-mobile/src/families/near/shared/02-SelectAmount.tsx +++ b/apps/ledger-live-mobile/src/families/near/shared/02-SelectAmount.tsx @@ -14,7 +14,6 @@ import { useSelector } from "react-redux"; import { BigNumber } from "bignumber.js"; import type { NearAccount } from "@ledgerhq/live-common/families/near/types"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { useTheme } from "styled-components/native"; import { accountScreenSelector } from "~/reducers/accounts"; @@ -31,6 +30,7 @@ import { NearStakingFlowParamList } from "../StakingFlow/types"; import { NearUnstakingFlowParamList } from "../UnstakingFlow/types"; import { NearWithdrawingFlowParamList } from "../WithdrawingFlow/types"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = | StackNavigatorProps @@ -47,7 +47,7 @@ function StakingAmount({ navigation, route }: Props) { "account and near transaction required", ); const bridge = getAccountBridge(account, undefined); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const initialValue = useMemo(() => route?.params?.value ?? new BigNumber(0), [route]); const [value, setValue] = useState(() => initialValue); const max = useMemo(() => route?.params?.max ?? new BigNumber(0), [route]); diff --git a/apps/ledger-live-mobile/src/families/near/shared/ValidatorRow.tsx b/apps/ledger-live-mobile/src/families/near/shared/ValidatorRow.tsx index b51341e3ada1..44ed2fef1d55 100644 --- a/apps/ledger-live-mobile/src/families/near/shared/ValidatorRow.tsx +++ b/apps/ledger-live-mobile/src/families/near/shared/ValidatorRow.tsx @@ -1,5 +1,4 @@ import { BigNumber } from "bignumber.js"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { NearValidatorItem } from "@ledgerhq/live-common/families/near/types"; import { FIGMENT_NEAR_VALIDATOR_ADDRESS } from "@ledgerhq/live-common/families/near/constants"; import { AccountLike } from "@ledgerhq/types-live"; @@ -10,6 +9,7 @@ import { StyleSheet, View } from "react-native"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import Touchable from "~/components/Touchable"; import ValidatorImage from "./ValidatorImage"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; const ValidatorRow = ({ onPress, @@ -23,7 +23,7 @@ const ValidatorRow = ({ const onPressT = useCallback(() => { onPress(validator); }, [validator, onPress]); - + const unit = useAccountUnit(account); return ( - + diff --git a/apps/ledger-live-mobile/src/families/polkadot/AccountBalanceSummaryFooter.tsx b/apps/ledger-live-mobile/src/families/polkadot/AccountBalanceSummaryFooter.tsx index 66bbd7ec6a44..f224b7c69f00 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/AccountBalanceSummaryFooter.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/AccountBalanceSummaryFooter.tsx @@ -6,7 +6,6 @@ import BigNumber from "bignumber.js"; import { useTheme } from "@react-navigation/native"; import { usePolkadotPreloadData } from "@ledgerhq/live-common/families/polkadot/react"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { getCryptoCurrencyIcon } from "@ledgerhq/live-common/reactNative"; import { hasMinimumBondBalance } from "@ledgerhq/live-common/families/polkadot/logic"; import { PolkadotAccount } from "@ledgerhq/live-common/families/polkadot/types"; @@ -18,6 +17,7 @@ import BondedIcon from "~/icons/LinkIcon"; import UnbondingIcon from "~/icons/Clock"; import Unbonded from "~/icons/Undelegate"; import WarningIcon from "~/icons/Warning"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: PolkadotAccount; @@ -38,8 +38,7 @@ function AccountBalanceSummaryFooter({ account }: Props) { unlockingBalance: _unlockingBalance, unlockedBalance, } = polkadotResources || {}; - const unit = getAccountUnit(account); - + const unit = useAccountUnit(account); // NOTE: All balances are including the next one... // So we exclude each other for better understanding and ensure sum of all balances // is equal to the total balance. @@ -109,7 +108,7 @@ function useInfo(account: PolkadotAccount): Record { const { t } = useTranslation(); const preloaded = usePolkadotPreloadData(); const minimumBondBalance = new BigNumber(preloaded.minimumBondBalance); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const minimumBondBalanceStr = formatCurrencyUnit(unit, minimumBondBalance, { disableRounding: true, alwaysShowSign: false, diff --git a/apps/ledger-live-mobile/src/families/polkadot/BondFlow/02-Amount.tsx b/apps/ledger-live-mobile/src/families/polkadot/BondFlow/02-Amount.tsx index 362137eb4e0b..636e428c4779 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/BondFlow/02-Amount.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/BondFlow/02-Amount.tsx @@ -17,7 +17,7 @@ import invariant from "invariant"; import { useTheme } from "@react-navigation/native"; import type { Transaction as PolkadotTransaction } from "@ledgerhq/live-common/families/polkadot/types"; import { useDebounce } from "@ledgerhq/live-common/hooks/useDebounce"; -import { getAccountUnit, getMainAccount } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { isFirstBond } from "@ledgerhq/live-common/families/polkadot/logic"; import { PolkadotAccount } from "@ledgerhq/live-common/families/polkadot/types"; @@ -39,6 +39,7 @@ import FlowErrorBottomModal from "../components/FlowErrorBottomModal"; import SendRowsFee from "../SendRowsFee"; import { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { PolkadotBondFlowParamList } from "./types"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; const options = [ { @@ -163,10 +164,10 @@ export default function PolkadotBondAmount({ navigation, route }: Props) { }, [bridge, transaction, setTransaction], ); - if (!account || !transaction) return null; + const unit = useMaybeAccountUnit(account); + if (!account || !transaction || !unit) return null; const { useAllAmount } = transaction; const { amount } = status; - const unit = getAccountUnit(account); const rewardDestination = (transaction as { rewardDestination?: string }).rewardDestination || ""; const firstBond = isFirstBond(mainAccount); const error = amount.eq(0) || bridgePending ? null : getFirstStatusError(status, "errors"); diff --git a/apps/ledger-live-mobile/src/families/polkadot/NominateFlow/01-Validators.tsx b/apps/ledger-live-mobile/src/families/polkadot/NominateFlow/01-Validators.tsx index 94fff54328c6..97da803cba85 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/NominateFlow/01-Validators.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/NominateFlow/01-Validators.tsx @@ -55,6 +55,7 @@ import type { PolkadotNominateFlowParamList } from "./types"; import { BaseNavigatorStackParamList } from "~/components/RootNavigator/types/BaseNavigator"; import FirstLetterIcon from "~/components/FirstLetterIcon"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = BaseComposite< StackNavigatorProps @@ -116,7 +117,9 @@ function NominateSelectValidator({ navigation, route }: Props) { const { staking, validators: polkadotValidators } = preloaded; const minimumBondBalance = BigNumber(preloaded.minimumBondBalance); const hasMinBondBalance = hasMinimumBondBalance(mainAccount); - const minBondBalance = formatCurrencyUnit(mainAccount.unit, minimumBondBalance, { + const unit = useAccountUnit(mainAccount); + + const minBondBalance = formatCurrencyUnit(unit, minimumBondBalance, { disableRounding: true, alwaysShowSign: false, showCode: true, @@ -218,9 +221,10 @@ function NominateSelectValidator({ navigation, route }: Props) { onOpenExplorer, maxNominatorRewardedPerValidator, validator: drawerValidator, + unit, }) : [], - [drawerValidator, t, account, maxNominatorRewardedPerValidator, onOpenExplorer], + [drawerValidator, t, account, onOpenExplorer, maxNominatorRewardedPerValidator, unit], ); const renderItem: SectionListRenderItem = useCallback( ({ item }) => { diff --git a/apps/ledger-live-mobile/src/families/polkadot/NominateFlow/drawerInfo.tsx b/apps/ledger-live-mobile/src/families/polkadot/NominateFlow/drawerInfo.tsx index 17e20aff6ac9..2f52f176c9a7 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/NominateFlow/drawerInfo.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/NominateFlow/drawerInfo.tsx @@ -1,6 +1,6 @@ import React from "react"; import { View, StyleSheet } from "react-native"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { useTheme } from "@react-navigation/native"; import type { TFunction } from "i18next"; import type { AccountLike } from "@ledgerhq/types-live"; @@ -12,6 +12,7 @@ import CounterValue from "~/components/CounterValue"; import ExternalLink from "~/icons/ExternalLink"; import NominationDrawer from "../components/NominationDrawer"; import { Unpacked } from "~/types/helpers"; +import { Unit } from "@ledgerhq/types-cryptoassets"; type NominationDrawerData = React.ComponentProps["data"]; type NominationDrawerDatum = Unpacked; @@ -22,6 +23,7 @@ type Props = { validator: PolkadotValidator; maxNominatorRewardedPerValidator: number; onOpenExplorer: (address: string) => void; + unit: Unit; }; export function getDrawerInfo({ @@ -30,9 +32,10 @@ export function getDrawerInfo({ validator, maxNominatorRewardedPerValidator, onOpenExplorer, + unit, }: Props): NominationDrawerData { const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); + const totalStake = validator.totalBonded; const formattedCommission = validator.commission ? `${validator.commission.multipliedBy(100).toFixed(2)} %` diff --git a/apps/ledger-live-mobile/src/families/polkadot/Nominations/NominationRow.tsx b/apps/ledger-live-mobile/src/families/polkadot/Nominations/NominationRow.tsx index 17280ba05fe5..4635808d7a95 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/Nominations/NominationRow.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/Nominations/NominationRow.tsx @@ -7,7 +7,7 @@ import { PolkadotValidator, } from "@ledgerhq/live-common/families/polkadot/types"; import { Account } from "@ledgerhq/types-live"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { useTheme } from "styled-components/native"; import { Flex, Text } from "@ledgerhq/native-ui"; @@ -16,6 +16,7 @@ import CounterValue from "~/components/CounterValue"; import LText from "~/components/LText"; import ArrowRight from "~/icons/ArrowRight"; import FirstLetterIcon from "~/components/FirstLetterIcon"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { nomination: PolkadotNomination; @@ -34,7 +35,7 @@ export default function NominationRow({ nomination, validator, account, onPress // const total = validator?.totalBonded ?? null; // const commission = validator?.commission ?? null; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); return ( diff --git a/apps/ledger-live-mobile/src/families/polkadot/Nominations/UnlockingRow.tsx b/apps/ledger-live-mobile/src/families/polkadot/Nominations/UnlockingRow.tsx index 962270fc83f4..8767fc9cb399 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/Nominations/UnlockingRow.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/Nominations/UnlockingRow.tsx @@ -3,13 +3,14 @@ import isBefore from "date-fns/isBefore"; import React, { useMemo } from "react"; import { View, StyleSheet } from "react-native"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { useTheme } from "@react-navigation/native"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import CounterValue from "~/components/CounterValue"; import LText from "~/components/LText"; import DateFromNow from "~/components/DateFromNow"; import { WithdrawAction } from "./Actions"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { amount: BigNumber; @@ -28,7 +29,7 @@ export default function UnlockingRow({ isLast = false, }: Props) { const { colors } = useTheme(); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); const isUnlocked = useMemo( () => completionDate && isBefore(completionDate, new Date(Date.now())), diff --git a/apps/ledger-live-mobile/src/families/polkadot/Nominations/drawerInfo.tsx b/apps/ledger-live-mobile/src/families/polkadot/Nominations/drawerInfo.tsx index c25e6c198b48..d3a7f896dd92 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/Nominations/drawerInfo.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/Nominations/drawerInfo.tsx @@ -1,6 +1,6 @@ import React from "react"; import { View, StyleSheet } from "react-native"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { useTheme } from "@react-navigation/native"; import { TFunction } from "i18next"; import { Account } from "@ledgerhq/types-live"; @@ -14,6 +14,7 @@ import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import CounterValue from "~/components/CounterValue"; import ExternalLink from "~/icons/ExternalLink"; import NominationDrawer from "../components/NominationDrawer"; +import { Unit } from "@ledgerhq/types-cryptoassets"; type NominationDrawerData = React.ComponentProps["data"]; @@ -23,6 +24,7 @@ type Props = { validator?: PolkadotValidator; nomination: PolkadotNomination; onOpenExplorer: (address: string) => void; + unit: Unit; }; export function getDrawerInfo({ @@ -31,9 +33,9 @@ export function getDrawerInfo({ nomination, validator, onOpenExplorer, + unit, }: Props): NominationDrawerData { const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); const amount = nomination.value; const totalStake = validator?.totalBonded; const formattedCommission = validator?.commission diff --git a/apps/ledger-live-mobile/src/families/polkadot/Nominations/index.tsx b/apps/ledger-live-mobile/src/families/polkadot/Nominations/index.tsx index fcda7d91e771..6643927ac72d 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/Nominations/index.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/Nominations/index.tsx @@ -45,6 +45,7 @@ import Illustration from "~/images/illustration/Illustration"; import EarnLight from "~/images/illustration/Light/_003.png"; import EarnDark from "~/images/illustration/Dark/_003.png"; import FirstLetterIcon from "~/components/FirstLetterIcon"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: AccountLike; @@ -66,6 +67,8 @@ export default function Nominations(props: Props) { const { polkadotResources } = mainAccount; + const unit = useAccountUnit(account); + const { lockedBalance, unlockedBalance, nominations, unlockings } = polkadotResources || {}; const [nomination, setNomination] = useState(); @@ -207,9 +210,10 @@ export default function Nominations(props: Props) { onOpenExplorer, nomination: mappedNomination?.nomination, validator: mappedNomination?.validator, + unit, }) : [], - [mappedNomination, t, account, onOpenExplorer], + [mappedNomination, t, account, onOpenExplorer, unit], ); const electionOpen = staking?.electionClosed !== undefined ? !staking?.electionClosed : false; diff --git a/apps/ledger-live-mobile/src/families/polkadot/RebondFlow/01-Amount.tsx b/apps/ledger-live-mobile/src/families/polkadot/RebondFlow/01-Amount.tsx index 690e76e728f9..aca2322df0f8 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/RebondFlow/01-Amount.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/RebondFlow/01-Amount.tsx @@ -15,7 +15,7 @@ import { Trans } from "react-i18next"; import { useTheme } from "@react-navigation/native"; import type { Transaction as PolkadotTransaction } from "@ledgerhq/live-common/families/polkadot/types"; import { useDebounce } from "@ledgerhq/live-common/hooks/useDebounce"; -import { getAccountUnit, getMainAccount } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { StackScreenProps } from "@react-navigation/stack"; import { accountScreenSelector } from "~/reducers/accounts"; @@ -32,6 +32,7 @@ import FlowErrorBottomModal from "../components/FlowErrorBottomModal"; import SendRowsFee from "../SendRowsFee"; import { BaseComposite } from "~/components/RootNavigator/types/helpers"; import { PolkadotRebondFlowParamList } from "./type"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; type NavigationProps = BaseComposite< StackScreenProps @@ -105,10 +106,12 @@ export default function PolkadotRebondAmount({ navigation, route }: NavigationPr }); }, [account, navigation, transaction, status]); const blur = useCallback(() => Keyboard.dismiss(), []); - if (!account || !transaction) return null; + + const unit = useMaybeAccountUnit(account); + if (!account || !transaction || !unit) return null; const { useAllAmount } = transaction; const { amount } = status; - const unit = getAccountUnit(account); + const error = amount.eq(0) || bridgePending ? null : getFirstStatusError(status, "errors"); const warning = getFirstStatusError(status, "warnings"); const hasErrors = hasStatusError(status); diff --git a/apps/ledger-live-mobile/src/families/polkadot/SendRowsFee.tsx b/apps/ledger-live-mobile/src/families/polkadot/SendRowsFee.tsx index 30d0856829aa..59e4ec1c24c2 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/SendRowsFee.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/SendRowsFee.tsx @@ -4,7 +4,7 @@ import type { Account, AccountLike } from "@ledgerhq/types-live"; import type { Transaction } from "@ledgerhq/live-common/generated/types"; import type { Transaction as PolkadotTransaction } from "@ledgerhq/live-common/families/polkadot/types"; import { Trans } from "react-i18next"; -import { getAccountUnit, getAccountCurrency } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { CompositeScreenProps, useTheme } from "@react-navigation/native"; import SummaryRow from "~/screens/SendFunds/SummaryRow"; import LText from "~/components/LText"; @@ -19,6 +19,7 @@ import { ScreenName } from "~/const"; import { SignTransactionNavigatorParamList } from "~/components/RootNavigator/types/SignTransactionNavigator"; import { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator"; import { PolkadotBondFlowParamList } from "./BondFlow/types"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Navigation = CompositeScreenProps< | StackNavigatorProps @@ -44,7 +45,7 @@ export default function PolkadotFeeRow({ account, transaction }: Props) { const fees = (transaction as PolkadotTransaction).fees ? (transaction as PolkadotTransaction).fees : null; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); return ( ; @@ -102,10 +103,10 @@ export default function PolkadotUnbondAmount({ navigation, route }: Props) { }); }, [account, navigation, transaction, status]); const blur = useCallback(() => Keyboard.dismiss(), []); - if (!account || !transaction) return null; + const unit = useMaybeAccountUnit(account); + if (!account || !transaction || !unit) return null; const { useAllAmount } = transaction; const { amount } = status; - const unit = getAccountUnit(account); const error = amount.eq(0) || bridgePending ? null : getFirstStatusError(status, "errors"); const warning = getFirstStatusError(status, "warnings"); const hasErrors = hasStatusError(status); diff --git a/apps/ledger-live-mobile/src/families/polkadot/operationDetails.tsx b/apps/ledger-live-mobile/src/families/polkadot/operationDetails.tsx index 1004a8a531c9..39fc2349c9a1 100644 --- a/apps/ledger-live-mobile/src/families/polkadot/operationDetails.tsx +++ b/apps/ledger-live-mobile/src/families/polkadot/operationDetails.tsx @@ -34,6 +34,7 @@ import OperationStatusWrapper from "~/icons/OperationStatusIcon/Wrapper"; import NominationInfo from "./components/NominationInfo"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; function getURLWhatIsThis(op: PolkadotOperation): string | undefined { if (op.type !== "IN" && op.type !== "OUT") { @@ -59,11 +60,12 @@ function OperationDetailsExtra({ operation, type, account }: OperationDetailsExt const discreet = useSelector(discreetModeSelector); const { locale } = useSettings(); const { extra } = operation; + const unit = useAccountUnit(account); switch (type) { case "OUT": case "IN": { - const value = formatCurrencyUnit(account.unit, extra.transferAmount ?? new BigNumber(0), { + const value = formatCurrencyUnit(unit, extra.transferAmount ?? new BigNumber(0), { showCode: true, discreet, disableRounding: true, @@ -88,7 +90,7 @@ function OperationDetailsExtra({ operation, type, account }: OperationDetailsExt ); } case "BOND": { - const value = formatCurrencyUnit(account.unit, extra.bondedAmount ?? new BigNumber(0), { + const value = formatCurrencyUnit(unit, extra.bondedAmount ?? new BigNumber(0), { showCode: true, discreet, disableRounding: true, @@ -102,7 +104,7 @@ function OperationDetailsExtra({ operation, type, account }: OperationDetailsExt ); } case "UNBOND": { - const value = formatCurrencyUnit(account.unit, extra.unbondedAmount ?? new BigNumber(0), { + const value = formatCurrencyUnit(unit, extra.unbondedAmount ?? new BigNumber(0), { showCode: true, discreet, disableRounding: true, @@ -116,16 +118,12 @@ function OperationDetailsExtra({ operation, type, account }: OperationDetailsExt ); } case "WITHDRAW_UNBONDED": { - const value = formatCurrencyUnit( - account.unit, - extra.withdrawUnbondedAmount ?? new BigNumber(0), - { - showCode: true, - discreet, - disableRounding: true, - locale: locale, - }, - ); + const value = formatCurrencyUnit(unit, extra.withdrawUnbondedAmount ?? new BigNumber(0), { + showCode: true, + discreet, + disableRounding: true, + locale: locale, + }); return ( <> diff --git a/apps/ledger-live-mobile/src/families/ripple/RippleFeeRow.tsx b/apps/ledger-live-mobile/src/families/ripple/RippleFeeRow.tsx index c1ea360a1163..68be5655f60d 100644 --- a/apps/ledger-live-mobile/src/families/ripple/RippleFeeRow.tsx +++ b/apps/ledger-live-mobile/src/families/ripple/RippleFeeRow.tsx @@ -26,6 +26,7 @@ import type { import type { SendFundsNavigatorStackParamList } from "~/components/RootNavigator/types/SendFundsNavigator"; import { SignTransactionNavigatorParamList } from "~/components/RootNavigator/types/SignTransactionNavigator"; import { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; type Navigation = CompositeNavigationProp< StackNavigatorNavigation, @@ -59,7 +60,9 @@ export default function RippleFeeRow({ account, transaction, parentAccount }: Pr const extraInfoFees = useCallback(() => { Linking.openURL(urls.feesMoreInfo); }, []); - if (account.type !== "Account") return null; + + const unit = useMaybeAccountUnit(account); + if (account.type !== "Account" || !unit) return null; const fee = (transaction as RippleTransaction).fee; const feeCustomUnit = (transaction as RippleTransaction).feeCustomUnit; return ( @@ -80,7 +83,7 @@ export default function RippleFeeRow({ account, transaction, parentAccount }: Pr {fee ? ( - + ) : null} diff --git a/apps/ledger-live-mobile/src/families/solana/DelegationFlow/SelectAmount.tsx b/apps/ledger-live-mobile/src/families/solana/DelegationFlow/SelectAmount.tsx index 1257a1c3f11e..e81b587851f1 100644 --- a/apps/ledger-live-mobile/src/families/solana/DelegationFlow/SelectAmount.tsx +++ b/apps/ledger-live-mobile/src/families/solana/DelegationFlow/SelectAmount.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; @@ -37,6 +36,7 @@ import QueuedDrawer from "~/components/QueuedDrawer"; import { GenericInformationBody } from "~/components/GenericInformationBody"; import { ExternalLinkMedium, InformationFill } from "@ledgerhq/native-ui/assets/icons"; import { urls } from "~/utils/urls"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps; @@ -122,7 +122,7 @@ export default function DelegationSelectAmount({ navigation, route }: Props) { const { useAllAmount } = transaction; const { amount } = status; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); const onMaxSpendableLearnMore = useCallback(() => Linking.openURL(urls.maxSpendable), []); diff --git a/apps/ledger-live-mobile/src/families/solana/DelegationFlow/SelectValidator.tsx b/apps/ledger-live-mobile/src/families/solana/DelegationFlow/SelectValidator.tsx index cad8ade57bfc..4e9d32b455f3 100644 --- a/apps/ledger-live-mobile/src/families/solana/DelegationFlow/SelectValidator.tsx +++ b/apps/ledger-live-mobile/src/families/solana/DelegationFlow/SelectValidator.tsx @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { useValidators } from "@ledgerhq/live-common/families/solana/react"; import { ValidatorsAppValidator } from "@ledgerhq/live-common/families/solana/staking"; import { AccountLike } from "@ledgerhq/types-live"; @@ -19,6 +18,7 @@ import ValidatorImage from "../shared/ValidatorImage"; import SelectValidatorSearchBox from "../../tron/VoteFlow/01-SelectValidator/SearchBox"; import { BaseComposite, StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import type { SolanaDelegationFlowParamList } from "./types"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = BaseComposite< StackNavigatorProps @@ -182,7 +182,7 @@ const ValidatorRow = ({ const onPressT = useCallback(() => { onPress(validator); }, [validator, onPress]); - + const unit = useAccountUnit(account); return ( - + diff --git a/apps/ledger-live-mobile/src/families/solana/DelegationFlow/Summary.tsx b/apps/ledger-live-mobile/src/families/solana/DelegationFlow/Summary.tsx index 31835a0ea9bf..d70de4ff7cae 100644 --- a/apps/ledger-live-mobile/src/families/solana/DelegationFlow/Summary.tsx +++ b/apps/ledger-live-mobile/src/families/solana/DelegationFlow/Summary.tsx @@ -1,4 +1,4 @@ -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { formatCurrencyUnit, getCurrencyColor } from "@ledgerhq/live-common/currencies/index"; import { useValidators } from "@ledgerhq/live-common/families/solana/react"; @@ -36,6 +36,7 @@ import ValidatorImage from "../shared/ValidatorImage"; import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { DelegationAction, SolanaDelegationFlowParamList } from "./types"; import TranslatedError from "../../../components/TranslatedError"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps; @@ -442,7 +443,7 @@ function SummaryWords({ const i18nActionKey = delegationAction.kind === "new" ? "iDelegate" : `i${capitalize(delegationAction.stakeAction)}`; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formattedAmount = formatCurrencyUnit(unit, new BigNumber(amount), { disableRounding: true, alwaysShowSign: false, @@ -483,7 +484,7 @@ function SummaryWords({ } const AccountBalanceTag = ({ account }: { account: AccountLike }) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { colors } = useTheme(); return ( diff --git a/apps/ledger-live-mobile/src/families/solana/Delegations/index.tsx b/apps/ledger-live-mobile/src/families/solana/Delegations/index.tsx index 49235a7195fe..192e355556dd 100644 --- a/apps/ledger-live-mobile/src/families/solana/Delegations/index.tsx +++ b/apps/ledger-live-mobile/src/families/solana/Delegations/index.tsx @@ -1,8 +1,4 @@ -import { - getAccountCurrency, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, getMainAccount } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { getAddressExplorer, getDefaultExplorerView } from "@ledgerhq/live-common/explorers"; import { stakeActions, stakeActivePercent } from "@ledgerhq/live-common/families/solana/logic"; @@ -42,6 +38,7 @@ import UndelegateIcon from "~/icons/Undelegate"; import ValidatorImage from "../shared/ValidatorImage"; import DelegationLabelRight from "./LabelRight"; import DelegationRow from "./Row"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: SolanaAccount; @@ -63,7 +60,7 @@ function Delegations({ account }: Props) { mainAccount.solanaResources?.stakes ?? [], ); - const unit = getAccountUnit(mainAccount); + const unit = useAccountUnit(mainAccount); const navigation = useNavigation(); const [selectedStakeWithMeta, setSelectedStakeWithMeta] = useState< diff --git a/apps/ledger-live-mobile/src/families/solana/SendRowsFee.tsx b/apps/ledger-live-mobile/src/families/solana/SendRowsFee.tsx index 8813a5f38657..9f4c1761c474 100644 --- a/apps/ledger-live-mobile/src/families/solana/SendRowsFee.tsx +++ b/apps/ledger-live-mobile/src/families/solana/SendRowsFee.tsx @@ -1,4 +1,4 @@ -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { Transaction, TransactionStatus } from "@ledgerhq/live-common/generated/types"; import { TransactionStatus as SolanaTransactionStatus } from "@ledgerhq/live-common/families/solana/types"; import { Account, AccountLike } from "@ledgerhq/types-live"; @@ -18,6 +18,7 @@ import type { SendFundsNavigatorStackParamList } from "~/components/RootNavigato import { ScreenName } from "~/const"; import { SignTransactionNavigatorParamList } from "~/components/RootNavigator/types/SignTransactionNavigator"; import { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: AccountLike; @@ -39,7 +40,7 @@ export default function SolanaFeeRow({ account, status }: Props) { const fees = (status as SolanaTransactionStatus).estimatedFees; - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); return ( diff --git a/apps/ledger-live-mobile/src/families/solana/operationDetails.tsx b/apps/ledger-live-mobile/src/families/solana/operationDetails.tsx index 4648b13e597b..88d9c9e96706 100644 --- a/apps/ledger-live-mobile/src/families/solana/operationDetails.tsx +++ b/apps/ledger-live-mobile/src/families/solana/operationDetails.tsx @@ -5,7 +5,6 @@ import { useTranslation } from "react-i18next"; import { BigNumber } from "bignumber.js"; import { OperationType } from "@ledgerhq/types-live"; import { getAddressExplorer, getDefaultExplorerView } from "@ledgerhq/live-common/explorers"; -import { getAccountUnit } from "@ledgerhq/live-common/account/helpers"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { CryptoCurrency, Unit } from "@ledgerhq/types-cryptoassets"; import { useSolanaPreloadData } from "@ledgerhq/live-common/families/solana/react"; @@ -13,6 +12,7 @@ import { SolanaAccount, SolanaOperation } from "@ledgerhq/live-common/families/s import Section from "~/screens/OperationDetails/Section"; import { discreetModeSelector } from "~/reducers/settings"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; export const openAddressUrl = (currency: CryptoCurrency, address: string) => () => { const url = getAddressExplorer(getDefaultExplorerView(currency), address); @@ -45,7 +45,7 @@ type WithdrawExtraFieldsProps = { const WithdrawExtraFields = ({ account, fromAddress, amount }: WithdrawExtraFieldsProps) => { const { t } = useTranslation(); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formatAmount = useFormatAmount(); return ( @@ -67,7 +67,7 @@ type DelegateExtraFieldsProps = { const DelegateExtraFields = ({ account, voteAddress, amount }: DelegateExtraFieldsProps) => { const { t } = useTranslation(); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const formatAmount = useFormatAmount(); const preloadData = useSolanaPreloadData(account.currency); const validator = preloadData?.validators.find(v => v.voteAccount === voteAddress); diff --git a/apps/ledger-live-mobile/src/families/stellar/ScreenEditCustomFees.tsx b/apps/ledger-live-mobile/src/families/stellar/ScreenEditCustomFees.tsx index e07e4b5dca70..a5bbf7cdc5a0 100644 --- a/apps/ledger-live-mobile/src/families/stellar/ScreenEditCustomFees.tsx +++ b/apps/ledger-live-mobile/src/families/stellar/ScreenEditCustomFees.tsx @@ -17,6 +17,7 @@ import { SendFundsNavigatorStackParamList } from "~/components/RootNavigator/typ import { ScreenName } from "~/const"; import { SignTransactionNavigatorParamList } from "~/components/RootNavigator/types/SignTransactionNavigator"; import { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; const options = { title: , @@ -40,6 +41,8 @@ function StellarEditCustomFees({ navigation, route }: NavigationProps) { const { networkCongestionLevel } = transaction?.networkInfo || {}; const [customFee, setCustomFee] = useState(transaction.fees); + const unit = useAccountUnit(mainAccount); + const onChange = (fee: BigNumber) => { setCustomFee(fee); }; @@ -75,11 +78,11 @@ function StellarEditCustomFees({ navigation, route }: NavigationProps) { editable isActive onChange={onChange} - unit={mainAccount.unit} + unit={unit} value={customFee} renderRight={ - {mainAccount.unit.code} + {unit.code} } /> diff --git a/apps/ledger-live-mobile/src/families/stellar/StellarFeeRow.tsx b/apps/ledger-live-mobile/src/families/stellar/StellarFeeRow.tsx index 1f66e7e6a17e..4a8086b82d7d 100644 --- a/apps/ledger-live-mobile/src/families/stellar/StellarFeeRow.tsx +++ b/apps/ledger-live-mobile/src/families/stellar/StellarFeeRow.tsx @@ -21,6 +21,7 @@ import type { StackNavigatorProps } from "~/components/RootNavigator/types/helpe import type { SendFundsNavigatorStackParamList } from "~/components/RootNavigator/types/SendFundsNavigator"; import { SignTransactionNavigatorParamList } from "~/components/RootNavigator/types/SignTransactionNavigator"; import { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: AccountLike; @@ -46,12 +47,14 @@ export default function StellarFeeRow({ const extraInfoFees = useCallback(() => { Linking.openURL(urls.feesMoreInfo); }, []); - if (transaction.family !== "stellar") return null; + const mainAccount = getMainAccount(account, parentAccount); + const unit = useMaybeAccountUnit(mainAccount); + if (transaction.family !== "stellar" || !unit) return null; const bridge = getAccountBridge(account, parentAccount); const suggestedFee = transaction.networkInfo?.fees; const fees = transaction.fees; const isCustomFee = fees && suggestedFee ? !fees.eq(suggestedFee) : false; - const mainAccount = getMainAccount(account, parentAccount); + const currency = getAccountCurrency(account); const onFeeModeChange = (isCustom: boolean) => { @@ -102,7 +105,7 @@ export default function StellarFeeRow({ {fee ? ( - + ) : null} diff --git a/apps/ledger-live-mobile/src/families/tezos/AccountBodyHeader.tsx b/apps/ledger-live-mobile/src/families/tezos/AccountBodyHeader.tsx index 9e697224e280..788ba5583d05 100644 --- a/apps/ledger-live-mobile/src/families/tezos/AccountBodyHeader.tsx +++ b/apps/ledger-live-mobile/src/families/tezos/AccountBodyHeader.tsx @@ -3,11 +3,7 @@ import { Trans } from "react-i18next"; import { differenceInCalendarDays } from "date-fns"; import { StyleSheet, Platform, View } from "react-native"; import { AccountLike, Account } from "@ledgerhq/types-live"; -import { - shortAddressPreview, - getAccountCurrency, - getAccountUnit, -} from "@ledgerhq/live-common/account/index"; +import { shortAddressPreview, getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { useDelegation } from "@ledgerhq/live-common/families/tezos/bakers"; import { Flex, Text } from "@ledgerhq/native-ui"; import LText from "~/components/LText"; @@ -16,6 +12,7 @@ import CounterValue from "~/components/CounterValue"; import DelegationDetailsModal from "./DelegationDetailsModal"; import BakerImage from "./BakerImage"; import Button from "~/components/wrappedUi/Button"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; const styles = StyleSheet.create({ root: { @@ -102,6 +99,8 @@ export default function TezosAccountBodyHeader({ const delegation = useDelegation(account); + const unit = useAccountUnit(account); + if (!delegation) { return null; } @@ -109,7 +108,6 @@ export default function TezosAccountBodyHeader({ const name = delegation.baker ? delegation.baker.name : shortAddressPreview(delegation.address); const amount = account.balance; const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); const days = differenceInCalendarDays(Date.now(), delegation.operation.date); return ( diff --git a/apps/ledger-live-mobile/src/families/tezos/DelegationDetailsModal.tsx b/apps/ledger-live-mobile/src/families/tezos/DelegationDetailsModal.tsx index 6dd02d44b65b..b9569c6d1d42 100644 --- a/apps/ledger-live-mobile/src/families/tezos/DelegationDetailsModal.tsx +++ b/apps/ledger-live-mobile/src/families/tezos/DelegationDetailsModal.tsx @@ -10,12 +10,7 @@ import { } from "@ledgerhq/live-common/explorers"; import type { AccountLike, Account } from "@ledgerhq/types-live"; import type { Delegation } from "@ledgerhq/live-common/families/tezos/types"; -import { - getMainAccount, - getAccountCurrency, - getAccountUnit, - getAccountName, -} from "@ledgerhq/live-common/account/index"; +import { getMainAccount, getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { getCurrencyColor } from "@ledgerhq/live-common/currencies/index"; import Icon from "react-native-vector-icons/Feather"; import getWindowDimensions from "~/logic/getWindowDimensions"; @@ -32,6 +27,8 @@ import { rgba } from "../../colors"; import { NavigatorName, ScreenName } from "~/const"; import BakerImage from "./BakerImage"; import DelegatingContainer from "./DelegatingContainer"; +import { useAccountName } from "~/reducers/wallet"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { isOpened: boolean; @@ -153,7 +150,7 @@ export default function DelegationDetailsModal({ const { colors } = useTheme(); const navigation = useNavigation(); const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const mainAccount = getMainAccount(account, parentAccount); const { baker } = delegation; const amount = account.balance; @@ -204,6 +201,7 @@ export default function DelegationDetailsModal({ }); onClose(); }, [navigation, accountId, parentId, onClose]); + const accountName = useAccountName(account); const height = Math.min(getWindowDimensions().height - 400, 280); return ( // TODO use DelegationDrawer component @@ -260,7 +258,7 @@ export default function DelegationDetailsModal({ numberOfLines={1} ellipsizeMode="middle" > - {getAccountName(account)} + {accountName} }> diff --git a/apps/ledger-live-mobile/src/families/tezos/DelegationFlow/Summary.tsx b/apps/ledger-live-mobile/src/families/tezos/DelegationFlow/Summary.tsx index a5b06c536bc8..a9c62061c955 100644 --- a/apps/ledger-live-mobile/src/families/tezos/DelegationFlow/Summary.tsx +++ b/apps/ledger-live-mobile/src/families/tezos/DelegationFlow/Summary.tsx @@ -6,12 +6,7 @@ import { Trans, useTranslation } from "react-i18next"; import invariant from "invariant"; import Icon from "react-native-vector-icons/Feather"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; -import { - getAccountCurrency, - getAccountName, - getAccountUnit, - shortAddressPreview, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency, shortAddressPreview } from "@ledgerhq/live-common/account/index"; import { getCurrencyColor } from "@ledgerhq/live-common/currencies/index"; import type { Transaction as TezosTransaction } from "@ledgerhq/live-common/families/tezos/types"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; @@ -35,11 +30,13 @@ import DelegatingContainer from "../DelegatingContainer"; import BakerImage from "../BakerImage"; import type { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import type { TezosDelegationFlowParamList } from "./types"; +import { useAccountName } from "~/reducers/wallet"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps; const AccountBalanceTag = ({ account }: { account: AccountLike }) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { colors } = useTheme(); return ( @@ -192,7 +189,7 @@ export default function DelegationSummary({ navigation, route }: Props) { const bakerName = baker ? baker.name : shortAddressPreview(addr); const currency = getAccountCurrency(account); const color = getCurrencyColor(currency); - const accountName = getAccountName(account); + const accountName = useAccountName(account); // handle any edit screen changes useTransactionChangeFromNavigation(setTransaction); diff --git a/apps/ledger-live-mobile/src/families/tezos/TezosFeeRow.tsx b/apps/ledger-live-mobile/src/families/tezos/TezosFeeRow.tsx index fae8a965a936..f05949ef105a 100644 --- a/apps/ledger-live-mobile/src/families/tezos/TezosFeeRow.tsx +++ b/apps/ledger-live-mobile/src/families/tezos/TezosFeeRow.tsx @@ -3,7 +3,7 @@ import { View, StyleSheet, Linking } from "react-native"; import type { Account, AccountLike } from "@ledgerhq/types-live"; import { Trans } from "react-i18next"; import type { Transaction } from "@ledgerhq/live-common/generated/types"; -import { getAccountUnit, getAccountCurrency } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { useTheme } from "@react-navigation/native"; import SummaryRow from "~/screens/SendFunds/SummaryRow"; import LText from "~/components/LText"; @@ -11,6 +11,7 @@ import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import CounterValue from "~/components/CounterValue"; import ExternalLink from "~/icons/ExternalLink"; import { urls } from "~/utils/urls"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: AccountLike; @@ -22,9 +23,12 @@ export default function TezosFeeRow({ account, transaction }: Props) { const extraInfoFees = useCallback(() => { Linking.openURL(urls.feesMoreInfo); }, []); + + const unit = useAccountUnit(account); + if (transaction.family !== "tezos") return null; const fees = transaction.fees; - const unit = getAccountUnit(account); + const currency = getAccountCurrency(account); return ( freeLimit.plus(gainedLimit).minus(gainedUsed).minus(freeUsed), [freeLimit, gainedLimit, gainedUsed, freeUsed], diff --git a/apps/ledger-live-mobile/src/families/tron/Votes/index.tsx b/apps/ledger-live-mobile/src/families/tron/Votes/index.tsx index 71b578e4299f..8923a7d19f05 100644 --- a/apps/ledger-live-mobile/src/families/tron/Votes/index.tsx +++ b/apps/ledger-live-mobile/src/families/tron/Votes/index.tsx @@ -3,7 +3,7 @@ import { View, TouchableOpacity, StyleSheet } from "react-native"; import { ParamListBase, useNavigation, useTheme } from "@react-navigation/native"; import { Trans, useTranslation } from "react-i18next"; import { BigNumber } from "bignumber.js"; -import { getAccountUnit, getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; import { useTronSuperRepresentatives, formatVotes, @@ -29,6 +29,7 @@ import AccountSectionLabel from "~/components/AccountSectionLabel"; import { useManifest } from "@ledgerhq/live-common/platform/hooks/useManifest"; import { StackNavigationProp } from "@react-navigation/stack"; import { ScreenName } from "../../../const"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: TronAccount; @@ -45,7 +46,7 @@ const Delegation = ({ account }: Props) => { const lastDate = lastVotedDate ? : null; const currency = getAccountCurrency(account); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const explorerView = getDefaultExplorerView(account.currency); const { spendableBalance, tronResources } = account; diff --git a/apps/ledger-live-mobile/src/families/tron/operationDetails.tsx b/apps/ledger-live-mobile/src/families/tron/operationDetails.tsx index 7dcaab4935e9..a3a311780208 100644 --- a/apps/ledger-live-mobile/src/families/tron/operationDetails.tsx +++ b/apps/ledger-live-mobile/src/families/tron/operationDetails.tsx @@ -19,6 +19,7 @@ import DelegationInfo from "~/components/DelegationInfo"; import Section from "~/screens/OperationDetails/Section"; import { discreetModeSelector } from "~/reducers/settings"; import { useSettings } from "~/hooks"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; const helpURL = "https://support.ledger.com/hc/en-us/articles/360013062139"; @@ -47,7 +48,7 @@ function OperationDetailsExtra({ operation, type, account }: OperationDetailsExt const { extra: { votes, frozenAmount, unfreezeAmount, unDelegatedAmount, receiverAddress }, } = operation; - + const unit = useAccountUnit(account); switch (type) { case "VOTE": { if (!votes || !votes.length) return null; @@ -55,7 +56,7 @@ function OperationDetailsExtra({ operation, type, account }: OperationDetailsExt } case "FREEZE": { - const value = formatCurrencyUnit(account.unit, frozenAmount || new BigNumber(0), { + const value = formatCurrencyUnit(unit, frozenAmount || new BigNumber(0), { showCode: true, discreet, locale: locale, @@ -64,7 +65,7 @@ function OperationDetailsExtra({ operation, type, account }: OperationDetailsExt } case "UNFREEZE": { - const value = formatCurrencyUnit(account.unit, unfreezeAmount || new BigNumber(0), { + const value = formatCurrencyUnit(unit, unfreezeAmount || new BigNumber(0), { showCode: true, discreet, locale: locale, @@ -73,7 +74,7 @@ function OperationDetailsExtra({ operation, type, account }: OperationDetailsExt } case "UNDELEGATE_RESOURCE": { - const value = formatCurrencyUnit(account.unit, unDelegatedAmount || new BigNumber(0), { + const value = formatCurrencyUnit(unit, unDelegatedAmount || new BigNumber(0), { showCode: true, discreet, locale, @@ -87,7 +88,7 @@ function OperationDetailsExtra({ operation, type, account }: OperationDetailsExt } case "LEGACY_UNFREEZE": { - const value = formatCurrencyUnit(account.unit, unfreezeAmount || new BigNumber(0), { + const value = formatCurrencyUnit(unit, unfreezeAmount || new BigNumber(0), { showCode: true, discreet, locale, diff --git a/apps/ledger-live-mobile/src/helpers/CurrencySettingsDefaults.ts b/apps/ledger-live-mobile/src/helpers/CurrencySettingsDefaults.ts index 1eb22d8e1f74..92fd35f56855 100644 --- a/apps/ledger-live-mobile/src/helpers/CurrencySettingsDefaults.ts +++ b/apps/ledger-live-mobile/src/helpers/CurrencySettingsDefaults.ts @@ -1,7 +1,7 @@ import type { Currency } from "@ledgerhq/types-cryptoassets"; -import type { ConfirmationDefaults } from "../types/common"; +import type { ConfirmationDefaults, UnitDefaults } from "../types/common"; -export const currencySettingsDefaults = (c: Currency): ConfirmationDefaults => { +export const currencySettingsDefaults = (c: Currency): ConfirmationDefaults & UnitDefaults => { let confirmationsNb; if (c.type === "CryptoCurrency") { @@ -20,5 +20,6 @@ export const currencySettingsDefaults = (c: Currency): ConfirmationDefaults => { return { confirmationsNb, + unit: c.units[0], }; }; diff --git a/apps/ledger-live-mobile/src/hooks/useAccountUnit.ts b/apps/ledger-live-mobile/src/hooks/useAccountUnit.ts new file mode 100644 index 000000000000..bf1567e4e3b9 --- /dev/null +++ b/apps/ledger-live-mobile/src/hooks/useAccountUnit.ts @@ -0,0 +1,16 @@ +import { useSelector } from "react-redux"; +import { accountUnitSelector } from "../reducers/settings"; +import { AccountLike } from "@ledgerhq/types-live"; +import { State } from "~/reducers/types"; + +export function useAccountUnit(account: AccountLike) { + const unit = useSelector((state: State) => accountUnitSelector(state, account)); + return unit; +} + +export function useMaybeAccountUnit(account?: AccountLike | null) { + const unit = useSelector((state: State) => + account ? accountUnitSelector(state, account) : undefined, + ); + return unit; +} diff --git a/apps/ledger-live-mobile/src/logic/accountModel.ts b/apps/ledger-live-mobile/src/logic/accountModel.ts index 401e2de38c79..35db22b89612 100644 --- a/apps/ledger-live-mobile/src/logic/accountModel.ts +++ b/apps/ledger-live-mobile/src/logic/accountModel.ts @@ -1,7 +1,8 @@ import { createDataModel } from "@ledgerhq/live-common/DataModel"; import type { DataModel } from "@ledgerhq/live-common/DataModel"; -import type { Account, AccountRaw, Operation } from "@ledgerhq/types-live"; +import type { Account, AccountRaw, Operation, AccountUserData } from "@ledgerhq/types-live"; import { fromAccountRaw, toAccountRaw } from "@ledgerhq/live-common/account/index"; +import { accountRawToAccountUserData } from "@ledgerhq/live-wallet/store"; /** * @memberof models/account @@ -10,14 +11,20 @@ export const opRetentionStategy = (maxDaysOld: number, keepFirst: number) => (op: Operation, index: number): boolean => index < keepFirst || Date.now() - op.date.valueOf() < 1000 * 60 * 60 * 24 * maxDaysOld; + const opRetentionFilter = opRetentionStategy(366, 500); -const accountModel: DataModel = createDataModel({ + +const accountModel: DataModel = createDataModel({ migrations: [], - decode: fromAccountRaw, - encode: (account: Account): AccountRaw => - toAccountRaw({ - ...account, - operations: account.operations.filter(opRetentionFilter), - }), + decode: (raw: AccountRaw) => [fromAccountRaw(raw), accountRawToAccountUserData(raw)], + encode: ([account, userData]: [Account, AccountUserData]): AccountRaw => + toAccountRaw( + { + ...account, + operations: account.operations.filter(opRetentionFilter), + }, + userData, + ), }); + export default accountModel; diff --git a/apps/ledger-live-mobile/src/reducers/accounts.ts b/apps/ledger-live-mobile/src/reducers/accounts.ts index eea1e3c3ceaf..8dff7bccdbf7 100644 --- a/apps/ledger-live-mobile/src/reducers/accounts.ts +++ b/apps/ledger-live-mobile/src/reducers/accounts.ts @@ -2,7 +2,13 @@ import { handleActions, ReducerMap } from "redux-actions"; import type { Action } from "redux-actions"; import { createSelector, createSelectorCreator, defaultMemoize, OutputSelector } from "reselect"; import uniq from "lodash/uniq"; -import { Account, AccountLike, AccountLikeArray, SubAccount } from "@ledgerhq/types-live"; +import { + Account, + AccountLike, + AccountLikeArray, + AccountRaw, + SubAccount, +} from "@ledgerhq/types-live"; import type { CryptoCurrency, CryptoOrTokenCurrency, @@ -10,14 +16,11 @@ import type { } from "@ledgerhq/types-cryptoassets"; import isEqual from "lodash/isEqual"; import { - addAccounts, isAccountEmpty, flattenAccounts, getAccountCurrency, - importAccountsReduce, isUpToDateAccount, clearAccount, - nestedSortAccounts, makeEmptyTokenAccount, isAccountBalanceUnconfirmed, } from "@ledgerhq/live-common/account/index"; @@ -27,11 +30,8 @@ import type { AccountsState, State } from "./types"; import type { AccountsDeleteAccountPayload, AccountsImportAccountsPayload, - AccountsImportStorePayload, AccountsPayload, AccountsReorderPayload, - AccountsReplaceAccountsPayload, - AccountsSetAccountsPayload, AccountsUpdateAccountWithUpdaterPayload, SettingsBlacklistTokenPayload, DangerouslyOverrideStatePayload, @@ -40,13 +40,23 @@ import { AccountsActionTypes } from "../actions/types"; import accountModel from "../logic/accountModel"; import { blacklistedTokenIdsSelector, hiddenNftCollectionsSelector } from "./settings"; import { galleryChainFiltersSelector } from "./nft"; +import { + accountNameWithDefaultSelector, + accountUserDataExportSelector, + HandlersPayloads, + WalletHandlerType, +} from "@ledgerhq/live-wallet/store"; +import { importAccountsReduce } from "@ledgerhq/live-wallet/liveqr/importAccounts"; +import { walletSelector } from "./wallet"; +import { nestedSortAccounts } from "@ledgerhq/live-wallet/ordering"; +import { AddAccountsAction } from "@ledgerhq/live-wallet/addAccounts"; export const INITIAL_STATE: AccountsState = { active: [], }; const handlers: ReducerMap = { - [AccountsActionTypes.ACCOUNTS_IMPORT]: (_, action) => ({ - active: (action as Action).payload, + [WalletHandlerType.INIT_ACCOUNTS]: (_, action) => ({ + active: (action.payload as HandlersPayloads["INIT_ACCOUNTS"]).accounts, }), [AccountsActionTypes.ACCOUNTS_USER_IMPORT]: (s, action) => ({ @@ -56,28 +66,25 @@ const handlers: ReducerMap = { ), }), + [AccountsActionTypes.ADD_ACCOUNT]: (state, action) => { + const account = (action as Action).payload; + if (state.active.some(a => a.id === account.id)) return state; + return { + active: [...state.active, account], + }; + }, + [AccountsActionTypes.REORDER_ACCOUNTS]: (state, action) => ({ active: nestedSortAccounts(state.active, (action as Action).payload), }), - [AccountsActionTypes.ACCOUNTS_ADD]: (s, action) => { - const { - payload: { scannedAccounts, selectedIds, renamings }, - } = action as Action; + [WalletHandlerType.ADD_ACCOUNTS]: (s, action) => { + const { payload } = action as AddAccountsAction; return { - active: addAccounts({ - existingAccounts: s.active, - scannedAccounts, - selectedIds, - renamings, - }), + active: payload.allAccounts, }; }, - [AccountsActionTypes.SET_ACCOUNTS]: (_, action) => ({ - active: (action as Action).payload, - }), - [AccountsActionTypes.UPDATE_ACCOUNT]: (state, action) => { const { payload: { accountId, updater }, @@ -112,9 +119,22 @@ const handlers: ReducerMap = { }; // Selectors -export const exportSelector = (s: State) => ({ - active: s.accounts.active.map(accountModel.encode), -}); + +export function exportSelector(state: State): { + active: { + data: AccountRaw; + version: number; + }[]; +} { + const active = []; + for (const account of state.accounts.active) { + const accountUserData = accountUserDataExportSelector(state.wallet, { account }); + if (accountUserData) { + active.push(accountModel.encode([account, accountUserData])); + } + } + return { active }; +} /** * Warning: use this selector directly in `useSelector` only if you really need @@ -133,9 +153,7 @@ export const accountsSelector = (s: State): Account[] => s.accounts.active; // NB some components don't need to refresh every time an account is updated, usually it's only // when the balance/name/length/starred/swapHistory of accounts changes. const accountHash = (a: AccountLike) => - `${a.type === "Account" ? a.name : ""}-${a.id}${ - a.starred ? "-*" : "" - }-${a.balance.toString()}-swapHistory(${a.swapHistory.length})`; + `${a.id}-${a.balance.toString()}-swapHistory(${a.swapHistory.length})`; // TODO can we share with desktop in common? const shallowAccountsSelectorCreator = createSelectorCreator(defaultMemoize, (a, b): boolean => @@ -171,11 +189,17 @@ export const cryptoCurrenciesSelector = createSelector(accountsSelector, account uniq(accounts.map(a => a.currency)).sort((a, b) => a.name.localeCompare(b.name)), ); export const accountsTuplesByCurrencySelector = createSelector( + walletSelector, accountsSelector, (_: State, currency: CryptoCurrency | TokenCurrency) => currency, (_: State, currency: CryptoCurrency | TokenCurrency, accountIds?: Map) => accountIds, - (accounts, currency, accountIds): { account: AccountLike; subAccount: SubAccount | null }[] => { + ( + wallet, + accounts, + currency, + accountIds, + ): { account: AccountLike; subAccount: SubAccount | null; name: string }[] => { if (currency.type === "TokenCurrency") { return accounts .filter(account => { @@ -186,6 +210,7 @@ export const accountsTuplesByCurrencySelector = createSelector( return account.currency.id === currency.parentCurrency.id; }) .map(account => ({ + name: accountNameWithDefaultSelector(wallet, account), account, subAccount: (account.subAccounts && @@ -203,6 +228,7 @@ export const accountsTuplesByCurrencySelector = createSelector( account.currency.id === currency.id && (accountIds ? accountIds.has(account.id) : true), ) .map(account => ({ + name: accountNameWithDefaultSelector(wallet, account), account, subAccount: null, })); @@ -476,6 +502,6 @@ export const areSomeAccountsBalanceUnconfirmedSelector = createSelector( accounts => accounts.some(isAccountBalanceUnconfirmed), ); -type Payload = AccountsPayload | SettingsBlacklistTokenPayload; +type Payload = AccountsPayload | SettingsBlacklistTokenPayload | AddAccountsAction["payload"]; export default handleActions(handlers, INITIAL_STATE); diff --git a/apps/ledger-live-mobile/src/reducers/index.ts b/apps/ledger-live-mobile/src/reducers/index.ts index 9a978308f190..3b4a0c17064b 100644 --- a/apps/ledger-live-mobile/src/reducers/index.ts +++ b/apps/ledger-live-mobile/src/reducers/index.ts @@ -12,6 +12,7 @@ import dynamicContent from "./dynamicContent"; import walletconnect from "./walletconnect"; import protect from "./protect"; import nft from "./nft"; +import wallet from "./wallet"; import { State } from "./types"; import { ActionsPayload } from "../actions/types"; @@ -31,6 +32,7 @@ const appReducer = combineReducers({ postOnboarding, protect, nft, + wallet, }); // TODO: EXPORT ALL POSSIBLE ACTION TYPES AND USE ACTION diff --git a/apps/ledger-live-mobile/src/reducers/settings.ts b/apps/ledger-live-mobile/src/reducers/settings.ts index 0e69ddf521fd..6696570ab2f7 100644 --- a/apps/ledger-live-mobile/src/reducers/settings.ts +++ b/apps/ledger-live-mobile/src/reducers/settings.ts @@ -9,7 +9,7 @@ import { getEnv, setEnvUnsafe } from "@ledgerhq/live-env"; import { createSelector } from "reselect"; import { getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; import type { AccountLike } from "@ledgerhq/types-live"; -import type { CryptoCurrency, Currency } from "@ledgerhq/types-cryptoassets"; +import type { CryptoCurrency, Currency, Unit } from "@ledgerhq/types-cryptoassets"; import { DeviceModelId } from "@ledgerhq/types-devices"; import type { CurrencySettings, SettingsState, State } from "./types"; import { currencySettingsDefaults } from "../helpers/CurrencySettingsDefaults"; @@ -682,22 +682,22 @@ const handlers: ReducerMap = { export default handleActions(handlers, INITIAL_STATE); -const storeSelector = (state: State): SettingsState => state.settings; +export const settingsStoreSelector = (state: State): SettingsState => state.settings; -export const exportSelector = storeSelector; +export const exportSelector = settingsStoreSelector; const counterValueCurrencyLocalSelector = (state: SettingsState): Currency => findCurrencyByTicker(state.counterValue) || getFiatCurrencyByTicker("USD"); export const counterValueCurrencySelector = createSelector( - storeSelector, + settingsStoreSelector, counterValueCurrencyLocalSelector, ); const counterValueExchangeLocalSelector = (s: SettingsState) => s.counterValueExchange; export const counterValueExchangeSelector = createSelector( - storeSelector, + settingsStoreSelector, counterValueExchangeLocalSelector, ); @@ -705,40 +705,72 @@ const defaultCurrencySettingsForCurrency: (_: Currency) => CurrencySettings = cr const defaults = currencySettingsDefaults(crypto); return { confirmationsNb: defaults.confirmationsNb ? defaults.confirmationsNb.def : 0, - exchange: null, + unit: defaults.unit, }; }; export const currencySettingsSelector = ( - state: State, + state: SettingsState, { currency, }: { currency: Currency; }, -) => ({ - ...defaultCurrencySettingsForCurrency(currency), - ...state.settings.currenciesSettings[currency.ticker], -}); -export const privacySelector = createSelector(storeSelector, s => s.privacy); +) => { + const currencySettings = Object.keys(state.currenciesSettings)?.includes(currency.ticker) + ? state.currenciesSettings[currency.ticker] + : {}; + + return { + ...defaultCurrencySettingsForCurrency(currency), + ...currencySettings, + }; +}; + +export const unitForCurrencySelector = ( + state: State, + { + currency, + }: { + currency: CryptoCurrency; + }, +): Unit => { + const obj = state.settings.currenciesSettings[currency.ticker]; + if (obj?.unit) return obj.unit; + const defs = currencySettingsDefaults(currency); + return defs.unit; +}; + +export const accountUnitSelector = (state: State, account: AccountLike): Unit => { + if (account.type === "Account") { + return unitForCurrencySelector(state, account); + } else { + return account.token.units[0]; + } +}; + +export const privacySelector = createSelector(settingsStoreSelector, s => s.privacy); export const reportErrorsEnabledSelector = createSelector( - storeSelector, + settingsStoreSelector, s => s.reportErrorsEnabled, ); -export const analyticsEnabledSelector = createSelector(storeSelector, s => s.analyticsEnabled); +export const analyticsEnabledSelector = createSelector( + settingsStoreSelector, + s => s.analyticsEnabled, +); export const personalizedRecommendationsEnabledSelector = createSelector( - storeSelector, + settingsStoreSelector, s => s.personalizedRecommendationsEnabled, ); export const trackingEnabledSelector = createSelector( - storeSelector, + settingsStoreSelector, s => s.analyticsEnabled || s.personalizedRecommendationsEnabled, ); export const lastSeenCustomImageSelector = createSelector( - storeSelector, + settingsStoreSelector, s => s.lastSeenCustomImage, ); export const currencySettingsForAccountSelector = ( - s: State, + s: SettingsState, { account, }: { diff --git a/apps/ledger-live-mobile/src/reducers/types.ts b/apps/ledger-live-mobile/src/reducers/types.ts index 90a9ec0505c1..239b2eae615b 100644 --- a/apps/ledger-live-mobile/src/reducers/types.ts +++ b/apps/ledger-live-mobile/src/reducers/types.ts @@ -8,7 +8,7 @@ import type { } from "@ledgerhq/types-live"; import type { Device } from "@ledgerhq/live-common/hw/actions/types"; import type { DeviceModelId } from "@ledgerhq/devices"; -import type { CryptoCurrencyId, Currency } from "@ledgerhq/types-cryptoassets"; +import type { CryptoCurrencyId, Currency, Unit } from "@ledgerhq/types-cryptoassets"; import { MarketListRequestParams } from "@ledgerhq/live-common/market/types"; import { PostOnboardingState } from "@ledgerhq/types-live"; import { AvailableProviderV3, ExchangeRate } from "@ledgerhq/live-common/exchange/swap/types"; @@ -27,6 +27,7 @@ import { import { ProtectStateNumberEnum } from "../components/ServicesWidget/types"; import { ImageType } from "../components/CustomImage/types"; import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device/use-cases/isCustomLockScreenSupported"; +import { WalletState } from "@ledgerhq/live-wallet/store"; // === ACCOUNT STATE === @@ -159,8 +160,7 @@ export enum OnboardingType { export type CurrencySettings = { confirmationsNb: number; - // FIXME: SEEMS TO NEVER BE USED - DROPPING ? - // exchange?: any | null; + unit: Unit; }; export type Privacy = { @@ -349,4 +349,5 @@ export type State = { postOnboarding: PostOnboardingState; protect: ProtectState; nft: NftState; + wallet: WalletState; }; diff --git a/apps/ledger-live-mobile/src/reducers/wallet.ts b/apps/ledger-live-mobile/src/reducers/wallet.ts new file mode 100644 index 000000000000..6acc91477186 --- /dev/null +++ b/apps/ledger-live-mobile/src/reducers/wallet.ts @@ -0,0 +1,39 @@ +import { + HandlersPayloads, + WalletHandlers, + initialState, + WalletState, + handlers, + isStarredAccountSelector, + accountNameWithDefaultSelector, +} from "@ledgerhq/live-wallet/store"; +import { handleActions } from "redux-actions"; +import { State } from "./types"; +import { createSelector } from "reselect"; +import { useSelector } from "react-redux"; +import { AccountLike } from "@ledgerhq/types-live"; + +export const walletSelector = (state: State): WalletState => state.wallet; + +export const accountStarredSelector = createSelector( + walletSelector, + (_: State, { accountId }: { accountId: string }) => accountId, + (wallet, accountId) => isStarredAccountSelector(wallet, { accountId }), +); + +export const useMaybeAccountName = ( + account: AccountLike | null | undefined, +): string | undefined => { + return useSelector((state: State) => + !account ? undefined : accountNameWithDefaultSelector(state.wallet, account), + ); +}; + +export const useAccountName = (account: AccountLike) => { + return useSelector((state: State) => accountNameWithDefaultSelector(state.wallet, account)); +}; + +export default handleActions( + handlers as unknown as WalletHandlers, + initialState, +); diff --git a/apps/ledger-live-mobile/src/screens/Account/AccountHeader.tsx b/apps/ledger-live-mobile/src/screens/Account/AccountHeader.tsx index 2b814724c36a..7cf73d504c96 100644 --- a/apps/ledger-live-mobile/src/screens/Account/AccountHeader.tsx +++ b/apps/ledger-live-mobile/src/screens/Account/AccountHeader.tsx @@ -1,21 +1,18 @@ import React from "react"; import { Flex, Text } from "@ledgerhq/native-ui"; import { getCurrencyColor } from "@ledgerhq/live-common/currencies/index"; -import { - getAccountCurrency, - getAccountUnit, - getAccountName, -} from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { Currency } from "@ledgerhq/types-cryptoassets"; import { AccountLike, Account, BalanceHistoryWithCountervalue } from "@ledgerhq/types-live"; import Animated from "react-native-reanimated"; import { withDiscreetMode } from "~/context/DiscreetModeContext"; - import AccountHeaderRight from "./AccountHeaderRight"; import CurrencyHeaderLayout from "~/components/CurrencyHeaderLayout"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import Placeholder from "~/components/Placeholder"; import AccountHeaderLeft from "./AccountHeaderLeft"; +import { useAccountName, useMaybeAccountName } from "~/reducers/wallet"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; function AccountHeader({ currentPositionY, @@ -37,7 +34,7 @@ function AccountHeader({ parentAccount?: Account; }) { const item = history[history.length - 1]; - const cryptoCurrencyUnit = getAccountUnit(account); + const cryptoCurrencyUnit = useAccountUnit(account); const items = [ { unit: cryptoCurrencyUnit, @@ -57,7 +54,10 @@ function AccountHeader({ const currency = getAccountCurrency(account); - const isToken = parentAccount && parentAccount.name !== undefined; + const isToken = parentAccount && parentAccount.type === "Account"; + + const accountName = useAccountName(account); + const parentAccountName = useMaybeAccountName(parentAccount); return ( - {getAccountName(account) + (isToken ? ` - ${getAccountName(parentAccount)}` : "")} + {accountName + (isToken ? ` - ${parentAccountName}` : "")} { - render() { - const { navigation, account } = this.props; - return ( - } - desc={} - arrowRight - onPress={() => - navigation.navigate(ScreenName.EditAccountName, { - accountId: account.id, - }) - } - > - - {account.name} - - - ); - } +function AccountNameRow({ navigation, account }: Props) { + const accountName = useAccountName(account); + const onPress = useCallback( + () => navigation.navigate(ScreenName.EditAccountName, { accountId: account.id }), + [navigation, account.id], + ); + return ( + } + desc={} + arrowRight + onPress={onPress} + > + + {accountName} + + + ); } -export default AccountNameRow; +export default React.memo(AccountNameRow); + const styles = StyleSheet.create({ accountName: { flexShrink: 1, diff --git a/apps/ledger-live-mobile/src/screens/AccountSettings/AccountUnitsRow.tsx b/apps/ledger-live-mobile/src/screens/AccountSettings/AccountUnitsRow.tsx deleted file mode 100644 index 89d2930c44bb..000000000000 --- a/apps/ledger-live-mobile/src/screens/AccountSettings/AccountUnitsRow.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React, { memo } from "react"; -import { Trans } from "react-i18next"; -import type { Account } from "@ledgerhq/types-live"; -import { useTheme } from "@react-navigation/native"; -import { ScreenName } from "~/const"; -import SettingsRow from "~/components/SettingsRow"; -import LText from "~/components/LText"; -import type { NavigationProps } from "./index"; - -type Props = { - navigation: NavigationProps["navigation"]; - account: Account; -}; - -function AccountUnitsRow({ navigation, account }: Props) { - const { colors } = useTheme(); - return ( - } - desc={} - arrowRight - onPress={() => - navigation.navigate(ScreenName.EditAccountUnits, { - accountId: account.id, - }) - } - > - - {account.unit.code} - - - ); -} - -export default memo(AccountUnitsRow); diff --git a/apps/ledger-live-mobile/src/screens/AccountSettings/EditAccountName.tsx b/apps/ledger-live-mobile/src/screens/AccountSettings/EditAccountName.tsx index 3d49b1fc089d..f2d626b0bad7 100644 --- a/apps/ledger-live-mobile/src/screens/AccountSettings/EditAccountName.tsx +++ b/apps/ledger-live-mobile/src/screens/AccountSettings/EditAccountName.tsx @@ -8,7 +8,6 @@ import { compose } from "redux"; import { Box } from "@ledgerhq/native-ui"; import { Account } from "@ledgerhq/types-live"; import { accountScreenSelector } from "~/reducers/accounts"; -import { updateAccount } from "~/actions/accounts"; import TextInput from "~/components/TextInput"; import { getFontStyle } from "~/components/LText"; import { Theme, withTheme } from "../../colors"; @@ -18,6 +17,7 @@ import { ScreenName } from "~/const"; import { AddAccountsNavigatorParamList } from "~/components/RootNavigator/types/AddAccountsNavigator"; import { State } from "~/reducers/types"; import { AccountSettingsNavigatorParamList } from "~/components/RootNavigator/types/AccountSettingsNavigator"; +import { accountNameWithDefaultSelector, setAccountName } from "@ledgerhq/live-wallet/store"; export const MAX_ACCOUNT_NAME_LENGHT = 50; @@ -26,16 +26,20 @@ type NavigationProps = | StackNavigatorProps; type Props = { - updateAccount: typeof updateAccount; + setAccountName: typeof setAccountName; colors: Theme["colors"]; account: Account; + accountName: string; } & NavigationProps; -const mapStateToProps = (state: State, { route }: NavigationProps) => - accountScreenSelector(route)(state); +const mapStateToProps = (state: State, { route }: NavigationProps) => { + const props = accountScreenSelector(route)(state); + const accountName = props.account && accountNameWithDefaultSelector(state.wallet, props.account); + return { ...props, accountName }; +}; const mapDispatchToProps = { - updateAccount, + setAccountName, }; class EditAccountName extends PureComponent< @@ -53,7 +57,7 @@ class EditAccountName extends PureComponent< }; onNameEndEditing = () => { - const { updateAccount, account, navigation } = this.props; + const { setAccountName, account, navigation } = this.props; const { accountName } = this.state; const { onAccountNameChange, account: accountFromAdd } = this.props.route.params || {}; @@ -64,21 +68,15 @@ class EditAccountName extends PureComponent< if (isImportingAccounts) { onAccountNameChange && onAccountNameChange(cleanAccountName, accountFromAdd); } else { - updateAccount({ - ...account, - name: cleanAccountName, - }); + setAccountName(account.id, cleanAccountName); } navigation.goBack(); } }; render() { - const { account, colors } = this.props; + const { colors, accountName: storeAccountName } = this.props; const { accountName } = this.state; - const { account: accountFromAdd } = this.props.route.params || {}; - - const initialAccountName = account ? account.name : accountFromAdd?.name; return ( @@ -86,7 +84,7 @@ class EditAccountName extends PureComponent< this.setState({ accountName })} diff --git a/apps/ledger-live-mobile/src/screens/AccountSettings/EditAccountUnits.tsx b/apps/ledger-live-mobile/src/screens/AccountSettings/EditAccountUnits.tsx deleted file mode 100644 index c47992043799..000000000000 --- a/apps/ledger-live-mobile/src/screens/AccountSettings/EditAccountUnits.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import invariant from "invariant"; -import React, { useCallback } from "react"; -import { View, StyleSheet, FlatList } from "react-native"; -import { useDispatch, useSelector } from "react-redux"; -import { Unit } from "@ledgerhq/types-cryptoassets"; -import { accountScreenSelector } from "~/reducers/accounts"; -import { updateAccount } from "~/actions/accounts"; -import SettingsRow from "~/components/SettingsRow"; -import Touchable from "~/components/Touchable"; -import NavigationScrollView from "~/components/NavigationScrollView"; -import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; -import { AccountSettingsNavigatorParamList } from "~/components/RootNavigator/types/AccountSettingsNavigator"; -import { ScreenName } from "~/const"; - -type NavigationProps = StackNavigatorProps< - AccountSettingsNavigatorParamList, - ScreenName.EditAccountUnits ->; - -export default function EditAccountUnits({ navigation, route }: NavigationProps) { - const dispatch = useDispatch(); - const { account } = useSelector(accountScreenSelector(route)); - invariant(account?.type === "Account", "account must be a main account"); - const onPressItem = useCallback( - (item: Unit) => { - const newAccount = { ...account, unit: item }; - dispatch(updateAccount(newAccount)); - navigation.goBack(); - }, - [account, navigation, dispatch], - ); - const accountUnits = account.currency.units; - return ( - - - item.code} - renderItem={({ item }) => ( - { - onPressItem(item); - }} - > - - - )} - > - {account.unit.code} - - - - ); -} -const styles = StyleSheet.create({ - root: { - flex: 1, - paddingTop: 16, - paddingBottom: 64, - }, - body: { - flexDirection: "column", - flex: 1, - padding: 16, - }, -}); diff --git a/apps/ledger-live-mobile/src/screens/AccountSettings/index.tsx b/apps/ledger-live-mobile/src/screens/AccountSettings/index.tsx index ed2718425a99..9fe9f3ef6ad1 100644 --- a/apps/ledger-live-mobile/src/screens/AccountSettings/index.tsx +++ b/apps/ledger-live-mobile/src/screens/AccountSettings/index.tsx @@ -10,7 +10,6 @@ import { TrackScreen } from "~/analytics"; import { NavigatorName, ScreenName } from "~/const"; import AccountNameRow from "./AccountNameRow"; -import AccountUnitsRow from "./AccountUnitsRow"; import DeleteAccountRow from "./DeleteAccountRow"; import DeleteAccountModal from "./DeleteAccountModal"; import AccountAdvancedLogsRow from "./AccountAdvancedLogsRow"; @@ -86,7 +85,6 @@ class AccountSettings extends PureComponent { - parentAccountSelector(state, { account })); - const name = getAccountName(account); - const unit = getAccountUnit(account); + const name = useAccountName(account); + const parentName = useMaybeAccountName(parentAccount); + const unit = useAccountUnit(account); const tag = account.type === "Account" && @@ -116,7 +115,7 @@ const AccountRow = ({ topLink={topLink} bottomLink={bottomLink} hideDelta={hideDelta} - parentAccountName={parentAccount && getAccountName(parentAccount)} + parentAccountName={parentName} isLast={isLast} /> ); diff --git a/apps/ledger-live-mobile/src/screens/AddAccounts/03-Accounts.tsx b/apps/ledger-live-mobile/src/screens/AddAccounts/03-Accounts.tsx index d137eb562f67..567d7e6efd10 100644 --- a/apps/ledger-live-mobile/src/screens/AddAccounts/03-Accounts.tsx +++ b/apps/ledger-live-mobile/src/screens/AddAccounts/03-Accounts.tsx @@ -2,10 +2,11 @@ import React, { useEffect, useCallback, useState, useRef, memo, useMemo } from " import { StyleSheet, View, Linking, SafeAreaView } from "react-native"; import { concat, from, Subscription } from "rxjs"; import { ignoreElements } from "rxjs/operators"; -import { connect } from "react-redux"; +import { connect, useDispatch } from "react-redux"; import { compose } from "redux"; -import { isAccountEmpty, groupAddAccounts } from "@ledgerhq/live-common/account/index"; -import type { AddAccountSupportLink } from "@ledgerhq/live-common/account/index"; +import { isAccountEmpty } from "@ledgerhq/live-common/account/index"; +import type { AddAccountSupportLink } from "@ledgerhq/live-wallet/addAccounts"; +import { addAccountsAction } from "@ledgerhq/live-wallet/addAccounts"; import { createStructuredSelector } from "reselect"; import uniq from "lodash/uniq"; import { Trans } from "react-i18next"; @@ -14,7 +15,6 @@ import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets"; import { getCurrencyBridge } from "@ledgerhq/live-common/bridge/index"; import { isTokenCurrency } from "@ledgerhq/live-common/currencies/index"; import { useTheme } from "@react-navigation/native"; -import { replaceAccounts } from "~/actions/accounts"; import { accountsSelector } from "~/reducers/accounts"; import logger from "../../logger"; import { Theme, withTheme } from "../../colors"; @@ -48,6 +48,9 @@ import { import { AddAccountsNavigatorParamList } from "~/components/RootNavigator/types/AddAccountsNavigator"; import { BaseNavigatorStackParamList } from "~/components/RootNavigator/types/BaseNavigator"; import Config from "react-native-config"; +import { groupAddAccounts } from "@ledgerhq/live-wallet/addAccounts"; +import { useMaybeAccountName } from "~/reducers/wallet"; +import { setAccountName } from "@ledgerhq/live-wallet/store"; const SectionAccounts = ({ defaultSelected, @@ -67,15 +70,12 @@ type NavigationProps = BaseComposite< StackNavigatorProps >; type Props = { - replaceAccounts: (_: { - scannedAccounts: Account[]; - selectedIds: string[]; - renamings: Record; - }) => void; + addAccountsAction: typeof addAccountsAction; existingAccounts: Account[]; blacklistedTokenIds?: string[]; colors: Theme["colors"]; } & NavigationProps; + const mapStateToProps = createStructuredSelector< State, { existingAccounts: Account[]; blacklistedTokenIds: string[] } @@ -83,14 +83,15 @@ const mapStateToProps = createStructuredSelector< existingAccounts: accountsSelector, blacklistedTokenIds: blacklistedTokenIdsSelector, }); + const mapDispatchToProps = { - replaceAccounts, + addAccountsAction, }; function AddAccountsAccounts({ navigation, route, - replaceAccounts, + addAccountsAction, existingAccounts, blacklistedTokenIds, }: Props) { @@ -227,7 +228,8 @@ function AddAccountsAccounts({ [selectedIds], ); const importAccount = useCallback(() => { - replaceAccounts({ + addAccountsAction({ + existingAccounts, scannedAccounts, selectedIds, renamings: {}, // renaming was done in scannedAccounts directly.. (see if we want later to change this paradigm) @@ -248,7 +250,17 @@ function AddAccountsAccounts({ currency, }); } - }, [currency, inline, navigation, replaceAccounts, route.params, scannedAccounts, selectedIds]); + }, [ + currency, + inline, + navigation, + addAccountsAction, + existingAccounts, + route.params, + scannedAccounts, + selectedIds, + ]); + const onCancel = useCallback(() => { setError(null); setCancelled(true); @@ -259,15 +271,14 @@ function AddAccountsAccounts({ } }, [cancelled, navigation]); const viewAllCreatedAccounts = useCallback(() => setShowAllCreatedAccounts(true), []); + + const dispatch = useDispatch(); + const onAccountNameChange = useCallback( (name: string, changedAccount: Account) => { - setScannedAccounts( - scannedAccounts.map(account => - account.id === changedAccount.id ? { ...account, name } : account, - ), - ); + dispatch(setAccountName(changedAccount.id, name)); }, - [scannedAccounts], + [dispatch], ); const { sections, alreadyEmptyAccount } = useMemo( () => @@ -285,6 +296,7 @@ function AddAccountsAccounts({ preferredNewAccountScheme, ], ); + const alreadyEmptyAccountName = useMaybeAccountName(alreadyEmptyAccount); const cantCreateAccount = !sections.some(s => s.id === "creatable"); const noImportableAccounts = !sections.some( s => s.id === "importable" || s.id === "creatable" || s.id === "migrate", @@ -298,7 +310,7 @@ function AddAccountsAccounts({ {"PLACEHOLDER-1"} - {alreadyEmptyAccount.name} + {alreadyEmptyAccountName} {"PLACEHOLDER-2"} diff --git a/apps/ledger-live-mobile/src/screens/FreezeFunds/02-Amount.tsx b/apps/ledger-live-mobile/src/screens/FreezeFunds/02-Amount.tsx index a1486f4a62a9..676ae8d93441 100644 --- a/apps/ledger-live-mobile/src/screens/FreezeFunds/02-Amount.tsx +++ b/apps/ledger-live-mobile/src/screens/FreezeFunds/02-Amount.tsx @@ -12,7 +12,6 @@ import { SafeAreaView } from "react-native-safe-area-context"; import { useSelector } from "react-redux"; import { Trans, useTranslation } from "react-i18next"; import invariant from "invariant"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { CompositeScreenProps, useTheme } from "@react-navigation/native"; import { GraphTabs, Text, IconsLegacy } from "@ledgerhq/native-ui"; @@ -35,6 +34,7 @@ import Button from "~/components/wrappedUi/Button"; import { FreezeNavigatorParamList } from "~/components/RootNavigator/types/FreezeNavigator"; import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { BaseNavigatorStackParamList } from "~/components/RootNavigator/types/BaseNavigator"; +import { useAccountUnit, useMaybeAccountUnit } from "~/hooks/useAccountUnit"; const infoModalData = [ { @@ -66,7 +66,7 @@ export default function FreezeAmount({ navigation, route }: NavigatorProps) { const bridge = getAccountBridge(account, undefined); - const defaultUnit = getAccountUnit(account); + const defaultUnit = useAccountUnit(account); const { spendableBalance } = account; const [selectedRatio, selectRatio] = useState(); @@ -205,10 +205,10 @@ export default function FreezeAmount({ navigation, route }: NavigatorProps) { [showAmountRatio, spendableBalance], ); - if (!account || !transaction) return null; + const unit = useMaybeAccountUnit(account); + if (!account || !transaction || !unit) return null; const { amount } = status; - const unit = getAccountUnit(account); const error = amount.eq(0) || bridgePending ? null : status.errors.amount; const warning = status.warnings.amount; diff --git a/apps/ledger-live-mobile/src/screens/ImportAccounts/DisplayResult.tsx b/apps/ledger-live-mobile/src/screens/ImportAccounts/DisplayResult.tsx index 710abdcd9272..1ac857341967 100644 --- a/apps/ledger-live-mobile/src/screens/ImportAccounts/DisplayResult.tsx +++ b/apps/ledger-live-mobile/src/screens/ImportAccounts/DisplayResult.tsx @@ -7,18 +7,12 @@ import groupBy from "lodash/groupBy"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { Account } from "@ledgerhq/types-live"; -import { - ImportItem, - importAccountsMakeItems, - syncNewAccountsToImport, - ImportAccountsReduceInput, -} from "@ledgerhq/live-common/account/index"; import { Trans } from "react-i18next"; import { compose } from "redux"; import { Flex } from "@ledgerhq/native-ui"; import { importDesktopSettings } from "~/actions/settings"; -import { importAccounts } from "~/actions/accounts"; +import { importAccountsLiveQR } from "~/actions/accounts"; import { accountsSelector } from "~/reducers/accounts"; import { TrackScreen } from "~/analytics"; import { NavigatorName, ScreenName } from "~/const"; @@ -39,6 +33,14 @@ import type { } from "~/components/RootNavigator/types/helpers"; import { SettingsImportDesktopPayload } from "~/actions/types"; import { NavigationHeaderBackImage } from "~/components/NavigationHeaderBackButton"; +import { + ImportAccountsReduceInput, + ImportItem, + importAccountsMakeItems, + syncNewAccountsToImport, +} from "@ledgerhq/live-wallet/liveqr/importAccounts"; +import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; +import { setAccountNames } from "@ledgerhq/live-wallet/store"; type NavigationProps = BaseComposite< StackNavigatorProps @@ -47,13 +49,15 @@ type NavigationProps = BaseComposite< type ConnectProps = { backlistedTokenIds: string[]; accounts: Account[]; - importAccounts: (_: ImportAccountsReduceInput) => void; + importAccountsLiveQR: (_: ImportAccountsReduceInput) => void; + setAccountNames: typeof setAccountNames; importDesktopSettings: typeof importDesktopSettings; }; type Props = ConnectProps & NavigationProps; type State = { + accountNames: Map; selectedAccounts: string[]; items: ImportItem[]; importing: boolean; @@ -81,6 +85,7 @@ export function BackButton() { class DisplayResult extends Component { state = { + accountNames: new Map(), selectedAccounts: [], items: [] as ImportItem[], importSettings: true, @@ -99,7 +104,7 @@ class DisplayResult extends Component { }; static getDerivedStateFromProps(nextProps: Props, prevState: State) { - const items = importAccountsMakeItems({ + const result = importAccountsMakeItems({ result: nextProps.route.params?.result, accounts: nextProps.accounts, items: prevState.items, @@ -107,7 +112,7 @@ class DisplayResult extends Component { let selectedAccounts = prevState.selectedAccounts; if (prevState.items.length === 0) { // select all by default - selectedAccounts = items.reduce((acc, cur) => { + selectedAccounts = result.items.reduce((acc, cur) => { if (cur.mode !== "id" && cur.mode !== "unsupported") { const combined = acc.concat(cur.account.id); return combined; @@ -116,12 +121,18 @@ class DisplayResult extends Component { return acc; }, []); } - return { items, selectedAccounts }; + return { items: result.items, accountNames: result.accountNames, selectedAccounts }; } onImport = async () => { - const { importAccounts, importDesktopSettings, navigation, backlistedTokenIds } = this.props; - const { selectedAccounts, items, importSettings, importing } = this.state; + const { + importAccountsLiveQR, + setAccountNames, + importDesktopSettings, + navigation, + backlistedTokenIds, + } = this.props; + const { selectedAccounts, items, importSettings, importing, accountNames } = this.state; if (importing) return; const onFinish = this.props.route.params?.onFinish; this.setState({ importing: true }); @@ -130,10 +141,16 @@ class DisplayResult extends Component { items, selectedAccounts, }, + getAccountBridge, bridgeCache, backlistedTokenIds, ); - importAccounts({ items, selectedAccounts, syncResult }); + importAccountsLiveQR({ + items, + selectedAccounts, + syncResult, + }); + setAccountNames(accountNames); if (importSettings) { importDesktopSettings( this.props.route.params?.result.settings as SettingsImportDesktopPayload, @@ -167,6 +184,7 @@ class DisplayResult extends Component { checked={this.state.selectedAccounts.some(s => s === account.id)} onSwitch={this.onSwitchResultItem} importing={this.state.importing} + accountNames={this.state.accountNames} /> ); @@ -258,8 +276,9 @@ export default compose( backlistedTokenIds: blacklistedTokenIdsSelector, }), { - importAccounts, + importAccountsLiveQR, importDesktopSettings, + setAccountNames, }, ), )(DisplayResult); diff --git a/apps/ledger-live-mobile/src/screens/ImportAccounts/DisplayResultItem.tsx b/apps/ledger-live-mobile/src/screens/ImportAccounts/DisplayResultItem.tsx index 1f8367bdc4d8..baf18e65e8f8 100644 --- a/apps/ledger-live-mobile/src/screens/ImportAccounts/DisplayResultItem.tsx +++ b/apps/ledger-live-mobile/src/screens/ImportAccounts/DisplayResultItem.tsx @@ -1,4 +1,4 @@ -import { ImportItem } from "@ledgerhq/live-common/account/importAccounts"; +import { ImportItem } from "@ledgerhq/live-wallet/liveqr/importAccounts"; import { Flex, InfiniteLoader } from "@ledgerhq/native-ui"; import { Account } from "@ledgerhq/types-live"; import React from "react"; @@ -26,9 +26,17 @@ type Props = { checked: boolean; importing: boolean; onSwitch: (checked: boolean, account: Account) => void; + accountNames: Map; }; -const DisplayResultItem = ({ account, mode, checked, importing, onSwitch }: Props) => { +const DisplayResultItem = ({ + account, + mode, + checked, + importing, + onSwitch, + accountNames, +}: Props) => { const handleSwitch = () => { track(checked ? "AccountSwitchOff" : "AccountSwitchOn"); onSwitch(!checked, account); @@ -42,7 +50,11 @@ const DisplayResultItem = ({ account, mode, checked, importing, onSwitch }: Prop style={[styles.root, { opacity: selectable ? 1 : 0.5 }]} > - + {!selectable ? null : ( diff --git a/apps/ledger-live-mobile/src/screens/ImportAccounts/Scan.tsx b/apps/ledger-live-mobile/src/screens/ImportAccounts/Scan.tsx index 18d30ca78307..cd5359f8f3ce 100644 --- a/apps/ledger-live-mobile/src/screens/ImportAccounts/Scan.tsx +++ b/apps/ledger-live-mobile/src/screens/ImportAccounts/Scan.tsx @@ -1,7 +1,7 @@ import React, { PureComponent } from "react"; import { StyleSheet, View } from "react-native"; import { parseFramesReducer, framesToData, areFramesComplete, progressOfFrames } from "qrloop"; -import { Result as ImportAccountsResult, decode } from "@ledgerhq/live-common/cross"; +import { Result as ImportAccountsResult, decode } from "@ledgerhq/live-wallet/liveqr/cross"; import { TrackScreen } from "~/analytics"; import { ScreenName } from "~/const"; import Scanner from "~/components/Scanner"; diff --git a/apps/ledger-live-mobile/src/screens/OperationDetails/Content.tsx b/apps/ledger-live-mobile/src/screens/OperationDetails/Content.tsx index a920251fe46f..bfcdfdb0c32d 100644 --- a/apps/ledger-live-mobile/src/screens/OperationDetails/Content.tsx +++ b/apps/ledger-live-mobile/src/screens/OperationDetails/Content.tsx @@ -5,12 +5,7 @@ import { useSelector } from "react-redux"; import { Trans, useTranslation } from "react-i18next"; import { useNavigation, useTheme } from "@react-navigation/native"; import type { Account, Operation, AccountLike, NFTMetadataResponse } from "@ledgerhq/types-live"; -import { - getAccountUnit, - getAccountName, - getFeesCurrency, - getFeesUnit, -} from "@ledgerhq/live-common/account/index"; +import { getFeesCurrency, getFeesUnit } from "@ledgerhq/live-common/account/index"; import { getOperationAmountNumber, isConfirmedOperation, @@ -47,6 +42,8 @@ import type { StackNavigatorNavigation, } from "~/components/RootNavigator/types/helpers"; import type { BaseNavigatorStackParamList } from "~/components/RootNavigator/types/BaseNavigator"; +import { useAccountName } from "~/reducers/wallet"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type HelpLinkProps = { event: string; @@ -108,13 +105,14 @@ export default function Content({ }, []); const currencySettings = useSelector((s: State) => - currencySettingsForAccountSelector(s, { + currencySettingsForAccountSelector(s.settings, { account: mainAccount, }), ); const isToken = currency.type === "TokenCurrency"; - const unit = getAccountUnit(account); + const accountName = useAccountName(account); + const unit = useAccountUnit(account); const feeCurrency = getFeesCurrency(mainAccount); const feeUnit = getFeesUnit(feeCurrency); const amount = getOperationAmountNumber(operation); @@ -338,7 +336,7 @@ export default function Content({ {!disableAllLinks ? (
diff --git a/apps/ledger-live-mobile/src/screens/PTX/BuyAndSell/index.tsx b/apps/ledger-live-mobile/src/screens/PTX/BuyAndSell/index.tsx index 9dc99f195c66..d5056e36be77 100644 --- a/apps/ledger-live-mobile/src/screens/PTX/BuyAndSell/index.tsx +++ b/apps/ledger-live-mobile/src/screens/PTX/BuyAndSell/index.tsx @@ -19,9 +19,9 @@ import { ExchangeNavigatorParamList } from "~/components/RootNavigator/types/Exc import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { ScreenName } from "~/const"; import { accountsSelector } from "~/reducers/accounts"; -import { WALLET_API_VERSION } from "@ledgerhq/live-common/wallet-api/constants"; import { useInternalAppIds } from "@ledgerhq/live-common/hooks/useInternalAppIds"; -import { INTERNAL_APP_IDS } from "@ledgerhq/live-common/wallet-api/constants"; +import { INTERNAL_APP_IDS, WALLET_API_VERSION } from "@ledgerhq/live-common/wallet-api/constants"; +import { walletSelector } from "~/reducers/wallet"; export type Props = StackNavigatorProps< ExchangeNavigatorParamList, @@ -43,6 +43,7 @@ export function BuyAndSellScreen({ route }: Props) { const { locale } = useLocale(); const manifest = localManifest || remoteManifest; const internalAppIds = useInternalAppIds() || INTERNAL_APP_IDS; + const walletState = useSelector(walletSelector); /** * Pass correct account ID @@ -60,11 +61,11 @@ export function BuyAndSellScreen({ route }: Props) { const parentAccount = isTokenAccount(account) ? getParentAccount(account, accounts) : undefined; - params.account = accountToWalletAPIAccount(account, parentAccount).id; + params.account = accountToWalletAPIAccount(walletState, account, parentAccount).id; } } return params; - }, [accounts, manifest?.apiVersion, params]); + }, [walletState, accounts, manifest?.apiVersion, params]); /** * Given the user is on an internal app (webview url is owned by LL) we must reset the session diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx index 52764af43b13..b04f0192d166 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-AddAccount.tsx @@ -3,7 +3,7 @@ import { FlatList } from "react-native"; import { concat, from } from "rxjs"; import type { Subscription } from "rxjs"; import { ignoreElements } from "rxjs/operators"; -import { useDispatch } from "react-redux"; +import { useDispatch, useSelector } from "react-redux"; import { useTranslation } from "react-i18next"; import type { Account, TokenAccount } from "@ledgerhq/types-live"; import { Currency } from "@ledgerhq/types-cryptoassets"; @@ -11,7 +11,6 @@ import { getCurrencyBridge } from "@ledgerhq/live-common/bridge/index"; import { Flex, Text } from "@ledgerhq/native-ui"; import { makeEmptyTokenAccount } from "@ledgerhq/live-common/account/index"; -import { replaceAccounts } from "~/actions/accounts"; import logger from "../../logger"; import { ScreenName } from "~/const"; import { TrackScreen } from "~/analytics"; @@ -33,6 +32,10 @@ import Animation from "~/components/Animation"; import lottie from "./assets/lottie.json"; import GradientContainer from "~/components/GradientContainer"; import { useTheme } from "styled-components/native"; +import { walletSelector } from "~/reducers/wallet"; +import { accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; +import { addAccountsAction } from "@ledgerhq/live-wallet/addAccounts"; +import { accountsSelector } from "~/reducers/accounts"; type Props = StackNavigatorProps; @@ -47,6 +50,7 @@ function AddAccountsAccounts({ navigation, route }: Props) { const [cancelled, setCancelled] = useState(false); const [selectedAccount, setSelectedAccount] = useState(null); + const existingAccounts = useSelector(accountsSelector); const scanSubscription = useRef(); const { @@ -65,7 +69,8 @@ function AddAccountsAccounts({ navigation, route }: Props) { if (!selectedAccount) { setSelectedAccount(account.id); dispatch( - replaceAccounts({ + addAccountsAction({ + existingAccounts, scannedAccounts, selectedIds: [account.id], renamings: {}, @@ -87,7 +92,7 @@ function AddAccountsAccounts({ navigation, route }: Props) { } } }, - [dispatch, navigation, route.params, scannedAccounts, selectedAccount], + [dispatch, navigation, route.params, scannedAccounts, existingAccounts, selectedAccount], ); useEffect(() => { @@ -177,6 +182,8 @@ function AddAccountsAccounts({ navigation, route }: Props) { } }, [cancelled, navigation]); + const walletState = useSelector(walletSelector); + const renderItem = useCallback( ({ item: account }: { item: Account }) => { const acc = @@ -191,14 +198,16 @@ function AddAccountsAccounts({ navigation, route }: Props) { onPress={() => selectAccount(account)} AccountSubTitle={ currency.type === "TokenCurrency" ? ( - {account.name} + + {accountNameWithDefaultSelector(walletState, account)} + ) : null } /> ) : null; }, - [currency.id, currency.type, selectAccount], + [currency.id, currency.type, selectAccount, walletState], ); const renderHeader = useCallback( diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx index 94abb4be3612..6af84ef3d585 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/02-SelectAccount.tsx @@ -17,6 +17,8 @@ import { useSafeAreaInsets } from "react-native-safe-area-context"; import { AccountsNavigatorParamList } from "~/components/RootNavigator/types/AccountsNavigator"; import { useNavigation } from "@react-navigation/core"; import { withDiscreetMode } from "~/context/DiscreetModeContext"; +import { walletSelector } from "~/reducers/wallet"; +import { accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; type SubAccountEnhanced = SubAccount & { parentAccount: Account; @@ -96,6 +98,8 @@ function ReceiveSelectAccount({ [currency, navigation, route.params], ); + const walletState = useSelector(walletSelector); + const renderItem = useCallback( ({ item }: ListRenderItemInfo) => ( @@ -105,12 +109,11 @@ function ReceiveSelectAccount({ (item as SubAccountEnhanced).parentAccount || (item as TokenAccount).token?.parentCurrency ? ( - { - ( - ((item as SubAccountEnhanced).parentAccount as Account) || - (item as TokenAccount).token.parentCurrency - ).name - } + {accountNameWithDefaultSelector( + walletState, + ((item as SubAccountEnhanced).parentAccount as Account) || + (item as TokenAccount).token.parentCurrency, + )} ) : null } @@ -118,7 +121,7 @@ function ReceiveSelectAccount({ /> ), - [selectAccount], + [walletState, selectAccount], ); const createNewAccount = useCallback(() => { diff --git a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx index d86917c20e1d..a345ece5cd67 100644 --- a/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx +++ b/apps/ledger-live-mobile/src/screens/ReceiveFunds/03-Confirmation.tsx @@ -22,7 +22,7 @@ import { accountScreenSelector } from "~/reducers/accounts"; import CurrencyIcon from "~/components/CurrencyIcon"; import NavigationScrollView from "~/components/NavigationScrollView"; import ReceiveSecurityModal from "./ReceiveSecurityModal"; -import { replaceAccounts } from "~/actions/accounts"; +import { addOneAccount } from "~/actions/accounts"; import { ScreenName } from "~/const"; import { track, TrackScreen } from "~/analytics"; import byFamily from "../../generated/Confirmation"; @@ -40,6 +40,7 @@ import { setCloseWithdrawBanner } from "~/actions/settings"; import * as Animatable from "react-native-animatable"; import { useCompleteActionCallback } from "~/logic/postOnboarding/useCompleteAction"; import { urls } from "~/utils/urls"; +import { useMaybeAccountName } from "~/reducers/wallet"; const AnimatedView = Animatable.View; @@ -139,14 +140,7 @@ function ReceiveConfirmationInner({ navigation, route, account, parentAccount }: ); newMainAccount.subAccounts = [...(newMainAccount.subAccounts || []), emptyTokenAccount]; - // @TODO create a new action for adding a single account at a time instead of replacing - dispatch( - replaceAccounts({ - scannedAccounts: [newMainAccount as Account], - selectedIds: [(newMainAccount as Account).id], - renamings: {}, - }), - ); + dispatch(addOneAccount(newMainAccount as Account)); setHasAddedTokenAccount(true); } } @@ -161,7 +155,6 @@ function ReceiveConfirmationInner({ navigation, route, account, parentAccount }: useEffect(() => { navigation.setOptions({ - //headerTitle: getAccountName(account as AccountLike), headerTitle: () => ( ), @@ -230,6 +223,8 @@ function ReceiveConfirmationInner({ navigation, route, account, parentAccount }: [mainAccount?.freshAddress, pushToast, t], ); + const mainAccountName = useMaybeAccountName(mainAccount); + if (!account || !currency || !mainAccount) return null; // check for coin specific UI @@ -289,9 +284,9 @@ function ReceiveConfirmationInner({ navigation, route, account, parentAccount }: fontWeight={"semiBold"} textAlign={"center"} numberOfLines={1} - testID={"receive-account-name-" + mainAccount.name} + testID={"receive-account-name-" + mainAccountName} > - {mainAccount.name} + {mainAccountName} { diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/02-SelectRecipient.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/02-SelectRecipient.tsx index 69daa000f5c0..67c66a7c2fb0 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/02-SelectRecipient.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/02-SelectRecipient.tsx @@ -54,7 +54,7 @@ export default function SendSelectRecipient({ navigation, route }: Props) { const mainAccount = getMainAccount(account, parentAccount); const currencySettings = useSelector((s: State) => - currencySettingsForAccountSelector(s, { + currencySettingsForAccountSelector(s.settings, { account: mainAccount, }), ); diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/03a-AmountCoin.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/03a-AmountCoin.tsx index bb309d29348c..ec8a96dbce38 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/03a-AmountCoin.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/03a-AmountCoin.tsx @@ -10,7 +10,6 @@ import { useTheme } from "@react-navigation/native"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import { useDebounce } from "@ledgerhq/live-common/hooks/useDebounce"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; import { ScreenName } from "~/const"; import { accountScreenSelector } from "~/reducers/accounts"; @@ -32,6 +31,7 @@ import { GenericInformationBody } from "~/components/GenericInformationBody"; import { ExternalLinkMedium, InformationFill } from "@ledgerhq/native-ui/assets/icons"; import { Flex, Link } from "@ledgerhq/native-ui"; import { urls } from "~/utils/urls"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps; @@ -120,10 +120,11 @@ export default function SendAmountCoin({ navigation, route }: Props) { }, [setTransaction, account, parentAccount, transaction]); const blur = useCallback(() => Keyboard.dismiss(), []); const onMaxSpendableLearnMore = useCallback(() => Linking.openURL(urls.maxSpendable), []); - if (!account || !transaction) return null; + + const unit = useMaybeAccountUnit(account); + if (!account || !transaction || !unit) return null; const { useAllAmount } = transaction; const { amount } = status; - const unit = getAccountUnit(account); const currency = getAccountCurrency(account); return ( diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/AmountInput.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/AmountInput.tsx index cc56866020f9..6d6dd61491c2 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/AmountInput.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/AmountInput.tsx @@ -11,6 +11,7 @@ import LText from "~/components/LText/index"; import CounterValuesSeparator from "./CounterValuesSeparator"; import CurrencyInput from "~/components/CurrencyInput"; import TranslatedError from "~/components/TranslatedError"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: AccountLike; @@ -34,7 +35,8 @@ export default function AmountInput({ }: Props) { const { t } = useTranslation(); const fiatCurrency = useSelector(counterValueCurrencySelector); - const { cryptoUnit, fiatAmount, fiatUnit, calculateCryptoAmount } = useSendAmount({ + const cryptoUnit = useAccountUnit(account); + const { fiatAmount, fiatUnit, calculateCryptoAmount } = useSendAmount({ account, fiatCurrency, cryptoAmount, diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/SummaryAmountSection.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/SummaryAmountSection.tsx index 6a808f1e5f3b..2fc926c3b3f1 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/SummaryAmountSection.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/SummaryAmountSection.tsx @@ -2,12 +2,13 @@ import React from "react"; import { View, StyleSheet } from "react-native"; import { Trans } from "react-i18next"; import type { Account, AccountLike } from "@ledgerhq/types-live"; -import { getAccountUnit, getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; import BigNumber from "bignumber.js"; import SummaryRow from "./SummaryRow"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import CounterValue from "~/components/CounterValue"; import LText from "~/components/LText"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; const styles = StyleSheet.create({ amountContainer: { @@ -30,7 +31,7 @@ type Props = { }; const SummaryAmountSection = ({ account, amount, overrideAmountLabel }: Props) => { - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const currency = getAccountCurrency(account); return ( diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/SummaryFromSection.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/SummaryFromSection.tsx index 8487daec2d60..5f2b78d41af3 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/SummaryFromSection.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/SummaryFromSection.tsx @@ -2,13 +2,14 @@ import React, { memo } from "react"; import { View, StyleSheet } from "react-native"; import { useTranslation } from "react-i18next"; import type { Account, AccountLike } from "@ledgerhq/types-live"; -import { getAccountCurrency, getAccountName } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { useTheme } from "styled-components/native"; import SummaryRowCustom from "./SummaryRowCustom"; import Circle from "~/components/Circle"; import LText from "~/components/LText"; import CurrencyIcon from "~/components/CurrencyIcon"; import Wallet from "@ledgerhq/icons-ui/native/Wallet"; +import { useAccountName } from "~/reducers/wallet"; type Props = { account: AccountLike; @@ -19,6 +20,7 @@ function SummaryFromSection({ account }: Props) { const { colors } = useTheme(); const { t } = useTranslation(); const currency = getAccountCurrency(account); + const accountName = useAccountName(account); return ( - {getAccountName(account)} + {accountName} } diff --git a/apps/ledger-live-mobile/src/screens/SendFunds/SummaryTotalSection.tsx b/apps/ledger-live-mobile/src/screens/SendFunds/SummaryTotalSection.tsx index 68a476ff37e9..8593c323a38a 100644 --- a/apps/ledger-live-mobile/src/screens/SendFunds/SummaryTotalSection.tsx +++ b/apps/ledger-live-mobile/src/screens/SendFunds/SummaryTotalSection.tsx @@ -1,7 +1,7 @@ -import React, { PureComponent } from "react"; +import React, { useState } from "react"; import { View, StyleSheet } from "react-native"; import type { Account, AccountLike } from "@ledgerhq/types-live"; -import { getAccountUnit, getAccountCurrency } from "@ledgerhq/live-common/account/index"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/index"; import { Trans } from "react-i18next"; import BigNumber from "bignumber.js"; import SummaryRow from "./SummaryRow"; @@ -14,6 +14,7 @@ import Info from "~/icons/Info"; import { withTheme, Theme } from "~/colors"; import { GenericInformationBody } from "~/components/GenericInformationBody"; import { InformationFill } from "@ledgerhq/native-ui/assets/icons"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = { account: AccountLike; @@ -21,65 +22,55 @@ type Props = { amount: number | BigNumber; colors: Theme["colors"]; }; -type State = { - isModalOpened: boolean; -}; -class SummaryTotalSection extends PureComponent { - state = { - isModalOpened: false, - }; - onRequestClose = () => { - this.setState({ - isModalOpened: false, - }); +const SummaryTotalSection = ({ account, amount, colors }: Props) => { + const [isModalOpened, setIsModalOpened] = useState(false); + + const onRequestClose = () => { + setIsModalOpened(false); }; - onPress = () => { - this.setState({ - isModalOpened: true, - }); + + const onPress = () => { + setIsModalOpened(true); }; - render() { - const { account, amount, colors } = this.props; - const { isModalOpened } = this.state; - const unit = getAccountUnit(account); - const currency = getAccountCurrency(account); - return ( - <> - } - additionalInfo={ - - - - } - titleProps={{ - semiBold: true, - style: styles.title, - }} - > - - - - - - - - - - - } - description={} - /> - - - ); - } -} + const unit = useAccountUnit(account); + const currency = getAccountCurrency(account); + + return ( + <> + } + additionalInfo={ + + + + } + titleProps={{ + semiBold: true, + style: styles.title, + }} + > + + + + + + + + + + + } + description={} + /> + + + ); +}; const styles = StyleSheet.create({ summary: { @@ -95,4 +86,5 @@ const styles = StyleSheet.create({ fontSize: 14, }, }); -export default withTheme(SummaryTotalSection); + +export default withTheme(React.memo(SummaryTotalSection)); diff --git a/apps/ledger-live-mobile/src/screens/Settings/CryptoAssets/Currencies/CurrencySettings.tsx b/apps/ledger-live-mobile/src/screens/Settings/CryptoAssets/Currencies/CurrencySettings.tsx index 4f19ba740316..d072b0592031 100644 --- a/apps/ledger-live-mobile/src/screens/Settings/CryptoAssets/Currencies/CurrencySettings.tsx +++ b/apps/ledger-live-mobile/src/screens/Settings/CryptoAssets/Currencies/CurrencySettings.tsx @@ -15,10 +15,11 @@ import { currencySettingsDefaults } from "~/helpers/CurrencySettingsDefaults"; import CurrencyIcon from "~/components/CurrencyIcon"; import { ScreenName } from "~/const"; import { SettingsNavigatorStackParamList } from "~/components/RootNavigator/types/SettingsNavigator"; -import { ConfirmationDefaults } from "~/types/common"; +import { ConfirmationDefaults, UnitDefaults } from "~/types/common"; import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { BaseNavigatorStackParamList } from "~/components/RootNavigator/types/BaseNavigator"; import { AccountSettingsNavigatorParamList } from "~/components/RootNavigator/types/AccountSettingsNavigator"; +import CurrencyUnitsRow from "./CurrencyUnitsRow"; type NavigationProps = | StackNavigatorProps @@ -28,7 +29,7 @@ type NavigationProps = type Props = { confirmationsNb: number; updateCurrencySettings: typeof updateCurrencySettings; - defaults: ConfirmationDefaults; + defaults: ConfirmationDefaults & UnitDefaults; currency: CryptoCurrency; }; @@ -102,6 +103,8 @@ function EachCurrencySettings({ )} + + {defaults.unit && } ); } diff --git a/apps/ledger-live-mobile/src/screens/Settings/CryptoAssets/Currencies/CurrencyUnitsRow.tsx b/apps/ledger-live-mobile/src/screens/Settings/CryptoAssets/Currencies/CurrencyUnitsRow.tsx new file mode 100644 index 000000000000..307f9ca55504 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/Settings/CryptoAssets/Currencies/CurrencyUnitsRow.tsx @@ -0,0 +1,49 @@ +import React, { memo } from "react"; +import { Trans } from "react-i18next"; +import { useNavigation, useTheme } from "@react-navigation/native"; +import { ScreenName } from "~/const"; +import SettingsRow from "~/components/SettingsRow"; +import LText from "~/components/LText"; +import { CryptoCurrency } from "@ledgerhq/types-cryptoassets"; +import { useSelector } from "react-redux"; +import { currencySettingsSelector } from "~/reducers/settings"; +import { State } from "~/reducers/types"; + +type Props = { + currency: CryptoCurrency; +}; + +function CurrencyUnitsRow({ currency }: Props) { + const { colors } = useTheme(); + const navigation = useNavigation(); + const currencySettings = useSelector((s: State) => + currencySettingsSelector(s.settings, { + currency, + }), + ); + + return ( + } + desc={} + arrowRight + onPress={() => + navigation.navigate(ScreenName.EditCurrencyUnits, { + currency, + }) + } + > + + {currencySettings.unit.code} + + + ); +} + +export default memo(CurrencyUnitsRow); diff --git a/apps/ledger-live-mobile/src/screens/Settings/CryptoAssets/Currencies/EditCurrencyUnits.tsx b/apps/ledger-live-mobile/src/screens/Settings/CryptoAssets/Currencies/EditCurrencyUnits.tsx new file mode 100644 index 000000000000..26ad41939db4 --- /dev/null +++ b/apps/ledger-live-mobile/src/screens/Settings/CryptoAssets/Currencies/EditCurrencyUnits.tsx @@ -0,0 +1,74 @@ +import React from "react"; +import { View, StyleSheet, FlatList } from "react-native"; +import { useDispatch, useSelector } from "react-redux"; +import { Unit } from "@ledgerhq/types-cryptoassets"; +import SettingsRow from "~/components/SettingsRow"; +import NavigationScrollView from "~/components/NavigationScrollView"; +import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; +import { ScreenName } from "~/const"; +import { SettingsNavigatorStackParamList } from "~/components/RootNavigator/types/SettingsNavigator"; +import { updateCurrencySettings } from "~/actions/settings"; +import { State } from "~/reducers/types"; +import { currencySettingsSelector } from "~/reducers/settings"; + +type NavigationProps = StackNavigatorProps< + SettingsNavigatorStackParamList, + ScreenName.EditCurrencyUnits +>; + +export default function EditCurrencyUnits({ navigation, route }: NavigationProps) { + const dispatch = useDispatch(); + const { currency } = route.params; + + const currencySettings = useSelector((s: State) => + currencySettingsSelector(s.settings, { + currency, + }), + ); + + const onPressItem = (item: Unit) => { + dispatch( + updateCurrencySettings({ + ticker: currency.ticker, + patch: { + unit: item, + }, + }), + ); + navigation.goBack(); + }; + + const units = currency.units; + const unit = currencySettings.unit; + + return ( + + + item.code} + renderItem={({ item }) => ( + onPressItem(item)} + /> + )} + /> + + + ); +} +const styles = StyleSheet.create({ + root: { + flex: 1, + paddingTop: 16, + paddingBottom: 64, + }, + body: { + flexDirection: "column", + flex: 1, + padding: 16, + }, +}); diff --git a/apps/ledger-live-mobile/src/screens/Settings/Debug/Features/ExportAccounts.tsx b/apps/ledger-live-mobile/src/screens/Settings/Debug/Features/ExportAccounts.tsx index 4efc816833f4..d3f4895b9cfd 100644 --- a/apps/ledger-live-mobile/src/screens/Settings/Debug/Features/ExportAccounts.tsx +++ b/apps/ledger-live-mobile/src/screens/Settings/Debug/Features/ExportAccounts.tsx @@ -5,7 +5,7 @@ import QRCode from "react-native-qrcode-svg"; import VersionNumber from "react-native-version-number"; import { Flex, Alert } from "@ledgerhq/native-ui"; import { createStructuredSelector } from "reselect"; -import { encode, Settings } from "@ledgerhq/live-common/cross"; +import { encode, Settings } from "@ledgerhq/live-wallet/liveqr/cross"; import { dataToFrames } from "qrloop"; import { Account } from "@ledgerhq/types-live"; import { accountsSelector } from "~/reducers/accounts"; @@ -13,8 +13,11 @@ import { exportSettingsSelector } from "~/reducers/settings"; import LText from "~/components/LText"; import NavigationScrollView from "~/components/NavigationScrollView"; import { State } from "~/reducers/types"; +import { walletSelector } from "~/reducers/wallet"; +import { WalletState } from "@ledgerhq/live-wallet/store"; export type Props = { + walletState: WalletState; accounts: Account[]; settings: Settings; children?: React.ReactNode; @@ -33,8 +36,9 @@ class ExportAccounts extends PureComponent< timer: NodeJS.Timeout | undefined; componentDidMount() { - const { accounts, settings } = this.props; + const { accounts, settings, walletState } = this.props; const data = encode({ + walletState, accounts, settings, exporterName: "mobile", @@ -100,10 +104,12 @@ export default connect( createStructuredSelector< State, { + walletState: WalletState; accounts: Account[]; settings: Settings; } >({ + walletState: walletSelector, accounts: accountsSelector, settings: exportSettingsSelector, }), diff --git a/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccounts.tsx b/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccounts.tsx index d0bb4c8b628c..346081802a26 100644 --- a/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccounts.tsx +++ b/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccounts.tsx @@ -8,18 +8,22 @@ import SettingsRow from "~/components/SettingsRow"; import accountModel from "~/logic/accountModel"; import { saveAccounts } from "../../../../db"; import { useReboot } from "~/context/Reboot"; +import { + initialState as liveWalletInitialState, + accountUserDataExportSelector, +} from "@ledgerhq/live-wallet/store"; async function injectMockAccountsInDB(count: number) { await saveAccounts({ active: Array(count) .fill(null) - .map(() => - accountModel.encode( - genAccount(String(Math.random()), { - currency: sample(listSupportedCurrencies()), - }), - ), - ), + .map(() => { + const account = genAccount(String(Math.random()), { + currency: sample(listSupportedCurrencies()), + }); + const userData = accountUserDataExportSelector(liveWalletInitialState, { account }); + return accountModel.encode([account, userData]); + }), }); } diff --git a/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccountsNFTs.tsx b/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccountsNFTs.tsx index 50ca6984a8a1..76edde201b60 100644 --- a/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccountsNFTs.tsx +++ b/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccountsNFTs.tsx @@ -8,6 +8,10 @@ import SettingsRow from "~/components/SettingsRow"; import accountModel from "~/logic/accountModel"; import { saveAccounts } from "../../../../db"; import { useReboot } from "~/context/Reboot"; +import { + initialState as liveWalletInitialState, + accountUserDataExportSelector, +} from "@ledgerhq/live-wallet/store"; const CURRENCIES_FOR_NFT = ["ethereum", "polygon"]; @@ -15,16 +19,16 @@ async function injectMockAccountsInDB(count: number) { await saveAccounts({ active: Array(count) .fill(null) - .map(() => - accountModel.encode( - genAccount(String(Math.random()), { - currency: sample( - listSupportedCurrencies().filter(c => CURRENCIES_FOR_NFT.includes(c.id)), - ), - withNft: true, - }), - ), - ), + .map(() => { + const account = genAccount(String(Math.random()), { + currency: sample( + listSupportedCurrencies().filter(c => CURRENCIES_FOR_NFT.includes(c.id)), + ), + withNft: true, + }); + const userData = accountUserDataExportSelector(liveWalletInitialState, { account }); + return accountModel.encode([account, userData]); + }), }); } diff --git a/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccountsSelect.tsx b/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccountsSelect.tsx index d6b94601830f..d83a7799e12e 100644 --- a/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccountsSelect.tsx +++ b/apps/ledger-live-mobile/src/screens/Settings/Debug/Generators/GenerateMockAccountsSelect.tsx @@ -15,18 +15,22 @@ import CurrencyIcon from "~/components/CurrencyIcon"; import { SettingsNavigatorStackParamList } from "~/components/RootNavigator/types/SettingsNavigator"; import { StackNavigatorNavigation } from "~/components/RootNavigator/types/helpers"; import TextInput from "~/components/TextInput"; +import { + initialState as liveWalletInitialState, + accountUserDataExportSelector, +} from "@ledgerhq/live-wallet/store"; async function injectMockAccountsInDB(currencies: CryptoCurrency[], tokens: string) { const tokenIds = tokens.split(",").map(t => t.toLowerCase().trim()); await saveAccounts({ - active: currencies.map(currency => - accountModel.encode( - genAccount(String(Math.random()), { - currency, - tokenIds, - }), - ), - ), + active: currencies.map(currency => { + const account = genAccount(String(Math.random()), { + currency, + tokenIds, + }); + const userData = accountUserDataExportSelector(liveWalletInitialState, { account }); + return accountModel.encode([account, userData]); + }), }); } diff --git a/apps/ledger-live-mobile/src/screens/SignMessage/01-Summary.tsx b/apps/ledger-live-mobile/src/screens/SignMessage/01-Summary.tsx index 8fdfa3d0743e..ac3dd1694b63 100644 --- a/apps/ledger-live-mobile/src/screens/SignMessage/01-Summary.tsx +++ b/apps/ledger-live-mobile/src/screens/SignMessage/01-Summary.tsx @@ -1,5 +1,5 @@ import { getMessageProperties } from "@ledgerhq/coin-evm/logic"; -import { getAccountName, getMainAccount } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import type { MessageProperties } from "@ledgerhq/types-live"; import { useTheme } from "@react-navigation/native"; import invariant from "invariant"; @@ -17,6 +17,7 @@ import { StackNavigatorProps } from "~/components/RootNavigator/types/helpers"; import { ScreenName } from "~/const"; import WalletIcon from "~/icons/Wallet"; import { accountScreenSelector } from "~/reducers/accounts"; +import { useAccountName } from "~/reducers/wallet"; const MessageProperty = memo(({ label, value }: MessageProperties[0]) => { const { colors } = useTheme(); @@ -82,6 +83,7 @@ function SignSummary({ invariant(account, "account not found"); const mainAccount = getMainAccount(account, parentAccount); + const maybeAccountName = useAccountName(mainAccount); const { nextNavigation, message: messageData } = route.params; const navigateToNext = useCallback(() => { @@ -135,7 +137,7 @@ function SignSummary({ - {getAccountName(mainAccount)} + {maybeAccountName} diff --git a/apps/ledger-live-mobile/src/screens/Swap/Form/Summary/index.tsx b/apps/ledger-live-mobile/src/screens/Swap/Form/Summary/index.tsx index 603b98e0be7f..f5892ec42374 100644 --- a/apps/ledger-live-mobile/src/screens/Swap/Form/Summary/index.tsx +++ b/apps/ledger-live-mobile/src/screens/Swap/Form/Summary/index.tsx @@ -4,11 +4,7 @@ import { BigNumber } from "bignumber.js"; import { Flex, Icon, Text } from "@ledgerhq/native-ui"; import { getProviderName } from "@ledgerhq/live-common/exchange/swap/utils/index"; import { SwapTransactionType } from "@ledgerhq/live-common/exchange/swap/types"; -import { - getAccountName, - getAccountUnit, - getMainAccount, -} from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import { CompositeScreenProps, useNavigation, useRoute } from "@react-navigation/native"; import { useSelector } from "react-redux"; import { useCalculate } from "@ledgerhq/live-countervalues-react"; @@ -31,6 +27,8 @@ import type { SwapFormNavigatorParamList } from "~/components/RootNavigator/type import { useAnalytics } from "~/analytics"; import { sharedSwapTracking } from "../../utils"; import { EDITABLE_FEE_FAMILIES } from "@ledgerhq/live-common/exchange/swap/const/blockchain"; +import { useMaybeAccountName } from "~/reducers/wallet"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; interface Props { provider?: string; @@ -155,10 +153,12 @@ export function Summary({ provider, swapTx: { swap, status, transaction } }: Pro const fromUnit = from.currency?.units[0]; const mainFromAccount = from.account && getMainAccount(from.account, from.parentAccount); - const mainAccountUnit = mainFromAccount && getAccountUnit(mainFromAccount); + const mainAccountUnit = useMaybeAccountUnit(mainFromAccount); const editableFee = mainFromAccount && EDITABLE_FEE_FAMILIES.includes(mainFromAccount.currency.family); + const toAccountName = useMaybeAccountName(to.account); + if ( !provider || !fromUnit || @@ -219,7 +219,7 @@ export function Summary({ provider, swapTx: { swap, status, transaction } }: Pro {} - {getAccountName(to.account)} + {toAccountName} ) : ( diff --git a/apps/ledger-live-mobile/src/screens/Swap/Form/TxForm/From.tsx b/apps/ledger-live-mobile/src/screens/Swap/Form/TxForm/From.tsx index 3f66014f1db3..927ecfe5d417 100644 --- a/apps/ledger-live-mobile/src/screens/Swap/Form/TxForm/From.tsx +++ b/apps/ledger-live-mobile/src/screens/Swap/Form/TxForm/From.tsx @@ -2,11 +2,7 @@ import React, { useCallback, useMemo } from "react"; import { useTranslation } from "react-i18next"; import { useNavigation } from "@react-navigation/native"; import { Flex, Text } from "@ledgerhq/native-ui"; -import { - getAccountName, - getAccountSpendableBalance, - getAccountUnit, -} from "@ledgerhq/live-common/account/index"; +import { getAccountSpendableBalance } from "@ledgerhq/live-common/account/index"; import { formatCurrencyUnit } from "@ledgerhq/live-common/currencies/index"; import { useFetchCurrencyFrom, @@ -26,6 +22,9 @@ import { sharedSwapTracking } from "../../utils"; import { flattenAccountsSelector } from "~/reducers/accounts"; import { useSelector } from "react-redux"; import { AccountLike } from "@ledgerhq/types-live"; +import { walletSelector } from "~/reducers/wallet"; +import { accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; interface Props { provider?: string; @@ -42,6 +41,7 @@ export function From({ swapTx, provider, swapError, swapWarning, isSendMaxLoadin const { data: currenciesFrom } = useFetchCurrencyFrom(); const flattenedAccounts = useSelector(flattenAccountsSelector); const accounts = useSwapableAccounts({ accounts: flattenedAccounts }); + const walletState = useSelector(walletSelector); const getAccountBalance = useCallback( (inputs: { account?: AccountLike; currency?: Currency }) => { @@ -54,15 +54,17 @@ export function From({ swapTx, provider, swapError, swapWarning, isSendMaxLoadin [], ); - const { name, balance, unit } = useMemo(() => { + const { name, balance, account } = useMemo(() => { const { currency, account } = swapTx.swap.from; + const name = account && accountNameWithDefaultSelector(walletState, account); return { account, - name: account && getAccountName(account), + name, balance: getAccountBalance({ account, currency }), - unit: account && getAccountUnit(account), }; - }, [swapTx.swap.from, getAccountBalance]); + }, [swapTx.swap.from, walletState, getAccountBalance]); + + const unit = useMaybeAccountUnit(account); usePickDefaultAccount(accounts, swapTx.swap.from.account, swapTx.setFromAccount); diff --git a/apps/ledger-live-mobile/src/screens/Swap/Form/index.tsx b/apps/ledger-live-mobile/src/screens/Swap/Form/index.tsx index 86dfe56eced4..6f3e1664d2d4 100644 --- a/apps/ledger-live-mobile/src/screens/Swap/Form/index.tsx +++ b/apps/ledger-live-mobile/src/screens/Swap/Form/index.tsx @@ -43,6 +43,7 @@ import type { DetailsSwapParamList } from "../types"; import { getAvailableProviders } from "@ledgerhq/live-common/exchange/swap/index"; import { DEFAULT_SWAP_RATES_LLM_INTERVAL_MS } from "@ledgerhq/live-common/exchange/swap/const/timeout"; import { useSelectedSwapRate } from "./useSelectedSwapRate"; +import { walletSelector } from "~/reducers/wallet"; type Navigation = StackNavigatorProps; @@ -206,6 +207,8 @@ export function SwapForm({ exchangeRate && swapTransaction.swap.to.account; + const walletState = useSelector(walletSelector); + const onSubmit = useCallback(() => { if (!exchangeRate) return; const { provider, providerURL, providerType } = exchangeRate; @@ -239,7 +242,7 @@ export function SwapForm({ const parentAccount = isTokenAccount(account) ? getParentAccount(account, accounts) : undefined; - const walletApiId = accountToWalletAPIAccount(account, parentAccount)?.id; + const walletApiId = accountToWalletAPIAccount(walletState, account, parentAccount)?.id; return walletApiId || accountId; }; @@ -255,6 +258,7 @@ export function SwapForm({ setConfirmed(true); } }, [ + walletState, exchangeRate, track, swapTransaction.transaction, diff --git a/apps/ledger-live-mobile/src/screens/Swap/History/OperationRow.tsx b/apps/ledger-live-mobile/src/screens/Swap/History/OperationRow.tsx index 309d94f32517..4bf077095a05 100644 --- a/apps/ledger-live-mobile/src/screens/Swap/History/OperationRow.tsx +++ b/apps/ledger-live-mobile/src/screens/Swap/History/OperationRow.tsx @@ -3,13 +3,14 @@ import { TouchableOpacity, StyleSheet, View } from "react-native"; import { useNavigation, useTheme } from "@react-navigation/native"; import { Icon } from "@ledgerhq/native-ui"; import type { MappedSwapOperation } from "@ledgerhq/live-common/exchange/swap/types"; -import { getAccountUnit, getAccountName } from "@ledgerhq/live-common/account/helpers"; import LText from "~/components/LText"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; import { SwapStatusIndicator } from "../SwapStatusIndicator"; import { ScreenName } from "~/const"; import type { SwapNavigatorParamList } from "~/components/RootNavigator/types/SwapNavigator"; import type { StackNavigatorNavigation } from "~/components/RootNavigator/types/helpers"; +import { useAccountName } from "~/reducers/wallet"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; const OperationRow = ({ item }: { item: MappedSwapOperation }) => { const { colors } = useTheme(); @@ -27,6 +28,12 @@ const OperationRow = ({ item }: { item: MappedSwapOperation }) => { }); }, [navigation, routeParams, fromAccount, toAccount]); + const fromAccountName = useAccountName(fromAccount); + const toAccountName = useAccountName(toAccount); + + const unitFrom = useAccountUnit(fromAccount); + const unitTo = useAccountUnit(toAccount); + return ( { - {getAccountName(fromAccount)} + {fromAccountName} - + @@ -46,10 +53,10 @@ const OperationRow = ({ item }: { item: MappedSwapOperation }) => { - {getAccountName(toAccount)} + {toAccountName} - + diff --git a/apps/ledger-live-mobile/src/screens/Swap/SubScreens/OperationDetails.tsx b/apps/ledger-live-mobile/src/screens/Swap/SubScreens/OperationDetails.tsx index 4326fc4d2736..1ddfdf95a2a9 100644 --- a/apps/ledger-live-mobile/src/screens/Swap/SubScreens/OperationDetails.tsx +++ b/apps/ledger-live-mobile/src/screens/Swap/SubScreens/OperationDetails.tsx @@ -6,11 +6,7 @@ import { useTheme } from "@react-navigation/native"; import Config from "react-native-config"; import { ScrollView, StyleSheet, View, Linking, TouchableOpacity } from "react-native"; import { getDefaultExplorerView, getTransactionExplorer } from "@ledgerhq/live-common/explorers"; -import { - getAccountName, - getAccountUnit, - getAccountCurrency, -} from "@ledgerhq/live-common/account/helpers"; +import { getAccountCurrency } from "@ledgerhq/live-common/account/helpers"; import { getProviderName } from "@ledgerhq/live-common/exchange/swap/utils/index"; import { flattenAccountsSelector } from "~/reducers/accounts"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; @@ -24,6 +20,8 @@ import FormatDate from "~/components/DateFormat/FormatDate"; import { SwapStatusIndicator, getStatusColor } from "../SwapStatusIndicator"; import Footer from "../../OperationDetails/Footer"; import { OperationDetailsParamList } from "../types"; +import { useMaybeAccountName } from "~/reducers/wallet"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; export function OperationDetails({ route }: OperationDetailsParamList) { const { swapOperation } = route.params; @@ -61,16 +59,22 @@ export function OperationDetails({ route }: OperationDetailsParamList) { Linking.openURL(urls.swap.providers[provider as keyof typeof urls.swap.providers].main); }, [provider]); + const fromAccountName = useMaybeAccountName(fromAccount); + const toAccountName = useMaybeAccountName(toAccount); + + const unitFrom = useMaybeAccountUnit(fromAccount); + const unitTo = useMaybeAccountUnit(toAccount); + return ( {status ? : null} - {fromAccount && ( + {fromAccount && unitFrom && ( @@ -79,13 +83,8 @@ export function OperationDetails({ route }: OperationDetailsParamList) { - {toAccount ? ( - + {toAccount && unitTo ? ( + ) : null} @@ -129,16 +128,16 @@ export function OperationDetails({ route }: OperationDetailsParamList) { {fromCurrency && } {fromAccount && ( - {getAccountName(fromAccount)} + {fromAccountName} )} - {fromAccount && ( + {fromAccount && unitFrom && ( - + )} @@ -151,7 +150,7 @@ export function OperationDetails({ route }: OperationDetailsParamList) { {toCurrency ? : null} {toAccount ? ( - {getAccountName(toAccount)} + {toAccountName} ) : null} @@ -159,8 +158,8 @@ export function OperationDetails({ route }: OperationDetailsParamList) { - {toAccount ? ( - + {toAccount && unitTo ? ( + ) : null} diff --git a/apps/ledger-live-mobile/src/screens/Swap/SubScreens/SelectAccount.tsx b/apps/ledger-live-mobile/src/screens/Swap/SubScreens/SelectAccount.tsx index 6834255627ba..baf8e27d8436 100644 --- a/apps/ledger-live-mobile/src/screens/Swap/SubScreens/SelectAccount.tsx +++ b/apps/ledger-live-mobile/src/screens/Swap/SubScreens/SelectAccount.tsx @@ -19,6 +19,8 @@ import { SelectAccountParamList } from "../types"; import { NavigatorName, ScreenName } from "~/const"; import { accountsSelector } from "~/reducers/accounts"; import { sharedSwapTracking } from "../utils"; +import { walletSelector } from "~/reducers/wallet"; +import { accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; export function SelectAccount({ navigation, route: { params } }: SelectAccountParamList) { const { provider, target, selectableCurrencyIds, selectedCurrency } = params; @@ -50,6 +52,8 @@ export function SelectAccount({ navigation, route: { params } }: SelectAccountPa return filteredAccounts; }, [accounts, selectedCurrency]); + const walletState = useSelector(walletSelector); + const allAccounts = useMemo(() => { const accounts: AccountLike[] = flattenAccounts(enhancedAccounts); @@ -59,22 +63,30 @@ export function SelectAccount({ navigation, route: { params } }: SelectAccountPa const c = getAccountCurrency(a); return c.type === "CryptoCurrency" || c.id === selectedCurrency.id; }) - .map(a => { - const c = getAccountCurrency(a); + .map(account => { + const c = getAccountCurrency(account); return { - ...a, - disabled: - (selectedCurrency.type === "TokenCurrency" && c.type === "CryptoCurrency") || - c.id !== selectedCurrency.id, + name: accountNameWithDefaultSelector(walletState, account), + account: { + ...account, + // FIXME flatten disabled back in the top object + disabled: + (selectedCurrency.type === "TokenCurrency" && c.type === "CryptoCurrency") || + c.id !== selectedCurrency.id, + }, }; }); } return accounts.map(a => ({ - ...a, - disabled: !a.balance.gt(0) || !selectableCurrencyIds.includes(getAccountCurrency(a).id), + name: accountNameWithDefaultSelector(walletState, a), + account: { + ...a, + // FIXME flatten disabled back in the top object + disabled: !a.balance.gt(0) || !selectableCurrencyIds.includes(getAccountCurrency(a).id), + }, })); - }, [target, selectedCurrency, enhancedAccounts, selectableCurrencyIds]); + }, [target, selectedCurrency, enhancedAccounts, selectableCurrencyIds, walletState]); const { t } = useTranslation(); const { colors } = useTheme(); @@ -150,7 +162,10 @@ export function SelectAccount({ navigation, route: { params } }: SelectAccountPa const renderList = useCallback( (items: typeof allAccounts) => { - const formatedList = formatSearchResults(items, accounts); + const formatedList = formatSearchResults( + items.map(a => a.account), + accounts, + ); return ( ( diff --git a/apps/ledger-live-mobile/src/screens/Swap/SubScreens/SelectProvider.tsx b/apps/ledger-live-mobile/src/screens/Swap/SubScreens/SelectProvider.tsx index aa14210456f5..12360f3a2e84 100644 --- a/apps/ledger-live-mobile/src/screens/Swap/SubScreens/SelectProvider.tsx +++ b/apps/ledger-live-mobile/src/screens/Swap/SubScreens/SelectProvider.tsx @@ -1,9 +1,8 @@ -import React, { useMemo, useCallback } from "react"; +import React, { useCallback } from "react"; import { TouchableOpacity } from "react-native"; import { BigNumber } from "bignumber.js"; import { Flex, Text, Icon } from "@ledgerhq/native-ui"; import { getProviderName } from "@ledgerhq/live-common/exchange/swap/utils/index"; -import { getAccountUnit } from "@ledgerhq/live-common/account/index"; import { useTranslation } from "react-i18next"; import { ExchangeRate } from "@ledgerhq/live-common/exchange/swap/types"; import CurrencyUnitValue from "~/components/CurrencyUnitValue"; @@ -13,6 +12,7 @@ import CounterValue from "~/components/CounterValue"; import { TrackScreen, useAnalytics } from "~/analytics"; import { ScreenName } from "~/const"; import { sharedSwapTracking, SWAP_VERSION } from "../utils"; +import { useMaybeAccountUnit } from "~/hooks/useAccountUnit"; export function SelectProvider({ navigation, route }: SelectProviderParamList) { const { @@ -24,7 +24,7 @@ export function SelectProvider({ navigation, route }: SelectProviderParamList) { } = route; const { track } = useAnalytics(); const { t } = useTranslation(); - const fromUnit = useMemo(() => from.account && getAccountUnit(from.account), [from.account]); + const fromUnit = useMaybeAccountUnit(from.account); const onSelect = useCallback( (rate: ExchangeRate) => { diff --git a/apps/ledger-live-mobile/src/screens/UnfreezeFunds/01-Amount.tsx b/apps/ledger-live-mobile/src/screens/UnfreezeFunds/01-Amount.tsx index 86607638429b..71452d015718 100644 --- a/apps/ledger-live-mobile/src/screens/UnfreezeFunds/01-Amount.tsx +++ b/apps/ledger-live-mobile/src/screens/UnfreezeFunds/01-Amount.tsx @@ -6,7 +6,7 @@ import { useSelector } from "react-redux"; import { Trans } from "react-i18next"; import { useNavigation, useTheme } from "@react-navigation/native"; import type { Account } from "@ledgerhq/types-live"; -import { getMainAccount, getAccountUnit } from "@ledgerhq/live-common/account/index"; +import { getMainAccount } from "@ledgerhq/live-common/account/index"; import { getAccountBridge } from "@ledgerhq/live-common/bridge/index"; import useBridgeTransaction from "@ledgerhq/live-common/bridge/useBridgeTransaction"; import type { @@ -34,6 +34,7 @@ import { } from "~/components/RootNavigator/types/helpers"; import { UnfreezeNavigatorParamList } from "~/components/RootNavigator/types/UnfreezeNavigator"; import { getUnfreezeData } from "@ledgerhq/live-common/families/tron/react"; +import { useAccountUnit } from "~/hooks/useAccountUnit"; type Props = StackNavigatorProps; @@ -55,7 +56,7 @@ function UnfreezeAmountInner({ account }: InnerProps) { const { colors } = useTheme(); const navigation = useNavigation>(); const bridge = getAccountBridge(account, undefined); - const unit = getAccountUnit(account); + const unit = useAccountUnit(account); const { tronResources } = account as TronAccount; invariant(tronResources, "tron resources expected"); const { unfreezeBandwidth, unfreezeEnergy, canUnfreezeBandwidth, canUnfreezeEnergy } = useMemo( diff --git a/apps/ledger-live-mobile/src/screens/VerifyAccount/SkipDeviceVerification.tsx b/apps/ledger-live-mobile/src/screens/VerifyAccount/SkipDeviceVerification.tsx index 66acdac8dc38..30ffd6d66ab2 100644 --- a/apps/ledger-live-mobile/src/screens/VerifyAccount/SkipDeviceVerification.tsx +++ b/apps/ledger-live-mobile/src/screens/VerifyAccount/SkipDeviceVerification.tsx @@ -8,6 +8,7 @@ import LText from "~/components/LText"; import CurrencyIcon from "~/components/CurrencyIcon"; import Button from "~/components/Button"; import Alert from "~/components/Alert"; +import { useAccountName } from "~/reducers/wallet"; type Props = { onCancel: () => void; @@ -22,6 +23,7 @@ type Props = { const SkipDeviceVerification = ({ onCancel, onConfirm, account }: Props) => { const currency = getAccountCurrency(account); const { colors } = useTheme(); + const accountName = useAccountName(account); return ( { - {(account as Account).name} + {accountName} { - return `${currency.name} ${index + 1}`; -}; - -export const validateNameEdition = (account: Account, name?: string | null | undefined): string => - ( - (name || account.name || "").replace(/\s+/g, " ").trim() || - account.name || - getAccountPlaceholderName(account) - ).slice(0, MAX_ACCOUNT_NAME_SIZE); diff --git a/libs/coin-framework/src/account/helpers.test.ts b/libs/coin-framework/src/account/helpers.test.ts index 7d7573c6ceae..e5947252dea6 100644 --- a/libs/coin-framework/src/account/helpers.test.ts +++ b/libs/coin-framework/src/account/helpers.test.ts @@ -1,13 +1,11 @@ -import { CryptoCurrency, TokenCurrency, Unit } from "@ledgerhq/types-cryptoassets"; +import { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets"; import { Account, Operation, SubAccount, TokenAccount } from "@ledgerhq/types-live"; import BigNumber from "bignumber.js"; import { areAllOperationsLoaded, emptyHistoryCache, getAccountCurrency, - getAccountName, getAccountSpendableBalance, - getAccountUnit, getFeesCurrency, } from "."; import { isAccountEmpty, isAccountBalanceSignificant, clearAccount } from "./helpers"; @@ -42,46 +40,6 @@ describe(getAccountCurrency.name, () => { }); }); -describe(getAccountUnit.name, () => { - describe("given an Account", () => { - beforeEach(() => { - mockAccount.type = "Account"; - }); - it("should return the unit", () => { - const sampleUnit = { name: "unit" } as Unit; - mockAccount.unit = sampleUnit; - expect(getAccountUnit(mockAccount)).toEqual(sampleUnit); - }); - }); - - describe("given a TokenAccount", () => { - it("should return the token unit", () => { - const sampleUnit = { name: "unit" } as Unit; - tokenAccount.token = { units: [sampleUnit] } as TokenCurrency; - expect(getAccountUnit(tokenAccount)).toEqual(sampleUnit); - }); - }); - - describe("given an unknown type Account", () => { - beforeEach(() => { - (mockAccount as any).type = "DefinitelyNotAStandardAccount"; - }); - - it("should throw an error", () => { - expect(() => getAccountUnit(mockAccount)).toThrow(Error); - }); - - it("should display the account type in the error message", () => { - expect.assertions(1); - try { - getAccountUnit(mockAccount); - } catch (e: unknown) { - expect((e as Error).message.includes(mockAccount.type)).toEqual(true); - } - }); - }); -}); - describe(getFeesCurrency.name, () => { describe("given an Account", () => { beforeEach(() => { @@ -133,46 +91,6 @@ describe(getFeesCurrency.name, () => { }); }); -describe(getAccountName.name, () => { - describe("given an Account", () => { - beforeEach(() => { - mockAccount.type = "Account"; - }); - it("should return the account name", () => { - const sampleAccountName = "SampleAccountName"; - mockAccount.name = sampleAccountName; - expect(getAccountName(mockAccount)).toEqual(sampleAccountName); - }); - }); - - describe("given a TokenAccount", () => { - it("should return the token account name", () => { - const sampleAccountName = "SampleAccountName"; - tokenAccount.token = { name: sampleAccountName } as TokenCurrency; - expect(getAccountName(tokenAccount)).toEqual(sampleAccountName); - }); - }); - - describe("given an unknown type Account", () => { - beforeEach(() => { - (mockAccount as any).type = "DefinitelyNotAStandardAccount"; - }); - - it("should throw an error", () => { - expect(() => getAccountName(mockAccount)).toThrow(Error); - }); - - it("should display the account type in the error message", () => { - expect.assertions(1); - try { - getAccountName(mockAccount); - } catch (e: unknown) { - expect((e as Error).message.includes(mockAccount.type)).toEqual(true); - } - }); - }); -}); - describe(getAccountSpendableBalance.name, () => { describe("given an Account", () => { beforeEach(() => { diff --git a/libs/coin-framework/src/account/helpers.ts b/libs/coin-framework/src/account/helpers.ts index 39d1b921558c..c9a2a202a325 100644 --- a/libs/coin-framework/src/account/helpers.ts +++ b/libs/coin-framework/src/account/helpers.ts @@ -56,32 +56,6 @@ export const getAccountCurrency = (account?: AccountLike): TokenCurrency | Crypt } }; -export const getAccountUnit = (account: AccountLike): Unit => { - switch (account.type) { - case "Account": - return account.unit; - - case "TokenAccount": - return account.token.units[0]; - - default: - throw new Error("invalid account.type=" + (account as AccountLike).type); - } -}; - -export const getAccountName = (account: AccountLike): string => { - switch (account.type) { - case "Account": - return account.name; - - case "TokenAccount": - return account.token.name; - - default: - throw new Error("invalid account.type=" + (account as AccountLike).type); - } -}; - export const getAccountSpendableBalance = (account: AccountLike): BigNumber => account.spendableBalance; @@ -229,7 +203,6 @@ export const makeEmptyTokenAccount = (account: Account, token: TokenCurrency): T creationDate: new Date(), operations: [], pendingOperations: [], - starred: false, swapHistory: [], balanceHistoryCache: emptyHistoryCache, }); @@ -261,7 +234,6 @@ export const accountWithMandatoryTokens = ( creationDate: new Date(), operations: [], pendingOperations: [], - starred: false, swapHistory: [], balanceHistoryCache: emptyHistoryCache, })); diff --git a/libs/coin-framework/src/account/index.ts b/libs/coin-framework/src/account/index.ts index 8bd2404fbe9d..354d0b9dba38 100644 --- a/libs/coin-framework/src/account/index.ts +++ b/libs/coin-framework/src/account/index.ts @@ -1,8 +1,6 @@ export * from "./accountId"; -export * from "./accountName"; export * from "./balanceHistoryCache"; export * from "./groupOperations"; export * from "./helpers"; -export * from "./ordering"; export * from "./pending"; export * from "./support"; diff --git a/libs/coin-framework/src/account/pending.test.ts b/libs/coin-framework/src/account/pending.test.ts index b7d8d1a4bb17..f031cd3a6566 100644 --- a/libs/coin-framework/src/account/pending.test.ts +++ b/libs/coin-framework/src/account/pending.test.ts @@ -89,15 +89,12 @@ function createAccount(id: string): Account { index: 0, freshAddress: "", freshAddressPath: "", - name: "", - starred: false, used: true, balance: new BigNumber(0), spendableBalance: new BigNumber(0), creationDate: new Date(), blockHeight: 0, currency, - unit: currency.units[0], operationsCount: 0, operations: [], pendingOperations: [], @@ -120,7 +117,6 @@ function createTokenAccount(id: string): TokenAccount { operationsCount: 0, operations: [], pendingOperations: [], - starred: false, balanceHistoryCache: emptyHistoryCache, swapHistory: [], }; diff --git a/libs/coin-framework/src/bot/types.ts b/libs/coin-framework/src/bot/types.ts index aff763641d52..1f48daa23590 100644 --- a/libs/coin-framework/src/bot/types.ts +++ b/libs/coin-framework/src/bot/types.ts @@ -120,8 +120,6 @@ export type AppSpec = { scanAccountsRetries?: number; // if define, will run the mutations {multipleRuns} times in order to cover 2 txs in the same run and detect possible issues at the "second tx time" multipleRuns?: number; - // define the frequency of exporting/importing back the account to simulate mobile export - crossAccountFrequency?: number; // if the nano app depends on an app, name of this app dependency?: string; // a query to select one nano app. the most up to date version is selected when fields aren't set. diff --git a/libs/coin-framework/src/bridge/jsHelpers.test.ts b/libs/coin-framework/src/bridge/jsHelpers.test.ts index 997def665ee3..329223add916 100644 --- a/libs/coin-framework/src/bridge/jsHelpers.test.ts +++ b/libs/coin-framework/src/bridge/jsHelpers.test.ts @@ -116,15 +116,12 @@ function createAccount(id: string): Account { index: 0, freshAddress: "", freshAddressPath: "", - name: "", - starred: false, used: true, balance: new BigNumber(0), spendableBalance: new BigNumber(0), creationDate: new Date(), blockHeight: 0, currency, - unit: currency.units[0], operationsCount: 0, operations: [], pendingOperations: [], diff --git a/libs/coin-framework/src/bridge/jsHelpers.ts b/libs/coin-framework/src/bridge/jsHelpers.ts index 48d7c0526bc8..33de33f9506e 100644 --- a/libs/coin-framework/src/bridge/jsHelpers.ts +++ b/libs/coin-framework/src/bridge/jsHelpers.ts @@ -14,7 +14,6 @@ import { getDerivationModeStartsAt, } from "../derivation"; import { - getAccountPlaceholderName, shouldRetainPendingOperation, isAccountEmpty, shouldShowNewAccount, @@ -359,8 +358,6 @@ export const makeScanAccounts = freshAddress, freshAddressPath, derivationMode, - name: "", - starred: false, used: false, index, currency, @@ -368,7 +365,6 @@ export const makeScanAccounts = operations: [], swapHistory: [], pendingOperations: [], - unit: currency.units[0], lastSyncDate: new Date(), creationDate, // overrides @@ -405,12 +401,6 @@ export const makeScanAccounts = if (!account) return; - account.name = getAccountPlaceholderName({ - currency, - index, - derivationMode, - }); - const showNewAccount = shouldShowNewAccount(currency, derivationMode); if (account.used || showNewAccount) { @@ -550,9 +540,7 @@ export function makeAccountBridgeReceive( const accountAddress = account.freshAddress; if (r.address !== accountAddress) { - throw new WrongDeviceForAccount(`WrongDeviceForAccount ${account.name}`, { - accountName: account.name, - }); + throw new WrongDeviceForAccount(); } return r; diff --git a/libs/coin-framework/src/formatters.ts b/libs/coin-framework/src/formatters.ts index 82e18e3551b4..1d991131e26b 100644 --- a/libs/coin-framework/src/formatters.ts +++ b/libs/coin-framework/src/formatters.ts @@ -1,5 +1,5 @@ import type { Account, TransactionCommon, TransactionStatusCommon } from "@ledgerhq/types-live"; -import { getAccountUnit } from "./account"; +import { getAccountCurrency } from "./account"; import { formatCurrencyUnit } from "./currencies"; const formatErrorSmall = (e: Error): string => (e.name === "Error" ? e.message : e.name); @@ -16,19 +16,19 @@ export const formatTransactionStatus = ( str += "\n amount: " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }); str += "\n estimated fees: " + - formatCurrencyUnit(getAccountUnit(mainAccount), estimatedFees, { + formatCurrencyUnit(getAccountCurrency(mainAccount).units[0], estimatedFees, { showCode: true, disableRounding: true, }); str += "\n total spent: " + - formatCurrencyUnit(getAccountUnit(account), totalSpent, { + formatCurrencyUnit(getAccountCurrency(account).units[0], totalSpent, { showCode: true, disableRounding: true, }); diff --git a/libs/coin-framework/src/mocks/account.ts b/libs/coin-framework/src/mocks/account.ts index 25c572508ebf..d4c86b55e061 100644 --- a/libs/coin-framework/src/mocks/account.ts +++ b/libs/coin-framework/src/mocks/account.ts @@ -258,7 +258,6 @@ export function genTokenAccount( const rng = new Prando(account.id + "|" + index); const tokenAccount: TokenAccount = { type: "TokenAccount", - starred: false, id: account.id + "|" + index, parentId: account.id, token, @@ -316,23 +315,24 @@ export function genAccount( // nb Make the third (ethereum_classic, dogecoin) account originally migratable const outdated = ["ethereum_classic", "dogecoin"].includes(currency.id) && `${id}`.endsWith("_2"); const accountId = `mock:${outdated ? 0 : 1}:${currency.id}:${id}:`; + const xpub = genHex(64, rng); + rng.nextString(rng.nextInt(4, 34)); // to not break the determinism, we will still run this code that used to generate fake account names. remove it when we allow ourself a breaking change. + const blockHeight = rng.nextInt(100000, 200000); + rng.nextArrayItem(currency.units); // to not break the determinism, we still run this code. remove it when we allow ourself a breaking change. const account: Account = { type: "Account", id: accountId, seedIdentifier: "mock", derivationMode: "", - xpub: genHex(64, rng), + xpub, index: 1, freshAddress: address, freshAddressPath: derivationPath, - name: rng.nextString(rng.nextInt(4, 34)), - starred: false, used: false, balance: new BigNumber(0), spendableBalance: new BigNumber(0), - blockHeight: rng.nextInt(100000, 200000), + blockHeight, currency, - unit: rng.nextArrayItem(currency.units), operationsCount: 0, operations: [], pendingOperations: [], diff --git a/libs/coin-framework/src/serialization/account.ts b/libs/coin-framework/src/serialization/account.ts index 0fd06212b186..89717dfaff25 100644 --- a/libs/coin-framework/src/serialization/account.ts +++ b/libs/coin-framework/src/serialization/account.ts @@ -38,15 +38,12 @@ export function fromAccountRaw(rawAccount: AccountRaw, fromRaw?: FromFamiliyRaw) derivationMode, index, xpub, - starred, used, freshAddress, freshAddressPath, - name, blockHeight, currencyId, feesCurrencyId, - unitMagnitude, operations, operationsCount, pendingOperations, @@ -79,12 +76,10 @@ export function fromAccountRaw(rawAccount: AccountRaw, fromRaw?: FromFamiliyRaw) const feesCurrency = (feesCurrencyId && (findCryptoCurrencyById(feesCurrencyId) || findTokenById(feesCurrencyId))) || undefined; - const unit = currency.units.find(u => u.magnitude === unitMagnitude) || currency.units[0]; const res: Account = { type: "Account", id, - starred: starred || false, used: false, // filled again below seedIdentifier, @@ -92,7 +87,6 @@ export function fromAccountRaw(rawAccount: AccountRaw, fromRaw?: FromFamiliyRaw) index, freshAddress, freshAddressPath, - name, blockHeight, creationDate: new Date(creationDate || Date.now()), balance: new BigNumber(balance), @@ -100,7 +94,6 @@ export function fromAccountRaw(rawAccount: AccountRaw, fromRaw?: FromFamiliyRaw) operations: (operations || []).map(convertOperation), operationsCount: operationsCount || (operations && operations.length) || 0, pendingOperations: (pendingOperations || []).map(convertOperation), - unit, currency, feesCurrency, lastSyncDate: new Date(lastSyncDate || 0), @@ -147,8 +140,6 @@ export function toAccountRaw(account: Account, toFamilyRaw?: ToFamiliyRaw): Acco id, seedIdentifier, xpub, - name, - starred, used, derivationMode, index, @@ -161,7 +152,6 @@ export function toAccountRaw(account: Account, toFamilyRaw?: ToFamiliyRaw): Acco operationsCount, operations, pendingOperations, - unit, lastSyncDate, balance, balanceHistoryCache, @@ -178,8 +168,6 @@ export function toAccountRaw(account: Account, toFamilyRaw?: ToFamiliyRaw): Acco const res: AccountRaw = { id, seedIdentifier, - name, - starred, used, derivationMode, index, @@ -192,7 +180,6 @@ export function toAccountRaw(account: Account, toFamilyRaw?: ToFamiliyRaw): Acco operations: (operations || []).map(convertOperation), pendingOperations: (pendingOperations || []).map(convertOperation), currencyId: currency.id, - unitMagnitude: unit.magnitude, lastSyncDate: lastSyncDate.toISOString(), balance: balance.toFixed(), spendableBalance: spendableBalance.toFixed(), @@ -278,7 +265,6 @@ function toTokenAccountRaw( id, parentId, token, - starred, operations, operationsCount, pendingOperations, @@ -295,7 +281,6 @@ function toTokenAccountRaw( type: "TokenAccountRaw", id, parentId, - starred, tokenId: token.id, balance: balance.toString(), spendableBalance: spendableBalance.toString(), diff --git a/libs/coin-framework/src/test-helpers/bridge-integration-suite.ts b/libs/coin-framework/src/test-helpers/bridge-integration-suite.ts index 8347b3ac0f47..912975e46417 100644 --- a/libs/coin-framework/src/test-helpers/bridge-integration-suite.ts +++ b/libs/coin-framework/src/test-helpers/bridge-integration-suite.ts @@ -358,14 +358,14 @@ export function testBridge { if (accountData.FIXME_tests && accountData.FIXME_tests.some(r => name.match(r))) { - warnDev("FIXME test was skipped. " + name + " for " + initialAccount.name); + warnDev("FIXME test was skipped. " + name + " for " + initialAccount.id); return; } test(name, fn); }; - describe(impl + " bridge on account " + initialAccount.name, () => { + describe(impl + " bridge on account " + initialAccount.id, () => { describe("sync", () => { // FIXME: What is the point of this test? // testOrSkip("succeed", async () => { diff --git a/libs/coin-modules/coin-algorand/src/bridge.integration.test.ts b/libs/coin-modules/coin-algorand/src/bridge.integration.test.ts index bd6435b64c61..b717d67a1af0 100644 --- a/libs/coin-modules/coin-algorand/src/bridge.integration.test.ts +++ b/libs/coin-modules/coin-algorand/src/bridge.integration.test.ts @@ -46,7 +46,6 @@ const algorand: CurrenciesData = { index: 0, freshAddress: "ZC3HFULMJF53BF5ER4E2TTGPBRGH2Y4RVS32JZ6NH4RW7LN67HCE6UBS3Q", freshAddressPath: "44'/283'/0'/0/0", - unitMagnitude: 6, blockHeight: 8518049, operations: [], pendingOperations: [], @@ -214,7 +213,6 @@ const algorand: CurrenciesData = { index: 3, freshAddress: "MECOWMKPKH2NWVZTS5V5RQDGFFYBT25KNLOPHG2KUMMNKU6FOHGJT24WBI", freshAddressPath: "44'/283'/3'/0/0", - unitMagnitude: 6, blockHeight: 8518189, balance: "0", spendableBalance: "0", diff --git a/libs/coin-modules/coin-algorand/src/deviceTransactionConfig.ts b/libs/coin-modules/coin-algorand/src/deviceTransactionConfig.ts index 7db5127a5ea3..b271e850a8b1 100644 --- a/libs/coin-modules/coin-algorand/src/deviceTransactionConfig.ts +++ b/libs/coin-modules/coin-algorand/src/deviceTransactionConfig.ts @@ -1,4 +1,4 @@ -import { getAccountUnit } from "@ledgerhq/coin-framework/account/index"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { findTokenById, formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; import type { CommonDeviceTransactionField as DeviceTransactionField } from "@ledgerhq/coin-framework/transaction/common"; import { TokenCurrency } from "@ledgerhq/types-cryptoassets"; @@ -60,7 +60,7 @@ const getSendFields = ( fields.push({ type: "text", label: account.type === "TokenAccount" ? "Asset amt" : "Amount", - value: formatCurrencyUnit(getAccountUnit(account), amount, { + value: formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }), diff --git a/libs/coin-modules/coin-algorand/src/formatters.ts b/libs/coin-modules/coin-algorand/src/formatters.ts index d38651ec19a3..a2e4c9761d60 100644 --- a/libs/coin-modules/coin-algorand/src/formatters.ts +++ b/libs/coin-modules/coin-algorand/src/formatters.ts @@ -1,4 +1,4 @@ -import { getAccountUnit } from "@ledgerhq/coin-framework/account/index"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; import type { Unit } from "@ledgerhq/types-cryptoassets"; import invariant from "invariant"; @@ -21,7 +21,7 @@ function formatOperationSpecifics(op: AlgorandOperation, unit: Unit | null | und function formatAccountSpecifics(account: AlgorandAccount): string { const { algorandResources } = account; invariant(algorandResources, "algorand account expected"); - const unit = getAccountUnit(account); + const unit = getAccountCurrency(account).units[0]; const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/libs/coin-modules/coin-algorand/src/js-synchronization.ts b/libs/coin-modules/coin-algorand/src/js-synchronization.ts index ce52e6f7f3fc..272596c3a294 100644 --- a/libs/coin-modules/coin-algorand/src/js-synchronization.ts +++ b/libs/coin-modules/coin-algorand/src/js-synchronization.ts @@ -320,7 +320,6 @@ async function buildSubAccount({ type: "TokenAccount", id: tokenAccountId, parentId: parentAccountId, - starred: false, token, operationsCount: operations.length, operations, diff --git a/libs/coin-modules/coin-algorand/src/transaction.ts b/libs/coin-modules/coin-algorand/src/transaction.ts index 7bd944b997bd..cd901d8e0797 100644 --- a/libs/coin-modules/coin-algorand/src/transaction.ts +++ b/libs/coin-modules/coin-algorand/src/transaction.ts @@ -1,4 +1,4 @@ -import { getAccountUnit } from "@ledgerhq/coin-framework/account/index"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; import { formatTransactionStatus } from "@ledgerhq/coin-framework/formatters"; import { @@ -21,7 +21,7 @@ export const formatTransaction = ( ${mode === "claimReward" ? "CLAIM REWARD" : mode === "optIn" ? "OPT_IN" : "SEND"} ${ useAllAmount ? "MAX" - : formatCurrencyUnit(getAccountUnit(account), amount, { + : formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: false, }) @@ -30,7 +30,7 @@ export const formatTransaction = ( with fees=${ !fees ? "?" - : formatCurrencyUnit(getAccountUnit(mainAccount), fees, { + : formatCurrencyUnit(mainAccount.currency.units[0], fees, { showCode: true, disableRounding: false, }) diff --git a/libs/coin-modules/coin-bitcoin/src/datasets/bitcoin.ts b/libs/coin-modules/coin-bitcoin/src/datasets/bitcoin.ts index 0b5746edc483..2642b4ff654e 100644 --- a/libs/coin-modules/coin-bitcoin/src/datasets/bitcoin.ts +++ b/libs/coin-modules/coin-bitcoin/src/datasets/bitcoin.ts @@ -42,7 +42,6 @@ export const bitcoin1: BitcoinAccountRaw = { pendingOperations: [], operations: [], currencyId: "bitcoin", - unitMagnitude: 8, balance: "2757", blockHeight: 0, lastSyncDate: "", @@ -65,7 +64,6 @@ export const bitcoin2: BitcoinAccountRaw = { operations: [], pendingOperations: [], currencyId: "bitcoin", - unitMagnitude: 8, lastSyncDate: "", balance: "2717", xpub: "xpub6DEHKg8fgKcb9at2u9Xhjtx4tXGyWqUPQAx2zNCzr41gQRyCqpCn7onSoJU4VS96GXyCtAhhFxErnG2pGVvVexaqF7DEfqGGnGk7Havn7C2", diff --git a/libs/coin-modules/coin-bitcoin/src/datasets/digibyte.ts b/libs/coin-modules/coin-bitcoin/src/datasets/digibyte.ts index 9a4fc530a2f5..f437cc4eaca1 100644 --- a/libs/coin-modules/coin-bitcoin/src/datasets/digibyte.ts +++ b/libs/coin-modules/coin-bitcoin/src/datasets/digibyte.ts @@ -115,7 +115,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "digibyte", - unitMagnitude: 8, lastSyncDate: "", balance: "2302647120", xpub: "xpub6CV98T6ompjUmKuMaULsw4UP8yfnVCg6831rWdcPjScn6RaGWrt3b7uvTpt9hcq6tLtS1dGNzeJ9x4NpVGzLq7CFscxCdoPZ6zxkqGymx98", @@ -138,7 +137,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "digibyte", - unitMagnitude: 8, lastSyncDate: "", balance: "0", xpub: "xpub6CsavyNsoieEiR5QNsHZ3VQt7UzRcnKcFNXkadn1kaxsysqa2L79m3iNw6bFyJ1Vz8xYNu9ivECVvFTxydqMp4C3njLGA5PFxBid81Jinkh", diff --git a/libs/coin-modules/coin-bitcoin/src/datasets/litecoin.ts b/libs/coin-modules/coin-bitcoin/src/datasets/litecoin.ts index 952ee7cbe881..9f24911e6ec4 100644 --- a/libs/coin-modules/coin-bitcoin/src/datasets/litecoin.ts +++ b/libs/coin-modules/coin-bitcoin/src/datasets/litecoin.ts @@ -137,7 +137,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "litecoin", - unitMagnitude: 8, lastSyncDate: "", balance: "2183515", xpub: "Ltub2ZDyeYFtDj5kHy4w5WaXBDE9217rNDYfmv7u5NV8dk8vKdmkqAfPdwRma5rkPcj5daMU8JiiLXQYPX9rtqEzrK1YrmkofcpADTV7s5FgzLF", @@ -160,7 +159,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "litecoin", - unitMagnitude: 8, lastSyncDate: "", balance: "0", xpub: "Ltub2Yz97oUCaVDo1Ak6FJ1Fvg2EscNzrWvLYxnXeY7rrArUPpdfgUAEWM49MrjVBNrdjwgFnMbqKGh8XkUdQFx3h8y1SDcak4vGSbqKM5PR8Rr", diff --git a/libs/coin-modules/coin-bitcoin/src/formatters.ts b/libs/coin-modules/coin-bitcoin/src/formatters.ts index afee37e3d515..995b223d8391 100644 --- a/libs/coin-modules/coin-bitcoin/src/formatters.ts +++ b/libs/coin-modules/coin-bitcoin/src/formatters.ts @@ -6,7 +6,7 @@ const sortUTXO = (a: BitcoinOutput, b: BitcoinOutput) => b.value.minus(a.value). export function formatInput(account: BitcoinAccount, input: BitcoinInput): string { return `${(input.value - ? formatCurrencyUnit(account.unit, input.value, { + ? formatCurrencyUnit(account.currency.units[0], input.value, { showCode: false, }) : "" @@ -14,7 +14,7 @@ export function formatInput(account: BitcoinAccount, input: BitcoinInput): strin } export function formatOutput(account: BitcoinAccount, o: BitcoinOutput): string { return [ - formatCurrencyUnit(account.unit, o.value, { + formatCurrencyUnit(account.currency.units[0], o.value, { showCode: false, }).padEnd(12), o.address, diff --git a/libs/coin-modules/coin-bitcoin/src/hw-signMessage.test.ts b/libs/coin-modules/coin-bitcoin/src/hw-signMessage.test.ts index d6fa0fe01dad..bb4002ea482a 100644 --- a/libs/coin-modules/coin-bitcoin/src/hw-signMessage.test.ts +++ b/libs/coin-modules/coin-bitcoin/src/hw-signMessage.test.ts @@ -63,15 +63,12 @@ function createFixtureAccount(account?: Partial): BitcoinAccount index: 0, freshAddress: freshAddress.address, freshAddressPath: freshAddress.derivationPath, - name: "bitcoin account name", - starred: false, used: true, balance: account?.balance || new BigNumber(0), spendableBalance: account?.spendableBalance || new BigNumber(0), creationDate: new Date(), blockHeight: 100_000, currency, - unit: currency.units[0], operationsCount: 0, operations: [], pendingOperations: [], diff --git a/libs/coin-modules/coin-bitcoin/src/transaction.ts b/libs/coin-modules/coin-bitcoin/src/transaction.ts index e827734c6d1b..61adc1516566 100644 --- a/libs/coin-modules/coin-bitcoin/src/transaction.ts +++ b/libs/coin-modules/coin-bitcoin/src/transaction.ts @@ -17,7 +17,7 @@ import { toTransactionCommonRaw, toTransactionStatusRawCommon, } from "@ledgerhq/coin-framework/serialization"; -import { getAccountUnit } from "@ledgerhq/coin-framework/account/index"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; import type { Account } from "@ledgerhq/types-live"; import { @@ -152,7 +152,7 @@ export const formatTransaction = (t: Transaction, account: Account): string => { SEND ${ t.useAllAmount ? "MAX" - : formatCurrencyUnit(getAccountUnit(account), t.amount, { + : formatCurrencyUnit(getAccountCurrency(account).units[0], t.amount, { showCode: true, disableRounding: true, }) diff --git a/libs/coin-modules/coin-evm/src/__tests__/fixtures/common.fixtures.ts b/libs/coin-modules/coin-evm/src/__tests__/fixtures/common.fixtures.ts index 67b0e99b783c..56d343f77036 100644 --- a/libs/coin-modules/coin-evm/src/__tests__/fixtures/common.fixtures.ts +++ b/libs/coin-modules/coin-evm/src/__tests__/fixtures/common.fixtures.ts @@ -6,7 +6,6 @@ import { decodeAccountId, decodeTokenAccountId, encodeTokenAccountId, - shortAddressPreview, } from "@ledgerhq/coin-framework/account/index"; import { encodeERC1155OperationId, @@ -44,18 +43,14 @@ export const makeAccount = ( const account: Account = { type: "Account", - name: - currency.name + " " + (derivationMode || "legacy") + " " + shortAddressPreview(xpubOrAddress), xpub: xpubOrAddress, subAccounts, seedIdentifier: xpubOrAddress, - starred: true, used: true, swapHistory: [], id, derivationMode, currency, - unit: currency.units[0], index, nfts: [], freshAddress: xpubOrAddress, @@ -104,7 +99,6 @@ export const makeTokenAccount = (address: string, tokenCurrency: TokenCurrency): operationsCount: 0, operations: [], pendingOperations: [], - starred: false, balanceHistoryCache: { HOUR: { latestDate: null, diff --git a/libs/coin-modules/coin-evm/src/__tests__/unit/editTransaction/getFormattedFeeFields.test.ts b/libs/coin-modules/coin-evm/src/__tests__/unit/editTransaction/getFormattedFeeFields.test.ts index a2ca3c69c04d..80f1caa7c14d 100644 --- a/libs/coin-modules/coin-evm/src/__tests__/unit/editTransaction/getFormattedFeeFields.test.ts +++ b/libs/coin-modules/coin-evm/src/__tests__/unit/editTransaction/getFormattedFeeFields.test.ts @@ -37,7 +37,7 @@ const testCases: { .map(currency => { return { currencyName: currency.name, - account: { type: "Account", currency, unit: currency.units[0] } as Account, + account: { type: "Account", currency } as Account, type2Transaction: dummyType2Transaction, type0Transaction: dummyType0Transaction, }; diff --git a/libs/coin-modules/coin-evm/src/__tests__/unit/synchronization.unit.test.ts b/libs/coin-modules/coin-evm/src/__tests__/unit/synchronization.unit.test.ts index ccdd444b767c..03a0d0a87738 100644 --- a/libs/coin-modules/coin-evm/src/__tests__/unit/synchronization.unit.test.ts +++ b/libs/coin-modules/coin-evm/src/__tests__/unit/synchronization.unit.test.ts @@ -562,7 +562,6 @@ describe("EVM Family", () => { spendableBalance: new BigNumber(1), operations: [tokenOperations[0], tokenOperations[1]], operationsCount: 2, - starred: undefined, swapHistory, }; const expectedUsdtAccount = { @@ -571,7 +570,6 @@ describe("EVM Family", () => { spendableBalance: new BigNumber(2), operations: [tokenOperations[3]], operationsCount: 1, - starred: undefined, swapHistory: [], }; @@ -597,7 +595,6 @@ describe("EVM Family", () => { spendableBalance: new BigNumber(2), operations: [tokenOperations[3]], operationsCount: 1, - starred: undefined, swapHistory: [], }; @@ -637,7 +634,6 @@ describe("EVM Family", () => { spendableBalance: new BigNumber(1), operations: [tokenOperations[0], tokenOperations[1], tokenOperations[2]], operationsCount: 3, - starred: undefined, swapHistory: [], }); }); diff --git a/libs/coin-modules/coin-evm/src/datasets/ethereum1.ts b/libs/coin-modules/coin-evm/src/datasets/ethereum1.ts index c4df0c39495d..73e911dca3bb 100644 --- a/libs/coin-modules/coin-evm/src/datasets/ethereum1.ts +++ b/libs/coin-modules/coin-evm/src/datasets/ethereum1.ts @@ -13,7 +13,6 @@ export const ethereum1: AccountRaw = { pendingOperations: [], operations: [], currencyId: "ethereum", - unitMagnitude: 18, balance: "", blockHeight: 0, lastSyncDate: "", diff --git a/libs/coin-modules/coin-evm/src/editTransaction/getFormattedFeeFields.ts b/libs/coin-modules/coin-evm/src/editTransaction/getFormattedFeeFields.ts index 63a296e49e69..2fb501b0e479 100644 --- a/libs/coin-modules/coin-evm/src/editTransaction/getFormattedFeeFields.ts +++ b/libs/coin-modules/coin-evm/src/editTransaction/getFormattedFeeFields.ts @@ -1,4 +1,3 @@ -import { getAccountUnit } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; import type { Account } from "@ledgerhq/types-live"; import { BigNumber } from "bignumber.js"; @@ -23,16 +22,16 @@ export const getFormattedFeeFields = ({ formattedMaxFeePerGas: string; formattedGasPrice: string; } => { - const unit = getAccountUnit(mainAccount); + const { currency } = mainAccount; + const unit = currency.units[0]; const feeValue = getEstimatedFees(transaction); const formattedFeeValue = formatCurrencyUnit(unit, feeValue, { showCode: true, locale, }); - const { currency } = mainAccount; // If a lower unit is available, use it to display the fees (e.g. ETH -> GWEI) - // This might not be the case for all currencies, so we fallback to the account unit + // This might not be the case for all currencies, so we fallback to the general unit const feesUnit = currency.units.length > 1 ? currency.units[1] : unit; const maxPriorityFeePerGas = transaction.maxPriorityFeePerGas ?? new BigNumber(0); diff --git a/libs/coin-modules/coin-evm/src/transaction.ts b/libs/coin-modules/coin-evm/src/transaction.ts index 8899efedc794..ee6e92e6538d 100644 --- a/libs/coin-modules/coin-evm/src/transaction.ts +++ b/libs/coin-modules/coin-evm/src/transaction.ts @@ -7,8 +7,8 @@ import { fromTransactionStatusRawCommon as fromTransactionStatusRaw, toTransactionCommonRaw, toTransactionStatusRawCommon as toTransactionStatusRaw, -} from "@ledgerhq/coin-framework/serialization/index"; -import { getAccountUnit } from "@ledgerhq/coin-framework/account/index"; +} from "@ledgerhq/coin-framework/serialization"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; import { transactionToEthersTransaction } from "./adapters"; import ERC1155ABI from "./abis/erc1155.abi.json"; @@ -43,7 +43,7 @@ ${mode.toUpperCase()} ${ : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) diff --git a/libs/coin-modules/coin-near/src/bridge.integration.test.ts b/libs/coin-modules/coin-near/src/bridge.integration.test.ts index 6da11872464c..7036c2195900 100644 --- a/libs/coin-modules/coin-near/src/bridge.integration.test.ts +++ b/libs/coin-modules/coin-near/src/bridge.integration.test.ts @@ -52,7 +52,6 @@ const near: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "near", - unitMagnitude: 24, lastSyncDate: "", balance: "47162281393064900000001", }, diff --git a/libs/coin-modules/coin-near/src/speculos-deviceActions.ts b/libs/coin-modules/coin-near/src/speculos-deviceActions.ts index b59ab8c6ae54..6e1036219c80 100644 --- a/libs/coin-modules/coin-near/src/speculos-deviceActions.ts +++ b/libs/coin-modules/coin-near/src/speculos-deviceActions.ts @@ -1,5 +1,5 @@ import * as nearAPI from "near-api-js"; -import { getAccountUnit } from "@ledgerhq/coin-framework/account/index"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; import type { DeviceAction } from "@ledgerhq/coin-framework/bot/types"; import type { Transaction } from "./types"; @@ -23,7 +23,7 @@ export const acceptTransaction: DeviceAction = deviceActionFlo button: SpeculosButton.RIGHT, expectedValue: ({ transaction, account }) => { if (transaction.mode === "stake") { - return formatCurrencyUnit(getAccountUnit(account), transaction.amount, { + return formatCurrencyUnit(getAccountCurrency(account).units[0], transaction.amount, { disableRounding: true, }); } @@ -35,7 +35,7 @@ export const acceptTransaction: DeviceAction = deviceActionFlo title: "Amount", button: SpeculosButton.RIGHT, expectedValue: ({ transaction, account }) => - formatCurrencyUnit(getAccountUnit(account), transaction.amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], transaction.amount, { disableRounding: true, }), }, @@ -59,7 +59,7 @@ export const acceptTransaction: DeviceAction = deviceActionFlo return JSON.stringify({ amount: nearAPI.utils.format.parseNearAmount( - formatCurrencyUnit(getAccountUnit(account), transaction.amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], transaction.amount, { disableRounding: true, }), ), diff --git a/libs/coin-modules/coin-near/src/transaction.ts b/libs/coin-modules/coin-near/src/transaction.ts index c0ae783ad0b6..5e244afdc1e9 100644 --- a/libs/coin-modules/coin-near/src/transaction.ts +++ b/libs/coin-modules/coin-near/src/transaction.ts @@ -8,7 +8,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "@ledgerhq/coin-framework/account/index"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; export const formatTransaction = ( @@ -21,7 +21,7 @@ ${mode.toUpperCase()} ${ : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) diff --git a/libs/coin-modules/coin-polkadot/src/bridge/formatters.ts b/libs/coin-modules/coin-polkadot/src/bridge/formatters.ts index 001ffef9c596..a07428747923 100644 --- a/libs/coin-modules/coin-polkadot/src/bridge/formatters.ts +++ b/libs/coin-modules/coin-polkadot/src/bridge/formatters.ts @@ -1,6 +1,6 @@ import invariant from "invariant"; import type { Operation } from "@ledgerhq/types-live"; -import { getAccountUnit } from "@ledgerhq/coin-framework/account/index"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; import { PolkadotAccount, PolkadotOperation, PolkadotResources } from "../types"; import type { Unit } from "@ledgerhq/types-cryptoassets"; @@ -38,7 +38,7 @@ function formatOperationSpecifics(op: Operation, unit: Unit | null | undefined): function formatAccountSpecifics(account: PolkadotAccount): string { const polkadotResources = account.polkadotResources as PolkadotResources; invariant(polkadotResources, "polkadot account expected"); - const unit = getAccountUnit(account); + const unit = getAccountCurrency(account).units[0]; const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/libs/coin-modules/coin-polkadot/src/bridge/transaction.ts b/libs/coin-modules/coin-polkadot/src/bridge/transaction.ts index 076bf843a7c8..6b6d77fa8643 100644 --- a/libs/coin-modules/coin-polkadot/src/bridge/transaction.ts +++ b/libs/coin-modules/coin-polkadot/src/bridge/transaction.ts @@ -8,7 +8,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "@ledgerhq/coin-framework/account/index"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index"; export const formatTransaction = ( @@ -21,7 +21,7 @@ ${mode.toUpperCase()} ${ : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) diff --git a/libs/coin-modules/coin-polkadot/src/test/bridgeDatasetTest.ts b/libs/coin-modules/coin-polkadot/src/test/bridgeDatasetTest.ts index 0065ef991bc8..8095f7a0952d 100644 --- a/libs/coin-modules/coin-polkadot/src/test/bridgeDatasetTest.ts +++ b/libs/coin-modules/coin-polkadot/src/test/bridgeDatasetTest.ts @@ -63,7 +63,6 @@ const polkadot: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "polkadot", - unitMagnitude: 10, lastSyncDate: "", balance: "21000310", }, @@ -370,7 +369,6 @@ const polkadot: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "polkadot", - unitMagnitude: 10, lastSyncDate: "", balance: "11000000000", }, @@ -487,7 +485,6 @@ const polkadot: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "polkadot", - unitMagnitude: 10, lastSyncDate: "", balance: "11000000000", }, diff --git a/libs/coin-modules/coin-polkadot/src/types/bridge.fixture.ts b/libs/coin-modules/coin-polkadot/src/types/bridge.fixture.ts index c32652a57779..b845cc1977bb 100644 --- a/libs/coin-modules/coin-polkadot/src/types/bridge.fixture.ts +++ b/libs/coin-modules/coin-polkadot/src/types/bridge.fixture.ts @@ -31,23 +31,25 @@ export function createFixtureAccount(account?: Partial): Polkad derivationPath: "derivation_path", }; + const id = faker.string.uuid(); + const seedIdentifier = faker.string.uuid(); + const index = faker.number.int(); + faker.string.alpha(); // there used to be a name and to not break the test, we need to consume it + return { type: "Account", - id: faker.string.uuid(), - seedIdentifier: faker.string.uuid(), + id, + seedIdentifier, derivationMode: "", - index: faker.number.int(), + index, freshAddress: freshAddress.address, freshAddressPath: freshAddress.derivationPath, - name: faker.string.alpha(), - starred: false, used: true, balance: account?.balance || new BigNumber(0), spendableBalance: account?.spendableBalance || new BigNumber(0), creationDate: faker.date.past(), blockHeight: faker.number.int({ min: 100_000, max: 200_000 }), currency, - unit: currency.units[0], operationsCount: account?.operationsCount || 0, operations: account?.operations || [], pendingOperations: account?.pendingOperations || [], diff --git a/libs/coin-modules/coin-solana/src/bridge.integration.test.ts b/libs/coin-modules/coin-solana/src/bridge.integration.test.ts index 617fe5a55bf1..a970a79d4c09 100644 --- a/libs/coin-modules/coin-solana/src/bridge.integration.test.ts +++ b/libs/coin-modules/coin-solana/src/bridge.integration.test.ts @@ -145,7 +145,6 @@ function makeAccount(freshAddress: string) { return { id: mainAccId, seedIdentifier: "", - name: "Solana 1", derivationMode: "solanaMain" as const, index: 0, freshAddress, @@ -154,7 +153,6 @@ function makeAccount(freshAddress: string) { operations: [], pendingOperations: [], currencyId: "solana", - unitMagnitude: 9, lastSyncDate: "", balance: "0", }; diff --git a/libs/coin-modules/coin-solana/src/js-synchronization.ts b/libs/coin-modules/coin-solana/src/js-synchronization.ts index 3fa6c2cab294..227b03467c3f 100644 --- a/libs/coin-modules/coin-solana/src/js-synchronization.ts +++ b/libs/coin-modules/coin-solana/src/js-synchronization.ts @@ -292,7 +292,6 @@ function newSubAcc({ operationsCount: txs.length, pendingOperations: [], spendableBalance: balance, - starred: false, swapHistory: [], token: tokenCurrency, type: "TokenAccount", diff --git a/libs/coin-modules/coin-solana/src/transaction.ts b/libs/coin-modules/coin-solana/src/transaction.ts index 2fb485a5bb62..99d33e0e37ed 100644 --- a/libs/coin-modules/coin-solana/src/transaction.ts +++ b/libs/coin-modules/coin-solana/src/transaction.ts @@ -20,7 +20,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { findSubAccountById, getAccountUnit } from "@ledgerhq/coin-framework/account/index"; +import { findSubAccountById, getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { formatCurrencyUnit, getTokenById } from "@ledgerhq/coin-framework/currencies/index"; import { assertUnreachable } from "./utils"; import { toTokenId } from "./logic"; @@ -46,7 +46,7 @@ export const toTransactionRaw = (t: Transaction): TransactionRaw => { }; const lamportsToSOL = (account: Account, amount: number) => { - return formatCurrencyUnit(getAccountUnit(account), new BigNumber(amount), { + return formatCurrencyUnit(getAccountCurrency(account).units[0], new BigNumber(amount), { showCode: true, disableRounding: true, }); @@ -127,10 +127,14 @@ function formatTokenTransfer(mainAccount: Account, tx: Transaction, command: Tok if (!subAccount || subAccount.type !== "TokenAccount") { throw new Error("token subaccount expected"); } - const amount = formatCurrencyUnit(getAccountUnit(subAccount), new BigNumber(command.amount), { - showCode: true, - disableRounding: true, - }); + const amount = formatCurrencyUnit( + getAccountCurrency(subAccount).units[0], + new BigNumber(command.amount), + { + showCode: true, + disableRounding: true, + }, + ); const recipient = command.recipientDescriptor.walletAddress; const str = [ ` SEND: ${amount}${tx.useAllAmount ? " (ALL)" : ""}`, diff --git a/libs/ledger-live-common/.unimportedrc.json b/libs/ledger-live-common/.unimportedrc.json index 5cc02a7b827b..a83b873f07cc 100644 --- a/libs/ledger-live-common/.unimportedrc.json +++ b/libs/ledger-live-common/.unimportedrc.json @@ -1,7 +1,6 @@ { "entry": [ "src/account/helpers.ts", - "src/account/importAccounts.ts", "src/account/index.ts", "src/account/serialization.ts", "src/apps/filtering.ts", diff --git a/libs/ledger-live-common/package.json b/libs/ledger-live-common/package.json index e2eb98a4cf0c..8f12f6963d6f 100644 --- a/libs/ledger-live-common/package.json +++ b/libs/ledger-live-common/package.json @@ -140,7 +140,6 @@ "@ledgerhq/coin-near": "workspace:^", "@ledgerhq/coin-polkadot": "workspace:^", "@ledgerhq/coin-solana": "workspace:^", - "@ledgerhq/compressjs": "github:LedgerHQ/compressjs#d9e8e4d994923e0ea76a32b97289bcccfe71b82e", "@ledgerhq/crypto-icons-ui": "workspace:^", "@ledgerhq/cryptoassets": "workspace:^", "@ledgerhq/devices": "workspace:^", @@ -172,6 +171,7 @@ "@ledgerhq/live-network": "workspace:^", "@ledgerhq/live-nft": "workspace:^", "@ledgerhq/live-promise": "workspace:^", + "@ledgerhq/live-wallet": "workspace:^", "@ledgerhq/logs": "workspace:^", "@ledgerhq/wallet-api-client": "^1.5.7", "@ledgerhq/wallet-api-core": "^1.9.0", @@ -295,4 +295,4 @@ "uuid": "^8.3.2", "ws": "7" } -} \ No newline at end of file +} diff --git a/libs/ledger-live-common/src/__tests__/__snapshots__/csvExport.ts.snap b/libs/ledger-live-common/src/__tests__/__snapshots__/csvExport.ts.snap index 342da04f2027..ab749230aef6 100644 --- a/libs/ledger-live-common/src/__tests__/__snapshots__/csvExport.ts.snap +++ b/libs/ledger-live-common/src/__tests__/__snapshots__/csvExport.ts.snap @@ -2,985 +2,985 @@ exports[`export CSV 1`] = ` "Operation Date,Status,Currency Ticker,Operation Type,Operation Amount,Operation Fees,Operation Hash,Account Name,Account xpub,Countervalue Ticker,Countervalue at Operation Date,Countervalue at CSV Export -2018-03-14T17:20:32.454Z,Confirmed,BTC,OUT,0.0067904,0.0000679,0F7CD80033E4AC2C1DB064D7B71F602F589B33D0B452426ACD90A9E1C8C41DEA,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,17.78,17.78 -2018-03-14T15:13:42.205Z,Confirmed,BTC,IN,0.00119081,0.00001191,ADCEEE94EC916B4281A2ED66111B338640E7E1A874E72B3EDCFF3D1203050160,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,3.11,3.11 -2018-03-14T15:04:22.979Z,Confirmed,BTC,OUT,0.01991267,0.00019913,BC322244321340447CBBFB0C1FFE9B9F6065D8120D4888CF1920314D185FE0C4,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,52.16,52.16 -2018-03-14T14:51:48.237Z,Confirmed,BTC,IN,0.01893127,0.00018931,AAAD825C26D83ADB2F1ADABC87622B80BABE73232298D3AA91662288864E1A5C,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,49.58,49.58 -2018-03-14T14:48:32.740Z,Confirmed,BTC,IN,0.03015644,0.00030156,B3731DE7824E75513FFC29C0D59652CA9B816D7389234560555E11B7927ED1D3,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,78.99,78.99 -2018-03-14T14:15:26.942Z,Confirmed,BTC,OUT,0.00692454,0.00006925,8545D8D4B0BF7E8A09FA954DB85FBC33B892E9EB80C789923CAAD6A3AA1D2C20,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,18.13,18.13 -2018-03-13T23:59:44.590Z,Confirmed,BTC,IN,0.00207503,0.00002075,62BE1A831393011ABD4F3766D1BC82AC03559FDD2E09192356E2BF5182B59712,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,5.46,5.43 -2018-03-13T22:13:18.439Z,Confirmed,BTC,OUT,0.03874813,0.00038748,3E499F59B7D2684A0CBE0F0A95D0F184CCF1CDE79271ADD68C81BC3CF89DCA4F,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,101.99,101.49 -2018-03-13T21:51:36.522Z,Confirmed,BTC,IN,0.01257203,0.00012572,12B858070D39A22CE04FABD682325795A2FD57996DF71127EC45163E4BF34EA0,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,33.09,32.93 -2018-03-13T20:29:44.153Z,Confirmed,BTC,IN,0.00638251,0.00006383,7819F674571257970FD98C2CB19F0D2B74E9CF3F6D28A7B922955DB22C9C281C,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,16.79,16.71 -2018-03-13T17:20:32.411Z,Confirmed,BTC,IN,0.016113,0.00016113,45C3EC0F5B16B3EF289546C8116B7B04D4963ADD096D7AE7267533F9B3F87348,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,42.41,42.20 -2018-03-13T08:19:48.002Z,Confirmed,BTC,OUT,0.00159733,0.00001597,9756A3B2C280518E37D57014B77F5918FCD3107A1C70D5473C09F8DF2258C06E,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,4.20,4.18 -2018-03-13T04:58:59.353Z,Confirmed,BTC,IN,0.00936914,0.00009369,21913C798C9788E6E348F2CD29CD33DD01B1A94FF48391DE4E8295C315F87503,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,24.66,24.54 -2018-03-13T04:35:04.120Z,Confirmed,BTC,OUT,0.03019066,0.00030191,67F7ED408A889B2B2F08B339498B27D29EEC3F934385AB02440A49D6C32C4217,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,79.46,79.08 -2018-03-12T23:40:48.762Z,Confirmed,BTC,OUT,0.01907362,0.00019074,25FE97A3C320A7DF69B4407CC55972E9AD1B240D6F5D011A74842F6C4E8112EE,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,50.70,49.96 -2018-03-12T21:11:02.398Z,Confirmed,BTC,OUT,0.00223244,0.00002232,9C6478E4F1346BD4E6948E5B230B5819305C32733004F235F2D777C4B3EFBE9C,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,5.93,5.84 -2018-03-12T19:12:25.287Z,Confirmed,BTC,IN,0.02175775,0.00021758,F18C86E8F488AD69B5DA9295B4AF3371840BC631FC5BB266AB67094DFD62BE49,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,57.83,56.99 -2018-03-12T19:12:24.523Z,Confirmed,BTC,IN,0.02827303,0.00028273,8DC5C19C1362EE0CAABAB5061B3A9555FCD99717BDCA208AC8C70A4E90927D52,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,75.15,74.05 -2018-03-12T18:44:05.076Z,Confirmed,BTC,IN,0.00273614,0.00002736,1D5880B86D37903EBD9B7F0FDB8EBE739B78DF06DB4B460168FB256C35EDF921,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,7.27,7.16 -2018-03-12T18:27:01.604Z,Confirmed,BTC,IN,0.00001095,0.00000011,C738AA81250D4C07B0291870F7C2D39A534C256C2A3931B03B8E1E87D908CEC1,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.02,0.02 -2018-03-12T10:25:09.415Z,Confirmed,BTC,OUT,0.00063236,0.00000632,5508CC58F656F4BDB87AD18A50D10212DA863B5E9D3D02E3F6243E01128BF72D,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,1.68,1.65 -2018-03-12T06:26:14.252Z,Confirmed,BTC,IN,0.00642631,0.00006426,C04162CDD08972CF370284FD8D259ED4D87F1755DD1E9AB2D0BC79FF06D2D092,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,17.08,16.83 -2018-03-12T05:49:12.796Z,Confirmed,BTC,IN,0.00224202,0.00002242,606E4A240B36BD6FF901F1D1C7DC8B6341A810731CE375950AF4B76EF8543B4B,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,5.96,5.87 -2018-03-12T03:46:58.861Z,Confirmed,BTC,IN,0.05540316,0.00055403,D15C24D94DF37E334E5B2DD2CA99BA688E5BE450C8E2E7F69DD7215732B71D6C,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,147.28,145.12 -2018-03-11T23:31:02.310Z,Confirmed,BTC,IN,0.00450868,0.00004509,0ECF11D144DE389691038A45425BC3B239E681B09DA78272B25C3CF883847AC3,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,12.17,11.81 -2018-03-11T14:54:03.373Z,Confirmed,BTC,IN,0.00206134,0.00002061,2C05712BB11BD1B80739905A7A42B4A057797CBCBDB5493508F40F531D58BDBE,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,5.56,5.39 -2018-03-11T08:23:40.197Z,Confirmed,BTC,IN,0.01964713,0.00019647,AF03402CC1BFA1FFC8AA35CD6844B671216E7DAAB136220634837C36CCEEFD3F,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,53.06,51.46 -2018-03-10T23:33:16.455Z,Confirmed,BTC,OUT,0.03063414,0.00030634,5915964D39A264CDDAFEEE6BD3F102851DFC51C31734DE78B2432FABFB562B70,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,84.56,80.24 -2018-03-10T22:58:10.312Z,Confirmed,BTC,IN,0.00010676,0.00000107,6D1C35D779EC1CCC6FCE581E4B18BEE0C0561CCB32F193DFAF9B17C5B34587E1,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.29,0.27 -2018-03-10T20:29:35.168Z,Confirmed,BTC,IN,0.02859743,0.00028597,A4D6DE57872AE62912E4B271001D06253F73125E63EFA5554F89C2F8B354C9E5,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,78.94,74.90 -2018-03-10T18:07:20.271Z,Confirmed,BTC,IN,0.00066932,0.00000669,AD573CF961DC79CE335EFD5B5A250C9C3D8E0F5EA6FB69A41B76E3DF5E02F785,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,1.84,1.75 -2018-03-10T18:06:59.053Z,Confirmed,BTC,OUT,0.02007008,0.0002007,C159EAA29EC7C01EBF49DDE0CA2D011B627F7CA47B4D90574280083659CAB397,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,55.40,52.57 -2018-03-10T16:37:00.580Z,Confirmed,BTC,OUT,0.00429789,0.00004298,4E48224C79A80F2BFA4AEB00E58A9046BEE7BA482FCBD03B5C9F47C73C15CB41,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,11.86,11.25 -2018-03-10T16:11:30.256Z,Confirmed,BTC,IN,0.02289793,0.00022898,210F623E7284C8EC11289878E426A1B3125B1AAFC954AC70FF063695CF05A43F,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,63.20,59.97 -2018-03-10T13:36:44.132Z,Confirmed,BTC,IN,0.00443887,0.00004439,73D8067712F1D429CCB0CADB16FBAD5A2130D9DA0902C11949FDE83A0092FD7F,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,12.25,11.62 -2018-03-10T13:13:15.168Z,Confirmed,BTC,OUT,0.06711561,0.00067116,9F9D31F0EF135033273B9E2628A3F381D04D63D0BCF728C57DC2E4604872783C,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,185.26,175.80 -2018-03-10T02:57:55.377Z,Confirmed,BTC,IN,0.01033685,0.00010337,62A0F0F58CD423A788E56C20F7D3F2D4FAD39AB1891890B5224C57AD70D474E4,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,28.53,27.07 -2018-03-09T11:37:02.435Z,Confirmed,BTC,IN,0.02148674,0.00021487,5FCB5907AA7636DA1ADBFE1D283EDE0ED66408A32C05EF771FD0146682DEECC9,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,60.90,56.28 -2018-03-09T11:28:38.819Z,Confirmed,BTC,IN,0.00023816,0.00000238,1828C5E23F8CAA709973A12A8FBC73315AF7F4A00181CD37146EBEB755A741C4,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.67,0.62 -2018-03-09T10:31:12.290Z,Confirmed,BTC,OUT,0.00601842,0.00006018,12131152A57728F6BCBE2BE3A7A887DD94A168DA6CCBC66329960B642E245DB3,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,17.05,15.76 -2018-03-09T06:14:05.277Z,Confirmed,BTC,IN,0.03231771,0.00032318,875750ED49B4BD6C3F60C044D2BDE610F5EBFD1DF215BD0331E7D1ADA869B67A,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,91.60,84.65 -2018-03-09T04:08:35.990Z,Confirmed,BTC,OUT,0.01074474,0.00010745,672683ED02D3192EEEC9DA1AB9ACE7447066A829076F8B6736CD8F2FE3EEB329,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,30.45,28.14 -2018-03-08T19:57:00.604Z,Confirmed,BTC,IN,0.01934874,0.00019349,27010FBCA5EC740FB59BC97653D374D2743A24E396AEE3FE2B6F3AC4B1D69216,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,56.48,50.68 -2018-03-08T19:22:59.600Z,Confirmed,BTC,OUT,0.01481542,0.00014815,4A9B605C5D8C4ACFC68B828BC70CE026B3468CA76D83CC68819024AF83D4F649,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,43.25,38.80 -2018-03-08T01:17:14.244Z,Confirmed,BTC,IN,0.000026,0.00000026,9BA7E4A9B760130A1469BEA05B81CF2AEF88E17B784BEB86DB0A303AAA38B915,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.07,0.06 -2018-03-08T00:06:26.654Z,Confirmed,BTC,IN,0.00439097,0.00004391,FEBBD58479E6B30F248E4C190C4202AB1646F6AD65F83B8FFA4CFF1543FA8881,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,12.81,11.50 -2018-03-08T00:00:05.496Z,Confirmed,BTC,IN,0.02050808,0.00020508,E93FD902FF1B6590C8B04C256931AD7003D9B7C85D63AACEB2424057C837FC3F,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,59.87,53.71 -2018-03-07T22:55:27.399Z,Confirmed,BTC,IN,0.0031454,0.00003145,A38AB5A3A8659C115AB07CE667AC973EA87FE756FB4B00381DD4DC245EC22E47,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,9.46,8.23 -2018-03-07T22:33:54.060Z,Confirmed,BTC,OUT,0.02431733,0.00024317,1988322A17F96E3984FE92EF56F54301ECD60D50608F6877F727C5B7552E77D8,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,73.18,63.69 -2018-03-07T18:01:26.619Z,Confirmed,BTC,IN,0.00899273,0.00008993,75F8F696B603BE47D89695771AFE03C5C4C59329F0BDC16F10B287FD967B9FF8,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,27.06,23.55 -2018-03-07T14:41:29.128Z,Confirmed,BTC,OUT,0.00113743,0.00001137,8D5C9D73B6916E103719893AF22AB1D99355888B46431D95A4C9BAA817B45046,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,3.42,2.97 -2018-03-07T10:24:08.286Z,Confirmed,BTC,IN,0.00019983,0.000002,8DD0CD453F8CDDA25472B6B271845DC8F129F5701CA528A49DAEDC6918658184,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.60,0.52 -2018-03-07T09:55:52.151Z,Confirmed,BTC,IN,0.01890937,0.00018909,BAC25693F2D0DBAB8071B52C46948231E3D5F6F364D4023D00A76417541265C5,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,56.91,49.53 -2018-03-07T06:02:09.388Z,Confirmed,BTC,IN,0.05075897,0.00050759,185E55A60AC7158C6BBEFAA3593F330148316E078E944C775B9F6A05A8D38D77,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,152.77,132.96 -2018-03-07T05:40:27.122Z,Confirmed,BTC,OUT,0.02381363,0.00023814,CDDE81257BEC0B7F18666A2EB1A7C9D9ED67FA19A9F8C742A72E147C06F7AF1F,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,71.67,62.37 -2018-03-07T02:05:59.768Z,Confirmed,BTC,IN,0.04570141,0.00045701,DAC9781C36B22F8B8C19B60636126991243126EA9AB545444EB7ABCEA1169E46,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,137.55,119.71 -2018-03-06T17:36:28.439Z,Confirmed,BTC,IN,0.03627752,0.00036278,63D9665735BA39954AA6ED304BEF2FE47D4E2209C24520B7766B6C06F580BE20,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,112.43,95.02 -2018-03-06T15:25:16.489Z,Confirmed,BTC,OUT,0.01475246,0.00014752,FA5CE36EE5DDA0D3D27BAC3410A959EE1A60AC01FE46F38E6A62DD09800843F4,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,45.72,38.64 -2018-03-06T12:40:03.949Z,Confirmed,BTC,OUT,0.00203534,0.00002035,080ED338FD9776CA4813E0B3B641BB0A85A4641BA0E375A4203A4BA0DF778DA4,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,6.30,5.33 -2018-03-06T05:56:02.110Z,Confirmed,BTC,OUT,0.00113196,0.00001132,A911A1F601A4D60505BE00DF9E7DE1B2EDD860F33D8A10FD7EB1983D5F75E9E4,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,3.50,2.96 -2018-03-05T19:32:27.083Z,Confirmed,BTC,IN,0.0080565,0.00008057,C47DF9884D35B5E2580F5743F1FC9EE4FB75C718B2125921FFE497FFCE70F1D5,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,25.62,21.10 -2018-03-05T17:08:46.304Z,Confirmed,BTC,IN,0.0481597,0.0004816,CD3E9EEE91C7DBF21DC422B13045FDE16C668B68084AF8F95F8CB76A96F09E48,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,153.18,126.15 -2018-03-05T12:42:24.451Z,Confirmed,BTC,IN,0.02818954,0.0002819,5FD0BC6A176D3D006FF58BCD8B8DBC09A70C9BC4DAA18EC0E609B571BA9C8002,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,89.66,73.84 -2018-03-05T10:32:28.390Z,Confirmed,BTC,IN,0.01170287,0.00011703,52B0216D2B7A33D50EB6C9890A9847BE1AFF0F67E94BDC7C966F7DAEB7D19CCC,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,37.22,30.65 -2018-03-05T09:07:01.377Z,Confirmed,BTC,OUT,0.05914261,0.00059143,E4B0384A6E4A092851904FC3E2E62FC5C061741EA89A02F90BB47AB502559E6E,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,188.12,154.92 -2018-03-05T08:42:47.316Z,Confirmed,BTC,OUT,0.00602663,0.00006027,C965E30E967B4F09D7511F8B1878EE6017E20A72F63C88C95237AE8B12C3A1C3,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,19.16,15.78 -2018-03-05T07:08:34.691Z,Confirmed,BTC,IN,0.01698627,0.00016986,F484FCB98A7199817B8AB4504CEF62B6D36ED0E7FCB9A618B477600F9A10070D,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,54.02,44.49 -2018-03-05T06:55:23.271Z,Confirmed,BTC,IN,0.01172203,0.00011722,6A444168893201766EA966CE92D4FC1AD8295539CFB1633EEF523E43D7FA09E4,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,37.28,30.70 -2018-03-05T04:35:31.177Z,Confirmed,BTC,OUT,0.00114975,0.0000115,8B3E1B1AC9929387DE4899270903334F7B4BCB30F2B02EE23AF1D51207C166A3,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,3.65,3.01 -2018-03-04T22:01:01.275Z,Confirmed,BTC,IN,0.0427011,0.00042701,47B272D5541ED94CC72A9E91F9C92888CCCBCDE83696F155F492C7EF089E1611,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,138.70,111.85 -2018-03-04T05:11:56.819Z,Confirmed,BTC,OUT,0.00196964,0.0000197,6A52DC545CC104EC4A430F03F182B52AC6894E76DC85F7F5DCC6E58CFF381137,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,6.39,5.15 -2018-03-03T20:48:03.946Z,Confirmed,BTC,IN,0.01104312,0.00011043,4219B61CC1C5AC90BB5DC915777AFAA750D1482E88962204885E0B29E1C8404D,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,36.40,28.92 -2018-03-03T20:47:53.948Z,Confirmed,BTC,IN,0.01040802,0.00010408,6BCA154E70470E68F0A9140617C71529B263A3A544DA89CA9122B96EEB2C7485,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,34.31,27.26 -2018-03-03T19:53:54.395Z,Confirmed,BTC,IN,0.00108816,0.00001088,F2C16F8CFC5E7236CA68A0D12DE86E157C45C65D58475092CBE94C9C7D10E8EC,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,3.58,2.85 -2018-03-03T15:04:15.025Z,Confirmed,BTC,IN,0.00976334,0.00009763,71CBB56D9D8DF9D9FC27D32CC1DE80F667CAFF975A792BF61AE4E70298B86384,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,32.18,25.57 -2018-03-03T13:35:48.183Z,Confirmed,BTC,IN,0.03302673,0.00033027,54648A4032EC2F42892B404DD429FDA104339514E94732A9560415D77AE34E17,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,108.87,86.51 -2018-03-03T13:29:33.409Z,Confirmed,BTC,OUT,0.00006022,0.0000006,3D753ADD599DFF2673782DDEB98B20D09B955D78C22CF169072BC289C0F6A0E2,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.19,0.15 -2018-03-03T08:49:37.754Z,Confirmed,BTC,IN,0.00013413,0.00000134,68C0A42092B17F32B5104A7BEE6FFE0BDCF0187D02DC07C4A7820B305B4A11A4,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.44,0.35 -2018-03-03T06:45:27.171Z,Confirmed,BTC,IN,0.00813452,0.00008135,6B03794D670BCF85C9664DFC30E9C0571FDD3650628CB37429391F462D0BD7C7,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,26.81,21.30 -2018-03-02T22:35:31.318Z,Confirmed,BTC,OUT,0.00040788,0.00000408,A4814177790609580DA53348EF94EDA7EDE19CC7032683E0E1932B5C46C296D5,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,1.35,1.06 -2018-03-02T19:01:56.308Z,Confirmed,BTC,IN,0.00148646,0.00001486,3D09C10FD1E2199DBFFE01922884809868CF4A45FBE9581777AAAC27C872BED7,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,4.93,3.89 -2018-03-02T13:48:44.467Z,Confirmed,BTC,OUT,0.00033534,0.00000335,A3CB7D794D3E37F1A196DA0014A17D35BC47D1BB5B95A81880C560DA7F78ED2E,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,1.11,0.87 -2018-03-02T13:19:53.715Z,Confirmed,BTC,OUT,0.0162444,0.00016244,2966A7A1B21EEA4968FFB76856CA642DA201FF214ABEB2766899A4043FEFA423,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,53.96,42.55 -2018-03-02T13:16:33.584Z,Confirmed,BTC,IN,0.00778275,0.00007783,428E2260BA8556424E8D3A3AFC5CC0ABB9484E228BFA223E010AE8BB721478EE,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,25.85,20.38 -2018-03-02T06:04:08.178Z,Confirmed,BTC,OUT,0.0107242,0.00010724,ECE681EC9273BAAA92ED5DC65AE40E2CEA3C66ACFC498C19B34BC2430A04BCDD,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,35.62,28.09 -2018-03-02T02:43:39.955Z,Confirmed,BTC,IN,0.04091761,0.00040918,43CF39D2193465E96729B12B78377A4021A10B5296B657B23E0160525B25A6E0,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,135.94,107.18 -2018-03-02T00:02:52.517Z,Confirmed,BTC,OUT,0.0019231,0.00001923,80E03FF9588314769FD43B218E8874F7CF8CE9736469B99BE20927032DB81BE7,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,6.38,5.03 -2018-03-01T23:35:25.635Z,Confirmed,BTC,IN,0.01713957,0.0001714,EAE990BA6413A39E234458A8F9275C614288FC267BE6394009E14E56E54C51D3,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,56.98,44.89 -2018-03-01T16:07:32.725Z,Confirmed,BTC,IN,0.04838007,0.0004838,97425FA97C426B3D045BDD11AE7196DE0EF3025737DB88DCEDFF9B861DEA7910,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,160.85,126.72 -2018-03-01T11:26:07.181Z,Confirmed,BTC,IN,0.02383416,0.00023834,F099B74BB7D434894609C089B37CFAA5DC299E4FEDA4BA3E71A6A9A57814E56B,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,79.24,62.43 -2018-03-01T10:46:50.390Z,Confirmed,BTC,IN,0.00191352,0.00001914,079C72FA9945C1F7A451DEFF0B2892680AEC7CF006DB08338F42E36AE1389C15,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,6.36,5.01 -2018-03-01T08:58:49.268Z,Confirmed,BTC,OUT,0.0083193,0.00008319,D72B145C80C3046AE941D0F5256609C4B789B73D44DEEA6548C830B17067EA88,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,27.65,21.79 -2018-03-01T08:52:20.022Z,Confirmed,BTC,OUT,0.06395379,0.00063954,660C8C7032C82F40CE5C99729B3E265C1200BBD589992D802D1DCB1DC26A833C,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,212.63,167.52 -2018-03-01T08:19:06.480Z,Confirmed,BTC,IN,0.00830835,0.00008308,9C68D9C640C0361AEBF2361D52DD7068B6654BC17798B27B827BC696507B33AF,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,27.62,21.76 -2018-02-28T19:59:05.569Z,Confirmed,BTC,IN,0.0068999,0.000069,199535089CC9140B56293C4A3ABCEDBB10AE38B57DEDDF9AB9009DC52D24FCB5,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,22.80,18.07 -2018-02-28T16:47:58.395Z,Confirmed,BTC,IN,0.04530995,0.0004531,FD56B6AF328CDBC795AE40F9DD975B2BE9EDA4A2658DEC9F7402298FC73BDD4E,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,149.77,118.68 -2018-02-28T13:42:23.319Z,Confirmed,BTC,IN,0.03149919,0.00031499,ABC7FBF1C86782C313A430A542103DC65126305DC6E3F7B323E4850DA21611C0,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,104.12,82.51 -2018-02-28T10:35:06.560Z,Confirmed,BTC,IN,0.03673469,0.00036735,73923DFC6D23D3F3C056E94F48EBEB58929FEBA5F67A8B1E24838323568FDCDE,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,121.43,96.22 -2018-02-28T09:04:17.253Z,Confirmed,BTC,OUT,0.00878604,0.00008786,A432AAA6009CE38E780668BB94B92779F2DC43486E438A74304DE20001C03F64,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,29.04,23.01 -2018-02-28T07:41:38.850Z,Confirmed,BTC,OUT,0.00787582,0.00007876,D6BCB23D81D1256EC94B5D9B2F644CA5709C12C4A4898D5212FC88878DD8C737,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,26.03,20.63 -2018-02-28T06:12:49.371Z,Confirmed,BTC,IN,0.0424383,0.00042438,6F1A705AAC0634574AAA07E20E0E0BFA2DA0D19DB1842123787B20DE00C0D090,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,140.28,111.16 -2018-02-28T04:23:32.450Z,Confirmed,BTC,IN,0.00624016,0.0000624,6BD47434FA683B693CA56C5CA30A8FD0A309DA1EB22D4563757B748A0F56D927,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,20.62,16.34 -2018-02-28T01:51:03.147Z,Confirmed,BTC,IN,0.00001368,0.00000014,2858D6DC925EB651B6261DAAD24C452CF2C10BF344E91C926225804035CA6B75,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.04,0.03 -2018-02-27T23:09:06.600Z,Confirmed,BTC,IN,0.00273614,0.00002736,58FA5FAA047FAAFA241315B1D8770B0701FDB6E47917EFF0E30B598FC961FDA1,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,8.94,7.16 -2018-02-27T20:38:30.872Z,Confirmed,BTC,IN,0.01078306,0.00010783,043DDF576C317C4D78F7FFA58C67C1A934D3F5F1734BBB639BD951D3188CDDEC,6kiIoZlxrCvV3KOaxa80Rsyg6bdeUm3Oq,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,35.25,28.24 -2018-03-14T17:04:34.063Z,Confirmed,ETH,IN,0.000017533708554696,0.000000175337085547,A99D859EE4028FA0CF704C0456A4604CAC525F1E78D6A11148F40EE88637EDD9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,0.00,0.00 -2018-03-14T14:28:48.496Z,Confirmed,ETH,OUT,0.0857398348324654,0.000857398348324654,1BE771EBF07F2D2F37906B3C71110C07ED3075A55412AE3093F766D71F386A3B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,5.18,5.18 -2018-03-14T12:19:18.235Z,Confirmed,ETH,IN,0.524573492539407,0.00524573492539407,F044661B0283FE05F44BDE0F519BCBBFDC1753D7AAAE7739350BB1B6F6259304,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,31.70,31.70 -2018-03-14T07:28:16.721Z,Confirmed,ETH,IN,1.0460435186646327,0.010460435186646328,9EE066BFB8B6494175460061EBAECACAD0AC4F1468FD744BA4823C863BA4693C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,63.22,63.22 -2018-03-14T02:23:40.347Z,Confirmed,ETH,IN,0.14777409569898128,0.001477740956989813,D8D77D81F48A50FCDE1C8E61B1DEBD6BACE44E2DF746BAF2A2C8A836971CAE8B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,8.93,8.93 -2018-03-14T01:50:00.618Z,Confirmed,ETH,IN,0.15761050619816598,0.00157610506198166,0D1B5850ADB7C4AE9CF940BA3B8AF17C0D752ED49412DC8860D3091ABAC933E4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,9.52,9.52 -2018-03-14T00:55:43.898Z,Confirmed,ETH,IN,0.029912506794312064,0.000299125067943121,039F1848C8D85A87C15BCE74306ED0A3E99F6677997301ECD64FEED34A683EB0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,1.80,1.80 -2018-03-13T20:10:51.709Z,Confirmed,ETH,IN,0.11581014500376974,0.001158101450037698,C43BA4F8D4DD5F3977035AB5AF0F96B646A40E9A7F8B75856F19C89C2C5616B2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,,6.99 -2018-03-14T14:04:55.771Z,Confirmed,ZRX,IN,0.000000000000180265,,253B61D38A2F5B60D535DFE80E2EE06AEB257DB329F411C9D99911E8FF7791AB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T11:35:38.566Z,Confirmed,ZRX,OUT,0.000000000005104641,,0C6C36EAC29797409B05BAD1AA639B4CEC9A8D57452B9204BA80AF927EF670EC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T09:41:46.901Z,Confirmed,ZRX,IN,0.000000000000623331,,DE02AC86B200063EE0D5BDE7AC1979E5487C6872C09BA7402D4E407F03528392,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T08:46:38.002Z,Confirmed,ZRX,IN,0.000000000001138394,,E87B1B603248EC1AA528C6F0444F42756826C0A0F88565FFFA11743355B09259,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T08:36:31.245Z,Confirmed,ZRX,IN,0.000000000000291545,,46196DA0800623E4AF0B4888FB14DA7211D468A269337396FE4561F44C8C6F04,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T04:32:53.697Z,Confirmed,ZRX,IN,0.000000000006416594,,94A4C1AF09604D1374F9E42987C690AE87DB7527DA125D20FDAE68FF192E7280,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T01:45:41.339Z,Confirmed,ZRX,IN,0.00000000000109172,,6B9A5500695B1209071FFBFF0EDD13A00B5081B3CC79437E24A0C0126A0E3BBB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T01:10:09.662Z,Confirmed,ZRX,IN,0.000000000006463406,,CE0E604406B7E295CD18F5602B040C5002C8158C3EAA825A786077C7305484CD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T22:20:42.463Z,Confirmed,ZRX,IN,0.000000000000045305,,FE359DFB8B8C68B55094A68184E34B4022C32D53A42986D7B2A984A73B02EB3A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T11:01:01.848Z,Confirmed,ZRX,IN,0.000000000011284578,,BFC936B9692194C4C8036B9D60C15599F10ACD540CC95C60172A4F724A063F58,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T09:42:11.943Z,Confirmed,ZRX,OUT,0.000000000006793824,,FF620D2B20E2160CF72EC10F1EC011219EEA5399BF7C9293862DFE632256E080,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T07:07:05.873Z,Confirmed,ZRX,IN,0.000000000000855199,,A24B713CEC3CEE61C0C6B9F337CCA10C8CF4B5E4978CA1745AF49DB340C8FBB2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T21:10:21.731Z,Confirmed,ZRX,IN,0.000000000001743248,,0A93BA068D20774FC7E63C03FC81A09539BC54B463EA8B38E2691593FBF6DF5B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T13:13:16.665Z,Confirmed,ZRX,IN,0.000000000010231183,,1E5F58AAD7A6BD35E0ED08C2FF105B74711EBB8DBD83D6EFB1DBDFD0F3A37AE9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T12:19:59.015Z,Confirmed,ZRX,IN,0.000000000000251166,,298EF0A6CF72AE1785082BF6B86522A4E0D3EE83B1C871D6B61968CD677790F8,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T12:16:19.121Z,Confirmed,ZRX,IN,0.000000000000001231,,E911AC3427EC507A25160025F17D2D38C2729BF711A66008A768E10EB2613865,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T11:38:37.586Z,Confirmed,ZRX,IN,0.000000000001308394,,6123C27F16317D1D6F79695C88D08BEFCA66222CD1B0F5EB6C9C3E1E67340C38,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T11:28:20.027Z,Confirmed,ZRX,IN,0.000000000001203274,,6CAE69E58B35D54A6B3BCBA5856AA5AC77969A959418017ABB40121613C3B7F6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T11:25:48.934Z,Confirmed,ZRX,IN,0.000000000000003011,,E1F32B6EEF2149DCF9175E9BCAA7225EFD8872346017E89ADF6754B921E1480E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T09:56:57.483Z,Confirmed,ZRX,OUT,0.00000000000001752,,87FFF80741D7E32E0BB0C7D1B1E1FA8183C5CCBE8C8BD544D0956146260D6B6C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T09:50:11.207Z,Confirmed,ZRX,OUT,0.000000000000315909,,165C60B785666E624625A5B488AF1C31BCFA7DA027A58FFC5CC1630FA606B50F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T08:32:24.510Z,Confirmed,ZRX,OUT,0.000000000003514282,,568BC9A875D8F0A4589AFCEAE5C01C8A9DA671C473597756F886EE3ED306984B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T07:26:25.412Z,Confirmed,ZRX,IN,0.000000000000101288,,B032B15E2AE9196C507A241AE4A627DF65DBA41DD5715C3B7403754CD608D9C5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T23:25:54.922Z,Confirmed,ZRX,IN,0.000000000000943073,,9280D8CA4BCF1F1E09F4AAC91C86F8AC9808C302E13EA495A491666580834882,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T23:21:08.975Z,Confirmed,ZRX,IN,0.000000000000647285,,DC87440D008A7C32D3CC5241674ADE8D6B2EE0CB73D3F6144E09C3F0C0E70D96,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T08:22:21.528Z,Confirmed,ZRX,OUT,0.000000000000841511,,89CA5CBC6F15D451DCB5E60F38DD7D1221DDC21D4A9BDB242960A9D1F1D6BD53,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T06:15:04.946Z,Confirmed,ZRX,IN,0.000000000002468142,,98EAC3F016C056181BA05F2C76942FEBD1D36DCC1C79E8D614FA7EE647711C5E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T03:30:32.790Z,Confirmed,ZRX,IN,0.000000000000434306,,BCB1955A1E87FDDB89F7818DE535DBAD77A9DAC83FF7130827EE99A791CAFD91,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T02:04:02.220Z,Confirmed,ZRX,IN,0.000000000001878208,,8726980FE44A3294DC76B5138CA318DBC1C75700D71DD5CE7181E9402B43F983,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T01:17:31.368Z,Confirmed,ZRX,OUT,0.000000000000756785,,2A6C2287B4F26E1E19CA28CA3CFDB8B96C80DD1C7DC329F6096F05DF833AAFBF,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T15:14:59.944Z,Confirmed,ZRX,OUT,0.000000000002696313,,F031D4FD8C268F7093E28503BB44D0C900791B1865550B802E588A71690A4B72,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T12:40:55.514Z,Confirmed,ZRX,OUT,0.000000000000517663,,8D16E03FE141C1ED854EE74143DEFF5577B4A766EE3E0EBA2A3D76F42E4795CE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T10:13:18.910Z,Confirmed,ZRX,IN,0.000000000000523549,,E1E7587EC10128B4AEE3F1CD0DEE9690090101FC08DADECD6939EC739F7A6D76,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T10:02:49.296Z,Confirmed,ZRX,IN,0.000000000000097044,,ADC42CC8CA35073334D644DFD1AA128F74EC7FCE2C850324EFD813E8E5B1BFA7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T09:33:37.760Z,Confirmed,ZRX,IN,0.000000000000084178,,2986375EE32810876A18717F49402FBF3D2B9E92F15679ECA55E9EF56153EF23,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T01:38:47.138Z,Confirmed,ZRX,OUT,0.000000000001070094,,ECE39E2E96B0A842325847741467CED3B5C7AA4FC7210AF303CBB5FC0CB4BA2A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T00:38:02.785Z,Confirmed,ZRX,IN,0.000000000004241777,,922533A5A32C24242F692CA844D44694C5F99F55CCAA14FC9678E979901689C6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T00:26:24.118Z,Confirmed,ZRX,IN,0.000000000000984546,,1EE4DF1A5B002CBB8484EA29EFA8788C750D8C99C477769C4FC8A2DC99098885,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T23:23:59.315Z,Confirmed,ZRX,IN,0.000000000000664805,,92872206A10685B61E62DB46BC7CB9AE88270F837CC8C798BC945A9D5A1BA9F9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T12:06:57.032Z,Confirmed,ZRX,IN,0.000000000000071449,,34633881245EFB462A31F0998C770367DDE7C0D70CE02475ADED615D190680CB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T11:17:01.301Z,Confirmed,ZRX,IN,0.000000000000835762,,24E54C565B3636EACE90342AA914F44EF92F30AA35DCC028E63CD924B0D72119,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T04:49:52.581Z,Confirmed,ZRX,OUT,0.000000000005060841,,4B984D8C4F1566A6A25B48326BC6480855FA29BE52CFCEBF792634B9F0BE6251,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T03:11:30.575Z,Confirmed,ZRX,IN,0.000000000000222559,,697A2252EDAA266634A0FF4576D9325A8765205E2D9BD7F57E6DDA22612E69BC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T02:23:49.266Z,Confirmed,ZRX,IN,0.0000000000006685,,306059115B1A98C94361E648A9DCF6BEB280A03B8223524D520D5E4A98858A93,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T16:08:53.726Z,Confirmed,ZRX,OUT,0.000000000004553306,,87FB61CD1B1938DBF0827DAD5686003A0A11056995956ABD21D1126EDD36CA68,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T09:30:52.628Z,Confirmed,ZRX,IN,0.000000000001289916,,96432434D2C91FB4541DCD1A4619BB7CA21AE109C5B4350AF4E696B2FD84B41A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T08:56:54.897Z,Confirmed,ZRX,IN,0.000000000000416649,,FB8B68AB042B5B03B1F4FC71C59BBD8C7C73D2733D933CDCF50A64CD387ADD25,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T02:55:00.123Z,Confirmed,ZRX,OUT,0.000000000000057214,,29408C87E7B7649D46D02D4C6D62B6F4F55F069481A084EBDEA2358F08D00E1F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T02:24:22.383Z,Confirmed,ZRX,IN,0.000000000006142706,,A1E92B4CC4B7EEC2F39702B9D743E90F672359B5DD60769D319B5D076F7F000F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T00:52:54.968Z,Confirmed,ZRX,IN,0.000000000000098824,,535E6E2CE1294FF92358BB6EB1BDE79AC12D8EBF7BAF69A71B3A939492321D40,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T00:09:13.220Z,Confirmed,ZRX,IN,0.000000000000102519,,7E313723AA42EB7C1BC2FB4CC807484AE18F1A3FB78347ADF6D2508FCDE8FD98,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T23:05:14.102Z,Confirmed,ZRX,OUT,0.000000000000807018,,A55D8F7FAD4DB7882715D9B28FF9DDDE853346C45F6817D4082A0B998C3CCB18,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T22:50:23.446Z,Confirmed,ZRX,IN,0.000000000001579955,,DFD339C5D316DD894D3A69E2AC96B13AC11F516D2A154D215A06E380ECA6F9CE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T13:13:17.203Z,Confirmed,ZRX,OUT,0.000000000000269097,,A83AE16BBE3F50F2A0FBF83DB43166D7A6468C308413453B6BA08717A3AD26B9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T13:10:11.729Z,Confirmed,ZRX,IN,0.000000000001460052,,39B8FE7D8088B64D2FF99D5E2CB43EC5BFF51E799B3115B952D056A681C48BE6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T12:33:40.574Z,Confirmed,ZRX,IN,0.000000000001394352,,B3B077D5CEC788D4E3E0FA603469C789EACBF78414E7BAF5823474532F8F1677,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T03:13:11.735Z,Confirmed,ZRX,OUT,0.00000000000027334,,B70C3FC3925EA0B6972B6BC2565C10A1E128F1EBD13435897F0E24179941C2F4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T19:34:05.370Z,Confirmed,ZRX,IN,0.000000000000818927,,B1C0F34EDDA7F357226E1006F72EABB67596F328601C074400E14DAB933C2B4B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T18:29:18.856Z,Confirmed,ZRX,OUT,0.00000000000128143,,C93D0D4A8BBD28972C1DE34D23DD234941A296C6FEFFE1E896CB410E6069A08C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T18:21:51.556Z,Confirmed,ZRX,OUT,0.000000000000296472,,B9E77C57A131A0F89C9FFEB1CEDD0F752A678F8EA85EC2E7E67D75FFF3760054,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T18:14:46.727Z,Confirmed,ZRX,OUT,0.000000000002317852,,EDEB4164234F30176B4D85ED031339C4D04677705174F0B941E53C17EDD03190,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T09:00:27.442Z,Confirmed,ZRX,IN,0.00000000000042582,,5C1E5237C756E4F43C13D5519A1ADCD6A35708C9A63CFBC35855F744477317AD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T07:43:39.913Z,Confirmed,ZRX,IN,0.00000000000000479,,53A786D63C208B7EAFD064AC17C834E83F59FEA151D70F96DF678B4184C30204,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T02:43:19.006Z,Confirmed,ZRX,OUT,0.000000000002823334,,5081DB0A055564FDEA187E22505090392009AE49F99A90ACAA0682071AF712B8,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T23:48:15.598Z,Confirmed,ZRX,IN,0.000000000000165619,,DF125EEDEF4ADEBA7C6C8F1822DA7C8E13C957AFA7405556811C5A88AB95DE22,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T23:47:38.731Z,Confirmed,ZRX,OUT,0.000000000004939432,,86A7429AE0D9436A3DD909AA622DB63FCDEBDD55EBD9F63D86BED1914A158448,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T19:25:27.547Z,Confirmed,ZRX,OUT,0.000000000000045853,,273EFADACED1026A8372EA92D6125F681590247EAACC97DEA425E33567BEB6AA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T19:24:31.435Z,Confirmed,ZRX,OUT,0.000000000002185767,,AFDBD59412A07F18E19EF1CA45D40DE3BF063BBFD596A016F9646B82DC9A6831,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T14:07:06.843Z,Confirmed,ZRX,IN,0.000000000002258585,,0CA5861C9D77D6DCC6459A2A050797F57383A9DCEF7F88DF261711CF9F105B50,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T11:38:02.601Z,Confirmed,ZRX,IN,0.000000000000024911,,2E3AF37DE9215883513AB68602482D2D00041712E24A4B1DC6057ABD2A1A4D86,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T10:56:09.057Z,Confirmed,ZRX,OUT,0.000000000000551745,,B059936994AE49CB563F0468D07A34D59B7FDA6081C28A7306D0C8B680434E53,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T10:10:08.592Z,Confirmed,ZRX,IN,0.000000000003518799,,7DBB848DDDD0985929B8194E48EF01A81CEB8538E1720BE29FEE589F93B14AB4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T09:04:11.594Z,Confirmed,ZRX,OUT,0.000000000000489193,,B765CDFBDCD3F23F59ECEB773872CF4ABBA6FF096CEFFC5105D1F9DA676987B4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T08:55:48.799Z,Confirmed,ZRX,IN,0.000000000001862056,,80A0DF41922982F73D2E55A20033ED8F30C9400FC3C11A4D6691350B87AEE0C8,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T02:36:17.148Z,Confirmed,ZRX,IN,0.000000000000019299,,812CC486B615DAD70AA282C4C259D465A906A4CA1186FC0BA25EDB641B14914F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T22:53:41.978Z,Confirmed,ZRX,IN,0.00000000000007227,,9028C09F7C75CAF71A1F7055726919C66969A7A1CF74CF843765ACDBD9981123,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T22:51:27.705Z,Confirmed,ZRX,OUT,0.000000000002015631,,1C6021FF13D555B5DA0BBAF7C7EC36E2130A5D22349850F92210C8379203AA34,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T22:32:34.133Z,Confirmed,ZRX,IN,0.000000000001019313,,27BA83D54501E69EBA0BF5E48D30EB254A8F9EC7A6775B51EA7B144B702D0E42,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T19:58:36.127Z,Confirmed,ZRX,OUT,0.00000000000943087,,2CD39C1FF8DBC7B17EB7CE868488CC00D35E14A20735EF73D86EA63B458B1620,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T18:18:12.817Z,Confirmed,ZRX,IN,0.000000000000222012,,5492F4106BFA72B9811198523A6B226E9E471617DF9F14DCEF6785787CE5FADC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T15:01:02.255Z,Confirmed,ZRX,IN,0.000000000001142227,,1307328C475DEB04575A0ADD640E8CC56EAA24D3F66BCAB9325D14A32B84D92D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T14:05:39.065Z,Confirmed,ZRX,OUT,0.000000000000213799,,75E80B5FF5F01B2C597AD459FFB5403A106D0DBE33C669C1E319E9F03EC6C35A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T10:16:47.114Z,Confirmed,ZRX,IN,0.00000000000367429,,496A2F2A91E19245408610293EE79F106C44C1B5661563CDD584EA1853441224,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T00:12:33.761Z,Confirmed,ZRX,OUT,0.000000000001393531,,9F6F2E0E5DE28C83AC66DB43A5872115AFA449F9C899D2F5F06A28AF320C70A0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T23:06:22.599Z,Confirmed,ZRX,IN,0.000000000003252029,,439F5D36C2B9FAC22389577DB22688D606876485098B7AC84338D89FB855D47C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T22:42:40.840Z,Confirmed,ZRX,IN,0.000000000001436373,,B54FEF300E41F8B0ACE11F7E9D77AE3CCEB5688104BECCC9A96E85C607A272BE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T22:22:34.929Z,Confirmed,ZRX,OUT,0.000000000002500992,,39634F76315CB37B785E293405825DE34DD6277C1EC96107C0397D1205773B8C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T15:03:13.997Z,Confirmed,ZRX,IN,0.000000000000166577,,2532801D53180E3390E48859E05DA919AA77A8DC538D8137E6A3E5BC7F1172DC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T14:45:54.864Z,Confirmed,ZRX,IN,0.000000000000021215,,34C35BD626BEF8C83E4E5DC95F2258050BA8CE49E58C40AC578BBCD47A6306EC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T14:09:43.008Z,Confirmed,ZRX,IN,0.00000000000323752,,392882025031A0CA93C2D181ECA34E21F4192CD8104C057D8927808A051F4ADD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T12:52:55.080Z,Confirmed,ZRX,OUT,0.000000000000317277,,AA99BE8F2079685A001CB4B29240DD80AA8C191F593F157E24884686CDDB8FCD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T09:26:08.197Z,Confirmed,ZRX,IN,0.000000000003834161,,780C571DCBAABDBD05ED5F70BA1C02426AAF3E8AF505105E58E1582ED12E3615,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T09:20:04.846Z,Confirmed,ZRX,IN,0.000000000000077745,,85476436EC5F2234D7B77DF50C581B2FF4ADDA189AA31D2629595977FE873EDC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T02:09:57.260Z,Confirmed,ZRX,OUT,0.00000000000533555,,2174F911C09DD875967C4E90FAC120A20A56451376A39686EAA575355F111A0B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T21:16:41.461Z,Confirmed,ZRX,IN,0.00000000000250633,,E138885D4CECE3B137F884D96966AFEDA980E91A9EAEB88F094659B077A28998,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T19:40:24.313Z,Confirmed,ZRX,IN,0.0000000000000245,,1AF4F578341209DF7B2F4FB0D983A6397C9F2CB7EEF9E34D074CDACC9B6D8A1C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T19:02:12.838Z,Confirmed,ZRX,IN,0.0000000000027267,,81FFCC16C833C8C0359A5D1EE98933E25B0C80C7A288C7FFC3F2AFC57CC163DD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T18:00:53.041Z,Confirmed,ZRX,OUT,0.000000000002385195,,C8A32D94B6A0BCC3FF596822DA1B048F635801BE1B77391896B1509073DC1938,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T11:09:00.632Z,Confirmed,ZRX,IN,0.000000000000508493,,36D86D65916C913BE1787CC3D7C0BDE4093698D7F86DCF9347B6D80BD9DEB592,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T08:38:21.311Z,Confirmed,ZRX,IN,0.000000000000820159,,ED91F70911F2F78823DF16729D026242E12A4BA5833B7EDF60C41C17B0AFA033,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T08:10:54.513Z,Confirmed,ZRX,IN,0.000000000002185493,,D1EC0F681291A9B699F284EC90C8796B2A5310962182D3B2892BB4F9D14E66C0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T06:30:41.838Z,Confirmed,ZRX,IN,0.00000000000092131,,CF0AD043E03151644CBEC911E7D699E4C6C36CC3F071B1B320FBA3E9B3272432,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T03:14:57.545Z,Confirmed,ZRX,IN,0.000000000000628533,,2C8CC9DF280D1F18E209024A979BA098E3781C5914FB77E1A275B2C8FABFE89D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T01:11:51.552Z,Confirmed,ZRX,OUT,0.000000000004797081,,D38128B964D17A080D82CDC9C784D93FBB68F7DC91F98FD72BDB7EB37F313373,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T22:50:15.855Z,Confirmed,ZRX,IN,0.00000000000181894,,A03A173F85D7DCCC7D5CE6FCFE7C4349A6CDD429AEDD1B4829DB689ACE8CB1BE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T18:20:20.433Z,Confirmed,ZRX,OUT,0.000000000007827098,,132F0BE666DAD3B231B201AB5260C091EF5E44B228104E2467A4EBD01BCC77F6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T12:27:57.772Z,Confirmed,ZRX,IN,0.000000000000278268,,D280C3425508D0D3A3B269883194ECCEAD125A3ACE4B44BFF63B8498CAC987E5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T10:41:15.761Z,Confirmed,ZRX,OUT,0.000000000000160007,,CE745F0C56321A116938989F1387AB8E8F6C94E35709F34A67881D55550C5E98,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T10:02:01.771Z,Confirmed,ZRX,IN,0.000000000000235152,,3AA7B3C0095C09127F7533EACA11E092745011CC3893AAEDA0C988CC55ADDD03,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T09:35:48.484Z,Confirmed,ZRX,IN,0.000000000001018491,,C36721CDD505CCD78A55EE55E11752EA31334CC1F1EC216C593AB1C7DFA6E7E1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T09:32:30.931Z,Confirmed,ZRX,IN,0.000000000000023268,,019934E7827C287CEB3461D35DFC16FE91EBB3A901FABD29907B32901D0AD9A4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T09:29:48.141Z,Confirmed,ZRX,OUT,0.00000000000511518,,8596C85E0761CFDD4BA53CFEF899A1CCD66F6ADE5805B2ED13563B428A98583A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T08:57:46.301Z,Confirmed,ZRX,IN,0.000000000011704512,,7669ED328664E5486466659B2D90D537D53C7F9212B80787F3BAD71248AEDC9C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T08:56:57.474Z,Confirmed,ZRX,IN,0.000000000001849327,,D1EE01506A7DD189ABA1C5EF0695DE41A6E148ED79D86F135A62C4C8C3E96250,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T02:41:40.770Z,Confirmed,ZRX,OUT,0.000000000000002463,,8EB72C5B21419ECBC68DAA062F48F8D818C1C2B3C2C496F60CF3CC73223901B7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T20:47:29.351Z,Confirmed,ZRX,IN,0.000000000000351496,,A2019839E469F39A1C039C86B7B169A9B3E9C00FC32BA17337801C092171FF53,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T16:18:44.015Z,Confirmed,ZRX,IN,0.000000000000786213,,90A2B3AB1177B2D318303A59451DF1BAACE61144F76A7EB8C8A1131F4DA4EAB7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T13:12:30.973Z,Confirmed,ZRX,IN,0.000000000000012729,,18E2740124B565D541559E7CB9F31EBE23BB30DE6A15AD2824BD3EDE634A82ED,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T13:03:51.832Z,Confirmed,ZRX,IN,0.000000000000045579,,BB7C21A8B54AEA12B3E5BA6C0EBCA8F13F70868C60053CE0A5D1DCBFB04C21EC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T12:13:40.937Z,Confirmed,ZRX,IN,0.000000000000337535,,E1EB3490ED75A620AE1B43CED6AD33667672DC82106E30A6ABBCC542827E29CB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T02:26:38.747Z,Confirmed,ZRX,OUT,0.00000000000144746,,78A321C02B6B46AB7E0EA19AA8A426BAC465E512D20025C79DC9463C61BD3D35,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T17:36:34.118Z,Confirmed,ZRX,IN,0.000000000003857156,,8D945C08FF6B968214F6F618E6B192F153A23A625B54CCBFAD22DABA9FC9E9BB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T10:04:48.776Z,Confirmed,ZRX,IN,0.000000000001870816,,F9F34A11C02D41E6248116E5E8C8EC3DBEDCF73813ECC4F11572BF0B253EA547,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T03:30:18.581Z,Confirmed,ZRX,OUT,0.000000000000465787,,9D316248FC8953C9DDCCB562B1D29A9D735E2F72A706B95F43F531E2B0CC3684,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T16:22:01.833Z,Confirmed,ZRX,OUT,0.00000000000003983,,1FEB06AAE084AC3408CE055A0DB8FB1E0C0866F6CC074073A8A22144B9FB69F4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T15:06:45.297Z,Confirmed,ZRX,IN,0.000000000002791031,,CDD795BB7FE491B940A1A3617E9AE733818A4F9FAD33CA1EBA2C2E693A5AD94E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T14:19:26.100Z,Confirmed,ZRX,IN,0.000000000000039967,,D6D6664F6D091B9E80EAC9D28AC2E8DFB5747460C902ADFB6AFE8D59D840237E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T10:40:50.000Z,Confirmed,ZRX,IN,0.000000000003666899,,5FD191F81B07614484B5DCABA4EE1873008D3C18A017A75AAAC447A4061E5C80,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T03:46:15.514Z,Confirmed,ZRX,OUT,0.000000000004972967,,F39752DF7014DA5DD83692580043022E327E7A5EEC19F0E55CD58BA3CB3E4DF6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T20:16:13.403Z,Confirmed,ZRX,OUT,0.000000000005037846,,EB282682A90FACF73E37CF86B6285A981E75236F72D89FCF2A3BFF7302F56415,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T20:04:09.503Z,Confirmed,ZRX,IN,0.000000000000068848,,1A7167DB8C3F11888C5419AEB62FF2767FBF2BC0C1B94A906954E4DF95D67C10,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T18:56:19.968Z,Confirmed,ZRX,OUT,0.000000000003275708,,B99805CD9EE51D0614291D10B14DE1312260D1CF8BEEA9DB277FCDBE7E69FE6A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T17:06:59.240Z,Confirmed,ZRX,IN,0.000000000008477805,,FF21F28D854CACE18E451D5C0E375BF4900702DEDF6278C160AF82868E2536C9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T16:58:34.830Z,Confirmed,ZRX,IN,0.000000000002308955,,A6EA68057041426252C9DD60F5D41C4A9D0C46543D5A79E845A8A48615ED79CD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T13:32:41.289Z,Confirmed,ZRX,IN,0.000000000000011086,,7E4957FA0878688E34524A7CB23611A71FAF75A36AAB5BB632FFEBBCA97531BC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T13:15:28.946Z,Confirmed,ZRX,IN,0.000000000004599433,,0D77AFA1D2441271B34E99C5D3FD69E39EB93E2E939004A7D97B0DE8E3CA76DB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T12:30:17.437Z,Confirmed,ZRX,IN,0.000000000005740976,,5CE0CB9BC768CB38FF99999E808C5CEFEA761FE49E122B5F1ABA32B2BFA9D2CA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T12:21:02.148Z,Confirmed,ZRX,IN,0.000000000000831109,,96D10442B4D68EF0141146491B1928C68470D8177A4CCB1A055C1347C559A4A7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T05:40:27.816Z,Confirmed,ZRX,OUT,0.00000000000088011,,94152DE463F60C28202DC346DA746BEAB299FD195F3A1A5520C510ED45FC9379,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T05:09:38.914Z,Confirmed,ZRX,IN,0.000000000000332881,,C3933919BD4F2B939A15FB90EEDE328731936715F4DA7540EC0009BFA1942CDE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T04:17:08.209Z,Confirmed,ZRX,OUT,0.000000000001801147,,A521DD9B67DAE76985E13CEBCA2513637A4D6259459E531BA7E0902EF1B96E80,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T16:14:42.617Z,Confirmed,ZRX,IN,0.000000000010731463,,1ECE275691297862677104BA5503C8A04A7E34F7633E056BC727A1B68A6A5AFD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T08:48:31.340Z,Confirmed,ZRX,OUT,0.000000000001330842,,4B3B0BCDC2D47F9C4259BE253C277A29ACE12C56EA87381EBB3290024BB8A21C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T05:59:44.610Z,Confirmed,ZRX,OUT,0.00000000000005913,,6E12851578661647FC707A56ACACFFE53EB89E599994F032D552BFDF6F38767D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T05:05:41.719Z,Confirmed,ZRX,IN,0.000000000000826729,,C94B3DB159A28241E0A3867CEE6CEECCC1DF03E5AD868568382851821100AE9A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T18:26:19.309Z,Confirmed,ZRX,IN,0.000000000000209693,,DEFB73809ABCC32FEE9DBDC1BA2D51255F4B802CC11927BFE49E39DDB37F1165,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T15:25:36.662Z,Confirmed,ZRX,IN,0.00000000000308066,,580F807CAB52643C56F7E9C34857E922B8343E7F88EC261EBC6DC3A083DD47A3,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T10:50:00.113Z,Confirmed,ZRX,IN,0.000000000001675768,,E9021E387B86E89FEA0E9866F24A8FF0BABA2C07CB0F23FA6B9094EBD551DA72,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T00:38:52.228Z,Confirmed,ZRX,OUT,0.000000000002005091,,F34F32E479FB10FC868FCE89BF3FDACBB831A275EDCAC309FAC677097CEDE1BC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T18:55:23.812Z,Confirmed,ZRX,IN,0.000000000002552731,,BDED71FB6C3E6E1AE5F672EF40E7A0E3D83F5E30E28668AE977E9BD02C6F83CA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T17:41:21.582Z,Confirmed,ZRX,IN,0.000000000000911728,,C8DA31624C00754B6A17FEAD30211A42CCF62F318A4080732E17102667FABA24,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T08:47:15.905Z,Confirmed,ZRX,IN,0.000000000000638935,,CBE03842CF304DB01E113D98271C9683B5A55E72E5F10785234E5E4AA52DBBDA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T06:13:34.182Z,Confirmed,ZRX,IN,0.000000000000088147,,0C73B5A6A0B084246BFEF5ED5995D73C7081E0C8ECCBDCFCB95828C22286280A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T06:03:16.496Z,Confirmed,ZRX,OUT,0.00000000000249538,,5EDFAA10A38E0A80BC84093A43FFC4BEBAA5D80F7DBF55140C069F4C5749A40B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T04:49:54.066Z,Confirmed,ZRX,OUT,0.000000000000141529,,55E75694D6D4D03DA7783B5C7E73F536D78A8966880123BBA4C6CE6AB7D569FB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T19:06:19.304Z,Confirmed,ZRX,IN,0.000000000000659877,,F6F8B41A19DED853468ABBBFDA30C094A94FD9649F9EE4C07248BF02F9703364,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T18:39:17.580Z,Confirmed,ZRX,IN,0.000000000004159514,,8297ECF616A7BAC2B0008A5CB4618BF983C2C297A3DF683BBC12388787C853C8,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T16:06:59.464Z,Confirmed,ZRX,IN,0.000000000000279226,,A1A12059AF4FFC5FBD1FE5B38787DF2A3F937B8C792A7A467E1629CC0FCB0F3D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T14:26:42.776Z,Confirmed,ZRX,OUT,0.000000000000078019,,D622C6F9F283841451587FFB2D0A41D28B395998BA2D6D820180E5C0A908A155,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T10:03:33.288Z,Confirmed,ZRX,IN,0.000000000003791729,,D74E711CECE49B4F6CD308F116FACE18761A162929D050BF19C9CC41ED269331,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T09:15:26.030Z,Confirmed,ZRX,IN,0.000000000000862727,,61F5BACD1670FD44B6F481531AD493DD4087936B34515959E5A63A9E6FE4A721,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T09:10:20.958Z,Confirmed,ZRX,IN,0.000000000013024678,,0850ABB926E429F455767D31399377062B9B35EBD25AE8F25F2088D9C7AD03F9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T08:33:42.548Z,Confirmed,ZRX,IN,0.000000000000227624,,9EC3D1C273C38A793E16044F79A8F8696B3155B74244846C74D9113096ABEDFD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T03:17:34.656Z,Confirmed,ZRX,OUT,0.000000000003725345,,3537F337A6F05B0194EADF3689FCA725F5735F327F4632D73325639405EF404A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T02:36:39.503Z,Confirmed,ZRX,IN,0.000000000005513078,,30B555DF97AEE7D49967F8822CC9BEE100DBEF778286F7C9E1BABB0F12213666,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T02:36:26.215Z,Confirmed,ZRX,OUT,0.000000000000778001,,453992DE456B5975B7B0E3DC7B28E35AB6C2B2601C3FCC9EFD44136BC952E599,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T02:29:46.249Z,Confirmed,ZRX,IN,0.000000000000214621,,F66CECD6CB28CA4031C09FB6A3CA3B667E94560A1D12FC4509AEEBD16D5FD74B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T01:42:19.237Z,Confirmed,ZRX,IN,0.000000000001569005,,0AD1C7FE33F3F46E9365E08E0B62CCF959E5768EE0F1AF974694C0DABB01765C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T23:41:31.824Z,Confirmed,ZRX,IN,0.000000000000773621,,3E57EF73A33EAF8F6BA66D26962BD9631EC27E3B64A81BFD9900FA348B7CA9D0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T16:59:45.598Z,Confirmed,ZRX,IN,0.000000000000245691,,E7D9C9E5D4DC6396BEAE7DC7E1AD69E7D477203ACB9E2A8E5F8D54BC8D4BD089,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T16:56:32.467Z,Confirmed,ZRX,OUT,0.000000000001175351,,C51606835404BFE1B7B23467842D2104D73EE299AAAEF96B917BA864FDFCAD14,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T16:33:24.784Z,Confirmed,ZRX,IN,0.000000000002441862,,F52AC202B4045BEF4F33A41A4A9B01D7D64B6D5310A9E66A9294ECD5FB039EC6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T15:55:50.176Z,Confirmed,ZRX,OUT,0.000000000000228856,,338117700CEDE50C431E38218C0021264CE2EAFA92E872A728871BA8221ABD81,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T14:32:53.005Z,Confirmed,ZRX,IN,0.000000000000634145,,209885EC2DDD23DAEE82274CE255C46D3C5C024D3BB2065E119832ECC49C2316,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T10:49:10.379Z,Confirmed,ZRX,IN,0.000000000000480159,,FBD4FE592A89D54997BE0D2518D526F00B4DCA050B5D1FE3EE606CB6132DF00C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T09:09:12.916Z,Confirmed,ZRX,IN,0.000000000000562285,,5F4D620D1C379B79CBEBEF2C3EBF540EB5E864E24B864C5E74C9FA267F4023A7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T08:40:23.919Z,Confirmed,ZRX,OUT,0.000000000000029154,,D7D46FBC5D53D59A76CD4BCD51766CE134BCFE2F7350A318734506F72643974E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T07:51:36.965Z,Confirmed,ZRX,OUT,0.000000000004413966,,4070524C0B47E94561AE85AD562E547764BCD3C7883794654E7BAC38AECD12F6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T06:30:39.948Z,Confirmed,ZRX,IN,0.000000000002188915,,AA28307E8C58E58F3760A13A8B5BCB309E9DC04ED249C3D56BC9D32B6A392759,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-19T12:22:57.310Z,Confirmed,ZRX,OUT,0.000000000000976334,,680CC4DAED1EA719134A6D39EE0EDCE3892EA65A698A75A87627C5639CDBC513,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-19T08:30:47.666Z,Confirmed,ZRX,IN,0.00000000000324409,,9114F26979127A322D239E3410F6099C579ED08D9923A8BD15E53E27E5DD8DF7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-19T08:30:46.250Z,Confirmed,ZRX,IN,0.000000000002815122,,5BA853C3F4CB6524B0636C08E964C9EA530DB716A5B411443634E9C51F24BF31,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T15:40:59.576Z,Confirmed,REP,OUT,0.000000000004616269,,1308AF3BC664FB1FBC8D878172FB33C89E3CDC82A29C6AF7BB43EC035E323C0E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T09:26:27.272Z,Confirmed,REP,IN,0.000000000000113606,,9A941730CB228C7717EC95E337D99E2AC0CEE3A6BAAB87185381E18F9247F1C2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T08:59:27.969Z,Confirmed,REP,IN,0.000000000005304753,,F4F32397CB5473D748E882A44FE733B77E7542465704A973281B4A99FED59616,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T08:58:19.818Z,Confirmed,REP,IN,0.000000000002171258,,4D7FC71D861A2A79731F1614963257C77B34C6F08A34455B1F76356FF8C2F083,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T08:11:45.049Z,Confirmed,REP,IN,0.000000000000426504,,1DB3E56994A81EBC2BC7410693D953CC4F7A0D03147C221BF8D60ACB23C58DF6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T07:43:57.276Z,Confirmed,REP,IN,0.000000000000725577,,D901CFF3C3916F2D84FAEFF648087E76CB7D358CA23243A5A98D5839296D035F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T00:30:42.033Z,Confirmed,REP,OUT,0.000000000000313445,,DD45448C5906F7BE5880B07E6F39397DEAC8F47BD5E9EE9F94342D309155CABE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T12:54:17.061Z,Confirmed,REP,OUT,0.000000000000131948,,F96CAA7BE7ADFE937B6D33063D6036BA29B89EA9E9DD9A036A11D4677F30F378,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T12:45:23.786Z,Confirmed,REP,IN,0.000000000000185603,,B0BF2FF084664DD76B2727D7DFDFB41C4669C1CDCBBA2B57EB5DA8EF2CD7B040,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T11:58:12.583Z,Confirmed,REP,IN,0.000000000000076102,,8BE29DFAB8D50D8418AD133E5A8F38392E16C28F62ACAE6953C33DC41443A526,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T10:26:24.764Z,Confirmed,REP,IN,0.000000000002180977,,06F010F6C3A5CB63427BF2FEE5FFA5EEA319531C34F23CD1B21D935033E675FC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T06:54:12.603Z,Confirmed,REP,OUT,0.000000000000518074,,1C5807249B9755C36A98C6017B2942732B0E6979E9BA5CE3B0D1DE87F952CF60,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T05:31:19.827Z,Confirmed,REP,OUT,0.000000000004091898,,8190450866A5CDB6776FB2C1E39747B63648307C3B215097B98C95AE1E9A5BA6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T05:15:38.154Z,Confirmed,REP,OUT,0.000000000001430898,,1442340521D34969287FF7E7A1DF0DC355CFC9A83BB157C5F5CD199CF3DF0D2A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T03:46:14.774Z,Confirmed,REP,IN,0.000000000000604853,,478B3D5D6AD3490C70ED9F2F057C864F99E64E953641CEE37658B50983144718,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T03:24:39.642Z,Confirmed,REP,OUT,0.000000000000192447,,5A164FE025065FEC3B1CC7CC01AC537F01DF8B42D320749B55366741699F8C77,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T16:35:30.851Z,Confirmed,REP,OUT,0.000000000000339588,,0CBEC253A1C714102E401205AA68A29A8D25F5F7753C45A1CA39699EAF1C1392,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T06:56:20.687Z,Confirmed,REP,IN,0.00000000000290806,,AE309B65724A2F0CD4B96BB6D6145D24F5260CBDEA18321F2E2DB51C32744AF1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T05:57:00.171Z,Confirmed,REP,OUT,0.000000000007124105,,40A56E3554F0900EF3211C11944B0018B093C7EB73ECE46F7E0E6B98344DF984,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T02:14:00.479Z,Confirmed,REP,OUT,0.000000000001026704,,2B64B5E70FB2B62E2397B23E487A239986252EB0890448F209AF07885FDF6A44,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T01:10:41.846Z,Confirmed,REP,IN,0.000000000000011086,,58C7AD42A2ED6205DBF0A7DC10AEAB644311B18F77408871583E99F0DB82300E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T21:35:35.065Z,Confirmed,REP,IN,0.000000000009376805,,02194CA4FDE38901158D35A845B8F67F98713A42F0C1FCD267A07D17940C2CE5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T12:56:30.665Z,Confirmed,REP,IN,0.000000000000028607,,FA1C81E9E883ECEFB9DFD2E0B191E0F68B937602F39EFD16E547EF77F01DDE72,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T09:18:33.397Z,Confirmed,REP,OUT,0.000000000000451963,,C3B61DE854359B8363737ADA20064EBBB8D993DF1DD33AB4CDCBCE596EE6BF91,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T06:19:04.446Z,Confirmed,REP,IN,0.000000000000422261,,EE25AFFA3AF30F5A76BEEB3F55CE392C3CC5A7887558CF5EF5CA4745594AE558,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T06:00:34.306Z,Confirmed,REP,IN,0.000000000003591343,,F2BDEEE92ECCBEC5BE41313FE4E81991ACFA4D12D2A784AD6E5B4A277C2AC710,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T03:57:22.224Z,Confirmed,REP,OUT,0.00000000000175324,,6BABD6FF4C97FBFC5D6C30A44C5B259E80FC439383293F9D3438442D2D0B6097,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T21:15:13.426Z,Confirmed,REP,IN,0.000000000002228336,,7DACB05B7A88DE156581A2B3C665AD8C79A9495E090E7B85D516CB082A36B0F1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T20:32:36.348Z,Confirmed,REP,IN,0.000000000000170683,,3EC822D16F49F64A947058827B377B7FEEDE2C366D6EAB31CAD41CDB99A79285,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T20:28:38.903Z,Confirmed,REP,OUT,0.000000000000595272,,11557DD7CEAF43CAC2FC723BE01B783AA5E253416F74B1A6E2CF91BF85CB4660,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T18:21:36.303Z,Confirmed,REP,IN,0.000000000000721334,,D09466FD254E910EEB9035B5F65230679746690638F2C287FBCC7D904FF512CC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T14:08:47.942Z,Confirmed,REP,IN,0.000000000000376955,,7AE2DD58E8F772D6EA21BCE272C19636A2DFA62F320D04F63B8356CBA08B8181,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T23:16:31.310Z,Confirmed,REP,OUT,0.000000000000893387,,7F02B78389BB91F8BA60FEB6E462424E355B7D3D60D2EC315467C23682509E7D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T19:42:08.754Z,Confirmed,REP,OUT,0.000000000003277761,,EF4004BE168391646BE9005E52A41F703F5A80332EFE7CEA503A923ACC4F79C3,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T13:21:07.153Z,Confirmed,REP,IN,0.000000000001922008,,B349E95833259AAE1BBE2071B9D0A4DC4A84166F0723DACC6CD7E9F4A173ABB4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T12:54:46.119Z,Confirmed,REP,OUT,0.000000000000474,,E17C411B6DB8780ADDBB64209A7EAF7D52F09F4A85997F7EEEBA3F8CEA1BBF9E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T06:14:12.242Z,Confirmed,REP,IN,0.000000000000524918,,4C4092442473F8CD75B890C6B219355E0A68D8FD58B655B9359390ADF8EB7C0E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T05:07:00.842Z,Confirmed,REP,OUT,0.000000000000821117,,234204C52113FCA924C7750826F2321B4E2128FB0AD6C1960FF5A2F62BFBD789,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T05:05:43.940Z,Confirmed,REP,OUT,0.000000000001621566,,EA9CA915E1876C96BE854CF2E8C89AA129EDF302EC70849B4E6BABF9351E6C45,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T03:41:20.320Z,Confirmed,REP,IN,0.000000000009316716,,52AE66F94F9024CB6A4ED74153E807451169C8C0A824826A08BBA173DC4DC87D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T02:00:01.832Z,Confirmed,REP,OUT,0.000000000002400388,,81CCA3AACF24807D8C575E2D1A0E68DEAFDBF8DDB563AE5C8E9172C3D0E086E1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T01:22:19.479Z,Confirmed,REP,OUT,0.000000000000878468,,7ED422D46D8A9430827774E166AAA8616C94C43474819D636F586D1A566E37D0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T18:36:30.669Z,Confirmed,REP,OUT,0.000000000000241311,,076FEB1CBBF1E93050050D32DB001E61726AEECF13B3ADAA0091370A34D4DC7F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T17:33:01.329Z,Confirmed,REP,IN,0.000000000000613066,,5F741FF07173F70FAAFBF121C19F54F59C8E25658D1F25328A08A25679EB7B91,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T22:39:55.599Z,Confirmed,REP,OUT,0.000000000007016657,,07AD53478BA8A29DF55794FE02DD545C38AF4B673DE7B535586EF3809815CFAF,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T22:37:07.719Z,Confirmed,REP,IN,0.00000000000262199,,7C8BE76FB571BDBD1D5A8F0A268671DB8AF004672D8D03C4B4FE2D90E52D5FBD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T20:55:45.369Z,Confirmed,REP,IN,0.000000000002219165,,E274D98408B8E13DC1041A6D7D18CA0BAF9D31B1981F76672028C5EB766B9065,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T20:06:14.789Z,Confirmed,REP,OUT,0.000000000003240805,,23874C2E4122FB9BBF73C3E44517FFCD449BAA0A8C29FE929CD656D9DAF55ACE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T12:21:01.884Z,Confirmed,REP,OUT,0.000000000000710658,,8E89000BB63906AC676FEA0F26A32C02E6941A06992DEB257ED43F943E81054E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T12:09:09.131Z,Confirmed,REP,IN,0.000000000000713806,,20AEC66EC5DC4CF26A080F2C20AD910CFF77E4C1BB8CAB845C5F077BB8248E15,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T03:13:07.941Z,Confirmed,REP,OUT,0.000000000000238711,,BA66383E4BDC391E2F421DA676A5EC5797AF1BC5340460D147658A7EE877911D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T22:17:09.710Z,Confirmed,REP,IN,0.000000000000118944,,E19C7CC2AE4E3D1F8A92B3416A72DBD391FABA4ED9759BB202201205E34A634D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T22:01:53.317Z,Confirmed,REP,IN,0.000000000002049165,,4F6E16EE465E146282513581312C030CDF7AA261EBE68E146A354937CB03613E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T14:13:45.959Z,Confirmed,REP,IN,0.000000000000414185,,0558907DD3B80641934936340BC470B5BE1F701610B2919BC042CA290FD48408,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T07:39:28.453Z,Confirmed,REP,IN,0.000000000000074323,,4B142AC4CF88A7AA0ABF84D5BD151D20986A4B2727EDD09F7B465F0CA440EA77,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T11:19:44.975Z,Confirmed,REP,OUT,0.000000000005366895,,3CB07E8D14385AF7854CCB1297488E77F1E726CF688C6B813D70180D1B376060,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T11:10:22.174Z,Confirmed,REP,OUT,0.000000000005325558,,C5BAD94A5663E7FE080D860E1E20568B6E9CB6BC5466ACA8BEB752BE6C89DF8A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T11:03:50.720Z,Confirmed,REP,IN,0.00000000000112676,,7F15AFF86A784649DC855A5189333D322BDE87369F5BED0E6EA4145D1C56764C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T10:47:27.269Z,Confirmed,REP,OUT,0.000000000002358367,,E7FEF91BD0091C0E197C66142DEA4BDBE8CC1535AE0F607FBDB6BBB5D412F8F8,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T08:58:12.110Z,Confirmed,REP,OUT,0.000000000002736281,,A5AB85D8AA8903EE8CE09447B0D35885424C331D3D7C82926944F77951314BAB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T08:51:00.589Z,Confirmed,REP,IN,0.000000000000011634,,0A684661B4FB264FB07CC8491D34C0A4CC3FCDE14E487BF51B534F7EB46432A9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T01:05:18.461Z,Confirmed,REP,IN,0.000000000000996318,,78E9E1DD61671604F122C34024CE1668BA4DB76B2915CA35924E3FC5296F160A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T21:18:02.843Z,Confirmed,REP,OUT,0.000000000000154122,,2420ACFDA8CA89791344CD2D79192965ACDF19C4F7A162890F46A29303B2AA45,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T20:05:09.693Z,Confirmed,REP,IN,0.000000000002850025,,E858E390BD04C2CC4EDD48D2B106FB2FF2B2B84022D78E65FDEAF6802738C8DE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T12:57:53.214Z,Confirmed,REP,IN,0.000000000000540522,,B510AF199915CC9B62FA5CE2CC93DD193ADA7B485413E34C80367E0F60DBFD1D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T07:51:39.300Z,Confirmed,REP,IN,0.000000000003142939,,21C5876B67449FFF85C83B2B3BE938634EBFE5867DE33D4EB89F984EE3DF8477,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T05:34:07.893Z,Confirmed,REP,IN,0.000000000000876551,,0ABDB92D8ED2716B1AE9A3279254C7B630091E4705543AFC00A194845D401B66,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T03:18:06.926Z,Confirmed,REP,IN,0.000000000000059404,,372F0CD3CEADFEF0DDBA4F3556A794733B12D2A648306B2F8DA7F0C323513550,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T20:15:31.817Z,Confirmed,REP,IN,0.000000000002024801,,8EA13A12647D1068FD4ABF83BFBDD9EE3779C7DC1062D57A8B52256600333778,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T18:14:10.456Z,Confirmed,REP,IN,0.000000000004360037,,073383AA23584479ED37A7BD5A8719469F6312EFA62E84E719E960636285DD1F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T13:55:58.853Z,Confirmed,REP,IN,0.00000000000025582,,774F532A3F59516ECDC13A8F57D2C8C05083FAC4B4BC9733CB050B36BD399911,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T08:39:49.110Z,Confirmed,REP,IN,0.000000000001808812,,1F3061C4B46D4142D355B79111004C4B942F982B7E51DB115DBD631FA9821665,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T07:45:10.572Z,Confirmed,REP,IN,0.000000000001295254,,6D82858295A77A8E8A50E5084873B6362356F421CE284B37B80FECA70C109E94,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T07:37:56.014Z,Confirmed,REP,OUT,0.000000000000106626,,9CD5DA44C0F6F4901E7993A08A253275A639FD136106B8531EB1C66A55C9D390,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T07:35:25.785Z,Confirmed,REP,IN,0.000000000003481843,,7674FE1E228F63D0EFDACC4469F646699EF4C91860896D580F7ADECA1AECFF7C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T02:31:46.053Z,Confirmed,REP,OUT,0.000000000003109267,,884EC2ED5878B9EA67A7854FE55F8817E4F4272C8F7AC75FFC466E2D19690700,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T23:50:59.226Z,Confirmed,REP,IN,0.000000000000038051,,9904E0A319C0B31443B6CD183816FAA4A536A7C870D3B274ED6DB006F209A7B9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T19:55:18.290Z,Confirmed,REP,IN,0.000000000000077608,,29AA977FD455C43038F7533B35C96AC9ED3598EAF2CE069F8D48D06B5DF41906,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T16:53:16.291Z,Confirmed,REP,IN,0.000000000000950875,,70A7A912EA8D6796B90CF87228225A13C2AE00405D483EDE8406222DFD3D584B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T14:51:20.622Z,Confirmed,REP,OUT,0.000000000001710535,,65E0041CC6857DA1F25332BF5A3BF01AD6661E6DB1219E435940A9FF8C18B1D7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T06:28:08.441Z,Confirmed,REP,IN,0.000000000000120313,,4A6653163BE3CBC13AC2E48F0354B2584CC114CCD3A5BAE78EED3839C3645D5D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T21:44:42.085Z,Confirmed,REP,IN,0.000000000000217632,,E20FA309AA3D55BA2F07E9946DFB75F2DDC5BF593784D908FDEA62B3761BB6CC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T20:21:00.729Z,Confirmed,REP,OUT,0.000000000000607043,,23605549FE62F7F606D3E884B0DC969DE0C15057F58A5E3F7F22ACDEEA9E1A94,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T18:28:16.506Z,Confirmed,REP,OUT,0.000000000000528887,,EF9E3FCAEA015D225B53E401D214CD1275562240C33718C189E98FB9BC3D150C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T18:05:25.586Z,Confirmed,REP,IN,0.000000000002049028,,F2513A69A98B4E80A4922CD6505F6F1C19DA46C2B4BA5AE0CFC5141C4DF1A084,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T18:05:24.788Z,Confirmed,REP,IN,0.000000000004431623,,427ADB1159B96D94B574C5A47EC93AB7BCBC63A50B67692536A7B4E97B853A65,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T14:12:51.810Z,Confirmed,REP,IN,0.000000000003099549,,9DE0DA05CD30266593F792DD4694A37BF7973DBB89B7090BA11AE8C97E52BFE5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T08:15:56.096Z,Confirmed,REP,IN,0.000000000001098974,,3D07F31200AFF7F3F4D904B5BDC91F163E6FB1B0EA1FF623F33286F63C82F0F6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T21:47:48.371Z,Confirmed,REP,IN,0.000000000004177856,,5CA8E1E8ED641AC39DB970DA8D8E377DCFD5031405F5CC9FAB862DB5AF76BDB8,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T17:23:20.405Z,Confirmed,REP,IN,0.00000000000801845,,922942CF8E3EA5FB68E67A45646E47C524DDC70248DD9E80E9C014EF34C34389,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T14:24:55.405Z,Confirmed,REP,IN,0.000000000002371918,,3EBBCE6030C176E62276DE7F4498A8406E8556F724B612F610D553294F191805,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T14:07:51.695Z,Confirmed,REP,IN,0.000000000002212869,,07EB53CB708295398889C2EE3D052B26D691C66388B32A258BF38A11D06DF1C6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T14:03:40.920Z,Confirmed,REP,IN,0.000000000000317551,,A5A6CB42D343975270ACCD85053AD4B439DE7F9DC828660F376FC33364819886,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T20:05:07.628Z,Confirmed,REP,IN,0.000000000000001231,,696AB0F913C864CE7264147BD572C7751B9B72CC4B559BB468F8C55E3D77CCEF,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T17:22:13.650Z,Confirmed,REP,IN,0.000000000005674865,,3A9AEBC4178C4E02D0245B2DB7FF6BD63D953EFEC5B9956D3845DE9C518FA4B1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T16:43:26.332Z,Confirmed,REP,OUT,0.000000000005164319,,CC61F2FE89ABCEE5D724A35007AEE8584153FD116BEA42FAF13A037E33ADBA8A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T09:44:41.239Z,Confirmed,REP,IN,0.00000000000000219,,56C533DDA18899C5AED1E2762C3EA029CF4D50875CC906336AA3CE784B05D25C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T09:38:09.329Z,Confirmed,REP,OUT,0.000000000000105941,,E6144EF3F7881E1DDCD59BEE48D2C3610BEC2DCEF72AFF679EFC1C04F8BFC1DA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T06:26:42.609Z,Confirmed,REP,IN,0.000000000002179745,,D8E13E45B2D3D2C9DF22758E52086E2FAEB9BB71BE301ABD9900C817B8E58591,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T05:44:18.755Z,Confirmed,REP,IN,0.000000000001064482,,56A34FBE153823B7128956CE11E42DD2232F52B74144B63972E5657651B3E101,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T22:04:13.037Z,Confirmed,REP,IN,0.000000000005647901,,0442A68876BC7C3F3BE8DBB2CEEED3CB4ADA8202957C6C9E1D57080EAC57FABC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T15:40:57.041Z,Confirmed,REP,IN,0.00000000000529832,,1DC8A698BE21CA1D940BCAD8B5EA4BFADCC61A1AEF8666E495F55F1F148E4D97,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T14:32:02.961Z,Confirmed,REP,IN,0.00000000000102205,,1B9BF0DFD9174927606DD071EE8F3DE642B8871FC10D9B8E49032930F89D3DF2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T14:30:47.734Z,Confirmed,REP,OUT,0.000000000003741907,,B51874AE89C6654600986FD750EC87955DDFF2C47EF195DB64BB128A3A87F15E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T06:47:06.537Z,Confirmed,REP,IN,0.00000000000048714,,242C1F3B9652D2E8037A71269C277F0EA0EEABB4EA92AB05D4E9EADFDDD20A45,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T05:42:06.777Z,Confirmed,REP,OUT,0.000000000002433649,,2E4FA11DEDC66F34D278DB039F8A81CC04F747AF8550BA6075423899FE83E543,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T19:35:45.658Z,Confirmed,REP,IN,0.000000000000662888,,872A46F825B57E387E859EE532F0DD2C96E1A203D52659547FCD06F3390FE835,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T18:45:53.724Z,Confirmed,REP,IN,0.000000000000847123,,6345480DC5B5514140C98FCC963FDE2ED758A5D5D4E4D3C109095916EB7BA26C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T16:08:05.705Z,Confirmed,REP,IN,0.000000000006892237,,BC7E90A3EDA970CF08E45B3DA53FB05C39BF8E08678BD31BA7CE797D3E9D8B79,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T13:07:07.616Z,Confirmed,REP,IN,0.00000000000157448,,02F5905A4209E33BB878CA5CF455EE23389E3A47CACF1EEDD1DEAA4F9C757635,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T11:51:58.013Z,Confirmed,REP,IN,0.000000000000001368,,413F82A4F2A6E023BC4D5BB36DC36005329C01103E63860E9146A66DA8F81457,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T11:21:52.307Z,Confirmed,REP,OUT,0.000000000002612135,,B3E6DBBF10934267238D876A40463E04B1BD38D8132FAAC4E7711AA4AC99FC54,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T07:48:57.232Z,Confirmed,REP,IN,0.000000000000375449,,AD6BAE1F48582128739D0CB12D97359EDA4DAAE7040093088D2B535CA98DCA34,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T07:14:35.618Z,Confirmed,REP,OUT,0.000000000006935764,,C074A3C0564F8806755E884D79673B14D0A8163586EC84345DFE17183BC690A3,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T06:03:00.974Z,Confirmed,REP,IN,0.000000000000072817,,8984EDEA489F1F331DEDB5694096ECBAC28728E3CC16A8E14C9544422CF81AD7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T04:57:22.068Z,Confirmed,REP,OUT,0.000000000006936448,,DE8098DA94227DE89C7B3C4D5F23FD3BDDA6645DA95BC7F8A213846875668C05,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T04:14:11.636Z,Confirmed,REP,OUT,0.000000000000034766,,C7BAB77B26BD3CE93364C1E0E5405808471FD038718A65070846A2623E11F123,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T18:08:00.579Z,Confirmed,REP,IN,0.000000000009370645,,BF4C209E4DB5042091C10440CAB7242DDE138804A3FAED82142DB0FF6F9D5276,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T17:30:45.121Z,Confirmed,REP,IN,0.000000000000273477,,AF3BFFC8C4DD43A43AAFB331FE068C0F9A6FED56E594F545AF0F27271A7E1930,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T17:25:13.228Z,Confirmed,REP,IN,0.000000000000486045,,BCAE41ADA4D7A83F650537ACE6E13735011F96C5D7BF36591695D83842C1D940,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T16:51:31.423Z,Confirmed,REP,IN,0.000000000000006843,,61287F87525FDE15B5A075BABB9B2560FE308DDBC670142C2B26DBE714C6D898,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T07:51:58.001Z,Confirmed,REP,OUT,0.000000000000050917,,E10AEBAB5AAE660F2DB06AAB516031366E90C4729D93F0CBA39D87F2CF8EBD17,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T00:49:12.316Z,Confirmed,REP,IN,0.000000000000229403,,EA741770E8114488E96EA309B41DB03BFDF0F4460AB40DB61AAE90F61CA49036,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T21:56:18.929Z,Confirmed,REP,OUT,0.000000000000191352,,D667F68AFA0A51CB42395600801A8347A7F3D656D132EF61328E10B581FCDA92,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T20:01:58.922Z,Confirmed,REP,OUT,0.000000000002782956,,AB803935A09193B1DEBBD4E742343E5C524815D7FE73370DEA72B6A1DCCAEBA5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T17:21:24.915Z,Confirmed,REP,IN,0.000000000000003832,,EAA8D408172154F0AC3C3F7D5B7EDB12F8A9B93940161E489B3ACA6E799E0F8E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T15:11:41.865Z,Confirmed,REP,IN,0.000000000000264717,,C692AFF4D8CF321EF163E0937C8C3C6FA724B7686213024B5D9220162E497881,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T06:13:07.885Z,Confirmed,REP,IN,0.000000000004559465,,15C7A2F625505F6CEA8DC6631483D6E7DB06D14BB634464D1A8EF0AEA624A1DC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T06:00:23.528Z,Confirmed,REP,IN,0.000000000001692467,,34CED3E44275AACC4672DB9B7F9D6884C4124FBE97D378666B6B77E5C8D132AB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T02:55:03.613Z,Confirmed,REP,IN,0.00000000000091515,,2D50525206C38A0967C435FD4454E6908B624C8035A0DE21DE1827A224D832E9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-23T02:43:45.579Z,Confirmed,REP,OUT,0.000000000000447309,,04FD32A40A2F33607CAB88436458847902256E4ED5420E3C0714B3D56BB90C15,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T23:42:07.827Z,Confirmed,REP,IN,0.000000000003232045,,CFB8D7A57B2EDFDED1B73AF5A45AE146ADFF1B99B5694BA3ACC16BD34ABE989C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T23:36:37.266Z,Confirmed,REP,IN,0.000000000004275174,,4506132210805B32E4074C6F718C61A173476419F291FC293DA9033B671B4694,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T23:09:09.093Z,Confirmed,REP,OUT,0.000000000001690825,,4ABCFF96BCDDEFE34628A9065B36FAD66EEBB2BE09248F0D4ED25F34012E969C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T20:03:45.432Z,Confirmed,REP,IN,0.000000000000146867,,27CDA4A32EF363321479D70802AAF8740DCE3550CF9D21A35B74FD27D61E49F6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T19:58:33.690Z,Confirmed,REP,IN,0.000000000003668952,,61066677D3DED180C58B100BE68A7034C635C3E8FAFD976349F47FE902A09BE2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T11:49:44.474Z,Confirmed,REP,IN,0.000000000003334702,,27E3FECE2683E2F3E46F3929B029F4CECE15C29C5260678EE26690D29F07C64B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-22T09:29:46.241Z,Confirmed,REP,IN,0.000000000000613339,,9B0FF00A98FF71CFBD5C3EEE20425A3B1E5D2F2FB8C349F8B8305E31ABB8DBBC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T20:29:06.248Z,Confirmed,REP,IN,0.000000000002356041,,48A8252C0B5E20534D7EDF66A86B7E0522A9DB0861386077CE28734464811EFF,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T18:35:59.568Z,Confirmed,REP,IN,0.000000000000103751,,2D7366B657A91635E95EB56B317FF4B683C779D6C5D66E56D8A3C19615579E22,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T18:27:55.172Z,Confirmed,REP,OUT,0.000000000000530393,,B12DCB47DFAE21127C1DBA6D9697987C740B8EC4B3BDF17722FD9247A43A466B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T18:19:58.012Z,Confirmed,REP,IN,0.00000000000002012,,97A5F54A73766D1974CF073F7DCF8E43B660023128703B15BD85A097C638F837,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T07:45:39.904Z,Confirmed,REP,OUT,0.000000000002706168,,ECFE2A1AA48982368C1DA98E1B04FCE7EB704D1F37093D8300F5464F504FB9B2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T07:06:46.750Z,Confirmed,REP,IN,0.000000000000497679,,7D460F9A5C80044CBF5BFB8130125505ECEA78D6BC7D4E4997B8CC70F34B3C3F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T04:52:28.785Z,Confirmed,REP,IN,0.000000000000363268,,24A2462FFAEFB65EBBDF7D9C287B95D2BE2034E12755F054CFCEF6E190C37D16,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T02:18:49.895Z,Confirmed,REP,OUT,0.000000000002452127,,1F6441AA5E2079E2A6288FF6C0C6488F9A254611877C6B9BD18FE98588B5C108,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-21T00:19:38.783Z,Confirmed,REP,IN,0.000000000000068164,,AAD44489949DA8DEB7CAAEE705CDD1D5B5F5EF3A5FA230ED77E624A187020D26,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T22:35:31.706Z,Confirmed,REP,OUT,0.000000000003991979,,3B5E19D35EB48FE91CA05643BB29921BE676D624E29835776871F76D8CE60DF5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T21:48:10.143Z,Confirmed,REP,IN,0.000000000000111416,,440DBC13EC0070442345597C3D0C5752C0395A1F930021A6B255959E93390890,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T18:38:09.182Z,Confirmed,REP,IN,0.000000000000146593,,9C4B59E9D7838FB2AAE6C42469DD2A9BF547AAE9A86A19D2C27416DEB1F7CA73,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T07:59:13.160Z,Confirmed,REP,OUT,0.000000000000217084,,F7B394211EAB0925C09C782EF17EA72223C246AEEB1CE37CE45DDBAB22498CAB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T04:13:10.770Z,Confirmed,REP,IN,0.000000000004817886,,3E897B8E56F2AF809E7AB28BB77EBEF5C21C33D519591CEC824F47BEF26ECD67,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-20T02:57:53.052Z,Confirmed,REP,IN,0.000000000006909757,,085C3DF550D83BEEB711007EE9D08297D30EEE19F972E517573428C72D0F382B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-19T22:03:05.792Z,Confirmed,REP,IN,0.0000000000001945,,DDA99D3F29BDEA5CA5FEDB25FD997B10711F28B80329446298EB92D07CC13476,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-19T14:05:28.280Z,Confirmed,REP,IN,0.000000000002707537,,925C4BADAD0FB4FCDD5F09F81B4CAEA06EA9D95D7482ED65B36B6AA1E241647D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-19T01:31:53.235Z,Confirmed,REP,IN,0.000000000000038872,,FD472BD2B249948903FC2D4AA1FC6305A946B9E5C29F0180847019DBDF4C52DD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-18T20:53:24.493Z,Confirmed,REP,OUT,0.000000000006971351,,C297B8A52C4948961BD926F82BFAF69E87E7971EF679F8830CA83CF1135D2BF5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-18T19:25:26.098Z,Confirmed,REP,IN,0.000000000000374902,,40FF3A856C19D2B7775E1C31F4C086574EE7005D9936A09F65F9C2826384B865,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-18T02:57:56.779Z,Confirmed,REP,OUT,0.0000000000033707,,24E4A1566624DDA1C115ADFA0073D19759DED619EA93FC1FA991ED4BED026C5A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-17T23:15:29.977Z,Confirmed,REP,IN,0.000000000003998275,,E35D1F59B28E5EB7D19711207F831DE4BF459362EAC9EA539C0E6ABB67329838,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-17T21:00:55.780Z,Confirmed,REP,IN,0.000000000000038598,,915B1A8D1B04F747029CD285BA7BBCAEAFAF78C7B31D5675D669DC89C95420B5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-17T15:23:07.080Z,Confirmed,REP,IN,0.000000000000794426,,0577B58F8216117CA33E3AE295FD29B1BD622A0902D9BA7C24759A53115BC9DD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-17T13:16:44.462Z,Confirmed,REP,IN,0.000000000002361789,,D595F79B5FFE2D2682C0F9AF9CC70828F88F1142E6CD45E07443800A3582F26D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-17T08:38:25.585Z,Confirmed,REP,IN,0.000000000005425067,,89E39315CBD3CDC8B8620546B111D1362C5AC26CFCE267E1B0152C91D25E8884,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-17T08:00:23.475Z,Confirmed,REP,IN,0.000000000000065152,,EB2F98E6B2CC5BC207B0FD15EC2883E8CC4620C19B69123609855EF2CAFEE2FC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-17T04:28:14.151Z,Confirmed,REP,IN,0.000000000000201207,,F51D71AAC9F2ABC10BCFD8B7C3BA462A3A3A8B8E0DAAAED0B01AA50389E000DA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-17T03:52:11.372Z,Confirmed,REP,IN,0.000000000001033137,,A00FDB2E2A5A931D577B8DBFCC65790360C6DCD193B2B0B59308A30652FE135D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-16T19:44:48.394Z,Confirmed,REP,IN,0.000000000000952244,,33DBF3B63B87B47A3DAD04FBC80E9C852678C5028DF3DBE6AC2A54E06744580A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-16T17:14:09.915Z,Confirmed,REP,IN,0.000000000000637977,,90F73B4E0D1682B88BECAFDC698CAE223421EA4D4409B69E91A4B7B67F629CD6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-16T15:45:12.929Z,Confirmed,REP,IN,0.000000000000019846,,1011AE0D9AE4AE9F094018E4423A30E6DDCE9E55DD45B4C0B092E70836C9908C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-16T12:58:39.651Z,Confirmed,REP,IN,0.000000000004930261,,6B250D46D5A30BB5415636A4C650C970676B95B9A3D062E75197085E15F34A3F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-16T04:53:55.778Z,Confirmed,REP,IN,0.000000000006190339,,BC85C279B2AA267DDB4D1A873C15432E108F9E4AEDE006973400185691061B02,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-16T04:51:13.795Z,Confirmed,REP,IN,0.0000000000004083,,62ECEBCC165D336D9FF8FF78A1A8A2257FA78F10D7119605A83F23BB9A09D243,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-16T03:27:45.868Z,Confirmed,REP,OUT,0.000000000002619663,,E3413B4526DB051232A3E1A412C8512192A1F68DE40531790379B9814553F28F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-16T00:33:24.186Z,Confirmed,REP,OUT,0.000000000002931603,,4128F11730FCA3EC8EA2E23D5B6C1AD00567610B68AD79A59E1CCDB3B5500AC6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-16T00:32:22.336Z,Confirmed,REP,OUT,0.000000000000122093,,C5B90B74B3D7A6CE1FC11F948DFFC3FC6E8D77354209C026FE27D9F7A020038B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-15T23:41:49.930Z,Confirmed,REP,IN,0.000000000003158269,,D6B4F0F41290EF422682239D6F61B16B1302E9B697689F3B4867E62BBE61AFC5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-15T22:41:02.881Z,Confirmed,REP,IN,0.000000000000122229,,9E2DE8E2AEEDE3410046829789A91F250AEA9165C9DA1EBE126D1C5A3313A3B4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-15T21:40:46.011Z,Confirmed,REP,IN,0.000000000004643781,,C7852B9550A657BA86964B239AA6869C535B540DDDA1A1387BD6A2560B21A9D0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-15T18:03:16.618Z,Confirmed,REP,IN,0.000000000001331526,,A5BE4B4209DC0499AA474823A4D8767C1D221C418769F337391A5D69FDAABAAC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-15T17:23:15.263Z,Confirmed,REP,OUT,0.000000000002245719,,C57B11A9DDC2ED84B57A53FA8FC876743397A156194BE18AAA4BAAF1FCD93859,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-15T16:39:58.269Z,Confirmed,REP,IN,0.000000000000350401,,F54923881D203CBF72FDF7527DC6D6F0025D80B8464420840925B8D2E25D6C9E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-15T02:23:10.385Z,Confirmed,REP,IN,0.000000000000181497,,6DE4872FE03D42DA771E5D43831A5B96B461C2A177B3B059EC11C627733E3F33,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-15T00:29:37.862Z,Confirmed,REP,OUT,0.00000000000059185,,157BDDE5A13785BDC1B5F008E554EFF07381EAEDBD780A73AF0B918A0BC943AA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-15T00:09:56.677Z,Confirmed,REP,IN,0.000000000004257654,,4482B059D191B233B0D25CE480A5E487C6F87C1E6E6EC4B0D077819CC932B068,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T15:26:40.008Z,Confirmed,AOA,IN,0.000000000000095676,,DBE92D1120D786AB70BA681EAB629464A270D543FFE51F193DC1801B961B9BDD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T13:13:15.772Z,Confirmed,AOA,IN,0.000000000000689305,,C8658D2098EF6DF69EC8C7F1A530009EBFBB6E5ECE7145AC781733D3DEB7AC3F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T22:44:37.748Z,Confirmed,AOA,IN,0.00000000000098263,,A88844E4E75D3038BDC5EB4D9766509E652E2FBD3623BC634A29314CF4D5D58B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T21:27:48.671Z,Confirmed,AOA,IN,0.000000000005297773,,FA6FC0C0420095F4F61D5AFE8C17FBCE9754969DC083B07DC07D374CC908DC8A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T20:19:37.878Z,Confirmed,AOA,IN,0.000000000000082536,,BE16311E9076592A950C5788CF1F09587D0413EAE295F06073E757D48E5E4F99,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T19:54:16.631Z,Confirmed,AOA,OUT,0.000000000000195869,,B7943F556ABE5E1DF93F8082601F1D8619C808CC3BFA03E0C98531631A3EA9ED,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T15:17:14.404Z,Confirmed,AOA,IN,0.000000000000309475,,01C98C4FD67C1D8B2D9885A725DBA51C023E7660D6CFD9FED6FC08A7E6985F9E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T15:11:49.482Z,Confirmed,AOA,IN,0.000000000000770473,,B6368866242E1C2777E016DBB88314470F56E79595035C7718AEB79C280A7D33,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T14:45:59.315Z,Confirmed,AOA,IN,0.000000000002127732,,7A64B6DCC53A6E71415337BED581B6533BD58FA20D1DDF7C09E0302AFF20EB57,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T13:16:20.988Z,Confirmed,AOA,IN,0.000000000003719048,,EF8C619C0FEA085972176614E304E562A9520FD57BEF678F04FD4438A61E2317,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T10:42:01.678Z,Confirmed,AOA,OUT,0.000000000000269781,,515510459087C745DAFDAD14B8C82FAA37E77BB2FFBDA0200D7153DEF4A69849,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T08:12:19.787Z,Confirmed,AOA,IN,0.000000000000103751,,A4FA0132422029620425A6ADEA793995370C8A7BA25D345FD66B0C7ADBE6B5BA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T07:04:28.670Z,Confirmed,AOA,IN,0.000000000000569402,,5CA8D94C26CE1B55A4870C0C91A9B649454A739F2498D2C7A80E23DD25DA64B2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T16:59:20.050Z,Confirmed,AOA,IN,0.000000000000457712,,5D08D4D93D8A842238A2582958B2C88833AF84537B48F054E8EB1ECBBE97D780,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T16:59:02.649Z,Confirmed,AOA,IN,0.000000000000449499,,ECAB98E3866E91F2D850388946EAA3D2A472151CC88073193B525DF963D40584,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T16:52:21.333Z,Confirmed,AOA,IN,0.000000000001585704,,EFB161C2307323649C322FDFF8D22CFBEFB2F2DE09F0A2F8BFE521373E140E73,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T15:54:00.748Z,Confirmed,AOA,IN,0.000000000001470044,,0E8D5899EC84F18610D5F0F1BE2D2267D18EE5D8F7425DA0623C35DF44655611,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T15:53:11.433Z,Confirmed,AOA,IN,0.000000000001102807,,4D2C4DB3E1274A5D22F9E91AB3F3FAEFD93816A5B24223A0E4B167AF5CABB77A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T15:51:40.756Z,Confirmed,AOA,OUT,0.000000000000543259,,FB4B682AFDE765A2FC6F8B6DF0000E97A5A73AB38E1339759636898078239AD0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T09:23:31.714Z,Confirmed,AOA,IN,0.000000000001507959,,1B6FC9458EF4597B99DABE0D8B1FC4DE99C88900741D5740590CA41A0C888EF0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T05:24:19.896Z,Confirmed,AOA,OUT,0.000000000002521523,,9B42D6022625CADA09A68599EF3384B485319F2F6A1A2B355638454E4722176C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T04:17:57.871Z,Confirmed,AOA,IN,0.000000000002173448,,5AF967F18162332C8289E017DA87CBE58AB6977BDDE9CFE4003A72F10D99673E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T03:16:22.913Z,Confirmed,AOA,IN,0.000000000000030386,,3021A19001729F34F96A4D2B6E2C00C9E1D642469B7E9C5057DFA77AFDE5544E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T20:09:22.252Z,Confirmed,AOA,IN,0.000000000002657714,,1A52B863B05D98F8C3C165F1667591CB2259B1B6DCCCDEABC97F9CA12E3B9127,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T17:08:27.440Z,Confirmed,AOA,IN,0.000000000000788814,,6CBDDA35BF12304FC8462798674E341495B53BF46EB9B42634063503248456A7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T11:49:36.115Z,Confirmed,AOA,IN,0.000000000000634555,,4E66AB2295E861D095CE5D1D3EE9674E14526574261ECB39D97FDB3DF4401ACF,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T07:53:09.347Z,Confirmed,AOA,IN,0.000000000001986202,,9F14EECBCFF62CB110F9E9EF61E9F04729A428BC3BD2DA4EE7F39E5A191D3712,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T02:06:44.316Z,Confirmed,AOA,IN,0.000000000000885174,,7936D24C5967DEA334A30568AE5D9010094D574E7F8D53F14443391A7A320BCD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T06:02:57.541Z,Confirmed,AOA,OUT,0.000000000000036545,,150FFFBD9068F70B9238DF18B793B9AEBAC3E5769E2D3293ADF354EBA876F525,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T04:47:27.163Z,Confirmed,AOA,IN,0.000000000001144417,,1B8D9C31088ED0A6C78B4E30D29DAFC59FA5A320E3FEC3F9582EB4088130D5F1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T23:30:27.637Z,Confirmed,AOA,IN,0.00000000000437961,,D44E0244E858771A1006823EA63D986E934ED620E87FB33D4AB0EF359FBB98ED,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T22:53:21.354Z,Confirmed,AOA,OUT,0.000000000000794426,,E96CE0560D1FFFB9FC607987DC579C9A22003AD8CAA2FF1B1F9DDE7D1C517900,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T16:27:08.829Z,Confirmed,AOA,IN,0.000000000005796274,,B55A50AE5B5C27EED508DDCA96F6775B3754B3289B689D6745FAAB902D990C72,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T04:27:04.736Z,Confirmed,AOA,IN,0.000000000000126336,,AFD2B223875B3D4D3FF0205A3E3C1CD4F93956C4879C0CF28DE70EA3C5E9DA57,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T03:19:26.148Z,Confirmed,AOA,OUT,0.000000000000147962,,3CD9A04E453E5DB9080A1AA89BF0AB29E971A23C849680B28986D35EA3642C92,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T02:05:08.529Z,Confirmed,AOA,IN,0.000000000000778822,,B87EB3BB5FC5132D64EFD9D1F62D7D5D4B53B7EE89F81A852FAAB1A5376AA573,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T21:40:25.700Z,Confirmed,AOA,IN,0.000000000001000424,,FDACE7225C9CE9B75DB2237A4AC8200FCF213265F82C643FC25FDF8F09BB638B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T17:21:33.508Z,Confirmed,AOA,OUT,0.000000000003341408,,C6009908C4D95CC03B898C0C38E36D09C45E95DD8ACC97341CABB360923A6ACA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T17:09:30.492Z,Confirmed,AOA,IN,0.000000000005100945,,9257E28F5A9F4801B698DB0630D29DBCBBD6DC1582177760450CFB7F4750A51B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T15:36:14.825Z,Confirmed,AOA,OUT,0.00000000000025363,,78F0025C1E55B8C88D694CF2C6D93BFDB234EB82504D9577C230551D3D978F3F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T10:21:59.802Z,Confirmed,AOA,OUT,0.000000000003163196,,1E81E200166EDFB340621321BA0CFD8DBBBBFFB4264C36B13D5D6D739860A5EA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T08:22:14.522Z,Confirmed,AOA,OUT,0.000000000000921583,,3892257885DBF7D6B65667756BE956119CC3306E8A6978A708502B9086BFBE3B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T08:02:48.283Z,Confirmed,AOA,OUT,0.000000000000515884,,F5216AF80032C6A24C0572154BF21430684F8161933089A7D79A81EFE3856062,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T07:51:38.010Z,Confirmed,AOA,IN,0.000000000000427052,,BB6A8EA3B683C2F3C0F86F1284B5DC536D7DB3022933F0026C96D644AB0E8A9D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T01:37:41.384Z,Confirmed,AOA,IN,0.000000000000109089,,27D486292DAD9A9D2B3B25C4BAB39B14EE2217F5F6B321230C58E2294A029B2A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T01:03:31.682Z,Confirmed,AOA,IN,0.000000000003401086,,645C9AEA9E12687CF480FA8A939E46CF8FB1599595388F649ABD035D4F58DE4B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T21:38:04.612Z,Confirmed,AOA,OUT,0.000000000000592945,,434F57BA3E2390C705EB29618610844A05A457DD7CC69A8AB04CCE8F10851F73,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T19:47:46.263Z,Confirmed,AOA,OUT,0.000000000003916971,,DB117EC955AF0F8B487264D988580D71FABD5D5FAEF564D980A0D9023BF76FC5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T11:55:11.889Z,Confirmed,AOA,IN,0.000000000001275133,,20F2F0019764D68C1078EEAAEE3C715628575DA067DCD80C182AC0032B2BD150,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T11:32:21.628Z,Confirmed,AOA,IN,0.000000000001509328,,E5DBC2B2DFE1329F42ACA7DD59D53D2F17AE53B0C129318B01ECAD276C72791C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T10:25:31.188Z,Confirmed,AOA,IN,0.000000000000117439,,69093C7D6E74653B9E585C15F96D876C8C18A9735B8C87A1746774D2A7976950,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T04:02:26.640Z,Confirmed,AOA,IN,0.000000000000127978,,287D30FB6608101BB0673D6BA42696AEF8124D8BA81F33BAF2B85194F65BAD4A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T03:41:38.936Z,Confirmed,AOA,IN,0.000000000000055297,,4E89C8923E63DC3B52071BB7B14B9054682535D285F4BF394D296F5B2898C842,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T01:54:55.499Z,Confirmed,AOA,IN,0.000000000004232332,,07C508136050FCBA1E989A7FAFF739A3AEFCEA652A4E56F89D80A402E76B80AA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T01:17:22.932Z,Confirmed,AOA,IN,0.000000000000857936,,6C5D1AFE028815F4D01ABF04BBC5FC42E8DC2C07890BE71F05A8B31AED09E9EA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T00:54:50.253Z,Confirmed,AOA,OUT,0.000000000000940883,,4B48E5137F542EC7AC989DD7421DF2FB900196A44C110E9932A0FF2080D9D9FD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T22:10:17.924Z,Confirmed,AOA,IN,0.00000000000024268,,5B0D66981F0F749E22321F9461AE661A911CF9C735DDB348EE1BC2F5DFF0F744,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T21:46:46.503Z,Confirmed,AOA,IN,0.000000000002310187,,047B5D49726DBAC30AEE8428994C775212DF5223BE118529EFA320970A2D2AF5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T18:01:40.258Z,Confirmed,AOA,IN,0.000000000001363966,,F0AA8319BB25F0CFC09B57715196E45147632747E3F7E2B6CE282FE282D0C555,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T17:47:28.612Z,Confirmed,AOA,IN,0.00000000000020326,,2661CEAFDC0B0AC86BD9C6A4C7EE0CAE2F02F1191F6548C77BCA260A115920EF,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T13:35:13.178Z,Confirmed,AOA,OUT,0.000000000000714217,,E1B1954C935D1E48D237EE0E9FFB670023AA22161DF9FFD17A9F4EAB2CC936F0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T04:28:41.361Z,Confirmed,AOA,OUT,0.000000000002224092,,E3D1F149C5671438BFB9A780F1ACE889CF90C3D32D7BA287FF10E8A69A7A75FE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T01:50:46.316Z,Confirmed,AOA,OUT,0.000000000002427626,,44115EF13E4429632D5C387D445C8ECA602A4EFB5CF37568F1FBEABD57A09E8B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T22:17:36.659Z,Confirmed,AOA,IN,0.000000000005035519,,F6F5C0CA3E82BF37DC6D0316CB60AEF4152E981CAC18EDCE7B717DD9CCC54302,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T21:04:25.950Z,Confirmed,AOA,IN,0.000000000006312432,,96D5E3E8BDB1B868EED672C94701EAD54EE45435D5F9BA5BAE3B6784D107152D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T17:34:24.873Z,Confirmed,AOA,IN,0.000000000008106051,,D0C0DB8009F5774602821CA53ED59E35CC5E3D4715977D966849B478B45AA378,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T15:22:03.245Z,Confirmed,AOA,IN,0.000000000000368195,,795A88C9C4AF4FCD2313F3FBE3050BD50EEE40948C3BF45D9273D7E6F8C6FE63,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T10:35:00.317Z,Confirmed,AOA,IN,0.000000000007671197,,A4F362BAE2442E44A64615E31E031910E8F55C122E2CA30B4D8CD576FDF222F6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T08:23:43.636Z,Confirmed,AOA,IN,0.000000000000234741,,2E0C306F665A8AC944210FC9F5DB19F54E823B4573343F79E81CC2C1B28E6B5D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T08:21:30.724Z,Confirmed,AOA,IN,0.000000000000676576,,DF5A9EF16732BD37F49F702184002FB86FA0477CBF9E6293FF8C5A345F24E6AE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T08:20:28.496Z,Confirmed,AOA,IN,0.000000000000134411,,55FF84DBE74C4C4E1FF503976209FE858D5E1E006220C4BCB6217E241BE99D7C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T06:15:56.146Z,Confirmed,AOA,OUT,0.00000000000023173,,AB3294BECFF8A510DC356EE7190F9E40EA63E51A8CEBD10BC95A2A71C4461AEC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T05:32:23.418Z,Confirmed,AOA,IN,0.000000000000362309,,4DF9D56589EC2FBDB5B9967D51F172FCCFA87A1A51C2748DCBC0865068DAB2D3,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T22:31:13.450Z,Confirmed,AOA,OUT,0.000000000000342326,,E2396FFD7C92C19C2DE8EC7CDBA1CC973023A52C31AC8E00039035617AB9DB05,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T16:08:00.774Z,Confirmed,AOA,IN,0.000000000000759112,,65096137BFFC3BE104734976E86A755CB6977999C59B455521909E30A7D11076,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T12:17:16.071Z,Confirmed,AOA,IN,0.000000000000912276,,D43BE253EA314FBBB9C37BCA1CD5DD58F1B4B4BC1F25664193177A578DC5899D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T12:14:37.659Z,Confirmed,AOA,IN,0.000000000002356725,,73CE3FE77B7F9D89A38851F449FD42154A5780640EA2C3A154EEA180EC245400,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T11:07:15.588Z,Confirmed,AOA,OUT,0.000000000001409956,,9872ADC8CEB43BB73210F798474708A40327E1D3FC7692D8CCEC4EC75226102F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T07:38:15.310Z,Confirmed,AOA,IN,0.000000000005807087,,A61D1A1898E8BE5BB3FF8C8807C469EA725755AC469FCC48DA272D5380837F46,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T02:58:04.161Z,Confirmed,AOA,OUT,0.000000000001844673,,035C16C2E58A070237ECD6781196FE2D74B4955928EC8B82613D0703A20B4370,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T01:41:07.430Z,Confirmed,AOA,IN,0.00000000000016644,,DD5C086B884B6FE1A6149AF4C371DB53E201F29D72BBD0002C5434E0B2B64EB7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T14:11:45.260Z,Confirmed,AOA,OUT,0.000000000000716133,,E7FC15A79BAB7AF699F506D087B9384FD095A7BFFBF6116289702DB55354BCA9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T13:55:07.663Z,Confirmed,AOA,IN,0.000000000005756717,,DD9C10DCD6C9EE639F443505350C8848D9984B02BC749D2121C9AA8BC2B1D9E9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T05:47:51.391Z,Confirmed,AOA,IN,0.000000000001769254,,8D1AE4D7F3A5E388CF661D7D9D8B6B8A0664B93899F7CE2992BB336A6CD4FBE2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T01:29:55.575Z,Confirmed,AOA,IN,0.000000000002243939,,9DD9AE9902137F78AFD681014E3C550790E43003A788D8C38A5448A138FBE86C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T00:33:49.365Z,Confirmed,AOA,IN,0.0000000000000438,,F31A029F7022CF78F98B44753CCA28A6EE416D82293D4A732539785247B67BFF,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T00:32:55.537Z,Confirmed,AOA,IN,0.000000000005831725,,CB196BA92D3ACBC667C1B4B0D293FE380CCC877522A877BF128A6913D2FE03BD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T00:19:02.557Z,Confirmed,AOA,OUT,0.000000000000515473,,AEE2C46DB6215DEA5A7955047B30442DF48CF795018B379E399A6FE6325E15F4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T07:59:31.229Z,Confirmed,AOA,OUT,0.000000000000127294,,E346EB32CA46639366F03093EA4BE41034AB761E5A77A2D52A1D1322A9112108,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T05:52:34.231Z,Confirmed,AOA,OUT,0.00000000000327913,,735F55DE14C4A83F7F1D7C5809E9D404CBC4E24B85FFEF3151A0DABA3AAE5329,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T00:38:46.559Z,Confirmed,AOA,OUT,0.000000000001282114,,7E423EB617E8A0105E1D415D4C420C9C141311D8F446398B14E4DD278B76B6F7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T00:05:15.623Z,Confirmed,AOA,IN,0.000000000000706004,,CDD9C6E97703C67E115F3DA37A5DB0E018B632F97899B913411ED47D4BD1D8E6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T23:51:59.158Z,Confirmed,AOA,OUT,0.00000000000244501,,B6D7470259B4BCB291C6FC628E4258865E77CFCAEF1504F460871383D9D8FA2C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T12:02:52.668Z,Confirmed,AOA,IN,0.000000000001306067,,EA52FC92D7D0B9694AD9B98E88FCCAAC9401F0E022677D3511E794A5AB36B00D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T22:46:26.260Z,Confirmed,AOA,IN,0.000000000000571455,,71AFD9BFBD39FEA4ADF30C9DDC8991267FA128BED1EAE15EA29D1A0BDC963737,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T19:24:15.960Z,Confirmed,AOA,IN,0.000000000001683297,,34D92F0DEB371A2333334AE5C1EB2F3C8A7737B59D840D807CDF8EF4B2CFC809,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T19:02:35.639Z,Confirmed,AOA,OUT,0.000000000001870953,,67171582E53A80DC0094C145D8DC4C40E67713CC9B28D2EB51D4F3E86075F953,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T16:18:22.469Z,Confirmed,AOA,IN,0.000000000003075048,,0EF8CAD2253A4FDE59B6831DCB1C5C877DB0FDE43DA7E824468B31222E2A6197,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T06:42:03.668Z,Confirmed,AOA,IN,0.000000000008112073,,0A8E8AF0B6F82CD89AC99349439DFA6EA3ADF09D16F5917E71E568E4BFCEB322,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T06:23:43.823Z,Confirmed,AOA,OUT,0.000000000004936284,,A3FB9787AE86B658917852895CFEAD3B928DE72ADA00B782CE937DC554BCA51D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T05:22:18.507Z,Confirmed,AOA,IN,0.000000000001576397,,0778AA8C713292F3DD60E51A6F77E3650005F052C5075768CDD22520C5A7D017,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T19:21:41.380Z,Confirmed,AOA,IN,0.000000000000762671,,24B0E752E370820B2413F092A1BFB84B70CA454241A5DC80F9CDFFAE56BBB0EE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T12:55:25.433Z,Confirmed,AOA,OUT,0.000000000001017533,,7485215EE87E4BFC757DC8CFCFA35066DE210D9D2F4C90D728C7D4F6D4FD89D6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T12:35:39.550Z,Confirmed,AOA,IN,0.00000000000367648,,DF318C9ED6470551358DE2134C9D91DC48FBC57D926D5B2EAFBD0CC647924121,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T17:55:00.769Z,Confirmed,AOA,IN,0.000000000000585554,,531561B59D7C07DA50481E046BE54ACF1269B9657CEDF18A4168945E3CCBE3B4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T15:28:53.018Z,Confirmed,AOA,OUT,0.000000000002546298,,12BFC8D80ECE9DDB853FD7F84FF64FC647AFD2102085C8224333DFBDC5D739CE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T12:36:51.642Z,Confirmed,AOA,IN,0.000000000000611149,,2C59A93B91FFF031AC26BFC2245E3D978997BEE926EB285F7D3B35F148D5997B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T08:44:30.189Z,Confirmed,AOA,OUT,0.000000000004839376,,02BDE9515C95B25F5F11AFB2D509BB6FB7E59C6B037A44A16E39AE555AF397B6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T19:54:11.491Z,Confirmed,AOA,IN,0.00000000000051123,,131F3A23F7A7CA43AC5CE08C57AB03D97C4342D6A8F63D7674EFDB15DBA7DAAB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T18:53:48.703Z,Confirmed,AOA,IN,0.000000000000242543,,4024E46EA769572766F9853C2AA1DA3B9BD460F17149C58DAF06EEA88E825773,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T09:07:29.309Z,Confirmed,AOA,IN,0.00000000000269823,,66766BCD3481635E11C16389E44A6D552C4741F1EB7FD8A8ABD047A3F00612EC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-25T03:19:52.569Z,Confirmed,AOA,IN,0.000000000002721225,,B24032F23307F6D8BE7D24D65085588A5F94BC2757B59BE3DD9BCFB5911371B2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T23:58:10.922Z,Confirmed,AOA,IN,0.000000000001172613,,A204AF2C8FF79C3DE9A997BAFCE97C8B51F4BAAF3846E92CD47169176641654E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-24T07:56:26.405Z,Confirmed,AOA,IN,0.000000000000018341,,AE3737E656E49ABA761CE2AD50404B5C338CEC3D99C5BFEC1CB14345CDACCC86,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T14:37:31.679Z,Confirmed,BNT,OUT,0.000000000005700735,,EDDAE3F96C9C26D419023077D7B747C6D7697472748D64275F1B7DF0375E3678,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T08:01:40.623Z,Confirmed,BNT,IN,0.000000000002939405,,5E9DACFA915A76C11221E8C3388A05F893EF00AF31F150B091167DCE32062D11,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T03:30:19.453Z,Confirmed,BNT,IN,0.000000000000004516,,8279CBF59E0945D115F8D40E74981ACC53270589A1BCB2504F7C3BAA0952C00F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T01:44:59.829Z,Confirmed,BNT,OUT,0.00000000000030578,,5F6B1CBDF6525397202A8A1A5E6AEE7C844690CDB23290D9251A7610647ABE50,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T01:19:50.729Z,Confirmed,BNT,OUT,0.000000000001829343,,E5BCB9D784D8647211C05E06A7D280E623AA764B9FDAA1ED75743CEBE117AD6B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T15:48:50.340Z,Confirmed,BNT,IN,0.000000000000951422,,FA313109A04F7C23093C8B5DAFD1F35E556E486743DA1D659DA601A52A7DD832,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T15:18:45.958Z,Confirmed,BNT,IN,0.000000000000373396,,B7169DC3E621F83C7207CE26443F8FC1E3A603A8CF5F741F6668E5851DC3AE9B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T09:41:43.197Z,Confirmed,BNT,IN,0.000000000001533691,,81544259C5340021C195D0BDAEE72EAD24266CB04274442E0ADF143C676E0A86,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T08:47:41.336Z,Confirmed,BNT,IN,0.000000000002379857,,34EE04D7CAD04B137AE0B6E88EBD490F5F7F633C628E72FC50141C62E8F5B02D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T21:01:59.193Z,Confirmed,BNT,IN,0.000000000000107994,,DBA7CADFDE1E9119A2B91EB7D94A88C2764E000E158A95864014368EF85BB969,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T17:05:21.382Z,Confirmed,BNT,IN,0.000000000000943347,,A8C70D9873C01A2A6FA89EE543F79B650A147B3774330E6239413EEDE5160D35,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T14:42:26.633Z,Confirmed,BNT,OUT,0.000000000011044908,,1AE9772A358B92C0AE7BD95FA69CDAEA90F656E6DC6BC9C83C4E4F4E627C8168,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T14:17:58.782Z,Confirmed,BNT,IN,0.000000000005234399,,D7AB2642CD4BA1AC140E82CE8EBF516A4ABE17577C530968F3EBA3E0C0B6E04F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T12:34:14.852Z,Confirmed,BNT,IN,0.000000000000228993,,5715B876CBFF707EF030A70C067D9E3F177EF676FD7A717EACFDD887BEEBA043,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T12:13:42.703Z,Confirmed,BNT,OUT,0.000000000002113907,,82AE551823CF76E92DB58C50FBF30739DD47B50A4F09CC2CFB13803D87B7D264,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T11:59:01.272Z,Confirmed,BNT,IN,0.000000000000019846,,5CB6821632992CF28238E836080352BC2C1FE26BCB76B66B4DBBA778E5EABA61,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T11:55:00.644Z,Confirmed,BNT,IN,0.000000000002659083,,631058B55B72988B51EC8BA89C950B1296CD320353CEEDEAC499625F8C4D49BB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T10:37:17.540Z,Confirmed,BNT,IN,0.000000000000042705,,8FB2BF331858B01B9D7B4909E08D02675B88808DCC4210C571DCC0A57D1C4A7D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T09:55:05.830Z,Confirmed,BNT,IN,0.000000000006073721,,5A1D2D714636BC70F659C9E7AEEC2CD1E8BC8F6C9DE83580375FB6A16D8F2B5A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T07:30:27.339Z,Confirmed,BNT,IN,0.000000000008049658,,B7F484A5C0910C7BB1FDCBE272841DC69C286B0E7192CAF68036C2D4755A8FD8,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T01:49:58.846Z,Confirmed,BNT,IN,0.000000000001118411,,D5D91BF701AEC6BD947387F1773233E17ADA53003AFF2CB852C7BFB13AA6926D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T14:35:14.995Z,Confirmed,BNT,IN,0.000000000007365553,,0E6BE2FD09594A89CF9E29557AFF21108F61DCFD5E7144609F1CE1D84A93D390,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T10:50:32.629Z,Confirmed,BNT,IN,0.000000000000047358,,7A0F9127C3186AB710CFBBD13B1BC7E00F9E9059BD913D7DC69B3D41DBF053F9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T09:40:53.375Z,Confirmed,BNT,IN,0.00000000001156969,,4B647D41AFA71C65A946B5E25AF527DC0288E16B2021408AA025349DC05E6634,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T08:41:57.384Z,Confirmed,BNT,IN,0.00000000000190394,,5E1F31C2856B43276D349EE655CAD3B5C25E7CB768328D6C8FC5B1B6BD29BE69,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T01:22:11.008Z,Confirmed,BNT,IN,0.000000000005168973,,35111977D4310B44F73A8A2DE2DC03CD9975EA7BBE2294B09E4438CB79BC608C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T07:28:24.362Z,Confirmed,BNT,IN,0.000000000000021763,,6C55FBC495A18155563586675B26FA32788B06E3A4820D05C731A49173674BDB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T02:00:40.151Z,Confirmed,BNT,IN,0.000000000000465651,,B82BF74D3D68FD6DD8D526568D0DE631074DC4D849743B7CB6BB6BB5C1CE46AD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T22:53:22.191Z,Confirmed,BNT,IN,0.000000000000047495,,ACE145631B6B33D5DA3E32894007DA0A95DA9E40245E4C6C16A6A1701A929E23,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T22:48:36.354Z,Confirmed,BNT,OUT,0.00000000000070532,,20B4C36172D3FD721CBD14C10E7B6F4656C72D7DF1495BA9B38E206887C13C2E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T22:46:28.769Z,Confirmed,BNT,IN,0.000000000000324121,,F4EBB0444130696468743288EB2B78C00471A43EB5D87A3A9F2418D4B944C153,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T20:34:43.225Z,Confirmed,BNT,IN,0.000000000002809236,,1E98DD3104A94C82930F2224ED48F5F9F76B3B911691F5570E23FE42929D6D4F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T13:39:44.998Z,Confirmed,BNT,OUT,0.000000000000711342,,2BBFBF5313E69EA2C18BD2B17F7AA3850B0ECFE9F360AF9B78A485D530B3FF79,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T10:19:36.130Z,Confirmed,BNT,OUT,0.00000000000020983,,ED569A555BEDAB1A60CF64DBBD32112BB28FA93985E7733C32058F71EC171C33,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T10:19:25.204Z,Confirmed,BNT,IN,0.000000000009203109,,A6167E489533D79079AC4BA66B60204A9EDE2AC172E32392400FA45F63446805,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T09:40:56.925Z,Confirmed,BNT,IN,0.000000000000551882,,B5E16C8EA4CDC3658B0CFA8578341CF3AC6482EBCB406F08C2DB3BD5D1C5A0C7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T09:08:50.707Z,Confirmed,BNT,OUT,0.00000000000164593,,23C946C3DBC3355E07639F14BC0553C500B075CD6C30257A61B4A65B61469643,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T08:40:40.962Z,Confirmed,BNT,IN,0.000000000000304959,,FBA642D7BECA8CD29BCA132DF1B9279EFF7231BF446D203E5C96B34A20C835C6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T05:59:02.202Z,Confirmed,BNT,IN,0.000000000000647421,,EA4C699C1A1EA121167F4CB26466BEB31A1C209412AF3463B7F30A1B285560A7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T23:17:10.879Z,Confirmed,BNT,OUT,0.000000000009720362,,1E3D5C24759B6745CD166B2A19463FDF7EBAE395F489336867669533F8DCC789,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T22:06:20.779Z,Confirmed,BNT,IN,0.000000000004995551,,BBA80DFC827C692402A579260916611DED4F37C3A6F358C555F0C694F8570212,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T20:48:40.326Z,Confirmed,BNT,IN,0.000000000002083658,,0DDE4A20A7440540967A5BA66685B678A5ADDDE4AC272B7B1E2E7233206FEBBA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T14:02:36.384Z,Confirmed,BNT,IN,0.000000000000771841,,9B34A3B6566909F428A08062E62B380B9D404FF0AD18F3F8A9666CC7B67FD5A1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T13:43:56.987Z,Confirmed,BNT,IN,0.000000000000140571,,D47EC8429CEAAD352962787BECF67E184373365C260F877DB4932A584A607B9F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T03:59:16.228Z,Confirmed,BNT,IN,0.000000000000110048,,A782B4A3BD1C00DB2EEECC97EEE8CF72DC9C59FB5EC1FEAB75E703C70F219EED,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T00:32:04.839Z,Confirmed,BNT,IN,0.000000000001859319,,8E9459B1F9AACA75BDC7B89AF3018C68A75BBCFB7D01B9AADAA5B87F57F135EC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T00:17:48.213Z,Confirmed,BNT,IN,0.000000000001825921,,5AB0E69532B02AF9751BCF7D3E93F3CDD64AB41FD94AD031656E6FA95E945233,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T00:12:30.439Z,Confirmed,BNT,OUT,0.0000000000001533,,D1D6BE60F33A908DB1D18A71A02D44484B79F1C1A37C1EA0C2D4BA54E9D23B14,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T17:34:10.603Z,Confirmed,BNT,IN,0.000000000003372479,,0F92DB46E5EA3EE28480061C1FDCB45BA9E01E13239145B45765A2907AD5D411,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T16:25:02.853Z,Confirmed,BNT,OUT,0.000000000001514118,,962B6AF0FB1431940BFC139FC8C54BB929F439CE010AF3A8468939C84664EA49,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T14:23:10.549Z,Confirmed,BNT,OUT,0.000000000000618678,,AD5E33608FEAB759AAD8BAFF47CF2371FA38A889D80BA0DDC5D0AE23820805D5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T09:18:43.234Z,Confirmed,BNT,OUT,0.000000000002668938,,6CBCC346650B9A8C1DE0579841AD90A3ECDBB1012E02BFDCF8B24808992D051F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T04:38:41.028Z,Confirmed,BNT,IN,0.000000000003152109,,DE34E7B9AB2B15D09D6C47D42CF122627640C6DE44077C0C7D1AC5EC0F3D50B2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T13:44:31.454Z,Confirmed,BNT,IN,0.000000000001529859,,AAA779050DD7AA092D2A547610022FC1B6A51643BEEF82583662E93C4B12221B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T04:49:31.453Z,Confirmed,BNT,IN,0.000000000002987311,,1EF1CE474D880413F55CA68F2A64DFA7CF43795935D722392C3EBAB0C88D887B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T00:24:22.744Z,Confirmed,BNT,IN,0.000000000001574207,,C448EC4BA5ABFCE4CA34ACA5E13CBB058B2D47EF307ADFED8DE4937EB461AFEA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T00:12:56.290Z,Confirmed,BNT,IN,0.000000000001998247,,29BB8011DB3233D6BD14F25829D220301EA8BE90B08F2A692FA2B45C2A38EA3A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T22:01:56.476Z,Confirmed,BNT,IN,0.000000000001489891,,CAAE01FFC5B20FDDF405CE7FE751E1D64C97263D41566F6381E67961854777F2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T14:42:09.432Z,Confirmed,BNT,IN,0.00000000000163977,,DE697748E091C456F5FAD2285FA18CC3EE0DA4B4B3076321E555D55936AB9D21,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T14:37:33.282Z,Confirmed,BNT,IN,0.000000000002123762,,3A2D3720D7B3A9DE7BA6AC52B9E05B5E47294D8A8A4708B2F4F3A48CB31E6B10,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T13:57:22.193Z,Confirmed,BNT,IN,0.000000000001326735,,0632924904E908100906A3AA81DC9E603FD3988702C5749D20293DC2757D35C9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T01:59:13.481Z,Confirmed,BNT,IN,0.000000000000172189,,C72642A36356E6C87288B1914F782237D68A7C71A2529371350B2027F4667459,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T23:00:34.401Z,Confirmed,BNT,IN,0.000000000003509492,,339674DAAAAE2B6491C891FC2A8D9347F3ACA99EFA85187721DAC36FD0D136CA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T15:20:08.474Z,Confirmed,BNT,IN,0.000000000000140297,,4E2CF85086D3190678A835E62A36C5E2C7958E157755F3072C9D095EF10A9964,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T10:29:41.310Z,Confirmed,BNT,IN,0.000000000002129511,,FCD7121CCBEEAA49F040A133A9484B4267F778D226AA0C41AF1143031A493612,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T02:51:20.300Z,Confirmed,BNT,IN,0.00000000000165469,,77A21E718E68ABD3BA932E24671110694F0A059483ADB6E55668FDA71D90A347,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T21:14:17.695Z,Confirmed,BNT,OUT,0.000000000000281416,,54D9CB3E84AC3CCCBA88BA4EA743930B2B777AAD23A3597F36F7A057C23853AF,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T21:13:49.587Z,Confirmed,BNT,IN,0.000000000004906308,,3C07BBFD3E49AFAC9A62AB1C0D7080806CE1B50BB38A6832394F4E3702397F97,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T15:40:49.672Z,Confirmed,BNT,IN,0.00000000000563038,,AC088C619F504C7D7F2E2A604F6157EE0A7855458C2962DC4559F6682DAD0775,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T14:30:49.991Z,Confirmed,BNT,IN,0.000000000000609507,,F653EE26AD4BA1CD4892611ADCCF1BD3F0C74281FBFAAD69206040EA17BB7637,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T13:34:29.673Z,Confirmed,BNT,IN,0.000000000001828659,,92E944984CBB54EB840B3D70E5A1029046A23EA4575ED9FC7BF4BDA426934A3E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T12:34:41.047Z,Confirmed,BNT,IN,0.000000000000516021,,C9B971F7A6457C0B26D8C03840E0D3A362A7F80913C801F80B0911F1FE75463D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T12:26:36.315Z,Confirmed,BNT,IN,0.000000000001101712,,971E9D1CC098A70C6605980221F00B8057587132F305C3EB761E932D03A3ABF3,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T09:07:14.135Z,Confirmed,BNT,IN,0.000000000000118534,,FE4C6AF82E4DB7FB0EBF2A7E51B7136DA6D31830936B2C1E7BB0C600A8DEE85D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T04:51:18.727Z,Confirmed,BNT,IN,0.000000000000042978,,92515BAF2B6682E6E10B07F643C5E7508165144BB494D4068CB49B9EA6297E45,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T03:35:28.730Z,Confirmed,BNT,OUT,0.000000000001294296,,CC5DE021CE3C3CA6C47B8ED08BE34C897C2934315F2B6E9A5834B8A14D349FBE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T02:10:27.902Z,Confirmed,BNT,OUT,0.00000000000071408,,F6AAFEBB716A7B283A35261BB6078E53FC6B7A8E4AE9212C9B93D9B18C2E598D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T01:49:51.551Z,Confirmed,BNT,IN,0.000000000002190968,,9662B9625FE01919B0EC5147FFBE8948A49DE7FEA8CFCF16ABDF8AE77FFF076B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T01:21:59.491Z,Confirmed,BNT,IN,0.000000000000968669,,FA692F158ABE1E7C7444BA7CAB6EFFF963A7414E1CE21DE5864FA9453835312D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T21:46:25.339Z,Confirmed,BNT,IN,0.00000000000012661,,322EE6CE48F5081A44AE7C9571C62C593C959D234652011DD71A2B8452F6087B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T21:32:40.062Z,Confirmed,BNT,OUT,0.000000000001215729,,843D69F1F4F54F24CB8C74A6A42BE5CEC06AC2825775A05E90E4187A5A56CAC7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T20:05:28.669Z,Confirmed,BNT,IN,0.000000000000453605,,701BBDF1C4663460EF883B1D15F70D871D3D1558FFB4A1AB9783A6F61B89C93F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T19:44:29.769Z,Confirmed,BNT,OUT,0.000000000000357793,,B7966ABFB94A8BD0D911CDA8BB3781C5551DDAE02FEBA0D38B6FEC4D7B6BD159,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T14:55:49.177Z,Confirmed,BNT,IN,0.00000000000126432,,FDEBF513444632293853223FEA18878DDC96D2819259041DEB38947CE2E59E4E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T14:06:16.668Z,Confirmed,BNT,IN,0.000000000000163977,,2C17C9C66921CB3A28CDFAAAAC45B2CD8FB912441AB9F8EB06A98422CD5F9C94,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T13:33:41.431Z,Confirmed,BNT,IN,0.000000000002614051,,042F36BE27DA5A5CE01E9EAFDF74BC2D9C4866A626E4EF9FBAF0497D3B913324,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T10:20:02.824Z,Confirmed,BNT,OUT,0.000000000000006433,,6F9AFEDAD1565ED88C680F59918500A0B68D9DB2B5D61FB373A9FCC8A9DB87D4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T02:07:18.490Z,Confirmed,BNT,IN,0.000000000001356848,,B6D7B762E596A42A3E44D9E826A4F2226094EEF9B819408A2C0B0CAC71CD97DE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T12:28:05.790Z,Confirmed,BNT,IN,0.000000000001920228,,8B2D510C019C8198C5071D8038E78B68F0D6BB43BA0E2EE6D61082437C049A5C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T08:07:02.785Z,Confirmed,BNT,IN,0.000000000005136807,,D85E9513CACBAD0E8439D79C8124DDE01B000991DD6E74CC31474EDF0B725A7D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T08:04:59.637Z,Confirmed,BNT,IN,0.000000000000271698,,EA604E590750BEAC7C772B909A9A795CD01A5E3089CF3E0320B9C88809B4213F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T07:58:30.319Z,Confirmed,BNT,IN,0.00000000000013578,,B23EC23FCC2BEEFA9C3BA03DFD449984A488CA10052F8368920C06424A921F35,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T03:41:49.007Z,Confirmed,BNT,IN,0.000000000000239806,,9636E87666A809D436DD4C128720971D93046A4FBD9E7FDD7EB189C743DE5C76,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T20:26:08.184Z,Confirmed,BNT,OUT,0.000000000000292777,,A24CB57A048505D2AEC1E365A74F2D7B85CCC73F1F91700793BA24CEC95066E9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T15:44:10.391Z,Confirmed,BNT,IN,0.000000000000330965,,AA0DBA26E65953174A2FD3690210551DEBB4FF5A8AFDCCBC939E9D27FABB1A1E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T15:33:53.822Z,Confirmed,BNT,OUT,0.000000000001033548,,E24C288B568EDD199F38A6051FC6615DB7BBE6131897AC378AA957461A0FF89F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T15:13:04.908Z,Confirmed,BNT,OUT,0.000000000000501923,,B02DEA498C81D1D99BDF7E2D1D6BDF8B7236C38C65691327F885925557B148D2,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T13:38:06.999Z,Confirmed,BNT,IN,0.000000000002052998,,204FA9B56412ED007A3A70D159D59B691504D194D1FA2E5B4EC67DB6A549B975,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T12:30:41.302Z,Confirmed,BNT,IN,0.000000000006207448,,E4B7D9D095476F2AA4939A04C65529A50422D33B50A84450AF5378F8DEF58321,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T12:14:40.849Z,Confirmed,BNT,IN,0.000000000010709974,,18C92F30AA4C6267A02E1235D018E2AB5088FE38187F7F64DCB204A4B5A0E42F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T04:56:30.107Z,Confirmed,BNT,OUT,0.000000000000013003,,D2D6036C151F477A7F7ABA44315149C5608C62C671F9E84459AE99D7B8BE4C6B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T04:54:45.411Z,Confirmed,BNT,IN,0.000000000000869434,,F6729189BD601972FCA6F35BF3836A556ACF339B5E520BD74CC30358F112D94B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T04:16:57.582Z,Confirmed,BNT,OUT,0.000000000000669185,,4392185E19641DC3F7191AF4B6B7CD187FE196DBFABA7CB8C3B14F0ED6DF5CB9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T04:14:47.157Z,Confirmed,BNT,OUT,0.000000000006053874,,B9A8D0893B501A1F3897400DDBF5CF76AE4CC0657D654122E0DD60FF0224830C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T03:35:44.119Z,Confirmed,BNT,IN,0.000000000001053805,,D70369B18EF909FE2E6E89DE09BE7688144AC6F838A241C7BC5A161B2F95584F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T02:07:30.122Z,Confirmed,BNT,IN,0.000000000000963057,,2FDF622385D2215D66F50D50821C0E9BAC06D10D8DC53C6651D50CF42098AB7B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T00:42:31.955Z,Confirmed,BNT,OUT,0.000000000000150152,,79F32C81E1425EDA711148AF273A0C75B26446D03D8635B4F4CDB79ABB13F6AB,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T00:18:06.280Z,Confirmed,BNT,IN,0.000000000000094581,,AF8CFE50CF12F90F76E0B8E150B1CECFEFD1AD5D8097642A00B8EA16E4846B42,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T23:47:14.165Z,Confirmed,BNT,IN,0.000000000002131017,,95C619401352B39EDBCD885B3885531731ACDD12F7EE448073E82AA4B0978CD1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T11:19:50.395Z,Confirmed,BNT,IN,0.000000000006777125,,81B655F9306578CB54D4A1353FE366F2927916774A6AFA0C27E2F520CD51C6A7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T06:15:17.773Z,Confirmed,BNT,OUT,0.00000000000284715,,26D0DD8E445BAB0146B859E9D4751BAE8F30F348D4E6E38FAAEDD35E45F4DF1F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T06:15:17.622Z,Confirmed,BNT,IN,0.000000000001023556,,8430211324F57B62D6559F42E85AC7423846EE211C9F83CA29BCEE53B712D5DC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T18:35:59.860Z,Confirmed,BNT,IN,0.000000000000496858,,7906EC0141CB585DFE52FE90FCEE9C225E856FDA2EFE7DA3AAE0ED59876273E6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T15:25:07.154Z,Confirmed,BNT,OUT,0.000000000000224339,,BFAD95766AD6C335A8E3AF0F2FB2AE0945C5B2E566F154CB1B2D909535833E75,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T09:01:57.880Z,Confirmed,BNT,IN,0.00000000000119903,,FF3EE749C865B33F08083E6EC01192B3534E843177AB2F8DC51FEE851D3DDC53,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T08:22:58.965Z,Confirmed,BNT,IN,0.000000000002873567,,A3C41D9DBCD9C698CA09AF98D82E976D752CCD4424BF000463B47C621E368E79,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T07:42:47.567Z,Confirmed,BNT,IN,0.000000000001280061,,13A62C3C90C9FE2AB584B2A5F94FD2A553503F06656498624466D273D7D4E0F5,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T14:55:13.582Z,Confirmed,BAT,OUT,0.000000000000009855,,D6B73308609A06B93FFC11600ED77B416E4CCAD60A6B1ACE07B88C592A1BF471,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T04:26:58.932Z,Confirmed,BAT,IN,0.000000000002856458,,2D0A30FA13C79DD2ECCFDDD6B6FA0826713DA3C718739FF293E7FF992DEF0A85,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T02:43:13.954Z,Confirmed,BAT,IN,0.000000000000297157,,5468182424ED3DCDB121A6F0FC48F9C2DB219FD1CAA3E8E8B83D150E1AF8AEC3,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-14T02:28:26.025Z,Confirmed,BAT,IN,0.00000000000268112,,FEEA988885C79CD2F4ADF3BD0F3052C250C0BE8857838082E8F2F2507A09A801,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T23:00:41.794Z,Confirmed,BAT,IN,0.000000000000841237,,84224D0B92839FE74E6DFEB051145027711B8F826E3136D57AB9E3248262302D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T15:17:40.360Z,Confirmed,BAT,IN,0.000000000000083631,,E93719D8C5186962E78B8CF0AE476AA6704BC9A2D2715DEAC395E4EB5683A447,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T06:44:25.850Z,Confirmed,BAT,OUT,0.000000000000835215,,C7E9B4CF334706032568E7A972B7C6CB68B0DE7E67205BFB1427E2A88D6F69A7,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T06:04:38.362Z,Confirmed,BAT,IN,0.000000000000594587,,F39BA47D22839896669584AB5EF7508F9E11BE3C2A197F1537620AB2650114FD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T17:58:12.247Z,Confirmed,BAT,IN,0.00000000000091515,,C0F3FBDD67357EFDA3FC52F6A2A8C681D037922409307DF866ACC919692391DE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T12:43:25.246Z,Confirmed,BAT,IN,0.000000000000469346,,A1E8A1EE1B523E592016CCF1D031E3EC5AF7A63F664849CD528E11CB47AA9652,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T12:22:22.258Z,Confirmed,BAT,IN,0.000000000000660835,,5107EFF356571C4A05A936617BC71AC8B3AF1AB7254688BCE1A051E1018CA4F1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T09:43:30.946Z,Confirmed,BAT,IN,0.000000000004989802,,C4C3608F9F7468EEFADC3DDDD4CB79E8448B9EB29BF0BEF825E653E7FF85E78F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T07:03:41.451Z,Confirmed,BAT,IN,0.000000000003882615,,1AE21F697E99C8200AAD0BD45ED23B5E11D0C855B54349999B8514966BC6DBDD,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-12T05:03:56.280Z,Confirmed,BAT,IN,0.000000000000237889,,6CDD1084C62C078C1463B59E57463FECC0D48571C495E1FA86F3A36EF4842637,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T12:30:34.097Z,Confirmed,BAT,OUT,0.000000000002778302,,F61CC413729B5623D283E89619236ED7CD879DF08DF0814F93EEAE48B0B4EDF6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T10:13:45.303Z,Confirmed,BAT,OUT,0.000000000001889842,,C36D8347671FF96382346FC16C2674E826416B17885D9E201185FC94D5DACC87,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T08:43:01.436Z,Confirmed,BAT,IN,0.000000000003832792,,AFC6EFB42AB1A1A3D1B6F2AF6622DC89BCC2FAE0D26D787C5F9D32D978E8C554,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T06:31:07.754Z,Confirmed,BAT,OUT,0.000000000001454851,,8198F98B8D172DA9A05CBC0E0BCD01D9AA17652267EE8D64F45B5FA773CC8B2D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T06:30:48.525Z,Confirmed,BAT,IN,0.000000000001121148,,C8DE0212CE9CF12660AD7B92B7B729225E3D604DEA1B0CA4C95ABCAF8B58C621,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T04:37:36.033Z,Confirmed,BAT,OUT,0.000000000000531625,,D35351216B32DAB587B4AE0B31CFF73B3F221596044D38A3A377B88C6B4B96DE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T03:19:47.824Z,Confirmed,BAT,OUT,0.000000000000052012,,085A2687D84846FCCF796BB2255C6CA881126ED2F8EDE12E1A87C0CBA04704E6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-11T00:40:39.548Z,Confirmed,BAT,OUT,0.000000000000046263,,10B3214C51CE8CBF11A68C0CE99F9E79D3B4BE61EA651F22133C9E1CD5559ED0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T23:02:17.289Z,Confirmed,BAT,IN,0.000000000005482418,,B1BBD202917387D9B483CD89426731FCA19170D7CC7360573EBCEFFED822C1B4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T16:34:27.117Z,Confirmed,BAT,IN,0.000000000001036833,,ACC98EAF56AFC18641F95FC30505506CE88BABED091134218B6FFDA792884DEC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T09:52:02.309Z,Confirmed,BAT,OUT,0.000000000000455385,,75577559354E4FC4F724FD9F9749181B5EBFD6EDF94A5F3BFAD8B6E04420C9B9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T08:52:28.578Z,Confirmed,BAT,IN,0.000000000002523303,,5981956C6BB3AAB4DCF64A90A751C6BC12C225DD80CF46820ACB94135319552A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T08:11:19.637Z,Confirmed,BAT,IN,0.000000000001322219,,13E4299A4121C9CC4CB42A8139EE65E81B6839B4EB2E8075A0668DE893516189,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T06:23:08.083Z,Confirmed,BAT,IN,0.000000000003457068,,7301F6889142C512C6DC028738220B02F9360CBEB4C8AD1C68A653329D257229,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-10T02:37:03.980Z,Confirmed,BAT,OUT,0.000000000000109774,,CF89A6F8194AC09E727FE71D5E5404C12B66739E5C09C8F684BEE25C58098220,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T18:59:05.556Z,Confirmed,BAT,IN,0.000000000008217468,,348A7D9288AB50A8D593DDEB67CFAA6D1C41085963C12F095EB803ADEF20963B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T14:22:34.713Z,Confirmed,BAT,IN,0.000000000002133754,,B2C74200E63560351476078E196D1BE8BC873ADB189B814526214B5F4A816987,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T11:57:55.929Z,Confirmed,BAT,IN,0.000000000002432828,,80435511BA32A0E1519EA2A3F1568005BCC0251D9ED03D04A0F168505CDFF55A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T10:34:47.592Z,Confirmed,BAT,IN,0.00000000000247827,,54EA30C86C3F82ABEBAD4DB62DF1FF0C9ACD705D0851AA3C22359E713C745A57,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T07:46:45.102Z,Confirmed,BAT,OUT,0.000000000001049152,,8C21CD21E792A0D50E17AA0613D08DEC0CB5C99DC8F51974C6766852D3C2F26E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T07:11:06.445Z,Confirmed,BAT,IN,0.000000000001217372,,5860FEA2688AACD5FA833EBD6D4B74852ABF342041F7FF555527C28F4C529304,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-09T04:24:51.744Z,Confirmed,BAT,OUT,0.000000000000487003,,132CA4A1E3EAA0E3575E353C5C6E48AB43DA98C2002B13468B963D2312B5F7AE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T22:51:58.193Z,Confirmed,BAT,OUT,0.000000000000844249,,3E240E580223D543F800D02C4107C2D6E77A75AB1AD7D9F8B2CDD2AAECB72951,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T18:39:45.759Z,Confirmed,BAT,IN,0.000000000000523823,,23200C4830AF3CD58B509EDFF42D516CD4833E9191F415BC2CB63C15F842BAC0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T18:22:18.962Z,Confirmed,BAT,OUT,0.00000000000393805,,A2CC9D3D0C4BCEC07F82CCBC8EE5CE38260DF639B51D54C215ABE46954004DE4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T18:21:51.059Z,Confirmed,BAT,IN,0.000000000000110184,,1D4E5D2FE7AF880E2E28041EC523EB335811E9BFFBBC11AB675C3345756E68B6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T13:43:45.465Z,Confirmed,BAT,IN,0.000000000000165482,,D59641A41CB0E6BB5924D0BAF563BE2192ABA27218F3355D4BF91DF8939AE850,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T10:59:07.730Z,Confirmed,BAT,IN,0.000000000000333702,,63C83E0E32C459A1C77EA94516F00C549EF64732B82ACF602D908991086DB075,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T07:28:10.924Z,Confirmed,BAT,IN,0.000000000000375723,,D1ED466E1196499151B5B6A2D75C7CA41F0928F461ECC7D0850F207E4F505605,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T06:58:15.544Z,Confirmed,BAT,IN,0.000000000000081851,,6F5707511AE7CB5DCBA37825C7330A05A9964B3504392C62F3F1A8ACF887C28B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T06:58:14.736Z,Confirmed,BAT,IN,0.000000000003661971,,255C68978F8D3FEC4C87280CC19E3A681068AD7A43C448D50FA6B2819BB24D3C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-08T03:55:05.482Z,Confirmed,BAT,IN,0.000000000000250071,,8BB448ABA6D604BDFF9525C0C28DB15641BE24AA8C371D862AF7119EFC731860,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T19:40:15.791Z,Confirmed,BAT,IN,0.000000000000067069,,D2AAB78A257872CF3DBDCCDBA9E631D61D621E56B0D10BD36A1FD81F303C829A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T12:26:19.374Z,Confirmed,BAT,IN,0.000000000000104709,,0B26AB063582D6D7AA158A1106F746826D5276F02501EE85F5D1B01F6CF2330E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T11:46:24.276Z,Confirmed,BAT,IN,0.000000000000253083,,F695BC34EF47BA1DD42CA8F5D088D9F0D08178ADDDC82D0D06F6800D0282BE24,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T07:10:32.200Z,Confirmed,BAT,OUT,0.000000000003925457,,FE32133CDDEF8CA1C9E7FE71F21434439FBD25DA6C9E83E02A1FAF033C769B0F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T01:10:42.112Z,Confirmed,BAT,OUT,0.000000000001922692,,F433133018E755F36E267C1A30EFC0CDE142F184547B63658C5341206BC7E241,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-07T00:28:43.385Z,Confirmed,BAT,OUT,0.000000000000004106,,5050CA0F5349574F6653AB6AC5172A2537F8285E3DA7ED037234A3C93ADE23CF,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T22:29:34.883Z,Confirmed,BAT,IN,0.000000000000133316,,5E94B0CE31DAD52715B50AF3C217E5B4BC54972CE72FC76E98CEEB35CBA2DB4F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T19:32:01.242Z,Confirmed,BAT,OUT,0.00000000000203274,,291DF9451B8D3B3D7BFF7D70D2684FFCA6947FFDAA0AB0337793FB8A14B8FC4F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T17:30:50.810Z,Confirmed,BAT,IN,0.0000000000022553,,8783C40CA566A11721DDD6450550F7F9D1314B420C3F624BA699902C19844C76,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T15:42:17.890Z,Confirmed,BAT,OUT,0.000000000005177459,,78891CF9A60381BE6DC2E790316E007C0EDB4E7B7BC78DE54A4BC32511796464,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T15:40:17.159Z,Confirmed,BAT,IN,0.000000000000981124,,2C669A4C1BE27E0C305B93695A3EF93FF3A87AED9584D17C042A9318463E542F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T11:06:13.675Z,Confirmed,BAT,OUT,0.000000000007173517,,616F2054ECB4399228235BFC3D9152F67035CF4FB3A0E0F386721FC13DC00A7A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T11:05:32.700Z,Confirmed,BAT,IN,0.000000000000585964,,36553AFB657BA15D2DC48C27DA7F39348B39B3A2F3485F120474026DCB21010E,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T05:01:04.869Z,Confirmed,BAT,OUT,0.000000000001698353,,4CC1454D1CAB999D3A367BFE749F0BB7633C58AAFC6F7AAF3A22AFE60225FB59,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-06T00:15:24.036Z,Confirmed,BAT,IN,0.000000000009134808,,DB55F18F8595F2B39E6622F24C81BBC26622980D237E8B1EF5D095E40D97B0D3,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T21:44:27.123Z,Confirmed,BAT,IN,0.000000000000136465,,F3565A7A6DE8D03AA196EB8473DEC8141775178546C73606C3D18A372630F475,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T21:31:37.319Z,Confirmed,BAT,OUT,0.000000000001328104,,2F0B4FBCB40BAE20D5D7E8B4479EFF56737A0E7871807A6560A14229ED880735,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T07:30:08.569Z,Confirmed,BAT,OUT,0.000000000002661547,,4016FDAA8C19F3750FBF352D2CCC753E568F81CE50A8B7F9AC92342E2524974B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T07:15:00.655Z,Confirmed,BAT,IN,0.000000000005238505,,2E4A03CFC16B171F48ECD1D54EE11DD16FB2320FB1DF476C7848AFE73D949A33,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T07:11:35.327Z,Confirmed,BAT,OUT,0.000000000000369564,,7034C53B9E67745A89B138D57A7C2C14E39F8DBD9468C12EFBF3F32761487D70,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T04:56:38.190Z,Confirmed,BAT,IN,0.000000000001677411,,9D2831A8E29ABF61354C54FA547B87B57861E37E3124DF240E3ABB6E63DF872D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-05T02:03:10.251Z,Confirmed,BAT,IN,0.000000000001493313,,728C3D0825147B311FE48DBB75025FD66053C14EAAD29CB7C734736BD954C351,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T22:51:13.169Z,Confirmed,BAT,OUT,0.000000000000142076,,E6BBC027FD643647D195F043D4ED28BD19A2A41BC18B667A8253925C0CE716BA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T22:46:48.400Z,Confirmed,BAT,IN,0.000000000000050507,,CB967A0A4AC98F08BDD7E7879E45D18E449716ED09093986D19D16B4F2ACF4A4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T18:47:22.509Z,Confirmed,BAT,IN,0.000000000003382061,,1C306D208B351D9AC210C7DCFBAB11E5A8D00B46295D008517591570640D0E71,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T17:00:15.313Z,Confirmed,BAT,IN,0.000000000000086779,,1C281D29A6673726757C0EC26746FFD7BA7B967CE214250132DD9FFF1BF9CEE4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T16:28:10.112Z,Confirmed,BAT,OUT,0.000000000004440657,,FFBE3F52DC7741BC5BEBACDF1D45A5F56196DF41DFD8618F6CCCC7530D6F238A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T16:27:45.446Z,Confirmed,BAT,IN,0.000000000001223531,,9986B7F0E1F7EC6E3AB7C8E5AFF48DB18A092142284D79E25F7BDA4801121F92,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T16:27:03.215Z,Confirmed,BAT,OUT,0.000000000000793742,,8D90837BA8EA1514FD773A6958E08DCB12244959DCF00A245A7A032B90AAAF2D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T10:47:38.423Z,Confirmed,BAT,IN,0.000000000003896987,,BBE741A4925F95014246F1136B231689B1F9605ADB2956C4FB44AA7742B3F1F9,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T09:02:27.667Z,Confirmed,BAT,OUT,0.000000000003909579,,13B331E4E21E83F60BEB2A3826D22552CB27FC7D17D633D31433DC084E85D8F1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-04T06:00:04.870Z,Confirmed,BAT,IN,0.000000000001584199,,CF3B7ADD39037D0D6BC8B14D9CCD1E3BFC47F9084CEB8841FDF0D2BBA1384252,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T15:03:16.331Z,Confirmed,BAT,OUT,0.00000000000018177,,55EE4BD5177039FC0E84E057AB69DA6035CEAE36F9AD4DB9B22D8CD6733C0FBE,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T14:59:03.421Z,Confirmed,BAT,IN,0.000000000002383553,,F0C3F1F48C8BB6E59C032AA163416D34CFA7D84246E7768D1B0784B4C1B2A079,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T14:23:09.860Z,Confirmed,BAT,IN,0.000000000002582433,,2C8B62E8036C6ADEE9D27B6FFDAC4FF4EDC73749BAE0AD0F779BC83ADFFD4E9F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T14:19:01.463Z,Confirmed,BAT,OUT,0.000000000000553662,,CB812B90A15A1497BA183DA352CFFAE4D875AC4FAEA181D168E51F95D420DD64,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T09:00:42.731Z,Confirmed,BAT,IN,0.000000000000014371,,A79327332064B39AAD221F5A4A1F58F46DB465330048E94EAF530586259BC9CC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T06:38:48.007Z,Confirmed,BAT,IN,0.000000000000140297,,AAD7FB173732E0003117AE54C09C8B6FCE6469A21D440344A623CC0642E804B4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T05:25:58.684Z,Confirmed,BAT,IN,0.000000000000351633,,714F50826651C69ABA82B81282E206371707074F74C2DF879263455E78EDC57D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T04:39:31.856Z,Confirmed,BAT,IN,0.000000000000382293,,6AC309C65E393D7CD422F55A0B9A4F52B06F6E77F57BB1AFBF0961C66DC35169,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-03T01:00:48.575Z,Confirmed,BAT,IN,0.000000000000013276,,A8EA6654276B43151C4CFC26331890DAFE960D0CDFBF56519E56FBE301A562ED,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T19:06:55.686Z,Confirmed,BAT,IN,0.000000000000330691,,EC0BCDBBFCC182F8653B84FE702A5009C85759563052FEF79E75EDBBEB910402,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T18:29:26.037Z,Confirmed,BAT,OUT,0.000000000000084315,,65B35748A3F63B611691831F3E374D6A4D134FBB75D79EECBA72705054FC6055,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T18:06:40.699Z,Confirmed,BAT,IN,0.000000000000981398,,4A66AB0F1F8625E768EF47AE793B19A52105FBA3817170D914D5B44BD5B66E18,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T17:37:51.501Z,Confirmed,BAT,OUT,0.000000000004897001,,0EE54323464E1BCA4F8D80E6076E64DFC5F35210DAA3F95157CF54CB0A3C3BE4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T17:33:50.860Z,Confirmed,BAT,IN,0.000000000003253261,,C11CA740CA11A5F6185F0896960E00151B438C06F5F3AB11BD58732A6D529064,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T16:56:29.930Z,Confirmed,BAT,IN,0.000000000002252015,,82ABFF8F0CDBCD38AFCB3333F0822FCD6336573DE7A1A945C84168ACBFD2385F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T16:19:15.332Z,Confirmed,BAT,IN,0.000000000002200002,,EAB0B538D45F392ABA262EDBB1C7AA710806233F94798D10A3B9DA1BBF99FCB1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T16:18:21.840Z,Confirmed,BAT,IN,0.000000000004716325,,523699E952868494BC2CA52C8C842D7B740A26F682B0D31122DF448663118584,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T12:29:18.415Z,Confirmed,BAT,IN,0.000000000001399416,,79D048D3A0B16EBBAC7FBA39742CDF1C1E2D82E49594D0BF38958145E05E7A7A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T05:42:03.894Z,Confirmed,BAT,IN,0.000000000001147702,,BBCF369B8F4735A4249DDF64447E3CCE5396998C4CB904B041D61C097049CC7C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T04:13:30.443Z,Confirmed,BAT,IN,0.000000000000071859,,879D1C08F2420710404E5DFAA3F28D243BFD5BD3F8A737A9E4CA52948103B796,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T03:34:43.633Z,Confirmed,BAT,OUT,0.000000000001911195,,9F6B9448F80F5A0E20FD82436C5CF0F7E79F3C7F5C9176BA5BD266A6DE15F721,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T02:02:15.536Z,Confirmed,BAT,IN,0.000000000000069259,,CAC058F700B444537B905359349BBED95E4EC6460B5DCE67EF83C460D948F743,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-02T01:31:08.385Z,Confirmed,BAT,IN,0.000000000000554483,,E86E1B795FA0374C5FFED6C909B9261231E1BDCE1F7F2E04DB57559F2C568F1B,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T07:02:33.105Z,Confirmed,BAT,IN,0.000000000000075281,,AE04DC4CFF3714F60CA9C2B077C913C97C8DEC004913651549F82FE6E54789CA,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T06:38:25.087Z,Confirmed,BAT,IN,0.000000000000017383,,6508AF479FB54AF351758F4F68D41F4927D311A9964FB7DD6C7FEC6DEBC1DE86,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T05:39:32.797Z,Confirmed,BAT,IN,0.00000000000230964,,279E38026F18E365CCBF87F70CEBBA83EA95BC05FD3953DAE7EECF598C4FBB5D,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T02:23:43.419Z,Confirmed,BAT,IN,0.000000000000108816,,C4958C89C72771530F0EB936053A22B8F295D2886E421CB60D967D69D0E589D1,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T02:02:42.901Z,Confirmed,BAT,OUT,0.000000000000022584,,0892A1E8857FD9D7F0DBF4AB390A88F106DA2DF065327DEE3288382F3C1A878A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T00:46:24.478Z,Confirmed,BAT,OUT,0.0000000000004547,,D90D48BAFB7F1B58EAC9D2E3B2076A177E16A207C3CFD625DFD094835F2BB201,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-01T00:27:52.196Z,Confirmed,BAT,OUT,0.000000000000150973,,0563FCED79B59E95BBD79CB261F11404D072E097AC314C6756A08C426732CA4C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T17:16:42.102Z,Confirmed,BAT,OUT,0.00000000000002231,,5435FAA251DC0E5DB253D8DA6B69D2549C13A67B83585590B7657E90CB9602AC,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T12:30:33.602Z,Confirmed,BAT,OUT,0.000000000000470715,,97C4E84A2B5EB9A9A66735A190AF492E32B1A0A4C387D8568E259529CA6AA06A,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T06:53:12.632Z,Confirmed,BAT,IN,0.000000000001746396,,C64664A96A607A526A1D193A6B93AA298C815B09DDFA203C40CF2315550CD16C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-28T01:34:24.165Z,Confirmed,BAT,IN,0.000000000000213389,,8EC6675E08EDAA3E8434CBF7742200882920F2AB38B0A6BDF441280CC6871725,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T23:48:13.594Z,Confirmed,BAT,OUT,0.00000000000486593,,D893B810C17A665996218439123ED141BDE24D517C53D2C23852256B4E6A8735,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T21:31:30.646Z,Confirmed,BAT,IN,0.000000000000430884,,F86C83F37EBC2B1BCA5072BD2BCCA59312690783FB9FAAD2844292FD3EBC2BED,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T16:31:30.786Z,Confirmed,BAT,IN,0.000000000000635924,,D7D16D439FD7E294778CCEB2DE70900A7344AC8510F1282D61CA3F60A6016313,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T04:06:56.002Z,Confirmed,BAT,OUT,0.000000000001053805,,3AC5C7E82B29B2A205C0AAB2308766C9F1651E4071E18119E734038973119D8F,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-27T02:42:39.642Z,Confirmed,BAT,IN,0.000000000003576424,,D338EE87EFB627D254D1B385F96E0C2CD23B66B280882CAFF8992A071A6BB3C6,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T22:14:20.790Z,Confirmed,BAT,IN,0.000000000000397623,,978DCFC633A5595EC9A22CE822D63275B68A2062BFBA1C1DFC62D060D00592A0,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T11:56:24.561Z,Confirmed,BAT,IN,0.000000000000692317,,9748910E20F4B6311AFD308D96C8C115AE341F7AE9184704834FB47BC89F8E4C,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-02-26T11:24:12.038Z,Confirmed,BAT,IN,0.000000000000960456,,8BF53AAF6A8AC9FA3F7A2811BF3D062FC7A138016273BA71F85F62E2B4A2BDC4,pponmSa68ucPNBom8Xk0X63,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, -2018-03-13T15:46:10.746Z,Confirmed,XRP,OUT,2.411812,0.024118,65267F4316C1BF8E1A44E6D3C71199A039B285CD725A133592B47613BB3512AB,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,0.25 -2018-03-13T15:45:41.669Z,Confirmed,XRP,IN,720.663508,7.206635,D640F9A3E3D62111F74D2A06643C67F6E963F6D289B19DCB4549F0E04CA406A5,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,75.05 -2018-03-13T02:14:07.352Z,Confirmed,XRP,OUT,35.361685,0.353617,C117CDC56A62392626433257E141462671CA74C4F4EFAB72158D8E95140DA8ED,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,3.68 -2018-03-12T18:35:25.124Z,Confirmed,XRP,IN,111.776239,1.117762,319072CD6D5FF527B67F8ADA0351DB2A8A850A304D47E547670C3D5DDBECBC55,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,12.23,11.64 -2018-03-12T16:12:07.357Z,Confirmed,XRP,OUT,1011.000641,10.110006,823B1DBB1C0B4FCAF81051AFAD0CF2E63C6A733C6CE4CE75C679F2C77FA2445A,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,110.62,105.29 -2018-03-12T14:41:11.463Z,Confirmed,XRP,IN,25.107143,0.251071,D928245DBC44CA245DC59326433404BDD782331B1DA72C26DFBB2E8788CFD629,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.74,2.61 -2018-03-12T14:04:32.517Z,Confirmed,XRP,OUT,3.938715,0.039387,C39F4178C9D47A14C4D4765BE4B9921D088784448BCC3A929B6BA90D01AE4BCE,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.43,0.41 -2018-03-12T10:40:35.043Z,Confirmed,XRP,OUT,257.369909,2.573699,91A27EC87C4088CD9445BAD3B51C13C137CA7A174C8E9054A4E577D194413223,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,28.16,26.80 -2018-03-12T09:18:38.106Z,Confirmed,XRP,IN,530.546735,5.305467,272BCAA487F44065DDCCC430278A92C38D2AD44B6D4AAC3DF54C6BE51F377DA0,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,58.05,55.25 -2018-03-12T04:30:39.781Z,Confirmed,XRP,IN,10.53216,0.105322,FA1310DC960FD10C1F5144CD3E6DABBE363D6FEFB1BC28E2150C0112AAB91282,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.15,1.09 -2018-03-12T02:34:18.075Z,Confirmed,XRP,IN,47.073725,0.470737,D277C65E4C6FF4EC1E40BB4D8F7357414F1C4008EB838703E618F2BEF0C09E5F,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.15,4.90 -2018-03-12T02:27:03.344Z,Confirmed,XRP,OUT,3.661096,0.036611,5CFF549B29C78BCD046A00DB569CF61A5201A30A9D4D92C254898199B586D419,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.40,0.38 -2018-03-12T00:11:08.193Z,Confirmed,XRP,IN,8.588829,0.085888,1558AC5E9C464D1386192632A03EE835326827659A0560F3BBB25283E86BCCBF,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.93,0.89 -2018-03-11T20:17:53.150Z,Confirmed,XRP,IN,363.159995,3.6316,749AF2CA71C539EB5EFEF8775852548FA88A8B3C5407CDA347D592892BE01D94,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,40.33,37.82 -2018-03-11T17:16:29.589Z,Confirmed,XRP,OUT,263.61633,2.636163,13DAFF97E5680A956CFE0D682057FFC325F9EF3D8E197A7571ED3819142DE05E,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,29.28,27.45 -2018-03-11T11:51:48.020Z,Confirmed,XRP,IN,167.5429,1.675429,780CB43F9E0F328E73C441A41A371D082A239A7F44150860E9914F0762EE4AAD,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,18.60,17.44 -2018-03-11T09:00:18.484Z,Confirmed,XRP,IN,172.071556,1.720716,28ABAEA3A06277404C8E172287ABE6E40900C6544DD5B019878D5CB8D2306957,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,19.11,17.92 -2018-03-11T05:43:02.605Z,Confirmed,XRP,IN,153.922232,1.539222,219B8896D8B5AC5FEE11A1A306A2665DEC58322E582B7F86179E07FEC5F33B0D,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,17.09,16.03 -2018-03-11T01:02:50.305Z,Confirmed,XRP,IN,15.407839,0.154078,811118EDB8A6D3FE48673D855E33151EAB0883A677E9DA358D9831BFE78D5A1F,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.71,1.60 -2018-03-10T23:20:31.984Z,Confirmed,XRP,IN,384.744851,3.847449,D1FF581547C85A754A14D193E1E4D4B5801242D077C18DDA79D7FEE24D837353,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,43.24,40.06 -2018-03-10T21:14:30.979Z,Confirmed,XRP,IN,9.265524,0.092655,7B45C0BDBCC11EACE1DA891D035A95BFA4476F9668D3B933E5036DC11E5C2854,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.04,0.96 -2018-03-10T15:04:58.667Z,Confirmed,XRP,OUT,169.590338,1.695903,47E7CD49DA15E3151D973731037D6AB094E1FE843FF698CCDC666EE086B028BD,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,19.06,17.66 -2018-03-10T11:26:28.174Z,Confirmed,XRP,IN,826.627105,8.266271,423209801542A9A9E2DA57E2D912F1C5426967619A1223E0844946B1FC0AA097,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,92.91,86.08 -2018-03-10T09:16:11.848Z,Confirmed,XRP,IN,148.335155,1.483352,A186A6D4A39F9027E38B5F673C38FF4B3C1C5BF292B48B1130115B226DC213DC,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,16.67,15.44 -2018-03-10T04:39:55.064Z,Confirmed,XRP,OUT,545.173771,5.451738,4695029228DD508A7C3ABD01B7F23F1111F2EC8BD90A6A3E90B037DAAC929438,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,61.27,56.77 -2018-03-10T03:48:11.392Z,Confirmed,XRP,OUT,37.686741,0.376867,FE0C40861163743CA4AFA113745509BDA87500F92BECAD0A741540719E84E522,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,4.23,3.92 -2018-03-10T03:41:17.247Z,Confirmed,XRP,IN,209.463328,2.094633,6FF921A3FFA5D4162EBC285CF7A09875A278ACF466A4F95B1D913A88FF5669E4,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,23.54,21.81 -2018-03-09T12:36:56.652Z,Confirmed,XRP,IN,48.617979,0.48618,B236B319CAF6681D4CF466797EE97F23E0C0F6D919C03CE0812D453EF73CFBA7,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.50,5.06 -2018-03-09T04:06:47.803Z,Confirmed,XRP,OUT,230.926726,2.309267,C9B251CB33F9F225C60610F246270DCEE202CE375289F80061BD26DDC1311678,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,26.16,24.04 -2018-03-09T01:38:57.978Z,Confirmed,XRP,IN,17.333819,0.173338,A7762B53BDE39A8D0641B843382937B299847364977124244471BAFF4FA5FE7F,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.96,1.80 -2018-03-08T22:10:44.573Z,Confirmed,XRP,OUT,14.141203,0.141412,E6EF3522AF9B68003606BFA43530D6BE05D19D5E9D4C12F01DFD2D7E46D3CE0D,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.60,1.47 -2018-03-08T20:18:15.418Z,Confirmed,XRP,OUT,316.572102,3.165721,6EA2E8CE2D84427253F1A34D1C69DD896B7A2EA4F58F914A8E7EA59763F54621,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,36.02,32.96 -2018-03-08T19:10:49.718Z,Confirmed,XRP,OUT,140.128051,1.401281,FC9A7B187D39CB462B2A0306ACF6EDAD05AC055FC06531261A1235BCDE80DD7E,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,15.94,14.59 -2018-03-08T17:47:25.426Z,Confirmed,XRP,IN,138.080613,1.380806,EDC698653D4A1C029AB01C45729D391C73E11268A27D5417A2A300FA9A22C4D2,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,15.71,14.38 -2018-03-08T12:09:49.832Z,Confirmed,XRP,IN,557.75337,5.577534,19B9607D5D6033791D44F07FAC9FDADF1C9FA1CF55C33E2D43F9B30E40A8A332,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,63.47,58.08 -2018-03-08T11:36:18.800Z,Confirmed,XRP,IN,136.55371,1.365537,C056E3E76E6F9E30539A7C68DC42ED80224A412BEDD43EB8CEB9E91D8C18279C,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,15.53,14.22 -2018-03-08T07:07:12.336Z,Confirmed,XRP,OUT,149.272118,1.492721,4561678D47DB439D61540C6B323980BCB3709329E1BB3FBC32018DD369E4FD08,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,16.98,15.54 -2018-03-08T06:52:15.943Z,Confirmed,XRP,IN,1.457498,0.014575,EE8013FEBDA9EDEFA0CB2DAE06A092002C900C76C266B108066D850FD7EFD9E4,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.16,0.15 -2018-03-08T06:41:37.091Z,Confirmed,XRP,IN,441.51788,4.415179,85EAC9E9373A6F012F3D9F3FEE38245FBB9BC7715FE9B19F53E24BB0D12F4683,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,50.24,45.98 -2018-03-08T06:19:30.688Z,Confirmed,XRP,IN,34.077698,0.340777,BA52B65E229EEEF12E5FB321D434FC3F4FA4C5A4DE997AD2534C1A6FAB159DAD,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,3.87,3.54 -2018-03-08T05:48:28.738Z,Confirmed,XRP,IN,230.562351,2.305624,7D93C465C0215D8546E18913FC5B6EBC067CC5CEDE5C7DF542F66522975EBD88,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,26.23,24.01 -2018-03-08T05:41:52.196Z,Confirmed,XRP,IN,60.017698,0.600177,FC590175FBF1567992BB137AFC05367F3D25AF07AA4A565DBD70B6F7DF530919,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,6.82,6.25 -2018-03-08T03:04:26.903Z,Confirmed,XRP,OUT,645.237971,6.45238,14C23253B3410DEF29DBCFFFCD12A9CA2103E2A9BE4B99DA921A83A42F1F1B8A,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,73.42,67.19 -2018-03-07T21:42:40.876Z,Confirmed,XRP,IN,387.763954,3.87764,5C821E7AE86C7F145B2A137C5298E218877F955DA0B1ADE392E51DA442C09F8F,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,44.14,40.38 -2018-03-07T09:35:56.183Z,Confirmed,XRP,IN,504.710842,5.047108,F166DDB8130040FF32B9EA078DC8893FF6D04FDBB0394227F53D9565AA827F63,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,57.45,52.56 -2018-03-07T07:49:20.100Z,Confirmed,XRP,IN,0.034702,0.000347,0FBE87513625682714A6783D36CBC4AA7555E3BA23DA956FC232DA855D7CA984,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.00,0.00 -2018-03-07T06:25:04.305Z,Confirmed,XRP,OUT,32.672253,0.326723,64EFCF2209831E42273E0F76F1965ADEB34EC8F9F0395C64C8757645D5F3DF75,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,3.71,3.40 -2018-03-07T05:32:07.009Z,Confirmed,XRP,IN,292.176357,2.921764,4879F10E51F86C0A94A237D1006FA58421331F0174B7AE448C103363CBB7F139,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,33.26,30.42 -2018-03-07T04:03:44.707Z,Confirmed,XRP,OUT,123.106553,1.231066,876F415C2DD5CE9E6466093404095AEA42D394ED1687FFD42B49784527EE594B,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,14.01,12.82 -2018-03-07T01:58:08.982Z,Confirmed,XRP,OUT,1253.778217,12.537782,EFD16EBBD9C685DB9A5EB5104EA8F7C01133A959F0507EC3363A1F5E3FD2C7CC,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,142.72,130.57 -2018-03-06T22:29:42.717Z,Confirmed,XRP,IN,170.041469,1.700415,62539F7615C413D7D0B9079ADC60EDC8176CD482B0B22745D275E75724EAC986,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,17.70 -2018-03-06T22:26:14.014Z,Confirmed,XRP,IN,201.690003,2.0169,05609E665A052AD318C2099C91E1DAA8AC558AA5172E87BC8319D83EF079F140,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,21.00 -2018-03-06T20:18:22.321Z,Confirmed,XRP,OUT,160.498325,1.604983,D39505093E47A49FB3D8DD3E7A51C31A85D5B12CCC8149A16FE85B4678855ABC,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,16.71 -2018-03-06T19:30:56.107Z,Confirmed,XRP,IN,19.936494,0.199365,552105F46E16F946174004C2DEEB5C965532D49E9C86D0ADD795DA18786620DA,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,2.07 -2018-03-06T18:18:03.875Z,Confirmed,XRP,IN,19.693578,0.196936,C931F529AA218A308E8CE5440D05C43862F4854CD7E7DCE1F74B1C6C8B957716,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,2.05 -2018-03-06T18:08:28.090Z,Confirmed,XRP,OUT,17.21236,0.172124,A61EB43A89B4AE0A97921CBE862E8102EB8596A346AA36D0E13B2933860CF2DA,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,1.79 -2018-03-06T16:57:41.967Z,Confirmed,XRP,IN,15.72016,0.157202,B8E346404314FB3040951A297E489215EA22F79E8F1981B3DDFD4198753B8373,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,1.63 -2018-03-06T14:39:33.275Z,Confirmed,XRP,OUT,3.921364,0.039214,BCA85E4AA0B0C3452517CC3E23D7A5C0034023B24FE28F6A52EEA46897F37E57,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,0.40 -2018-03-06T13:42:15.180Z,Confirmed,XRP,IN,8.241805,0.082418,07FBB1064C2E0079990BF717D91326CD9F5EBAF2BA7B53A737D6D9868207B569,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,0.85 -2018-03-06T11:11:17.191Z,Confirmed,XRP,IN,28.577377,0.285774,BE89F74EFE16735242067667937B62BB8FECFF39ED36A241FE9112E0C7BF2F24,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,2.97 -2018-03-06T06:44:19.261Z,Confirmed,XRP,IN,42.735932,0.427359,F95602DCD75C8CAA482EFD4246E2EFDE6FD3030C3FEF6D6AC0DF006C7EE3D6F5,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,4.45 -2018-03-06T06:18:06.678Z,Confirmed,XRP,IN,126.490031,1.2649,B41CE2A81DB41A3FA6140002CAB2797D3CA3928B858C0EF6E78D1E7068CBCF2C,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,13.17 -2018-03-05T14:39:09.794Z,Confirmed,XRP,OUT,593.583537,5.935835,3C349F8ACD5FD309198C1FA9772BE370F90D76B71A85B3E4682A97DB522B018F,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,66.99,61.81 -2018-03-05T12:57:44.331Z,Confirmed,XRP,IN,882.046744,8.820467,0EC0966A6BB0C6BFB9FF8B2B1F2C5FAD30C87C1DDDA63F8F02436A0AB06E8841,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,99.55,91.86 -2018-03-05T09:21:17.186Z,Confirmed,XRP,OUT,126.368573,1.263686,2984831620406154236119449C6C8D141BAB9DEAF52B4F462FD5A72390620F0A,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,14.26,13.16 -2018-03-05T02:10:31.734Z,Confirmed,XRP,OUT,1.405444,0.014054,B957AF6DD34BC354BCBD45BFABBC8AC85DADBCA998A8AF64962E06F4C9150135,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.15,0.14 -2018-03-04T23:20:18.810Z,Confirmed,XRP,IN,68.138045,0.68138,C7D093BDD162AD93F55512BD8C713DB0C364ACF109079FBCB45087F25F95B709,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,7.63,7.09 -2018-03-04T23:07:19.997Z,Confirmed,XRP,IN,241.701802,2.417018,5094F12E823718B7D6B7395B3F8C9C7C513DF572A0D2DDD3F7DEED0B257AA70F,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,27.09,25.17 -2018-03-04T22:38:13.115Z,Confirmed,XRP,IN,276.716464,2.767165,07A1DD833D1149C8CFF12EC9FCD7B6F6E2CB1F23F6412BA2E0BDA009FAAF3B7D,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,31.01,28.81 -2018-03-04T22:30:49.316Z,Confirmed,XRP,IN,1.353391,0.013534,09D099B6C71037574DBF11AC71FA7C7E5D9F96795FD6A8506FAA7D7888ED7555,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.15,0.14 -2018-03-04T21:09:59.485Z,Confirmed,XRP,IN,360.470563,3.604706,91545D8C404F9E52C39DC356021CAEE12EDBCD891562B540B53008B381072951,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,40.40,37.54 -2018-03-04T19:20:22.864Z,Confirmed,XRP,IN,16.431558,0.164316,B70A76AB21D846B7AA65E74FBA32040B43BB03843F30A168A1BE05472A616C25,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.84,1.71 -2018-03-04T18:21:28.924Z,Confirmed,XRP,IN,120.000694,1.200007,1E1DDF4A7F1DD8A6FE6F741925B885CFA78DBE39C5C1C952F106AD1311548FAE,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,13.45,12.49 -2018-03-04T12:35:37.610Z,Confirmed,XRP,IN,1421.546683,14.215467,88BAACB5524B73B364924D7A11EC53400CDD6A56EBB6F240FA28320A7ED4A87D,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,159.34,148.04 -2018-03-04T07:10:21.931Z,Confirmed,XRP,IN,0.624642,0.006246,0DCAE3C4EDA5D826A21F6083B11FF74B39C91D86662268384F4D072D7D12EA42,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.07,0.06 -2018-03-04T06:47:10.355Z,Confirmed,XRP,OUT,268.006177,2.680062,649455FE0D600B8443D9BCA1EE2E43D5D1835F5FB98651F704B823B568B91989,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,30.04,27.91 -2018-03-04T04:24:53.289Z,Confirmed,XRP,OUT,67.548106,0.675481,D2454515EB7B6E154F2F341E1F28A435906AE950806BE694CD6FA393C18A726C,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,7.57,7.03 -2018-03-04T02:34:02.297Z,Confirmed,XRP,OUT,4.736869,0.047369,1B8F79387D6E206AF246EA47BFBC8AA1BF707445D0A7ACB0BA5DFF9DBADF2354,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.53,0.49 -2018-03-03T20:03:57.050Z,Confirmed,XRP,IN,193.899328,1.938993,AF3165773F117D18E04BEB5B3678BC790EFCA8E73AC576FC2B2CBAE13F63FDA3,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,21.58,20.19 -2018-03-03T19:56:24.344Z,Confirmed,XRP,OUT,87.588707,0.875887,A0BBA1AA636ADFE6429090091AD2B113399D2C3AD599C539100CA24BAA55D502,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,9.75,9.12 -2018-03-03T13:04:51.533Z,Confirmed,XRP,IN,447.799004,4.47799,F54DB531B7AD97E87114242E49E4233DD007924A1A859DDA17C154BDC57DACF3,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,49.85,46.63 -2018-03-03T12:50:52.967Z,Confirmed,XRP,IN,2.394461,0.023945,D44FB5CF4AC073AA625D2B8491D398AD6974EEFE068619DB20DE52889B7D1D68,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.26,0.24 -2018-03-03T05:07:51.519Z,Confirmed,XRP,IN,96.507209,0.965072,83EDCAAEA987DD6AAA259BD369F9C3459A014DB7390C0523DF196826AEB30FDB,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,10.74,10.05 -2018-03-03T00:47:13.789Z,Confirmed,XRP,IN,380.719379,3.807194,A79B55A527FDE9FB07521C567503ACCDB8D4B53ADF2E9E7C9DDC80F0BF18800E,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,42.38,39.65 -2018-03-03T00:39:39.689Z,Confirmed,XRP,IN,19.068936,0.190689,856A10A89CBB8F1A5D6025F4FCA77769A497F25986A8C78A7FD2F281811952CF,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.12,1.98 -2018-03-02T23:43:13.500Z,Confirmed,XRP,OUT,12.787812,0.127878,B00EDA289F5466E709B158839512D5BEFB907E444FAD78E0B449FC056C5D90C6,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.41,1.33 -2018-03-02T12:41:01.337Z,Confirmed,XRP,OUT,825.898356,8.258984,F2273B445710BD5066B01ABF9E9ECBF03B15681561B74F72C51D5AF2CEAAC855,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,91.48,86.01 -2018-03-02T11:56:46.033Z,Confirmed,XRP,IN,361.424878,3.614249,E43C08ADE8039BD30D00972CAF906046EE65675246682A3003BD7F0F068BCB24,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,40.03,37.64 -2018-03-02T10:31:41.116Z,Confirmed,XRP,IN,48.739437,0.487394,BFDA46F681F00CB5171387F249C8DA24F2B5251101165E8555475C4C69F8A244,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.39,5.07 -2018-03-02T10:31:39.388Z,Confirmed,XRP,IN,108.930647,1.089306,A78912707DFAEBE13CDAF01EA7847A823D2B123A25B9934AD1087BB1EB7A986F,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,12.06,11.34 -2018-03-02T09:24:51.523Z,Confirmed,XRP,OUT,182.881335,1.828813,DFFC4B887124B06465D0ECA609695D5DD95FD50B2CD20E097C45DB2190B2F4A8,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,20.25,19.04 -2018-03-02T02:07:14.985Z,Confirmed,XRP,IN,42.892093,0.428921,3B20490C644EA976C60CD1DA08AA37412955F63EBE10C4286AAED2075BA00E0E,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,4.75,4.46 -2018-03-01T23:24:15.176Z,Confirmed,XRP,IN,49.121163,0.491212,B2F8387DE8A264ACAA0CBBA3E288E492232DF40FE8E3C08F06DE4FE92F7B4CE2,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.42,5.11 -2018-03-01T14:47:12.582Z,Confirmed,XRP,OUT,46.605243,0.466052,0DDAD33E61AF7DEA853D28B8B118ECB47AE03DE33B3F3272EC50249627FFF7F5,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.15,4.85 -2018-03-01T09:45:52.028Z,Confirmed,XRP,OUT,50.682768,0.506828,B723214C42F1CB7426D8B7B8FD1A3C51F156E86AF2BF3C4EDE62B7F564857436,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.60,5.27 -2018-03-01T09:43:45.042Z,Confirmed,XRP,IN,5.396213,0.053962,F7EA6DA98F32D4505E46DFF02A8696631CC9207985C3131403B498AA333F5376,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.59,0.56 -2018-03-01T03:23:52.322Z,Confirmed,XRP,OUT,51.567678,0.515677,7428D0F0C26E2EAD90942F3EFB656D2B27243B16AD3C98F52DE4FB6FE7E353F4,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.70,5.37 -2018-03-01T01:12:37.701Z,Confirmed,XRP,IN,2.2383,0.022383,39FDA2CB5A76097CEF08892D58CE534FDDE9C9D98CA96F8727A512AEAF852876,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.24,0.23 -2018-02-28T18:57:21.916Z,Confirmed,XRP,OUT,459.892769,4.598928,CF9E0E63EC9C76F287031562CDB07388C772A430440B8C7BA4C50C4A9692C9AD,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,50.94,47.89 -2018-02-28T18:56:51.591Z,Confirmed,XRP,IN,731.80296,7.31803,CBEF4FCF076C6F3BF032576953C089D5BBB73E90B4C8ADB561CF44F55F283F6C,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,81.07,76.21 -2018-02-28T17:21:06.012Z,Confirmed,XRP,OUT,392.188503,3.921885,514294CECD00F629E74A4BDD396F0683D7F07EFA6144FF5BB2D4CCAFCF7F816C,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,43.44,40.84 -2018-02-28T13:35:43.098Z,Confirmed,XRP,OUT,117.380667,1.173807,808E4E7322C9B61C621EEDA5C5E3ADCBEE143955A49C34CD508C7FEB3B48430D,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,13.00,12.22 -2018-02-28T13:14:37.988Z,Confirmed,XRP,OUT,342.963232,3.429632,0C9A692428E6B6E15E4E0B6681EDA33B23DEEF2AD4DBB199DE999B1A833E4F0F,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,37.99,35.71 -2018-02-28T13:14:23.005Z,Confirmed,XRP,IN,129.023302,1.290233,BFF2726F2E0D7BC15E3975BD564773B52BFFF97AF7C26D841DADD545C6ADFB09,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,14.29,13.43 -2018-02-28T12:21:19.413Z,Confirmed,XRP,IN,74.245657,0.742457,61186759317ACE6CFDDD6CF7FAFBAF4DB28984C129E70143E0BFBDA7F7E177B6,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,8.22,7.73 -2018-02-28T10:22:57.338Z,Confirmed,XRP,OUT,1.873926,0.018739,63BA1F6F820949F37A4F1AAFE1B8C339CF81042122DF2A2FD86F6E0CE7F7B650,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.20,0.19 -2018-02-27T19:59:34.022Z,Confirmed,XRP,OUT,308.434403,3.084344,A8D21970588AFA66AF22210A3D7CDC70A3418D86F1D8FCF6C3DD81D2DADA42BB,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,34.41,32.12 -2018-02-27T18:34:40.674Z,Confirmed,XRP,IN,10.618916,0.106189,F0781BD8DDC81BC18C3E627D2DE434B13627F18CF2659FFC9CAD76E4E7EE4C7A,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.18,1.10 -2018-02-27T15:34:31.470Z,Confirmed,XRP,OUT,240.78219,2.407822,193151F5F1D23CEAD9C664EBB8BF5F4C4A3EC83C0EE3B1E30DEA9597611821A2,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,26.86,25.07 -2018-02-27T15:11:33.939Z,Confirmed,XRP,IN,282.025922,2.820259,F15269BE71626CE694C4A093779BAA6FBE7B78AB46F9C5281D55036FFE49F461,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,31.46,29.37 -2018-02-27T08:44:01.251Z,Confirmed,XRP,OUT,19.103638,0.191036,15C9B7B0027A7B5F6F5913664C028D542CEC4F682F5A40364BFA88A0A32DE83F,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.13,1.98 -2018-02-27T08:38:53.766Z,Confirmed,XRP,IN,266.930404,2.669304,2CE169710FDF73DF36C77A9C75B6B3359A5C6F984651D83997628F1260D67FD6,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,29.78,27.79 -2018-02-26T21:41:10.696Z,Confirmed,XRP,IN,11.989658,0.119897,F6C27F627BF4058454E0E3BD6AFF94D6DB210AD16FFC258D9D8254250C655240,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.35,1.24 -2018-02-26T21:25:35.257Z,Confirmed,XRP,OUT,313.674457,3.136745,85A31657C5F8117251F0EF65590D81096A369B363E4845DB5A3872D32DF972DC,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,35.42,32.66 -2018-02-26T20:09:14.257Z,Confirmed,XRP,IN,0.052053,0.000521,3D2E73C98929C434539CC55C4818265D55C3DB32A1CF3506D4DA638AACEFE126,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.00,0.00 -2018-02-26T19:35:39.515Z,Confirmed,XRP,IN,99.734527,0.997345,F389B0D467FF2643DCC094C66BCAAD9540A65C0BD7D8CCC985BA44FA0ADABEE9,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,11.26,10.38 -2018-02-26T18:39:37.853Z,Confirmed,XRP,OUT,1.578956,0.01579,BDE54B97D2D6EB11C02F9063E7168D11257276918470214414F21E839A260586,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.17,0.16 -2018-02-26T11:26:41.207Z,Confirmed,XRP,IN,67.305189,0.673052,80C2F9E1B937EC166F7C3156CB93B713D29C072722660A04C75A07293090090A,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,7.60,7.00 -2018-02-26T11:26:01.221Z,Confirmed,XRP,IN,803.584751,8.035848,5CBE0B3A556829C86A49AF0C191E013C63ABB68DCAF21433B69EC064760ADDC4,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,90.76,83.68 -2018-02-26T10:40:31.862Z,Confirmed,XRP,IN,225.634619,2.256346,34B90F5657A29432CE642D5F3C5FFA72AF72D5362568CF287DFA6BF39C952A19,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,25.48,23.49 -2018-02-26T10:37:41.831Z,Confirmed,XRP,OUT,51.810594,0.518106,FE6315ECBB6DC6CF4DE0A4835B8157B72FA8AEF2FABA5E10A64CA0AA2CCAAC5D,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.85,5.39 -2018-02-26T09:09:42.139Z,Confirmed,XRP,OUT,928.964308,9.289643,B3FDD367EB36F6959D82197DE67414651F56765031BB0A9B905F396763800BAA,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,104.92,96.74 -2018-02-26T03:36:36.729Z,Confirmed,XRP,IN,19.676227,0.196762,E4C770D854F73072BD7630C751CF165551A079CBF9F36AC1127A3A532033BA22,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.22,2.04 -2018-02-25T15:41:24.227Z,Confirmed,XRP,IN,72.701403,0.727014,554C512A1ECE90D59FD72A01FBFE7F476B18E3F5911BC170DBBA0060085484C7,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,8.34,7.57 -2018-02-25T15:24:34.863Z,Confirmed,XRP,IN,148.161643,1.481616,9A96E37A6548E384E3A609BD0511178A457A79E4C663453D321689E406AF7928,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,17.01,15.43 -2018-02-25T15:23:25.181Z,Confirmed,XRP,IN,103.135356,1.031354,8706F948C400AC6A532B1DD1DDA854852376AB7AF584D6C02796051EB7522C66,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,11.84,10.74 -2018-02-25T15:03:24.623Z,Confirmed,XRP,OUT,118.387035,1.18387,BEAF04764AA99BDB9CDE3EFE9FF1F860254A2530FA5729F9807802BE148D9587,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,13.59,12.32 -2018-02-25T13:18:34.071Z,Confirmed,XRP,IN,180.764492,1.807645,F65DDBF5466F578ACA3A74928C5C4EDC291738FF677D4FF0DD695F942F255586,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,20.76,18.82 -2018-02-25T10:01:15.608Z,Confirmed,XRP,OUT,98.415838,0.984158,2D08A260A594FB5AE807E06186F8C53FCB52476832692DC28B0D3BC4168DD843,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,11.30,10.24 -2018-02-25T09:28:01.023Z,Confirmed,XRP,IN,24.777471,0.247775,9DC9C82BDB948D26BF29FEE4EBCDBD1B6A49EB608179E6D94926A169A09183FE,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.84,2.58 -2018-02-25T01:46:24.278Z,Confirmed,XRP,IN,104.072319,1.040723,243DB42435DC04D032CABFF30F5FD75D8AE2C6971632601567D20842ED0DC364,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,11.95,10.83 -2018-02-24T23:57:50.862Z,Confirmed,XRP,OUT,593.583537,5.935835,7B6A8FCE362CE28CCE8A9287E189B3B8C5A84681ED7283B9C372B8FBFB85C8C6,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,69.54,61.81 -2018-02-24T17:55:34.997Z,Confirmed,XRP,OUT,162.025228,1.620252,A76753325411035A4A7C01716854F35FF282ABAB3A8923051FAD10BB0F0535A1,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,18.98,16.87 -2018-02-24T16:11:50.089Z,Confirmed,XRP,OUT,70.862179,0.708622,DF8DD4C1F1E5503B7626FD760736ACB6FF77F128C70E534BC69D23D7AE585AB9,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,8.30,7.37 -2018-02-24T16:02:51.911Z,Confirmed,XRP,IN,476.480488,4.764805,EBB582030342883D01523C660D8B2336504339CE4F25C191128E916D28088E4C,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,55.82,49.62 -2018-02-24T15:02:42.594Z,Confirmed,XRP,IN,417.434455,4.174345,92061F0AC044B3A3FF40F0F40C77E8AF2E9C74CE48EF4581A1D5DF510056DBB0,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,48.90,43.47 -2018-02-24T14:40:40.308Z,Confirmed,XRP,IN,7.287491,0.072875,7EF7156FA1953A1DF98C0409140119874A92BABEC540DFD5E96D84C91E1551D5,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.85,0.75 -2018-02-24T09:41:08.831Z,Confirmed,XRP,IN,480.158936,4.801589,D9CCDF5F62833F297AE387A5C5562FF71D4ECED107E4BEA46FBE00EB5075251C,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,56.25,50.00 -2018-02-24T07:35:26.325Z,Confirmed,XRP,OUT,46.570541,0.465705,172079B19C99ACA712C221A030E3D2BCF7E655CD3641F736F73DC2E810D6727A,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.45,4.85 -2018-02-24T06:29:58.755Z,Confirmed,XRP,OUT,8.502073,0.085021,95C6DE24935601E1DF31BE2FECA3731FE7C6A958DF91305F9A8081FB5559F522,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.99,0.88 -2018-02-23T21:06:02.812Z,Confirmed,XRP,IN,59.046032,0.59046,4D0B6B417325916A8A71E2FD1C88861E3E4552461DC2F41BFBF646DEF1ED07F4,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,7.07,6.14 -2018-02-23T15:46:07.147Z,Confirmed,XRP,OUT,950.445057,9.504451,18D22E24D10CC8698589BC3984D2D7AC16F2A52600336B8BD249F7DCBA61B3B7,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,113.81,98.98 -2018-02-23T11:43:34.095Z,Confirmed,XRP,IN,616.452379,6.164524,C03E79FA7C4846397A7CAC97C1AC5D246F6A725E26478C448ADD30EBC52399ED,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,73.81,64.20 -2018-02-23T09:35:25.832Z,Confirmed,XRP,OUT,20.960213,0.209602,9AFEA53F1D41906B68569D8995C597089C79A246538CDBB0FEA460C4E88FE07E,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.50,2.18 -2018-02-23T09:04:51.028Z,Confirmed,XRP,IN,55.593149,0.555931,B03AFC75CB97A97CACD396342E8E422754B596A624C26E580E2C5A5A9C67C6A1,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,6.65,5.78 -2018-02-23T02:39:30.016Z,Confirmed,XRP,IN,197.282806,1.972828,FE1AB4B01E830BF58276E68E5C933C39AC7D0AB260A37C9D06733494C84F2733,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,23.62,20.54 -2018-02-23T01:49:11.999Z,Confirmed,XRP,IN,141.759061,1.417591,1AC86CAB5DEDF86D59B1EAD093E7237880E08BCE47D2B28EB5175EE7934D93A6,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,16.97,14.76 -2018-02-23T00:47:16.094Z,Confirmed,XRP,OUT,44.384293,0.443843,C7F5AC4BE9265D9F0515B6E0C4F58B9AC89C58E456392CF1DD9D2D1110E2D29D,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.31,4.62 -2018-02-22T14:51:15.245Z,Confirmed,XRP,IN,97.721791,0.977218,01682B3B90C3E19FCA47A1208CBEF9E8F54E259D8F6ACAF2287CEF8E3393132B,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,11.95,10.17 -2018-02-22T12:42:16.203Z,Confirmed,XRP,IN,65.726233,0.657262,50ECBA1102200D7819B2CFE35157F14B5BED6FA3BA8B83D0CD875056D09EA36B,b3rctwZRGMjRHi0hVdjWJo2MbGvi4i,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,8.04,6.84" +2018-03-14T17:20:32.454Z,Confirmed,BTC,OUT,0.0067904,0.0000679,0F7CD80033E4AC2C1DB064D7B71F602F589B33D0B452426ACD90A9E1C8C41DEA,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,17.78,17.78 +2018-03-14T15:13:42.205Z,Confirmed,BTC,IN,0.00119081,0.00001191,ADCEEE94EC916B4281A2ED66111B338640E7E1A874E72B3EDCFF3D1203050160,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,3.11,3.11 +2018-03-14T15:04:22.979Z,Confirmed,BTC,OUT,0.01991267,0.00019913,BC322244321340447CBBFB0C1FFE9B9F6065D8120D4888CF1920314D185FE0C4,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,52.16,52.16 +2018-03-14T14:51:48.237Z,Confirmed,BTC,IN,0.01893127,0.00018931,AAAD825C26D83ADB2F1ADABC87622B80BABE73232298D3AA91662288864E1A5C,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,49.58,49.58 +2018-03-14T14:48:32.740Z,Confirmed,BTC,IN,0.03015644,0.00030156,B3731DE7824E75513FFC29C0D59652CA9B816D7389234560555E11B7927ED1D3,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,78.99,78.99 +2018-03-14T14:15:26.942Z,Confirmed,BTC,OUT,0.00692454,0.00006925,8545D8D4B0BF7E8A09FA954DB85FBC33B892E9EB80C789923CAAD6A3AA1D2C20,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,18.13,18.13 +2018-03-13T23:59:44.590Z,Confirmed,BTC,IN,0.00207503,0.00002075,62BE1A831393011ABD4F3766D1BC82AC03559FDD2E09192356E2BF5182B59712,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,5.46,5.43 +2018-03-13T22:13:18.439Z,Confirmed,BTC,OUT,0.03874813,0.00038748,3E499F59B7D2684A0CBE0F0A95D0F184CCF1CDE79271ADD68C81BC3CF89DCA4F,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,101.99,101.49 +2018-03-13T21:51:36.522Z,Confirmed,BTC,IN,0.01257203,0.00012572,12B858070D39A22CE04FABD682325795A2FD57996DF71127EC45163E4BF34EA0,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,33.09,32.93 +2018-03-13T20:29:44.153Z,Confirmed,BTC,IN,0.00638251,0.00006383,7819F674571257970FD98C2CB19F0D2B74E9CF3F6D28A7B922955DB22C9C281C,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,16.79,16.71 +2018-03-13T17:20:32.411Z,Confirmed,BTC,IN,0.016113,0.00016113,45C3EC0F5B16B3EF289546C8116B7B04D4963ADD096D7AE7267533F9B3F87348,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,42.41,42.20 +2018-03-13T08:19:48.002Z,Confirmed,BTC,OUT,0.00159733,0.00001597,9756A3B2C280518E37D57014B77F5918FCD3107A1C70D5473C09F8DF2258C06E,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,4.20,4.18 +2018-03-13T04:58:59.353Z,Confirmed,BTC,IN,0.00936914,0.00009369,21913C798C9788E6E348F2CD29CD33DD01B1A94FF48391DE4E8295C315F87503,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,24.66,24.54 +2018-03-13T04:35:04.120Z,Confirmed,BTC,OUT,0.03019066,0.00030191,67F7ED408A889B2B2F08B339498B27D29EEC3F934385AB02440A49D6C32C4217,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,79.46,79.08 +2018-03-12T23:40:48.762Z,Confirmed,BTC,OUT,0.01907362,0.00019074,25FE97A3C320A7DF69B4407CC55972E9AD1B240D6F5D011A74842F6C4E8112EE,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,50.70,49.96 +2018-03-12T21:11:02.398Z,Confirmed,BTC,OUT,0.00223244,0.00002232,9C6478E4F1346BD4E6948E5B230B5819305C32733004F235F2D777C4B3EFBE9C,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,5.93,5.84 +2018-03-12T19:12:25.287Z,Confirmed,BTC,IN,0.02175775,0.00021758,F18C86E8F488AD69B5DA9295B4AF3371840BC631FC5BB266AB67094DFD62BE49,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,57.83,56.99 +2018-03-12T19:12:24.523Z,Confirmed,BTC,IN,0.02827303,0.00028273,8DC5C19C1362EE0CAABAB5061B3A9555FCD99717BDCA208AC8C70A4E90927D52,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,75.15,74.05 +2018-03-12T18:44:05.076Z,Confirmed,BTC,IN,0.00273614,0.00002736,1D5880B86D37903EBD9B7F0FDB8EBE739B78DF06DB4B460168FB256C35EDF921,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,7.27,7.16 +2018-03-12T18:27:01.604Z,Confirmed,BTC,IN,0.00001095,0.00000011,C738AA81250D4C07B0291870F7C2D39A534C256C2A3931B03B8E1E87D908CEC1,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.02,0.02 +2018-03-12T10:25:09.415Z,Confirmed,BTC,OUT,0.00063236,0.00000632,5508CC58F656F4BDB87AD18A50D10212DA863B5E9D3D02E3F6243E01128BF72D,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,1.68,1.65 +2018-03-12T06:26:14.252Z,Confirmed,BTC,IN,0.00642631,0.00006426,C04162CDD08972CF370284FD8D259ED4D87F1755DD1E9AB2D0BC79FF06D2D092,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,17.08,16.83 +2018-03-12T05:49:12.796Z,Confirmed,BTC,IN,0.00224202,0.00002242,606E4A240B36BD6FF901F1D1C7DC8B6341A810731CE375950AF4B76EF8543B4B,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,5.96,5.87 +2018-03-12T03:46:58.861Z,Confirmed,BTC,IN,0.05540316,0.00055403,D15C24D94DF37E334E5B2DD2CA99BA688E5BE450C8E2E7F69DD7215732B71D6C,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,147.28,145.12 +2018-03-11T23:31:02.310Z,Confirmed,BTC,IN,0.00450868,0.00004509,0ECF11D144DE389691038A45425BC3B239E681B09DA78272B25C3CF883847AC3,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,12.17,11.81 +2018-03-11T14:54:03.373Z,Confirmed,BTC,IN,0.00206134,0.00002061,2C05712BB11BD1B80739905A7A42B4A057797CBCBDB5493508F40F531D58BDBE,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,5.56,5.39 +2018-03-11T08:23:40.197Z,Confirmed,BTC,IN,0.01964713,0.00019647,AF03402CC1BFA1FFC8AA35CD6844B671216E7DAAB136220634837C36CCEEFD3F,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,53.06,51.46 +2018-03-10T23:33:16.455Z,Confirmed,BTC,OUT,0.03063414,0.00030634,5915964D39A264CDDAFEEE6BD3F102851DFC51C31734DE78B2432FABFB562B70,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,84.56,80.24 +2018-03-10T22:58:10.312Z,Confirmed,BTC,IN,0.00010676,0.00000107,6D1C35D779EC1CCC6FCE581E4B18BEE0C0561CCB32F193DFAF9B17C5B34587E1,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.29,0.27 +2018-03-10T20:29:35.168Z,Confirmed,BTC,IN,0.02859743,0.00028597,A4D6DE57872AE62912E4B271001D06253F73125E63EFA5554F89C2F8B354C9E5,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,78.94,74.90 +2018-03-10T18:07:20.271Z,Confirmed,BTC,IN,0.00066932,0.00000669,AD573CF961DC79CE335EFD5B5A250C9C3D8E0F5EA6FB69A41B76E3DF5E02F785,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,1.84,1.75 +2018-03-10T18:06:59.053Z,Confirmed,BTC,OUT,0.02007008,0.0002007,C159EAA29EC7C01EBF49DDE0CA2D011B627F7CA47B4D90574280083659CAB397,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,55.40,52.57 +2018-03-10T16:37:00.580Z,Confirmed,BTC,OUT,0.00429789,0.00004298,4E48224C79A80F2BFA4AEB00E58A9046BEE7BA482FCBD03B5C9F47C73C15CB41,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,11.86,11.25 +2018-03-10T16:11:30.256Z,Confirmed,BTC,IN,0.02289793,0.00022898,210F623E7284C8EC11289878E426A1B3125B1AAFC954AC70FF063695CF05A43F,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,63.20,59.97 +2018-03-10T13:36:44.132Z,Confirmed,BTC,IN,0.00443887,0.00004439,73D8067712F1D429CCB0CADB16FBAD5A2130D9DA0902C11949FDE83A0092FD7F,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,12.25,11.62 +2018-03-10T13:13:15.168Z,Confirmed,BTC,OUT,0.06711561,0.00067116,9F9D31F0EF135033273B9E2628A3F381D04D63D0BCF728C57DC2E4604872783C,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,185.26,175.80 +2018-03-10T02:57:55.377Z,Confirmed,BTC,IN,0.01033685,0.00010337,62A0F0F58CD423A788E56C20F7D3F2D4FAD39AB1891890B5224C57AD70D474E4,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,28.53,27.07 +2018-03-09T11:37:02.435Z,Confirmed,BTC,IN,0.02148674,0.00021487,5FCB5907AA7636DA1ADBFE1D283EDE0ED66408A32C05EF771FD0146682DEECC9,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,60.90,56.28 +2018-03-09T11:28:38.819Z,Confirmed,BTC,IN,0.00023816,0.00000238,1828C5E23F8CAA709973A12A8FBC73315AF7F4A00181CD37146EBEB755A741C4,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.67,0.62 +2018-03-09T10:31:12.290Z,Confirmed,BTC,OUT,0.00601842,0.00006018,12131152A57728F6BCBE2BE3A7A887DD94A168DA6CCBC66329960B642E245DB3,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,17.05,15.76 +2018-03-09T06:14:05.277Z,Confirmed,BTC,IN,0.03231771,0.00032318,875750ED49B4BD6C3F60C044D2BDE610F5EBFD1DF215BD0331E7D1ADA869B67A,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,91.60,84.65 +2018-03-09T04:08:35.990Z,Confirmed,BTC,OUT,0.01074474,0.00010745,672683ED02D3192EEEC9DA1AB9ACE7447066A829076F8B6736CD8F2FE3EEB329,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,30.45,28.14 +2018-03-08T19:57:00.604Z,Confirmed,BTC,IN,0.01934874,0.00019349,27010FBCA5EC740FB59BC97653D374D2743A24E396AEE3FE2B6F3AC4B1D69216,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,56.48,50.68 +2018-03-08T19:22:59.600Z,Confirmed,BTC,OUT,0.01481542,0.00014815,4A9B605C5D8C4ACFC68B828BC70CE026B3468CA76D83CC68819024AF83D4F649,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,43.25,38.80 +2018-03-08T01:17:14.244Z,Confirmed,BTC,IN,0.000026,0.00000026,9BA7E4A9B760130A1469BEA05B81CF2AEF88E17B784BEB86DB0A303AAA38B915,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.07,0.06 +2018-03-08T00:06:26.654Z,Confirmed,BTC,IN,0.00439097,0.00004391,FEBBD58479E6B30F248E4C190C4202AB1646F6AD65F83B8FFA4CFF1543FA8881,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,12.81,11.50 +2018-03-08T00:00:05.496Z,Confirmed,BTC,IN,0.02050808,0.00020508,E93FD902FF1B6590C8B04C256931AD7003D9B7C85D63AACEB2424057C837FC3F,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,59.87,53.71 +2018-03-07T22:55:27.399Z,Confirmed,BTC,IN,0.0031454,0.00003145,A38AB5A3A8659C115AB07CE667AC973EA87FE756FB4B00381DD4DC245EC22E47,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,9.46,8.23 +2018-03-07T22:33:54.060Z,Confirmed,BTC,OUT,0.02431733,0.00024317,1988322A17F96E3984FE92EF56F54301ECD60D50608F6877F727C5B7552E77D8,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,73.18,63.69 +2018-03-07T18:01:26.619Z,Confirmed,BTC,IN,0.00899273,0.00008993,75F8F696B603BE47D89695771AFE03C5C4C59329F0BDC16F10B287FD967B9FF8,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,27.06,23.55 +2018-03-07T14:41:29.128Z,Confirmed,BTC,OUT,0.00113743,0.00001137,8D5C9D73B6916E103719893AF22AB1D99355888B46431D95A4C9BAA817B45046,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,3.42,2.97 +2018-03-07T10:24:08.286Z,Confirmed,BTC,IN,0.00019983,0.000002,8DD0CD453F8CDDA25472B6B271845DC8F129F5701CA528A49DAEDC6918658184,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.60,0.52 +2018-03-07T09:55:52.151Z,Confirmed,BTC,IN,0.01890937,0.00018909,BAC25693F2D0DBAB8071B52C46948231E3D5F6F364D4023D00A76417541265C5,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,56.91,49.53 +2018-03-07T06:02:09.388Z,Confirmed,BTC,IN,0.05075897,0.00050759,185E55A60AC7158C6BBEFAA3593F330148316E078E944C775B9F6A05A8D38D77,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,152.77,132.96 +2018-03-07T05:40:27.122Z,Confirmed,BTC,OUT,0.02381363,0.00023814,CDDE81257BEC0B7F18666A2EB1A7C9D9ED67FA19A9F8C742A72E147C06F7AF1F,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,71.67,62.37 +2018-03-07T02:05:59.768Z,Confirmed,BTC,IN,0.04570141,0.00045701,DAC9781C36B22F8B8C19B60636126991243126EA9AB545444EB7ABCEA1169E46,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,137.55,119.71 +2018-03-06T17:36:28.439Z,Confirmed,BTC,IN,0.03627752,0.00036278,63D9665735BA39954AA6ED304BEF2FE47D4E2209C24520B7766B6C06F580BE20,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,112.43,95.02 +2018-03-06T15:25:16.489Z,Confirmed,BTC,OUT,0.01475246,0.00014752,FA5CE36EE5DDA0D3D27BAC3410A959EE1A60AC01FE46F38E6A62DD09800843F4,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,45.72,38.64 +2018-03-06T12:40:03.949Z,Confirmed,BTC,OUT,0.00203534,0.00002035,080ED338FD9776CA4813E0B3B641BB0A85A4641BA0E375A4203A4BA0DF778DA4,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,6.30,5.33 +2018-03-06T05:56:02.110Z,Confirmed,BTC,OUT,0.00113196,0.00001132,A911A1F601A4D60505BE00DF9E7DE1B2EDD860F33D8A10FD7EB1983D5F75E9E4,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,3.50,2.96 +2018-03-05T19:32:27.083Z,Confirmed,BTC,IN,0.0080565,0.00008057,C47DF9884D35B5E2580F5743F1FC9EE4FB75C718B2125921FFE497FFCE70F1D5,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,25.62,21.10 +2018-03-05T17:08:46.304Z,Confirmed,BTC,IN,0.0481597,0.0004816,CD3E9EEE91C7DBF21DC422B13045FDE16C668B68084AF8F95F8CB76A96F09E48,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,153.18,126.15 +2018-03-05T12:42:24.451Z,Confirmed,BTC,IN,0.02818954,0.0002819,5FD0BC6A176D3D006FF58BCD8B8DBC09A70C9BC4DAA18EC0E609B571BA9C8002,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,89.66,73.84 +2018-03-05T10:32:28.390Z,Confirmed,BTC,IN,0.01170287,0.00011703,52B0216D2B7A33D50EB6C9890A9847BE1AFF0F67E94BDC7C966F7DAEB7D19CCC,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,37.22,30.65 +2018-03-05T09:07:01.377Z,Confirmed,BTC,OUT,0.05914261,0.00059143,E4B0384A6E4A092851904FC3E2E62FC5C061741EA89A02F90BB47AB502559E6E,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,188.12,154.92 +2018-03-05T08:42:47.316Z,Confirmed,BTC,OUT,0.00602663,0.00006027,C965E30E967B4F09D7511F8B1878EE6017E20A72F63C88C95237AE8B12C3A1C3,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,19.16,15.78 +2018-03-05T07:08:34.691Z,Confirmed,BTC,IN,0.01698627,0.00016986,F484FCB98A7199817B8AB4504CEF62B6D36ED0E7FCB9A618B477600F9A10070D,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,54.02,44.49 +2018-03-05T06:55:23.271Z,Confirmed,BTC,IN,0.01172203,0.00011722,6A444168893201766EA966CE92D4FC1AD8295539CFB1633EEF523E43D7FA09E4,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,37.28,30.70 +2018-03-05T04:35:31.177Z,Confirmed,BTC,OUT,0.00114975,0.0000115,8B3E1B1AC9929387DE4899270903334F7B4BCB30F2B02EE23AF1D51207C166A3,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,3.65,3.01 +2018-03-04T22:01:01.275Z,Confirmed,BTC,IN,0.0427011,0.00042701,47B272D5541ED94CC72A9E91F9C92888CCCBCDE83696F155F492C7EF089E1611,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,138.70,111.85 +2018-03-04T05:11:56.819Z,Confirmed,BTC,OUT,0.00196964,0.0000197,6A52DC545CC104EC4A430F03F182B52AC6894E76DC85F7F5DCC6E58CFF381137,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,6.39,5.15 +2018-03-03T20:48:03.946Z,Confirmed,BTC,IN,0.01104312,0.00011043,4219B61CC1C5AC90BB5DC915777AFAA750D1482E88962204885E0B29E1C8404D,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,36.40,28.92 +2018-03-03T20:47:53.948Z,Confirmed,BTC,IN,0.01040802,0.00010408,6BCA154E70470E68F0A9140617C71529B263A3A544DA89CA9122B96EEB2C7485,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,34.31,27.26 +2018-03-03T19:53:54.395Z,Confirmed,BTC,IN,0.00108816,0.00001088,F2C16F8CFC5E7236CA68A0D12DE86E157C45C65D58475092CBE94C9C7D10E8EC,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,3.58,2.85 +2018-03-03T15:04:15.025Z,Confirmed,BTC,IN,0.00976334,0.00009763,71CBB56D9D8DF9D9FC27D32CC1DE80F667CAFF975A792BF61AE4E70298B86384,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,32.18,25.57 +2018-03-03T13:35:48.183Z,Confirmed,BTC,IN,0.03302673,0.00033027,54648A4032EC2F42892B404DD429FDA104339514E94732A9560415D77AE34E17,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,108.87,86.51 +2018-03-03T13:29:33.409Z,Confirmed,BTC,OUT,0.00006022,0.0000006,3D753ADD599DFF2673782DDEB98B20D09B955D78C22CF169072BC289C0F6A0E2,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.19,0.15 +2018-03-03T08:49:37.754Z,Confirmed,BTC,IN,0.00013413,0.00000134,68C0A42092B17F32B5104A7BEE6FFE0BDCF0187D02DC07C4A7820B305B4A11A4,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.44,0.35 +2018-03-03T06:45:27.171Z,Confirmed,BTC,IN,0.00813452,0.00008135,6B03794D670BCF85C9664DFC30E9C0571FDD3650628CB37429391F462D0BD7C7,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,26.81,21.30 +2018-03-02T22:35:31.318Z,Confirmed,BTC,OUT,0.00040788,0.00000408,A4814177790609580DA53348EF94EDA7EDE19CC7032683E0E1932B5C46C296D5,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,1.35,1.06 +2018-03-02T19:01:56.308Z,Confirmed,BTC,IN,0.00148646,0.00001486,3D09C10FD1E2199DBFFE01922884809868CF4A45FBE9581777AAAC27C872BED7,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,4.93,3.89 +2018-03-02T13:48:44.467Z,Confirmed,BTC,OUT,0.00033534,0.00000335,A3CB7D794D3E37F1A196DA0014A17D35BC47D1BB5B95A81880C560DA7F78ED2E,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,1.11,0.87 +2018-03-02T13:19:53.715Z,Confirmed,BTC,OUT,0.0162444,0.00016244,2966A7A1B21EEA4968FFB76856CA642DA201FF214ABEB2766899A4043FEFA423,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,53.96,42.55 +2018-03-02T13:16:33.584Z,Confirmed,BTC,IN,0.00778275,0.00007783,428E2260BA8556424E8D3A3AFC5CC0ABB9484E228BFA223E010AE8BB721478EE,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,25.85,20.38 +2018-03-02T06:04:08.178Z,Confirmed,BTC,OUT,0.0107242,0.00010724,ECE681EC9273BAAA92ED5DC65AE40E2CEA3C66ACFC498C19B34BC2430A04BCDD,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,35.62,28.09 +2018-03-02T02:43:39.955Z,Confirmed,BTC,IN,0.04091761,0.00040918,43CF39D2193465E96729B12B78377A4021A10B5296B657B23E0160525B25A6E0,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,135.94,107.18 +2018-03-02T00:02:52.517Z,Confirmed,BTC,OUT,0.0019231,0.00001923,80E03FF9588314769FD43B218E8874F7CF8CE9736469B99BE20927032DB81BE7,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,6.38,5.03 +2018-03-01T23:35:25.635Z,Confirmed,BTC,IN,0.01713957,0.0001714,EAE990BA6413A39E234458A8F9275C614288FC267BE6394009E14E56E54C51D3,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,56.98,44.89 +2018-03-01T16:07:32.725Z,Confirmed,BTC,IN,0.04838007,0.0004838,97425FA97C426B3D045BDD11AE7196DE0EF3025737DB88DCEDFF9B861DEA7910,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,160.85,126.72 +2018-03-01T11:26:07.181Z,Confirmed,BTC,IN,0.02383416,0.00023834,F099B74BB7D434894609C089B37CFAA5DC299E4FEDA4BA3E71A6A9A57814E56B,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,79.24,62.43 +2018-03-01T10:46:50.390Z,Confirmed,BTC,IN,0.00191352,0.00001914,079C72FA9945C1F7A451DEFF0B2892680AEC7CF006DB08338F42E36AE1389C15,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,6.36,5.01 +2018-03-01T08:58:49.268Z,Confirmed,BTC,OUT,0.0083193,0.00008319,D72B145C80C3046AE941D0F5256609C4B789B73D44DEEA6548C830B17067EA88,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,27.65,21.79 +2018-03-01T08:52:20.022Z,Confirmed,BTC,OUT,0.06395379,0.00063954,660C8C7032C82F40CE5C99729B3E265C1200BBD589992D802D1DCB1DC26A833C,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,212.63,167.52 +2018-03-01T08:19:06.480Z,Confirmed,BTC,IN,0.00830835,0.00008308,9C68D9C640C0361AEBF2361D52DD7068B6654BC17798B27B827BC696507B33AF,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,27.62,21.76 +2018-02-28T19:59:05.569Z,Confirmed,BTC,IN,0.0068999,0.000069,199535089CC9140B56293C4A3ABCEDBB10AE38B57DEDDF9AB9009DC52D24FCB5,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,22.80,18.07 +2018-02-28T16:47:58.395Z,Confirmed,BTC,IN,0.04530995,0.0004531,FD56B6AF328CDBC795AE40F9DD975B2BE9EDA4A2658DEC9F7402298FC73BDD4E,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,149.77,118.68 +2018-02-28T13:42:23.319Z,Confirmed,BTC,IN,0.03149919,0.00031499,ABC7FBF1C86782C313A430A542103DC65126305DC6E3F7B323E4850DA21611C0,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,104.12,82.51 +2018-02-28T10:35:06.560Z,Confirmed,BTC,IN,0.03673469,0.00036735,73923DFC6D23D3F3C056E94F48EBEB58929FEBA5F67A8B1E24838323568FDCDE,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,121.43,96.22 +2018-02-28T09:04:17.253Z,Confirmed,BTC,OUT,0.00878604,0.00008786,A432AAA6009CE38E780668BB94B92779F2DC43486E438A74304DE20001C03F64,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,29.04,23.01 +2018-02-28T07:41:38.850Z,Confirmed,BTC,OUT,0.00787582,0.00007876,D6BCB23D81D1256EC94B5D9B2F644CA5709C12C4A4898D5212FC88878DD8C737,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,26.03,20.63 +2018-02-28T06:12:49.371Z,Confirmed,BTC,IN,0.0424383,0.00042438,6F1A705AAC0634574AAA07E20E0E0BFA2DA0D19DB1842123787B20DE00C0D090,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,140.28,111.16 +2018-02-28T04:23:32.450Z,Confirmed,BTC,IN,0.00624016,0.0000624,6BD47434FA683B693CA56C5CA30A8FD0A309DA1EB22D4563757B748A0F56D927,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,20.62,16.34 +2018-02-28T01:51:03.147Z,Confirmed,BTC,IN,0.00001368,0.00000014,2858D6DC925EB651B6261DAAD24C452CF2C10BF344E91C926225804035CA6B75,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,0.04,0.03 +2018-02-27T23:09:06.600Z,Confirmed,BTC,IN,0.00273614,0.00002736,58FA5FAA047FAAFA241315B1D8770B0701FDB6E47917EFF0E30B598FC961FDA1,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,8.94,7.16 +2018-02-27T20:38:30.872Z,Confirmed,BTC,IN,0.01078306,0.00010783,043DDF576C317C4D78F7FFA58C67C1A934D3F5F1734BBB639BD951D3188CDDEC,Bitcoin 2,FB2A79E954C81D36ACA315BB7294D412EBD0AFC3E3B2102B6B98E5738F470EB4,USD,35.25,28.24 +2018-03-14T17:04:34.063Z,Confirmed,ETH,IN,0.000017533708554696,0.000000175337085547,A99D859EE4028FA0CF704C0456A4604CAC525F1E78D6A11148F40EE88637EDD9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,0.00,0.00 +2018-03-14T14:28:48.496Z,Confirmed,ETH,OUT,0.0857398348324654,0.000857398348324654,1BE771EBF07F2D2F37906B3C71110C07ED3075A55412AE3093F766D71F386A3B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,5.18,5.18 +2018-03-14T12:19:18.235Z,Confirmed,ETH,IN,0.524573492539407,0.00524573492539407,F044661B0283FE05F44BDE0F519BCBBFDC1753D7AAAE7739350BB1B6F6259304,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,31.70,31.70 +2018-03-14T07:28:16.721Z,Confirmed,ETH,IN,1.0460435186646327,0.010460435186646328,9EE066BFB8B6494175460061EBAECACAD0AC4F1468FD744BA4823C863BA4693C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,63.22,63.22 +2018-03-14T02:23:40.347Z,Confirmed,ETH,IN,0.14777409569898128,0.001477740956989813,D8D77D81F48A50FCDE1C8E61B1DEBD6BACE44E2DF746BAF2A2C8A836971CAE8B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,8.93,8.93 +2018-03-14T01:50:00.618Z,Confirmed,ETH,IN,0.15761050619816598,0.00157610506198166,0D1B5850ADB7C4AE9CF940BA3B8AF17C0D752ED49412DC8860D3091ABAC933E4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,9.52,9.52 +2018-03-14T00:55:43.898Z,Confirmed,ETH,IN,0.029912506794312064,0.000299125067943121,039F1848C8D85A87C15BCE74306ED0A3E99F6677997301ECD64FEED34A683EB0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,1.80,1.80 +2018-03-13T20:10:51.709Z,Confirmed,ETH,IN,0.11581014500376974,0.001158101450037698,C43BA4F8D4DD5F3977035AB5AF0F96B646A40E9A7F8B75856F19C89C2C5616B2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,,6.99 +2018-03-14T14:04:55.771Z,Confirmed,ZRX,IN,0.000000000000180265,,253B61D38A2F5B60D535DFE80E2EE06AEB257DB329F411C9D99911E8FF7791AB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T11:35:38.566Z,Confirmed,ZRX,OUT,0.000000000005104641,,0C6C36EAC29797409B05BAD1AA639B4CEC9A8D57452B9204BA80AF927EF670EC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T09:41:46.901Z,Confirmed,ZRX,IN,0.000000000000623331,,DE02AC86B200063EE0D5BDE7AC1979E5487C6872C09BA7402D4E407F03528392,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T08:46:38.002Z,Confirmed,ZRX,IN,0.000000000001138394,,E87B1B603248EC1AA528C6F0444F42756826C0A0F88565FFFA11743355B09259,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T08:36:31.245Z,Confirmed,ZRX,IN,0.000000000000291545,,46196DA0800623E4AF0B4888FB14DA7211D468A269337396FE4561F44C8C6F04,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T04:32:53.697Z,Confirmed,ZRX,IN,0.000000000006416594,,94A4C1AF09604D1374F9E42987C690AE87DB7527DA125D20FDAE68FF192E7280,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T01:45:41.339Z,Confirmed,ZRX,IN,0.00000000000109172,,6B9A5500695B1209071FFBFF0EDD13A00B5081B3CC79437E24A0C0126A0E3BBB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T01:10:09.662Z,Confirmed,ZRX,IN,0.000000000006463406,,CE0E604406B7E295CD18F5602B040C5002C8158C3EAA825A786077C7305484CD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T22:20:42.463Z,Confirmed,ZRX,IN,0.000000000000045305,,FE359DFB8B8C68B55094A68184E34B4022C32D53A42986D7B2A984A73B02EB3A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T11:01:01.848Z,Confirmed,ZRX,IN,0.000000000011284578,,BFC936B9692194C4C8036B9D60C15599F10ACD540CC95C60172A4F724A063F58,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T09:42:11.943Z,Confirmed,ZRX,OUT,0.000000000006793824,,FF620D2B20E2160CF72EC10F1EC011219EEA5399BF7C9293862DFE632256E080,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T07:07:05.873Z,Confirmed,ZRX,IN,0.000000000000855199,,A24B713CEC3CEE61C0C6B9F337CCA10C8CF4B5E4978CA1745AF49DB340C8FBB2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T21:10:21.731Z,Confirmed,ZRX,IN,0.000000000001743248,,0A93BA068D20774FC7E63C03FC81A09539BC54B463EA8B38E2691593FBF6DF5B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T13:13:16.665Z,Confirmed,ZRX,IN,0.000000000010231183,,1E5F58AAD7A6BD35E0ED08C2FF105B74711EBB8DBD83D6EFB1DBDFD0F3A37AE9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T12:19:59.015Z,Confirmed,ZRX,IN,0.000000000000251166,,298EF0A6CF72AE1785082BF6B86522A4E0D3EE83B1C871D6B61968CD677790F8,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T12:16:19.121Z,Confirmed,ZRX,IN,0.000000000000001231,,E911AC3427EC507A25160025F17D2D38C2729BF711A66008A768E10EB2613865,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T11:38:37.586Z,Confirmed,ZRX,IN,0.000000000001308394,,6123C27F16317D1D6F79695C88D08BEFCA66222CD1B0F5EB6C9C3E1E67340C38,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T11:28:20.027Z,Confirmed,ZRX,IN,0.000000000001203274,,6CAE69E58B35D54A6B3BCBA5856AA5AC77969A959418017ABB40121613C3B7F6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T11:25:48.934Z,Confirmed,ZRX,IN,0.000000000000003011,,E1F32B6EEF2149DCF9175E9BCAA7225EFD8872346017E89ADF6754B921E1480E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T09:56:57.483Z,Confirmed,ZRX,OUT,0.00000000000001752,,87FFF80741D7E32E0BB0C7D1B1E1FA8183C5CCBE8C8BD544D0956146260D6B6C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T09:50:11.207Z,Confirmed,ZRX,OUT,0.000000000000315909,,165C60B785666E624625A5B488AF1C31BCFA7DA027A58FFC5CC1630FA606B50F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T08:32:24.510Z,Confirmed,ZRX,OUT,0.000000000003514282,,568BC9A875D8F0A4589AFCEAE5C01C8A9DA671C473597756F886EE3ED306984B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T07:26:25.412Z,Confirmed,ZRX,IN,0.000000000000101288,,B032B15E2AE9196C507A241AE4A627DF65DBA41DD5715C3B7403754CD608D9C5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T23:25:54.922Z,Confirmed,ZRX,IN,0.000000000000943073,,9280D8CA4BCF1F1E09F4AAC91C86F8AC9808C302E13EA495A491666580834882,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T23:21:08.975Z,Confirmed,ZRX,IN,0.000000000000647285,,DC87440D008A7C32D3CC5241674ADE8D6B2EE0CB73D3F6144E09C3F0C0E70D96,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T08:22:21.528Z,Confirmed,ZRX,OUT,0.000000000000841511,,89CA5CBC6F15D451DCB5E60F38DD7D1221DDC21D4A9BDB242960A9D1F1D6BD53,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T06:15:04.946Z,Confirmed,ZRX,IN,0.000000000002468142,,98EAC3F016C056181BA05F2C76942FEBD1D36DCC1C79E8D614FA7EE647711C5E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T03:30:32.790Z,Confirmed,ZRX,IN,0.000000000000434306,,BCB1955A1E87FDDB89F7818DE535DBAD77A9DAC83FF7130827EE99A791CAFD91,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T02:04:02.220Z,Confirmed,ZRX,IN,0.000000000001878208,,8726980FE44A3294DC76B5138CA318DBC1C75700D71DD5CE7181E9402B43F983,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T01:17:31.368Z,Confirmed,ZRX,OUT,0.000000000000756785,,2A6C2287B4F26E1E19CA28CA3CFDB8B96C80DD1C7DC329F6096F05DF833AAFBF,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T15:14:59.944Z,Confirmed,ZRX,OUT,0.000000000002696313,,F031D4FD8C268F7093E28503BB44D0C900791B1865550B802E588A71690A4B72,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T12:40:55.514Z,Confirmed,ZRX,OUT,0.000000000000517663,,8D16E03FE141C1ED854EE74143DEFF5577B4A766EE3E0EBA2A3D76F42E4795CE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T10:13:18.910Z,Confirmed,ZRX,IN,0.000000000000523549,,E1E7587EC10128B4AEE3F1CD0DEE9690090101FC08DADECD6939EC739F7A6D76,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T10:02:49.296Z,Confirmed,ZRX,IN,0.000000000000097044,,ADC42CC8CA35073334D644DFD1AA128F74EC7FCE2C850324EFD813E8E5B1BFA7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T09:33:37.760Z,Confirmed,ZRX,IN,0.000000000000084178,,2986375EE32810876A18717F49402FBF3D2B9E92F15679ECA55E9EF56153EF23,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T01:38:47.138Z,Confirmed,ZRX,OUT,0.000000000001070094,,ECE39E2E96B0A842325847741467CED3B5C7AA4FC7210AF303CBB5FC0CB4BA2A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T00:38:02.785Z,Confirmed,ZRX,IN,0.000000000004241777,,922533A5A32C24242F692CA844D44694C5F99F55CCAA14FC9678E979901689C6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T00:26:24.118Z,Confirmed,ZRX,IN,0.000000000000984546,,1EE4DF1A5B002CBB8484EA29EFA8788C750D8C99C477769C4FC8A2DC99098885,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T23:23:59.315Z,Confirmed,ZRX,IN,0.000000000000664805,,92872206A10685B61E62DB46BC7CB9AE88270F837CC8C798BC945A9D5A1BA9F9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T12:06:57.032Z,Confirmed,ZRX,IN,0.000000000000071449,,34633881245EFB462A31F0998C770367DDE7C0D70CE02475ADED615D190680CB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T11:17:01.301Z,Confirmed,ZRX,IN,0.000000000000835762,,24E54C565B3636EACE90342AA914F44EF92F30AA35DCC028E63CD924B0D72119,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T04:49:52.581Z,Confirmed,ZRX,OUT,0.000000000005060841,,4B984D8C4F1566A6A25B48326BC6480855FA29BE52CFCEBF792634B9F0BE6251,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T03:11:30.575Z,Confirmed,ZRX,IN,0.000000000000222559,,697A2252EDAA266634A0FF4576D9325A8765205E2D9BD7F57E6DDA22612E69BC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T02:23:49.266Z,Confirmed,ZRX,IN,0.0000000000006685,,306059115B1A98C94361E648A9DCF6BEB280A03B8223524D520D5E4A98858A93,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T16:08:53.726Z,Confirmed,ZRX,OUT,0.000000000004553306,,87FB61CD1B1938DBF0827DAD5686003A0A11056995956ABD21D1126EDD36CA68,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T09:30:52.628Z,Confirmed,ZRX,IN,0.000000000001289916,,96432434D2C91FB4541DCD1A4619BB7CA21AE109C5B4350AF4E696B2FD84B41A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T08:56:54.897Z,Confirmed,ZRX,IN,0.000000000000416649,,FB8B68AB042B5B03B1F4FC71C59BBD8C7C73D2733D933CDCF50A64CD387ADD25,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T02:55:00.123Z,Confirmed,ZRX,OUT,0.000000000000057214,,29408C87E7B7649D46D02D4C6D62B6F4F55F069481A084EBDEA2358F08D00E1F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T02:24:22.383Z,Confirmed,ZRX,IN,0.000000000006142706,,A1E92B4CC4B7EEC2F39702B9D743E90F672359B5DD60769D319B5D076F7F000F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T00:52:54.968Z,Confirmed,ZRX,IN,0.000000000000098824,,535E6E2CE1294FF92358BB6EB1BDE79AC12D8EBF7BAF69A71B3A939492321D40,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T00:09:13.220Z,Confirmed,ZRX,IN,0.000000000000102519,,7E313723AA42EB7C1BC2FB4CC807484AE18F1A3FB78347ADF6D2508FCDE8FD98,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T23:05:14.102Z,Confirmed,ZRX,OUT,0.000000000000807018,,A55D8F7FAD4DB7882715D9B28FF9DDDE853346C45F6817D4082A0B998C3CCB18,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T22:50:23.446Z,Confirmed,ZRX,IN,0.000000000001579955,,DFD339C5D316DD894D3A69E2AC96B13AC11F516D2A154D215A06E380ECA6F9CE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T13:13:17.203Z,Confirmed,ZRX,OUT,0.000000000000269097,,A83AE16BBE3F50F2A0FBF83DB43166D7A6468C308413453B6BA08717A3AD26B9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T13:10:11.729Z,Confirmed,ZRX,IN,0.000000000001460052,,39B8FE7D8088B64D2FF99D5E2CB43EC5BFF51E799B3115B952D056A681C48BE6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T12:33:40.574Z,Confirmed,ZRX,IN,0.000000000001394352,,B3B077D5CEC788D4E3E0FA603469C789EACBF78414E7BAF5823474532F8F1677,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T03:13:11.735Z,Confirmed,ZRX,OUT,0.00000000000027334,,B70C3FC3925EA0B6972B6BC2565C10A1E128F1EBD13435897F0E24179941C2F4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T19:34:05.370Z,Confirmed,ZRX,IN,0.000000000000818927,,B1C0F34EDDA7F357226E1006F72EABB67596F328601C074400E14DAB933C2B4B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T18:29:18.856Z,Confirmed,ZRX,OUT,0.00000000000128143,,C93D0D4A8BBD28972C1DE34D23DD234941A296C6FEFFE1E896CB410E6069A08C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T18:21:51.556Z,Confirmed,ZRX,OUT,0.000000000000296472,,B9E77C57A131A0F89C9FFEB1CEDD0F752A678F8EA85EC2E7E67D75FFF3760054,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T18:14:46.727Z,Confirmed,ZRX,OUT,0.000000000002317852,,EDEB4164234F30176B4D85ED031339C4D04677705174F0B941E53C17EDD03190,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T09:00:27.442Z,Confirmed,ZRX,IN,0.00000000000042582,,5C1E5237C756E4F43C13D5519A1ADCD6A35708C9A63CFBC35855F744477317AD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T07:43:39.913Z,Confirmed,ZRX,IN,0.00000000000000479,,53A786D63C208B7EAFD064AC17C834E83F59FEA151D70F96DF678B4184C30204,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T02:43:19.006Z,Confirmed,ZRX,OUT,0.000000000002823334,,5081DB0A055564FDEA187E22505090392009AE49F99A90ACAA0682071AF712B8,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T23:48:15.598Z,Confirmed,ZRX,IN,0.000000000000165619,,DF125EEDEF4ADEBA7C6C8F1822DA7C8E13C957AFA7405556811C5A88AB95DE22,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T23:47:38.731Z,Confirmed,ZRX,OUT,0.000000000004939432,,86A7429AE0D9436A3DD909AA622DB63FCDEBDD55EBD9F63D86BED1914A158448,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T19:25:27.547Z,Confirmed,ZRX,OUT,0.000000000000045853,,273EFADACED1026A8372EA92D6125F681590247EAACC97DEA425E33567BEB6AA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T19:24:31.435Z,Confirmed,ZRX,OUT,0.000000000002185767,,AFDBD59412A07F18E19EF1CA45D40DE3BF063BBFD596A016F9646B82DC9A6831,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T14:07:06.843Z,Confirmed,ZRX,IN,0.000000000002258585,,0CA5861C9D77D6DCC6459A2A050797F57383A9DCEF7F88DF261711CF9F105B50,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T11:38:02.601Z,Confirmed,ZRX,IN,0.000000000000024911,,2E3AF37DE9215883513AB68602482D2D00041712E24A4B1DC6057ABD2A1A4D86,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T10:56:09.057Z,Confirmed,ZRX,OUT,0.000000000000551745,,B059936994AE49CB563F0468D07A34D59B7FDA6081C28A7306D0C8B680434E53,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T10:10:08.592Z,Confirmed,ZRX,IN,0.000000000003518799,,7DBB848DDDD0985929B8194E48EF01A81CEB8538E1720BE29FEE589F93B14AB4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T09:04:11.594Z,Confirmed,ZRX,OUT,0.000000000000489193,,B765CDFBDCD3F23F59ECEB773872CF4ABBA6FF096CEFFC5105D1F9DA676987B4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T08:55:48.799Z,Confirmed,ZRX,IN,0.000000000001862056,,80A0DF41922982F73D2E55A20033ED8F30C9400FC3C11A4D6691350B87AEE0C8,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T02:36:17.148Z,Confirmed,ZRX,IN,0.000000000000019299,,812CC486B615DAD70AA282C4C259D465A906A4CA1186FC0BA25EDB641B14914F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T22:53:41.978Z,Confirmed,ZRX,IN,0.00000000000007227,,9028C09F7C75CAF71A1F7055726919C66969A7A1CF74CF843765ACDBD9981123,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T22:51:27.705Z,Confirmed,ZRX,OUT,0.000000000002015631,,1C6021FF13D555B5DA0BBAF7C7EC36E2130A5D22349850F92210C8379203AA34,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T22:32:34.133Z,Confirmed,ZRX,IN,0.000000000001019313,,27BA83D54501E69EBA0BF5E48D30EB254A8F9EC7A6775B51EA7B144B702D0E42,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T19:58:36.127Z,Confirmed,ZRX,OUT,0.00000000000943087,,2CD39C1FF8DBC7B17EB7CE868488CC00D35E14A20735EF73D86EA63B458B1620,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T18:18:12.817Z,Confirmed,ZRX,IN,0.000000000000222012,,5492F4106BFA72B9811198523A6B226E9E471617DF9F14DCEF6785787CE5FADC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T15:01:02.255Z,Confirmed,ZRX,IN,0.000000000001142227,,1307328C475DEB04575A0ADD640E8CC56EAA24D3F66BCAB9325D14A32B84D92D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T14:05:39.065Z,Confirmed,ZRX,OUT,0.000000000000213799,,75E80B5FF5F01B2C597AD459FFB5403A106D0DBE33C669C1E319E9F03EC6C35A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T10:16:47.114Z,Confirmed,ZRX,IN,0.00000000000367429,,496A2F2A91E19245408610293EE79F106C44C1B5661563CDD584EA1853441224,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T00:12:33.761Z,Confirmed,ZRX,OUT,0.000000000001393531,,9F6F2E0E5DE28C83AC66DB43A5872115AFA449F9C899D2F5F06A28AF320C70A0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T23:06:22.599Z,Confirmed,ZRX,IN,0.000000000003252029,,439F5D36C2B9FAC22389577DB22688D606876485098B7AC84338D89FB855D47C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T22:42:40.840Z,Confirmed,ZRX,IN,0.000000000001436373,,B54FEF300E41F8B0ACE11F7E9D77AE3CCEB5688104BECCC9A96E85C607A272BE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T22:22:34.929Z,Confirmed,ZRX,OUT,0.000000000002500992,,39634F76315CB37B785E293405825DE34DD6277C1EC96107C0397D1205773B8C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T15:03:13.997Z,Confirmed,ZRX,IN,0.000000000000166577,,2532801D53180E3390E48859E05DA919AA77A8DC538D8137E6A3E5BC7F1172DC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T14:45:54.864Z,Confirmed,ZRX,IN,0.000000000000021215,,34C35BD626BEF8C83E4E5DC95F2258050BA8CE49E58C40AC578BBCD47A6306EC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T14:09:43.008Z,Confirmed,ZRX,IN,0.00000000000323752,,392882025031A0CA93C2D181ECA34E21F4192CD8104C057D8927808A051F4ADD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T12:52:55.080Z,Confirmed,ZRX,OUT,0.000000000000317277,,AA99BE8F2079685A001CB4B29240DD80AA8C191F593F157E24884686CDDB8FCD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T09:26:08.197Z,Confirmed,ZRX,IN,0.000000000003834161,,780C571DCBAABDBD05ED5F70BA1C02426AAF3E8AF505105E58E1582ED12E3615,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T09:20:04.846Z,Confirmed,ZRX,IN,0.000000000000077745,,85476436EC5F2234D7B77DF50C581B2FF4ADDA189AA31D2629595977FE873EDC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T02:09:57.260Z,Confirmed,ZRX,OUT,0.00000000000533555,,2174F911C09DD875967C4E90FAC120A20A56451376A39686EAA575355F111A0B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T21:16:41.461Z,Confirmed,ZRX,IN,0.00000000000250633,,E138885D4CECE3B137F884D96966AFEDA980E91A9EAEB88F094659B077A28998,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T19:40:24.313Z,Confirmed,ZRX,IN,0.0000000000000245,,1AF4F578341209DF7B2F4FB0D983A6397C9F2CB7EEF9E34D074CDACC9B6D8A1C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T19:02:12.838Z,Confirmed,ZRX,IN,0.0000000000027267,,81FFCC16C833C8C0359A5D1EE98933E25B0C80C7A288C7FFC3F2AFC57CC163DD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T18:00:53.041Z,Confirmed,ZRX,OUT,0.000000000002385195,,C8A32D94B6A0BCC3FF596822DA1B048F635801BE1B77391896B1509073DC1938,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T11:09:00.632Z,Confirmed,ZRX,IN,0.000000000000508493,,36D86D65916C913BE1787CC3D7C0BDE4093698D7F86DCF9347B6D80BD9DEB592,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T08:38:21.311Z,Confirmed,ZRX,IN,0.000000000000820159,,ED91F70911F2F78823DF16729D026242E12A4BA5833B7EDF60C41C17B0AFA033,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T08:10:54.513Z,Confirmed,ZRX,IN,0.000000000002185493,,D1EC0F681291A9B699F284EC90C8796B2A5310962182D3B2892BB4F9D14E66C0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T06:30:41.838Z,Confirmed,ZRX,IN,0.00000000000092131,,CF0AD043E03151644CBEC911E7D699E4C6C36CC3F071B1B320FBA3E9B3272432,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T03:14:57.545Z,Confirmed,ZRX,IN,0.000000000000628533,,2C8CC9DF280D1F18E209024A979BA098E3781C5914FB77E1A275B2C8FABFE89D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T01:11:51.552Z,Confirmed,ZRX,OUT,0.000000000004797081,,D38128B964D17A080D82CDC9C784D93FBB68F7DC91F98FD72BDB7EB37F313373,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T22:50:15.855Z,Confirmed,ZRX,IN,0.00000000000181894,,A03A173F85D7DCCC7D5CE6FCFE7C4349A6CDD429AEDD1B4829DB689ACE8CB1BE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T18:20:20.433Z,Confirmed,ZRX,OUT,0.000000000007827098,,132F0BE666DAD3B231B201AB5260C091EF5E44B228104E2467A4EBD01BCC77F6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T12:27:57.772Z,Confirmed,ZRX,IN,0.000000000000278268,,D280C3425508D0D3A3B269883194ECCEAD125A3ACE4B44BFF63B8498CAC987E5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T10:41:15.761Z,Confirmed,ZRX,OUT,0.000000000000160007,,CE745F0C56321A116938989F1387AB8E8F6C94E35709F34A67881D55550C5E98,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T10:02:01.771Z,Confirmed,ZRX,IN,0.000000000000235152,,3AA7B3C0095C09127F7533EACA11E092745011CC3893AAEDA0C988CC55ADDD03,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T09:35:48.484Z,Confirmed,ZRX,IN,0.000000000001018491,,C36721CDD505CCD78A55EE55E11752EA31334CC1F1EC216C593AB1C7DFA6E7E1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T09:32:30.931Z,Confirmed,ZRX,IN,0.000000000000023268,,019934E7827C287CEB3461D35DFC16FE91EBB3A901FABD29907B32901D0AD9A4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T09:29:48.141Z,Confirmed,ZRX,OUT,0.00000000000511518,,8596C85E0761CFDD4BA53CFEF899A1CCD66F6ADE5805B2ED13563B428A98583A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T08:57:46.301Z,Confirmed,ZRX,IN,0.000000000011704512,,7669ED328664E5486466659B2D90D537D53C7F9212B80787F3BAD71248AEDC9C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T08:56:57.474Z,Confirmed,ZRX,IN,0.000000000001849327,,D1EE01506A7DD189ABA1C5EF0695DE41A6E148ED79D86F135A62C4C8C3E96250,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T02:41:40.770Z,Confirmed,ZRX,OUT,0.000000000000002463,,8EB72C5B21419ECBC68DAA062F48F8D818C1C2B3C2C496F60CF3CC73223901B7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T20:47:29.351Z,Confirmed,ZRX,IN,0.000000000000351496,,A2019839E469F39A1C039C86B7B169A9B3E9C00FC32BA17337801C092171FF53,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T16:18:44.015Z,Confirmed,ZRX,IN,0.000000000000786213,,90A2B3AB1177B2D318303A59451DF1BAACE61144F76A7EB8C8A1131F4DA4EAB7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T13:12:30.973Z,Confirmed,ZRX,IN,0.000000000000012729,,18E2740124B565D541559E7CB9F31EBE23BB30DE6A15AD2824BD3EDE634A82ED,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T13:03:51.832Z,Confirmed,ZRX,IN,0.000000000000045579,,BB7C21A8B54AEA12B3E5BA6C0EBCA8F13F70868C60053CE0A5D1DCBFB04C21EC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T12:13:40.937Z,Confirmed,ZRX,IN,0.000000000000337535,,E1EB3490ED75A620AE1B43CED6AD33667672DC82106E30A6ABBCC542827E29CB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T02:26:38.747Z,Confirmed,ZRX,OUT,0.00000000000144746,,78A321C02B6B46AB7E0EA19AA8A426BAC465E512D20025C79DC9463C61BD3D35,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T17:36:34.118Z,Confirmed,ZRX,IN,0.000000000003857156,,8D945C08FF6B968214F6F618E6B192F153A23A625B54CCBFAD22DABA9FC9E9BB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T10:04:48.776Z,Confirmed,ZRX,IN,0.000000000001870816,,F9F34A11C02D41E6248116E5E8C8EC3DBEDCF73813ECC4F11572BF0B253EA547,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T03:30:18.581Z,Confirmed,ZRX,OUT,0.000000000000465787,,9D316248FC8953C9DDCCB562B1D29A9D735E2F72A706B95F43F531E2B0CC3684,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T16:22:01.833Z,Confirmed,ZRX,OUT,0.00000000000003983,,1FEB06AAE084AC3408CE055A0DB8FB1E0C0866F6CC074073A8A22144B9FB69F4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T15:06:45.297Z,Confirmed,ZRX,IN,0.000000000002791031,,CDD795BB7FE491B940A1A3617E9AE733818A4F9FAD33CA1EBA2C2E693A5AD94E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T14:19:26.100Z,Confirmed,ZRX,IN,0.000000000000039967,,D6D6664F6D091B9E80EAC9D28AC2E8DFB5747460C902ADFB6AFE8D59D840237E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T10:40:50.000Z,Confirmed,ZRX,IN,0.000000000003666899,,5FD191F81B07614484B5DCABA4EE1873008D3C18A017A75AAAC447A4061E5C80,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T03:46:15.514Z,Confirmed,ZRX,OUT,0.000000000004972967,,F39752DF7014DA5DD83692580043022E327E7A5EEC19F0E55CD58BA3CB3E4DF6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T20:16:13.403Z,Confirmed,ZRX,OUT,0.000000000005037846,,EB282682A90FACF73E37CF86B6285A981E75236F72D89FCF2A3BFF7302F56415,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T20:04:09.503Z,Confirmed,ZRX,IN,0.000000000000068848,,1A7167DB8C3F11888C5419AEB62FF2767FBF2BC0C1B94A906954E4DF95D67C10,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T18:56:19.968Z,Confirmed,ZRX,OUT,0.000000000003275708,,B99805CD9EE51D0614291D10B14DE1312260D1CF8BEEA9DB277FCDBE7E69FE6A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T17:06:59.240Z,Confirmed,ZRX,IN,0.000000000008477805,,FF21F28D854CACE18E451D5C0E375BF4900702DEDF6278C160AF82868E2536C9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T16:58:34.830Z,Confirmed,ZRX,IN,0.000000000002308955,,A6EA68057041426252C9DD60F5D41C4A9D0C46543D5A79E845A8A48615ED79CD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T13:32:41.289Z,Confirmed,ZRX,IN,0.000000000000011086,,7E4957FA0878688E34524A7CB23611A71FAF75A36AAB5BB632FFEBBCA97531BC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T13:15:28.946Z,Confirmed,ZRX,IN,0.000000000004599433,,0D77AFA1D2441271B34E99C5D3FD69E39EB93E2E939004A7D97B0DE8E3CA76DB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T12:30:17.437Z,Confirmed,ZRX,IN,0.000000000005740976,,5CE0CB9BC768CB38FF99999E808C5CEFEA761FE49E122B5F1ABA32B2BFA9D2CA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T12:21:02.148Z,Confirmed,ZRX,IN,0.000000000000831109,,96D10442B4D68EF0141146491B1928C68470D8177A4CCB1A055C1347C559A4A7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T05:40:27.816Z,Confirmed,ZRX,OUT,0.00000000000088011,,94152DE463F60C28202DC346DA746BEAB299FD195F3A1A5520C510ED45FC9379,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T05:09:38.914Z,Confirmed,ZRX,IN,0.000000000000332881,,C3933919BD4F2B939A15FB90EEDE328731936715F4DA7540EC0009BFA1942CDE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T04:17:08.209Z,Confirmed,ZRX,OUT,0.000000000001801147,,A521DD9B67DAE76985E13CEBCA2513637A4D6259459E531BA7E0902EF1B96E80,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T16:14:42.617Z,Confirmed,ZRX,IN,0.000000000010731463,,1ECE275691297862677104BA5503C8A04A7E34F7633E056BC727A1B68A6A5AFD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T08:48:31.340Z,Confirmed,ZRX,OUT,0.000000000001330842,,4B3B0BCDC2D47F9C4259BE253C277A29ACE12C56EA87381EBB3290024BB8A21C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T05:59:44.610Z,Confirmed,ZRX,OUT,0.00000000000005913,,6E12851578661647FC707A56ACACFFE53EB89E599994F032D552BFDF6F38767D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T05:05:41.719Z,Confirmed,ZRX,IN,0.000000000000826729,,C94B3DB159A28241E0A3867CEE6CEECCC1DF03E5AD868568382851821100AE9A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T18:26:19.309Z,Confirmed,ZRX,IN,0.000000000000209693,,DEFB73809ABCC32FEE9DBDC1BA2D51255F4B802CC11927BFE49E39DDB37F1165,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T15:25:36.662Z,Confirmed,ZRX,IN,0.00000000000308066,,580F807CAB52643C56F7E9C34857E922B8343E7F88EC261EBC6DC3A083DD47A3,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T10:50:00.113Z,Confirmed,ZRX,IN,0.000000000001675768,,E9021E387B86E89FEA0E9866F24A8FF0BABA2C07CB0F23FA6B9094EBD551DA72,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T00:38:52.228Z,Confirmed,ZRX,OUT,0.000000000002005091,,F34F32E479FB10FC868FCE89BF3FDACBB831A275EDCAC309FAC677097CEDE1BC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T18:55:23.812Z,Confirmed,ZRX,IN,0.000000000002552731,,BDED71FB6C3E6E1AE5F672EF40E7A0E3D83F5E30E28668AE977E9BD02C6F83CA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T17:41:21.582Z,Confirmed,ZRX,IN,0.000000000000911728,,C8DA31624C00754B6A17FEAD30211A42CCF62F318A4080732E17102667FABA24,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T08:47:15.905Z,Confirmed,ZRX,IN,0.000000000000638935,,CBE03842CF304DB01E113D98271C9683B5A55E72E5F10785234E5E4AA52DBBDA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T06:13:34.182Z,Confirmed,ZRX,IN,0.000000000000088147,,0C73B5A6A0B084246BFEF5ED5995D73C7081E0C8ECCBDCFCB95828C22286280A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T06:03:16.496Z,Confirmed,ZRX,OUT,0.00000000000249538,,5EDFAA10A38E0A80BC84093A43FFC4BEBAA5D80F7DBF55140C069F4C5749A40B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T04:49:54.066Z,Confirmed,ZRX,OUT,0.000000000000141529,,55E75694D6D4D03DA7783B5C7E73F536D78A8966880123BBA4C6CE6AB7D569FB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T19:06:19.304Z,Confirmed,ZRX,IN,0.000000000000659877,,F6F8B41A19DED853468ABBBFDA30C094A94FD9649F9EE4C07248BF02F9703364,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T18:39:17.580Z,Confirmed,ZRX,IN,0.000000000004159514,,8297ECF616A7BAC2B0008A5CB4618BF983C2C297A3DF683BBC12388787C853C8,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T16:06:59.464Z,Confirmed,ZRX,IN,0.000000000000279226,,A1A12059AF4FFC5FBD1FE5B38787DF2A3F937B8C792A7A467E1629CC0FCB0F3D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T14:26:42.776Z,Confirmed,ZRX,OUT,0.000000000000078019,,D622C6F9F283841451587FFB2D0A41D28B395998BA2D6D820180E5C0A908A155,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T10:03:33.288Z,Confirmed,ZRX,IN,0.000000000003791729,,D74E711CECE49B4F6CD308F116FACE18761A162929D050BF19C9CC41ED269331,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T09:15:26.030Z,Confirmed,ZRX,IN,0.000000000000862727,,61F5BACD1670FD44B6F481531AD493DD4087936B34515959E5A63A9E6FE4A721,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T09:10:20.958Z,Confirmed,ZRX,IN,0.000000000013024678,,0850ABB926E429F455767D31399377062B9B35EBD25AE8F25F2088D9C7AD03F9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T08:33:42.548Z,Confirmed,ZRX,IN,0.000000000000227624,,9EC3D1C273C38A793E16044F79A8F8696B3155B74244846C74D9113096ABEDFD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T03:17:34.656Z,Confirmed,ZRX,OUT,0.000000000003725345,,3537F337A6F05B0194EADF3689FCA725F5735F327F4632D73325639405EF404A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T02:36:39.503Z,Confirmed,ZRX,IN,0.000000000005513078,,30B555DF97AEE7D49967F8822CC9BEE100DBEF778286F7C9E1BABB0F12213666,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T02:36:26.215Z,Confirmed,ZRX,OUT,0.000000000000778001,,453992DE456B5975B7B0E3DC7B28E35AB6C2B2601C3FCC9EFD44136BC952E599,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T02:29:46.249Z,Confirmed,ZRX,IN,0.000000000000214621,,F66CECD6CB28CA4031C09FB6A3CA3B667E94560A1D12FC4509AEEBD16D5FD74B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T01:42:19.237Z,Confirmed,ZRX,IN,0.000000000001569005,,0AD1C7FE33F3F46E9365E08E0B62CCF959E5768EE0F1AF974694C0DABB01765C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T23:41:31.824Z,Confirmed,ZRX,IN,0.000000000000773621,,3E57EF73A33EAF8F6BA66D26962BD9631EC27E3B64A81BFD9900FA348B7CA9D0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T16:59:45.598Z,Confirmed,ZRX,IN,0.000000000000245691,,E7D9C9E5D4DC6396BEAE7DC7E1AD69E7D477203ACB9E2A8E5F8D54BC8D4BD089,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T16:56:32.467Z,Confirmed,ZRX,OUT,0.000000000001175351,,C51606835404BFE1B7B23467842D2104D73EE299AAAEF96B917BA864FDFCAD14,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T16:33:24.784Z,Confirmed,ZRX,IN,0.000000000002441862,,F52AC202B4045BEF4F33A41A4A9B01D7D64B6D5310A9E66A9294ECD5FB039EC6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T15:55:50.176Z,Confirmed,ZRX,OUT,0.000000000000228856,,338117700CEDE50C431E38218C0021264CE2EAFA92E872A728871BA8221ABD81,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T14:32:53.005Z,Confirmed,ZRX,IN,0.000000000000634145,,209885EC2DDD23DAEE82274CE255C46D3C5C024D3BB2065E119832ECC49C2316,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T10:49:10.379Z,Confirmed,ZRX,IN,0.000000000000480159,,FBD4FE592A89D54997BE0D2518D526F00B4DCA050B5D1FE3EE606CB6132DF00C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T09:09:12.916Z,Confirmed,ZRX,IN,0.000000000000562285,,5F4D620D1C379B79CBEBEF2C3EBF540EB5E864E24B864C5E74C9FA267F4023A7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T08:40:23.919Z,Confirmed,ZRX,OUT,0.000000000000029154,,D7D46FBC5D53D59A76CD4BCD51766CE134BCFE2F7350A318734506F72643974E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T07:51:36.965Z,Confirmed,ZRX,OUT,0.000000000004413966,,4070524C0B47E94561AE85AD562E547764BCD3C7883794654E7BAC38AECD12F6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T06:30:39.948Z,Confirmed,ZRX,IN,0.000000000002188915,,AA28307E8C58E58F3760A13A8B5BCB309E9DC04ED249C3D56BC9D32B6A392759,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-19T12:22:57.310Z,Confirmed,ZRX,OUT,0.000000000000976334,,680CC4DAED1EA719134A6D39EE0EDCE3892EA65A698A75A87627C5639CDBC513,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-19T08:30:47.666Z,Confirmed,ZRX,IN,0.00000000000324409,,9114F26979127A322D239E3410F6099C579ED08D9923A8BD15E53E27E5DD8DF7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-19T08:30:46.250Z,Confirmed,ZRX,IN,0.000000000002815122,,5BA853C3F4CB6524B0636C08E964C9EA530DB716A5B411443634E9C51F24BF31,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T15:40:59.576Z,Confirmed,REP,OUT,0.000000000004616269,,1308AF3BC664FB1FBC8D878172FB33C89E3CDC82A29C6AF7BB43EC035E323C0E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T09:26:27.272Z,Confirmed,REP,IN,0.000000000000113606,,9A941730CB228C7717EC95E337D99E2AC0CEE3A6BAAB87185381E18F9247F1C2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T08:59:27.969Z,Confirmed,REP,IN,0.000000000005304753,,F4F32397CB5473D748E882A44FE733B77E7542465704A973281B4A99FED59616,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T08:58:19.818Z,Confirmed,REP,IN,0.000000000002171258,,4D7FC71D861A2A79731F1614963257C77B34C6F08A34455B1F76356FF8C2F083,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T08:11:45.049Z,Confirmed,REP,IN,0.000000000000426504,,1DB3E56994A81EBC2BC7410693D953CC4F7A0D03147C221BF8D60ACB23C58DF6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T07:43:57.276Z,Confirmed,REP,IN,0.000000000000725577,,D901CFF3C3916F2D84FAEFF648087E76CB7D358CA23243A5A98D5839296D035F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T00:30:42.033Z,Confirmed,REP,OUT,0.000000000000313445,,DD45448C5906F7BE5880B07E6F39397DEAC8F47BD5E9EE9F94342D309155CABE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T12:54:17.061Z,Confirmed,REP,OUT,0.000000000000131948,,F96CAA7BE7ADFE937B6D33063D6036BA29B89EA9E9DD9A036A11D4677F30F378,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T12:45:23.786Z,Confirmed,REP,IN,0.000000000000185603,,B0BF2FF084664DD76B2727D7DFDFB41C4669C1CDCBBA2B57EB5DA8EF2CD7B040,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T11:58:12.583Z,Confirmed,REP,IN,0.000000000000076102,,8BE29DFAB8D50D8418AD133E5A8F38392E16C28F62ACAE6953C33DC41443A526,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T10:26:24.764Z,Confirmed,REP,IN,0.000000000002180977,,06F010F6C3A5CB63427BF2FEE5FFA5EEA319531C34F23CD1B21D935033E675FC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T06:54:12.603Z,Confirmed,REP,OUT,0.000000000000518074,,1C5807249B9755C36A98C6017B2942732B0E6979E9BA5CE3B0D1DE87F952CF60,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T05:31:19.827Z,Confirmed,REP,OUT,0.000000000004091898,,8190450866A5CDB6776FB2C1E39747B63648307C3B215097B98C95AE1E9A5BA6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T05:15:38.154Z,Confirmed,REP,OUT,0.000000000001430898,,1442340521D34969287FF7E7A1DF0DC355CFC9A83BB157C5F5CD199CF3DF0D2A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T03:46:14.774Z,Confirmed,REP,IN,0.000000000000604853,,478B3D5D6AD3490C70ED9F2F057C864F99E64E953641CEE37658B50983144718,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T03:24:39.642Z,Confirmed,REP,OUT,0.000000000000192447,,5A164FE025065FEC3B1CC7CC01AC537F01DF8B42D320749B55366741699F8C77,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T16:35:30.851Z,Confirmed,REP,OUT,0.000000000000339588,,0CBEC253A1C714102E401205AA68A29A8D25F5F7753C45A1CA39699EAF1C1392,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T06:56:20.687Z,Confirmed,REP,IN,0.00000000000290806,,AE309B65724A2F0CD4B96BB6D6145D24F5260CBDEA18321F2E2DB51C32744AF1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T05:57:00.171Z,Confirmed,REP,OUT,0.000000000007124105,,40A56E3554F0900EF3211C11944B0018B093C7EB73ECE46F7E0E6B98344DF984,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T02:14:00.479Z,Confirmed,REP,OUT,0.000000000001026704,,2B64B5E70FB2B62E2397B23E487A239986252EB0890448F209AF07885FDF6A44,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T01:10:41.846Z,Confirmed,REP,IN,0.000000000000011086,,58C7AD42A2ED6205DBF0A7DC10AEAB644311B18F77408871583E99F0DB82300E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T21:35:35.065Z,Confirmed,REP,IN,0.000000000009376805,,02194CA4FDE38901158D35A845B8F67F98713A42F0C1FCD267A07D17940C2CE5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T12:56:30.665Z,Confirmed,REP,IN,0.000000000000028607,,FA1C81E9E883ECEFB9DFD2E0B191E0F68B937602F39EFD16E547EF77F01DDE72,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T09:18:33.397Z,Confirmed,REP,OUT,0.000000000000451963,,C3B61DE854359B8363737ADA20064EBBB8D993DF1DD33AB4CDCBCE596EE6BF91,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T06:19:04.446Z,Confirmed,REP,IN,0.000000000000422261,,EE25AFFA3AF30F5A76BEEB3F55CE392C3CC5A7887558CF5EF5CA4745594AE558,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T06:00:34.306Z,Confirmed,REP,IN,0.000000000003591343,,F2BDEEE92ECCBEC5BE41313FE4E81991ACFA4D12D2A784AD6E5B4A277C2AC710,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T03:57:22.224Z,Confirmed,REP,OUT,0.00000000000175324,,6BABD6FF4C97FBFC5D6C30A44C5B259E80FC439383293F9D3438442D2D0B6097,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T21:15:13.426Z,Confirmed,REP,IN,0.000000000002228336,,7DACB05B7A88DE156581A2B3C665AD8C79A9495E090E7B85D516CB082A36B0F1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T20:32:36.348Z,Confirmed,REP,IN,0.000000000000170683,,3EC822D16F49F64A947058827B377B7FEEDE2C366D6EAB31CAD41CDB99A79285,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T20:28:38.903Z,Confirmed,REP,OUT,0.000000000000595272,,11557DD7CEAF43CAC2FC723BE01B783AA5E253416F74B1A6E2CF91BF85CB4660,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T18:21:36.303Z,Confirmed,REP,IN,0.000000000000721334,,D09466FD254E910EEB9035B5F65230679746690638F2C287FBCC7D904FF512CC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T14:08:47.942Z,Confirmed,REP,IN,0.000000000000376955,,7AE2DD58E8F772D6EA21BCE272C19636A2DFA62F320D04F63B8356CBA08B8181,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T23:16:31.310Z,Confirmed,REP,OUT,0.000000000000893387,,7F02B78389BB91F8BA60FEB6E462424E355B7D3D60D2EC315467C23682509E7D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T19:42:08.754Z,Confirmed,REP,OUT,0.000000000003277761,,EF4004BE168391646BE9005E52A41F703F5A80332EFE7CEA503A923ACC4F79C3,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T13:21:07.153Z,Confirmed,REP,IN,0.000000000001922008,,B349E95833259AAE1BBE2071B9D0A4DC4A84166F0723DACC6CD7E9F4A173ABB4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T12:54:46.119Z,Confirmed,REP,OUT,0.000000000000474,,E17C411B6DB8780ADDBB64209A7EAF7D52F09F4A85997F7EEEBA3F8CEA1BBF9E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T06:14:12.242Z,Confirmed,REP,IN,0.000000000000524918,,4C4092442473F8CD75B890C6B219355E0A68D8FD58B655B9359390ADF8EB7C0E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T05:07:00.842Z,Confirmed,REP,OUT,0.000000000000821117,,234204C52113FCA924C7750826F2321B4E2128FB0AD6C1960FF5A2F62BFBD789,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T05:05:43.940Z,Confirmed,REP,OUT,0.000000000001621566,,EA9CA915E1876C96BE854CF2E8C89AA129EDF302EC70849B4E6BABF9351E6C45,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T03:41:20.320Z,Confirmed,REP,IN,0.000000000009316716,,52AE66F94F9024CB6A4ED74153E807451169C8C0A824826A08BBA173DC4DC87D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T02:00:01.832Z,Confirmed,REP,OUT,0.000000000002400388,,81CCA3AACF24807D8C575E2D1A0E68DEAFDBF8DDB563AE5C8E9172C3D0E086E1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T01:22:19.479Z,Confirmed,REP,OUT,0.000000000000878468,,7ED422D46D8A9430827774E166AAA8616C94C43474819D636F586D1A566E37D0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T18:36:30.669Z,Confirmed,REP,OUT,0.000000000000241311,,076FEB1CBBF1E93050050D32DB001E61726AEECF13B3ADAA0091370A34D4DC7F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T17:33:01.329Z,Confirmed,REP,IN,0.000000000000613066,,5F741FF07173F70FAAFBF121C19F54F59C8E25658D1F25328A08A25679EB7B91,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T22:39:55.599Z,Confirmed,REP,OUT,0.000000000007016657,,07AD53478BA8A29DF55794FE02DD545C38AF4B673DE7B535586EF3809815CFAF,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T22:37:07.719Z,Confirmed,REP,IN,0.00000000000262199,,7C8BE76FB571BDBD1D5A8F0A268671DB8AF004672D8D03C4B4FE2D90E52D5FBD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T20:55:45.369Z,Confirmed,REP,IN,0.000000000002219165,,E274D98408B8E13DC1041A6D7D18CA0BAF9D31B1981F76672028C5EB766B9065,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T20:06:14.789Z,Confirmed,REP,OUT,0.000000000003240805,,23874C2E4122FB9BBF73C3E44517FFCD449BAA0A8C29FE929CD656D9DAF55ACE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T12:21:01.884Z,Confirmed,REP,OUT,0.000000000000710658,,8E89000BB63906AC676FEA0F26A32C02E6941A06992DEB257ED43F943E81054E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T12:09:09.131Z,Confirmed,REP,IN,0.000000000000713806,,20AEC66EC5DC4CF26A080F2C20AD910CFF77E4C1BB8CAB845C5F077BB8248E15,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T03:13:07.941Z,Confirmed,REP,OUT,0.000000000000238711,,BA66383E4BDC391E2F421DA676A5EC5797AF1BC5340460D147658A7EE877911D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T22:17:09.710Z,Confirmed,REP,IN,0.000000000000118944,,E19C7CC2AE4E3D1F8A92B3416A72DBD391FABA4ED9759BB202201205E34A634D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T22:01:53.317Z,Confirmed,REP,IN,0.000000000002049165,,4F6E16EE465E146282513581312C030CDF7AA261EBE68E146A354937CB03613E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T14:13:45.959Z,Confirmed,REP,IN,0.000000000000414185,,0558907DD3B80641934936340BC470B5BE1F701610B2919BC042CA290FD48408,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T07:39:28.453Z,Confirmed,REP,IN,0.000000000000074323,,4B142AC4CF88A7AA0ABF84D5BD151D20986A4B2727EDD09F7B465F0CA440EA77,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T11:19:44.975Z,Confirmed,REP,OUT,0.000000000005366895,,3CB07E8D14385AF7854CCB1297488E77F1E726CF688C6B813D70180D1B376060,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T11:10:22.174Z,Confirmed,REP,OUT,0.000000000005325558,,C5BAD94A5663E7FE080D860E1E20568B6E9CB6BC5466ACA8BEB752BE6C89DF8A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T11:03:50.720Z,Confirmed,REP,IN,0.00000000000112676,,7F15AFF86A784649DC855A5189333D322BDE87369F5BED0E6EA4145D1C56764C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T10:47:27.269Z,Confirmed,REP,OUT,0.000000000002358367,,E7FEF91BD0091C0E197C66142DEA4BDBE8CC1535AE0F607FBDB6BBB5D412F8F8,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T08:58:12.110Z,Confirmed,REP,OUT,0.000000000002736281,,A5AB85D8AA8903EE8CE09447B0D35885424C331D3D7C82926944F77951314BAB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T08:51:00.589Z,Confirmed,REP,IN,0.000000000000011634,,0A684661B4FB264FB07CC8491D34C0A4CC3FCDE14E487BF51B534F7EB46432A9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T01:05:18.461Z,Confirmed,REP,IN,0.000000000000996318,,78E9E1DD61671604F122C34024CE1668BA4DB76B2915CA35924E3FC5296F160A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T21:18:02.843Z,Confirmed,REP,OUT,0.000000000000154122,,2420ACFDA8CA89791344CD2D79192965ACDF19C4F7A162890F46A29303B2AA45,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T20:05:09.693Z,Confirmed,REP,IN,0.000000000002850025,,E858E390BD04C2CC4EDD48D2B106FB2FF2B2B84022D78E65FDEAF6802738C8DE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T12:57:53.214Z,Confirmed,REP,IN,0.000000000000540522,,B510AF199915CC9B62FA5CE2CC93DD193ADA7B485413E34C80367E0F60DBFD1D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T07:51:39.300Z,Confirmed,REP,IN,0.000000000003142939,,21C5876B67449FFF85C83B2B3BE938634EBFE5867DE33D4EB89F984EE3DF8477,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T05:34:07.893Z,Confirmed,REP,IN,0.000000000000876551,,0ABDB92D8ED2716B1AE9A3279254C7B630091E4705543AFC00A194845D401B66,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T03:18:06.926Z,Confirmed,REP,IN,0.000000000000059404,,372F0CD3CEADFEF0DDBA4F3556A794733B12D2A648306B2F8DA7F0C323513550,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T20:15:31.817Z,Confirmed,REP,IN,0.000000000002024801,,8EA13A12647D1068FD4ABF83BFBDD9EE3779C7DC1062D57A8B52256600333778,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T18:14:10.456Z,Confirmed,REP,IN,0.000000000004360037,,073383AA23584479ED37A7BD5A8719469F6312EFA62E84E719E960636285DD1F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T13:55:58.853Z,Confirmed,REP,IN,0.00000000000025582,,774F532A3F59516ECDC13A8F57D2C8C05083FAC4B4BC9733CB050B36BD399911,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T08:39:49.110Z,Confirmed,REP,IN,0.000000000001808812,,1F3061C4B46D4142D355B79111004C4B942F982B7E51DB115DBD631FA9821665,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T07:45:10.572Z,Confirmed,REP,IN,0.000000000001295254,,6D82858295A77A8E8A50E5084873B6362356F421CE284B37B80FECA70C109E94,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T07:37:56.014Z,Confirmed,REP,OUT,0.000000000000106626,,9CD5DA44C0F6F4901E7993A08A253275A639FD136106B8531EB1C66A55C9D390,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T07:35:25.785Z,Confirmed,REP,IN,0.000000000003481843,,7674FE1E228F63D0EFDACC4469F646699EF4C91860896D580F7ADECA1AECFF7C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T02:31:46.053Z,Confirmed,REP,OUT,0.000000000003109267,,884EC2ED5878B9EA67A7854FE55F8817E4F4272C8F7AC75FFC466E2D19690700,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T23:50:59.226Z,Confirmed,REP,IN,0.000000000000038051,,9904E0A319C0B31443B6CD183816FAA4A536A7C870D3B274ED6DB006F209A7B9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T19:55:18.290Z,Confirmed,REP,IN,0.000000000000077608,,29AA977FD455C43038F7533B35C96AC9ED3598EAF2CE069F8D48D06B5DF41906,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T16:53:16.291Z,Confirmed,REP,IN,0.000000000000950875,,70A7A912EA8D6796B90CF87228225A13C2AE00405D483EDE8406222DFD3D584B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T14:51:20.622Z,Confirmed,REP,OUT,0.000000000001710535,,65E0041CC6857DA1F25332BF5A3BF01AD6661E6DB1219E435940A9FF8C18B1D7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T06:28:08.441Z,Confirmed,REP,IN,0.000000000000120313,,4A6653163BE3CBC13AC2E48F0354B2584CC114CCD3A5BAE78EED3839C3645D5D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T21:44:42.085Z,Confirmed,REP,IN,0.000000000000217632,,E20FA309AA3D55BA2F07E9946DFB75F2DDC5BF593784D908FDEA62B3761BB6CC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T20:21:00.729Z,Confirmed,REP,OUT,0.000000000000607043,,23605549FE62F7F606D3E884B0DC969DE0C15057F58A5E3F7F22ACDEEA9E1A94,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T18:28:16.506Z,Confirmed,REP,OUT,0.000000000000528887,,EF9E3FCAEA015D225B53E401D214CD1275562240C33718C189E98FB9BC3D150C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T18:05:25.586Z,Confirmed,REP,IN,0.000000000002049028,,F2513A69A98B4E80A4922CD6505F6F1C19DA46C2B4BA5AE0CFC5141C4DF1A084,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T18:05:24.788Z,Confirmed,REP,IN,0.000000000004431623,,427ADB1159B96D94B574C5A47EC93AB7BCBC63A50B67692536A7B4E97B853A65,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T14:12:51.810Z,Confirmed,REP,IN,0.000000000003099549,,9DE0DA05CD30266593F792DD4694A37BF7973DBB89B7090BA11AE8C97E52BFE5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T08:15:56.096Z,Confirmed,REP,IN,0.000000000001098974,,3D07F31200AFF7F3F4D904B5BDC91F163E6FB1B0EA1FF623F33286F63C82F0F6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T21:47:48.371Z,Confirmed,REP,IN,0.000000000004177856,,5CA8E1E8ED641AC39DB970DA8D8E377DCFD5031405F5CC9FAB862DB5AF76BDB8,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T17:23:20.405Z,Confirmed,REP,IN,0.00000000000801845,,922942CF8E3EA5FB68E67A45646E47C524DDC70248DD9E80E9C014EF34C34389,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T14:24:55.405Z,Confirmed,REP,IN,0.000000000002371918,,3EBBCE6030C176E62276DE7F4498A8406E8556F724B612F610D553294F191805,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T14:07:51.695Z,Confirmed,REP,IN,0.000000000002212869,,07EB53CB708295398889C2EE3D052B26D691C66388B32A258BF38A11D06DF1C6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T14:03:40.920Z,Confirmed,REP,IN,0.000000000000317551,,A5A6CB42D343975270ACCD85053AD4B439DE7F9DC828660F376FC33364819886,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T20:05:07.628Z,Confirmed,REP,IN,0.000000000000001231,,696AB0F913C864CE7264147BD572C7751B9B72CC4B559BB468F8C55E3D77CCEF,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T17:22:13.650Z,Confirmed,REP,IN,0.000000000005674865,,3A9AEBC4178C4E02D0245B2DB7FF6BD63D953EFEC5B9956D3845DE9C518FA4B1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T16:43:26.332Z,Confirmed,REP,OUT,0.000000000005164319,,CC61F2FE89ABCEE5D724A35007AEE8584153FD116BEA42FAF13A037E33ADBA8A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T09:44:41.239Z,Confirmed,REP,IN,0.00000000000000219,,56C533DDA18899C5AED1E2762C3EA029CF4D50875CC906336AA3CE784B05D25C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T09:38:09.329Z,Confirmed,REP,OUT,0.000000000000105941,,E6144EF3F7881E1DDCD59BEE48D2C3610BEC2DCEF72AFF679EFC1C04F8BFC1DA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T06:26:42.609Z,Confirmed,REP,IN,0.000000000002179745,,D8E13E45B2D3D2C9DF22758E52086E2FAEB9BB71BE301ABD9900C817B8E58591,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T05:44:18.755Z,Confirmed,REP,IN,0.000000000001064482,,56A34FBE153823B7128956CE11E42DD2232F52B74144B63972E5657651B3E101,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T22:04:13.037Z,Confirmed,REP,IN,0.000000000005647901,,0442A68876BC7C3F3BE8DBB2CEEED3CB4ADA8202957C6C9E1D57080EAC57FABC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T15:40:57.041Z,Confirmed,REP,IN,0.00000000000529832,,1DC8A698BE21CA1D940BCAD8B5EA4BFADCC61A1AEF8666E495F55F1F148E4D97,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T14:32:02.961Z,Confirmed,REP,IN,0.00000000000102205,,1B9BF0DFD9174927606DD071EE8F3DE642B8871FC10D9B8E49032930F89D3DF2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T14:30:47.734Z,Confirmed,REP,OUT,0.000000000003741907,,B51874AE89C6654600986FD750EC87955DDFF2C47EF195DB64BB128A3A87F15E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T06:47:06.537Z,Confirmed,REP,IN,0.00000000000048714,,242C1F3B9652D2E8037A71269C277F0EA0EEABB4EA92AB05D4E9EADFDDD20A45,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T05:42:06.777Z,Confirmed,REP,OUT,0.000000000002433649,,2E4FA11DEDC66F34D278DB039F8A81CC04F747AF8550BA6075423899FE83E543,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T19:35:45.658Z,Confirmed,REP,IN,0.000000000000662888,,872A46F825B57E387E859EE532F0DD2C96E1A203D52659547FCD06F3390FE835,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T18:45:53.724Z,Confirmed,REP,IN,0.000000000000847123,,6345480DC5B5514140C98FCC963FDE2ED758A5D5D4E4D3C109095916EB7BA26C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T16:08:05.705Z,Confirmed,REP,IN,0.000000000006892237,,BC7E90A3EDA970CF08E45B3DA53FB05C39BF8E08678BD31BA7CE797D3E9D8B79,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T13:07:07.616Z,Confirmed,REP,IN,0.00000000000157448,,02F5905A4209E33BB878CA5CF455EE23389E3A47CACF1EEDD1DEAA4F9C757635,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T11:51:58.013Z,Confirmed,REP,IN,0.000000000000001368,,413F82A4F2A6E023BC4D5BB36DC36005329C01103E63860E9146A66DA8F81457,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T11:21:52.307Z,Confirmed,REP,OUT,0.000000000002612135,,B3E6DBBF10934267238D876A40463E04B1BD38D8132FAAC4E7711AA4AC99FC54,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T07:48:57.232Z,Confirmed,REP,IN,0.000000000000375449,,AD6BAE1F48582128739D0CB12D97359EDA4DAAE7040093088D2B535CA98DCA34,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T07:14:35.618Z,Confirmed,REP,OUT,0.000000000006935764,,C074A3C0564F8806755E884D79673B14D0A8163586EC84345DFE17183BC690A3,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T06:03:00.974Z,Confirmed,REP,IN,0.000000000000072817,,8984EDEA489F1F331DEDB5694096ECBAC28728E3CC16A8E14C9544422CF81AD7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T04:57:22.068Z,Confirmed,REP,OUT,0.000000000006936448,,DE8098DA94227DE89C7B3C4D5F23FD3BDDA6645DA95BC7F8A213846875668C05,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T04:14:11.636Z,Confirmed,REP,OUT,0.000000000000034766,,C7BAB77B26BD3CE93364C1E0E5405808471FD038718A65070846A2623E11F123,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T18:08:00.579Z,Confirmed,REP,IN,0.000000000009370645,,BF4C209E4DB5042091C10440CAB7242DDE138804A3FAED82142DB0FF6F9D5276,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T17:30:45.121Z,Confirmed,REP,IN,0.000000000000273477,,AF3BFFC8C4DD43A43AAFB331FE068C0F9A6FED56E594F545AF0F27271A7E1930,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T17:25:13.228Z,Confirmed,REP,IN,0.000000000000486045,,BCAE41ADA4D7A83F650537ACE6E13735011F96C5D7BF36591695D83842C1D940,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T16:51:31.423Z,Confirmed,REP,IN,0.000000000000006843,,61287F87525FDE15B5A075BABB9B2560FE308DDBC670142C2B26DBE714C6D898,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T07:51:58.001Z,Confirmed,REP,OUT,0.000000000000050917,,E10AEBAB5AAE660F2DB06AAB516031366E90C4729D93F0CBA39D87F2CF8EBD17,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T00:49:12.316Z,Confirmed,REP,IN,0.000000000000229403,,EA741770E8114488E96EA309B41DB03BFDF0F4460AB40DB61AAE90F61CA49036,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T21:56:18.929Z,Confirmed,REP,OUT,0.000000000000191352,,D667F68AFA0A51CB42395600801A8347A7F3D656D132EF61328E10B581FCDA92,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T20:01:58.922Z,Confirmed,REP,OUT,0.000000000002782956,,AB803935A09193B1DEBBD4E742343E5C524815D7FE73370DEA72B6A1DCCAEBA5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T17:21:24.915Z,Confirmed,REP,IN,0.000000000000003832,,EAA8D408172154F0AC3C3F7D5B7EDB12F8A9B93940161E489B3ACA6E799E0F8E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T15:11:41.865Z,Confirmed,REP,IN,0.000000000000264717,,C692AFF4D8CF321EF163E0937C8C3C6FA724B7686213024B5D9220162E497881,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T06:13:07.885Z,Confirmed,REP,IN,0.000000000004559465,,15C7A2F625505F6CEA8DC6631483D6E7DB06D14BB634464D1A8EF0AEA624A1DC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T06:00:23.528Z,Confirmed,REP,IN,0.000000000001692467,,34CED3E44275AACC4672DB9B7F9D6884C4124FBE97D378666B6B77E5C8D132AB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T02:55:03.613Z,Confirmed,REP,IN,0.00000000000091515,,2D50525206C38A0967C435FD4454E6908B624C8035A0DE21DE1827A224D832E9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-23T02:43:45.579Z,Confirmed,REP,OUT,0.000000000000447309,,04FD32A40A2F33607CAB88436458847902256E4ED5420E3C0714B3D56BB90C15,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T23:42:07.827Z,Confirmed,REP,IN,0.000000000003232045,,CFB8D7A57B2EDFDED1B73AF5A45AE146ADFF1B99B5694BA3ACC16BD34ABE989C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T23:36:37.266Z,Confirmed,REP,IN,0.000000000004275174,,4506132210805B32E4074C6F718C61A173476419F291FC293DA9033B671B4694,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T23:09:09.093Z,Confirmed,REP,OUT,0.000000000001690825,,4ABCFF96BCDDEFE34628A9065B36FAD66EEBB2BE09248F0D4ED25F34012E969C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T20:03:45.432Z,Confirmed,REP,IN,0.000000000000146867,,27CDA4A32EF363321479D70802AAF8740DCE3550CF9D21A35B74FD27D61E49F6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T19:58:33.690Z,Confirmed,REP,IN,0.000000000003668952,,61066677D3DED180C58B100BE68A7034C635C3E8FAFD976349F47FE902A09BE2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T11:49:44.474Z,Confirmed,REP,IN,0.000000000003334702,,27E3FECE2683E2F3E46F3929B029F4CECE15C29C5260678EE26690D29F07C64B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-22T09:29:46.241Z,Confirmed,REP,IN,0.000000000000613339,,9B0FF00A98FF71CFBD5C3EEE20425A3B1E5D2F2FB8C349F8B8305E31ABB8DBBC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T20:29:06.248Z,Confirmed,REP,IN,0.000000000002356041,,48A8252C0B5E20534D7EDF66A86B7E0522A9DB0861386077CE28734464811EFF,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T18:35:59.568Z,Confirmed,REP,IN,0.000000000000103751,,2D7366B657A91635E95EB56B317FF4B683C779D6C5D66E56D8A3C19615579E22,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T18:27:55.172Z,Confirmed,REP,OUT,0.000000000000530393,,B12DCB47DFAE21127C1DBA6D9697987C740B8EC4B3BDF17722FD9247A43A466B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T18:19:58.012Z,Confirmed,REP,IN,0.00000000000002012,,97A5F54A73766D1974CF073F7DCF8E43B660023128703B15BD85A097C638F837,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T07:45:39.904Z,Confirmed,REP,OUT,0.000000000002706168,,ECFE2A1AA48982368C1DA98E1B04FCE7EB704D1F37093D8300F5464F504FB9B2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T07:06:46.750Z,Confirmed,REP,IN,0.000000000000497679,,7D460F9A5C80044CBF5BFB8130125505ECEA78D6BC7D4E4997B8CC70F34B3C3F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T04:52:28.785Z,Confirmed,REP,IN,0.000000000000363268,,24A2462FFAEFB65EBBDF7D9C287B95D2BE2034E12755F054CFCEF6E190C37D16,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T02:18:49.895Z,Confirmed,REP,OUT,0.000000000002452127,,1F6441AA5E2079E2A6288FF6C0C6488F9A254611877C6B9BD18FE98588B5C108,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-21T00:19:38.783Z,Confirmed,REP,IN,0.000000000000068164,,AAD44489949DA8DEB7CAAEE705CDD1D5B5F5EF3A5FA230ED77E624A187020D26,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T22:35:31.706Z,Confirmed,REP,OUT,0.000000000003991979,,3B5E19D35EB48FE91CA05643BB29921BE676D624E29835776871F76D8CE60DF5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T21:48:10.143Z,Confirmed,REP,IN,0.000000000000111416,,440DBC13EC0070442345597C3D0C5752C0395A1F930021A6B255959E93390890,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T18:38:09.182Z,Confirmed,REP,IN,0.000000000000146593,,9C4B59E9D7838FB2AAE6C42469DD2A9BF547AAE9A86A19D2C27416DEB1F7CA73,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T07:59:13.160Z,Confirmed,REP,OUT,0.000000000000217084,,F7B394211EAB0925C09C782EF17EA72223C246AEEB1CE37CE45DDBAB22498CAB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T04:13:10.770Z,Confirmed,REP,IN,0.000000000004817886,,3E897B8E56F2AF809E7AB28BB77EBEF5C21C33D519591CEC824F47BEF26ECD67,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-20T02:57:53.052Z,Confirmed,REP,IN,0.000000000006909757,,085C3DF550D83BEEB711007EE9D08297D30EEE19F972E517573428C72D0F382B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-19T22:03:05.792Z,Confirmed,REP,IN,0.0000000000001945,,DDA99D3F29BDEA5CA5FEDB25FD997B10711F28B80329446298EB92D07CC13476,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-19T14:05:28.280Z,Confirmed,REP,IN,0.000000000002707537,,925C4BADAD0FB4FCDD5F09F81B4CAEA06EA9D95D7482ED65B36B6AA1E241647D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-19T01:31:53.235Z,Confirmed,REP,IN,0.000000000000038872,,FD472BD2B249948903FC2D4AA1FC6305A946B9E5C29F0180847019DBDF4C52DD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-18T20:53:24.493Z,Confirmed,REP,OUT,0.000000000006971351,,C297B8A52C4948961BD926F82BFAF69E87E7971EF679F8830CA83CF1135D2BF5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-18T19:25:26.098Z,Confirmed,REP,IN,0.000000000000374902,,40FF3A856C19D2B7775E1C31F4C086574EE7005D9936A09F65F9C2826384B865,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-18T02:57:56.779Z,Confirmed,REP,OUT,0.0000000000033707,,24E4A1566624DDA1C115ADFA0073D19759DED619EA93FC1FA991ED4BED026C5A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-17T23:15:29.977Z,Confirmed,REP,IN,0.000000000003998275,,E35D1F59B28E5EB7D19711207F831DE4BF459362EAC9EA539C0E6ABB67329838,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-17T21:00:55.780Z,Confirmed,REP,IN,0.000000000000038598,,915B1A8D1B04F747029CD285BA7BBCAEAFAF78C7B31D5675D669DC89C95420B5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-17T15:23:07.080Z,Confirmed,REP,IN,0.000000000000794426,,0577B58F8216117CA33E3AE295FD29B1BD622A0902D9BA7C24759A53115BC9DD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-17T13:16:44.462Z,Confirmed,REP,IN,0.000000000002361789,,D595F79B5FFE2D2682C0F9AF9CC70828F88F1142E6CD45E07443800A3582F26D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-17T08:38:25.585Z,Confirmed,REP,IN,0.000000000005425067,,89E39315CBD3CDC8B8620546B111D1362C5AC26CFCE267E1B0152C91D25E8884,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-17T08:00:23.475Z,Confirmed,REP,IN,0.000000000000065152,,EB2F98E6B2CC5BC207B0FD15EC2883E8CC4620C19B69123609855EF2CAFEE2FC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-17T04:28:14.151Z,Confirmed,REP,IN,0.000000000000201207,,F51D71AAC9F2ABC10BCFD8B7C3BA462A3A3A8B8E0DAAAED0B01AA50389E000DA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-17T03:52:11.372Z,Confirmed,REP,IN,0.000000000001033137,,A00FDB2E2A5A931D577B8DBFCC65790360C6DCD193B2B0B59308A30652FE135D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-16T19:44:48.394Z,Confirmed,REP,IN,0.000000000000952244,,33DBF3B63B87B47A3DAD04FBC80E9C852678C5028DF3DBE6AC2A54E06744580A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-16T17:14:09.915Z,Confirmed,REP,IN,0.000000000000637977,,90F73B4E0D1682B88BECAFDC698CAE223421EA4D4409B69E91A4B7B67F629CD6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-16T15:45:12.929Z,Confirmed,REP,IN,0.000000000000019846,,1011AE0D9AE4AE9F094018E4423A30E6DDCE9E55DD45B4C0B092E70836C9908C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-16T12:58:39.651Z,Confirmed,REP,IN,0.000000000004930261,,6B250D46D5A30BB5415636A4C650C970676B95B9A3D062E75197085E15F34A3F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-16T04:53:55.778Z,Confirmed,REP,IN,0.000000000006190339,,BC85C279B2AA267DDB4D1A873C15432E108F9E4AEDE006973400185691061B02,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-16T04:51:13.795Z,Confirmed,REP,IN,0.0000000000004083,,62ECEBCC165D336D9FF8FF78A1A8A2257FA78F10D7119605A83F23BB9A09D243,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-16T03:27:45.868Z,Confirmed,REP,OUT,0.000000000002619663,,E3413B4526DB051232A3E1A412C8512192A1F68DE40531790379B9814553F28F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-16T00:33:24.186Z,Confirmed,REP,OUT,0.000000000002931603,,4128F11730FCA3EC8EA2E23D5B6C1AD00567610B68AD79A59E1CCDB3B5500AC6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-16T00:32:22.336Z,Confirmed,REP,OUT,0.000000000000122093,,C5B90B74B3D7A6CE1FC11F948DFFC3FC6E8D77354209C026FE27D9F7A020038B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-15T23:41:49.930Z,Confirmed,REP,IN,0.000000000003158269,,D6B4F0F41290EF422682239D6F61B16B1302E9B697689F3B4867E62BBE61AFC5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-15T22:41:02.881Z,Confirmed,REP,IN,0.000000000000122229,,9E2DE8E2AEEDE3410046829789A91F250AEA9165C9DA1EBE126D1C5A3313A3B4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-15T21:40:46.011Z,Confirmed,REP,IN,0.000000000004643781,,C7852B9550A657BA86964B239AA6869C535B540DDDA1A1387BD6A2560B21A9D0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-15T18:03:16.618Z,Confirmed,REP,IN,0.000000000001331526,,A5BE4B4209DC0499AA474823A4D8767C1D221C418769F337391A5D69FDAABAAC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-15T17:23:15.263Z,Confirmed,REP,OUT,0.000000000002245719,,C57B11A9DDC2ED84B57A53FA8FC876743397A156194BE18AAA4BAAF1FCD93859,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-15T16:39:58.269Z,Confirmed,REP,IN,0.000000000000350401,,F54923881D203CBF72FDF7527DC6D6F0025D80B8464420840925B8D2E25D6C9E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-15T02:23:10.385Z,Confirmed,REP,IN,0.000000000000181497,,6DE4872FE03D42DA771E5D43831A5B96B461C2A177B3B059EC11C627733E3F33,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-15T00:29:37.862Z,Confirmed,REP,OUT,0.00000000000059185,,157BDDE5A13785BDC1B5F008E554EFF07381EAEDBD780A73AF0B918A0BC943AA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-15T00:09:56.677Z,Confirmed,REP,IN,0.000000000004257654,,4482B059D191B233B0D25CE480A5E487C6F87C1E6E6EC4B0D077819CC932B068,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T15:26:40.008Z,Confirmed,AOA,IN,0.000000000000095676,,DBE92D1120D786AB70BA681EAB629464A270D543FFE51F193DC1801B961B9BDD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T13:13:15.772Z,Confirmed,AOA,IN,0.000000000000689305,,C8658D2098EF6DF69EC8C7F1A530009EBFBB6E5ECE7145AC781733D3DEB7AC3F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T22:44:37.748Z,Confirmed,AOA,IN,0.00000000000098263,,A88844E4E75D3038BDC5EB4D9766509E652E2FBD3623BC634A29314CF4D5D58B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T21:27:48.671Z,Confirmed,AOA,IN,0.000000000005297773,,FA6FC0C0420095F4F61D5AFE8C17FBCE9754969DC083B07DC07D374CC908DC8A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T20:19:37.878Z,Confirmed,AOA,IN,0.000000000000082536,,BE16311E9076592A950C5788CF1F09587D0413EAE295F06073E757D48E5E4F99,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T19:54:16.631Z,Confirmed,AOA,OUT,0.000000000000195869,,B7943F556ABE5E1DF93F8082601F1D8619C808CC3BFA03E0C98531631A3EA9ED,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T15:17:14.404Z,Confirmed,AOA,IN,0.000000000000309475,,01C98C4FD67C1D8B2D9885A725DBA51C023E7660D6CFD9FED6FC08A7E6985F9E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T15:11:49.482Z,Confirmed,AOA,IN,0.000000000000770473,,B6368866242E1C2777E016DBB88314470F56E79595035C7718AEB79C280A7D33,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T14:45:59.315Z,Confirmed,AOA,IN,0.000000000002127732,,7A64B6DCC53A6E71415337BED581B6533BD58FA20D1DDF7C09E0302AFF20EB57,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T13:16:20.988Z,Confirmed,AOA,IN,0.000000000003719048,,EF8C619C0FEA085972176614E304E562A9520FD57BEF678F04FD4438A61E2317,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T10:42:01.678Z,Confirmed,AOA,OUT,0.000000000000269781,,515510459087C745DAFDAD14B8C82FAA37E77BB2FFBDA0200D7153DEF4A69849,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T08:12:19.787Z,Confirmed,AOA,IN,0.000000000000103751,,A4FA0132422029620425A6ADEA793995370C8A7BA25D345FD66B0C7ADBE6B5BA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T07:04:28.670Z,Confirmed,AOA,IN,0.000000000000569402,,5CA8D94C26CE1B55A4870C0C91A9B649454A739F2498D2C7A80E23DD25DA64B2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T16:59:20.050Z,Confirmed,AOA,IN,0.000000000000457712,,5D08D4D93D8A842238A2582958B2C88833AF84537B48F054E8EB1ECBBE97D780,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T16:59:02.649Z,Confirmed,AOA,IN,0.000000000000449499,,ECAB98E3866E91F2D850388946EAA3D2A472151CC88073193B525DF963D40584,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T16:52:21.333Z,Confirmed,AOA,IN,0.000000000001585704,,EFB161C2307323649C322FDFF8D22CFBEFB2F2DE09F0A2F8BFE521373E140E73,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T15:54:00.748Z,Confirmed,AOA,IN,0.000000000001470044,,0E8D5899EC84F18610D5F0F1BE2D2267D18EE5D8F7425DA0623C35DF44655611,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T15:53:11.433Z,Confirmed,AOA,IN,0.000000000001102807,,4D2C4DB3E1274A5D22F9E91AB3F3FAEFD93816A5B24223A0E4B167AF5CABB77A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T15:51:40.756Z,Confirmed,AOA,OUT,0.000000000000543259,,FB4B682AFDE765A2FC6F8B6DF0000E97A5A73AB38E1339759636898078239AD0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T09:23:31.714Z,Confirmed,AOA,IN,0.000000000001507959,,1B6FC9458EF4597B99DABE0D8B1FC4DE99C88900741D5740590CA41A0C888EF0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T05:24:19.896Z,Confirmed,AOA,OUT,0.000000000002521523,,9B42D6022625CADA09A68599EF3384B485319F2F6A1A2B355638454E4722176C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T04:17:57.871Z,Confirmed,AOA,IN,0.000000000002173448,,5AF967F18162332C8289E017DA87CBE58AB6977BDDE9CFE4003A72F10D99673E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T03:16:22.913Z,Confirmed,AOA,IN,0.000000000000030386,,3021A19001729F34F96A4D2B6E2C00C9E1D642469B7E9C5057DFA77AFDE5544E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T20:09:22.252Z,Confirmed,AOA,IN,0.000000000002657714,,1A52B863B05D98F8C3C165F1667591CB2259B1B6DCCCDEABC97F9CA12E3B9127,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T17:08:27.440Z,Confirmed,AOA,IN,0.000000000000788814,,6CBDDA35BF12304FC8462798674E341495B53BF46EB9B42634063503248456A7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T11:49:36.115Z,Confirmed,AOA,IN,0.000000000000634555,,4E66AB2295E861D095CE5D1D3EE9674E14526574261ECB39D97FDB3DF4401ACF,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T07:53:09.347Z,Confirmed,AOA,IN,0.000000000001986202,,9F14EECBCFF62CB110F9E9EF61E9F04729A428BC3BD2DA4EE7F39E5A191D3712,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T02:06:44.316Z,Confirmed,AOA,IN,0.000000000000885174,,7936D24C5967DEA334A30568AE5D9010094D574E7F8D53F14443391A7A320BCD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T06:02:57.541Z,Confirmed,AOA,OUT,0.000000000000036545,,150FFFBD9068F70B9238DF18B793B9AEBAC3E5769E2D3293ADF354EBA876F525,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T04:47:27.163Z,Confirmed,AOA,IN,0.000000000001144417,,1B8D9C31088ED0A6C78B4E30D29DAFC59FA5A320E3FEC3F9582EB4088130D5F1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T23:30:27.637Z,Confirmed,AOA,IN,0.00000000000437961,,D44E0244E858771A1006823EA63D986E934ED620E87FB33D4AB0EF359FBB98ED,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T22:53:21.354Z,Confirmed,AOA,OUT,0.000000000000794426,,E96CE0560D1FFFB9FC607987DC579C9A22003AD8CAA2FF1B1F9DDE7D1C517900,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T16:27:08.829Z,Confirmed,AOA,IN,0.000000000005796274,,B55A50AE5B5C27EED508DDCA96F6775B3754B3289B689D6745FAAB902D990C72,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T04:27:04.736Z,Confirmed,AOA,IN,0.000000000000126336,,AFD2B223875B3D4D3FF0205A3E3C1CD4F93956C4879C0CF28DE70EA3C5E9DA57,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T03:19:26.148Z,Confirmed,AOA,OUT,0.000000000000147962,,3CD9A04E453E5DB9080A1AA89BF0AB29E971A23C849680B28986D35EA3642C92,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T02:05:08.529Z,Confirmed,AOA,IN,0.000000000000778822,,B87EB3BB5FC5132D64EFD9D1F62D7D5D4B53B7EE89F81A852FAAB1A5376AA573,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T21:40:25.700Z,Confirmed,AOA,IN,0.000000000001000424,,FDACE7225C9CE9B75DB2237A4AC8200FCF213265F82C643FC25FDF8F09BB638B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T17:21:33.508Z,Confirmed,AOA,OUT,0.000000000003341408,,C6009908C4D95CC03B898C0C38E36D09C45E95DD8ACC97341CABB360923A6ACA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T17:09:30.492Z,Confirmed,AOA,IN,0.000000000005100945,,9257E28F5A9F4801B698DB0630D29DBCBBD6DC1582177760450CFB7F4750A51B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T15:36:14.825Z,Confirmed,AOA,OUT,0.00000000000025363,,78F0025C1E55B8C88D694CF2C6D93BFDB234EB82504D9577C230551D3D978F3F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T10:21:59.802Z,Confirmed,AOA,OUT,0.000000000003163196,,1E81E200166EDFB340621321BA0CFD8DBBBBFFB4264C36B13D5D6D739860A5EA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T08:22:14.522Z,Confirmed,AOA,OUT,0.000000000000921583,,3892257885DBF7D6B65667756BE956119CC3306E8A6978A708502B9086BFBE3B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T08:02:48.283Z,Confirmed,AOA,OUT,0.000000000000515884,,F5216AF80032C6A24C0572154BF21430684F8161933089A7D79A81EFE3856062,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T07:51:38.010Z,Confirmed,AOA,IN,0.000000000000427052,,BB6A8EA3B683C2F3C0F86F1284B5DC536D7DB3022933F0026C96D644AB0E8A9D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T01:37:41.384Z,Confirmed,AOA,IN,0.000000000000109089,,27D486292DAD9A9D2B3B25C4BAB39B14EE2217F5F6B321230C58E2294A029B2A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T01:03:31.682Z,Confirmed,AOA,IN,0.000000000003401086,,645C9AEA9E12687CF480FA8A939E46CF8FB1599595388F649ABD035D4F58DE4B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T21:38:04.612Z,Confirmed,AOA,OUT,0.000000000000592945,,434F57BA3E2390C705EB29618610844A05A457DD7CC69A8AB04CCE8F10851F73,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T19:47:46.263Z,Confirmed,AOA,OUT,0.000000000003916971,,DB117EC955AF0F8B487264D988580D71FABD5D5FAEF564D980A0D9023BF76FC5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T11:55:11.889Z,Confirmed,AOA,IN,0.000000000001275133,,20F2F0019764D68C1078EEAAEE3C715628575DA067DCD80C182AC0032B2BD150,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T11:32:21.628Z,Confirmed,AOA,IN,0.000000000001509328,,E5DBC2B2DFE1329F42ACA7DD59D53D2F17AE53B0C129318B01ECAD276C72791C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T10:25:31.188Z,Confirmed,AOA,IN,0.000000000000117439,,69093C7D6E74653B9E585C15F96D876C8C18A9735B8C87A1746774D2A7976950,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T04:02:26.640Z,Confirmed,AOA,IN,0.000000000000127978,,287D30FB6608101BB0673D6BA42696AEF8124D8BA81F33BAF2B85194F65BAD4A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T03:41:38.936Z,Confirmed,AOA,IN,0.000000000000055297,,4E89C8923E63DC3B52071BB7B14B9054682535D285F4BF394D296F5B2898C842,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T01:54:55.499Z,Confirmed,AOA,IN,0.000000000004232332,,07C508136050FCBA1E989A7FAFF739A3AEFCEA652A4E56F89D80A402E76B80AA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T01:17:22.932Z,Confirmed,AOA,IN,0.000000000000857936,,6C5D1AFE028815F4D01ABF04BBC5FC42E8DC2C07890BE71F05A8B31AED09E9EA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T00:54:50.253Z,Confirmed,AOA,OUT,0.000000000000940883,,4B48E5137F542EC7AC989DD7421DF2FB900196A44C110E9932A0FF2080D9D9FD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T22:10:17.924Z,Confirmed,AOA,IN,0.00000000000024268,,5B0D66981F0F749E22321F9461AE661A911CF9C735DDB348EE1BC2F5DFF0F744,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T21:46:46.503Z,Confirmed,AOA,IN,0.000000000002310187,,047B5D49726DBAC30AEE8428994C775212DF5223BE118529EFA320970A2D2AF5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T18:01:40.258Z,Confirmed,AOA,IN,0.000000000001363966,,F0AA8319BB25F0CFC09B57715196E45147632747E3F7E2B6CE282FE282D0C555,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T17:47:28.612Z,Confirmed,AOA,IN,0.00000000000020326,,2661CEAFDC0B0AC86BD9C6A4C7EE0CAE2F02F1191F6548C77BCA260A115920EF,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T13:35:13.178Z,Confirmed,AOA,OUT,0.000000000000714217,,E1B1954C935D1E48D237EE0E9FFB670023AA22161DF9FFD17A9F4EAB2CC936F0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T04:28:41.361Z,Confirmed,AOA,OUT,0.000000000002224092,,E3D1F149C5671438BFB9A780F1ACE889CF90C3D32D7BA287FF10E8A69A7A75FE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T01:50:46.316Z,Confirmed,AOA,OUT,0.000000000002427626,,44115EF13E4429632D5C387D445C8ECA602A4EFB5CF37568F1FBEABD57A09E8B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T22:17:36.659Z,Confirmed,AOA,IN,0.000000000005035519,,F6F5C0CA3E82BF37DC6D0316CB60AEF4152E981CAC18EDCE7B717DD9CCC54302,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T21:04:25.950Z,Confirmed,AOA,IN,0.000000000006312432,,96D5E3E8BDB1B868EED672C94701EAD54EE45435D5F9BA5BAE3B6784D107152D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T17:34:24.873Z,Confirmed,AOA,IN,0.000000000008106051,,D0C0DB8009F5774602821CA53ED59E35CC5E3D4715977D966849B478B45AA378,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T15:22:03.245Z,Confirmed,AOA,IN,0.000000000000368195,,795A88C9C4AF4FCD2313F3FBE3050BD50EEE40948C3BF45D9273D7E6F8C6FE63,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T10:35:00.317Z,Confirmed,AOA,IN,0.000000000007671197,,A4F362BAE2442E44A64615E31E031910E8F55C122E2CA30B4D8CD576FDF222F6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T08:23:43.636Z,Confirmed,AOA,IN,0.000000000000234741,,2E0C306F665A8AC944210FC9F5DB19F54E823B4573343F79E81CC2C1B28E6B5D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T08:21:30.724Z,Confirmed,AOA,IN,0.000000000000676576,,DF5A9EF16732BD37F49F702184002FB86FA0477CBF9E6293FF8C5A345F24E6AE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T08:20:28.496Z,Confirmed,AOA,IN,0.000000000000134411,,55FF84DBE74C4C4E1FF503976209FE858D5E1E006220C4BCB6217E241BE99D7C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T06:15:56.146Z,Confirmed,AOA,OUT,0.00000000000023173,,AB3294BECFF8A510DC356EE7190F9E40EA63E51A8CEBD10BC95A2A71C4461AEC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T05:32:23.418Z,Confirmed,AOA,IN,0.000000000000362309,,4DF9D56589EC2FBDB5B9967D51F172FCCFA87A1A51C2748DCBC0865068DAB2D3,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T22:31:13.450Z,Confirmed,AOA,OUT,0.000000000000342326,,E2396FFD7C92C19C2DE8EC7CDBA1CC973023A52C31AC8E00039035617AB9DB05,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T16:08:00.774Z,Confirmed,AOA,IN,0.000000000000759112,,65096137BFFC3BE104734976E86A755CB6977999C59B455521909E30A7D11076,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T12:17:16.071Z,Confirmed,AOA,IN,0.000000000000912276,,D43BE253EA314FBBB9C37BCA1CD5DD58F1B4B4BC1F25664193177A578DC5899D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T12:14:37.659Z,Confirmed,AOA,IN,0.000000000002356725,,73CE3FE77B7F9D89A38851F449FD42154A5780640EA2C3A154EEA180EC245400,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T11:07:15.588Z,Confirmed,AOA,OUT,0.000000000001409956,,9872ADC8CEB43BB73210F798474708A40327E1D3FC7692D8CCEC4EC75226102F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T07:38:15.310Z,Confirmed,AOA,IN,0.000000000005807087,,A61D1A1898E8BE5BB3FF8C8807C469EA725755AC469FCC48DA272D5380837F46,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T02:58:04.161Z,Confirmed,AOA,OUT,0.000000000001844673,,035C16C2E58A070237ECD6781196FE2D74B4955928EC8B82613D0703A20B4370,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T01:41:07.430Z,Confirmed,AOA,IN,0.00000000000016644,,DD5C086B884B6FE1A6149AF4C371DB53E201F29D72BBD0002C5434E0B2B64EB7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T14:11:45.260Z,Confirmed,AOA,OUT,0.000000000000716133,,E7FC15A79BAB7AF699F506D087B9384FD095A7BFFBF6116289702DB55354BCA9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T13:55:07.663Z,Confirmed,AOA,IN,0.000000000005756717,,DD9C10DCD6C9EE639F443505350C8848D9984B02BC749D2121C9AA8BC2B1D9E9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T05:47:51.391Z,Confirmed,AOA,IN,0.000000000001769254,,8D1AE4D7F3A5E388CF661D7D9D8B6B8A0664B93899F7CE2992BB336A6CD4FBE2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T01:29:55.575Z,Confirmed,AOA,IN,0.000000000002243939,,9DD9AE9902137F78AFD681014E3C550790E43003A788D8C38A5448A138FBE86C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T00:33:49.365Z,Confirmed,AOA,IN,0.0000000000000438,,F31A029F7022CF78F98B44753CCA28A6EE416D82293D4A732539785247B67BFF,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T00:32:55.537Z,Confirmed,AOA,IN,0.000000000005831725,,CB196BA92D3ACBC667C1B4B0D293FE380CCC877522A877BF128A6913D2FE03BD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T00:19:02.557Z,Confirmed,AOA,OUT,0.000000000000515473,,AEE2C46DB6215DEA5A7955047B30442DF48CF795018B379E399A6FE6325E15F4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T07:59:31.229Z,Confirmed,AOA,OUT,0.000000000000127294,,E346EB32CA46639366F03093EA4BE41034AB761E5A77A2D52A1D1322A9112108,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T05:52:34.231Z,Confirmed,AOA,OUT,0.00000000000327913,,735F55DE14C4A83F7F1D7C5809E9D404CBC4E24B85FFEF3151A0DABA3AAE5329,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T00:38:46.559Z,Confirmed,AOA,OUT,0.000000000001282114,,7E423EB617E8A0105E1D415D4C420C9C141311D8F446398B14E4DD278B76B6F7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T00:05:15.623Z,Confirmed,AOA,IN,0.000000000000706004,,CDD9C6E97703C67E115F3DA37A5DB0E018B632F97899B913411ED47D4BD1D8E6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T23:51:59.158Z,Confirmed,AOA,OUT,0.00000000000244501,,B6D7470259B4BCB291C6FC628E4258865E77CFCAEF1504F460871383D9D8FA2C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T12:02:52.668Z,Confirmed,AOA,IN,0.000000000001306067,,EA52FC92D7D0B9694AD9B98E88FCCAAC9401F0E022677D3511E794A5AB36B00D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T22:46:26.260Z,Confirmed,AOA,IN,0.000000000000571455,,71AFD9BFBD39FEA4ADF30C9DDC8991267FA128BED1EAE15EA29D1A0BDC963737,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T19:24:15.960Z,Confirmed,AOA,IN,0.000000000001683297,,34D92F0DEB371A2333334AE5C1EB2F3C8A7737B59D840D807CDF8EF4B2CFC809,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T19:02:35.639Z,Confirmed,AOA,OUT,0.000000000001870953,,67171582E53A80DC0094C145D8DC4C40E67713CC9B28D2EB51D4F3E86075F953,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T16:18:22.469Z,Confirmed,AOA,IN,0.000000000003075048,,0EF8CAD2253A4FDE59B6831DCB1C5C877DB0FDE43DA7E824468B31222E2A6197,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T06:42:03.668Z,Confirmed,AOA,IN,0.000000000008112073,,0A8E8AF0B6F82CD89AC99349439DFA6EA3ADF09D16F5917E71E568E4BFCEB322,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T06:23:43.823Z,Confirmed,AOA,OUT,0.000000000004936284,,A3FB9787AE86B658917852895CFEAD3B928DE72ADA00B782CE937DC554BCA51D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T05:22:18.507Z,Confirmed,AOA,IN,0.000000000001576397,,0778AA8C713292F3DD60E51A6F77E3650005F052C5075768CDD22520C5A7D017,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T19:21:41.380Z,Confirmed,AOA,IN,0.000000000000762671,,24B0E752E370820B2413F092A1BFB84B70CA454241A5DC80F9CDFFAE56BBB0EE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T12:55:25.433Z,Confirmed,AOA,OUT,0.000000000001017533,,7485215EE87E4BFC757DC8CFCFA35066DE210D9D2F4C90D728C7D4F6D4FD89D6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T12:35:39.550Z,Confirmed,AOA,IN,0.00000000000367648,,DF318C9ED6470551358DE2134C9D91DC48FBC57D926D5B2EAFBD0CC647924121,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T17:55:00.769Z,Confirmed,AOA,IN,0.000000000000585554,,531561B59D7C07DA50481E046BE54ACF1269B9657CEDF18A4168945E3CCBE3B4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T15:28:53.018Z,Confirmed,AOA,OUT,0.000000000002546298,,12BFC8D80ECE9DDB853FD7F84FF64FC647AFD2102085C8224333DFBDC5D739CE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T12:36:51.642Z,Confirmed,AOA,IN,0.000000000000611149,,2C59A93B91FFF031AC26BFC2245E3D978997BEE926EB285F7D3B35F148D5997B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T08:44:30.189Z,Confirmed,AOA,OUT,0.000000000004839376,,02BDE9515C95B25F5F11AFB2D509BB6FB7E59C6B037A44A16E39AE555AF397B6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T19:54:11.491Z,Confirmed,AOA,IN,0.00000000000051123,,131F3A23F7A7CA43AC5CE08C57AB03D97C4342D6A8F63D7674EFDB15DBA7DAAB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T18:53:48.703Z,Confirmed,AOA,IN,0.000000000000242543,,4024E46EA769572766F9853C2AA1DA3B9BD460F17149C58DAF06EEA88E825773,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T09:07:29.309Z,Confirmed,AOA,IN,0.00000000000269823,,66766BCD3481635E11C16389E44A6D552C4741F1EB7FD8A8ABD047A3F00612EC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-25T03:19:52.569Z,Confirmed,AOA,IN,0.000000000002721225,,B24032F23307F6D8BE7D24D65085588A5F94BC2757B59BE3DD9BCFB5911371B2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T23:58:10.922Z,Confirmed,AOA,IN,0.000000000001172613,,A204AF2C8FF79C3DE9A997BAFCE97C8B51F4BAAF3846E92CD47169176641654E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-24T07:56:26.405Z,Confirmed,AOA,IN,0.000000000000018341,,AE3737E656E49ABA761CE2AD50404B5C338CEC3D99C5BFEC1CB14345CDACCC86,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T14:37:31.679Z,Confirmed,BNT,OUT,0.000000000005700735,,EDDAE3F96C9C26D419023077D7B747C6D7697472748D64275F1B7DF0375E3678,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T08:01:40.623Z,Confirmed,BNT,IN,0.000000000002939405,,5E9DACFA915A76C11221E8C3388A05F893EF00AF31F150B091167DCE32062D11,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T03:30:19.453Z,Confirmed,BNT,IN,0.000000000000004516,,8279CBF59E0945D115F8D40E74981ACC53270589A1BCB2504F7C3BAA0952C00F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T01:44:59.829Z,Confirmed,BNT,OUT,0.00000000000030578,,5F6B1CBDF6525397202A8A1A5E6AEE7C844690CDB23290D9251A7610647ABE50,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T01:19:50.729Z,Confirmed,BNT,OUT,0.000000000001829343,,E5BCB9D784D8647211C05E06A7D280E623AA764B9FDAA1ED75743CEBE117AD6B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T15:48:50.340Z,Confirmed,BNT,IN,0.000000000000951422,,FA313109A04F7C23093C8B5DAFD1F35E556E486743DA1D659DA601A52A7DD832,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T15:18:45.958Z,Confirmed,BNT,IN,0.000000000000373396,,B7169DC3E621F83C7207CE26443F8FC1E3A603A8CF5F741F6668E5851DC3AE9B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T09:41:43.197Z,Confirmed,BNT,IN,0.000000000001533691,,81544259C5340021C195D0BDAEE72EAD24266CB04274442E0ADF143C676E0A86,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T08:47:41.336Z,Confirmed,BNT,IN,0.000000000002379857,,34EE04D7CAD04B137AE0B6E88EBD490F5F7F633C628E72FC50141C62E8F5B02D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T21:01:59.193Z,Confirmed,BNT,IN,0.000000000000107994,,DBA7CADFDE1E9119A2B91EB7D94A88C2764E000E158A95864014368EF85BB969,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T17:05:21.382Z,Confirmed,BNT,IN,0.000000000000943347,,A8C70D9873C01A2A6FA89EE543F79B650A147B3774330E6239413EEDE5160D35,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T14:42:26.633Z,Confirmed,BNT,OUT,0.000000000011044908,,1AE9772A358B92C0AE7BD95FA69CDAEA90F656E6DC6BC9C83C4E4F4E627C8168,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T14:17:58.782Z,Confirmed,BNT,IN,0.000000000005234399,,D7AB2642CD4BA1AC140E82CE8EBF516A4ABE17577C530968F3EBA3E0C0B6E04F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T12:34:14.852Z,Confirmed,BNT,IN,0.000000000000228993,,5715B876CBFF707EF030A70C067D9E3F177EF676FD7A717EACFDD887BEEBA043,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T12:13:42.703Z,Confirmed,BNT,OUT,0.000000000002113907,,82AE551823CF76E92DB58C50FBF30739DD47B50A4F09CC2CFB13803D87B7D264,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T11:59:01.272Z,Confirmed,BNT,IN,0.000000000000019846,,5CB6821632992CF28238E836080352BC2C1FE26BCB76B66B4DBBA778E5EABA61,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T11:55:00.644Z,Confirmed,BNT,IN,0.000000000002659083,,631058B55B72988B51EC8BA89C950B1296CD320353CEEDEAC499625F8C4D49BB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T10:37:17.540Z,Confirmed,BNT,IN,0.000000000000042705,,8FB2BF331858B01B9D7B4909E08D02675B88808DCC4210C571DCC0A57D1C4A7D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T09:55:05.830Z,Confirmed,BNT,IN,0.000000000006073721,,5A1D2D714636BC70F659C9E7AEEC2CD1E8BC8F6C9DE83580375FB6A16D8F2B5A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T07:30:27.339Z,Confirmed,BNT,IN,0.000000000008049658,,B7F484A5C0910C7BB1FDCBE272841DC69C286B0E7192CAF68036C2D4755A8FD8,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T01:49:58.846Z,Confirmed,BNT,IN,0.000000000001118411,,D5D91BF701AEC6BD947387F1773233E17ADA53003AFF2CB852C7BFB13AA6926D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T14:35:14.995Z,Confirmed,BNT,IN,0.000000000007365553,,0E6BE2FD09594A89CF9E29557AFF21108F61DCFD5E7144609F1CE1D84A93D390,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T10:50:32.629Z,Confirmed,BNT,IN,0.000000000000047358,,7A0F9127C3186AB710CFBBD13B1BC7E00F9E9059BD913D7DC69B3D41DBF053F9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T09:40:53.375Z,Confirmed,BNT,IN,0.00000000001156969,,4B647D41AFA71C65A946B5E25AF527DC0288E16B2021408AA025349DC05E6634,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T08:41:57.384Z,Confirmed,BNT,IN,0.00000000000190394,,5E1F31C2856B43276D349EE655CAD3B5C25E7CB768328D6C8FC5B1B6BD29BE69,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T01:22:11.008Z,Confirmed,BNT,IN,0.000000000005168973,,35111977D4310B44F73A8A2DE2DC03CD9975EA7BBE2294B09E4438CB79BC608C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T07:28:24.362Z,Confirmed,BNT,IN,0.000000000000021763,,6C55FBC495A18155563586675B26FA32788B06E3A4820D05C731A49173674BDB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T02:00:40.151Z,Confirmed,BNT,IN,0.000000000000465651,,B82BF74D3D68FD6DD8D526568D0DE631074DC4D849743B7CB6BB6BB5C1CE46AD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T22:53:22.191Z,Confirmed,BNT,IN,0.000000000000047495,,ACE145631B6B33D5DA3E32894007DA0A95DA9E40245E4C6C16A6A1701A929E23,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T22:48:36.354Z,Confirmed,BNT,OUT,0.00000000000070532,,20B4C36172D3FD721CBD14C10E7B6F4656C72D7DF1495BA9B38E206887C13C2E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T22:46:28.769Z,Confirmed,BNT,IN,0.000000000000324121,,F4EBB0444130696468743288EB2B78C00471A43EB5D87A3A9F2418D4B944C153,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T20:34:43.225Z,Confirmed,BNT,IN,0.000000000002809236,,1E98DD3104A94C82930F2224ED48F5F9F76B3B911691F5570E23FE42929D6D4F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T13:39:44.998Z,Confirmed,BNT,OUT,0.000000000000711342,,2BBFBF5313E69EA2C18BD2B17F7AA3850B0ECFE9F360AF9B78A485D530B3FF79,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T10:19:36.130Z,Confirmed,BNT,OUT,0.00000000000020983,,ED569A555BEDAB1A60CF64DBBD32112BB28FA93985E7733C32058F71EC171C33,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T10:19:25.204Z,Confirmed,BNT,IN,0.000000000009203109,,A6167E489533D79079AC4BA66B60204A9EDE2AC172E32392400FA45F63446805,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T09:40:56.925Z,Confirmed,BNT,IN,0.000000000000551882,,B5E16C8EA4CDC3658B0CFA8578341CF3AC6482EBCB406F08C2DB3BD5D1C5A0C7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T09:08:50.707Z,Confirmed,BNT,OUT,0.00000000000164593,,23C946C3DBC3355E07639F14BC0553C500B075CD6C30257A61B4A65B61469643,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T08:40:40.962Z,Confirmed,BNT,IN,0.000000000000304959,,FBA642D7BECA8CD29BCA132DF1B9279EFF7231BF446D203E5C96B34A20C835C6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T05:59:02.202Z,Confirmed,BNT,IN,0.000000000000647421,,EA4C699C1A1EA121167F4CB26466BEB31A1C209412AF3463B7F30A1B285560A7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T23:17:10.879Z,Confirmed,BNT,OUT,0.000000000009720362,,1E3D5C24759B6745CD166B2A19463FDF7EBAE395F489336867669533F8DCC789,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T22:06:20.779Z,Confirmed,BNT,IN,0.000000000004995551,,BBA80DFC827C692402A579260916611DED4F37C3A6F358C555F0C694F8570212,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T20:48:40.326Z,Confirmed,BNT,IN,0.000000000002083658,,0DDE4A20A7440540967A5BA66685B678A5ADDDE4AC272B7B1E2E7233206FEBBA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T14:02:36.384Z,Confirmed,BNT,IN,0.000000000000771841,,9B34A3B6566909F428A08062E62B380B9D404FF0AD18F3F8A9666CC7B67FD5A1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T13:43:56.987Z,Confirmed,BNT,IN,0.000000000000140571,,D47EC8429CEAAD352962787BECF67E184373365C260F877DB4932A584A607B9F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T03:59:16.228Z,Confirmed,BNT,IN,0.000000000000110048,,A782B4A3BD1C00DB2EEECC97EEE8CF72DC9C59FB5EC1FEAB75E703C70F219EED,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T00:32:04.839Z,Confirmed,BNT,IN,0.000000000001859319,,8E9459B1F9AACA75BDC7B89AF3018C68A75BBCFB7D01B9AADAA5B87F57F135EC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T00:17:48.213Z,Confirmed,BNT,IN,0.000000000001825921,,5AB0E69532B02AF9751BCF7D3E93F3CDD64AB41FD94AD031656E6FA95E945233,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T00:12:30.439Z,Confirmed,BNT,OUT,0.0000000000001533,,D1D6BE60F33A908DB1D18A71A02D44484B79F1C1A37C1EA0C2D4BA54E9D23B14,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T17:34:10.603Z,Confirmed,BNT,IN,0.000000000003372479,,0F92DB46E5EA3EE28480061C1FDCB45BA9E01E13239145B45765A2907AD5D411,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T16:25:02.853Z,Confirmed,BNT,OUT,0.000000000001514118,,962B6AF0FB1431940BFC139FC8C54BB929F439CE010AF3A8468939C84664EA49,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T14:23:10.549Z,Confirmed,BNT,OUT,0.000000000000618678,,AD5E33608FEAB759AAD8BAFF47CF2371FA38A889D80BA0DDC5D0AE23820805D5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T09:18:43.234Z,Confirmed,BNT,OUT,0.000000000002668938,,6CBCC346650B9A8C1DE0579841AD90A3ECDBB1012E02BFDCF8B24808992D051F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T04:38:41.028Z,Confirmed,BNT,IN,0.000000000003152109,,DE34E7B9AB2B15D09D6C47D42CF122627640C6DE44077C0C7D1AC5EC0F3D50B2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T13:44:31.454Z,Confirmed,BNT,IN,0.000000000001529859,,AAA779050DD7AA092D2A547610022FC1B6A51643BEEF82583662E93C4B12221B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T04:49:31.453Z,Confirmed,BNT,IN,0.000000000002987311,,1EF1CE474D880413F55CA68F2A64DFA7CF43795935D722392C3EBAB0C88D887B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T00:24:22.744Z,Confirmed,BNT,IN,0.000000000001574207,,C448EC4BA5ABFCE4CA34ACA5E13CBB058B2D47EF307ADFED8DE4937EB461AFEA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T00:12:56.290Z,Confirmed,BNT,IN,0.000000000001998247,,29BB8011DB3233D6BD14F25829D220301EA8BE90B08F2A692FA2B45C2A38EA3A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T22:01:56.476Z,Confirmed,BNT,IN,0.000000000001489891,,CAAE01FFC5B20FDDF405CE7FE751E1D64C97263D41566F6381E67961854777F2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T14:42:09.432Z,Confirmed,BNT,IN,0.00000000000163977,,DE697748E091C456F5FAD2285FA18CC3EE0DA4B4B3076321E555D55936AB9D21,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T14:37:33.282Z,Confirmed,BNT,IN,0.000000000002123762,,3A2D3720D7B3A9DE7BA6AC52B9E05B5E47294D8A8A4708B2F4F3A48CB31E6B10,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T13:57:22.193Z,Confirmed,BNT,IN,0.000000000001326735,,0632924904E908100906A3AA81DC9E603FD3988702C5749D20293DC2757D35C9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T01:59:13.481Z,Confirmed,BNT,IN,0.000000000000172189,,C72642A36356E6C87288B1914F782237D68A7C71A2529371350B2027F4667459,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T23:00:34.401Z,Confirmed,BNT,IN,0.000000000003509492,,339674DAAAAE2B6491C891FC2A8D9347F3ACA99EFA85187721DAC36FD0D136CA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T15:20:08.474Z,Confirmed,BNT,IN,0.000000000000140297,,4E2CF85086D3190678A835E62A36C5E2C7958E157755F3072C9D095EF10A9964,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T10:29:41.310Z,Confirmed,BNT,IN,0.000000000002129511,,FCD7121CCBEEAA49F040A133A9484B4267F778D226AA0C41AF1143031A493612,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T02:51:20.300Z,Confirmed,BNT,IN,0.00000000000165469,,77A21E718E68ABD3BA932E24671110694F0A059483ADB6E55668FDA71D90A347,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T21:14:17.695Z,Confirmed,BNT,OUT,0.000000000000281416,,54D9CB3E84AC3CCCBA88BA4EA743930B2B777AAD23A3597F36F7A057C23853AF,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T21:13:49.587Z,Confirmed,BNT,IN,0.000000000004906308,,3C07BBFD3E49AFAC9A62AB1C0D7080806CE1B50BB38A6832394F4E3702397F97,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T15:40:49.672Z,Confirmed,BNT,IN,0.00000000000563038,,AC088C619F504C7D7F2E2A604F6157EE0A7855458C2962DC4559F6682DAD0775,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T14:30:49.991Z,Confirmed,BNT,IN,0.000000000000609507,,F653EE26AD4BA1CD4892611ADCCF1BD3F0C74281FBFAAD69206040EA17BB7637,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T13:34:29.673Z,Confirmed,BNT,IN,0.000000000001828659,,92E944984CBB54EB840B3D70E5A1029046A23EA4575ED9FC7BF4BDA426934A3E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T12:34:41.047Z,Confirmed,BNT,IN,0.000000000000516021,,C9B971F7A6457C0B26D8C03840E0D3A362A7F80913C801F80B0911F1FE75463D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T12:26:36.315Z,Confirmed,BNT,IN,0.000000000001101712,,971E9D1CC098A70C6605980221F00B8057587132F305C3EB761E932D03A3ABF3,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T09:07:14.135Z,Confirmed,BNT,IN,0.000000000000118534,,FE4C6AF82E4DB7FB0EBF2A7E51B7136DA6D31830936B2C1E7BB0C600A8DEE85D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T04:51:18.727Z,Confirmed,BNT,IN,0.000000000000042978,,92515BAF2B6682E6E10B07F643C5E7508165144BB494D4068CB49B9EA6297E45,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T03:35:28.730Z,Confirmed,BNT,OUT,0.000000000001294296,,CC5DE021CE3C3CA6C47B8ED08BE34C897C2934315F2B6E9A5834B8A14D349FBE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T02:10:27.902Z,Confirmed,BNT,OUT,0.00000000000071408,,F6AAFEBB716A7B283A35261BB6078E53FC6B7A8E4AE9212C9B93D9B18C2E598D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T01:49:51.551Z,Confirmed,BNT,IN,0.000000000002190968,,9662B9625FE01919B0EC5147FFBE8948A49DE7FEA8CFCF16ABDF8AE77FFF076B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T01:21:59.491Z,Confirmed,BNT,IN,0.000000000000968669,,FA692F158ABE1E7C7444BA7CAB6EFFF963A7414E1CE21DE5864FA9453835312D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T21:46:25.339Z,Confirmed,BNT,IN,0.00000000000012661,,322EE6CE48F5081A44AE7C9571C62C593C959D234652011DD71A2B8452F6087B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T21:32:40.062Z,Confirmed,BNT,OUT,0.000000000001215729,,843D69F1F4F54F24CB8C74A6A42BE5CEC06AC2825775A05E90E4187A5A56CAC7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T20:05:28.669Z,Confirmed,BNT,IN,0.000000000000453605,,701BBDF1C4663460EF883B1D15F70D871D3D1558FFB4A1AB9783A6F61B89C93F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T19:44:29.769Z,Confirmed,BNT,OUT,0.000000000000357793,,B7966ABFB94A8BD0D911CDA8BB3781C5551DDAE02FEBA0D38B6FEC4D7B6BD159,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T14:55:49.177Z,Confirmed,BNT,IN,0.00000000000126432,,FDEBF513444632293853223FEA18878DDC96D2819259041DEB38947CE2E59E4E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T14:06:16.668Z,Confirmed,BNT,IN,0.000000000000163977,,2C17C9C66921CB3A28CDFAAAAC45B2CD8FB912441AB9F8EB06A98422CD5F9C94,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T13:33:41.431Z,Confirmed,BNT,IN,0.000000000002614051,,042F36BE27DA5A5CE01E9EAFDF74BC2D9C4866A626E4EF9FBAF0497D3B913324,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T10:20:02.824Z,Confirmed,BNT,OUT,0.000000000000006433,,6F9AFEDAD1565ED88C680F59918500A0B68D9DB2B5D61FB373A9FCC8A9DB87D4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T02:07:18.490Z,Confirmed,BNT,IN,0.000000000001356848,,B6D7B762E596A42A3E44D9E826A4F2226094EEF9B819408A2C0B0CAC71CD97DE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T12:28:05.790Z,Confirmed,BNT,IN,0.000000000001920228,,8B2D510C019C8198C5071D8038E78B68F0D6BB43BA0E2EE6D61082437C049A5C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T08:07:02.785Z,Confirmed,BNT,IN,0.000000000005136807,,D85E9513CACBAD0E8439D79C8124DDE01B000991DD6E74CC31474EDF0B725A7D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T08:04:59.637Z,Confirmed,BNT,IN,0.000000000000271698,,EA604E590750BEAC7C772B909A9A795CD01A5E3089CF3E0320B9C88809B4213F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T07:58:30.319Z,Confirmed,BNT,IN,0.00000000000013578,,B23EC23FCC2BEEFA9C3BA03DFD449984A488CA10052F8368920C06424A921F35,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T03:41:49.007Z,Confirmed,BNT,IN,0.000000000000239806,,9636E87666A809D436DD4C128720971D93046A4FBD9E7FDD7EB189C743DE5C76,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T20:26:08.184Z,Confirmed,BNT,OUT,0.000000000000292777,,A24CB57A048505D2AEC1E365A74F2D7B85CCC73F1F91700793BA24CEC95066E9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T15:44:10.391Z,Confirmed,BNT,IN,0.000000000000330965,,AA0DBA26E65953174A2FD3690210551DEBB4FF5A8AFDCCBC939E9D27FABB1A1E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T15:33:53.822Z,Confirmed,BNT,OUT,0.000000000001033548,,E24C288B568EDD199F38A6051FC6615DB7BBE6131897AC378AA957461A0FF89F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T15:13:04.908Z,Confirmed,BNT,OUT,0.000000000000501923,,B02DEA498C81D1D99BDF7E2D1D6BDF8B7236C38C65691327F885925557B148D2,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T13:38:06.999Z,Confirmed,BNT,IN,0.000000000002052998,,204FA9B56412ED007A3A70D159D59B691504D194D1FA2E5B4EC67DB6A549B975,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T12:30:41.302Z,Confirmed,BNT,IN,0.000000000006207448,,E4B7D9D095476F2AA4939A04C65529A50422D33B50A84450AF5378F8DEF58321,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T12:14:40.849Z,Confirmed,BNT,IN,0.000000000010709974,,18C92F30AA4C6267A02E1235D018E2AB5088FE38187F7F64DCB204A4B5A0E42F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T04:56:30.107Z,Confirmed,BNT,OUT,0.000000000000013003,,D2D6036C151F477A7F7ABA44315149C5608C62C671F9E84459AE99D7B8BE4C6B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T04:54:45.411Z,Confirmed,BNT,IN,0.000000000000869434,,F6729189BD601972FCA6F35BF3836A556ACF339B5E520BD74CC30358F112D94B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T04:16:57.582Z,Confirmed,BNT,OUT,0.000000000000669185,,4392185E19641DC3F7191AF4B6B7CD187FE196DBFABA7CB8C3B14F0ED6DF5CB9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T04:14:47.157Z,Confirmed,BNT,OUT,0.000000000006053874,,B9A8D0893B501A1F3897400DDBF5CF76AE4CC0657D654122E0DD60FF0224830C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T03:35:44.119Z,Confirmed,BNT,IN,0.000000000001053805,,D70369B18EF909FE2E6E89DE09BE7688144AC6F838A241C7BC5A161B2F95584F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T02:07:30.122Z,Confirmed,BNT,IN,0.000000000000963057,,2FDF622385D2215D66F50D50821C0E9BAC06D10D8DC53C6651D50CF42098AB7B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T00:42:31.955Z,Confirmed,BNT,OUT,0.000000000000150152,,79F32C81E1425EDA711148AF273A0C75B26446D03D8635B4F4CDB79ABB13F6AB,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T00:18:06.280Z,Confirmed,BNT,IN,0.000000000000094581,,AF8CFE50CF12F90F76E0B8E150B1CECFEFD1AD5D8097642A00B8EA16E4846B42,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T23:47:14.165Z,Confirmed,BNT,IN,0.000000000002131017,,95C619401352B39EDBCD885B3885531731ACDD12F7EE448073E82AA4B0978CD1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T11:19:50.395Z,Confirmed,BNT,IN,0.000000000006777125,,81B655F9306578CB54D4A1353FE366F2927916774A6AFA0C27E2F520CD51C6A7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T06:15:17.773Z,Confirmed,BNT,OUT,0.00000000000284715,,26D0DD8E445BAB0146B859E9D4751BAE8F30F348D4E6E38FAAEDD35E45F4DF1F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T06:15:17.622Z,Confirmed,BNT,IN,0.000000000001023556,,8430211324F57B62D6559F42E85AC7423846EE211C9F83CA29BCEE53B712D5DC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T18:35:59.860Z,Confirmed,BNT,IN,0.000000000000496858,,7906EC0141CB585DFE52FE90FCEE9C225E856FDA2EFE7DA3AAE0ED59876273E6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T15:25:07.154Z,Confirmed,BNT,OUT,0.000000000000224339,,BFAD95766AD6C335A8E3AF0F2FB2AE0945C5B2E566F154CB1B2D909535833E75,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T09:01:57.880Z,Confirmed,BNT,IN,0.00000000000119903,,FF3EE749C865B33F08083E6EC01192B3534E843177AB2F8DC51FEE851D3DDC53,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T08:22:58.965Z,Confirmed,BNT,IN,0.000000000002873567,,A3C41D9DBCD9C698CA09AF98D82E976D752CCD4424BF000463B47C621E368E79,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T07:42:47.567Z,Confirmed,BNT,IN,0.000000000001280061,,13A62C3C90C9FE2AB584B2A5F94FD2A553503F06656498624466D273D7D4E0F5,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T14:55:13.582Z,Confirmed,BAT,OUT,0.000000000000009855,,D6B73308609A06B93FFC11600ED77B416E4CCAD60A6B1ACE07B88C592A1BF471,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T04:26:58.932Z,Confirmed,BAT,IN,0.000000000002856458,,2D0A30FA13C79DD2ECCFDDD6B6FA0826713DA3C718739FF293E7FF992DEF0A85,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T02:43:13.954Z,Confirmed,BAT,IN,0.000000000000297157,,5468182424ED3DCDB121A6F0FC48F9C2DB219FD1CAA3E8E8B83D150E1AF8AEC3,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-14T02:28:26.025Z,Confirmed,BAT,IN,0.00000000000268112,,FEEA988885C79CD2F4ADF3BD0F3052C250C0BE8857838082E8F2F2507A09A801,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T23:00:41.794Z,Confirmed,BAT,IN,0.000000000000841237,,84224D0B92839FE74E6DFEB051145027711B8F826E3136D57AB9E3248262302D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T15:17:40.360Z,Confirmed,BAT,IN,0.000000000000083631,,E93719D8C5186962E78B8CF0AE476AA6704BC9A2D2715DEAC395E4EB5683A447,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T06:44:25.850Z,Confirmed,BAT,OUT,0.000000000000835215,,C7E9B4CF334706032568E7A972B7C6CB68B0DE7E67205BFB1427E2A88D6F69A7,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T06:04:38.362Z,Confirmed,BAT,IN,0.000000000000594587,,F39BA47D22839896669584AB5EF7508F9E11BE3C2A197F1537620AB2650114FD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T17:58:12.247Z,Confirmed,BAT,IN,0.00000000000091515,,C0F3FBDD67357EFDA3FC52F6A2A8C681D037922409307DF866ACC919692391DE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T12:43:25.246Z,Confirmed,BAT,IN,0.000000000000469346,,A1E8A1EE1B523E592016CCF1D031E3EC5AF7A63F664849CD528E11CB47AA9652,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T12:22:22.258Z,Confirmed,BAT,IN,0.000000000000660835,,5107EFF356571C4A05A936617BC71AC8B3AF1AB7254688BCE1A051E1018CA4F1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T09:43:30.946Z,Confirmed,BAT,IN,0.000000000004989802,,C4C3608F9F7468EEFADC3DDDD4CB79E8448B9EB29BF0BEF825E653E7FF85E78F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T07:03:41.451Z,Confirmed,BAT,IN,0.000000000003882615,,1AE21F697E99C8200AAD0BD45ED23B5E11D0C855B54349999B8514966BC6DBDD,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-12T05:03:56.280Z,Confirmed,BAT,IN,0.000000000000237889,,6CDD1084C62C078C1463B59E57463FECC0D48571C495E1FA86F3A36EF4842637,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T12:30:34.097Z,Confirmed,BAT,OUT,0.000000000002778302,,F61CC413729B5623D283E89619236ED7CD879DF08DF0814F93EEAE48B0B4EDF6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T10:13:45.303Z,Confirmed,BAT,OUT,0.000000000001889842,,C36D8347671FF96382346FC16C2674E826416B17885D9E201185FC94D5DACC87,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T08:43:01.436Z,Confirmed,BAT,IN,0.000000000003832792,,AFC6EFB42AB1A1A3D1B6F2AF6622DC89BCC2FAE0D26D787C5F9D32D978E8C554,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T06:31:07.754Z,Confirmed,BAT,OUT,0.000000000001454851,,8198F98B8D172DA9A05CBC0E0BCD01D9AA17652267EE8D64F45B5FA773CC8B2D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T06:30:48.525Z,Confirmed,BAT,IN,0.000000000001121148,,C8DE0212CE9CF12660AD7B92B7B729225E3D604DEA1B0CA4C95ABCAF8B58C621,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T04:37:36.033Z,Confirmed,BAT,OUT,0.000000000000531625,,D35351216B32DAB587B4AE0B31CFF73B3F221596044D38A3A377B88C6B4B96DE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T03:19:47.824Z,Confirmed,BAT,OUT,0.000000000000052012,,085A2687D84846FCCF796BB2255C6CA881126ED2F8EDE12E1A87C0CBA04704E6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-11T00:40:39.548Z,Confirmed,BAT,OUT,0.000000000000046263,,10B3214C51CE8CBF11A68C0CE99F9E79D3B4BE61EA651F22133C9E1CD5559ED0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T23:02:17.289Z,Confirmed,BAT,IN,0.000000000005482418,,B1BBD202917387D9B483CD89426731FCA19170D7CC7360573EBCEFFED822C1B4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T16:34:27.117Z,Confirmed,BAT,IN,0.000000000001036833,,ACC98EAF56AFC18641F95FC30505506CE88BABED091134218B6FFDA792884DEC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T09:52:02.309Z,Confirmed,BAT,OUT,0.000000000000455385,,75577559354E4FC4F724FD9F9749181B5EBFD6EDF94A5F3BFAD8B6E04420C9B9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T08:52:28.578Z,Confirmed,BAT,IN,0.000000000002523303,,5981956C6BB3AAB4DCF64A90A751C6BC12C225DD80CF46820ACB94135319552A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T08:11:19.637Z,Confirmed,BAT,IN,0.000000000001322219,,13E4299A4121C9CC4CB42A8139EE65E81B6839B4EB2E8075A0668DE893516189,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T06:23:08.083Z,Confirmed,BAT,IN,0.000000000003457068,,7301F6889142C512C6DC028738220B02F9360CBEB4C8AD1C68A653329D257229,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-10T02:37:03.980Z,Confirmed,BAT,OUT,0.000000000000109774,,CF89A6F8194AC09E727FE71D5E5404C12B66739E5C09C8F684BEE25C58098220,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T18:59:05.556Z,Confirmed,BAT,IN,0.000000000008217468,,348A7D9288AB50A8D593DDEB67CFAA6D1C41085963C12F095EB803ADEF20963B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T14:22:34.713Z,Confirmed,BAT,IN,0.000000000002133754,,B2C74200E63560351476078E196D1BE8BC873ADB189B814526214B5F4A816987,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T11:57:55.929Z,Confirmed,BAT,IN,0.000000000002432828,,80435511BA32A0E1519EA2A3F1568005BCC0251D9ED03D04A0F168505CDFF55A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T10:34:47.592Z,Confirmed,BAT,IN,0.00000000000247827,,54EA30C86C3F82ABEBAD4DB62DF1FF0C9ACD705D0851AA3C22359E713C745A57,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T07:46:45.102Z,Confirmed,BAT,OUT,0.000000000001049152,,8C21CD21E792A0D50E17AA0613D08DEC0CB5C99DC8F51974C6766852D3C2F26E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T07:11:06.445Z,Confirmed,BAT,IN,0.000000000001217372,,5860FEA2688AACD5FA833EBD6D4B74852ABF342041F7FF555527C28F4C529304,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-09T04:24:51.744Z,Confirmed,BAT,OUT,0.000000000000487003,,132CA4A1E3EAA0E3575E353C5C6E48AB43DA98C2002B13468B963D2312B5F7AE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T22:51:58.193Z,Confirmed,BAT,OUT,0.000000000000844249,,3E240E580223D543F800D02C4107C2D6E77A75AB1AD7D9F8B2CDD2AAECB72951,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T18:39:45.759Z,Confirmed,BAT,IN,0.000000000000523823,,23200C4830AF3CD58B509EDFF42D516CD4833E9191F415BC2CB63C15F842BAC0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T18:22:18.962Z,Confirmed,BAT,OUT,0.00000000000393805,,A2CC9D3D0C4BCEC07F82CCBC8EE5CE38260DF639B51D54C215ABE46954004DE4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T18:21:51.059Z,Confirmed,BAT,IN,0.000000000000110184,,1D4E5D2FE7AF880E2E28041EC523EB335811E9BFFBBC11AB675C3345756E68B6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T13:43:45.465Z,Confirmed,BAT,IN,0.000000000000165482,,D59641A41CB0E6BB5924D0BAF563BE2192ABA27218F3355D4BF91DF8939AE850,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T10:59:07.730Z,Confirmed,BAT,IN,0.000000000000333702,,63C83E0E32C459A1C77EA94516F00C549EF64732B82ACF602D908991086DB075,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T07:28:10.924Z,Confirmed,BAT,IN,0.000000000000375723,,D1ED466E1196499151B5B6A2D75C7CA41F0928F461ECC7D0850F207E4F505605,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T06:58:15.544Z,Confirmed,BAT,IN,0.000000000000081851,,6F5707511AE7CB5DCBA37825C7330A05A9964B3504392C62F3F1A8ACF887C28B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T06:58:14.736Z,Confirmed,BAT,IN,0.000000000003661971,,255C68978F8D3FEC4C87280CC19E3A681068AD7A43C448D50FA6B2819BB24D3C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-08T03:55:05.482Z,Confirmed,BAT,IN,0.000000000000250071,,8BB448ABA6D604BDFF9525C0C28DB15641BE24AA8C371D862AF7119EFC731860,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T19:40:15.791Z,Confirmed,BAT,IN,0.000000000000067069,,D2AAB78A257872CF3DBDCCDBA9E631D61D621E56B0D10BD36A1FD81F303C829A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T12:26:19.374Z,Confirmed,BAT,IN,0.000000000000104709,,0B26AB063582D6D7AA158A1106F746826D5276F02501EE85F5D1B01F6CF2330E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T11:46:24.276Z,Confirmed,BAT,IN,0.000000000000253083,,F695BC34EF47BA1DD42CA8F5D088D9F0D08178ADDDC82D0D06F6800D0282BE24,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T07:10:32.200Z,Confirmed,BAT,OUT,0.000000000003925457,,FE32133CDDEF8CA1C9E7FE71F21434439FBD25DA6C9E83E02A1FAF033C769B0F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T01:10:42.112Z,Confirmed,BAT,OUT,0.000000000001922692,,F433133018E755F36E267C1A30EFC0CDE142F184547B63658C5341206BC7E241,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-07T00:28:43.385Z,Confirmed,BAT,OUT,0.000000000000004106,,5050CA0F5349574F6653AB6AC5172A2537F8285E3DA7ED037234A3C93ADE23CF,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T22:29:34.883Z,Confirmed,BAT,IN,0.000000000000133316,,5E94B0CE31DAD52715B50AF3C217E5B4BC54972CE72FC76E98CEEB35CBA2DB4F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T19:32:01.242Z,Confirmed,BAT,OUT,0.00000000000203274,,291DF9451B8D3B3D7BFF7D70D2684FFCA6947FFDAA0AB0337793FB8A14B8FC4F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T17:30:50.810Z,Confirmed,BAT,IN,0.0000000000022553,,8783C40CA566A11721DDD6450550F7F9D1314B420C3F624BA699902C19844C76,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T15:42:17.890Z,Confirmed,BAT,OUT,0.000000000005177459,,78891CF9A60381BE6DC2E790316E007C0EDB4E7B7BC78DE54A4BC32511796464,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T15:40:17.159Z,Confirmed,BAT,IN,0.000000000000981124,,2C669A4C1BE27E0C305B93695A3EF93FF3A87AED9584D17C042A9318463E542F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T11:06:13.675Z,Confirmed,BAT,OUT,0.000000000007173517,,616F2054ECB4399228235BFC3D9152F67035CF4FB3A0E0F386721FC13DC00A7A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T11:05:32.700Z,Confirmed,BAT,IN,0.000000000000585964,,36553AFB657BA15D2DC48C27DA7F39348B39B3A2F3485F120474026DCB21010E,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T05:01:04.869Z,Confirmed,BAT,OUT,0.000000000001698353,,4CC1454D1CAB999D3A367BFE749F0BB7633C58AAFC6F7AAF3A22AFE60225FB59,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-06T00:15:24.036Z,Confirmed,BAT,IN,0.000000000009134808,,DB55F18F8595F2B39E6622F24C81BBC26622980D237E8B1EF5D095E40D97B0D3,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T21:44:27.123Z,Confirmed,BAT,IN,0.000000000000136465,,F3565A7A6DE8D03AA196EB8473DEC8141775178546C73606C3D18A372630F475,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T21:31:37.319Z,Confirmed,BAT,OUT,0.000000000001328104,,2F0B4FBCB40BAE20D5D7E8B4479EFF56737A0E7871807A6560A14229ED880735,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T07:30:08.569Z,Confirmed,BAT,OUT,0.000000000002661547,,4016FDAA8C19F3750FBF352D2CCC753E568F81CE50A8B7F9AC92342E2524974B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T07:15:00.655Z,Confirmed,BAT,IN,0.000000000005238505,,2E4A03CFC16B171F48ECD1D54EE11DD16FB2320FB1DF476C7848AFE73D949A33,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T07:11:35.327Z,Confirmed,BAT,OUT,0.000000000000369564,,7034C53B9E67745A89B138D57A7C2C14E39F8DBD9468C12EFBF3F32761487D70,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T04:56:38.190Z,Confirmed,BAT,IN,0.000000000001677411,,9D2831A8E29ABF61354C54FA547B87B57861E37E3124DF240E3ABB6E63DF872D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-05T02:03:10.251Z,Confirmed,BAT,IN,0.000000000001493313,,728C3D0825147B311FE48DBB75025FD66053C14EAAD29CB7C734736BD954C351,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T22:51:13.169Z,Confirmed,BAT,OUT,0.000000000000142076,,E6BBC027FD643647D195F043D4ED28BD19A2A41BC18B667A8253925C0CE716BA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T22:46:48.400Z,Confirmed,BAT,IN,0.000000000000050507,,CB967A0A4AC98F08BDD7E7879E45D18E449716ED09093986D19D16B4F2ACF4A4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T18:47:22.509Z,Confirmed,BAT,IN,0.000000000003382061,,1C306D208B351D9AC210C7DCFBAB11E5A8D00B46295D008517591570640D0E71,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T17:00:15.313Z,Confirmed,BAT,IN,0.000000000000086779,,1C281D29A6673726757C0EC26746FFD7BA7B967CE214250132DD9FFF1BF9CEE4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T16:28:10.112Z,Confirmed,BAT,OUT,0.000000000004440657,,FFBE3F52DC7741BC5BEBACDF1D45A5F56196DF41DFD8618F6CCCC7530D6F238A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T16:27:45.446Z,Confirmed,BAT,IN,0.000000000001223531,,9986B7F0E1F7EC6E3AB7C8E5AFF48DB18A092142284D79E25F7BDA4801121F92,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T16:27:03.215Z,Confirmed,BAT,OUT,0.000000000000793742,,8D90837BA8EA1514FD773A6958E08DCB12244959DCF00A245A7A032B90AAAF2D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T10:47:38.423Z,Confirmed,BAT,IN,0.000000000003896987,,BBE741A4925F95014246F1136B231689B1F9605ADB2956C4FB44AA7742B3F1F9,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T09:02:27.667Z,Confirmed,BAT,OUT,0.000000000003909579,,13B331E4E21E83F60BEB2A3826D22552CB27FC7D17D633D31433DC084E85D8F1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-04T06:00:04.870Z,Confirmed,BAT,IN,0.000000000001584199,,CF3B7ADD39037D0D6BC8B14D9CCD1E3BFC47F9084CEB8841FDF0D2BBA1384252,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T15:03:16.331Z,Confirmed,BAT,OUT,0.00000000000018177,,55EE4BD5177039FC0E84E057AB69DA6035CEAE36F9AD4DB9B22D8CD6733C0FBE,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T14:59:03.421Z,Confirmed,BAT,IN,0.000000000002383553,,F0C3F1F48C8BB6E59C032AA163416D34CFA7D84246E7768D1B0784B4C1B2A079,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T14:23:09.860Z,Confirmed,BAT,IN,0.000000000002582433,,2C8B62E8036C6ADEE9D27B6FFDAC4FF4EDC73749BAE0AD0F779BC83ADFFD4E9F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T14:19:01.463Z,Confirmed,BAT,OUT,0.000000000000553662,,CB812B90A15A1497BA183DA352CFFAE4D875AC4FAEA181D168E51F95D420DD64,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T09:00:42.731Z,Confirmed,BAT,IN,0.000000000000014371,,A79327332064B39AAD221F5A4A1F58F46DB465330048E94EAF530586259BC9CC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T06:38:48.007Z,Confirmed,BAT,IN,0.000000000000140297,,AAD7FB173732E0003117AE54C09C8B6FCE6469A21D440344A623CC0642E804B4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T05:25:58.684Z,Confirmed,BAT,IN,0.000000000000351633,,714F50826651C69ABA82B81282E206371707074F74C2DF879263455E78EDC57D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T04:39:31.856Z,Confirmed,BAT,IN,0.000000000000382293,,6AC309C65E393D7CD422F55A0B9A4F52B06F6E77F57BB1AFBF0961C66DC35169,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-03T01:00:48.575Z,Confirmed,BAT,IN,0.000000000000013276,,A8EA6654276B43151C4CFC26331890DAFE960D0CDFBF56519E56FBE301A562ED,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T19:06:55.686Z,Confirmed,BAT,IN,0.000000000000330691,,EC0BCDBBFCC182F8653B84FE702A5009C85759563052FEF79E75EDBBEB910402,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T18:29:26.037Z,Confirmed,BAT,OUT,0.000000000000084315,,65B35748A3F63B611691831F3E374D6A4D134FBB75D79EECBA72705054FC6055,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T18:06:40.699Z,Confirmed,BAT,IN,0.000000000000981398,,4A66AB0F1F8625E768EF47AE793B19A52105FBA3817170D914D5B44BD5B66E18,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T17:37:51.501Z,Confirmed,BAT,OUT,0.000000000004897001,,0EE54323464E1BCA4F8D80E6076E64DFC5F35210DAA3F95157CF54CB0A3C3BE4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T17:33:50.860Z,Confirmed,BAT,IN,0.000000000003253261,,C11CA740CA11A5F6185F0896960E00151B438C06F5F3AB11BD58732A6D529064,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T16:56:29.930Z,Confirmed,BAT,IN,0.000000000002252015,,82ABFF8F0CDBCD38AFCB3333F0822FCD6336573DE7A1A945C84168ACBFD2385F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T16:19:15.332Z,Confirmed,BAT,IN,0.000000000002200002,,EAB0B538D45F392ABA262EDBB1C7AA710806233F94798D10A3B9DA1BBF99FCB1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T16:18:21.840Z,Confirmed,BAT,IN,0.000000000004716325,,523699E952868494BC2CA52C8C842D7B740A26F682B0D31122DF448663118584,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T12:29:18.415Z,Confirmed,BAT,IN,0.000000000001399416,,79D048D3A0B16EBBAC7FBA39742CDF1C1E2D82E49594D0BF38958145E05E7A7A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T05:42:03.894Z,Confirmed,BAT,IN,0.000000000001147702,,BBCF369B8F4735A4249DDF64447E3CCE5396998C4CB904B041D61C097049CC7C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T04:13:30.443Z,Confirmed,BAT,IN,0.000000000000071859,,879D1C08F2420710404E5DFAA3F28D243BFD5BD3F8A737A9E4CA52948103B796,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T03:34:43.633Z,Confirmed,BAT,OUT,0.000000000001911195,,9F6B9448F80F5A0E20FD82436C5CF0F7E79F3C7F5C9176BA5BD266A6DE15F721,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T02:02:15.536Z,Confirmed,BAT,IN,0.000000000000069259,,CAC058F700B444537B905359349BBED95E4EC6460B5DCE67EF83C460D948F743,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-02T01:31:08.385Z,Confirmed,BAT,IN,0.000000000000554483,,E86E1B795FA0374C5FFED6C909B9261231E1BDCE1F7F2E04DB57559F2C568F1B,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T07:02:33.105Z,Confirmed,BAT,IN,0.000000000000075281,,AE04DC4CFF3714F60CA9C2B077C913C97C8DEC004913651549F82FE6E54789CA,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T06:38:25.087Z,Confirmed,BAT,IN,0.000000000000017383,,6508AF479FB54AF351758F4F68D41F4927D311A9964FB7DD6C7FEC6DEBC1DE86,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T05:39:32.797Z,Confirmed,BAT,IN,0.00000000000230964,,279E38026F18E365CCBF87F70CEBBA83EA95BC05FD3953DAE7EECF598C4FBB5D,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T02:23:43.419Z,Confirmed,BAT,IN,0.000000000000108816,,C4958C89C72771530F0EB936053A22B8F295D2886E421CB60D967D69D0E589D1,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T02:02:42.901Z,Confirmed,BAT,OUT,0.000000000000022584,,0892A1E8857FD9D7F0DBF4AB390A88F106DA2DF065327DEE3288382F3C1A878A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T00:46:24.478Z,Confirmed,BAT,OUT,0.0000000000004547,,D90D48BAFB7F1B58EAC9D2E3B2076A177E16A207C3CFD625DFD094835F2BB201,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-01T00:27:52.196Z,Confirmed,BAT,OUT,0.000000000000150973,,0563FCED79B59E95BBD79CB261F11404D072E097AC314C6756A08C426732CA4C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T17:16:42.102Z,Confirmed,BAT,OUT,0.00000000000002231,,5435FAA251DC0E5DB253D8DA6B69D2549C13A67B83585590B7657E90CB9602AC,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T12:30:33.602Z,Confirmed,BAT,OUT,0.000000000000470715,,97C4E84A2B5EB9A9A66735A190AF492E32B1A0A4C387D8568E259529CA6AA06A,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T06:53:12.632Z,Confirmed,BAT,IN,0.000000000001746396,,C64664A96A607A526A1D193A6B93AA298C815B09DDFA203C40CF2315550CD16C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-28T01:34:24.165Z,Confirmed,BAT,IN,0.000000000000213389,,8EC6675E08EDAA3E8434CBF7742200882920F2AB38B0A6BDF441280CC6871725,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T23:48:13.594Z,Confirmed,BAT,OUT,0.00000000000486593,,D893B810C17A665996218439123ED141BDE24D517C53D2C23852256B4E6A8735,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T21:31:30.646Z,Confirmed,BAT,IN,0.000000000000430884,,F86C83F37EBC2B1BCA5072BD2BCCA59312690783FB9FAAD2844292FD3EBC2BED,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T16:31:30.786Z,Confirmed,BAT,IN,0.000000000000635924,,D7D16D439FD7E294778CCEB2DE70900A7344AC8510F1282D61CA3F60A6016313,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T04:06:56.002Z,Confirmed,BAT,OUT,0.000000000001053805,,3AC5C7E82B29B2A205C0AAB2308766C9F1651E4071E18119E734038973119D8F,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-27T02:42:39.642Z,Confirmed,BAT,IN,0.000000000003576424,,D338EE87EFB627D254D1B385F96E0C2CD23B66B280882CAFF8992A071A6BB3C6,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T22:14:20.790Z,Confirmed,BAT,IN,0.000000000000397623,,978DCFC633A5595EC9A22CE822D63275B68A2062BFBA1C1DFC62D060D00592A0,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T11:56:24.561Z,Confirmed,BAT,IN,0.000000000000692317,,9748910E20F4B6311AFD308D96C8C115AE341F7AE9184704834FB47BC89F8E4C,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-02-26T11:24:12.038Z,Confirmed,BAT,IN,0.000000000000960456,,8BF53AAF6A8AC9FA3F7A2811BF3D062FC7A138016273BA71F85F62E2B4A2BDC4,Ethereum 2,2995F3223F43125E9B5F8859B66852D85D307D1E4B888E24824C745C190BCC40,USD,, +2018-03-13T15:46:10.746Z,Confirmed,XRP,OUT,2.411812,0.024118,65267F4316C1BF8E1A44E6D3C71199A039B285CD725A133592B47613BB3512AB,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,0.25 +2018-03-13T15:45:41.669Z,Confirmed,XRP,IN,720.663508,7.206635,D640F9A3E3D62111F74D2A06643C67F6E963F6D289B19DCB4549F0E04CA406A5,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,75.05 +2018-03-13T02:14:07.352Z,Confirmed,XRP,OUT,35.361685,0.353617,C117CDC56A62392626433257E141462671CA74C4F4EFAB72158D8E95140DA8ED,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,3.68 +2018-03-12T18:35:25.124Z,Confirmed,XRP,IN,111.776239,1.117762,319072CD6D5FF527B67F8ADA0351DB2A8A850A304D47E547670C3D5DDBECBC55,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,12.23,11.64 +2018-03-12T16:12:07.357Z,Confirmed,XRP,OUT,1011.000641,10.110006,823B1DBB1C0B4FCAF81051AFAD0CF2E63C6A733C6CE4CE75C679F2C77FA2445A,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,110.62,105.29 +2018-03-12T14:41:11.463Z,Confirmed,XRP,IN,25.107143,0.251071,D928245DBC44CA245DC59326433404BDD782331B1DA72C26DFBB2E8788CFD629,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.74,2.61 +2018-03-12T14:04:32.517Z,Confirmed,XRP,OUT,3.938715,0.039387,C39F4178C9D47A14C4D4765BE4B9921D088784448BCC3A929B6BA90D01AE4BCE,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.43,0.41 +2018-03-12T10:40:35.043Z,Confirmed,XRP,OUT,257.369909,2.573699,91A27EC87C4088CD9445BAD3B51C13C137CA7A174C8E9054A4E577D194413223,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,28.16,26.80 +2018-03-12T09:18:38.106Z,Confirmed,XRP,IN,530.546735,5.305467,272BCAA487F44065DDCCC430278A92C38D2AD44B6D4AAC3DF54C6BE51F377DA0,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,58.05,55.25 +2018-03-12T04:30:39.781Z,Confirmed,XRP,IN,10.53216,0.105322,FA1310DC960FD10C1F5144CD3E6DABBE363D6FEFB1BC28E2150C0112AAB91282,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.15,1.09 +2018-03-12T02:34:18.075Z,Confirmed,XRP,IN,47.073725,0.470737,D277C65E4C6FF4EC1E40BB4D8F7357414F1C4008EB838703E618F2BEF0C09E5F,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.15,4.90 +2018-03-12T02:27:03.344Z,Confirmed,XRP,OUT,3.661096,0.036611,5CFF549B29C78BCD046A00DB569CF61A5201A30A9D4D92C254898199B586D419,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.40,0.38 +2018-03-12T00:11:08.193Z,Confirmed,XRP,IN,8.588829,0.085888,1558AC5E9C464D1386192632A03EE835326827659A0560F3BBB25283E86BCCBF,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.93,0.89 +2018-03-11T20:17:53.150Z,Confirmed,XRP,IN,363.159995,3.6316,749AF2CA71C539EB5EFEF8775852548FA88A8B3C5407CDA347D592892BE01D94,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,40.33,37.82 +2018-03-11T17:16:29.589Z,Confirmed,XRP,OUT,263.61633,2.636163,13DAFF97E5680A956CFE0D682057FFC325F9EF3D8E197A7571ED3819142DE05E,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,29.28,27.45 +2018-03-11T11:51:48.020Z,Confirmed,XRP,IN,167.5429,1.675429,780CB43F9E0F328E73C441A41A371D082A239A7F44150860E9914F0762EE4AAD,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,18.60,17.44 +2018-03-11T09:00:18.484Z,Confirmed,XRP,IN,172.071556,1.720716,28ABAEA3A06277404C8E172287ABE6E40900C6544DD5B019878D5CB8D2306957,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,19.11,17.92 +2018-03-11T05:43:02.605Z,Confirmed,XRP,IN,153.922232,1.539222,219B8896D8B5AC5FEE11A1A306A2665DEC58322E582B7F86179E07FEC5F33B0D,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,17.09,16.03 +2018-03-11T01:02:50.305Z,Confirmed,XRP,IN,15.407839,0.154078,811118EDB8A6D3FE48673D855E33151EAB0883A677E9DA358D9831BFE78D5A1F,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.71,1.60 +2018-03-10T23:20:31.984Z,Confirmed,XRP,IN,384.744851,3.847449,D1FF581547C85A754A14D193E1E4D4B5801242D077C18DDA79D7FEE24D837353,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,43.24,40.06 +2018-03-10T21:14:30.979Z,Confirmed,XRP,IN,9.265524,0.092655,7B45C0BDBCC11EACE1DA891D035A95BFA4476F9668D3B933E5036DC11E5C2854,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.04,0.96 +2018-03-10T15:04:58.667Z,Confirmed,XRP,OUT,169.590338,1.695903,47E7CD49DA15E3151D973731037D6AB094E1FE843FF698CCDC666EE086B028BD,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,19.06,17.66 +2018-03-10T11:26:28.174Z,Confirmed,XRP,IN,826.627105,8.266271,423209801542A9A9E2DA57E2D912F1C5426967619A1223E0844946B1FC0AA097,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,92.91,86.08 +2018-03-10T09:16:11.848Z,Confirmed,XRP,IN,148.335155,1.483352,A186A6D4A39F9027E38B5F673C38FF4B3C1C5BF292B48B1130115B226DC213DC,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,16.67,15.44 +2018-03-10T04:39:55.064Z,Confirmed,XRP,OUT,545.173771,5.451738,4695029228DD508A7C3ABD01B7F23F1111F2EC8BD90A6A3E90B037DAAC929438,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,61.27,56.77 +2018-03-10T03:48:11.392Z,Confirmed,XRP,OUT,37.686741,0.376867,FE0C40861163743CA4AFA113745509BDA87500F92BECAD0A741540719E84E522,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,4.23,3.92 +2018-03-10T03:41:17.247Z,Confirmed,XRP,IN,209.463328,2.094633,6FF921A3FFA5D4162EBC285CF7A09875A278ACF466A4F95B1D913A88FF5669E4,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,23.54,21.81 +2018-03-09T12:36:56.652Z,Confirmed,XRP,IN,48.617979,0.48618,B236B319CAF6681D4CF466797EE97F23E0C0F6D919C03CE0812D453EF73CFBA7,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.50,5.06 +2018-03-09T04:06:47.803Z,Confirmed,XRP,OUT,230.926726,2.309267,C9B251CB33F9F225C60610F246270DCEE202CE375289F80061BD26DDC1311678,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,26.16,24.04 +2018-03-09T01:38:57.978Z,Confirmed,XRP,IN,17.333819,0.173338,A7762B53BDE39A8D0641B843382937B299847364977124244471BAFF4FA5FE7F,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.96,1.80 +2018-03-08T22:10:44.573Z,Confirmed,XRP,OUT,14.141203,0.141412,E6EF3522AF9B68003606BFA43530D6BE05D19D5E9D4C12F01DFD2D7E46D3CE0D,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.60,1.47 +2018-03-08T20:18:15.418Z,Confirmed,XRP,OUT,316.572102,3.165721,6EA2E8CE2D84427253F1A34D1C69DD896B7A2EA4F58F914A8E7EA59763F54621,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,36.02,32.96 +2018-03-08T19:10:49.718Z,Confirmed,XRP,OUT,140.128051,1.401281,FC9A7B187D39CB462B2A0306ACF6EDAD05AC055FC06531261A1235BCDE80DD7E,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,15.94,14.59 +2018-03-08T17:47:25.426Z,Confirmed,XRP,IN,138.080613,1.380806,EDC698653D4A1C029AB01C45729D391C73E11268A27D5417A2A300FA9A22C4D2,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,15.71,14.38 +2018-03-08T12:09:49.832Z,Confirmed,XRP,IN,557.75337,5.577534,19B9607D5D6033791D44F07FAC9FDADF1C9FA1CF55C33E2D43F9B30E40A8A332,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,63.47,58.08 +2018-03-08T11:36:18.800Z,Confirmed,XRP,IN,136.55371,1.365537,C056E3E76E6F9E30539A7C68DC42ED80224A412BEDD43EB8CEB9E91D8C18279C,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,15.53,14.22 +2018-03-08T07:07:12.336Z,Confirmed,XRP,OUT,149.272118,1.492721,4561678D47DB439D61540C6B323980BCB3709329E1BB3FBC32018DD369E4FD08,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,16.98,15.54 +2018-03-08T06:52:15.943Z,Confirmed,XRP,IN,1.457498,0.014575,EE8013FEBDA9EDEFA0CB2DAE06A092002C900C76C266B108066D850FD7EFD9E4,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.16,0.15 +2018-03-08T06:41:37.091Z,Confirmed,XRP,IN,441.51788,4.415179,85EAC9E9373A6F012F3D9F3FEE38245FBB9BC7715FE9B19F53E24BB0D12F4683,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,50.24,45.98 +2018-03-08T06:19:30.688Z,Confirmed,XRP,IN,34.077698,0.340777,BA52B65E229EEEF12E5FB321D434FC3F4FA4C5A4DE997AD2534C1A6FAB159DAD,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,3.87,3.54 +2018-03-08T05:48:28.738Z,Confirmed,XRP,IN,230.562351,2.305624,7D93C465C0215D8546E18913FC5B6EBC067CC5CEDE5C7DF542F66522975EBD88,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,26.23,24.01 +2018-03-08T05:41:52.196Z,Confirmed,XRP,IN,60.017698,0.600177,FC590175FBF1567992BB137AFC05367F3D25AF07AA4A565DBD70B6F7DF530919,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,6.82,6.25 +2018-03-08T03:04:26.903Z,Confirmed,XRP,OUT,645.237971,6.45238,14C23253B3410DEF29DBCFFFCD12A9CA2103E2A9BE4B99DA921A83A42F1F1B8A,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,73.42,67.19 +2018-03-07T21:42:40.876Z,Confirmed,XRP,IN,387.763954,3.87764,5C821E7AE86C7F145B2A137C5298E218877F955DA0B1ADE392E51DA442C09F8F,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,44.14,40.38 +2018-03-07T09:35:56.183Z,Confirmed,XRP,IN,504.710842,5.047108,F166DDB8130040FF32B9EA078DC8893FF6D04FDBB0394227F53D9565AA827F63,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,57.45,52.56 +2018-03-07T07:49:20.100Z,Confirmed,XRP,IN,0.034702,0.000347,0FBE87513625682714A6783D36CBC4AA7555E3BA23DA956FC232DA855D7CA984,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.00,0.00 +2018-03-07T06:25:04.305Z,Confirmed,XRP,OUT,32.672253,0.326723,64EFCF2209831E42273E0F76F1965ADEB34EC8F9F0395C64C8757645D5F3DF75,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,3.71,3.40 +2018-03-07T05:32:07.009Z,Confirmed,XRP,IN,292.176357,2.921764,4879F10E51F86C0A94A237D1006FA58421331F0174B7AE448C103363CBB7F139,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,33.26,30.42 +2018-03-07T04:03:44.707Z,Confirmed,XRP,OUT,123.106553,1.231066,876F415C2DD5CE9E6466093404095AEA42D394ED1687FFD42B49784527EE594B,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,14.01,12.82 +2018-03-07T01:58:08.982Z,Confirmed,XRP,OUT,1253.778217,12.537782,EFD16EBBD9C685DB9A5EB5104EA8F7C01133A959F0507EC3363A1F5E3FD2C7CC,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,142.72,130.57 +2018-03-06T22:29:42.717Z,Confirmed,XRP,IN,170.041469,1.700415,62539F7615C413D7D0B9079ADC60EDC8176CD482B0B22745D275E75724EAC986,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,17.70 +2018-03-06T22:26:14.014Z,Confirmed,XRP,IN,201.690003,2.0169,05609E665A052AD318C2099C91E1DAA8AC558AA5172E87BC8319D83EF079F140,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,21.00 +2018-03-06T20:18:22.321Z,Confirmed,XRP,OUT,160.498325,1.604983,D39505093E47A49FB3D8DD3E7A51C31A85D5B12CCC8149A16FE85B4678855ABC,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,16.71 +2018-03-06T19:30:56.107Z,Confirmed,XRP,IN,19.936494,0.199365,552105F46E16F946174004C2DEEB5C965532D49E9C86D0ADD795DA18786620DA,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,2.07 +2018-03-06T18:18:03.875Z,Confirmed,XRP,IN,19.693578,0.196936,C931F529AA218A308E8CE5440D05C43862F4854CD7E7DCE1F74B1C6C8B957716,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,2.05 +2018-03-06T18:08:28.090Z,Confirmed,XRP,OUT,17.21236,0.172124,A61EB43A89B4AE0A97921CBE862E8102EB8596A346AA36D0E13B2933860CF2DA,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,1.79 +2018-03-06T16:57:41.967Z,Confirmed,XRP,IN,15.72016,0.157202,B8E346404314FB3040951A297E489215EA22F79E8F1981B3DDFD4198753B8373,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,1.63 +2018-03-06T14:39:33.275Z,Confirmed,XRP,OUT,3.921364,0.039214,BCA85E4AA0B0C3452517CC3E23D7A5C0034023B24FE28F6A52EEA46897F37E57,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,0.40 +2018-03-06T13:42:15.180Z,Confirmed,XRP,IN,8.241805,0.082418,07FBB1064C2E0079990BF717D91326CD9F5EBAF2BA7B53A737D6D9868207B569,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,0.85 +2018-03-06T11:11:17.191Z,Confirmed,XRP,IN,28.577377,0.285774,BE89F74EFE16735242067667937B62BB8FECFF39ED36A241FE9112E0C7BF2F24,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,2.97 +2018-03-06T06:44:19.261Z,Confirmed,XRP,IN,42.735932,0.427359,F95602DCD75C8CAA482EFD4246E2EFDE6FD3030C3FEF6D6AC0DF006C7EE3D6F5,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,4.45 +2018-03-06T06:18:06.678Z,Confirmed,XRP,IN,126.490031,1.2649,B41CE2A81DB41A3FA6140002CAB2797D3CA3928B858C0EF6E78D1E7068CBCF2C,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,,13.17 +2018-03-05T14:39:09.794Z,Confirmed,XRP,OUT,593.583537,5.935835,3C349F8ACD5FD309198C1FA9772BE370F90D76B71A85B3E4682A97DB522B018F,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,66.99,61.81 +2018-03-05T12:57:44.331Z,Confirmed,XRP,IN,882.046744,8.820467,0EC0966A6BB0C6BFB9FF8B2B1F2C5FAD30C87C1DDDA63F8F02436A0AB06E8841,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,99.55,91.86 +2018-03-05T09:21:17.186Z,Confirmed,XRP,OUT,126.368573,1.263686,2984831620406154236119449C6C8D141BAB9DEAF52B4F462FD5A72390620F0A,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,14.26,13.16 +2018-03-05T02:10:31.734Z,Confirmed,XRP,OUT,1.405444,0.014054,B957AF6DD34BC354BCBD45BFABBC8AC85DADBCA998A8AF64962E06F4C9150135,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.15,0.14 +2018-03-04T23:20:18.810Z,Confirmed,XRP,IN,68.138045,0.68138,C7D093BDD162AD93F55512BD8C713DB0C364ACF109079FBCB45087F25F95B709,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,7.63,7.09 +2018-03-04T23:07:19.997Z,Confirmed,XRP,IN,241.701802,2.417018,5094F12E823718B7D6B7395B3F8C9C7C513DF572A0D2DDD3F7DEED0B257AA70F,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,27.09,25.17 +2018-03-04T22:38:13.115Z,Confirmed,XRP,IN,276.716464,2.767165,07A1DD833D1149C8CFF12EC9FCD7B6F6E2CB1F23F6412BA2E0BDA009FAAF3B7D,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,31.01,28.81 +2018-03-04T22:30:49.316Z,Confirmed,XRP,IN,1.353391,0.013534,09D099B6C71037574DBF11AC71FA7C7E5D9F96795FD6A8506FAA7D7888ED7555,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.15,0.14 +2018-03-04T21:09:59.485Z,Confirmed,XRP,IN,360.470563,3.604706,91545D8C404F9E52C39DC356021CAEE12EDBCD891562B540B53008B381072951,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,40.40,37.54 +2018-03-04T19:20:22.864Z,Confirmed,XRP,IN,16.431558,0.164316,B70A76AB21D846B7AA65E74FBA32040B43BB03843F30A168A1BE05472A616C25,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.84,1.71 +2018-03-04T18:21:28.924Z,Confirmed,XRP,IN,120.000694,1.200007,1E1DDF4A7F1DD8A6FE6F741925B885CFA78DBE39C5C1C952F106AD1311548FAE,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,13.45,12.49 +2018-03-04T12:35:37.610Z,Confirmed,XRP,IN,1421.546683,14.215467,88BAACB5524B73B364924D7A11EC53400CDD6A56EBB6F240FA28320A7ED4A87D,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,159.34,148.04 +2018-03-04T07:10:21.931Z,Confirmed,XRP,IN,0.624642,0.006246,0DCAE3C4EDA5D826A21F6083B11FF74B39C91D86662268384F4D072D7D12EA42,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.07,0.06 +2018-03-04T06:47:10.355Z,Confirmed,XRP,OUT,268.006177,2.680062,649455FE0D600B8443D9BCA1EE2E43D5D1835F5FB98651F704B823B568B91989,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,30.04,27.91 +2018-03-04T04:24:53.289Z,Confirmed,XRP,OUT,67.548106,0.675481,D2454515EB7B6E154F2F341E1F28A435906AE950806BE694CD6FA393C18A726C,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,7.57,7.03 +2018-03-04T02:34:02.297Z,Confirmed,XRP,OUT,4.736869,0.047369,1B8F79387D6E206AF246EA47BFBC8AA1BF707445D0A7ACB0BA5DFF9DBADF2354,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.53,0.49 +2018-03-03T20:03:57.050Z,Confirmed,XRP,IN,193.899328,1.938993,AF3165773F117D18E04BEB5B3678BC790EFCA8E73AC576FC2B2CBAE13F63FDA3,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,21.58,20.19 +2018-03-03T19:56:24.344Z,Confirmed,XRP,OUT,87.588707,0.875887,A0BBA1AA636ADFE6429090091AD2B113399D2C3AD599C539100CA24BAA55D502,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,9.75,9.12 +2018-03-03T13:04:51.533Z,Confirmed,XRP,IN,447.799004,4.47799,F54DB531B7AD97E87114242E49E4233DD007924A1A859DDA17C154BDC57DACF3,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,49.85,46.63 +2018-03-03T12:50:52.967Z,Confirmed,XRP,IN,2.394461,0.023945,D44FB5CF4AC073AA625D2B8491D398AD6974EEFE068619DB20DE52889B7D1D68,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.26,0.24 +2018-03-03T05:07:51.519Z,Confirmed,XRP,IN,96.507209,0.965072,83EDCAAEA987DD6AAA259BD369F9C3459A014DB7390C0523DF196826AEB30FDB,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,10.74,10.05 +2018-03-03T00:47:13.789Z,Confirmed,XRP,IN,380.719379,3.807194,A79B55A527FDE9FB07521C567503ACCDB8D4B53ADF2E9E7C9DDC80F0BF18800E,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,42.38,39.65 +2018-03-03T00:39:39.689Z,Confirmed,XRP,IN,19.068936,0.190689,856A10A89CBB8F1A5D6025F4FCA77769A497F25986A8C78A7FD2F281811952CF,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.12,1.98 +2018-03-02T23:43:13.500Z,Confirmed,XRP,OUT,12.787812,0.127878,B00EDA289F5466E709B158839512D5BEFB907E444FAD78E0B449FC056C5D90C6,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.41,1.33 +2018-03-02T12:41:01.337Z,Confirmed,XRP,OUT,825.898356,8.258984,F2273B445710BD5066B01ABF9E9ECBF03B15681561B74F72C51D5AF2CEAAC855,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,91.48,86.01 +2018-03-02T11:56:46.033Z,Confirmed,XRP,IN,361.424878,3.614249,E43C08ADE8039BD30D00972CAF906046EE65675246682A3003BD7F0F068BCB24,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,40.03,37.64 +2018-03-02T10:31:41.116Z,Confirmed,XRP,IN,48.739437,0.487394,BFDA46F681F00CB5171387F249C8DA24F2B5251101165E8555475C4C69F8A244,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.39,5.07 +2018-03-02T10:31:39.388Z,Confirmed,XRP,IN,108.930647,1.089306,A78912707DFAEBE13CDAF01EA7847A823D2B123A25B9934AD1087BB1EB7A986F,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,12.06,11.34 +2018-03-02T09:24:51.523Z,Confirmed,XRP,OUT,182.881335,1.828813,DFFC4B887124B06465D0ECA609695D5DD95FD50B2CD20E097C45DB2190B2F4A8,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,20.25,19.04 +2018-03-02T02:07:14.985Z,Confirmed,XRP,IN,42.892093,0.428921,3B20490C644EA976C60CD1DA08AA37412955F63EBE10C4286AAED2075BA00E0E,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,4.75,4.46 +2018-03-01T23:24:15.176Z,Confirmed,XRP,IN,49.121163,0.491212,B2F8387DE8A264ACAA0CBBA3E288E492232DF40FE8E3C08F06DE4FE92F7B4CE2,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.42,5.11 +2018-03-01T14:47:12.582Z,Confirmed,XRP,OUT,46.605243,0.466052,0DDAD33E61AF7DEA853D28B8B118ECB47AE03DE33B3F3272EC50249627FFF7F5,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.15,4.85 +2018-03-01T09:45:52.028Z,Confirmed,XRP,OUT,50.682768,0.506828,B723214C42F1CB7426D8B7B8FD1A3C51F156E86AF2BF3C4EDE62B7F564857436,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.60,5.27 +2018-03-01T09:43:45.042Z,Confirmed,XRP,IN,5.396213,0.053962,F7EA6DA98F32D4505E46DFF02A8696631CC9207985C3131403B498AA333F5376,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.59,0.56 +2018-03-01T03:23:52.322Z,Confirmed,XRP,OUT,51.567678,0.515677,7428D0F0C26E2EAD90942F3EFB656D2B27243B16AD3C98F52DE4FB6FE7E353F4,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.70,5.37 +2018-03-01T01:12:37.701Z,Confirmed,XRP,IN,2.2383,0.022383,39FDA2CB5A76097CEF08892D58CE534FDDE9C9D98CA96F8727A512AEAF852876,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.24,0.23 +2018-02-28T18:57:21.916Z,Confirmed,XRP,OUT,459.892769,4.598928,CF9E0E63EC9C76F287031562CDB07388C772A430440B8C7BA4C50C4A9692C9AD,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,50.94,47.89 +2018-02-28T18:56:51.591Z,Confirmed,XRP,IN,731.80296,7.31803,CBEF4FCF076C6F3BF032576953C089D5BBB73E90B4C8ADB561CF44F55F283F6C,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,81.07,76.21 +2018-02-28T17:21:06.012Z,Confirmed,XRP,OUT,392.188503,3.921885,514294CECD00F629E74A4BDD396F0683D7F07EFA6144FF5BB2D4CCAFCF7F816C,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,43.44,40.84 +2018-02-28T13:35:43.098Z,Confirmed,XRP,OUT,117.380667,1.173807,808E4E7322C9B61C621EEDA5C5E3ADCBEE143955A49C34CD508C7FEB3B48430D,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,13.00,12.22 +2018-02-28T13:14:37.988Z,Confirmed,XRP,OUT,342.963232,3.429632,0C9A692428E6B6E15E4E0B6681EDA33B23DEEF2AD4DBB199DE999B1A833E4F0F,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,37.99,35.71 +2018-02-28T13:14:23.005Z,Confirmed,XRP,IN,129.023302,1.290233,BFF2726F2E0D7BC15E3975BD564773B52BFFF97AF7C26D841DADD545C6ADFB09,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,14.29,13.43 +2018-02-28T12:21:19.413Z,Confirmed,XRP,IN,74.245657,0.742457,61186759317ACE6CFDDD6CF7FAFBAF4DB28984C129E70143E0BFBDA7F7E177B6,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,8.22,7.73 +2018-02-28T10:22:57.338Z,Confirmed,XRP,OUT,1.873926,0.018739,63BA1F6F820949F37A4F1AAFE1B8C339CF81042122DF2A2FD86F6E0CE7F7B650,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.20,0.19 +2018-02-27T19:59:34.022Z,Confirmed,XRP,OUT,308.434403,3.084344,A8D21970588AFA66AF22210A3D7CDC70A3418D86F1D8FCF6C3DD81D2DADA42BB,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,34.41,32.12 +2018-02-27T18:34:40.674Z,Confirmed,XRP,IN,10.618916,0.106189,F0781BD8DDC81BC18C3E627D2DE434B13627F18CF2659FFC9CAD76E4E7EE4C7A,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.18,1.10 +2018-02-27T15:34:31.470Z,Confirmed,XRP,OUT,240.78219,2.407822,193151F5F1D23CEAD9C664EBB8BF5F4C4A3EC83C0EE3B1E30DEA9597611821A2,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,26.86,25.07 +2018-02-27T15:11:33.939Z,Confirmed,XRP,IN,282.025922,2.820259,F15269BE71626CE694C4A093779BAA6FBE7B78AB46F9C5281D55036FFE49F461,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,31.46,29.37 +2018-02-27T08:44:01.251Z,Confirmed,XRP,OUT,19.103638,0.191036,15C9B7B0027A7B5F6F5913664C028D542CEC4F682F5A40364BFA88A0A32DE83F,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.13,1.98 +2018-02-27T08:38:53.766Z,Confirmed,XRP,IN,266.930404,2.669304,2CE169710FDF73DF36C77A9C75B6B3359A5C6F984651D83997628F1260D67FD6,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,29.78,27.79 +2018-02-26T21:41:10.696Z,Confirmed,XRP,IN,11.989658,0.119897,F6C27F627BF4058454E0E3BD6AFF94D6DB210AD16FFC258D9D8254250C655240,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,1.35,1.24 +2018-02-26T21:25:35.257Z,Confirmed,XRP,OUT,313.674457,3.136745,85A31657C5F8117251F0EF65590D81096A369B363E4845DB5A3872D32DF972DC,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,35.42,32.66 +2018-02-26T20:09:14.257Z,Confirmed,XRP,IN,0.052053,0.000521,3D2E73C98929C434539CC55C4818265D55C3DB32A1CF3506D4DA638AACEFE126,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.00,0.00 +2018-02-26T19:35:39.515Z,Confirmed,XRP,IN,99.734527,0.997345,F389B0D467FF2643DCC094C66BCAAD9540A65C0BD7D8CCC985BA44FA0ADABEE9,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,11.26,10.38 +2018-02-26T18:39:37.853Z,Confirmed,XRP,OUT,1.578956,0.01579,BDE54B97D2D6EB11C02F9063E7168D11257276918470214414F21E839A260586,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.17,0.16 +2018-02-26T11:26:41.207Z,Confirmed,XRP,IN,67.305189,0.673052,80C2F9E1B937EC166F7C3156CB93B713D29C072722660A04C75A07293090090A,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,7.60,7.00 +2018-02-26T11:26:01.221Z,Confirmed,XRP,IN,803.584751,8.035848,5CBE0B3A556829C86A49AF0C191E013C63ABB68DCAF21433B69EC064760ADDC4,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,90.76,83.68 +2018-02-26T10:40:31.862Z,Confirmed,XRP,IN,225.634619,2.256346,34B90F5657A29432CE642D5F3C5FFA72AF72D5362568CF287DFA6BF39C952A19,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,25.48,23.49 +2018-02-26T10:37:41.831Z,Confirmed,XRP,OUT,51.810594,0.518106,FE6315ECBB6DC6CF4DE0A4835B8157B72FA8AEF2FABA5E10A64CA0AA2CCAAC5D,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.85,5.39 +2018-02-26T09:09:42.139Z,Confirmed,XRP,OUT,928.964308,9.289643,B3FDD367EB36F6959D82197DE67414651F56765031BB0A9B905F396763800BAA,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,104.92,96.74 +2018-02-26T03:36:36.729Z,Confirmed,XRP,IN,19.676227,0.196762,E4C770D854F73072BD7630C751CF165551A079CBF9F36AC1127A3A532033BA22,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.22,2.04 +2018-02-25T15:41:24.227Z,Confirmed,XRP,IN,72.701403,0.727014,554C512A1ECE90D59FD72A01FBFE7F476B18E3F5911BC170DBBA0060085484C7,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,8.34,7.57 +2018-02-25T15:24:34.863Z,Confirmed,XRP,IN,148.161643,1.481616,9A96E37A6548E384E3A609BD0511178A457A79E4C663453D321689E406AF7928,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,17.01,15.43 +2018-02-25T15:23:25.181Z,Confirmed,XRP,IN,103.135356,1.031354,8706F948C400AC6A532B1DD1DDA854852376AB7AF584D6C02796051EB7522C66,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,11.84,10.74 +2018-02-25T15:03:24.623Z,Confirmed,XRP,OUT,118.387035,1.18387,BEAF04764AA99BDB9CDE3EFE9FF1F860254A2530FA5729F9807802BE148D9587,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,13.59,12.32 +2018-02-25T13:18:34.071Z,Confirmed,XRP,IN,180.764492,1.807645,F65DDBF5466F578ACA3A74928C5C4EDC291738FF677D4FF0DD695F942F255586,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,20.76,18.82 +2018-02-25T10:01:15.608Z,Confirmed,XRP,OUT,98.415838,0.984158,2D08A260A594FB5AE807E06186F8C53FCB52476832692DC28B0D3BC4168DD843,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,11.30,10.24 +2018-02-25T09:28:01.023Z,Confirmed,XRP,IN,24.777471,0.247775,9DC9C82BDB948D26BF29FEE4EBCDBD1B6A49EB608179E6D94926A169A09183FE,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.84,2.58 +2018-02-25T01:46:24.278Z,Confirmed,XRP,IN,104.072319,1.040723,243DB42435DC04D032CABFF30F5FD75D8AE2C6971632601567D20842ED0DC364,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,11.95,10.83 +2018-02-24T23:57:50.862Z,Confirmed,XRP,OUT,593.583537,5.935835,7B6A8FCE362CE28CCE8A9287E189B3B8C5A84681ED7283B9C372B8FBFB85C8C6,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,69.54,61.81 +2018-02-24T17:55:34.997Z,Confirmed,XRP,OUT,162.025228,1.620252,A76753325411035A4A7C01716854F35FF282ABAB3A8923051FAD10BB0F0535A1,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,18.98,16.87 +2018-02-24T16:11:50.089Z,Confirmed,XRP,OUT,70.862179,0.708622,DF8DD4C1F1E5503B7626FD760736ACB6FF77F128C70E534BC69D23D7AE585AB9,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,8.30,7.37 +2018-02-24T16:02:51.911Z,Confirmed,XRP,IN,476.480488,4.764805,EBB582030342883D01523C660D8B2336504339CE4F25C191128E916D28088E4C,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,55.82,49.62 +2018-02-24T15:02:42.594Z,Confirmed,XRP,IN,417.434455,4.174345,92061F0AC044B3A3FF40F0F40C77E8AF2E9C74CE48EF4581A1D5DF510056DBB0,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,48.90,43.47 +2018-02-24T14:40:40.308Z,Confirmed,XRP,IN,7.287491,0.072875,7EF7156FA1953A1DF98C0409140119874A92BABEC540DFD5E96D84C91E1551D5,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.85,0.75 +2018-02-24T09:41:08.831Z,Confirmed,XRP,IN,480.158936,4.801589,D9CCDF5F62833F297AE387A5C5562FF71D4ECED107E4BEA46FBE00EB5075251C,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,56.25,50.00 +2018-02-24T07:35:26.325Z,Confirmed,XRP,OUT,46.570541,0.465705,172079B19C99ACA712C221A030E3D2BCF7E655CD3641F736F73DC2E810D6727A,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.45,4.85 +2018-02-24T06:29:58.755Z,Confirmed,XRP,OUT,8.502073,0.085021,95C6DE24935601E1DF31BE2FECA3731FE7C6A958DF91305F9A8081FB5559F522,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,0.99,0.88 +2018-02-23T21:06:02.812Z,Confirmed,XRP,IN,59.046032,0.59046,4D0B6B417325916A8A71E2FD1C88861E3E4552461DC2F41BFBF646DEF1ED07F4,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,7.07,6.14 +2018-02-23T15:46:07.147Z,Confirmed,XRP,OUT,950.445057,9.504451,18D22E24D10CC8698589BC3984D2D7AC16F2A52600336B8BD249F7DCBA61B3B7,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,113.81,98.98 +2018-02-23T11:43:34.095Z,Confirmed,XRP,IN,616.452379,6.164524,C03E79FA7C4846397A7CAC97C1AC5D246F6A725E26478C448ADD30EBC52399ED,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,73.81,64.20 +2018-02-23T09:35:25.832Z,Confirmed,XRP,OUT,20.960213,0.209602,9AFEA53F1D41906B68569D8995C597089C79A246538CDBB0FEA460C4E88FE07E,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,2.50,2.18 +2018-02-23T09:04:51.028Z,Confirmed,XRP,IN,55.593149,0.555931,B03AFC75CB97A97CACD396342E8E422754B596A624C26E580E2C5A5A9C67C6A1,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,6.65,5.78 +2018-02-23T02:39:30.016Z,Confirmed,XRP,IN,197.282806,1.972828,FE1AB4B01E830BF58276E68E5C933C39AC7D0AB260A37C9D06733494C84F2733,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,23.62,20.54 +2018-02-23T01:49:11.999Z,Confirmed,XRP,IN,141.759061,1.417591,1AC86CAB5DEDF86D59B1EAD093E7237880E08BCE47D2B28EB5175EE7934D93A6,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,16.97,14.76 +2018-02-23T00:47:16.094Z,Confirmed,XRP,OUT,44.384293,0.443843,C7F5AC4BE9265D9F0515B6E0C4F58B9AC89C58E456392CF1DD9D2D1110E2D29D,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,5.31,4.62 +2018-02-22T14:51:15.245Z,Confirmed,XRP,IN,97.721791,0.977218,01682B3B90C3E19FCA47A1208CBEF9E8F54E259D8F6ACAF2287CEF8E3393132B,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,11.95,10.17 +2018-02-22T12:42:16.203Z,Confirmed,XRP,IN,65.726233,0.657262,50ECBA1102200D7819B2CFE35157F14B5BED6FA3BA8B83D0CD875056D09EA36B,XRP 2,66247FCB8869131BCE59253A2532E2F1F5BF12AA52765F577132A611BB125741,USD,8.04,6.84" `; diff --git a/libs/ledger-live-common/src/__tests__/accounts/groupPerDay.ts b/libs/ledger-live-common/src/__tests__/accounts/groupPerDay.ts index fb7cc84055df..57359e03287c 100644 --- a/libs/ledger-live-common/src/__tests__/accounts/groupPerDay.ts +++ b/libs/ledger-live-common/src/__tests__/accounts/groupPerDay.ts @@ -172,7 +172,6 @@ const account = fromAccountRaw({ }, ], currencyId: "tezos", - unitMagnitude: 6, lastSyncDate: "2019-11-27T15:29:51.673Z", balance: "278000", spendableBalance: "278000", diff --git a/libs/ledger-live-common/src/__tests__/migration/account-migration.ts b/libs/ledger-live-common/src/__tests__/migration/account-migration.ts index bfcc35b5a957..e5453a8f5ac7 100644 --- a/libs/ledger-live-common/src/__tests__/migration/account-migration.ts +++ b/libs/ledger-live-common/src/__tests__/migration/account-migration.ts @@ -139,7 +139,6 @@ const getMockAccount = (currencyId: string, address: string): Account => { const currency = getCryptoCurrencyById(currencyId); return { - name: "mockAccount", type: "Account", id: encodeAccountId({ type: "js", @@ -154,14 +153,12 @@ const getMockAccount = (currencyId: string, address: string): Account => { operations: [], currency, creationDate: new Date(0), - unit: currency.units[0], balance: new BigNumber(0), spendableBalance: new BigNumber(0), blockHeight: 0, freshAddressPath: "", seedIdentifier: "", index: 0, - starred: false, used: true, operationsCount: 0, pendingOperations: [], diff --git a/libs/ledger-live-common/src/__tests__/test-helpers/bridge.ts b/libs/ledger-live-common/src/__tests__/test-helpers/bridge.ts index b508badb3361..704e117f6d25 100644 --- a/libs/ledger-live-common/src/__tests__/test-helpers/bridge.ts +++ b/libs/ledger-live-common/src/__tests__/test-helpers/bridge.ts @@ -31,6 +31,7 @@ import type { } from "@ledgerhq/types-live"; import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets"; import { firstValueFrom } from "rxjs"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; const warnDev = process.env.CI ? (..._args) => {} : (...msg) => console.warn(...msg); // FIXME move out into DatasetTest to be defined in @@ -353,14 +354,16 @@ export function testBridge(data: DatasetTest): v const makeTest = (name, fn) => { if (accountData.FIXME_tests && accountData.FIXME_tests.some(r => name.match(r))) { - warnDev("FIXME test was skipped. " + name + " for " + initialAccount.name); + warnDev( + "FIXME test was skipped. " + name + " for " + getDefaultAccountName(initialAccount), + ); return; } test(name, fn); }; - describe(impl + " bridge on account " + initialAccount.name, () => { + describe(impl + " bridge on account " + getDefaultAccountName(initialAccount), () => { describe("sync", () => { makeTest("succeed", async () => { const account = await getSynced(); diff --git a/libs/ledger-live-common/src/account/formatters.ts b/libs/ledger-live-common/src/account/formatters.ts index 046277633fb2..17071731a965 100644 --- a/libs/ledger-live-common/src/account/formatters.ts +++ b/libs/ledger-live-common/src/account/formatters.ts @@ -1,11 +1,7 @@ import invariant from "invariant"; import { BigNumber } from "bignumber.js"; import { toAccountRaw } from "./serialization"; -import { - getAccountCurrency, - getAccountName, - getAccountUnit, -} from "@ledgerhq/coin-framework/account/index"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; import { getOperationAmountNumberWithInternals } from "../operation"; import { formatCurrencyUnit } from "../currencies"; import { getOperationAmountNumber } from "../operation"; @@ -14,6 +10,7 @@ import byFamily from "../generated/formatters"; import { nftsByCollections } from "@ledgerhq/live-nft"; import type { Unit } from "@ledgerhq/types-cryptoassets"; import type { Account, Operation, ProtoNFT } from "@ledgerhq/types-live"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; const styling = { bold: (str: string) => `\x1b[1m${str}\x1b[22m`, @@ -23,7 +20,8 @@ const styling = { reverse: (str: string) => `\x1b[7m${str}\x1b[27m`, }; -const isSignificantAccount = acc => acc.balance.gt(10 ** (getAccountUnit(acc).magnitude - 6)); +const isSignificantAccount = acc => + acc.balance.gt(10 ** (getAccountCurrency(acc).units[0].magnitude - 6)); const formatOp = ( unitByAccountId: (arg0: string) => Unit | null | undefined, @@ -80,7 +78,7 @@ const cliFormat = (account, level?: string) => { const { id, name, freshAddress, freshAddressPath, derivationMode, index, operations, nfts } = account; const tag = getTagDerivationMode(account.currency, derivationMode); - const balance = formatCurrencyUnit(account.unit, account.balance, { + const balance = formatCurrencyUnit(getAccountCurrency(account).units[0], account.balance, { showCode: true, }); const opsCount = `${operations.length}ops`; @@ -90,7 +88,11 @@ const cliFormat = (account, level?: string) => { tag ? " [" + tag + "]" : "" }: ${balance} (${opsCount}) (${freshInfo}) ${derivationInfo} ${id || ""}`; if (level === "head") return str; - str += maybeDisplaySumOfOpsIssue(operations, account.balance, getAccountUnit(account)); + str += maybeDisplaySumOfOpsIssue( + operations, + account.balance, + getAccountCurrency(account).units[0], + ); const family = byFamily[account.currency.family]; if (family && family.formatAccountSpecifics) { @@ -105,16 +107,16 @@ const cliFormat = (account, level?: string) => { " " + ta.type + " " + - getAccountName(ta) + + getDefaultAccountName(ta) + ": " + - formatCurrencyUnit(getAccountUnit(ta), ta.balance, { + formatCurrencyUnit(getAccountCurrency(ta).units[0], ta.balance, { showCode: true, disableRounding: true, }) + " (" + ta.operations.length + " ops)" + - maybeDisplaySumOfOpsIssue(ta.operations, ta.balance, getAccountUnit(ta)), + maybeDisplaySumOfOpsIssue(ta.operations, ta.balance, getAccountCurrency(ta).units[0]), ) .join("\n"); @@ -152,9 +154,9 @@ const cliFormat = (account, level?: string) => { .map( formatOp( id => { - if (account.id === id) return account.unit; + if (account.id === id) return getAccountCurrency(account).units[0]; const ta = subAccounts.find(a => a.id === id); - if (ta) return getAccountUnit(ta); + if (ta) return getAccountCurrency(ta).units[0]; console.error("unexpected missing token account " + id); }, (operation, unit) => { @@ -176,10 +178,10 @@ const stats = account => { (sum: BigNumber, op) => sum.plus(getOperationAmountNumberWithInternals(op)), new BigNumber(0), ); - const sumOfAllOps = formatCurrencyUnit(account.unit, sumOfAllOpsNumber, { + const sumOfAllOps = formatCurrencyUnit(getAccountCurrency(account).units[0], sumOfAllOpsNumber, { showCode: true, }); - const balance = formatCurrencyUnit(account.unit, account.balance, { + const balance = formatCurrencyUnit(getAccountCurrency(account).units[0], account.balance, { showCode: true, }); return { @@ -244,9 +246,9 @@ export function formatAccount(account: Account, format = "full"): string { export function formatOperation(account: Account | null | undefined): (arg0: Operation) => string { const unitByAccountId = (id: string) => { if (!account) return; - if (account.id === id) return account.unit; + if (account.id === id) return getAccountCurrency(account).units[0]; const ta = (account.subAccounts || []).find(a => a.id === id); - if (ta) return getAccountUnit(ta); + if (ta) return getAccountCurrency(ta).units[0]; }; const familyExtra = (operation, unit) => { diff --git a/libs/ledger-live-common/src/account/helpers.ts b/libs/ledger-live-common/src/account/helpers.ts index a61ba0e40538..dfa6a6be0c8d 100644 --- a/libs/ledger-live-common/src/account/helpers.ts +++ b/libs/ledger-live-common/src/account/helpers.ts @@ -5,9 +5,7 @@ import { TronAccount } from "../families/tron/types"; import { CosmosAccount } from "../families/cosmos/types"; import { getMainAccount, - getAccountName, getAccountCurrency, - getAccountUnit, getFeesCurrency, getFeesUnit, getAccountSpendableBalance, @@ -35,9 +33,7 @@ import { // FIXME Remove this redundant export and import all from coin-framework export { getMainAccount, - getAccountName, getAccountCurrency, - getAccountUnit, getFeesCurrency, getFeesUnit, getAccountSpendableBalance, diff --git a/libs/ledger-live-common/src/account/importAccounts.integration.test.ts b/libs/ledger-live-common/src/account/importAccounts.integration.test.ts deleted file mode 100644 index a15a597748d2..000000000000 --- a/libs/ledger-live-common/src/account/importAccounts.integration.test.ts +++ /dev/null @@ -1,186 +0,0 @@ -import "../__tests__/test-helpers/setup"; -import { makeBridgeCacheSystem } from "../bridge/cache"; -import { accountToAccountData } from "../cross"; -import { - importAccountsMakeItems, - importAccountsReduce, - fromAccountRaw, - syncNewAccountsToImport, -} from "."; -import { Account, DerivationMode } from "@ledgerhq/types-live"; - -jest.setTimeout(200000); - -test("importAccounts with a set of real data", async () => { - const accounts = [ - { - id: "js:2:algorand:32PI2C5HLHMVUF5KMNURLGCTYVIOVJJ2NLHLZ2PIMK567MKMS4RXBSVWQI:", - seedIdentifier: "32PI2C5HLHMVUF5KMNURLGCTYVIOVJJ2NLHLZ2PIMK567MKMS4RXBSVWQI", - name: "Algorand legacy 32PI2C5H...RXBSVWQI", - starred: true, - used: true, - derivationMode: "" as DerivationMode, - index: 0, - freshAddress: "32PI2C5HLHMVUF5KMNURLGCTYVIOVJJ2NLHLZ2PIMK567MKMS4RXBSVWQI", - freshAddressPath: "44'/283'/0'/0/0", - blockHeight: 23066613, - creationDate: "2022-02-04T13:12:58.000Z", - operationsCount: 184, - operations: [], - pendingOperations: [], - currencyId: "algorand", - unitMagnitude: 6, - lastSyncDate: "2022-08-26T09:24:27.076Z", - balance: "2100190", - spendableBalance: "190", - xpub: "32PI2C5HLHMVUF5KMNURLGCTYVIOVJJ2NLHLZ2PIMK567MKMS4RXBSVWQI", - subAccounts: [], - algorandResources: { rewards: "190", nbAssets: 20 }, - swapHistory: [], - }, - { - id: "js:2:tron:TRbtdwHowocq8ThZbRnTHgK4JG5sx3fFCK:", - seedIdentifier: "TRbtdwHowocq8ThZbRnTHgK4JG5sx3fFCK", - name: "Tron legacy TRbtdwHo...5sx3fFCK", - starred: true, - used: true, - derivationMode: "" as DerivationMode, - index: 0, - freshAddress: "TRbtdwHowocq8ThZbRnTHgK4JG5sx3fFCK", - freshAddressPath: "44'/195'/0'/0/0", - blockHeight: 43642499, - creationDate: "2022-07-19T15:32:12.000Z", - operationsCount: 41, - operations: [], - pendingOperations: [], - currencyId: "tron", - unitMagnitude: 6, - lastSyncDate: "2022-08-26T09:24:59.492Z", - balance: "0", - spendableBalance: "0", - xpub: "TRbtdwHowocq8ThZbRnTHgK4JG5sx3fFCK", - subAccounts: [], - tronResources: { - frozen: {}, - unFrozen: {}, - legacyFrozen: {}, - delegatedFrozen: {}, - votes: [], - tronPower: 0, - energy: "0", - bandwidth: { - freeUsed: "0", - freeLimit: "1500", - gainedUsed: "0", - gainedLimit: "0", - }, - unwithdrawnReward: "2730", - lastVotedDate: "2022-07-22T14:39:51.000Z", - cacheTransactionInfoById: {}, - }, - swapHistory: [], - }, - { - id: "js:2:polkadot:15jLBbe9LD6VSUYFkV5Fmo5LhZU5cns9E6g8qcDv5KrKM1eP:polkadotbip44", - seedIdentifier: "15jLBbe9LD6VSUYFkV5Fmo5LhZU5cns9E6g8qcDv5KrKM1eP", - name: "Polkadot polkadotbip44 15jLBbe9...5KrKM1eP", - starred: true, - used: true, - derivationMode: "" as DerivationMode, // polkadotbip44 - index: 0, - freshAddress: "15jLBbe9LD6VSUYFkV5Fmo5LhZU5cns9E6g8qcDv5KrKM1eP", - freshAddressPath: "44'/354'/0'/0'/0'", - blockHeight: 11771108, - creationDate: "2022-02-24T14:39:00.007Z", - operationsCount: 65, - operations: [], - pendingOperations: [], - currencyId: "polkadot", - unitMagnitude: 10, - lastSyncDate: "2022-08-26T09:25:00.713Z", - balance: "15512511464", - spendableBalance: "15512511464", - xpub: "15jLBbe9LD6VSUYFkV5Fmo5LhZU5cns9E6g8qcDv5KrKM1eP", - polkadotResources: { - controller: null, - stash: null, - nonce: 63, - lockedBalance: "0", - unlockedBalance: "0", - unlockingBalance: "0", - unlockings: [], - nominations: [], - }, - swapHistory: [], - }, - { - id: "js:2:bsc:0xa22CA840265d3C5CB1846e419B14c6a6CdD06FAB:", - seedIdentifier: "0xa22CA840265d3C5CB1846e419B14c6a6CdD06FAB", - name: "Binance Smart Chain legacy 0xa22CA8...CdD06FAB", - starred: true, - used: true, - derivationMode: "" as DerivationMode, - index: 0, - freshAddress: "0xa22CA840265d3C5CB1846e419B14c6a6CdD06FAB", - freshAddressPath: "44'/60'/0'/0/0", - blockHeight: 20775454, - syncHash: "[]_655", - creationDate: "2022-02-04T13:11:32.001Z", - operationsCount: 21, - operations: [], - pendingOperations: [], - currencyId: "bsc", - unitMagnitude: 18, - lastSyncDate: "2022-08-26T09:25:01.109Z", - balance: "3128019430408477", - spendableBalance: "3128019430408477", - xpub: "0xa22CA840265d3C5CB1846e419B14c6a6CdD06FAB", - subAccounts: [], - swapHistory: [], - }, - ].map(fromAccountRaw); - - const localCache = {}; - const bridgeCache = makeBridgeCacheSystem({ - saveData(c, d) { - localCache[c.id] = d; - return Promise.resolve(); - }, - - getData(c) { - return Promise.resolve(localCache[c.id]); - }, - }); - - const result = { - accounts: accounts.map(accountToAccountData), - settings: { currenciesSettings: {}, pairExchanges: {} }, - meta: { exporterName: "Test", exporterVersion: "0" }, - }; - - const accountsState = []; - - const items = importAccountsMakeItems({ - result, - accounts: accountsState, - }); - const selectedAccounts = accounts.map(a => a.id); - const syncResult = await syncNewAccountsToImport({ items, selectedAccounts }, bridgeCache); - const reduced = importAccountsReduce(accountsState, { - items, - selectedAccounts, - syncResult, - }); - expect(reduced.length).toEqual(4); - expect((reduced[0] as AlgorandAccount).algorandResources).toBeDefined(); - expect((reduced[1] as TronAccount).tronResources).toBeDefined(); - expect((reduced[2] as PolkadotAccount).polkadotResources).toBeDefined(); - expect(reduced[0].operations.length).toBeGreaterThan(1); - expect(reduced[1].operations.length).toBeGreaterThan(1); - expect(reduced[2].operations.length).toBeGreaterThan(1); - expect(reduced[3].operations.length).toBeGreaterThan(1); -}); - -type AlgorandAccount = Account & { algorandResources: any }; -type TronAccount = Account & { tronResources: any }; -type PolkadotAccount = Account & { polkadotResources: any }; diff --git a/libs/ledger-live-common/src/account/importAccounts.test.ts b/libs/ledger-live-common/src/account/importAccounts.test.ts deleted file mode 100644 index 7eca0fb9cf10..000000000000 --- a/libs/ledger-live-common/src/account/importAccounts.test.ts +++ /dev/null @@ -1,181 +0,0 @@ -import type { AccountRaw } from "@ledgerhq/types-live"; -import { importAccountsMakeItems, importAccountsReduce, fromAccountRaw } from "."; -import { setSupportedCurrencies } from "../currencies"; -import { WALLET_API_VERSION } from "../wallet-api/constants"; -import { setWalletAPIVersion } from "../wallet-api/version"; - -setWalletAPIVersion(WALLET_API_VERSION); - -setSupportedCurrencies(["ethereum"]); -describe("importAccountsMakeItems", () => { - test("importing ethereum accounts", () => { - const result = { - meta: { - exporterName: "desktop", - exporterVersion: "1.12.0", - }, - accounts: [ - { - id: "js:1:ethereum:0x01:", - name: "Ethereum 1", - seedIdentifier: "seed", - derivationMode: "", - freshAddress: "0x01", - currencyId: "ethereum", - index: 0, - balance: "51281813126095913", - swapHistory: [], - }, - { - id: "js:1:ethereum:0x02:", - name: "Ethereum 2", - seedIdentifier: "seed", - derivationMode: "", - freshAddress: "0x02", - currencyId: "ethereum", - index: 1, - balance: "1081392000000000", - swapHistory: [], - }, - { - id: "js:1:ethereum:0x04:", - name: "Ethereum 4", - seedIdentifier: "seed", - derivationMode: "", - freshAddress: "0x04", - currencyId: "ethereum", - index: 3, - balance: "1000000000000000", - swapHistory: [], - }, - { - id: "js:1:ethereum:0x03:", - name: "ETH3 name edited", - seedIdentifier: "seed", - derivationMode: "", - freshAddress: "0x03", - currencyId: "ethereum", - index: 2, - balance: "0", - swapHistory: [], - }, - { - id: "js:1:ethereum:0x05:", - name: "Ethereum 5", - seedIdentifier: "seed", - derivationMode: "", - freshAddress: "0x05", - currencyId: "ethereum", - index: 4, - balance: "0", - swapHistory: [], - }, - ], - settings: { - counterValue: "USD", - currenciesSettings: {}, - pairExchanges: {}, - developerModeEnabled: false, - }, - }; - const accounts = [ - { - id: "js:1:ethereum:0x01:", - seedIdentifier: "0x01", - name: "Ethereum 1", - derivationMode: "", - index: 0, - freshAddress: "0x01", - freshAddressPath: "44'/60'/0'/0/0", - blockHeight: 8168983, - operations: [], - pendingOperations: [], - currencyId: "ethereum", - unitMagnitude: 18, - lastSyncDate: "2019-07-17T15:13:30.318Z", - balance: "51281813126095910", - }, - { - id: "js:1:ethereum:0x02:", - seedIdentifier: "0x02", - name: "Ethereum 2", - derivationMode: "", - index: 1, - freshAddress: "0x02", - freshAddressPath: "44'/60'/1'/0/0", - blockHeight: 8168983, - operations: [], - pendingOperations: [], - currencyId: "ethereum", - unitMagnitude: 18, - lastSyncDate: "2019-07-17T15:13:29.306Z", - balance: "1081392000000000", - }, - { - id: "js:1:ethereum:0x03:", - seedIdentifier: "seed", - name: "Ethereum 3", - derivationMode: "", - index: 2, - freshAddress: "0x03", - freshAddressPath: "44'/60'/2'/0/0", - blockHeight: 8168983, - operations: [], - pendingOperations: [], - currencyId: "ethereum", - unitMagnitude: 18, - lastSyncDate: "2019-07-17T15:13:29.306Z", - balance: "1081392000000000", - }, - ].map(fromAccountRaw); - const items = importAccountsMakeItems({ - result, - accounts, - }); - expect(items).toMatchObject([ - { - initialAccountId: "js:1:ethereum:0x04:", - account: { id: "js:1:ethereum:0x04:", name: "Ethereum 4" }, - mode: "create", - }, - { - initialAccountId: "js:1:ethereum:0x05:", - account: { id: "js:1:ethereum:0x05:", name: "Ethereum 5" }, - mode: "create", - }, - { - initialAccountId: "js:1:ethereum:0x03:", - account: { id: "js:1:ethereum:0x03:", name: "ETH3 name edited" }, - mode: "update", - }, - { - initialAccountId: "js:1:ethereum:0x01:", - account: { id: "js:1:ethereum:0x01:", name: "Ethereum 1" }, - mode: "id", - }, - { - initialAccountId: "js:1:ethereum:0x02:", - account: { id: "js:1:ethereum:0x02:", name: "Ethereum 2" }, - mode: "id", - }, - ]); - const syncResult = { - failed: {}, - synchronized: {}, - }; - result.accounts.forEach(a => { - syncResult.synchronized[a.id] = a; - }); - const reduced = importAccountsReduce(accounts, { - items, - selectedAccounts: ["js:1:ethereum:0x03:", "js:1:ethereum:0x02:", "js:1:ethereum:0x05:"], - syncResult, - }); - expect(reduced).toMatchObject([ - { id: "js:1:ethereum:0x01:", name: "Ethereum 1" }, - { id: "js:1:ethereum:0x02:", name: "Ethereum 2" }, - { id: "js:1:ethereum:0x03:", name: "ETH3 name edited" }, - { id: "js:1:ethereum:0x05:", name: "Ethereum 5" }, - ]); - }); -}); diff --git a/libs/ledger-live-common/src/account/index.ts b/libs/ledger-live-common/src/account/index.ts index 4bfd3f63c4de..92c67aec616e 100644 --- a/libs/ledger-live-common/src/account/index.ts +++ b/libs/ledger-live-common/src/account/index.ts @@ -1,11 +1,7 @@ export * from "./helpers"; -export * from "./addAccounts"; export * from "./support"; -export * from "./importAccounts"; export * from "./serialization"; export * from "@ledgerhq/coin-framework/account/accountId"; -export * from "@ledgerhq/coin-framework/account/accountName"; -export * from "@ledgerhq/coin-framework/account/ordering"; export * from "@ledgerhq/coin-framework/account/groupOperations"; export * from "@ledgerhq/coin-framework/account/pending"; export * from "./formatters"; diff --git a/libs/ledger-live-common/src/account/serialization.ts b/libs/ledger-live-common/src/account/serialization.ts index c6ce8971ef79..992554e7e79c 100644 --- a/libs/ledger-live-common/src/account/serialization.ts +++ b/libs/ledger-live-common/src/account/serialization.ts @@ -5,6 +5,7 @@ import type { Account, AccountBridge, AccountRaw, + AccountUserData, BalanceHistory, BalanceHistoryRaw, Operation, @@ -70,11 +71,23 @@ export function fromAccountRaw(rawAccount: AccountRaw): Account { fromOperationExtraRaw: bridge.fromOperationExtraRaw, }); } -export function toAccountRaw(account: Account): AccountRaw { + +export function toAccountRaw(account: Account, userData?: AccountUserData): AccountRaw { const bridge = getAccountBridge(account); - return commonToAccountRaw(account, { + const commonAccountRaw = commonToAccountRaw(account, { assignToAccountRaw: bridge.assignToAccountRaw, toOperationExtraRaw: bridge.toOperationExtraRaw, }); + + // extend with user data fields + if (userData) { + commonAccountRaw.name = userData.name; + commonAccountRaw.starred = userData.starredIds.includes(commonAccountRaw.id); + for (const tokenAccount of commonAccountRaw.subAccounts || []) { + tokenAccount.starred = userData.starredIds.includes(tokenAccount.id); + } + } + + return commonAccountRaw; } diff --git a/libs/ledger-live-common/src/bot/engine.ts b/libs/ledger-live-common/src/bot/engine.ts index 7d68f3402dd5..48c24a1208b4 100644 --- a/libs/ledger-live-common/src/bot/engine.ts +++ b/libs/ledger-live-common/src/bot/engine.ts @@ -42,7 +42,6 @@ import type { DeviceActionEvent, } from "./types"; import { makeBridgeCacheSystem } from "../bridge/cache"; -import { accountDataToAccount, accountToAccountData } from "../cross"; import type { Account, AccountLike, @@ -53,6 +52,7 @@ import type { } from "@ledgerhq/types-live"; import type { Transaction, TransactionStatus } from "../generated/types"; import { botTest } from "@ledgerhq/coin-framework/bot/bot-test-context"; +import { getDefaultAccountNameForCurrencyIndex } from "@ledgerhq/live-wallet/accountName"; let appCandidates; const localCache = {}; @@ -67,14 +67,6 @@ const cache = makeBridgeCacheSystem({ }, }); -// simulate the export/inport of an account -async function crossAccount(account: Account): Promise { - const a = accountDataToAccount(accountToAccountData(account)); - a.name += " cross"; - const synced = await syncAccount(a); - return synced; -} - const defaultScanAccountsRetries = 2; const delayBetweenScanAccountRetries = 5000; @@ -183,11 +175,6 @@ export async function runWithAppSpec( ); } - // "Migrate" the FIRST and every {crossAccountFrequency} account to simulate an export/import (same logic as export to mobile) – default to every 10 - // this is made a subset of the accounts to help identify problem that would be specific to the "cross" or not. - for (let i = 0; i < accounts.length; i += spec.crossAccountFrequency || 10) { - accounts[i] = await crossAccount(accounts[i]); - } appReport.accountsBefore = accounts; if (!spec.allowEmptyAccounts) { invariant(accounts.length > 0, "unexpected empty accounts for " + currency.name); @@ -391,12 +378,17 @@ export async function runOnAccount({ const accountBridge = getAccountBridge(account); const accountBeforeTransaction = account; report.account = account; - log("engine", `spec ${spec.name}/${account.name}`); + log("engine", `spec ${spec.name}/${getDefaultAccountNameForCurrencyIndex(account)}`); const maxSpendable = await accountBridge.estimateMaxSpendable({ account, }); report.maxSpendable = maxSpendable; - log("engine", `spec ${spec.name}/${account.name} maxSpendable=${maxSpendable.toString()}`); + log( + "engine", + `spec ${spec.name}/${getDefaultAccountNameForCurrencyIndex( + account, + )} maxSpendable=${maxSpendable.toString()}`, + ); const candidates: Array<{ mutation: MutationSpec; tx: T; @@ -548,7 +540,7 @@ export async function runOnAccount({ mutationsCount[mutation.name] = (mutationsCount[mutation.name] || 0) + 1; // sign the transaction with speculos - log("engine", `spec ${spec.name}/${account.name} signing`); + log("engine", `spec ${spec.name}/${getDefaultAccountNameForCurrencyIndex(account)} signing`); const signedOperation = await firstValueFrom( accountBridge .signOperation({ @@ -559,7 +551,10 @@ export async function runOnAccount({ .pipe( tap(e => { latestSignOperationEvent = e; - log("engine", `spec ${spec.name}/${account.name}: ${e.type}`); + log( + "engine", + `spec ${spec.name}/${getDefaultAccountNameForCurrencyIndex(account)}: ${e.type}`, + ); }), autoSignTransaction({ transport: device.transport, @@ -604,7 +599,12 @@ export async function runOnAccount({ deepFreezeOperation(optimisticOperation); report.optimisticOperation = optimisticOperation; report.broadcastedTime = now(); - log("engine", `spec ${spec.name}/${account.name}/${optimisticOperation.hash} broadcasted`); + log( + "engine", + `spec ${spec.name}/${getDefaultAccountNameForCurrencyIndex(account)}/${ + optimisticOperation.hash + } broadcasted`, + ); // wait the condition are good (operation confirmed) // test() is run over and over until either timeout is reach OR success @@ -663,7 +663,12 @@ export async function runOnAccount({ report.finalAccount = finalAccount; report.operation = operation; report.confirmedTime = now(); - log("engine", `spec ${spec.name}/${account.name}/${optimisticOperation.hash} confirmed`); + log( + "engine", + `spec ${spec.name}/${getDefaultAccountNameForCurrencyIndex(account)}/${ + optimisticOperation.hash + } confirmed`, + ); const destinationBeforeTransaction = destination; if (destination && mutation.testDestination) { @@ -743,7 +748,13 @@ async function syncAccount(initialAccount: Account): Promise { timeout({ each: 10 * 60 * 1000, with: () => - throwError(() => new Error("account sync timeout for " + initialAccount.name)), + throwError( + () => + new Error( + "account sync timeout for " + + getDefaultAccountNameForCurrencyIndex(initialAccount), + ), + ), }), ), ); @@ -852,7 +863,7 @@ function awaitAccountOperation({ account: Account; value: T; }> { - log("engine", "awaitAccountOperation on " + account.name); + log("engine", "awaitAccountOperation on " + getDefaultAccountNameForCurrencyIndex(account)); let syncCounter = 0; let acc = account; let lastSync = now(); @@ -872,7 +883,10 @@ function awaitAccountOperation({ await delay(Math.max(loopDebounce, targetInterval - spent)); lastSync = now(); - log("engine", "sync #" + syncCounter++ + " on " + account.name); + log( + "engine", + "sync #" + syncCounter++ + " on " + getDefaultAccountNameForCurrencyIndex(account), + ); acc = await syncAccount(acc); const r = await loop(); return r; diff --git a/libs/ledger-live-common/src/bot/formatters.ts b/libs/ledger-live-common/src/bot/formatters.ts index 5786dda278c7..34be74a6098e 100644 --- a/libs/ledger-live-common/src/bot/formatters.ts +++ b/libs/ledger-live-common/src/bot/formatters.ts @@ -67,7 +67,7 @@ export function formatReportForConsole({ } if (account && maxSpendable) { - str += `max spendable ~${formatCurrencyUnit(account.unit, maxSpendable)}\n`; + str += `max spendable ~${formatCurrencyUnit(account.currency.units[0], maxSpendable)}\n`; } if (unavailableMutationReasons) { diff --git a/libs/ledger-live-common/src/bot/index.ts b/libs/ledger-live-common/src/bot/index.ts index 0332dff88bfd..55af76a8240f 100644 --- a/libs/ledger-live-common/src/bot/index.ts +++ b/libs/ledger-live-common/src/bot/index.ts @@ -32,6 +32,7 @@ import { Account } from "@ledgerhq/types-live"; import { getContext } from "@ledgerhq/coin-framework/bot/bot-test-context"; import { Transaction } from "../generated/types"; import { sha256 } from "../crypto"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; type Arg = Partial<{ filter: Partial<{ currencies: string[]; families: string[]; mutation: string }>; @@ -736,7 +737,7 @@ export async function bot({ disabled, filter }: Arg = {}): Promise { }); errorCases.forEach((c: MutationReport) => { txt += `in ${c.spec.name}`; - if (c.account) txt += `/${c.account.name}`; + if (c.account) txt += `/${getDefaultAccountName(c.account)}`; if (c.mutation) txt += `/${c.mutation.name}`; txt += ` got ${String(c.error)}\n`; }); diff --git a/libs/ledger-live-common/src/bot/portfolio/process-sync.ts b/libs/ledger-live-common/src/bot/portfolio/process-sync.ts index 4216074f9e06..5f910bc3176f 100644 --- a/libs/ledger-live-common/src/bot/portfolio/process-sync.ts +++ b/libs/ledger-live-common/src/bot/portfolio/process-sync.ts @@ -117,7 +117,7 @@ async function main(): Promise { audit.end(); - const accountsRaw = JSON.stringify(accounts.map(toAccountRaw)); + const accountsRaw = JSON.stringify(accounts.map(a => toAccountRaw(a))); const preloadJSON = JSON.stringify(localCache); audit.setAccountsJSONSize(accountsRaw.length); audit.setPreloadJSONSize(preloadJSON.length); diff --git a/libs/ledger-live-common/src/bridge/cache.ts b/libs/ledger-live-common/src/bridge/cache.ts index 47cc25c20388..a591c04d682b 100644 --- a/libs/ledger-live-common/src/bridge/cache.ts +++ b/libs/ledger-live-common/src/bridge/cache.ts @@ -1,10 +1,8 @@ import { makeLRUCache } from "@ledgerhq/live-network/cache"; import type { CryptoCurrency } from "@ledgerhq/types-cryptoassets"; +import type { BridgeCacheSystem } from "@ledgerhq/types-live"; import { getCurrencyBridge } from "./"; -export type BridgeCacheSystem = { - hydrateCurrency: (currency: CryptoCurrency) => Promise; - prepareCurrency: (currency: CryptoCurrency) => Promise; -}; + const defaultCacheStrategy = { preloadMaxAge: 5 * 60 * 1000, }; diff --git a/libs/ledger-live-common/src/bridge/mockHelpers.ts b/libs/ledger-live-common/src/bridge/mockHelpers.ts index 9c74969e5149..264235d06ab9 100644 --- a/libs/ledger-live-common/src/bridge/mockHelpers.ts +++ b/libs/ledger-live-common/src/bridge/mockHelpers.ts @@ -1,11 +1,9 @@ // TODO makeMockBridge need to be exploded into families (bridge/mock) with utility code shared. import { genOperation } from "@ledgerhq/coin-framework/mocks/account"; -import { SyncError } from "@ledgerhq/errors"; import { Account, AccountBridge, CurrencyBridge, Operation } from "@ledgerhq/types-live"; import { BigNumber } from "bignumber.js"; import Prando from "prando"; import { Observable, of } from "rxjs"; -import { validateNameEdition } from "../account"; import { getEnv } from "@ledgerhq/live-env"; import perFamilyMock from "../generated/mock"; import { genAccount } from "../mock/account"; @@ -20,11 +18,6 @@ export const sync: AccountBridge["sync"] = initialAccount => const accountId = initialAccount.id; const sync = () => { - if (initialAccount.name.includes("crash")) { - o.error(new SyncError("mock failure")); - return; - } - const ops = broadcasted[accountId] || []; broadcasted[accountId] = []; o.next(acc => { @@ -139,7 +132,6 @@ export const scanAccounts: CurrencyBridge["scanAccounts"] = ({ currency }) => operationsSize: isLast ? 0 : 100, currency, }); - account.unit = currency.units[0]; account.index = i; account.operations = isLast ? [] @@ -148,8 +140,6 @@ export const scanAccounts: CurrencyBridge["scanAccounts"] = ({ currency }) => date: subtractOneYear(operation.date), })); account.used = isLast ? false : account.used; - account.name = ""; - account.name = validateNameEdition(account); if (isLast) { account.spendableBalance = account.balance = new BigNumber(0); diff --git a/libs/ledger-live-common/src/csvExport.ts b/libs/ledger-live-common/src/csvExport.ts index b23206ef7328..a7a348bc8811 100644 --- a/libs/ledger-live-common/src/csvExport.ts +++ b/libs/ledger-live-common/src/csvExport.ts @@ -6,6 +6,7 @@ import { flattenOperationWithInternalsAndNfts } from "./operation"; import { calculate } from "@ledgerhq/live-countervalues/logic"; import type { CounterValuesState } from "@ledgerhq/live-countervalues/types"; import type { Currency } from "@ledgerhq/types-cryptoassets"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; type Field = { title: string; @@ -63,7 +64,8 @@ const fields: Field[] = [ }, { title: "Account Name", - cell: (account, parentAccount) => getMainAccount(account, parentAccount).name, + // FIXME: we need to inject wallet state if we want the actual user's account name + cell: (account, parentAccount) => getDefaultAccountName(getMainAccount(account, parentAccount)), }, { title: "Account xpub", diff --git a/libs/ledger-live-common/src/exchange/platform/transfer/completeExchange.ts b/libs/ledger-live-common/src/exchange/platform/transfer/completeExchange.ts index f9b8cbf357e9..f18ebfde3586 100644 --- a/libs/ledger-live-common/src/exchange/platform/transfer/completeExchange.ts +++ b/libs/ledger-live-common/src/exchange/platform/transfer/completeExchange.ts @@ -117,9 +117,7 @@ const completeExchange = ( ); } catch (e) { if (e instanceof TransportStatusError && e.statusCode === 0x6a83) { - throw new WrongDeviceForAccount(undefined, { - accountName: mainAccount.name, - }); + throw new WrongDeviceForAccount(); } throw convertTransportError(currentStep, e); diff --git a/libs/ledger-live-common/src/exchange/swap/completeExchange.ts b/libs/ledger-live-common/src/exchange/swap/completeExchange.ts index d27cfd93c44a..10de444f26eb 100644 --- a/libs/ledger-live-common/src/exchange/swap/completeExchange.ts +++ b/libs/ledger-live-common/src/exchange/swap/completeExchange.ts @@ -23,6 +23,7 @@ import type { CompleteExchangeInputSwap, CompleteExchangeRequestEvent } from ".. import { getSwapProvider } from "../providers"; import { convertToAppExchangePartnerKey } from "../providers"; import { CompleteExchangeStep, convertTransportError } from "../error"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; const withDevicePromise = (deviceId, fn) => firstValueFrom(withDevice(deviceId)(transport => from(fn(transport)))); @@ -123,7 +124,7 @@ const completeExchange = ( throw new WrongDeviceForAccountPayout( getExchangeErrorMessage(e.statusCode, currentStep), { - accountName: payoutAccount.name, + accountName: getDefaultAccountName(payoutAccount), }, ); } @@ -165,7 +166,7 @@ const completeExchange = ( throw new WrongDeviceForAccountRefund( getExchangeErrorMessage(e.statusCode, currentStep), { - accountName: refundAccount.name, + accountName: getDefaultAccountName(refundAccount), }, ); } diff --git a/libs/ledger-live-common/src/exchange/swap/csvExport.ts b/libs/ledger-live-common/src/exchange/swap/csvExport.ts index b179ba6dc833..a4db51a35791 100644 --- a/libs/ledger-live-common/src/exchange/swap/csvExport.ts +++ b/libs/ledger-live-common/src/exchange/swap/csvExport.ts @@ -1,6 +1,7 @@ import { formatCurrencyUnit } from "../../currencies"; import { getAccountCurrency, getMainAccount } from "../../account"; import type { SwapHistorySection, MappedSwapOperation } from "./types"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; type Field = { title: string; cell: (arg0: MappedSwapOperation) => string; @@ -50,7 +51,7 @@ const fields: Field[] = [ { title: "From account", cell: ({ fromAccount, fromParentAccount }) => - getMainAccount(fromAccount, fromParentAccount).name, + getDefaultAccountName(getMainAccount(fromAccount, fromParentAccount)), }, { title: "From account address", @@ -61,7 +62,8 @@ const fields: Field[] = [ }, { title: "To account", - cell: ({ toAccount, toParentAccount }) => getMainAccount(toAccount, toParentAccount).name, + cell: ({ toAccount, toParentAccount }) => + getDefaultAccountName(getMainAccount(toAccount, toParentAccount)), }, { title: "To account address", diff --git a/libs/ledger-live-common/src/exchange/swap/getExchangeRates.ts b/libs/ledger-live-common/src/exchange/swap/getExchangeRates.ts index bd70c1d6408d..56eb4c391b5b 100644 --- a/libs/ledger-live-common/src/exchange/swap/getExchangeRates.ts +++ b/libs/ledger-live-common/src/exchange/swap/getExchangeRates.ts @@ -1,7 +1,7 @@ import network from "@ledgerhq/live-network/network"; import type { Unit } from "@ledgerhq/types-cryptoassets"; import { BigNumber } from "bignumber.js"; -import { getAccountCurrency, getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import { SwapExchangeRateAmountTooHigh, @@ -25,9 +25,10 @@ const getExchangeRates: GetExchangeRates = async ({ if (isIntegrationTestEnv()) return mockGetExchangeRates(exchange, transaction, currencyTo); const from = getAccountCurrency(exchange.fromAccount).id; - const unitFrom = getAccountUnit(exchange.fromAccount); + const unitFrom = getAccountCurrency(exchange.fromAccount).units[0]; const to = (currencyTo ?? getAccountCurrency(exchange.toAccount)).id; - const unitTo = (currencyTo && currencyTo.units[0]) ?? getAccountUnit(exchange.toAccount); + const unitTo = + (currencyTo && currencyTo.units[0]) ?? getAccountCurrency(exchange.toAccount).units[0]; const amountFrom = transaction.amount; const tenPowMagnitude = new BigNumber(10).pow(unitFrom.magnitude); const apiAmount = new BigNumber(amountFrom).div(tenPowMagnitude); diff --git a/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchRates.ts b/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchRates.ts index aafc9699a773..f567479abcce 100644 --- a/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchRates.ts +++ b/libs/ledger-live-common/src/exchange/swap/hooks/v5/useFetchRates.ts @@ -1,6 +1,6 @@ import { getAvailableProviders } from "../.."; import { AccountLike } from "@ledgerhq/types-live"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/coin-framework/account/helpers"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/helpers"; import { CryptoOrTokenCurrency } from "@ledgerhq/types-cryptoassets"; import BigNumber from "bignumber.js"; import { fetchRates } from "../../api/v5/fetchRates"; @@ -22,7 +22,9 @@ export function useFetchRates({ onSuccess, }: Props) { const currencyFrom = fromCurrencyAccount ? getAccountCurrency(fromCurrencyAccount).id : undefined; - const unitFrom = fromCurrencyAccount ? getAccountUnit(fromCurrencyAccount) : undefined; + const unitFrom = fromCurrencyAccount + ? getAccountCurrency(fromCurrencyAccount).units[0] + : undefined; const unitTo = toCurrency?.units[0]; const moonpayFF = useFeature("ptxSwapMoonpayProvider"); const formattedCurrencyAmount = diff --git a/libs/ledger-live-common/src/exchange/swap/initSwap.ts b/libs/ledger-live-common/src/exchange/swap/initSwap.ts index 1ea0522664fa..9637b67b0728 100644 --- a/libs/ledger-live-common/src/exchange/swap/initSwap.ts +++ b/libs/ledger-live-common/src/exchange/swap/initSwap.ts @@ -12,7 +12,7 @@ import invariant from "invariant"; import { Observable, firstValueFrom, from } from "rxjs"; import secp256k1 from "secp256k1"; import { getCurrencyExchangeConfig } from "../"; -import { getAccountCurrency, getAccountUnit, getMainAccount } from "../../account"; +import { getAccountCurrency, getMainAccount } from "../../account"; import { getAccountBridge } from "../../bridge"; import { getEnv } from "@ledgerhq/live-env"; import { @@ -29,6 +29,7 @@ import type { InitSwapInput, SwapRequestEvent } from "./types"; import { decodePayloadProtobuf } from "@ledgerhq/hw-app-exchange"; import { getSwapProvider } from "../providers"; import { convertToAppExchangePartnerKey } from "../providers"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; const withDevicePromise = (deviceId, fn) => firstValueFrom(withDevice(deviceId)(transport => from(fn(transport)))); @@ -62,7 +63,7 @@ const initSwap = (input: InitSwapInput): Observable => { const { fromParentAccount, fromAccount, toParentAccount, toAccount } = exchange; const { amount } = transaction; const refundCurrency = getAccountCurrency(fromAccount); - const unitFrom = getAccountUnit(exchange.fromAccount); + const unitFrom = getAccountCurrency(exchange.fromAccount).units[0]; const payoutCurrency = getAccountCurrency(toAccount); const refundAccount = getMainAccount(fromAccount, fromParentAccount); const payoutAccount = getMainAccount(toAccount, toParentAccount); @@ -207,7 +208,7 @@ const initSwap = (input: InitSwapInput): Observable => { } catch (e) { if (e instanceof TransportStatusError && e.statusCode === 0x6a83) { throw new WrongDeviceForAccountPayout(undefined, { - accountName: payoutAccount.name, + accountName: getDefaultAccountName(payoutAccount), }); } @@ -259,7 +260,7 @@ const initSwap = (input: InitSwapInput): Observable => { } catch (e) { if (e instanceof TransportStatusError && e.statusCode === 0x6a83) { throw new WrongDeviceForAccountRefund(undefined, { - accountName: refundAccount.name, + accountName: getDefaultAccountName(refundAccount), }); } diff --git a/libs/ledger-live-common/src/exchange/swap/joinSwapHistories.ts b/libs/ledger-live-common/src/exchange/swap/joinSwapHistories.ts deleted file mode 100644 index 05e84405af4b..000000000000 --- a/libs/ledger-live-common/src/exchange/swap/joinSwapHistories.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { SwapOperation } from "@ledgerhq/types-live"; - -export default ( - existingSwapHistory: SwapOperation[] | null | undefined, - importedSwapHistory: SwapOperation[] | null | undefined, -): SwapOperation[] => { - const usedSwapIds: string[] = []; - const dirtyJoin = [...(existingSwapHistory || []), ...(importedSwapHistory || [])]; - const cleanSwapHistory: SwapOperation[] = []; - - for (let i = dirtyJoin.length - 1; i >= 0; i--) { - // Iterate backwards to prioritise imported swaps - const swapOperation = dirtyJoin[i]; - if (usedSwapIds.includes(swapOperation.swapId)) continue; - usedSwapIds.push(swapOperation.swapId); - cleanSwapHistory.push(swapOperation); - } - - return cleanSwapHistory; -}; diff --git a/libs/ledger-live-common/src/exchange/swap/mock.ts b/libs/ledger-live-common/src/exchange/swap/mock.ts index c7d94bdbfd54..48b90b1d2d3f 100644 --- a/libs/ledger-live-common/src/exchange/swap/mock.ts +++ b/libs/ledger-live-common/src/exchange/swap/mock.ts @@ -1,6 +1,6 @@ import { BigNumber } from "bignumber.js"; import { Observable, of } from "rxjs"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import { SwapExchangeRateAmountTooHigh, SwapExchangeRateAmountTooLow } from "../../errors"; import type { @@ -22,8 +22,8 @@ export const mockGetExchangeRates = async ( ): Promise<(ExchangeRate & { expirationDate?: Date })[]> => { const { fromAccount, toAccount } = exchange; const amount = transaction.amount; - const unitFrom = getAccountUnit(fromAccount); - const unitTo = (currencyTo && currencyTo.units[0]) ?? getAccountUnit(toAccount); + const unitFrom = getAccountCurrency(fromAccount).units[0]; + const unitTo = (currencyTo && currencyTo.units[0]) ?? getAccountCurrency(toAccount).units[0]; const tenPowMagnitude = new BigNumber(10).pow(unitFrom.magnitude); const amountFrom = amount.div(tenPowMagnitude); const minAmountFrom = new BigNumber(0.0001); diff --git a/libs/ledger-live-common/src/families/algorand/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/algorand/__snapshots__/bridge.integration.test.ts.snap index 21409e7a5b31..b475f25db2bd 100644 --- a/libs/ledger-live-common/src/families/algorand/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/algorand/__snapshots__/bridge.integration.test.ts.snap @@ -12,16 +12,13 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "freshAddressPath": "44'/283'/0'/0/0", "id": "js:2:algorand:ZC3HFULMJF53BF5ER4E2TTGPBRGH2Y4RVS32JZ6NH4RW7LN67HCE6UBS3Q:", "index": 0, - "name": "Algorand 1", "nfts": undefined, "operationsCount": 133, "pendingOperations": [], "seedIdentifier": "c8b672d16c497bb097a48f09a9cccf0c4c7d6391acb7a4e7cd3f236fadbef9c4", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "ZC3HFULMJF53BF5ER4E2TTGPBRGH2Y4RVS32JZ6NH4RW7LN67HCE6UBS3Q", }, @@ -31,7 +28,6 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "operationsCount": 11, "parentId": "js:2:algorand:ZC3HFULMJF53BF5ER4E2TTGPBRGH2Y4RVS32JZ6NH4RW7LN67HCE6UBS3Q:", "pendingOperations": [], - "starred": false, "swapHistory": [], "tokenId": "algorand/asa/312769", "type": "TokenAccountRaw", @@ -42,7 +38,6 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "operationsCount": 0, "parentId": "js:2:algorand:ZC3HFULMJF53BF5ER4E2TTGPBRGH2Y4RVS32JZ6NH4RW7LN67HCE6UBS3Q:", "pendingOperations": [], - "starred": false, "swapHistory": [], "tokenId": "algorand/asa/438828", "type": "TokenAccountRaw", @@ -53,7 +48,6 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "operationsCount": 0, "parentId": "js:2:algorand:ZC3HFULMJF53BF5ER4E2TTGPBRGH2Y4RVS32JZ6NH4RW7LN67HCE6UBS3Q:", "pendingOperations": [], - "starred": false, "swapHistory": [], "tokenId": "algorand/asa/438837", "type": "TokenAccountRaw", @@ -64,7 +58,6 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "operationsCount": 0, "parentId": "js:2:algorand:ZC3HFULMJF53BF5ER4E2TTGPBRGH2Y4RVS32JZ6NH4RW7LN67HCE6UBS3Q:", "pendingOperations": [], - "starred": false, "swapHistory": [], "tokenId": "algorand/asa/2757561", "type": "TokenAccountRaw", @@ -75,7 +68,6 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "operationsCount": 0, "parentId": "js:2:algorand:ZC3HFULMJF53BF5ER4E2TTGPBRGH2Y4RVS32JZ6NH4RW7LN67HCE6UBS3Q:", "pendingOperations": [], - "starred": false, "swapHistory": [], "tokenId": "algorand/asa/27165954", "type": "TokenAccountRaw", @@ -86,7 +78,6 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "operationsCount": 0, "parentId": "js:2:algorand:ZC3HFULMJF53BF5ER4E2TTGPBRGH2Y4RVS32JZ6NH4RW7LN67HCE6UBS3Q:", "pendingOperations": [], - "starred": false, "swapHistory": [], "tokenId": "algorand/asa/137594422", "type": "TokenAccountRaw", @@ -101,16 +92,13 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "freshAddressPath": "44'/283'/1'/0/0", "id": "js:2:algorand:EGZQNDFCXGR3BMP4NDM6ZPLBMY7WSV6GRKOHM6VBJKFLWQ3RQDTE3JYNFE:", "index": 1, - "name": "Algorand 2", "nfts": undefined, "operationsCount": 8, "pendingOperations": [], "seedIdentifier": "c8b672d16c497bb097a48f09a9cccf0c4c7d6391acb7a4e7cd3f236fadbef9c4", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "EGZQNDFCXGR3BMP4NDM6ZPLBMY7WSV6GRKOHM6VBJKFLWQ3RQDTE3JYNFE", }, @@ -124,16 +112,13 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "freshAddressPath": "44'/283'/2'/0/0", "id": "js:2:algorand:ZQVVJ2S4XWS542KXBBVIINOEHIDOEZKZWK725PWFNN2I5RNCUBI53RT2EY:", "index": 2, - "name": "Algorand 3", "nfts": undefined, "operationsCount": 1, "pendingOperations": [], "seedIdentifier": "c8b672d16c497bb097a48f09a9cccf0c4c7d6391acb7a4e7cd3f236fadbef9c4", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "ZQVVJ2S4XWS542KXBBVIINOEHIDOEZKZWK725PWFNN2I5RNCUBI53RT2EY", }, @@ -147,16 +132,13 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "freshAddressPath": "44'/283'/3'/0/0", "id": "js:2:algorand:MECOWMKPKH2NWVZTS5V5RQDGFFYBT25KNLOPHG2KUMMNKU6FOHGJT24WBI:", "index": 3, - "name": "Algorand 4", "nfts": undefined, "operationsCount": 44, "pendingOperations": [], "seedIdentifier": "c8b672d16c497bb097a48f09a9cccf0c4c7d6391acb7a4e7cd3f236fadbef9c4", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "MECOWMKPKH2NWVZTS5V5RQDGFFYBT25KNLOPHG2KUMMNKU6FOHGJT24WBI", }, @@ -166,7 +148,6 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "operationsCount": 8, "parentId": "js:2:algorand:MECOWMKPKH2NWVZTS5V5RQDGFFYBT25KNLOPHG2KUMMNKU6FOHGJT24WBI:", "pendingOperations": [], - "starred": false, "swapHistory": [], "tokenId": "algorand/asa/312769", "type": "TokenAccountRaw", @@ -181,16 +162,13 @@ exports[`algorand currency bridge scanAccounts algorand seed 1 1`] = ` "freshAddressPath": "44'/283'/4'/0/0", "id": "js:2:algorand:MVE6C3XB4JBKXKORC3NLAWFW4M7EY3MADU6L72DADFP4NZBJIAYXGSLN3Y:", "index": 4, - "name": "Algorand 5", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "c8b672d16c497bb097a48f09a9cccf0c4c7d6391acb7a4e7cd3f236fadbef9c4", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "MVE6C3XB4JBKXKORC3NLAWFW4M7EY3MADU6L72DADFP4NZBJIAYXGSLN3Y", }, diff --git a/libs/ledger-live-common/src/families/bitcoin/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/bitcoin/__snapshots__/bridge.integration.test.ts.snap index aab6be7ea7da..81385ec3a05e 100644 --- a/libs/ledger-live-common/src/families/bitcoin/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/bitcoin/__snapshots__/bridge.integration.test.ts.snap @@ -11,16 +11,13 @@ exports[`bitcoin currency bridge scanAccounts bitcoin seed 1 1`] = ` "freshAddressPath": "84'/0'/0'/0/27", "id": "js:2:bitcoin:xpub6DEHKg8fgKcb5iYGPLtpBYD9gm7nvym3wwhHVnH3TtogvJGTcApj71K8iTpL7CzdZWAxwyjkZEFUrnLK24zKqgj3EVH7Vg1CD1ujibwiHuy:native_segwit", "index": 0, - "name": "Bitcoin 1", "nfts": undefined, "operationsCount": 65, "pendingOperations": [], "seedIdentifier": "04985c77e031db7909b5bab541828faac7719bc3ac205907da16f379e693eb012217195cbb49c53854d1bfec204470abc73ab4fb51338653e5236c6a6ae57d3442", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6DEHKg8fgKcb5iYGPLtpBYD9gm7nvym3wwhHVnH3TtogvJGTcApj71K8iTpL7CzdZWAxwyjkZEFUrnLK24zKqgj3EVH7Vg1CD1ujibwiHuy", }, @@ -33,16 +30,13 @@ exports[`bitcoin currency bridge scanAccounts bitcoin seed 1 1`] = ` "freshAddressPath": "84'/0'/1'/0/53", "id": "js:2:bitcoin:xpub6DEHKg8fgKcb9at2u9Xhjtx4tXGyWqUPQAx2zNCzr41gQRyCqpCn7onSoJU4VS96GXyCtAhhFxErnG2pGVvVexaqF7DEfqGGnGk7Havn7C2:native_segwit", "index": 1, - "name": "Bitcoin 2", "nfts": undefined, "operationsCount": 119, "pendingOperations": [], "seedIdentifier": "04985c77e031db7909b5bab541828faac7719bc3ac205907da16f379e693eb012217195cbb49c53854d1bfec204470abc73ab4fb51338653e5236c6a6ae57d3442", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6DEHKg8fgKcb9at2u9Xhjtx4tXGyWqUPQAx2zNCzr41gQRyCqpCn7onSoJU4VS96GXyCtAhhFxErnG2pGVvVexaqF7DEfqGGnGk7Havn7C2", }, @@ -55,16 +49,13 @@ exports[`bitcoin currency bridge scanAccounts bitcoin seed 1 1`] = ` "freshAddressPath": "84'/0'/2'/0/0", "id": "js:2:bitcoin:xpub6DEHKg8fgKcbC7ZzoayZKxpDs8PYag9aBvXLhpvZhag3DT2nU5PwLE6xaineM5jciavwNYGUZrdSTcktK6Xu9odBYXN6K2zeou479HUcbsc:native_segwit", "index": 2, - "name": "Bitcoin 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04985c77e031db7909b5bab541828faac7719bc3ac205907da16f379e693eb012217195cbb49c53854d1bfec204470abc73ab4fb51338653e5236c6a6ae57d3442", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6DEHKg8fgKcbC7ZzoayZKxpDs8PYag9aBvXLhpvZhag3DT2nU5PwLE6xaineM5jciavwNYGUZrdSTcktK6Xu9odBYXN6K2zeou479HUcbsc", }, @@ -77,16 +68,13 @@ exports[`bitcoin currency bridge scanAccounts bitcoin seed 1 1`] = ` "freshAddressPath": "86'/0'/0'/0/0", "id": "js:2:bitcoin:xpub6BvkrmBTnBQMW1tBLgY2H6itSqFh9xGAYLGtR8PsKi762NghTQVUkv5gJ3osjMzaqqcfpKgHm2ov7N67A6njxLG8RSU8WwLVN4F596cDmp6:taproot", "index": 0, - "name": "Bitcoin 1", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04bceefa855d60d97cd38688cffdc76e52a663e71db885535d0f62abcea9811148f48e2e21093058a41324c268024eb042c3fa427e9f4f6a60f1af9eb361a05a5b", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6BvkrmBTnBQMW1tBLgY2H6itSqFh9xGAYLGtR8PsKi762NghTQVUkv5gJ3osjMzaqqcfpKgHm2ov7N67A6njxLG8RSU8WwLVN4F596cDmp6", }, @@ -99,16 +87,13 @@ exports[`bitcoin currency bridge scanAccounts bitcoin seed 1 1`] = ` "freshAddressPath": "49'/0'/0'/0/34", "id": "js:2:bitcoin:xpub6CKb86o7RHSCxuwP5dnxyDySLbnVWypQUxhWpycFZWFTzXuXy3UgGtG3o51oGER6X2UY6zRqd5AXgzNghb9va1FkfzXz6k1RT6EwTwCKejE:segwit", "index": 0, - "name": "Bitcoin 1", "nfts": undefined, "operationsCount": 71, "pendingOperations": [], "seedIdentifier": "0412f62e549eee10ea7df9c9b1acfa6d77abb7424c057d7d725f418e2124dcd8662e21fde9e0b5a4cb731933a68ca406f6efcdadc8fb52afdb9ae422a68cfe5bde", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6CKb86o7RHSCxuwP5dnxyDySLbnVWypQUxhWpycFZWFTzXuXy3UgGtG3o51oGER6X2UY6zRqd5AXgzNghb9va1FkfzXz6k1RT6EwTwCKejE", }, @@ -121,16 +106,13 @@ exports[`bitcoin currency bridge scanAccounts bitcoin seed 1 1`] = ` "freshAddressPath": "49'/0'/1'/0/44", "id": "js:2:bitcoin:xpub6CKb86o7RHSD1tDBFKwPgEZ5Q83gnRPG7Bs5HzBRUxcm4dvLEPnSTWP8C7c4P71GgMCk1Fw6xS6Ki4XC6bGAQcxE8gc9KJHXzQnErDtwTa6:segwit", "index": 1, - "name": "Bitcoin 2", "nfts": undefined, "operationsCount": 92, "pendingOperations": [], "seedIdentifier": "0412f62e549eee10ea7df9c9b1acfa6d77abb7424c057d7d725f418e2124dcd8662e21fde9e0b5a4cb731933a68ca406f6efcdadc8fb52afdb9ae422a68cfe5bde", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6CKb86o7RHSD1tDBFKwPgEZ5Q83gnRPG7Bs5HzBRUxcm4dvLEPnSTWP8C7c4P71GgMCk1Fw6xS6Ki4XC6bGAQcxE8gc9KJHXzQnErDtwTa6", }, @@ -143,16 +125,13 @@ exports[`bitcoin currency bridge scanAccounts bitcoin seed 1 1`] = ` "freshAddressPath": "49'/0'/2'/0/0", "id": "js:2:bitcoin:xpub6CKb86o7RHSD4ZhRxHBtCWgL2J5MJYrVdurKFkdChDPjLpUt7EpvrsoCaBRCD78Qo7ith2DeCqonWinReuXMfs2bqJiLkcoE4VcwvkvUzEJ:segwit", "index": 2, - "name": "Bitcoin 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "0412f62e549eee10ea7df9c9b1acfa6d77abb7424c057d7d725f418e2124dcd8662e21fde9e0b5a4cb731933a68ca406f6efcdadc8fb52afdb9ae422a68cfe5bde", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6CKb86o7RHSD4ZhRxHBtCWgL2J5MJYrVdurKFkdChDPjLpUt7EpvrsoCaBRCD78Qo7ith2DeCqonWinReuXMfs2bqJiLkcoE4VcwvkvUzEJ", }, @@ -165,16 +144,13 @@ exports[`bitcoin currency bridge scanAccounts bitcoin seed 1 1`] = ` "freshAddressPath": "44'/0'/0'/0/60", "id": "js:2:bitcoin:xpub6BuPWhjLqutPV8SF4RMrrn8c3t7uBZbz4CBbThpbg9GYjqRMncra9mjgSfWSK7uMDz37hhzJ8wvkbDDQQJt6VgwLoszvmPiSBtLA1bPLLSn:", "index": 0, - "name": "Bitcoin 1", "nfts": undefined, "operationsCount": 131, "pendingOperations": [], "seedIdentifier": "04238878d371ce61cdd04d22ccab50c542e94ffa7a27d02d6bcefaa22e4fcee6db4c2029fd4de0b595e98002c0be01fc1fbd3568671e394c97a6d52c3d4c113fb5", "spendableBalance": "2757", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6BuPWhjLqutPV8SF4RMrrn8c3t7uBZbz4CBbThpbg9GYjqRMncra9mjgSfWSK7uMDz37hhzJ8wvkbDDQQJt6VgwLoszvmPiSBtLA1bPLLSn", }, @@ -187,16 +163,13 @@ exports[`bitcoin currency bridge scanAccounts bitcoin seed 1 1`] = ` "freshAddressPath": "44'/0'/1'/0/0", "id": "js:2:bitcoin:xpub6BuPWhjLqutPY3pENUxwkG3NAQfjLxoHMTAkwzH13rZSzkymZrbKui1MN3KgwiNFsH4AyLM3GkodNo4bTxQXE1kvZiruVUtJLe1bMW1MBBJ:", "index": 1, - "name": "Bitcoin 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04238878d371ce61cdd04d22ccab50c542e94ffa7a27d02d6bcefaa22e4fcee6db4c2029fd4de0b595e98002c0be01fc1fbd3568671e394c97a6d52c3d4c113fb5", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6BuPWhjLqutPY3pENUxwkG3NAQfjLxoHMTAkwzH13rZSzkymZrbKui1MN3KgwiNFsH4AyLM3GkodNo4bTxQXE1kvZiruVUtJLe1bMW1MBBJ", }, @@ -11376,16 +11349,13 @@ exports[`bitcoin_cash currency bridge scanAccounts bitcoin_cash seed 1 1`] = ` "freshAddressPath": "44'/0'/0'/0/19", "id": "js:2:bitcoin_cash:xpub6BuPWhjLqutPV8SF4RMrrn8c3t7uBZbz4CBbThpbg9GYjqRMncra9mjgSfWSK7uMDz37hhzJ8wvkbDDQQJt6VgwLoszvmPiSBtLA1bPLLSn:unsplit", "index": 0, - "name": "Bitcoin Cash 1", "nfts": undefined, "operationsCount": 41, "pendingOperations": [], "seedIdentifier": "04238878d371ce61cdd04d22ccab50c542e94ffa7a27d02d6bcefaa22e4fcee6db4c2029fd4de0b595e98002c0be01fc1fbd3568671e394c97a6d52c3d4c113fb5", "spendableBalance": "7707", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6BuPWhjLqutPV8SF4RMrrn8c3t7uBZbz4CBbThpbg9GYjqRMncra9mjgSfWSK7uMDz37hhzJ8wvkbDDQQJt6VgwLoszvmPiSBtLA1bPLLSn", }, @@ -11398,16 +11368,13 @@ exports[`bitcoin_cash currency bridge scanAccounts bitcoin_cash seed 1 1`] = ` "freshAddressPath": "44'/145'/0'/0/23", "id": "js:2:bitcoin_cash:xpub6D7pqJa4V3SFSigcsRaFL2mpfG7469osrMkk4ieR2uk8y1v3nuQUD8W8v36PLWQtVRSggSQM7jLpGNKH7sqCaoPSJEp9wZCVkRnMWoiUUXa:", "index": 0, - "name": "Bitcoin Cash 1", "nfts": undefined, "operationsCount": 66, "pendingOperations": [], "seedIdentifier": "04884ed3fe628a8487f782f97f38e7a9f014e624f1ea679951cf3a67445ea33fb334f4cc19e6c421b3ef9943d526cd4fbfebacebe8a62cc45db79a33d3ab04bd47", "spendableBalance": "99774", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6D7pqJa4V3SFSigcsRaFL2mpfG7469osrMkk4ieR2uk8y1v3nuQUD8W8v36PLWQtVRSggSQM7jLpGNKH7sqCaoPSJEp9wZCVkRnMWoiUUXa", }, @@ -11420,16 +11387,13 @@ exports[`bitcoin_cash currency bridge scanAccounts bitcoin_cash seed 1 1`] = ` "freshAddressPath": "44'/145'/1'/0/0", "id": "js:2:bitcoin_cash:xpub6D7pqJa4V3SFVc2TjqQaz1N6gCs5vTjznBSAyEE9es1j5nTb2uKXbihXQuaUURKJ59hEVQZctuCSC8t1MURbeiSmZFDTBsJ9QJCS5crNrBG:", "index": 1, - "name": "Bitcoin Cash 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04884ed3fe628a8487f782f97f38e7a9f014e624f1ea679951cf3a67445ea33fb334f4cc19e6c421b3ef9943d526cd4fbfebacebe8a62cc45db79a33d3ab04bd47", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6D7pqJa4V3SFVc2TjqQaz1N6gCs5vTjznBSAyEE9es1j5nTb2uKXbihXQuaUURKJ59hEVQZctuCSC8t1MURbeiSmZFDTBsJ9QJCS5crNrBG", }, @@ -13948,16 +13912,13 @@ exports[`bitcoin_gold currency bridge scanAccounts bitcoin_gold seed 1 1`] = ` "freshAddressPath": "44'/0'/0'/0/3", "id": "js:2:bitcoin_gold:xpub6BuPWhjLqutPV8SF4RMrrn8c3t7uBZbz4CBbThpbg9GYjqRMncra9mjgSfWSK7uMDz37hhzJ8wvkbDDQQJt6VgwLoszvmPiSBtLA1bPLLSn:unsplit", "index": 0, - "name": "Bitcoin Gold 1", "nfts": undefined, "operationsCount": 6, "pendingOperations": [], "seedIdentifier": "04238878d371ce61cdd04d22ccab50c542e94ffa7a27d02d6bcefaa22e4fcee6db4c2029fd4de0b595e98002c0be01fc1fbd3568671e394c97a6d52c3d4c113fb5", "spendableBalance": "2593800", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6BuPWhjLqutPV8SF4RMrrn8c3t7uBZbz4CBbThpbg9GYjqRMncra9mjgSfWSK7uMDz37hhzJ8wvkbDDQQJt6VgwLoszvmPiSBtLA1bPLLSn", }, @@ -13970,16 +13931,13 @@ exports[`bitcoin_gold currency bridge scanAccounts bitcoin_gold seed 1 1`] = ` "freshAddressPath": "49'/0'/0'/0/3", "id": "js:2:bitcoin_gold:xpub6CKb86o7RHSCxuwP5dnxyDySLbnVWypQUxhWpycFZWFTzXuXy3UgGtG3o51oGER6X2UY6zRqd5AXgzNghb9va1FkfzXz6k1RT6EwTwCKejE:segwit_unsplit", "index": 0, - "name": "Bitcoin Gold 1", "nfts": undefined, "operationsCount": 7, "pendingOperations": [], "seedIdentifier": "0412f62e549eee10ea7df9c9b1acfa6d77abb7424c057d7d725f418e2124dcd8662e21fde9e0b5a4cb731933a68ca406f6efcdadc8fb52afdb9ae422a68cfe5bde", "spendableBalance": "1757516", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6CKb86o7RHSCxuwP5dnxyDySLbnVWypQUxhWpycFZWFTzXuXy3UgGtG3o51oGER6X2UY6zRqd5AXgzNghb9va1FkfzXz6k1RT6EwTwCKejE", }, @@ -13992,16 +13950,13 @@ exports[`bitcoin_gold currency bridge scanAccounts bitcoin_gold seed 1 1`] = ` "freshAddressPath": "49'/156'/0'/0/5", "id": "js:2:bitcoin_gold:xpub6CtTgvCAvB8VFH5iab8qc8GcXAQ3qfBGEJkedBrEH414ND1mpFzp6PhQP5m74Uzqb4o51KnXYK6KEiL51XbrwYa6WE1jxzwuCQa7GV88MHa:segwit", "index": 0, - "name": "Bitcoin Gold 1", "nfts": undefined, "operationsCount": 13, "pendingOperations": [], "seedIdentifier": "04465a1e085f90dd90d6aaae53fe772371d8e8f60e93b68d4b5e4ebe345e8bcdd4adc5b0ffc9047859a33f3944220203bd093cf24e0dd22342b580c7f66c3971b0", "spendableBalance": "1805064", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6CtTgvCAvB8VFH5iab8qc8GcXAQ3qfBGEJkedBrEH414ND1mpFzp6PhQP5m74Uzqb4o51KnXYK6KEiL51XbrwYa6WE1jxzwuCQa7GV88MHa", }, @@ -14014,16 +13969,13 @@ exports[`bitcoin_gold currency bridge scanAccounts bitcoin_gold seed 1 1`] = ` "freshAddressPath": "49'/156'/1'/0/0", "id": "js:2:bitcoin_gold:xpub6CtTgvCAvB8VJZVpJsSueoPyDoWwXtQf1P49q3kTaSoCe6ELeGtyJVtQ9qikkuPyTUrm5MpN2yw2Muhyd2tWnazehh6616Gajsp4FqwsisA:segwit", "index": 1, - "name": "Bitcoin Gold 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04465a1e085f90dd90d6aaae53fe772371d8e8f60e93b68d4b5e4ebe345e8bcdd4adc5b0ffc9047859a33f3944220203bd093cf24e0dd22342b580c7f66c3971b0", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6CtTgvCAvB8VJZVpJsSueoPyDoWwXtQf1P49q3kTaSoCe6ELeGtyJVtQ9qikkuPyTUrm5MpN2yw2Muhyd2tWnazehh6616Gajsp4FqwsisA", }, @@ -14036,16 +13988,13 @@ exports[`bitcoin_gold currency bridge scanAccounts bitcoin_gold seed 1 1`] = ` "freshAddressPath": "44'/156'/0'/0/2", "id": "js:2:bitcoin_gold:xpub6C5kqm418Wut5RFaiKvcBznC1MC6oHi6G8RZ1xRVbQbNDSkpUTzkgZ9Z43RtC5ptHBV3AMqycVS2tHhmmxmqWorswc3796CMHTSCg5AJXnx:", "index": 0, - "name": "Bitcoin Gold 1", "nfts": undefined, "operationsCount": 4, "pendingOperations": [], "seedIdentifier": "04ff80c3dcdf1aa6c92a101510dd9b830718875670fb593a7dd399a2d52af4816142b2f9072f6b025bd95a2638ed76209eff811b9308c272daafed4cf262a54f5a", "spendableBalance": "568927", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6C5kqm418Wut5RFaiKvcBznC1MC6oHi6G8RZ1xRVbQbNDSkpUTzkgZ9Z43RtC5ptHBV3AMqycVS2tHhmmxmqWorswc3796CMHTSCg5AJXnx", }, @@ -14058,16 +14007,13 @@ exports[`bitcoin_gold currency bridge scanAccounts bitcoin_gold seed 1 1`] = ` "freshAddressPath": "44'/156'/1'/0/0", "id": "js:2:bitcoin_gold:xpub6C5kqm418Wut6kFDfmmLTnHvyBCLjJJYyvDmDJW8dzLVZ93Y9rWrjuUp4iecWCFUqLNiLF28awmMngyCQ7c4WywHsWKZ1VEbd66UP5uFTx6:", "index": 1, - "name": "Bitcoin Gold 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04ff80c3dcdf1aa6c92a101510dd9b830718875670fb593a7dd399a2d52af4816142b2f9072f6b025bd95a2638ed76209eff811b9308c272daafed4cf262a54f5a", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6C5kqm418Wut6kFDfmmLTnHvyBCLjJJYyvDmDJW8dzLVZ93Y9rWrjuUp4iecWCFUqLNiLF28awmMngyCQ7c4WywHsWKZ1VEbd66UP5uFTx6", }, @@ -14788,16 +14734,13 @@ exports[`dash currency bridge scanAccounts dash seed 1 1`] = ` "freshAddressPath": "44'/5'/0'/0/8", "id": "js:2:dash:drkvjRicQKXd21b4fiTjSfm4SMoVE5q6DhCopUQ4pBYU9WT1dTVSUHoF91sfFkfgR9MdXqiPGgpNV45VrGFrVfVGn8vH7jroquD34qyYuHbj6Dk:", "index": 0, - "name": "Dash 1", "nfts": undefined, "operationsCount": 21, "pendingOperations": [], "seedIdentifier": "04b86738cee704df2efcbe8da0c8021dd8bff53a2b95a4f5ca586cd8b26af2e79f7be8cb35b62bad7560807414d8e80363f917d1c3cd6d5d10f8c8df347a463c5c", "spendableBalance": "74296", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "drkvjRicQKXd21b4fiTjSfm4SMoVE5q6DhCopUQ4pBYU9WT1dTVSUHoF91sfFkfgR9MdXqiPGgpNV45VrGFrVfVGn8vH7jroquD34qyYuHbj6Dk", }, @@ -14810,16 +14753,13 @@ exports[`dash currency bridge scanAccounts dash seed 1 1`] = ` "freshAddressPath": "44'/5'/1'/0/12", "id": "js:2:dash:drkvjRicQKXd21b4iYXbeKjiBPLHQyqeriXcjUL6HxiLnMbLkC6w2teZTgxpjSv4tZ4gq5KrNan9c9aPtrkUhRF3aBQa4vr3WGy6z1WwQh5GB7W:", "index": 1, - "name": "Dash 2", "nfts": undefined, "operationsCount": 20, "pendingOperations": [], "seedIdentifier": "04b86738cee704df2efcbe8da0c8021dd8bff53a2b95a4f5ca586cd8b26af2e79f7be8cb35b62bad7560807414d8e80363f917d1c3cd6d5d10f8c8df347a463c5c", "spendableBalance": "349548", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "drkvjRicQKXd21b4iYXbeKjiBPLHQyqeriXcjUL6HxiLnMbLkC6w2teZTgxpjSv4tZ4gq5KrNan9c9aPtrkUhRF3aBQa4vr3WGy6z1WwQh5GB7W", }, @@ -14832,16 +14772,13 @@ exports[`dash currency bridge scanAccounts dash seed 1 1`] = ` "freshAddressPath": "44'/5'/2'/0/0", "id": "js:2:dash:drkvjRicQKXd21b4iybA3Ujpe4BxxrvMPEBs5W1vrHeGK4tFU6uZixaCzJ8Jq4C3yXdKmMnW45JvZ6nnuzSBevrtvh9GdRU6soFJhgGHBKtwboC:", "index": 2, - "name": "Dash 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04b86738cee704df2efcbe8da0c8021dd8bff53a2b95a4f5ca586cd8b26af2e79f7be8cb35b62bad7560807414d8e80363f917d1c3cd6d5d10f8c8df347a463c5c", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "drkvjRicQKXd21b4iybA3Ujpe4BxxrvMPEBs5W1vrHeGK4tFU6uZixaCzJ8Jq4C3yXdKmMnW45JvZ6nnuzSBevrtvh9GdRU6soFJhgGHBKtwboC", }, @@ -15832,16 +15769,13 @@ exports[`decred currency bridge scanAccounts decred seed 1 1`] = ` "freshAddressPath": "44'/42'/0'/0/50", "id": "js:2:decred:dpubZFDVCCdFkBeuZXSf8dL49fG3zb6vqnE7wLixKRiHpiCAirvNh53N28DAHmqybRLgCZMgVDgrFBrTqNZZJppZ8QgDqxY6vtD4aJ1nNjUYnhT:", "index": 0, - "name": "Decred 1", "nfts": undefined, "operationsCount": 102, "pendingOperations": [], "seedIdentifier": "045542c1076de9cc128a3cb5eed33d80a916072031a71ebe3c5b77b2a71adf44468e4b657ee017692092ef75f5b61c973e96aea5f6270caac8732d2ad226ffca14", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "dpubZFDVCCdFkBeuZXSf8dL49fG3zb6vqnE7wLixKRiHpiCAirvNh53N28DAHmqybRLgCZMgVDgrFBrTqNZZJppZ8QgDqxY6vtD4aJ1nNjUYnhT", }, @@ -15854,16 +15788,13 @@ exports[`decred currency bridge scanAccounts decred seed 1 1`] = ` "freshAddressPath": "44'/42'/1'/0/46", "id": "js:2:decred:dpubZFDVCCdFkBeubksrzFQXDzcn7nVB3uFKUAj17LfCijBm4SyCTPb2mbAbYqtrotmWjiZPigWTEePwzgXLUx1fT2UN6n5NfC2WtBPx7e3pAhN:", "index": 1, - "name": "Decred 2", "nfts": undefined, "operationsCount": 91, "pendingOperations": [], "seedIdentifier": "045542c1076de9cc128a3cb5eed33d80a916072031a71ebe3c5b77b2a71adf44468e4b657ee017692092ef75f5b61c973e96aea5f6270caac8732d2ad226ffca14", "spendableBalance": "619024", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "dpubZFDVCCdFkBeubksrzFQXDzcn7nVB3uFKUAj17LfCijBm4SyCTPb2mbAbYqtrotmWjiZPigWTEePwzgXLUx1fT2UN6n5NfC2WtBPx7e3pAhN", }, @@ -15876,16 +15807,13 @@ exports[`decred currency bridge scanAccounts decred seed 1 1`] = ` "freshAddressPath": "44'/42'/2'/0/4", "id": "js:2:decred:dpubZFDVCCdFkBeufRYVfDcs6YcRsGkepqD2uyJk8DDxhsjSo1TETDoxjqY9fdoYjBU2W93Sdxyy1vVj4vzJTiKuLBEAUSpPTDU1jVGoq1oX8f1:", "index": 2, - "name": "Decred 3", "nfts": undefined, "operationsCount": 13, "pendingOperations": [], "seedIdentifier": "045542c1076de9cc128a3cb5eed33d80a916072031a71ebe3c5b77b2a71adf44468e4b657ee017692092ef75f5b61c973e96aea5f6270caac8732d2ad226ffca14", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "dpubZFDVCCdFkBeufRYVfDcs6YcRsGkepqD2uyJk8DDxhsjSo1TETDoxjqY9fdoYjBU2W93Sdxyy1vVj4vzJTiKuLBEAUSpPTDU1jVGoq1oX8f1", }, @@ -15898,16 +15826,13 @@ exports[`decred currency bridge scanAccounts decred seed 1 1`] = ` "freshAddressPath": "44'/42'/3'/0/0", "id": "js:2:decred:dpubZFDVCCdFkBeufxc7PWg8o1L6oBJKRk7wUhNMLDDm1Pxg9D9eyCR3EB6kas2Uuqwx6236oauPDLQ5r5AwPS43Byt7UPbgeiZ2oxZ97sGmA6S:", "index": 3, - "name": "Decred 4", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "045542c1076de9cc128a3cb5eed33d80a916072031a71ebe3c5b77b2a71adf44468e4b657ee017692092ef75f5b61c973e96aea5f6270caac8732d2ad226ffca14", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "dpubZFDVCCdFkBeufxc7PWg8o1L6oBJKRk7wUhNMLDDm1Pxg9D9eyCR3EB6kas2Uuqwx6236oauPDLQ5r5AwPS43Byt7UPbgeiZ2oxZ97sGmA6S", }, @@ -20762,16 +20687,13 @@ exports[`digibyte currency bridge scanAccounts digibyte seed 1 1`] = ` "freshAddressPath": "84'/20'/0'/0/3", "id": "js:2:digibyte:xpub6CV98T6ompjUmKuMaULsw4UP8yfnVCg6831rWdcPjScn6RaGWrt3b7uvTpt9hcq6tLtS1dGNzeJ9x4NpVGzLq7CFscxCdoPZ6zxkqGymx98:native_segwit", "index": 0, - "name": "DigiByte 1", "nfts": undefined, "operationsCount": 8, "pendingOperations": [], "seedIdentifier": "044e2d9a5ef3b18f29447cd8583e9ced0d0ea56c70d1f4b78689b007428903be309e1c7b5ee9f1350b0a32812904d46269d520128a606ee0b2774aecb0370c4e52", "spendableBalance": "2302647120", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6CV98T6ompjUmKuMaULsw4UP8yfnVCg6831rWdcPjScn6RaGWrt3b7uvTpt9hcq6tLtS1dGNzeJ9x4NpVGzLq7CFscxCdoPZ6zxkqGymx98", }, @@ -20784,16 +20706,13 @@ exports[`digibyte currency bridge scanAccounts digibyte seed 1 1`] = ` "freshAddressPath": "84'/20'/1'/0/0", "id": "js:2:digibyte:xpub6CV98T6ompjUo2YMbNNwkK6t2xQ9ZMihM54xFopW9896ztmAA6haNfNFuFQY3JLrCmKUAdRbYn1sqUUN7aVSVBPRqCdYX9uoroNUWTLFUU1:native_segwit", "index": 1, - "name": "DigiByte 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "044e2d9a5ef3b18f29447cd8583e9ced0d0ea56c70d1f4b78689b007428903be309e1c7b5ee9f1350b0a32812904d46269d520128a606ee0b2774aecb0370c4e52", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6CV98T6ompjUo2YMbNNwkK6t2xQ9ZMihM54xFopW9896ztmAA6haNfNFuFQY3JLrCmKUAdRbYn1sqUUN7aVSVBPRqCdYX9uoroNUWTLFUU1", }, @@ -20806,16 +20725,13 @@ exports[`digibyte currency bridge scanAccounts digibyte seed 1 1`] = ` "freshAddressPath": "49'/20'/0'/0/20", "id": "js:2:digibyte:xpub6CU9cUEYPkHVCSCuHWM9g7TxhmXByzPJGU3k9W588wNearJ1xjPjS5PW3fkYUaYRHgkaFx352YQTyWwZD7qbR8yMaac6K8UeV9XjydgBnkv:segwit", "index": 0, - "name": "DigiByte 1", "nfts": undefined, "operationsCount": 35, "pendingOperations": [], "seedIdentifier": "04f5b072bf6220a4788ff43ee9b0b12bc18384bbf5348883f307ee5b3516ba50caaef64ab0635c753c0afebe4c1a8a3f318a427dbd3ac20a6bdce014ebe23a463b", "spendableBalance": "565825271", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6CU9cUEYPkHVCSCuHWM9g7TxhmXByzPJGU3k9W588wNearJ1xjPjS5PW3fkYUaYRHgkaFx352YQTyWwZD7qbR8yMaac6K8UeV9XjydgBnkv", }, @@ -20828,16 +20744,13 @@ exports[`digibyte currency bridge scanAccounts digibyte seed 1 1`] = ` "freshAddressPath": "49'/20'/1'/0/1", "id": "js:2:digibyte:xpub6CU9cUEYPkHVFw3jvQ3epUkHpqpN7NS9eFFbS57WynDvmzqcBtdAY5uvaLCS7QakFN7uJiQLWLZz56tPAwqQq8LFXqorVMgK9r4Ev2Sg2Eu:segwit", "index": 1, - "name": "DigiByte 2", "nfts": undefined, "operationsCount": 2, "pendingOperations": [], "seedIdentifier": "04f5b072bf6220a4788ff43ee9b0b12bc18384bbf5348883f307ee5b3516ba50caaef64ab0635c753c0afebe4c1a8a3f318a427dbd3ac20a6bdce014ebe23a463b", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6CU9cUEYPkHVFw3jvQ3epUkHpqpN7NS9eFFbS57WynDvmzqcBtdAY5uvaLCS7QakFN7uJiQLWLZz56tPAwqQq8LFXqorVMgK9r4Ev2Sg2Eu", }, @@ -20850,16 +20763,13 @@ exports[`digibyte currency bridge scanAccounts digibyte seed 1 1`] = ` "freshAddressPath": "49'/20'/2'/0/0", "id": "js:2:digibyte:xpub6CU9cUEYPkHVHnMTPxCWhA59f6GbHCrop6j1RXbZKFZg8ES9eCamW26rWEji2zmXhRBLc2xxTVcD7qxKHKe99XyWwn4udqDBeTzRysURXRR:segwit", "index": 2, - "name": "DigiByte 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04f5b072bf6220a4788ff43ee9b0b12bc18384bbf5348883f307ee5b3516ba50caaef64ab0635c753c0afebe4c1a8a3f318a427dbd3ac20a6bdce014ebe23a463b", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6CU9cUEYPkHVHnMTPxCWhA59f6GbHCrop6j1RXbZKFZg8ES9eCamW26rWEji2zmXhRBLc2xxTVcD7qxKHKe99XyWwn4udqDBeTzRysURXRR", }, @@ -20872,16 +20782,13 @@ exports[`digibyte currency bridge scanAccounts digibyte seed 1 1`] = ` "freshAddressPath": "44'/20'/0'/0/12", "id": "js:2:digibyte:xpub6DUeEdRmKaQSJnJBJURNcg4ss2fsjQvPFLkgQdmDsJ6aH9FJjurpgt3jxMbs2n3ctHsDYztMWiZ7H27wLRevnkFggwK8HVyKZf5Kij3PjuG:", "index": 0, - "name": "DigiByte 1", "nfts": undefined, "operationsCount": 28, "pendingOperations": [], "seedIdentifier": "04f84e496b260969a531d4f3a8d47ce995a27cd99c9d59f7955147f6310d23766dd3dfa64d18f8716b9ac9e977b9f14eb83d9a8470e9545796a8a210c9e0854cb6", "spendableBalance": "4818737648", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6DUeEdRmKaQSJnJBJURNcg4ss2fsjQvPFLkgQdmDsJ6aH9FJjurpgt3jxMbs2n3ctHsDYztMWiZ7H27wLRevnkFggwK8HVyKZf5Kij3PjuG", }, @@ -20894,16 +20801,13 @@ exports[`digibyte currency bridge scanAccounts digibyte seed 1 1`] = ` "freshAddressPath": "44'/20'/1'/0/0", "id": "js:2:digibyte:xpub6DUeEdRmKaQSNaZhYGoVZBaP42H4hCNdJTpQzFztxBiqfD1GMCds4v8LENpHYCTU1Am9NDVmswJkNrahKpQ24GTBugvqzCgk9aUNUEYMtFj:", "index": 1, - "name": "DigiByte 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04f84e496b260969a531d4f3a8d47ce995a27cd99c9d59f7955147f6310d23766dd3dfa64d18f8716b9ac9e977b9f14eb83d9a8470e9545796a8a210c9e0854cb6", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6DUeEdRmKaQSNaZhYGoVZBaP42H4hCNdJTpQzFztxBiqfD1GMCds4v8LENpHYCTU1Am9NDVmswJkNrahKpQ24GTBugvqzCgk9aUNUEYMtFj", }, @@ -22641,16 +22545,13 @@ exports[`dogecoin currency bridge scanAccounts dogecoin seed 1 1`] = ` "freshAddressPath": "44'/3'/0'/0/7", "id": "js:2:dogecoin:dgub8rBqrhN2grbuDNuFBCu9u9KQKgQmkKaa15Yvnf4YznmvqFZByDPJypigogDKanefhrjj129Ek1W13zvtyQSD6HDpzxyskJvU6xmhD29S9eF:", "index": 0, - "name": "Dogecoin 1", "nfts": undefined, "operationsCount": 14, "pendingOperations": [], "seedIdentifier": "0416cc9a6e8e778fb11883b788f886766aecf972f34e10350e394d3dddf90b2d2297487eed3c0d53289c95d61616f258e76a8bb9f17cfef6512d390b90424ab8ab", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "dgub8rBqrhN2grbuDNuFBCu9u9KQKgQmkKaa15Yvnf4YznmvqFZByDPJypigogDKanefhrjj129Ek1W13zvtyQSD6HDpzxyskJvU6xmhD29S9eF", }, @@ -22663,16 +22564,13 @@ exports[`dogecoin currency bridge scanAccounts dogecoin seed 1 1`] = ` "freshAddressPath": "44'/3'/1'/0/5", "id": "js:2:dogecoin:dgub8rBqrhN2grbuFeMR47KiFwZWqV6A6kmKQ5F73eKwpLqT8Wmj7P4gmuAUbEHJxVr5qkfaUN2kmYsD4pPTQbkUtTqk7dtpGcWWTLC7F1ACS1u:", "index": 1, - "name": "Dogecoin 2", "nfts": undefined, "operationsCount": 11, "pendingOperations": [], "seedIdentifier": "0416cc9a6e8e778fb11883b788f886766aecf972f34e10350e394d3dddf90b2d2297487eed3c0d53289c95d61616f258e76a8bb9f17cfef6512d390b90424ab8ab", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "dgub8rBqrhN2grbuFeMR47KiFwZWqV6A6kmKQ5F73eKwpLqT8Wmj7P4gmuAUbEHJxVr5qkfaUN2kmYsD4pPTQbkUtTqk7dtpGcWWTLC7F1ACS1u", }, @@ -22685,16 +22583,13 @@ exports[`dogecoin currency bridge scanAccounts dogecoin seed 1 1`] = ` "freshAddressPath": "44'/3'/2'/0/0", "id": "js:2:dogecoin:dgub8rBqrhN2grbuGtVSoWKrKi97gHrA1eV6XQtR9AKFgG2BP3pQ12ncpkTBPmKGSU7xTd28RpYZFkUryG9PBFStcdCuHVCtAfLmi8NhTF8PRGY:", "index": 2, - "name": "Dogecoin 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "0416cc9a6e8e778fb11883b788f886766aecf972f34e10350e394d3dddf90b2d2297487eed3c0d53289c95d61616f258e76a8bb9f17cfef6512d390b90424ab8ab", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "dgub8rBqrhN2grbuGtVSoWKrKi97gHrA1eV6XQtR9AKFgG2BP3pQ12ncpkTBPmKGSU7xTd28RpYZFkUryG9PBFStcdCuHVCtAfLmi8NhTF8PRGY", }, @@ -23327,16 +23222,13 @@ exports[`litecoin currency bridge scanAccounts litecoin seed 1 1`] = ` "freshAddressPath": "84'/2'/0'/0/3", "id": "js:2:litecoin:Ltub2ZDyeYFtDj5kHy4w5WaXBDE9217rNDYfmv7u5NV8dk8vKdmkqAfPdwRma5rkPcj5daMU8JiiLXQYPX9rtqEzrK1YrmkofcpADTV7s5FgzLF:native_segwit", "index": 0, - "name": "Litecoin 1", "nfts": undefined, "operationsCount": 9, "pendingOperations": [], "seedIdentifier": "045e6b1f8055c0b1b54e35cfe61793cdf492d153ecd4184f16e0d50286750b78940bd4bf3f55072bd3c5f665b106979b562e4f55d5c19dafac72022bb9e869c506", "spendableBalance": "2183515", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "Ltub2ZDyeYFtDj5kHy4w5WaXBDE9217rNDYfmv7u5NV8dk8vKdmkqAfPdwRma5rkPcj5daMU8JiiLXQYPX9rtqEzrK1YrmkofcpADTV7s5FgzLF", }, @@ -23349,16 +23241,13 @@ exports[`litecoin currency bridge scanAccounts litecoin seed 1 1`] = ` "freshAddressPath": "84'/2'/1'/0/0", "id": "js:2:litecoin:Ltub2ZDyeYFtDj5kL5kYEcBGiDwhXQtZNefG3k4XvAtoMfD5cHxa93WMr6zLGnLb11LCgUXpxWTZRVPv2Roh2vdxesTpgFYayeNNVJb7wmCfD3x:native_segwit", "index": 1, - "name": "Litecoin 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "045e6b1f8055c0b1b54e35cfe61793cdf492d153ecd4184f16e0d50286750b78940bd4bf3f55072bd3c5f665b106979b562e4f55d5c19dafac72022bb9e869c506", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "Ltub2ZDyeYFtDj5kL5kYEcBGiDwhXQtZNefG3k4XvAtoMfD5cHxa93WMr6zLGnLb11LCgUXpxWTZRVPv2Roh2vdxesTpgFYayeNNVJb7wmCfD3x", }, @@ -23371,16 +23260,13 @@ exports[`litecoin currency bridge scanAccounts litecoin seed 1 1`] = ` "freshAddressPath": "49'/2'/0'/0/24", "id": "js:2:litecoin:Ltub2ZoEDG8AmPfD8oGoFEvfsKWjeyiXh6TiKYjgLnoVxfeECfQteY6sDF1AuH1iW6ekue2PSwdbbvG2NpFPzLqcgNgteHZPNo6zGthjcAmwxT3:segwit", "index": 0, - "name": "Litecoin 1", "nfts": undefined, "operationsCount": 49, "pendingOperations": [], "seedIdentifier": "04921553e9c4ff6ef39e98f2e8a7719d76e6ecdc67cbb65dcdfd4d04b7e0386524daf087032c6a2ab4280d343d8f4d086e1ef78d9acc1e2464282feb75abf624aa", "spendableBalance": "462167", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "Ltub2ZoEDG8AmPfD8oGoFEvfsKWjeyiXh6TiKYjgLnoVxfeECfQteY6sDF1AuH1iW6ekue2PSwdbbvG2NpFPzLqcgNgteHZPNo6zGthjcAmwxT3", }, @@ -23393,16 +23279,13 @@ exports[`litecoin currency bridge scanAccounts litecoin seed 1 1`] = ` "freshAddressPath": "49'/2'/1'/0/1", "id": "js:2:litecoin:Ltub2ZoEDG8AmPfDAyu3yK2WfA9zE8VgL3E3nNjnS5VRYAo7LfrrEmaCUYqWP8tgo6vNWc7dsr3kDykaX7yDpkAN93RWorZG6tekiyNpBNtFJhc:segwit", "index": 1, - "name": "Litecoin 2", "nfts": undefined, "operationsCount": 2, "pendingOperations": [], "seedIdentifier": "04921553e9c4ff6ef39e98f2e8a7719d76e6ecdc67cbb65dcdfd4d04b7e0386524daf087032c6a2ab4280d343d8f4d086e1ef78d9acc1e2464282feb75abf624aa", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "Ltub2ZoEDG8AmPfDAyu3yK2WfA9zE8VgL3E3nNjnS5VRYAo7LfrrEmaCUYqWP8tgo6vNWc7dsr3kDykaX7yDpkAN93RWorZG6tekiyNpBNtFJhc", }, @@ -23415,16 +23298,13 @@ exports[`litecoin currency bridge scanAccounts litecoin seed 1 1`] = ` "freshAddressPath": "49'/2'/2'/0/0", "id": "js:2:litecoin:Ltub2ZoEDG8AmPfDCKLYi3GHWexWa26tL5G4QvPkYgdRNKFKLsDe1i3rzjSZiBYDpYnkgQn9T8GRRJTXF8rdG6NXyWR9wTzATChRQbixYxnjKBg:segwit", "index": 2, - "name": "Litecoin 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04921553e9c4ff6ef39e98f2e8a7719d76e6ecdc67cbb65dcdfd4d04b7e0386524daf087032c6a2ab4280d343d8f4d086e1ef78d9acc1e2464282feb75abf624aa", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "Ltub2ZoEDG8AmPfDCKLYi3GHWexWa26tL5G4QvPkYgdRNKFKLsDe1i3rzjSZiBYDpYnkgQn9T8GRRJTXF8rdG6NXyWR9wTzATChRQbixYxnjKBg", }, @@ -23437,16 +23317,13 @@ exports[`litecoin currency bridge scanAccounts litecoin seed 1 1`] = ` "freshAddressPath": "44'/2'/0'/0/15", "id": "js:2:litecoin:Ltub2YRPRjnvZVoBBbfDrEV3jJdGQCTMHgKg1V1mnAZuQbbSY6XPhufcRTpoGB4595dUuW1GSDy6CApUYmCfwA4YjG5JWrAFd4GBR1WRJ8Jm6cM:", "index": 0, - "name": "Litecoin 1", "nfts": undefined, "operationsCount": 31, "pendingOperations": [], "seedIdentifier": "04fb4805746848cbf5abdf143659a6ceb5ed0f894bd2a0a76a881b03e2f9be00d910c746046fdd40c1ad48b6b0479c4410248f6d3d625793865e13ff3f9bcc861f", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "Ltub2YRPRjnvZVoBBbfDrEV3jJdGQCTMHgKg1V1mnAZuQbbSY6XPhufcRTpoGB4595dUuW1GSDy6CApUYmCfwA4YjG5JWrAFd4GBR1WRJ8Jm6cM", }, @@ -23459,16 +23336,13 @@ exports[`litecoin currency bridge scanAccounts litecoin seed 1 1`] = ` "freshAddressPath": "44'/2'/1'/0/0", "id": "js:2:litecoin:Ltub2YRPRjnvZVoBD5RZpkoyuuiSPJdHS8jeDksZHPtt5RraJFHLDSRdobd1gfBrPKZHx1Nag5nUBuuA95LkNMXbZ6fnFHCotsewEdqccigYadD:", "index": 1, - "name": "Litecoin 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04fb4805746848cbf5abdf143659a6ceb5ed0f894bd2a0a76a881b03e2f9be00d910c746046fdd40c1ad48b6b0479c4410248f6d3d625793865e13ff3f9bcc861f", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "Ltub2YRPRjnvZVoBD5RZpkoyuuiSPJdHS8jeDksZHPtt5RraJFHLDSRdobd1gfBrPKZHx1Nag5nUBuuA95LkNMXbZ6fnFHCotsewEdqccigYadD", }, @@ -25627,16 +25501,13 @@ exports[`peercoin currency bridge scanAccounts peercoin seed 1 1`] = ` "freshAddressPath": "44'/6'/0'/0/1", "id": "js:2:peercoin:r29uBq4dqT4ZLPtkuN51ASxXHAuSmY4QEqvYKPjj8kBNvdpcc4wRvhTPDoLmUj1qx1UbwS32DgsKkRPdgjrwNdWrHiSDjH7hBeqiEmGi79xEZNBt:", "index": 0, - "name": "Peercoin 1", "nfts": undefined, "operationsCount": 3, "pendingOperations": [], "seedIdentifier": "04bf3614e4ebe909f34b3b87cf41e63647dd1266704fcbf28f7037836c129962fdc6ead43b3811ec109d710415f7cb2260e542ee8711776512fe22979e629bea5b", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "r29uBq4dqT4ZLPtkuN51ASxXHAuSmY4QEqvYKPjj8kBNvdpcc4wRvhTPDoLmUj1qx1UbwS32DgsKkRPdgjrwNdWrHiSDjH7hBeqiEmGi79xEZNBt", }, @@ -25649,16 +25520,13 @@ exports[`peercoin currency bridge scanAccounts peercoin seed 1 1`] = ` "freshAddressPath": "44'/6'/1'/0/3", "id": "js:2:peercoin:r29uBq4dqT4ZLPtkuP4N8ms3jx8ts6zcfHMNNZUJhMqo1DgJpWSfFiwYwZb3uQYaHya6LSWNfALUxQwdFw3ZZEoB2DCKYK2QqBp5VbaZbo9FHbbv:", "index": 1, - "name": "Peercoin 2", "nfts": undefined, "operationsCount": 5, "pendingOperations": [], "seedIdentifier": "04bf3614e4ebe909f34b3b87cf41e63647dd1266704fcbf28f7037836c129962fdc6ead43b3811ec109d710415f7cb2260e542ee8711776512fe22979e629bea5b", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "r29uBq4dqT4ZLPtkuP4N8ms3jx8ts6zcfHMNNZUJhMqo1DgJpWSfFiwYwZb3uQYaHya6LSWNfALUxQwdFw3ZZEoB2DCKYK2QqBp5VbaZbo9FHbbv", }, @@ -25671,16 +25539,13 @@ exports[`peercoin currency bridge scanAccounts peercoin seed 1 1`] = ` "freshAddressPath": "44'/6'/2'/0/0", "id": "js:2:peercoin:r29uBq4dqT4ZLPtkuRYpvqYJ7Uri474wVJSGfCBycWK88JbhoE31jzYQrxa4re5gRRjdK52fYte1wR6Gjo3KsnMGk1JNqELQoema8GaWRcX4Tp3c:", "index": 2, - "name": "Peercoin 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04bf3614e4ebe909f34b3b87cf41e63647dd1266704fcbf28f7037836c129962fdc6ead43b3811ec109d710415f7cb2260e542ee8711776512fe22979e629bea5b", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "r29uBq4dqT4ZLPtkuRYpvqYJ7Uri474wVJSGfCBycWK88JbhoE31jzYQrxa4re5gRRjdK52fYte1wR6Gjo3KsnMGk1JNqELQoema8GaWRcX4Tp3c", }, @@ -25893,16 +25758,13 @@ exports[`pivx currency bridge scanAccounts pivx seed 1 1`] = ` "freshAddressPath": "44'/77'/0'/0/2", "id": "js:2:pivx:ToEA6kbZp37Q14yj3MBi989NwAtYpRezRAveGjoQtrBNenh5w5D8AAU3pQFHk3bd7YRXgQ86JoXBZHm8voQeCNJX4ETH7WdGGcfD35CsCEgQjih:", "index": 0, - "name": "PivX 1", "nfts": undefined, "operationsCount": 7, "pendingOperations": [], "seedIdentifier": "0416e1de49a4dd716985e2992bfaad4e7db30a6adbf63dafbd6607e447ce9f782771ef9f6790fafb1bfd15f72c5e8988825660426546152e15b578d160128e6238", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "ToEA6kbZp37Q14yj3MBi989NwAtYpRezRAveGjoQtrBNenh5w5D8AAU3pQFHk3bd7YRXgQ86JoXBZHm8voQeCNJX4ETH7WdGGcfD35CsCEgQjih", }, @@ -25915,16 +25777,13 @@ exports[`pivx currency bridge scanAccounts pivx seed 1 1`] = ` "freshAddressPath": "44'/77'/1'/0/5", "id": "js:2:pivx:ToEA6kbZp37Q14yj58Etmammo9PZzJApeRsUnjSqri7fugNHm29Z8XHyhs1qePUKDUkrBD51sAwqD6HjFx3Z81S4djrYPrxKJssLrekhh2j2rpT:", "index": 1, - "name": "PivX 2", "nfts": undefined, "operationsCount": 9, "pendingOperations": [], "seedIdentifier": "0416e1de49a4dd716985e2992bfaad4e7db30a6adbf63dafbd6607e447ce9f782771ef9f6790fafb1bfd15f72c5e8988825660426546152e15b578d160128e6238", "spendableBalance": "25947828", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "ToEA6kbZp37Q14yj58Etmammo9PZzJApeRsUnjSqri7fugNHm29Z8XHyhs1qePUKDUkrBD51sAwqD6HjFx3Z81S4djrYPrxKJssLrekhh2j2rpT", }, @@ -25937,16 +25796,13 @@ exports[`pivx currency bridge scanAccounts pivx seed 1 1`] = ` "freshAddressPath": "44'/77'/2'/0/0", "id": "js:2:pivx:ToEA6kbZp37Q14yj8uQJcgxNYNLfh77mCkRc5WYNKnFXz9F7ioREkssDvZtYm6haAQc3xEgMhTLT6TMHKzEVX4HLudaACbipsLTvnthw2KUUhTf:", "index": 2, - "name": "PivX 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "0416e1de49a4dd716985e2992bfaad4e7db30a6adbf63dafbd6607e447ce9f782771ef9f6790fafb1bfd15f72c5e8988825660426546152e15b578d160128e6238", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "ToEA6kbZp37Q14yj8uQJcgxNYNLfh77mCkRc5WYNKnFXz9F7ioREkssDvZtYm6haAQc3xEgMhTLT6TMHKzEVX4HLudaACbipsLTvnthw2KUUhTf", }, @@ -26342,16 +26198,13 @@ exports[`vertcoin currency bridge scanAccounts vertcoin seed 1 1`] = ` "freshAddressPath": "44'/128'/0'/0/1", "id": "js:2:vertcoin:xpub6CcxPiPTCZz31AAqNayf5M4yJWGwe3LCsLASDyDVvVaorfjibtEDaRGA2vRDCr9XwD7zF2KyDuru2MxsbzzqoEHdvQpqGAKQhRY9jCGLu3a:vertcoin_128", "index": 0, - "name": "Vertcoin 1", "nfts": undefined, "operationsCount": 3, "pendingOperations": [], "seedIdentifier": "044ed2023877af4e78c1feb9b9ff41288d7e1e5f3750e6361375c1c63618403066170a15bde45e3944cca9d627ce952dc2b8fb3f8f29c67da2d21d85a40fd40fe5", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6CcxPiPTCZz31AAqNayf5M4yJWGwe3LCsLASDyDVvVaorfjibtEDaRGA2vRDCr9XwD7zF2KyDuru2MxsbzzqoEHdvQpqGAKQhRY9jCGLu3a", }, @@ -26364,16 +26217,13 @@ exports[`vertcoin currency bridge scanAccounts vertcoin seed 1 1`] = ` "freshAddressPath": "49'/128'/0'/0/4", "id": "js:2:vertcoin:xpub6C1k89xbMPhSU8SLMTtcf8nbyZ3aEer86VnXNVZLkczoRKvfvLcA2Hp8gBJWZSM8UaDYaEpyxN1hqseTJ99tXt4QPxKPNNpVucgrjWPhMbj:vertcoin_128_segwit", "index": 0, - "name": "Vertcoin 1", "nfts": undefined, "operationsCount": 8, "pendingOperations": [], "seedIdentifier": "0483b492356288cef587aea8b998e4fe5555d61589702d3d54a6f38d63c41cd3751ff7a14539160baed80a8b11350511d9f74b342d62bc443b3bca4d5bd8398c45", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6C1k89xbMPhSU8SLMTtcf8nbyZ3aEer86VnXNVZLkczoRKvfvLcA2Hp8gBJWZSM8UaDYaEpyxN1hqseTJ99tXt4QPxKPNNpVucgrjWPhMbj", }, @@ -26386,16 +26236,13 @@ exports[`vertcoin currency bridge scanAccounts vertcoin seed 1 1`] = ` "freshAddressPath": "49'/28'/0'/0/2", "id": "js:2:vertcoin:xpub6Cvus6TFyZpqAXyw3PZchE4e6aotv5DpG2JzSUgrAaWq568T6E68CitHvAoGS7P2ey5n6D92brXCdeMFU6YZyhypZYiMddGFgWe7ovwxNAK:segwit", "index": 0, - "name": "Vertcoin 1", "nfts": undefined, "operationsCount": 4, "pendingOperations": [], "seedIdentifier": "0483b492356288cef587aea8b998e4fe5555d61589702d3d54a6f38d63c41cd3751ff7a14539160baed80a8b11350511d9f74b342d62bc443b3bca4d5bd8398c45", "spendableBalance": "56611532", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6Cvus6TFyZpqAXyw3PZchE4e6aotv5DpG2JzSUgrAaWq568T6E68CitHvAoGS7P2ey5n6D92brXCdeMFU6YZyhypZYiMddGFgWe7ovwxNAK", }, @@ -26408,16 +26255,13 @@ exports[`vertcoin currency bridge scanAccounts vertcoin seed 1 1`] = ` "freshAddressPath": "49'/28'/1'/0/0", "id": "js:2:vertcoin:xpub6Cvus6TFyZpqBdZMUVoDaX8aVh3jok6tNKLmyf9sYg1TByCEHNwWPzRwLmssQ6reLV1aZaKQv9XL3KQ9ery6SBcppNdAvqGh72dF1AdYQso:segwit", "index": 1, - "name": "Vertcoin 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "0483b492356288cef587aea8b998e4fe5555d61589702d3d54a6f38d63c41cd3751ff7a14539160baed80a8b11350511d9f74b342d62bc443b3bca4d5bd8398c45", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6Cvus6TFyZpqBdZMUVoDaX8aVh3jok6tNKLmyf9sYg1TByCEHNwWPzRwLmssQ6reLV1aZaKQv9XL3KQ9ery6SBcppNdAvqGh72dF1AdYQso", }, @@ -26430,16 +26274,13 @@ exports[`vertcoin currency bridge scanAccounts vertcoin seed 1 1`] = ` "freshAddressPath": "44'/28'/0'/0/4", "id": "js:2:vertcoin:xpub6BgVHiD3Go6yH6fBUXQfHHdBsb6Xkm5XswQid7ZF5xhh3udDP7MKUKBpREoLJt7dkwcvpPGo3h5DkCqsjVCZvPTkeRgxJRmab3bpv9k15pc:", "index": 0, - "name": "Vertcoin 1", "nfts": undefined, "operationsCount": 8, "pendingOperations": [], "seedIdentifier": "044ed2023877af4e78c1feb9b9ff41288d7e1e5f3750e6361375c1c63618403066170a15bde45e3944cca9d627ce952dc2b8fb3f8f29c67da2d21d85a40fd40fe5", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6BgVHiD3Go6yH6fBUXQfHHdBsb6Xkm5XswQid7ZF5xhh3udDP7MKUKBpREoLJt7dkwcvpPGo3h5DkCqsjVCZvPTkeRgxJRmab3bpv9k15pc", }, @@ -26452,16 +26293,13 @@ exports[`vertcoin currency bridge scanAccounts vertcoin seed 1 1`] = ` "freshAddressPath": "44'/28'/1'/0/0", "id": "js:2:vertcoin:xpub6BgVHiD3Go6yLzjPsBg2M1VwwK6CTvgGQV1DCWVZ9sCiK63bkaio7EYnEEqyfqEH2uq8V99TWbrc7zXNgy3ju5N6XDN2GHrbHnDhBGpD9hJ:", "index": 1, - "name": "Vertcoin 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "044ed2023877af4e78c1feb9b9ff41288d7e1e5f3750e6361375c1c63618403066170a15bde45e3944cca9d627ce952dc2b8fb3f8f29c67da2d21d85a40fd40fe5", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6BgVHiD3Go6yLzjPsBg2M1VwwK6CTvgGQV1DCWVZ9sCiK63bkaio7EYnEEqyfqEH2uq8V99TWbrc7zXNgy3ju5N6XDN2GHrbHnDhBGpD9hJ", }, @@ -27023,16 +26861,13 @@ exports[`viacoin currency bridge scanAccounts viacoin seed 1 1`] = ` "freshAddressPath": "49'/14'/0'/0/4", "id": "js:2:viacoin:xpub6DXFhSSckkAXA8y3fxCxv6TW7PhTubEk5r9UoXiJJEbzzhDjWaH8qxEDED9nA751pz3iAPc1HVXe8LpiotsqUfDRvf8JiQdEewFtyNyR6Vz:segwit", "index": 0, - "name": "Viacoin 1", "nfts": undefined, "operationsCount": 10, "pendingOperations": [], "seedIdentifier": "0480b2ebd31e9aecc021c6c2e9d924723dc807cd6b7c14fbedf9a1c866d16535df797f6140170f8e09b03b285d1cf1dd5e859063c348913453beaefce77c73cdd6", "spendableBalance": "61117791", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6DXFhSSckkAXA8y3fxCxv6TW7PhTubEk5r9UoXiJJEbzzhDjWaH8qxEDED9nA751pz3iAPc1HVXe8LpiotsqUfDRvf8JiQdEewFtyNyR6Vz", }, @@ -27045,16 +26880,13 @@ exports[`viacoin currency bridge scanAccounts viacoin seed 1 1`] = ` "freshAddressPath": "49'/14'/1'/0/0", "id": "js:2:viacoin:xpub6DXFhSSckkAXEDj2tdsRZ9hffq6BkcyJM8zCeZ6zA4S71pqnUZCKWFNnzWMuQ7iYNFkDB3aSJnh5CQCRD26iFZfDs8zo1bnU6MVtYxNxSdd:segwit", "index": 1, - "name": "Viacoin 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "0480b2ebd31e9aecc021c6c2e9d924723dc807cd6b7c14fbedf9a1c866d16535df797f6140170f8e09b03b285d1cf1dd5e859063c348913453beaefce77c73cdd6", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6DXFhSSckkAXEDj2tdsRZ9hffq6BkcyJM8zCeZ6zA4S71pqnUZCKWFNnzWMuQ7iYNFkDB3aSJnh5CQCRD26iFZfDs8zo1bnU6MVtYxNxSdd", }, @@ -27067,16 +26899,13 @@ exports[`viacoin currency bridge scanAccounts viacoin seed 1 1`] = ` "freshAddressPath": "44'/14'/0'/0/5", "id": "js:2:viacoin:xpub6BvPb5yXV4aMKokGgameLTA36UzHykjCZo5Vcrmr2PFxutPhvfbzkr6LpD6vXkm5A611mYA2m4TnZYHHSZjxRZsadDCXfwDqxc3d7BZTqwW:", "index": 0, - "name": "Viacoin 1", "nfts": undefined, "operationsCount": 9, "pendingOperations": [], "seedIdentifier": "042ee7221d7491590252b2dab2f9d47b58f6a7ff0ee53ddc17c07e51934fd4055afd3ead3a97047d97992963a7d238da72ac0d0de1ac222c07efd8a3be8ee9e4fe", "spendableBalance": "43399898", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6BvPb5yXV4aMKokGgameLTA36UzHykjCZo5Vcrmr2PFxutPhvfbzkr6LpD6vXkm5A611mYA2m4TnZYHHSZjxRZsadDCXfwDqxc3d7BZTqwW", }, @@ -27089,16 +26918,13 @@ exports[`viacoin currency bridge scanAccounts viacoin seed 1 1`] = ` "freshAddressPath": "44'/14'/1'/0/0", "id": "js:2:viacoin:xpub6BvPb5yXV4aMNvoWDVF2SNqbhYN3puWm9PCwbEF4XxgnkSnHxfiHTEfy76u8atjEvcGwMxqpTE5rjYw3c3nxF44Nvok8XskpBEJyTfVXxip:", "index": 1, - "name": "Viacoin 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "042ee7221d7491590252b2dab2f9d47b58f6a7ff0ee53ddc17c07e51934fd4055afd3ead3a97047d97992963a7d238da72ac0d0de1ac222c07efd8a3be8ee9e4fe", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6BvPb5yXV4aMNvoWDVF2SNqbhYN3puWm9PCwbEF4XxgnkSnHxfiHTEfy76u8atjEvcGwMxqpTE5rjYw3c3nxF44Nvok8XskpBEJyTfVXxip", }, @@ -27567,16 +27393,13 @@ exports[`zcash currency bridge scanAccounts zcash seed 1 1`] = ` "freshAddressPath": "44'/133'/0'/0/53", "id": "js:2:zcash:xpub6DXuLL97nvCs14Ashf3u8N2X9BLBpxN3HKCQWnLzn61o6CqME3Jm1hZ6oBeXcMhkqGDaziTGmw19w5iRstuXJrKLX6khbDt1rEatozTkf97:", "index": 0, - "name": "Zcash 1", "nfts": undefined, "operationsCount": 79, "pendingOperations": [], "seedIdentifier": "04c29da5bfbd318cb28878340d4961a999d323d865bfa72d203356544972d63d9c208d0d55e9f1538d34e89be3d08433d2632dcb8b4351e2fcd29ea0158619301f", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6DXuLL97nvCs14Ashf3u8N2X9BLBpxN3HKCQWnLzn61o6CqME3Jm1hZ6oBeXcMhkqGDaziTGmw19w5iRstuXJrKLX6khbDt1rEatozTkf97", }, @@ -27589,16 +27412,13 @@ exports[`zcash currency bridge scanAccounts zcash seed 1 1`] = ` "freshAddressPath": "44'/133'/1'/0/15", "id": "js:2:zcash:xpub6DXuLL97nvCs4QQNEeUwxH6Y5tSVhSEPcdnQ3K2pa8CfnbZuHcpeZovTSMu6jdj6JV9piQyVsHoNSYuP8MijXdYKHGFYvPoLLy3Ddrv5MPi:", "index": 1, - "name": "Zcash 2", "nfts": undefined, "operationsCount": 52, "pendingOperations": [], "seedIdentifier": "04c29da5bfbd318cb28878340d4961a999d323d865bfa72d203356544972d63d9c208d0d55e9f1538d34e89be3d08433d2632dcb8b4351e2fcd29ea0158619301f", "spendableBalance": "192412", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6DXuLL97nvCs4QQNEeUwxH6Y5tSVhSEPcdnQ3K2pa8CfnbZuHcpeZovTSMu6jdj6JV9piQyVsHoNSYuP8MijXdYKHGFYvPoLLy3Ddrv5MPi", }, @@ -27611,16 +27431,13 @@ exports[`zcash currency bridge scanAccounts zcash seed 1 1`] = ` "freshAddressPath": "44'/133'/2'/0/13", "id": "js:2:zcash:xpub6DXuLL97nvCs4gn5uhL5hngT77sZRgrPKE1wDzxtN73mcmTQKFnHb2yAahvnoT3QCeSzxakpFMGxxY9d4ozgAKWzGtK31VP3v2vciXyVtEP:", "index": 2, - "name": "Zcash 3", "nfts": undefined, "operationsCount": 32, "pendingOperations": [], "seedIdentifier": "04c29da5bfbd318cb28878340d4961a999d323d865bfa72d203356544972d63d9c208d0d55e9f1538d34e89be3d08433d2632dcb8b4351e2fcd29ea0158619301f", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6DXuLL97nvCs4gn5uhL5hngT77sZRgrPKE1wDzxtN73mcmTQKFnHb2yAahvnoT3QCeSzxakpFMGxxY9d4ozgAKWzGtK31VP3v2vciXyVtEP", }, @@ -27633,16 +27450,13 @@ exports[`zcash currency bridge scanAccounts zcash seed 1 1`] = ` "freshAddressPath": "44'/133'/3'/0/0", "id": "js:2:zcash:xpub6DXuLL97nvCs84Bu7dzut6oWXsSADKfHtoBvHQqpejzzfEy8TMu5WNuzz6bdhcjY3u8B4noZTkDho8wue49P6HogYitm64dyQpLJti8aEDb:", "index": 3, - "name": "Zcash 4", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04c29da5bfbd318cb28878340d4961a999d323d865bfa72d203356544972d63d9c208d0d55e9f1538d34e89be3d08433d2632dcb8b4351e2fcd29ea0158619301f", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6DXuLL97nvCs84Bu7dzut6oWXsSADKfHtoBvHQqpejzzfEy8TMu5WNuzz6bdhcjY3u8B4noZTkDho8wue49P6HogYitm64dyQpLJti8aEDb", }, @@ -31487,16 +31301,13 @@ exports[`zencash currency bridge scanAccounts zencash seed 1 1`] = ` "freshAddressPath": "44'/121'/0'/0/71", "id": "js:2:zencash:xpub6D5t3ggLE75WLn8cMhJ6V5tdZsT5ixJDjoYrERnYgkjXe5f2qqBBsjCLJ4ktGeorZBrSwQZ6tRqmmu9CM5fpi6S7n1T6VMxitE4LnXBStue:", "index": 0, - "name": "Horizen 1", "nfts": undefined, "operationsCount": 130, "pendingOperations": [], "seedIdentifier": "04ecf3eb0c3454436fd414da75eafad95896209052eef81b06860cc6c14731963e63ae744577e35b51d4e40ebb4366e59e2a20f571384384bfcb804444db6a83d7", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6D5t3ggLE75WLn8cMhJ6V5tdZsT5ixJDjoYrERnYgkjXe5f2qqBBsjCLJ4ktGeorZBrSwQZ6tRqmmu9CM5fpi6S7n1T6VMxitE4LnXBStue", }, @@ -31509,16 +31320,13 @@ exports[`zencash currency bridge scanAccounts zencash seed 1 1`] = ` "freshAddressPath": "44'/121'/1'/0/57", "id": "js:2:zencash:xpub6D5t3ggLE75WMZywf9sHZtBZcgdQTvVorb4U6YiYBSZrWiPZsB7JjjyMfyM7KiSQMwc87BLZSi8wXgoRvMZHVACMF7CBE3B77NN314ZKWuA:", "index": 1, - "name": "Horizen 2", "nfts": undefined, "operationsCount": 128, "pendingOperations": [], "seedIdentifier": "04ecf3eb0c3454436fd414da75eafad95896209052eef81b06860cc6c14731963e63ae744577e35b51d4e40ebb4366e59e2a20f571384384bfcb804444db6a83d7", "spendableBalance": "3021049", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "xpub6D5t3ggLE75WMZywf9sHZtBZcgdQTvVorb4U6YiYBSZrWiPZsB7JjjyMfyM7KiSQMwc87BLZSi8wXgoRvMZHVACMF7CBE3B77NN314ZKWuA", }, @@ -31531,16 +31339,13 @@ exports[`zencash currency bridge scanAccounts zencash seed 1 1`] = ` "freshAddressPath": "44'/121'/2'/0/0", "id": "js:2:zencash:xpub6D5t3ggLE75WQGWU8XaFEiYXbgQFJD3u6eyN1Yb7gcRu4Gan7uKEwqaCBoRhFs73nN1Kf51D5W7kx6TRLpDmwWgeDEk6mghh4gPA3BZbNvg:", "index": 2, - "name": "Horizen 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04ecf3eb0c3454436fd414da75eafad95896209052eef81b06860cc6c14731963e63ae744577e35b51d4e40ebb4366e59e2a20f571384384bfcb804444db6a83d7", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "xpub6D5t3ggLE75WQGWU8XaFEiYXbgQFJD3u6eyN1Yb7gcRu4Gan7uKEwqaCBoRhFs73nN1Kf51D5W7kx6TRLpDmwWgeDEk6mghh4gPA3BZbNvg", }, diff --git a/libs/ledger-live-common/src/families/bitcoin/account-used.integration.test.ts b/libs/ledger-live-common/src/families/bitcoin/account-used.integration.test.ts deleted file mode 100644 index eee99a3e0564..000000000000 --- a/libs/ledger-live-common/src/families/bitcoin/account-used.integration.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { reduce } from "rxjs/operators"; -import { Account } from "@ledgerhq/types-live"; -import { fromAccountRaw } from "../../account"; -import { getAccountBridge } from "../../bridge"; -import { accountDataToAccount, accountToAccountData } from "../../cross"; -import "../../__tests__/test-helpers/setup"; -import { bitcoin1 } from "@ledgerhq/coin-bitcoin/datasets/bitcoin"; -import { firstValueFrom } from "rxjs"; - -async function syncAccount(initialAccount: Account): Promise { - const acc = await firstValueFrom( - getAccountBridge(initialAccount) - .sync(initialAccount, { - paginationConfig: {}, - }) - .pipe(reduce((a, f: (arg0: Account) => Account) => f(a), initialAccount)), - ); - return acc; -} - -async function crossAccount(account: Account): Promise { - const a = accountDataToAccount(accountToAccountData(account)); - const synced = await syncAccount(a); - return synced; -} - -test("account.used is true after crossAccount", async () => { - let account = fromAccountRaw(bitcoin1); - account = await crossAccount(account); - expect(account.used).toBe(true); -}); diff --git a/libs/ledger-live-common/src/families/cardano/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/cardano/__snapshots__/bridge.integration.test.ts.snap index 24cc1ac0b504..a9bb01e90e3b 100644 --- a/libs/ledger-live-common/src/families/cardano/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cardano/__snapshots__/bridge.integration.test.ts.snap @@ -756,17 +756,14 @@ exports[`cardano_testnet currency bridge scanAccounts cardano_testnet seed 1 1`] "freshAddressPath": "1852'/1815'/0'/0/2", "id": "js:2:cardano_testnet:806499588e0c4a58f4119f7e6e096bf42c3f774a528d2acec9e82ceebf87d1ceb3d4f3622dd2c77c65cc89c123f79337db22cf8a69f122e36dab1bf5083bf82d:cardano", "index": 0, - "name": "Cardano (Testnet) 1", "nfts": undefined, "operationsCount": 6, "pendingOperations": [], "seedIdentifier": "bea94629d5cf776b8374a00afa15686f0b0742dd0330f86804c61202", "spendableBalance": "10097484577", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": "["ethereum/erc20/ampleforth","ethereum/erc20/steth"]_0", - "unitMagnitude": 6, "used": true, "xpub": "806499588e0c4a58f4119f7e6e096bf42c3f774a528d2acec9e82ceebf87d1ceb3d4f3622dd2c77c65cc89c123f79337db22cf8a69f122e36dab1bf5083bf82d", }, @@ -1405,17 +1402,14 @@ exports[`cardano_testnet currency bridge scanAccounts cardano_testnet seed 1 1`] "freshAddressPath": "1852'/1815'/1'/0/0", "id": "js:2:cardano_testnet:ed5e0d059cb2eed53ea30b9ba84bb3aaa6c2364c6305a0c9a7e8944aa439884a642cc2f06e601808926e14b6e27417be0b0323d5a5149f1eebab8fc4e1fe14d4:cardano", "index": 1, - "name": "Cardano (Testnet) 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "bea94629d5cf776b8374a00afa15686f0b0742dd0330f86804c61202", "spendableBalance": "0", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": "["ethereum/erc20/ampleforth","ethereum/erc20/steth"]_0", - "unitMagnitude": 6, "used": false, "xpub": "ed5e0d059cb2eed53ea30b9ba84bb3aaa6c2364c6305a0c9a7e8944aa439884a642cc2f06e601808926e14b6e27417be0b0323d5a5149f1eebab8fc4e1fe14d4", }, diff --git a/libs/ledger-live-common/src/families/cardano/account.ts b/libs/ledger-live-common/src/families/cardano/account.ts index af15571311b3..3d47541e1c57 100644 --- a/libs/ledger-live-common/src/families/cardano/account.ts +++ b/libs/ledger-live-common/src/families/cardano/account.ts @@ -1,5 +1,5 @@ import invariant from "invariant"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import { CardanoAccount } from "./types"; @@ -7,7 +7,7 @@ export function formatAccountSpecifics(account: CardanoAccount): string { const { cardanoResources } = account; invariant(cardanoResources, "cardano account expected"); - const unit = getAccountUnit(account); + const unit = getAccountCurrency(account).units[0]; const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/libs/ledger-live-common/src/families/cardano/buildSubAccounts.ts b/libs/ledger-live-common/src/families/cardano/buildSubAccounts.ts index 22708c527e18..e69327359339 100644 --- a/libs/ledger-live-common/src/families/cardano/buildSubAccounts.ts +++ b/libs/ledger-live-common/src/families/cardano/buildSubAccounts.ts @@ -156,7 +156,6 @@ export function buildSubAccounts({ operationsCount: operations.length, operations, pendingOperations: [], - starred: false, balanceHistoryCache: emptyHistoryCache, swapHistory: [], }; diff --git a/libs/ledger-live-common/src/families/cardano/datasets/rawAccount.1.ts b/libs/ledger-live-common/src/families/cardano/datasets/rawAccount.1.ts index b44e84f790ea..4b86cc077f56 100644 --- a/libs/ledger-live-common/src/families/cardano/datasets/rawAccount.1.ts +++ b/libs/ledger-live-common/src/families/cardano/datasets/rawAccount.1.ts @@ -13,7 +13,6 @@ export const cardanoRawAccount1: AccountRaw = { operations: [], pendingOperations: [], currencyId: "cardano_testnet", - unitMagnitude: 6, lastSyncDate: "", balance: "10098829375", xpub: "806499588e0c4a58f4119f7e6e096bf42c3f774a528d2acec9e82ceebf87d1ceb3d4f3622dd2c77c65cc89c123f79337db22cf8a69f122e36dab1bf5083bf82d", diff --git a/libs/ledger-live-common/src/families/cardano/deviceTransactionConfig.ts b/libs/ledger-live-common/src/families/cardano/deviceTransactionConfig.ts index 90ff9dff4272..f12a40470cc2 100644 --- a/libs/ledger-live-common/src/families/cardano/deviceTransactionConfig.ts +++ b/libs/ledger-live-common/src/families/cardano/deviceTransactionConfig.ts @@ -1,5 +1,5 @@ import BigNumber from "bignumber.js"; -import { getAccountUnit, getMainAccount } from "../../account"; +import { getAccountCurrency, getMainAccount } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import { DeviceTransactionField } from "../../transaction"; import { Account, AccountLike } from "@ledgerhq/types-live"; @@ -33,7 +33,7 @@ function getDeviceTransactionConfig({ fields.push({ type: "text", label: "Transaction Fee", - value: formatCurrencyUnit(getAccountUnit(account), fees, { + value: formatCurrencyUnit(getAccountCurrency(account).units[0], fees, { showCode: true, disableRounding: true, }), @@ -61,10 +61,14 @@ function getDeviceTransactionConfig({ fields.push({ type: "text", label: "ADA", - value: formatCurrencyUnit(getAccountUnit(mainAccount), requiredMinAdaForTokens, { - showCode: true, - disableRounding: true, - }), + value: formatCurrencyUnit( + getAccountCurrency(mainAccount).units[0], + requiredMinAdaForTokens, + { + showCode: true, + disableRounding: true, + }, + ), }); fields.push({ type: "text", @@ -74,7 +78,7 @@ function getDeviceTransactionConfig({ fields.push({ type: "text", label: "Amount", - value: formatCurrencyUnit(getAccountUnit(account), transactionAmount, { + value: formatCurrencyUnit(getAccountCurrency(account).units[0], transactionAmount, { showCode: true, disableRounding: true, }), @@ -83,7 +87,7 @@ function getDeviceTransactionConfig({ fields.push({ type: "text", label: "Amount", - value: formatCurrencyUnit(getAccountUnit(account), transaction.amount, { + value: formatCurrencyUnit(getAccountCurrency(account).units[0], transaction.amount, { showCode: true, disableRounding: true, }), diff --git a/libs/ledger-live-common/src/families/cardano/transaction.ts b/libs/ledger-live-common/src/families/cardano/transaction.ts index 562ba0dfbe7d..1de02c277f3a 100644 --- a/libs/ledger-live-common/src/families/cardano/transaction.ts +++ b/libs/ledger-live-common/src/families/cardano/transaction.ts @@ -7,7 +7,7 @@ import { toTransactionCommonRaw, toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import type { Account } from "@ledgerhq/types-live"; @@ -25,7 +25,7 @@ export const formatTransaction = ( : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/casper/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/casper/__snapshots__/bridge.integration.test.ts.snap index 0c6c35598ea8..23ef4d62e6d4 100644 --- a/libs/ledger-live-common/src/families/casper/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/casper/__snapshots__/bridge.integration.test.ts.snap @@ -10,16 +10,13 @@ exports[`casper currency bridge scanAccounts casper seed 1 1`] = ` "freshAddressPath": "44'/506'/0'/0/0", "id": "js:2:casper:02038C8cb0f62b4EFcD0C7868c2e749Dda649aFFE30fF0f95fc91CE48EA67F077D16:casper_wallet", "index": 0, - "name": "Casper 1", "nfts": undefined, "operationsCount": 2, "pendingOperations": [], "seedIdentifier": "038c8cb0f62b4efcd0c7868c2e749dda649affe30ff0f95fc91ce48ea67f077d16", "spendableBalance": "9750000000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 9, "used": true, }, { @@ -30,16 +27,13 @@ exports[`casper currency bridge scanAccounts casper seed 1 1`] = ` "freshAddressPath": "44'/506'/0'/0/1", "id": "js:2:casper:0202bA6DC98cbE677711a45bf028A03646F9e588996eB223fad2485e8bc391b01581:casper_wallet", "index": 1, - "name": "Casper 2", "nfts": undefined, "operationsCount": 4, "pendingOperations": [], "seedIdentifier": "038c8cb0f62b4efcd0c7868c2e749dda649affe30ff0f95fc91ce48ea67f077d16", "spendableBalance": "4550000000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 9, "used": true, }, { @@ -50,16 +44,13 @@ exports[`casper currency bridge scanAccounts casper seed 1 1`] = ` "freshAddressPath": "44'/506'/0'/0/2", "id": "js:2:casper:02022AAB9B6ED404f8CFFE76ce493E1995d195B5F141Ee7D5B7fb20FCE60f2A49691:casper_wallet", "index": 2, - "name": "Casper 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "038c8cb0f62b4efcd0c7868c2e749dda649affe30ff0f95fc91ce48ea67f077d16", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 9, "used": false, }, ] diff --git a/libs/ledger-live-common/src/families/casper/bridge.integration.test.ts b/libs/ledger-live-common/src/families/casper/bridge.integration.test.ts index ef7798449764..3a2668387d8d 100644 --- a/libs/ledger-live-common/src/families/casper/bridge.integration.test.ts +++ b/libs/ledger-live-common/src/families/casper/bridge.integration.test.ts @@ -43,7 +43,6 @@ const casper: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "casper", - unitMagnitude: 9, lastSyncDate: "", balance: "1000", }, diff --git a/libs/ledger-live-common/src/families/casper/transaction.ts b/libs/ledger-live-common/src/families/casper/transaction.ts index 85c389660968..67a71108235e 100644 --- a/libs/ledger-live-common/src/families/casper/transaction.ts +++ b/libs/ledger-live-common/src/families/casper/transaction.ts @@ -7,7 +7,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import BigNumber from "bignumber.js"; @@ -21,7 +21,7 @@ SEND ${ : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/celo/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/celo/__snapshots__/bridge.integration.test.ts.snap index b4ffec4f443c..533176c73d97 100644 --- a/libs/ledger-live-common/src/families/celo/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/celo/__snapshots__/bridge.integration.test.ts.snap @@ -37,16 +37,13 @@ exports[`celo currency bridge scanAccounts Celo 1 1`] = ` "freshAddressPath": "44'/52752'/0'/0/0", "id": "js:2:celo:0xcfD48e0FAf9f19377509cE68a6A6F4D9C85ff8AB:", "index": 0, - "name": "Celo 1", "nfts": undefined, "operationsCount": 10, "pendingOperations": [], "seedIdentifier": "0453390dcc1e6f1be0fb34f837b278ed1b4c84097c7493c13a0d915c735af1d8aa445d2738a95e8f50bc22abd2e17cb868d4db22a623d99d861740eb93373d50a3", "spendableBalance": "83719000010000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": true, }, { @@ -67,16 +64,13 @@ exports[`celo currency bridge scanAccounts Celo 1 1`] = ` "freshAddressPath": "44'/52752'/1'/0/0", "id": "js:2:celo:0x2cC7E5913bADa8FA2895bDeF7F4C2E36C2368Abb:", "index": 1, - "name": "Celo 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "0453390dcc1e6f1be0fb34f837b278ed1b4c84097c7493c13a0d915c735af1d8aa445d2738a95e8f50bc22abd2e17cb868d4db22a623d99d861740eb93373d50a3", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": false, }, ] diff --git a/libs/ledger-live-common/src/families/celo/datasets/celo.scanAccounts.1.ts b/libs/ledger-live-common/src/families/celo/datasets/celo.scanAccounts.1.ts index 739356408f12..c2221dde773d 100644 --- a/libs/ledger-live-common/src/families/celo/datasets/celo.scanAccounts.1.ts +++ b/libs/ledger-live-common/src/families/celo/datasets/celo.scanAccounts.1.ts @@ -50,7 +50,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "celo", - unitMagnitude: 18, lastSyncDate: "", balance: "399893159500000000", celoResources: { @@ -340,7 +339,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "celo", - unitMagnitude: 18, lastSyncDate: "", balance: "399893159500000000", celoResources: { diff --git a/libs/ledger-live-common/src/families/celo/transaction.ts b/libs/ledger-live-common/src/families/celo/transaction.ts index 995a3e70dbd9..ff5c9234d988 100644 --- a/libs/ledger-live-common/src/families/celo/transaction.ts +++ b/libs/ledger-live-common/src/families/celo/transaction.ts @@ -7,14 +7,14 @@ import { toTransactionCommonRaw, toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import { Account } from "@ledgerhq/types-live"; export const formatTransaction = (t: Transaction, account: Account): string => ` SEND ${ t.useAllAmount ? "MAX CELO" - : formatCurrencyUnit(getAccountUnit(account), t.amount, { + : formatCurrencyUnit(getAccountCurrency(account).units[0], t.amount, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/cosmos/banner.test.ts b/libs/ledger-live-common/src/families/cosmos/banner.test.ts index c5b47d6e325d..23f7215a84d9 100644 --- a/libs/ledger-live-common/src/families/cosmos/banner.test.ts +++ b/libs/ledger-live-common/src/families/cosmos/banner.test.ts @@ -29,14 +29,12 @@ const cheapValidator: CosmosValidatorItem | undefined = data.validators.find( const account: CosmosAccount = { type: "Account", id: "js:2:cosmos:cosmos1f9y7wdychcdhwvyrhff3zvs3gy3qxcu2th4g8u:", - starred: false, used: false, seedIdentifier: "02d4c121ce2bb160ebf39aa0be0050b4d553e18872985ac3a4e21904fd1442defe", derivationMode: "", index: 1, freshAddress: "cosmos1f9y7wdychcdhwvyrhff3zvs3gy3qxcu2th4g8u", freshAddressPath: "44'/118'/1'/0/0", - name: "Cosmos 2 - Nano X Static Account", blockHeight: 5417472, creationDate: new Date("2022-08-02T16:09:08.906Z"), balance: new BigNumber("200250"), @@ -44,7 +42,6 @@ const account: CosmosAccount = { operations: [], operationsCount: 1, pendingOperations: [], - unit: { name: "Atom", code: "ATOM", magnitude: 6 }, currency: { type: "CryptoCurrency", id: "cosmos", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/axelar.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/axelar.integration.test.ts.snap index 5f532126085b..a8c16102bbc1 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/axelar.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/axelar.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`axelar currency bridge scanAccounts axelar seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:axelar:axelar1gyauvl44q2apn3u3aujm36q8zrj74vry3kglyg:", "index": 0, - "name": "Axelar 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "187390", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "axelar1gyauvl44q2apn3u3aujm36q8zrj74vry3kglyg", }, @@ -30,15 +27,12 @@ exports[`axelar currency bridge scanAccounts axelar seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:axelar:axelar1v2mp0m7k96dm9qv60fkspcqlzpkzrwnext9980:", "index": 1, - "name": "Axelar 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "axelar1v2mp0m7k96dm9qv60fkspcqlzpkzrwnext9980", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/coreum.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/coreum.integration.test.ts.snap index 713303d3afbe..e99e3b0ab5ac 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/coreum.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/coreum.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`coreum currency bridge scanAccounts coreum seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:coreum:core10l6h3qw05u7qduqgafj8wlrx3fjhr852z7r5l2:", "index": 0, - "name": "Coreum 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03633639c689420031c73c1157975ea734e22eae588045a96fc9495d28aba3f0d1", "spendableBalance": "666840", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "core10l6h3qw05u7qduqgafj8wlrx3fjhr852z7r5l2", }, @@ -30,15 +27,12 @@ exports[`coreum currency bridge scanAccounts coreum seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:coreum:core1sel9ys8a7jlsmrxp9692zfjncnmhxkws0qr3g9:", "index": 1, - "name": "Coreum 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03633639c689420031c73c1157975ea734e22eae588045a96fc9495d28aba3f0d1", "spendableBalance": "1000000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "core1sel9ys8a7jlsmrxp9692zfjncnmhxkws0qr3g9", }, @@ -50,15 +44,12 @@ exports[`coreum currency bridge scanAccounts coreum seed 1 1`] = ` "freshAddressPath": "44'/118'/2'/0/0", "id": "js:2:coreum:core1mdj6j89ev4yfelv3kqn7prj4h92er5zlxssxwk:", "index": 2, - "name": "Coreum 3", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03633639c689420031c73c1157975ea734e22eae588045a96fc9495d28aba3f0d1", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "core1mdj6j89ev4yfelv3kqn7prj4h92er5zlxssxwk", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/cosmos.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/cosmos.integration.test.ts.snap index 254645c0230d..f7a6d948a0e2 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/cosmos.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/cosmos.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:cosmos:cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl:", "index": 0, - "name": "Cosmos 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "0388459b2653519948b12492f1a0b464720110c147a8155d23d423a5cc3c21d89a", "spendableBalance": "1097532", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl", }, @@ -30,15 +27,12 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:cosmos:cosmos108uy5q9jt59gwugq5yrdhkzcd9jryslmpcstk5:", "index": 1, - "name": "Cosmos 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "0388459b2653519948b12492f1a0b464720110c147a8155d23d423a5cc3c21d89a", "spendableBalance": "1424", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "cosmos108uy5q9jt59gwugq5yrdhkzcd9jryslmpcstk5", }, @@ -50,15 +44,12 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 1`] = ` "freshAddressPath": "44'/118'/2'/0/0", "id": "js:2:cosmos:cosmos1cgc696ay2pg6d4gcejek2y8la66j7e5y3c7kyw:", "index": 2, - "name": "Cosmos 3", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "0388459b2653519948b12492f1a0b464720110c147a8155d23d423a5cc3c21d89a", "spendableBalance": "15348", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "cosmos1cgc696ay2pg6d4gcejek2y8la66j7e5y3c7kyw", }, @@ -70,15 +61,12 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 1`] = ` "freshAddressPath": "44'/118'/3'/0/0", "id": "js:2:cosmos:cosmos14tg4vsd0q745fxhzn329pkx0krqtszcxyzl5ku:", "index": 3, - "name": "Cosmos 4", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "0388459b2653519948b12492f1a0b464720110c147a8155d23d423a5cc3c21d89a", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "cosmos14tg4vsd0q745fxhzn329pkx0krqtszcxyzl5ku", }, @@ -90,15 +78,12 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 1`] = ` "freshAddressPath": "44'/118'/4'/0/0", "id": "js:2:cosmos:cosmos18q6ad294dw5wf7nueq7ctleehxh9fgt8dcecr9:", "index": 4, - "name": "Cosmos 5", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "0388459b2653519948b12492f1a0b464720110c147a8155d23d423a5cc3c21d89a", "spendableBalance": "13833", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "cosmos18q6ad294dw5wf7nueq7ctleehxh9fgt8dcecr9", }, @@ -110,15 +95,12 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 1`] = ` "freshAddressPath": "44'/118'/5'/0/0", "id": "js:2:cosmos:cosmos1uh39jx0dva8upvqqqh690rht2vn68zt9wmmhq4:", "index": 5, - "name": "Cosmos 6", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "0388459b2653519948b12492f1a0b464720110c147a8155d23d423a5cc3c21d89a", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "cosmos1uh39jx0dva8upvqqqh690rht2vn68zt9wmmhq4", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/desmos.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/desmos.integration.test.ts.snap index e63b769e164e..48c4a3592f90 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/desmos.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/desmos.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`desmos currency bridge scanAccounts desmos seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:desmos:desmos1gyauvl44q2apn3u3aujm36q8zrj74vrypqn8c3:", "index": 0, - "name": "Desmos 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "6748191", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "desmos1gyauvl44q2apn3u3aujm36q8zrj74vrypqn8c3", }, @@ -30,15 +27,12 @@ exports[`desmos currency bridge scanAccounts desmos seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:desmos:desmos1v2mp0m7k96dm9qv60fkspcqlzpkzrwneka7amk:", "index": 1, - "name": "Desmos 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "desmos1v2mp0m7k96dm9qv60fkspcqlzpkzrwneka7amk", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/injective.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/injective.integration.test.ts.snap index e8db5f2f355f..35953afc80e5 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/injective.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/injective.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`injective currency bridge scanAccounts injective seed 1 1`] = ` "freshAddressPath": "44'/60'/0'/0/0", "id": "js:2:injective:inj1hn46zvx43mxq47vsecvw84k5chjhuhwp6d62dt:", "index": 0, - "name": "Injective 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03f8e9b05b4de510b0b7d970060eac6a0f76d3c4eb07e11418c0747bc593c91c7d", "spendableBalance": "506664000000016", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": true, "xpub": "inj1hn46zvx43mxq47vsecvw84k5chjhuhwp6d62dt", }, @@ -30,15 +27,12 @@ exports[`injective currency bridge scanAccounts injective seed 1 1`] = ` "freshAddressPath": "44'/60'/1'/0/0", "id": "js:2:injective:inj1604wce9t0u8vne0zrj4t2rspjsg28dymyljzrm:", "index": 1, - "name": "Injective 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03f8e9b05b4de510b0b7d970060eac6a0f76d3c4eb07e11418c0747bc593c91c7d", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": false, "xpub": "inj1604wce9t0u8vne0zrj4t2rspjsg28dymyljzrm", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/onomy.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/onomy.integration.test.ts.snap index b7ac008556b3..91b0d3eb9661 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/onomy.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/onomy.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`onomy currency bridge scanAccounts onomy seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:onomy:onomy1gyauvl44q2apn3u3aujm36q8zrj74vry0e2p7v:", "index": 0, - "name": "Onomy 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "2056240423338275653", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": true, "xpub": "onomy1gyauvl44q2apn3u3aujm36q8zrj74vry0e2p7v", }, @@ -30,15 +27,12 @@ exports[`onomy currency bridge scanAccounts onomy seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:onomy:onomy1v2mp0m7k96dm9qv60fkspcqlzpkzrwnecy8mat:", "index": 1, - "name": "Onomy 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": false, "xpub": "onomy1v2mp0m7k96dm9qv60fkspcqlzpkzrwnecy8mat", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/osmosis.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/osmosis.integration.test.ts.snap index db1754db702b..043ad9336a9d 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/osmosis.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/osmosis.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`osmo currency bridge scanAccounts osmo seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:osmo:osmo17gmcxyc5ccd5kwqqatpgfdgh380w2hc77zm0zw:", "index": 0, - "name": "Osmosis 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "02dc75cfe8137450ae2259dc7f29fd8767951956cc943adb4387e91c37a058a9f0", "spendableBalance": "124344", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "osmo17gmcxyc5ccd5kwqqatpgfdgh380w2hc77zm0zw", }, @@ -30,15 +27,12 @@ exports[`osmo currency bridge scanAccounts osmo seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:osmo:osmo19h8cennrkf09sjxqt36lmk93fzyrcwrfxw784y:", "index": 1, - "name": "Osmosis 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "02dc75cfe8137450ae2259dc7f29fd8767951956cc943adb4387e91c37a058a9f0", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "osmo19h8cennrkf09sjxqt36lmk93fzyrcwrfxw784y", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/persistence.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/persistence.integration.test.ts.snap index 69ec294dcdce..0f9f68dd7049 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/persistence.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/persistence.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`persistence currency bridge scanAccounts persistence seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:persistence:persistence1gyauvl44q2apn3u3aujm36q8zrj74vrym5cypd:", "index": 0, - "name": "Persistence 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "1202564", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "persistence1gyauvl44q2apn3u3aujm36q8zrj74vrym5cypd", }, @@ -30,15 +27,12 @@ exports[`persistence currency bridge scanAccounts persistence seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:persistence:persistence1v2mp0m7k96dm9qv60fkspcqlzpkzrwnevf47z2:", "index": 1, - "name": "Persistence 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "230000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "persistence1v2mp0m7k96dm9qv60fkspcqlzpkzrwnevf47z2", }, @@ -50,15 +44,12 @@ exports[`persistence currency bridge scanAccounts persistence seed 1 1`] = ` "freshAddressPath": "44'/118'/2'/0/0", "id": "js:2:persistence:persistence17r56udl09ssv88x85cxftx7su0rgv4v27ej3p0:", "index": 2, - "name": "Persistence 3", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "persistence17r56udl09ssv88x85cxftx7su0rgv4v27ej3p0", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/quicksilver.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/quicksilver.integration.test.ts.snap index a086cca082ac..9203f55e9c97 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/quicksilver.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/quicksilver.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`quicksilver currency bridge scanAccounts quicksilver seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:quicksilver:quick1gyauvl44q2apn3u3aujm36q8zrj74vry7uw9km:", "index": 0, - "name": "Quicksilver 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "2273041", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "quick1gyauvl44q2apn3u3aujm36q8zrj74vry7uw9km", }, @@ -30,15 +27,12 @@ exports[`quicksilver currency bridge scanAccounts quicksilver seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:quicksilver:quick1v2mp0m7k96dm9qv60fkspcqlzpkzrwnefprl4u:", "index": 1, - "name": "Quicksilver 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "quick1v2mp0m7k96dm9qv60fkspcqlzpkzrwnefprl4u", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/seiNetwork.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/seiNetwork.integration.test.ts.snap index de8938c3d620..f371b5dbb6a6 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/seiNetwork.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/seiNetwork.integration.test.ts.snap @@ -10,14 +10,11 @@ exports[`sei_network currency bridge scanAccounts sei_network seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:sei_network:sei1gyauvl44q2apn3u3aujm36q8zrj74vryc50pfg:", "index": 0, - "name": "SeiNetwork 1", "nfts": undefined, "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "128991", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "sei1gyauvl44q2apn3u3aujm36q8zrj74vryc50pfg", }, @@ -29,14 +26,11 @@ exports[`sei_network currency bridge scanAccounts sei_network seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:sei_network:sei1v2mp0m7k96dm9qv60fkspcqlzpkzrwne0fzm20:", "index": 1, - "name": "SeiNetwork 2", "nfts": undefined, "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "sei1v2mp0m7k96dm9qv60fkspcqlzpkzrwne0fzm20", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/stargaze.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/stargaze.integration.test.ts.snap index 0a3f826019a0..82a126ba0367 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/stargaze.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/stargaze.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`stargaze currency bridge scanAccounts stargaze seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:stargaze:stars1gyauvl44q2apn3u3aujm36q8zrj74vrypyf2yc:", "index": 0, - "name": "Stargaze 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "2000000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "stars1gyauvl44q2apn3u3aujm36q8zrj74vrypyf2yc", }, @@ -30,15 +27,12 @@ exports[`stargaze currency bridge scanAccounts stargaze seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:stargaze:stars1v2mp0m7k96dm9qv60fkspcqlzpkzrwnekeys8l:", "index": 1, - "name": "Stargaze 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "stars1v2mp0m7k96dm9qv60fkspcqlzpkzrwnekeys8l", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/umee.integration.test.ts.snap b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/umee.integration.test.ts.snap index ec875a309a01..c61f702dc67b 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/umee.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/cosmos/datasets/__snapshots__/umee.integration.test.ts.snap @@ -10,15 +10,12 @@ exports[`umee currency bridge scanAccounts umee seed 1 1`] = ` "freshAddressPath": "44'/118'/0'/0/0", "id": "js:2:umee:umee1gyauvl44q2apn3u3aujm36q8zrj74vry8wrgtm:", "index": 0, - "name": "Umee 1", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "7090969", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "umee1gyauvl44q2apn3u3aujm36q8zrj74vry8wrgtm", }, @@ -30,15 +27,12 @@ exports[`umee currency bridge scanAccounts umee seed 1 1`] = ` "freshAddressPath": "44'/118'/1'/0/0", "id": "js:2:umee:umee1v2mp0m7k96dm9qv60fkspcqlzpkzrwnesnwjgu:", "index": 1, - "name": "Umee 2", "nfts": undefined, "pendingOperations": [], "seedIdentifier": "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "umee1v2mp0m7k96dm9qv60fkspcqlzpkzrwnesnwjgu", }, diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/axelar.ts b/libs/ledger-live-common/src/families/cosmos/datasets/axelar.ts index 2e454ec791c2..7296d366e43c 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/axelar.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/axelar.ts @@ -24,7 +24,6 @@ const dataset: CurrenciesData = { id: "js:2:axelar:axelar1gyauvl44q2apn3u3aujm36q8zrj74vry3kglyg:", seedIdentifier: "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", name: "Axelar 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -36,7 +35,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "axelar", - unitMagnitude: 6, lastSyncDate: "2023-04-17T14:48:22.102Z", balance: "978792", spendableBalance: "628791", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/coreum.ts b/libs/ledger-live-common/src/families/cosmos/datasets/coreum.ts index 81e41bf1a42b..cfb6c52c9282 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/coreum.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/coreum.ts @@ -26,7 +26,6 @@ const dataset: CurrenciesData = { id: "js:2:coreum:core1sel9ys8a7jlsmrxp9692zfjncnmhxkws0qr3g9:", seedIdentifier: "03633639c689420031c73c1157975ea734e22eae588045a96fc9495d28aba3f0d1", name: "Coreum 2", - starred: false, used: true, derivationMode: "", index: 1, @@ -57,7 +56,6 @@ const dataset: CurrenciesData = { ], pendingOperations: [], currencyId: "coreum", - unitMagnitude: 6, lastSyncDate: "2023-07-26T05:46:40.684Z", balance: "1000000", spendableBalance: "1000000", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/cosmos.ts b/libs/ledger-live-common/src/families/cosmos/datasets/cosmos.ts index 61f43491a7cd..53f9dac61c3c 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/cosmos.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/cosmos.ts @@ -50,7 +50,6 @@ const dataset: CurrenciesData = { spendableBalance: "2180673", blockHeight: 1615299, currencyId: "cosmos", - unitMagnitude: 6, operationsCount: 85, operations: [], pendingOperations: [], @@ -364,7 +363,6 @@ const dataset: CurrenciesData = { seedIdentifier: "cosmospub1addwnpepqd3nvwwx39pqqvw88sg409675u6wyt4wtzqyt2t0e9y4629t50cdzftxnvz", name: "Cosmos Static Account", - starred: true, derivationMode: "", index: 0, freshAddress: "cosmos10l6h3qw05u7qduqgafj8wlrx3fjhr8523sm0c3", @@ -375,7 +373,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "cosmos", - unitMagnitude: 6, lastSyncDate: "2020-06-11T07:44:10.266Z", balance: "1000000", spendableBalance: "0", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/desmos.ts b/libs/ledger-live-common/src/families/cosmos/datasets/desmos.ts index 6a996b0f9120..654c000f90de 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/desmos.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/desmos.ts @@ -25,7 +25,6 @@ const dataset: CurrenciesData = { id: "js:2:desmos:desmos1gyauvl44q2apn3u3aujm36q8zrj74vrypqn8c3:", seedIdentifier: "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", name: "Desmos 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -37,7 +36,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "desmos", - unitMagnitude: 6, lastSyncDate: "2023-04-19T08:50:37.675Z", balance: "9998421", spendableBalance: "9898421", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/dydx.ts b/libs/ledger-live-common/src/families/cosmos/datasets/dydx.ts index 765f5d620957..d851ef59aa38 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/dydx.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/dydx.ts @@ -28,7 +28,6 @@ const dataset: CurrenciesData = { id: "js:2:dydx:dydx1gyauvl44q2apn3u3aujm36q8zrj74vryupsn07:", seedIdentifier: "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", name: "dYdX 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -40,7 +39,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "dydx", - unitMagnitude: 18, lastSyncDate: "2023-11-02T08:01:16.412Z", balance: "7620812500000000", spendableBalance: "7520812500000000", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/injective.ts b/libs/ledger-live-common/src/families/cosmos/datasets/injective.ts index 2c225638d855..14f8cf21dcda 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/injective.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/injective.ts @@ -24,7 +24,6 @@ const dataset: CurrenciesData = { id: "js:2:injective:inj1hn46zvx43mxq47vsecvw84k5chjhuhwp6d62dt:", seedIdentifier: "03f8e9b05b4de510b0b7d970060eac6a0f76d3c4eb07e11418c0747bc593c91c7d", name: "Injective 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -36,7 +35,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "injective", - unitMagnitude: 18, lastSyncDate: "2023-09-18T06:38:17.652Z", balance: "607564000000000", spendableBalance: "506564000000000", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/onomy.ts b/libs/ledger-live-common/src/families/cosmos/datasets/onomy.ts index 2d2e1c485ce5..39a87851da44 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/onomy.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/onomy.ts @@ -25,7 +25,6 @@ const dataset: CurrenciesData = { id: "js:2:onomy:onomy1gyauvl44q2apn3u3aujm36q8zrj74vry0e2p7v:", seedIdentifier: "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", name: "Onomy 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -37,7 +36,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "onomy", - unitMagnitude: 18, lastSyncDate: "2023-04-26T14:37:50.539Z", balance: "5006237953263518010", spendableBalance: "3806237953263518010", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/osmosis.ts b/libs/ledger-live-common/src/families/cosmos/datasets/osmosis.ts index ba8de9d7bd24..9983f5b49135 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/osmosis.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/osmosis.ts @@ -42,7 +42,6 @@ const dataset: CurrenciesData = { spendableBalance: "500250", blockHeight: 5417468, currencyId: "osmo", - unitMagnitude: 6, operationsCount: 2, operations: [], pendingOperations: [], @@ -355,7 +354,6 @@ const dataset: CurrenciesData = { id: "js:2:osmo:osmo1xx72kqjlf2qqj88h0wakwv6rp0v8fwh74z9q89:", seedIdentifier: "0283de657d9e283a5c31d64a4c4afbcc48ee79fdd7648bcdde6a1d0d7ae9f9bea1", name: "Osmosis 2 - Nano X Static Account", - starred: true, derivationMode: "", index: 1, freshAddress: "osmo1xx72kqjlf2qqj88h0wakwv6rp0v8fwh74z9q89", @@ -366,7 +364,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "osmo", - unitMagnitude: 6, lastSyncDate: "2022-08-02T16:11:47.343Z", balance: "200250", spendableBalance: "200250", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/persistence.ts b/libs/ledger-live-common/src/families/cosmos/datasets/persistence.ts index 34e307040b65..5cdcd8ee6a65 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/persistence.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/persistence.ts @@ -27,7 +27,6 @@ const dataset: CurrenciesData = { id: "js:2:persistence:persistence1gyauvl44q2apn3u3aujm36q8zrj74vrym5cypd:", seedIdentifier: "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", name: "Persistence 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -39,7 +38,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "persistence", - unitMagnitude: 6, lastSyncDate: "2023-04-26T14:01:03.106Z", balance: "4776304", spendableBalance: "4176304", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/quicksilver.ts b/libs/ledger-live-common/src/families/cosmos/datasets/quicksilver.ts index ee2e18086690..26b66025245f 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/quicksilver.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/quicksilver.ts @@ -25,7 +25,6 @@ const dataset: CurrenciesData = { id: "js:2:quicksilver:quick1gyauvl44q2apn3u3aujm36q8zrj74vry7uw9km:", seedIdentifier: "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", name: "Quicksilver 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -37,7 +36,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "quicksilver", - unitMagnitude: 6, lastSyncDate: "2023-04-25T15:22:47.450Z", balance: "9998269", spendableBalance: "8998269", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/secretNetwork.ts b/libs/ledger-live-common/src/families/cosmos/datasets/secretNetwork.ts index 73a04c25f88c..215eaf6ca9dd 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/secretNetwork.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/secretNetwork.ts @@ -25,7 +25,6 @@ const dataset: CurrenciesData = { id: "js:2:secret_network:secret1gyauvl44q2apn3u3aujm36q8zrj74vryha27j4:", seedIdentifier: "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", name: "SecretNetwork 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -37,7 +36,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "secret_network", - unitMagnitude: 6, lastSyncDate: "2023-06-12T12:45:06.797Z", balance: "1964000", spendableBalance: "1232751", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/seiNetwork.ts b/libs/ledger-live-common/src/families/cosmos/datasets/seiNetwork.ts index 42b1a73af811..161fe6ceedee 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/seiNetwork.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/seiNetwork.ts @@ -28,7 +28,6 @@ const dataset: CurrenciesData = { id: "js:2:sei_network:sei1gyauvl44q2apn3u3aujm36q8zrj74vryc50pfg:", seedIdentifier: "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", name: "Frozen", - starred: false, used: true, derivationMode: "", index: 0, @@ -37,7 +36,6 @@ const dataset: CurrenciesData = { blockHeight: 30141265, creationDate: "2023-10-05T07:51:50.000Z", currencyId: "sei_network", - unitMagnitude: 6, lastSyncDate: "2023-10-05T07:57:42.286Z", balance: "278991", spendableBalance: "128991", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/stargaze.ts b/libs/ledger-live-common/src/families/cosmos/datasets/stargaze.ts index 6f3d23ee6fe5..54552d0eecfc 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/stargaze.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/stargaze.ts @@ -25,7 +25,6 @@ const dataset: CurrenciesData = { id: "js:2:stargaze:stars1gyauvl44q2apn3u3aujm36q8zrj74vrypyf2yc:", seedIdentifier: "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", name: "Stargaze 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -37,7 +36,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "stargaze", - unitMagnitude: 6, lastSyncDate: "2023-06-12T13:27:26.351Z", balance: "2000000", spendableBalance: "2000000", diff --git a/libs/ledger-live-common/src/families/cosmos/datasets/umee.ts b/libs/ledger-live-common/src/families/cosmos/datasets/umee.ts index 73726ce6deb6..7bfc3a430140 100644 --- a/libs/ledger-live-common/src/families/cosmos/datasets/umee.ts +++ b/libs/ledger-live-common/src/families/cosmos/datasets/umee.ts @@ -25,7 +25,6 @@ const dataset: CurrenciesData = { id: "js:2:umee:umee1gyauvl44q2apn3u3aujm36q8zrj74vry8wrgtm:", seedIdentifier: "03d5e0ebb3f1ae2afe87e5d5a24b5029a59cc12f8fd1056840091b2f0b97e54e83", name: "Umee 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -37,7 +36,6 @@ const dataset: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "umee", - unitMagnitude: 6, lastSyncDate: "2023-04-19T09:37:58.369Z", balance: "9899013", spendableBalance: "9799013", diff --git a/libs/ledger-live-common/src/families/cosmos/deviceTransactionConfig.ts b/libs/ledger-live-common/src/families/cosmos/deviceTransactionConfig.ts index 1a32d7490f6d..b33f6b7e5b0e 100644 --- a/libs/ledger-live-common/src/families/cosmos/deviceTransactionConfig.ts +++ b/libs/ledger-live-common/src/families/cosmos/deviceTransactionConfig.ts @@ -2,7 +2,7 @@ import type { AccountLike, Account } from "@ledgerhq/types-live"; import type { Transaction, TransactionStatus } from "./types"; import type { DeviceTransactionField } from "../../transaction"; import { getMainAccount } from "../../account"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; export type ExtraDeviceTransactionField = | { @@ -47,7 +47,7 @@ const getSendFields = ({ fields.push({ type: "text", label: "Amount", - value: formatCurrencyUnit(getAccountUnit(account), amount, { + value: formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }), @@ -111,7 +111,7 @@ function getDeviceTransactionConfig({ fields.push({ type: "text", label: "Amount", - value: formatCurrencyUnit(getAccountUnit(account), validators[0].amount, { + value: formatCurrencyUnit(getAccountCurrency(account).units[0], validators[0].amount, { showCode: true, disableRounding: true, }), @@ -131,7 +131,7 @@ function getDeviceTransactionConfig({ fields.push({ type: "text", label: "Amount", - value: formatCurrencyUnit(getAccountUnit(account), validators[0].amount, { + value: formatCurrencyUnit(getAccountCurrency(account).units[0], validators[0].amount, { showCode: true, disableRounding: true, }), diff --git a/libs/ledger-live-common/src/families/cosmos/formatters.ts b/libs/ledger-live-common/src/families/cosmos/formatters.ts index 1b13d4262dc1..27ebb2c3176d 100644 --- a/libs/ledger-live-common/src/families/cosmos/formatters.ts +++ b/libs/ledger-live-common/src/families/cosmos/formatters.ts @@ -1,7 +1,7 @@ import invariant from "invariant"; import { BigNumber } from "bignumber.js"; import { getCurrentCosmosPreloadData } from "./preloadedData"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import { CosmosOperation, CosmosAccount } from "./types"; import { mapDelegations, mapUnbondings, mapRedelegations } from "./logic"; @@ -30,7 +30,7 @@ export function formatAccountSpecifics(account: CosmosAccount): string { const { validators } = getCurrentCosmosPreloadData()[account.currency.id] ?? { validators: [], }; - const unit = getAccountUnit(account); + const unit = getAccountCurrency(account).units[0]; const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/libs/ledger-live-common/src/families/cosmos/react.test.ts b/libs/ledger-live-common/src/families/cosmos/react.test.ts index 411f0c508851..73284e88212a 100644 --- a/libs/ledger-live-common/src/families/cosmos/react.test.ts +++ b/libs/ledger-live-common/src/families/cosmos/react.test.ts @@ -4,7 +4,7 @@ import "../../__tests__/test-helpers/dom-polyfill"; import invariant from "invariant"; import { renderHook, act } from "@testing-library/react"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { getAccountBridge, getCurrencyBridge } from "../../bridge"; import { getCryptoCurrencyById } from "../../currencies"; import { setEnv } from "@ledgerhq/live-env"; @@ -68,7 +68,7 @@ describe("cosmos/react", () => { expect(account.cosmosResources?.delegations?.some(d => d.amount[0] === 0)).toBe(false); expect(Array.isArray(result.current)).toBe(true); expect(result.current.length).toBe((delegations as CosmosDelegation[]).length); - const { code } = getAccountUnit(account); + const { code } = getAccountCurrency(account).units[0]; expect(result.current[0].formattedAmount.split(" ")[1]).toBe(code); expect(result.current[0].formattedPendingRewards.split(" ")[1]).toBe(code); expect(typeof result.current[0].rank).toBe("number"); diff --git a/libs/ledger-live-common/src/families/cosmos/react.ts b/libs/ledger-live-common/src/families/cosmos/react.ts index 6016712cc40c..245db5a08bf0 100644 --- a/libs/ledger-live-common/src/families/cosmos/react.ts +++ b/libs/ledger-live-common/src/families/cosmos/react.ts @@ -13,7 +13,7 @@ import type { CosmosAccount, } from "./types"; import { mapDelegations, searchFilter as defaultSearchFilter } from "./logic"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import useMemoOnce from "../../hooks/useMemoOnce"; import cryptoFactory from "./chain/chain"; @@ -44,7 +44,7 @@ export function useCosmosFamilyMappedDelegations( const delegations = account.cosmosResources?.delegations; invariant(delegations, "cosmos: delegations is required"); - const unit = getAccountUnit(account); + const unit = getAccountCurrency(account).units[0]; return useMemo(() => { const mappedDelegations = mapDelegations(delegations || [], validators, unit); return mode === "claimReward" diff --git a/libs/ledger-live-common/src/families/cosmos/transaction.ts b/libs/ledger-live-common/src/families/cosmos/transaction.ts index 9fc638312c8d..fce25f554a00 100644 --- a/libs/ledger-live-common/src/families/cosmos/transaction.ts +++ b/libs/ledger-live-common/src/families/cosmos/transaction.ts @@ -7,7 +7,7 @@ import { toTransactionCommonRaw, toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import { Account } from "@ledgerhq/types-live"; @@ -21,7 +21,7 @@ ${mode.toUpperCase()} ${ : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) @@ -34,7 +34,7 @@ ${ .map( v => " " + - formatCurrencyUnit(getAccountUnit(account), v.amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], v.amount, { disableRounding: true, }) + " -> " + @@ -42,7 +42,7 @@ ${ ) .join("\n") }${!sourceValidator ? "" : "\n source validator=" + sourceValidator} -with fees=${fees ? formatCurrencyUnit(getAccountUnit(account), fees) : "?"}${ +with fees=${fees ? formatCurrencyUnit(getAccountCurrency(account).units[0], fees) : "?"}${ !memo ? "" : `\n memo=${memo}` }`; diff --git a/libs/ledger-live-common/src/families/crypto_org/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/crypto_org/__snapshots__/bridge.integration.test.ts.snap index 7f18a6c01c48..73947a2770dd 100644 --- a/libs/ledger-live-common/src/families/crypto_org/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/crypto_org/__snapshots__/bridge.integration.test.ts.snap @@ -16,16 +16,13 @@ exports[`crypto_org_croeseid currency bridge scanAccounts crypto_org_croeseid se "freshAddressPath": "44'/394'/0'/0/0", "id": "js:2:crypto_org_croeseid:tcro1k5u8tzh8nsfm6uqwlc48xz4g5j3mm8xx9zy5y9:", "index": 0, - "name": "Cronos POS Chain Croeseid 1", "nfts": undefined, "operationsCount": 80, "pendingOperations": [], "seedIdentifier": "02bf9e382bf60d6ffaa982534b3e88014ee472bf091b7ff17167fe897807434941", "spendableBalance": "10068099925", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, }, { @@ -42,16 +39,13 @@ exports[`crypto_org_croeseid currency bridge scanAccounts crypto_org_croeseid se "freshAddressPath": "44'/394'/1'/0/0", "id": "js:2:crypto_org_croeseid:tcro1ehq3qxxsyjwvau6v9qn2twv06ut78g4v4g3jmp:", "index": 1, - "name": "Cronos POS Chain Croeseid 2", "nfts": undefined, "operationsCount": 39, "pendingOperations": [], "seedIdentifier": "02bf9e382bf60d6ffaa982534b3e88014ee472bf091b7ff17167fe897807434941", "spendableBalance": "22712183075", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, }, { @@ -68,16 +62,13 @@ exports[`crypto_org_croeseid currency bridge scanAccounts crypto_org_croeseid se "freshAddressPath": "44'/394'/2'/0/0", "id": "js:2:crypto_org_croeseid:tcro1kqfwshusg4v7gfac5j6qmcp4ggxc74fwgk48h9:", "index": 2, - "name": "Cronos POS Chain Croeseid 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "02bf9e382bf60d6ffaa982534b3e88014ee472bf091b7ff17167fe897807434941", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, }, ] diff --git a/libs/ledger-live-common/src/families/crypto_org/account.ts b/libs/ledger-live-common/src/families/crypto_org/account.ts index f2d2e4a76f4a..ca15ecfe1080 100644 --- a/libs/ledger-live-common/src/families/crypto_org/account.ts +++ b/libs/ledger-live-common/src/families/crypto_org/account.ts @@ -1,5 +1,5 @@ import invariant from "invariant"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import type { CryptoOrgAccount } from "./types"; @@ -8,7 +8,7 @@ function formatAccountSpecifics(account: CryptoOrgAccount): string { invariant(cryptoOrgResources, "Cronos POS Chain (formerly Crypto.org) account expected"); if (!cryptoOrgResources) throw new Error("Cronos POS Chain (formerly Crypto.org) account expected"); - const unit = getAccountUnit(account); + const unit = getAccountCurrency(account).units[0]; const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/libs/ledger-live-common/src/families/crypto_org/transaction.ts b/libs/ledger-live-common/src/families/crypto_org/transaction.ts index 9021297bf501..4537db062f73 100644 --- a/libs/ledger-live-common/src/families/crypto_org/transaction.ts +++ b/libs/ledger-live-common/src/families/crypto_org/transaction.ts @@ -8,7 +8,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; export const formatTransaction = ( { mode, amount, recipient, useAllAmount, memo }: Transaction, @@ -20,7 +20,7 @@ ${mode.toUpperCase()} ${ : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/elrond/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/elrond/__snapshots__/bridge.integration.test.ts.snap index 34ab0ed69a82..939964aa75a3 100644 --- a/libs/ledger-live-common/src/families/elrond/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/elrond/__snapshots__/bridge.integration.test.ts.snap @@ -15,17 +15,14 @@ exports[`elrond currency bridge scanAccounts elrond seed 1 1`] = ` "freshAddressPath": "44'/508'/0'/0/0", "id": "js:2:elrond:erd1vgfp3g7azqjx4wsmtt7067m0l62v3psmqzr24j6xvywj2tlz0gesvyzsq2:", "index": 0, - "name": "MultiversX 1", "nfts": undefined, "operationsCount": 6, "pendingOperations": [], "seedIdentifier": "", "spendableBalance": "180162251239346240", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": true, }, { @@ -41,17 +38,14 @@ exports[`elrond currency bridge scanAccounts elrond seed 1 1`] = ` "freshAddressPath": "44'/508'/1'/0/0", "id": "js:2:elrond:erd1pm3gje2lmd5vyldcvuy6jpxgde4rapjpujvujkee6a7jw2zmh4tqre796z:", "index": 1, - "name": "MultiversX 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "", "spendableBalance": "0", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": false, }, ] diff --git a/libs/ledger-live-common/src/families/elrond/bridge.integration.test.ts b/libs/ledger-live-common/src/families/elrond/bridge.integration.test.ts index 6499dfd764bf..909e50148ba4 100644 --- a/libs/ledger-live-common/src/families/elrond/bridge.integration.test.ts +++ b/libs/ledger-live-common/src/families/elrond/bridge.integration.test.ts @@ -41,7 +41,6 @@ const elrond: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "elrond", - unitMagnitude: 18, lastSyncDate: "", balance: "299569965", subAccounts: [ diff --git a/libs/ledger-live-common/src/families/elrond/datasets/elrond1.ts b/libs/ledger-live-common/src/families/elrond/datasets/elrond1.ts index d43143d4d30d..190982826e3a 100644 --- a/libs/ledger-live-common/src/families/elrond/datasets/elrond1.ts +++ b/libs/ledger-live-common/src/families/elrond/datasets/elrond1.ts @@ -11,7 +11,6 @@ export const elrond1: AccountRaw = { pendingOperations: [], operations: [], currencyId: "elrond", - unitMagnitude: 18, balance: "", blockHeight: 0, lastSyncDate: "", diff --git a/libs/ledger-live-common/src/families/elrond/deviceTransactionConfig.ts b/libs/ledger-live-common/src/families/elrond/deviceTransactionConfig.ts index 10670c15ecd5..77b83badd424 100644 --- a/libs/ledger-live-common/src/families/elrond/deviceTransactionConfig.ts +++ b/libs/ledger-live-common/src/families/elrond/deviceTransactionConfig.ts @@ -2,7 +2,7 @@ import type { DeviceTransactionField } from "../../transaction"; import type { TransactionStatus, Transaction } from "./types"; import BigNumber from "bignumber.js"; import { formatCurrencyUnit } from "../../currencies"; -import { decodeTokenAccountId, getAccountUnit } from "../../account"; +import { decodeTokenAccountId, getAccountCurrency } from "../../account"; import { Account } from "@ledgerhq/types-live"; import { isAmountSpentFromBalance } from "./logic"; @@ -48,7 +48,7 @@ function getDeviceTransactionConfig({ fields.push({ type: "text", label: "Amount", - value: formatCurrencyUnit(getAccountUnit(account), new BigNumber(0), { + value: formatCurrencyUnit(getAccountCurrency(account).units[0], new BigNumber(0), { showCode: true, disableRounding: true, }), diff --git a/libs/ledger-live-common/src/families/elrond/formatters.ts b/libs/ledger-live-common/src/families/elrond/formatters.ts index 510611c72662..b0588752ce97 100644 --- a/libs/ledger-live-common/src/families/elrond/formatters.ts +++ b/libs/ledger-live-common/src/families/elrond/formatters.ts @@ -1,6 +1,6 @@ import invariant from "invariant"; import type { Operation } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import type { Unit } from "@ledgerhq/types-cryptoassets"; import type { ElrondAccount, ElrondOperation } from "./types"; @@ -9,7 +9,7 @@ import BigNumber from "bignumber.js"; function formatAccountSpecifics(account: ElrondAccount): string { const { elrondResources } = account; invariant(elrondResources, "elrond account expected"); - const unit = getAccountUnit(account); + const unit = getAccountCurrency(account).units[0]; const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/libs/ledger-live-common/src/families/elrond/js-buildSubAccounts.ts b/libs/ledger-live-common/src/families/elrond/js-buildSubAccounts.ts index 9e2cccbac483..27340ccf6706 100644 --- a/libs/ledger-live-common/src/families/elrond/js-buildSubAccounts.ts +++ b/libs/ledger-live-common/src/families/elrond/js-buildSubAccounts.ts @@ -28,7 +28,6 @@ async function buildElrondESDTTokenAccount({ type: "TokenAccount", id: tokenAccountId, parentId: parentAccountId, - starred: false, token, operationsCount: operations.length, operations, diff --git a/libs/ledger-live-common/src/families/elrond/js-getTransactionStatus.ts b/libs/ledger-live-common/src/families/elrond/js-getTransactionStatus.ts index bc75d31c7d5f..c99081a2b05e 100644 --- a/libs/ledger-live-common/src/families/elrond/js-getTransactionStatus.ts +++ b/libs/ledger-live-common/src/families/elrond/js-getTransactionStatus.ts @@ -9,7 +9,7 @@ import { AmountRequired, } from "@ledgerhq/errors"; import { formatCurrencyUnit } from "../../currencies"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { DECIMALS_LIMIT, MIN_DELEGATION_AMOUNT } from "./constants"; import type { ElrondAccount, Transaction, TransactionStatus } from "./types"; import { isValidAddress, isSelfTransaction, isAmountSpentFromBalance } from "./logic"; @@ -79,9 +79,13 @@ const getTransactionStatus = async ( // All delegate and undelegate transactions must have an amount >= 1 EGLD if (!errors.amount && t.amount.lt(MIN_DELEGATION_AMOUNT)) { - const formattedAmount = formatCurrencyUnit(getAccountUnit(a), MIN_DELEGATION_AMOUNT, { - showCode: true, - }); + const formattedAmount = formatCurrencyUnit( + getAccountCurrency(a).units[0], + MIN_DELEGATION_AMOUNT, + { + showCode: true, + }, + ); if (t.mode === "delegate") { errors.amount = new ElrondMinDelegatedAmountError("", { formattedAmount, @@ -103,9 +107,13 @@ const getTransactionStatus = async ( delegationRemainingBalance.gt(0) && delegationRemainingBalance.lt(MIN_DELEGATION_AMOUNT); if (!errors.amount && t.mode === "unDelegate" && delegationBalanceForbidden) { - const formattedAmount = formatCurrencyUnit(getAccountUnit(a), MIN_DELEGATION_AMOUNT, { - showCode: true, - }); + const formattedAmount = formatCurrencyUnit( + getAccountCurrency(a).units[0], + MIN_DELEGATION_AMOUNT, + { + showCode: true, + }, + ); errors.amount = new ElrondDelegationBelowMinimumError("", { formattedAmount, }); diff --git a/libs/ledger-live-common/src/families/elrond/speculos-deviceActions.ts b/libs/ledger-live-common/src/families/elrond/speculos-deviceActions.ts index 63a85a77bc23..9390ffb433ff 100644 --- a/libs/ledger-live-common/src/families/elrond/speculos-deviceActions.ts +++ b/libs/ledger-live-common/src/families/elrond/speculos-deviceActions.ts @@ -25,7 +25,7 @@ export const acceptMoveBalanceTransaction: DeviceAction = devi title: "Fee", button: SpeculosButton.RIGHT, expectedValue: ({ account, transaction }) => - formatCurrencyUnit(account.unit, transaction.fees || new BigNumber(50000), { + formatCurrencyUnit(account.currency.units[0], transaction.fees || new BigNumber(50000), { showCode: true, disableRounding: true, joinFragmentsSeparator: " ", @@ -59,7 +59,7 @@ export const acceptDelegateTransaction: DeviceAction = deviceA title: "Amount", button: SpeculosButton.RIGHT, expectedValue: ({ account, transaction }) => - formatCurrencyUnit(account.unit, transaction.amount, { + formatCurrencyUnit(account.currency.units[0], transaction.amount, { showCode: true, disableRounding: true, joinFragmentsSeparator: " ", @@ -69,7 +69,7 @@ export const acceptDelegateTransaction: DeviceAction = deviceA title: "Fee", button: SpeculosButton.RIGHT, expectedValue: ({ account, transaction }) => - formatCurrencyUnit(account.unit, transaction.fees || new BigNumber(50000), { + formatCurrencyUnit(account.currency.units[0], transaction.fees || new BigNumber(50000), { showCode: true, disableRounding: true, joinFragmentsSeparator: " ", @@ -104,7 +104,7 @@ export const acceptUndelegateTransaction: DeviceAction = devic title: "Amount", button: SpeculosButton.RIGHT, expectedValue: ({ account }) => - formatCurrencyUnit(account.unit, new BigNumber(0), { + formatCurrencyUnit(account.currency.units[0], new BigNumber(0), { showCode: true, disableRounding: true, joinFragmentsSeparator: " ", @@ -114,7 +114,7 @@ export const acceptUndelegateTransaction: DeviceAction = devic title: "Fee", button: SpeculosButton.RIGHT, expectedValue: ({ account, transaction }) => - formatCurrencyUnit(account.unit, transaction.fees || new BigNumber(50000), { + formatCurrencyUnit(account.currency.units[0], transaction.fees || new BigNumber(50000), { showCode: true, disableRounding: true, joinFragmentsSeparator: " ", @@ -148,7 +148,7 @@ export const acceptWithdrawTransaction: DeviceAction = deviceA title: "Amount", button: SpeculosButton.RIGHT, expectedValue: ({ account }) => - formatCurrencyUnit(account.unit, new BigNumber(0), { + formatCurrencyUnit(account.currency.units[0], new BigNumber(0), { showCode: true, disableRounding: true, joinFragmentsSeparator: " ", @@ -158,7 +158,7 @@ export const acceptWithdrawTransaction: DeviceAction = deviceA title: "Fee", button: SpeculosButton.RIGHT, expectedValue: ({ account, transaction }) => - formatCurrencyUnit(account.unit, transaction.fees || new BigNumber(50000), { + formatCurrencyUnit(account.currency.units[0], transaction.fees || new BigNumber(50000), { showCode: true, disableRounding: true, joinFragmentsSeparator: " ", @@ -237,7 +237,7 @@ export const acceptEsdtTransferTransaction: DeviceAction = dev title: "Fee", button: SpeculosButton.RIGHT, expectedValue: ({ account, transaction }) => - formatCurrencyUnit(account.unit, transaction.fees || new BigNumber(50000), { + formatCurrencyUnit(account.currency.units[0], transaction.fees || new BigNumber(50000), { showCode: true, disableRounding: true, joinFragmentsSeparator: " ", diff --git a/libs/ledger-live-common/src/families/elrond/transaction.ts b/libs/ledger-live-common/src/families/elrond/transaction.ts index 3690a2180839..27e89e7f7583 100644 --- a/libs/ledger-live-common/src/families/elrond/transaction.ts +++ b/libs/ledger-live-common/src/families/elrond/transaction.ts @@ -8,7 +8,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; export const formatTransaction = ( { mode, amount, recipient, useAllAmount, subAccountId }: Transaction, @@ -24,7 +24,7 @@ ${mode.toUpperCase()} ${ : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/filecoin/bridge.integration.test.ts b/libs/ledger-live-common/src/families/filecoin/bridge.integration.test.ts index a11e1d8c8866..2261474cb29a 100644 --- a/libs/ledger-live-common/src/families/filecoin/bridge.integration.test.ts +++ b/libs/ledger-live-common/src/families/filecoin/bridge.integration.test.ts @@ -31,7 +31,6 @@ const filecoin: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "filecoin", - unitMagnitude: 18, lastSyncDate: "", balance: "1000", }, diff --git a/libs/ledger-live-common/src/families/filecoin/transaction.ts b/libs/ledger-live-common/src/families/filecoin/transaction.ts index 0ffa0ccc09ce..3b4883595ef1 100644 --- a/libs/ledger-live-common/src/families/filecoin/transaction.ts +++ b/libs/ledger-live-common/src/families/filecoin/transaction.ts @@ -7,7 +7,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import BigNumber from "bignumber.js"; @@ -21,7 +21,7 @@ SEND ${ : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap index bafb19fd0aef..72711dc55642 100644 --- a/libs/ledger-live-common/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap @@ -10,16 +10,13 @@ exports[`hedera currency bridge scanAccounts hedera seed 1 1`] = ` "freshAddressPath": "44/3030", "id": "js:2:hedera:0.0.1040977:hederaBip44", "index": 0, - "name": "Hedera 1", "nfts": undefined, "operationsCount": 5, "pendingOperations": [], "seedIdentifier": "9e92a312233d5fd6b5a723875aeea2cea81a8e48ffc00341cff6dffcfd3ab7f2", "spendableBalance": "89208179", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, }, ] diff --git a/libs/ledger-live-common/src/families/hedera/bridge.integration.test.ts b/libs/ledger-live-common/src/families/hedera/bridge.integration.test.ts index c07e534058ab..3275811b32e1 100644 --- a/libs/ledger-live-common/src/families/hedera/bridge.integration.test.ts +++ b/libs/ledger-live-common/src/families/hedera/bridge.integration.test.ts @@ -35,7 +35,6 @@ const hedera: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "hedera", - unitMagnitude: 8, lastSyncDate: "", balance: "0", }, diff --git a/libs/ledger-live-common/src/families/hedera/js-receive.ts b/libs/ledger-live-common/src/families/hedera/js-receive.ts index 56cf6bb7d261..2b475fac42b7 100644 --- a/libs/ledger-live-common/src/families/hedera/js-receive.ts +++ b/libs/ledger-live-common/src/families/hedera/js-receive.ts @@ -28,9 +28,7 @@ const receive = ( }); if (r.publicKey !== account.seedIdentifier) { - throw new WrongDeviceForAccount(`WrongDeviceForAccount ${account.name}`, { - accountName: account.name, - }); + throw new WrongDeviceForAccount(); } o.next({ diff --git a/libs/ledger-live-common/src/families/hedera/speculos-deviceActions.ts b/libs/ledger-live-common/src/families/hedera/speculos-deviceActions.ts index e04ff5f2f42a..469c07c9b4d7 100644 --- a/libs/ledger-live-common/src/families/hedera/speculos-deviceActions.ts +++ b/libs/ledger-live-common/src/families/hedera/speculos-deviceActions.ts @@ -2,6 +2,7 @@ import type { DeviceAction } from "../../bot/types"; import type { Transaction } from "./types"; import { formatCurrencyUnit } from "../../currencies"; import { deviceActionFlow, SpeculosButton } from "../../bot/specs"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; export const acceptTransaction: DeviceAction = deviceActionFlow({ steps: [ @@ -30,9 +31,9 @@ export const acceptTransaction: DeviceAction = deviceActionFlo { title: "Amount", button: SpeculosButton.RIGHT, - expectedValue: ({ account: { unit }, status: { amount } }) => { + expectedValue: ({ account, status: { amount } }) => { return ( - formatCurrencyUnit(unit, amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { disableRounding: true, showAllDigits: true, }) + " hbar" @@ -42,8 +43,8 @@ export const acceptTransaction: DeviceAction = deviceActionFlo { title: "Fee", button: SpeculosButton.RIGHT, - expectedValue: ({ account: { unit }, status: { estimatedFees } }) => - formatCurrencyUnit(unit, estimatedFees, { + expectedValue: ({ account, status: { estimatedFees } }) => + formatCurrencyUnit(getAccountCurrency(account).units[0], estimatedFees, { disableRounding: true, showAllDigits: true, }) + " hbar", diff --git a/libs/ledger-live-common/src/families/hedera/tests/js-estimateMaxSpendable.integration.test.ts b/libs/ledger-live-common/src/families/hedera/tests/js-estimateMaxSpendable.integration.test.ts index fda591599ece..bc4b076aecaa 100644 --- a/libs/ledger-live-common/src/families/hedera/tests/js-estimateMaxSpendable.integration.test.ts +++ b/libs/ledger-live-common/src/families/hedera/tests/js-estimateMaxSpendable.integration.test.ts @@ -12,8 +12,6 @@ const account: Account = { index: 0, freshAddress: "", freshAddressPath: "", - name: "", - starred: false, used: false, balance: new BigNumber(100000000), spendableBalance: new BigNumber(0), @@ -42,13 +40,6 @@ const account: Account = { WEEK: { latestDate: null, balances: [] }, }, swapHistory: [], - unit: { - name: "", - code: "", - magnitude: 0, - showAllDigits: undefined, - prefixCode: undefined, - }, }; describe("js-estimateMaxSpendable", () => { diff --git a/libs/ledger-live-common/src/families/hedera/tests/js-transaction.test.ts b/libs/ledger-live-common/src/families/hedera/tests/js-transaction.test.ts index 733928e296a7..daa503e99bb7 100644 --- a/libs/ledger-live-common/src/families/hedera/tests/js-transaction.test.ts +++ b/libs/ledger-live-common/src/families/hedera/tests/js-transaction.test.ts @@ -12,8 +12,6 @@ const account: Account = { index: 0, freshAddress: "", freshAddressPath: "", - name: "", - starred: false, used: false, balance: new BigNumber(200000), spendableBalance: new BigNumber(0), @@ -42,13 +40,6 @@ const account: Account = { WEEK: { latestDate: null, balances: [] }, }, swapHistory: [], - unit: { - name: "", - code: "", - magnitude: 0, - showAllDigits: undefined, - prefixCode: undefined, - }, }; const transaction: Transaction = { diff --git a/libs/ledger-live-common/src/families/hedera/tests/transaction.test.ts b/libs/ledger-live-common/src/families/hedera/tests/transaction.test.ts index f6e502618e23..64e8e76c14bf 100644 --- a/libs/ledger-live-common/src/families/hedera/tests/transaction.test.ts +++ b/libs/ledger-live-common/src/families/hedera/tests/transaction.test.ts @@ -11,8 +11,6 @@ const account: Account = { index: 0, freshAddress: "", freshAddressPath: "", - name: "", - starred: false, used: false, balance: new BigNumber(200000), spendableBalance: new BigNumber(0), @@ -29,7 +27,13 @@ const account: Account = { explorerViews: [], name: "", ticker: "", - units: [], + units: [ + { + name: "", + code: "", + magnitude: 0, + }, + ], }, operationsCount: 0, operations: [], @@ -41,13 +45,6 @@ const account: Account = { WEEK: { latestDate: null, balances: [] }, }, swapHistory: [], - unit: { - name: "", - code: "", - magnitude: 0, - showAllDigits: undefined, - prefixCode: undefined, - }, }; const transaction: Transaction = { diff --git a/libs/ledger-live-common/src/families/hedera/tests/utils.integration.test.ts b/libs/ledger-live-common/src/families/hedera/tests/utils.integration.test.ts index 085531a1564b..a2a51ba3629b 100644 --- a/libs/ledger-live-common/src/families/hedera/tests/utils.integration.test.ts +++ b/libs/ledger-live-common/src/families/hedera/tests/utils.integration.test.ts @@ -12,8 +12,6 @@ const account: Account = { index: 0, freshAddress: "", freshAddressPath: "", - name: "", - starred: false, used: false, balance: new BigNumber(100000000), spendableBalance: new BigNumber(0), @@ -42,13 +40,6 @@ const account: Account = { WEEK: { latestDate: null, balances: [] }, }, swapHistory: [], - unit: { - name: "", - code: "", - magnitude: 0, - showAllDigits: undefined, - prefixCode: undefined, - }, }; const transaction: Transaction = { diff --git a/libs/ledger-live-common/src/families/hedera/transaction.ts b/libs/ledger-live-common/src/families/hedera/transaction.ts index 1285ad7f4041..fd072b473fcd 100644 --- a/libs/ledger-live-common/src/families/hedera/transaction.ts +++ b/libs/ledger-live-common/src/families/hedera/transaction.ts @@ -7,11 +7,11 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; export function formatTransaction(transaction: Transaction, account: Account): string { - const amount = formatCurrencyUnit(getAccountUnit(account), transaction.amount, { + const amount = formatCurrencyUnit(getAccountCurrency(account).units[0], transaction.amount, { showCode: true, disableRounding: true, }); diff --git a/libs/ledger-live-common/src/families/internet_computer/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/internet_computer/__snapshots__/bridge.integration.test.ts.snap index 880cac3c6a67..5ed0e34e5fd7 100644 --- a/libs/ledger-live-common/src/families/internet_computer/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/internet_computer/__snapshots__/bridge.integration.test.ts.snap @@ -10,16 +10,13 @@ exports[`internet_computer currency bridge scanAccounts internet_computer seed 1 "freshAddressPath": "44'/223'/0'/0/0", "id": "js:2:internet_computer:046f08828871028b6e3cb5c13b2e2a8fa6e93f0b3ca7379171f6b7b45877955a2430925f76ec69ccb3cd8738859a8e29dcd0f9a357f1d009d2b497c6c8f63aa7cf:internet_computer", "index": 0, - "name": "Internet Computer 1", "nfts": undefined, "operationsCount": 1, "pendingOperations": [], "seedIdentifier": "046f08828871028b6e3cb5c13b2e2a8fa6e93f0b3ca7379171f6b7b45877955a2430925f76ec69ccb3cd8738859a8e29dcd0f9a357f1d009d2b497c6c8f63aa7cf", "spendableBalance": "1000000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": true, "xpub": "046f08828871028b6e3cb5c13b2e2a8fa6e93f0b3ca7379171f6b7b45877955a2430925f76ec69ccb3cd8738859a8e29dcd0f9a357f1d009d2b497c6c8f63aa7cf", }, @@ -31,16 +28,13 @@ exports[`internet_computer currency bridge scanAccounts internet_computer seed 1 "freshAddressPath": "44'/223'/0'/0/1", "id": "js:2:internet_computer:043ad9dda46b25cbcf98b2d91f8aa289d08078fa960d13e7d77a571c625eedcb62b6c26a86408d30a6bbdea5ecad6f7603bc1ba11fbb62caa315789f333ece2c8c:internet_computer", "index": 1, - "name": "Internet Computer 2", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "046f08828871028b6e3cb5c13b2e2a8fa6e93f0b3ca7379171f6b7b45877955a2430925f76ec69ccb3cd8738859a8e29dcd0f9a357f1d009d2b497c6c8f63aa7cf", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 8, "used": false, "xpub": "043ad9dda46b25cbcf98b2d91f8aa289d08078fa960d13e7d77a571c625eedcb62b6c26a86408d30a6bbdea5ecad6f7603bc1ba11fbb62caa315789f333ece2c8c", }, diff --git a/libs/ledger-live-common/src/families/internet_computer/bridge.integration.test.ts b/libs/ledger-live-common/src/families/internet_computer/bridge.integration.test.ts index 405ea65d9c3a..6541dff7aecd 100644 --- a/libs/ledger-live-common/src/families/internet_computer/bridge.integration.test.ts +++ b/libs/ledger-live-common/src/families/internet_computer/bridge.integration.test.ts @@ -50,10 +50,8 @@ const internet_computer: CurrenciesData = { lastSyncDate: "", seedIdentifier: SEED_IDENTIFIER, spendableBalance: "1000000", - starred: false, swapHistory: [], syncHash: undefined, - unitMagnitude: 8, used: true, xpub: SEED_IDENTIFIER, }, diff --git a/libs/ledger-live-common/src/families/internet_computer/transaction.ts b/libs/ledger-live-common/src/families/internet_computer/transaction.ts index 2c2007d6a984..deed07b34b23 100644 --- a/libs/ledger-live-common/src/families/internet_computer/transaction.ts +++ b/libs/ledger-live-common/src/families/internet_computer/transaction.ts @@ -7,7 +7,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; import BigNumber from "bignumber.js"; @@ -21,7 +21,7 @@ SEND ${ : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/near/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/near/__snapshots__/bridge.integration.test.ts.snap index a0052cd6292b..024ea8609052 100644 --- a/libs/ledger-live-common/src/families/near/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/near/__snapshots__/bridge.integration.test.ts.snap @@ -10,7 +10,6 @@ exports[`near currency bridge scanAccounts near seed 1 1`] = ` "freshAddressPath": "44'/397'/0'/0'/0'", "id": "js:2:near:18d68decb70d4d4fd267d19a0d25edc06ad079e69ded41233a10976cf36391ec:nearbip44h", "index": 0, - "name": "NEAR 1", "nearResources": { "availableBalance": "10000000000000000001", "pendingBalance": "0", @@ -31,10 +30,8 @@ exports[`near currency bridge scanAccounts near seed 1 1`] = ` "pendingOperations": [], "seedIdentifier": "ed25519:2fxYBxPh3sP1KeqraqSNcUBx8chZ4RHpVAnQ1rFK9xNF", "spendableBalance": "15332281393064900000000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 24, "used": true, }, { @@ -45,7 +42,6 @@ exports[`near currency bridge scanAccounts near seed 1 1`] = ` "freshAddressPath": "44'/397'/0'/0'/1'", "id": "js:2:near:6cbf3b0f8d8b4667bf64bf44b4fefa830e4cef0e5da1e5cfb4015b5a755c4ac0:nearbip44h", "index": 1, - "name": "NEAR 2", "nearResources": { "availableBalance": "0", "pendingBalance": "0", @@ -58,10 +54,8 @@ exports[`near currency bridge scanAccounts near seed 1 1`] = ` "pendingOperations": [], "seedIdentifier": "ed25519:2fxYBxPh3sP1KeqraqSNcUBx8chZ4RHpVAnQ1rFK9xNF", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 24, "used": false, }, { @@ -72,7 +66,6 @@ exports[`near currency bridge scanAccounts near seed 1 1`] = ` "freshAddressPath": "44'/397'/0'/0'/2'", "id": "js:2:near:59dff1cf9185758c0c2f878c37a175280f3967dca8fee6e4ad0c4aa26daf8e5c:nearbip44h", "index": 2, - "name": "NEAR 3", "nearResources": { "availableBalance": "0", "pendingBalance": "0", @@ -85,10 +78,8 @@ exports[`near currency bridge scanAccounts near seed 1 1`] = ` "pendingOperations": [], "seedIdentifier": "ed25519:2fxYBxPh3sP1KeqraqSNcUBx8chZ4RHpVAnQ1rFK9xNF", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 24, "used": false, }, ] diff --git a/libs/ledger-live-common/src/families/near/banner.test.ts b/libs/ledger-live-common/src/families/near/banner.test.ts index aeea39a01edb..78852671f140 100644 --- a/libs/ledger-live-common/src/families/near/banner.test.ts +++ b/libs/ledger-live-common/src/families/near/banner.test.ts @@ -27,14 +27,12 @@ const cheapValidator: NearValidatorItem = { const account: NearAccount = { type: "Account", id: "js:2:near:d812a582d0b30c1a13041fd564e5f0c4325804b1dd2447d63ab6b9a424747363:nearbip44h", - starred: false, used: true, seedIdentifier: "ed25519:DewDMzsc2cnMYBrALESrf3vKWLp3zBB4HJnPoyvPL945", derivationMode: "nearbip44h", index: 1, freshAddress: "d812a582d0b30c1a13041fd564e5f0c4325804b1dd2447d63ab6b9a424747363", freshAddressPath: "44'/397'/0'/0'/1'", - name: "NEAR 2", blockHeight: 85373729, creationDate: new Date("2022-12-08T09:42:54.396Z"), balance: new BigNumber("3.10368633212077468946995e+23"), @@ -42,7 +40,6 @@ const account: NearAccount = { operations: [], operationsCount: 3, pendingOperations: [], - unit: { name: "NEAR", code: "NEAR", magnitude: 24 }, currency: { type: "CryptoCurrency", id: "near", diff --git a/libs/ledger-live-common/src/families/near/react.ts b/libs/ledger-live-common/src/families/near/react.ts index 7e975334f5f4..840baad4ca94 100644 --- a/libs/ledger-live-common/src/families/near/react.ts +++ b/libs/ledger-live-common/src/families/near/react.ts @@ -10,7 +10,7 @@ import { NearAccount, } from "@ledgerhq/coin-near/types"; import { getCurrentNearPreloadData } from "@ledgerhq/coin-near/preload"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; export function useNearMappedStakingPositions(account: NearAccount): NearMappedStakingPosition[] { const { validators } = getCurrentNearPreloadData(); @@ -18,7 +18,7 @@ export function useNearMappedStakingPositions(account: NearAccount): NearMappedS invariant(stakingPositions, "near: stakingPositions is required"); - const unit = getAccountUnit(account); + const unit = getAccountCurrency(account).units[0]; return useMemo(() => { const mappedStakingPositions = mapStakingPositions(stakingPositions || [], validators, unit); diff --git a/libs/ledger-live-common/src/families/polkadot/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/polkadot/__snapshots__/bridge.integration.test.ts.snap index ff34e52d9bc3..b01220bed3e8 100644 --- a/libs/ledger-live-common/src/families/polkadot/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/polkadot/__snapshots__/bridge.integration.test.ts.snap @@ -10,7 +10,6 @@ exports[`polkadot currency bridge scanAccounts polkadot seed 1 1`] = ` "freshAddressPath": "44'/354'/0'/0'/0'", "id": "js:2:polkadot:13zVX83ztWY9DmiutFRW87Bbgkbv1Qp1fcfpoJidbdHwk35d:polkadotbip44", "index": 0, - "name": "Polkadot 1", "nfts": undefined, "operationsCount": 93, "pendingOperations": [], @@ -24,10 +23,8 @@ exports[`polkadot currency bridge scanAccounts polkadot seed 1 1`] = ` }, "seedIdentifier": "c71b1e00ca34fdd14ea065917a67168675828927e3adc3b68f444bf85b4d24be", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 10, "used": true, }, { @@ -38,7 +35,6 @@ exports[`polkadot currency bridge scanAccounts polkadot seed 1 1`] = ` "freshAddressPath": "44'/354'/1'/0'/0'", "id": "js:2:polkadot:12KUB3Rr4ac4di5JGpzTY5GNQkDVNkPUkcj2MGFTmzazMSds:polkadotbip44", "index": 1, - "name": "Polkadot 2", "nfts": undefined, "operationsCount": 73, "pendingOperations": [], @@ -52,10 +48,8 @@ exports[`polkadot currency bridge scanAccounts polkadot seed 1 1`] = ` }, "seedIdentifier": "c71b1e00ca34fdd14ea065917a67168675828927e3adc3b68f444bf85b4d24be", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 10, "used": true, }, { @@ -66,7 +60,6 @@ exports[`polkadot currency bridge scanAccounts polkadot seed 1 1`] = ` "freshAddressPath": "44'/354'/2'/0'/0'", "id": "js:2:polkadot:13rdR5srvWF53VkNeJuz5WkGkG6FSXQQA7ZB5QBGig4ATCs9:polkadotbip44", "index": 2, - "name": "Polkadot 3", "nfts": undefined, "operationsCount": 3, "pendingOperations": [], @@ -80,10 +73,8 @@ exports[`polkadot currency bridge scanAccounts polkadot seed 1 1`] = ` }, "seedIdentifier": "c71b1e00ca34fdd14ea065917a67168675828927e3adc3b68f444bf85b4d24be", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 10, "used": true, }, { @@ -94,7 +85,6 @@ exports[`polkadot currency bridge scanAccounts polkadot seed 1 1`] = ` "freshAddressPath": "44'/354'/3'/0'/0'", "id": "js:2:polkadot:164VgK6ooZ4fUuU4iFVwpSuXwFXGLU5nTTWzG64vrDqgipwh:polkadotbip44", "index": 3, - "name": "Polkadot 4", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], @@ -108,10 +98,8 @@ exports[`polkadot currency bridge scanAccounts polkadot seed 1 1`] = ` }, "seedIdentifier": "c71b1e00ca34fdd14ea065917a67168675828927e3adc3b68f444bf85b4d24be", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 10, "used": false, }, ] diff --git a/libs/ledger-live-common/src/families/ripple/bridge.integration.test.ts b/libs/ledger-live-common/src/families/ripple/bridge.integration.test.ts index e169540652e0..b4a841239436 100644 --- a/libs/ledger-live-common/src/families/ripple/bridge.integration.test.ts +++ b/libs/ledger-live-common/src/families/ripple/bridge.integration.test.ts @@ -153,7 +153,6 @@ const dataset: DatasetTest = { operations: [], pendingOperations: [], currencyId: "ripple", - unitMagnitude: 6, lastSyncDate: "", balance: "21000310", }, diff --git a/libs/ledger-live-common/src/families/ripple/transaction.ts b/libs/ledger-live-common/src/families/ripple/transaction.ts index 0ecdaba4be73..5150102e38ea 100644 --- a/libs/ledger-live-common/src/families/ripple/transaction.ts +++ b/libs/ledger-live-common/src/families/ripple/transaction.ts @@ -8,7 +8,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; export const formatTransaction = ( { amount, recipient, fee, tag, useAllAmount }: Transaction, @@ -17,7 +17,7 @@ export const formatTransaction = ( SEND ${ useAllAmount ? "MAX" - : formatCurrencyUnit(getAccountUnit(account), amount, { + : formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) @@ -26,7 +26,7 @@ TO ${recipient} with fee=${ !fee ? "?" - : formatCurrencyUnit(getAccountUnit(account), fee, { + : formatCurrencyUnit(getAccountCurrency(account).units[0], fee, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/solana/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/solana/__snapshots__/bridge.integration.test.ts.snap index 9cb33dd35ba6..3d9550066af6 100644 --- a/libs/ledger-live-common/src/families/solana/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/solana/__snapshots__/bridge.integration.test.ts.snap @@ -10,7 +10,6 @@ exports[`solana currency bridge scanAccounts solana seed 1 1`] = ` "freshAddressPath": "44'/501'", "id": "js:2:solana:AQbkEagmPgmsdAfS4X8V8UyJnXXjVPMvjeD15etqQ3Jh:solanaMain", "index": 0, - "name": "Solana 1", "nfts": undefined, "operationsCount": 3, "pendingOperations": [], @@ -20,10 +19,8 @@ exports[`solana currency bridge scanAccounts solana seed 1 1`] = ` "unstakeReserve": "0", }, "spendableBalance": "82498960", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 9, "used": true, }, { @@ -34,7 +31,6 @@ exports[`solana currency bridge scanAccounts solana seed 1 1`] = ` "freshAddressPath": "44'/501'/0'", "id": "js:2:solana:6rEgdtB3sgjKJnRE172YEr9z6qUyr4nFW28vJokuD36A:solanaSub", "index": 0, - "name": "Solana 1", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], @@ -44,10 +40,8 @@ exports[`solana currency bridge scanAccounts solana seed 1 1`] = ` "unstakeReserve": "0", }, "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 9, "used": false, }, ] diff --git a/libs/ledger-live-common/src/families/solana/banner.test.ts b/libs/ledger-live-common/src/families/solana/banner.test.ts index 2664fcd16dd1..4329c25c7e86 100644 --- a/libs/ledger-live-common/src/families/solana/banner.test.ts +++ b/libs/ledger-live-common/src/families/solana/banner.test.ts @@ -42,14 +42,12 @@ const cheapValidator: ValidatorsAppValidator = { const account: SolanaAccount = { type: "Account", id: "js:2:solana:8Qs1nzggCjEYhFcj4yHwiS5s3QzNeCPWpQnntFdwUYhN:solanaSub", - starred: false, used: false, seedIdentifier: "5gaQapKG9MpAWMLtZFoDqzmKfxMN2FXDVNAKiGFaMXGg", derivationMode: "solanaSub", index: 0, freshAddress: "8Qs1nzggCjEYhFcj4yHwiS5s3QzNeCPWpQnntFdwUYhN", freshAddressPath: "44'/501'/0'", - name: "Solana 1", blockHeight: 177035578, creationDate: new Date("2023-02-08T12:57:45.000Z"), balance: new BigNumber("606150870"), @@ -57,7 +55,6 @@ const account: SolanaAccount = { operations: [], operationsCount: 2, pendingOperations: [], - unit: { name: "SOL", code: "SOL", magnitude: 9 }, currency: { type: "CryptoCurrency", id: "solana", diff --git a/libs/ledger-live-common/src/families/stacks/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/stacks/__snapshots__/bridge.integration.test.ts.snap index 800a381da73c..67e3b6ddb0ee 100644 --- a/libs/ledger-live-common/src/families/stacks/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/stacks/__snapshots__/bridge.integration.test.ts.snap @@ -10,16 +10,13 @@ exports[`stacks currency bridge scanAccounts stacks seed 1 1`] = ` "freshAddressPath": "44'/5757'/0'/0/0", "id": "js:2:stacks:022a460decc9dba8c452927fecb33d7ae25a8d79dc5442b84feaf8f3aa0e2b575d:", "index": 0, - "name": "Stacks 1", "nfts": undefined, "operationsCount": 3, "pendingOperations": [], "seedIdentifier": "022a460decc9dba8c452927fecb33d7ae25a8d79dc5442b84feaf8f3aa0e2b575d", "spendableBalance": "2074969", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "022a460decc9dba8c452927fecb33d7ae25a8d79dc5442b84feaf8f3aa0e2b575d", }, @@ -31,16 +28,13 @@ exports[`stacks currency bridge scanAccounts stacks seed 1 1`] = ` "freshAddressPath": "44'/5757'/1'/0/0", "id": "js:2:stacks:034bbb21911e9d4502ac170162c5c05cbba65cbb79e5b46adf95152af2d0e78a45:", "index": 1, - "name": "Stacks 2", "nfts": undefined, "operationsCount": 1, "pendingOperations": [], "seedIdentifier": "022a460decc9dba8c452927fecb33d7ae25a8d79dc5442b84feaf8f3aa0e2b575d", "spendableBalance": "1000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "034bbb21911e9d4502ac170162c5c05cbba65cbb79e5b46adf95152af2d0e78a45", }, @@ -52,16 +46,13 @@ exports[`stacks currency bridge scanAccounts stacks seed 1 1`] = ` "freshAddressPath": "44'/5757'/2'/0/0", "id": "js:2:stacks:020637c4d824458f6a11551f51df9e5be9e96c2e3a2e5bdb25d2916cc1dd5ba2d7:", "index": 2, - "name": "Stacks 3", "nfts": undefined, "operationsCount": 1, "pendingOperations": [], "seedIdentifier": "022a460decc9dba8c452927fecb33d7ae25a8d79dc5442b84feaf8f3aa0e2b575d", "spendableBalance": "2000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "020637c4d824458f6a11551f51df9e5be9e96c2e3a2e5bdb25d2916cc1dd5ba2d7", }, @@ -73,16 +64,13 @@ exports[`stacks currency bridge scanAccounts stacks seed 1 1`] = ` "freshAddressPath": "44'/5757'/3'/0/0", "id": "js:2:stacks:02e57bb8c28c4c768cf65f8e28935482e40afbb33168d26810199f39a719cc05f0:", "index": 3, - "name": "Stacks 4", "nfts": undefined, "operationsCount": 1, "pendingOperations": [], "seedIdentifier": "022a460decc9dba8c452927fecb33d7ae25a8d79dc5442b84feaf8f3aa0e2b575d", "spendableBalance": "3000", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": true, "xpub": "02e57bb8c28c4c768cf65f8e28935482e40afbb33168d26810199f39a719cc05f0", }, @@ -94,16 +82,13 @@ exports[`stacks currency bridge scanAccounts stacks seed 1 1`] = ` "freshAddressPath": "44'/5757'/4'/0/0", "id": "js:2:stacks:0264b6d44f720fa50055dc294276bf15ce22e4f3dec48510b317ab8c07419c1b77:", "index": 4, - "name": "Stacks 5", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "022a460decc9dba8c452927fecb33d7ae25a8d79dc5442b84feaf8f3aa0e2b575d", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 6, "used": false, "xpub": "0264b6d44f720fa50055dc294276bf15ce22e4f3dec48510b317ab8c07419c1b77", }, diff --git a/libs/ledger-live-common/src/families/stacks/bridge.integration.test.ts b/libs/ledger-live-common/src/families/stacks/bridge.integration.test.ts index c6849c8a43fa..9d37ee7d8a08 100644 --- a/libs/ledger-live-common/src/families/stacks/bridge.integration.test.ts +++ b/libs/ledger-live-common/src/families/stacks/bridge.integration.test.ts @@ -54,7 +54,6 @@ const stacks: CurrenciesData = { xpub: SEED_IDENTIFIER_PUBKEY, pendingOperations: [], currencyId: "stacks", - unitMagnitude: 6, lastSyncDate: "", balance: "1000", }, diff --git a/libs/ledger-live-common/src/families/stacks/transaction.ts b/libs/ledger-live-common/src/families/stacks/transaction.ts index c3cf2ffa818f..9cbe61fb81bf 100644 --- a/libs/ledger-live-common/src/families/stacks/transaction.ts +++ b/libs/ledger-live-common/src/families/stacks/transaction.ts @@ -10,7 +10,7 @@ import { toTransactionCommonRaw, toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; export const formatTransaction = ( @@ -23,7 +23,7 @@ SEND ${ : amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/stellar/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/stellar/__snapshots__/bridge.integration.test.ts.snap index 1ed772ff7ce9..4d3a73974511 100644 --- a/libs/ledger-live-common/src/families/stellar/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/stellar/__snapshots__/bridge.integration.test.ts.snap @@ -10,17 +10,14 @@ exports[`stellar currency bridge scanAccounts stellar seed 1 1`] = ` "freshAddressPath": "44'/148'/0'", "id": "js:2:stellar:GAT4LBXYJGJJJRSNK74NPFLO55CDDXSYVMQODSEAAH3M6EY4S7LPH5GV:sep5", "index": 0, - "name": "Stellar 1", "nfts": undefined, "operationsCount": 52, "pendingOperations": [], "seedIdentifier": "27c586f8499294c64d57f8d7956eef4431de58ab20e1c88001f6cf131c97d6f3", "spendableBalance": "311064500", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 7, "used": true, }, { @@ -31,17 +28,14 @@ exports[`stellar currency bridge scanAccounts stellar seed 1 1`] = ` "freshAddressPath": "44'/148'/1'", "id": "js:2:stellar:GAIXIJBMYPTSF2CDVQ35WOTULCLZIE4W2SDEK3RQGAA3A22BPWY7R53Z:sep5", "index": 1, - "name": "Stellar 2", "nfts": undefined, "operationsCount": 17, "pendingOperations": [], "seedIdentifier": "27c586f8499294c64d57f8d7956eef4431de58ab20e1c88001f6cf131c97d6f3", "spendableBalance": "79999725", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 7, "used": true, }, { @@ -52,17 +46,14 @@ exports[`stellar currency bridge scanAccounts stellar seed 1 1`] = ` "freshAddressPath": "44'/148'/2'", "id": "js:2:stellar:GCDDN6T2LJN3T7SPWJQV6BCCL5KNY5GBN7X4CMSZLDEXDHXAH32TOAHS:sep5", "index": 2, - "name": "Stellar 3", "nfts": undefined, "operationsCount": 10, "pendingOperations": [], "seedIdentifier": "27c586f8499294c64d57f8d7956eef4431de58ab20e1c88001f6cf131c97d6f3", "spendableBalance": "44999225", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 7, "used": true, }, { @@ -73,17 +64,14 @@ exports[`stellar currency bridge scanAccounts stellar seed 1 1`] = ` "freshAddressPath": "44'/148'/3'", "id": "js:2:stellar:GAHQKL7UW5DSNJXWNA4ASJ6D2I7JYFWVHDFWYJZK3WDR4BUTG27K2PWC:sep5", "index": 3, - "name": "Stellar 4", "nfts": undefined, "operationsCount": 14, "pendingOperations": [], "seedIdentifier": "27c586f8499294c64d57f8d7956eef4431de58ab20e1c88001f6cf131c97d6f3", "spendableBalance": "10145700", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 7, "used": true, }, { @@ -94,17 +82,14 @@ exports[`stellar currency bridge scanAccounts stellar seed 1 1`] = ` "freshAddressPath": "44'/148'/4'", "id": "js:2:stellar:GBQMOU2WYJUP6AKY53FFKZJGQMDWCMTWSOUTZ5DVIAQPVW7AJUHSX2M5:sep5", "index": 4, - "name": "Stellar 5", "nfts": undefined, "operationsCount": 3, "pendingOperations": [], "seedIdentifier": "27c586f8499294c64d57f8d7956eef4431de58ab20e1c88001f6cf131c97d6f3", "spendableBalance": "0", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 7, "used": true, }, { @@ -115,17 +100,14 @@ exports[`stellar currency bridge scanAccounts stellar seed 1 1`] = ` "freshAddressPath": "44'/148'/5'", "id": "js:2:stellar:GAJEKFXY76YWDSKJESDOKS2EGKRMCHSIC5AU32SU7OF54E5VVREUHXLH:sep5", "index": 5, - "name": "Stellar 6", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "27c586f8499294c64d57f8d7956eef4431de58ab20e1c88001f6cf131c97d6f3", "spendableBalance": "0", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 7, "used": false, }, ] diff --git a/libs/ledger-live-common/src/families/stellar/bridge.integration.test.ts b/libs/ledger-live-common/src/families/stellar/bridge.integration.test.ts index 6c905c8c359e..d84e8eb4e498 100644 --- a/libs/ledger-live-common/src/families/stellar/bridge.integration.test.ts +++ b/libs/ledger-live-common/src/families/stellar/bridge.integration.test.ts @@ -64,7 +64,6 @@ const dataset: DatasetTest = { operations: [], pendingOperations: [], currencyId: "stellar", - unitMagnitude: 7, lastSyncDate: "", balance: "371210662", spendableBalance: "371210662", @@ -274,7 +273,6 @@ const dataset: DatasetTest = { operations: [], pendingOperations: [], currencyId: "stellar", - unitMagnitude: 7, lastSyncDate: "", balance: "59999500", spendableBalance: "59999500", @@ -315,7 +313,6 @@ const dataset: DatasetTest = { lastSyncDate: "", operations: [], pendingOperations: [], - unitMagnitude: 7, }, }, { @@ -335,7 +332,6 @@ const dataset: DatasetTest = { lastSyncDate: "", operations: [], pendingOperations: [], - unitMagnitude: 7, }, }, { @@ -355,7 +351,6 @@ const dataset: DatasetTest = { lastSyncDate: "", operations: [], pendingOperations: [], - unitMagnitude: 7, }, transactions: [ { diff --git a/libs/ledger-live-common/src/families/stellar/speculos-deviceActions.ts b/libs/ledger-live-common/src/families/stellar/speculos-deviceActions.ts index 694a21a1392c..13d1d3b821fa 100644 --- a/libs/ledger-live-common/src/families/stellar/speculos-deviceActions.ts +++ b/libs/ledger-live-common/src/families/stellar/speculos-deviceActions.ts @@ -2,6 +2,7 @@ import type { DeviceAction } from "../../bot/types"; import type { Transaction } from "./types"; import { formatCurrencyUnit } from "../../currencies"; import { deviceActionFlow, formatDeviceAmount, SpeculosButton } from "../../bot/specs"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/index"; const expectedAmount = ({ account, status, transaction }) => { if (transaction.assetCode && transaction.assetIssuer) { @@ -35,7 +36,7 @@ export const acceptTransaction: DeviceAction = deviceActionFlo title: "Max Fee", button: SpeculosButton.RIGHT, expectedValue: ({ account, status }) => - formatCurrencyUnit(account.unit, status.estimatedFees, { + formatCurrencyUnit(getAccountCurrency(account).units[0], status.estimatedFees, { disableRounding: true, }) + " XLM", }, diff --git a/libs/ledger-live-common/src/families/stellar/tokens.ts b/libs/ledger-live-common/src/families/stellar/tokens.ts index 891b05f9ab8f..17b56affa8c8 100644 --- a/libs/ledger-live-common/src/families/stellar/tokens.ts +++ b/libs/ledger-live-common/src/families/stellar/tokens.ts @@ -34,7 +34,6 @@ const buildStellarTokenAccount = ({ type: "TokenAccount", id, parentId: parentAccountId, - starred: false, token, operationsCount: operations.length, operations: operations.map(op => ({ diff --git a/libs/ledger-live-common/src/families/stellar/transaction.ts b/libs/ledger-live-common/src/families/stellar/transaction.ts index 9c636c6a998d..f9be235d0c89 100644 --- a/libs/ledger-live-common/src/families/stellar/transaction.ts +++ b/libs/ledger-live-common/src/families/stellar/transaction.ts @@ -9,7 +9,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; export const formatTransaction = ( @@ -24,7 +24,7 @@ export const formatTransaction = ( SEND ${ useAllAmount ? "MAX" - : formatCurrencyUnit(getAccountUnit(account), amount, { + : formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) @@ -33,7 +33,7 @@ export const formatTransaction = ( with fees=${ !fees ? "?" - : formatCurrencyUnit(getAccountUnit(account), fees, { + : formatCurrencyUnit(getAccountCurrency(account).units[0], fees, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/tezos/bridge.integration.test.ts b/libs/ledger-live-common/src/families/tezos/bridge.integration.test.ts index b7699f97bec2..dde12271bdbf 100644 --- a/libs/ledger-live-common/src/families/tezos/bridge.integration.test.ts +++ b/libs/ledger-live-common/src/families/tezos/bridge.integration.test.ts @@ -23,7 +23,6 @@ function makeAccountRaw(name, pubkey, address, derivationMode): TezosAccountRaw operations: [], pendingOperations: [], currencyId: "tezos", - unitMagnitude: 6, lastSyncDate: "", balance: "0", xpub: pubkey, diff --git a/libs/ledger-live-common/src/families/tezos/fixtures/makeAccount.ts b/libs/ledger-live-common/src/families/tezos/fixtures/makeAccount.ts index 6afe7e97bafa..1e4d8be86289 100644 --- a/libs/ledger-live-common/src/families/tezos/fixtures/makeAccount.ts +++ b/libs/ledger-live-common/src/families/tezos/fixtures/makeAccount.ts @@ -3,7 +3,7 @@ import { TezosAccount } from "../types"; import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies"; export function makeAccount( - name: string, + _name: string, pubkey: string, address: string, isRevelead: boolean, @@ -11,7 +11,6 @@ export function makeAccount( return { id: `js:2:tezos:${pubkey}:${"standard"}`, seedIdentifier: address, - name: "Tezos " + name, derivationMode: "", index: 0, freshAddress: address, @@ -24,12 +23,10 @@ export function makeAccount( xpub: pubkey, subAccounts: [], type: "Account", - starred: false, used: true, spendableBalance: new BigNumber(100), creationDate: new Date(), currency: getCryptoCurrencyById("tezos"), - unit: { name: "xtz", code: "xtz", magnitude: 6 }, operationsCount: 0, swapHistory: [], balanceHistoryCache: { diff --git a/libs/ledger-live-common/src/families/tezos/transaction.ts b/libs/ledger-live-common/src/families/tezos/transaction.ts index ea670d3df144..cb18d0fb00c7 100644 --- a/libs/ledger-live-common/src/families/tezos/transaction.ts +++ b/libs/ledger-live-common/src/families/tezos/transaction.ts @@ -8,7 +8,7 @@ import { toTransactionStatusRawCommon as toTransactionStatusRaw, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; export const formatTransaction = ( { @@ -31,16 +31,18 @@ export const formatTransaction = ( ${mode.toUpperCase()} ${ useAllAmount ? "MAX" - : formatCurrencyUnit(getAccountUnit(account), amount, { + : formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }) } TO ${recipient} -with fees=${!fees ? "?" : formatCurrencyUnit(mainAccount.unit, fees)} +with fees=${!fees ? "?" : formatCurrencyUnit(mainAccount.currency.units[0], fees)} with gasLimit=${!gasLimit ? "?" : gasLimit.toString()} with storageLimit=${!storageLimit ? "?" : storageLimit.toString()} -(estimatedFees ${!estimatedFees ? "?" : formatCurrencyUnit(mainAccount.unit, estimatedFees)})`; +(estimatedFees ${ + !estimatedFees ? "?" : formatCurrencyUnit(mainAccount.currency.units[0], estimatedFees) + })`; }; export const fromTransactionRaw = (tr: TransactionRaw): Transaction => { const common = fromTransactionCommonRaw(tr); diff --git a/libs/ledger-live-common/src/families/tron/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/tron/__snapshots__/bridge.integration.test.ts.snap index 312f32efa915..e0ce1da4ec57 100644 --- a/libs/ledger-live-common/src/families/tron/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/tron/__snapshots__/bridge.integration.test.ts.snap @@ -10,13 +10,11 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "freshAddressPath": "44'/195'/0'/0/0", "id": "js:2:tron:TRqkRnAj6ceJFYAn2p1eE7aWrgBBwtdhS9:", "index": 0, - "name": "Tron 1", "nfts": undefined, "operationsCount": 196, "pendingOperations": [], "seedIdentifier": "049fc19cbc6d0f525b1c6947b4a36aec74b48e15f2531c5e7e58d272c9e926786da290eb3505d8fab9c83818c1174d9bc96fd18e0527365cba6b9534d43ad5052b", "spendableBalance": "1781772", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, @@ -58,7 +56,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` }, ], }, - "unitMagnitude": 6, "used": true, }, { @@ -69,7 +66,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRqkRnAj6ceJFYAn2p1eE7aWrgBBwtdhS9:", "pendingOperations": [], "spendableBalance": "5000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002775", "type": "TokenAccountRaw", @@ -82,7 +78,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRqkRnAj6ceJFYAn2p1eE7aWrgBBwtdhS9:", "pendingOperations": [], "spendableBalance": "10000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002830", "type": "TokenAccountRaw", @@ -95,7 +90,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRqkRnAj6ceJFYAn2p1eE7aWrgBBwtdhS9:", "pendingOperations": [], "spendableBalance": "5000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002398", "type": "TokenAccountRaw", @@ -108,7 +102,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRqkRnAj6ceJFYAn2p1eE7aWrgBBwtdhS9:", "pendingOperations": [], "spendableBalance": "5000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002573", "type": "TokenAccountRaw", @@ -121,7 +114,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRqkRnAj6ceJFYAn2p1eE7aWrgBBwtdhS9:", "pendingOperations": [], "spendableBalance": "5000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002736", "type": "TokenAccountRaw", @@ -134,7 +126,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRqkRnAj6ceJFYAn2p1eE7aWrgBBwtdhS9:", "pendingOperations": [], "spendableBalance": "10000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002814", "type": "TokenAccountRaw", @@ -147,7 +138,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRqkRnAj6ceJFYAn2p1eE7aWrgBBwtdhS9:", "pendingOperations": [], "spendableBalance": "26888000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002000", "type": "TokenAccountRaw", @@ -160,7 +150,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRqkRnAj6ceJFYAn2p1eE7aWrgBBwtdhS9:", "pendingOperations": [], "spendableBalance": "46825830", - "starred": false, "swapHistory": [], "tokenId": "tron/trc20/tla2f6vpqdgre67v1736s7bj8ray5wyju7", "type": "TokenAccountRaw", @@ -173,7 +162,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRqkRnAj6ceJFYAn2p1eE7aWrgBBwtdhS9:", "pendingOperations": [], "spendableBalance": "376", - "starred": false, "swapHistory": [], "tokenId": "tron/trc20/tr7nhqjekqxgtci8q8zy4pl8otszgjlj6t", "type": "TokenAccountRaw", @@ -186,13 +174,11 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "freshAddressPath": "44'/195'/1'/0/0", "id": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "index": 1, - "name": "Tron 2", "nfts": undefined, "operationsCount": 24, "pendingOperations": [], "seedIdentifier": "049fc19cbc6d0f525b1c6947b4a36aec74b48e15f2531c5e7e58d272c9e926786da290eb3505d8fab9c83818c1174d9bc96fd18e0527365cba6b9534d43ad5052b", "spendableBalance": "2094000", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, @@ -224,7 +210,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` }, "votes": [], }, - "unitMagnitude": 6, "used": true, }, { @@ -235,7 +220,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "1000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002578", "type": "TokenAccountRaw", @@ -248,7 +232,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "20000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002798", "type": "TokenAccountRaw", @@ -261,7 +244,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "5000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002544", "type": "TokenAccountRaw", @@ -274,7 +256,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "15000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002775", "type": "TokenAccountRaw", @@ -287,7 +268,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "14", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1000226", "type": "TokenAccountRaw", @@ -300,7 +280,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "5000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002398", "type": "TokenAccountRaw", @@ -313,7 +292,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "15000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002573", "type": "TokenAccountRaw", @@ -326,7 +304,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "10000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002672", "type": "TokenAccountRaw", @@ -339,7 +316,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "20000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002597", "type": "TokenAccountRaw", @@ -352,7 +328,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "5000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002736", "type": "TokenAccountRaw", @@ -365,7 +340,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "10000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002517", "type": "TokenAccountRaw", @@ -378,7 +352,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "10000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002814", "type": "TokenAccountRaw", @@ -391,7 +364,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "9012000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002000", "type": "TokenAccountRaw", @@ -404,7 +376,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "1000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc20/tla2f6vpqdgre67v1736s7bj8ray5wyju7", "type": "TokenAccountRaw", @@ -417,7 +388,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:THAe4BNVxp293qgyQEqXEkHMpPcqtG73bi:", "pendingOperations": [], "spendableBalance": "2013400", - "starred": false, "swapHistory": [], "tokenId": "tron/trc20/tr7nhqjekqxgtci8q8zy4pl8otszgjlj6t", "type": "TokenAccountRaw", @@ -430,13 +400,11 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "freshAddressPath": "44'/195'/2'/0/0", "id": "js:2:tron:TWepUnyBzHx2aoEgNGotZHCybZJZe1AHdW:", "index": 2, - "name": "Tron 3", "nfts": undefined, "operationsCount": 2, "pendingOperations": [], "seedIdentifier": "049fc19cbc6d0f525b1c6947b4a36aec74b48e15f2531c5e7e58d272c9e926786da290eb3505d8fab9c83818c1174d9bc96fd18e0527365cba6b9534d43ad5052b", "spendableBalance": "0", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, @@ -462,7 +430,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` }, "votes": [], }, - "unitMagnitude": 6, "used": true, }, { @@ -473,7 +440,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TWepUnyBzHx2aoEgNGotZHCybZJZe1AHdW:", "pendingOperations": [], "spendableBalance": "2000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002000", "type": "TokenAccountRaw", @@ -486,7 +452,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TWepUnyBzHx2aoEgNGotZHCybZJZe1AHdW:", "pendingOperations": [], "spendableBalance": "10000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc20/tla2f6vpqdgre67v1736s7bj8ray5wyju7", "type": "TokenAccountRaw", @@ -499,13 +464,11 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "freshAddressPath": "44'/195'/3'/0/0", "id": "js:2:tron:TTBPBK1n8nX1VkYPh7fsM56KL6G9HRM7Vc:", "index": 3, - "name": "Tron 4", "nfts": undefined, "operationsCount": 1, "pendingOperations": [], "seedIdentifier": "049fc19cbc6d0f525b1c6947b4a36aec74b48e15f2531c5e7e58d272c9e926786da290eb3505d8fab9c83818c1174d9bc96fd18e0527365cba6b9534d43ad5052b", "spendableBalance": "3000000", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, @@ -531,7 +494,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` }, "votes": [], }, - "unitMagnitude": 6, "used": true, }, { @@ -542,7 +504,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TTBPBK1n8nX1VkYPh7fsM56KL6G9HRM7Vc:", "pendingOperations": [], "spendableBalance": "183", - "starred": false, "swapHistory": [], "tokenId": "tron/trc20/tr7nhqjekqxgtci8q8zy4pl8otszgjlj6t", "type": "TokenAccountRaw", @@ -555,13 +516,11 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "freshAddressPath": "44'/195'/4'/0/0", "id": "js:2:tron:TRzAd8k78ob5wTWHepeDpQruUuKYffh48x:", "index": 4, - "name": "Tron 5", "nfts": undefined, "operationsCount": 1, "pendingOperations": [], "seedIdentifier": "049fc19cbc6d0f525b1c6947b4a36aec74b48e15f2531c5e7e58d272c9e926786da290eb3505d8fab9c83818c1174d9bc96fd18e0527365cba6b9534d43ad5052b", "spendableBalance": "2000000", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, @@ -587,7 +546,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` }, "votes": [], }, - "unitMagnitude": 6, "used": true, }, { @@ -598,7 +556,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRzAd8k78ob5wTWHepeDpQruUuKYffh48x:", "pendingOperations": [], "spendableBalance": "5000000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002544", "type": "TokenAccountRaw", @@ -611,7 +568,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TRzAd8k78ob5wTWHepeDpQruUuKYffh48x:", "pendingOperations": [], "spendableBalance": "756", - "starred": false, "swapHistory": [], "tokenId": "tron/trc20/tr7nhqjekqxgtci8q8zy4pl8otszgjlj6t", "type": "TokenAccountRaw", @@ -624,13 +580,11 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "freshAddressPath": "44'/195'/5'/0/0", "id": "js:2:tron:TCKFUfFr8EU9CVfKzq8vLPxkZVG4vAewTd:", "index": 5, - "name": "Tron 6", "nfts": undefined, "operationsCount": 2, "pendingOperations": [], "seedIdentifier": "049fc19cbc6d0f525b1c6947b4a36aec74b48e15f2531c5e7e58d272c9e926786da290eb3505d8fab9c83818c1174d9bc96fd18e0527365cba6b9534d43ad5052b", "spendableBalance": "0", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, @@ -656,7 +610,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` }, "votes": [], }, - "unitMagnitude": 6, "used": true, }, { @@ -667,7 +620,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TCKFUfFr8EU9CVfKzq8vLPxkZVG4vAewTd:", "pendingOperations": [], "spendableBalance": "100000", - "starred": false, "swapHistory": [], "tokenId": "tron/trc10/1002000", "type": "TokenAccountRaw", @@ -680,13 +632,11 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "freshAddressPath": "44'/195'/6'/0/0", "id": "js:2:tron:TReR4zdFE78NaKgUUUeHiVGXSGcCD4cNyj:", "index": 6, - "name": "Tron 7", "nfts": undefined, "operationsCount": 5, "pendingOperations": [], "seedIdentifier": "049fc19cbc6d0f525b1c6947b4a36aec74b48e15f2531c5e7e58d272c9e926786da290eb3505d8fab9c83818c1174d9bc96fd18e0527365cba6b9534d43ad5052b", "spendableBalance": "2505006", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, @@ -712,7 +662,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` }, "votes": [], }, - "unitMagnitude": 6, "used": true, }, { @@ -723,7 +672,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "parentId": "js:2:tron:TReR4zdFE78NaKgUUUeHiVGXSGcCD4cNyj:", "pendingOperations": [], "spendableBalance": "623", - "starred": false, "swapHistory": [], "tokenId": "tron/trc20/tr7nhqjekqxgtci8q8zy4pl8otszgjlj6t", "type": "TokenAccountRaw", @@ -736,13 +684,11 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` "freshAddressPath": "44'/195'/7'/0/0", "id": "js:2:tron:TXFeV31qgUQYMLog3axKJeEBbXpQFtHsXD:", "index": 7, - "name": "Tron 8", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "049fc19cbc6d0f525b1c6947b4a36aec74b48e15f2531c5e7e58d272c9e926786da290eb3505d8fab9c83818c1174d9bc96fd18e0527365cba6b9534d43ad5052b", "spendableBalance": "0", - "starred": false, "swapHistory": [], "syncHash": undefined, "tronResources": { @@ -767,7 +713,6 @@ exports[`tron currency bridge scanAccounts tron seed 1 1`] = ` }, "votes": [], }, - "unitMagnitude": 6, "used": false, }, ] diff --git a/libs/ledger-live-common/src/families/tron/bridge.integration.test.ts b/libs/ledger-live-common/src/families/tron/bridge.integration.test.ts index b74ad704e69f..01a814450b6d 100644 --- a/libs/ledger-live-common/src/families/tron/bridge.integration.test.ts +++ b/libs/ledger-live-common/src/families/tron/bridge.integration.test.ts @@ -751,7 +751,6 @@ const tron: CurrenciesData = { freshAddressPath: "44'/195'/0'/0/0", pendingOperations: [], currencyId: "tron", - unitMagnitude: 18, balance: "10006000", spendableBalance: "1606000", subAccounts: [], @@ -830,7 +829,6 @@ const tron: CurrenciesData = { freshAddressPath: "44'/195'/0'/0/0", pendingOperations: [], currencyId: "tron", - unitMagnitude: 18, balance: "26000197", spendableBalance: "197", subAccounts: [], @@ -1178,7 +1176,6 @@ const tron: CurrenciesData = { seedIdentifier: "0416c02ea5e939eed995f75c44667a66b9c8dfddede8c6d54211f64b1dace9e1c40bcbbd5341480f43a5f37c7ab3a0c53f9cccff57d59bb0368d1e744135d7f68a", name: "Tron 1", - starred: false, used: true, derivationMode: "", index: 0, @@ -1190,7 +1187,6 @@ const tron: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "tron", - unitMagnitude: 6, lastSyncDate: "2023-12-21T12:28:03.177Z", balance: "859005207", spendableBalance: "252128207", @@ -1227,7 +1223,6 @@ const tron: CurrenciesData = { seedIdentifier: "0416c02ea5e939eed995f75c44667a66b9c8dfddede8c6d54211f64b1dace9e1c40bcbbd5341480f43a5f37c7ab3a0c53f9cccff57d59bb0368d1e744135d7f68a", name: "Tron 3", - starred: false, used: true, derivationMode: "", index: 2, @@ -1239,7 +1234,6 @@ const tron: CurrenciesData = { operations: [], pendingOperations: [], currencyId: "tron", - unitMagnitude: 6, lastSyncDate: "2024-02-15T17:11:40.339Z", balance: "15000004", spendableBalance: "10000004", diff --git a/libs/ledger-live-common/src/families/tron/bridge/js.ts b/libs/ledger-live-common/src/families/tron/bridge/js.ts index fa47973c6635..bd57ecfc6795 100644 --- a/libs/ledger-live-common/src/families/tron/bridge/js.ts +++ b/libs/ledger-live-common/src/families/tron/bridge/js.ts @@ -37,11 +37,11 @@ import { makeSync, makeScanAccounts } from "../../../bridge/jsHelpers"; import { defaultUpdateTransaction } from "@ledgerhq/coin-framework/bridge/jsHelpers"; import { formatCurrencyUnit } from "../../../currencies"; import { - getAccountUnit, getMainAccount, encodeTokenAccountId, emptyHistoryCache, encodeAccountId, + getAccountCurrency, } from "../../../account"; import { getOperationsPageSize } from "../../../pagination"; import { @@ -468,7 +468,6 @@ const getAccountShape = async (info: AccountShapeInfo, syncConfig) => { const sub: TokenAccount = { type: "TokenAccount", id, - starred: false, parentId: accountId, token, balance: bnBalance, @@ -820,7 +819,7 @@ const getTransactionStatus = async (a: TronAccount, t: Transaction): Promise { @@ -66,7 +66,7 @@ ${t.mode.toUpperCase()}${t.resource ? " " + t.resource : ""} ${ : t.amount.isZero() ? "" : " " + - formatCurrencyUnit(getAccountUnit(account), t.amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], t.amount, { showCode: true, disableRounding: true, }) diff --git a/libs/ledger-live-common/src/families/vechain/__snapshots__/bridge.integration.test.ts.snap b/libs/ledger-live-common/src/families/vechain/__snapshots__/bridge.integration.test.ts.snap index bf474afefab3..d96d7c9ca0bd 100644 --- a/libs/ledger-live-common/src/families/vechain/__snapshots__/bridge.integration.test.ts.snap +++ b/libs/ledger-live-common/src/families/vechain/__snapshots__/bridge.integration.test.ts.snap @@ -10,16 +10,13 @@ exports[`vechain currency bridge scanAccounts vechain seed 1 1`] = ` "freshAddressPath": "44'/818'/0'/0/0", "id": "js:2:vechain:0x0fe6688548f0C303932bB197B0A96034f1d74dba:vechain", "index": 0, - "name": "Vechain 1", "nfts": undefined, "operationsCount": 1, "pendingOperations": [], "seedIdentifier": "04de5a8f11cc426ff5617aeffd397c5dd77b58424662f368f2cd539a8c42fd2e7d0c6245c9c3a4306f70d7f292e95642651a6832d66fd9823fa6a0af575113e94e", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": true, }, { @@ -28,7 +25,6 @@ exports[`vechain currency bridge scanAccounts vechain seed 1 1`] = ` "operationsCount": 1, "parentId": "js:2:vechain:0x0fe6688548f0C303932bB197B0A96034f1d74dba:vechain", "pendingOperations": [], - "starred": false, "swapHistory": [], "tokenId": "vechain/vip180/vtho", "type": "TokenAccountRaw", @@ -41,16 +37,13 @@ exports[`vechain currency bridge scanAccounts vechain seed 1 1`] = ` "freshAddressPath": "44'/818'/0'/0/1", "id": "js:2:vechain:0x02961B92B8D20A4ea12f1f1CeFA74Dd7B4355A86:vechain", "index": 1, - "name": "Vechain 2", "nfts": undefined, "operationsCount": 1, "pendingOperations": [], "seedIdentifier": "04de5a8f11cc426ff5617aeffd397c5dd77b58424662f368f2cd539a8c42fd2e7d0c6245c9c3a4306f70d7f292e95642651a6832d66fd9823fa6a0af575113e94e", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": true, }, { @@ -59,7 +52,6 @@ exports[`vechain currency bridge scanAccounts vechain seed 1 1`] = ` "operationsCount": 0, "parentId": "js:2:vechain:0x02961B92B8D20A4ea12f1f1CeFA74Dd7B4355A86:vechain", "pendingOperations": [], - "starred": false, "swapHistory": [], "tokenId": "vechain/vip180/vtho", "type": "TokenAccountRaw", @@ -72,16 +64,13 @@ exports[`vechain currency bridge scanAccounts vechain seed 1 1`] = ` "freshAddressPath": "44'/818'/0'/0/2", "id": "js:2:vechain:0xFbC8653C0b842dd33361CE8938B24e407dd4838C:vechain", "index": 2, - "name": "Vechain 3", "nfts": undefined, "operationsCount": 0, "pendingOperations": [], "seedIdentifier": "04de5a8f11cc426ff5617aeffd397c5dd77b58424662f368f2cd539a8c42fd2e7d0c6245c9c3a4306f70d7f292e95642651a6832d66fd9823fa6a0af575113e94e", - "starred": false, "subAccounts": [], "swapHistory": [], "syncHash": undefined, - "unitMagnitude": 18, "used": false, }, { @@ -90,7 +79,6 @@ exports[`vechain currency bridge scanAccounts vechain seed 1 1`] = ` "operationsCount": 0, "parentId": "js:2:vechain:0xFbC8653C0b842dd33361CE8938B24e407dd4838C:vechain", "pendingOperations": [], - "starred": false, "swapHistory": [], "tokenId": "vechain/vip180/vtho", "type": "TokenAccountRaw", diff --git a/libs/ledger-live-common/src/families/vechain/account.ts b/libs/ledger-live-common/src/families/vechain/account.ts index 0ec938283637..6ce5b5dbc58e 100644 --- a/libs/ledger-live-common/src/families/vechain/account.ts +++ b/libs/ledger-live-common/src/families/vechain/account.ts @@ -1,9 +1,9 @@ import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; function formatAccountSpecifics(account: Account): string { - const unit = getAccountUnit(account); + const unit = getAccountCurrency(account).units[0]; const formatConfig = { disableRounding: true, alwaysShowSign: false, diff --git a/libs/ledger-live-common/src/families/vechain/datasets/vechain.ts b/libs/ledger-live-common/src/families/vechain/datasets/vechain.ts index 804a5414a5ee..0fbe9cec88ec 100644 --- a/libs/ledger-live-common/src/families/vechain/datasets/vechain.ts +++ b/libs/ledger-live-common/src/families/vechain/datasets/vechain.ts @@ -16,7 +16,6 @@ export const vechain1: AccountRaw = { pendingOperations: [], currencyId: "vechain", feesCurrencyId: "vechain/vip180/vtho", - unitMagnitude: 18, lastSyncDate: "2023-04-21T14:22:48.395Z", balance: "10000000000000000000", subAccounts: [ @@ -46,7 +45,6 @@ export const vechain2: AccountRaw = { pendingOperations: [], currencyId: "vechain", feesCurrencyId: "vechain/vip180/vtho", - unitMagnitude: 18, lastSyncDate: "2023-04-21T14:22:48.395Z", balance: "10000000000000000000", subAccounts: [ @@ -77,7 +75,6 @@ export const vechain3: AccountRaw = { pendingOperations: [], currencyId: "vechain", feesCurrencyId: "vechain/vip180/vtho", - unitMagnitude: 18, lastSyncDate: "2023-11-13T13:55:32.004Z", balance: "0", subAccounts: [ diff --git a/libs/ledger-live-common/src/families/vechain/js-synchronisation.ts b/libs/ledger-live-common/src/families/vechain/js-synchronisation.ts index 72a589ffac81..5f6daabe6f47 100644 --- a/libs/ledger-live-common/src/families/vechain/js-synchronisation.ts +++ b/libs/ledger-live-common/src/families/vechain/js-synchronisation.ts @@ -70,7 +70,6 @@ const getAccountShape: GetAccountShape = async info => { blockHeight, pendingOperations: (initialAccount?.subAccounts && initialAccount.subAccounts[0]?.pendingOperations) || [], - starred: (initialAccount?.subAccounts && initialAccount.subAccounts[0]?.starred) || false, balanceHistoryCache: (initialAccount?.subAccounts && initialAccount.subAccounts[0]?.balanceHistoryCache) || emptyHistoryCache, diff --git a/libs/ledger-live-common/src/families/vechain/transaction.ts b/libs/ledger-live-common/src/families/vechain/transaction.ts index a713c0b9fe69..834fa18c142b 100644 --- a/libs/ledger-live-common/src/families/vechain/transaction.ts +++ b/libs/ledger-live-common/src/families/vechain/transaction.ts @@ -7,7 +7,7 @@ import { toTransactionStatusRawCommon, } from "@ledgerhq/coin-framework/serialization"; import type { Account } from "@ledgerhq/types-live"; -import { getAccountUnit } from "../../account"; +import { getAccountCurrency } from "../../account"; import { formatCurrencyUnit } from "../../currencies"; export const formatTransaction = (t: Transaction, account: Account): string => { @@ -20,7 +20,7 @@ export const formatTransaction = (t: Transaction, account: Account): string => { } else { displayedAmount = " " + - formatCurrencyUnit(getAccountUnit(account), amount, { + formatCurrencyUnit(getAccountCurrency(account).units[0], amount, { showCode: true, disableRounding: true, }); diff --git a/libs/ledger-live-common/src/hooks/useAccountsWithFundsListener.test.tsx b/libs/ledger-live-common/src/hooks/useAccountsWithFundsListener.test.tsx index b04ac74636db..98362063e267 100644 --- a/libs/ledger-live-common/src/hooks/useAccountsWithFundsListener.test.tsx +++ b/libs/ledger-live-common/src/hooks/useAccountsWithFundsListener.test.tsx @@ -13,7 +13,6 @@ const polygon = getCryptoCurrencyById("polygon"); const ethMockAccount: Account = { type: "Account", id: "js:2:ethereum:0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3:", - starred: false, used: true, seedIdentifier: "0441996d9ce858d8fd6304dd790e645500fc6cee7ae0fccfee8c8fa884dfa8ccf1f6f8cc82cc0aa71fc659c895a8a43b69f918b08a22b3a6145a0bbd93c5cb9308", @@ -21,7 +20,6 @@ const ethMockAccount: Account = { index: 0, freshAddress: "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3", freshAddressPath: "44'/60'/0'/0/0", - name: "Ethereum 1", blockHeight: 16626551, creationDate: new Date("2021-03-23T14:17:07.001Z"), balance: new BigNumber("22913015427119498"), @@ -29,11 +27,6 @@ const ethMockAccount: Account = { operations: [], operationsCount: 0, pendingOperations: [], - unit: { - name: "ether", - code: "ETH", - magnitude: 18, - }, currency: eth, lastSyncDate: new Date("2023-02-14T11:01:19.252Z"), swapHistory: [], @@ -48,7 +41,6 @@ const ethMockAccount: Account = { const polygonMockAccount: Account = { type: "Account", id: "js:2:polygon:0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3:", - starred: false, used: true, seedIdentifier: "0441996d9ce858d8fd6304dd790e645500fc6cee7ae0fccfee8c8fa884dfa8ccf1f6f8cc82cc0aa71fc659c895a8a43b69f918b08a22b3a6145a0bbd93c5cb9308", @@ -56,7 +48,6 @@ const polygonMockAccount: Account = { index: 0, freshAddress: "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3", freshAddressPath: "44'/60'/0'/0/0", - name: "Polygon 1", blockHeight: 16626551, creationDate: new Date("2021-03-23T14:17:07.001Z"), balance: new BigNumber("22913015427119498"), @@ -64,11 +55,6 @@ const polygonMockAccount: Account = { operations: [], operationsCount: 0, pendingOperations: [], - unit: { - name: "matic", - code: "MATIC", - magnitude: 18, - }, currency: polygon, lastSyncDate: new Date("2023-02-14T11:01:19.252Z"), swapHistory: [], diff --git a/libs/ledger-live-common/src/hw/actions/app.ts b/libs/ledger-live-common/src/hw/actions/app.ts index cad367af8330..025e0435ded3 100644 --- a/libs/ledger-live-common/src/hw/actions/app.ts +++ b/libs/ledger-live-common/src/hw/actions/app.ts @@ -15,7 +15,6 @@ import type { Input as ConnectAppInput, } from "../connectApp"; import { useReplaySubject } from "../../observable"; -import { getAccountName } from "../../account"; import type { Device, Action } from "./types"; import { shouldUpgrade } from "../../apps"; import { AppOp, SkippedAppOp } from "../../apps/types"; @@ -23,6 +22,7 @@ import perFamilyAccount from "../../generated/account"; import type { Account, DeviceInfo, FirmwareUpdateContext } from "@ledgerhq/types-live"; import type { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets"; import { getImplementation, ImplementationType } from "./implementations"; +import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; export type State = { isLoading: boolean; @@ -542,7 +542,7 @@ export const createAction = ( ? state.derivation.address !== appRequest.account.freshAddress && state.derivation.address !== appRequest.account.seedIdentifier // Use-case added for Hedera ? { - accountName: getAccountName(appRequest.account), + accountName: getDefaultAccountName(appRequest.account), } : null : null, diff --git a/libs/ledger-live-common/src/hw/signMessage/index.test.ts b/libs/ledger-live-common/src/hw/signMessage/index.test.ts index 6fbb842dad0d..b62aed8ef377 100644 --- a/libs/ledger-live-common/src/hw/signMessage/index.test.ts +++ b/libs/ledger-live-common/src/hw/signMessage/index.test.ts @@ -88,19 +88,12 @@ const createAccount = (crypto: CryptoCurrency): Account => ({ index: 0, freshAddress: "0x01", freshAddressPath: "44'/60'/0'/0/0", - name: "Ethereum 1", - starred: false, used: false, balance: new BigNumber("51281813126095913"), spendableBalance: new BigNumber("51281813126095913"), creationDate: new Date(), blockHeight: 8168983, currency: crypto, - unit: { - name: "satoshi", - code: "BTC", - magnitude: 5, - }, operationsCount: 0, operations: [], pendingOperations: [], diff --git a/libs/ledger-live-common/src/mock/fixtures/cryptoCurrencies.ts b/libs/ledger-live-common/src/mock/fixtures/cryptoCurrencies.ts index d46f29877bac..605bd3288fc2 100644 --- a/libs/ledger-live-common/src/mock/fixtures/cryptoCurrencies.ts +++ b/libs/ledger-live-common/src/mock/fixtures/cryptoCurrencies.ts @@ -55,7 +55,6 @@ export function createFixtureTokenAccount( operationsCount: 0, operations: [], pendingOperations: [], - starred: false, balanceHistoryCache: { HOUR: { balances: [], @@ -86,8 +85,6 @@ export function createFixtureAccount( index: 0, freshAddress: "0x01", freshAddressPath: "44'/60'/0'/0/0", - name: "Ethereum 1", - starred: false, used: false, balance: new BigNumber("51281813126095913"), spendableBalance: new BigNumber("51281813126095913"), @@ -95,11 +92,6 @@ export function createFixtureAccount( blockHeight: 8168983, currency, xpub: currency.family === "bitcoin" ? "testxpub" : undefined, - unit: { - name: "satoshi", - code: "BTC", - magnitude: 5, - }, operationsCount: 0, operations: [], pendingOperations: [], diff --git a/libs/ledger-live-common/src/platform/converters.ts b/libs/ledger-live-common/src/platform/converters.ts index 019421e26f9a..996e65051ffd 100644 --- a/libs/ledger-live-common/src/platform/converters.ts +++ b/libs/ledger-live-common/src/platform/converters.ts @@ -11,8 +11,10 @@ import { PlatformTokenStandard, PlatformTransaction, } from "./types"; +import { WalletState, accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; export function accountToPlatformAccount( + walletState: WalletState, account: AccountLike, parentAccount?: Account, ): PlatformAccount { @@ -21,21 +23,25 @@ export function accountToPlatformAccount( throw new Error("No 'parentAccount' account provided for token account"); } + const parentName = accountNameWithDefaultSelector(walletState, parentAccount); + return { id: account.id, balance: account.balance, address: parentAccount.freshAddress, blockHeight: parentAccount.blockHeight, lastSyncDate: parentAccount.lastSyncDate, - name: `${parentAccount.name} (${account.token.ticker})`, + name: `${parentName} (${account.token.ticker})`, currency: account.token.id, spendableBalance: account.spendableBalance, }; } + const name = accountNameWithDefaultSelector(walletState, account); + return { id: account.id, - name: account.name, + name, address: account.freshAddress, currency: account.currency.id, balance: account.balance, diff --git a/libs/ledger-live-common/src/platform/logic.test.ts b/libs/ledger-live-common/src/platform/logic.test.ts index c409835ab353..2ea3ae918fd1 100644 --- a/libs/ledger-live-common/src/platform/logic.test.ts +++ b/libs/ledger-live-common/src/platform/logic.test.ts @@ -25,8 +25,10 @@ import { import { RawPlatformTransaction } from "./rawTypes"; import * as serializers from "./serializers"; import { LiveAppManifest } from "./types"; +import { initialState } from "@ledgerhq/live-wallet/store"; describe("receiveOnAccountLogic", () => { + const walletState = initialState; // Given const mockPlatformReceiveRequested = jest.fn(); const mockPlatformReceiveFail = jest.fn(); @@ -62,7 +64,7 @@ describe("receiveOnAccountLogic", () => { jest.spyOn(converters, "accountToPlatformAccount").mockReturnValueOnce(convertedAccount); // When - const result = await receiveOnAccountLogic(context, accountId, uiNavigation); + const result = await receiveOnAccountLogic(walletState, context, accountId, uiNavigation); // Then expect(uiNavigation).toBeCalledTimes(1); @@ -72,7 +74,7 @@ describe("receiveOnAccountLogic", () => { it("calls the tracking for success", async () => { // When - await receiveOnAccountLogic(context, accountId, uiNavigation); + await receiveOnAccountLogic(walletState, context, accountId, uiNavigation); // Then expect(mockPlatformReceiveRequested).toBeCalledTimes(1); @@ -87,7 +89,7 @@ describe("receiveOnAccountLogic", () => { it("returns an error", async () => { // When await expect(async () => { - await receiveOnAccountLogic(context, nonFoundAccountId, uiNavigation); + await receiveOnAccountLogic(walletState, context, nonFoundAccountId, uiNavigation); }).rejects.toThrowError("Account required"); // Then @@ -97,7 +99,7 @@ describe("receiveOnAccountLogic", () => { it("calls the tracking for error", async () => { // When await expect(async () => { - await receiveOnAccountLogic(context, nonFoundAccountId, uiNavigation); + await receiveOnAccountLogic(walletState, context, nonFoundAccountId, uiNavigation); }).rejects.toThrow(); // Then @@ -699,7 +701,6 @@ function createTokenAccount(id = "32"): TokenAccount { operationsCount: 0, operations: [], pendingOperations: [], - starred: false, balanceHistoryCache: { WEEK: { latestDate: null, balances: [] }, HOUR: { latestDate: null, balances: [] }, diff --git a/libs/ledger-live-common/src/platform/logic.ts b/libs/ledger-live-common/src/platform/logic.ts index 520de6167d28..7317ac52f16f 100644 --- a/libs/ledger-live-common/src/platform/logic.ts +++ b/libs/ledger-live-common/src/platform/logic.ts @@ -12,6 +12,7 @@ import { getAccountBridge } from "../bridge/index"; import { Transaction } from "../generated/types"; import { prepareMessageToSign } from "../hw/signMessage/index"; import { Exchange } from "../exchange/types"; +import { WalletState } from "@ledgerhq/live-wallet/store"; export function translateContent(content: string | TranslatableString, locale = "en"): string { if (!content || typeof content === "string") return content; @@ -31,6 +32,7 @@ function getParentAccount(account: AccountLike, fromAccounts: AccountLike[]): Ac } export function receiveOnAccountLogic( + walletState: WalletState, { manifest, accounts, tracking }: WebPlatformContext, accountId: string, uiNavigation: ( @@ -49,7 +51,7 @@ export function receiveOnAccountLogic( } const parentAccount = getParentAccount(account, accounts); - const accountAddress = accountToPlatformAccount(account, parentAccount).address; + const accountAddress = accountToPlatformAccount(walletState, account, parentAccount).address; return uiNavigation(account, parentAccount, accountAddress); } diff --git a/libs/ledger-live-common/src/platform/react.ts b/libs/ledger-live-common/src/platform/react.ts index c9424cb7d640..b7bdf78fb07c 100644 --- a/libs/ledger-live-common/src/platform/react.ts +++ b/libs/ledger-live-common/src/platform/react.ts @@ -17,6 +17,7 @@ import { } from "./types"; import { getParentAccount } from "../account"; import { listCurrencies } from "../currencies"; +import { WalletState } from "@ledgerhq/live-wallet/store"; /** * TODO: we might want to use "searchParams.append" instead of "searchParams.set" @@ -48,18 +49,24 @@ export function usePlatformUrl( }, [manifest.url, manifest.params, inputs]); } -export function usePlatformAccounts(accounts: AccountLike[]): PlatformAccount[] { +export function usePlatformAccounts( + walletState: WalletState, + accounts: AccountLike[], +): PlatformAccount[] { return useMemo(() => { return accounts.map(account => { const parentAccount = getParentAccount(account, accounts); - return accountToPlatformAccount(account, parentAccount); + return accountToPlatformAccount(walletState, account, parentAccount); }); - }, [accounts]); + }, [walletState, accounts]); } -export function useListPlatformAccounts(accounts: AccountLike[]): ListPlatformAccount { - const platformAccounts = usePlatformAccounts(accounts); +export function useListPlatformAccounts( + walletState: WalletState, + accounts: AccountLike[], +): ListPlatformAccount { + const platformAccounts = usePlatformAccounts(walletState, accounts); return useCallback( (filters: AccountFilters = {}) => { return filterPlatformAccounts(platformAccounts, filters); diff --git a/libs/ledger-live-common/src/wallet-api/converters.ts b/libs/ledger-live-common/src/wallet-api/converters.ts index e2fd86efeb75..60e1cdde1951 100644 --- a/libs/ledger-live-common/src/wallet-api/converters.ts +++ b/libs/ledger-live-common/src/wallet-api/converters.ts @@ -11,6 +11,7 @@ import { GetWalletAPITransactionSignFlowInfos, } from "./types"; import { Families } from "@ledgerhq/wallet-api-core"; +import { WalletState, accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; // The namespace is a randomly generated uuid v4 from https://www.uuidgenerator.net/ const NAMESPACE = "c3c78073-6844-409e-9e75-171ab4c7f9a2"; @@ -20,6 +21,7 @@ export const getAccountIdFromWalletAccountId = (walletAccountId: string): string uuidToAccountId.get(walletAccountId); export function accountToWalletAPIAccount( + walletState: WalletState, account: AccountLike, parentAccount?: Account, ): WalletAPIAccount { @@ -34,6 +36,8 @@ export function accountToWalletAPIAccount( const parentWalletApiId = uuidv5(parentAccount.id, NAMESPACE); uuidToAccountId.set(parentWalletApiId, parentAccount.id); + const parentAccountName = accountNameWithDefaultSelector(walletState, parentAccount); + return { id: walletApiId, parentAccountId: parentWalletApiId, @@ -41,15 +45,16 @@ export function accountToWalletAPIAccount( address: parentAccount.freshAddress, blockHeight: parentAccount.blockHeight, lastSyncDate: parentAccount.lastSyncDate, - name: `${parentAccount.name} (${account.token.ticker})`, + name: `${parentAccountName} (${account.token.ticker})`, currency: account.token.id, spendableBalance: account.spendableBalance, }; } + const name = accountNameWithDefaultSelector(walletState, account); return { id: walletApiId, - name: account.name, + name, address: account.freshAddress, currency: account.currency.id, balance: account.balance, diff --git a/libs/ledger-live-common/src/wallet-api/logic.test.ts b/libs/ledger-live-common/src/wallet-api/logic.test.ts index b88f55aaf154..1447f1222471 100644 --- a/libs/ledger-live-common/src/wallet-api/logic.test.ts +++ b/libs/ledger-live-common/src/wallet-api/logic.test.ts @@ -23,6 +23,7 @@ import { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets"; import { TrackingAPI } from "./tracking"; import { cryptocurrenciesById } from "@ledgerhq/cryptoassets/currencies"; import { setSupportedCurrencies } from "../currencies"; +import { initialState as walletState } from "@ledgerhq/live-wallet/store"; describe("receiveOnAccountLogic", () => { // Given @@ -70,7 +71,12 @@ describe("receiveOnAccountLogic", () => { jest.spyOn(converters, "accountToWalletAPIAccount").mockReturnValueOnce(convertedAccount); // When - const result = await receiveOnAccountLogic(context, walletAccountId, uiNavigation); + const result = await receiveOnAccountLogic( + walletState, + context, + walletAccountId, + uiNavigation, + ); // Then expect(uiNavigation).toBeCalledTimes(1); @@ -80,7 +86,7 @@ describe("receiveOnAccountLogic", () => { it("calls the tracking for success", async () => { // When - await receiveOnAccountLogic(context, walletAccountId, uiNavigation); + await receiveOnAccountLogic(walletState, context, walletAccountId, uiNavigation); // Then expect(mockWalletAPIReceiveRequested).toBeCalledTimes(1); @@ -99,7 +105,7 @@ describe("receiveOnAccountLogic", () => { it("returns an error", async () => { // When await expect(async () => { - await receiveOnAccountLogic(context, walletAccountId, uiNavigation); + await receiveOnAccountLogic(walletState, context, walletAccountId, uiNavigation); }).rejects.toThrowError(`accountId ${walletAccountId} unknown`); // Then @@ -109,7 +115,7 @@ describe("receiveOnAccountLogic", () => { it("calls the tracking for error", async () => { // When await expect(async () => { - await receiveOnAccountLogic(context, walletAccountId, uiNavigation); + await receiveOnAccountLogic(walletState, context, walletAccountId, uiNavigation); }).rejects.toThrow(); // Then @@ -876,7 +882,6 @@ function createTokenAccount(id = "32"): TokenAccount { operationsCount: 0, operations: [], pendingOperations: [], - starred: false, balanceHistoryCache: { WEEK: { latestDate: null, balances: [] }, HOUR: { latestDate: null, balances: [] }, diff --git a/libs/ledger-live-common/src/wallet-api/logic.ts b/libs/ledger-live-common/src/wallet-api/logic.ts index 8c1938a8f7d4..7ed311e17809 100644 --- a/libs/ledger-live-common/src/wallet-api/logic.ts +++ b/libs/ledger-live-common/src/wallet-api/logic.ts @@ -18,6 +18,7 @@ import { prepareMessageToSign } from "../hw/signMessage/index"; import { getAccountBridge } from "../bridge"; import { Exchange } from "../exchange/types"; import { findTokenById } from "@ledgerhq/cryptoassets"; +import { WalletState } from "@ledgerhq/live-wallet/store"; export function translateContent(content: string | TranslatableString, locale = "en"): string { if (!content || typeof content === "string") return content; @@ -31,6 +32,7 @@ export type WalletAPIContext = { }; export function receiveOnAccountLogic( + walletState: WalletState, { manifest, accounts, tracking }: WalletAPIContext, walletAccountId: string, uiNavigation: ( @@ -59,7 +61,7 @@ export function receiveOnAccountLogic( const mainAccount = getMainAccount(account, parentAccount); const currency = tokenCurrency ? findTokenById(tokenCurrency) : null; const receivingAccount = currency ? makeEmptyTokenAccount(mainAccount, currency) : account; - const accountAddress = accountToWalletAPIAccount(account, parentAccount).address; + const accountAddress = accountToWalletAPIAccount(walletState, account, parentAccount).address; return uiNavigation(receivingAccount, parentAccount, accountAddress); } diff --git a/libs/ledger-live-common/src/wallet-api/react.ts b/libs/ledger-live-common/src/wallet-api/react.ts index c5c8ec8610a0..9f7316ad8a69 100644 --- a/libs/ledger-live-common/src/wallet-api/react.ts +++ b/libs/ledger-live-common/src/wallet-api/react.ts @@ -44,6 +44,7 @@ import { UserRefusedOnDevice } from "@ledgerhq/errors"; import { Transaction } from "../generated/types"; import { DISCOVER_INITIAL_CATEGORY, MAX_RECENTLY_USED_LENGTH } from "./constants"; import { DiscoverDB } from "./types"; +import { WalletState } from "@ledgerhq/live-wallet/store"; export function safeGetRefValue(ref: RefObject): NonNullable { if (!ref.current) { @@ -52,14 +53,17 @@ export function safeGetRefValue(ref: RefObject): NonNullable { return ref.current; } -export function useWalletAPIAccounts(accounts: AccountLike[]): WalletAPIAccount[] { +export function useWalletAPIAccounts( + walletState: WalletState, + accounts: AccountLike[], +): WalletAPIAccount[] { return useMemo(() => { return accounts.map(account => { const parentAccount = getParentAccount(account, accounts); - return accountToWalletAPIAccount(account, parentAccount); + return accountToWalletAPIAccount(walletState, account, parentAccount); }); - }, [accounts]); + }, [walletState, accounts]); } const allCurrenciesAndTokens = listCurrencies(true); @@ -270,6 +274,7 @@ function useDeviceTransport({ manifest, tracking }) { } export type useWalletAPIServerOptions = { + walletState: WalletState; manifest: AppManifest; accounts: AccountLike[]; tracking: TrackingAPI; @@ -283,6 +288,7 @@ export type useWalletAPIServerOptions = { }; export function useWalletAPIServer({ + walletState, manifest, accounts, tracking, @@ -314,7 +320,7 @@ export function useWalletAPIServer({ const transport = useTransport(webviewHook.postMessage); const [widgetLoaded, setWidgetLoaded] = useState(false); - const walletAPIAccounts = useWalletAPIAccounts(accounts); + const walletAPIAccounts = useWalletAPIAccounts(walletState, accounts); const walletAPICurrencies = useWalletAPICurrencies(); const { server, onMessage } = useWalletAPIServerRaw({ @@ -363,7 +369,7 @@ export function useWalletAPIServer({ currencies: currencyList, onSuccess: (account: AccountLike, parentAccount: Account | undefined) => { tracking.requestAccountSuccess(manifest); - resolve(accountToWalletAPIAccount(account, parentAccount)); + resolve(accountToWalletAPIAccount(walletState, account, parentAccount)); }, onCancel: () => { tracking.requestAccountFail(manifest); @@ -372,13 +378,14 @@ export function useWalletAPIServer({ }); }); }); - }, [manifest, server, tracking, uiAccountRequest]); + }, [walletState, manifest, server, tracking, uiAccountRequest]); useEffect(() => { if (!uiAccountReceive) return; server.setHandler("account.receive", ({ account, tokenCurrency }) => receiveOnAccountLogic( + walletState, { manifest, accounts, tracking }, account.id, (account, parentAccount, accountAddress) => @@ -404,7 +411,7 @@ export function useWalletAPIServer({ tokenCurrency, ), ); - }, [accounts, manifest, server, tracking, uiAccountReceive]); + }, [walletState, accounts, manifest, server, tracking, uiAccountReceive]); useEffect(() => { if (!uiMessageSign) return; diff --git a/libs/ledgerjs/packages/types-live/README.md b/libs/ledgerjs/packages/types-live/README.md index ad65808a405f..bf39c25e1d0e 100644 --- a/libs/ledgerjs/packages/types-live/README.md +++ b/libs/ledgerjs/packages/types-live/README.md @@ -26,14 +26,16 @@ Ledger Live main types. * [AccountRawLike](#accountrawlike) * [AccountIdParams](#accountidparams) * [Properties](#properties-5) -* [ScanAccountEventRaw](#scanaccounteventraw) +* [AccountUserData](#accountuserdata) * [Properties](#properties-6) +* [ScanAccountEventRaw](#scanaccounteventraw) + * [Properties](#properties-7) * [DeviceId](#deviceid) * [PreloadStrategy](#preloadstrategy) * [BroadcastArg](#broadcastarg) - * [Properties](#properties-7) -* [SignOperationArg0](#signoperationarg0) * [Properties](#properties-8) +* [SignOperationArg0](#signoperationarg0) + * [Properties](#properties-9) * [SignOperationFnSignature](#signoperationfnsignature) * [CurrencyBridge](#currencybridge) * [AccountBridge](#accountbridge) @@ -44,12 +46,14 @@ Ledger Live main types. * [initAccount](#initaccount) * [Parameters](#parameters-2) * [CurrenciesData](#currenciesdata) - * [Properties](#properties-9) -* [DatasetTest](#datasettest) * [Properties](#properties-10) +* [DatasetTest](#datasettest) + * [Properties](#properties-11) +* [BridgeCacheSystem](#bridgecachesystem) + * [Properties](#properties-12) * [DerivationMode](#derivationmode) * [Feature](#feature) - * [Properties](#properties-11) + * [Properties](#properties-13) * [enabled](#enabled) * [desktop\_version](#desktop_version) * [mobile\_version](#mobile_version) @@ -62,81 +66,81 @@ Ledger Live main types. * [params](#params) * [DefaultFeature](#defaultfeature) * [CurrencyFeatures](#currencyfeatures) - * [Properties](#properties-12) + * [Properties](#properties-14) * [Features](#features) * [FeatureId](#featureid) * [Feature\_EthStakingProviders](#feature_ethstakingproviders) * [FeatureMap](#featuremap) * [LedgerScriptParams](#ledgerscriptparams) - * [Properties](#properties-13) + * [Properties](#properties-15) * [DeviceInfo](#deviceinfo) - * [Properties](#properties-14) + * [Properties](#properties-16) * [DeviceModelInfo](#devicemodelinfo) - * [Properties](#properties-15) + * [Properties](#properties-17) * [DeviceVersion](#deviceversion) - * [Properties](#properties-16) + * [Properties](#properties-18) * [McuVersion](#mcuversion) - * [Properties](#properties-17) + * [Properties](#properties-19) * [SeedPhraseType](#seedphrasetype) * [FirmwareInfo](#firmwareinfo) - * [Properties](#properties-18) + * [Properties](#properties-20) * [OsuFirmware](#osufirmware) * [FinalFirmware](#finalfirmware) * [FirmwareUpdateContext](#firmwareupdatecontext) - * [Properties](#properties-19) + * [Properties](#properties-21) * [ApplicationVersion](#applicationversion) - * [Properties](#properties-20) + * [Properties](#properties-22) * [Application](#application) - * [Properties](#properties-21) + * [Properties](#properties-23) * [AppType](#apptype) * [App](#app) - * [Properties](#properties-22) + * [Properties](#properties-24) * [Category](#category) - * [Properties](#properties-23) + * [Properties](#properties-25) * [SocketEvent](#socketevent) * [NFTStandard](#nftstandard) * [NFTMediaSize](#nftmediasize) * [NFTMedias](#nftmedias) * [NFTMetadata](#nftmetadata) - * [Properties](#properties-24) + * [Properties](#properties-26) * [NFTCollectionMetadata](#nftcollectionmetadata) - * [Properties](#properties-25) + * [Properties](#properties-27) * [ProtoNFT](#protonft) - * [Properties](#properties-26) + * [Properties](#properties-28) * [ProtoNFTRaw](#protonftraw) * [NFT](#nft) * [NFTMetadataLinksProviders](#nftmetadatalinksproviders) * [NFTMetadataResponse](#nftmetadataresponse) - * [Properties](#properties-27) + * [Properties](#properties-29) * [NFTCollectionMetadataResponse](#nftcollectionmetadataresponse) - * [Properties](#properties-28) + * [Properties](#properties-30) * [FloorPrice](#floorprice) - * [Properties](#properties-29) + * [Properties](#properties-31) * [OperationType](#operationtype) * [Operation](#operation) - * [Properties](#properties-30) + * [Properties](#properties-32) * [PaginationConfig](#paginationconfig) - * [Properties](#properties-31) + * [Properties](#properties-33) * [SyncConfig](#syncconfig) - * [Properties](#properties-32) + * [Properties](#properties-34) * [BalanceHistoryData](#balancehistorydata) - * [Properties](#properties-33) + * [Properties](#properties-35) * [BalanceHistory](#balancehistory) * [BalanceHistoryRaw](#balancehistoryraw) * [BalanceHistoryWithCountervalue](#balancehistorywithcountervalue) * [ValueChange](#valuechange) - * [Properties](#properties-34) + * [Properties](#properties-36) * [AccountPortfolio](#accountportfolio) - * [Properties](#properties-35) + * [Properties](#properties-37) * [CurrencyPortfolio](#currencyportfolio) - * [Properties](#properties-36) + * [Properties](#properties-38) * [Portfolio](#portfolio) - * [Properties](#properties-37) + * [Properties](#properties-39) * [PortfolioRangeConfig](#portfoliorangeconfig) - * [Properties](#properties-38) + * [Properties](#properties-40) * [PortfolioRange](#portfoliorange) * [AssetsDistribution](#assetsdistribution) - * [Properties](#properties-39) + * [Properties](#properties-41) * [PostOnboardingActionId](#postonboardingactionid) * [getNavigationParams](#getnavigationparams) * [startAction](#startaction) @@ -154,10 +158,10 @@ Ledger Live main types. * [shouldCompleteOnStart](#shouldcompleteonstart) * [buttonLabelForAnalyticsEvent](#buttonlabelforanalyticsevent) * [PostOnboardingActionState](#postonboardingactionstate) - * [Properties](#properties-40) + * [Properties](#properties-42) * [completed](#completed) * [PostOnboardingState](#postonboardingstate) - * [Properties](#properties-41) + * [Properties](#properties-43) * [deviceModelId](#devicemodelid) * [walletEntryPointDismissed](#walletentrypointdismissed) * [entryPointFirstDisplayedDate](#entrypointfirstdisplayeddate) @@ -166,33 +170,33 @@ Ledger Live main types. * [lastActionCompleted](#lastactioncompleted) * [postOnboardingInProgress](#postonboardinginprogress) * [PostOnboardingHubState](#postonboardinghubstate) - * [Properties](#properties-42) + * [Properties](#properties-44) * [SwapOperation](#swapoperation) - * [Properties](#properties-43) + * [Properties](#properties-45) * [SwapOperationRaw](#swapoperationraw) - * [Properties](#properties-44) + * [Properties](#properties-46) * [SignedOperation](#signedoperation) - * [Properties](#properties-45) + * [Properties](#properties-47) * [SignedOperationRaw](#signedoperationraw) - * [Properties](#properties-46) + * [Properties](#properties-48) * [SignOperationEvent](#signoperationevent) * [SignOperationEventRaw](#signoperationeventraw) * [TransactionCommon](#transactioncommon) - * [Properties](#properties-47) + * [Properties](#properties-49) * [TransactionCommonRaw](#transactioncommonraw) - * [Properties](#properties-48) + * [Properties](#properties-50) * [FeeStrategy](#feestrategy) - * [Properties](#properties-49) + * [Properties](#properties-51) * [TransactionStatusCommon](#transactionstatuscommon) - * [Properties](#properties-50) + * [Properties](#properties-52) * [TransactionStatusCommonRaw](#transactionstatuscommonraw) - * [Properties](#properties-51) + * [Properties](#properties-53) ### TokenAccount A token belongs to an Account and share the parent account address -Type: {type: `"TokenAccount"`, id: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), parentId: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), token: TokenCurrency, balance: BigNumber, spendableBalance: BigNumber, creationDate: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date), operationsCount: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), operations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>, pendingOperations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>, starred: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean), balanceHistoryCache: BalanceHistoryCache, swapHistory: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[SwapOperation](#swapoperation)>, approvals: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<{sender: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), value: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)}>?} +Type: {type: `"TokenAccount"`, id: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), parentId: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), token: TokenCurrency, balance: BigNumber, spendableBalance: BigNumber, creationDate: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date), operationsCount: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), operations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>, pendingOperations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>, balanceHistoryCache: BalanceHistoryCache, swapHistory: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[SwapOperation](#swapoperation)>, approvals: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<{sender: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), value: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)}>?} #### Properties @@ -206,7 +210,6 @@ Type: {type: `"TokenAccount"`, id: [string](https://developer.mozilla.org/docs/W * `operationsCount` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** * `operations` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>** * `pendingOperations` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>** -* `starred` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** * `balanceHistoryCache` **BalanceHistoryCache** * `swapHistory` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[SwapOperation](#swapoperation)>** * `approvals` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<{sender: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), value: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)}>?** @@ -233,7 +236,7 @@ const bitcoinAccount = account as BitcoinAccount; and that BitcoinAccount type would be part of a coin integration family specific indeed. -Type: {type: `"Account"`, id: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), seedIdentifier: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), xpub: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, derivationMode: [DerivationMode](#derivationmode), index: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), freshAddress: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), freshAddressPath: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), name: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), starred: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean), used: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean), balance: BigNumber, spendableBalance: BigNumber, creationDate: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date), blockHeight: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), currency: CryptoCurrency, feesCurrency: (CryptoCurrency | TokenCurrency)?, unit: Unit, operationsCount: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), operations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>, pendingOperations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>, lastSyncDate: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date), subAccounts: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[TokenAccount](#tokenaccount)>?, balanceHistoryCache: BalanceHistoryCache, swapHistory: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[SwapOperation](#swapoperation)>, syncHash: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, nfts: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[ProtoNFT](#protonft)>?} +Type: {type: `"Account"`, id: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), seedIdentifier: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), xpub: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, derivationMode: [DerivationMode](#derivationmode), index: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), freshAddress: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), freshAddressPath: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), used: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean), balance: BigNumber, spendableBalance: BigNumber, creationDate: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date), blockHeight: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), currency: CryptoCurrency, feesCurrency: (CryptoCurrency | TokenCurrency)?, operationsCount: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), operations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>, pendingOperations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>, lastSyncDate: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date), subAccounts: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[TokenAccount](#tokenaccount)>?, balanceHistoryCache: BalanceHistoryCache, swapHistory: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[SwapOperation](#swapoperation)>, syncHash: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, nfts: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[ProtoNFT](#protonft)>?} #### Properties @@ -245,8 +248,6 @@ Type: {type: `"Account"`, id: [string](https://developer.mozilla.org/docs/Web/Ja * `index` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** * `freshAddress` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** * `freshAddressPath` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** -* `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** -* `starred` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** * `used` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** * `balance` **BigNumber** * `spendableBalance` **BigNumber** @@ -254,7 +255,6 @@ Type: {type: `"Account"`, id: [string](https://developer.mozilla.org/docs/Web/Ja * `blockHeight` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** * `currency` **CryptoCurrency** * `feesCurrency` **(CryptoCurrency | TokenCurrency)?** -* `unit` **Unit** * `operationsCount` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** * `operations` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>** * `pendingOperations` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Operation](#operation)>** @@ -306,7 +306,7 @@ Type: {type: `"TokenAccountRaw"`, id: [string](https://developer.mozilla.org/doc ### AccountRaw -Type: {id: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), seedIdentifier: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), xpub: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, derivationMode: [DerivationMode](#derivationmode), index: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), freshAddress: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), freshAddressPath: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), name: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), starred: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?, used: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?, balance: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), spendableBalance: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, blockHeight: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), creationDate: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, operationsCount: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?, currencyId: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), feesCurrencyId: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, operations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)\, pendingOperations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)\, unitMagnitude: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), lastSyncDate: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), subAccounts: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[TokenAccountRaw](#tokenaccountraw)>?, balanceHistoryCache: BalanceHistoryCache?, swapHistory: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[SwapOperationRaw](#swapoperationraw)>?, syncHash: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, nfts: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[ProtoNFTRaw](#protonftraw)>?} +Type: {id: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), seedIdentifier: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), xpub: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, derivationMode: [DerivationMode](#derivationmode), index: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), freshAddress: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), freshAddressPath: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), name: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, starred: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?, used: [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?, balance: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), spendableBalance: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, blockHeight: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number), creationDate: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, operationsCount: [number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?, currencyId: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), feesCurrencyId: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, operations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)\, pendingOperations: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)\, lastSyncDate: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), subAccounts: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[TokenAccountRaw](#tokenaccountraw)>?, balanceHistoryCache: BalanceHistoryCache?, swapHistory: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[SwapOperationRaw](#swapoperationraw)>?, syncHash: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?, nfts: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[ProtoNFTRaw](#protonftraw)>?} #### Properties @@ -317,7 +317,7 @@ Type: {id: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/ * `index` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** * `freshAddress` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** * `freshAddressPath` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** -* `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** +* `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** * `starred` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** * `used` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** * `balance` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** @@ -329,7 +329,6 @@ Type: {id: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/ * `feesCurrencyId` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** * `operations` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)\** * `pendingOperations` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)\** -* `unitMagnitude` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** * `lastSyncDate` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** * `subAccounts` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[TokenAccountRaw](#tokenaccountraw)>?** * `balanceHistoryCache` **BalanceHistoryCache?** @@ -353,6 +352,19 @@ Type: {type: [string](https://developer.mozilla.org/docs/Web/JavaScript/Referenc * `xpubOrAddress` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** * `derivationMode` **[DerivationMode](#derivationmode)** +### AccountUserData + +This represent the user's data part of an account which contains all user's custom information that aren't part of on-chain data +The object is serializable. + +Type: {id: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), name: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), starredIds: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>} + +#### Properties + +* `id` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** +* `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** +* `starredIds` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>** + ### ScanAccountEventRaw More events will come in the future @@ -464,6 +476,15 @@ Type: {implementations: [Array](https://developer.mozilla.org/docs/Web/JavaScrip * `implementations` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>** * `currencies` **(Record\> | Record<[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), never>)** +### BridgeCacheSystem + +Type: {hydrateCurrency: function (currency: CryptoCurrency): [Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)<(any | null | [undefined](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined))>, prepareCurrency: function (currency: CryptoCurrency): [Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)<(any | null | [undefined](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined))>} + +#### Properties + +* `hydrateCurrency` **function (currency: CryptoCurrency): [Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)<(any | null | [undefined](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined))>** +* `prepareCurrency` **function (currency: CryptoCurrency): [Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)<(any | null | [undefined](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined))>** + ### DerivationMode DerivationMode is a string identifier of a specific derivation scheme in a list defined in live-common derivation.ts @@ -3894,3 +3915,6 @@ Type: {errors: Record<[string](https://developer.mozilla.org/docs/Web/JavaScript * `totalSpent` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** * `useAllAmount` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** * `recipientIsReadOnly` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** + \======= + +> > > > > > > 927afc0b31 (chore: decoupled {unit, starred, name} fields away from Account model) diff --git a/libs/ledgerjs/packages/types-live/src/account.ts b/libs/ledgerjs/packages/types-live/src/account.ts index a6da8b194b80..d4ebb6736d1b 100644 --- a/libs/ledgerjs/packages/types-live/src/account.ts +++ b/libs/ledgerjs/packages/types-live/src/account.ts @@ -1,5 +1,5 @@ import type { BigNumber } from "bignumber.js"; -import type { CryptoCurrency, TokenCurrency, Unit } from "@ledgerhq/types-cryptoassets"; +import type { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets"; import type { OperationRaw, Operation } from "./operation"; import type { DerivationMode } from "./derivation"; import type { SwapOperation, SwapOperationRaw } from "./swap"; @@ -35,7 +35,6 @@ export type TokenAccount = { operationsCount: number; operations: Operation[]; pendingOperations: Operation[]; - starred: boolean; // Cache of balance history that allows a performant portfolio calculation. // currently there are no "raw" version of it because no need to at this stage. // could be in future when pagination is needed. @@ -91,10 +90,6 @@ export type Account = { // The path linked to freshAddress. to be used to validate with the device if it corresponds to freshAddress. // example: 44'/0'/0'/0/0 freshAddressPath: string; - // account name - name: string; - // starred - starred: boolean; // says if the account essentially "exists". an account has been used in the past, but for some reason the blockchain finds it empty (no ops, no balance,..) used: boolean; // account balance in satoshi @@ -111,8 +106,6 @@ export type Account = { currency: CryptoCurrency; // Some blockchains may use a different currency than the main one to pay fees feesCurrency?: CryptoCurrency | TokenCurrency; - // user preferred unit to use. unit is coming from currency.units. You can assume currency.units.indexOf(unit) will work. (make sure to preserve reference) - unit: Unit; // The total number of operations (operations[] can be partial) operationsCount: number; // lazy list of operations that exists on the blockchain. @@ -195,7 +188,7 @@ export type AccountRaw = { index: number; freshAddress: string; freshAddressPath: string; - name: string; + name?: string; starred?: boolean; used?: boolean; balance: string; @@ -209,7 +202,6 @@ export type AccountRaw = { feesCurrencyId?: string; operations: OperationRaw[]; pendingOperations: OperationRaw[]; - unitMagnitude: number; lastSyncDate: string; subAccounts?: TokenAccountRaw[]; balanceHistoryCache?: BalanceHistoryCache; @@ -229,3 +221,16 @@ export type AccountIdParams = { xpubOrAddress: string; derivationMode: DerivationMode; }; + +/** + * This represent the user's data part of an account which contains all user's custom information that aren't part of on-chain data + * The object is serializable. + */ +export type AccountUserData = { + // the Account#id + id: string; + // user's name for this account + name: string; + // user's starred account ids: it can be more than the account.id because token accounts can also be starred + starredIds: string[]; +}; diff --git a/libs/ledgerjs/packages/types-live/src/bridge.ts b/libs/ledgerjs/packages/types-live/src/bridge.ts index 21f218921f30..a1b2a4196bbe 100644 --- a/libs/ledgerjs/packages/types-live/src/bridge.ts +++ b/libs/ledgerjs/packages/types-live/src/bridge.ts @@ -258,3 +258,11 @@ export type DatasetTest = { implementations: string[]; currencies: Record> | Record; }; + +/** + * + */ +export type BridgeCacheSystem = { + hydrateCurrency: (currency: CryptoCurrency) => Promise; + prepareCurrency: (currency: CryptoCurrency) => Promise; +}; diff --git a/libs/live-countervalues-react/src/index.tsx b/libs/live-countervalues-react/src/index.tsx index 2c57ad9b620e..3dc9900202a2 100644 --- a/libs/live-countervalues-react/src/index.tsx +++ b/libs/live-countervalues-react/src/index.tsx @@ -9,7 +9,7 @@ import React, { useCallback, ReactElement, } from "react"; -import { getAccountCurrency, getAccountUnit } from "@ledgerhq/coin-framework/account/helpers"; +import { getAccountCurrency } from "@ledgerhq/coin-framework/account/helpers"; import { initialState, calculate, @@ -396,7 +396,6 @@ export function useSendAmount({ fiatCurrency: Currency; cryptoAmount: BigNumber; }): { - cryptoUnit: Unit; fiatAmount: BigNumber; fiatUnit: Unit; calculateCryptoAmount: (fiatAmount: BigNumber) => BigNumber; @@ -410,7 +409,6 @@ export function useSendAmount({ }); const fiatAmount = new BigNumber(fiatCountervalue ?? 0); const fiatUnit = fiatCurrency.units[0]; - const cryptoUnit = getAccountUnit(account); const state = useCountervaluesState(); const calculateCryptoAmount = useCallback( (fiatAmount: BigNumber) => { @@ -427,7 +425,6 @@ export function useSendAmount({ [state, cryptoCurrency, fiatCurrency], ); return { - cryptoUnit, fiatAmount, fiatUnit, calculateCryptoAmount, diff --git a/libs/live-countervalues/src/__snapshots__/portfolio.test.ts.snap b/libs/live-countervalues/src/__snapshots__/portfolio.test.ts.snap index 444c4be94610..70af482ad254 100644 --- a/libs/live-countervalues/src/__snapshots__/portfolio.test.ts.snap +++ b/libs/live-countervalues/src/__snapshots__/portfolio.test.ts.snap @@ -167,7 +167,6 @@ exports[`Portfolio getAssetsDistribution snapshot 1`] = ` "id": "mock:1:bitcoin:bitcoin_1:", "index": 1, "lastSyncDate": 2018-03-14T17:34:42.000Z, - "name": "iisPu4qdvHcH21Q9xOykvRW9fWwiZk", "operations": [ { "accountId": "mock:1:bitcoin:bitcoin_1:", @@ -624,14 +623,8 @@ exports[`Portfolio getAssetsDistribution snapshot 1`] = ` "pendingOperations": [], "seedIdentifier": "mock", "spendableBalance": "6196770", - "starred": false, "swapHistory": [], "type": "Account", - "unit": { - "code": "bit", - "magnitude": 2, - "name": "bit", - }, "used": true, "xpub": "883D601E6ECDE4B377F2DF9FB473FD7BB975AE7F59FE4465C065743878BBE0F2", }, @@ -2474,7 +2467,6 @@ exports[`Portfolio getCurrencyPortfolio snapshot 1`] = ` "id": "mock:1:bitcoin:bitcoin_1:", "index": 1, "lastSyncDate": 2018-03-14T17:34:42.000Z, - "name": "iisPu4qdvHcH21Q9xOykvRW9fWwiZk", "operations": [ { "accountId": "mock:1:bitcoin:bitcoin_1:", @@ -2931,14 +2923,8 @@ exports[`Portfolio getCurrencyPortfolio snapshot 1`] = ` "pendingOperations": [], "seedIdentifier": "mock", "spendableBalance": "6196770", - "starred": false, "swapHistory": [], "type": "Account", - "unit": { - "code": "bit", - "magnitude": 2, - "name": "bit", - }, "used": true, "xpub": "883D601E6ECDE4B377F2DF9FB473FD7BB975AE7F59FE4465C065743878BBE0F2", }, @@ -4806,7 +4792,6 @@ exports[`Portfolio getPortfolio snapshot 1`] = ` "id": "mock:1:bitcoin:bitcoin_1:", "index": 1, "lastSyncDate": 2018-03-14T17:34:42.000Z, - "name": "iisPu4qdvHcH21Q9xOykvRW9fWwiZk", "operations": [ { "accountId": "mock:1:bitcoin:bitcoin_1:", @@ -5263,14 +5248,8 @@ exports[`Portfolio getPortfolio snapshot 1`] = ` "pendingOperations": [], "seedIdentifier": "mock", "spendableBalance": "6196770", - "starred": false, "swapHistory": [], "type": "Account", - "unit": { - "code": "bit", - "magnitude": 2, - "name": "bit", - }, "used": true, "xpub": "883D601E6ECDE4B377F2DF9FB473FD7BB975AE7F59FE4465C065743878BBE0F2", }, @@ -5437,7 +5416,6 @@ exports[`Portfolio getPortfolio snapshot 1`] = ` "id": "mock:1:bitcoin:bitcoin_1:", "index": 1, "lastSyncDate": 2018-03-14T17:34:42.000Z, - "name": "iisPu4qdvHcH21Q9xOykvRW9fWwiZk", "operations": [ { "accountId": "mock:1:bitcoin:bitcoin_1:", @@ -5894,14 +5872,8 @@ exports[`Portfolio getPortfolio snapshot 1`] = ` "pendingOperations": [], "seedIdentifier": "mock", "spendableBalance": "6196770", - "starred": false, "swapHistory": [], "type": "Account", - "unit": { - "code": "bit", - "magnitude": 2, - "name": "bit", - }, "used": true, "xpub": "883D601E6ECDE4B377F2DF9FB473FD7BB975AE7F59FE4465C065743878BBE0F2", }, diff --git a/libs/live-wallet/.eslintrc.js b/libs/live-wallet/.eslintrc.js new file mode 100644 index 000000000000..79592d6cd6ad --- /dev/null +++ b/libs/live-wallet/.eslintrc.js @@ -0,0 +1,33 @@ +module.exports = { + settings: { + react: { + version: "detect", + }, + }, + env: { + browser: true, + es6: true, + }, + globals: { + Atomics: "readonly", + SharedArrayBuffer: "readonly", + }, + extends: ["plugin:import/typescript", "plugin:jsx-a11y/recommended"], + plugins: ["import", "jsx-a11y"], + rules: { + "no-console": ["error", { allow: ["warn", "error"] }], + "linebreak-style": ["error", "unix"], + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-namespace": ["error", { allowDeclarations: true }], + "@typescript-eslint/no-explicit-any": "warn", + }, + overrides: [ + { + files: ["src/**/*.test.{ts,tsx}"], + env: { + "jest/globals": true, + }, + plugins: ["jest"], + }, + ], +}; diff --git a/libs/live-wallet/.unimportedrc.json b/libs/live-wallet/.unimportedrc.json new file mode 100644 index 000000000000..b6afa383d8c0 --- /dev/null +++ b/libs/live-wallet/.unimportedrc.json @@ -0,0 +1,11 @@ +{ + "entry": [ + "src/liveqr/cross.ts", + "src/liveqr/importAccounts.ts", + "src/ordering.ts", + "src/addAccounts.ts", + "src/store.ts", + "src/accountName.ts" + ], + "ignoreUnused": [] +} diff --git a/libs/live-wallet/CHANGELOG.md b/libs/live-wallet/CHANGELOG.md new file mode 100644 index 000000000000..4e2157b4aef2 --- /dev/null +++ b/libs/live-wallet/CHANGELOG.md @@ -0,0 +1 @@ +# @ledgerhq/live-wallet diff --git a/libs/live-wallet/README.md b/libs/live-wallet/README.md new file mode 100644 index 000000000000..e995ed66df37 --- /dev/null +++ b/libs/live-wallet/README.md @@ -0,0 +1,10 @@ +## live-wallet + +The goal of this library is to manage the accounts user data states. + +Examples of accounts user data states are: + +- Account's name +- Account's starred state + +The library provides reducers and actions in the style of Redux, without depending on Redux itself. diff --git a/libs/live-wallet/jest.config.js b/libs/live-wallet/jest.config.js new file mode 100644 index 000000000000..65a783785412 --- /dev/null +++ b/libs/live-wallet/jest.config.js @@ -0,0 +1,13 @@ +module.exports = { + transform: { + "^.+\\.(ts|tsx)?$": [ + "ts-jest", + { + globals: { + isolatedModules: true, + }, + }, + ], + }, + testPathIgnorePatterns: ["lib/", "lib-es/"], +}; diff --git a/libs/live-wallet/package.json b/libs/live-wallet/package.json new file mode 100644 index 000000000000..660dd5db062f --- /dev/null +++ b/libs/live-wallet/package.json @@ -0,0 +1,85 @@ +{ + "name": "@ledgerhq/live-wallet", + "version": "0.1.0", + "description": "Ledger Live wallet", + "keywords": [ + "Ledger" + ], + "repository": { + "type": "git", + "url": "https://github.com/LedgerHQ/ledger-live.git" + }, + "bugs": { + "url": "https://github.com/LedgerHQ/ledger-live/issues" + }, + "homepage": "https://github.com/LedgerHQ/ledger-live/tree/develop/libs/env", + "publishConfig": { + "access": "public" + }, + "main": "lib/index.js", + "module": "lib-es/index.js", + "types": "lib/index.d.ts", + "license": "Apache-2.0", + "dependencies": { + "@ledgerhq/types-live": "workspace:*", + "@ledgerhq/types-cryptoassets": "workspace:*", + "@ledgerhq/coin-framework": "workspace:*", + "@ledgerhq/live-env": "workspace:*", + "@ledgerhq/live-promise": "workspace:*", + "@ledgerhq/logs": "workspace:*", + "@ledgerhq/compressjs": "github:LedgerHQ/compressjs#d9e8e4d994923e0ea76a32b97289bcccfe71b82e", + "@ledgerhq/devices": "workspace:*", + "@ledgerhq/cryptoassets": "workspace:*", + "rxjs": "7", + "lodash": "4", + "bignumber.js": "9" + }, + "devDependencies": { + "@types/lodash": "4", + "@types/jest": "^29.5.10", + "jest": "^29.7.0", + "ts-jest": "^29.1.1" + }, + "scripts": { + "clean": "rimraf lib lib-es", + "build": "tsc && tsc -m ES6 --outDir lib-es", + "prewatch": "pnpm build", + "watch": "tsc --watch", + "lint": "eslint ./src --no-error-on-unmatched-pattern --ext .ts,.tsx --cache", + "lint:fix": "pnpm lint --fix", + "typecheck": "tsc --noEmit", + "unimported": "unimported", + "test": "jest" + }, + "typesVersions": { + "*": { + "*.json": [ + "*.json" + ], + "*": [ + "lib/*" + ], + "lib/*": [ + "lib/*" + ], + "lib-es/*": [ + "lib-es/*" + ] + } + }, + "exports": { + "./lib/*": "./lib/*.js", + "./lib/*.js": "./lib/*.js", + "./lib-es/*": "./lib-es/*.js", + "./lib-es/*.js": "./lib-es/*.js", + "./*": { + "require": "./lib/*.js", + "default": "./lib-es/*.js" + }, + "./*.js": { + "require": "./lib/*.js", + "default": "./lib-es/*.js" + }, + "./package.json": "./package.json" + } +} diff --git a/libs/live-wallet/src/accountName.test.ts b/libs/live-wallet/src/accountName.test.ts new file mode 100644 index 000000000000..b42ef5369157 --- /dev/null +++ b/libs/live-wallet/src/accountName.test.ts @@ -0,0 +1,23 @@ +import { genAccount } from "@ledgerhq/coin-framework/mocks/account"; +import { getDefaultAccountName } from "./accountName"; +import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies"; + +const mockAccount = genAccount("mockAccount", { + currency: getCryptoCurrencyById("ethereum"), + subAccountsCount: 1, +}); +const tokenAccount = mockAccount.subAccounts![0]; + +describe(getDefaultAccountName.name, () => { + describe("given an Account", () => { + it("should return the account name", () => { + expect(getDefaultAccountName(mockAccount)).toEqual("Ethereum 2"); + }); + }); + + describe("given a TokenAccount", () => { + it("should return the token account name", () => { + expect(getDefaultAccountName(tokenAccount)).toEqual("0x Project"); + }); + }); +}); diff --git a/libs/live-wallet/src/accountName.ts b/libs/live-wallet/src/accountName.ts new file mode 100644 index 000000000000..4f28cd81bab2 --- /dev/null +++ b/libs/live-wallet/src/accountName.ts @@ -0,0 +1,30 @@ +import { CryptoCurrency } from "@ledgerhq/types-cryptoassets"; +import { Account, AccountLike } from "@ledgerhq/types-live"; + +const MAX_ACCOUNT_NAME_SIZE = 50; + +/** + * Get the default name for an account. + */ +export const getDefaultAccountNameForCurrencyIndex = ({ + currency, + index, +}: { + currency: CryptoCurrency; + index: number; +}): string => { + return `${currency.name} ${index + 1}`; +}; + +export const validateNameEdition = (account: Account, name?: string | null | undefined): string => + ((name || "").replace(/\s+/g, " ").trim() || getDefaultAccountName(account)).slice( + 0, + MAX_ACCOUNT_NAME_SIZE, + ); + +export const getDefaultAccountName = (account: AccountLike) => { + if (account.type === "Account") { + return getDefaultAccountNameForCurrencyIndex(account); + } + return account.token.name; +}; diff --git a/libs/ledger-live-common/src/account/addAccounts.ts b/libs/live-wallet/src/addAccounts.ts similarity index 69% rename from libs/ledger-live-common/src/account/addAccounts.ts rename to libs/live-wallet/src/addAccounts.ts index 35d5426b82f7..86f8d03ac3fa 100644 --- a/libs/ledger-live-common/src/account/addAccounts.ts +++ b/libs/live-wallet/src/addAccounts.ts @@ -1,7 +1,16 @@ +/** + * TODO: rework live-common/addAccounts to take into account the new paradigm. + * it will be simpler: Account and AccountUserData are now explicitly separated so we will have less to reconciliate. + */ + +/** + * This drives the logic of digesting Add Accounts' result and apply the new accounts and account name editions to the underlying stores. + */ + import type { Account, DerivationMode } from "@ledgerhq/types-live"; import uniqWith from "lodash/uniqWith"; -import { validateNameEdition } from "@ledgerhq/coin-framework/account/index"; -import { clearAccount } from "./helpers"; +import { validateNameEdition } from "./accountName"; + // Reference all possible support link // For now we have only one, but we can union type in future // We can map .id to a wording. @@ -61,12 +70,7 @@ export function groupAddAccounts( importableAccounts.push(acc); } }); - const sections: Array<{ - id: string; - selectable: boolean; - defaultSelected: boolean; - data: any; - }> = []; + const sections: AddAccountsSection[] = []; if (importableAccounts.length) { sections.push({ @@ -116,49 +120,53 @@ export type AddAccountsProps = { renamings: Record; }; -const preserveUserData = (update: Account, existing: Account): Account => ({ - ...update, - name: existing.name, -}); +export type AddAccountsAction = { + type: "ADD_ACCOUNTS"; + payload: { + // the full state of all accounts to apply on top of the existing ones + // since the add accounts will possibly do a "migrate" of existing accounts + allAccounts: Account[]; + // possible edited names that were done on the accounts + editedNames: Map; + }; +}; -export function addAccounts({ - scannedAccounts, +export function addAccountsAction({ existingAccounts, + scannedAccounts, selectedIds, renamings, -}: AddAccountsProps): Account[] { +}: AddAccountsProps): AddAccountsAction { const newAccounts: Account[] = []; // scanned accounts that was selected const selected = scannedAccounts.filter(a => selectedIds.includes(a.id)); existingAccounts.forEach(existing => { - // we'll try to find an updated version of the existing account as opportunity to refresh the operations + // we try to find an updated version of the existing account as opportunity to refresh its state const update = selected.find(a => sameAccountIdentity(a, existing)); - - if (update) { - // preserve existing name - let acc = preserveUserData(update, existing); - - if (update.id !== existing.id) { - acc = clearAccount(acc); - } - - newAccounts.push(acc); - } else { - newAccounts.push(existing); - } + const account = update || existing; + newAccounts.push(account); }); // append the new accounts selected.forEach(acc => { - const alreadyThere = newAccounts.find(a => sameAccountIdentity(a, acc)); - + const alreadyThere = newAccounts.find(r => sameAccountIdentity(r, acc)); if (!alreadyThere) { newAccounts.push(acc); } }); - // dedup and apply the renaming - return uniqWith(newAccounts, sameAccountIdentity).map(a => { - const name = validateNameEdition(a, renamings[a.id]); - if (name) return { ...a, name }; - return a; - }); + // deduplicate accounts + const allAccounts = uniqWith(newAccounts, sameAccountIdentity); + const editedNames = new Map(); + for (const account of allAccounts) { + if (renamings[account.id]) { + const name = validateNameEdition(account, renamings[account.id]); + editedNames.set(account.id, name); + } + } + return { + type: "ADD_ACCOUNTS", + payload: { + allAccounts, + editedNames, + }, + }; } diff --git a/libs/ledger-live-common/src/__snapshots__/cross.test.ts.snap b/libs/live-wallet/src/liveqr/__snapshots__/cross.test.ts.snap similarity index 100% rename from libs/ledger-live-common/src/__snapshots__/cross.test.ts.snap rename to libs/live-wallet/src/liveqr/__snapshots__/cross.test.ts.snap diff --git a/libs/ledger-live-common/src/cross.test.ts b/libs/live-wallet/src/liveqr/cross.test.ts similarity index 75% rename from libs/ledger-live-common/src/cross.test.ts rename to libs/live-wallet/src/liveqr/cross.test.ts index b5dc6b99ae74..29e3386feace 100644 --- a/libs/ledger-live-common/src/cross.test.ts +++ b/libs/live-wallet/src/liveqr/cross.test.ts @@ -1,20 +1,26 @@ import { genAccount } from "@ledgerhq/coin-framework/mocks/account"; import { getDerivationModesForCurrency } from "@ledgerhq/coin-framework/derivation"; import { DeviceModelId } from "@ledgerhq/devices"; -import { listCryptoCurrencies, setSupportedCurrencies } from "./currencies"; +import { + listCryptoCurrencies, + setSupportedCurrencies, +} from "@ledgerhq/coin-framework/currencies/index"; import { accountDataToAccount, accountToAccountData, encode, decode } from "./cross"; import { Account } from "@ledgerhq/types-live"; +import { accountUserDataExportSelector, initialState } from "../store"; setSupportedCurrencies(["ethereum", "ethereum_classic"]); test("accountDataToAccount / accountToAccountData", () => { listCryptoCurrencies().forEach(currency => { getDerivationModesForCurrency(currency).forEach(derivationMode => { - const account = genAccount(`${currency.id}_${derivationMode}`, { - currency, - }); - const data = accountToAccountData(account); - expect(accountToAccountData(accountDataToAccount(data))).toMatchObject(data); + const account = genAccount(`${currency.id}_${derivationMode}`, { currency }); + const walletState = initialState; + const data = accountToAccountData( + account, + accountUserDataExportSelector(walletState, { account }), + ); + expect(accountToAccountData(...accountDataToAccount(data))).toMatchObject(data); }); }); }); @@ -31,7 +37,9 @@ test("encode/decode", () => { ), [], ); + const walletState = initialState; const data = { + walletState, accounts, settings: { currenciesSettings: {}, @@ -45,7 +53,11 @@ test("encode/decode", () => { const exp = decode(encode(data)); expect(exp.meta.exporterName).toEqual(data.exporterName); expect(exp.accounts.length).toEqual(data.accounts.length); - expect(exp.accounts).toMatchObject(data.accounts.map(accountToAccountData)); + expect(exp.accounts).toMatchObject( + data.accounts.map(a => + accountToAccountData(a, accountUserDataExportSelector(walletState, { account: a })), + ), + ); expect(exp.meta.modelId).toEqual("nanoX"); expect(exp.meta.modelIdList).toEqual(["nanoX"]); }); @@ -53,7 +65,16 @@ test("encode/decode", () => { const accounts = Array(3) .fill(null) .map((_, i) => genAccount("export_" + i)); + const walletState = { + ...initialState, + accountNames: new Map([ + [accounts[0].id, "uuwygRL0AmMrs9riAlv1"], + [accounts[1].id, "4GEb2iRQXlUt6X1jviKzSz4umwWj"], + [accounts[2].id, "tzPbPqv6XS7BabfsuJff"], + ]), + }; const arg = { + walletState, accounts, settings: { counterValue: "USD", @@ -78,7 +99,6 @@ test("encode/decode", () => { balance: a.balance.toString(), currencyId: a.currency.id, id: a.id, - name: a.name, index: a.index, })), ); diff --git a/libs/ledger-live-common/src/cross.ts b/libs/live-wallet/src/liveqr/cross.ts similarity index 83% rename from libs/ledger-live-common/src/cross.ts rename to libs/live-wallet/src/liveqr/cross.ts index 5dfd26be5a14..b29b15869305 100644 --- a/libs/ledger-live-common/src/cross.ts +++ b/libs/live-wallet/src/liveqr/cross.ts @@ -1,5 +1,6 @@ // cross helps dealing with cross-project feature like export/import & cross project conversions import { BigNumber } from "bignumber.js"; +// @ts-expect-error no types for compressjs import compressjs from "@ledgerhq/compressjs"; import type { DeviceModelId } from "@ledgerhq/devices"; import { @@ -8,8 +9,9 @@ import { asDerivationMode, } from "@ledgerhq/coin-framework/derivation"; import { decodeAccountId, emptyHistoryCache } from "@ledgerhq/coin-framework/account/index"; -import { getCryptoCurrencyById } from "./currencies"; -import type { Account, CryptoCurrencyIds } from "@ledgerhq/types-live"; +import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets"; +import type { Account, AccountUserData, CryptoCurrencyIds } from "@ledgerhq/types-live"; +import { WalletState, accountUserDataExportSelector } from "../store"; export type AccountData = { id: string; @@ -36,6 +38,8 @@ export type Settings = { }; export type DataIn = { + // wallet state + walletState: WalletState; // accounts to export (filter them to only be the visible ones) accounts: Account[]; // settings @@ -62,6 +66,7 @@ export type Result = { }; export function encode({ + walletState, accounts, settings, exporterName, @@ -79,7 +84,9 @@ export function encode({ modelId, modelIdList, }, - accounts: accounts.map(accountToAccountData), + accounts: accounts.map(a => + accountToAccountData(a, accountUserDataExportSelector(walletState, { account: a })), + ), settings, }), ), @@ -87,7 +94,7 @@ export function encode({ ).toString("binary"); } -const asResultMeta = (unsafe: Record): Meta => { +const asResultMeta = (unsafe: Record): Meta => { if (typeof unsafe !== "object" || !unsafe) { throw new Error("invalid meta data"); } @@ -102,23 +109,38 @@ const asResultMeta = (unsafe: Record): Meta => { throw new Error("invalid meta.exporterVersion"); } - if (modelId && typeof modelId !== "string") { - throw new Error("invalid meta.modelId"); + let resultModelId: DeviceModelId | undefined = undefined; + if (modelId) { + if (typeof modelId === "string") { + resultModelId = modelId as DeviceModelId; + } else { + throw new Error("invalid meta.modelId"); + } } - if (modelIdList && modelIdList.some(id => typeof id !== "string")) { - throw new Error("invalid meta.modelIdList"); + let resultModelIdList: DeviceModelId[] | undefined = undefined; + + if (modelIdList) { + if ( + typeof modelIdList === "object" && + Array.isArray(modelIdList) && + modelIdList.every(id => typeof id === "string") + ) { + resultModelIdList = modelIdList; + } else { + throw new Error("invalid meta.modelIdList"); + } } return { exporterName, exporterVersion, - modelId, - modelIdList, + modelId: resultModelId, + modelIdList: resultModelIdList, }; }; -const asResultAccount = (unsafe: Record): AccountData => { +const asResultAccount = (unsafe: Record): AccountData => { if (typeof unsafe !== "object" || !unsafe) { throw new Error("invalid account data"); } @@ -179,7 +201,7 @@ const asResultAccounts = (unsafe: unknown): AccountData[] => { return unsafe.map(asResultAccount); }; -const asCryptoSettings = (unsafe: Record): CryptoSettings => { +const asCryptoSettings = (unsafe: Record): CryptoSettings => { if (typeof unsafe !== "object" || !unsafe) { throw new Error("invalid currency settings data"); } @@ -270,16 +292,10 @@ export function decode(bytes: string): Result { settings: asResultSettings(unsafe.settings), }; } -export function accountToAccountData({ - id, - name, - seedIdentifier, - derivationMode, - freshAddress, - currency, - index, - balance, -}: Account): AccountData { +export function accountToAccountData( + { id, seedIdentifier, derivationMode, freshAddress, currency, index, balance }: Account, + { name }: AccountUserData, +): AccountData { const res: AccountData = { id, name, @@ -305,7 +321,7 @@ export const accountDataToAccount = ({ balance, derivationMode: derivationModeStr, seedIdentifier, -}: AccountData): Account => { +}: AccountData): [Account, AccountUserData] => { const { xpubOrAddress } = decodeAccountId(id); // TODO rename in AccountId xpubOrAddress const derivationMode = asDerivationMode(derivationModeStr); @@ -349,8 +365,6 @@ export const accountDataToAccount = ({ derivationMode, seedIdentifier, xpub, - name, - starred: false, used: false, currency, index, @@ -363,11 +377,16 @@ export const accountDataToAccount = ({ operationsCount: 0, operations: [], pendingOperations: [], - unit: currency.units[0], lastSyncDate: new Date(0), creationDate: new Date(), balanceHistoryCache: emptyHistoryCache, }; - return account; + const accountUserData: AccountUserData = { + id, + name, + starredIds: [], + }; + + return [account, accountUserData]; }; diff --git a/libs/live-wallet/src/liveqr/importAccounts.test.ts b/libs/live-wallet/src/liveqr/importAccounts.test.ts new file mode 100644 index 000000000000..f552d852ef54 --- /dev/null +++ b/libs/live-wallet/src/liveqr/importAccounts.test.ts @@ -0,0 +1,166 @@ +import type { AccountRaw } from "@ledgerhq/types-live"; +import { + SyncNewAccountsOutput, + importAccountsMakeItems, + importAccountsReduce, +} from "./importAccounts"; +import { setSupportedCurrencies } from "@ledgerhq/coin-framework/currencies/index"; +import { fromAccountRaw } from "@ledgerhq/coin-framework/serialization/account"; +import { AccountData, accountDataToAccount } from "./cross"; + +setSupportedCurrencies(["ethereum"]); +describe("importAccountsMakeItems", () => { + test("importing ethereum accounts", () => { + const resultAccounts: AccountData[] = [ + { + id: "js:1:ethereum:0x01:", + name: "Ethereum 1", + seedIdentifier: "seed", + derivationMode: "", + freshAddress: "0x01", + currencyId: "ethereum", + index: 0, + balance: "51281813126095913", + }, + { + id: "js:1:ethereum:0x02:", + name: "Ethereum 2", + seedIdentifier: "seed", + derivationMode: "", + freshAddress: "0x02", + currencyId: "ethereum", + index: 1, + balance: "1081392000000000", + }, + { + id: "js:1:ethereum:0x04:", + name: "Ethereum 4", + seedIdentifier: "seed", + derivationMode: "", + freshAddress: "0x04", + currencyId: "ethereum", + index: 3, + balance: "1000000000000000", + }, + { + id: "js:1:ethereum:0x03:", + name: "ETH3 name edited", + seedIdentifier: "seed", + derivationMode: "", + freshAddress: "0x03", + currencyId: "ethereum", + index: 2, + balance: "0", + }, + { + id: "js:1:ethereum:0x05:", + name: "Ethereum 5", + seedIdentifier: "seed", + derivationMode: "", + freshAddress: "0x05", + currencyId: "ethereum", + index: 4, + balance: "0", + }, + ]; + const result = { + meta: { + exporterName: "desktop", + exporterVersion: "1.12.0", + }, + accounts: resultAccounts, + settings: { + counterValue: "USD", + currenciesSettings: {}, + pairExchanges: {}, + developerModeEnabled: false, + }, + }; + const accounts = [ + { + id: "js:1:ethereum:0x01:", + seedIdentifier: "0x01", + name: "Ethereum 1", + derivationMode: "", + index: 0, + freshAddress: "0x01", + freshAddressPath: "44'/60'/0'/0/0", + freshAddresses: [], + blockHeight: 8168983, + operations: [], + pendingOperations: [], + currencyId: "ethereum", + lastSyncDate: "2019-07-17T15:13:30.318Z", + balance: "51281813126095910", + }, + { + id: "js:1:ethereum:0x02:", + seedIdentifier: "0x02", + name: "Ethereum 2", + derivationMode: "", + index: 1, + freshAddress: "0x02", + freshAddressPath: "44'/60'/1'/0/0", + freshAddresses: [], + blockHeight: 8168983, + operations: [], + pendingOperations: [], + currencyId: "ethereum", + lastSyncDate: "2019-07-17T15:13:29.306Z", + balance: "1081392000000000", + }, + { + id: "js:1:ethereum:0x03:", + seedIdentifier: "seed", + name: "Ethereum 3", + derivationMode: "", + index: 2, + freshAddress: "0x03", + freshAddressPath: "44'/60'/2'/0/0", + freshAddresses: [], + blockHeight: 8168983, + operations: [], + pendingOperations: [], + currencyId: "ethereum", + lastSyncDate: "2019-07-17T15:13:29.306Z", + balance: "1081392000000000", + }, + ].map(a => fromAccountRaw(a)); + + const { items, accountNames } = importAccountsMakeItems({ + result, + accounts, + }); + expect(items).toMatchObject([ + { + initialAccountId: "js:1:ethereum:0x04:", + account: { id: "js:1:ethereum:0x04:" }, + mode: "create", + }, + { + initialAccountId: "js:1:ethereum:0x05:", + account: { id: "js:1:ethereum:0x05:" }, + mode: "create", + }, + ]); + const syncResult: SyncNewAccountsOutput = { + failed: {}, + synchronized: {}, + }; + result.accounts.forEach(a => { + syncResult.synchronized[a.id] = accountDataToAccount(a)[0]; + }); + const reduced = importAccountsReduce(accounts, { + items, + selectedAccounts: ["js:1:ethereum:0x03:", "js:1:ethereum:0x02:", "js:1:ethereum:0x05:"], + syncResult, + }); + expect(accountNames.get("js:1:ethereum:0x03:")).toEqual("ETH3 name edited"); + expect(reduced).toMatchObject([ + { id: "js:1:ethereum:0x01:" }, + { id: "js:1:ethereum:0x02:" }, + { id: "js:1:ethereum:0x03:" }, + { id: "js:1:ethereum:0x05:" }, + ]); + }); +}); diff --git a/libs/ledger-live-common/src/account/importAccounts.ts b/libs/live-wallet/src/liveqr/importAccounts.ts similarity index 79% rename from libs/ledger-live-common/src/account/importAccounts.ts rename to libs/live-wallet/src/liveqr/importAccounts.ts index 197c9f9d422d..7cc37eed7a4f 100644 --- a/libs/ledger-live-common/src/account/importAccounts.ts +++ b/libs/live-wallet/src/liveqr/importAccounts.ts @@ -1,16 +1,13 @@ import { log } from "@ledgerhq/logs"; -import type { Result } from "../cross"; -import { accountDataToAccount } from "../cross"; +import type { Result } from "./cross"; +import { accountDataToAccount } from "./cross"; import { checkAccountSupported } from "@ledgerhq/coin-framework/account/index"; -import joinSwapHistories from "../exchange/swap/joinSwapHistories"; -import isEqual from "lodash/isEqual"; -import type { Account } from "@ledgerhq/types-live"; -import { BridgeCacheSystem } from "../bridge/cache"; -import { getAccountBridge } from "../bridge"; -import { promiseAllBatched } from "../promise"; +import type { Account, AccountBridge, TransactionCommon } from "@ledgerhq/types-live"; +import { promiseAllBatched } from "@ledgerhq/live-promise"; import { getEnv } from "@ledgerhq/live-env"; import { Observable, firstValueFrom } from "rxjs"; import { reduce } from "rxjs/operators"; +import type { BridgeCacheSystem } from "@ledgerhq/types-live"; const itemModeDisplaySort = { create: 1, @@ -32,14 +29,18 @@ export const importAccountsMakeItems = ({ result: Result; accounts: Account[]; items?: ImportItem[]; -}): ImportItem[] => - result.accounts +}): { + items: ImportItem[]; + accountNames: Map; +} => { + const accountNames = new Map(); + const resultItems = result.accounts .map(accInput => { const prevItem = (items || []).find(item => item.account.id === accInput.id); if (prevItem) return prevItem; try { - const account = accountDataToAccount(accInput); + const account = accountDataToAccount(accInput)[0]; const error = checkAccountSupported(account); if (error) { @@ -50,30 +51,12 @@ export const importAccountsMakeItems = ({ }; } + accountNames.set(accInput.id, accInput.name); + const existingAccount = accounts.find(a => a.id === accInput.id); if (existingAccount) { - // only the name is supposed to change. rest is never changing - if ( - existingAccount.name === accInput.name && - isEqual(existingAccount.swapHistory, account.swapHistory) - ) { - return { - initialAccountId: existingAccount.id, - account: existingAccount, - mode: "id", - }; - } - - return { - initialAccountId: existingAccount.id, - account: { - ...existingAccount, - name: accInput.name, - swapHistory: joinSwapHistories(existingAccount.swapHistory, account.swapHistory), - }, - mode: "update", - }; + return; } return { @@ -92,6 +75,9 @@ export const importAccountsMakeItems = ({ itemModeDisplaySort[(a as ImportItem).mode] - itemModeDisplaySort[(b as ImportItem).mode], ) as ImportItem[]; + return { items: resultItems, accountNames }; +}; + /** * SyncNewAccountsOutput * - synchronized: a map of account id to account. the account id are kept as originally set in the items[].account before a possible "remap" of the ids after a sync happened @@ -117,12 +103,13 @@ export type SyncNewAccountsInput = { */ export const syncNewAccountsToImport = async ( { items, selectedAccounts }: SyncNewAccountsInput, + getAccountBridge: (account: Account) => AccountBridge, bridgeCache: BridgeCacheSystem, blacklistedTokenIds?: string[], ): Promise => { const selectedItems = items.filter(item => selectedAccounts.includes(item.account.id)); - const synchronized = {}; - const failed = {}; + const synchronized: Record = {}; + const failed: Record = {}; await promiseAllBatched(getEnv("SYNC_MAX_CONCURRENT"), selectedItems, async ({ account }) => { try { const bridge = getAccountBridge(account); @@ -138,7 +125,7 @@ export const syncNewAccountsToImport = async ( const synced = await firstValueFrom(reduced); synchronized[account.id] = synced; } catch (e) { - failed[account.id] = e; + failed[account.id] = e instanceof Error ? e : new Error(String(e)); } }); return { synchronized, failed }; diff --git a/libs/ledger-live-common/src/__tests__/accounts/ordering.ts b/libs/live-wallet/src/ordering.test.ts similarity index 57% rename from libs/ledger-live-common/src/__tests__/accounts/ordering.ts rename to libs/live-wallet/src/ordering.test.ts index 19651ed8fe12..d4215ccc142f 100644 --- a/libs/ledger-live-common/src/__tests__/accounts/ordering.ts +++ b/libs/live-wallet/src/ordering.test.ts @@ -1,9 +1,14 @@ +// TODO rewrite the test + import type { AccountRaw } from "@ledgerhq/types-live"; -import { fromAccountRaw, sortAccountsComparatorFromOrder } from "../../account"; -import { setSupportedCurrencies } from "../../currencies"; +import { sortAccountsComparatorFromOrder } from "./ordering"; +import { setSupportedCurrencies } from "@ledgerhq/coin-framework/currencies/index"; +import { fromAccountRaw } from "@ledgerhq/coin-framework/serialization/account"; +import { WalletState, accountRawToAccountUserData } from "./store"; + setSupportedCurrencies(["ethereum"]); -const accounts = [ +const raws: AccountRaw[] = [ { id: "ethereumjs:2:ethereum:0x01:", seedIdentifier: "0x01", @@ -16,7 +21,6 @@ const accounts = [ operations: [], pendingOperations: [], currencyId: "ethereum", - unitMagnitude: 18, lastSyncDate: "2019-07-17T15:13:30.318Z", balance: "1000000000000000000", }, @@ -32,7 +36,6 @@ const accounts = [ operations: [], pendingOperations: [], currencyId: "ethereum", - unitMagnitude: 18, lastSyncDate: "2019-07-17T15:13:29.306Z", balance: "2000000000000000000", }, @@ -48,7 +51,6 @@ const accounts = [ operations: [], pendingOperations: [], currencyId: "ethereum", - unitMagnitude: 18, lastSyncDate: "2019-07-17T15:13:29.306Z", balance: "3000000000000000000", }, @@ -64,7 +66,6 @@ const accounts = [ operations: [], pendingOperations: [], currencyId: "ethereum", - unitMagnitude: 18, lastSyncDate: "2019-07-17T15:13:29.306Z", balance: "3000000000000000000", }, @@ -80,31 +81,84 @@ const accounts = [ operations: [], pendingOperations: [], currencyId: "ethereum", - unitMagnitude: 18, lastSyncDate: "2019-07-17T15:13:29.306Z", balance: "4000000000000000000", }, -].map(fromAccountRaw); +]; +const accounts = raws.map(a => fromAccountRaw(a)); + +const walletState: WalletState = { + accountNames: new Map(), + starredAccountIds: new Set(), +}; + +for (const raw of raws) { + const r = accountRawToAccountUserData(raw); + walletState.accountNames.set(r.id, r.name); + for (const id of r.starredIds) { + walletState.starredAccountIds.add(id); + } +} -const mockedCalculateCountervalue = (_, balance) => balance; +const mockedCalculateCountervalue = (_: unknown, balance: T): T => balance; test("Accounts ordering | name asc", () => { - const compareFn = sortAccountsComparatorFromOrder("name|asc", mockedCalculateCountervalue); + const compareFn = sortAccountsComparatorFromOrder( + "name|asc", + walletState, + mockedCalculateCountervalue, + ); const sortedAccounts = accounts.sort(compareFn); - expect(sortedAccounts.map(a => a.name)).toEqual(["A", "AA", "B", "C", "CA"]); + expect(sortedAccounts.map(a => walletState.accountNames.get(a.id) || "")).toEqual([ + "A", + "AA", + "B", + "C", + "CA", + ]); }); test("Accounts ordering | name desc", () => { - const compareFn = sortAccountsComparatorFromOrder("name|desc", mockedCalculateCountervalue); + const compareFn = sortAccountsComparatorFromOrder( + "name|desc", + walletState, + mockedCalculateCountervalue, + ); const sortedAccounts = accounts.sort(compareFn); - expect(sortedAccounts.map(a => a.name)).toEqual(["CA", "C", "B", "AA", "A"]); + expect(sortedAccounts.map(a => walletState.accountNames.get(a.id) || "")).toEqual([ + "CA", + "C", + "B", + "AA", + "A", + ]); }); test("Accounts ordering | balance asc", () => { - const compareFn = sortAccountsComparatorFromOrder("balance|asc", mockedCalculateCountervalue); + const compareFn = sortAccountsComparatorFromOrder( + "balance|asc", + walletState, + mockedCalculateCountervalue, + ); const sortedAccounts = accounts.sort(compareFn); - expect(sortedAccounts.map(a => a.name)).toEqual(["A", "B", "C", "CA", "AA"]); + expect(sortedAccounts.map(a => walletState.accountNames.get(a.id) || "")).toEqual([ + "A", + "B", + "C", + "CA", + "AA", + ]); }); test("Accounts ordering | balance desc", () => { - const compareFn = sortAccountsComparatorFromOrder("balance|desc", mockedCalculateCountervalue); + const compareFn = sortAccountsComparatorFromOrder( + "balance|desc", + walletState, + mockedCalculateCountervalue, + ); const sortedAccounts = accounts.sort(compareFn); - expect(sortedAccounts.map(a => a.name)).toEqual(["AA", "C", "CA", "B", "A"]); + expect(sortedAccounts.map(a => walletState.accountNames.get(a.id) || "")).toEqual([ + "AA", + "C", + "CA", + "B", + "A", + ]); }); diff --git a/libs/coin-framework/src/account/ordering.ts b/libs/live-wallet/src/ordering.ts similarity index 80% rename from libs/coin-framework/src/account/ordering.ts rename to libs/live-wallet/src/ordering.ts index 68926cdef13f..f9cc228be0df 100644 --- a/libs/coin-framework/src/account/ordering.ts +++ b/libs/live-wallet/src/ordering.ts @@ -1,26 +1,15 @@ import { BigNumber } from "bignumber.js"; -import { flattenAccounts, getAccountCurrency } from "./helpers"; -import type { FlattenAccountsOptions } from "./helpers"; +import { flattenAccounts, getAccountCurrency } from "@ledgerhq/coin-framework/account/helpers"; +import type { FlattenAccountsOptions } from "@ledgerhq/coin-framework/account/helpers"; import type { Account, AccountLike } from "@ledgerhq/types-live"; import type { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets"; +import { WalletState, accountNameWithDefaultSelector } from "./store"; export type AccountComparator = (a: AccountLike, b: AccountLike) => number; -const sortNameLense = (a: AccountLike): string => { - switch (a.type) { - case "Account": - return a.name; - - case "TokenAccount": - return a.token.name; - - default: - return ""; - } -}; - export const sortAccountsComparatorFromOrder = ( orderAccounts: string, + walletState: WalletState, calculateCountervalue: ( currency: TokenCurrency | CryptoCurrency, value: BigNumber, @@ -32,9 +21,11 @@ export const sortAccountsComparatorFromOrder = ( if (order === "name") { return (a, b) => ascValue * - sortNameLense(a).localeCompare(sortNameLense(b), undefined, { - numeric: true, - }); + accountNameWithDefaultSelector(walletState, a).localeCompare( + accountNameWithDefaultSelector(walletState, b), + undefined, + { numeric: true }, + ); } const cvCaches: Record = {}; @@ -48,7 +39,10 @@ export const sortAccountsComparatorFromOrder = ( return (a, b) => { const diff = ascValue * lazyCalcCV(a).minus(lazyCalcCV(b)).toNumber(); - if (diff === 0) return sortNameLense(a).localeCompare(sortNameLense(b)); + if (diff === 0) + return accountNameWithDefaultSelector(walletState, a).localeCompare( + accountNameWithDefaultSelector(walletState, b), + ); return diff; }; }; diff --git a/libs/live-wallet/src/store.ts b/libs/live-wallet/src/store.ts new file mode 100644 index 000000000000..e7098d0abdff --- /dev/null +++ b/libs/live-wallet/src/store.ts @@ -0,0 +1,171 @@ +/** + * This exports all the logic related to the Wallet store. + * The Wallet store is a store that contains the user data related to accounts. + * It essentially is the whole user's wallet. + */ +import { Account, AccountLike, AccountRaw, AccountUserData } from "@ledgerhq/types-live"; +import { getDefaultAccountName, getDefaultAccountNameForCurrencyIndex } from "./accountName"; +import { AddAccountsAction } from "./addAccounts"; +import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies"; + +export type WalletState = { + // user's customized name for each account id + accountNames: Map; + + // a set of all the account ids that are starred (NB: token accounts can also be starred) + starredAccountIds: Set; +}; + +export const initialState: WalletState = { + accountNames: new Map(), + starredAccountIds: new Set(), +}; + +export enum WalletHandlerType { + INIT_ACCOUNTS = "INIT_ACCOUNTS", + SET_ACCOUNT_NAME = "SET_ACCOUNT_NAME", + SET_ACCOUNT_STARRED = "SET_ACCOUNT_STARRED", + BULK_SET_ACCOUNT_NAMES = "BULK_SET_ACCOUNT_NAMES", + ADD_ACCOUNTS = "ADD_ACCOUNTS", +} + +export type HandlersPayloads = { + INIT_ACCOUNTS: { accounts: Account[]; accountsUserData: AccountUserData[] }; + SET_ACCOUNT_NAME: { accountId: string; name: string }; + BULK_SET_ACCOUNT_NAMES: { accountNames: Map }; + SET_ACCOUNT_STARRED: { accountId: string; starred: boolean }; + ADD_ACCOUNTS: AddAccountsAction["payload"]; +}; + +type Handlers = { + [Key in keyof Types]: ( + state: State, + body: { payload: Types[PreciseKey extends true ? Key : keyof Types] }, + ) => State; +}; + +export type WalletHandlers = Handlers; + +export const handlers: WalletHandlers = { + INIT_ACCOUNTS: (_, { payload: { accountsUserData } }): WalletState => { + const accountNames = new Map(); + const starredAccountIds = new Set(); + accountsUserData.forEach(accountUserData => { + accountNames.set(accountUserData.id, accountUserData.name); + for (const starredId of accountUserData.starredIds) { + starredAccountIds.add(starredId); + } + }); + return { accountNames, starredAccountIds }; + }, + SET_ACCOUNT_NAME: (state, { payload: { accountId, name } }) => { + const accountNames = new Map(state.accountNames); + accountNames.set(accountId, name); + return { ...state, accountNames }; + }, + BULK_SET_ACCOUNT_NAMES: (state, { payload: { accountNames } }) => { + // merge the new account names with the existing ones + const newAccountNames = new Map(state.accountNames); + for (const [accountId, name] of accountNames) { + newAccountNames.set(accountId, name); + } + return { ...state, accountNames: newAccountNames }; + }, + SET_ACCOUNT_STARRED: (state, { payload: { accountId, starred: value } }) => { + const starredAccountIds = new Set(state.starredAccountIds); + if (value) { + starredAccountIds.add(accountId); + } else { + starredAccountIds.delete(accountId); + } + return { ...state, starredAccountIds }; + }, + ADD_ACCOUNTS: (state, { payload: { allAccounts, editedNames } }) => { + const accountNames = new Map(state.accountNames); + for (const account of allAccounts) { + const name = editedNames.get(account.id) || getDefaultAccountName(account); + accountNames.set(account.id, name); + } + return { ...state, accountNames }; + }, +}; + +// actions + +export const setAccountName = (accountId: string, name: string) => ({ + type: "SET_ACCOUNT_NAME", + payload: { accountId, name }, +}); + +export const setAccountNames = (accountNames: Map) => ({ + type: "BULK_SET_ACCOUNT_NAMES", + payload: { accountNames }, +}); + +export const setAccountStarred = (accountId: string, starred: boolean) => ({ + type: "SET_ACCOUNT_STARRED", + payload: { accountId, starred }, +}); + +export const initAccounts = (accounts: Account[], accountsUserData: AccountUserData[]) => ({ + type: "INIT_ACCOUNTS", + payload: { accounts, accountsUserData }, +}); + +// Local Selectors + +export const accountNameSelector = ( + state: WalletState, + { accountId }: { accountId: string }, +): string | undefined => state.accountNames.get(accountId); + +export const accountNameWithDefaultSelector = (state: WalletState, account: AccountLike): string => + state.accountNames.get(account.id) || getDefaultAccountName(account); + +export const isStarredAccountSelector = ( + state: WalletState, + { accountId }: { accountId: string }, +): boolean => state.starredAccountIds.has(accountId); + +/** + * Recreate an AccountUserData from the store. + * it is used to transport all data related to a main account. + * but the data isn't used internally for performance reason. + */ +export const accountUserDataExportSelector = ( + state: WalletState, + { account }: { account: Account }, +): AccountUserData => { + const id = account.id; + const name = state.accountNames.get(id) || getDefaultAccountName(account); + const starredIds = []; + if (state.starredAccountIds.has(id)) { + starredIds.push(id); + } + for (const t of account.subAccounts || []) { + if (state.starredAccountIds.has(t.id)) { + starredIds.push(t.id); + } + } + return { id, name, starredIds }; +}; + +export const accountRawToAccountUserData = (raw: AccountRaw): AccountUserData => { + const { id } = raw; + const name = + raw.name || + getDefaultAccountNameForCurrencyIndex({ + currency: getCryptoCurrencyById(raw.currencyId), + index: raw.index, + }); + const starredIds = []; + if (raw.starred) { + starredIds.push(raw.id); + } + for (const t of raw.subAccounts || []) { + if (t.starred) { + starredIds.push(t.id); + } + } + return { id, name, starredIds }; +}; diff --git a/libs/live-wallet/tsconfig.json b/libs/live-wallet/tsconfig.json new file mode 100644 index 000000000000..f1eda7ec5c36 --- /dev/null +++ b/libs/live-wallet/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.base", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "noImplicitAny": true, + "noImplicitThis": true, + "module": "commonjs", + "downlevelIteration": true, + "jsx": "react", + "lib": ["es2020", "dom"], + "outDir": "lib" + }, + "include": ["src/**/*"] +} diff --git a/package.json b/package.json index 08d0ffbb9092..ec3dfa83736a 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "device-react": "pnpm --filter device-react", "web-tools": "pnpm --filter web-tools", "live-env": "pnpm --filter live-env", + "wallet": "pnpm --filter live-wallet", "portfolio": "pnpm --filter live-portfolio", "promise": "pnpm --filter live-promise", "network": "pnpm --filter live-network", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a73352c17ea1..a394a0ac4887 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -150,6 +150,9 @@ importers: '@ledgerhq/live-network': specifier: workspace:^ version: link:../../libs/live-network + '@ledgerhq/live-wallet': + specifier: workspace:^ + version: link:../../libs/live-wallet '@ledgerhq/logs': specifier: workspace:^ version: link:../../libs/ledgerjs/packages/logs @@ -292,6 +295,9 @@ importers: '@ledgerhq/live-nft-react': specifier: workspace:^ version: link:../../libs/live-nft-react + '@ledgerhq/live-wallet': + specifier: workspace:^ + version: link:../../libs/live-wallet '@ledgerhq/logs': specifier: workspace:^ version: link:../../libs/ledgerjs/packages/logs @@ -794,6 +800,9 @@ importers: '@ledgerhq/live-nft-react': specifier: workspace:^ version: link:../../libs/live-nft-react + '@ledgerhq/live-wallet': + specifier: workspace:^ + version: link:../../libs/live-wallet '@ledgerhq/logs': specifier: workspace:^ version: link:../../libs/ledgerjs/packages/logs @@ -2549,9 +2558,6 @@ importers: '@ledgerhq/coin-solana': specifier: workspace:^ version: link:../coin-modules/coin-solana - '@ledgerhq/compressjs': - specifier: github:LedgerHQ/compressjs#d9e8e4d994923e0ea76a32b97289bcccfe71b82e - version: github.com/LedgerHQ/compressjs/d9e8e4d994923e0ea76a32b97289bcccfe71b82e '@ledgerhq/crypto-icons-ui': specifier: workspace:^ version: link:../ui/packages/crypto-icons @@ -2645,6 +2651,9 @@ importers: '@ledgerhq/live-promise': specifier: workspace:^ version: link:../promise + '@ledgerhq/live-wallet': + specifier: workspace:^ + version: link:../live-wallet '@ledgerhq/logs': specifier: workspace:^ version: link:../ledgerjs/packages/logs @@ -4917,6 +4926,58 @@ importers: specifier: ^29.1.1 version: 29.1.1(jest@29.7.0)(typescript@5.1.3) + libs/live-wallet: + dependencies: + '@ledgerhq/coin-framework': + specifier: workspace:* + version: link:../coin-framework + '@ledgerhq/compressjs': + specifier: github:LedgerHQ/compressjs#d9e8e4d994923e0ea76a32b97289bcccfe71b82e + version: github.com/LedgerHQ/compressjs/d9e8e4d994923e0ea76a32b97289bcccfe71b82e + '@ledgerhq/cryptoassets': + specifier: workspace:* + version: link:../ledgerjs/packages/cryptoassets + '@ledgerhq/devices': + specifier: workspace:* + version: link:../ledgerjs/packages/devices + '@ledgerhq/live-env': + specifier: workspace:* + version: link:../env + '@ledgerhq/live-promise': + specifier: workspace:* + version: link:../promise + '@ledgerhq/logs': + specifier: workspace:* + version: link:../ledgerjs/packages/logs + '@ledgerhq/types-cryptoassets': + specifier: workspace:* + version: link:../ledgerjs/packages/types-cryptoassets + '@ledgerhq/types-live': + specifier: workspace:* + version: link:../ledgerjs/packages/types-live + bignumber.js: + specifier: '9' + version: 9.1.2 + lodash: + specifier: '4' + version: 4.17.21 + rxjs: + specifier: '7' + version: 7.8.1 + devDependencies: + '@types/jest': + specifier: ^29.5.10 + version: 29.5.12 + '@types/lodash': + specifier: '4' + version: 4.14.202 + jest: + specifier: ^29.7.0 + version: 29.7.0 + ts-jest: + specifier: ^29.1.1 + version: 29.1.2(jest@29.7.0)(typescript@5.1.3) + libs/promise: dependencies: '@ledgerhq/logs': @@ -24014,7 +24075,7 @@ packages: react-docgen-typescript: 2.2.2(typescript@5.1.3) tslib: 2.6.2 typescript: 5.1.3 - webpack: 5.89.0(esbuild@0.19.3) + webpack: 5.89.0(metro@0.80.0) transitivePeerDependencies: - supports-color dev: true @@ -29163,7 +29224,7 @@ packages: '@babel/core': 7.23.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.89.0(@swc/core@1.3.95)(esbuild@0.19.3) + webpack: 5.89.0(@swc/core@1.3.95)(metro@0.80.0) dev: true /babel-plugin-add-react-displayname@0.0.5: @@ -38143,7 +38204,7 @@ packages: semver: 7.5.4 tapable: 2.2.1 typescript: 5.1.3 - webpack: 5.89.0(@swc/core@1.3.95)(esbuild@0.19.3) + webpack: 5.89.0(@swc/core@1.3.95)(metro@0.80.0) dev: true /form-data@2.3.3: @@ -55956,7 +56017,7 @@ packages: webpack: '>=2' dependencies: '@swc/core': 1.3.95 - webpack: 5.89.0(@swc/core@1.3.95)(esbuild@0.19.3) + webpack: 5.89.0(@swc/core@1.3.95)(metro@0.80.0) dev: true /swiper@7.4.1: @@ -60352,7 +60413,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.89.0(@swc/core@1.3.95)(esbuild@0.19.3) + webpack: 5.89.0(@swc/core@1.3.95)(metro@0.80.0) dev: true /webpack-dev-server@4.12.0(webpack@5.76.1):