@@ -49,6 +49,15 @@ function addTypeAndLengthToLen(len: number): number {
4949 return len + TYPE_SIZE + LENGTH_SIZE ;
5050}
5151
52+ function isVariableLengthExtension ( e : ExtensionType ) : boolean {
53+ switch ( e ) {
54+ case ExtensionType . TokenMetadata :
55+ return true ;
56+ default :
57+ return false ;
58+ }
59+ }
60+
5261// NOTE: All of these should eventually use their type's Span instead of these
5362// constants. This is provided for at least creation to work.
5463export function getTypeLen ( e : ExtensionType ) : number {
@@ -176,8 +185,12 @@ export function getAccountTypeOfMintType(e: ExtensionType): ExtensionType {
176185 }
177186}
178187
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 ) {
181194 return baseSize ;
182195 } else {
183196 const accountLength =
@@ -186,7 +199,15 @@ function getLen(extensionTypes: ExtensionType[], baseSize: number): number {
186199 extensionTypes
187200 . filter ( ( element , i ) => i === extensionTypes . indexOf ( element ) )
188201 . 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 ) ;
190211 if ( accountLength === MULTISIG_SIZE ) {
191212 return accountLength + TYPE_SIZE ;
192213 } else {
@@ -195,11 +216,15 @@ function getLen(extensionTypes: ExtensionType[], baseSize: number): number {
195216 }
196217}
197218
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 ) ;
200224}
201225
202226export function getAccountLen ( extensionTypes : ExtensionType [ ] ) : number {
227+ // There are currently no variable length extensions for accounts
203228 return getLen ( extensionTypes , ACCOUNT_SIZE ) ;
204229}
205230
0 commit comments