/
accounts.ts
120 lines (101 loc) · 3.46 KB
/
accounts.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import { Buffer } from 'buffer';
import {
Edition,
Key,
MasterEditionV1,
MasterEditionV2,
Metadata,
} from '@metaplex-foundation/mpl-token-metadata';
import {
Account,
SolitaType,
getAccountParsingAndAssertingFunction,
getAccountParsingFunction,
} from '@/types';
import { NotYetImplementedError } from '@/errors';
/** @group Accounts */
export type MetadataAccount = Account<Metadata>;
/** @group Account Helpers */
export const parseMetadataAccount = getAccountParsingFunction(Metadata);
/** @group Account Helpers */
export const toMetadataAccount =
getAccountParsingAndAssertingFunction(Metadata);
/** @group Accounts */
export type OriginalOrPrintEditionAccountData =
| OriginalEditionAccountData
| PrintEditionAccountData;
/** @group Accounts */
export type OriginalOrPrintEditionAccount =
Account<OriginalOrPrintEditionAccountData>;
const originalOrPrintEditionAccountParser: SolitaType<OriginalOrPrintEditionAccountData> =
{
name: 'MasterEditionV1 | MasterEditionV2 | Edition',
deserialize: (data: Buffer, offset = 0) => {
if (data?.[0] === Key.MasterEditionV1) {
return MasterEditionV1.deserialize(data, offset);
} else if (data?.[0] === Key.MasterEditionV2) {
return MasterEditionV2.deserialize(data, offset);
}
return Edition.deserialize(data, offset);
},
fromArgs() {
throw new NotYetImplementedError();
},
};
/** @group Account Helpers */
export const parseOriginalOrPrintEditionAccount =
getAccountParsingFunction<OriginalOrPrintEditionAccountData>(
originalOrPrintEditionAccountParser
);
/** @group Account Helpers */
export const toOriginalOrPrintEditionAccount =
getAccountParsingAndAssertingFunction<OriginalOrPrintEditionAccountData>(
originalOrPrintEditionAccountParser
);
/** @group Account Helpers */
export const isOriginalEditionAccount = (
account: OriginalOrPrintEditionAccount
): account is OriginalEditionAccount => {
return 'maxSupply' in account.data;
};
/** @group Account Helpers */
export const isPrintEditionAccount = (
account: OriginalOrPrintEditionAccount
): account is PrintEditionAccount => {
return !isOriginalEditionAccount(account);
};
/** @group Accounts */
export type OriginalEditionAccountData = MasterEditionV1 | MasterEditionV2;
/** @group Accounts */
export type OriginalEditionAccount = Account<OriginalEditionAccountData>;
const originalEditionAccountParser: SolitaType<OriginalEditionAccountData> = {
name: 'MasterEditionV1 | MasterEditionV2',
deserialize: (data: Buffer, offset = 0) => {
if (data?.[0] === Key.MasterEditionV1) {
return MasterEditionV1.deserialize(data, offset);
}
return MasterEditionV2.deserialize(data, offset);
},
fromArgs() {
throw new NotYetImplementedError();
},
};
/** @group Account Helpers */
export const parseOriginalEditionAccount =
getAccountParsingFunction<OriginalEditionAccountData>(
originalEditionAccountParser
);
/** @group Account Helpers */
export const toOriginalEditionAccount =
getAccountParsingAndAssertingFunction<OriginalEditionAccountData>(
originalEditionAccountParser
);
/** @group Accounts */
export type PrintEditionAccountData = Edition;
/** @group Accounts */
export type PrintEditionAccount = Account<PrintEditionAccountData>;
/** @group Account Helpers */
export const parsePrintEditionAccount = getAccountParsingFunction(Edition);
/** @group Account Helpers */
export const toPrintEditionAccount =
getAccountParsingAndAssertingFunction(Edition);