@byreal-io/byreal-clmm-sdk 0.2.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.
Files changed (181) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -0
  3. package/dist/esm/client/chain.d.ts +227 -0
  4. package/dist/esm/client/chain.d.ts.map +1 -0
  5. package/dist/esm/client/chain.js +1123 -0
  6. package/dist/esm/client/chain.js.map +1 -0
  7. package/dist/esm/client/index.d.ts +4 -0
  8. package/dist/esm/client/index.d.ts.map +1 -0
  9. package/dist/esm/client/index.js +4 -0
  10. package/dist/esm/client/index.js.map +1 -0
  11. package/dist/esm/client/models.d.ts +160 -0
  12. package/dist/esm/client/models.d.ts.map +1 -0
  13. package/dist/esm/client/models.js +2 -0
  14. package/dist/esm/client/models.js.map +1 -0
  15. package/dist/esm/client/utils.d.ts +103 -0
  16. package/dist/esm/client/utils.d.ts.map +1 -0
  17. package/dist/esm/client/utils.js +238 -0
  18. package/dist/esm/client/utils.js.map +1 -0
  19. package/dist/esm/constants.d.ts +19 -0
  20. package/dist/esm/constants.d.ts.map +1 -0
  21. package/dist/esm/constants.js +27 -0
  22. package/dist/esm/constants.js.map +1 -0
  23. package/dist/esm/index.d.ts +5 -0
  24. package/dist/esm/index.d.ts.map +1 -0
  25. package/dist/esm/index.js +5 -0
  26. package/dist/esm/index.js.map +1 -0
  27. package/dist/esm/instructions/baseInstruction.d.ts +74 -0
  28. package/dist/esm/instructions/baseInstruction.d.ts.map +1 -0
  29. package/dist/esm/instructions/baseInstruction.js +577 -0
  30. package/dist/esm/instructions/baseInstruction.js.map +1 -0
  31. package/dist/esm/instructions/constants.d.ts +29 -0
  32. package/dist/esm/instructions/constants.d.ts.map +1 -0
  33. package/dist/esm/instructions/constants.js +32 -0
  34. package/dist/esm/instructions/constants.js.map +1 -0
  35. package/dist/esm/instructions/getRawData.d.ts +60 -0
  36. package/dist/esm/instructions/getRawData.d.ts.map +1 -0
  37. package/dist/esm/instructions/getRawData.js +105 -0
  38. package/dist/esm/instructions/getRawData.js.map +1 -0
  39. package/dist/esm/instructions/index.d.ts +9 -0
  40. package/dist/esm/instructions/index.d.ts.map +1 -0
  41. package/dist/esm/instructions/index.js +9 -0
  42. package/dist/esm/instructions/index.js.map +1 -0
  43. package/dist/esm/instructions/instruction.d.ts +137 -0
  44. package/dist/esm/instructions/instruction.d.ts.map +1 -0
  45. package/dist/esm/instructions/instruction.js +152 -0
  46. package/dist/esm/instructions/instruction.js.map +1 -0
  47. package/dist/esm/instructions/layout.d.ts +217 -0
  48. package/dist/esm/instructions/layout.d.ts.map +1 -0
  49. package/dist/esm/instructions/layout.js +203 -0
  50. package/dist/esm/instructions/layout.js.map +1 -0
  51. package/dist/esm/instructions/libs/marshmallow/bufferLayout.d.ts +107 -0
  52. package/dist/esm/instructions/libs/marshmallow/bufferLayout.d.ts.map +1 -0
  53. package/dist/esm/instructions/libs/marshmallow/bufferLayout.js +49 -0
  54. package/dist/esm/instructions/libs/marshmallow/bufferLayout.js.map +1 -0
  55. package/dist/esm/instructions/libs/marshmallow/index.d.ts +88 -0
  56. package/dist/esm/instructions/libs/marshmallow/index.d.ts.map +1 -0
  57. package/dist/esm/instructions/libs/marshmallow/index.js +256 -0
  58. package/dist/esm/instructions/libs/marshmallow/index.js.map +1 -0
  59. package/dist/esm/instructions/models.d.ts +39 -0
  60. package/dist/esm/instructions/models.d.ts.map +1 -0
  61. package/dist/esm/instructions/models.js +14 -0
  62. package/dist/esm/instructions/models.js.map +1 -0
  63. package/dist/esm/instructions/pda.d.ts +52 -0
  64. package/dist/esm/instructions/pda.d.ts.map +1 -0
  65. package/dist/esm/instructions/pda.js +47 -0
  66. package/dist/esm/instructions/pda.js.map +1 -0
  67. package/dist/esm/instructions/target/idl/byreal_amm_v3.json +7242 -0
  68. package/dist/esm/instructions/target/idl/byreal_amm_v3_test.json +7680 -0
  69. package/dist/esm/instructions/target/types/byreal_amm_v3.d.ts +5329 -0
  70. package/dist/esm/instructions/target/types/byreal_amm_v3.d.ts.map +1 -0
  71. package/dist/esm/instructions/target/types/byreal_amm_v3.js +2 -0
  72. package/dist/esm/instructions/target/types/byreal_amm_v3.js.map +1 -0
  73. package/dist/esm/instructions/target/types/raydium_amm_v3.d.ts +4149 -0
  74. package/dist/esm/instructions/target/types/raydium_amm_v3.d.ts.map +1 -0
  75. package/dist/esm/instructions/target/types/raydium_amm_v3.js +2 -0
  76. package/dist/esm/instructions/target/types/raydium_amm_v3.js.map +1 -0
  77. package/dist/esm/instructions/utils/binaryUtils.d.ts +11 -0
  78. package/dist/esm/instructions/utils/binaryUtils.d.ts.map +1 -0
  79. package/dist/esm/instructions/utils/binaryUtils.js +77 -0
  80. package/dist/esm/instructions/utils/binaryUtils.js.map +1 -0
  81. package/dist/esm/instructions/utils/fetchWalletTokenAccounts.d.ts +42 -0
  82. package/dist/esm/instructions/utils/fetchWalletTokenAccounts.d.ts.map +1 -0
  83. package/dist/esm/instructions/utils/fetchWalletTokenAccounts.js +63 -0
  84. package/dist/esm/instructions/utils/fetchWalletTokenAccounts.js.map +1 -0
  85. package/dist/esm/instructions/utils/getTickArrayBitmapExtension.d.ts +8 -0
  86. package/dist/esm/instructions/utils/getTickArrayBitmapExtension.d.ts.map +1 -0
  87. package/dist/esm/instructions/utils/getTickArrayBitmapExtension.js +22 -0
  88. package/dist/esm/instructions/utils/getTickArrayBitmapExtension.js.map +1 -0
  89. package/dist/esm/instructions/utils/getTickArrayInfo.d.ts +16 -0
  90. package/dist/esm/instructions/utils/getTickArrayInfo.d.ts.map +1 -0
  91. package/dist/esm/instructions/utils/getTickArrayInfo.js +75 -0
  92. package/dist/esm/instructions/utils/getTickArrayInfo.js.map +1 -0
  93. package/dist/esm/instructions/utils/index.d.ts +21 -0
  94. package/dist/esm/instructions/utils/index.d.ts.map +1 -0
  95. package/dist/esm/instructions/utils/index.js +21 -0
  96. package/dist/esm/instructions/utils/index.js.map +1 -0
  97. package/dist/esm/instructions/utils/liquidityMath.d.ts +30 -0
  98. package/dist/esm/instructions/utils/liquidityMath.d.ts.map +1 -0
  99. package/dist/esm/instructions/utils/liquidityMath.js +138 -0
  100. package/dist/esm/instructions/utils/liquidityMath.js.map +1 -0
  101. package/dist/esm/instructions/utils/mathUtils.d.ts +11 -0
  102. package/dist/esm/instructions/utils/mathUtils.d.ts.map +1 -0
  103. package/dist/esm/instructions/utils/mathUtils.js +36 -0
  104. package/dist/esm/instructions/utils/mathUtils.js.map +1 -0
  105. package/dist/esm/instructions/utils/models.d.ts +93 -0
  106. package/dist/esm/instructions/utils/models.d.ts.map +1 -0
  107. package/dist/esm/instructions/utils/models.js +13 -0
  108. package/dist/esm/instructions/utils/models.js.map +1 -0
  109. package/dist/esm/instructions/utils/poolStateUtils.d.ts +134 -0
  110. package/dist/esm/instructions/utils/poolStateUtils.d.ts.map +1 -0
  111. package/dist/esm/instructions/utils/poolStateUtils.js +137 -0
  112. package/dist/esm/instructions/utils/poolStateUtils.js.map +1 -0
  113. package/dist/esm/instructions/utils/poolUtils.d.ts +136 -0
  114. package/dist/esm/instructions/utils/poolUtils.d.ts.map +1 -0
  115. package/dist/esm/instructions/utils/poolUtils.js +219 -0
  116. package/dist/esm/instructions/utils/poolUtils.js.map +1 -0
  117. package/dist/esm/instructions/utils/position.d.ts +36 -0
  118. package/dist/esm/instructions/utils/position.d.ts.map +1 -0
  119. package/dist/esm/instructions/utils/position.js +86 -0
  120. package/dist/esm/instructions/utils/position.js.map +1 -0
  121. package/dist/esm/instructions/utils/sqrtPriceMath.d.ts +14 -0
  122. package/dist/esm/instructions/utils/sqrtPriceMath.d.ts.map +1 -0
  123. package/dist/esm/instructions/utils/sqrtPriceMath.js +168 -0
  124. package/dist/esm/instructions/utils/sqrtPriceMath.js.map +1 -0
  125. package/dist/esm/instructions/utils/swapMath.d.ts +48 -0
  126. package/dist/esm/instructions/utils/swapMath.d.ts.map +1 -0
  127. package/dist/esm/instructions/utils/swapMath.js +263 -0
  128. package/dist/esm/instructions/utils/swapMath.js.map +1 -0
  129. package/dist/esm/instructions/utils/tick.d.ts +106 -0
  130. package/dist/esm/instructions/utils/tick.d.ts.map +1 -0
  131. package/dist/esm/instructions/utils/tick.js +390 -0
  132. package/dist/esm/instructions/utils/tick.js.map +1 -0
  133. package/dist/esm/instructions/utils/tickArrayUtils.d.ts +50 -0
  134. package/dist/esm/instructions/utils/tickArrayUtils.d.ts.map +1 -0
  135. package/dist/esm/instructions/utils/tickArrayUtils.js +157 -0
  136. package/dist/esm/instructions/utils/tickArrayUtils.js.map +1 -0
  137. package/dist/esm/instructions/utils/tickMath.d.ts +18 -0
  138. package/dist/esm/instructions/utils/tickMath.d.ts.map +1 -0
  139. package/dist/esm/instructions/utils/tickMath.js +34 -0
  140. package/dist/esm/instructions/utils/tickMath.js.map +1 -0
  141. package/dist/esm/instructions/utils/tickarrayBitmap.d.ts +38 -0
  142. package/dist/esm/instructions/utils/tickarrayBitmap.d.ts.map +1 -0
  143. package/dist/esm/instructions/utils/tickarrayBitmap.js +157 -0
  144. package/dist/esm/instructions/utils/tickarrayBitmap.js.map +1 -0
  145. package/dist/esm/instructions/utils/transfer.d.ts +7 -0
  146. package/dist/esm/instructions/utils/transfer.d.ts.map +1 -0
  147. package/dist/esm/instructions/utils/transfer.js +78 -0
  148. package/dist/esm/instructions/utils/transfer.js.map +1 -0
  149. package/dist/esm/utils/accountInfo.d.ts +27 -0
  150. package/dist/esm/utils/accountInfo.d.ts.map +1 -0
  151. package/dist/esm/utils/accountInfo.js +80 -0
  152. package/dist/esm/utils/accountInfo.js.map +1 -0
  153. package/dist/esm/utils/checkV0TxSize.d.ts +8 -0
  154. package/dist/esm/utils/checkV0TxSize.d.ts.map +1 -0
  155. package/dist/esm/utils/checkV0TxSize.js +18 -0
  156. package/dist/esm/utils/checkV0TxSize.js.map +1 -0
  157. package/dist/esm/utils/estimateComputeUnits.d.ts +11 -0
  158. package/dist/esm/utils/estimateComputeUnits.d.ts.map +1 -0
  159. package/dist/esm/utils/estimateComputeUnits.js +48 -0
  160. package/dist/esm/utils/estimateComputeUnits.js.map +1 -0
  161. package/dist/esm/utils/generatePubKey.d.ts +10 -0
  162. package/dist/esm/utils/generatePubKey.d.ts.map +1 -0
  163. package/dist/esm/utils/generatePubKey.js +14 -0
  164. package/dist/esm/utils/generatePubKey.js.map +1 -0
  165. package/dist/esm/utils/index.d.ts +9 -0
  166. package/dist/esm/utils/index.d.ts.map +1 -0
  167. package/dist/esm/utils/index.js +11 -0
  168. package/dist/esm/utils/index.js.map +1 -0
  169. package/dist/esm/utils/token.d.ts +9 -0
  170. package/dist/esm/utils/token.d.ts.map +1 -0
  171. package/dist/esm/utils/token.js +16 -0
  172. package/dist/esm/utils/token.js.map +1 -0
  173. package/dist/esm/utils/transactionUtils.d.ts +84 -0
  174. package/dist/esm/utils/transactionUtils.d.ts.map +1 -0
  175. package/dist/esm/utils/transactionUtils.js +138 -0
  176. package/dist/esm/utils/transactionUtils.js.map +1 -0
  177. package/dist/esm/utils/validateAndParsePublicKey.d.ts +15 -0
  178. package/dist/esm/utils/validateAndParsePublicKey.d.ts.map +1 -0
  179. package/dist/esm/utils/validateAndParsePublicKey.js +42 -0
  180. package/dist/esm/utils/validateAndParsePublicKey.js.map +1 -0
  181. package/package.json +66 -0
