@rialo/spl-token 0.3.0-alpha.0 → 0.3.0
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.
- package/dist/index.d.mts +1374 -164
- package/dist/index.d.ts +1374 -164
- package/dist/index.js +2235 -682
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2201 -684
- package/dist/index.mjs.map +1 -1
- package/package.json +16 -4
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/instructions/create-ata.ts","../src/test-helpers.ts","../src/instructions/mint.ts","../src/instructions/transfer.ts","../node_modules/@noble/hashes/src/utils.ts","../node_modules/@noble/hashes/src/_md.ts","../node_modules/@noble/hashes/src/sha2.ts","../src/pda/ata.ts","../src/state/mint.ts","../src/state/token-account.ts","../src/state/metadata.ts","../src/client/spl-token-client.ts"],"names":["TokenAccountState","ExtensionType","AccountType","TokenInstruction","SplTokenErrorCode","PublicKey","writeU64LE","readU64LE","readU32LE","readCOptionPubkey"],"mappings":";;;;;AAeO,IAAM,qBAAA,GAAwB;AAG9B,IAAM,2BAAA,GAA8B;AAGpC,IAAM,gBAAA,GAAmB;AAOzB,IAAM,SAAA,GAAY;AAGlB,IAAM,kBAAA,GAAqB;AAU3B,IAAM,kBAAA,GAAqB,EAAA;AAG3B,IAAM,oBAAA,GAAuB,EAAA;AAG7B,IAAM,0BAAA,GAA6B,EAAA;AAGnC,IAAM,4BAAA,GAA+B,EAAA;AAOrC,IAAM,yBAAA,GAA4B,CAAA;AAGlC,IAAM,0BAAA,GAA6B,EAAA;AAGnC,IAAM,2BAAA,GAA8B,EAAA;AAGpC,IAAM,6BAAA,GAAgC,EAAA;AAGtC,IAAM,0BAAA,GAA6B,GAAA;AAGnC,IAAM,8BAAA,GAAiC,GAAA;AAGvC,IAAM,qCAAA,GAAwC,GAAA;AAG9C,IAAM,oCAAA,GAAuC,GAAA;AAa7C,IAAM,YAAA,GAAe,CAAA;AAGrB,IAAM,WAAA,GAAc,EAAA;AASpB,IAAK,iBAAA,qBAAAA,kBAAAA,KAAL;AAEL,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,iBAAc,CAAA,CAAA,GAAd,aAAA;AAEA,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AANU,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAiBL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AAEL,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,uBAAoB,CAAA,CAAA,GAApB,mBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,uBAAoB,CAAA,CAAA,GAApB,mBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,wBAAqB,CAAA,CAAA,GAArB,oBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,8BAA2B,CAAA,CAAA,GAA3B,0BAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,iCAA8B,CAAA,CAAA,GAA9B,6BAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,yBAAsB,CAAA,CAAA,GAAtB,qBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,oBAAiB,CAAA,CAAA,GAAjB,gBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,qBAAkB,CAAA,CAAA,GAAlB,iBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,2BAAwB,EAAA,CAAA,GAAxB,uBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,cAAW,EAAA,CAAA,GAAX,UAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,uBAAoB,EAAA,CAAA,GAApB,mBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,4BAAyB,EAAA,CAAA,GAAzB,wBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,kBAAe,EAAA,CAAA,GAAf,cAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,yBAAsB,EAAA,CAAA,GAAtB,qBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,mCAAgC,EAAA,CAAA,GAAhC,+BAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,mCAAgC,EAAA,CAAA,GAAhC,+BAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,qBAAkB,EAAA,CAAA,GAAlB,iBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,mBAAgB,EAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,kBAAe,EAAA,CAAA,GAAf,cAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,gBAAa,EAAA,CAAA,GAAb,YAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,wBAAqB,EAAA,CAAA,GAArB,oBAAA;AAEA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,sBAAmB,EAAA,CAAA,GAAnB,kBAAA;AAhDU,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AA0DL,IAAK,WAAA,qBAAAC,YAAAA,KAAL;AAEL,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAEA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,aAAU,CAAA,CAAA,GAAV,SAAA;AANU,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;AAgBL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AAEL,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,oBAAiB,CAAA,CAAA,GAAjB,gBAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,uBAAoB,CAAA,CAAA,GAApB,mBAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,wBAAqB,CAAA,CAAA,GAArB,oBAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,cAAW,CAAA,CAAA,GAAX,UAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,aAAU,CAAA,CAAA,GAAV,SAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,mBAAgB,EAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,iBAAc,EAAA,CAAA,GAAd,aAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,qBAAkB,EAAA,CAAA,GAAlB,iBAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,oBAAiB,EAAA,CAAA,GAAjB,gBAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,mBAAgB,EAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,iBAAc,EAAA,CAAA,GAAd,aAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,wBAAqB,EAAA,CAAA,GAArB,oBAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,gBAAa,EAAA,CAAA,GAAb,YAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,wBAAqB,EAAA,CAAA,GAArB,oBAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,yBAAsB,EAAA,CAAA,GAAtB,qBAAA;AAEA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,qBAAkB,EAAA,CAAA,GAAlB,iBAAA;AA1CU,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAkDL,IAAM,aAAA,GAAgB,CAAA;AAGtB,IAAM,eAAA,GAAkB,CAAA;AAGxB,IAAM,yBAAyB,SAAA,GAAY,CAAA;;;AC7O3C,IAAK,iBAAA,qBAAAC,kBAAAA,KAAL;AAEL,EAAAA,mBAAA,cAAA,CAAA,GAAe,cAAA;AAEf,EAAAA,mBAAA,uBAAA,CAAA,GAAwB,uBAAA;AAExB,EAAAA,mBAAA,yBAAA,CAAA,GAA0B,yBAAA;AAE1B,EAAAA,mBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,mBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,mBAAA,sBAAA,CAAA,GAAuB,sBAAA;AAEvB,EAAAA,mBAAA,mBAAA,CAAA,GAAoB,mBAAA;AAEpB,EAAAA,mBAAA,uBAAA,CAAA,GAAwB,uBAAA;AAExB,EAAAA,mBAAA,kBAAA,CAAA,GAAmB,kBAAA;AAEnB,EAAAA,mBAAA,yBAAA,CAAA,GAA0B,yBAAA;AApBhB,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAuDL,IAAM,aAAA,GAAN,MAAM,cAAA,SAAsB,KAAA,CAAM;AAAA,EACvB,IAAA;AAAA,EACA,OAAA;AAAA,EAET,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,SAAQ,EAAyB;AACnE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAGf,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,cAAa,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,WAAA,CAAY,EAAE,MAAA,EAAO,EAAsC;AACvE,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS,iBAAiB,MAAM,CAAA;AAAA,KACjC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,mBAAA,CAAoB,EAAE,MAAA,EAAO,EAAsC;AAC/E,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,IAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS,0BAA0B,MAAM,CAAA;AAAA,KAC1C,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,oBAAA,CAAqB,EAAE,OAAA,EAAQ,EAAuC;AAClF,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,IAAA,EAAM,yBAAA;AAAA,MACN,OAAA,EAAS,4BAA4B,OAAO,CAAA,CAAA;AAAA,MAC5C,OAAA,EAAS,EAAE,OAAA;AAAQ,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,YAAA,CAAa,EAAE,OAAA,EAAQ,EAAuC;AAC1E,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,mBAAmB,OAAO,CAAA,CAAA;AAAA,MACnC,OAAA,EAAS,EAAE,OAAA;AAAQ,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,aAAA,CAAc,EAAE,OAAA,EAAQ,EAAuC;AAC3E,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,4BAA4B,OAAO,CAAA,CAAA;AAAA,MAC5C,OAAA,EAAS,EAAE,OAAA;AAAQ,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,mBAAA,CAAoB;AAAA,IAChC,QAAA;AAAA,IACA;AAAA,GACF,EAGkB;AAChB,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,IAAA,EAAM,sBAAA;AAAA,MACN,OAAA,EAAS,CAAA,+BAAA,EAAkC,QAAQ,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA;AAAA,MAC3E,OAAA,EAAS,EAAE,QAAA,EAAU,QAAA,CAAS,UAAS,EAAG,SAAA,EAAW,SAAA,CAAU,QAAA,EAAS;AAAE,KAC3E,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,gBAAA,CAAiB,EAAE,MAAA,EAAO,EAAsC;AAC5E,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,IAAA,EAAM,mBAAA;AAAA,MACN,OAAA,EAAS,sBAAsB,MAAM,CAAA;AAAA,KACtC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,mBAAA,CAAoB,EAAE,MAAA,EAAO,EAAsC;AAC/E,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,IAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS,0BAA0B,MAAM,CAAA;AAAA,KAC1C,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,eAAA,CAAgB,EAAE,MAAA,EAAO,EAAsC;AAC3E,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS,qBAAqB,MAAM,CAAA;AAAA,KACrC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,qBAAA,CAAsB,EAAE,OAAA,EAAQ,EAAuC;AACnF,IAAA,OAAO,IAAI,cAAA,CAAc;AAAA,MACvB,IAAA,EAAM,yBAAA;AAAA,MACN,OAAA,EAAS,4BAA4B,OAAO,CAAA,CAAA;AAAA,MAC5C,OAAA,EAAS,EAAE,OAAA;AAAQ,KACpB,CAAA;AAAA,EACH;AACF;AC7JO,SAAS,uCAAA,CAAwC;AAAA,EACtD,KAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,GAAY,SAAA,CAAU,UAAA,CAAW,qBAAqB;AACxD,CAAA,EAAgE;AAC9D,EAAA,MAAM,wBAAA,GAA2B,SAAA,CAAU,UAAA,CAAW,2BAA2B,CAAA;AACjF,EAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,UAAA,CAAW,iBAAiB,CAAA;AAU9D,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,wBAAA;AAAA,IACX,QAAA,EAAU;AAAA,MACR,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,YAAY,IAAA,EAAK;AAAA,MAClD,EAAE,MAAA,EAAQ,eAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,MAC7D,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,MACpD,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,MACnD,EAAE,MAAA,EAAQ,eAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,MAC9D,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA;AAAM,KAC1D;AAAA;AAAA,IAEA,IAAA,EAAM,IAAI,UAAA,CAAW,CAAC;AAAA,GACxB;AACF;AAsCO,SAAS,iDAAA,CAAkD;AAAA,EAChE,KAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,GAAY,SAAA,CAAU,UAAA,CAAW,qBAAqB;AACxD,CAAA,EAA0E;AACxE,EAAA,MAAM,wBAAA,GAA2B,SAAA,CAAU,UAAA,CAAW,2BAA2B,CAAA;AACjF,EAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,UAAA,CAAW,iBAAiB,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,wBAAA;AAAA,IACX,QAAA,EAAU;AAAA,MACR,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,YAAY,IAAA,EAAK;AAAA,MAClD,EAAE,MAAA,EAAQ,eAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,MAC7D,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,MACpD,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,MACnD,EAAE,MAAA,EAAQ,eAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,MAC9D,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA;AAAM,KAC1D;AAAA;AAAA,IAEA,IAAA,EAAM,IAAI,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA,GAC1B;AACF;;;AC9HO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA8D;AAC5D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,MAAA,CAAQ,SAAS,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAK,KAAK,CAAA;AAAA,EAC5D;AACF;;;ACmBO,SAAS,yBAAA,CAA0B;AAAA,EACzC,IAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA,GAAYC,SAAAA,CAAU,UAAA,CAAW,qBAAqB;AACvD,CAAA,EAAkD;AAEjD,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,EAAE,CAAA;AAE9B,EAAA,IAAA,CAAK,CAAC,CAAA,GAAA,EAAA;AACN,EAAA,IAAA,CAAK,CAAC,CAAA,GAAI,QAAA;AACV,EAAA,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,OAAA,EAAQ,EAAG,CAAC,CAAA;AAEnC,EAAA,IAAI,eAAA,EAAiB;AACpB,IAAA,IAAA,CAAK,EAAE,CAAA,GAAI,CAAA;AACX,IAAA,IAAA,CAAK,GAAA,CAAI,eAAA,CAAgB,OAAA,EAAQ,EAAG,EAAE,CAAA;AAAA,EACvC,CAAA,MAAO;AACN,IAAA,IAAA,CAAK,EAAE,CAAA,GAAI,CAAA;AAAA,EAEZ;AAGA,EAAA,MAAM,CAAC,YAAY,CAAA,GAAIA,SAAAA,CAAU,kBAAA;AAAA,IAChC,CAAC,gBAAA,EAAkB,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,IACjC;AAAA,GACD;AAEA,EAAA,OAAO;AAAA,IACN,SAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACT,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,MAClD,EAAE,MAAA,EAAQ,YAAA,EAAc,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA;AAAM,KAC5D;AAAA,IACA;AAAA,GACD;AACD;AAyCO,SAAS,iBAAA,CAAkB;AAAA,EACjC,IAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAYA,SAAAA,CAAU,UAAA,CAAW,qBAAqB;AACvD,CAAA,EAA0C;AACzC,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,CAAC,CAAA;AAC7B,EAAA,IAAA,CAAK,CAAC,CAAA,GAAA,CAAA;AACN,EAAA,UAAA,CAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,QAAQ,CAAA;AAE7C,EAAA,OAAO;AAAA,IACN,SAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACT,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,MAClD,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,MACzD,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,YAAY,KAAA;AAAM,KACxD;AAAA,IACA;AAAA,GACD;AACD;AC3GA,SAASC,WAAAA,CAAW;AAAA,EAClB,IAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAIS;AACP,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,MAAA,CAAQ,SAAS,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAK,KAAK,CAAA;AAAA,EAC5D;AACF;AAkDO,SAAS,0BAAA,CAA2B;AAAA,EACzC,MAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAYD,SAAAA,CAAU,UAAA,CAAW,qBAAqB;AACxD,CAAA,EAAmD;AAEjD,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,EAAE,CAAA;AAG9B,EAAA,IAAA,CAAK,CAAC,CAAA,GAAA,EAAA;AAGN,EAAAC,YAAW,EAAE,IAAA,EAAM,QAAQ,CAAA,EAAG,KAAA,EAAO,QAAQ,CAAA;AAG7C,EAAA,IAAA,CAAK,CAAC,CAAA,GAAI,QAAA;AAEV,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,MACpD,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,MACnD,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,MACzD,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,YAAY,KAAA;AAAM,KACzD;AAAA,IACA;AAAA,GACF;AACF;AA2BO,SAAS,mBAAA,CAAoB;AAAA,EAClC,MAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAYD,SAAAA,CAAU,UAAA,CAAW,qBAAqB;AACxD,CAAA,EAA4C;AAE1C,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,CAAC,CAAA;AAG7B,EAAA,IAAA,CAAK,CAAC,CAAA,GAAA,CAAA;AAGN,EAAAC,YAAW,EAAE,IAAA,EAAM,QAAQ,CAAA,EAAG,KAAA,EAAO,QAAQ,CAAA;AAE7C,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,MACpD,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,MACzD,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,YAAY,KAAA;AAAM,KACzD;AAAA,IACA;AAAA,GACF;AACF;;;ACnLM,SAAU,QAAQ,CAAA,EAAU;AAChC,EAAA,OAAO,CAAA,YAAa,cAAe,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA,CAAE,YAAY,IAAA,KAAS,YAAA;AACrF;AAWM,SAAU,MAAA,CAAO,KAAA,EAAmB,MAAA,EAAiB,KAAA,GAAgB,EAAA,EAAE;AAC3E,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,EAAA,MAAM,MAAM,KAAA,EAAO,MAAA;AACnB,EAAA,MAAM,WAAW,MAAA,KAAW,MAAA;AAC5B,EAAA,IAAI,CAAC,KAAA,IAAU,QAAoB,EAAS;AAC1C,IAAA,MAAM,MAAA,GAAS,KAAA,IAAS,CAAA,CAAA,EAAI,KAAK,CAAA,EAAA,CAAA;AACjC,IAAA,MAAM,KAAA,GAA4C,EAAA;AAClD,IAAA,MAAM,MAAM,KAAA,GAAQ,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,GAAK,CAAA,KAAA,EAAQ,OAAO,KAAK,CAAA,CAAA;AAC1D,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,GAAS,qBAAA,GAAwB,KAAA,GAAQ,WAAW,GAAG,CAAA;AACzE,EAAA;AACA,EAAA,OAAO,KAAA;AACT;AAWM,SAAU,OAAA,CAAQ,QAAA,EAAe,aAAA,GAAgB,IAAA,EAAI;AACzD,EAAA,IAAI,QAAA,CAAS,SAAA;AAAW,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAC1E,EAAA,IAAI,iBAAiB,QAAA,CAAS,QAAA;AAAU,IAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AACjG;AAGM,SAAU,OAAA,CAAQ,KAAU,QAAA,EAAa;AAC7C,EAAA,MAAA,CAAO,GAAA,EAAK,QAAW,qBAAqB,CAAA;AAC5C,EAAA,MAAM,MAAM,QAAA,CAAS,SAAA;AACrB,EAAA,IAAI,GAAA,CAAI,SAAS,GAAA,EAAK;AACpB,IAAA,MAAM,IAAI,KAAA,CAAM,mDAAA,GAAsD,GAAG,CAAA;AAC3E,EAAA;AACF;AAkBM,SAAU,SAAS,MAAA,EAAoB;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAClB,EAAA;AACF;AAGM,SAAU,WAAW,GAAA,EAAe;AACxC,EAAA,OAAO,IAAI,QAAA,CAAS,GAAA,CAAI,QAAQ,GAAA,CAAI,UAAA,EAAY,IAAI,UAAU,CAAA;AAChE;AAGM,SAAU,IAAA,CAAK,MAAc,KAAA,EAAa;AAC9C,EAAA,OAAQ,IAAA,IAAS,EAAA,GAAK,KAAA,GAAW,IAAA,KAAS,KAAA;AAC5C;AAoOM,SAAU,YAAA,CACd,QAAA,EACA,IAAA,GAAiB,EAAA,EAAE;AAEnB,EAAA,MAAM,KAAA,GAAa,CAAC,GAAA,EAAiB,IAAA,KAAgB,QAAA,CAAS,IAAI,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,EAAM;AACtF,EAAA,MAAM,GAAA,GAAM,SAAS,MAAS,CAAA;AAC9B,EAAA,KAAA,CAAM,YAAY,GAAA,CAAI,SAAA;AACtB,EAAA,KAAA,CAAM,WAAW,GAAA,CAAI,QAAA;AACrB,EAAA,KAAA,CAAM,MAAA,GAAS,CAAC,IAAA,KAAgB,QAAA,CAAS,IAAI,CAAA;AAC7C,EAAA,MAAA,CAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AACzB,EAAA,OAAO,MAAA,CAAO,OAAO,KAAK,CAAA;AAC5B;AAWO,IAAM,OAAA,GAAU,CAAC,MAAA,MAAwC;AAC9D,EAAA,GAAA,EAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAM,GAAM,EAAA,EAAM,GAAA,EAAM,EAAA,EAAM,CAAA,EAAM,GAAA,EAAM,CAAA,EAAM,CAAA,EAAM,CAAA,EAAM,MAAM,CAAC;;;;ACzUrF,SAAU,GAAA,CAAI,CAAA,EAAW,CAAA,EAAW,CAAA,EAAS;AACjD,EAAA,OAAQ,CAAA,GAAI,CAAA,GAAM,CAAC,CAAA,GAAI,CAAA;AACzB;AAGM,SAAU,GAAA,CAAI,CAAA,EAAW,CAAA,EAAW,CAAA,EAAS;AACjD,EAAA,OAAQ,CAAA,GAAI,CAAA,GAAM,CAAA,GAAI,CAAA,GAAM,CAAA,GAAI,CAAA;AAClC;AAMM,IAAgB,SAAhB,MAAsB;AAOjB,EAAA,QAAA;AACA,EAAA,SAAA;AACA,EAAA,SAAA;AACA,EAAA,IAAA;;AAGC,EAAA,MAAA;AACA,EAAA,IAAA;EACA,QAAA,GAAW,KAAA;EACX,MAAA,GAAS,CAAA;EACT,GAAA,GAAM,CAAA;EACN,SAAA,GAAY,KAAA;EAEtB,WAAA,CAAY,QAAA,EAAkB,SAAA,EAAmB,SAAA,EAAmB,IAAA,EAAa;AAC/E,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,UAAA,CAAW,QAAQ,CAAA;AACrC,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AACpC,EAAA;AACA,EAAA,MAAA,CAAO,IAAA,EAAgB;AACrB,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,MAAA,CAAO,IAAI,CAAA;AACX,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAQ,GAAK,IAAA;AACnC,IAAA,MAAM,MAAM,IAAA,CAAK,MAAA;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,IAAO;AAC7B,MAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,WAAW,IAAA,CAAK,GAAA,EAAK,MAAM,GAAG,CAAA;AAEpD,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAChC,QAAA,OAAO,QAAA,IAAY,GAAA,GAAM,GAAA,EAAK,GAAA,IAAO,QAAA;AAAU,UAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,GAAG,CAAA;AACzE,QAAA;AACF,MAAA;AACA,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,QAAA,CAAS,GAAA,EAAK,MAAM,IAAI,CAAA,EAAG,KAAK,GAAG,CAAA;AACnD,MAAA,IAAA,CAAK,GAAA,IAAO,IAAA;AACZ,MAAA,GAAA,IAAO,IAAA;AACP,MAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,EAAU;AACzB,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AACpB,QAAA,IAAA,CAAK,GAAA,GAAM,CAAA;AACb,MAAA;AACF,IAAA;AACA,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,UAAA,EAAU;AACf,IAAA,OAAO,IAAA;AACT,EAAA;AACA,EAAA,UAAA,CAAW,GAAA,EAAe;AACxB,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAIhB,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,MAAI,GAAK,IAAA;AACzC,IAAA,IAAI,EAAE,KAAG,GAAK,IAAA;AAEd,IAAA,MAAA,CAAO,KAAK,CAAA,GAAI,GAAA;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,CAAA;AAG/B,IAAA,IAAI,IAAA,CAAK,SAAA,GAAY,QAAA,GAAW,GAAA,EAAK;AACnC,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AACpB,MAAA,GAAA,GAAM,CAAA;AACR,IAAA;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA;AAAK,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAIjD,IAAA,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA,EAAG,MAAA,CAAO,KAAK,MAAA,GAAS,CAAC,GAAG,IAAI,CAAA;AAC7D,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAC5B,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA;AAEjB,IAAA,IAAI,GAAA,GAAM,CAAA;AAAG,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AACxE,IAAA,MAAM,SAAS,GAAA,GAAM,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAG;AACtB,IAAA,IAAI,SAAS,KAAA,CAAM,MAAA;AAAQ,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAC/E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA;AAAK,MAAA,KAAA,CAAM,UAAU,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,CAAC,GAAG,IAAI,CAAA;AACxE,EAAA;EACA,MAAA,GAAM;AACJ,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAS,GAAK,IAAA;AAC9B,IAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACrC,IAAA,IAAA,CAAK,OAAA,EAAO;AACZ,IAAA,OAAO,GAAA;AACT,EAAA;AACA,EAAA,UAAA,CAAW,EAAA,EAAM;AACf,IAAA,EAAA,KAAO,IAAK,KAAK,WAAA,EAAmB;AACpC,IAAA,EAAA,CAAG,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,EAAK,CAAA;AACpB,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAQ,QAAA,EAAU,SAAA,EAAW,KAAG,GAAK,IAAA;AAC/D,IAAA,EAAA,CAAG,SAAA,GAAY,SAAA;AACf,IAAA,EAAA,CAAG,QAAA,GAAW,QAAA;AACd,IAAA,EAAA,CAAG,MAAA,GAAS,MAAA;AACZ,IAAA,EAAA,CAAG,GAAA,GAAM,GAAA;AACT,IAAA,IAAI,MAAA,GAAS,QAAA;AAAU,MAAA,EAAA,CAAG,MAAA,CAAO,IAAI,MAAM,CAAA;AAC3C,IAAA,OAAO,EAAA;AACT,EAAA;EACA,KAAA,GAAK;AACH,IAAA,OAAO,KAAK,UAAA,EAAU;AACxB,EAAA;;AASK,IAAM,SAAA,+BAAqD,IAAA,CAAK;AACrE,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,SAAA;AAAY,EAAA;AACrF,CAAA,CAAA;;;AC1HD,IAAM,QAAA,+BAAuC,IAAA,CAAK;AAChD,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,SAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AACpF,EAAA,UAAA;AAAY,EAAA,SAAA;AAAY,EAAA,SAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AACpF,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,SAAA;AAAY,EAAA,SAAA;AAAY,EAAA,SAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AACpF,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,SAAA;AAAY,EAAA,SAAA;AACpF,EAAA,SAAA;AAAY,EAAA,SAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AACpF,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,SAAA;AACpF,EAAA,SAAA;AAAY,EAAA,SAAA;AAAY,EAAA,SAAA;AAAY,EAAA,SAAA;AAAY,EAAA,SAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AACpF,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA,UAAA;AAAY,EAAA;AACrF,CAAA,CAAA;AAGD,IAAM,QAAA,mBAA2B,IAAI,WAAA,CAAY,EAAE,CAAA;AAGnD,IAAe,QAAA,GAAf,cAAuD,MAAA,CAAS;AAY9D,EAAA,WAAA,CAAY,SAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,KAAK,CAAA;AAC/B,EAAA;EACU,GAAA,GAAG;AACX,IAAA,MAAM,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAC,GAAK,IAAA;AACnC,IAAA,OAAO,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAChC,EAAA;;AAEU,EAAA,GAAA,CACR,GAAW,CAAA,EAAW,CAAA,EAAW,GAAW,CAAA,EAAW,CAAA,EAAW,GAAW,CAAA,EAAS;AAEtF,IAAA,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AACb,IAAA,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AACb,IAAA,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AACb,IAAA,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AACb,IAAA,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AACb,IAAA,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AACb,IAAA,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AACb,IAAA,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AACf,EAAA;AACU,EAAA,OAAA,CAAQ,MAAgB,MAAA,EAAc;AAE9C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAK,MAAA,IAAU,CAAA;AAAG,MAAA,QAAA,CAAS,CAAC,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,QAAQ,KAAK,CAAA;AACpF,IAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,GAAI,EAAE,CAAA;AAC3B,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AACzB,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAK,CAAC,IAAI,IAAA,CAAK,GAAA,EAAK,EAAE,CAAA,GAAK,GAAA,KAAQ,CAAA;AACnD,MAAA,MAAM,EAAA,GAAK,KAAK,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA,GAAK,EAAA,KAAO,EAAA;AACjD,MAAA,QAAA,CAAS,CAAC,CAAA,GAAK,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,GAAI,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,EAAE,CAAA,GAAK,CAAA;AACjE,IAAA;AAEA,IAAA,IAAI,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAC,GAAK,IAAA;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA;AACpD,MAAA,MAAM,EAAA,GAAM,CAAA,GAAI,MAAA,GAAS,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAK,CAAA;AACrE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA;AACpD,MAAA,MAAM,KAAM,MAAA,GAAS,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAK,CAAA;AACrC,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAK,IAAI,EAAA,GAAM,CAAA;AACf,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA,CAAA,GAAK,KAAK,EAAA,GAAM,CAAA;AAClB,IAAA;AAEA,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAK,CAAA;AACnB,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAK,CAAA;AACnB,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAK,CAAA;AACnB,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAK,CAAA;AACnB,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAK,CAAA;AACnB,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAK,CAAA;AACnB,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAK,CAAA;AACnB,IAAA,CAAA,GAAK,CAAA,GAAI,KAAK,CAAA,GAAK,CAAA;AACnB,IAAA,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACjC,EAAA;EACU,UAAA,GAAU;AAClB,IAAA,KAAA,CAAM,QAAQ,CAAA;AAChB,EAAA;EACA,OAAA,GAAO;AACL,IAAA,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC/B,IAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACnB,EAAA;;AAII,IAAO,OAAA,GAAP,cAAuB,QAAA,CAAiB;;;EAGlC,CAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;EAC3B,CAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;EAC3B,CAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;EAC3B,CAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;EAC3B,CAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;EAC3B,CAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;EAC3B,CAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;EAC3B,CAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;EACrC,WAAA,GAAA;AACE,IAAA,KAAA,CAAM,EAAE,CAAA;AACV,EAAA;;AAqTK,IAAM,MAAA,mBAAyC,YAAA;AACpD,EAAA,MAAM,IAAI,OAAA,EAAO;AACD,kBAAA,OAAA,CAAQ,CAAI;AAAC,CAAA;AC5Z/B,SAAS,oBAAA,CAAqB;AAAA,EAC5B,KAAA;AAAA,EACA;AACF,CAAA,EAGgD;AAE9C,EAAA,KAAA,IAAS,IAAA,GAAO,GAAA,EAAK,IAAA,IAAQ,CAAA,EAAG,IAAA,EAAA,EAAQ;AACtC,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,CAAC,IAAI,CAAC,CAAA;AAGtC,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAA,EAAO,QAAQ,CAAA;AACpC,IAAA,MAAM,cAAA,GAAiB,UAAU,OAAA,EAAQ;AACzC,IAAA,MAAM,UAAA,GAAa,IAAI,WAAA,EAAY,CAAE,OAAO,uBAAuB,CAAA;AAGnE,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,WAAA,IAAe,IAAA,CAAK,MAAA;AAAA,IACtB;AACA,IAAA,WAAA,IAAe,cAAA,CAAe,SAAS,UAAA,CAAW,MAAA;AAGlD,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,WAAW,CAAA;AAC3C,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,QAAA,CAAS,GAAA,CAAI,MAAM,MAAM,CAAA;AACzB,MAAA,MAAA,IAAU,IAAA,CAAK,MAAA;AAAA,IACjB;AACA,IAAA,QAAA,CAAS,GAAA,CAAI,gBAAgB,MAAM,CAAA;AACnC,IAAA,MAAA,IAAU,cAAA,CAAe,MAAA;AACzB,IAAA,QAAA,CAAS,GAAA,CAAI,YAAY,MAAM,CAAA;AAG/B,IAAA,MAAM,IAAA,GAAO,OAAO,QAAQ,CAAA;AAG5B,IAAA,IAAI,CAAC,SAAA,CAAU,IAAI,CAAA,EAAG;AACpB,MAAA,OAAO;AAAA,QACL,OAAA,EAASD,SAAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AAAA,QACjC;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAiCO,SAAS,0BAAA,CAA2B;AAAA,EACzC,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,GAAYA,SAAAA,CAAU,UAAA,CAAW,qBAAqB;AACxD,CAAA,EAA2D;AACzD,EAAA,MAAM,wBAAA,GAA2BA,SAAAA,CAAU,UAAA,CAAW,2BAA2B,CAAA;AAGjF,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,CAAO,OAAA,EAAQ,EAAG,UAAU,OAAA,EAAQ,EAAG,IAAA,CAAK,OAAA,EAAS,CAAA;AAEpE,EAAA,MAAM,SAAS,oBAAA,CAAqB,EAAE,KAAA,EAAO,SAAA,EAAW,0BAA0B,CAAA;AAElF,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,cAAc,mBAAA,CAAoB;AAAA,MACtC,MAAA,EAAQ,uCAAuC,MAAA,CAAO,QAAA,EAAU,CAAA,OAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAAA,KAC1F,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAsBO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,GAAYA,SAAAA,CAAU,UAAA,CAAW,qBAAqB;AACxD,CAAA,EAAoD;AAClD,EAAA,OAAO,2BAA2B,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA;AACjE;AC/HA,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAO,EAAiD;AACjF,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,KAAA,IAAS,MAAA,CAAO,KAAK,MAAA,GAAS,CAAC,CAAC,CAAA,IAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAO,EAAiD;AACjF,EAAA,OAAA,CACG,KAAK,MAAM,CAAA,GACT,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA,GACpB,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA,GACpB,KAAK,MAAA,GAAS,CAAC,KAAK,EAAA,MACvB,CAAA;AAEJ;AAUA,SAAS,iBAAA,CAAkB;AAAA,EACzB,IAAA;AAAA,EACA;AACF,CAAA,EAA2D;AACzD,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,EAAE,IAAA,EAAM,QAAQ,CAAA;AACtC,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG,MAAA,GAAS,IAAI,WAAW,CAAA;AACnE,IAAA,OAAOA,SAAAA,CAAU,UAAU,WAAW,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,IAAA;AACT;AA6BO,SAAS,gBAAA,CAAiB,EAAE,OAAA,EAAS,IAAA,EAAK,EAAsC;AACrF,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,IAAA,MAAM,cAAc,WAAA,CAAY;AAAA,MAC9B,MAAA,EAAQ,CAAA,0CAAA,EAA6C,SAAS,CAAA,YAAA,EAAe,KAAK,MAAM,CAAA;AAAA,KACzF,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,gBAAgB,iBAAA,CAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAG,CAAA;AAG3D,EAAA,MAAM,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,oBAAoB,CAAA;AAG7D,EAAA,MAAM,QAAA,GAAW,KAAK,oBAAoB,CAAA;AAG1C,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,0BAA0B,CAAA,KAAM,CAAA;AAG3D,EAAA,MAAM,kBAAkB,iBAAA,CAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,8BAA8B,CAAA;AAExF,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,cAAc,qBAAA,CAAsB,EAAE,SAAS,OAAA,CAAQ,QAAA,IAAY,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;ACjGA,SAASE,UAAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAO,EAAiD;AACjF,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,KAAA,IAAS,MAAA,CAAO,KAAK,MAAA,GAAS,CAAC,CAAC,CAAA,IAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAASC,UAAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAO,EAAiD;AACjF,EAAA,OAAA,CACG,KAAK,MAAM,CAAA,GACT,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA,GACpB,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA,GACpB,KAAK,MAAA,GAAS,CAAC,KAAK,EAAA,MACvB,CAAA;AAEJ;AAOA,SAASC,kBAAAA,CAAkB;AAAA,EACzB,IAAA;AAAA,EACA;AACF,CAAA,EAA2D;AACzD,EAAA,MAAM,GAAA,GAAMD,UAAAA,CAAU,EAAE,IAAA,EAAM,QAAQ,CAAA;AACtC,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG,MAAA,GAAS,IAAI,WAAW,CAAA;AACnE,IAAA,OAAOH,SAAAA,CAAU,UAAU,WAAW,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,IAAA;AACT;AAOA,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,MAAA,EAAO,EAAwD;AAC7F,EAAA,MAAM,GAAA,GAAMG,UAAAA,CAAU,EAAE,IAAA,EAAM,QAAQ,CAAA;AACtC,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,OAAOD,WAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,GAAS,GAAG,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;AA6BO,SAAS,iBAAA,CAAkB,EAAE,OAAA,EAAS,IAAA,EAAK,EAA+C;AAC/F,EAAA,IAAI,IAAA,CAAK,SAAS,kBAAA,EAAoB;AACpC,IAAA,MAAM,cAAc,mBAAA,CAAoB;AAAA,MACtC,MAAA,EAAQ,CAAA,0CAAA,EAA6C,kBAAkB,CAAA,YAAA,EAAe,KAAK,MAAM,CAAA;AAAA,KAClG,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,yBAAA,EAA2B,4BAA4B,WAAW,CAAA;AAC/F,EAAA,MAAM,IAAA,GAAOF,SAAAA,CAAU,SAAA,CAAU,SAAS,CAAA;AAG1C,EAAA,MAAM,aAAa,IAAA,CAAK,KAAA;AAAA,IACtB,0BAAA;AAAA,IACA,0BAAA,GAA6B;AAAA,GAC/B;AACA,EAAA,MAAM,KAAA,GAAQA,SAAAA,CAAU,SAAA,CAAU,UAAU,CAAA;AAG5C,EAAA,MAAM,SAASE,UAAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,6BAA6B,CAAA;AAGtE,EAAA,MAAM,WAAWE,kBAAAA,CAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,+BAA+B,CAAA;AAGlF,EAAA,MAAM,UAAA,GAAa,KAAK,0BAA0B,CAAA;AAClD,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,MAAM,cAAc,mBAAA,CAAoB,EAAE,QAAQ,CAAA,uBAAA,EAA0B,UAAU,IAAI,CAAA;AAAA,EAC5F;AACA,EAAA,MAAM,KAAA,GAAQ,UAAA;AAGd,EAAA,IAAI,KAAA,KAAA,CAAA,sBAA2C;AAC7C,IAAA,MAAM,cAAc,qBAAA,CAAsB,EAAE,SAAS,OAAA,CAAQ,QAAA,IAAY,CAAA;AAAA,EAC3E;AAGA,EAAA,MAAM,WAAW,cAAA,CAAe,EAAE,IAAA,EAAM,MAAA,EAAQ,gCAAgC,CAAA;AAGhF,EAAA,MAAM,kBAAkBF,UAAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,uCAAuC,CAAA;AAGzF,EAAA,MAAM,iBAAiBE,kBAAAA,CAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,sCAAsC,CAAA;AAE/F,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;ACvIA,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAO,EAAiD;AACjF,EAAA,OAAO,KAAK,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA;AAC7C;AAKA,SAASD,UAAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAO,EAAiD;AACjF,EAAA,OAAA,CACG,KAAK,MAAM,CAAA,GACT,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA,GACpB,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA,GACpB,KAAK,MAAA,GAAS,CAAC,KAAK,EAAA,MACvB,CAAA;AAEJ;AAKA,SAASC,kBAAAA,CAAkB;AAAA,EACzB,IAAA;AAAA,EACA;AACF,CAAA,EAA2D;AACzD,EAAA,MAAM,GAAA,GAAMD,UAAAA,CAAU,EAAE,IAAA,EAAM,QAAQ,CAAA;AACtC,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG,MAAA,GAAS,IAAI,WAAW,CAAA;AACnE,IAAA,OAAOH,SAAAA,CAAU,UAAU,WAAW,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,IAAA;AACT;AASA,SAAS,wBAAA,CAAyB;AAAA,EAChC,IAAA;AAAA,EACA;AACF,CAAA,EAA2D;AACzD,EAAA,IAAI,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ;AAC5B,IAAA,MAAM,aAAA,CAAc,eAAA,CAAgB,EAAE,MAAA,EAAQ,4CAA4C,CAAA;AAAA,EAC5F;AAEA,EAAA,MAAM,MAAA,GAASG,UAAAA,CAAU,EAAE,IAAA,EAAM,QAAQ,CAAA;AAEzC,EAAA,IAAI,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ;AACrC,IAAA,MAAM,cAAc,eAAA,CAAgB;AAAA,MAClC,MAAA,EAAQ,CAAA,wCAAA,EAA2C,MAAM,CAAA,iBAAA,EAAoB,SAAS,CAAC,CAAA;AAAA,KACxF,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG,MAAA,GAAS,IAAI,MAAM,CAAA;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,EAAY,CAAE,OAAO,WAAW,CAAA;AAChD,IAAA,OAAO,CAAC,GAAA,EAAK,CAAA,GAAI,MAAM,CAAA;AAAA,EACzB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,cAAc,eAAA,CAAgB;AAAA,MAClC,MAAA,EAAQ,kCAAkC,MAAM,CAAA;AAAA,KACjD,CAAA;AAAA,EACH;AACF;AAQA,SAAS,eAAA,CAAgB;AAAA,EACvB,IAAA;AAAA,EACA;AACF,CAAA,EAGmB;AACjB,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,IAAI,MAAA,GAAS,gBAAA;AAEb,EAAA,OAAO,MAAA,GAAS,aAAA,GAAgB,eAAA,IAAmB,IAAA,CAAK,MAAA,EAAQ;AAC9D,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,EAAE,IAAA,EAAM,QAAQ,CAAA;AACvC,IAAA,MAAM,SAAS,SAAA,CAAU,EAAE,MAAM,MAAA,EAAQ,MAAA,GAAS,eAAe,CAAA;AAGjE,IAAA,IAAI,IAAA,KAAS,CAAA,IAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,SAAS,aAAA,GAAgB,eAAA;AAC3C,IAAA,MAAM,UAAU,SAAA,GAAY,MAAA;AAE5B,IAAA,IAAI,OAAA,GAAU,KAAK,MAAA,EAAQ;AACzB,MAAA,MAAM,cAAc,gBAAA,CAAiB;AAAA,QACnC,MAAA,EAAQ,CAAA,2CAAA,EAA8C,IAAI,CAAA,SAAA,EAAY,MAAM,CAAA;AAAA,OAC7E,CAAA;AAAA,IACH;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,IAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,OAAO;AAAA,KACpC,CAAA;AAED,IAAA,MAAA,GAAS,OAAA;AAAA,EACX;AAEA,EAAA,OAAO,UAAA;AACT;AASA,SAAS,oBAAA,CAAqB,EAAE,IAAA,EAAK,EAAmD;AACtF,EAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AACpB,IAAA,MAAM,cAAc,gBAAA,CAAiB;AAAA,MACnC,MAAA,EAAQ,CAAA,kDAAA,EAAqD,IAAA,CAAK,MAAM,CAAA;AAAA,KACzE,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,YAAYC,kBAAAA,CAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAG,CAAA;AACvD,EAAA,MAAM,kBAAkBA,kBAAAA,CAAkB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAE9D,EAAA,OAAO,EAAE,WAAW,eAAA,EAAgB;AACtC;AAaA,SAAS,2BAAA,CAA4B;AAAA,EACnC,IAAA;AAAA,EACA;AACF,CAAA,EAGkB;AAChB,EAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AACpB,IAAA,MAAM,cAAc,eAAA,CAAgB;AAAA,MAClC,MAAA,EAAQ,CAAA,yDAAA,EAA4D,IAAA,CAAK,MAAM,CAAA;AAAA,KAChF,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,MAAA,GAAS,CAAA;AAGb,EAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,SAAS,WAAW,CAAA;AACpE,EAAA,MAAM,eAAA,GAAkB,oBAAA,CAAqB,KAAA,CAAM,CAAA,CAAA,KAAK,MAAM,CAAC,CAAA;AAC/D,EAAA,MAAM,eAAA,GAAkB,eAAA,GAAkB,IAAA,GAAOJ,SAAAA,CAAU,UAAU,oBAAoB,CAAA;AACzF,EAAA,MAAA,IAAU,WAAA;AAGV,EAAA,MAAA,IAAU,WAAA;AAGV,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAI,yBAAyB,EAAE,IAAA,EAAM,QAAQ,CAAA;AACjE,EAAA,MAAA,IAAU,OAAA;AAGV,EAAA,MAAM,CAAC,QAAQ,SAAS,CAAA,GAAI,yBAAyB,EAAE,IAAA,EAAM,QAAQ,CAAA;AACrE,EAAA,MAAA,IAAU,SAAA;AAGV,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAI,yBAAyB,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC/D,EAAA,MAAA,IAAU,MAAA;AAGV,EAAA,MAAM,qBAA8C,EAAC;AAErD,EAAA,IAAI,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,MAAA,EAAQ;AAC7B,IAAA,MAAM,UAAA,GAAaG,UAAAA,CAAU,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC7C,IAAA,MAAA,IAAU,CAAA;AAEV,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,cAAc,MAAA,GAAS,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAC3D,MAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAI,yBAAyB,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC/D,MAAA,MAAA,IAAU,MAAA;AAEV,MAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAI,yBAAyB,EAAE,IAAA,EAAM,QAAQ,CAAA;AACnE,MAAA,MAAA,IAAU,QAAA;AAEV,MAAA,kBAAA,CAAmB,IAAA,CAAK,CAAC,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAmCO,SAAS,kBAAA,CAAmB;AAAA,EACjC,IAAA;AAAA,EACA;AACF,CAAA,EAAoD;AAElD,EAAA,IAAI,IAAA,CAAK,UAAU,SAAA,EAAW;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,KAAK,SAAS,CAAA;AAClC,EAAA,IAAI,WAAA,KAAA,CAAA,aAAkC;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,aAAa,eAAA,CAAgB,EAAE,IAAA,EAAM,gBAAA,EAAkB,wBAAwB,CAAA;AAGrF,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,IAAA,CAAK,CAAA,GAAA,KAAO,IAAI,IAAA,KAAA,EAAA,qBAAoC;AAEnF,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,4BAA4B,EAAE,IAAA,EAAM,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AACrE;AAgBO,SAAS,6BAAA,CAA8B;AAAA,EAC5C;AACF,CAAA,EAA0E;AACxE,EAAA,IAAI,IAAA,CAAK,UAAU,SAAA,EAAW;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,KAAK,SAAS,CAAA;AAClC,EAAA,IAAI,WAAA,KAAA,CAAA,aAAkC;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAa,eAAA,CAAgB,EAAE,IAAA,EAAM,gBAAA,EAAkB,wBAAwB,CAAA;AACrF,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,IAAA,CAAK,CAAA,GAAA,KAAO,IAAI,IAAA,KAAA,EAAA,uBAAsC;AAEpF,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,oBAAA,CAAqB,EAAE,IAAA,EAAM,UAAA,CAAW,MAAM,CAAA;AACvD;AAgBO,SAAS,iBAAA,CAAkB,EAAE,IAAA,EAAK,EAA6C;AACpF,EAAA,IAAI,IAAA,CAAK,UAAU,SAAA,EAAW;AAC5B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,WAAA,GAAc,KAAK,SAAS,CAAA;AAClC,EAAA,IAAI,WAAA,KAAA,CAAA,aAAkC;AACpC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,eAAA,CAAgB,EAAE,IAAA,EAAM,gBAAA,EAAkB,wBAAwB,CAAA;AAC3E;;;ACjVA,SAAS,kBAAkB,IAAA,EAAyC;AACnE,EAAA,IAAI,IAAA,YAAgB,YAAY,OAAO,IAAA;AACvC,EAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AACtB,EAAA,MAAM,SAAA,GAAY,KAAK,OAAO,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,SAAA,CAAU,MAAM,CAAA;AAC7C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,SAAA,CAAU,UAAA,CAAW,CAAC,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,KAAA;AACR;AAiDO,IAAM,iBAAN,MAAqB;AAAA,EACT,MAAA;AAAA,EACA,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,WAAA,CAAY;AAAA,IACV,MAAA;AAAA,IACA,SAAA,GAAYH,SAAAA,CAAU,UAAA,CAAW,qBAAqB;AAAA,GACxD,EAA0B;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,WAAA,CAAY,EAAE,IAAA,EAAK,EAA2C;AAClE,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,IAAI,CAAA;AAEzD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,cAAc,YAAA,CAAa,EAAE,SAAS,IAAA,CAAK,QAAA,IAAY,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,gBAAA,CAAiB,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,iBAAA,CAAkB,WAAA,CAAY,IAAI,CAAA,EAAG,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,gBAAA,CAAiB,EAAE,IAAA,EAAK,EAAuD;AACnF,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,IAAI,CAAA;AAEzD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,cAAc,YAAA,CAAa,EAAE,SAAS,IAAA,CAAK,QAAA,IAAY,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,kBAAA,CAAmB,EAAE,IAAA,EAAM,IAAA,EAAM,kBAAkB,WAAA,CAAY,IAAI,GAAG,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,mBAAA,CAAoB;AAAA,IACxB;AAAA,GACF,EAE8B;AAC5B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,YAAY,CAAA;AAEjE,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,cAAc,oBAAA,CAAqB,EAAE,SAAS,YAAA,CAAa,QAAA,IAAY,CAAA;AAAA,IAC/E;AAEA,IAAA,OAAO,iBAAA,CAAkB,EAAE,OAAA,EAAS,YAAA,EAAc,MAAM,iBAAA,CAAkB,WAAA,CAAY,IAAI,CAAA,EAAG,CAAA;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,UAAA,CAAW,EAAE,MAAA,EAAQ,MAAK,EAA4D;AAC1F,IAAA,MAAM,GAAA,GAAM,8BAA8B,EAAE,MAAA,EAAQ,MAAM,SAAA,EAAW,IAAA,CAAK,WAAW,CAAA;AACrF,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,GAAG,CAAA;AAExD,IAAA,IAAI,CAAC,WAAA,EAAa;AAEhB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,EAAE,OAAA,EAAS,GAAA,EAAK,MAAM,iBAAA,CAAkB,WAAA,CAAY,IAAI,CAAA,EAAG,CAAA;AAClG,IAAA,OAAO,YAAA,CAAa,MAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,yBAAA,CAA0B;AAAA,IACxB,MAAA;AAAA,IACA;AAAA,GACF,EAGwB;AACtB,IAAA,OAAO,2BAA2B,EAAE,MAAA,EAAQ,MAAM,SAAA,EAAW,IAAA,CAAK,WAAW,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAA,CAAU,EAAE,MAAA,EAAQ,MAAK,EAA6D;AAC1F,IAAA,MAAM,GAAA,GAAM,8BAA8B,EAAE,MAAA,EAAQ,MAAM,SAAA,EAAW,IAAA,CAAK,WAAW,CAAA;AACrF,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,GAAG,CAAA;AACxD,IAAA,OAAO,WAAA,KAAgB,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,2BAA2B,MAAA,EAAgD;AAC/E,IAAA,MAAM,EAAE,QAAQ,WAAA,EAAa,IAAA,EAAM,QAAQ,QAAA,EAAU,oBAAA,GAAuB,MAAK,GAAI,MAAA;AAErF,IAAA,MAAM,eAA8B,EAAC;AAGrC,IAAA,MAAM,YAAY,6BAAA,CAA8B;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AACD,IAAA,MAAM,iBAAiB,6BAAA,CAA8B;AAAA,MACnD,MAAA,EAAQ,WAAA;AAAA,MACR,IAAA;AAAA,MACA,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAGD,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,WAAA,EAAa,MAAM,CAAA;AACrE,MAAA,IAAI,CAAC,UAAA,EAAY;AAEf,QAAA,YAAA,CAAa,IAAA;AAAA,UACX,iDAAA,CAAkD;AAAA,YAChD,KAAA,EAAO,MAAA;AAAA,YACP,eAAA,EAAiB,cAAA;AAAA,YACjB,KAAA,EAAO,WAAA;AAAA,YACP,IAAA;AAAA,YACA,WAAW,IAAA,CAAK;AAAA,WACjB;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,YAAA,CAAa,IAAA;AAAA,MACX,0BAAA,CAA2B;AAAA,QACzB,MAAA,EAAQ,SAAA;AAAA,QACR,IAAA;AAAA,QACA,WAAA,EAAa,cAAA;AAAA,QACb,SAAA,EAAW,MAAA;AAAA,QACX,MAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAW,IAAA,CAAK;AAAA,OACjB;AAAA,KACH;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmCA,MAAM,yBAAA,CAA0B;AAAA,IAC9B,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,EAImE;AACjE,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,0BAAA,CAA2B,MAAM,CAAA;AAEjE,IAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,MAAA,EAAO,CACvC,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,CACtB,YAAA,CAAa,SAAS,CAAA,CACtB,mBAAA,CAAoB,gBAAgB,CAAA;AAEvC,IAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,MAAA,OAAA,CAAQ,eAAe,EAAE,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,QAAQ,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,MAAM,QAAA,CAAS;AAAA,IACb,MAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF,EAKoB;AAClB,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,yBAAA,CAA0B,EAAE,MAAA,EAAQ,SAAA,EAAW,kBAAkB,CAAA;AACvF,IAAA,MAAM,QAAA,GAAW,MAAM,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA;AACzC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAO,yBAAA,CAA0B,QAAA,CAAS,WAAW,CAAA;AAC/E,IAAA,OAAO,MAAA,CAAO,SAAA;AAAA,EAChB;AACF;AA6BO,SAAS,oBAAA,CAAqB;AAAA,EACnC,MAAA;AAAA,EACA;AACF,CAAA,EAAgD;AAC9C,EAAA,OAAO,IAAI,cAAA,CAAe,EAAE,MAAA,EAAQ,WAAW,CAAA;AACjD","file":"index.mjs","sourcesContent":["// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Constants for SPL Token-2022 operations.\n *\n * This module defines program IDs, byte offsets for account parsing,\n * and instruction discriminators for the Token-2022 program.\n */\n\n// =============================================================================\n// Program IDs (Canonical Solana/Rialo Addresses)\n// =============================================================================\n\n/** Token-2022 program ID */\nexport const TOKEN_2022_PROGRAM_ID = \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\";\n\n/** Associated Token Account program ID */\nexport const ASSOCIATED_TOKEN_PROGRAM_ID = \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\";\n\n/** Legacy Token program ID (SPL Token) */\nexport const TOKEN_PROGRAM_ID = \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\";\n\n// =============================================================================\n// Account Sizes\n// =============================================================================\n\n/** Size of a Mint account (without extensions) */\nexport const MINT_SIZE = 82;\n\n/** Size of a Token Account (without extensions) */\nexport const TOKEN_ACCOUNT_SIZE = 165;\n\n// =============================================================================\n// Mint Account Offsets (82 bytes total)\n// =============================================================================\n\n/** Byte offset for mint_authority COption<Pubkey> (36 bytes) */\nexport const MINT_AUTHORITY_OFFSET = 0;\n\n/** Byte offset for supply u64 (8 bytes) */\nexport const MINT_SUPPLY_OFFSET = 36;\n\n/** Byte offset for decimals u8 (1 byte) */\nexport const MINT_DECIMALS_OFFSET = 44;\n\n/** Byte offset for is_initialized bool (1 byte) */\nexport const MINT_IS_INITIALIZED_OFFSET = 45;\n\n/** Byte offset for freeze_authority COption<Pubkey> (36 bytes) */\nexport const MINT_FREEZE_AUTHORITY_OFFSET = 46;\n\n// =============================================================================\n// Token Account Offsets (165 bytes total)\n// =============================================================================\n\n/** Byte offset for mint Pubkey (32 bytes) */\nexport const TOKEN_ACCOUNT_MINT_OFFSET = 0;\n\n/** Byte offset for owner Pubkey (32 bytes) */\nexport const TOKEN_ACCOUNT_OWNER_OFFSET = 32;\n\n/** Byte offset for amount u64 (8 bytes) */\nexport const TOKEN_ACCOUNT_AMOUNT_OFFSET = 64;\n\n/** Byte offset for delegate COption<Pubkey> (36 bytes) */\nexport const TOKEN_ACCOUNT_DELEGATE_OFFSET = 72;\n\n/** Byte offset for state u8 (1 byte) */\nexport const TOKEN_ACCOUNT_STATE_OFFSET = 108;\n\n/** Byte offset for is_native COption<u64> (12 bytes) */\nexport const TOKEN_ACCOUNT_IS_NATIVE_OFFSET = 109;\n\n/** Byte offset for delegated_amount u64 (8 bytes) */\nexport const TOKEN_ACCOUNT_DELEGATED_AMOUNT_OFFSET = 121;\n\n/** Byte offset for close_authority COption<Pubkey> (36 bytes) */\nexport const TOKEN_ACCOUNT_CLOSE_AUTHORITY_OFFSET = 129;\n\n// =============================================================================\n// COption Format\n// =============================================================================\n\n/** Size of COption tag (4-byte LE u32) */\nexport const COPTION_TAG_SIZE = 4;\n\n/** COption tag value for None */\nexport const COPTION_NONE = 0;\n\n/** COption tag value for Some */\nexport const COPTION_SOME = 1;\n\n/** Size of Pubkey in bytes */\nexport const PUBKEY_SIZE = 32;\n\n// =============================================================================\n// Token Account State Enum\n// =============================================================================\n\n/**\n * State of a token account.\n */\nexport enum TokenAccountState {\n /** Account is not yet initialized */\n Uninitialized = 0,\n /** Account is initialized and active */\n Initialized = 1,\n /** Account is frozen */\n Frozen = 2,\n}\n\n// =============================================================================\n// Extension Types (TLV format)\n// =============================================================================\n\n/**\n * Extension types for Token-2022 accounts.\n * Extensions start after the base account data with an AccountType byte.\n */\nexport enum ExtensionType {\n /** Uninitialized extension slot */\n Uninitialized = 0,\n /** Transfer fee configuration */\n TransferFeeConfig = 1,\n /** Transfer fee amount tracking */\n TransferFeeAmount = 2,\n /** Mint close authority */\n MintCloseAuthority = 3,\n /** Confidential transfer configuration */\n ConfidentialTransferMint = 4,\n /** Confidential transfer account state */\n ConfidentialTransferAccount = 5,\n /** Default account state */\n DefaultAccountState = 6,\n /** Immutable owner */\n ImmutableOwner = 7,\n /** Memo required on transfer */\n MemoTransfer = 8,\n /** Non-transferable tokens */\n NonTransferable = 9,\n /** Interest-bearing configuration */\n InterestBearingConfig = 10,\n /** CPI guard */\n CpiGuard = 11,\n /** Permanent delegate */\n PermanentDelegate = 12,\n /** Non-transferable account marker */\n NonTransferableAccount = 13,\n /** Transfer hook configuration */\n TransferHook = 14,\n /** Transfer hook account state */\n TransferHookAccount = 15,\n /** Confidential transfer fee configuration */\n ConfidentialTransferFeeConfig = 16,\n /** Confidential transfer fee amount */\n ConfidentialTransferFeeAmount = 17,\n /** Metadata pointer extension */\n MetadataPointer = 18,\n /** Token metadata extension */\n TokenMetadata = 19,\n /** Group pointer extension */\n GroupPointer = 20,\n /** Token group extension */\n TokenGroup = 21,\n /** Group member pointer extension */\n GroupMemberPointer = 22,\n /** Token group member extension */\n TokenGroupMember = 23,\n}\n\n// =============================================================================\n// Account Type (for extensions)\n// =============================================================================\n\n/**\n * Account type byte that precedes extensions.\n */\nexport enum AccountType {\n /** Account is uninitialized */\n Uninitialized = 0,\n /** This is a mint account */\n Mint = 1,\n /** This is a token account */\n Account = 2,\n}\n\n// =============================================================================\n// Instruction Discriminators\n// =============================================================================\n\n/**\n * SPL Token instruction discriminators.\n */\nexport enum TokenInstruction {\n /** Initialize a new mint */\n InitializeMint = 0,\n /** Initialize a new token account */\n InitializeAccount = 1,\n /** Initialize a multisig */\n InitializeMultisig = 2,\n /** Transfer tokens (deprecated, use TransferChecked) */\n Transfer = 3,\n /** Approve a delegate */\n Approve = 4,\n /** Revoke a delegate */\n Revoke = 5,\n /** Set a new authority */\n SetAuthority = 6,\n /** Mint new tokens */\n MintTo = 7,\n /** Burn tokens */\n Burn = 8,\n /** Close a token account */\n CloseAccount = 9,\n /** Freeze a token account */\n FreezeAccount = 10,\n /** Thaw a frozen account */\n ThawAccount = 11,\n /** Transfer tokens with decimals check */\n TransferChecked = 12,\n /** Approve with amount check */\n ApproveChecked = 13,\n /** Mint with amount check */\n MintToChecked = 14,\n /** Burn with amount check */\n BurnChecked = 15,\n /** Initialize account with specified owner */\n InitializeAccount2 = 16,\n /** Sync native token balance */\n SyncNative = 17,\n /** Initialize account with rent sysvar */\n InitializeAccount3 = 18,\n /** Initialize multisig with rent sysvar */\n InitializeMultisig2 = 19,\n /** Initialize mint with rent sysvar */\n InitializeMint2 = 20,\n}\n\n// =============================================================================\n// TLV (Type-Length-Value) Constants\n// =============================================================================\n\n/** Size of extension type field in TLV (2 bytes LE u16) */\nexport const TLV_TYPE_SIZE = 2;\n\n/** Size of extension length field in TLV (2 bytes LE u16) */\nexport const TLV_LENGTH_SIZE = 2;\n\n/** Offset where extensions begin in a mint account */\nexport const MINT_EXTENSIONS_OFFSET = MINT_SIZE + 1; // +1 for AccountType byte\n\n/** Offset where extensions begin in a token account */\nexport const TOKEN_ACCOUNT_EXTENSIONS_OFFSET = TOKEN_ACCOUNT_SIZE + 1; // +1 for AccountType byte\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Error handling for SPL Token operations.\n *\n * This module defines the error types and factory methods for all\n * SPL Token-related operations, following the same pattern as RialoError.\n */\n\n/**\n * Error codes for SPL Token operations.\n */\nexport enum SplTokenErrorCode {\n /** Invalid mint account data */\n INVALID_MINT = \"INVALID_MINT\",\n /** Invalid token account data */\n INVALID_TOKEN_ACCOUNT = \"INVALID_TOKEN_ACCOUNT\",\n /** Token account not found */\n TOKEN_ACCOUNT_NOT_FOUND = \"TOKEN_ACCOUNT_NOT_FOUND\",\n /** Mint account not found */\n MINT_NOT_FOUND = \"MINT_NOT_FOUND\",\n /** Token account is frozen */\n ACCOUNT_FROZEN = \"ACCOUNT_FROZEN\",\n /** Insufficient token balance */\n INSUFFICIENT_BALANCE = \"INSUFFICIENT_BALANCE\",\n /** Invalid extension data */\n INVALID_EXTENSION = \"INVALID_EXTENSION\",\n /** PDA derivation failed */\n PDA_DERIVATION_FAILED = \"PDA_DERIVATION_FAILED\",\n /** Invalid metadata */\n INVALID_METADATA = \"INVALID_METADATA\",\n /** Account not initialized */\n ACCOUNT_NOT_INITIALIZED = \"ACCOUNT_NOT_INITIALIZED\",\n}\n\n/**\n * Constructor options for SplTokenError.\n */\nexport interface SplTokenErrorOptions {\n code: SplTokenErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Error class for SPL Token operations.\n *\n * Provides structured error handling with error codes and optional details.\n * Use the static factory methods for consistent error creation.\n *\n * @example\n * ```typescript\n * // Create errors using factory methods\n * throw SplTokenError.invalidMint({ reason: \"Account data too short\" });\n * throw SplTokenError.tokenAccountNotFound({ address: \"5ZqB9U...\" });\n * throw SplTokenError.insufficientBalance({ required: 1000n, available: 500n });\n *\n * // Handle errors with type information\n * try {\n * await client.getBalance({ wallet, mint });\n * } catch (error) {\n * if (error instanceof SplTokenError && error.code === SplTokenErrorCode.TOKEN_ACCOUNT_NOT_FOUND) {\n * console.log(\"Token account does not exist\");\n * }\n * }\n * ```\n */\nexport class SplTokenError extends Error {\n public readonly code: SplTokenErrorCode;\n public readonly details?: Record<string, unknown>;\n\n public constructor({ code, message, details }: SplTokenErrorOptions) {\n super(message);\n this.name = \"SplTokenError\";\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SplTokenError);\n }\n }\n\n /**\n * Creates an invalid mint error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidMint({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_MINT,\n message: `Invalid mint: ${reason}`,\n });\n }\n\n /**\n * Creates an invalid token account error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidTokenAccount({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_TOKEN_ACCOUNT,\n message: `Invalid token account: ${reason}`,\n });\n }\n\n /**\n * Creates a token account not found error.\n *\n * @param options - Error options containing the address\n */\n public static tokenAccountNotFound({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.TOKEN_ACCOUNT_NOT_FOUND,\n message: `Token account not found: ${address}`,\n details: { address },\n });\n }\n\n /**\n * Creates a mint not found error.\n *\n * @param options - Error options containing the address\n */\n public static mintNotFound({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.MINT_NOT_FOUND,\n message: `Mint not found: ${address}`,\n details: { address },\n });\n }\n\n /**\n * Creates an account frozen error.\n *\n * @param options - Error options containing the address\n */\n public static accountFrozen({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.ACCOUNT_FROZEN,\n message: `Token account is frozen: ${address}`,\n details: { address },\n });\n }\n\n /**\n * Creates an insufficient balance error.\n *\n * @param options - Error options containing required and available amounts\n */\n public static insufficientBalance({\n required,\n available,\n }: {\n required: bigint;\n available: bigint;\n }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INSUFFICIENT_BALANCE,\n message: `Insufficient balance: required ${required}, available ${available}`,\n details: { required: required.toString(), available: available.toString() },\n });\n }\n\n /**\n * Creates an invalid extension error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidExtension({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_EXTENSION,\n message: `Invalid extension: ${reason}`,\n });\n }\n\n /**\n * Creates a PDA derivation failed error.\n *\n * @param options - Error options containing the reason\n */\n public static pdaDerivationFailed({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.PDA_DERIVATION_FAILED,\n message: `PDA derivation failed: ${reason}`,\n });\n }\n\n /**\n * Creates an invalid metadata error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidMetadata({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_METADATA,\n message: `Invalid metadata: ${reason}`,\n });\n }\n\n /**\n * Creates an account not initialized error.\n *\n * @param options - Error options containing the address\n */\n public static accountNotInitialized({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.ACCOUNT_NOT_INITIALIZED,\n message: `Account not initialized: ${address}`,\n details: { address },\n });\n }\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Create Associated Token Account instruction for SPL Token-2022.\n *\n * Creates an Associated Token Account (ATA) for a wallet and mint combination.\n */\n\nimport { PublicKey, SYSTEM_PROGRAM_ID } from \"@rialo/ts-cdk\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from \"../constants\";\nimport type { Instruction } from \"./transfer\";\n\n/**\n * Options for creating an Associated Token Account instruction.\n */\nexport interface CreateAssociatedTokenAccountInstructionOptions {\n /** Account paying for the new account's rent */\n payer: PublicKey;\n /** The ATA address (derived via findAssociatedTokenAddress) */\n associatedToken: PublicKey;\n /** The wallet that will own the new token account */\n owner: PublicKey;\n /** The token mint */\n mint: PublicKey;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates an instruction to create an Associated Token Account.\n *\n * The ATA is a PDA derived from the wallet, token program, and mint.\n * This instruction will create the account if it doesn't exist.\n *\n * Note: This instruction has no data - all information is in the accounts.\n *\n * @param options - Options for the instruction\n * @returns The CreateAssociatedTokenAccount instruction\n *\n * @example\n * ```typescript\n * const { address: ata } = findAssociatedTokenAddress({ wallet: walletPubkey, mint: mintPubkey });\n *\n * const instruction = createAssociatedTokenAccountInstruction({\n * payer: payerPubkey,\n * associatedToken: ata,\n * owner: walletPubkey,\n * mint: mintPubkey,\n * });\n *\n * const tx = TransactionBuilder.create()\n * .setPayer(payerPubkey)\n * .addInstruction(instruction)\n * .build();\n * ```\n */\nexport function createAssociatedTokenAccountInstruction({\n payer,\n associatedToken,\n owner,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: CreateAssociatedTokenAccountInstructionOptions): Instruction {\n const associatedTokenProgramId = PublicKey.fromString(ASSOCIATED_TOKEN_PROGRAM_ID);\n const systemProgramId = PublicKey.fromString(SYSTEM_PROGRAM_ID);\n\n // Account order for CreateAssociatedTokenAccount:\n // 0. [writable, signer] Funding account (payer)\n // 1. [writable] Associated token account address (to be created)\n // 2. [] Wallet address (owner of the new account)\n // 3. [] Token mint\n // 4. [] System program\n // 5. [] Token program\n\n return {\n programId: associatedTokenProgramId,\n accounts: [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: associatedToken, isSigner: false, isWritable: true },\n { pubkey: owner, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: systemProgramId, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ],\n // CreateAssociatedTokenAccount has no instruction data\n data: new Uint8Array(0),\n };\n}\n\n/**\n * Options for creating an idempotent Associated Token Account instruction.\n */\nexport interface CreateAssociatedTokenAccountIdempotentInstructionOptions {\n /** Account paying for the new account's rent */\n payer: PublicKey;\n /** The ATA address (derived via findAssociatedTokenAddress) */\n associatedToken: PublicKey;\n /** The wallet that will own the new token account */\n owner: PublicKey;\n /** The token mint */\n mint: PublicKey;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates an instruction to create an Associated Token Account idempotently.\n *\n * This variant will succeed even if the ATA already exists, making it safe\n * to call without checking if the account exists first.\n *\n * @param options - Options for the instruction\n * @returns The CreateAssociatedTokenAccountIdempotent instruction\n *\n * @example\n * ```typescript\n * // Safe to call even if ATA already exists\n * const instruction = createAssociatedTokenAccountIdempotentInstruction({\n * payer: payerPubkey,\n * associatedToken: ata,\n * owner: walletPubkey,\n * mint: mintPubkey,\n * });\n * ```\n */\nexport function createAssociatedTokenAccountIdempotentInstruction({\n payer,\n associatedToken,\n owner,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: CreateAssociatedTokenAccountIdempotentInstructionOptions): Instruction {\n const associatedTokenProgramId = PublicKey.fromString(ASSOCIATED_TOKEN_PROGRAM_ID);\n const systemProgramId = PublicKey.fromString(SYSTEM_PROGRAM_ID);\n\n return {\n programId: associatedTokenProgramId,\n accounts: [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: associatedToken, isSigner: false, isWritable: true },\n { pubkey: owner, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: systemProgramId, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ],\n // Idempotent variant uses instruction discriminator 1\n data: new Uint8Array([1]),\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function writeU16LE({\n data,\n offset,\n value,\n}: { data: Uint8Array; offset: number; value: number }): void {\n data[offset] = value & 0xff;\n data[offset + 1] = (value >> 8) & 0xff;\n}\n\nexport function writeU32LE({\n data,\n offset,\n value,\n}: { data: Uint8Array; offset: number; value: number }): void {\n data[offset] = value & 0xff;\n data[offset + 1] = (value >> 8) & 0xff;\n data[offset + 2] = (value >> 16) & 0xff;\n data[offset + 3] = (value >> 24) & 0xff;\n}\n\nexport function writeU64LE({\n data,\n offset,\n value,\n}: { data: Uint8Array; offset: number; value: bigint }): void {\n for (let i = 0; i < 8; i++) {\n data[offset + i] = Number((value >> BigInt(i * 8)) & 0xffn);\n }\n}\n\nexport function writeLengthPrefixedString({\n data,\n offset,\n str,\n}: { data: Uint8Array; offset: number; str: string }): number {\n const encoded = new TextEncoder().encode(str);\n writeU32LE({ data, offset, value: encoded.length });\n data.set(encoded, offset + 4);\n return 4 + encoded.length;\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\nimport { writeU64LE } from \"../test-helpers\";\nimport type { Instruction } from \"./transfer\";\n\n/**\n * Options for creating an InitializeMint2 instruction.\n *\n * InitializeMint2 does not require a rent sysvar account, but does require\n * the tombstone PDA derived from [\"mint_tombstone\", mint_pubkey].\n */\nexport interface InitializeMintInstructionOptions {\n\t/** Mint account to initialize */\n\tmint: PublicKey;\n\t/** Number of decimals for the mint */\n\tdecimals: number;\n\t/** Authority allowed to mint new tokens */\n\tmintAuthority: PublicKey;\n\t/** Optional freeze authority for the mint */\n\tfreezeAuthority?: PublicKey;\n\t/** Token program ID (defaults to Token-2022) */\n\tprogramId?: PublicKey;\n}\n\n/**\n * Creates an InitializeMint2 instruction for Token-2022.\n *\n * Instruction data format:\n * [discriminator(1), decimals(1), mint_authority(32), freeze_option(1), freeze_authority(32)]\n *\n * Accounts:\n * - mint (writable)\n * - tombstone_pda (readonly)\n *\n * @param options - Options for the instruction\n * @returns The InitializeMint2 instruction\n *\n * @example\n * ```typescript\n * const instruction = initializeMintInstruction({\n * mint,\n * decimals: 6,\n * mintAuthority,\n * freezeAuthority,\n * });\n * ```\n */\nexport function initializeMintInstruction({\n\tmint,\n\tdecimals,\n\tmintAuthority,\n\tfreezeAuthority,\n\tprogramId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: InitializeMintInstructionOptions): Instruction {\n\t// SPL Token uses 1-byte discriminator: [discriminator(1), decimals(1), mint_authority(32), freeze_option(1), freeze_authority(32)]\n\tconst data = new Uint8Array(67);\n\n\tdata[0] = TokenInstruction.InitializeMint2; // 20\n\tdata[1] = decimals;\n\tdata.set(mintAuthority.toBytes(), 2);\n\n\tif (freezeAuthority) {\n\t\tdata[34] = 1; // COption::Some\n\t\tdata.set(freezeAuthority.toBytes(), 35);\n\t} else {\n\t\tdata[34] = 0; // COption::None\n\t\t// bytes 35-66 remain zeroed\n\t}\n\n\t// Derive tombstone PDA: seeds = [\"mint_tombstone\", mint_pubkey]\n\tconst [tombstonePda] = PublicKey.findProgramAddress(\n\t\t[\"mint_tombstone\", mint.toBytes()],\n\t\tprogramId,\n\t);\n\n\treturn {\n\t\tprogramId,\n\t\taccounts: [\n\t\t\t{ pubkey: mint, isSigner: false, isWritable: true },\n\t\t\t{ pubkey: tombstonePda, isSigner: false, isWritable: false },\n\t\t],\n\t\tdata,\n\t};\n}\n\n/**\n * Options for creating a MintTo instruction.\n */\nexport interface MintToInstructionOptions {\n\t/** Mint account to mint tokens from */\n\tmint: PublicKey;\n\t/** Destination token account to receive minted tokens */\n\tdestination: PublicKey;\n\t/** Mint authority (signer) */\n\tauthority: PublicKey;\n\t/** Amount to mint in smallest units */\n\tamount: bigint;\n\t/** Token program ID (defaults to Token-2022) */\n\tprogramId?: PublicKey;\n}\n\n/**\n * Creates a MintTo instruction for Token-2022.\n *\n * Instruction data format: [discriminator(1), amount(8 LE)]\n *\n * Accounts:\n * - mint (writable)\n * - destination (writable)\n * - authority (signer)\n *\n * @param options - Options for the instruction\n * @returns The MintTo instruction\n *\n * @example\n * ```typescript\n * const instruction = mintToInstruction({\n * mint,\n * destination,\n * authority,\n * amount: 1_000_000n,\n * });\n * ```\n */\nexport function mintToInstruction({\n\tmint,\n\tdestination,\n\tauthority,\n\tamount,\n\tprogramId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: MintToInstructionOptions): Instruction {\n\tconst data = new Uint8Array(9);\n\tdata[0] = TokenInstruction.MintTo; // 7\n\twriteU64LE({ data, offset: 1, value: amount });\n\n\treturn {\n\t\tprogramId,\n\t\taccounts: [\n\t\t\t{ pubkey: mint, isSigner: false, isWritable: true },\n\t\t\t{ pubkey: destination, isSigner: false, isWritable: true },\n\t\t\t{ pubkey: authority, isSigner: true, isWritable: false },\n\t\t],\n\t\tdata,\n\t};\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * TransferChecked instruction for SPL Token-2022.\n *\n * TransferChecked is the preferred transfer instruction as it includes\n * a decimals check to prevent user error.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\n\n/**\n * Account metadata for an instruction account.\n */\nexport interface AccountMeta {\n /** The account's public key */\n pubkey: PublicKey;\n /** Whether this account must sign the transaction */\n isSigner: boolean;\n /** Whether this account's data can be modified */\n isWritable: boolean;\n}\n\n/**\n * A single instruction to be included in a transaction.\n */\nexport interface Instruction {\n /** The program that will process this instruction */\n programId: PublicKey;\n /** Accounts required by this instruction */\n accounts: AccountMeta[];\n /** Instruction data */\n data: Uint8Array;\n}\n\n/**\n * Writes a little-endian u64 to a Uint8Array at the specified offset.\n */\nfunction writeU64LE({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value: bigint;\n}): void {\n for (let i = 0; i < 8; i++) {\n data[offset + i] = Number((value >> BigInt(i * 8)) & 0xffn);\n }\n}\n\n/**\n * Options for creating a TransferChecked instruction.\n */\nexport interface TransferCheckedInstructionOptions {\n /** Source token account (must be owned by authority) */\n source: PublicKey;\n /** The token mint */\n mint: PublicKey;\n /** Destination token account */\n destination: PublicKey;\n /** Owner of the source account (signer) */\n authority: PublicKey;\n /** Amount to transfer in smallest units */\n amount: bigint;\n /** Expected decimals of the mint (for verification) */\n decimals: number;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a TransferChecked instruction.\n *\n * TransferChecked transfers tokens from one token account to another,\n * with a decimals check to prevent accidental transfers of the wrong amount.\n *\n * Instruction data format: [discriminator(1), amount(8 LE), decimals(1)]\n *\n * @param options - Options for the instruction\n * @returns The TransferChecked instruction\n *\n * @example\n * ```typescript\n * const instruction = transferCheckedInstruction({\n * source: sourceTokenAccount,\n * mint: mintPubkey,\n * destination: destinationTokenAccount,\n * authority: walletPubkey,\n * amount: 1000000n, // 1 token with 6 decimals\n * decimals: 6,\n * });\n *\n * const tx = TransactionBuilder.create()\n * .setPayer(walletPubkey)\n * .addInstruction(instruction)\n * .build();\n * ```\n */\nexport function transferCheckedInstruction({\n source,\n mint,\n destination,\n authority,\n amount,\n decimals,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: TransferCheckedInstructionOptions): Instruction {\n // Instruction data: [discriminator(1), amount(8), decimals(1)]\n const data = new Uint8Array(10);\n\n // Write discriminator (TransferChecked = 12)\n data[0] = TokenInstruction.TransferChecked;\n\n // Write amount as little-endian u64\n writeU64LE({ data, offset: 1, value: amount });\n\n // Write decimals\n data[9] = decimals;\n\n return {\n programId,\n accounts: [\n { pubkey: source, isSigner: false, isWritable: true },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: destination, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: true, isWritable: false },\n ],\n data,\n };\n}\n\n/**\n * Options for creating a Transfer instruction.\n */\nexport interface TransferInstructionOptions {\n /** Source token account */\n source: PublicKey;\n /** Destination token account */\n destination: PublicKey;\n /** Owner of the source account (signer) */\n authority: PublicKey;\n /** Amount to transfer in smallest units */\n amount: bigint;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a Transfer instruction (deprecated, prefer TransferChecked).\n *\n * This is the legacy transfer instruction without decimals verification.\n * Use transferCheckedInstruction instead for safety.\n *\n * @param options - Options for the instruction\n * @returns The Transfer instruction\n */\nexport function transferInstruction({\n source,\n destination,\n authority,\n amount,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: TransferInstructionOptions): Instruction {\n // Instruction data: [discriminator(1), amount(8)]\n const data = new Uint8Array(9);\n\n // Write discriminator (Transfer = 3)\n data[0] = TokenInstruction.Transfer;\n\n // Write amount as little-endian u64\n writeU64LE({ data, offset: 1, value: amount });\n\n return {\n programId,\n accounts: [\n { pubkey: source, isSigner: false, isWritable: true },\n { pubkey: destination, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: true, isWritable: false },\n ],\n data,\n };\n}\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number, title: string = ''): void {\n if (!Number.isSafeInteger(n) || n < 0) {\n const prefix = title && `\"${title}\" `;\n throw new Error(`${prefix}expected integer >0, got ${n}`);\n }\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n/** Asserts something is hash */\nexport function ahash(h: CHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash must wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out, undefined, 'digestInto() output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('\"digestInto() output\" expected to be of length >=' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput, errorTitle = ''): Uint8Array {\n if (typeof data === 'string') return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\n/** Merges default options and passed options. */\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options must be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Common interface for all hashes. */\nexport interface Hash<T> {\n blockLen: number; // Bytes per block\n outputLen: number; // Bytes in output\n update(buf: Uint8Array): this;\n digestInto(buf: Uint8Array): void;\n digest(): Uint8Array;\n destroy(): void;\n _cloneInto(to?: T): T;\n clone(): T;\n}\n\n/** PseudoRandom (number) Generator */\nexport interface PRG {\n addEntropy(seed: Uint8Array): void;\n randomBytes(length: number): Uint8Array;\n clean(): void;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash constructor */\nexport type HasherCons<T, Opts = undefined> = Opts extends undefined ? () => T : (opts?: Opts) => T;\n/** Optional hash params. */\nexport type HashInfo = {\n oid?: Uint8Array; // DER encoded OID in bytes\n};\n/** Hash function */\nexport type CHash<T extends Hash<T> = Hash<any>, Opts = undefined> = {\n outputLen: number;\n blockLen: number;\n} & HashInfo &\n (Opts extends undefined\n ? {\n (msg: Uint8Array): Uint8Array;\n create(): T;\n }\n : {\n (msg: Uint8Array, opts?: Opts): Uint8Array;\n create(opts?: Opts): T;\n });\n/** XOF with output */\nexport type CHashXOF<T extends HashXOF<T> = HashXOF<any>, Opts = undefined> = CHash<T, Opts>;\n\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher<T extends Hash<T>, Opts = undefined>(\n hashCons: HasherCons<T, Opts>,\n info: HashInfo = {}\n): CHash<T, Opts> {\n const hashC: any = (msg: Uint8Array, opts?: Opts) => hashCons(opts).update(msg).digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: Opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n const cr = typeof globalThis === 'object' ? (globalThis as any).crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n\n/** Creates OID opts for NIST hashes, with prefix 06 09 60 86 48 01 65 03 04 02. */\nexport const oidNist = (suffix: number): Required<HashInfo> => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { abytes, aexists, aoutput, clean, createView, type Hash } from './utils.ts';\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> implements Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Uint8Array): this {\n aexists(this);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen must be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to as unknown as any;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://www.rfc-editor.org/rfc/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, oidNist, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n\n/** Internal 32-byte base SHA2 hash class. */\nabstract class SHA2_32B<T extends SHA2_32B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected abstract A: number;\n protected abstract B: number;\n protected abstract C: number;\n protected abstract D: number;\n protected abstract E: number;\n protected abstract F: number;\n protected abstract G: number;\n protected abstract H: number;\n\n constructor(outputLen: number) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/** Internal SHA2-256 hash class. */\nexport class _SHA256 extends SHA2_32B<_SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n constructor() {\n super(32);\n }\n}\n\n/** Internal SHA2-224 hash class. */\nexport class _SHA224 extends SHA2_32B<_SHA224> {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\n/** Internal 64-byte base SHA2 hash class. */\nabstract class SHA2_64B<T extends SHA2_64B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected abstract Ah: number;\n protected abstract Al: number;\n protected abstract Bh: number;\n protected abstract Bl: number;\n protected abstract Ch: number;\n protected abstract Cl: number;\n protected abstract Dh: number;\n protected abstract Dl: number;\n protected abstract Eh: number;\n protected abstract El: number;\n protected abstract Fh: number;\n protected abstract Fl: number;\n protected abstract Gh: number;\n protected abstract Gl: number;\n protected abstract Hh: number;\n protected abstract Hl: number;\n\n constructor(outputLen: number) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\n/** Internal SHA2-512 hash class. */\nexport class _SHA512 extends SHA2_64B<_SHA512> {\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor() {\n super(64);\n }\n}\n\n/** Internal SHA2-384 hash class. */\nexport class _SHA384 extends SHA2_64B<_SHA384> {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\n/** Internal SHA2-512/224 hash class. */\nexport class _SHA512_224 extends SHA2_64B<_SHA512_224> {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\n/** Internal SHA2-512/256 hash class. */\nexport class _SHA512_256 extends SHA2_64B<_SHA512_256> {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n */\nexport const sha256: CHash<_SHA256> = /* @__PURE__ */ createHasher(\n () => new _SHA256(),\n /* @__PURE__ */ oidNist(0x01)\n);\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash<_SHA224> = /* @__PURE__ */ createHasher(\n () => new _SHA224(),\n /* @__PURE__ */ oidNist(0x04)\n);\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash<_SHA512> = /* @__PURE__ */ createHasher(\n () => new _SHA512(),\n /* @__PURE__ */ oidNist(0x03)\n);\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash<_SHA384> = /* @__PURE__ */ createHasher(\n () => new _SHA384(),\n /* @__PURE__ */ oidNist(0x02)\n);\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash<_SHA512_256> = /* @__PURE__ */ createHasher(\n () => new _SHA512_256(),\n /* @__PURE__ */ oidNist(0x06)\n);\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash<_SHA512_224> = /* @__PURE__ */ createHasher(\n () => new _SHA512_224(),\n /* @__PURE__ */ oidNist(0x05)\n);\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Associated Token Address (ATA) derivation for SPL Token-2022.\n *\n * ATAs are Program Derived Addresses (PDAs) that provide a deterministic\n * token account address for any wallet/mint combination.\n */\n\nimport { sha256 } from \"@noble/hashes/sha2\";\nimport { isOnCurve, PublicKey } from \"@rialo/ts-cdk\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { AtaDerivationResult } from \"../types\";\n\n/**\n * Creates a Program Derived Address (PDA).\n *\n * @param options - Options containing seeds and programId\n * @returns The derived address and bump seed, or null if no valid bump found\n */\nfunction createProgramAddress({\n seeds,\n programId,\n}: {\n seeds: Uint8Array[];\n programId: PublicKey;\n}): { address: PublicKey; bump: number } | null {\n // Try bump values from 255 down to 0\n for (let bump = 255; bump >= 0; bump--) {\n const bumpSeed = new Uint8Array([bump]);\n\n // Concatenate all seeds + bump + program_id + \"ProgramDerivedAddress\"\n const allSeeds = [...seeds, bumpSeed];\n const programIdBytes = programId.toBytes();\n const pda_marker = new TextEncoder().encode(\"ProgramDerivedAddress\");\n\n // Calculate total length\n let totalLength = 0;\n for (const seed of allSeeds) {\n totalLength += seed.length;\n }\n totalLength += programIdBytes.length + pda_marker.length;\n\n // Create combined buffer\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const seed of allSeeds) {\n combined.set(seed, offset);\n offset += seed.length;\n }\n combined.set(programIdBytes, offset);\n offset += programIdBytes.length;\n combined.set(pda_marker, offset);\n\n // Hash\n const hash = sha256(combined);\n\n // Check if result is NOT on curve (valid PDA)\n if (!isOnCurve(hash)) {\n return {\n address: PublicKey.fromBytes(hash),\n bump,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Options for finding an Associated Token Address.\n */\nexport interface FindAssociatedTokenAddressOptions {\n /** The wallet's public key (owner of the token account) */\n wallet: PublicKey;\n /** The token mint's public key */\n mint: PublicKey;\n /** The token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Finds the Associated Token Address for a wallet and mint.\n *\n * The ATA is derived using the following seeds:\n * - wallet address (32 bytes)\n * - token program ID (32 bytes)\n * - mint address (32 bytes)\n *\n * @param options - Options containing wallet, mint, and optional programId\n * @returns The derived ATA address and bump seed\n * @throws {SplTokenError} If PDA derivation fails\n *\n * @example\n * ```typescript\n * const { address, bump } = findAssociatedTokenAddress({ wallet: walletPubkey, mint: mintPubkey });\n * console.log(`ATA: ${address.toString()}`);\n * console.log(`Bump: ${bump}`);\n * ```\n */\nexport function findAssociatedTokenAddress({\n wallet,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: FindAssociatedTokenAddressOptions): AtaDerivationResult {\n const associatedTokenProgramId = PublicKey.fromString(ASSOCIATED_TOKEN_PROGRAM_ID);\n\n // Seeds: [wallet, token_program_id, mint]\n const seeds = [wallet.toBytes(), programId.toBytes(), mint.toBytes()];\n\n const result = createProgramAddress({ seeds, programId: associatedTokenProgramId });\n\n if (!result) {\n throw SplTokenError.pdaDerivationFailed({\n reason: `Could not find valid PDA for wallet=${wallet.toString()}, mint=${mint.toString()}`,\n });\n }\n\n return result;\n}\n\n/**\n * Options for getting the Associated Token Address synchronously.\n */\nexport interface GetAssociatedTokenAddressSyncOptions {\n /** The wallet's public key */\n wallet: PublicKey;\n /** The token mint's public key */\n mint: PublicKey;\n /** The token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Gets the Associated Token Address without the bump seed.\n *\n * Convenience function when you only need the address.\n *\n * @param options - Options containing wallet, mint, and optional programId\n * @returns The derived ATA address\n */\nexport function getAssociatedTokenAddressSync({\n wallet,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: GetAssociatedTokenAddressSyncOptions): PublicKey {\n return findAssociatedTokenAddress({ wallet, mint, programId }).address;\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Mint account parsing for SPL Token-2022.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport {\n COPTION_SOME,\n MINT_DECIMALS_OFFSET,\n MINT_FREEZE_AUTHORITY_OFFSET,\n MINT_IS_INITIALIZED_OFFSET,\n MINT_SIZE,\n MINT_SUPPLY_OFFSET,\n PUBKEY_SIZE,\n} from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { MintInfo } from \"../types\";\n\n/**\n * Reads a little-endian u64 from a Uint8Array at the specified offset.\n */\nfunction readU64LE({ data, offset }: { data: Uint8Array; offset: number }): bigint {\n let value = 0n;\n for (let i = 0; i < 8; i++) {\n value |= BigInt(data[offset + i]) << BigInt(i * 8);\n }\n return value;\n}\n\n/**\n * Reads a little-endian u32 from a Uint8Array at the specified offset.\n */\nfunction readU32LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n return (\n (data[offset] |\n (data[offset + 1] << 8) |\n (data[offset + 2] << 16) |\n (data[offset + 3] << 24)) >>>\n 0\n );\n}\n\n/**\n * Reads a COption<Pubkey> from account data.\n *\n * COption format: 4-byte LE tag (0=None, 1=Some) + 32-byte pubkey if Some\n *\n * @param options - Options containing data and offset\n * @returns The public key if Some, null if None\n */\nfunction readCOptionPubkey({\n data,\n offset,\n}: { data: Uint8Array; offset: number }): PublicKey | null {\n const tag = readU32LE({ data, offset });\n if (tag === COPTION_SOME) {\n const pubkeyBytes = data.slice(offset + 4, offset + 4 + PUBKEY_SIZE);\n return PublicKey.fromBytes(pubkeyBytes);\n }\n return null;\n}\n\n/**\n * Options for parsing a mint account.\n */\nexport interface ParseMintAccountOptions {\n /** The mint account's public key */\n address: PublicKey;\n /** Raw account data bytes (minimum 82 bytes) */\n data: Uint8Array;\n}\n\n/**\n * Parses raw mint account data into a structured MintInfo object.\n *\n * @param options - Options containing address and data\n * @returns Parsed mint information\n * @throws {SplTokenError} If the data is invalid or too short\n *\n * @example\n * ```typescript\n * const accountInfo = await client.getAccountInfo(mintPubkey);\n * if (accountInfo) {\n * const mintInfo = parseMintAccount({ address: mintPubkey, data: accountInfo.data });\n * console.log(`Supply: ${mintInfo.supply}`);\n * console.log(`Decimals: ${mintInfo.decimals}`);\n * }\n * ```\n */\nexport function parseMintAccount({ address, data }: ParseMintAccountOptions): MintInfo {\n if (data.length < MINT_SIZE) {\n throw SplTokenError.invalidMint({\n reason: `Account data too short: expected at least ${MINT_SIZE} bytes, got ${data.length}`,\n });\n }\n\n // Read mint authority (COption<Pubkey> at offset 0)\n const mintAuthority = readCOptionPubkey({ data, offset: 0 });\n\n // Read supply (u64 LE at offset 36)\n const supply = readU64LE({ data, offset: MINT_SUPPLY_OFFSET });\n\n // Read decimals (u8 at offset 44)\n const decimals = data[MINT_DECIMALS_OFFSET];\n\n // Read is_initialized (bool at offset 45)\n const isInitialized = data[MINT_IS_INITIALIZED_OFFSET] !== 0;\n\n // Read freeze authority (COption<Pubkey> at offset 46)\n const freezeAuthority = readCOptionPubkey({ data, offset: MINT_FREEZE_AUTHORITY_OFFSET });\n\n if (!isInitialized) {\n throw SplTokenError.accountNotInitialized({ address: address.toString() });\n }\n\n return {\n address,\n supply,\n decimals,\n isInitialized,\n mintAuthority,\n freezeAuthority,\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Token account parsing for SPL Token-2022.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport {\n COPTION_SOME,\n PUBKEY_SIZE,\n TOKEN_ACCOUNT_AMOUNT_OFFSET,\n TOKEN_ACCOUNT_CLOSE_AUTHORITY_OFFSET,\n TOKEN_ACCOUNT_DELEGATE_OFFSET,\n TOKEN_ACCOUNT_DELEGATED_AMOUNT_OFFSET,\n TOKEN_ACCOUNT_IS_NATIVE_OFFSET,\n TOKEN_ACCOUNT_MINT_OFFSET,\n TOKEN_ACCOUNT_OWNER_OFFSET,\n TOKEN_ACCOUNT_SIZE,\n TOKEN_ACCOUNT_STATE_OFFSET,\n TokenAccountState,\n} from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { TokenAccountInfo } from \"../types\";\n\n/**\n * Reads a little-endian u64 from a Uint8Array at the specified offset.\n */\nfunction readU64LE({ data, offset }: { data: Uint8Array; offset: number }): bigint {\n let value = 0n;\n for (let i = 0; i < 8; i++) {\n value |= BigInt(data[offset + i]) << BigInt(i * 8);\n }\n return value;\n}\n\n/**\n * Reads a little-endian u32 from a Uint8Array at the specified offset.\n */\nfunction readU32LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n return (\n (data[offset] |\n (data[offset + 1] << 8) |\n (data[offset + 2] << 16) |\n (data[offset + 3] << 24)) >>>\n 0\n );\n}\n\n/**\n * Reads a COption<Pubkey> from account data.\n *\n * COption format: 4-byte LE tag (0=None, 1=Some) + 32-byte pubkey if Some\n */\nfunction readCOptionPubkey({\n data,\n offset,\n}: { data: Uint8Array; offset: number }): PublicKey | null {\n const tag = readU32LE({ data, offset });\n if (tag === COPTION_SOME) {\n const pubkeyBytes = data.slice(offset + 4, offset + 4 + PUBKEY_SIZE);\n return PublicKey.fromBytes(pubkeyBytes);\n }\n return null;\n}\n\n/**\n * Reads a COption<u64> from account data.\n *\n * COption format: 4-byte LE tag (0=None, 1=Some) + 8-byte u64 if Some\n */\nfunction readCOptionU64({ data, offset }: { data: Uint8Array; offset: number }): bigint | null {\n const tag = readU32LE({ data, offset });\n if (tag === COPTION_SOME) {\n return readU64LE({ data, offset: offset + 4 });\n }\n return null;\n}\n\n/**\n * Options for parsing a token account.\n */\nexport interface ParseTokenAccountOptions {\n /** The token account's public key */\n address: PublicKey;\n /** Raw account data bytes (minimum 165 bytes) */\n data: Uint8Array;\n}\n\n/**\n * Parses raw token account data into a structured TokenAccountInfo object.\n *\n * @param options - Options containing address and data\n * @returns Parsed token account information\n * @throws {SplTokenError} If the data is invalid or too short\n *\n * @example\n * ```typescript\n * const accountInfo = await client.getAccountInfo(tokenAccountPubkey);\n * if (accountInfo) {\n * const tokenAccount = parseTokenAccount({ address: tokenAccountPubkey, data: accountInfo.data });\n * console.log(`Balance: ${tokenAccount.amount}`);\n * console.log(`Owner: ${tokenAccount.owner.toString()}`);\n * }\n * ```\n */\nexport function parseTokenAccount({ address, data }: ParseTokenAccountOptions): TokenAccountInfo {\n if (data.length < TOKEN_ACCOUNT_SIZE) {\n throw SplTokenError.invalidTokenAccount({\n reason: `Account data too short: expected at least ${TOKEN_ACCOUNT_SIZE} bytes, got ${data.length}`,\n });\n }\n\n // Read mint (Pubkey at offset 0)\n const mintBytes = data.slice(TOKEN_ACCOUNT_MINT_OFFSET, TOKEN_ACCOUNT_MINT_OFFSET + PUBKEY_SIZE);\n const mint = PublicKey.fromBytes(mintBytes);\n\n // Read owner (Pubkey at offset 32)\n const ownerBytes = data.slice(\n TOKEN_ACCOUNT_OWNER_OFFSET,\n TOKEN_ACCOUNT_OWNER_OFFSET + PUBKEY_SIZE,\n );\n const owner = PublicKey.fromBytes(ownerBytes);\n\n // Read amount (u64 LE at offset 64)\n const amount = readU64LE({ data, offset: TOKEN_ACCOUNT_AMOUNT_OFFSET });\n\n // Read delegate (COption<Pubkey> at offset 72)\n const delegate = readCOptionPubkey({ data, offset: TOKEN_ACCOUNT_DELEGATE_OFFSET });\n\n // Read state (u8 at offset 108)\n const stateValue = data[TOKEN_ACCOUNT_STATE_OFFSET];\n if (stateValue > 2) {\n throw SplTokenError.invalidTokenAccount({ reason: `Invalid account state: ${stateValue}` });\n }\n const state = stateValue as TokenAccountState;\n\n // Check if account is initialized\n if (state === TokenAccountState.Uninitialized) {\n throw SplTokenError.accountNotInitialized({ address: address.toString() });\n }\n\n // Read is_native (COption<u64> at offset 109)\n const isNative = readCOptionU64({ data, offset: TOKEN_ACCOUNT_IS_NATIVE_OFFSET });\n\n // Read delegated_amount (u64 LE at offset 121)\n const delegatedAmount = readU64LE({ data, offset: TOKEN_ACCOUNT_DELEGATED_AMOUNT_OFFSET });\n\n // Read close_authority (COption<Pubkey> at offset 129)\n const closeAuthority = readCOptionPubkey({ data, offset: TOKEN_ACCOUNT_CLOSE_AUTHORITY_OFFSET });\n\n return {\n address,\n mint,\n owner,\n amount,\n delegate,\n state,\n isNative,\n delegatedAmount,\n closeAuthority,\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Token metadata parsing for SPL Token-2022 native metadata extension.\n *\n * This parses the TokenMetadata extension (ExtensionType=19) embedded in\n * Token-2022 mint accounts, not the separate Metaplex Token Metadata program.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport {\n AccountType,\n COPTION_SOME,\n ExtensionType,\n MINT_EXTENSIONS_OFFSET,\n MINT_SIZE,\n PUBKEY_SIZE,\n TLV_LENGTH_SIZE,\n TLV_TYPE_SIZE,\n} from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { MetadataPointerExtension, RawExtension, TokenMetadata } from \"../types\";\n\n/**\n * Reads a little-endian u16 from a Uint8Array at the specified offset.\n */\nfunction readU16LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n return data[offset] | (data[offset + 1] << 8);\n}\n\n/**\n * Reads a little-endian u32 from a Uint8Array at the specified offset.\n */\nfunction readU32LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n return (\n (data[offset] |\n (data[offset + 1] << 8) |\n (data[offset + 2] << 16) |\n (data[offset + 3] << 24)) >>>\n 0\n );\n}\n\n/**\n * Reads a COption<Pubkey> from data.\n */\nfunction readCOptionPubkey({\n data,\n offset,\n}: { data: Uint8Array; offset: number }): PublicKey | null {\n const tag = readU32LE({ data, offset });\n if (tag === COPTION_SOME) {\n const pubkeyBytes = data.slice(offset + 4, offset + 4 + PUBKEY_SIZE);\n return PublicKey.fromBytes(pubkeyBytes);\n }\n return null;\n}\n\n/**\n * Reads a length-prefixed string from data.\n *\n * Format: 4-byte LE length + UTF-8 string bytes\n *\n * @returns Tuple of [string, bytes consumed]\n */\nfunction readLengthPrefixedString({\n data,\n offset,\n}: { data: Uint8Array; offset: number }): [string, number] {\n if (offset + 4 > data.length) {\n throw SplTokenError.invalidMetadata({ reason: \"String length prefix extends beyond data\" });\n }\n\n const length = readU32LE({ data, offset });\n\n if (offset + 4 + length > data.length) {\n throw SplTokenError.invalidMetadata({\n reason: `String data extends beyond buffer: need ${length} bytes at offset ${offset + 4}`,\n });\n }\n\n const stringBytes = data.slice(offset + 4, offset + 4 + length);\n try {\n const str = new TextDecoder().decode(stringBytes);\n return [str, 4 + length];\n } catch (error) {\n throw SplTokenError.invalidMetadata({\n reason: `Invalid UTF-8 string at offset ${offset}`,\n });\n }\n}\n\n/**\n * Parses all TLV extensions from account data.\n *\n * @param options - Options containing data and extensionsOffset\n * @returns Array of raw extensions\n */\nfunction parseExtensions({\n data,\n extensionsOffset,\n}: {\n data: Uint8Array;\n extensionsOffset: number;\n}): RawExtension[] {\n const extensions: RawExtension[] = [];\n let offset = extensionsOffset;\n\n while (offset + TLV_TYPE_SIZE + TLV_LENGTH_SIZE <= data.length) {\n const type = readU16LE({ data, offset });\n const length = readU16LE({ data, offset: offset + TLV_TYPE_SIZE });\n\n // Type 0 with length 0 means end of extensions or padding\n if (type === 0 && length === 0) {\n break;\n }\n\n const dataStart = offset + TLV_TYPE_SIZE + TLV_LENGTH_SIZE;\n const dataEnd = dataStart + length;\n\n if (dataEnd > data.length) {\n throw SplTokenError.invalidExtension({\n reason: `Extension data extends beyond buffer: type=${type}, length=${length}`,\n });\n }\n\n extensions.push({\n type,\n data: data.slice(dataStart, dataEnd),\n });\n\n offset = dataEnd;\n }\n\n return extensions;\n}\n\n/**\n * Parses a MetadataPointer extension.\n *\n * Layout:\n * - COption<Pubkey> authority (36 bytes)\n * - COption<Pubkey> metadata_address (36 bytes)\n */\nfunction parseMetadataPointer({ data }: { data: Uint8Array }): MetadataPointerExtension {\n if (data.length < 72) {\n throw SplTokenError.invalidExtension({\n reason: `MetadataPointer too short: expected 72 bytes, got ${data.length}`,\n });\n }\n\n const authority = readCOptionPubkey({ data, offset: 0 });\n const metadataAddress = readCOptionPubkey({ data, offset: 36 });\n\n return { authority, metadataAddress };\n}\n\n/**\n * Parses a TokenMetadata extension.\n *\n * Layout:\n * - Pubkey update_authority (32 bytes) - can be all zeros for None\n * - Pubkey mint (32 bytes)\n * - String name (4-byte length + UTF-8)\n * - String symbol (4-byte length + UTF-8)\n * - String uri (4-byte length + UTF-8)\n * - Vec<(String, String)> additional_metadata\n */\nfunction parseTokenMetadataExtension({\n data,\n mint,\n}: {\n data: Uint8Array;\n mint: PublicKey;\n}): TokenMetadata {\n if (data.length < 64) {\n throw SplTokenError.invalidMetadata({\n reason: `TokenMetadata too short: expected at least 64 bytes, got ${data.length}`,\n });\n }\n\n let offset = 0;\n\n // Read update_authority (32 bytes, all zeros = None)\n const updateAuthorityBytes = data.slice(offset, offset + PUBKEY_SIZE);\n const isZeroAuthority = updateAuthorityBytes.every(b => b === 0);\n const updateAuthority = isZeroAuthority ? null : PublicKey.fromBytes(updateAuthorityBytes);\n offset += PUBKEY_SIZE;\n\n // Read mint (32 bytes) - skip, we already have it\n offset += PUBKEY_SIZE;\n\n // Read name\n const [name, nameLen] = readLengthPrefixedString({ data, offset });\n offset += nameLen;\n\n // Read symbol\n const [symbol, symbolLen] = readLengthPrefixedString({ data, offset });\n offset += symbolLen;\n\n // Read uri\n const [uri, uriLen] = readLengthPrefixedString({ data, offset });\n offset += uriLen;\n\n // Read additional_metadata (Vec<(String, String)>)\n const additionalMetadata: Array<[string, string]> = [];\n\n if (offset + 4 <= data.length) {\n const numEntries = readU32LE({ data, offset });\n offset += 4;\n\n for (let i = 0; i < numEntries && offset < data.length; i++) {\n const [key, keyLen] = readLengthPrefixedString({ data, offset });\n offset += keyLen;\n\n const [value, valueLen] = readLengthPrefixedString({ data, offset });\n offset += valueLen;\n\n additionalMetadata.push([key, value]);\n }\n }\n\n return {\n updateAuthority,\n mint,\n name,\n symbol,\n uri,\n additionalMetadata,\n };\n}\n\n/**\n * Options for parsing token metadata.\n */\nexport interface ParseTokenMetadataOptions {\n /** The mint's public key */\n mint: PublicKey;\n /** Raw mint account data (including extensions) */\n data: Uint8Array;\n}\n\n/**\n * Parses Token-2022 native metadata from a mint account.\n *\n * This function looks for the TokenMetadata extension (type 19) in the\n * account's extension data and parses it if found.\n *\n * @param options - Options containing mint and data\n * @returns Parsed token metadata, or null if no metadata extension exists\n * @throws {SplTokenError} If the metadata extension is malformed\n *\n * @example\n * ```typescript\n * const accountInfo = await client.getAccountInfo(mintPubkey);\n * if (accountInfo) {\n * const metadata = parseTokenMetadata({ mint: mintPubkey, data: accountInfo.data });\n * if (metadata) {\n * console.log(`Name: ${metadata.name}`);\n * console.log(`Symbol: ${metadata.symbol}`);\n * console.log(`URI: ${metadata.uri}`);\n * }\n * }\n * ```\n */\nexport function parseTokenMetadata({\n mint,\n data,\n}: ParseTokenMetadataOptions): TokenMetadata | null {\n // Check if account has extensions (must be longer than base mint size)\n if (data.length <= MINT_SIZE) {\n return null;\n }\n\n // Check AccountType byte\n const accountType = data[MINT_SIZE];\n if (accountType !== AccountType.Mint) {\n return null;\n }\n\n // Parse all extensions\n const extensions = parseExtensions({ data, extensionsOffset: MINT_EXTENSIONS_OFFSET });\n\n // Find TokenMetadata extension (type 19)\n const metadataExt = extensions.find(ext => ext.type === ExtensionType.TokenMetadata);\n\n if (!metadataExt) {\n return null;\n }\n\n return parseTokenMetadataExtension({ data: metadataExt.data, mint });\n}\n\n/**\n * Options for parsing metadata pointer extension.\n */\nexport interface ParseMetadataPointerExtensionOptions {\n /** Raw mint account data (including extensions) */\n data: Uint8Array;\n}\n\n/**\n * Parses the MetadataPointer extension from a mint account.\n *\n * @param options - Options containing data\n * @returns Parsed metadata pointer, or null if not present\n */\nexport function parseMetadataPointerExtension({\n data,\n}: ParseMetadataPointerExtensionOptions): MetadataPointerExtension | null {\n if (data.length <= MINT_SIZE) {\n return null;\n }\n\n const accountType = data[MINT_SIZE];\n if (accountType !== AccountType.Mint) {\n return null;\n }\n\n const extensions = parseExtensions({ data, extensionsOffset: MINT_EXTENSIONS_OFFSET });\n const pointerExt = extensions.find(ext => ext.type === ExtensionType.MetadataPointer);\n\n if (!pointerExt) {\n return null;\n }\n\n return parseMetadataPointer({ data: pointerExt.data });\n}\n\n/**\n * Options for getting mint extensions.\n */\nexport interface GetMintExtensionsOptions {\n /** Raw mint account data */\n data: Uint8Array;\n}\n\n/**\n * Gets all raw extensions from a mint account.\n *\n * @param options - Options containing data\n * @returns Array of raw extensions, or empty array if no extensions\n */\nexport function getMintExtensions({ data }: GetMintExtensionsOptions): RawExtension[] {\n if (data.length <= MINT_SIZE) {\n return [];\n }\n\n const accountType = data[MINT_SIZE];\n if (accountType !== AccountType.Mint) {\n return [];\n }\n\n return parseExtensions({ data, extensionsOffset: MINT_EXTENSIONS_OFFSET });\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * High-level SPL Token-2022 client for token operations.\n *\n * Provides a convenient API for common token operations like getting\n * balances, reading mint info, and building transfer transactions.\n */\n\nimport { PublicKey, type RialoClient, type Signer, TransactionBuilder } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID } from \"../constants\";\nimport { SplTokenError } from \"../errors\";\n\n/**\n * Decode account data from the RPC wire format (`[base64data, \"base64\"]`)\n * into raw bytes. Also accepts Uint8Array passthrough for test mocks.\n */\nfunction decodeAccountData(data: string[] | Uint8Array): Uint8Array {\n\tif (data instanceof Uint8Array) return data;\n\tconst encoded = data[0];\n\tconst binaryStr = atob(encoded);\n\tconst bytes = new Uint8Array(binaryStr.length);\n\tfor (let i = 0; i < binaryStr.length; i++) {\n\t\tbytes[i] = binaryStr.charCodeAt(i);\n\t}\n\treturn bytes;\n}\nimport {\n type Instruction,\n createAssociatedTokenAccountIdempotentInstruction,\n transferCheckedInstruction,\n} from \"../instructions\";\nimport { findAssociatedTokenAddress, getAssociatedTokenAddressSync } from \"../pda\";\nimport { parseMintAccount, parseTokenAccount, parseTokenMetadata } from \"../state\";\nimport type {\n AtaDerivationResult,\n MintInfo,\n TokenAccountInfo,\n TokenMetadata,\n TransferParams,\n} from \"../types\";\n\n/**\n * Options for creating an SplTokenClient.\n */\nexport interface SplTokenClientOptions {\n /** The underlying RialoClient for RPC calls */\n client: RialoClient;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * High-level client for SPL Token-2022 operations.\n *\n * Wraps a RialoClient to provide token-specific functionality including\n * reading mint/token account data, getting balances, and building transfers.\n *\n * @example\n * ```typescript\n * import { createRialoClient, RIALO_DEVNET_CHAIN } from '@rialo/ts-cdk';\n * import { createSplTokenClient } from '@rialo/spl-token';\n *\n * const rialoClient = createRialoClient({ chain: RIALO_DEVNET_CHAIN });\n * const tokenClient = createSplTokenClient({ client: rialoClient });\n *\n * // Get token balance\n * const balance = await tokenClient.getBalance({ wallet: walletPubkey, mint: mintPubkey });\n * console.log(`Balance: ${balance}`);\n *\n * // Get mint info\n * const mintInfo = await tokenClient.getMintInfo({ mint: mintPubkey });\n * console.log(`Supply: ${mintInfo.supply}, Decimals: ${mintInfo.decimals}`);\n * ```\n */\nexport class SplTokenClient {\n private readonly client: RialoClient;\n private readonly programId: PublicKey;\n\n /**\n * Creates a new SplTokenClient.\n *\n * @param options - Client configuration options\n */\n constructor({\n client,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n }: SplTokenClientOptions) {\n this.client = client;\n this.programId = programId;\n }\n\n /**\n * Gets the token program ID this client is configured to use.\n */\n getProgramId(): PublicKey {\n return this.programId;\n }\n\n /**\n * Retrieves mint account information.\n *\n * @param options - Options containing the mint public key\n * @returns Parsed mint information including supply, decimals, and authorities\n * @throws {SplTokenError} If the mint account doesn't exist or is invalid\n *\n * @example\n * ```typescript\n * const mintInfo = await tokenClient.getMintInfo({ mint: mintPubkey });\n * console.log(`Supply: ${mintInfo.supply}`);\n * console.log(`Decimals: ${mintInfo.decimals}`);\n * console.log(`Mint Authority: ${mintInfo.mintAuthority?.toString() ?? 'disabled'}`);\n * ```\n */\n async getMintInfo({ mint }: { mint: PublicKey }): Promise<MintInfo> {\n const accountInfo = await this.client.getAccountInfo(mint);\n\n if (!accountInfo) {\n throw SplTokenError.mintNotFound({ address: mint.toString() });\n }\n\n return parseMintAccount({ address: mint, data: decodeAccountData(accountInfo.data) });\n }\n\n /**\n * Retrieves Token-2022 native metadata from a mint.\n *\n * @param options - Options containing the mint public key\n * @returns Parsed token metadata, or null if no metadata extension exists\n * @throws {SplTokenError} If the mint account doesn't exist\n *\n * @example\n * ```typescript\n * const metadata = await tokenClient.getTokenMetadata({ mint: mintPubkey });\n * if (metadata) {\n * console.log(`Name: ${metadata.name}`);\n * console.log(`Symbol: ${metadata.symbol}`);\n * console.log(`URI: ${metadata.uri}`);\n * }\n * ```\n */\n async getTokenMetadata({ mint }: { mint: PublicKey }): Promise<TokenMetadata | null> {\n const accountInfo = await this.client.getAccountInfo(mint);\n\n if (!accountInfo) {\n throw SplTokenError.mintNotFound({ address: mint.toString() });\n }\n\n return parseTokenMetadata({ mint, data: decodeAccountData(accountInfo.data) });\n }\n\n /**\n * Retrieves token account information.\n *\n * @param options - Options containing the token account public key\n * @returns Parsed token account information\n * @throws {SplTokenError} If the account doesn't exist or is invalid\n */\n async getTokenAccountInfo({\n tokenAccount,\n }: {\n tokenAccount: PublicKey;\n }): Promise<TokenAccountInfo> {\n const accountInfo = await this.client.getAccountInfo(tokenAccount);\n\n if (!accountInfo) {\n throw SplTokenError.tokenAccountNotFound({ address: tokenAccount.toString() });\n }\n\n return parseTokenAccount({ address: tokenAccount, data: decodeAccountData(accountInfo.data) });\n }\n\n /**\n * Gets the token balance for a wallet.\n *\n * Automatically derives the Associated Token Address for the wallet/mint\n * combination and retrieves the balance.\n *\n * @param options - Options containing wallet and mint public keys\n * @returns The token balance in smallest units, or 0n if the ATA doesn't exist\n *\n * @example\n * ```typescript\n * const balance = await tokenClient.getBalance({ wallet: walletPubkey, mint: mintPubkey });\n * console.log(`Token balance: ${balance}`);\n * ```\n */\n async getBalance({ wallet, mint }: { wallet: PublicKey; mint: PublicKey }): Promise<bigint> {\n const ata = getAssociatedTokenAddressSync({ wallet, mint, programId: this.programId });\n const accountInfo = await this.client.getAccountInfo(ata);\n\n if (!accountInfo) {\n // ATA doesn't exist, balance is 0\n return 0n;\n }\n\n const tokenAccount = parseTokenAccount({ address: ata, data: decodeAccountData(accountInfo.data) });\n return tokenAccount.amount;\n }\n\n /**\n * Derives the Associated Token Address for a wallet and mint.\n *\n * @param options - Options containing wallet and mint public keys\n * @returns The derived ATA address and bump seed\n *\n * @example\n * ```typescript\n * const { address, bump } = tokenClient.getAssociatedTokenAddress({ wallet: walletPubkey, mint: mintPubkey });\n * console.log(`ATA: ${address.toString()}`);\n * ```\n */\n getAssociatedTokenAddress({\n wallet,\n mint,\n }: {\n wallet: PublicKey;\n mint: PublicKey;\n }): AtaDerivationResult {\n return findAssociatedTokenAddress({ wallet, mint, programId: this.programId });\n }\n\n /**\n * Checks if an Associated Token Account exists.\n *\n * @param options - Options containing wallet and mint public keys\n * @returns True if the ATA exists, false otherwise\n */\n async ataExists({ wallet, mint }: { wallet: PublicKey; mint: PublicKey }): Promise<boolean> {\n const ata = getAssociatedTokenAddressSync({ wallet, mint, programId: this.programId });\n const accountInfo = await this.client.getAccountInfo(ata);\n return accountInfo !== null;\n }\n\n /**\n * Creates instructions for a token transfer.\n *\n * This builds the necessary instructions for transferring tokens,\n * optionally creating the destination ATA if it doesn't exist.\n *\n * @param params - Transfer parameters\n * @returns Array of instructions to execute\n * @throws {SplTokenError} If the mint doesn't exist\n *\n * @example\n * ```typescript\n * const instructions = await tokenClient.createTransferInstructions({\n * source: senderWallet,\n * destination: recipientWallet,\n * mint: mintPubkey,\n * amount: 1000000n,\n * decimals: 6,\n * createDestinationAta: true,\n * });\n * ```\n */\n async createTransferInstructions(params: TransferParams): Promise<Instruction[]> {\n const { source, destination, mint, amount, decimals, createDestinationAta = true } = params;\n\n const instructions: Instruction[] = [];\n\n // Derive ATAs\n const sourceAta = getAssociatedTokenAddressSync({\n wallet: source,\n mint,\n programId: this.programId,\n });\n const destinationAta = getAssociatedTokenAddressSync({\n wallet: destination,\n mint,\n programId: this.programId,\n });\n\n // Check if we need to create destination ATA\n if (createDestinationAta) {\n const destExists = await this.ataExists({ wallet: destination, mint });\n if (!destExists) {\n // Add idempotent create instruction (safe even if it exists)\n instructions.push(\n createAssociatedTokenAccountIdempotentInstruction({\n payer: source,\n associatedToken: destinationAta,\n owner: destination,\n mint,\n programId: this.programId,\n }),\n );\n }\n }\n\n // Add transfer instruction\n instructions.push(\n transferCheckedInstruction({\n source: sourceAta,\n mint,\n destination: destinationAta,\n authority: source,\n amount,\n decimals,\n programId: this.programId,\n }),\n );\n\n return instructions;\n }\n\n /**\n * Options for creating a transfer transaction.\n */\n /**\n * Creates a transaction for a token transfer.\n *\n * Builds a complete transaction with all necessary instructions for\n * transferring tokens, including ATA creation if needed.\n *\n * @param options - Options containing params and validFrom\n * @returns Built transaction ready for signing\n *\n * @example\n * ```typescript\n * const blockHeight = await rialoClient.getBlockHeight();\n * const configHashPrefix = await rialoClient.getConfigHashPrefix();\n * const tx = await tokenClient.createTransferTransaction({\n * params: {\n * source: senderWallet,\n * destination: recipientWallet,\n * mint: mintPubkey,\n * amount: 1000000n,\n * decimals: 6,\n * },\n * validFrom: blockHeight,\n * configHashPrefix,\n * });\n *\n * // Sign and send\n * const signedTx = tx.sign([signer]);\n * const signature = await rialoClient.sendTransaction(signedTx.serialize());\n * ```\n */\n async createTransferTransaction({\n params,\n validFrom,\n configHashPrefix,\n }: {\n params: TransferParams;\n validFrom: bigint;\n configHashPrefix: bigint;\n }): Promise<ReturnType<typeof TransactionBuilder.prototype.build>> {\n const instructions = await this.createTransferInstructions(params);\n\n const builder = TransactionBuilder.create()\n .setPayer(params.source)\n .setValidFrom(validFrom)\n .setConfigHashPrefix(configHashPrefix);\n\n for (const ix of instructions) {\n builder.addInstruction(ix);\n }\n\n return builder.build();\n }\n\n /**\n * Transfers tokens from one wallet to another.\n *\n * This is a high-level convenience method that:\n * 1. Creates the destination ATA if needed\n * 2. Builds the transfer transaction\n * 3. Signs and sends the transaction\n * 4. Waits for confirmation\n *\n * @param options - Options containing params, validFrom, and signer\n * @returns Transaction signature\n *\n * @example\n * ```typescript\n * const blockHeight = await rialoClient.getBlockHeight();\n * const configHashPrefix = await rialoClient.getConfigHashPrefix();\n * const signature = await tokenClient.transfer({\n * params: {\n * source: senderWallet,\n * destination: recipientWallet,\n * mint: mintPubkey,\n * amount: 1000000n,\n * decimals: 6,\n * },\n * validFrom: blockHeight,\n * configHashPrefix,\n * signer: senderSigner,\n * });\n * console.log(`Transfer complete: ${signature}`);\n * ```\n */\n async transfer({\n params,\n validFrom,\n configHashPrefix,\n signer,\n }: {\n params: TransferParams;\n validFrom: bigint;\n configHashPrefix: bigint;\n signer: Signer;\n }): Promise<string> {\n const tx = await this.createTransferTransaction({ params, validFrom, configHashPrefix });\n const signedTx = await tx.signWith(signer);\n const result = await this.client.sendAndConfirmTransaction(signedTx.serialize());\n return result.signature;\n }\n}\n\n/**\n * Options for creating an SplTokenClient via the factory function.\n */\nexport interface CreateSplTokenClientOptions {\n /** The underlying RialoClient for RPC calls */\n client: RialoClient;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a new SplTokenClient.\n *\n * Factory function for creating an SplTokenClient instance.\n *\n * @param options - Options for creating the client\n * @returns Configured SplTokenClient instance\n *\n * @example\n * ```typescript\n * import { createRialoClient, RIALO_DEVNET_CHAIN } from '@rialo/ts-cdk';\n * import { createSplTokenClient } from '@rialo/spl-token';\n *\n * const rialoClient = createRialoClient({ chain: RIALO_DEVNET_CHAIN });\n * const tokenClient = createSplTokenClient({ client: rialoClient });\n * ```\n */\nexport function createSplTokenClient({\n client,\n programId,\n}: CreateSplTokenClientOptions): SplTokenClient {\n return new SplTokenClient({ client, programId });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../node_modules/@noble/hashes/src/utils.ts","../node_modules/@noble/hashes/src/_md.ts","../node_modules/@noble/hashes/src/sha2.ts","../src/instructions/token-metadata.ts","../src/helpers/size.ts","../src/instructions/create-ata.ts","../src/utils/bytes.ts","../src/instructions/utils.ts","../src/instructions/metadata-pointer.ts","../src/instructions/mint.ts","../src/instructions/non-transferable.ts","../src/instructions/permanent-delegate.ts","../src/instructions/transfer.ts","../src/instructions/transfer-fee.ts","../src/instructions/transfer-hook.ts","../src/errors.ts","../src/pda/ata.ts","../src/builders/mint-builder.ts","../src/state/bytes.ts","../src/state/extensions.ts","../src/state/extension-parsers.ts","../src/state/metadata.ts","../src/state/mint.ts","../src/state/token-account.ts","../src/transfer-hook/extra-account-meta.ts","../src/transfer-hook/extra-account-meta-list.ts","../src/transfer-hook/seeds.ts","../src/transfer-hook/resolve-extra-accounts.ts","../src/client/spl-token-client.ts","../src/recipes/create-token-with-metadata.ts"],"names":["TokenAccountState","ExtensionType","AccountType","TokenInstruction","PublicKey","SplTokenErrorCode","PUBKEY_SIZE","readLengthPrefixedString","TLV_HEADER_SIZE","seeds","pda","accountIndex","TransactionBuilder"],"mappings":"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","file":"index.mjs","sourcesContent":["// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Constants for SPL Token-2022 operations.\n *\n * This module defines program IDs, byte offsets for account parsing,\n * and instruction discriminators for the Token-2022 program.\n */\n\n// =============================================================================\n// Program IDs (Canonical Solana/Rialo Addresses)\n// =============================================================================\n\n/** Token-2022 program ID */\nexport const TOKEN_2022_PROGRAM_ID = \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\";\n\n/** Associated Token Account program ID */\nexport const ASSOCIATED_TOKEN_PROGRAM_ID = \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\";\n\n/** Legacy Token program ID (SPL Token) */\nexport const TOKEN_PROGRAM_ID = \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\";\n\n// =============================================================================\n// Account Sizes\n// =============================================================================\n\n/** Size of a Mint account (without extensions) */\nexport const MINT_SIZE = 82;\n\n/** Size of a Token Account (without extensions) */\nexport const TOKEN_ACCOUNT_SIZE = 165;\n\n// =============================================================================\n// Mint Account Offsets (82 bytes total)\n// =============================================================================\n\n/** Byte offset for mint_authority COption<Pubkey> (36 bytes) */\nexport const MINT_AUTHORITY_OFFSET = 0;\n\n/** Byte offset for supply u64 (8 bytes) */\nexport const MINT_SUPPLY_OFFSET = 36;\n\n/** Byte offset for decimals u8 (1 byte) */\nexport const MINT_DECIMALS_OFFSET = 44;\n\n/** Byte offset for is_initialized bool (1 byte) */\nexport const MINT_IS_INITIALIZED_OFFSET = 45;\n\n/** Byte offset for freeze_authority COption<Pubkey> (36 bytes) */\nexport const MINT_FREEZE_AUTHORITY_OFFSET = 46;\n\n// =============================================================================\n// Token Account Offsets (165 bytes total)\n// =============================================================================\n\n/** Byte offset for mint Pubkey (32 bytes) */\nexport const TOKEN_ACCOUNT_MINT_OFFSET = 0;\n\n/** Byte offset for owner Pubkey (32 bytes) */\nexport const TOKEN_ACCOUNT_OWNER_OFFSET = 32;\n\n/** Byte offset for amount u64 (8 bytes) */\nexport const TOKEN_ACCOUNT_AMOUNT_OFFSET = 64;\n\n/** Byte offset for delegate COption<Pubkey> (36 bytes) */\nexport const TOKEN_ACCOUNT_DELEGATE_OFFSET = 72;\n\n/** Byte offset for state u8 (1 byte) */\nexport const TOKEN_ACCOUNT_STATE_OFFSET = 108;\n\n/** Byte offset for is_native COption<u64> (12 bytes) */\nexport const TOKEN_ACCOUNT_IS_NATIVE_OFFSET = 109;\n\n/** Byte offset for delegated_amount u64 (8 bytes) */\nexport const TOKEN_ACCOUNT_DELEGATED_AMOUNT_OFFSET = 121;\n\n/** Byte offset for close_authority COption<Pubkey> (36 bytes) */\nexport const TOKEN_ACCOUNT_CLOSE_AUTHORITY_OFFSET = 129;\n\n// =============================================================================\n// COption Format\n// =============================================================================\n\n/** Size of COption tag (4-byte LE u32) */\nexport const COPTION_TAG_SIZE = 4;\n\n/** COption tag value for None */\nexport const COPTION_NONE = 0;\n\n/** COption tag value for Some */\nexport const COPTION_SOME = 1;\n\n/** Size of Pubkey in bytes */\nexport const PUBKEY_SIZE = 32;\n\n// =============================================================================\n// Token Account State Enum\n// =============================================================================\n\n/**\n * State of a token account.\n */\nexport enum TokenAccountState {\n /** Account is not yet initialized */\n Uninitialized = 0,\n /** Account is initialized and active */\n Initialized = 1,\n /** Account is frozen */\n Frozen = 2,\n}\n\n// =============================================================================\n// Extension Types (TLV format)\n// =============================================================================\n\n/**\n * Extension types for Token-2022 accounts.\n * Extensions start after the base account data with an AccountType byte.\n */\nexport enum ExtensionType {\n /** Uninitialized extension slot */\n Uninitialized = 0,\n /** Transfer fee configuration */\n TransferFeeConfig = 1,\n /** Transfer fee amount tracking */\n TransferFeeAmount = 2,\n /** Mint close authority */\n MintCloseAuthority = 3,\n /** Confidential transfer configuration */\n ConfidentialTransferMint = 4,\n /** Confidential transfer account state */\n ConfidentialTransferAccount = 5,\n /** Default account state */\n DefaultAccountState = 6,\n /** Immutable owner */\n ImmutableOwner = 7,\n /** Memo required on transfer */\n MemoTransfer = 8,\n /** Non-transferable tokens */\n NonTransferable = 9,\n /** Interest-bearing configuration */\n InterestBearingConfig = 10,\n /** CPI guard */\n CpiGuard = 11,\n /** Permanent delegate */\n PermanentDelegate = 12,\n /** Non-transferable account marker */\n NonTransferableAccount = 13,\n /** Transfer hook configuration */\n TransferHook = 14,\n /** Transfer hook account state */\n TransferHookAccount = 15,\n /** Confidential transfer fee configuration */\n ConfidentialTransferFeeConfig = 16,\n /** Confidential transfer fee amount */\n ConfidentialTransferFeeAmount = 17,\n /** Metadata pointer extension */\n MetadataPointer = 18,\n /** Token metadata extension */\n TokenMetadata = 19,\n /** Group pointer extension */\n GroupPointer = 20,\n /** Token group extension */\n TokenGroup = 21,\n /** Group member pointer extension */\n GroupMemberPointer = 22,\n /** Token group member extension */\n TokenGroupMember = 23,\n}\n\n// =============================================================================\n// Account Type (for extensions)\n// =============================================================================\n\n/**\n * Account type byte that precedes extensions.\n */\nexport enum AccountType {\n /** Account is uninitialized */\n Uninitialized = 0,\n /** This is a mint account */\n Mint = 1,\n /** This is a token account */\n Account = 2,\n}\n\n// =============================================================================\n// Instruction Discriminators\n// =============================================================================\n\n/**\n * SPL Token instruction discriminators.\n */\nexport enum TokenInstruction {\n /** Initialize a new mint */\n InitializeMint = 0,\n /** Initialize a new token account */\n InitializeAccount = 1,\n /** Initialize a multisig */\n InitializeMultisig = 2,\n /** Transfer tokens (deprecated, use TransferChecked) */\n Transfer = 3,\n /** Approve a delegate */\n Approve = 4,\n /** Revoke a delegate */\n Revoke = 5,\n /** Set a new authority */\n SetAuthority = 6,\n /** Mint new tokens */\n MintTo = 7,\n /** Burn tokens */\n Burn = 8,\n /** Close a token account */\n CloseAccount = 9,\n /** Freeze a token account */\n FreezeAccount = 10,\n /** Thaw a frozen account */\n ThawAccount = 11,\n /** Transfer tokens with decimals check */\n TransferChecked = 12,\n /** Approve with amount check */\n ApproveChecked = 13,\n /** Mint with amount check */\n MintToChecked = 14,\n /** Burn with amount check */\n BurnChecked = 15,\n /** Initialize account with specified owner */\n InitializeAccount2 = 16,\n /** Sync native token balance */\n SyncNative = 17,\n /** Initialize account with rent sysvar */\n InitializeAccount3 = 18,\n /** Initialize multisig with rent sysvar */\n InitializeMultisig2 = 19,\n /** Initialize mint with rent sysvar */\n InitializeMint2 = 20,\n /** Transfer fee extension prefix */\n TransferFeeExtension = 26,\n /** Initialize non-transferable mint */\n InitializeNonTransferableMint = 32,\n /** Initialize permanent delegate */\n InitializePermanentDelegate = 35,\n /** Transfer hook extension prefix */\n TransferHookExtension = 36,\n /** Metadata pointer extension prefix */\n MetadataPointerExtension = 39,\n}\n\n// =============================================================================\n// TLV (Type-Length-Value) Constants\n// =============================================================================\n\n/** Size of extension type field in TLV (2 bytes LE u16) */\nexport const TLV_TYPE_SIZE = 2;\n\n/** Size of extension length field in TLV (2 bytes LE u16) */\nexport const TLV_LENGTH_SIZE = 2;\n\n/** Offset where extensions begin in a mint account */\nexport const MINT_EXTENSIONS_OFFSET: number = TOKEN_ACCOUNT_SIZE + 1; // +1 for AccountType byte\n\n/** Offset where extensions begin in a token account */\nexport const TOKEN_ACCOUNT_EXTENSIONS_OFFSET: number = TOKEN_ACCOUNT_SIZE + 1; // +1 for AccountType byte\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number, title: string = ''): void {\n if (!Number.isSafeInteger(n) || n < 0) {\n const prefix = title && `\"${title}\" `;\n throw new Error(`${prefix}expected integer >0, got ${n}`);\n }\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n}\n\n/** Asserts something is hash */\nexport function ahash(h: CHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash must wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out, undefined, 'digestInto() output');\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('\"digestInto() output\" expected to be of length >=' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput, errorTitle = ''): Uint8Array {\n if (typeof data === 'string') return utf8ToBytes(data);\n return abytes(data, undefined, errorTitle);\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\n/** Merges default options and passed options. */\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options must be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Common interface for all hashes. */\nexport interface Hash<T> {\n blockLen: number; // Bytes per block\n outputLen: number; // Bytes in output\n update(buf: Uint8Array): this;\n digestInto(buf: Uint8Array): void;\n digest(): Uint8Array;\n destroy(): void;\n _cloneInto(to?: T): T;\n clone(): T;\n}\n\n/** PseudoRandom (number) Generator */\nexport interface PRG {\n addEntropy(seed: Uint8Array): void;\n randomBytes(length: number): Uint8Array;\n clean(): void;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash constructor */\nexport type HasherCons<T, Opts = undefined> = Opts extends undefined ? () => T : (opts?: Opts) => T;\n/** Optional hash params. */\nexport type HashInfo = {\n oid?: Uint8Array; // DER encoded OID in bytes\n};\n/** Hash function */\nexport type CHash<T extends Hash<T> = Hash<any>, Opts = undefined> = {\n outputLen: number;\n blockLen: number;\n} & HashInfo &\n (Opts extends undefined\n ? {\n (msg: Uint8Array): Uint8Array;\n create(): T;\n }\n : {\n (msg: Uint8Array, opts?: Opts): Uint8Array;\n create(opts?: Opts): T;\n });\n/** XOF with output */\nexport type CHashXOF<T extends HashXOF<T> = HashXOF<any>, Opts = undefined> = CHash<T, Opts>;\n\n/** Creates function with outputLen, blockLen, create properties from a class constructor. */\nexport function createHasher<T extends Hash<T>, Opts = undefined>(\n hashCons: HasherCons<T, Opts>,\n info: HashInfo = {}\n): CHash<T, Opts> {\n const hashC: any = (msg: Uint8Array, opts?: Opts) => hashCons(opts).update(msg).digest();\n const tmp = hashCons(undefined);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: Opts) => hashCons(opts);\n Object.assign(hashC, info);\n return Object.freeze(hashC);\n}\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n const cr = typeof globalThis === 'object' ? (globalThis as any).crypto : null;\n if (typeof cr?.getRandomValues !== 'function')\n throw new Error('crypto.getRandomValues must be defined');\n return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n\n/** Creates OID opts for NIST hashes, with prefix 06 09 60 86 48 01 65 03 04 02. */\nexport const oidNist = (suffix: number): Required<HashInfo> => ({\n oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { abytes, aexists, aoutput, clean, createView, type Hash } from './utils.ts';\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> implements Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Uint8Array): this {\n aexists(this);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen must be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to as unknown as any;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://www.rfc-editor.org/rfc/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, oidNist, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n\n/** Internal 32-byte base SHA2 hash class. */\nabstract class SHA2_32B<T extends SHA2_32B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected abstract A: number;\n protected abstract B: number;\n protected abstract C: number;\n protected abstract D: number;\n protected abstract E: number;\n protected abstract F: number;\n protected abstract G: number;\n protected abstract H: number;\n\n constructor(outputLen: number) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\n/** Internal SHA2-256 hash class. */\nexport class _SHA256 extends SHA2_32B<_SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n constructor() {\n super(32);\n }\n}\n\n/** Internal SHA2-224 hash class. */\nexport class _SHA224 extends SHA2_32B<_SHA224> {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\n/** Internal 64-byte base SHA2 hash class. */\nabstract class SHA2_64B<T extends SHA2_64B<T>> extends HashMD<T> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected abstract Ah: number;\n protected abstract Al: number;\n protected abstract Bh: number;\n protected abstract Bl: number;\n protected abstract Ch: number;\n protected abstract Cl: number;\n protected abstract Dh: number;\n protected abstract Dl: number;\n protected abstract Eh: number;\n protected abstract El: number;\n protected abstract Fh: number;\n protected abstract Fl: number;\n protected abstract Gh: number;\n protected abstract Gl: number;\n protected abstract Hh: number;\n protected abstract Hl: number;\n\n constructor(outputLen: number) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\n/** Internal SHA2-512 hash class. */\nexport class _SHA512 extends SHA2_64B<_SHA512> {\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor() {\n super(64);\n }\n}\n\n/** Internal SHA2-384 hash class. */\nexport class _SHA384 extends SHA2_64B<_SHA384> {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\n/** Internal SHA2-512/224 hash class. */\nexport class _SHA512_224 extends SHA2_64B<_SHA512_224> {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\n/** Internal SHA2-512/256 hash class. */\nexport class _SHA512_256 extends SHA2_64B<_SHA512_256> {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n */\nexport const sha256: CHash<_SHA256> = /* @__PURE__ */ createHasher(\n () => new _SHA256(),\n /* @__PURE__ */ oidNist(0x01)\n);\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash<_SHA224> = /* @__PURE__ */ createHasher(\n () => new _SHA224(),\n /* @__PURE__ */ oidNist(0x04)\n);\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash<_SHA512> = /* @__PURE__ */ createHasher(\n () => new _SHA512(),\n /* @__PURE__ */ oidNist(0x03)\n);\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash<_SHA384> = /* @__PURE__ */ createHasher(\n () => new _SHA384(),\n /* @__PURE__ */ oidNist(0x02)\n);\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash<_SHA512_256> = /* @__PURE__ */ createHasher(\n () => new _SHA512_256(),\n /* @__PURE__ */ oidNist(0x06)\n);\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash<_SHA512_224> = /* @__PURE__ */ createHasher(\n () => new _SHA512_224(),\n /* @__PURE__ */ oidNist(0x05)\n);\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Token-2022 metadata extension instructions and helpers.\n */\n\nimport { sha256 } from \"@noble/hashes/sha2\";\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID } from \"../constants\";\n\nconst TOKEN_METADATA_NAMESPACE = \"rialo_s_spl_token_metadata_interface\";\nconst TOKEN_METADATA_DISCRIMINATOR_LENGTH = 8;\n\nfunction metadataDiscriminator(label: string): Uint8Array {\n const input = new TextEncoder().encode(`${TOKEN_METADATA_NAMESPACE}:${label}`);\n return sha256(input).slice(0, TOKEN_METADATA_DISCRIMINATOR_LENGTH);\n}\n\nfunction writeU32LE({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value: number;\n}): void {\n data[offset] = value & 0xff;\n data[offset + 1] = (value >>> 8) & 0xff;\n data[offset + 2] = (value >>> 16) & 0xff;\n data[offset + 3] = (value >>> 24) & 0xff;\n}\n\nfunction encodeLengthPrefixedString(value: string): Uint8Array {\n const bytes = new TextEncoder().encode(value);\n const buffer = new Uint8Array(4 + bytes.length);\n writeU32LE({ data: buffer, offset: 0, value: bytes.length });\n buffer.set(bytes, 4);\n return buffer;\n}\n\nfunction encodeAdditionalMetadata(additionalMetadata: Array<[string, string]>): Uint8Array {\n const entries = additionalMetadata.flatMap(([key, value]) => [\n encodeLengthPrefixedString(key),\n encodeLengthPrefixedString(value),\n ]);\n const totalLength = 4 + entries.reduce((sum, entry) => sum + entry.length, 0);\n const buffer = new Uint8Array(totalLength);\n writeU32LE({ data: buffer, offset: 0, value: additionalMetadata.length });\n\n let offset = 4;\n for (const entry of entries) {\n buffer.set(entry, offset);\n offset += entry.length;\n }\n\n return buffer;\n}\n\n/**\n * Computes the size of TokenMetadata extension data.\n */\nexport function getTokenMetadataDataSize({\n name,\n symbol,\n uri,\n additionalMetadata = [],\n}: {\n name: string;\n symbol: string;\n uri: string;\n additionalMetadata?: Array<[string, string]>;\n}): number {\n return (\n 32 +\n 32 +\n encodeLengthPrefixedString(name).length +\n encodeLengthPrefixedString(symbol).length +\n encodeLengthPrefixedString(uri).length +\n encodeAdditionalMetadata(additionalMetadata).length\n );\n}\n\n/**\n * Options for creating a TokenMetadata Initialize instruction.\n */\nexport interface InitializeTokenMetadataInstructionOptions {\n /** Mint account to initialize */\n mint: PublicKey;\n /** Authority allowed to update metadata */\n updateAuthority: PublicKey;\n /** Mint authority */\n mintAuthority: PublicKey;\n /** Token name */\n name: string;\n /** Token symbol */\n symbol: string;\n /** Token URI */\n uri: string;\n /** Optional additional metadata entries */\n additionalMetadata?: Array<[string, string]>;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a TokenMetadata Initialize instruction.\n *\n * Instruction data format:\n * [discriminator(8), name, symbol, uri]\n * or with additional metadata:\n * [discriminator(8), name, symbol, uri, additional_metadata]\n */\nexport function initializeTokenMetadataInstruction({\n mint,\n updateAuthority,\n mintAuthority,\n name,\n symbol,\n uri,\n additionalMetadata = [],\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: InitializeTokenMetadataInstructionOptions): {\n programId: PublicKey;\n accounts: Array<{\n pubkey: PublicKey;\n isSigner: boolean;\n isWritable: boolean;\n }>;\n data: Uint8Array;\n} {\n const nameBytes = encodeLengthPrefixedString(name);\n const symbolBytes = encodeLengthPrefixedString(symbol);\n const uriBytes = encodeLengthPrefixedString(uri);\n\n // Only include additionalMetadata bytes if entries are provided\n const hasAdditionalMetadata = additionalMetadata.length > 0;\n const additionalBytes = hasAdditionalMetadata\n ? encodeAdditionalMetadata(additionalMetadata)\n : null;\n\n const dataLength =\n TOKEN_METADATA_DISCRIMINATOR_LENGTH +\n nameBytes.length +\n symbolBytes.length +\n uriBytes.length +\n (additionalBytes?.length ?? 0);\n\n const data = new Uint8Array(dataLength);\n data.set(metadataDiscriminator(\"initialize_account\"), 0);\n let offset = TOKEN_METADATA_DISCRIMINATOR_LENGTH;\n data.set(nameBytes, offset);\n offset += nameBytes.length;\n data.set(symbolBytes, offset);\n offset += symbolBytes.length;\n data.set(uriBytes, offset);\n\n if (additionalBytes) {\n offset += uriBytes.length;\n data.set(additionalBytes, offset);\n }\n\n return {\n programId,\n accounts: [\n { pubkey: mint, isSigner: false, isWritable: true },\n { pubkey: updateAuthority, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: mintAuthority, isSigner: true, isWritable: false },\n ],\n data,\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Size calculation helpers for SPL Token-2022 accounts with extensions.\n *\n * These utilities simplify the process of calculating account sizes and\n * rent-exempt balances when creating mints with Token-2022 extensions.\n *\n * @example\n * ```typescript\n * import { getMintSizeWithExtensions, ExtensionType } from \"@rialo/spl-token\";\n *\n * const size = getMintSizeWithExtensions({\n * extensions: [ExtensionType.MetadataPointer],\n * metadataSize: getMetadataExtensionSize({ name: \"My Token\", symbol: \"MTK\", uri: \"https://...\" }),\n * });\n * ```\n */\n\nimport type { RialoClient } from \"@rialo/ts-cdk\";\nimport {\n ExtensionType,\n MINT_SIZE,\n TLV_LENGTH_SIZE,\n TLV_TYPE_SIZE,\n TOKEN_ACCOUNT_SIZE,\n} from \"../constants\";\nimport { getTokenMetadataDataSize } from \"../instructions/token-metadata\";\n\n/** Size of the TLV header (type + length) */\nconst TLV_HEADER_SIZE: number = TLV_TYPE_SIZE + TLV_LENGTH_SIZE;\n\n/** Size of the account type discriminator byte */\nconst ACCOUNT_TYPE_SIZE = 1;\n\n/**\n * Extension sizes in bytes (data portion only, excluding TLV header).\n *\n * Note: Some extensions have variable sizes (e.g., TokenMetadata).\n * For those, the size must be calculated separately.\n */\nconst EXTENSION_SIZES: Partial<Record<ExtensionType, number>> = {\n [ExtensionType.TransferFeeConfig]: 108,\n [ExtensionType.TransferFeeAmount]: 8,\n [ExtensionType.MintCloseAuthority]: 32,\n [ExtensionType.ConfidentialTransferMint]: 97,\n [ExtensionType.ConfidentialTransferAccount]: 286,\n [ExtensionType.DefaultAccountState]: 1,\n [ExtensionType.ImmutableOwner]: 0,\n [ExtensionType.MemoTransfer]: 1,\n [ExtensionType.NonTransferable]: 0,\n [ExtensionType.InterestBearingConfig]: 52,\n [ExtensionType.CpiGuard]: 1,\n [ExtensionType.PermanentDelegate]: 32,\n [ExtensionType.NonTransferableAccount]: 0,\n [ExtensionType.TransferHook]: 64,\n [ExtensionType.TransferHookAccount]: 1,\n [ExtensionType.ConfidentialTransferFeeConfig]: 64,\n [ExtensionType.ConfidentialTransferFeeAmount]: 32,\n [ExtensionType.MetadataPointer]: 64,\n // TokenMetadata is variable-sized, must use getMetadataExtensionSize\n [ExtensionType.GroupPointer]: 64,\n [ExtensionType.TokenGroup]: 72,\n [ExtensionType.GroupMemberPointer]: 64,\n [ExtensionType.TokenGroupMember]: 68,\n};\n\n/**\n * Options for calculating mint size with extensions.\n */\nexport interface GetMintSizeWithExtensionsOptions {\n /** Array of extension types to include */\n extensions: ExtensionType[];\n /**\n * Size of token metadata data in bytes.\n * Required if extensions includes ExtensionType.TokenMetadata.\n * Use getMetadataExtensionSize() to calculate this.\n */\n metadataSize?: number;\n}\n\n/**\n * Calculates the total size of a mint account with the specified extensions.\n *\n * The size includes:\n * - Base mint size (82 bytes)\n * - Account type discriminator (1 byte)\n * - TLV headers and data for each extension\n *\n * Note: The base mint account is padded to TOKEN_ACCOUNT_SIZE (165 bytes) when\n * extensions are present, to maintain alignment.\n *\n * @param options - Extension configuration\n * @returns Total account size in bytes\n *\n * @example\n * ```typescript\n * // Mint with metadata pointer only\n * const sizePointerOnly = getMintSizeWithExtensions({\n * extensions: [ExtensionType.MetadataPointer],\n * });\n *\n * // Mint with metadata pointer + full metadata\n * const metadataSize = getMetadataExtensionSize({\n * name: \"My Token\",\n * symbol: \"MTK\",\n * uri: \"https://example.com/metadata.json\",\n * });\n * const sizeWithMetadata = getMintSizeWithExtensions({\n * extensions: [ExtensionType.MetadataPointer, ExtensionType.TokenMetadata],\n * metadataSize,\n * });\n * ```\n */\nexport function getMintSizeWithExtensions({\n extensions,\n metadataSize,\n}: GetMintSizeWithExtensionsOptions): number {\n if (extensions.length === 0) {\n return MINT_SIZE;\n }\n\n // When extensions are present, mint is padded to TOKEN_ACCOUNT_SIZE + account type byte\n let totalSize = TOKEN_ACCOUNT_SIZE + ACCOUNT_TYPE_SIZE;\n\n for (const extension of extensions) {\n if (extension === ExtensionType.TokenMetadata) {\n if (metadataSize === undefined) {\n throw new Error(\n \"metadataSize is required when ExtensionType.TokenMetadata is included. \" +\n \"Use getMetadataExtensionSize() to calculate it.\"\n );\n }\n totalSize += TLV_HEADER_SIZE + metadataSize;\n } else {\n const extSize = EXTENSION_SIZES[extension];\n if (extSize === undefined) {\n throw new Error(`Unknown extension type: ${extension}`);\n }\n totalSize += TLV_HEADER_SIZE + extSize;\n }\n }\n\n return totalSize;\n}\n\n/**\n * Calculates the size of token metadata extension data.\n *\n * This is a convenience re-export of getTokenMetadataDataSize for use\n * with getMintSizeWithExtensions.\n *\n * @param metadata - Token metadata fields\n * @returns Size of the metadata data in bytes (excluding TLV header)\n *\n * @example\n * ```typescript\n * const metadataSize = getMetadataExtensionSize({\n * name: \"Rialo Test Token\",\n * symbol: \"RTST\",\n * uri: \"https://picsum.photos/id/237/50/50\",\n * });\n * // metadataSize can now be passed to getMintSizeWithExtensions\n * ```\n */\nexport function getMetadataExtensionSize({\n name,\n symbol,\n uri,\n additionalMetadata = [],\n}: {\n name: string;\n symbol: string;\n uri: string;\n additionalMetadata?: Array<[string, string]>;\n}): number {\n return getTokenMetadataDataSize({ name, symbol, uri, additionalMetadata });\n}\n\n/**\n * Calculates the minimum lamports required for a mint account to be rent-exempt.\n *\n * @param client - Rialo client for RPC calls\n * @param options - Extension configuration\n * @returns Minimum balance for rent exemption in lamports\n *\n * @example\n * ```typescript\n * const rent = await getMinRentForMint(client, {\n * extensions: [ExtensionType.MetadataPointer, ExtensionType.TokenMetadata],\n * metadataSize: getMetadataExtensionSize({ name, symbol, uri }),\n * });\n * ```\n */\nexport async function getMinRentForMint(\n client: RialoClient,\n options: GetMintSizeWithExtensionsOptions\n): Promise<bigint> {\n const size = getMintSizeWithExtensions(options);\n return await client.getMinimumBalanceForRentExemption(BigInt(size));\n}\n\n/**\n * Calculates the size of a mint account with metadata pointer and token metadata.\n *\n * This is a convenience function for the common case of creating a mint\n * with embedded metadata (metadata pointer pointing to self + token metadata).\n *\n * @param metadata - Token metadata fields\n * @returns Total account size in bytes\n *\n * @example\n * ```typescript\n * const size = getMintSizeWithMetadata({\n * name: \"Rialo Test Token\",\n * symbol: \"RTST\",\n * uri: \"https://example.com/metadata.json\",\n * });\n * const rent = await client.getMinimumBalanceForRentExemption(BigInt(size));\n * ```\n */\nexport function getMintSizeWithMetadata({\n name,\n symbol,\n uri,\n additionalMetadata = [],\n}: {\n name: string;\n symbol: string;\n uri: string;\n additionalMetadata?: Array<[string, string]>;\n}): number {\n const metadataSize = getMetadataExtensionSize({ name, symbol, uri, additionalMetadata });\n return getMintSizeWithExtensions({\n extensions: [ExtensionType.MetadataPointer, ExtensionType.TokenMetadata],\n metadataSize,\n });\n}\n\n/**\n * Calculates the minimum lamports required for a mint with metadata to be rent-exempt.\n *\n * Convenience function that combines size calculation and rent lookup for the\n * common case of creating a mint with embedded metadata.\n *\n * @param client - Rialo client for RPC calls\n * @param metadata - Token metadata fields\n * @returns Minimum balance for rent exemption in lamports\n *\n * @example\n * ```typescript\n * const rent = await getMinRentForMintWithMetadata(client, {\n * name: \"Rialo Test Token\",\n * symbol: \"RTST\",\n * uri: \"https://example.com/metadata.json\",\n * });\n * ```\n */\nexport async function getMinRentForMintWithMetadata(\n client: RialoClient,\n metadata: {\n name: string;\n symbol: string;\n uri: string;\n additionalMetadata?: Array<[string, string]>;\n }\n): Promise<bigint> {\n const size = getMintSizeWithMetadata(metadata);\n return await client.getMinimumBalanceForRentExemption(BigInt(size));\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Create Associated Token Account instruction for SPL Token-2022.\n *\n * Creates an Associated Token Account (ATA) for a wallet and mint combination.\n */\n\nimport { PublicKey, SYSTEM_PROGRAM_ID } from \"@rialo/ts-cdk\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from \"../constants\";\nimport type { Instruction } from \"./transfer\";\n\n/**\n * Options for creating an Associated Token Account instruction.\n */\nexport interface CreateAssociatedTokenAccountInstructionOptions {\n /** Account paying for the new account's rent */\n payer: PublicKey;\n /** The ATA address (derived via findAssociatedTokenAddress) */\n associatedToken: PublicKey;\n /** The wallet that will own the new token account */\n owner: PublicKey;\n /** The token mint */\n mint: PublicKey;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates an instruction to create an Associated Token Account.\n *\n * The ATA is a PDA derived from the wallet, token program, and mint.\n * This instruction will create the account if it doesn't exist.\n *\n * Note: This instruction has no data - all information is in the accounts.\n *\n * @param options - Options for the instruction\n * @returns The CreateAssociatedTokenAccount instruction\n *\n * @example\n * ```typescript\n * const { address: ata } = findAssociatedTokenAddress({ wallet: walletPubkey, mint: mintPubkey });\n *\n * const instruction = createAssociatedTokenAccountInstruction({\n * payer: payerPubkey,\n * associatedToken: ata,\n * owner: walletPubkey,\n * mint: mintPubkey,\n * });\n *\n * const tx = TransactionBuilder.create()\n * .setPayer(payerPubkey)\n * .addInstruction(instruction)\n * .build();\n * ```\n */\nexport function createAssociatedTokenAccountInstruction({\n payer,\n associatedToken,\n owner,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: CreateAssociatedTokenAccountInstructionOptions): Instruction {\n const associatedTokenProgramId = PublicKey.fromString(ASSOCIATED_TOKEN_PROGRAM_ID);\n const systemProgramId = PublicKey.fromString(SYSTEM_PROGRAM_ID);\n\n // Account order for CreateAssociatedTokenAccount:\n // 0. [writable, signer] Funding account (payer)\n // 1. [writable] Associated token account address (to be created)\n // 2. [] Wallet address (owner of the new account)\n // 3. [] Token mint\n // 4. [] System program\n // 5. [] Token program\n\n return {\n programId: associatedTokenProgramId,\n accounts: [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: associatedToken, isSigner: false, isWritable: true },\n { pubkey: owner, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: systemProgramId, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ],\n // CreateAssociatedTokenAccount has no instruction data\n data: new Uint8Array(0),\n };\n}\n\n/**\n * Options for creating an idempotent Associated Token Account instruction.\n */\nexport interface CreateAssociatedTokenAccountIdempotentInstructionOptions {\n /** Account paying for the new account's rent */\n payer: PublicKey;\n /** The ATA address (derived via findAssociatedTokenAddress) */\n associatedToken: PublicKey;\n /** The wallet that will own the new token account */\n owner: PublicKey;\n /** The token mint */\n mint: PublicKey;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates an instruction to create an Associated Token Account idempotently.\n *\n * This variant will succeed even if the ATA already exists, making it safe\n * to call without checking if the account exists first.\n *\n * @param options - Options for the instruction\n * @returns The CreateAssociatedTokenAccountIdempotent instruction\n *\n * @example\n * ```typescript\n * // Safe to call even if ATA already exists\n * const instruction = createAssociatedTokenAccountIdempotentInstruction({\n * payer: payerPubkey,\n * associatedToken: ata,\n * owner: walletPubkey,\n * mint: mintPubkey,\n * });\n * ```\n */\nexport function createAssociatedTokenAccountIdempotentInstruction({\n payer,\n associatedToken,\n owner,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: CreateAssociatedTokenAccountIdempotentInstructionOptions): Instruction {\n const associatedTokenProgramId = PublicKey.fromString(ASSOCIATED_TOKEN_PROGRAM_ID);\n const systemProgramId = PublicKey.fromString(SYSTEM_PROGRAM_ID);\n\n return {\n programId: associatedTokenProgramId,\n accounts: [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: associatedToken, isSigner: false, isWritable: true },\n { pubkey: owner, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: systemProgramId, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ],\n // Idempotent variant uses instruction discriminator 1\n data: new Uint8Array([1]),\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Shared byte manipulation utilities for instruction builders.\n */\n\nexport function writeU64LE({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value: bigint;\n}): void {\n for (let i = 0; i < 8; i++) {\n data[offset + i] = Number((value >> BigInt(i * 8)) & 0xffn);\n }\n}\n\n/**\n * Writes an unsigned 16-bit integer (little-endian) to the data buffer.\n */\nexport function writeU16LE({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value: number;\n}): void {\n data[offset] = value & 0xff;\n data[offset + 1] = (value >> 8) & 0xff;\n}\n\n/**\n * Writes a signed 16-bit integer (little-endian) to the data buffer.\n */\nexport function writeI16LE({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value: number;\n}): void {\n const view = new DataView(data.buffer, data.byteOffset + offset, 2);\n view.setInt16(0, value, true);\n}\n\n/**\n * Writes a signed 64-bit integer (little-endian) to the data buffer.\n */\nexport function writeI64LE({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value: bigint;\n}): void {\n const encoded = value < 0 ? value + 0x10000000000000000n : value;\n for (let i = 0; i < 8; i++) {\n data[offset + i] = Number((encoded >> BigInt(i * 8)) & 0xffn);\n }\n}\n\n/**\n * Writes a 64-bit float (little-endian) to the data buffer.\n */\nexport function writeF64LE({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value: number;\n}): void {\n const view = new DataView(data.buffer, data.byteOffset + offset, 8);\n view.setFloat64(0, value, true);\n}\n\n/**\n * Writes a signed 8-bit integer to the data buffer.\n */\nexport function writeI8({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value: number;\n}): void {\n const view = new DataView(data.buffer, data.byteOffset + offset, 1);\n view.setInt8(0, value);\n}\n\n/**\n * Writes bytes to the data buffer.\n */\nexport function writeBytes({\n data,\n offset,\n value,\n expectedLength,\n}: {\n data: Uint8Array;\n offset: number;\n value: Uint8Array;\n expectedLength: number;\n}): void {\n data.set(value.slice(0, expectedLength), offset);\n}\n\n/**\n * Writes optional bytes to the data buffer, or leaves zeros if null/undefined.\n */\nexport function writeOptionalNonZeroBytes({\n data,\n offset,\n value,\n expectedLength,\n}: {\n data: Uint8Array;\n offset: number;\n value?: Uint8Array | null;\n expectedLength: number;\n}): void {\n if (value) {\n data.set(value.slice(0, expectedLength), offset);\n }\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Shared utility functions for instruction builders.\n *\n * ## Multisig vs Single-Signer Pattern\n *\n * SPL Token supports two signing modes for authority-controlled operations:\n *\n * 1. **Single-signer mode**: The authority account itself signs the transaction.\n * - Pass an empty `signers` array (or omit it)\n * - The authority's `isSigner` flag is set to `true`\n *\n * 2. **Multisig mode**: A multisig account is the authority, and M-of-N\n * designated signers must sign the transaction.\n * - Pass the signer public keys in the `signers` array\n * - The authority's `isSigner` flag is set to `false` (the multisig account doesn't sign)\n * - Each signer in the array has `isSigner: true`\n *\n * Use `isAuthoritySigner()` to determine the authority's `isSigner` flag,\n * and `appendSigners()` to add multisig signer accounts.\n */\n\nimport type { PublicKey } from \"@rialo/ts-cdk\";\nimport type { Instruction } from \"./transfer\";\n\nexport { writeOptionalNonZeroBytes, writeU16LE, writeU64LE } from \"../utils/bytes\";\n\n/**\n * Determines whether the authority account should have `isSigner: true`.\n *\n * In single-signer mode (no multisig signers), the authority signs directly.\n * In multisig mode, the authority is a multisig account that doesn't sign;\n * instead, the M-of-N signers sign.\n *\n * @returns `true` if authority should sign (single-signer mode), `false` for multisig mode\n */\nexport function isAuthoritySigner({ signers }: { signers?: PublicKey[] }): boolean {\n return (signers?.length ?? 0) === 0;\n}\n\n/**\n * Writes a public key to the data buffer, or leaves zeros if null/undefined.\n */\nexport function writeOptionalNonZeroPubkey({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value?: PublicKey | null;\n}): void {\n if (value) {\n data.set(value.toBytes(), offset);\n }\n}\n\n/**\n * Writes a COption<Pubkey> to the data buffer.\n *\n * Format: 1-byte tag (0=None, 1=Some) + 32-byte pubkey if Some.\n *\n * @returns Number of bytes written.\n */\nexport function writeCOptionPubkey({\n data,\n offset,\n value,\n}: {\n data: Uint8Array;\n offset: number;\n value?: PublicKey | null;\n}): number {\n if (value) {\n data[offset] = 1;\n data.set(value.toBytes(), offset + 1);\n return 33;\n }\n data[offset] = 0;\n return 1;\n}\n\n/**\n * Appends multisig signer accounts to the accounts array.\n *\n * In multisig mode, each signer account must be included after the authority\n * account with `isSigner: true`. Call this after adding the authority account.\n *\n * @see isAuthoritySigner for determining the authority's isSigner flag\n */\nexport function appendSigners({\n accounts,\n signers,\n}: {\n accounts: Instruction[\"accounts\"];\n signers?: PublicKey[];\n}): void {\n for (const signer of signers ?? []) {\n accounts.push({ pubkey: signer, isSigner: true, isWritable: false });\n }\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\nimport type { Instruction } from \"./transfer\";\nimport { appendSigners, isAuthoritySigner, writeOptionalNonZeroPubkey } from \"./utils\";\n\nconst METADATA_POINTER_INSTRUCTION_INITIALIZE = 0;\nconst METADATA_POINTER_INSTRUCTION_UPDATE = 1;\n\n/**\n * Options for creating a MetadataPointer Initialize instruction.\n */\nexport interface InitializeMetadataPointerInstructionOptions {\n /** Mint account to initialize */\n mint: PublicKey;\n /** Optional authority that can update the metadata address */\n authority?: PublicKey | null;\n /** Optional metadata address */\n metadataAddress?: PublicKey | null;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a MetadataPointer Initialize instruction.\n *\n * Instruction data format:\n * [token_instruction(1), metadata_pointer_instruction(1), authority(32), metadata_address(32)]\n */\nexport function initializeMetadataPointerInstruction({\n mint,\n authority,\n metadataAddress,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: InitializeMetadataPointerInstructionOptions): Instruction {\n const data = new Uint8Array(66);\n data[0] = TokenInstruction.MetadataPointerExtension;\n data[1] = METADATA_POINTER_INSTRUCTION_INITIALIZE;\n writeOptionalNonZeroPubkey({ data, offset: 2, value: authority ?? null });\n writeOptionalNonZeroPubkey({\n data,\n offset: 34,\n value: metadataAddress ?? null,\n });\n\n return {\n programId,\n accounts: [{ pubkey: mint, isSigner: false, isWritable: true }],\n data,\n };\n}\n\n/**\n * Options for creating a MetadataPointer Update instruction.\n */\nexport interface UpdateMetadataPointerInstructionOptions {\n /** Mint account to update */\n mint: PublicKey;\n /** Authority that can update the metadata address */\n authority: PublicKey;\n /** Optional metadata address */\n metadataAddress?: PublicKey | null;\n /** Optional multisig signer accounts */\n signers?: PublicKey[];\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a MetadataPointer Update instruction.\n *\n * Instruction data format:\n * [token_instruction(1), metadata_pointer_instruction(1), metadata_address(32)]\n */\nexport function updateMetadataPointerInstruction({\n mint,\n authority,\n metadataAddress,\n signers,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: UpdateMetadataPointerInstructionOptions): Instruction {\n const data = new Uint8Array(34);\n data[0] = TokenInstruction.MetadataPointerExtension;\n data[1] = METADATA_POINTER_INSTRUCTION_UPDATE;\n writeOptionalNonZeroPubkey({\n data,\n offset: 2,\n value: metadataAddress ?? null,\n });\n\n const accounts: Instruction[\"accounts\"] = [\n { pubkey: mint, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: isAuthoritySigner({ signers }), isWritable: false },\n ];\n appendSigners({ accounts, signers });\n\n return { programId, accounts, data };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\nimport type { Instruction } from \"./transfer\";\nimport { appendSigners, isAuthoritySigner, writeU64LE } from \"./utils\";\n\n/**\n * Options for creating an InitializeMint2 instruction.\n *\n * InitializeMint2 does not require a rent sysvar account, but does require\n * the tombstone PDA derived from [\"mint_tombstone\", mint_pubkey].\n */\nexport interface InitializeMintInstructionOptions {\n /** Mint account to initialize */\n mint: PublicKey;\n /** Number of decimals for the mint */\n decimals: number;\n /** Authority allowed to mint new tokens */\n mintAuthority: PublicKey;\n /** Optional freeze authority for the mint */\n freezeAuthority?: PublicKey;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates an InitializeMint2 instruction for Token-2022.\n *\n * Instruction data format:\n * [discriminator(1), decimals(1), mint_authority(32), freeze_option(1), freeze_authority(32)]\n *\n * Accounts:\n * - mint (writable)\n * - tombstone_pda (readonly)\n *\n * @param options - Options for the instruction\n * @returns The InitializeMint2 instruction\n *\n * @example\n * ```typescript\n * const instruction = initializeMintInstruction({\n * mint,\n * decimals: 6,\n * mintAuthority,\n * freezeAuthority,\n * });\n * ```\n */\nexport function initializeMintInstruction({\n mint,\n decimals,\n mintAuthority,\n freezeAuthority,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: InitializeMintInstructionOptions): Instruction {\n // SPL Token uses 1-byte discriminator: [discriminator(1), decimals(1), mint_authority(32), freeze_option(1), freeze_authority(32)]\n const data = new Uint8Array(67);\n\n data[0] = TokenInstruction.InitializeMint2; // 20\n data[1] = decimals;\n data.set(mintAuthority.toBytes(), 2);\n\n if (freezeAuthority) {\n data[34] = 1; // COption::Some\n data.set(freezeAuthority.toBytes(), 35);\n } else {\n data[34] = 0; // COption::None\n // bytes 35-66 remain zeroed\n }\n\n // Derive tombstone PDA: seeds = [\"mint_tombstone\", mint_pubkey]\n const [tombstonePda] = PublicKey.findProgramAddress(\n [\"mint_tombstone\", mint.toBytes()],\n programId\n );\n\n return {\n programId,\n accounts: [\n { pubkey: mint, isSigner: false, isWritable: true },\n { pubkey: tombstonePda, isSigner: false, isWritable: false },\n ],\n data,\n };\n}\n\n/**\n * Options for creating a MintTo instruction.\n */\nexport interface MintToInstructionOptions {\n /** Mint account to mint tokens from */\n mint: PublicKey;\n /** Destination token account to receive minted tokens */\n destination: PublicKey;\n /** Mint authority (signer) */\n authority: PublicKey;\n /** Amount to mint in smallest units */\n amount: bigint;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n /** Optional multisig signer accounts */\n signers?: PublicKey[];\n}\n\n/**\n * Creates a MintTo instruction for Token-2022.\n *\n * Instruction data format: [discriminator(1), amount(8 LE)]\n *\n * Accounts:\n * - mint (writable)\n * - destination (writable)\n * - authority (signer)\n *\n * @param options - Options for the instruction\n * @returns The MintTo instruction\n *\n * @example\n * ```typescript\n * const instruction = mintToInstruction({\n * mint,\n * destination,\n * authority,\n * amount: 1_000_000n,\n * });\n * ```\n */\nexport function mintToInstruction({\n mint,\n destination,\n authority,\n amount,\n signers,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: MintToInstructionOptions): Instruction {\n const data = new Uint8Array(9);\n data[0] = TokenInstruction.MintTo; // 7\n writeU64LE({ data, offset: 1, value: amount });\n\n const accounts: Instruction[\"accounts\"] = [\n { pubkey: mint, isSigner: false, isWritable: true },\n { pubkey: destination, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: isAuthoritySigner({ signers }), isWritable: false },\n ];\n appendSigners({ accounts, signers });\n\n return { programId, accounts, data };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\nimport type { Instruction } from \"./transfer\";\n\n/**\n * Options for creating an InitializeNonTransferableMint instruction.\n */\nexport interface InitializeNonTransferableMintInstructionOptions {\n /** Mint to initialize */\n mint: PublicKey;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates an InitializeNonTransferableMint instruction.\n *\n * Instruction data format:\n * [token_instruction(1)]\n */\nexport function initializeNonTransferableMintInstruction({\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: InitializeNonTransferableMintInstructionOptions): Instruction {\n return {\n programId,\n accounts: [{ pubkey: mint, isSigner: false, isWritable: true }],\n data: new Uint8Array([TokenInstruction.InitializeNonTransferableMint]),\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\nimport type { Instruction } from \"./transfer\";\n\n/**\n * Options for creating an InitializePermanentDelegate instruction.\n */\nexport interface InitializePermanentDelegateInstructionOptions {\n /** Mint to initialize */\n mint: PublicKey;\n /** Permanent delegate authority */\n delegate: PublicKey;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates an InitializePermanentDelegate instruction.\n *\n * Instruction data format:\n * [token_instruction(1), delegate_pubkey(32)]\n */\nexport function initializePermanentDelegateInstruction({\n mint,\n delegate,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: InitializePermanentDelegateInstructionOptions): Instruction {\n const data = new Uint8Array(33);\n data[0] = TokenInstruction.InitializePermanentDelegate;\n data.set(delegate.toBytes(), 1);\n\n return {\n programId,\n accounts: [{ pubkey: mint, isSigner: false, isWritable: true }],\n data,\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * TransferChecked instruction for SPL Token-2022.\n *\n * TransferChecked is the preferred transfer instruction as it includes\n * a decimals check to prevent user error.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\nimport { appendSigners, isAuthoritySigner, writeU64LE } from \"./utils\";\n\n/**\n * Account metadata for an instruction account.\n */\nexport interface AccountMeta {\n pubkey: PublicKey;\n isSigner: boolean;\n isWritable: boolean;\n}\n\n/**\n * A single instruction to be included in a transaction.\n */\nexport interface Instruction {\n programId: PublicKey;\n accounts: AccountMeta[];\n data: Uint8Array;\n}\n\n/**\n * Options for creating a TransferChecked instruction.\n */\nexport interface TransferCheckedInstructionOptions {\n /** Source token account (must be owned by authority) */\n source: PublicKey;\n /** The token mint */\n mint: PublicKey;\n /** Destination token account */\n destination: PublicKey;\n /** Owner of the source account (signer) */\n authority: PublicKey;\n /** Amount to transfer in smallest units */\n amount: bigint;\n /** Expected decimals of the mint (for verification) */\n decimals: number;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n /** Optional multisig signer accounts */\n signers?: PublicKey[];\n}\n\n/**\n * Creates a TransferChecked instruction.\n *\n * TransferChecked transfers tokens from one token account to another,\n * with a decimals check to prevent accidental transfers of the wrong amount.\n *\n * Instruction data format: [discriminator(1), amount(8 LE), decimals(1)]\n *\n * @param options - Options for the instruction\n * @returns The TransferChecked instruction\n *\n * @example\n * ```typescript\n * const instruction = transferCheckedInstruction({\n * source: sourceTokenAccount,\n * mint: mintPubkey,\n * destination: destinationTokenAccount,\n * authority: walletPubkey,\n * amount: 1000000n, // 1 token with 6 decimals\n * decimals: 6,\n * });\n *\n * const tx = TransactionBuilder.create()\n * .setPayer(walletPubkey)\n * .addInstruction(instruction)\n * .build();\n * ```\n */\nexport function transferCheckedInstruction({\n source,\n mint,\n destination,\n authority,\n amount,\n decimals,\n signers,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: TransferCheckedInstructionOptions): Instruction {\n // Instruction data: [discriminator(1), amount(8), decimals(1)]\n const data = new Uint8Array(10);\n\n // Write discriminator (TransferChecked = 12)\n data[0] = TokenInstruction.TransferChecked;\n\n // Write amount as little-endian u64\n writeU64LE({ data, offset: 1, value: amount });\n\n // Write decimals\n data[9] = decimals;\n\n const accounts: AccountMeta[] = [\n { pubkey: source, isSigner: false, isWritable: true },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: destination, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: isAuthoritySigner({ signers }), isWritable: false },\n ];\n appendSigners({ accounts, signers });\n\n return { programId, accounts, data };\n}\n\n/**\n * Options for creating a Transfer instruction.\n */\nexport interface TransferInstructionOptions {\n /** Source token account */\n source: PublicKey;\n /** Destination token account */\n destination: PublicKey;\n /** Owner of the source account (signer) */\n authority: PublicKey;\n /** Amount to transfer in smallest units */\n amount: bigint;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n /** Optional multisig signer accounts */\n signers?: PublicKey[];\n}\n\n/**\n * Creates a Transfer instruction (deprecated, prefer TransferChecked).\n *\n * This is the legacy transfer instruction without decimals verification.\n * Use transferCheckedInstruction instead for safety.\n *\n * @param options - Options for the instruction\n * @returns The Transfer instruction\n */\nexport function transferInstruction({\n source,\n destination,\n authority,\n amount,\n signers,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: TransferInstructionOptions): Instruction {\n // Instruction data: [discriminator(1), amount(8)]\n const data = new Uint8Array(9);\n\n // Write discriminator (Transfer = 3)\n data[0] = TokenInstruction.Transfer;\n\n // Write amount as little-endian u64\n writeU64LE({ data, offset: 1, value: amount });\n\n const accounts: AccountMeta[] = [\n { pubkey: source, isSigner: false, isWritable: true },\n { pubkey: destination, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: isAuthoritySigner({ signers }), isWritable: false },\n ];\n appendSigners({ accounts, signers });\n\n return { programId, accounts, data };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\nimport type { Instruction } from \"./transfer\";\nimport {\n appendSigners,\n isAuthoritySigner,\n writeCOptionPubkey,\n writeU16LE,\n writeU64LE,\n} from \"./utils\";\n\nconst TRANSFER_FEE_INSTRUCTION_INITIALIZE_CONFIG = 0;\nconst TRANSFER_FEE_INSTRUCTION_TRANSFER_CHECKED_WITH_FEE = 1;\nconst TRANSFER_FEE_INSTRUCTION_SET_TRANSFER_FEE = 5;\n\n/**\n * Options for creating a TransferFee InitializeConfig instruction.\n */\nexport interface InitializeTransferFeeConfigInstructionOptions {\n /** Mint to initialize */\n mint: PublicKey;\n /** Optional authority allowed to update transfer fees */\n transferFeeConfigAuthority?: PublicKey | null;\n /** Optional authority allowed to withdraw withheld fees */\n withdrawWithheldAuthority?: PublicKey | null;\n /** Fee rate in basis points */\n transferFeeBasisPoints: number;\n /** Maximum fee assessed on transfers */\n maximumFee: bigint;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a TransferFee InitializeConfig instruction.\n *\n * Instruction data format:\n * [token_instruction(1), transfer_fee_instruction(1),\n * transfer_fee_config_authority(COption<Pubkey>),\n * withdraw_withheld_authority(COption<Pubkey>),\n * transfer_fee_basis_points(2), maximum_fee(8)]\n */\nexport function initializeTransferFeeConfigInstruction({\n mint,\n transferFeeConfigAuthority,\n withdrawWithheldAuthority,\n transferFeeBasisPoints,\n maximumFee,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: InitializeTransferFeeConfigInstructionOptions): Instruction {\n const authorityLength = transferFeeConfigAuthority ? 33 : 1;\n const withdrawLength = withdrawWithheldAuthority ? 33 : 1;\n const data = new Uint8Array(2 + authorityLength + withdrawLength + 2 + 8);\n data[0] = TokenInstruction.TransferFeeExtension;\n data[1] = TRANSFER_FEE_INSTRUCTION_INITIALIZE_CONFIG;\n let offset = 2;\n offset += writeCOptionPubkey({\n data,\n offset,\n value: transferFeeConfigAuthority ?? null,\n });\n offset += writeCOptionPubkey({\n data,\n offset,\n value: withdrawWithheldAuthority ?? null,\n });\n writeU16LE({ data, offset, value: transferFeeBasisPoints });\n offset += 2;\n writeU64LE({ data, offset, value: maximumFee });\n\n return {\n programId,\n accounts: [{ pubkey: mint, isSigner: false, isWritable: true }],\n data,\n };\n}\n\n/**\n * Options for creating a TransferCheckedWithFee instruction.\n */\nexport interface TransferCheckedWithFeeInstructionOptions {\n /** Source token account */\n source: PublicKey;\n /** Mint address */\n mint: PublicKey;\n /** Destination token account */\n destination: PublicKey;\n /** Authority that can transfer (owner or delegate) */\n authority: PublicKey;\n /** Amount to transfer */\n amount: bigint;\n /** Expected number of decimals */\n decimals: number;\n /** Expected fee assessed */\n fee: bigint;\n /** Optional multisig signer accounts */\n signers?: PublicKey[];\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a TransferCheckedWithFee instruction.\n *\n * Instruction data format:\n * [token_instruction(1), transfer_fee_instruction(1),\n * amount(8), decimals(1), fee(8)]\n */\nexport function transferCheckedWithFeeInstruction({\n source,\n mint,\n destination,\n authority,\n amount,\n decimals,\n fee,\n signers,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: TransferCheckedWithFeeInstructionOptions): Instruction {\n const data = new Uint8Array(2 + 8 + 1 + 8);\n data[0] = TokenInstruction.TransferFeeExtension;\n data[1] = TRANSFER_FEE_INSTRUCTION_TRANSFER_CHECKED_WITH_FEE;\n writeU64LE({ data, offset: 2, value: amount });\n data[10] = decimals;\n writeU64LE({ data, offset: 11, value: fee });\n\n const accounts: Instruction[\"accounts\"] = [\n { pubkey: source, isSigner: false, isWritable: true },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: destination, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: isAuthoritySigner({ signers }), isWritable: false },\n ];\n appendSigners({ accounts, signers });\n\n return { programId, accounts, data };\n}\n\n/**\n * Options for creating a TransferFee SetTransferFee instruction.\n */\nexport interface SetTransferFeeInstructionOptions {\n /** Mint to update */\n mint: PublicKey;\n /** Authority allowed to set transfer fees */\n authority: PublicKey;\n /** Fee rate in basis points */\n transferFeeBasisPoints: number;\n /** Maximum fee assessed on transfers */\n maximumFee: bigint;\n /** Optional multisig signer accounts */\n signers?: PublicKey[];\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates a TransferFee SetTransferFee instruction.\n *\n * Instruction data format:\n * [token_instruction(1), transfer_fee_instruction(1),\n * transfer_fee_basis_points(2), maximum_fee(8)]\n */\nexport function setTransferFeeInstruction({\n mint,\n authority,\n transferFeeBasisPoints,\n maximumFee,\n signers,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: SetTransferFeeInstructionOptions): Instruction {\n const data = new Uint8Array(2 + 2 + 8);\n data[0] = TokenInstruction.TransferFeeExtension;\n data[1] = TRANSFER_FEE_INSTRUCTION_SET_TRANSFER_FEE;\n writeU16LE({ data, offset: 2, value: transferFeeBasisPoints });\n writeU64LE({ data, offset: 4, value: maximumFee });\n\n const accounts: Instruction[\"accounts\"] = [\n { pubkey: mint, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: isAuthoritySigner({ signers }), isWritable: false },\n ];\n appendSigners({ accounts, signers });\n\n return { programId, accounts, data };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID, TokenInstruction } from \"../constants\";\nimport type { Instruction } from \"./transfer\";\n\nconst TRANSFER_HOOK_INSTRUCTION_INITIALIZE = 0;\n\n/**\n * Options for creating an InitializeTransferHook instruction.\n */\nexport interface InitializeTransferHookInstructionOptions {\n /** Mint to initialize */\n mint: PublicKey;\n /** Authority that can update the hook program */\n authority: PublicKey;\n /** The program invoked on every transfer */\n hookProgramId: PublicKey;\n /** Token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Creates an InitializeTransferHook instruction.\n *\n * Instruction data format:\n * [token_instruction(1), transfer_hook_instruction(1), authority(32), hook_program_id(32)]\n */\nexport function initializeTransferHookInstruction({\n mint,\n authority,\n hookProgramId,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: InitializeTransferHookInstructionOptions): Instruction {\n const data = new Uint8Array(66);\n data[0] = TokenInstruction.TransferHookExtension;\n data[1] = TRANSFER_HOOK_INSTRUCTION_INITIALIZE;\n data.set(authority.toBytes(), 2);\n data.set(hookProgramId.toBytes(), 34);\n\n return {\n programId,\n accounts: [{ pubkey: mint, isSigner: false, isWritable: true }],\n data,\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Error handling for SPL Token operations.\n *\n * This module defines the error types and factory methods for all\n * SPL Token-related operations, following the same pattern as RialoError.\n */\n\n/**\n * Error codes for SPL Token operations.\n */\nexport enum SplTokenErrorCode {\n /** Invalid mint account data */\n INVALID_MINT = \"INVALID_MINT\",\n /** Invalid token account data */\n INVALID_TOKEN_ACCOUNT = \"INVALID_TOKEN_ACCOUNT\",\n /** Token account not found */\n TOKEN_ACCOUNT_NOT_FOUND = \"TOKEN_ACCOUNT_NOT_FOUND\",\n /** Mint account not found */\n MINT_NOT_FOUND = \"MINT_NOT_FOUND\",\n /** Token account is frozen */\n ACCOUNT_FROZEN = \"ACCOUNT_FROZEN\",\n /** Insufficient token balance */\n INSUFFICIENT_BALANCE = \"INSUFFICIENT_BALANCE\",\n /** Invalid extension data */\n INVALID_EXTENSION = \"INVALID_EXTENSION\",\n /** PDA derivation failed */\n PDA_DERIVATION_FAILED = \"PDA_DERIVATION_FAILED\",\n /** Invalid metadata */\n INVALID_METADATA = \"INVALID_METADATA\",\n /** Account not initialized */\n ACCOUNT_NOT_INITIALIZED = \"ACCOUNT_NOT_INITIALIZED\",\n}\n\n/**\n * Constructor options for SplTokenError.\n */\nexport interface SplTokenErrorOptions {\n code: SplTokenErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Error class for SPL Token operations.\n *\n * Provides structured error handling with error codes and optional details.\n * Use the static factory methods for consistent error creation.\n *\n * @example\n * ```typescript\n * // Create errors using factory methods\n * throw SplTokenError.invalidMint({ reason: \"Account data too short\" });\n * throw SplTokenError.tokenAccountNotFound({ address: \"5ZqB9U...\" });\n * throw SplTokenError.insufficientBalance({ required: 1000n, available: 500n });\n *\n * // Handle errors with type information\n * try {\n * await client.getBalance({ wallet, mint });\n * } catch (error) {\n * if (error instanceof SplTokenError && error.code === SplTokenErrorCode.TOKEN_ACCOUNT_NOT_FOUND) {\n * console.log(\"Token account does not exist\");\n * }\n * }\n * ```\n */\nexport class SplTokenError extends Error {\n public readonly code: SplTokenErrorCode;\n public readonly details?: Record<string, unknown>;\n\n public constructor({ code, message, details }: SplTokenErrorOptions) {\n super(message);\n this.name = \"SplTokenError\";\n this.code = code;\n this.details = details;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SplTokenError);\n }\n }\n\n /**\n * Creates an invalid mint error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidMint({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_MINT,\n message: `Invalid mint: ${reason}`,\n });\n }\n\n /**\n * Creates an invalid token account error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidTokenAccount({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_TOKEN_ACCOUNT,\n message: `Invalid token account: ${reason}`,\n });\n }\n\n /**\n * Creates a token account not found error.\n *\n * @param options - Error options containing the address\n */\n public static tokenAccountNotFound({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.TOKEN_ACCOUNT_NOT_FOUND,\n message: `Token account not found: ${address}`,\n details: { address },\n });\n }\n\n /**\n * Creates a mint not found error.\n *\n * @param options - Error options containing the address\n */\n public static mintNotFound({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.MINT_NOT_FOUND,\n message: `Mint not found: ${address}`,\n details: { address },\n });\n }\n\n /**\n * Creates an account frozen error.\n *\n * @param options - Error options containing the address\n */\n public static accountFrozen({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.ACCOUNT_FROZEN,\n message: `Token account is frozen: ${address}`,\n details: { address },\n });\n }\n\n /**\n * Creates an insufficient balance error.\n *\n * @param options - Error options containing required and available amounts\n */\n public static insufficientBalance({\n required,\n available,\n }: {\n required: bigint;\n available: bigint;\n }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INSUFFICIENT_BALANCE,\n message: `Insufficient balance: required ${required}, available ${available}`,\n details: { required: required.toString(), available: available.toString() },\n });\n }\n\n /**\n * Creates an invalid extension error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidExtension({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_EXTENSION,\n message: `Invalid extension: ${reason}`,\n });\n }\n\n /**\n * Creates a PDA derivation failed error.\n *\n * @param options - Error options containing the reason\n */\n public static pdaDerivationFailed({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.PDA_DERIVATION_FAILED,\n message: `PDA derivation failed: ${reason}`,\n });\n }\n\n /**\n * Creates an invalid metadata error.\n *\n * @param options - Error options containing the reason\n */\n public static invalidMetadata({ reason }: { reason: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.INVALID_METADATA,\n message: `Invalid metadata: ${reason}`,\n });\n }\n\n /**\n * Creates an account not initialized error.\n *\n * @param options - Error options containing the address\n */\n public static accountNotInitialized({ address }: { address: string }): SplTokenError {\n return new SplTokenError({\n code: SplTokenErrorCode.ACCOUNT_NOT_INITIALIZED,\n message: `Account not initialized: ${address}`,\n details: { address },\n });\n }\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Associated Token Address (ATA) derivation for SPL Token-2022.\n *\n * ATAs are Program Derived Addresses (PDAs) that provide a deterministic\n * token account address for any wallet/mint combination.\n */\n\nimport { sha256 } from \"@noble/hashes/sha2\";\nimport { isOnCurve, PublicKey } from \"@rialo/ts-cdk\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { AtaDerivationResult } from \"../types\";\n\n/**\n * Creates a Program Derived Address (PDA).\n *\n * @param options - Options containing seeds and programId\n * @returns The derived address and bump seed, or null if no valid bump found\n */\nfunction createProgramAddress({\n seeds,\n programId,\n}: {\n seeds: Uint8Array[];\n programId: PublicKey;\n}): { address: PublicKey; bump: number } | null {\n // Try bump values from 255 down to 0\n for (let bump = 255; bump >= 0; bump--) {\n const bumpSeed = new Uint8Array([bump]);\n\n // Concatenate all seeds + bump + program_id + \"ProgramDerivedAddress\"\n const allSeeds = [...seeds, bumpSeed];\n const programIdBytes = programId.toBytes();\n const pda_marker = new TextEncoder().encode(\"ProgramDerivedAddress\");\n\n // Calculate total length\n let totalLength = 0;\n for (const seed of allSeeds) {\n totalLength += seed.length;\n }\n totalLength += programIdBytes.length + pda_marker.length;\n\n // Create combined buffer\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const seed of allSeeds) {\n combined.set(seed, offset);\n offset += seed.length;\n }\n combined.set(programIdBytes, offset);\n offset += programIdBytes.length;\n combined.set(pda_marker, offset);\n\n // Hash\n const hash = sha256(combined);\n\n // Check if result is NOT on curve (valid PDA)\n if (!isOnCurve(hash)) {\n return {\n address: PublicKey.fromBytes(hash),\n bump,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Options for finding an Associated Token Address.\n */\nexport interface FindAssociatedTokenAddressOptions {\n /** The wallet's public key (owner of the token account) */\n wallet: PublicKey;\n /** The token mint's public key */\n mint: PublicKey;\n /** The token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Finds the Associated Token Address for a wallet and mint.\n *\n * The ATA is derived using the following seeds:\n * - wallet address (32 bytes)\n * - token program ID (32 bytes)\n * - mint address (32 bytes)\n *\n * @param options - Options containing wallet, mint, and optional programId\n * @returns The derived ATA address and bump seed\n * @throws {SplTokenError} If PDA derivation fails\n *\n * @example\n * ```typescript\n * const { address, bump } = findAssociatedTokenAddress({ wallet: walletPubkey, mint: mintPubkey });\n * console.log(`ATA: ${address.toString()}`);\n * console.log(`Bump: ${bump}`);\n * ```\n */\nexport function findAssociatedTokenAddress({\n wallet,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: FindAssociatedTokenAddressOptions): AtaDerivationResult {\n const associatedTokenProgramId = PublicKey.fromString(ASSOCIATED_TOKEN_PROGRAM_ID);\n\n // Seeds: [wallet, token_program_id, mint]\n const seeds = [wallet.toBytes(), programId.toBytes(), mint.toBytes()];\n\n const result = createProgramAddress({ seeds, programId: associatedTokenProgramId });\n\n if (!result) {\n throw SplTokenError.pdaDerivationFailed({\n reason: `Could not find valid PDA for wallet=${wallet.toString()}, mint=${mint.toString()}`,\n });\n }\n\n return result;\n}\n\n/**\n * Options for getting the Associated Token Address synchronously.\n */\nexport interface GetAssociatedTokenAddressSyncOptions {\n /** The wallet's public key */\n wallet: PublicKey;\n /** The token mint's public key */\n mint: PublicKey;\n /** The token program ID (defaults to Token-2022) */\n programId?: PublicKey;\n}\n\n/**\n * Gets the Associated Token Address without the bump seed.\n *\n * Convenience function when you only need the address.\n *\n * @param options - Options containing wallet, mint, and optional programId\n * @returns The derived ATA address\n */\nexport function getAssociatedTokenAddressSync({\n wallet,\n mint,\n programId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n}: GetAssociatedTokenAddressSyncOptions): PublicKey {\n return findAssociatedTokenAddress({ wallet, mint, programId }).address;\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Fluent builder for creating SPL Token-2022 mints with extensions.\n *\n * MintBuilder simplifies the process of creating mints by providing a\n * chainable API that handles:\n * - Account size calculation\n * - Rent-exempt balance calculation\n * - Instruction ordering (extensions must be initialized before mint)\n * - Transaction building\n *\n * @example\n * ```typescript\n * import { MintBuilder, createSplTokenClient } from \"@rialo/spl-token\";\n *\n * const tokenClient = createSplTokenClient({ client });\n *\n * const { signature, mintAddress } = await MintBuilder.create(tokenClient)\n * .withDecimals(9)\n * .withMintAuthority(authority)\n * .withMetadata({\n * name: \"My Token\",\n * symbol: \"MTK\",\n * uri: \"https://example.com/metadata.json\",\n * })\n * .send({\n * payer: authority,\n * mintKeypair,\n * validFrom: BigInt(Date.now()),\n * signers: [authorityKeypair, mintKeypair],\n * });\n * ```\n */\n\nimport {\n\tcreateAccount,\n\ttype Keypair,\n\ttype PublicKey,\n\ttype RialoClient,\n\tTransactionBuilder,\n} from \"@rialo/ts-cdk\";\nimport type { SplTokenClient } from \"../client/spl-token-client\";\nimport { ExtensionType } from \"../constants\";\nimport {\n\tgetMetadataExtensionSize,\n\tgetMintSizeWithExtensions,\n} from \"../helpers/size\";\nimport {\n\tcreateAssociatedTokenAccountIdempotentInstruction,\n\tinitializeMetadataPointerInstruction,\n\tinitializeMintInstruction,\n\tinitializeNonTransferableMintInstruction,\n\tinitializePermanentDelegateInstruction,\n\tinitializeTokenMetadataInstruction,\n\tinitializeTransferFeeConfigInstruction,\n\tinitializeTransferHookInstruction,\n\ttype Instruction,\n\tmintToInstruction,\n} from \"../instructions\";\nimport { getAssociatedTokenAddressSync } from \"../pda\";\n\n/**\n * Token metadata configuration for MintBuilder.\n */\nexport interface MintMetadataConfig {\n\t/** Token name */\n\tname: string;\n\t/** Token symbol */\n\tsymbol: string;\n\t/** Token URI (typically points to JSON metadata) */\n\turi: string;\n\t/** Optional additional metadata key-value pairs */\n\tadditionalMetadata?: Array<[string, string]>;\n}\n\n/**\n * Transfer fee configuration for MintBuilder.\n */\nexport interface MintTransferFeeConfig {\n\t/** Transfer fee authority */\n\ttransferFeeConfigAuthority: PublicKey;\n\t/** Withdraw withheld authority */\n\twithdrawWithheldAuthority: PublicKey;\n\t/** Fee rate in basis points (100 = 1%) */\n\ttransferFeeBasisPoints: number;\n\t/** Maximum fee in smallest units */\n\tmaximumFee: bigint;\n}\n\n/**\n * Initial mint configuration for MintBuilder.\n */\nexport interface MintInitialSupplyConfig {\n\t/** Wallet address to receive initial tokens (ATA will be derived) */\n\tdestination: PublicKey;\n\t/** Amount to mint in smallest units */\n\tamount: bigint;\n}\n\n/**\n * Options for building a mint transaction.\n */\nexport interface MintBuildOptions {\n\t/** Fee payer for the transaction */\n\tpayer: PublicKey;\n\t/** Keypair for the new mint account */\n\tmintKeypair: Keypair;\n\t/** Transaction validity timestamp */\n\tvalidFrom: bigint;\n}\n\n/**\n * Options for sending a mint transaction.\n */\nexport interface MintSendOptions extends MintBuildOptions {\n\t/** Keypairs for signing the transaction (must include payer and mintKeypair) */\n\tsigners: Keypair[];\n}\n\n/**\n * Result of building a mint transaction.\n */\nexport interface MintBuildResult {\n\t/** The built transaction, ready for signing */\n\ttransaction: ReturnType<typeof TransactionBuilder.prototype.build>;\n\t/** The mint address */\n\tmintAddress: PublicKey;\n\t/** The ATA address if initial supply was configured */\n\tataAddress?: PublicKey;\n}\n\n/**\n * Result of sending a mint transaction.\n */\nexport interface MintSendResult {\n\t/** Transaction signature */\n\tsignature: string;\n\t/** The mint address */\n\tmintAddress: PublicKey;\n\t/** The ATA address if initial supply was configured */\n\tataAddress?: PublicKey;\n}\n\n/**\n * Fluent builder for creating SPL Token-2022 mints with extensions.\n *\n * Use `MintBuilder.create(tokenClient)` to start building.\n */\nexport class MintBuilder {\n\tprivate readonly client: RialoClient;\n\tprivate readonly programId: PublicKey;\n\n\t// Default of 9 matches SOL and most major Solana tokens (e.g. USDC uses 6, native SOL uses 9).\n\t// SPL Token-2022 stores decimals as a u8, so the valid range is 0–255.\n\tprivate decimals: number = 9;\n\tprivate mintAuthority: PublicKey | null = null;\n\tprivate freezeAuthority: PublicKey | null = null;\n\tprivate metadata: MintMetadataConfig | null = null;\n\tprivate transferFee: MintTransferFeeConfig | null = null;\n\tprivate nonTransferable: boolean = false;\n\tprivate permanentDelegate: PublicKey | null = null;\n\tprivate transferHook: { authority: PublicKey; programId: PublicKey } | null =\n\t\tnull;\n\tprivate initialSupply: MintInitialSupplyConfig | null = null;\n\n\tprivate constructor(tokenClient: SplTokenClient, client: RialoClient) {\n\t\tthis.client = client;\n\t\tthis.programId = tokenClient.getProgramId();\n\t}\n\n\t/**\n\t * Creates a new MintBuilder instance.\n\t *\n\t * @param tokenClient - SplTokenClient instance\n\t * @returns A new MintBuilder\n\t *\n\t * @example\n\t * ```typescript\n\t * const builder = MintBuilder.create(tokenClient);\n\t * ```\n\t */\n\tpublic static create(tokenClient: SplTokenClient): MintBuilder {\n\t\treturn new MintBuilder(tokenClient, tokenClient.getRialoClient());\n\t}\n\n\t/**\n\t * Sets the number of decimals for the token.\n\t *\n\t * SPL Token-2022 stores decimals as a u8, so values from 0 to 255 are\n\t * valid at the protocol level. Common choices are 6 (USDC-style) or 9\n\t * (SOL-style). Values above 9 are uncommon on Solana but fully supported.\n\t *\n\t * @param decimals - Number of decimals (0-255)\n\t * @returns this for chaining\n\t */\n\tpublic withDecimals(decimals: number): this {\n\t\tif (decimals < 0 || decimals > 255) {\n\t\t\tthrow new Error(\"Decimals must be between 0 and 255\");\n\t\t}\n\t\tthis.decimals = decimals;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the mint authority.\n\t *\n\t * @param authority - Public key of the mint authority\n\t * @returns this for chaining\n\t */\n\tpublic withMintAuthority(authority: PublicKey): this {\n\t\tthis.mintAuthority = authority;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the freeze authority.\n\t *\n\t * @param authority - Public key of the freeze authority\n\t * @returns this for chaining\n\t */\n\tpublic withFreezeAuthority(authority: PublicKey): this {\n\t\tthis.freezeAuthority = authority;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Configures token metadata extension.\n\t *\n\t * This enables both MetadataPointer and TokenMetadata extensions,\n\t * with the metadata stored directly on the mint account.\n\t *\n\t * @param metadata - Token metadata configuration\n\t * @returns this for chaining\n\t */\n\tpublic withMetadata(metadata: MintMetadataConfig): this {\n\t\tthis.metadata = metadata;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Configures transfer fee extension.\n\t *\n\t * @param config - Transfer fee configuration\n\t * @returns this for chaining\n\t */\n\tpublic withTransferFee(config: MintTransferFeeConfig): this {\n\t\tif (this.nonTransferable) {\n\t\t\tthrow new Error(\"Cannot add transfer fee to non-transferable mint\");\n\t\t}\n\t\tthis.transferFee = config;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Makes the mint non-transferable.\n\t *\n\t * Non-transferable tokens (soulbound tokens) cannot be transferred\n\t * after minting.\n\t *\n\t * @returns this for chaining\n\t */\n\tpublic withNonTransferable(): this {\n\t\tif (this.transferFee) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot make mint non-transferable when transfer fee is configured\",\n\t\t\t);\n\t\t}\n\t\tthis.nonTransferable = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Configures permanent delegate extension.\n\t *\n\t * A permanent delegate has unrestricted transfer and burn authority\n\t * over all token accounts for this mint.\n\t *\n\t * @param delegate - Public key of the permanent delegate\n\t * @returns this for chaining\n\t */\n\tpublic withPermanentDelegate(delegate: PublicKey): this {\n\t\tthis.permanentDelegate = delegate;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Configures transfer hook extension.\n\t *\n\t * A transfer hook invokes a specified program on every token transfer,\n\t * enabling custom transfer logic (e.g., compliance checks, royalties).\n\t *\n\t * @param config - Transfer hook configuration\n\t * @returns this for chaining\n\t */\n\tpublic withTransferHook(config: {\n\t\tauthority: PublicKey;\n\t\tprogramId: PublicKey;\n\t}): this {\n\t\tthis.transferHook = config;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Configures initial token supply to mint after creation.\n\t *\n\t * The tokens will be minted to an Associated Token Account (ATA)\n\t * derived from the destination wallet.\n\t *\n\t * @param config - Initial supply configuration\n\t * @returns this for chaining\n\t */\n\tpublic withInitialSupply(config: MintInitialSupplyConfig): this {\n\t\tthis.initialSupply = config;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Builds the mint transaction without sending.\n\t *\n\t * @param options - Build options\n\t * @returns Build result with transaction and addresses\n\t *\n\t * @example\n\t * ```typescript\n\t * const { transaction, mintAddress } = await builder.build({\n\t * payer: authority,\n\t * mintKeypair,\n\t * validFrom: BigInt(Date.now()),\n\t * });\n\t *\n\t * // Sign manually\n\t * const signed = transaction.sign(authorityKeypair).sign(mintKeypair);\n\t * await client.sendAndConfirmTransaction(signed.serialize());\n\t * ```\n\t */\n\tpublic async build(options: MintBuildOptions): Promise<MintBuildResult> {\n\t\tconst { payer, mintKeypair, validFrom } = options;\n\t\tconst mintAddress = mintKeypair.publicKey;\n\n\t\tif (!this.mintAuthority) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Mint authority is required. Call withMintAuthority() first.\",\n\t\t\t);\n\t\t}\n\n\t\t// Calculate extensions and sizes\n\t\tconst extensions = this.getExtensions();\n\n\t\t// Calculate size for account creation (pointer only if metadata exists)\n\t\t// Metadata is added via separate instruction that extends the account\n\t\tconst createAccountExtensions = extensions.filter(\n\t\t\t(ext) => ext !== ExtensionType.TokenMetadata,\n\t\t);\n\t\tconst createAccountSize = getMintSizeWithExtensions({\n\t\t\textensions: createAccountExtensions,\n\t\t\tmetadataSize: undefined,\n\t\t});\n\n\t\t// Calculate rent for the FULL eventual size (including metadata)\n\t\t// This is critical: the account needs enough lamports to be rent-exempt\n\t\t// for its final size after metadata is added\n\t\tlet rentSize = createAccountSize;\n\t\tif (this.metadata) {\n\t\t\tconst metadataSize = getMetadataExtensionSize({\n\t\t\t\tname: this.metadata.name,\n\t\t\t\tsymbol: this.metadata.symbol,\n\t\t\t\turi: this.metadata.uri,\n\t\t\t\tadditionalMetadata: this.metadata.additionalMetadata,\n\t\t\t});\n\t\t\trentSize = getMintSizeWithExtensions({\n\t\t\t\textensions,\n\t\t\t\tmetadataSize,\n\t\t\t});\n\t\t}\n\n\t\tconst rent = await this.client.getMinimumBalanceForRentExemption(\n\t\t\tBigInt(rentSize),\n\t\t);\n\n\t\t// Build instructions - use any[] to accommodate different Instruction types\n\t\tconst instructions: Array<Instruction | ReturnType<typeof createAccount>> =\n\t\t\t[];\n\n\t\t// 1. Create account\n\t\tinstructions.push(\n\t\t\tcreateAccount(\n\t\t\t\tpayer,\n\t\t\t\tmintAddress,\n\t\t\t\trent,\n\t\t\t\tBigInt(createAccountSize),\n\t\t\t\tthis.programId,\n\t\t\t),\n\t\t);\n\n\t\t// 2. Initialize extensions (must be before InitializeMint)\n\t\tif (this.metadata) {\n\t\t\tinstructions.push(\n\t\t\t\tinitializeMetadataPointerInstruction({\n\t\t\t\t\tmint: mintAddress,\n\t\t\t\t\tauthority: this.mintAuthority,\n\t\t\t\t\tmetadataAddress: mintAddress, // Self-referential for on-mint metadata\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (this.transferFee) {\n\t\t\tinstructions.push(\n\t\t\t\tinitializeTransferFeeConfigInstruction({\n\t\t\t\t\tmint: mintAddress,\n\t\t\t\t\ttransferFeeConfigAuthority:\n\t\t\t\t\t\tthis.transferFee.transferFeeConfigAuthority,\n\t\t\t\t\twithdrawWithheldAuthority: this.transferFee.withdrawWithheldAuthority,\n\t\t\t\t\ttransferFeeBasisPoints: this.transferFee.transferFeeBasisPoints,\n\t\t\t\t\tmaximumFee: this.transferFee.maximumFee,\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (this.nonTransferable) {\n\t\t\tinstructions.push(\n\t\t\t\tinitializeNonTransferableMintInstruction({\n\t\t\t\t\tmint: mintAddress,\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (this.permanentDelegate) {\n\t\t\tinstructions.push(\n\t\t\t\tinitializePermanentDelegateInstruction({\n\t\t\t\t\tmint: mintAddress,\n\t\t\t\t\tdelegate: this.permanentDelegate,\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (this.transferHook) {\n\t\t\tinstructions.push(\n\t\t\t\tinitializeTransferHookInstruction({\n\t\t\t\t\tmint: mintAddress,\n\t\t\t\t\tauthority: this.transferHook.authority,\n\t\t\t\t\thookProgramId: this.transferHook.programId,\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\t// 3. Initialize mint\n\t\tinstructions.push(\n\t\t\tinitializeMintInstruction({\n\t\t\t\tmint: mintAddress,\n\t\t\t\tdecimals: this.decimals,\n\t\t\t\tmintAuthority: this.mintAuthority,\n\t\t\t\tfreezeAuthority: this.freezeAuthority ?? undefined,\n\t\t\t\tprogramId: this.programId,\n\t\t\t}),\n\t\t);\n\n\t\t// 4. Initialize token metadata (must be after InitializeMint)\n\t\tif (this.metadata) {\n\t\t\tinstructions.push(\n\t\t\t\tinitializeTokenMetadataInstruction({\n\t\t\t\t\tmint: mintAddress,\n\t\t\t\t\tupdateAuthority: this.mintAuthority,\n\t\t\t\t\tmintAuthority: this.mintAuthority,\n\t\t\t\t\tname: this.metadata.name,\n\t\t\t\t\tsymbol: this.metadata.symbol,\n\t\t\t\t\turi: this.metadata.uri,\n\t\t\t\t\tadditionalMetadata: this.metadata.additionalMetadata,\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\t// 5. Create ATA and mint initial supply if configured\n\t\tlet ataAddress: PublicKey | undefined;\n\t\tif (this.initialSupply) {\n\t\t\tataAddress = getAssociatedTokenAddressSync({\n\t\t\t\twallet: this.initialSupply.destination,\n\t\t\t\tmint: mintAddress,\n\t\t\t\tprogramId: this.programId,\n\t\t\t});\n\n\t\t\tinstructions.push(\n\t\t\t\tcreateAssociatedTokenAccountIdempotentInstruction({\n\t\t\t\t\tpayer,\n\t\t\t\t\tassociatedToken: ataAddress,\n\t\t\t\t\towner: this.initialSupply.destination,\n\t\t\t\t\tmint: mintAddress,\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tinstructions.push(\n\t\t\t\tmintToInstruction({\n\t\t\t\t\tmint: mintAddress,\n\t\t\t\t\tdestination: ataAddress,\n\t\t\t\t\tauthority: this.mintAuthority,\n\t\t\t\t\tamount: this.initialSupply.amount,\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst configHashPrefix = await this.client.getConfigHashPrefix();\n\n\t\t// Build transaction\n\t\tconst builder = TransactionBuilder.create()\n\t\t\t.setPayer(payer)\n\t\t\t.setValidFrom(validFrom)\n\t\t\t.setConfigHashPrefix(configHashPrefix);\n\n\t\tfor (const instruction of instructions) {\n\t\t\tbuilder.addInstruction(instruction);\n\t\t}\n\n\t\treturn {\n\t\t\ttransaction: builder.build(),\n\t\t\tmintAddress,\n\t\t\tataAddress,\n\t\t};\n\t}\n\n\t/**\n\t * Builds, signs, and sends the mint transaction.\n\t *\n\t * @param options - Send options including signers\n\t * @returns Send result with signature and addresses\n\t *\n\t * @example\n\t * ```typescript\n\t * const { signature, mintAddress } = await builder.send({\n\t * payer: authority,\n\t * mintKeypair,\n\t * validFrom: BigInt(Date.now()),\n\t * signers: [authorityKeypair, mintKeypair],\n\t * });\n\t * ```\n\t */\n\tpublic async send(options: MintSendOptions): Promise<MintSendResult> {\n\t\tconst { signers, ...buildOptions } = options;\n\n\t\tif (signers.length === 0) {\n\t\t\tthrow new Error(\"At least one signer is required\");\n\t\t}\n\n\t\tconst { transaction, mintAddress, ataAddress } =\n\t\t\tawait this.build(buildOptions);\n\n\t\t// Chain .sign() calls for each keypair\n\t\tlet signedTx = transaction;\n\t\tfor (const signer of signers) {\n\t\t\tsignedTx = signedTx.sign(signer);\n\t\t}\n\n\t\tconst result = await this.client.sendAndConfirmTransaction(\n\t\t\tsignedTx.serialize(),\n\t\t);\n\n\t\treturn {\n\t\t\tsignature: result.signature,\n\t\t\tmintAddress,\n\t\t\tataAddress,\n\t\t};\n\t}\n\n\t/**\n\t * Returns the list of extensions that will be enabled.\n\t */\n\tprivate getExtensions(): ExtensionType[] {\n\t\tconst extensions: ExtensionType[] = [];\n\n\t\tif (this.metadata) {\n\t\t\textensions.push(ExtensionType.MetadataPointer);\n\t\t\textensions.push(ExtensionType.TokenMetadata);\n\t\t}\n\n\t\tif (this.transferFee) {\n\t\t\textensions.push(ExtensionType.TransferFeeConfig);\n\t\t}\n\n\t\tif (this.nonTransferable) {\n\t\t\textensions.push(ExtensionType.NonTransferable);\n\t\t}\n\n\t\tif (this.permanentDelegate) {\n\t\t\textensions.push(ExtensionType.PermanentDelegate);\n\t\t}\n\n\t\tif (this.transferHook) {\n\t\t\textensions.push(ExtensionType.TransferHook);\n\t\t}\n\n\t\treturn extensions;\n\t}\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { COPTION_SOME, PUBKEY_SIZE } from \"../constants\";\nimport { SplTokenError } from \"../errors\";\n\nexport function readU16LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n return data[offset] | (data[offset + 1] << 8);\n}\n\nexport function readU32LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n return (\n (data[offset] |\n (data[offset + 1] << 8) |\n (data[offset + 2] << 16) |\n (data[offset + 3] << 24)) >>>\n 0\n );\n}\n\nexport function readU64LE({ data, offset }: { data: Uint8Array; offset: number }): bigint {\n let value = 0n;\n for (let i = 0; i < 8; i++) {\n value |= BigInt(data[offset + i]) << BigInt(i * 8);\n }\n return value;\n}\n\nexport function readI64LE({ data, offset }: { data: Uint8Array; offset: number }): bigint {\n const unsigned = readU64LE({ data, offset });\n const maxSigned = 0x7fffffffffffffffn;\n return unsigned > maxSigned ? unsigned - 0x10000000000000000n : unsigned;\n}\n\nexport function readI16LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n const value = readU16LE({ data, offset });\n return value & 0x8000 ? value - 0x10000 : value;\n}\n\nexport function readF64LE({ data, offset }: { data: Uint8Array; offset: number }): number {\n const view = new DataView(data.buffer, data.byteOffset + offset, 8);\n return view.getFloat64(0, true);\n}\n\nexport function readCOptionPubkey({\n data,\n offset,\n}: {\n data: Uint8Array;\n offset: number;\n}): PublicKey | null {\n // COption<Pubkey> layout: 4-byte LE tag + 32-byte pubkey (when Some) = 36 bytes total.\n if (data.length < offset + 4 + PUBKEY_SIZE) {\n throw SplTokenError.invalidExtension({\n reason: `COption<Pubkey> out of bounds: need ${offset + 4 + PUBKEY_SIZE} bytes, got ${data.length}`,\n });\n }\n const tag = readU32LE({ data, offset });\n if (tag === COPTION_SOME) {\n const pubkeyBytes = data.slice(offset + 4, offset + 4 + PUBKEY_SIZE);\n return PublicKey.fromBytes(pubkeyBytes);\n }\n return null;\n}\n\nexport function readOptionalNonZeroPubkey({\n data,\n offset,\n}: {\n data: Uint8Array;\n offset: number;\n}): PublicKey | null {\n const pubkeyBytes = data.slice(offset, offset + PUBKEY_SIZE);\n const isZero = pubkeyBytes.every(byte => byte === 0);\n return isZero ? null : PublicKey.fromBytes(pubkeyBytes);\n}\n\nexport function readPubkey({ data, offset }: { data: Uint8Array; offset: number }): PublicKey {\n return PublicKey.fromBytes(data.slice(offset, offset + PUBKEY_SIZE));\n}\n\nexport function readFixedBytes({\n data,\n offset,\n length,\n}: {\n data: Uint8Array;\n offset: number;\n length: number;\n}): Uint8Array {\n return data.slice(offset, offset + length);\n}\n\nexport function readOptionalNonZeroBytes({\n data,\n offset,\n length,\n}: {\n data: Uint8Array;\n offset: number;\n length: number;\n}): Uint8Array | null {\n const bytes = readFixedBytes({ data, offset, length });\n const isZero = bytes.every(byte => byte === 0);\n return isZero ? null : bytes;\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Shared TLV extension parsing utilities for Token-2022 accounts.\n */\n\nimport {\n AccountType,\n ExtensionType,\n MINT_EXTENSIONS_OFFSET,\n TLV_LENGTH_SIZE,\n TLV_TYPE_SIZE,\n TOKEN_ACCOUNT_EXTENSIONS_OFFSET,\n TOKEN_ACCOUNT_SIZE,\n} from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { RawExtension } from \"../types\";\nimport { readU16LE } from \"./bytes\";\n\n/**\n * Parses all TLV extensions from account data.\n */\nexport function parseTlvExtensions({\n data,\n extensionsOffset,\n}: {\n data: Uint8Array;\n extensionsOffset: number;\n}): RawExtension[] {\n const extensions: RawExtension[] = [];\n let offset = extensionsOffset;\n\n while (offset + TLV_TYPE_SIZE + TLV_LENGTH_SIZE <= data.length) {\n const type = readU16LE({ data, offset });\n const length = readU16LE({ data, offset: offset + TLV_TYPE_SIZE });\n\n // Type 0 with length 0 means end of extensions or padding\n if (type === ExtensionType.Uninitialized && length === 0) {\n break;\n }\n\n const dataStart = offset + TLV_TYPE_SIZE + TLV_LENGTH_SIZE;\n const dataEnd = dataStart + length;\n\n if (dataEnd > data.length) {\n throw SplTokenError.invalidExtension({\n reason: `Extension data extends beyond buffer: type=${type}, length=${length}`,\n });\n }\n\n extensions.push({\n type,\n data: data.slice(dataStart, dataEnd),\n });\n\n offset = dataEnd;\n }\n\n return extensions;\n}\n\n/**\n * Gets all raw extensions from a mint account.\n */\nexport function getMintExtensions({ data }: { data: Uint8Array }): RawExtension[] {\n if (data.length <= TOKEN_ACCOUNT_SIZE) {\n return [];\n }\n\n const accountType = data[TOKEN_ACCOUNT_SIZE];\n if (accountType !== AccountType.Mint) {\n return [];\n }\n\n return parseTlvExtensions({ data, extensionsOffset: MINT_EXTENSIONS_OFFSET });\n}\n\n/**\n * Gets all raw extensions from a token account.\n */\nexport function getTokenAccountExtensions({ data }: { data: Uint8Array }): RawExtension[] {\n if (data.length <= TOKEN_ACCOUNT_SIZE) {\n return [];\n }\n\n const accountType = data[TOKEN_ACCOUNT_SIZE];\n if (accountType !== AccountType.Account) {\n return [];\n }\n\n return parseTlvExtensions({\n data,\n extensionsOffset: TOKEN_ACCOUNT_EXTENSIONS_OFFSET,\n });\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Typed parsers for MVP Token-2022 extensions.\n */\n\nimport { ExtensionType } from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type {\n MetadataPointerExtension,\n NonTransferableAccountExtension,\n NonTransferableExtension,\n ParsedExtension,\n PermanentDelegateExtension,\n RawExtension,\n TokenMetadata,\n TransferFee,\n TransferFeeAmountExtension,\n TransferFeeConfigExtension,\n TransferHookExtension,\n} from \"../types\";\nimport { readOptionalNonZeroPubkey, readPubkey, readU16LE, readU32LE, readU64LE } from \"./bytes\";\nimport { getMintExtensions, getTokenAccountExtensions } from \"./extensions\";\n\nconst TRANSFER_FEE_CONFIG_SIZE = 108;\nconst TRANSFER_FEE_AMOUNT_SIZE = 8;\nconst METADATA_POINTER_SIZE = 64;\nconst PUBKEY_SIZE = 32;\nconst PERMANENT_DELEGATE_SIZE = 32;\nconst TRANSFER_HOOK_SIZE = 64;\n// The TLV length field for any extension is a u16, so 65,535 bytes is the\n// maximum payload size that can be encoded on-chain for a single extension.\nconst TOKEN_METADATA_MAX_SIZE = 65_535;\n\nfunction parseTransferFee({ data, offset }: { data: Uint8Array; offset: number }): TransferFee {\n const epoch = readU64LE({ data, offset });\n const maximumFee = readU64LE({ data, offset: offset + 8 });\n const transferFeeBasisPoints = readU16LE({ data, offset: offset + 16 });\n\n return {\n epoch,\n maximumFee,\n transferFeeBasisPoints,\n };\n}\n\nexport function parseTransferFeeConfigExtension({\n data,\n}: {\n data: Uint8Array;\n}): TransferFeeConfigExtension {\n if (data.length < TRANSFER_FEE_CONFIG_SIZE) {\n throw SplTokenError.invalidExtension({\n reason: `TransferFeeConfig too short: expected ${TRANSFER_FEE_CONFIG_SIZE} bytes, got ${data.length}`,\n });\n }\n\n const transferFeeConfigAuthority = readOptionalNonZeroPubkey({\n data,\n offset: 0,\n });\n const withdrawWithheldAuthority = readOptionalNonZeroPubkey({\n data,\n offset: 32,\n });\n const withheldAmount = readU64LE({ data, offset: 64 });\n const olderTransferFee = parseTransferFee({ data, offset: 72 });\n const newerTransferFee = parseTransferFee({ data, offset: 90 });\n\n return {\n transferFeeConfigAuthority,\n withdrawWithheldAuthority,\n withheldAmount,\n olderTransferFee,\n newerTransferFee,\n };\n}\n\nexport function parseTransferFeeAmountExtension({\n data,\n}: {\n data: Uint8Array;\n}): TransferFeeAmountExtension {\n if (data.length < TRANSFER_FEE_AMOUNT_SIZE) {\n throw SplTokenError.invalidExtension({\n reason: `TransferFeeAmount too short: expected ${TRANSFER_FEE_AMOUNT_SIZE} bytes, got ${data.length}`,\n });\n }\n\n return {\n withheldAmount: readU64LE({ data, offset: 0 }),\n };\n}\n\nexport function parseNonTransferableExtension({\n data,\n}: {\n data: Uint8Array;\n}): NonTransferableExtension {\n if (data.length !== 0) {\n throw SplTokenError.invalidExtension({\n reason: `NonTransferable has unexpected length: expected 0 bytes, got ${data.length}`,\n });\n }\n\n return { isNonTransferable: true };\n}\n\nexport function parseNonTransferableAccountExtension({\n data,\n}: {\n data: Uint8Array;\n}): NonTransferableAccountExtension {\n if (data.length !== 0) {\n throw SplTokenError.invalidExtension({\n reason: `NonTransferableAccount has unexpected length: expected 0 bytes, got ${data.length}`,\n });\n }\n\n return { isNonTransferableAccount: true };\n}\n\nexport function parsePermanentDelegateExtension({\n data,\n}: {\n data: Uint8Array;\n}): PermanentDelegateExtension {\n if (data.length < PERMANENT_DELEGATE_SIZE) {\n throw SplTokenError.invalidExtension({\n reason: `PermanentDelegate too short: expected ${PERMANENT_DELEGATE_SIZE} bytes, got ${data.length}`,\n });\n }\n\n return { delegate: readOptionalNonZeroPubkey({ data, offset: 0 }) };\n}\n\nexport function parseTransferHookExtension({ data }: { data: Uint8Array }): TransferHookExtension {\n if (data.length < TRANSFER_HOOK_SIZE) {\n throw SplTokenError.invalidExtension({\n reason: `TransferHook too short: expected ${TRANSFER_HOOK_SIZE} bytes, got ${data.length}`,\n });\n }\n\n return {\n authority: readOptionalNonZeroPubkey({ data, offset: 0 }),\n programId: readOptionalNonZeroPubkey({ data, offset: 32 }),\n };\n}\n\nexport function parseMetadataPointerExtensionData({\n data,\n}: {\n data: Uint8Array;\n}): MetadataPointerExtension {\n if (data.length < METADATA_POINTER_SIZE) {\n throw SplTokenError.invalidExtension({\n reason: `MetadataPointer too short: expected ${METADATA_POINTER_SIZE} bytes, got ${data.length}`,\n });\n }\n\n const authority = readOptionalNonZeroPubkey({ data, offset: 0 });\n const metadataAddress = readOptionalNonZeroPubkey({ data, offset: 32 });\n\n return { authority, metadataAddress };\n}\n\nfunction readLengthPrefixedString({\n data,\n offset,\n}: {\n data: Uint8Array;\n offset: number;\n}): [string, number] {\n if (offset + 4 > data.length) {\n throw SplTokenError.invalidExtension({\n reason: \"String length prefix extends beyond data\",\n });\n }\n\n const length = readU32LE({ data, offset });\n\n if (offset + 4 + length > data.length) {\n throw SplTokenError.invalidExtension({\n reason: `String data extends beyond buffer: need ${length} bytes at offset ${offset + 4}`,\n });\n }\n\n const stringBytes = data.slice(offset + 4, offset + 4 + length);\n try {\n const str = new TextDecoder().decode(stringBytes);\n return [str, 4 + length];\n } catch {\n throw SplTokenError.invalidExtension({\n reason: `Invalid UTF-8 string at offset ${offset}`,\n });\n }\n}\n\nexport function parseTokenMetadataExtensionData({ data }: { data: Uint8Array }): TokenMetadata {\n if (data.length < 64) {\n throw SplTokenError.invalidExtension({\n reason: `TokenMetadata too short: expected at least 64 bytes, got ${data.length}`,\n });\n }\n if (data.length > TOKEN_METADATA_MAX_SIZE) {\n throw SplTokenError.invalidExtension({\n reason: `TokenMetadata too large: maximum ${TOKEN_METADATA_MAX_SIZE} bytes, got ${data.length}`,\n });\n }\n\n let offset = 0;\n\n const updateAuthority = readOptionalNonZeroPubkey({ data, offset });\n offset += PUBKEY_SIZE;\n\n const mint = readPubkey({ data, offset });\n offset += PUBKEY_SIZE;\n\n const [name, nameLen] = readLengthPrefixedString({ data, offset });\n offset += nameLen;\n\n const [symbol, symbolLen] = readLengthPrefixedString({ data, offset });\n offset += symbolLen;\n\n const [uri, uriLen] = readLengthPrefixedString({ data, offset });\n offset += uriLen;\n\n const additionalMetadata: Array<[string, string]> = [];\n\n if (offset + 4 <= data.length) {\n const numEntries = readU32LE({ data, offset });\n offset += 4;\n\n for (let i = 0; i < numEntries && offset < data.length; i++) {\n const [key, keyLen] = readLengthPrefixedString({ data, offset });\n offset += keyLen;\n\n const [value, valueLen] = readLengthPrefixedString({ data, offset });\n offset += valueLen;\n\n additionalMetadata.push([key, value]);\n }\n }\n\n return {\n updateAuthority,\n mint,\n name,\n symbol,\n uri,\n additionalMetadata,\n };\n}\n\nexport function parseExtension({ extension }: { extension: RawExtension }): ParsedExtension | null {\n switch (extension.type) {\n case ExtensionType.TransferFeeConfig:\n return {\n type: ExtensionType.TransferFeeConfig,\n value: parseTransferFeeConfigExtension({ data: extension.data }),\n };\n case ExtensionType.TransferFeeAmount:\n return {\n type: ExtensionType.TransferFeeAmount,\n value: parseTransferFeeAmountExtension({ data: extension.data }),\n };\n case ExtensionType.NonTransferable:\n return {\n type: ExtensionType.NonTransferable,\n value: parseNonTransferableExtension({ data: extension.data }),\n };\n case ExtensionType.NonTransferableAccount:\n return {\n type: ExtensionType.NonTransferableAccount,\n value: parseNonTransferableAccountExtension({ data: extension.data }),\n };\n case ExtensionType.MetadataPointer:\n return {\n type: ExtensionType.MetadataPointer,\n value: parseMetadataPointerExtensionData({ data: extension.data }),\n };\n case ExtensionType.TokenMetadata:\n return {\n type: ExtensionType.TokenMetadata,\n value: parseTokenMetadataExtensionData({ data: extension.data }),\n };\n case ExtensionType.PermanentDelegate:\n return {\n type: ExtensionType.PermanentDelegate,\n value: parsePermanentDelegateExtension({ data: extension.data }),\n };\n case ExtensionType.TransferHook:\n return {\n type: ExtensionType.TransferHook,\n value: parseTransferHookExtension({ data: extension.data }),\n };\n default:\n return null;\n }\n}\n\nexport function getMintExtensionStates({ data }: { data: Uint8Array }): ParsedExtension[] {\n return getMintExtensions({ data })\n .map(extension => parseExtension({ extension }))\n .filter((extension): extension is ParsedExtension => extension !== null);\n}\n\nexport function getTokenAccountExtensionStates({ data }: { data: Uint8Array }): ParsedExtension[] {\n return getTokenAccountExtensions({ data })\n .map(extension => parseExtension({ extension }))\n .filter((extension): extension is ParsedExtension => extension !== null);\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Token metadata parsing for SPL Token-2022 native metadata extension.\n *\n * This parses the TokenMetadata extension (ExtensionType=19) embedded in\n * Token-2022 mint accounts, not the separate Metaplex Token Metadata program.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport {\n AccountType,\n ExtensionType,\n MINT_EXTENSIONS_OFFSET,\n PUBKEY_SIZE,\n TOKEN_ACCOUNT_SIZE,\n} from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { MetadataPointerExtension, TokenMetadata } from \"../types\";\nimport { readOptionalNonZeroPubkey, readU32LE } from \"./bytes\";\nimport { parseTlvExtensions } from \"./extensions\";\n\n/**\n * Reads a length-prefixed string from data.\n *\n * Format: 4-byte LE length + UTF-8 string bytes\n *\n * @returns Tuple of [string, bytes consumed]\n */\nfunction readLengthPrefixedString({\n data,\n offset,\n}: {\n data: Uint8Array;\n offset: number;\n}): [string, number] {\n if (offset + 4 > data.length) {\n throw SplTokenError.invalidMetadata({\n reason: \"String length prefix extends beyond data\",\n });\n }\n\n const length = readU32LE({ data, offset });\n\n if (offset + 4 + length > data.length) {\n throw SplTokenError.invalidMetadata({\n reason: `String data extends beyond buffer: need ${length} bytes at offset ${offset + 4}`,\n });\n }\n\n const stringBytes = data.slice(offset + 4, offset + 4 + length);\n try {\n const str = new TextDecoder().decode(stringBytes);\n return [str, 4 + length];\n } catch {\n throw SplTokenError.invalidMetadata({\n reason: `Invalid UTF-8 string at offset ${offset}`,\n });\n }\n}\n\n/**\n * Parses a MetadataPointer extension.\n *\n * Layout:\n * - OptionalNonZeroPubkey authority (32 bytes)\n * - OptionalNonZeroPubkey metadata_address (32 bytes)\n */\nfunction parseMetadataPointer({ data }: { data: Uint8Array }): MetadataPointerExtension {\n if (data.length < 64) {\n throw SplTokenError.invalidExtension({\n reason: `MetadataPointer too short: expected 64 bytes, got ${data.length}`,\n });\n }\n\n const authority = readOptionalNonZeroPubkey({ data, offset: 0 });\n const metadataAddress = readOptionalNonZeroPubkey({ data, offset: 32 });\n\n return { authority, metadataAddress };\n}\n\n/**\n * Parses a TokenMetadata extension.\n *\n * Layout:\n * - Pubkey update_authority (32 bytes) - can be all zeros for None\n * - Pubkey mint (32 bytes)\n * - String name (4-byte length + UTF-8)\n * - String symbol (4-byte length + UTF-8)\n * - String uri (4-byte length + UTF-8)\n * - Vec<(String, String)> additional_metadata\n */\nfunction parseTokenMetadataExtension({\n data,\n mint,\n}: {\n data: Uint8Array;\n mint: PublicKey;\n}): TokenMetadata {\n if (data.length < 64) {\n throw SplTokenError.invalidMetadata({\n reason: `TokenMetadata too short: expected at least 64 bytes, got ${data.length}`,\n });\n }\n\n let offset = 0;\n\n // Read update_authority (32 bytes, all zeros = None)\n const updateAuthorityBytes = data.slice(offset, offset + PUBKEY_SIZE);\n const isZeroAuthority = updateAuthorityBytes.every(b => b === 0);\n const updateAuthority = isZeroAuthority ? null : PublicKey.fromBytes(updateAuthorityBytes);\n offset += PUBKEY_SIZE;\n\n // Read mint (32 bytes) - skip, we already have it\n offset += PUBKEY_SIZE;\n\n // Read name\n const [name, nameLen] = readLengthPrefixedString({ data, offset });\n offset += nameLen;\n\n // Read symbol\n const [symbol, symbolLen] = readLengthPrefixedString({ data, offset });\n offset += symbolLen;\n\n // Read uri\n const [uri, uriLen] = readLengthPrefixedString({ data, offset });\n offset += uriLen;\n\n // Read additional_metadata (Vec<(String, String)>)\n const additionalMetadata: Array<[string, string]> = [];\n\n if (offset + 4 <= data.length) {\n const numEntries = readU32LE({ data, offset });\n offset += 4;\n\n for (let i = 0; i < numEntries && offset < data.length; i++) {\n const [key, keyLen] = readLengthPrefixedString({ data, offset });\n offset += keyLen;\n\n const [value, valueLen] = readLengthPrefixedString({ data, offset });\n offset += valueLen;\n\n additionalMetadata.push([key, value]);\n }\n }\n\n return {\n updateAuthority,\n mint,\n name,\n symbol,\n uri,\n additionalMetadata,\n };\n}\n\n/**\n * Options for parsing token metadata.\n */\nexport interface ParseTokenMetadataOptions {\n /** The mint's public key */\n mint: PublicKey;\n /** Raw mint account data (including extensions) */\n data: Uint8Array;\n}\n\n/**\n * Parses Token-2022 native metadata from a mint account.\n *\n * This function looks for the TokenMetadata extension (type 19) in the\n * account's extension data and parses it if found.\n *\n * @param options - Options containing mint and data\n * @returns Parsed token metadata, or null if no metadata extension exists\n * @throws {SplTokenError} If the metadata extension is malformed\n *\n * @example\n * ```typescript\n * const accountInfo = await client.getAccountInfo(mintPubkey);\n * if (accountInfo) {\n * const metadata = parseTokenMetadata({ mint: mintPubkey, data: accountInfo.data });\n * if (metadata) {\n * console.log(`Name: ${metadata.name}`);\n * console.log(`Symbol: ${metadata.symbol}`);\n * console.log(`URI: ${metadata.uri}`);\n * }\n * }\n * ```\n */\nexport function parseTokenMetadata({\n mint,\n data,\n}: ParseTokenMetadataOptions): TokenMetadata | null {\n // Check if account has extensions (must be longer than base mint size)\n if (data.length <= TOKEN_ACCOUNT_SIZE) {\n return null;\n }\n\n // Check AccountType byte\n const accountType = data[TOKEN_ACCOUNT_SIZE];\n if (accountType !== AccountType.Mint) {\n return null;\n }\n\n // Parse all extensions\n const extensions = parseTlvExtensions({\n data,\n extensionsOffset: MINT_EXTENSIONS_OFFSET,\n });\n\n // Find TokenMetadata extension (type 19)\n const metadataExt = extensions.find(ext => ext.type === ExtensionType.TokenMetadata);\n\n if (!metadataExt) {\n return null;\n }\n\n return parseTokenMetadataExtension({ data: metadataExt.data, mint });\n}\n\n/**\n * Options for parsing metadata pointer extension.\n */\nexport interface ParseMetadataPointerExtensionOptions {\n /** Raw mint account data (including extensions) */\n data: Uint8Array;\n}\n\n/**\n * Parses the MetadataPointer extension from a mint account.\n *\n * @param options - Options containing data\n * @returns Parsed metadata pointer, or null if not present\n */\nexport function parseMetadataPointerExtension({\n data,\n}: ParseMetadataPointerExtensionOptions): MetadataPointerExtension | null {\n if (data.length <= TOKEN_ACCOUNT_SIZE) {\n return null;\n }\n\n const accountType = data[TOKEN_ACCOUNT_SIZE];\n if (accountType !== AccountType.Mint) {\n return null;\n }\n\n const extensions = parseTlvExtensions({\n data,\n extensionsOffset: MINT_EXTENSIONS_OFFSET,\n });\n const pointerExt = extensions.find(ext => ext.type === ExtensionType.MetadataPointer);\n\n if (!pointerExt) {\n return null;\n }\n\n return parseMetadataPointer({ data: pointerExt.data });\n}\n\n/**\n * Options for getting mint extensions.\n */\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Mint account parsing for SPL Token-2022.\n */\n\nimport type { PublicKey } from \"@rialo/ts-cdk\";\nimport {\n MINT_DECIMALS_OFFSET,\n MINT_FREEZE_AUTHORITY_OFFSET,\n MINT_IS_INITIALIZED_OFFSET,\n MINT_SIZE,\n MINT_SUPPLY_OFFSET,\n} from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { MintInfo } from \"../types\";\nimport { readCOptionPubkey, readU64LE } from \"./bytes\";\n\n/**\n * Options for parsing a mint account.\n */\nexport interface ParseMintAccountOptions {\n /** The mint account's public key */\n address: PublicKey;\n /** Raw account data bytes (minimum 82 bytes) */\n data: Uint8Array;\n}\n\n/**\n * Parses raw mint account data into a structured MintInfo object.\n *\n * @param options - Options containing address and data\n * @returns Parsed mint information\n * @throws {SplTokenError} If the data is invalid or too short\n *\n * @example\n * ```typescript\n * const accountInfo = await client.getAccountInfo(mintPubkey);\n * if (accountInfo) {\n * const mintInfo = parseMintAccount({ address: mintPubkey, data: accountInfo.data });\n * console.log(`Supply: ${mintInfo.supply}`);\n * console.log(`Decimals: ${mintInfo.decimals}`);\n * }\n * ```\n */\nexport function parseMintAccount({ address, data }: ParseMintAccountOptions): MintInfo {\n if (data.length < MINT_SIZE) {\n throw SplTokenError.invalidMint({\n reason: `Account data too short: expected at least ${MINT_SIZE} bytes, got ${data.length}`,\n });\n }\n\n // Read mint authority (COption<Pubkey> at offset 0)\n const mintAuthority = readCOptionPubkey({ data, offset: 0 });\n\n // Read supply (u64 LE at offset 36)\n const supply = readU64LE({ data, offset: MINT_SUPPLY_OFFSET });\n\n // Read decimals (u8 at offset 44)\n const decimals = data[MINT_DECIMALS_OFFSET];\n\n // Read is_initialized (bool at offset 45)\n const isInitialized = data[MINT_IS_INITIALIZED_OFFSET] !== 0;\n\n // Read freeze authority (COption<Pubkey> at offset 46)\n const freezeAuthority = readCOptionPubkey({\n data,\n offset: MINT_FREEZE_AUTHORITY_OFFSET,\n });\n\n if (!isInitialized) {\n throw SplTokenError.accountNotInitialized({ address: address.toString() });\n }\n\n return {\n address,\n supply,\n decimals,\n isInitialized,\n mintAuthority,\n freezeAuthority,\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Token account parsing for SPL Token-2022.\n */\n\nimport type { PublicKey } from \"@rialo/ts-cdk\";\nimport {\n COPTION_SOME,\n TOKEN_ACCOUNT_AMOUNT_OFFSET,\n TOKEN_ACCOUNT_CLOSE_AUTHORITY_OFFSET,\n TOKEN_ACCOUNT_DELEGATE_OFFSET,\n TOKEN_ACCOUNT_DELEGATED_AMOUNT_OFFSET,\n TOKEN_ACCOUNT_IS_NATIVE_OFFSET,\n TOKEN_ACCOUNT_MINT_OFFSET,\n TOKEN_ACCOUNT_OWNER_OFFSET,\n TOKEN_ACCOUNT_SIZE,\n TOKEN_ACCOUNT_STATE_OFFSET,\n TokenAccountState,\n} from \"../constants\";\nimport { SplTokenError } from \"../errors\";\nimport type { TokenAccountInfo } from \"../types\";\nimport { readCOptionPubkey, readPubkey, readU32LE, readU64LE } from \"./bytes\";\n\n/**\n * Reads a COption<u64> from account data.\n *\n * COption format: 4-byte LE tag (0=None, 1=Some) + 8-byte u64 if Some\n */\nfunction readCOptionU64({ data, offset }: { data: Uint8Array; offset: number }): bigint | null {\n const tag = readU32LE({ data, offset });\n if (tag === COPTION_SOME) {\n return readU64LE({ data, offset: offset + 4 });\n }\n return null;\n}\n\n/**\n * Options for parsing a token account.\n */\nexport interface ParseTokenAccountOptions {\n /** The token account's public key */\n address: PublicKey;\n /** Raw account data bytes (minimum 165 bytes) */\n data: Uint8Array;\n}\n\n/**\n * Parses raw token account data into a structured TokenAccountInfo object.\n *\n * @param options - Options containing address and data\n * @returns Parsed token account information\n * @throws {SplTokenError} If the data is invalid or too short\n *\n * @example\n * ```typescript\n * const accountInfo = await client.getAccountInfo(tokenAccountPubkey);\n * if (accountInfo) {\n * const tokenAccount = parseTokenAccount({ address: tokenAccountPubkey, data: accountInfo.data });\n * console.log(`Balance: ${tokenAccount.amount}`);\n * console.log(`Owner: ${tokenAccount.owner.toString()}`);\n * }\n * ```\n */\nexport function parseTokenAccount({ address, data }: ParseTokenAccountOptions): TokenAccountInfo {\n if (data.length < TOKEN_ACCOUNT_SIZE) {\n throw SplTokenError.invalidTokenAccount({\n reason: `Account data too short: expected at least ${TOKEN_ACCOUNT_SIZE} bytes, got ${data.length}`,\n });\n }\n\n // Read mint (Pubkey at offset 0)\n const mint = readPubkey({ data, offset: TOKEN_ACCOUNT_MINT_OFFSET });\n\n // Read owner (Pubkey at offset 32)\n const owner = readPubkey({ data, offset: TOKEN_ACCOUNT_OWNER_OFFSET });\n\n // Read amount (u64 LE at offset 64)\n const amount = readU64LE({ data, offset: TOKEN_ACCOUNT_AMOUNT_OFFSET });\n\n // Read delegate (COption<Pubkey> at offset 72)\n const delegate = readCOptionPubkey({\n data,\n offset: TOKEN_ACCOUNT_DELEGATE_OFFSET,\n });\n\n // Read state (u8 at offset 108)\n const stateValue = data[TOKEN_ACCOUNT_STATE_OFFSET];\n if (stateValue > 2) {\n throw SplTokenError.invalidTokenAccount({\n reason: `Invalid account state: ${stateValue}`,\n });\n }\n const state = stateValue as TokenAccountState;\n\n // Check if account is initialized\n if (state === TokenAccountState.Uninitialized) {\n throw SplTokenError.accountNotInitialized({ address: address.toString() });\n }\n\n // Read is_native (COption<u64> at offset 109)\n const isNative = readCOptionU64({\n data,\n offset: TOKEN_ACCOUNT_IS_NATIVE_OFFSET,\n });\n\n // Read delegated_amount (u64 LE at offset 121)\n const delegatedAmount = readU64LE({\n data,\n offset: TOKEN_ACCOUNT_DELEGATED_AMOUNT_OFFSET,\n });\n\n // Read close_authority (COption<Pubkey> at offset 129)\n const closeAuthority = readCOptionPubkey({\n data,\n offset: TOKEN_ACCOUNT_CLOSE_AUTHORITY_OFFSET,\n });\n\n return {\n address,\n mint,\n owner,\n amount,\n delegate,\n state,\n isNative,\n delegatedAmount,\n closeAuthority,\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * ExtraAccountMeta type definition and parser for Token-2022 transfer hooks.\n *\n * Each ExtraAccountMeta is a 35-byte fixed-size struct stored in the\n * validation account's TLV data. It describes an additional account that\n * must be included in the transfer instruction.\n *\n * Layout: [discriminator: u8] [addressConfig: [u8; 32]] [isSigner: u8] [isWritable: u8]\n *\n * Discriminator values:\n * - 0: Static address (addressConfig is the pubkey)\n * - 1: PDA derived from the hook program\n * - 2: Pubkey extracted from on-chain account data\n * - 128+i: PDA derived from account[i]'s pubkey as the program ID\n */\n\n/**\n * A single extra account descriptor from the ExtraAccountMetaList.\n */\nexport interface ExtraAccountMeta {\n /** Discriminator indicating how to resolve the address. */\n discriminator: number;\n /** 32-byte address configuration (pubkey or packed seeds). */\n addressConfig: Uint8Array;\n /** Whether this account must be a signer. */\n isSigner: boolean;\n /** Whether this account must be writable. */\n isWritable: boolean;\n}\n\n/** Size of a single ExtraAccountMeta entry in bytes (1 + 32 + 1 + 1). */\nexport const EXTRA_ACCOUNT_META_SIZE = 35;\n\n/**\n * Parses a single ExtraAccountMeta entry from raw bytes at the given offset.\n *\n * @param data - The raw byte buffer containing the entry\n * @param offset - The byte offset where the entry starts\n * @returns The parsed ExtraAccountMeta\n */\nexport function parseExtraAccountMeta(data: Uint8Array, offset: number): ExtraAccountMeta {\n return {\n discriminator: data[offset],\n addressConfig: data.slice(offset + 1, offset + 33),\n isSigner: data[offset + 33] !== 0,\n isWritable: data[offset + 34] !== 0,\n };\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * ExtraAccountMetaList TLV parsing for Token-2022 transfer hooks.\n *\n * The validation account stores extra account metadata in TLV format:\n * - 8 bytes: Execute instruction discriminator (SHA-256 hash prefix)\n * - 4 bytes: Length of the data section (u32 LE)\n * - 4 bytes: Count of ExtraAccountMeta entries (u32 LE)\n * - N x 35 bytes: ExtraAccountMeta entries\n *\n * This module also provides the Execute discriminator computation,\n * Execute instruction data builder, and validation PDA derivation.\n */\n\nimport { sha256 } from \"@noble/hashes/sha2\";\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { writeU64LE } from \"../utils/bytes\";\nimport {\n EXTRA_ACCOUNT_META_SIZE,\n type ExtraAccountMeta,\n parseExtraAccountMeta,\n} from \"./extra-account-meta\";\n\n/**\n * The Execute instruction discriminator.\n *\n * First 8 bytes of SHA-256(\"rialo-s-spl-transfer-hook-interface:execute\").\n * This matches the on-chain Rialo Transfer Hook Interface namespace.\n */\nexport const EXECUTE_DISCRIMINATOR: Uint8Array = sha256(\n new TextEncoder().encode(\"rialo-s-spl-transfer-hook-interface:execute\")\n).slice(0, 8);\n\n/** Minimum header size: 8-byte discriminator + 4-byte length + 4-byte count. */\nconst TLV_HEADER_SIZE = 16;\n\n/**\n * Parses the validation account's TLV data into ExtraAccountMeta entries.\n *\n * Format: [8-byte discriminator][4-byte u32 LE length][4-byte u32 LE count][N x 35-byte entries]\n *\n * Returns an empty array if the data is too short or the count is zero.\n *\n * @param data - Raw validation account data\n * @returns Array of parsed ExtraAccountMeta entries\n */\nexport function parseExtraAccountMetaList(data: Uint8Array): ExtraAccountMeta[] {\n if (data.length < TLV_HEADER_SIZE) {\n return [];\n }\n\n // Skip 8-byte discriminator + 4-byte length, read 4-byte count\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const count = view.getUint32(12, true);\n\n if (count === 0) {\n return [];\n }\n\n const entries: ExtraAccountMeta[] = [];\n let cursor = TLV_HEADER_SIZE;\n\n for (let i = 0; i < count; i++) {\n if (cursor + EXTRA_ACCOUNT_META_SIZE > data.length) {\n break;\n }\n entries.push(parseExtraAccountMeta(data, cursor));\n cursor += EXTRA_ACCOUNT_META_SIZE;\n }\n\n return entries;\n}\n\n/**\n * Builds the 16-byte Execute instruction data.\n *\n * Format: [8-byte EXECUTE_DISCRIMINATOR][8-byte amount as u64 LE]\n *\n * @param amount - The transfer amount\n * @returns 16-byte instruction data buffer\n */\nexport function buildExecuteInstructionData(amount: bigint): Uint8Array {\n const data = new Uint8Array(16);\n data.set(EXECUTE_DISCRIMINATOR, 0);\n writeU64LE({ data, offset: 8, value: amount });\n return data;\n}\n\n/**\n * Derives the ExtraAccountMetaList validation account PDA.\n *\n * Seeds: [\"extra-account-metas\", mint_pubkey]\n * Program: hookProgramId\n *\n * @param mint - The token mint public key\n * @param hookProgramId - The transfer hook program ID\n * @returns The derived validation account public key\n */\nexport function getExtraAccountMetaAddress(mint: PublicKey, hookProgramId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddress(\n [\"extra-account-metas\", mint.toBytes()],\n hookProgramId\n );\n return pda;\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Seed unpacking for Token-2022 transfer hook ExtraAccountMeta PDA resolution.\n *\n * The addressConfig field of a PDA-type ExtraAccountMeta contains packed seed\n * descriptors. Each seed starts with a discriminator byte followed by type-specific\n * parameters. Seeds are parsed sequentially until a terminator (0) is encountered\n * or the 32-byte boundary is reached.\n *\n * Seed types:\n * - 0: Terminator (stop parsing)\n * - 1 (Literal): [length: u8, ...bytes]\n * - 2 (InstructionData): [offset: u8, length: u8] -- slice of Execute instruction data\n * - 3 (AccountKey): [accountIndex: u8] -- 32-byte pubkey of a resolved account\n * - 4 (AccountData): [accountIndex: u8, dataOffset: u8, length: u8] -- slice of on-chain data\n */\n\nimport type { PublicKey } from \"@rialo/ts-cdk\";\nimport { SplTokenError } from \"../errors\";\nimport type { AccountMeta } from \"../instructions/transfer\";\n\n/**\n * Parameters for unpacking seeds from an ExtraAccountMeta addressConfig.\n */\nexport interface UnpackSeedsParams {\n /** The 32-byte packed seed configuration */\n addressConfig: Uint8Array;\n /** All previously resolved accounts (base 5 + resolved extras) */\n previousMetas: AccountMeta[];\n /** The Execute instruction data (16 bytes) */\n instructionData: Uint8Array;\n /** Callback to fetch on-chain account data */\n fetchAccountData: (pubkey: PublicKey) => Promise<Uint8Array | null>;\n}\n\n/**\n * Unpacks seed descriptors from a 32-byte addressConfig into concrete byte arrays.\n *\n * @param params - Seed unpacking parameters\n * @returns Array of seed byte arrays for PDA derivation\n */\nexport async function unpackSeeds(params: UnpackSeedsParams): Promise<Uint8Array[]> {\n const { addressConfig, previousMetas, instructionData, fetchAccountData } = params;\n const seeds: Uint8Array[] = [];\n let cursor = 0;\n\n if (addressConfig.length < 32) {\n throw SplTokenError.pdaDerivationFailed({\n reason: `addressConfig must be at least 32 bytes, got ${addressConfig.length}`,\n });\n }\n\n while (cursor < 32) {\n const discriminator = addressConfig[cursor];\n if (discriminator === 0) {\n break;\n }\n cursor++;\n\n switch (discriminator) {\n case 1: {\n // Literal seed: next byte is length, then that many bytes of data\n const length = addressConfig[cursor++];\n seeds.push(addressConfig.slice(cursor, cursor + length));\n cursor += length;\n break;\n }\n case 2: {\n // InstructionData seed: next byte is offset, next is length\n const offset = addressConfig[cursor++];\n const length = addressConfig[cursor++];\n seeds.push(instructionData.slice(offset, offset + length));\n break;\n }\n case 3: {\n // AccountKey seed: next byte is account index\n const index = addressConfig[cursor++];\n seeds.push(previousMetas[index].pubkey.toBytes());\n break;\n }\n case 4: {\n // AccountData seed: accountIndex, dataOffset, length\n const accountIndex = addressConfig[cursor++];\n const dataOffset = addressConfig[cursor++];\n const length = addressConfig[cursor++];\n const data = await fetchAccountData(previousMetas[accountIndex].pubkey);\n if (data) {\n seeds.push(data.slice(dataOffset, dataOffset + length));\n }\n break;\n }\n default: {\n throw SplTokenError.pdaDerivationFailed({\n reason: `Unknown seed discriminator ${discriminator} at addressConfig offset ${cursor - 1}`,\n });\n }\n }\n }\n\n return seeds;\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Dynamic account resolution for Token-2022 transfer hook ExtraAccountMetas.\n *\n * This module resolves each ExtraAccountMeta into a concrete AccountMeta\n * (pubkey + isSigner + isWritable) by handling all discriminator types:\n * - 0: Static address (addressConfig is the pubkey directly)\n * - 1: PDA derived from the hook program with unpacked seeds\n * - 2: Pubkey extracted from on-chain account data\n * - 128+: PDA derived from a previously-resolved account's pubkey as program ID\n *\n * The top-level `resolveTransferHookExtraAccounts` function orchestrates the full\n * resolution algorithm: fetch validation PDA, parse TLV, resolve each meta\n * sequentially, de-escalate signers, and append trailing accounts.\n */\n\nimport { PublicKey } from \"@rialo/ts-cdk\";\nimport { SplTokenError } from \"../errors\";\nimport type { AccountMeta } from \"../instructions/transfer\";\nimport type { ExtraAccountMeta } from \"./extra-account-meta\";\nimport {\n buildExecuteInstructionData,\n getExtraAccountMetaAddress,\n parseExtraAccountMetaList,\n} from \"./extra-account-meta-list\";\nimport { unpackSeeds } from \"./seeds\";\n\n/**\n * Callback type for fetching on-chain account data.\n */\nexport type FetchAccountDataFn = (pubkey: PublicKey) => Promise<Uint8Array | null>;\n\n/**\n * Parameters for resolving a single ExtraAccountMeta.\n */\nexport interface ResolveExtraAccountMetaParams {\n /** The ExtraAccountMeta to resolve */\n meta: ExtraAccountMeta;\n /** All accounts resolved so far (base 5 + previous extras) */\n previousMetas: AccountMeta[];\n /** The Execute instruction data */\n instructionData: Uint8Array;\n /** The transfer hook program ID */\n hookProgramId: PublicKey;\n /** Callback to fetch on-chain account data */\n fetchAccountData: FetchAccountDataFn;\n}\n\n/**\n * Parameters for resolving transfer hook extra accounts.\n */\nexport interface ResolveTransferHookExtraAccountsParams {\n /** The token mint public key */\n mint: PublicKey;\n /** The transfer hook program ID */\n hookProgramId: PublicKey;\n /** Source associated token account */\n sourceAta: PublicKey;\n /** Destination associated token account */\n destinationAta: PublicKey;\n /** Transfer authority (source account owner) */\n authority: PublicKey;\n /** Transfer amount in smallest units */\n amount: bigint;\n /** Token decimals (unused in resolution, kept for API consistency) */\n decimals: number;\n /** Callback to fetch on-chain account data */\n fetchAccountData: FetchAccountDataFn;\n}\n\n/**\n * Resolves a single ExtraAccountMeta into a concrete AccountMeta.\n *\n * Handles all discriminator types:\n * - 0: Static address\n * - 1: Hook program PDA\n * - 2: Pubkey from on-chain account data\n * - 128+: External PDA (program ID from a previously-resolved account)\n *\n * @param params - Resolution parameters for a single meta\n * @returns The resolved AccountMeta\n */\nexport async function resolveExtraAccountMeta(\n params: ResolveExtraAccountMetaParams\n): Promise<AccountMeta> {\n const { meta, previousMetas, instructionData, hookProgramId, fetchAccountData } = params;\n\n if (meta.discriminator === 0) {\n // Static address: addressConfig IS the pubkey\n return {\n pubkey: PublicKey.fromBytes(meta.addressConfig),\n isSigner: meta.isSigner,\n isWritable: meta.isWritable,\n };\n }\n\n if (meta.discriminator === 1) {\n // Hook program PDA: unpack seeds, derive PDA from hook program\n const seeds = await unpackSeeds({\n addressConfig: meta.addressConfig,\n previousMetas,\n instructionData,\n fetchAccountData,\n });\n const [pda] = PublicKey.findProgramAddress(seeds, hookProgramId);\n return {\n pubkey: pda,\n isSigner: meta.isSigner,\n isWritable: meta.isWritable,\n };\n }\n\n if (meta.discriminator === 2) {\n // Pubkey from account data: extract 32-byte pubkey from on-chain data\n const accountIndex = meta.addressConfig[0];\n const dataOffset = meta.addressConfig[1];\n const data = await fetchAccountData(previousMetas[accountIndex].pubkey);\n if (!data) {\n throw SplTokenError.pdaDerivationFailed({\n reason: `Failed to fetch account data for discriminator 2 resolution: account at index ${accountIndex} returned no data`,\n });\n }\n if (data.length < dataOffset + 32) {\n throw SplTokenError.pdaDerivationFailed({\n reason: `Account data too short for discriminator 2 resolution: expected at least ${dataOffset + 32} bytes at offset ${dataOffset}, but data is only ${data.length} bytes`,\n });\n }\n const extracted = data.slice(dataOffset, dataOffset + 32);\n return {\n pubkey: PublicKey.fromBytes(extracted),\n isSigner: meta.isSigner,\n isWritable: meta.isWritable,\n };\n }\n\n // Discriminator 128+: External PDA\n // The program ID comes from a previously-resolved account\n const accountIndex = meta.discriminator - 128;\n if (accountIndex >= previousMetas.length) {\n throw SplTokenError.pdaDerivationFailed({\n reason: `External PDA resolution failed: accountIndex ${accountIndex} (discriminator ${meta.discriminator}) is out of bounds for previousMetas of length ${previousMetas.length}`,\n });\n }\n const programId = previousMetas[accountIndex].pubkey;\n const seeds = await unpackSeeds({\n addressConfig: meta.addressConfig,\n previousMetas,\n instructionData,\n fetchAccountData,\n });\n const [pda] = PublicKey.findProgramAddress(seeds, programId);\n return {\n pubkey: pda,\n isSigner: meta.isSigner,\n isWritable: meta.isWritable,\n };\n}\n\n/**\n * Resolves all extra accounts required for a transfer hook instruction.\n *\n * This is the top-level entry point that:\n * 1. Derives the validation PDA\n * 2. Fetches the validation account data\n * 3. Parses the ExtraAccountMetaList TLV\n * 4. Builds Execute instruction data\n * 5. Resolves each ExtraAccountMeta sequentially (incremental build)\n * 6. De-escalates all resolved extras (isSigner = false)\n * 7. Appends hook program ID and validation PDA as trailing accounts\n *\n * @param params - Resolution parameters\n * @returns Array of extra AccountMetas to append to the transfer instruction\n */\nexport async function resolveTransferHookExtraAccounts(\n params: ResolveTransferHookExtraAccountsParams\n): Promise<AccountMeta[]> {\n const { mint, hookProgramId, sourceAta, destinationAta, authority, amount, fetchAccountData } =\n params;\n\n // Step 1: Derive validation PDA\n const validationPda = getExtraAccountMetaAddress(mint, hookProgramId);\n\n // Step 2: Fetch validation account data\n const validationData = await fetchAccountData(validationPda);\n\n // If no validation account exists, return just the two trailing accounts\n if (!validationData) {\n return [\n { pubkey: hookProgramId, isSigner: false, isWritable: false },\n { pubkey: validationPda, isSigner: false, isWritable: false },\n ];\n }\n\n // Step 3: Parse ExtraAccountMetaList\n const extraMetas = parseExtraAccountMetaList(validationData);\n\n // If empty list, return just the two trailing accounts\n if (extraMetas.length === 0) {\n return [\n { pubkey: hookProgramId, isSigner: false, isWritable: false },\n { pubkey: validationPda, isSigner: false, isWritable: false },\n ];\n }\n\n // Step 4: Build Execute instruction data\n const instructionData = buildExecuteInstructionData(amount);\n\n // Step 5: Build base 5 Execute accounts for resolution context\n const baseMetas: AccountMeta[] = [\n { pubkey: sourceAta, isSigner: false, isWritable: true },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: destinationAta, isSigner: false, isWritable: true },\n { pubkey: authority, isSigner: false, isWritable: false },\n { pubkey: validationPda, isSigner: false, isWritable: false },\n ];\n\n // Step 6: Resolve each ExtraAccountMeta sequentially (incremental build)\n const resolvedExtras: AccountMeta[] = [];\n for (const meta of extraMetas) {\n const previousMetas = [...baseMetas, ...resolvedExtras];\n const resolved = await resolveExtraAccountMeta({\n meta,\n previousMetas,\n instructionData,\n hookProgramId,\n fetchAccountData,\n });\n resolvedExtras.push(resolved);\n }\n\n // Step 7: De-escalate all resolved extras (isSigner = false)\n const deEscalated = resolvedExtras.map(account => ({\n ...account,\n isSigner: false,\n }));\n\n // Step 8: Append hook program ID and validation PDA as trailing accounts\n return [\n ...deEscalated,\n { pubkey: hookProgramId, isSigner: false, isWritable: false },\n { pubkey: validationPda, isSigner: false, isWritable: false },\n ];\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * High-level SPL Token-2022 client for token operations.\n *\n * Provides a convenient API for common token operations like getting\n * balances, reading mint info, and building transfer transactions.\n */\n\nimport {\n\tPublicKey,\n\ttype RialoClient,\n\ttype Signer,\n\tTransactionBuilder,\n} from \"@rialo/ts-cdk\";\nimport { TOKEN_2022_PROGRAM_ID } from \"../constants\";\nimport { SplTokenError } from \"../errors\";\n\n/**\n * Decode account data from the RPC wire format (`[base64data, \"base64\"]`)\n * into raw bytes. Also accepts Uint8Array passthrough for test mocks.\n */\nfunction decodeAccountData(data: string[] | Uint8Array): Uint8Array {\n\tif (data instanceof Uint8Array) return data;\n\tconst encoded = data[0];\n\tconst binaryStr = atob(encoded);\n\tconst bytes = new Uint8Array(binaryStr.length);\n\tfor (let i = 0; i < binaryStr.length; i++) {\n\t\tbytes[i] = binaryStr.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\nimport {\n\tcreateAssociatedTokenAccountIdempotentInstruction,\n\tinitializeMetadataPointerInstruction,\n\ttype InitializeMetadataPointerInstructionOptions,\n\tinitializeMintInstruction,\n\ttype InitializeMintInstructionOptions,\n\tinitializeNonTransferableMintInstruction,\n\ttype InitializeNonTransferableMintInstructionOptions,\n\tinitializeTokenMetadataInstruction,\n\ttype InitializeTokenMetadataInstructionOptions,\n\tinitializeTransferFeeConfigInstruction,\n\ttype InitializeTransferFeeConfigInstructionOptions,\n\ttype Instruction,\n\tmintToInstruction,\n\ttype MintToInstructionOptions,\n\ttransferCheckedInstruction,\n\ttransferCheckedWithFeeInstruction,\n\ttype TransferCheckedWithFeeInstructionOptions,\n\tupdateMetadataPointerInstruction,\n\ttype UpdateMetadataPointerInstructionOptions,\n} from \"../instructions\";\nimport {\n\tfindAssociatedTokenAddress,\n\tgetAssociatedTokenAddressSync,\n} from \"../pda\";\nimport {\n\tgetMintExtensions,\n\tparseMintAccount,\n\tparseTokenAccount,\n\tparseTokenMetadata,\n} from \"../state\";\nimport { resolveTransferHookExtraAccounts } from \"../transfer-hook\";\nimport type {\n\tAtaDerivationResult,\n\tMintInfo,\n\tRawExtension,\n\tTokenAccountInfo,\n\tTokenMetadata,\n\tTransferParams,\n} from \"../types\";\n\n/**\n * Complete mint account data from a single RPC call.\n *\n * Combines mint info, token metadata, and raw extension data\n * to avoid redundant `getAccountInfo` calls per mint.\n */\nexport interface MintAccountData {\n\t/** Parsed mint information (supply, decimals, authorities) */\n\tmintInfo: MintInfo;\n\t/** Token metadata if the TokenMetadata extension exists, null otherwise */\n\tmetadata: TokenMetadata | null;\n\t/** Raw TLV extensions present on this mint (all types, including unparsed ones) */\n\trawExtensions: RawExtension[];\n}\n\n/**\n * Type alias for a built transaction from TransactionBuilder.\n * Using a local alias for clarity rather than inline ReturnType extraction.\n */\ntype BuiltTransaction = ReturnType<typeof TransactionBuilder.prototype.build>;\n\n/**\n * Options for creating an SplTokenClient.\n */\nexport interface SplTokenClientOptions {\n\t/** The underlying RialoClient for RPC calls */\n\tclient: RialoClient;\n\t/** Token program ID (defaults to Token-2022) */\n\tprogramId?: PublicKey;\n}\n\n/**\n * High-level client for SPL Token-2022 operations.\n *\n * Wraps a RialoClient to provide token-specific functionality including\n * reading mint/token account data, getting balances, and building transfers.\n *\n * @example\n * ```typescript\n * import { createRialoClient, RIALO_DEVNET_CHAIN } from '@rialo/ts-cdk';\n * import { createSplTokenClient } from '@rialo/spl-token';\n *\n * const rialoClient = createRialoClient({ chain: RIALO_DEVNET_CHAIN });\n * const tokenClient = createSplTokenClient({ client: rialoClient });\n *\n * // Get token balance\n * const balance = await tokenClient.getBalance({ wallet: walletPubkey, mint: mintPubkey });\n * console.log(`Balance: ${balance}`);\n *\n * // Get mint info\n * const mintInfo = await tokenClient.getMintInfo({ mint: mintPubkey });\n * console.log(`Supply: ${mintInfo.supply}, Decimals: ${mintInfo.decimals}`);\n * ```\n */\nexport class SplTokenClient {\n\tprivate readonly client: RialoClient;\n\tprivate readonly programId: PublicKey;\n\n\t/**\n\t * Creates a new SplTokenClient.\n\t *\n\t * @param options - Client configuration options\n\t */\n\tpublic constructor({\n\t\tclient,\n\t\tprogramId = PublicKey.fromString(TOKEN_2022_PROGRAM_ID),\n\t}: SplTokenClientOptions) {\n\t\tthis.client = client;\n\t\tthis.programId = programId;\n\t}\n\n\t/**\n\t * Returns the Token-2022 program ID used by this client.\n\t */\n\tpublic getProgramId(): PublicKey {\n\t\treturn this.programId;\n\t}\n\n\t/**\n\t * Returns the underlying RialoClient.\n\t *\n\t * Useful for advanced operations that need direct RPC access,\n\t * such as MintBuilder which needs to calculate rent.\n\t */\n\tpublic getRialoClient(): RialoClient {\n\t\treturn this.client;\n\t}\n\n\t/**\n\t * Retrieves mint account information.\n\t *\n\t * @param options - Options containing the mint public key\n\t * @returns Parsed mint information including supply, decimals, and authorities\n\t * @throws {SplTokenError} If the mint account doesn't exist or is invalid\n\t *\n\t * @example\n\t * ```typescript\n\t * const mintInfo = await tokenClient.getMintInfo({ mint });\n\t * console.log(mintInfo.decimals);\n\t * ```\n\t */\n\tpublic async getMintInfo({ mint }: { mint: PublicKey }): Promise<MintInfo> {\n\t\tconst accountInfo = await this.client.getAccountInfo(mint);\n\n\t\tif (!accountInfo) {\n\t\t\tthrow SplTokenError.mintNotFound({ address: mint.toString() });\n\t\t}\n\n\t\treturn parseMintAccount({\n\t\t\taddress: mint,\n\t\t\tdata: decodeAccountData(accountInfo.data),\n\t\t});\n\t}\n\n\t/**\n\t * Retrieves Token-2022 native metadata from a mint.\n\t *\n\t * @param options - Options containing the mint public key\n\t * @returns Parsed token metadata, or null if no metadata extension exists\n\t * @throws {SplTokenError} If the mint account doesn't exist\n\t *\n\t * @example\n\t * ```typescript\n\t * const metadata = await tokenClient.getTokenMetadata({ mint });\n\t * if (metadata) {\n\t * console.log(metadata.name, metadata.symbol);\n\t * }\n\t * ```\n\t */\n\tpublic async getTokenMetadata({\n\t\tmint,\n\t}: {\n\t\tmint: PublicKey;\n\t}): Promise<TokenMetadata | null> {\n\t\tconst accountInfo = await this.client.getAccountInfo(mint);\n\n\t\tif (!accountInfo) {\n\t\t\tthrow SplTokenError.mintNotFound({ address: mint.toString() });\n\t\t}\n\n\t\treturn parseTokenMetadata({\n\t\t\tmint,\n\t\t\tdata: decodeAccountData(accountInfo.data),\n\t\t});\n\t}\n\n\t/**\n\t * Retrieves complete mint account data in a single RPC call.\n\t *\n\t * Returns parsed mint info, token metadata, and raw extensions from one\n\t * `getAccountInfo` call, avoiding the redundant RPC calls that occur when\n\t * calling `getMintInfo()` and `getTokenMetadata()` separately.\n\t *\n\t * Raw extensions include ALL extension types (including PermanentDelegate,\n\t * TransferHook, etc.) unlike `getMintExtensionStates()` which only parses\n\t * a subset.\n\t *\n\t * @param options - Options containing the mint public key\n\t * @returns Combined mint info, metadata, and raw extensions\n\t * @throws {SplTokenError} If the mint account doesn't exist\n\t */\n\tpublic async getMintAccountData({\n\t\tmint,\n\t}: {\n\t\tmint: PublicKey;\n\t}): Promise<MintAccountData> {\n\t\tconst accountInfo = await this.client.getAccountInfo(mint);\n\n\t\tif (!accountInfo) {\n\t\t\tthrow SplTokenError.mintNotFound({ address: mint.toString() });\n\t\t}\n\n\t\tconst data = decodeAccountData(accountInfo.data);\n\n\t\treturn {\n\t\t\tmintInfo: parseMintAccount({ address: mint, data }),\n\t\t\tmetadata: parseTokenMetadata({ mint, data }),\n\t\t\trawExtensions: getMintExtensions({ data }),\n\t\t};\n\t}\n\n\t/**\n\t * Retrieves token account information.\n\t *\n\t * @param options - Options containing the token account public key\n\t * @returns Parsed token account information\n\t * @throws {SplTokenError} If the account doesn't exist or is invalid\n\t */\n\tpublic async getTokenAccountInfo({\n\t\ttokenAccount,\n\t}: {\n\t\ttokenAccount: PublicKey;\n\t}): Promise<TokenAccountInfo> {\n\t\tconst accountInfo = await this.client.getAccountInfo(tokenAccount);\n\n\t\tif (!accountInfo) {\n\t\t\tthrow SplTokenError.tokenAccountNotFound({\n\t\t\t\taddress: tokenAccount.toString(),\n\t\t\t});\n\t\t}\n\n\t\treturn parseTokenAccount({\n\t\t\taddress: tokenAccount,\n\t\t\tdata: decodeAccountData(accountInfo.data),\n\t\t});\n\t}\n\n\t/**\n\t * Gets the token balance for a wallet.\n\t *\n\t * Automatically derives the Associated Token Address for the wallet/mint\n\t * combination and retrieves the balance.\n\t *\n\t * @param options - Options containing wallet and mint public keys\n\t * @returns The token balance in smallest units, or 0n if the ATA doesn't exist\n\t *\n\t * @example\n\t * ```typescript\n\t * const balance = await tokenClient.getBalance({ wallet: walletPubkey, mint: mintPubkey });\n\t * console.log(`Token balance: ${balance}`);\n\t * ```\n\t */\n\tpublic async getBalance({\n\t\twallet,\n\t\tmint,\n\t}: {\n\t\twallet: PublicKey;\n\t\tmint: PublicKey;\n\t}): Promise<bigint> {\n\t\tconst ata = getAssociatedTokenAddressSync({\n\t\t\twallet,\n\t\t\tmint,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t\tconst accountInfo = await this.client.getAccountInfo(ata);\n\n\t\tif (!accountInfo) {\n\t\t\treturn 0n;\n\t\t}\n\n\t\tconst tokenAccount = parseTokenAccount({\n\t\t\taddress: ata,\n\t\t\tdata: decodeAccountData(accountInfo.data),\n\t\t});\n\t\treturn tokenAccount.amount;\n\t}\n\n\t/**\n\t * Derives the Associated Token Address for a wallet and mint.\n\t *\n\t * @param options - Options containing wallet and mint public keys\n\t * @returns The derived ATA address and bump seed\n\t * @throws {SplTokenError} If the ATA derivation fails\n\t *\n\t * @example\n\t * ```typescript\n\t * const { address, bump } = tokenClient.getAssociatedTokenAddress({ wallet: walletPubkey, mint: mintPubkey });\n\t * console.log(`ATA: ${address.toString()}`);\n\t * ```\n\t */\n\tpublic getAssociatedTokenAddress({\n\t\twallet,\n\t\tmint,\n\t}: {\n\t\twallet: PublicKey;\n\t\tmint: PublicKey;\n\t}): AtaDerivationResult {\n\t\treturn findAssociatedTokenAddress({\n\t\t\twallet,\n\t\t\tmint,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t}\n\n\t/**\n\t * Checks if an Associated Token Account exists.\n\t *\n\t * @param options - Options containing wallet and mint public keys\n\t * @returns True if the ATA exists, false otherwise\n\t */\n\tpublic async ataExists({\n\t\twallet,\n\t\tmint,\n\t}: {\n\t\twallet: PublicKey;\n\t\tmint: PublicKey;\n\t}): Promise<boolean> {\n\t\tconst ata = getAssociatedTokenAddressSync({\n\t\t\twallet,\n\t\t\tmint,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t\tconst accountInfo = await this.client.getAccountInfo(ata);\n\t\treturn accountInfo !== null;\n\t}\n\n\t/**\n\t * Creates instructions for a token transfer.\n\t *\n\t * Builds the necessary instructions for transferring tokens,\n\t * optionally creating the destination ATA if it doesn't exist.\n\t *\n\t * @param params - Transfer parameters\n\t * @returns Array of instructions to execute\n\t *\n\t * @example\n\t * ```typescript\n\t * const instructions = await tokenClient.createTransferInstructions({\n\t * source: senderWallet,\n\t * destination: recipientWallet,\n\t * mint: mintPubkey,\n\t * amount: 1000000n,\n\t * decimals: 6,\n\t * createDestinationAta: true,\n\t * });\n\t * ```\n\t */\n\tpublic async createTransferInstructions(\n\t\tparams: TransferParams,\n\t): Promise<Instruction[]> {\n\t\tconst {\n\t\t\tsource,\n\t\t\tdestination,\n\t\t\tmint,\n\t\t\tamount,\n\t\t\tdecimals,\n\t\t\tcreateDestinationAta = true,\n\t\t} = params;\n\n\t\tconst instructions: Instruction[] = [];\n\n\t\tconst sourceAta = getAssociatedTokenAddressSync({\n\t\t\twallet: source,\n\t\t\tmint,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t\tconst destinationAta = getAssociatedTokenAddressSync({\n\t\t\twallet: destination,\n\t\t\tmint,\n\t\t\tprogramId: this.programId,\n\t\t});\n\n\t\tif (createDestinationAta) {\n\t\t\t// Use the idempotent variant so the instruction succeeds whether or not\n\t\t\t// the account already exists, eliminating the check-then-act race condition\n\t\t\t// that would occur with concurrent callers.\n\t\t\tinstructions.push(\n\t\t\t\tcreateAssociatedTokenAccountIdempotentInstruction({\n\t\t\t\t\tpayer: source,\n\t\t\t\t\tassociatedToken: destinationAta,\n\t\t\t\t\towner: destination,\n\t\t\t\t\tmint,\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (params.transferFee) {\n\t\t\tinstructions.push(\n\t\t\t\ttransferCheckedWithFeeInstruction({\n\t\t\t\t\tsource: sourceAta,\n\t\t\t\t\tmint,\n\t\t\t\t\tdestination: destinationAta,\n\t\t\t\t\tauthority: source,\n\t\t\t\t\tamount,\n\t\t\t\t\tdecimals,\n\t\t\t\t\tfee: params.transferFee.fee,\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tinstructions.push(\n\t\t\t\ttransferCheckedInstruction({\n\t\t\t\t\tsource: sourceAta,\n\t\t\t\t\tmint,\n\t\t\t\t\tdestination: destinationAta,\n\t\t\t\t\tauthority: source,\n\t\t\t\t\tamount,\n\t\t\t\t\tdecimals,\n\t\t\t\t\tprogramId: this.programId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\t// If mint has a transfer hook, resolve extra accounts and append to the transfer instruction\n\t\tif (params.transferHook) {\n\t\t\tconst { hookProgramId } = params.transferHook;\n\t\t\tconst transferIx = instructions[instructions.length - 1];\n\t\t\tconst extraAccounts = await resolveTransferHookExtraAccounts({\n\t\t\t\tmint,\n\t\t\t\thookProgramId,\n\t\t\t\tsourceAta,\n\t\t\t\tdestinationAta,\n\t\t\t\tauthority: source,\n\t\t\t\tamount,\n\t\t\t\tdecimals,\n\t\t\tfetchAccountData: async (pubkey: PublicKey) => {\n\t\t\t\tconst info = await this.client.getAccountInfo(pubkey);\n\t\t\t\treturn info ? decodeAccountData(info.data) : null;\n\t\t\t},\n\t\t\t});\n\t\t\tfor (const account of extraAccounts) {\n\t\t\t\ttransferIx.accounts.push(account);\n\t\t\t}\n\t\t}\n\n\t\treturn instructions;\n\t}\n\n\t/**\n\t * Creates a transaction for a token transfer.\n\t *\n\t * Builds a complete transaction with all necessary instructions for\n\t * transferring tokens, including ATA creation if needed.\n\t *\n\t * @param options - Options containing params and validFrom\n\t * @returns Built transaction ready for signing\n\t *\n\t * @example\n\t * ```typescript\n\t * const blockHeight = await rialoClient.getBlockHeight();\n\t * const configHashPrefix = await rialoClient.getConfigHashPrefix();\n\t * const tx = await tokenClient.createTransferTransaction({\n\t * params: {\n\t * source: senderWallet,\n\t * destination: recipientWallet,\n\t * mint: mintPubkey,\n\t * amount: 1000000n,\n\t * decimals: 6,\n\t * },\n\t * validFrom: blockHeight,\n\t * configHashPrefix,\n\t * });\n\t *\n\t * // Sign and send\n\t * const signedTx = tx.sign([signer]);\n\t * const signature = await rialoClient.sendTransaction(signedTx.serialize());\n\t * ```\n\t */\n\tpublic async createTransferTransaction({\n\t\tparams,\n\t\tpayer,\n\t\tvalidFrom,\n\t\tconfigHashPrefix,\n\t}: {\n\t\tparams: TransferParams;\n\t\tpayer: PublicKey;\n\t\tvalidFrom: bigint;\n\t\tconfigHashPrefix: bigint;\n\t}): Promise<BuiltTransaction> {\n\t\tconst instructions = await this.createTransferInstructions(params);\n\n\t\tconst builder = TransactionBuilder.create()\n\t\t\t.setPayer(payer)\n\t\t\t.setValidFrom(validFrom)\n\t\t\t.setConfigHashPrefix(configHashPrefix);\n\n\t\tfor (const instruction of instructions) {\n\t\t\tbuilder.addInstruction(instruction);\n\t\t}\n\n\t\treturn builder.build();\n\t}\n\n\t/**\n\t * Transfers tokens and sends the transaction.\n\t *\n\t * This is a high-level convenience method that:\n\t * 1. Creates the destination ATA if needed\n\t * 2. Builds the transfer transaction\n\t * 3. Signs and sends the transaction\n\t * 4. Waits for confirmation\n\t *\n\t * @param options - Transfer params, payer, validFrom, and signers\n\t * @returns Transaction signature\n\t *\n\t * @example\n\t * ```typescript\n\t * const blockHeight = await rialoClient.getBlockHeight();\n\t * const configHashPrefix = await rialoClient.getConfigHashPrefix();\n\t * const signature = await tokenClient.transfer({\n\t * params: {\n\t * source: senderWallet,\n\t * destination: recipientWallet,\n\t * mint: mintPubkey,\n\t * amount: 1000000n,\n\t * decimals: 6,\n\t * },\n\t * validFrom: blockHeight,\n\t * configHashPrefix,\n\t * signer: senderSigner,\n\t * });\n\t * console.log(`Transfer complete: ${signature}`);\n\t * ```\n\t */\n\tpublic async transfer({\n\t\tparams,\n\t\tpayer,\n\t\tvalidFrom,\n\t\tconfigHashPrefix,\n\t\tsigners,\n\t}: {\n\t\tparams: TransferParams;\n\t\tpayer: PublicKey;\n\t\tvalidFrom: bigint;\n\t\tconfigHashPrefix: bigint;\n\t\tsigners: Signer[];\n\t}): Promise<string> {\n\t\tconst tx = await this.createTransferTransaction({\n\t\t\tparams,\n\t\t\tpayer,\n\t\t\tvalidFrom,\n\t\t\tconfigHashPrefix,\n\t\t});\n\t\treturn this.signAndSend({ tx, signers });\n\t}\n\n\t/**\n\t * Initializes a mint and sends the transaction.\n\t *\n\t * @param options - Initialize mint params, payer, validFrom, and signers\n\t * @returns Transaction signature\n\t */\n\tpublic initializeMint({\n\t\tparams,\n\t\tpayer,\n\t\tvalidFrom,\n\t\tsigners,\n\t}: {\n\t\tparams: InitializeMintInstructionOptions;\n\t\tpayer: PublicKey;\n\t\tvalidFrom: bigint;\n\t\tsigners: Signer[];\n\t}): Promise<string> {\n\t\tconst instruction = initializeMintInstruction({\n\t\t\t...params,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t\tconst tx = TransactionBuilder.create()\n\t\t\t.setPayer(payer)\n\t\t\t.setValidFrom(validFrom)\n\t\t\t.addInstruction(instruction)\n\t\t\t.build();\n\n\t\treturn this.signAndSend({ tx, signers });\n\t}\n\n\t/**\n\t * Mints tokens and sends the transaction.\n\t *\n\t * @param options - Mint-to params, payer, validFrom, and signers\n\t * @returns Transaction signature\n\t */\n\tpublic mintTo({\n\t\tparams,\n\t\tpayer,\n\t\tvalidFrom,\n\t\tsigners,\n\t}: {\n\t\tparams: MintToInstructionOptions;\n\t\tpayer: PublicKey;\n\t\tvalidFrom: bigint;\n\t\tsigners: Signer[];\n\t}): Promise<string> {\n\t\tconst instruction = mintToInstruction({\n\t\t\t...params,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t\tconst tx = TransactionBuilder.create()\n\t\t\t.setPayer(payer)\n\t\t\t.setValidFrom(validFrom)\n\t\t\t.addInstruction(instruction)\n\t\t\t.build();\n\n\t\treturn this.signAndSend({ tx, signers });\n\t}\n\n\t/**\n\t * Initializes token metadata on a mint.\n\t *\n\t * Use this for the on-mint TokenMetadata extension flow.\n\t *\n\t * @param options - Token metadata params, payer, validFrom, and signers\n\t * @returns Transaction signature\n\t */\n\tpublic initializeTokenMetadata({\n\t\tparams,\n\t\tpayer,\n\t\tvalidFrom,\n\t\tsigners,\n\t}: {\n\t\tparams: InitializeTokenMetadataInstructionOptions;\n\t\tpayer: PublicKey;\n\t\tvalidFrom: bigint;\n\t\tsigners: Signer[];\n\t}): Promise<string> {\n\t\tconst instruction = initializeTokenMetadataInstruction({\n\t\t\t...params,\n\t\t\tprogramId: params.programId ?? this.programId,\n\t\t});\n\t\tconst tx = TransactionBuilder.create()\n\t\t\t.setPayer(payer)\n\t\t\t.setValidFrom(validFrom)\n\t\t\t.addInstruction(instruction)\n\t\t\t.build();\n\n\t\treturn this.signAndSend({ tx, signers });\n\t}\n\n\t/**\n\t * Initializes a metadata pointer extension on a mint.\n\t *\n\t * Use this for the Metadata Pointer flow, where metadata lives in\n\t * a separate account and the mint stores a pointer to it.\n\t *\n\t * @param options - Metadata pointer params, payer, validFrom, and signers\n\t * @returns Transaction signature\n\t */\n\tpublic initializeMetadataPointer({\n\t\tparams,\n\t\tpayer,\n\t\tvalidFrom,\n\t\tsigners,\n\t}: {\n\t\tparams: InitializeMetadataPointerInstructionOptions;\n\t\tpayer: PublicKey;\n\t\tvalidFrom: bigint;\n\t\tsigners: Signer[];\n\t}): Promise<string> {\n\t\tconst instruction = initializeMetadataPointerInstruction({\n\t\t\t...params,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t\tconst tx = TransactionBuilder.create()\n\t\t\t.setPayer(payer)\n\t\t\t.setValidFrom(validFrom)\n\t\t\t.addInstruction(instruction)\n\t\t\t.build();\n\n\t\treturn this.signAndSend({ tx, signers });\n\t}\n\n\t/**\n\t * Updates a metadata pointer extension on a mint.\n\t *\n\t * @param options - Metadata pointer params, payer, validFrom, and signers\n\t * @returns Transaction signature\n\t */\n\tpublic updateMetadataPointer({\n\t\tparams,\n\t\tpayer,\n\t\tvalidFrom,\n\t\tsigners,\n\t}: {\n\t\tparams: UpdateMetadataPointerInstructionOptions;\n\t\tpayer: PublicKey;\n\t\tvalidFrom: bigint;\n\t\tsigners: Signer[];\n\t}): Promise<string> {\n\t\tconst instruction = updateMetadataPointerInstruction({\n\t\t\t...params,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t\tconst tx = TransactionBuilder.create()\n\t\t\t.setPayer(payer)\n\t\t\t.setValidFrom(validFrom)\n\t\t\t.addInstruction(instruction)\n\t\t\t.build();\n\n\t\treturn this.signAndSend({ tx, signers });\n\t}\n\n\t/**\n\t * Initializes a transfer fee config on a mint.\n\t *\n\t * @param options - Transfer fee config params, payer, validFrom, and signers\n\t * @returns Transaction signature\n\t */\n\tpublic initializeTransferFeeConfig({\n\t\tparams,\n\t\tpayer,\n\t\tvalidFrom,\n\t\tsigners,\n\t}: {\n\t\tparams: InitializeTransferFeeConfigInstructionOptions;\n\t\tpayer: PublicKey;\n\t\tvalidFrom: bigint;\n\t\tsigners: Signer[];\n\t}): Promise<string> {\n\t\tconst instruction = initializeTransferFeeConfigInstruction({\n\t\t\t...params,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t\tconst tx = TransactionBuilder.create()\n\t\t\t.setPayer(payer)\n\t\t\t.setValidFrom(validFrom)\n\t\t\t.addInstruction(instruction)\n\t\t\t.build();\n\n\t\treturn this.signAndSend({ tx, signers });\n\t}\n\n\t/**\n\t * Transfers tokens with a fee and sends the transaction.\n\t *\n\t * @param options - Transfer params, payer, validFrom, and signers\n\t * @returns Transaction signature\n\t */\n\tpublic transferCheckedWithFee({\n\t\tparams,\n\t\tpayer,\n\t\tvalidFrom,\n\t\tsigners,\n\t}: {\n\t\tparams: TransferCheckedWithFeeInstructionOptions;\n\t\tpayer: PublicKey;\n\t\tvalidFrom: bigint;\n\t\tsigners: Signer[];\n\t}): Promise<string> {\n\t\tconst instruction = transferCheckedWithFeeInstruction({\n\t\t\t...params,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t\tconst tx = TransactionBuilder.create()\n\t\t\t.setPayer(payer)\n\t\t\t.setValidFrom(validFrom)\n\t\t\t.addInstruction(instruction)\n\t\t\t.build();\n\n\t\treturn this.signAndSend({ tx, signers });\n\t}\n\n\t/**\n\t * Initializes a non-transferable mint.\n\t *\n\t * @param options - Non-transferable mint params, payer, validFrom, and signers\n\t * @returns Transaction signature\n\t */\n\tpublic initializeNonTransferableMint({\n\t\tparams,\n\t\tpayer,\n\t\tvalidFrom,\n\t\tsigners,\n\t}: {\n\t\tparams: InitializeNonTransferableMintInstructionOptions;\n\t\tpayer: PublicKey;\n\t\tvalidFrom: bigint;\n\t\tsigners: Signer[];\n\t}): Promise<string> {\n\t\tconst instruction = initializeNonTransferableMintInstruction({\n\t\t\t...params,\n\t\t\tprogramId: this.programId,\n\t\t});\n\t\tconst tx = TransactionBuilder.create()\n\t\t\t.setPayer(payer)\n\t\t\t.setValidFrom(validFrom)\n\t\t\t.addInstruction(instruction)\n\t\t\t.build();\n\n\t\treturn this.signAndSend({ tx, signers });\n\t}\n\n\tprivate async signAndSend({\n\t\ttx,\n\t\tsigners,\n\t}: {\n\t\ttx: BuiltTransaction;\n\t\tsigners: Signer[];\n\t}): Promise<string> {\n\t\tif (signers.length === 0) {\n\t\t\tthrow new Error(\"At least one signer required.\");\n\t\t}\n\n\t\tconst signedTx = await tx.signAllWith(signers);\n\t\tconst result = await this.client.sendAndConfirmTransaction(\n\t\t\tsignedTx.serialize(),\n\t\t);\n\t\treturn result.signature;\n\t}\n}\n\n/**\n * Factory function to create a SplTokenClient.\n *\n * @example\n * ```typescript\n * const tokenClient = createSplTokenClient({ client: rialoClient });\n * ```\n */\nexport function createSplTokenClient(\n\toptions: SplTokenClientOptions,\n): SplTokenClient {\n\treturn new SplTokenClient(options);\n}\n","// Copyright (c) Subzero Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * High-level recipe for creating a Token-2022 mint with metadata.\n *\n * This module provides a simple, one-call function to create a new token\n * with metadata extension, optionally minting initial supply.\n *\n * @example\n * ```typescript\n * import { createSplTokenClient, createTokenWithMetadata } from \"@rialo/spl-token\";\n *\n * const tokenClient = createSplTokenClient({ client });\n *\n * const { signature, mintAddress } = await createTokenWithMetadata(tokenClient, {\n * decimals: 9,\n * mintAuthority: masterPubkey,\n * metadata: {\n * name: \"Rialo Test Token\",\n * symbol: \"RTST\",\n * uri: \"https://example.com/image.png\",\n * },\n * initialMint: {\n * destination: masterPubkey,\n * amount: 1_000_000_000_000_000n,\n * },\n * }, {\n * payer: masterPubkey,\n * mintKeypair,\n * validFrom: BigInt(Date.now()),\n * signers: [masterKeypair, mintKeypair],\n * });\n * ```\n */\n\nimport type { Keypair, PublicKey } from \"@rialo/ts-cdk\";\nimport { MintBuilder } from \"../builders/mint-builder\";\nimport type { SplTokenClient } from \"../client/spl-token-client\";\n\n/**\n * Token metadata configuration.\n */\nexport interface TokenMetadataParams {\n /** Token name */\n name: string;\n /** Token symbol */\n symbol: string;\n /** Token URI (typically points to JSON metadata or an image) */\n uri: string;\n /** Optional additional metadata key-value pairs */\n additionalMetadata?: Array<[string, string]>;\n}\n\n/**\n * Parameters for creating a token with metadata.\n */\nexport interface CreateTokenWithMetadataParams {\n /** Number of decimals for the token (0-255, SPL Token-2022 stores this as a u8) */\n decimals: number;\n /** Public key of the mint authority */\n mintAuthority: PublicKey;\n /** Optional freeze authority */\n freezeAuthority?: PublicKey;\n /** Token metadata configuration */\n metadata: TokenMetadataParams;\n /**\n * Optional initial mint configuration.\n * If provided, tokens will be minted to the destination wallet's ATA.\n */\n initialMint?: {\n /** Wallet address to receive initial tokens */\n destination: PublicKey;\n /** Amount to mint in smallest units */\n amount: bigint;\n };\n}\n\n/**\n * Transaction options for creating a token.\n */\nexport interface CreateTokenWithMetadataOptions {\n /** Fee payer for the transaction */\n payer: PublicKey;\n /** Keypair for the new mint account */\n mintKeypair: Keypair;\n /** Transaction validity timestamp (milliseconds since epoch) */\n validFrom: bigint;\n /** Keypairs for signing the transaction (must include payer and mintKeypair) */\n signers: Keypair[];\n}\n\n/**\n * Result of creating a token with metadata.\n */\nexport interface CreateTokenWithMetadataResult {\n /** Transaction signature */\n signature: string;\n /** The mint address */\n mintAddress: PublicKey;\n /** The ATA address if initial mint was configured */\n ataAddress?: PublicKey;\n}\n\n/**\n * Creates a new SPL Token-2022 mint with metadata extension.\n *\n * This is a high-level convenience function that handles:\n * - Account size calculation for metadata\n * - Rent-exempt balance calculation\n * - Creating the mint account\n * - Initializing metadata pointer and metadata extensions\n * - Optionally creating an ATA and minting initial supply\n *\n * @param tokenClient - SplTokenClient instance\n * @param params - Token configuration parameters\n * @param options - Transaction options\n * @returns Result with signature and addresses\n *\n * @example\n * ```typescript\n * // Simple token creation\n * const { mintAddress } = await createTokenWithMetadata(tokenClient, {\n * decimals: 9,\n * mintAuthority: authority,\n * metadata: { name: \"My Token\", symbol: \"MTK\", uri: \"https://...\" },\n * }, { payer: authority, mintKeypair, validFrom: BigInt(Date.now()), signers: [authorityKeypair, mintKeypair] });\n *\n * // With initial supply\n * const { mintAddress, ataAddress } = await createTokenWithMetadata(tokenClient, {\n * decimals: 9,\n * mintAuthority: authority,\n * metadata: { name: \"My Token\", symbol: \"MTK\", uri: \"https://...\" },\n * initialMint: { destination: authority, amount: 1_000_000_000n },\n * }, { payer: authority, mintKeypair, validFrom: BigInt(Date.now()), signers: [authorityKeypair, mintKeypair] });\n * ```\n */\nexport async function createTokenWithMetadata(\n tokenClient: SplTokenClient,\n params: CreateTokenWithMetadataParams,\n options: CreateTokenWithMetadataOptions\n): Promise<CreateTokenWithMetadataResult> {\n const builder = MintBuilder.create(tokenClient)\n .withDecimals(params.decimals)\n .withMintAuthority(params.mintAuthority)\n .withMetadata(params.metadata);\n\n if (params.freezeAuthority) {\n builder.withFreezeAuthority(params.freezeAuthority);\n }\n\n if (params.initialMint) {\n builder.withInitialSupply(params.initialMint);\n }\n\n return await builder.send({\n payer: options.payer,\n mintKeypair: options.mintKeypair,\n validFrom: options.validFrom,\n signers: options.signers,\n });\n}\n"]}
|