@dolaned/wallet-sdk-ts
Version:
Wallet SDK for the Nexa blockchain
97 lines (78 loc) • 3.77 kB
text/typescript
import {AccountIndexes, AccountKeys, AddressKey} from "../../../models/wallet.entities";
import {BaseAccount} from "../interfaces/BaseAccountInterface";
import {
AccountType, classifyTransaction,
fetchTotalBalance,
fetchTransactionsHistory,
sumBalance,
sumTokensBalance
} from "../../../utils/WalletUtils";
import {PrivateKey} from "libnexa-ts";
import {TransactionEntity} from "../../../models/transaction.entities";
export default class DefaultAccount extends BaseAccount {
private readonly _accountIndexes: AccountIndexes; // either a list of indexes or a single bip44 account index
private _accountKeys: AccountKeys; // either a list of keys or a single key
constructor(bip44Account: number, accountIndexes: AccountIndexes, accountKeys: AccountKeys) {
super(bip44Account)
if (accountIndexes.rIndex < 0) {
throw new Error(`Can not create nexa account with an rindex of ${accountIndexes.rIndex}. must be >= 0.`);
}
if (accountIndexes.cIndex < 0) {
throw new Error(`Can not create nexa account with an cindex of ${accountIndexes.cIndex}. must be >= 0.`);
}
this._accountIndexes = accountIndexes;
this._accountKeys = accountKeys;
}
// this is used in AccountStore.ts to get the key to be used in the map for this account
public getAccountStoreKey() {
return String(this._bip44Account);
}
public getAccountType(): AccountType {
return AccountType.NEXA_ACCOUNT
}
public getNewAddress() {
return this._accountKeys.receiveKeys[this._accountKeys.receiveKeys.length - 1]?.address ?? '';
}
public getNewChangeAddress(): string {
return this._accountKeys.changeKeys[this._accountKeys.changeKeys.length - 1]?.address ?? ''
}
get accountIndexes(): AccountIndexes {
return this._accountIndexes;
}
get accountKeys(): AccountKeys {
return this._accountKeys;
}
async loadBalances(): Promise<void> {
let balances = await fetchTotalBalance(this._accountKeys.receiveKeys.concat(this._accountKeys.changeKeys));
let tokenBalances = this._accountKeys.receiveKeys.concat(this._accountKeys.changeKeys).map(k => k.tokensBalance);
super.balance = sumBalance(balances)
super.tokenBalances = sumTokensBalance(tokenBalances)
}
getKeyFromAddress(address: string): AddressKey {
const allKeys = this._accountKeys.receiveKeys.concat(this._accountKeys.changeKeys)
const keyFound = allKeys.find(key => key.address === address)
return keyFound!
}
async getTransactions(fromHeight?: number, address?: string): Promise<Map<string, TransactionEntity>> {
let receiveAddresses = this.accountKeys.receiveKeys.map(ak => ak.address);
let changeAddresses = this.accountKeys.changeKeys.map(ak => ak.address);
let allAddresses = receiveAddresses.concat(changeAddresses);
let rTxs = fetchTransactionsHistory(address != null ? [address]: receiveAddresses, fromHeight ?? 0);
let cTxs = fetchTransactionsHistory(address != null ? [address] : receiveAddresses, fromHeight ?? 0);
let [rData, cData] = await Promise.all([rTxs, cTxs]);
let txHistory = rData.txs;
for (let tx of cData.txs.values()) {
txHistory.set(tx.tx_hash, tx);
}
let txPromises: TransactionEntity[] = [];
for (let tx of txHistory.values()) {
let t = await classifyTransaction(tx, allAddresses);
txPromises.push(t);
}
await Promise.all(txPromises)
for (let txEntity of txPromises){
this.transactions.set(txEntity.txId, txEntity)
}
return this.transactions
}
}