@haneullabs/haneulns 0.1.0 → 1.0.3

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 (222) hide show
  1. package/CHANGELOG.md +125 -53
  2. package/README.md +3 -3
  3. package/dist/constants.d.mts +15 -0
  4. package/dist/constants.d.mts.map +1 -0
  5. package/dist/constants.mjs +90 -0
  6. package/dist/constants.mjs.map +1 -0
  7. package/dist/contracts/haneulns/controller.mjs +62 -0
  8. package/dist/contracts/haneulns/controller.mjs.map +1 -0
  9. package/dist/contracts/haneulns/deps/haneul/balance.mjs +21 -0
  10. package/dist/contracts/haneulns/deps/haneul/balance.mjs.map +1 -0
  11. package/dist/contracts/haneulns/deps/haneul/vec_map.mjs +37 -0
  12. package/dist/contracts/haneulns/deps/haneul/vec_map.mjs.map +1 -0
  13. package/dist/contracts/haneulns/deps/std/type_name.mjs +17 -0
  14. package/dist/contracts/haneulns/deps/std/type_name.mjs.map +1 -0
  15. package/dist/contracts/haneulns/domain.mjs +23 -0
  16. package/dist/contracts/haneulns/domain.mjs.map +1 -0
  17. package/dist/contracts/haneulns/haneulns.mjs +68 -0
  18. package/dist/contracts/haneulns/haneulns.mjs.map +1 -0
  19. package/dist/contracts/haneulns/name_record.mjs +27 -0
  20. package/dist/contracts/haneulns/name_record.mjs.map +1 -0
  21. package/dist/contracts/haneulns/payment.mjs +162 -0
  22. package/dist/contracts/haneulns/payment.mjs.map +1 -0
  23. package/dist/contracts/haneulns/pricing_config.mjs +25 -0
  24. package/dist/contracts/haneulns/pricing_config.mjs.map +1 -0
  25. package/dist/contracts/haneulns_coupons/coupon_house.mjs +59 -0
  26. package/dist/contracts/haneulns_coupons/coupon_house.mjs.map +1 -0
  27. package/dist/contracts/haneulns_coupons/data.mjs +16 -0
  28. package/dist/contracts/haneulns_coupons/data.mjs.map +1 -0
  29. package/dist/contracts/haneulns_coupons/deps/haneul/bag.mjs +43 -0
  30. package/dist/contracts/haneulns_coupons/deps/haneul/bag.mjs.map +1 -0
  31. package/dist/contracts/haneulns_discounts/deps/haneul/linked_table.mjs +27 -0
  32. package/dist/contracts/haneulns_discounts/deps/haneul/linked_table.mjs.map +1 -0
  33. package/dist/contracts/haneulns_discounts/deps/haneulns/pricing_config.mjs +16 -0
  34. package/dist/contracts/haneulns_discounts/deps/haneulns/pricing_config.mjs.map +1 -0
  35. package/dist/contracts/haneulns_discounts/discounts.mjs +51 -0
  36. package/dist/contracts/haneulns_discounts/discounts.mjs.map +1 -0
  37. package/dist/contracts/haneulns_discounts/free_claims.mjs +60 -0
  38. package/dist/contracts/haneulns_discounts/free_claims.mjs.map +1 -0
  39. package/dist/contracts/haneulns_payments/deps/haneul/vec_map.mjs +37 -0
  40. package/dist/contracts/haneulns_payments/deps/haneul/vec_map.mjs.map +1 -0
  41. package/dist/contracts/haneulns_payments/deps/std/type_name.mjs +17 -0
  42. package/dist/contracts/haneulns_payments/deps/std/type_name.mjs.map +1 -0
  43. package/dist/contracts/haneulns_payments/payments.mjs +145 -0
  44. package/dist/contracts/haneulns_payments/payments.mjs.map +1 -0
  45. package/dist/contracts/pyth/data_source.mjs +20 -0
  46. package/dist/contracts/pyth/data_source.mjs.map +1 -0
  47. package/dist/contracts/pyth/deps/0x0000000000000000000000000000000000000000000000000000000000000002/package.mjs +21 -0
  48. package/dist/contracts/pyth/deps/0x0000000000000000000000000000000000000000000000000000000000000002/package.mjs.map +1 -0
  49. package/dist/contracts/pyth/deps/0x0000000000000000000000000000000000000000000000000000000000000002/table.mjs +19 -0
  50. package/dist/contracts/pyth/deps/0x0000000000000000000000000000000000000000000000000000000000000002/table.mjs.map +1 -0
  51. package/dist/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/bytes32.mjs +16 -0
  52. package/dist/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/bytes32.mjs.map +1 -0
  53. package/dist/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/consumed_vaas.mjs +16 -0
  54. package/dist/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/consumed_vaas.mjs.map +1 -0
  55. package/dist/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/external_address.mjs +16 -0
  56. package/dist/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/external_address.mjs.map +1 -0
  57. package/dist/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/set.mjs +16 -0
  58. package/dist/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/set.mjs.map +1 -0
  59. package/dist/contracts/pyth/state.mjs +28 -0
  60. package/dist/contracts/pyth/state.mjs.map +1 -0
  61. package/dist/contracts/utils/index.mjs +120 -0
  62. package/dist/contracts/utils/index.mjs.map +1 -0
  63. package/dist/contracts/wormhole/bytes32.mjs +16 -0
  64. package/dist/contracts/wormhole/bytes32.mjs.map +1 -0
  65. package/dist/contracts/wormhole/consumed_vaas.mjs +16 -0
  66. package/dist/contracts/wormhole/consumed_vaas.mjs.map +1 -0
  67. package/dist/contracts/wormhole/deps/0x0000000000000000000000000000000000000000000000000000000000000002/balance.mjs +16 -0
  68. package/dist/contracts/wormhole/deps/0x0000000000000000000000000000000000000000000000000000000000000002/balance.mjs.map +1 -0
  69. package/dist/contracts/wormhole/deps/0x0000000000000000000000000000000000000000000000000000000000000002/package.mjs +21 -0
  70. package/dist/contracts/wormhole/deps/0x0000000000000000000000000000000000000000000000000000000000000002/package.mjs.map +1 -0
  71. package/dist/contracts/wormhole/deps/0x0000000000000000000000000000000000000000000000000000000000000002/table.mjs +19 -0
  72. package/dist/contracts/wormhole/deps/0x0000000000000000000000000000000000000000000000000000000000000002/table.mjs.map +1 -0
  73. package/dist/contracts/wormhole/external_address.mjs +16 -0
  74. package/dist/contracts/wormhole/external_address.mjs.map +1 -0
  75. package/dist/contracts/wormhole/fee_collector.mjs +20 -0
  76. package/dist/contracts/wormhole/fee_collector.mjs.map +1 -0
  77. package/dist/contracts/wormhole/set.mjs +16 -0
  78. package/dist/contracts/wormhole/set.mjs.map +1 -0
  79. package/dist/contracts/wormhole/state.mjs +31 -0
  80. package/dist/contracts/wormhole/state.mjs.map +1 -0
  81. package/dist/haneulns-client.d.mts +76 -0
  82. package/dist/haneulns-client.d.mts.map +1 -0
  83. package/dist/haneulns-client.mjs +205 -0
  84. package/dist/haneulns-client.mjs.map +1 -0
  85. package/dist/haneulns-transaction.d.mts +144 -0
  86. package/dist/haneulns-transaction.d.mts.map +1 -0
  87. package/dist/haneulns-transaction.mjs +384 -0
  88. package/dist/haneulns-transaction.mjs.map +1 -0
  89. package/dist/helpers.d.mts +22 -0
  90. package/dist/helpers.d.mts.map +1 -0
  91. package/dist/helpers.mjs +45 -0
  92. package/dist/helpers.mjs.map +1 -0
  93. package/dist/index.d.mts +6 -0
  94. package/dist/index.mjs +6 -0
  95. package/dist/pyth/PriceServiceConnection.mjs +35 -0
  96. package/dist/pyth/PriceServiceConnection.mjs.map +1 -0
  97. package/dist/pyth/pyth-helpers.mjs +18 -0
  98. package/dist/pyth/pyth-helpers.mjs.map +1 -0
  99. package/dist/pyth/pyth.mjs +219 -0
  100. package/dist/pyth/pyth.mjs.map +1 -0
  101. package/dist/types.d.mts +88 -0
  102. package/dist/types.d.mts.map +1 -0
  103. package/package.json +24 -20
  104. package/src/contracts/haneulns/admin.ts +114 -0
  105. package/src/contracts/haneulns/auction.ts +341 -0
  106. package/src/contracts/haneulns/config.ts +225 -0
  107. package/src/contracts/haneulns/constants.ts +167 -0
  108. package/src/contracts/haneulns/controller.ts +269 -0
  109. package/src/contracts/haneulns/core_config.ts +208 -0
  110. package/src/contracts/haneulns/deps/haneul/balance.ts +19 -0
  111. package/src/contracts/haneulns/deps/haneul/coin.ts +20 -0
  112. package/src/contracts/haneulns/deps/haneul/linked_table.ts +27 -0
  113. package/src/contracts/haneulns/deps/haneul/table.ts +36 -0
  114. package/src/contracts/haneulns/deps/haneul/vec_map.ts +33 -0
  115. package/src/contracts/haneulns/deps/haneul/vec_set.ts +22 -0
  116. package/src/contracts/haneulns/deps/std/type_name.ts +24 -0
  117. package/src/contracts/haneulns/domain.ts +230 -0
  118. package/src/contracts/haneulns/haneulns.ts +456 -0
  119. package/src/contracts/haneulns/haneulns_registration.ts +200 -0
  120. package/src/contracts/haneulns/name_record.ts +315 -0
  121. package/src/contracts/haneulns/payment.ts +444 -0
  122. package/src/contracts/haneulns/pricing_config.ts +190 -0
  123. package/src/contracts/haneulns/registry.ts +514 -0
  124. package/src/contracts/haneulns/subdomain_registration.ts +63 -0
  125. package/src/contracts/haneulns/update_image.ts +15 -0
  126. package/src/contracts/haneulns_coupons/constants.ts +45 -0
  127. package/src/contracts/haneulns_coupons/coupon.ts +15 -0
  128. package/src/contracts/haneulns_coupons/coupon_house.ts +412 -0
  129. package/src/contracts/haneulns_coupons/data.ts +12 -0
  130. package/src/contracts/haneulns_coupons/deps/haneul/bag.ts +41 -0
  131. package/src/contracts/haneulns_coupons/range.ts +101 -0
  132. package/src/contracts/haneulns_coupons/rules.ts +342 -0
  133. package/src/contracts/haneulns_discounts/deps/haneul/linked_table.ts +27 -0
  134. package/src/contracts/haneulns_discounts/deps/haneulns/pricing_config.ts +10 -0
  135. package/src/contracts/haneulns_discounts/discounts.ts +156 -0
  136. package/src/contracts/haneulns_discounts/free_claims.ts +161 -0
  137. package/src/contracts/haneulns_discounts/house.ts +47 -0
  138. package/src/contracts/haneulns_payments/deps/haneul/vec_map.ts +33 -0
  139. package/src/contracts/haneulns_payments/deps/std/type_name.ts +24 -0
  140. package/src/contracts/haneulns_payments/payments.ts +257 -0
  141. package/src/contracts/haneulns_temp_subdomain_proxy/subdomain_proxy.ts +343 -0
  142. package/src/contracts/pyth/data_source.ts +15 -0
  143. package/src/contracts/pyth/deps/0x0000000000000000000000000000000000000000000000000000000000000002/package.ts +15 -0
  144. package/src/contracts/pyth/deps/0x0000000000000000000000000000000000000000000000000000000000000002/table.ts +13 -0
  145. package/src/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/bytes32.ts +12 -0
  146. package/src/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/consumed_vaas.ts +13 -0
  147. package/src/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/external_address.ts +13 -0
  148. package/src/contracts/pyth/deps/0xf47329f4344f3bf0f8e436e2f7b485466cff300f12a166563995d3888c296a94/set.ts +12 -0
  149. package/src/contracts/pyth/state.ts +22 -0
  150. package/src/contracts/utils/index.ts +234 -0
  151. package/src/contracts/wormhole/bytes32.ts +12 -0
  152. package/src/contracts/wormhole/consumed_vaas.ts +13 -0
  153. package/src/contracts/wormhole/deps/0x0000000000000000000000000000000000000000000000000000000000000002/balance.ts +12 -0
  154. package/src/contracts/wormhole/deps/0x0000000000000000000000000000000000000000000000000000000000000002/package.ts +15 -0
  155. package/src/contracts/wormhole/deps/0x0000000000000000000000000000000000000000000000000000000000000002/table.ts +13 -0
  156. package/src/contracts/wormhole/external_address.ts +13 -0
  157. package/src/contracts/wormhole/fee_collector.ts +15 -0
  158. package/src/contracts/wormhole/set.ts +12 -0
  159. package/src/contracts/wormhole/state.ts +25 -0
  160. package/src/haneulns-client.ts +120 -165
  161. package/src/haneulns-transaction.ts +137 -111
  162. package/src/index.ts +2 -2
  163. package/src/pyth/pyth.ts +55 -71
  164. package/src/types.ts +5 -7
  165. package/dist/cjs/constants.d.ts +0 -11
  166. package/dist/cjs/constants.js +0 -120
  167. package/dist/cjs/constants.js.map +0 -7
  168. package/dist/cjs/haneulns-client.d.ts +0 -40
  169. package/dist/cjs/haneulns-client.js +0 -261
  170. package/dist/cjs/haneulns-client.js.map +0 -7
  171. package/dist/cjs/haneulns-transaction.d.ts +0 -105
  172. package/dist/cjs/haneulns-transaction.js +0 -465
  173. package/dist/cjs/haneulns-transaction.js.map +0 -7
  174. package/dist/cjs/helpers.d.ts +0 -18
  175. package/dist/cjs/helpers.js +0 -63
  176. package/dist/cjs/helpers.js.map +0 -7
  177. package/dist/cjs/index.d.ts +0 -5
  178. package/dist/cjs/index.js +0 -39
  179. package/dist/cjs/index.js.map +0 -7
  180. package/dist/cjs/package.json +0 -5
  181. package/dist/cjs/pyth/PriceServiceConnection.d.ts +0 -26
  182. package/dist/cjs/pyth/PriceServiceConnection.js +0 -68
  183. package/dist/cjs/pyth/PriceServiceConnection.js.map +0 -7
  184. package/dist/cjs/pyth/pyth-helpers.d.ts +0 -7
  185. package/dist/cjs/pyth/pyth-helpers.js +0 -36
  186. package/dist/cjs/pyth/pyth-helpers.js.map +0 -7
  187. package/dist/cjs/pyth/pyth.d.ts +0 -66
  188. package/dist/cjs/pyth/pyth.js +0 -270
  189. package/dist/cjs/pyth/pyth.js.map +0 -7
  190. package/dist/cjs/types.d.ts +0 -89
  191. package/dist/cjs/types.js +0 -17
  192. package/dist/cjs/types.js.map +0 -7
  193. package/dist/esm/constants.d.ts +0 -11
  194. package/dist/esm/constants.js +0 -100
  195. package/dist/esm/constants.js.map +0 -7
  196. package/dist/esm/haneulns-client.d.ts +0 -40
  197. package/dist/esm/haneulns-client.js +0 -249
  198. package/dist/esm/haneulns-client.js.map +0 -7
  199. package/dist/esm/haneulns-transaction.d.ts +0 -105
  200. package/dist/esm/haneulns-transaction.js +0 -445
  201. package/dist/esm/haneulns-transaction.js.map +0 -7
  202. package/dist/esm/helpers.d.ts +0 -18
  203. package/dist/esm/helpers.js +0 -43
  204. package/dist/esm/helpers.js.map +0 -7
  205. package/dist/esm/index.d.ts +0 -5
  206. package/dist/esm/index.js +0 -28
  207. package/dist/esm/index.js.map +0 -7
  208. package/dist/esm/package.json +0 -5
  209. package/dist/esm/pyth/PriceServiceConnection.d.ts +0 -26
  210. package/dist/esm/pyth/PriceServiceConnection.js +0 -38
  211. package/dist/esm/pyth/PriceServiceConnection.js.map +0 -7
  212. package/dist/esm/pyth/pyth-helpers.d.ts +0 -7
  213. package/dist/esm/pyth/pyth-helpers.js +0 -16
  214. package/dist/esm/pyth/pyth-helpers.js.map +0 -7
  215. package/dist/esm/pyth/pyth.d.ts +0 -66
  216. package/dist/esm/pyth/pyth.js +0 -250
  217. package/dist/esm/pyth/pyth.js.map +0 -7
  218. package/dist/esm/types.d.ts +0 -89
  219. package/dist/esm/types.js +0 -1
  220. package/dist/esm/types.js.map +0 -7
  221. package/dist/tsconfig.esm.tsbuildinfo +0 -1
  222. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,219 @@