@@ -0,0 +1,34 @@
1
+ import { Decimal } from 'decimal.js';
2
+ import { SqrtPriceMath } from './sqrtPriceMath.js';
3
+ export class TickMath {
4
+ // Convert price to tick
5
+ static getTickWithPriceAndTickspacing(price, tickSpacing, mintDecimalsA, mintDecimalsB) {
6
+ const tick = SqrtPriceMath.getTickFromSqrtPriceX64(SqrtPriceMath.priceToSqrtPriceX64(price, mintDecimalsA, mintDecimalsB));
7
+ let result = tick / tickSpacing;
8
+ if (result < 0) {
9
+ result = Math.floor(result);
10
+ }
11
+ else {
12
+ result = Math.ceil(result);
13
+ }
14
+ return result * tickSpacing;
15
+ }
16
+ static getPriceFromTick(params) {
17
+ const { tick, decimalsA, decimalsB, baseIn = true } = params;
18
+ const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);
19
+ const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(tickSqrtPriceX64, decimalsA, decimalsB);
20
+ return baseIn ? tickPrice : new Decimal(1).div(tickPrice);
21
+ }
22
+ // Align price to the nearest valid tick and return related data
23
+ static getTickAlignedPriceDetails(price, tickSpacing, mintDecimalsA, mintDecimalsB) {
24
+ const tick = TickMath.getTickWithPriceAndTickspacing(price, tickSpacing, mintDecimalsA, mintDecimalsB);
25
+ const sqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);
26
+ const roundedPrice = SqrtPriceMath.sqrtPriceX64ToPrice(sqrtPriceX64, mintDecimalsA, mintDecimalsB);
27
+ return {
28
+ tick,
29
+ sqrtPriceX64,
30
+ price: roundedPrice,
31
+ };
32
+ }
33
+ }
34
+ //# sourceMappingURL=tickMath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickMath.js","sourceRoot":"","sources":["../../../../src/instructions/utils/tickMath.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,MAAM,OAAO,QAAQ;IACnB,wBAAwB;IACjB,MAAM,CAAC,8BAA8B,CAC1C,KAAc,EACd,WAAmB,EACnB,aAAqB,EACrB,aAAqB;QAErB,MAAM,IAAI,GAAG,aAAa,CAAC,uBAAuB,CAChD,aAAa,CAAC,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,aAAa,CAAC,CACvE,CAAC;QACF,IAAI,MAAM,GAAG,IAAI,GAAG,WAAW,CAAC;QAChC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,MAAM,GAAG,WAAW,CAAC;IAC9B,CAAC;IAEM,MAAM,CAAC,gBAAgB,CAAC,MAK9B;QACC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QAC7D,MAAM,gBAAgB,GAAG,aAAa,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,aAAa,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAE5F,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,gEAAgE;IACzD,MAAM,CAAC,0BAA0B,CACtC,KAAc,EACd,WAAmB,EACnB,aAAqB,EACrB,aAAqB;QAErB,MAAM,IAAI,GAAG,QAAQ,CAAC,8BAA8B,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QACvG,MAAM,YAAY,GAAG,aAAa,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,aAAa,CAAC,mBAAmB,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QACnG,OAAO;YACL,IAAI;YACJ,YAAY;YACZ,KAAK,EAAE,YAAY;SACpB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import BN from 'bn.js';
2
+ import { TickArrayBitmapExtensionType } from './models.js';
3
+ export declare class TickArrayBitmap {
4
+ static maxTickInTickarrayBitmap(tickSpacing: number): number;
5
+ static getBitmapTickBoundary(tickarrayStartIndex: number, tickSpacing: number): {
6
+ minValue: number;
7
+ maxValue: number;
8
+ };
9
+ static nextInitializedTickArrayStartIndex(bitMap: BN, lastTickArrayStartIndex: number, tickSpacing: number, zeroForOne: boolean): {
10
+ isInit: boolean;
11
+ tickIndex: number;
12
+ };
13
+ }
14
+ export declare class TickArrayBitmapExtensionUtils {
15
+ static getBitmapOffset(tickIndex: number, tickSpacing: number): number;
16
+ static getBitmap(tickIndex: number, tickSpacing: number, tickArrayBitmapExtension: TickArrayBitmapExtensionType): {
17
+ offset: number;
18
+ tickarrayBitmap: BN[];
19
+ };
20
+ static extensionTickBoundary(tickSpacing: number): {
21
+ positiveTickBoundary: number;
22
+ negativeTickBoundary: number;
23
+ };
24
+ static checkTickArrayIsInit(tickArrayStartIndex: number, tickSpacing: number, tickArrayBitmapExtension: TickArrayBitmapExtensionType): {
25
+ isInitialized: boolean;
26
+ startIndex: number;
27
+ };
28
+ static nextInitializedTickArrayFromOneBitmap(lastTickArrayStartIndex: number, tickSpacing: number, zeroForOne: boolean, tickArrayBitmapExtension: TickArrayBitmapExtensionType): {
29
+ isInit: boolean;
30
+ tickIndex: number;
31
+ };
32
+ static nextInitializedTickArrayInBitmap(tickarrayBitmap: BN[], nextTickArrayStartIndex: number, tickSpacing: number, zeroForOne: boolean): {
33
+ isInit: boolean;
34
+ tickIndex: number;
35
+ };
36
+ static tickArrayOffsetInBitmap(tickArrayStartIndex: number, tickSpacing: number): number;
37
+ }
38
+ //# sourceMappingURL=tickarrayBitmap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickarrayBitmap.d.ts","sourceRoot":"","sources":["../../../../src/instructions/utils/tickarrayBitmap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,OAAO,CAAC;AAMvB,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAG3D,qBAAa,eAAe;WAEZ,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;WAKrD,qBAAqB,CACjC,mBAAmB,EAAE,MAAM,EAC3B,WAAW,EAAE,MAAM,GAClB;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB;WAaa,kCAAkC,CAC9C,MAAM,EAAE,EAAE,EACV,uBAAuB,EAAE,MAAM,EAC/B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,OAAO,GAClB;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CA0C1C;AAED,qBAAa,6BAA6B;WAC1B,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;WAkB/D,SAAS,CACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,wBAAwB,EAAE,4BAA4B,GACrD;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,EAAE,EAAE,CAAA;KAAE;WAU9B,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG;QACxD,oBAAoB,EAAE,MAAM,CAAC;QAC7B,oBAAoB,EAAE,MAAM,CAAC;KAC9B;WAca,oBAAoB,CAChC,mBAAmB,EAAE,MAAM,EAC3B,WAAW,EAAE,MAAM,EACnB,wBAAwB,EAAE,4BAA4B,GACrD;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;WAYnC,qCAAqC,CACjD,uBAAuB,EAAE,MAAM,EAC/B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,OAAO,EACnB,wBAAwB,EAAE,4BAA4B,GACrD;QACD,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB;WAWa,gCAAgC,CAC5C,eAAe,EAAE,EAAE,EAAE,EACrB,uBAAuB,EAAE,MAAM,EAC/B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,OAAO,GAClB;QACD,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB;WAyCa,uBAAuB,CAAC,mBAAmB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAQhG"}
@@ -0,0 +1,157 @@
1
+ import { TICK_ARRAY_BITMAP_SIZE, TICK_ARRAY_SIZE } from '../../constants.js';
2
+ import { MAX_TICK, MIN_TICK } from '../constants.js';
3
+ import { isZero, leadingZeros, leastSignificantBit, mostSignificantBit, trailingZeros } from './binaryUtils.js';
4
+ import { TickUtils, TickQuery } from './tick.js';
5
+ export class TickArrayBitmap {
6
+ // Calculate the maximum tick range that a single bitmap can represent
7
+ static maxTickInTickarrayBitmap(tickSpacing) {
8
+ return tickSpacing * TICK_ARRAY_SIZE * TICK_ARRAY_BITMAP_SIZE;
9
+ }
10
+ // Calculate the bitmap boundaries corresponding to the given tick range
11
+ static getBitmapTickBoundary(tickarrayStartIndex, tickSpacing) {
12
+ const ticksInOneBitmap = this.maxTickInTickarrayBitmap(tickSpacing);
13
+ let m = Math.floor(Math.abs(tickarrayStartIndex) / ticksInOneBitmap);
14
+ if (tickarrayStartIndex < 0 && Math.abs(tickarrayStartIndex) % ticksInOneBitmap != 0)
15
+ m += 1;
16
+ const minValue = ticksInOneBitmap * m;
17
+ return tickarrayStartIndex < 0
18
+ ? { minValue: -minValue, maxValue: -minValue + ticksInOneBitmap }
19
+ : { minValue, maxValue: minValue + ticksInOneBitmap };
20
+ }
21
+ // Calculate the start index of the next initialized TickArray
22
+ static nextInitializedTickArrayStartIndex(bitMap, lastTickArrayStartIndex, tickSpacing, zeroForOne) {
23
+ if (!TickQuery.checkIsValidStartIndex(lastTickArrayStartIndex, tickSpacing))
24
+ throw Error('nextInitializedTickArrayStartIndex check error');
25
+ const tickBoundary = this.maxTickInTickarrayBitmap(tickSpacing);
26
+ const nextTickArrayStartIndex = zeroForOne
27
+ ? lastTickArrayStartIndex - TickQuery.tickCount(tickSpacing)
28
+ : lastTickArrayStartIndex + TickQuery.tickCount(tickSpacing);
29
+ if (nextTickArrayStartIndex < -tickBoundary || nextTickArrayStartIndex >= tickBoundary) {
30
+ return { isInit: false, tickIndex: lastTickArrayStartIndex };
31
+ }
32
+ const multiplier = tickSpacing * TICK_ARRAY_SIZE;
33
+ let compressed = nextTickArrayStartIndex / multiplier + 512;
34
+ if (nextTickArrayStartIndex < 0 && nextTickArrayStartIndex % multiplier != 0) {
35
+ compressed--;
36
+ }
37
+ const bitPos = Math.abs(compressed);
38
+ if (zeroForOne) {
39
+ const offsetBitMap = bitMap.shln(1024 - bitPos - 1);
40
+ const nextBit = mostSignificantBit(1024, offsetBitMap);
41
+ if (nextBit !== null) {
42
+ const nextArrayStartIndex = (bitPos - nextBit - 512) * multiplier;
43
+ return { isInit: true, tickIndex: nextArrayStartIndex };
44
+ }
45
+ else {
46
+ return { isInit: false, tickIndex: -tickBoundary };
47
+ }
48
+ }
49
+ else {
50
+ const offsetBitMap = bitMap.shrn(bitPos);
51
+ const nextBit = leastSignificantBit(1024, offsetBitMap);
52
+ if (nextBit !== null) {
53
+ const nextArrayStartIndex = (bitPos + nextBit - 512) * multiplier;
54
+ return { isInit: true, tickIndex: nextArrayStartIndex };
55
+ }
56
+ else {
57
+ return { isInit: false, tickIndex: tickBoundary - TickQuery.tickCount(tickSpacing) };
58
+ }
59
+ }
60
+ }
61
+ }
62
+ export class TickArrayBitmapExtensionUtils {
63
+ static getBitmapOffset(tickIndex, tickSpacing) {
64
+ if (!TickQuery.checkIsValidStartIndex(tickIndex, tickSpacing)) {
65
+ throw new Error('No enough initialized tickArray');
66
+ }
67
+ const { positiveTickBoundary, negativeTickBoundary } = this.extensionTickBoundary(tickSpacing);
68
+ if (tickIndex >= negativeTickBoundary && tickIndex < positiveTickBoundary) {
69
+ throw Error('checkExtensionBoundary -> InvalidTickArrayBoundary');
70
+ }
71
+ const ticksInOneBitmap = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);
72
+ let offset = Math.floor(Math.abs(tickIndex) / ticksInOneBitmap) - 1;
73
+ if (tickIndex < 0 && Math.abs(tickIndex) % ticksInOneBitmap === 0)
74
+ offset--;
75
+ return offset;
76
+ }
77
+ static getBitmap(tickIndex, tickSpacing, tickArrayBitmapExtension) {
78
+ const offset = this.getBitmapOffset(tickIndex, tickSpacing);
79
+ if (tickIndex < 0) {
80
+ return { offset, tickarrayBitmap: tickArrayBitmapExtension.negativeTickArrayBitmap[offset] };
81
+ }
82
+ else {
83
+ return { offset, tickarrayBitmap: tickArrayBitmapExtension.positiveTickArrayBitmap[offset] };
84
+ }
85
+ }
86
+ // Calculate the boundary values of the extended bitmap
87
+ static extensionTickBoundary(tickSpacing) {
88
+ const positiveTickBoundary = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);
89
+ const negativeTickBoundary = -positiveTickBoundary;
90
+ if (MAX_TICK <= positiveTickBoundary)
91
+ throw Error(`extensionTickBoundary check error: ${MAX_TICK}, ${positiveTickBoundary}`);
92
+ if (negativeTickBoundary <= MIN_TICK)
93
+ throw Error(`extensionTickBoundary check error: ${negativeTickBoundary}, ${MIN_TICK}`);
94
+ return { positiveTickBoundary, negativeTickBoundary };
95
+ }
96
+ // Check if a specific TickArray has been initialized
97
+ static checkTickArrayIsInit(tickArrayStartIndex, tickSpacing, tickArrayBitmapExtension) {
98
+ const { tickarrayBitmap } = this.getBitmap(tickArrayStartIndex, tickSpacing, tickArrayBitmapExtension);
99
+ const tickArrayOffsetInBitmap = this.tickArrayOffsetInBitmap(tickArrayStartIndex, tickSpacing);
100
+ return {
101
+ isInitialized: TickUtils.mergeTickArrayBitmap(tickarrayBitmap).testn(tickArrayOffsetInBitmap),
102
+ startIndex: tickArrayStartIndex,
103
+ };
104
+ }
105
+ // Find the start index of the next initialized TickArray from a single bitmap
106
+ static nextInitializedTickArrayFromOneBitmap(lastTickArrayStartIndex, tickSpacing, zeroForOne, tickArrayBitmapExtension) {
107
+ const multiplier = TickQuery.tickCount(tickSpacing);
108
+ const nextTickArrayStartIndex = zeroForOne
109
+ ? lastTickArrayStartIndex - multiplier
110
+ : lastTickArrayStartIndex + multiplier;
111
+ const { tickarrayBitmap } = this.getBitmap(nextTickArrayStartIndex, tickSpacing, tickArrayBitmapExtension);
112
+ return this.nextInitializedTickArrayInBitmap(tickarrayBitmap, nextTickArrayStartIndex, tickSpacing, zeroForOne);
113
+ }
114
+ // Find the start index of the next initialized TickArray in the bitmap
115
+ static nextInitializedTickArrayInBitmap(tickarrayBitmap, nextTickArrayStartIndex, tickSpacing, zeroForOne) {
116
+ const { minValue: bitmapMinTickBoundary, maxValue: bitmapMaxTickBoundary } = TickArrayBitmap.getBitmapTickBoundary(nextTickArrayStartIndex, tickSpacing);
117
+ const tickArrayOffsetInBitmap = this.tickArrayOffsetInBitmap(nextTickArrayStartIndex, tickSpacing);
118
+ if (zeroForOne) {
119
+ // tick from upper to lower
120
+ // find from highter bits to lower bits
121
+ const offsetBitMap = TickUtils.mergeTickArrayBitmap(tickarrayBitmap).shln(TICK_ARRAY_BITMAP_SIZE - 1 - tickArrayOffsetInBitmap);
122
+ const nextBit = isZero(512, offsetBitMap) ? null : leadingZeros(512, offsetBitMap);
123
+ if (nextBit !== null) {
124
+ const nextArrayStartIndex = nextTickArrayStartIndex - nextBit * TickQuery.tickCount(tickSpacing);
125
+ return { isInit: true, tickIndex: nextArrayStartIndex };
126
+ }
127
+ else {
128
+ // not found til to the end
129
+ return { isInit: false, tickIndex: bitmapMinTickBoundary };
130
+ }
131
+ }
132
+ else {
133
+ // tick from lower to upper
134
+ // find from lower bits to highter bits
135
+ const offsetBitMap = TickUtils.mergeTickArrayBitmap(tickarrayBitmap).shrn(tickArrayOffsetInBitmap);
136
+ const nextBit = isZero(512, offsetBitMap) ? null : trailingZeros(512, offsetBitMap);
137
+ if (nextBit !== null) {
138
+ const nextArrayStartIndex = nextTickArrayStartIndex + nextBit * TickQuery.tickCount(tickSpacing);
139
+ return { isInit: true, tickIndex: nextArrayStartIndex };
140
+ }
141
+ else {
142
+ // not found til to the end
143
+ return { isInit: false, tickIndex: bitmapMaxTickBoundary - TickQuery.tickCount(tickSpacing) };
144
+ }
145
+ }
146
+ }
147
+ // Calculate the offset position (index) of a TickArray within its belonging bitmap
148
+ static tickArrayOffsetInBitmap(tickArrayStartIndex, tickSpacing) {
149
+ const m = Math.abs(tickArrayStartIndex) % TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);
150
+ let tickArrayOffsetInBitmap = Math.floor(m / TickQuery.tickCount(tickSpacing));
151
+ if (tickArrayStartIndex < 0 && m != 0) {
152
+ tickArrayOffsetInBitmap = TICK_ARRAY_BITMAP_SIZE - tickArrayOffsetInBitmap;
153
+ }
154
+ return tickArrayOffsetInBitmap;
155
+ }
156
+ }
157
+ //# sourceMappingURL=tickarrayBitmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickarrayBitmap.js","sourceRoot":"","sources":["../../../../src/instructions/utils/tickarrayBitmap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,OAAO,eAAe;IAC1B,sEAAsE;IAC/D,MAAM,CAAC,wBAAwB,CAAC,WAAmB;QACxD,OAAO,WAAW,GAAG,eAAe,GAAG,sBAAsB,CAAC;IAChE,CAAC;IAED,wEAAwE;IACjE,MAAM,CAAC,qBAAqB,CACjC,mBAA2B,EAC3B,WAAmB;QAKnB,MAAM,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,gBAAgB,CAAC,CAAC;QACrE,IAAI,mBAAmB,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,gBAAgB,IAAI,CAAC;YAAE,CAAC,IAAI,CAAC,CAAC;QAE7F,MAAM,QAAQ,GAAG,gBAAgB,GAAG,CAAC,CAAC;QAEtC,OAAO,mBAAmB,GAAG,CAAC;YAC5B,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,GAAG,gBAAgB,EAAE;YACjE,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IAC1D,CAAC;IAED,8DAA8D;IACvD,MAAM,CAAC,kCAAkC,CAC9C,MAAU,EACV,uBAA+B,EAC/B,WAAmB,EACnB,UAAmB;QAEnB,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,uBAAuB,EAAE,WAAW,CAAC;YACzE,MAAM,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAEhE,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAChE,MAAM,uBAAuB,GAAG,UAAU;YACxC,CAAC,CAAC,uBAAuB,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC;YAC5D,CAAC,CAAC,uBAAuB,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAE/D,IAAI,uBAAuB,GAAG,CAAC,YAAY,IAAI,uBAAuB,IAAI,YAAY,EAAE,CAAC;YACvF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,uBAAuB,EAAE,CAAC;QAC/D,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,GAAG,eAAe,CAAC;QACjD,IAAI,UAAU,GAAG,uBAAuB,GAAG,UAAU,GAAG,GAAG,CAAC;QAE5D,IAAI,uBAAuB,GAAG,CAAC,IAAI,uBAAuB,GAAG,UAAU,IAAI,CAAC,EAAE,CAAC;YAC7E,UAAU,EAAE,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEpC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACvD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,MAAM,mBAAmB,GAAG,CAAC,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC;gBAClE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,YAAY,EAAE,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACxD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,MAAM,mBAAmB,GAAG,CAAC,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC;gBAClE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,6BAA6B;IACjC,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,WAAmB;QAClE,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAE/F,IAAI,SAAS,IAAI,oBAAoB,IAAI,SAAS,GAAG,oBAAoB,EAAE,CAAC;YAC1E,MAAM,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,gBAAgB,GAAG,eAAe,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAC/E,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEpE,IAAI,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,gBAAgB,KAAK,CAAC;YAAE,MAAM,EAAE,CAAC;QAC5E,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,SAAS,CACrB,SAAiB,EACjB,WAAmB,EACnB,wBAAsD;QAEtD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5D,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,wBAAwB,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/F,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,wBAAwB,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,uDAAuD;IAChD,MAAM,CAAC,qBAAqB,CAAC,WAAmB;QAIrD,MAAM,oBAAoB,GAAG,eAAe,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAEnF,MAAM,oBAAoB,GAAG,CAAC,oBAAoB,CAAC;QAEnD,IAAI,QAAQ,IAAI,oBAAoB;YAClC,MAAM,KAAK,CAAC,sCAAsC,QAAQ,KAAK,oBAAoB,EAAE,CAAC,CAAC;QACzF,IAAI,oBAAoB,IAAI,QAAQ;YAClC,MAAM,KAAK,CAAC,sCAAsC,oBAAoB,KAAK,QAAQ,EAAE,CAAC,CAAC;QAEzF,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;IACxD,CAAC;IAED,qDAAqD;IAC9C,MAAM,CAAC,oBAAoB,CAChC,mBAA2B,EAC3B,WAAmB,EACnB,wBAAsD;QAEtD,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAC;QAEvG,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;QAE/F,OAAO;YACL,aAAa,EAAE,SAAS,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;YAC7F,UAAU,EAAE,mBAAmB;SAChC,CAAC;IACJ,CAAC;IAED,8EAA8E;IACvE,MAAM,CAAC,qCAAqC,CACjD,uBAA+B,EAC/B,WAAmB,EACnB,UAAmB,EACnB,wBAAsD;QAKtD,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,uBAAuB,GAAG,UAAU;YACxC,CAAC,CAAC,uBAAuB,GAAG,UAAU;YACtC,CAAC,CAAC,uBAAuB,GAAG,UAAU,CAAC;QACzC,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAC;QAE3G,OAAO,IAAI,CAAC,gCAAgC,CAAC,eAAe,EAAE,uBAAuB,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAClH,CAAC;IAED,uEAAuE;IAChE,MAAM,CAAC,gCAAgC,CAC5C,eAAqB,EACrB,uBAA+B,EAC/B,WAAmB,EACnB,UAAmB;QAKnB,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,GAAG,eAAe,CAAC,qBAAqB,CAChH,uBAAuB,EACvB,WAAW,CACZ,CAAC;QAEF,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;QACnG,IAAI,UAAU,EAAE,CAAC;YACf,2BAA2B;YAC3B,uCAAuC;YACvC,MAAM,YAAY,GAAG,SAAS,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC,IAAI,CACvE,sBAAsB,GAAG,CAAC,GAAG,uBAAuB,CACrD,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAEnF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,MAAM,mBAAmB,GAAG,uBAAuB,GAAG,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBACjG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,2BAA2B;YAC3B,uCAAuC;YACvC,MAAM,YAAY,GAAG,SAAS,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAEnG,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAEpF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,MAAM,mBAAmB,GAAG,uBAAuB,GAAG,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBACjG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;YAChG,CAAC;QACH,CAAC;IACH,CAAC;IAED,mFAAmF;IAC5E,MAAM,CAAC,uBAAuB,CAAC,mBAA2B,EAAE,WAAmB;QACpF,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,eAAe,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAChG,IAAI,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/E,IAAI,mBAAmB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,uBAAuB,GAAG,sBAAsB,GAAG,uBAAuB,CAAC;QAC7E,CAAC;QACD,OAAO,uBAAuB,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { EpochInfo } from '@solana/web3.js';
2
+ import BN from 'bn.js';
3
+ import { TransferFeeDataBaseType, IGetTransferAmountFee } from '../models.js';
4
+ export declare function getTransferAmountFee(amount: BN, _feeConfig: TransferFeeDataBaseType | undefined, epochInfo: EpochInfo, addFee: boolean): IGetTransferAmountFee;
5
+ export declare function minExpirationTime(expirationTime1: number | undefined, expirationTime2: number | undefined): number | undefined;
6
+ export declare function BNDivCeil(bn1: BN, bn2: BN): BN;
7
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../../src/instructions/utils/transfer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvB,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAK9E,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,EAAE,EACV,UAAU,EAAE,uBAAuB,GAAG,SAAS,EAC/C,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,OAAO,GACd,qBAAqB,CA8DvB;AAED,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAQ9C"}
@@ -0,0 +1,78 @@
1
+ import BN from 'bn.js';
2
+ const POINT = 10_000;
3
+ // This function is a specialized utility function for calculating transfer fees and final amounts for Token-2022 token transfers. It handles the transfer fee feature introduced in the Solana Token-2022 program, calculating precise transfer amounts and fees based on the current epoch and fee configuration
4
+ export function getTransferAmountFee(amount, _feeConfig, epochInfo, addFee) {
5
+ if (_feeConfig === undefined) {
6
+ return {
7
+ amount,
8
+ fee: undefined,
9
+ expirationTime: undefined,
10
+ };
11
+ }
12
+ const feeConfig = {
13
+ ..._feeConfig,
14
+ olderTransferFee: {
15
+ epoch: BigInt(_feeConfig.olderTransferFee.epoch),
16
+ maximumFee: BigInt(_feeConfig.olderTransferFee.maximumFee),
17
+ transferFeeBasisPoints: _feeConfig.olderTransferFee.transferFeeBasisPoints,
18
+ },
19
+ newerTransferFee: {
20
+ epoch: BigInt(_feeConfig.newerTransferFee.epoch),
21
+ maximumFee: BigInt(_feeConfig.newerTransferFee.maximumFee),
22
+ transferFeeBasisPoints: _feeConfig.newerTransferFee.transferFeeBasisPoints,
23
+ },
24
+ };
25
+ const nowFeeConfig = epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;
26
+ const maxFee = new BN(nowFeeConfig.maximumFee.toString());
27
+ const expirationTime = epochInfo.epoch < feeConfig.newerTransferFee.epoch
28
+ ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000
29
+ : undefined;
30
+ if (addFee) {
31
+ if (nowFeeConfig.transferFeeBasisPoints === POINT) {
32
+ const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());
33
+ return {
34
+ amount: amount.add(nowMaxFee),
35
+ fee: nowMaxFee,
36
+ expirationTime,
37
+ };
38
+ }
39
+ else {
40
+ const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));
41
+ const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());
42
+ const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;
43
+ const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));
44
+ const fee = _fee.gt(maxFee) ? maxFee : _fee;
45
+ return {
46
+ amount: TAmount,
47
+ fee,
48
+ expirationTime,
49
+ };
50
+ }
51
+ }
52
+ else {
53
+ const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));
54
+ const fee = _fee.gt(maxFee) ? maxFee : _fee;
55
+ return {
56
+ amount,
57
+ fee,
58
+ expirationTime,
59
+ };
60
+ }
61
+ }
62
+ export function minExpirationTime(expirationTime1, expirationTime2) {
63
+ if (expirationTime1 === undefined)
64
+ return expirationTime2;
65
+ if (expirationTime2 === undefined)
66
+ return expirationTime1;
67
+ return Math.min(expirationTime1, expirationTime2);
68
+ }
69
+ export function BNDivCeil(bn1, bn2) {
70
+ const { div, mod } = bn1.divmod(bn2);
71
+ if (mod.gt(new BN(0))) {
72
+ return div.add(new BN(1));
73
+ }
74
+ else {
75
+ return div;
76
+ }
77
+ }
78
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../../src/instructions/utils/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Mint, getTransferFeeConfig } from '@solana/spl-token';
2
+ import { AccountInfo, Commitment, Connection, PublicKey } from '@solana/web3.js';
3
+ export interface ReturnTypeFetchMultipleMintInfos {
4
+ [mint: string]: Mint & {
5
+ feeConfig: ReturnType<typeof getTransferFeeConfig> | undefined;
6
+ programId: PublicKey;
7
+ };
8
+ }
9
+ export interface GetMultipleAccountsInfoConfig {
10
+ batchRequest?: boolean;
11
+ commitment?: Commitment;
12
+ chunkCount?: number;
13
+ }
14
+ export declare function getMultipleAccountsInfo(connection: Connection, publicKeys: PublicKey[], config?: GetMultipleAccountsInfoConfig): Promise<(AccountInfo<Buffer> | null)[]>;
15
+ export declare function getMultipleAccountsInfoWithCustomFlags<T extends {
16
+ pubkey: PublicKey;
17
+ }>(connection: Connection, publicKeysWithCustomFlag: T[], config?: GetMultipleAccountsInfoConfig): Promise<({
18
+ accountInfo: AccountInfo<Buffer> | null;
19
+ } & T)[]>;
20
+ export declare function fetchMultipleMintInfos({ connection, mints, config, }: {
21
+ connection: Connection;
22
+ mints: PublicKey[];
23
+ config?: {
24
+ batchRequest?: boolean;
25
+ };
26
+ }): Promise<ReturnTypeFetchMultipleMintInfos>;
27
+ //# sourceMappingURL=accountInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountInfo.d.ts","sourceRoot":"","sources":["../../../src/utils/accountInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,IAAI,EAAoB,oBAAoB,EAAc,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAOjF,MAAM,WAAW,gCAAgC;IAC/C,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG;QAAE,SAAS,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,GAAG,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,CAAA;KAAE,CAAC;CACjH;AAeD,MAAM,WAAW,6BAA6B;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,CAAC,EAAE,6BAA6B,GACrC,OAAO,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CA+DzC;AAED,wBAAsB,sCAAsC,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,EAC1F,UAAU,EAAE,UAAU,EACtB,wBAAwB,EAAE,CAAC,EAAE,EAC7B,MAAM,CAAC,EAAE,6BAA6B,GACrC,OAAO,CAAC,CAAC;IAAE,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;CAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAQ9D;AAED,wBAAsB,sBAAsB,CAAC,EAC3C,UAAU,EACV,KAAK,EACL,MAAM,GACP,EAAE;IACD,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACrC,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAwB5C"}
@@ -0,0 +1,80 @@
1
+ import { MINT_SIZE, TOKEN_PROGRAM_ID, getTransferFeeConfig, unpackMint } from '@solana/spl-token';
2
+ import { PublicKey } from '@solana/web3.js';
3
+ import { chunk } from 'lodash-es';
4
+ import { WSOLMint } from '../constants.js';
5
+ import { solToWSol } from './validateAndParsePublicKey.js';
6
+ export async function getMultipleAccountsInfo(connection, publicKeys, config) {
7
+ const { batchRequest, commitment = 'confirmed', chunkCount = 100, } = {
8
+ batchRequest: false,
9
+ ...config,
10
+ };
11
+ const chunkedKeys = chunk(publicKeys, chunkCount);
12
+ let results = new Array(chunkedKeys.length).fill([]);
13
+ if (batchRequest) {
14
+ const batch = chunkedKeys.map((keys) => {
15
+ const args = connection._buildArgs([keys.map((key) => key.toBase58())], commitment, 'base64');
16
+ return {
17
+ methodName: 'getMultipleAccounts',
18
+ args,
19
+ };
20
+ });
21
+ const _batch = chunk(batch, 10);
22
+ const unsafeResponse = await (await Promise.all(_batch.map(async (i) => await connection._rpcBatchRequest(i)))).flat();
23
+ results = unsafeResponse.map((unsafeRes) => {
24
+ if (unsafeRes.error)
25
+ console.error(`failed to get info for multiple accounts, RPC_ERROR, ${unsafeRes.error.message}`);
26
+ return unsafeRes.result.value.map((accountInfo) => {
27
+ if (accountInfo) {
28
+ const { data, executable, lamports, owner, rentEpoch } = accountInfo;
29
+ if (data.length !== 2 && data[1] !== 'base64') {
30
+ console.error(`info must be base64 encoded, RPC_ERROR`);
31
+ }
32
+ return {
33
+ data: Buffer.from(data[0], 'base64'),
34
+ executable,
35
+ lamports,
36
+ owner: new PublicKey(owner),
37
+ rentEpoch,
38
+ };
39
+ }
40
+ return null;
41
+ });
42
+ });
43
+ }
44
+ else {
45
+ try {
46
+ results = (await Promise.all(chunkedKeys.map((keys) => connection.getMultipleAccountsInfo(keys, commitment))));
47
+ }
48
+ catch (error) {
49
+ if (error instanceof Error) {
50
+ console.error(`failed to get info for multiple accounts, RPC_ERROR, ${error.message}`);
51
+ }
52
+ }
53
+ }
54
+ return results.flat();
55
+ }
56
+ export async function getMultipleAccountsInfoWithCustomFlags(connection, publicKeysWithCustomFlag, config) {
57
+ const multipleAccountsInfo = await getMultipleAccountsInfo(connection, publicKeysWithCustomFlag.map((o) => o.pubkey), config);
58
+ return publicKeysWithCustomFlag.map((o, idx) => ({ ...o, accountInfo: multipleAccountsInfo[idx] }));
59
+ }
60
+ export async function fetchMultipleMintInfos({ connection, mints, config, }) {
61
+ if (mints.length === 0)
62
+ return {};
63
+ const mintInfos = await getMultipleAccountsInfoWithCustomFlags(connection, mints.map((i) => ({ pubkey: solToWSol(i) })), config);
64
+ const mintK = {};
65
+ for (const i of mintInfos) {
66
+ if (!i.accountInfo || i.accountInfo.data.length < MINT_SIZE) {
67
+ console.log('invalid mint account', i.pubkey.toBase58());
68
+ continue;
69
+ }
70
+ const t = unpackMint(i.pubkey, i.accountInfo, i.accountInfo?.owner);
71
+ mintK[i.pubkey.toString()] = {
72
+ ...t,
73
+ programId: i.accountInfo?.owner || TOKEN_PROGRAM_ID,
74
+ feeConfig: getTransferFeeConfig(t) ?? undefined,
75
+ };
76
+ }
77
+ mintK[PublicKey.default.toBase58()] = mintK[WSOLMint.toBase58()];
78
+ return mintK;
79
+ }
80
+ //# sourceMappingURL=accountInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountInfo.js","sourceRoot":"","sources":["../../../src/utils/accountInfo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { PublicKey, TransactionInstruction } from '@solana/web3.js';
2
+ export declare const MAX_BASE64_SIZE = 1644;
3
+ export declare function checkV0TxSize({ instructions, payer, recentBlockhash, }: {
4
+ instructions: TransactionInstruction[];
5
+ payer: PublicKey;
6
+ recentBlockhash?: string;
7
+ }): boolean;
8
+ //# sourceMappingURL=checkV0TxSize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkV0TxSize.d.ts","sourceRoot":"","sources":["../../../src/utils/checkV0TxSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,SAAS,EAAE,sBAAsB,EAA4C,MAAM,iBAAiB,CAAC;AAEvH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,wBAAgB,aAAa,CAAC,EAC5B,YAAY,EACZ,KAAK,EACL,eAAyD,GAC1D,EAAE;IACD,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC,KAAK,EAAE,SAAS,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAcV"}
@@ -0,0 +1,18 @@
1
+ import { Keypair, TransactionMessage, VersionedTransaction } from '@solana/web3.js';
2
+ export const MAX_BASE64_SIZE = 1644;
3
+ export function checkV0TxSize({ instructions, payer, recentBlockhash = Keypair.generate().publicKey.toString(), }) {
4
+ const transactionMessage = new TransactionMessage({
5
+ payerKey: payer,
6
+ recentBlockhash,
7
+ instructions,
8
+ });
9
+ const messageV0 = transactionMessage.compileToV0Message();
10
+ try {
11
+ const buildLength = Buffer.from(new VersionedTransaction(messageV0).serialize()).toString('base64').length;
12
+ return buildLength < MAX_BASE64_SIZE;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ //# sourceMappingURL=checkV0TxSize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkV0TxSize.js","sourceRoot":"","sources":["../../../src/utils/checkV0TxSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAqC,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,MAAM,UAAU,aAAa,CAAC,EAC5B,YAAY,EACZ,KAAK,EACL,eAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,GAK1D;IACC,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC;QAChD,QAAQ,EAAE,KAAK;QACf,eAAe;QACf,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC3G,OAAO,WAAW,GAAG,eAAe,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Connection, PublicKey, TransactionInstruction } from '@solana/web3.js';
2
+ /**
3
+ * Estimate compute units required for a transaction
4
+ * @param connection - Solana connection instance
5
+ * @param instructions - Instructions to estimate
6
+ * @param payerPublicKey - Payer public key
7
+ * @param _blockhash - Optional blockhash
8
+ * @returns Estimated compute unit count
9
+ */
10
+ export declare function estimateComputeUnits(connection: Connection, instructions: TransactionInstruction[], payerPublicKey: PublicKey, _blockhash?: string): Promise<number>;
11
+ //# sourceMappingURL=estimateComputeUnits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimateComputeUnits.d.ts","sourceRoot":"","sources":["../../../src/utils/estimateComputeUnits.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,SAAS,EACT,sBAAsB,EAGvB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,sBAAsB,EAAE,EACtC,cAAc,EAAE,SAAS,EACzB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAiDjB"}
@@ -0,0 +1,48 @@
1
+ import { ComputeBudgetProgram, TransactionMessage, VersionedTransaction, } from '@solana/web3.js';
2
+ /**
3
+ * Estimate compute units required for a transaction
4
+ * @param connection - Solana connection instance
5
+ * @param instructions - Instructions to estimate
6
+ * @param payerPublicKey - Payer public key
7
+ * @param _blockhash - Optional blockhash
8
+ * @returns Estimated compute unit count
9
+ */
10
+ export async function estimateComputeUnits(connection, instructions, payerPublicKey, _blockhash) {
11
+ try {
12
+ const blockhash = _blockhash || (await connection.getLatestBlockhash()).blockhash;
13
+ const filteredInstructions = instructions.filter((ix) => {
14
+ if (!ix.programId.equals(ComputeBudgetProgram.programId)) {
15
+ return true;
16
+ }
17
+ const instructionType = ix.data[0];
18
+ return instructionType !== 2; // Keep if not setComputeUnitLimit
19
+ });
20
+ const simulationInstructions = [
21
+ ComputeBudgetProgram.setComputeUnitLimit({ units: 1_400_000 }), // Max CU limit
22
+ ...filteredInstructions,
23
+ ];
24
+ const messageV0 = new TransactionMessage({
25
+ payerKey: payerPublicKey,
26
+ recentBlockhash: blockhash,
27
+ instructions: simulationInstructions,
28
+ }).compileToV0Message();
29
+ const simulationTx = new VersionedTransaction(messageV0);
30
+ // Simulate transaction execution with max CU limit
31
+ const simulation = await connection.simulateTransaction(simulationTx);
32
+ if (simulation.value.logs && simulation.value.unitsConsumed) {
33
+ const consumedUnits = simulation.value.unitsConsumed;
34
+ // Calculate final CU limit with safety margin
35
+ const estimatedUnits = Math.min(Math.max(consumedUnits + 100_000, // 100k buffer for safety
36
+ Math.ceil(consumedUnits * 1.3) // 30% buffer
37
+ ), 1_400_000 // Solana transaction max CU limit
38
+ );
39
+ return Math.max(estimatedUnits, 100_000); // Ensure at least 100k CU
40
+ }
41
+ return 400_000;
42
+ }
43
+ catch (error) {
44
+ console.warn('Estimate compute units failed, using default value:', error);
45
+ return 400_000;
46
+ }
47
+ }
48
+ //# sourceMappingURL=estimateComputeUnits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimateComputeUnits.js","sourceRoot":"","sources":["../../../src/utils/estimateComputeUnits.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAIpB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAsB,EACtB,YAAsC,EACtC,cAAyB,EACzB,UAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,UAAU,IAAI,CAAC,MAAM,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC;QAElF,MAAM,oBAAoB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;YACtD,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,eAAe,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,OAAO,eAAe,KAAK,CAAC,CAAC,CAAC,kCAAkC;QAClE,CAAC,CAAC,CAAC;QAEH,MAAM,sBAAsB,GAAG;YAC7B,oBAAoB,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,eAAe;YAC/E,GAAG,oBAAoB;SACxB,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC;YACvC,QAAQ,EAAE,cAAc;YACxB,eAAe,EAAE,SAAS;YAC1B,YAAY,EAAE,sBAAsB;SACrC,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAExB,MAAM,YAAY,GAAG,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAEzD,mDAAmD;QACnD,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAEtE,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC5D,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC;YAErD,8CAA8C;YAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,IAAI,CAAC,GAAG,CACN,aAAa,GAAG,OAAO,EAAE,yBAAyB;YAClD,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,aAAa;aAC7C,EACD,SAAS,CAAC,kCAAkC;aAC7C,CAAC;YAEF,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B;QACtE,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,KAAK,CAAC,CAAC;QAC3E,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { PublicKey } from '@solana/web3.js';
2
+ export declare function generatePubKey({ fromPublicKey, programId, assignSeed, }: {
3
+ fromPublicKey: PublicKey;
4
+ programId: PublicKey;
5
+ assignSeed?: string;
6
+ }): {
7
+ publicKey: PublicKey;
8
+ seed: string;
9
+ };
10
+ //# sourceMappingURL=generatePubKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generatePubKey.d.ts","sourceRoot":"","sources":["../../../src/utils/generatePubKey.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAErD,wBAAgB,cAAc,CAAC,EAC7B,aAAa,EACb,SAA4B,EAC5B,UAAU,GACX,EAAE;IACD,aAAa,EAAE,SAAS,CAAC;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAIzC"}
@@ -0,0 +1,14 @@
1
+ import { sha256 } from '@noble/hashes/sha256';
2
+ import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
3
+ import { Keypair, PublicKey } from '@solana/web3.js';
4
+ export function generatePubKey({ fromPublicKey, programId = TOKEN_PROGRAM_ID, assignSeed, }) {
5
+ const seed = assignSeed ? btoa(assignSeed).slice(0, 32) : Keypair.generate().publicKey.toBase58().slice(0, 32);
6
+ const publicKey = createWithSeed(fromPublicKey, seed, programId);
7
+ return { publicKey, seed };
8
+ }
9
+ function createWithSeed(fromPublicKey, seed, programId) {
10
+ const buffer = Buffer.concat([fromPublicKey.toBuffer(), Buffer.from(seed), programId.toBuffer()]);
11
+ const publicKeyBytes = sha256(buffer);
12
+ return new PublicKey(publicKeyBytes);
13
+ }
14
+ //# sourceMappingURL=generatePubKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generatePubKey.js","sourceRoot":"","sources":["../../../src/utils/generatePubKey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,UAAU,cAAc,CAAC,EAC7B,aAAa,EACb,SAAS,GAAG,gBAAgB,EAC5B,UAAU,GAKX;IACC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/G,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACjE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,cAAc,CAAC,aAAwB,EAAE,IAAY,EAAE,SAAoB;IAClF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClG,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC;AACvC,CAAC"}