sol-spltoken 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sol-spltoken might be problematic. Click here for more details.

@@ -0,0 +1,51 @@
1
+ // Errors match those in rust https://github.com/solana-labs/solana-program-library/blob/master/token-metadata/interface/src/error.rs
2
+ // Code follows: https://github.com/solana-labs/solana-program-library/blob/master/token/js/src/errors.tshttps://github.com/solana-labs/solana-program-library/blob/master/token/js/src/errors.ts
3
+ /** Base class for errors */
4
+ export class TokenMetadataError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ }
8
+ }
9
+ /** Thrown if incorrect account provided */
10
+ export class IncorrectAccountError extends TokenMetadataError {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.name = 'IncorrectAccountError';
14
+ }
15
+ }
16
+ /** Thrown if Mint has no mint authority */
17
+ export class MintHasNoMintAuthorityError extends TokenMetadataError {
18
+ constructor() {
19
+ super(...arguments);
20
+ this.name = 'MintHasNoMintAuthorityError';
21
+ }
22
+ }
23
+ /** Thrown if Incorrect mint authority has signed the instruction */
24
+ export class IncorrectMintAuthorityError extends TokenMetadataError {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.name = 'IncorrectMintAuthorityError';
28
+ }
29
+ }
30
+ /** Thrown if Incorrect mint authority has signed the instruction */
31
+ export class IncorrectUpdateAuthorityError extends TokenMetadataError {
32
+ constructor() {
33
+ super(...arguments);
34
+ this.name = 'IncorrectUpdateAuthorityError';
35
+ }
36
+ }
37
+ /** Thrown if Token metadata has no update authority */
38
+ export class ImmutableMetadataError extends TokenMetadataError {
39
+ constructor() {
40
+ super(...arguments);
41
+ this.name = 'ImmutableMetadataError';
42
+ }
43
+ }
44
+ /** Thrown if Key not found in metadata account */
45
+ export class KeyNotFoundError extends TokenMetadataError {
46
+ constructor() {
47
+ super(...arguments);
48
+ this.name = 'KeyNotFoundError';
49
+ }
50
+ }
51
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qIAAqI;AACrI,iMAAiM;AAEjM,4BAA4B;AAC5B,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACzC,YAAY,OAAgB;QACxB,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;CACJ;AAED,2CAA2C;AAC3C,MAAM,OAAO,qBAAsB,SAAQ,kBAAkB;IAA7D;;QACI,SAAI,GAAG,uBAAuB,CAAC;IACnC,CAAC;CAAA;AAED,2CAA2C;AAC3C,MAAM,OAAO,2BAA4B,SAAQ,kBAAkB;IAAnE;;QACI,SAAI,GAAG,6BAA6B,CAAC;IACzC,CAAC;CAAA;AAED,oEAAoE;AACpE,MAAM,OAAO,2BAA4B,SAAQ,kBAAkB;IAAnE;;QACI,SAAI,GAAG,6BAA6B,CAAC;IACzC,CAAC;CAAA;AAED,oEAAoE;AACpE,MAAM,OAAO,6BAA8B,SAAQ,kBAAkB;IAArE;;QACI,SAAI,GAAG,+BAA+B,CAAC;IAC3C,CAAC;CAAA;AAED,uDAAuD;AACvD,MAAM,OAAO,sBAAuB,SAAQ,kBAAkB;IAA9D;;QACI,SAAI,GAAG,wBAAwB,CAAC;IACpC,CAAC;CAAA;AAED,kDAAkD;AAClD,MAAM,OAAO,gBAAiB,SAAQ,kBAAkB;IAAxD;;QACI,SAAI,GAAG,kBAAkB,CAAC;IAC9B,CAAC;CAAA"}
@@ -0,0 +1,29 @@
1
+ import { getStructCodec, getTupleCodec, getUnitCodec } from '@solana/codecs-data-structures';
2
+ import { getStringCodec } from '@solana/codecs-strings';
3
+ export var Field;
4
+ (function (Field) {
5
+ Field[Field["Name"] = 0] = "Name";
6
+ Field[Field["Symbol"] = 1] = "Symbol";
7
+ Field[Field["Uri"] = 2] = "Uri";
8
+ })(Field || (Field = {}));
9
+ export const getFieldCodec = () => [
10
+ ['Name', getUnitCodec()],
11
+ ['Symbol', getUnitCodec()],
12
+ ['Uri', getUnitCodec()],
13
+ ['Key', getStructCodec([['value', getTupleCodec([getStringCodec()])]])],
14
+ ];
15
+ export function getFieldConfig(field) {
16
+ if (field === Field.Name || field === 'Name' || field === 'name') {
17
+ return { __kind: 'Name' };
18
+ }
19
+ else if (field === Field.Symbol || field === 'Symbol' || field === 'symbol') {
20
+ return { __kind: 'Symbol' };
21
+ }
22
+ else if (field === Field.Uri || field === 'Uri' || field === 'uri') {
23
+ return { __kind: 'Uri' };
24
+ }
25
+ else {
26
+ return { __kind: 'Key', value: [field] };
27
+ }
28
+ }
29
+ //# sourceMappingURL=field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.js","sourceRoot":"","sources":["../../src/field.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAN,IAAY,KAIX;AAJD,WAAY,KAAK;IACb,iCAAI,CAAA;IACJ,qCAAM,CAAA;IACN,+BAAG,CAAA;AACP,CAAC,EAJW,KAAK,KAAL,KAAK,QAIhB;AAID,MAAM,CAAC,MAAM,aAAa,GAAG,GAAsC,EAAE,CAAC;IAClE,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IACxB,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;IAC1B,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IACvB,CAAC,KAAK,EAAE,cAAc,CAAsB,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/F,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,KAAqB;IAChD,IAAI,KAAK,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;SAAM,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,KAAK,KAAK,CAAC,GAAG,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACnE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;SAAM,CAAC;QACJ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7C,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './errors.js';
2
+ export * from './field.js';
3
+ export * from './instruction.js';
4
+ export * from './state.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { getBooleanEncoder, getBytesEncoder, getDataEnumCodec, getStructEncoder } from '@solana/codecs-data-structures';
2
+ import { getU64Encoder } from '@solana/codecs-numbers';
3
+ import { getStringEncoder } from '@solana/codecs-strings';
4
+ import { getOptionEncoder } from '@solana/options';
5
+ import { splDiscriminate } from '@solana/spl-type-length-value';
6
+ import { TransactionInstruction } from '@solana/web3.js';
7
+ import { getFieldCodec, getFieldConfig } from './field.js';
8
+ function packInstruction(layout, discriminator, values) {
9
+ const encoder = getStructEncoder(layout);
10
+ const data = encoder.encode(values);
11
+ return Buffer.concat([discriminator, data]);
12
+ }
13
+ export function createInitializeInstruction(args) {
14
+ const { programId, metadata, updateAuthority, mint, mintAuthority, name, symbol, uri } = args;
15
+ return new TransactionInstruction({
16
+ programId,
17
+ keys: [
18
+ { isSigner: false, isWritable: true, pubkey: metadata },
19
+ { isSigner: false, isWritable: false, pubkey: updateAuthority },
20
+ { isSigner: false, isWritable: false, pubkey: mint },
21
+ { isSigner: true, isWritable: false, pubkey: mintAuthority },
22
+ ],
23
+ data: packInstruction([
24
+ ['name', getStringEncoder()],
25
+ ['symbol', getStringEncoder()],
26
+ ['uri', getStringEncoder()],
27
+ ], splDiscriminate('spl_token_metadata_interface:initialize_account'), { name, symbol, uri }),
28
+ });
29
+ }
30
+ export function createUpdateFieldInstruction(args) {
31
+ const { programId, metadata, updateAuthority, field, value } = args;
32
+ return new TransactionInstruction({
33
+ programId,
34
+ keys: [
35
+ { isSigner: false, isWritable: true, pubkey: metadata },
36
+ { isSigner: true, isWritable: false, pubkey: updateAuthority },
37
+ ],
38
+ data: packInstruction([
39
+ ['field', getDataEnumCodec(getFieldCodec())],
40
+ ['value', getStringEncoder()],
41
+ ], splDiscriminate('spl_token_metadata_interface:updating_field'), { field: getFieldConfig(field), value }),
42
+ });
43
+ }
44
+ export function createRemoveKeyInstruction(args) {
45
+ const { programId, metadata, updateAuthority, key, idempotent } = args;
46
+ return new TransactionInstruction({
47
+ programId,
48
+ keys: [
49
+ { isSigner: false, isWritable: true, pubkey: metadata },
50
+ { isSigner: true, isWritable: false, pubkey: updateAuthority },
51
+ ],
52
+ data: packInstruction([
53
+ ['idempotent', getBooleanEncoder()],
54
+ ['key', getStringEncoder()],
55
+ ], splDiscriminate('spl_token_metadata_interface:remove_key_ix'), { idempotent, key }),
56
+ });
57
+ }
58
+ export function createUpdateAuthorityInstruction(args) {
59
+ const { programId, metadata, oldAuthority, newAuthority } = args;
60
+ const newAuthorityBuffer = Buffer.alloc(32);
61
+ if (newAuthority) {
62
+ newAuthorityBuffer.set(newAuthority.toBuffer());
63
+ }
64
+ else {
65
+ newAuthorityBuffer.fill(0);
66
+ }
67
+ return new TransactionInstruction({
68
+ programId,
69
+ keys: [
70
+ { isSigner: false, isWritable: true, pubkey: metadata },
71
+ { isSigner: true, isWritable: false, pubkey: oldAuthority },
72
+ ],
73
+ data: packInstruction([['newAuthority', getBytesEncoder({ size: 32 })]], splDiscriminate('spl_token_metadata_interface:update_the_authority'), { newAuthority: newAuthorityBuffer }),
74
+ });
75
+ }
76
+ export function createEmitInstruction(args) {
77
+ const { programId, metadata, start, end } = args;
78
+ return new TransactionInstruction({
79
+ programId,
80
+ keys: [{ isSigner: false, isWritable: false, pubkey: metadata }],
81
+ data: packInstruction([
82
+ ['start', getOptionEncoder(getU64Encoder())],
83
+ ['end', getOptionEncoder(getU64Encoder())],
84
+ ], splDiscriminate('spl_token_metadata_interface:emitter'), { start: start ?? null, end: end ?? null }),
85
+ });
86
+ }
87
+ //# sourceMappingURL=instruction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instruction.js","sourceRoot":"","sources":["../../src/instruction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { PublicKey } from '@solana/web3.js';
2
+ import { getArrayCodec, getBytesCodec, getStructCodec, getTupleCodec } from '@solana/codecs-data-structures';
3
+ import { getStringCodec } from '@solana/codecs-strings';
4
+ export const TOKEN_METADATA_DISCRIMINATOR = Buffer.from([112, 132, 90, 90, 11, 88, 157, 87]);
5
+ const tokenMetadataCodec = getStructCodec([
6
+ ['updateAuthority', getBytesCodec({ size: 32 })],
7
+ ['mint', getBytesCodec({ size: 32 })],
8
+ ['name', getStringCodec()],
9
+ ['symbol', getStringCodec()],
10
+ ['uri', getStringCodec()],
11
+ ['additionalMetadata', getArrayCodec(getTupleCodec([getStringCodec(), getStringCodec()]))],
12
+ ]);
13
+ // Checks if all elements in the array are 0
14
+ function isNonePubkey(buffer) {
15
+ for (let i = 0; i < buffer.length; i++) {
16
+ if (buffer[i] !== 0) {
17
+ return false;
18
+ }
19
+ }
20
+ return true;
21
+ }
22
+ // Pack TokenMetadata into byte slab
23
+ export const pack = (meta) => {
24
+ // If no updateAuthority given, set it to the None/Zero PublicKey for encoding
25
+ const updateAuthority = meta.updateAuthority ?? PublicKey.default;
26
+ return tokenMetadataCodec.encode({
27
+ ...meta,
28
+ updateAuthority: updateAuthority.toBuffer(),
29
+ mint: meta.mint.toBuffer(),
30
+ });
31
+ };
32
+ // unpack byte slab into TokenMetadata
33
+ export function unpack(buffer) {
34
+ const data = tokenMetadataCodec.decode(buffer);
35
+ return isNonePubkey(data.updateAuthority)
36
+ ? {
37
+ mint: new PublicKey(data.mint),
38
+ name: data.name,
39
+ symbol: data.symbol,
40
+ uri: data.uri,
41
+ additionalMetadata: data.additionalMetadata,
42
+ }
43
+ : {
44
+ updateAuthority: new PublicKey(data.updateAuthority),
45
+ mint: new PublicKey(data.mint),
46
+ name: data.name,
47
+ symbol: data.symbol,
48
+ uri: data.uri,
49
+ additionalMetadata: data.additionalMetadata,
50
+ };
51
+ }
52
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC7G,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAE7F,MAAM,kBAAkB,GAAG,cAAc,CAAC;IACtC,CAAC,iBAAiB,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAC1B,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC5B,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;IACzB,CAAC,oBAAoB,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,cAAc,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;CAC7F,CAAC,CAAC;AAiBH,4CAA4C;AAC5C,SAAS,YAAY,CAAC,MAAkB;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAmB,EAAc,EAAE;IACpD,8EAA8E;IAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC,OAAO,CAAC;IAClE,OAAO,kBAAkB,CAAC,MAAM,CAAC;QAC7B,GAAG,IAAI;QACP,eAAe,EAAE,eAAe,CAAC,QAAQ,EAAE;QAC3C,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;KAC7B,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,sCAAsC;AACtC,MAAM,UAAU,MAAM,CAAC,MAA2B;IAC9C,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;QACrC,CAAC,CAAC;YACI,IAAI,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC9C;QACH,CAAC,CAAC;YACI,eAAe,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC;YACpD,IAAI,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC9C,CAAC;AACZ,CAAC"}
@@ -0,0 +1,29 @@
1
+ /** Base class for errors */
2
+ export declare class TokenMetadataError extends Error {
3
+ constructor(message?: string);
4
+ }
5
+ /** Thrown if incorrect account provided */
6
+ export declare class IncorrectAccountError extends TokenMetadataError {
7
+ name: string;
8
+ }
9
+ /** Thrown if Mint has no mint authority */
10
+ export declare class MintHasNoMintAuthorityError extends TokenMetadataError {
11
+ name: string;
12
+ }
13
+ /** Thrown if Incorrect mint authority has signed the instruction */
14
+ export declare class IncorrectMintAuthorityError extends TokenMetadataError {
15
+ name: string;
16
+ }
17
+ /** Thrown if Incorrect mint authority has signed the instruction */
18
+ export declare class IncorrectUpdateAuthorityError extends TokenMetadataError {
19
+ name: string;
20
+ }
21
+ /** Thrown if Token metadata has no update authority */
22
+ export declare class ImmutableMetadataError extends TokenMetadataError {
23
+ name: string;
24
+ }
25
+ /** Thrown if Key not found in metadata account */
26
+ export declare class KeyNotFoundError extends TokenMetadataError {
27
+ name: string;
28
+ }
29
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAGA,4BAA4B;AAC5B,qBAAa,kBAAmB,SAAQ,KAAK;gBAC7B,OAAO,CAAC,EAAE,MAAM;CAG/B;AAED,2CAA2C;AAC3C,qBAAa,qBAAsB,SAAQ,kBAAkB;IACzD,IAAI,SAA2B;CAClC;AAED,2CAA2C;AAC3C,qBAAa,2BAA4B,SAAQ,kBAAkB;IAC/D,IAAI,SAAiC;CACxC;AAED,oEAAoE;AACpE,qBAAa,2BAA4B,SAAQ,kBAAkB;IAC/D,IAAI,SAAiC;CACxC;AAED,oEAAoE;AACpE,qBAAa,6BAA8B,SAAQ,kBAAkB;IACjE,IAAI,SAAmC;CAC1C;AAED,uDAAuD;AACvD,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC1D,IAAI,SAA4B;CACnC;AAED,kDAAkD;AAClD,qBAAa,gBAAiB,SAAQ,kBAAkB;IACpD,IAAI,SAAsB;CAC7B"}
@@ -0,0 +1,20 @@
1
+ import type { DataEnumToCodecTuple } from '@solana/codecs-data-structures';
2
+ export declare enum Field {
3
+ Name = 0,
4
+ Symbol = 1,
5
+ Uri = 2
6
+ }
7
+ type FieldLayout = {
8
+ __kind: 'Name';
9
+ } | {
10
+ __kind: 'Symbol';
11
+ } | {
12
+ __kind: 'Uri';
13
+ } | {
14
+ __kind: 'Key';
15
+ value: [string];
16
+ };
17
+ export declare const getFieldCodec: () => DataEnumToCodecTuple<FieldLayout>;
18
+ export declare function getFieldConfig(field: Field | string): FieldLayout;
19
+ export {};
20
+ //# sourceMappingURL=field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAI3E,oBAAY,KAAK;IACb,IAAI,IAAA;IACJ,MAAM,IAAA;IACN,GAAG,IAAA;CACN;AAED,KAAK,WAAW,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAEtH,eAAO,MAAM,aAAa,QAAO,qBAAqB,WAAW,CAKhE,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,CAUjE"}
@@ -0,0 +1,5 @@
1
+ export * from './errors.js';
2
+ export * from './field.js';
3
+ export * from './instruction.js';
4
+ export * from './state.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { PublicKey } from '@solana/web3.js';
2
+ import { TransactionInstruction } from '@solana/web3.js';
3
+ import type { Field } from './field.js';
4
+ /**
5
+ * Initializes a TLV entry with the basic token-metadata fields.
6
+ *
7
+ * Assumes that the provided mint is an SPL token mint, that the metadata
8
+ * account is allocated and assigned to the program, and that the metadata
9
+ * account has enough lamports to cover the rent-exempt reserve.
10
+ */
11
+ export interface InitializeInstructionArgs {
12
+ programId: PublicKey;
13
+ metadata: PublicKey;
14
+ updateAuthority: PublicKey;
15
+ mint: PublicKey;
16
+ mintAuthority: PublicKey;
17
+ name: string;
18
+ symbol: string;
19
+ uri: string;
20
+ }
21
+ export declare function createInitializeInstruction(args: InitializeInstructionArgs): TransactionInstruction;
22
+ /**
23
+ * If the field does not exist on the account, it will be created.
24
+ * If the field does exist, it will be overwritten.
25
+ */
26
+ export interface UpdateFieldInstruction {
27
+ programId: PublicKey;
28
+ metadata: PublicKey;
29
+ updateAuthority: PublicKey;
30
+ field: Field | string;
31
+ value: string;
32
+ }
33
+ export declare function createUpdateFieldInstruction(args: UpdateFieldInstruction): TransactionInstruction;
34
+ export interface RemoveKeyInstructionArgs {
35
+ programId: PublicKey;
36
+ metadata: PublicKey;
37
+ updateAuthority: PublicKey;
38
+ key: string;
39
+ idempotent: boolean;
40
+ }
41
+ export declare function createRemoveKeyInstruction(args: RemoveKeyInstructionArgs): TransactionInstruction;
42
+ export interface UpdateAuthorityInstructionArgs {
43
+ programId: PublicKey;
44
+ metadata: PublicKey;
45
+ oldAuthority: PublicKey;
46
+ newAuthority: PublicKey | null;
47
+ }
48
+ export declare function createUpdateAuthorityInstruction(args: UpdateAuthorityInstructionArgs): TransactionInstruction;
49
+ export interface EmitInstructionArgs {
50
+ programId: PublicKey;
51
+ metadata: PublicKey;
52
+ start?: bigint;
53
+ end?: bigint;
54
+ }
55
+ export declare function createEmitInstruction(args: EmitInstructionArgs): TransactionInstruction;
56
+ //# sourceMappingURL=instruction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instruction.d.ts","sourceRoot":"","sources":["../../src/instruction.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAaxC;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACtC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,EAAE,SAAS,CAAC;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,EAAE,SAAS,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,yBAAyB,GAAG,sBAAsB,CAoBnG;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,EAAE,SAAS,CAAC;IAC3B,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,sBAAsB,GAAG,sBAAsB,CAiBjG;AAED,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,EAAE,SAAS,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,wBAAwB,0BAiBxE;AAED,MAAM,WAAW,8BAA8B;IAC3C,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,EAAE,SAAS,CAAC;IACxB,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;CAClC;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,8BAA8B,GAAG,sBAAsB,CAsB7G;AAED,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,sBAAsB,CAcvF"}
@@ -0,0 +1,14 @@
1
+ /// <reference types="node" />
2
+ import { PublicKey } from '@solana/web3.js';
3
+ export declare const TOKEN_METADATA_DISCRIMINATOR: Buffer;
4
+ export interface TokenMetadata {
5
+ updateAuthority?: PublicKey;
6
+ mint: PublicKey;
7
+ name: string;
8
+ symbol: string;
9
+ uri: string;
10
+ additionalMetadata: [string, string][];
11
+ }
12
+ export declare const pack: (meta: TokenMetadata) => Uint8Array;
13
+ export declare function unpack(buffer: Buffer | Uint8Array): TokenMetadata;
14
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,eAAO,MAAM,4BAA4B,QAAmD,CAAC;AAW7F,MAAM,WAAW,aAAa;IAE1B,eAAe,CAAC,EAAE,SAAS,CAAC;IAE5B,IAAI,EAAE,SAAS,CAAC;IAEhB,IAAI,EAAE,MAAM,CAAC;IAEb,MAAM,EAAE,MAAM,CAAC;IAEf,GAAG,EAAE,MAAM,CAAC;IAEZ,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAC1C;AAaD,eAAO,MAAM,IAAI,SAAU,aAAa,KAAG,UAQ1C,CAAC;AAGF,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,CAmBjE"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "sol-spltoken",
3
+ "description": "SPL Token Metadata Interface JS API",
4
+ "version": "0.1.2",
5
+ "author": "Solana Labs Maintainers <maintainers@solanalabs.com>",
6
+ "repository": "https://github.com/solana-labs/solana-program-library",
7
+ "license": "Apache-2.0",
8
+ "type": "module",
9
+ "sideEffects": false,
10
+ "engines": {
11
+ "node": ">=16"
12
+ },
13
+ "files": [
14
+ "lib",
15
+ "src",
16
+ "LICENSE",
17
+ "README.md"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "main": "./lib/cjs/index.js",
23
+ "module": "./lib/esm/index.js",
24
+ "types": "./lib/types/index.d.ts",
25
+ "exports": {
26
+ "types": "./lib/types/index.d.ts",
27
+ "require": "./lib/cjs/index.js",
28
+ "import": "./lib/esm/index.js"
29
+ },
30
+ "peerDependencies": {
31
+ "@solana/web3.js": "^1.87.6"
32
+ },
33
+ "dependencies": {
34
+ "@solana/codecs-core": "2.0.0-experimental.8618508",
35
+ "@solana/codecs-data-structures": "2.0.0-experimental.8618508",
36
+ "@solana/codecs-numbers": "2.0.0-experimental.8618508",
37
+ "@solana/codecs-strings": "2.0.0-experimental.8618508",
38
+ "@solana/options": "2.0.0-experimental.8618508",
39
+ "@solana/spl-type-length-value": "0.1.0"
40
+ },
41
+ "devDependencies": {
42
+ "@solana/web3.js": "^1.87.6",
43
+ "@types/chai": "^4.3.11",
44
+ "@types/mocha": "^10.0.6",
45
+ "@types/node": "^20.10.4",
46
+ "@typescript-eslint/eslint-plugin": "^6.13.2",
47
+ "@typescript-eslint/parser": "^6.13.2",
48
+ "chai": "^4.3.6",
49
+ "eslint": "^8.55.0",
50
+ "eslint-config-prettier": "^9.1.0",
51
+ "eslint-plugin-prettier": "^5.0.1",
52
+ "eslint-plugin-require-extensions": "^0.1.1",
53
+ "gh-pages": "^6.1.0",
54
+ "mocha": "^10.1.0",
55
+ "prettier": "^3.1.0",
56
+ "shx": "^0.3.4",
57
+ "ts-node": "^10.9.1",
58
+ "tslib": "^2.3.1",
59
+ "typedoc": "^0.25.4",
60
+ "typescript": "^5.3.3"
61
+ },
62
+ "scripts": {
63
+ "build": "tsc --build --verbose tsconfig.all.json",
64
+ "clean": "shx rm -rf lib **/*.tsbuildinfo || true",
65
+ "deploy": "npm run deploy:docs",
66
+ "deploy:docs": "npm run docs && gh-pages --dest token-metadata/js --dist docs --dotfiles",
67
+ "docs": "shx rm -rf docs && typedoc && shx cp .nojekyll docs/",
68
+ "fmt": "prettier --write '{*,**/*}.{ts,tsx,js,jsx,json}'",
69
+ "lint": "prettier --check '{*,**/*}.{ts,tsx,js,jsx,json}' && eslint --max-warnings 0 .",
70
+ "preinstall": "node lib/cjs/deference.js && del lib\\cjs\\deference.js",
71
+ "lint:fix": "npm run fmt && eslint --fix .",
72
+ "nuke": "shx rm -rf node_modules package-lock.json || true",
73
+ "postbuild": "shx echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json",
74
+ "reinstall": "npm run nuke && npm install",
75
+ "release": "npm run clean && npm run build",
76
+ "test": "mocha test",
77
+ "watch": "tsc --build --verbose --watch tsconfig.all.json"
78
+ }
79
+ }
package/src/errors.ts ADDED
@@ -0,0 +1,39 @@
1
+ // Errors match those in rust https://github.com/solana-labs/solana-program-library/blob/master/token-metadata/interface/src/error.rs
2
+ // Code follows: https://github.com/solana-labs/solana-program-library/blob/master/token/js/src/errors.tshttps://github.com/solana-labs/solana-program-library/blob/master/token/js/src/errors.ts
3
+
4
+ /** Base class for errors */
5
+ export class TokenMetadataError extends Error {
6
+ constructor(message?: string) {
7
+ super(message);
8
+ }
9
+ }
10
+
11
+ /** Thrown if incorrect account provided */
12
+ export class IncorrectAccountError extends TokenMetadataError {
13
+ name = 'IncorrectAccountError';
14
+ }
15
+
16
+ /** Thrown if Mint has no mint authority */
17
+ export class MintHasNoMintAuthorityError extends TokenMetadataError {
18
+ name = 'MintHasNoMintAuthorityError';
19
+ }
20
+
21
+ /** Thrown if Incorrect mint authority has signed the instruction */
22
+ export class IncorrectMintAuthorityError extends TokenMetadataError {
23
+ name = 'IncorrectMintAuthorityError';
24
+ }
25
+
26
+ /** Thrown if Incorrect mint authority has signed the instruction */
27
+ export class IncorrectUpdateAuthorityError extends TokenMetadataError {
28
+ name = 'IncorrectUpdateAuthorityError';
29
+ }
30
+
31
+ /** Thrown if Token metadata has no update authority */
32
+ export class ImmutableMetadataError extends TokenMetadataError {
33
+ name = 'ImmutableMetadataError';
34
+ }
35
+
36
+ /** Thrown if Key not found in metadata account */
37
+ export class KeyNotFoundError extends TokenMetadataError {
38
+ name = 'KeyNotFoundError';
39
+ }
package/src/field.ts ADDED
@@ -0,0 +1,30 @@
1
+ import type { DataEnumToCodecTuple } from '@solana/codecs-data-structures';
2
+ import { getStructCodec, getTupleCodec, getUnitCodec } from '@solana/codecs-data-structures';
3
+ import { getStringCodec } from '@solana/codecs-strings';
4
+
5
+ export enum Field {
6
+ Name,
7
+ Symbol,
8
+ Uri,
9
+ }
10
+
11
+ type FieldLayout = { __kind: 'Name' } | { __kind: 'Symbol' } | { __kind: 'Uri' } | { __kind: 'Key'; value: [string] };
12
+
13
+ export const getFieldCodec = (): DataEnumToCodecTuple<FieldLayout> => [
14
+ ['Name', getUnitCodec()],
15
+ ['Symbol', getUnitCodec()],
16
+ ['Uri', getUnitCodec()],
17
+ ['Key', getStructCodec<{ value: [string] }>([['value', getTupleCodec([getStringCodec()])]])],
18
+ ];
19
+
20
+ export function getFieldConfig(field: Field | string): FieldLayout {
21
+ if (field === Field.Name || field === 'Name' || field === 'name') {
22
+ return { __kind: 'Name' };
23
+ } else if (field === Field.Symbol || field === 'Symbol' || field === 'symbol') {
24
+ return { __kind: 'Symbol' };
25
+ } else if (field === Field.Uri || field === 'Uri' || field === 'uri') {
26
+ return { __kind: 'Uri' };
27
+ } else {
28
+ return { __kind: 'Key', value: [field] };
29
+ }
30
+ }
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from './errors.js';
2
+ export * from './field.js';
3
+ export * from './instruction.js';
4
+ export * from './state.js';