Skip to content

Commit

Permalink
feat: 馃幐 Add Claim typeguards (#668)
Browse files Browse the repository at this point in the history
* feat: 馃幐 Add Claim typeguards

Add typeguard functions to cast Claims into specific types

BREAKING CHANGE: 馃Ж isSingleClaimCondition and isMultiClaimCondition moved from
`src/types/index.ts` to `src/utils/typeguards.ts`

BREAKING CHANGE: 馃Ж Moved isPortfolioCustodianRole, isVenueOwnerRole, isCddProviderRole,
isTickerOwnerRole, isIdentityRole from `src/types/index.ts` to
`src/utils/typeguards.ts`

BREAKING CHANGE: 馃Ж InvestorUniqueness, InvestorUniqunessV2, CddClaim converted from type to
interface
  • Loading branch information
polymath-eric committed Feb 3, 2022
1 parent ac96bc1 commit dd86024
Show file tree
Hide file tree
Showing 7 changed files with 254 additions and 113 deletions.
12 changes: 7 additions & 5 deletions src/api/entities/Identity/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,6 @@ import {
DistributionWithDetails,
ErrorCode,
GroupedInstructions,
isCddProviderRole,
isIdentityRole,
isPortfolioCustodianRole,
isTickerOwnerRole,
isVenueOwnerRole,
Order,
PermissionedAccount,
ResultSet,
Expand All @@ -35,6 +30,13 @@ import {
UnsubCallback,
} from '~/types';
import { Ensured, QueryReturnType, tuple } from '~/types/utils';
import {
isCddProviderRole,
isIdentityRole,
isPortfolioCustodianRole,
isTickerOwnerRole,
isVenueOwnerRole,
} from '~/utils';
import { MAX_CONCURRENT_REQUESTS, MAX_PAGE_SIZE } from '~/utils/constants';
import {
accountIdToString,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ describe('modifyComplianceRequirement procedure', () => {
});

test('should add a modify compliance requirement transaction to the queue', async () => {
const fakeConditions = ['condition'] as unknown as Condition[];
const fakeConditions = [{ claim: '' }] as unknown as Condition[];
const fakeSenderConditions = 'senderConditions' as unknown as MeshCondition[];
const fakeReceiverConditions = 'receiverConditions' as unknown as MeshCondition[];

Expand Down
12 changes: 2 additions & 10 deletions src/api/procedures/modifyClaims.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,7 @@ import { Claim as MeshClaim, IdentityId, TxTags } from 'polymesh-types/types';
import { Context, Identity, PolymeshError, Procedure } from '~/internal';
import { didsWithClaims } from '~/middleware/queries';
import { Claim as MiddlewareClaim, Query } from '~/middleware/types';
import {
CddClaim,
Claim,
ClaimTarget,
ClaimType,
ErrorCode,
isInvestorUniquenessClaim,
isScopedClaim,
RoleType,
} from '~/types';
import { CddClaim, Claim, ClaimTarget, ClaimType, ErrorCode, RoleType } from '~/types';
import {
ClaimOperation,
Extrinsics,
Expand All @@ -35,6 +26,7 @@ import {
stringToTicker,
} from '~/utils/conversion';
import { assembleBatchTransactions } from '~/utils/internal';
import { isInvestorUniquenessClaim, isScopedClaim } from '~/utils/typeguards';

interface AddClaimsParams {
/**
Expand Down
155 changes: 63 additions & 92 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,41 +126,6 @@ export type Role =
| PortfolioCustodianRole
| IdentityRole;

/**
* @hidden
*/
export function isPortfolioCustodianRole(role: Role): role is PortfolioCustodianRole {
return role.type === RoleType.PortfolioCustodian;
}

/**
* @hidden
*/
export function isVenueOwnerRole(role: Role): role is VenueOwnerRole {
return role.type === RoleType.VenueOwner;
}

/**
* @hidden
*/
export function isCddProviderRole(role: Role): role is CddProviderRole {
return role.type === RoleType.CddProvider;
}

/**
* @hidden
*/
export function isTickerOwnerRole(role: Role): role is TickerOwnerRole {
return role.type === RoleType.TickerOwner;
}

/**
* @hidden
*/
export function isIdentityRole(role: Role): role is IdentityRole {
return role.type === RoleType.Identity;
}

export enum KnownAssetType {
EquityCommon = 'EquityCommon',
EquityPreferred = 'EquityPreferred',
Expand Down Expand Up @@ -254,58 +219,82 @@ export enum ClaimType {
InvestorUniquenessV2 = 'InvestorUniquenessV2',
}

export type CddClaim = { type: ClaimType.CustomerDueDiligence; id: string };
export interface AccreditedClaim {
type: ClaimType.Accredited;
scope: Scope;
}

export interface AffiliateClaim {
type: ClaimType.Affiliate;
scope: Scope;
}

export interface BuyLockupClaim {
type: ClaimType.BuyLockup;
scope: Scope;
}

export interface SellLockupClaim {
type: ClaimType.SellLockup;
scope: Scope;
}

export interface CddClaim {
type: ClaimType.CustomerDueDiligence;
id: string;
}

export interface KycClaim {
type: ClaimType.KnowYourCustomer;
scope: Scope;
}

export interface JurisdictionClaim {
type: ClaimType.Jurisdiction;
code: CountryCode;
scope: Scope;
}

export interface ExemptedClaim {
type: ClaimType.Exempted;
scope: Scope;
}

export interface BlockedClaim {
type: ClaimType.Blocked;
scope: Scope;
}

export type InvestorUniquenessClaim = {
export interface InvestorUniquenessClaim {
type: ClaimType.InvestorUniqueness;
scope: Scope;
cddId: string;
scopeId: string;
};
}

export interface NoDataClaim {
type: ClaimType.NoData;
}

export type InvestorUniquenessV2Claim = {
export interface InvestorUniquenessV2Claim {
type: ClaimType.InvestorUniquenessV2;
cddId: string;
};
}

export type ScopedClaim =
| { type: ClaimType.Jurisdiction; code: CountryCode; scope: Scope }
| JurisdictionClaim
| InvestorUniquenessClaim
| {
type: Exclude<
ClaimType,
| ClaimType.NoData
| ClaimType.Jurisdiction
| ClaimType.CustomerDueDiligence
| ClaimType.InvestorUniqueness
| ClaimType.InvestorUniquenessV2
>;
scope: Scope;
};

export type UnscopedClaim = { type: ClaimType.NoData } | CddClaim | InvestorUniquenessV2Claim;
| AccreditedClaim
| AffiliateClaim
| BuyLockupClaim
| SellLockupClaim
| KycClaim
| ExemptedClaim
| BlockedClaim;

export type Claim = ScopedClaim | UnscopedClaim;
export type UnscopedClaim = NoDataClaim | CddClaim | InvestorUniquenessV2Claim;

/**
* @hidden
*/
export function isScopedClaim(claim: Claim): claim is ScopedClaim {
const { type } = claim;

return ![
ClaimType.NoData,
ClaimType.CustomerDueDiligence,
ClaimType.InvestorUniquenessV2,
].includes(type);
}

/**
* @hidden
*/
export function isInvestorUniquenessClaim(claim: Claim): claim is InvestorUniquenessClaim {
return claim.type === ClaimType.InvestorUniqueness;
}
export type Claim = ScopedClaim | UnscopedClaim;

export interface ClaimData<ClaimType = Claim> {
target: Identity;
Expand Down Expand Up @@ -420,24 +409,6 @@ export type InputCondition = (
) &
InputConditionBase;

/**
* @hidden
*/
export function isSingleClaimCondition(
condition: InputCondition
): condition is InputConditionBase & SingleClaimCondition {
return [ConditionType.IsPresent, ConditionType.IsAbsent].includes(condition.type);
}

/**
* @hidden
*/
export function isMultiClaimCondition(
condition: InputCondition
): condition is InputConditionBase & MultiClaimCondition {
return [ConditionType.IsAnyOf, ConditionType.IsNoneOf].includes(condition.type);
}

export interface Requirement {
id: number;
conditions: Condition[];
Expand Down
3 changes: 1 addition & 2 deletions src/utils/conversion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,6 @@ import {
InputRequirement,
InputTrustedClaimIssuer,
InstructionType,
isMultiClaimCondition,
isSingleClaimCondition,
KnownAssetType,
MultiClaimCondition,
OfferingBalanceStatus,
Expand Down Expand Up @@ -224,6 +222,7 @@ import {
padString,
removePadding,
} from '~/utils/internal';
import { isMultiClaimCondition, isSingleClaimCondition } from '~/utils/typeguards';

export * from '~/generated/utils';

Expand Down
4 changes: 1 addition & 3 deletions src/utils/internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@ import {
ErrorCode,
InputCaCheckpoint,
InputCondition,
isMultiClaimCondition,
isSingleClaimCondition,
NextKey,
NoArgsProcedureMethod,
PaginationOptions,
Expand All @@ -65,7 +63,7 @@ import {
MAX_BATCH_ELEMENTS,
} from '~/utils/constants';
import { middlewareScopeToScope, signerToString, u64ToBigNumber } from '~/utils/conversion';
import { isEntity } from '~/utils/typeguards';
import { isEntity, isMultiClaimCondition, isSingleClaimCondition } from '~/utils/typeguards';

export * from '~/generated/utils';

Expand Down

0 comments on commit dd86024

Please sign in to comment.