@vechain/sdk-network
Version:
This module serves as the standard interface connecting decentralized applications (dApps) and users to the VeChainThor blockchain
176 lines (159 loc) • 5.18 kB
text/typescript
import { Address, HexUInt } from '@vechain/sdk-core';
import { InvalidDataType } from '@vechain/sdk-errors';
import {
type AvailableVeChainProviders,
VeChainPrivateKeySigner,
type VeChainSigner
} from '../../../../signer';
import {
DelegationHandler,
type SignTransactionOptions
} from '../../../../thor-client';
import {
type ProviderInternalWallet,
type ProviderInternalWalletAccount
} from '../types';
/**
* Abstract implementation of Provider internal wallet class.
*/
abstract class AbstractProviderInternalWallet
implements ProviderInternalWallet
{
/**
* List of accounts in the wallet.
*/
readonly accounts: ProviderInternalWalletAccount[];
/**
* Options for signing a transaction with gasPayer.
*/
readonly gasPayer?: SignTransactionOptions;
/**
* Create a new wallet.
*
* @param accounts List of accounts in the wallet.
* @param options Optional options for signing a transaction with gasPayer.
*/
constructor(
accounts: ProviderInternalWalletAccount[],
options?: {
gasPayer?: SignTransactionOptions;
}
) {
this.accounts = accounts;
this.gasPayer = options?.gasPayer;
}
/**
* Get a signer into the internal wallet provider
* for the given address.
*
* @param parentProvider - The parent provider of the Internal Wallet.
* @param addressOrIndex - Address of the account.
* @returns The signer for the given address.
*/
abstract getSigner(
parentProvider: AvailableVeChainProviders,
addressOrIndex?: string | number
): Promise<VeChainSigner | null>;
/**
* SYNC Version of getSigner()
*
* Get a signer into the internal wallet provider
* for the given address.
*
* @param parentProvider - The parent provider of the Internal Wallet.
* @param addressOrIndex - Address or index of the account.
* @returns The signer for the given address.
*/
getSignerSync(
parentProvider: AvailableVeChainProviders,
addressOrIndex?: string | number
): VeChainSigner | null {
// Get the account from the wallet
const signerAccount = this.getAccountSync(addressOrIndex);
// Return a new signer (if exists)
if (signerAccount?.privateKey !== undefined) {
return new VeChainPrivateKeySigner(
signerAccount.privateKey,
parentProvider
);
}
// Return null if the account is not found
return null;
}
/**
* Get the list of addresses in the wallet.
*
* @returns The list of addresses in the wallet.
*/
abstract getAddresses(): Promise<string[]>;
/**
* SYNC Version of getAddresses()
*
* Get the list of addresses in the wallet.
*
* @returns The list of addresses in the wallet.
*/
getAddressesSync(): string[] {
return this.accounts.map((account) => account.address);
}
/**
* Get an account given an address or an index.
*
* @param addressOrIndex - Address or index of the account.
* @returns The account with the given address, or null if not found.
*/
abstract getAccount(
addressOrIndex?: string | number
): Promise<ProviderInternalWalletAccount | null>;
/**
* SYNC Version of getAccount()
*
* Get an account given an address or an index.
*
* @param addressOrIndex - Address or index of the account.
* @returns The account with the given address, or null if not found.
* @throws {InvalidDataType}
*/
getAccountSync(
addressOrIndex?: string | number
): ProviderInternalWalletAccount | null {
if (
addressOrIndex === undefined ||
typeof addressOrIndex === 'number'
) {
return this.accounts[addressOrIndex ?? 0] ?? null;
}
// Check if the address is valid
if (!Address.isValid(addressOrIndex)) {
throw new InvalidDataType(
'AbstractProviderInternalWallet.getAccountSync()',
'Invalid params expected an address.',
{ addressOrIndex }
);
}
// Get the account by address
const account = this.accounts.find(
(account) =>
Address.checksum(HexUInt.of(account.address)) ===
Address.checksum(HexUInt.of(addressOrIndex))
);
return account ?? null;
}
/**
* Get the options for signing a transaction with gasPayer (if any).
*
* @returns The options for signing a transaction with gasPayer.
*/
abstract getGasPayer(): Promise<SignTransactionOptions | null>;
/**
* SYNC Version of getGasPayer()
*
* Get the options for signing a transaction with gasPayer (if any).
*
* @returns The options for signing a transaction with gasPayer.
*/
getGasPayerSync(): SignTransactionOptions | null {
return DelegationHandler(this.gasPayer).gasPayerOrNull();
}
}
export { AbstractProviderInternalWallet };