@@ -49,6 +49,15 @@ function addTypeAndLengthToLen(len: number): number {
49
49
return len + TYPE_SIZE + LENGTH_SIZE ;
50
50
}
51
51
52
+ function isVariableLengthExtension ( e : ExtensionType ) : boolean {
53
+ switch ( e ) {
54
+ case ExtensionType . TokenMetadata :
55
+ return true ;
56
+ default :
57
+ return false ;
58
+ }
59
+ }
60
+
52
61
// NOTE: All of these should eventually use their type's Span instead of these
53
62
// constants. This is provided for at least creation to work.
54
63
export function getTypeLen ( e : ExtensionType ) : number {
@@ -176,8 +185,12 @@ export function getAccountTypeOfMintType(e: ExtensionType): ExtensionType {
176
185
}
177
186
}
178
187
179
- function getLen ( extensionTypes : ExtensionType [ ] , baseSize : number ) : number {
180
- if ( extensionTypes . length === 0 ) {
188
+ function getLen (
189
+ extensionTypes : ExtensionType [ ] ,
190
+ baseSize : number ,
191
+ variableLengthExtensions : { [ E in ExtensionType ] ?: number } = { }
192
+ ) : number {
193
+ if ( extensionTypes . length === 0 && Object . keys ( variableLengthExtensions ) . length === 0 ) {
181
194
return baseSize ;
182
195
} else {
183
196
const accountLength =
@@ -186,7 +199,15 @@ function getLen(extensionTypes: ExtensionType[], baseSize: number): number {
186
199
extensionTypes
187
200
. filter ( ( element , i ) => i === extensionTypes . indexOf ( element ) )
188
201
. map ( ( element ) => addTypeAndLengthToLen ( getTypeLen ( element ) ) )
189
- . reduce ( ( a , b ) => a + b ) ;
202
+ . reduce ( ( a , b ) => a + b , 0 ) +
203
+ Object . entries ( variableLengthExtensions )
204
+ . map ( ( [ extension , len ] ) => {
205
+ if ( ! isVariableLengthExtension ( Number ( extension ) ) ) {
206
+ throw Error ( `Extension ${ extension } is not variable length` ) ;
207
+ }
208
+ return addTypeAndLengthToLen ( len ) ;
209
+ } )
210
+ . reduce ( ( a , b ) => a + b , 0 ) ;
190
211
if ( accountLength === MULTISIG_SIZE ) {
191
212
return accountLength + TYPE_SIZE ;
192
213
} else {
@@ -195,11 +216,15 @@ function getLen(extensionTypes: ExtensionType[], baseSize: number): number {
195
216
}
196
217
}
197
218
198
- export function getMintLen ( extensionTypes : ExtensionType [ ] ) : number {
199
- return getLen ( extensionTypes , MINT_SIZE ) ;
219
+ export function getMintLen (
220
+ extensionTypes : ExtensionType [ ] ,
221
+ variableLengthExtensions : { [ E in ExtensionType ] ?: number } = { }
222
+ ) : number {
223
+ return getLen ( extensionTypes , MINT_SIZE , variableLengthExtensions ) ;
200
224
}
201
225
202
226
export function getAccountLen ( extensionTypes : ExtensionType [ ] ) : number {
227
+ // There are currently no variable length extensions for accounts
203
228
return getLen ( extensionTypes , ACCOUNT_SIZE ) ;
204
229
}
205
230
0 commit comments