@@ -2,68 +2,31 @@ import { PublicKey } from '@solana/web3.js';
2
2
import { expect } from 'chai' ;
3
3
4
4
import type { TokenMetadata } from '../src/state' ;
5
- import { TOKEN_METADATA_DISCRIMINATOR , unpack } from '../src/state' ;
6
- import { getArrayEncoder , getBytesEncoder , getStructEncoder , getTupleEncoder } from '@solana/codecs-data-structures' ;
7
- import { getStringEncoder } from '@solana/codecs-strings' ;
5
+ import { unpack , pack } from '../src' ;
8
6
9
7
describe ( 'Token Metadata State' , ( ) => {
10
- const lengthBuffer = ( buffer : Buffer | Uint8Array ) : Buffer => {
11
- const length = Buffer . alloc ( 4 ) ;
12
- length . writeUIntLE ( buffer . length , 0 , 4 ) ;
13
- return length ;
14
- } ;
15
-
16
- // Helper function to pack meta into tlv bytes slab
17
- const pack = ( meta : TokenMetadata ) => {
18
- const encoder = getStructEncoder ( [
19
- [ 'updateAuthority' , getBytesEncoder ( { size : 32 } ) ] ,
20
- [ 'mint' , getBytesEncoder ( { size : 32 } ) ] ,
21
- [ 'name' , getStringEncoder ( ) ] ,
22
- [ 'symbol' , getStringEncoder ( ) ] ,
23
- [ 'uri' , getStringEncoder ( ) ] ,
24
- [ 'additionalMetadata' , getArrayEncoder ( getTupleEncoder ( [ getStringEncoder ( ) , getStringEncoder ( ) ] ) ) ] ,
25
- ] ) ;
26
- const data = encoder . encode ( {
27
- ...meta ,
28
- updateAuthority : meta . updateAuthority ?. toBuffer ( ) ,
29
- mint : meta . mint . toBuffer ( ) ,
30
- } ) ;
31
- return Buffer . concat ( [ TOKEN_METADATA_DISCRIMINATOR , lengthBuffer ( data ) , data ] ) ;
32
- } ;
33
-
34
- it ( 'Can unpack' , ( ) => {
35
- const data = Buffer . from ( [
36
- // From rust implementation
37
- 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
38
- 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 4 , 0 , 0 , 0 , 110 , 97 ,
39
- 109 , 101 , 6 , 0 , 0 , 0 , 115 , 121 , 109 , 98 , 111 , 108 , 3 , 0 , 0 , 0 , 117 , 114 , 105 , 0 , 0 , 0 , 0 ,
40
- ] ) ;
41
-
42
- const input = Buffer . concat ( [ TOKEN_METADATA_DISCRIMINATOR , lengthBuffer ( data ) , data ] ) ;
43
-
44
- const meta = unpack ( input ) ;
45
- expect ( meta ) . to . deep . equal ( {
8
+ it ( 'Can pack and unpack as rust implementation' , ( ) => {
9
+ const meta = {
46
10
mint : PublicKey . default ,
47
11
name : 'name' ,
48
12
symbol : 'symbol' ,
49
13
uri : 'uri' ,
50
14
additionalMetadata : [ ] ,
51
- } ) ;
52
- } ) ;
15
+ } ;
53
16
54
- it ( 'Can unpack with additionalMetadata' , ( ) => {
55
- const data = Buffer . from ( [
56
- // From rust implementation
17
+ // From rust implementation
18
+ const bytes = Buffer . from ( [
57
19
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
58
- 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 0 , 110 , 101 ,
59
- 119 , 95 , 110 , 97 , 109 , 101 , 10 , 0 , 0 , 0 , 110 , 101 , 119 , 95 , 115 , 121 , 109 , 98 , 111 , 108 , 7 , 0 , 0 , 0 , 110 ,
60
- 101 , 119 , 95 , 117 , 114 , 105 , 2 , 0 , 0 , 0 , 4 , 0 , 0 , 0 , 107 , 101 , 121 , 49 , 6 , 0 , 0 , 0 , 118 , 97 , 108 , 117 , 101 ,
61
- 49 , 4 , 0 , 0 , 0 , 107 , 101 , 121 , 50 , 6 , 0 , 0 , 0 , 118 , 97 , 108 , 117 , 101 , 50 ,
20
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 4 , 0 , 0 , 0 , 110 , 97 ,
21
+ 109 , 101 , 6 , 0 , 0 , 0 , 115 , 121 , 109 , 98 , 111 , 108 , 3 , 0 , 0 , 0 , 117 , 114 , 105 , 0 , 0 , 0 , 0 ,
62
22
] ) ;
63
23
64
- const input = Buffer . concat ( [ TOKEN_METADATA_DISCRIMINATOR , lengthBuffer ( data ) , data ] ) ;
65
- const meta = unpack ( input ) ;
66
- expect ( meta ) . to . deep . equal ( {
24
+ expect ( pack ( meta ) ) . to . deep . equal ( bytes ) ;
25
+ expect ( unpack ( bytes ) ) . to . deep . equal ( meta ) ;
26
+ } ) ;
27
+
28
+ it ( 'Can pack and unpack as rust implementation with additionalMetadata' , ( ) => {
29
+ const meta : TokenMetadata = {
67
30
mint : PublicKey . default ,
68
31
name : 'new_name' ,
69
32
symbol : 'new_symbol' ,
@@ -72,27 +35,64 @@ describe('Token Metadata State', () => {
72
35
[ 'key1' , 'value1' ] ,
73
36
[ 'key2' , 'value2' ] ,
74
37
] ,
75
- } ) ;
38
+ } ;
39
+ // From rust implementation
40
+ const bytes = Buffer . from ( [
41
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
42
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 0 , 110 , 101 ,
43
+ 119 , 95 , 110 , 97 , 109 , 101 , 10 , 0 , 0 , 0 , 110 , 101 , 119 , 95 , 115 , 121 , 109 , 98 , 111 , 108 , 7 , 0 , 0 , 0 , 110 ,
44
+ 101 , 119 , 95 , 117 , 114 , 105 , 2 , 0 , 0 , 0 , 4 , 0 , 0 , 0 , 107 , 101 , 121 , 49 , 6 , 0 , 0 , 0 , 118 , 97 , 108 , 117 , 101 ,
45
+ 49 , 4 , 0 , 0 , 0 , 107 , 101 , 121 , 50 , 6 , 0 , 0 , 0 , 118 , 97 , 108 , 117 , 101 , 50 ,
46
+ ] ) ;
47
+
48
+ expect ( pack ( meta ) ) . to . deep . equal ( bytes ) ;
49
+ expect ( unpack ( bytes ) ) . to . deep . equal ( meta ) ;
76
50
} ) ;
77
51
78
52
it ( 'Can pack and unpack with mint and updateAuthority' , ( ) => {
79
- const input = pack ( {
53
+ const meta = {
80
54
updateAuthority : new PublicKey ( '44444444444444444444444444444444444444444444' ) ,
81
55
mint : new PublicKey ( '55555555555555555555555555555555555555555555' ) ,
82
56
name : 'name' ,
83
57
symbol : 'symbol' ,
84
58
uri : 'uri' ,
85
59
additionalMetadata : [ ] ,
86
- } ) ;
60
+ } ;
61
+
62
+ const bytes = Buffer . from ( [
63
+ 45 , 91 , 65 , 60 , 101 , 64 , 222 , 21 , 12 , 147 , 115 , 20 , 77 , 81 , 51 , 202 , 76 , 184 , 48 , 186 , 15 , 117 , 103 , 22 ,
64
+ 172 , 234 , 14 , 80 , 215 , 148 , 53 , 229 , 60 , 121 , 172 , 80 , 135 , 1 , 40 , 28 , 16 , 196 , 153 , 112 , 103 , 22 , 239 , 184 ,
65
+ 102 , 74 , 235 , 162 , 191 , 71 , 52 , 30 , 59 , 226 , 189 , 193 , 31 , 112 , 71 , 220 , 4 , 0 , 0 , 0 , 110 , 97 , 109 , 101 , 6 ,
66
+ 0 , 0 , 0 , 115 , 121 , 109 , 98 , 111 , 108 , 3 , 0 , 0 , 0 , 117 , 114 , 105 , 0 , 0 , 0 , 0 ,
67
+ ] ) ;
68
+
69
+ expect ( pack ( meta ) ) . to . deep . equal ( bytes ) ;
70
+ expect ( unpack ( bytes ) ) . to . deep . equal ( meta ) ;
71
+ } ) ;
87
72
88
- const meta = unpack ( input ) ;
89
- expect ( meta ) . to . deep . equal ( {
73
+ it ( 'Can pack and unpack with mint, updateAuthority and additional metadata' , ( ) => {
74
+ const meta : TokenMetadata = {
90
75
updateAuthority : new PublicKey ( '44444444444444444444444444444444444444444444' ) ,
91
76
mint : new PublicKey ( '55555555555555555555555555555555555555555555' ) ,
92
77
name : 'name' ,
93
78
symbol : 'symbol' ,
94
79
uri : 'uri' ,
95
- additionalMetadata : [ ] ,
96
- } ) ;
80
+ additionalMetadata : [
81
+ [ 'key1' , 'value1' ] ,
82
+ [ 'key2' , 'value2' ] ,
83
+ ] ,
84
+ } ;
85
+
86
+ const bytes = Buffer . from ( [
87
+ 45 , 91 , 65 , 60 , 101 , 64 , 222 , 21 , 12 , 147 , 115 , 20 , 77 , 81 , 51 , 202 , 76 , 184 , 48 , 186 , 15 , 117 , 103 , 22 ,
88
+ 172 , 234 , 14 , 80 , 215 , 148 , 53 , 229 , 60 , 121 , 172 , 80 , 135 , 1 , 40 , 28 , 16 , 196 , 153 , 112 , 103 , 22 , 239 , 184 ,
89
+ 102 , 74 , 235 , 162 , 191 , 71 , 52 , 30 , 59 , 226 , 189 , 193 , 31 , 112 , 71 , 220 , 4 , 0 , 0 , 0 , 110 , 97 , 109 , 101 , 6 ,
90
+ 0 , 0 , 0 , 115 , 121 , 109 , 98 , 111 , 108 , 3 , 0 , 0 , 0 , 117 , 114 , 105 , 2 , 0 , 0 , 0 , 4 , 0 , 0 , 0 , 107 , 101 , 121 , 49 ,
91
+ 6 , 0 , 0 , 0 , 118 , 97 , 108 , 117 , 101 , 49 , 4 , 0 , 0 , 0 , 107 , 101 , 121 , 50 , 6 , 0 , 0 , 0 , 118 , 97 , 108 , 117 , 101 ,
92
+ 50 ,
93
+ ] ) ;
94
+
95
+ expect ( pack ( meta ) ) . to . deep . equal ( bytes ) ;
96
+ expect ( unpack ( bytes ) ) . to . deep . equal ( meta ) ;
97
97
} ) ;
98
98
} ) ;
0 commit comments