Skip to content

Commit

Permalink
Merge pull request #729 from input-output-hk/feat/LW-6528-update-sing…
Browse files Browse the repository at this point in the history
…le-address-wallet-to-support-hd-wallets

[LW-6528] feat: the single address wallet now takes an additional dependency 'AddressDiscovery'
  • Loading branch information
rhyslbw committed May 22, 2023
2 parents 8d30ed7 + 1b50183 commit c18e09d
Show file tree
Hide file tree
Showing 56 changed files with 993 additions and 256 deletions.
2 changes: 1 addition & 1 deletion packages/e2e/jest.config.js
Expand Up @@ -37,7 +37,7 @@ module.exports = {
{
...commonProjectProps,
displayName: 'wallet-real-ada',
testMatch: [`<rootDir>/test/wallet/SingleAddressWallet/(${realAdaTestFileNames.join('|')}).test.ts`]
testMatch: [`<rootDir>/test/wallet/PersonalWallet/(${realAdaTestFileNames.join('|')}).test.ts`]
},
{
...commonProjectProps,
Expand Down
4 changes: 3 additions & 1 deletion packages/e2e/src/environment.ts
Expand Up @@ -75,6 +75,7 @@ const providerParams = makeValidator((value) => {
* Shared across all tests
*/
const validators = {
ADDRESS_DISCOVERY: str({ default: 'HDSequentialDiscovery' }),
ARRIVAL_PHASE_DURATION_IN_SECS: num(),
ASSET_PROVIDER: str(),
ASSET_PROVIDER_PARAMS: providerParams(),
Expand Down Expand Up @@ -152,5 +153,6 @@ export const walletVariables = [
'TX_SUBMIT_PROVIDER',
'TX_SUBMIT_PROVIDER_PARAMS',
'UTXO_PROVIDER',
'UTXO_PROVIDER_PARAMS'
'UTXO_PROVIDER_PARAMS',
'ADDRESS_DISCOVERY'
] as const;
43 changes: 33 additions & 10 deletions packages/e2e/src/factories.ts
@@ -1,5 +1,17 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import * as Crypto from '@cardano-sdk/crypto';
import {
AddressDiscovery,
DEFAULT_POLLING_CONFIG,
HDSequentialDiscovery,
Milliseconds,
ObservableWallet,
PersonalWallet,
PollingConfig,
SingleAddressDiscovery,
setupWallet,
storage
} from '@cardano-sdk/wallet';
import {
AssetProvider,
CML,
Expand All @@ -21,15 +33,6 @@ import {
util
} from '@cardano-sdk/key-management';
import { CardanoWalletFaucetProvider, FaucetProvider } from './FaucetProvider';
import {
DEFAULT_POLLING_CONFIG,
Milliseconds,
ObservableWallet,
PollingConfig,
SingleAddressWallet,
setupWallet,
storage
} from '@cardano-sdk/wallet';
import { LedgerKeyAgent } from '@cardano-sdk/hardware-ledger';
import { Logger } from 'ts-log';
import { OgmiosTxSubmitProvider } from '@cardano-sdk/ogmios';
Expand Down Expand Up @@ -69,6 +72,15 @@ export const txSubmitProviderFactory = new ProviderFactory<TxSubmitProvider>();
export const utxoProviderFactory = new ProviderFactory<UtxoProvider>();
export const stakePoolProviderFactory = new ProviderFactory<StakePoolProvider>();
export const bip32Ed25519Factory = new ProviderFactory<Crypto.Bip32Ed25519>();
export const addressDiscoveryFactory = new ProviderFactory<AddressDiscovery>();

// Address Discovery strategies

addressDiscoveryFactory.register('SingleAddressDiscovery', async () => new SingleAddressDiscovery());
addressDiscoveryFactory.register(
'HDSequentialDiscovery',
async ({ chainHistoryProvider }) => new HDSequentialDiscovery(chainHistoryProvider, 20, 5)
);

// bip32Ed25519

Expand Down Expand Up @@ -286,6 +298,17 @@ const patchInitializeTxToRespectEpochBoundary = <T extends ObservableWallet>(
export const getWallet = async (props: GetWalletProps) => {
const { env, idx, logger, name, polling, stores, customKeyParams, keyAgent } = props;
const providers = {
addressDiscovery: await addressDiscoveryFactory.create(
env.ADDRESS_DISCOVERY,
{
chainHistoryProvider: await chainHistoryProviderFactory.create(
env.CHAIN_HISTORY_PROVIDER,
env.CHAIN_HISTORY_PROVIDER_PARAMS,
logger
)
},
logger
),
assetProvider: await assetProviderFactory.create(env.ASSET_PROVIDER, env.ASSET_PROVIDER_PARAMS, logger),
chainHistoryProvider: await chainHistoryProviderFactory.create(
env.CHAIN_HISTORY_PROVIDER,
Expand Down Expand Up @@ -320,7 +343,7 @@ export const getWallet = async (props: GetWalletProps) => {
? () => Promise.resolve(keyAgent)
: await keyManagementFactory.create(env.KEY_MANAGEMENT_PROVIDER, keyManagementParams, logger),
createWallet: async (asyncKeyAgent: AsyncKeyAgent) =>
new SingleAddressWallet({ name, polling }, { ...providers, keyAgent: asyncKeyAgent, logger, stores }),
new PersonalWallet({ name, polling }, { ...providers, keyAgent: asyncKeyAgent, logger, stores }),
logger
});

Expand Down
4 changes: 2 additions & 2 deletions packages/e2e/test/artillery/wallet-restoration/types.ts
@@ -1,13 +1,13 @@
import { GroupedAddress } from '@cardano-sdk/key-management';
import { SingleAddressWallet } from '@cardano-sdk/wallet';
import { PersonalWallet } from '@cardano-sdk/wallet';

/**
* The context variables shared between all the hooks.
*/
export interface WalletVars {
walletLoads: number;
addresses: GroupedAddress[];
currentWallet: SingleAddressWallet;
currentWallet: PersonalWallet;
}

export interface AddressesModel {
Expand Down
Expand Up @@ -6,7 +6,7 @@ import path from 'path';
dotenv.config({ path: path.join(__dirname, '../../../.env') });

import { Logger } from 'ts-log';
import { SingleAddressWallet, createLazyWalletUtil } from '@cardano-sdk/wallet';
import { PersonalWallet, createLazyWalletUtil } from '@cardano-sdk/wallet';
import { bufferCount, bufferTime, from, mergeAll, tap } from 'rxjs';
import { logger } from '@cardano-sdk/util-dev';

Expand Down Expand Up @@ -77,14 +77,14 @@ const getKeyAgent = async (accountIndex: number) => {
return { keyAgent, walletUtil };
};

const createWallet = async (accountIndex: number): Promise<SingleAddressWallet> => {
const createWallet = async (accountIndex: number): Promise<PersonalWallet> => {
measurementUtil.addStartMarker(MeasureTarget.keyAgent, accountIndex);
const providers = await getProviders();
const { keyAgent, walletUtil } = await getKeyAgent(accountIndex);
measurementUtil.addMeasureMarker(MeasureTarget.keyAgent, accountIndex);

measurementUtil.addStartMarker(MeasureTarget.wallet, accountIndex);
const wallet = new SingleAddressWallet({ name: `Wallet ${accountIndex}` }, { ...providers, keyAgent, logger });
const wallet = new PersonalWallet({ name: `Wallet ${accountIndex}` }, { ...providers, keyAgent, logger });
walletUtil.initialize(wallet);
return wallet;
};
Expand All @@ -105,7 +105,7 @@ const showResults = () => {
measurementUtil.start();

// Simple scheduler that distributes the requested number of calls evenly in the duration time
getLoadTestScheduler<SingleAddressWallet>(
getLoadTestScheduler<PersonalWallet>(
{
// callUnderTest must be a method returning an observable
callUnderTest: (id) => from(initWallet(id)),
Expand Down
Expand Up @@ -7,7 +7,7 @@ import { Cardano } from '@cardano-sdk/core/dist/esm';
import { GroupedAddress, util } from '@cardano-sdk/key-management';
import { Logger } from 'ts-log';
import { MINUTE, StubKeyAgent, getEnv, getWallet, walletVariables } from '../../../src';
import { SingleAddressWallet } from '@cardano-sdk/wallet';
import { PersonalWallet } from '@cardano-sdk/wallet';
import { logger } from '@cardano-sdk/util-dev';
import { mapToGroupedAddress, waitForWalletStateSettle } from '../../util';

Expand Down Expand Up @@ -37,7 +37,7 @@ const range = (toNum: number) => {
return resArr;
};

const initWallets = async (walletsNum: number, addresses: GroupedAddress[]): Promise<SingleAddressWallet[]> => {
const initWallets = async (walletsNum: number, addresses: GroupedAddress[]): Promise<PersonalWallet[]> => {
testLogger.info('Number of concurrent users: ', walletsNum);
let currentAddress;
const wallets = [];
Expand Down
6 changes: 3 additions & 3 deletions packages/e2e/test/long-running/delegation-rewards.test.ts
@@ -1,5 +1,5 @@
import { Cardano } from '@cardano-sdk/core';
import { SingleAddressWallet } from '@cardano-sdk/wallet';
import { PersonalWallet } from '@cardano-sdk/wallet';
import { TestWallet, getEnv, getWallet, walletVariables } from '../../src';
import { firstValueFrom } from 'rxjs';
import {
Expand All @@ -17,8 +17,8 @@ const env = getEnv(walletVariables);

describe('delegation rewards', () => {
let providers: TestWallet['providers'];
let wallet1: SingleAddressWallet;
let wallet2: SingleAddressWallet;
let wallet1: PersonalWallet;
let wallet2: PersonalWallet;

const initializeWallets = async () => {
const amountFromFaucet = 100_000_000_000n;
Expand Down
6 changes: 3 additions & 3 deletions packages/e2e/test/util.ts
Expand Up @@ -29,7 +29,7 @@ import {
networkInfoProviderFactory,
walletVariables
} from '../src';
import { FinalizeTxProps, ObservableWallet, SingleAddressWallet } from '@cardano-sdk/wallet';
import { FinalizeTxProps, ObservableWallet, PersonalWallet } from '@cardano-sdk/wallet';
import { InitializeTxProps } from '@cardano-sdk/tx-construction';
import { logger } from '@cardano-sdk/util-dev';
import sortBy from 'lodash/sortBy';
Expand Down Expand Up @@ -223,7 +223,7 @@ export const runningAgainstLocalNetwork = async () => {
* @param tx The **already confirmed** transaction we need to know the confirmation epoch
* @returns The epoch when the given transaction was confirmed
*/
export const getTxConfirmationEpoch = async (wallet: SingleAddressWallet, tx: Cardano.Tx<Cardano.TxBody>) => {
export const getTxConfirmationEpoch = async (wallet: PersonalWallet, tx: Cardano.Tx<Cardano.TxBody>) => {
const txs = await firstValueFrom(wallet.transactions.history$.pipe(filter((_) => _.some(({ id }) => id === tx.id))));
const observedTx = txs.find(({ id }) => id === tx.id);
const slotEpochCalc = createSlotEpochCalc(await firstValueFrom(wallet.eraSummaries$));
Expand Down Expand Up @@ -287,7 +287,7 @@ export const burnTokens = async ({
scripts,
policySigners: extraSigners
}: {
wallet: SingleAddressWallet;
wallet: PersonalWallet;
tokens?: Cardano.TokenMap;
scripts: Cardano.Script[];
policySigners: TransactionSigner[];
Expand Down
@@ -1,6 +1,6 @@
/* eslint-disable sonarjs/no-duplicate-string */
import { Cardano } from '@cardano-sdk/core';
import { SingleAddressWallet } from '@cardano-sdk/wallet';
import { PersonalWallet } from '@cardano-sdk/wallet';
import { createLogger } from '@cardano-sdk/util-dev';
import { filter, firstValueFrom, map, take } from 'rxjs';
import { getEnv, walletVariables } from '../../../src/environment';
Expand All @@ -11,8 +11,8 @@ import { normalizeTxBody, walletReady } from '../../util';
const env = getEnv(walletVariables);
const logger = createLogger();

describe('SingleAddressWallet/byron', () => {
let wallet: SingleAddressWallet;
describe('PersonalWallet/byron', () => {
let wallet: PersonalWallet;

beforeAll(async () => {
wallet = (await getWallet({ env, idx: 0, logger, name: 'Wallet', polling: { interval: 50 } })).wallet;
Expand Down
Expand Up @@ -41,7 +41,7 @@ const waitForTx = async (wallet: ObservableWallet, hash: Cardano.TransactionId)
await waitForWalletStateSettle(wallet);
};

describe('SingleAddressWallet/delegation', () => {
describe('PersonalWallet/delegation', () => {
let wallet1: TestWallet;
let wallet2: TestWallet;

Expand Down
@@ -1,5 +1,5 @@
import { Cardano } from '@cardano-sdk/core';
import { SingleAddressWallet, createWalletUtil } from '@cardano-sdk/wallet';
import { PersonalWallet, createWalletUtil } from '@cardano-sdk/wallet';
import { filter, firstValueFrom, map } from 'rxjs';
import { getEnv, getWallet, walletVariables } from '../../../src';
import { isNotNil } from '@cardano-sdk/util';
Expand All @@ -8,8 +8,8 @@ import { walletReady } from '../../util';

const env = getEnv(walletVariables);

describe('SingleAddressWallet/metadata', () => {
let wallet: SingleAddressWallet;
describe('PersonalWallet/metadata', () => {
let wallet: PersonalWallet;
let ownAddress: Cardano.PaymentAddress;

beforeAll(async () => {
Expand Down
@@ -1,5 +1,5 @@
import { Cardano, nativeScriptPolicyId } from '@cardano-sdk/core';
import { FinalizeTxProps, SingleAddressWallet } from '@cardano-sdk/wallet';
import { FinalizeTxProps, PersonalWallet } from '@cardano-sdk/wallet';
import { InitializeTxProps } from '@cardano-sdk/tx-construction';
import { KeyRole, util } from '@cardano-sdk/key-management';
import { burnTokens, createStandaloneKeyAgent, submitAndConfirm, walletReady } from '../../util';
Expand All @@ -11,8 +11,8 @@ import { isNotNil } from '@cardano-sdk/util';
const env = getEnv(walletVariables);
const logger = createLogger();

describe('SingleAddressWallet/mint', () => {
let wallet: SingleAddressWallet;
describe('PersonalWallet/mint', () => {
let wallet: PersonalWallet;

afterAll(() => {
wallet.shutdown();
Expand Down

0 comments on commit c18e09d

Please sign in to comment.