1
+ import { PriceServiceConnection } from "./PriceServiceConnection.mjs";
2
+ import { extractVaaBytesFromAccumulatorMessage } from "./pyth-helpers.mjs";
3
+ import { State } from "../contracts/pyth/state.mjs";
4
+ import { State as State$1 } from "../contracts/wormhole/state.mjs";
5
+ import { fromBase64, fromHex, parseStructTag } from "@haneullabs/haneul/utils";
6
+ import { bcs } from "@haneullabs/haneul/bcs";
7
+ import { coinWithBalance } from "@haneullabs/haneul/transactions";
8
+
9
+ //#region src/pyth/pyth.ts
10
+ const MAX_ARGUMENT_SIZE = 16 * 1024;
11
+ var HaneulPriceServiceConnection = class extends PriceServiceConnection {
12
+ /**
13
+ * Fetch price feed update data.
14
+ *
15
+ * @param priceIds Array of hex-encoded price IDs.
16
+ * @returns Array of buffers containing the price update data.
17
+ */
18
+ async getPriceFeedsUpdateData(priceIds) {
19
+ return (await this.getLatestVaas(priceIds)).map((vaa) => fromBase64(vaa));
20
+ }
21
+ };
22
+ var HaneulPythClient = class {
23
+ #pythState;
24
+ #wormholePackageId;
25
+ #priceFeedObjectIdCache = /* @__PURE__ */ new Map();
26
+ #priceTableInfo;
27
+ constructor(provider, pythStateId, wormholeStateId) {
28
+ this.provider = provider;
29
+ this.pythStateId = pythStateId;
30
+ this.wormholeStateId = wormholeStateId;
31
+ }
32
+ /**
33
+ * Verifies the VAAs using the Wormhole contract.
34
+ *
35
+ * @param vaas Array of VAA buffers to verify.
36
+ * @param tx Transaction block to add commands to.
37
+ * @returns Array of verified VAAs.
38
+ */
39
+ async verifyVaas(vaas, tx) {
40
+ const wormholePackageId = await this.getWormholePackageId();
41
+ const verifiedVaas = [];
42
+ for (const vaa of vaas) {
43
+ const [verifiedVaa] = tx.moveCall({
44
+ target: `${wormholePackageId}::vaa::parse_and_verify`,
45
+ arguments: [
46
+ tx.object(this.wormholeStateId),
47
+ tx.pure.vector("u8", vaa),
48
+ tx.object.clock()
49
+ ]
50
+ });
51
+ verifiedVaas.push(verifiedVaa);
52
+ }
53
+ return verifiedVaas;
54
+ }
55
+ /**
56
+ * Adds the necessary commands for updating the Pyth price feeds to the transaction block.
57
+ *
58
+ * @param tx Transaction block to add commands to.
59
+ * @param updates Array of price feed updates received from the price service.
60
+ * @param feedIds Array of feed IDs to update (in hex format).
61
+ * @param feeCoin Optional custom HANEUL coin to use for Pyth oracle fees. If not provided, uses gas coin.
62
+ */
63
+ async updatePriceFeeds(tx, updates, feedIds, feeCoin) {
64
+ const packageId = await this.getPythPackageId();
65
+ let priceUpdatesHotPotato;
66
+ if (updates.length > 1) throw new Error("SDK does not support sending multiple accumulator messages in a single transaction");
67
+ const vaa = extractVaaBytesFromAccumulatorMessage(updates[0]);
68
+ const verifiedVaas = await this.verifyVaas([vaa], tx);
69
+ [priceUpdatesHotPotato] = tx.moveCall({
70
+ target: `${packageId}::pyth::create_authenticated_price_infos_using_accumulator`,
71
+ arguments: [
72
+ tx.object(this.pythStateId),
73
+ tx.pure(bcs.vector(bcs.U8).serialize(Array.from(updates[0]), { maxSize: MAX_ARGUMENT_SIZE }).toBytes()),
74
+ verifiedVaas[0],
75
+ tx.object.clock()
76
+ ]
77
+ });
78
+ const priceInfoObjects = [];
79
+ const baseUpdateFee = await this.getBaseUpdateFee();
80
+ for (const feedId of feedIds) {
81
+ const priceInfoObjectId = await this.getPriceFeedObjectId(feedId);
82
+ if (!priceInfoObjectId) throw new Error(`Price feed ${feedId} not found, please create it first`);
83
+ priceInfoObjects.push(priceInfoObjectId);
84
+ const feePayment = feeCoin ? tx.splitCoins(feeCoin, [tx.pure.u64(baseUpdateFee)])[0] : coinWithBalance({ balance: baseUpdateFee });
85
+ [priceUpdatesHotPotato] = tx.moveCall({
86
+ target: `${packageId}::pyth::update_single_price_feed`,
87
+ arguments: [
88
+ tx.object(this.pythStateId),
89
+ priceUpdatesHotPotato,
90
+ tx.object(priceInfoObjectId),
91
+ feePayment,
92
+ tx.object.clock()
93
+ ]
94
+ });
95
+ }
96
+ tx.moveCall({
97
+ target: `${packageId}::hot_potato_vector::destroy`,
98
+ arguments: [priceUpdatesHotPotato],
99
+ typeArguments: [`${packageId}::price_info::PriceInfo`]
100
+ });
101
+ return priceInfoObjects;
102
+ }
103
+ /**
104
+ * Get the price feed object ID for a given feed ID, caching the promise.
105
+ * @param feedId
106
+ */
107
+ getPriceFeedObjectId(feedId) {
108
+ if (!this.#priceFeedObjectIdCache.has(feedId)) this.#priceFeedObjectIdCache.set(feedId, this.#fetchPriceFeedObjectId(feedId).catch((err) => {
109
+ this.#priceFeedObjectIdCache.delete(feedId);
110
+ throw err;
111
+ }));
112
+ return this.#priceFeedObjectIdCache.get(feedId);
113
+ }
114
+ /**
115
+ * Fetches the price feed object ID for a given feed ID (no caching).
116
+ * Throws an error if the object is not found.
117
+ */
118
+ async #fetchPriceFeedObjectId(feedId) {
119
+ const { id: tableId, fieldType } = await this.getPriceTableInfo();
120
+ const result = await this.provider.core.getDynamicField({
121
+ parentId: tableId,
122
+ name: {
123
+ type: `${fieldType}::price_identifier::PriceIdentifier`,
124
+ bcs: bcs.byteVector().serialize(fromHex(feedId)).toBytes()
125
+ }
126
+ });
127
+ if (!result.dynamicField) throw new Error(`Price feed object ID for feed ID ${feedId} not found.`);
128
+ return bcs.Address.parse(result.dynamicField.value.bcs);
129
+ }
130
+ /**
131
+ * Fetches the price table object ID for the current state ID, caching the promise.
132
+ * @returns Price table object ID and field type
133
+ */
134
+ getPriceTableInfo() {
135
+ if (!this.#priceTableInfo) this.#priceTableInfo = this.#fetchPriceTableInfo().catch((err) => {
136
+ this.#priceTableInfo = void 0;
137
+ throw err;
138
+ });
139
+ return this.#priceTableInfo;
140
+ }
141
+ /**
142
+ * Fetches the price table object ID and field type (no caching).
143
+ * @returns Price table object ID and field type
144
+ */
145
+ async #fetchPriceTableInfo() {
146
+ const result = await this.provider.core.getDynamicObjectField({
147
+ parentId: this.pythStateId,
148
+ name: {
149
+ type: "vector<u8>",
150
+ bcs: bcs.string().serialize("price_info").toBytes()
151
+ }
152
+ });
153
+ if (!result.object) throw new Error("Price Table not found, contract may not be initialized");
154
+ const priceIdentifier = parseStructTag(result.object.type).typeParams[0];
155
+ if (typeof priceIdentifier === "object" && priceIdentifier !== null && priceIdentifier.name === "PriceIdentifier" && "address" in priceIdentifier) return {
156
+ id: result.object.objectId,
157
+ fieldType: priceIdentifier.address
158
+ };
159
+ else throw new Error("fieldType not found");
160
+ }
161
+ /**
162
+ * Fetches the package ID for the Wormhole contract, with caching.
163
+ */
164
+ getWormholePackageId() {
165
+ if (!this.#wormholePackageId) this.#wormholePackageId = this.#fetchWormholePackageId();
166
+ return this.#wormholePackageId;
167
+ }
168
+ /**
169
+ * Fetches the package ID for the Wormhole contract (no caching).
170
+ */
171
+ async #fetchWormholePackageId() {
172
+ var _result$object;
173
+ const result = await this.provider.core.getObject({
174
+ objectId: this.wormholeStateId,
175
+ include: { content: true }
176
+ });
177
+ if (!((_result$object = result.object) === null || _result$object === void 0 ? void 0 : _result$object.content)) throw new Error("Unable to fetch Wormhole state object");
178
+ return State$1.parse(result.object.content).upgrade_cap.package;
179
+ }
180
+ /**
181
+ * Fetches and caches the parsed Pyth state object.
182
+ * This is shared between getPythPackageId and getBaseUpdateFee to avoid redundant fetches.
183
+ */
184
+ #getPythState() {
185
+ if (!this.#pythState) this.#pythState = this.#fetchPythState();
186
+ return this.#pythState;
187
+ }
188
+ /**
189
+ * Fetches the Pyth state object (no caching).
190
+ */
191
+ async #fetchPythState() {
192
+ var _result$object2;
193
+ const result = await this.provider.core.getObject({
194
+ objectId: this.pythStateId,
195
+ include: { content: true }
196
+ });
197
+ if (!((_result$object2 = result.object) === null || _result$object2 === void 0 ? void 0 : _result$object2.content)) throw new Error("Unable to fetch Pyth state object");
198
+ return State.parse(result.object.content);
199
+ }
200
+ /**
201
+ * Fetches the package ID for the Pyth contract, with caching.
202
+ * Uses the shared Pyth state cache.
203
+ */
204
+ async getPythPackageId() {
205
+ return (await this.#getPythState()).upgrade_cap.package;
206
+ }
207
+ /**
208
+ * Returns the cached base update fee, fetching it if necessary.
209
+ * Uses the shared Pyth state cache.
210
+ */
211
+ async getBaseUpdateFee() {
212
+ const state = await this.#getPythState();
213
+ return Number(state.base_update_fee);
214
+ }
215
+ };
216
+
217
+ //#endregion
218
+ export { HaneulPriceServiceConnection, HaneulPythClient };
219
+ //# sourceMappingURL=pyth.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyth.mjs","names":["#priceFeedObjectIdCache","#fetchPriceFeedObjectId","#priceTableInfo","#fetchPriceTableInfo","#wormholePackageId","#fetchWormholePackageId","WormholeState","#pythState","#fetchPythState","PythState","#getPythState"],"sources":["../../src/pyth/pyth.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@haneullabs/haneul/bcs';\nimport type { ClientWithCoreApi } from '@haneullabs/haneul/client';\nimport type { Transaction, TransactionObjectArgument } from '@haneullabs/haneul/transactions';\nimport { coinWithBalance } from '@haneullabs/haneul/transactions';\nimport { fromBase64, fromHex, parseStructTag } from '@haneullabs/haneul/utils';\n\nimport type { HexString } from './PriceServiceConnection.js';\nimport { PriceServiceConnection } from './PriceServiceConnection.js';\nimport { extractVaaBytesFromAccumulatorMessage } from './pyth-helpers.js';\nimport { State as PythState } from '../contracts/pyth/state.js';\nimport { State as WormholeState } from '../contracts/wormhole/state.js';\n\nconst MAX_ARGUMENT_SIZE = 16 * 1024;\nexport type ObjectId = string;\nexport class HaneulPriceServiceConnection extends PriceServiceConnection {\n\t/**\n\t * Fetch price feed update data.\n\t *\n\t * @param priceIds Array of hex-encoded price IDs.\n\t * @returns Array of buffers containing the price update data.\n\t */\n\tasync getPriceFeedsUpdateData(priceIds: HexString[]): Promise<Uint8Array[]> {\n\t\tconst latestVaas = await this.getLatestVaas(priceIds);\n\t\treturn latestVaas.map((vaa) => fromBase64(vaa));\n\t}\n}\n\ntype ParsedPythState = ReturnType<typeof PythState.parse>;\n\nexport class HaneulPythClient {\n\t#pythState?: Promise<ParsedPythState>;\n\t#wormholePackageId?: Promise<ObjectId>;\n\t#priceFeedObjectIdCache: Map<HexString, Promise<ObjectId>> = new Map();\n\t#priceTableInfo?: Promise<{ id: ObjectId; fieldType: ObjectId }>;\n\tprovider: ClientWithCoreApi;\n\tpythStateId: ObjectId;\n\twormholeStateId: ObjectId;\n\n\tconstructor(provider: ClientWithCoreApi, pythStateId: ObjectId, wormholeStateId: ObjectId) {\n\t\tthis.provider = provider;\n\t\tthis.pythStateId = pythStateId;\n\t\tthis.wormholeStateId = wormholeStateId;\n\t}\n\t/**\n\t * Verifies the VAAs using the Wormhole contract.\n\t *\n\t * @param vaas Array of VAA buffers to verify.\n\t * @param tx Transaction block to add commands to.\n\t * @returns Array of verified VAAs.\n\t */\n\tasync verifyVaas(vaas: Uint8Array[], tx: Transaction) {\n\t\tconst wormholePackageId = await this.getWormholePackageId();\n\t\tconst verifiedVaas = [];\n\t\tfor (const vaa of vaas) {\n\t\t\tconst [verifiedVaa] = tx.moveCall({\n\t\t\t\ttarget: `${wormholePackageId}::vaa::parse_and_verify`,\n\t\t\t\targuments: [tx.object(this.wormholeStateId), tx.pure.vector('u8', vaa), tx.object.clock()],\n\t\t\t});\n\t\t\tverifiedVaas.push(verifiedVaa);\n\t\t}\n\t\treturn verifiedVaas;\n\t}\n\t/**\n\t * Adds the necessary commands for updating the Pyth price feeds to the transaction block.\n\t *\n\t * @param tx Transaction block to add commands to.\n\t * @param updates Array of price feed updates received from the price service.\n\t * @param feedIds Array of feed IDs to update (in hex format).\n\t * @param feeCoin Optional custom HANEUL coin to use for Pyth oracle fees. If not provided, uses gas coin.\n\t */\n\tasync updatePriceFeeds(\n\t\ttx: Transaction,\n\t\tupdates: Uint8Array[],\n\t\tfeedIds: HexString[],\n\t\tfeeCoin?: TransactionObjectArgument,\n\t): Promise<ObjectId[]> {\n\t\tconst packageId = await this.getPythPackageId();\n\t\tlet priceUpdatesHotPotato;\n\t\tif (updates.length > 1) {\n\t\t\tthrow new Error(\n\t\t\t\t'SDK does not support sending multiple accumulator messages in a single transaction',\n\t\t\t);\n\t\t}\n\t\tconst vaa = extractVaaBytesFromAccumulatorMessage(updates[0]);\n\t\tconst verifiedVaas = await this.verifyVaas([vaa], tx);\n\t\t[priceUpdatesHotPotato] = tx.moveCall({\n\t\t\ttarget: `${packageId}::pyth::create_authenticated_price_infos_using_accumulator`,\n\t\t\targuments: [\n\t\t\t\ttx.object(this.pythStateId),\n\t\t\t\ttx.pure(\n\t\t\t\t\tbcs\n\t\t\t\t\t\t.vector(bcs.U8)\n\t\t\t\t\t\t.serialize(Array.from(updates[0]), {\n\t\t\t\t\t\t\tmaxSize: MAX_ARGUMENT_SIZE,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.toBytes(),\n\t\t\t\t),\n\t\t\t\tverifiedVaas[0],\n\t\t\t\ttx.object.clock(),\n\t\t\t],\n\t\t});\n\t\tconst priceInfoObjects: ObjectId[] = [];\n\t\tconst baseUpdateFee = await this.getBaseUpdateFee();\n\t\tfor (const feedId of feedIds) {\n\t\t\tconst priceInfoObjectId = await this.getPriceFeedObjectId(feedId);\n\t\t\tif (!priceInfoObjectId) {\n\t\t\t\tthrow new Error(`Price feed ${feedId} not found, please create it first`);\n\t\t\t}\n\t\t\tpriceInfoObjects.push(priceInfoObjectId);\n\n\t\t\tconst feePayment = feeCoin\n\t\t\t\t? tx.splitCoins(feeCoin, [tx.pure.u64(baseUpdateFee)])[0]\n\t\t\t\t: coinWithBalance({ balance: baseUpdateFee });\n\n\t\t\t[priceUpdatesHotPotato] = tx.moveCall({\n\t\t\t\ttarget: `${packageId}::pyth::update_single_price_feed`,\n\t\t\t\targuments: [\n\t\t\t\t\ttx.object(this.pythStateId),\n\t\t\t\t\tpriceUpdatesHotPotato,\n\t\t\t\t\ttx.object(priceInfoObjectId),\n\t\t\t\t\tfeePayment,\n\t\t\t\t\ttx.object.clock(),\n\t\t\t\t],\n\t\t\t});\n\t\t}\n\t\ttx.moveCall({\n\t\t\ttarget: `${packageId}::hot_potato_vector::destroy`,\n\t\t\targuments: [priceUpdatesHotPotato],\n\t\t\ttypeArguments: [`${packageId}::price_info::PriceInfo`],\n\t\t});\n\t\treturn priceInfoObjects;\n\t}\n\t/**\n\t * Get the price feed object ID for a given feed ID, caching the promise.\n\t * @param feedId\n\t */\n\tgetPriceFeedObjectId(feedId: HexString): Promise<ObjectId | undefined> {\n\t\tif (!this.#priceFeedObjectIdCache.has(feedId)) {\n\t\t\tthis.#priceFeedObjectIdCache.set(\n\t\t\t\tfeedId,\n\t\t\t\tthis.#fetchPriceFeedObjectId(feedId).catch((err) => {\n\t\t\t\t\t// Remove failed promises from the cache to allow retries\n\t\t\t\t\tthis.#priceFeedObjectIdCache.delete(feedId);\n\t\t\t\t\tthrow err;\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn this.#priceFeedObjectIdCache.get(feedId)!;\n\t}\n\n\t/**\n\t * Fetches the price feed object ID for a given feed ID (no caching).\n\t * Throws an error if the object is not found.\n\t */\n\tasync #fetchPriceFeedObjectId(feedId: HexString): Promise<ObjectId> {\n\t\tconst { id: tableId, fieldType } = await this.getPriceTableInfo();\n\n\t\tconst result = await this.provider.core.getDynamicField({\n\t\t\tparentId: tableId,\n\t\t\tname: {\n\t\t\t\ttype: `${fieldType}::price_identifier::PriceIdentifier`,\n\t\t\t\tbcs: bcs.byteVector().serialize(fromHex(feedId)).toBytes(),\n\t\t\t},\n\t\t});\n\n\t\tif (!result.dynamicField) {\n\t\t\tthrow new Error(`Price feed object ID for feed ID ${feedId} not found.`);\n\t\t}\n\n\t\treturn bcs.Address.parse(result.dynamicField.value.bcs);\n\t}\n\n\t/**\n\t * Fetches the price table object ID for the current state ID, caching the promise.\n\t * @returns Price table object ID and field type\n\t */\n\tgetPriceTableInfo(): Promise<{ id: ObjectId; fieldType: ObjectId }> {\n\t\tif (!this.#priceTableInfo) {\n\t\t\tconst promise = this.#fetchPriceTableInfo().catch((err) => {\n\t\t\t\t// Clear the cached promise on error\n\t\t\t\tthis.#priceTableInfo = undefined;\n\t\t\t\tthrow err;\n\t\t\t});\n\n\t\t\tthis.#priceTableInfo = promise;\n\t\t}\n\n\t\treturn this.#priceTableInfo;\n\t}\n\n\t/**\n\t * Fetches the price table object ID and field type (no caching).\n\t * @returns Price table object ID and field type\n\t */\n\tasync #fetchPriceTableInfo(): Promise<{ id: ObjectId; fieldType: ObjectId }> {\n\t\tconst result = await this.provider.core.getDynamicObjectField({\n\t\t\tparentId: this.pythStateId,\n\t\t\tname: {\n\t\t\t\ttype: 'vector<u8>',\n\t\t\t\tbcs: bcs.string().serialize('price_info').toBytes(),\n\t\t\t},\n\t\t});\n\n\t\tif (!result.object) {\n\t\t\tthrow new Error('Price Table not found, contract may not be initialized');\n\t\t}\n\n\t\tconst tableType = parseStructTag(result.object.type);\n\t\tconst priceIdentifier = tableType.typeParams[0];\n\t\tif (\n\t\t\ttypeof priceIdentifier === 'object' &&\n\t\t\tpriceIdentifier !== null &&\n\t\t\tpriceIdentifier.name === 'PriceIdentifier' &&\n\t\t\t'address' in priceIdentifier\n\t\t) {\n\t\t\treturn { id: result.object.objectId, fieldType: priceIdentifier.address };\n\t\t} else {\n\t\t\tthrow new Error('fieldType not found');\n\t\t}\n\t}\n\t/**\n\t * Fetches the package ID for the Wormhole contract, with caching.\n\t */\n\tgetWormholePackageId(): Promise<ObjectId> {\n\t\tif (!this.#wormholePackageId) {\n\t\t\tthis.#wormholePackageId = this.#fetchWormholePackageId();\n\t\t}\n\t\treturn this.#wormholePackageId;\n\t}\n\n\t/**\n\t * Fetches the package ID for the Wormhole contract (no caching).\n\t */\n\tasync #fetchWormholePackageId(): Promise<ObjectId> {\n\t\tconst result = await this.provider.core.getObject({\n\t\t\tobjectId: this.wormholeStateId,\n\t\t\tinclude: { content: true },\n\t\t});\n\n\t\tif (!result.object?.content) {\n\t\t\tthrow new Error('Unable to fetch Wormhole state object');\n\t\t}\n\n\t\tconst state = WormholeState.parse(result.object.content);\n\t\treturn state.upgrade_cap.package;\n\t}\n\n\t/**\n\t * Fetches and caches the parsed Pyth state object.\n\t * This is shared between getPythPackageId and getBaseUpdateFee to avoid redundant fetches.\n\t */\n\t#getPythState(): Promise<ParsedPythState> {\n\t\tif (!this.#pythState) {\n\t\t\tthis.#pythState = this.#fetchPythState();\n\t\t}\n\t\treturn this.#pythState;\n\t}\n\n\t/**\n\t * Fetches the Pyth state object (no caching).\n\t */\n\tasync #fetchPythState(): Promise<ParsedPythState> {\n\t\tconst result = await this.provider.core.getObject({\n\t\t\tobjectId: this.pythStateId,\n\t\t\tinclude: { content: true },\n\t\t});\n\n\t\tif (!result.object?.content) {\n\t\t\tthrow new Error('Unable to fetch Pyth state object');\n\t\t}\n\n\t\treturn PythState.parse(result.object.content);\n\t}\n\n\t/**\n\t * Fetches the package ID for the Pyth contract, with caching.\n\t * Uses the shared Pyth state cache.\n\t */\n\tasync getPythPackageId(): Promise<ObjectId> {\n\t\tconst state = await this.#getPythState();\n\t\treturn state.upgrade_cap.package;\n\t}\n\n\t/**\n\t * Returns the cached base update fee, fetching it if necessary.\n\t * Uses the shared Pyth state cache.\n\t */\n\tasync getBaseUpdateFee(): Promise<number> {\n\t\tconst state = await this.#getPythState();\n\t\treturn Number(state.base_update_fee);\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { TransactionObjectArgument, TransactionObjectInput } from "@haneullabs/haneul/transactions";
2
+ import { ClientWithCoreApi, HaneulClientTypes } from "@haneullabs/haneul/client";
3
+
4
+ //#region src/types.d.ts
5
+ interface CoinConfig {
6
+ type: string;
7
+ feed: string;
8
+ }
9
+ interface DiscountInfo {
10
+ discountNft: TransactionObjectInput;
11
+ type: string;
12
+ isFreeClaim?: boolean;
13
+ }
14
+ interface PackageInfo {
15
+ packageId: string;
16
+ packageIdV1: string;
17
+ packageIdPricing: string;
18
+ haneulns: string;
19
+ discountsPackage: {
20
+ packageId: string;
21
+ discountHouseId: string;
22
+ };
23
+ subNamesPackageId: string;
24
+ tempSubdomainsProxyPackageId: string;
25
+ coupons: {
26
+ packageId: string;
27
+ };
28
+ payments: {
29
+ packageId: string;
30
+ };
31
+ bbb: {
32
+ packageId: string;
33
+ vault: string;
34
+ };
35
+ registryTableId?: string;
36
+ pyth: {
37
+ pythStateId: string;
38
+ wormholeStateId: string;
39
+ };
40
+ utils?: {
41
+ packageId: string;
42
+ };
43
+ coins: Record<string, CoinConfig>;
44
+ }
45
+ interface NameRecord {
46
+ name: string;
47
+ nftId: string;
48
+ targetAddress: string;
49
+ expirationTimestampMs: number;
50
+ data: Record<string, string>;
51
+ avatar?: string;
52
+ contentHash?: string;
53
+ walrusSiteId?: string;
54
+ }
55
+ type Config = Record<'mainnet' | 'testnet', PackageInfo>;
56
+ type BaseParams = {
57
+ years: number;
58
+ coinConfig: CoinConfig;
59
+ coin?: TransactionObjectInput;
60
+ couponCode?: string;
61
+ discountInfo?: DiscountInfo;
62
+ maxAmount?: bigint;
63
+ priceInfoObjectId?: string | null;
64
+ };
65
+ type RegistrationParams = BaseParams & {
66
+ domain: string;
67
+ };
68
+ type RenewalParams = BaseParams & {
69
+ nft: TransactionObjectInput;
70
+ };
71
+ type ReceiptParams = {
72
+ paymentIntent: TransactionObjectArgument;
73
+ priceAfterDiscount: TransactionObjectArgument;
74
+ coinConfig: CoinConfig;
75
+ coin?: TransactionObjectInput;
76
+ maxAmount?: bigint;
77
+ priceInfoObjectId?: string | null;
78
+ };
79
+ type HaneulnsClientConfig = {
80
+ client: ClientWithCoreApi;
81
+ network?: HaneulClientTypes.Network;
82
+ packageInfo?: PackageInfo;
83
+ };
84
+ type HaneulnsPriceList = Map<[number, number], number>;
85
+ type CoinTypeDiscount = Map<string, number>;
86
+ //#endregion
87
+ export { CoinTypeDiscount, Config, DiscountInfo, HaneulnsClientConfig, HaneulnsPriceList, NameRecord, PackageInfo, ReceiptParams, RegistrationParams, RenewalParams };
88
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;;UAQiB,UAAA;EAChB,IAAA;EACA,IAAA;AAAA;AAAA,UAGgB,YAAA;EAChB,WAAA,EAAa,sBAAA;EACb,IAAA;EACA,WAAA;AAAA;AAAA,UAGgB,WAAA;EAChB,SAAA;EACA,WAAA;EACA,gBAAA;EACA,QAAA;EACA,gBAAA;IACC,SAAA;IACA,eAAA;EAAA;EAED,iBAAA;EACA,4BAAA;EACA,OAAA;IACC,SAAA;EAAA;EAED,QAAA;IACC,SAAA;EAAA;EAED,GAAA;IACC,SAAA;IACA,KAAA;EAAA;EAED,eAAA;EACA,IAAA;IACC,WAAA;IACA,eAAA;EAAA;EAED,KAAA;IACC,SAAA;EAAA;EAED,KAAA,EAAO,MAAA,SAAe,UAAA;AAAA;AAAA,UAGN,UAAA;EAChB,IAAA;EACA,KAAA;EACA,aAAA;EACA,qBAAA;EACA,IAAA,EAAM,MAAA;EACN,MAAA;EACA,WAAA;EACA,YAAA;AAAA;AAAA,KAYW,MAAA,GAAS,MAAA,wBAA8B,WAAA;AAAA,KAEvC,UAAA;EACX,KAAA;EACA,UAAA,EAAY,UAAA;EACZ,IAAA,GAAO,sBAAA;EACP,UAAA;EACA,YAAA,GAAe,YAAA;EACf,SAAA;EACA,iBAAA;AAAA;AAAA,KAGW,kBAAA,GAAqB,UAAA;EAChC,MAAA;AAAA;AAAA,KAGW,aAAA,GAAgB,UAAA;EAC3B,GAAA,EAAK,sBAAA;AAAA;AAAA,KAGM,aAAA;EACX,aAAA,EAAe,yBAAA;EACf,kBAAA,EAAoB,yBAAA;EACpB,UAAA,EAAY,UAAA;EACZ,IAAA,GAAO,sBAAA;EACP,SAAA;EACA,iBAAA;AAAA;AAAA,KAGW,oBAAA;EACX,MAAA,EAAQ,iBAAA;EACR,OAAA,GAAU,iBAAA,CAAkB,OAAA;EAC5B,WAAA,GAAc,WAAA;AAAA;AAAA,KAGH,iBAAA,GAAoB,GAAA;AAAA,KAEpB,gBAAA,GAAmB,GAAA"}
package/package.json CHANGED
@@ -1,14 +1,13 @@
1
1
  {
2
2
  "name": "@haneullabs/haneulns",
3
- "author": "Haneul Labs <build@haneullabs.com>",
3
+ "author": "Haneul Labs <build@haneul-labs.com>",
4
4
  "description": "HaneulNS SDK",
5
- "version": "0.1.0",
5
+ "version": "1.0.3",
6
6
  "license": "Apache-2.0",
7
7
  "private": false,
8
- "type": "commonjs",
9
- "main": "./dist/cjs/index.js",
10
- "module": "./dist/esm/index.js",
11
- "types": "./dist/cjs/index.d.ts",
8
+ "type": "module",
9
+ "main": "./dist/index.mjs",
10
+ "types": "./dist/index.d.mts",
12
11
  "keywords": [
13
12
  "Haneul",
14
13
  "haneulns",
@@ -16,8 +15,9 @@
16
15
  ],
17
16
  "exports": {
18
17
  ".": {
19
- "import": "./dist/esm/index.js",
20
- "require": "./dist/cjs/index.js"
18
+ "types": "./dist/index.d.mts",
19
+ "import": "./dist/index.mjs",
20
+ "default": "./dist/index.mjs"
21
21
  }
22
22
  },
23
23
  "sideEffects": false,
@@ -30,34 +30,38 @@
30
30
  "node": ">=16"
31
31
  },
