-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathassetId.ts
52 lines (43 loc) · 1.38 KB
/
assetId.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import { AssetName, AssetNameParams } from "./assetName";
import { ChainId, ChainIdParams } from "./chain";
import { CAIP } from "./spec";
import { IdentifierSpec } from "./types";
import { isValidId, joinParams, getParams } from "./utils";
export interface AssetIdParams {
chainId: string | ChainIdParams;
assetName: string | AssetNameParams;
tokenId: string;
}
export class AssetId {
public static spec: IdentifierSpec = CAIP["19"].assetId;
public static parse(id: string): AssetIdParams {
if (!isValidId(id, this.spec)) {
throw new Error(`Invalid ${this.spec.name} provided: ${id}`);
}
return new AssetId(getParams<AssetIdParams>(id, this.spec)).toJSON();
}
public static format(params: AssetIdParams): string {
return joinParams(params as any, this.spec);
}
public chainId: ChainId;
public assetName: AssetName;
public tokenId: string;
constructor(params: AssetIdParams | string) {
if (typeof params === "string") {
params = AssetId.parse(params);
}
this.chainId = new ChainId(params.chainId);
this.assetName = new AssetName(params.assetName);
this.tokenId = params.tokenId;
}
public toString(): string {
return AssetId.format(this.toJSON());
}
public toJSON(): AssetIdParams {
return {
chainId: this.chainId.toJSON(),
assetName: this.assetName.toJSON(),
tokenId: this.tokenId,
};
}
}