-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathaccount.ts
60 lines (51 loc) · 1.56 KB
/
account.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
53
54
55
56
57
58
59
60
import { ChainId, ChainIdParams } from "./chain";
import { CAIP } from "./spec";
import { IdentifierSpec } from "./types";
import { isValidId, joinParams, getParams } from "./utils";
export interface AccountIdSplitParams extends ChainIdParams {
address: string;
}
export interface AccountIdParams {
chainId: string | ChainIdParams;
address: string;
}
export class AccountId {
public static spec: IdentifierSpec = CAIP["10"];
public static parse(id: string): AccountIdParams {
if (!isValidId(id, this.spec)) {
throw new Error(`Invalid ${this.spec.name} provided: ${id}`);
}
const { namespace, reference, address } = getParams<AccountIdSplitParams>(
id,
this.spec
);
const chainId = new ChainId({ namespace, reference });
return new AccountId({ chainId, address }).toJSON();
}
public static format(params: AccountIdParams): string {
const chainId = new ChainId(params.chainId);
const splitParams: AccountIdSplitParams = {
...chainId.toJSON(),
address: params.address,
};
return joinParams(splitParams as any, this.spec);
}
public chainId: ChainId;
public address: string;
constructor(params: AccountIdParams | string) {
if (typeof params === "string") {
params = AccountId.parse(params);
}
this.chainId = new ChainId(params.chainId);
this.address = params.address;
}
public toString(): string {
return AccountId.format(this.toJSON());
}
public toJSON(): AccountIdParams {
return {
chainId: this.chainId.toJSON(),
address: this.address,
};
}
}