Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit 7368c1f

Browse files
authored
token-metadata-js: Upgrade to tp3 (#6666)
1 parent 5feb117 commit 7368c1f

File tree

6 files changed

+88
-24
lines changed

6 files changed

+88
-24
lines changed

pnpm-lock.yaml

Lines changed: 35 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

token-metadata/js/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
"@solana/web3.js": "^1.91.7"
4848
},
4949
"dependencies": {
50-
"@solana/codecs": "2.0.0-preview.2",
50+
"@solana/codecs": "2.0.0-preview.3",
5151
"@solana/spl-type-length-value": "0.1.0"
5252
},
5353
"devDependencies": {

token-metadata/js/src/field.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import type { Codec } from '@solana/codecs';
2-
import { getStringCodec, getStructCodec, getTupleCodec, getUnitCodec } from '@solana/codecs';
2+
import {
3+
addCodecSizePrefix,
4+
getU32Codec,
5+
getUtf8Codec,
6+
getStructCodec,
7+
getTupleCodec,
8+
getUnitCodec,
9+
} from '@solana/codecs';
310

411
export enum Field {
512
Name,
@@ -14,7 +21,7 @@ export const getFieldCodec = () =>
1421
['Name', getUnitCodec()],
1522
['Symbol', getUnitCodec()],
1623
['Uri', getUnitCodec()],
17-
['Key', getStructCodec([['value', getTupleCodec([getStringCodec()])]])],
24+
['Key', getStructCodec([['value', getTupleCodec([addCodecSizePrefix(getUtf8Codec(), getU32Codec())])]])],
1825
] as const;
1926

2027
export function getFieldConfig(field: Field | string): FieldLayout {

token-metadata/js/src/instruction.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
import type { Encoder } from '@solana/codecs';
22
import {
3+
addEncoderSizePrefix,
4+
fixEncoderSize,
35
getBooleanEncoder,
46
getBytesEncoder,
57
getDataEnumCodec,
68
getOptionEncoder,
7-
getStringEncoder,
9+
getUtf8Encoder,
810
getStructEncoder,
911
getTupleEncoder,
12+
getU32Encoder,
1013
getU64Encoder,
11-
mapEncoder,
14+
transformEncoder,
1215
} from '@solana/codecs';
16+
import type { VariableSizeEncoder } from '@solana/codecs';
1317
import { splDiscriminate } from '@solana/spl-type-length-value';
1418
import type { PublicKey } from '@solana/web3.js';
1519
import { SystemProgram, TransactionInstruction } from '@solana/web3.js';
@@ -18,14 +22,18 @@ import type { Field } from './field.js';
1822
import { getFieldCodec, getFieldConfig } from './field.js';
1923

2024
function getInstructionEncoder<T extends object>(discriminator: Uint8Array, dataEncoder: Encoder<T>): Encoder<T> {
21-
return mapEncoder(getTupleEncoder([getBytesEncoder(), dataEncoder]), (data: T): [Uint8Array, T] => [
25+
return transformEncoder(getTupleEncoder([getBytesEncoder(), dataEncoder]), (data: T): [Uint8Array, T] => [
2226
discriminator,
2327
data,
2428
]);
2529
}
2630

2731
function getPublicKeyEncoder(): Encoder<PublicKey> {
28-
return mapEncoder(getBytesEncoder({ size: 32 }), (publicKey: PublicKey) => publicKey.toBytes());
32+
return transformEncoder(fixEncoderSize(getBytesEncoder(), 32), (publicKey: PublicKey) => publicKey.toBytes());
33+
}
34+
35+
function getStringEncoder(): VariableSizeEncoder<string> {
36+
return addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());
2937
}
3038

3139
/**

token-metadata/js/src/state.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
11
import { PublicKey } from '@solana/web3.js';
2-
import { getArrayCodec, getBytesCodec, getStringCodec, getStructCodec, getTupleCodec } from '@solana/codecs';
2+
import {
3+
addCodecSizePrefix,
4+
fixCodecSize,
5+
getArrayCodec,
6+
getBytesCodec,
7+
getUtf8Codec,
8+
getU32Codec,
9+
getStructCodec,
10+
getTupleCodec,
11+
} from '@solana/codecs';
12+
import type { ReadonlyUint8Array, VariableSizeCodec } from '@solana/codecs';
313

414
export const TOKEN_METADATA_DISCRIMINATOR = Buffer.from([112, 132, 90, 90, 11, 88, 157, 87]);
515

16+
function getStringCodec(): VariableSizeCodec<string> {
17+
return addCodecSizePrefix(getUtf8Codec(), getU32Codec());
18+
}
19+
620
const tokenMetadataCodec = getStructCodec([
7-
['updateAuthority', getBytesCodec({ size: 32 })],
8-
['mint', getBytesCodec({ size: 32 })],
21+
['updateAuthority', fixCodecSize(getBytesCodec(), 32)],
22+
['mint', fixCodecSize(getBytesCodec(), 32)],
923
['name', getStringCodec()],
1024
['symbol', getStringCodec()],
1125
['uri', getStringCodec()],
@@ -24,11 +38,11 @@ export interface TokenMetadata {
2438
// The URI pointing to richer metadata
2539
uri: string;
2640
// Any additional metadata about the token as key-value pairs
27-
additionalMetadata: [string, string][];
41+
additionalMetadata: (readonly [string, string])[];
2842
}
2943

3044
// Checks if all elements in the array are 0
31-
function isNonePubkey(buffer: Uint8Array): boolean {
45+
function isNonePubkey(buffer: ReadonlyUint8Array): boolean {
3246
for (let i = 0; i < buffer.length; i++) {
3347
if (buffer[i] !== 0) {
3448
return false;
@@ -38,7 +52,7 @@ function isNonePubkey(buffer: Uint8Array): boolean {
3852
}
3953

4054
// Pack TokenMetadata into byte slab
41-
export function pack(meta: TokenMetadata): Uint8Array {
55+
export function pack(meta: TokenMetadata): ReadonlyUint8Array {
4256
// If no updateAuthority given, set it to the None/Zero PublicKey for encoding
4357
const updateAuthority = meta.updateAuthority ?? PublicKey.default;
4458
return tokenMetadataCodec.encode({
@@ -49,7 +63,7 @@ export function pack(meta: TokenMetadata): Uint8Array {
4963
}
5064

5165
// unpack byte slab into TokenMetadata
52-
export function unpack(buffer: Buffer | Uint8Array): TokenMetadata {
66+
export function unpack(buffer: Buffer | Uint8Array | ReadonlyUint8Array): TokenMetadata {
5367
const data = tokenMetadataCodec.decode(buffer);
5468

5569
return isNonePubkey(data.updateAuthority)

token-metadata/js/test/instruction.test.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,20 @@ import {
1010
getFieldConfig,
1111
} from '../src';
1212
import {
13+
addDecoderSizePrefix,
14+
fixDecoderSize,
1315
getBooleanDecoder,
1416
getBytesDecoder,
1517
getDataEnumCodec,
1618
getOptionDecoder,
17-
getStringDecoder,
19+
getUtf8Decoder,
20+
getU32Decoder,
1821
getU64Decoder,
1922
getStructDecoder,
2023
some,
2124
} from '@solana/codecs';
2225
import { splDiscriminate } from '@solana/spl-type-length-value';
23-
import type { Decoder, Option } from '@solana/codecs';
26+
import type { Decoder, Option, VariableSizeDecoder } from '@solana/codecs';
2427
import { PublicKey, type TransactionInstruction } from '@solana/web3.js';
2528

2629
function checkPackUnpack<T extends object>(
@@ -34,6 +37,10 @@ function checkPackUnpack<T extends object>(
3437
expect(unpacked).to.deep.equal(values);
3538
}
3639

40+
function getStringDecoder(): VariableSizeDecoder<string> {
41+
return addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder());
42+
}
43+
3744
describe('Token Metadata Instructions', () => {
3845
const programId = new PublicKey('22222222222222222222222222222222222222222222');
3946
const metadata = new PublicKey('33333333333333333333333333333333333333333333');
@@ -134,7 +141,7 @@ describe('Token Metadata Instructions', () => {
134141
newAuthority,
135142
}),
136143
splDiscriminate('spl_token_metadata_interface:update_the_authority'),
137-
getStructDecoder([['newAuthority', getBytesDecoder({ size: 32 })]]),
144+
getStructDecoder([['newAuthority', fixDecoderSize(getBytesDecoder(), 32)]]),
138145
{ newAuthority: Uint8Array.from(newAuthority.toBuffer()) }
139146
);
140147
});

0 commit comments

Comments
 (0)