@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
82 lines (72 loc) • 2.72 kB
text/typescript
import type { ChainwatchNetwork, Account } from "@ledgerhq/types-live";
import ChainwatchAccountManager from "./ChainwatchAccountManager";
const formatAccountsByCurrencies = (newAccounts: Account[], removedAccounts: Account[]) => {
const accountsByCurrencies: Record<
string,
{ newAccounts: Account[]; removedAccounts: Account[] }
> = {};
for (const newAccount of newAccounts) {
if (!accountsByCurrencies[newAccount.currency.id]) {
accountsByCurrencies[newAccount.currency.id] = { newAccounts: [], removedAccounts: [] };
}
accountsByCurrencies[newAccount.currency.id].newAccounts.push(newAccount);
}
for (const removedAccount of removedAccounts) {
if (!accountsByCurrencies[removedAccount.currency.id]) {
accountsByCurrencies[removedAccount.currency.id] = { newAccounts: [], removedAccounts: [] };
}
accountsByCurrencies[removedAccount.currency.id].removedAccounts.push(removedAccount);
}
return accountsByCurrencies;
};
export const getSupportedChainsAccounts = (
userId: string,
chainwatchBaseUrl: string,
supportedChains: ChainwatchNetwork[],
) => {
return Promise.all(
supportedChains.map(supportedChain => {
const accountManager = new ChainwatchAccountManager(
chainwatchBaseUrl,
userId,
supportedChain,
);
return accountManager.getChainwatchAccount();
}),
);
};
export const updateTransactionsAlertsAddresses = async (
userId: string,
chainwatchBaseUrl: string,
supportedChains: ChainwatchNetwork[],
newAccounts: Account[],
removedAccounts: Account[],
) => {
const accountsByCurrencies = formatAccountsByCurrencies(newAccounts, removedAccounts);
for (const [currencyId, accounts] of Object.entries(accountsByCurrencies)) {
const network = supportedChains.find(
(chain: ChainwatchNetwork) => chain.ledgerLiveId === currencyId,
);
if (network) {
const accountManager = new ChainwatchAccountManager(chainwatchBaseUrl, userId, network);
await accountManager.setupChainwatchAccount();
await Promise.all([
accountManager.registerNewAccountsAddresses(accounts.newAccounts),
accountManager.removeAccountsAddresses(accounts.removedAccounts),
]);
}
}
};
export const deleteUserChainwatchAccounts = async (
userId: string,
chainwatchBaseUrl: string,
supportedChains: ChainwatchNetwork[],
) => {
for (const supportedChain of supportedChains) {
const accountManager = new ChainwatchAccountManager(chainwatchBaseUrl, userId, supportedChain);
const chainwatchAccount = await accountManager.getChainwatchAccount();
if (chainwatchAccount) {
await accountManager.removeChainwatchAccount();
}
}
};