32
32
  "dependencies": {
33
- "axios": "^1.13.2",
34
- "axios-retry": "^4.5.0",
35
- "@haneullabs/haneul": "0.1.0"
33
+ "axios": "^1.13.5",
34
+ "axios-retry": "^4.5.0"
36
35
  },
37
36
  "devDependencies": {
38
37
  "@types/tmp": "^0.2.6",
39
38
  "ts-retry-promise": "^0.8.1",
40
39
  "typescript": "^5.9.3",
41
- "vite": "^7.2.6",
42
- "vitest": "^4.0.15",
43
- "@haneullabs/build-scripts": "0.1.0"
40
+ "vite": "^7.3.1",
41
+ "vitest": "^4.0.17",
42
+ "@haneullabs/codegen": "^0.8.3",
43
+ "@haneullabs/haneul": "^2.13.0"
44
+ },
45
+ "peerDependencies": {
46
+ "@haneullabs/haneul": "^2.13.0"
44
47
  },
45
48
  "repository": {
46
49
  "type": "git",
47
- "url": "git+https://github.com/GeunhwaJeong/haneul-ts-sdks.git"
50
+ "url": "git+https://github.com/GeunhwaJeong/ts-sdks.git"
48
51
  },
49
52
  "bugs": {
50
53
  "url": "https://github.com/GeunhwaJeong/haneulns-contracts/issues"
51
54
  },
