diff --git a/src/api/entities/Identity/Portfolios.ts b/src/api/entities/Identity/Portfolios.ts index 05a2bf54b1..b428037af7 100644 --- a/src/api/entities/Identity/Portfolios.ts +++ b/src/api/entities/Identity/Portfolios.ts @@ -1,18 +1,19 @@ import BigNumber from 'bignumber.js'; +import { PortfolioId } from 'polymesh-types/types'; import { DefaultPortfolio, Identity, Namespace, NumberedPortfolio } from '~/api/entities'; import { createPortfolio, deletePortfolio } from '~/api/procedures'; import { PolymeshError, TransactionQueue } from '~/base'; import { PortfolioNumber } from '~/polkadot'; import { ErrorCode } from '~/types'; -import { numberToU64, stringToIdentityId, u64ToBigNumber } from '~/utils'; +import { identityIdToString, numberToU64, stringToIdentityId, u64ToBigNumber } from '~/utils'; /** * Handles all Portfolio related functionality on the Identity side */ export class Portfolios extends Namespace { /** - * Retrieve all the Portfolios for the Identity + * Retrieve all the Portfolios owned by this Identity */ public async getPortfolios(): Promise<[DefaultPortfolio, ...NumberedPortfolio[]]> { const { @@ -40,6 +41,38 @@ export class Portfolios extends Namespace { return portfolios; } + /** + * Retrieve all Portfolios custodied by this Identity + */ + public async getCustodiedPortfolios(): Promise<(DefaultPortfolio | NumberedPortfolio)[]> { + const { + context, + context: { + polymeshApi: { + query: { portfolio }, + }, + }, + parent: { did: custodianDid }, + } = this; + + const custodian = stringToIdentityId(custodianDid, context); + const portfolioEntries = await portfolio.portfoliosInCustody.entries(custodian); + + return portfolioEntries.map(([{ args }]) => { + const { did: ownerDid, kind } = args[1] as PortfolioId; + + const did = identityIdToString(ownerDid); + + if (kind.isDefault) { + return new DefaultPortfolio({ did }, context); + } + + const id = u64ToBigNumber(kind.asUser); + + return new NumberedPortfolio({ did, id }, context); + }); + } + /** * Retrieve whether this Identity possesses a Portfolio with a certain ID */ diff --git a/src/api/entities/Identity/__tests__/Portfolios.ts b/src/api/entities/Identity/__tests__/Portfolios.ts index 2ba34d6090..411eed0ef0 100644 --- a/src/api/entities/Identity/__tests__/Portfolios.ts +++ b/src/api/entities/Identity/__tests__/Portfolios.ts @@ -56,10 +56,44 @@ describe('Portfolios class', () => { describe('method: getPortfolios', () => { test('should retrieve all the portfolios for the identity', async () => { dsMockUtils.createQueryStub('portfolio', 'portfolios', { + entries: [tuple([rawIdentityId, rawNumberedPortfolioId], dsMockUtils.createMockBytes())], + }); + + stringToIdentityIdStub.withArgs(did, mockContext).returns(rawIdentityId); + u64ToBigNumberStub.returns(numberedPortfolioId); + + const result = await portfolios.getPortfolios(); + expect(result).toHaveLength(2); + expect(result[0] instanceof DefaultPortfolio).toBe(true); + expect(result[1] instanceof NumberedPortfolio).toBe(true); + expect(result[0].owner.did).toEqual(did); + expect(result[1].id).toEqual(numberedPortfolioId); + }); + }); + + describe('method: getCustodiedPortfolos', () => { + test('should retrieve all the Portfolios custodied by the Identity', async () => { + dsMockUtils.createQueryStub('portfolio', 'portfoliosInCustody', { entries: [ tuple( - [dsMockUtils.createMockIdentityId(did), rawNumberedPortfolioId], - dsMockUtils.createMockBytes() + [ + rawIdentityId, + dsMockUtils.createMockPortfolioId({ + did: rawIdentityId, + kind: dsMockUtils.createMockPortfolioKind('Default'), + }), + ], + dsMockUtils.createMockBool(true) + ), + tuple( + [ + rawIdentityId, + dsMockUtils.createMockPortfolioId({ + did: rawIdentityId, + kind: dsMockUtils.createMockPortfolioKind({ User: rawNumberedPortfolioId }), + }), + ], + dsMockUtils.createMockBool(true) ), ], }); @@ -67,12 +101,12 @@ describe('Portfolios class', () => { stringToIdentityIdStub.withArgs(did, mockContext).returns(rawIdentityId); u64ToBigNumberStub.returns(numberedPortfolioId); - const result = await portfolios.getPortfolios(); + const result = await portfolios.getCustodiedPortfolios(); expect(result).toHaveLength(2); expect(result[0] instanceof DefaultPortfolio).toBe(true); expect(result[1] instanceof NumberedPortfolio).toBe(true); expect(result[0].owner.did).toEqual(did); - expect(result[1].id).toEqual(numberedPortfolioId); + expect((result[1] as NumberedPortfolio).id).toEqual(numberedPortfolioId); }); });