Skip to content

Commit 898653b

Browse files
authored
Use internal asset account (#76)
* Use internal asset account * Fix lint * Separate delegate type fields
1 parent fea32c8 commit 898653b

File tree

13 files changed

+157
-79
lines changed

13 files changed

+157
-79
lines changed

clients/js/asset/src/extensions/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Serializer } from '@metaplex-foundation/umi/serializers';
2+
import { Asset } from '..';
23
import {
3-
Asset,
44
Attributes,
55
Blob,
66
Bucket,

clients/js/asset/src/extensions/properties.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import {
88
u8,
99
} from '@metaplex-foundation/umi/serializers';
1010
import { TypedExtension, getExtension } from '.';
11-
import { Asset, ExtensionType, Type, getTypeSerializer } from '../generated';
11+
import { Asset } from '..';
12+
import { ExtensionType, Type, getTypeSerializer } from '../generated';
1213

1314
type Property =
1415
| Omit<Text, 'type'>

clients/js/asset/src/generated/accounts/index.ts

Lines changed: 0 additions & 9 deletions
This file was deleted.

clients/js/asset/src/generated/accounts/asset.ts renamed to clients/js/asset/src/generated/accounts/internalAsset.ts

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,13 @@ import {
2525
string,
2626
} from '@metaplex-foundation/umi/serializers';
2727
import {
28-
AssetAccountData,
28+
InternalAssetAccountData,
2929
NullablePublicKeyArgs,
30-
getAssetAccountDataSerializer,
30+
getInternalAssetAccountDataSerializer,
3131
getNullablePublicKeySerializer,
3232
} from '../../hooked';
3333
import {
3434
DelegateArgs,
35-
Discriminator,
3635
DiscriminatorArgs,
3736
StandardArgs,
3837
StateArgs,
@@ -42,67 +41,76 @@ import {
4241
getStateSerializer,
4342
} from '../types';
4443

45-
export type Asset = Account<AssetAccountData>;
44+
export type InternalAsset = Account<InternalAssetAccountData>;
4645

47-
export function deserializeAsset(rawAccount: RpcAccount): Asset {
48-
return deserializeAccount(rawAccount, getAssetAccountDataSerializer());
46+
export function deserializeInternalAsset(
47+
rawAccount: RpcAccount
48+
): InternalAsset {
49+
return deserializeAccount(
50+
rawAccount,
51+
getInternalAssetAccountDataSerializer()
52+
);
4953
}
5054

51-
export async function fetchAsset(
55+
export async function fetchInternalAsset(
5256
context: Pick<Context, 'rpc'>,
5357
publicKey: PublicKey | Pda,
5458
options?: RpcGetAccountOptions
55-
): Promise<Asset> {
59+
): Promise<InternalAsset> {
5660
const maybeAccount = await context.rpc.getAccount(
5761
toPublicKey(publicKey, false),
5862
options
5963
);
60-
assertAccountExists(maybeAccount, 'Asset');
61-
return deserializeAsset(maybeAccount);
64+
assertAccountExists(maybeAccount, 'InternalAsset');
65+
return deserializeInternalAsset(maybeAccount);
6266
}
6367

64-
export async function safeFetchAsset(
68+
export async function safeFetchInternalAsset(
6569
context: Pick<Context, 'rpc'>,
6670
publicKey: PublicKey | Pda,
6771
options?: RpcGetAccountOptions
68-
): Promise<Asset | null> {
72+
): Promise<InternalAsset | null> {
6973
const maybeAccount = await context.rpc.getAccount(
7074
toPublicKey(publicKey, false),
7175
options
7276
);
73-
return maybeAccount.exists ? deserializeAsset(maybeAccount) : null;
77+
return maybeAccount.exists ? deserializeInternalAsset(maybeAccount) : null;
7478
}
7579

76-
export async function fetchAllAsset(
80+
export async function fetchAllInternalAsset(
7781
context: Pick<Context, 'rpc'>,
7882
publicKeys: Array<PublicKey | Pda>,
7983
options?: RpcGetAccountsOptions
80-
): Promise<Asset[]> {
84+
): Promise<InternalAsset[]> {
8185
const maybeAccounts = await context.rpc.getAccounts(
8286
publicKeys.map((key) => toPublicKey(key, false)),
8387
options
8488
);
8589
return maybeAccounts.map((maybeAccount) => {
86-
assertAccountExists(maybeAccount, 'Asset');
87-
return deserializeAsset(maybeAccount);
90+
assertAccountExists(maybeAccount, 'InternalAsset');
91+
return deserializeInternalAsset(maybeAccount);
8892
});
8993
}
9094

91-
export async function safeFetchAllAsset(
95+
export async function safeFetchAllInternalAsset(
9296
context: Pick<Context, 'rpc'>,
9397
publicKeys: Array<PublicKey | Pda>,
9498
options?: RpcGetAccountsOptions
95-
): Promise<Asset[]> {
99+
): Promise<InternalAsset[]> {
96100
const maybeAccounts = await context.rpc.getAccounts(
97101
publicKeys.map((key) => toPublicKey(key, false)),
98102
options
99103
);
100104
return maybeAccounts
101105
.filter((maybeAccount) => maybeAccount.exists)
102-
.map((maybeAccount) => deserializeAsset(maybeAccount as RpcAccount));
106+
.map((maybeAccount) =>
107+
deserializeInternalAsset(maybeAccount as RpcAccount)
108+
);
103109
}
104110

105-
export function getAssetGpaBuilder(context: Pick<Context, 'rpc' | 'programs'>) {
111+
export function getInternalAssetGpaBuilder(
112+
context: Pick<Context, 'rpc' | 'programs'>
113+
) {
106114
const programId = context.programs.getPublicKey(
107115
'asset',
108116
'AssetGtQBTSgm5s91d1RAQod5JmaZiJDxqsgtqrZud73'
@@ -129,6 +137,7 @@ export function getAssetGpaBuilder(context: Pick<Context, 'rpc' | 'programs'>) {
129137
delegate: [null, getDelegateSerializer()],
130138
name: [null, string({ size: 35 })],
131139
})
132-
.deserializeUsing<Asset>((account) => deserializeAsset(account))
133-
.whereField('discriminator', Discriminator.Asset);
140+
.deserializeUsing<InternalAsset>((account) =>
141+
deserializeInternalAsset(account)
142+
);
134143
}

clients/js/asset/src/generated/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
* @see https://github.com/metaplex-foundation/kinobi
77
*/
88

9-
export * from './accounts';
109
export * from './errors';
1110
export * from './instructions';
1211
export * from './programs';

clients/js/asset/src/generated/types/assetAccountData.ts renamed to clients/js/asset/src/generated/types/internalAssetAccountData.ts

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { PublicKey } from '@metaplex-foundation/umi';
1010
import {
1111
Serializer,
1212
bool,
13-
mapSerializer,
1413
publicKey as publicKeySerializer,
1514
string,
1615
struct,
@@ -19,6 +18,7 @@ import {
1918
Delegate,
2019
DelegateArgs,
2120
Discriminator,
21+
DiscriminatorArgs,
2222
Standard,
2323
StandardArgs,
2424
State,
@@ -34,7 +34,7 @@ import {
3434
getNullablePublicKeySerializer,
3535
} from '../../hooked';
3636

37-
export type AssetAccountData = {
37+
export type InternalAssetAccountData = {
3838
discriminator: Discriminator;
3939
state: State;
4040
standard: Standard;
@@ -46,7 +46,8 @@ export type AssetAccountData = {
4646
name: string;
4747
};
4848

49-
export type AssetAccountDataArgs = {
49+
export type InternalAssetAccountDataArgs = {
50+
discriminator: DiscriminatorArgs;
5051
state: StateArgs;
5152
standard: StandardArgs;
5253
mutable: boolean;
@@ -57,25 +58,22 @@ export type AssetAccountDataArgs = {
5758
name: string;
5859
};
5960

60-
export function getAssetAccountDataSerializer(): Serializer<
61-
AssetAccountDataArgs,
62-
AssetAccountData
61+
export function getInternalAssetAccountDataSerializer(): Serializer<
62+
InternalAssetAccountDataArgs,
63+
InternalAssetAccountData
6364
> {
64-
return mapSerializer<AssetAccountDataArgs, any, AssetAccountData>(
65-
struct<AssetAccountData>(
66-
[
67-
['discriminator', getDiscriminatorSerializer()],
68-
['state', getStateSerializer()],
69-
['standard', getStandardSerializer()],
70-
['mutable', bool()],
71-
['owner', publicKeySerializer()],
72-
['group', getNullablePublicKeySerializer()],
73-
['authority', publicKeySerializer()],
74-
['delegate', getDelegateSerializer()],
75-
['name', string({ size: 35 })],
76-
],
77-
{ description: 'AssetAccountData' }
78-
),
79-
(value) => ({ ...value, discriminator: Discriminator.Asset })
80-
) as Serializer<AssetAccountDataArgs, AssetAccountData>;
65+
return struct<InternalAssetAccountData>(
66+
[
67+
['discriminator', getDiscriminatorSerializer()],
68+
['state', getStateSerializer()],
69+
['standard', getStandardSerializer()],
70+
['mutable', bool()],
71+
['owner', publicKeySerializer()],
72+
['group', getNullablePublicKeySerializer()],
73+
['authority', publicKeySerializer()],
74+
['delegate', getDelegateSerializer()],
75+
['name', string({ size: 35 })],
76+
],
77+
{ description: 'InternalAssetAccountData' }
78+
) as Serializer<InternalAssetAccountDataArgs, InternalAssetAccountData>;
8179
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export * from './assetAccountData';
1+
export * from './internalAssetAccountData';
22
export * from './delegateRoles';
33
export * from './nullablePublicKey';

clients/js/asset/src/hooked/assetAccountData.ts renamed to clients/js/asset/src/hooked/internalAssetAccountData.ts

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,39 +7,45 @@ import {
77
ExtensionType,
88
} from '../generated';
99
import {
10-
AssetAccountData as BaseAssetAccountData,
11-
AssetAccountDataArgs as BaseAssetAccountDataArgs,
12-
getAssetAccountDataSerializer as getBaseAssetAccountDataSerializer,
13-
} from '../generated/types/assetAccountData';
10+
InternalAssetAccountData as BaseInternalAssetAccountData,
11+
InternalAssetAccountDataArgs as BaseInternalAssetAccountDataArgs,
12+
getInternalAssetAccountDataSerializer as getBaseInternalAssetAccountDataSerializer,
13+
} from '../generated/types/internalAssetAccountData';
1414
import { getExtensionHeaderSerializer } from '../generated/types/extensionHeader';
1515

16-
export type AssetAccountData = Omit<BaseAssetAccountData, 'delegate'> & {
16+
export type InternalAssetAccountData = Omit<
17+
BaseInternalAssetAccountData,
18+
'delegate'
19+
> & {
1720
delegate: (Omit<Delegate, 'roles'> & { roles: DelegateRole[] }) | null;
1821
extensions: TypedExtension[];
1922
};
2023

21-
export type AssetAccountDataArgs = Omit<
22-
BaseAssetAccountDataArgs,
24+
export type InternalAssetAccountDataArgs = Omit<
25+
BaseInternalAssetAccountDataArgs,
2326
'delegate'
2427
> & {
2528
delegate: (Omit<Delegate, 'roles'> & { roles: DelegateRole[] }) | null;
2629
extensions: TypedExtension[];
2730
};
2831

29-
export const getAssetAccountDataSerializer = (): Serializer<
30-
AssetAccountDataArgs,
31-
AssetAccountData
32+
export const getInternalAssetAccountDataSerializer = (): Serializer<
33+
InternalAssetAccountDataArgs,
34+
InternalAssetAccountData
3235
> => ({
3336
description: 'AssetAccountData',
3437
fixedSize: null,
3538
maxSize: null,
3639
serialize: () => {
3740
throw new Error('Operation not supported.');
3841
},
39-
deserialize: (buffer: Uint8Array, offset = 0): [AssetAccountData, number] => {
42+
deserialize: (
43+
buffer: Uint8Array,
44+
offset = 0
45+
): [InternalAssetAccountData, number] => {
4046
// Account.
4147
const [asset, assetOffset] =
42-
getBaseAssetAccountDataSerializer().deserialize(buffer, offset);
48+
getBaseInternalAssetAccountDataSerializer().deserialize(buffer, offset);
4349
if (asset.discriminator !== Discriminator.Asset) {
4450
throw new Error(
4551
`Expected an Asset account, got account discriminator: ${asset.discriminator}`

clients/js/asset/src/index.ts

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,32 @@
1-
import { publicKey } from '@metaplex-foundation/umi';
1+
import {
2+
Context,
3+
PublicKey,
4+
gpaBuilder,
5+
publicKey,
6+
} from '@metaplex-foundation/umi';
7+
import {
8+
bool,
9+
publicKey as publicKeySerializer,
10+
string,
11+
} from '@metaplex-foundation/umi/serializers';
12+
import {
13+
DiscriminatorArgs,
14+
StandardArgs,
15+
StateArgs,
16+
getDiscriminatorSerializer,
17+
getStandardSerializer,
18+
getStateSerializer,
19+
} from './generated';
20+
import {
21+
InternalAsset as Asset,
22+
deserializeInternalAsset as deserializeAsset,
23+
} from './generated/accounts/internalAsset';
24+
import {
25+
DelegateRolesArgs,
26+
NullablePublicKeyArgs,
27+
getDelegateRolesSerializer,
28+
getNullablePublicKeySerializer,
29+
} from './hooked';
230

331
export * from './allocate';
432
export * from './approve';
@@ -26,4 +54,45 @@ export * from './updateWithBuffer';
2654
export * from './verify';
2755
export * from './write';
2856

57+
export {
58+
InternalAsset as Asset,
59+
deserializeInternalAsset as deserializeAsset,
60+
fetchAllInternalAsset as fetchAllAsset,
61+
fetchInternalAsset as fetchAsset,
62+
safeFetchAllInternalAsset as safeFetchAllAsset,
63+
safeFetchInternalAsset as safeFetchAsset,
64+
} from './generated/accounts/internalAsset';
65+
2966
export const SYSTEM_PROGRAM_ID = publicKey('11111111111111111111111111111111');
67+
68+
export function getAssetGpaBuilder(context: Pick<Context, 'rpc' | 'programs'>) {
69+
const programId = context.programs.getPublicKey(
70+
'asset',
71+
'AssetGtQBTSgm5s91d1RAQod5JmaZiJDxqsgtqrZud73'
72+
);
73+
return gpaBuilder(context, programId)
74+
.registerFields<{
75+
discriminator: DiscriminatorArgs;
76+
state: StateArgs;
77+
standard: StandardArgs;
78+
mutable: boolean;
79+
owner: PublicKey;
80+
group: NullablePublicKeyArgs;
81+
authority: PublicKey;
82+
delegate: NullablePublicKeyArgs;
83+
roles: DelegateRolesArgs;
84+
name: string;
85+
}>({
86+
discriminator: [0, getDiscriminatorSerializer()],
87+
state: [1, getStateSerializer()],
88+
standard: [2, getStandardSerializer()],
89+
mutable: [3, bool()],
90+
owner: [4, publicKeySerializer()],
91+
group: [36, getNullablePublicKeySerializer()],
92+
authority: [68, publicKeySerializer()],
93+
delegate: [100, getNullablePublicKeySerializer()],
94+
roles: [132, getDelegateRolesSerializer()],
95+
name: [133, string({ size: 35 })],
96+
})
97+
.deserializeUsing<Asset>((account) => deserializeAsset(account));
98+
}

0 commit comments

Comments
 (0)