52
55
  "scripts": {
56
+ "codegen": "haneul-ts-codegen generate && pnpm lint:fix",
53
57
  "clean": "rm -rf tsconfig.tsbuildinfo ./dist",
54
- "build": "build-package",
58
+ "build": "rm -rf dist && tsc --noEmit && tsdown",
55
59
  "prettier:check": "prettier -c --ignore-unknown .",
56
60
  "prettier:fix": "prettier -w --ignore-unknown .",
57
- "eslint:check": "eslint --max-warnings=0 .",
58
- "eslint:fix": "pnpm run eslint:check --fix",
59
- "lint": "pnpm run eslint:check && pnpm run prettier:check",
60
- "lint:fix": "pnpm run eslint:fix && pnpm run prettier:fix",
61
+ "oxlint:check": "oxlint .",
62
+ "oxlint:fix": "oxlint --fix",
63
+ "lint": "pnpm run oxlint:check && pnpm run prettier:check",
64
+ "lint:fix": "pnpm run oxlint:fix && pnpm run prettier:fix",
61
65
  "test:e2e": "vitest run"
62
66
  }
63
67
  }
@@ -0,0 +1,114 @@
1
+ /**************************************************************
2
+ * THIS FILE IS GENERATED AND SHOULD NOT BE MANUALLY MODIFIED *
3
+ **************************************************************/
4
+
5
+ /**
6
+ * Admin features of the HaneulNS application. Meant to be called directly by the
7
+ * haneulns admin.
8
+ */
9
+
10
+ import { MoveStruct, normalizeMoveArguments, type RawTransactionArgument } from '../utils/index.js';
11
+ import { bcs } from '@haneullabs/haneul/bcs';
12
+ import { type Transaction } from '@haneullabs/haneul/transactions';
13
+ const $moduleName = '@haneulns/core::admin';
14
+ export const Admin = new MoveStruct({
15
+ name: `${$moduleName}::Admin`,
16
+ fields: {
17
+ dummy_field: bcs.bool(),
18
+ },
19
+ });
20
+ export interface AuthorizeArguments {
21
+ cap: RawTransactionArgument<string>;
22
+ haneulns: RawTransactionArgument<string>;
23
+ }
24
+ export interface AuthorizeOptions {
25
+ package?: string;
26
+ arguments:
27
+ | AuthorizeArguments
28
+ | [cap: RawTransactionArgument<string>, haneulns: RawTransactionArgument<string>];
29
+ }
30
+ /**
31
+ * Authorize the admin application in the HaneulNS to get access to protected
32
+ * functions. Must be called in order to use the rest of the functions.
33
+ */
34
+ export function authorize(options: AuthorizeOptions) {
35
+ const packageAddress = options.package ?? '@haneulns/core';
36
+ const argumentsTypes = [null, null] satisfies (string | null)[];
37
+ const parameterNames = ['cap', 'haneulns'];
38
+ return (tx: Transaction) =>
39
+ tx.moveCall({
40
+ package: packageAddress,
41
+ module: 'admin',
42
+ function: 'authorize',
43
+ arguments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),
44
+ });
45
+ }
46
+ export interface ReserveDomainArguments {
47
+ _: RawTransactionArgument<string>;
48
+ haneulns: RawTransactionArgument<string>;
49
+ domainName: RawTransactionArgument<string>;
50
+ noYears: RawTransactionArgument<number>;
51
+ }
52
+ export interface ReserveDomainOptions {
53
+ package?: string;
54
+ arguments:
55
+ | ReserveDomainArguments
56
+ | [
57
+ _: RawTransactionArgument<string>,
58
+ haneulns: RawTransactionArgument<string>,
59
+ domainName: RawTransactionArgument<string>,
60
+ noYears: RawTransactionArgument<number>,
61
+ ];
62
+ }
63
+ /** Reserve a `domain` in the `HaneulNS`. */
64
+ export function reserveDomain(options: ReserveDomainOptions) {
65
+ const packageAddress = options.package ?? '@haneulns/core';
66
+ const argumentsTypes = [null, null, '0x1::string::String', 'u8', '0x2::clock::Clock'] satisfies (
67
+ | string
68
+ | null
69
+ )[];
70
+ const parameterNames = ['_', 'haneulns', 'domainName', 'noYears'];
71
+ return (tx: Transaction) =>
72
+ tx.moveCall({
73
+ package: packageAddress,
74
+ module: 'admin',
75
+ function: 'reserve_domain',
76
+ arguments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),
77
+ });
78
+ }
79
+ export interface ReserveDomainsArguments {
80
+ _: RawTransactionArgument<string>;
81
+ haneulns: RawTransactionArgument<string>;
82
+ domains: RawTransactionArgument<string[]>;
83
+ noYears: RawTransactionArgument<number>;
84
+ }
85
+ export interface ReserveDomainsOptions {
86
+ package?: string;
87
+ arguments:
88
+ | ReserveDomainsArguments
89
+ | [
90
+ _: RawTransactionArgument<string>,
91
+ haneulns: RawTransactionArgument<string>,
92
+ domains: RawTransactionArgument<string[]>,
93
+ noYears: RawTransactionArgument<number>,
94
+ ];
95
+ }
96
+ /** Reserve a list of domains. */
97
+ export function reserveDomains(options: ReserveDomainsOptions) {
98
+ const packageAddress = options.package ?? '@haneulns/core';
99
+ const argumentsTypes = [
100
+ null,
101
+ null,
102
+ 'vector<0x1::string::String>',
103
+ 'u8',
104
+ '0x2::clock::Clock',
105
+ ] satisfies (string | null)[];
106
+ const parameterNames = ['_', 'haneulns', 'domains', 'noYears'];
107
+ return (tx: Transaction) =>
108
+ tx.moveCall({
109
+ package: packageAddress,
110
+ module: 'admin',
111
+ function: 'reserve_domains',
112
+ arguments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),
113
+ });
114
+ }