Skip to content

Commit 48267f8

Browse files
authored
feat: add additional CAIP-19 types and parsing functions to align with proposal (#227)
Added full support for [CAIP-19 Asset IDs](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-19.md) including the necessary regex, structs, and parsing functions. A few notes: - While the regex of a chain namespace is technically the same as an asset namespace, the official proposal makes a clear distinction between the two, and so it's within the spirit of the spec to break these out into separate properties. The same cannot be said for a chain reference vs asset reference: these require different regex for validation. - Previously, `CaipAssetId` required a tokenId (`/${string}`) to be present. This has been changed to allow for tokenId to be optional (as dictated by the official proposal) in both the type and its corresponding regex string - For completeness, `toCaipAccountId` and `parseCaipAssetId` functions were added
1 parent a5886d3 commit 48267f8

6 files changed

+864
-26
lines changed

src/__fixtures__/caip-types.ts

+29
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,32 @@ export const CAIP_ACCOUNT_ID_FIXTURES = [
3333
export const CAIP_ACCOUNT_ADDRESS_FIXTURES = Array.from(
3434
new Set(CAIP_ACCOUNT_ID_FIXTURES.map((value) => value.split(':')[2])),
3535
);
36+
37+
export const CAIP_ASSET_TYPE_FIXTURES = [
38+
'eip155:1/slip44:60',
39+
'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f',
40+
'bip122:000000000019d6689c085ae165831e93/slip44:0',
41+
'bip122:12a765e31ffd4059bada1e25190f6e98/slip44:2',
42+
'cosmos:cosmoshub-3/slip44:118',
43+
'cosmos:Binance-Chain-Tigris/slip44:714',
44+
'lip9:9ee11e9df416b18b/slip44:134',
45+
'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/nft:Fz6LxeUg5qjesYX3BdmtTwyyzBtMxk644XiTqU5W3w9w',
46+
'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
47+
] as const;
48+
49+
export const CAIP_ASSET_ID_FIXTURES = [
50+
'eip155:1/erc721:0x06012c8cf97BEaD5deAe237070F9587f8E7A266d/771769',
51+
'hedera:mainnet/nft:0.0.55492/12',
52+
] as const;
53+
54+
export const CAIP_ASSET_NAMESPACE_FIXTURES = Array.from(
55+
new Set(
56+
CAIP_ASSET_TYPE_FIXTURES.map((value) => value.split('/')[1]?.split(':')[0]),
57+
),
58+
);
59+
60+
export const CAIP_ASSET_REFERENCE_FIXTURES = Array.from(
61+
new Set(
62+
CAIP_ASSET_TYPE_FIXTURES.map((value) => value.split('/')[1]?.split(':')[1]),
63+
),
64+
);

src/caip-types.test-d.ts

+38
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ import { expectAssignable, expectNotAssignable } from 'tsd';
33
import type {
44
CaipAccountAddress,
55
CaipAccountId,
6+
CaipAssetId,
7+
CaipAssetNamespace,
8+
CaipAssetReference,
9+
CaipAssetType,
610
CaipChainId,
711
CaipNamespace,
812
CaipReference,
@@ -33,6 +37,30 @@ expectAssignable<CaipAccountId>(
3337
expectAssignable<CaipAccountAddress>('string');
3438
expectAssignable<CaipAccountAddress>(`${embeddedString}`);
3539

40+
expectAssignable<CaipAssetNamespace>('string');
41+
expectAssignable<CaipAssetNamespace>(`${embeddedString}`);
42+
43+
expectAssignable<CaipAssetReference>('string');
44+
expectAssignable<CaipAssetReference>(`${embeddedString}`);
45+
46+
expectAssignable<CaipAssetType>(
47+
'namespace:reference/assetNamespace:assetReference',
48+
);
49+
expectAssignable<CaipAssetType>('namespace:reference/:');
50+
expectAssignable<CaipAssetType>(':reference/assetNamespace:');
51+
expectAssignable<CaipAssetType>(
52+
`${embeddedString}:${embeddedString}/${embeddedString}:${embeddedString}`,
53+
);
54+
55+
expectAssignable<CaipAssetId>(
56+
'namespace:reference/assetNamespace:assetReference/tokenId',
57+
);
58+
expectAssignable<CaipAssetId>('namespace:reference/:assetReference/');
59+
expectAssignable<CaipAssetId>(':reference/assetNamespace:/');
60+
expectAssignable<CaipAssetId>(
61+
`${embeddedString}:${embeddedString}/${embeddedString}:${embeddedString}/${embeddedString}`,
62+
);
63+
3664
// Not valid caip strings:
3765

3866
expectAssignable<CaipChainId>('namespace:😀');
@@ -50,3 +78,13 @@ expectNotAssignable<CaipAccountId>(0);
5078
expectNotAssignable<CaipAccountId>('🙃');
5179

5280
expectNotAssignable<CaipAccountAddress>(0);
81+
82+
expectNotAssignable<CaipAssetNamespace>(0);
83+
84+
expectNotAssignable<CaipAssetReference>(0);
85+
86+
expectNotAssignable<CaipAssetType>(0);
87+
expectNotAssignable<CaipAssetType>('🙃');
88+
89+
expectNotAssignable<CaipAssetId>(0);
90+
expectNotAssignable<CaipAssetId>('🙃');

0 commit comments

Comments
 (0)