@haneullabs/haneulns 0.1.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 (70) hide show
  1. package/CHANGELOG.md +505 -0
  2. package/README.md +9 -0
  3. package/dist/cjs/constants.d.ts +11 -0
  4. package/dist/cjs/constants.js +120 -0
  5. package/dist/cjs/constants.js.map +7 -0
  6. package/dist/cjs/haneulns-client.d.ts +40 -0
  7. package/dist/cjs/haneulns-client.js +261 -0
  8. package/dist/cjs/haneulns-client.js.map +7 -0
  9. package/dist/cjs/haneulns-transaction.d.ts +105 -0
  10. package/dist/cjs/haneulns-transaction.js +465 -0
  11. package/dist/cjs/haneulns-transaction.js.map +7 -0
  12. package/dist/cjs/helpers.d.ts +18 -0
  13. package/dist/cjs/helpers.js +63 -0
  14. package/dist/cjs/helpers.js.map +7 -0
  15. package/dist/cjs/index.d.ts +5 -0
  16. package/dist/cjs/index.js +39 -0
  17. package/dist/cjs/index.js.map +7 -0
  18. package/dist/cjs/package.json +5 -0
  19. package/dist/cjs/pyth/PriceServiceConnection.d.ts +26 -0
  20. package/dist/cjs/pyth/PriceServiceConnection.js +68 -0
  21. package/dist/cjs/pyth/PriceServiceConnection.js.map +7 -0
  22. package/dist/cjs/pyth/pyth-helpers.d.ts +7 -0
  23. package/dist/cjs/pyth/pyth-helpers.js +36 -0
  24. package/dist/cjs/pyth/pyth-helpers.js.map +7 -0
  25. package/dist/cjs/pyth/pyth.d.ts +66 -0
  26. package/dist/cjs/pyth/pyth.js +270 -0
  27. package/dist/cjs/pyth/pyth.js.map +7 -0
  28. package/dist/cjs/types.d.ts +89 -0
  29. package/dist/cjs/types.js +17 -0
  30. package/dist/cjs/types.js.map +7 -0
  31. package/dist/esm/constants.d.ts +11 -0
  32. package/dist/esm/constants.js +100 -0
  33. package/dist/esm/constants.js.map +7 -0
  34. package/dist/esm/haneulns-client.d.ts +40 -0
  35. package/dist/esm/haneulns-client.js +249 -0
  36. package/dist/esm/haneulns-client.js.map +7 -0
  37. package/dist/esm/haneulns-transaction.d.ts +105 -0
  38. package/dist/esm/haneulns-transaction.js +445 -0
  39. package/dist/esm/haneulns-transaction.js.map +7 -0
  40. package/dist/esm/helpers.d.ts +18 -0
  41. package/dist/esm/helpers.js +43 -0
  42. package/dist/esm/helpers.js.map +7 -0
  43. package/dist/esm/index.d.ts +5 -0
  44. package/dist/esm/index.js +28 -0
  45. package/dist/esm/index.js.map +7 -0
  46. package/dist/esm/package.json +5 -0
  47. package/dist/esm/pyth/PriceServiceConnection.d.ts +26 -0
  48. package/dist/esm/pyth/PriceServiceConnection.js +38 -0
  49. package/dist/esm/pyth/PriceServiceConnection.js.map +7 -0
  50. package/dist/esm/pyth/pyth-helpers.d.ts +7 -0
  51. package/dist/esm/pyth/pyth-helpers.js +16 -0
  52. package/dist/esm/pyth/pyth-helpers.js.map +7 -0
  53. package/dist/esm/pyth/pyth.d.ts +66 -0
  54. package/dist/esm/pyth/pyth.js +250 -0
  55. package/dist/esm/pyth/pyth.js.map +7 -0
  56. package/dist/esm/types.d.ts +89 -0
  57. package/dist/esm/types.js +1 -0
  58. package/dist/esm/types.js.map +7 -0
  59. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  60. package/dist/tsconfig.tsbuildinfo +1 -0
  61. package/package.json +63 -0
  62. package/src/constants.ts +106 -0
  63. package/src/haneulns-client.ts +368 -0
  64. package/src/haneulns-transaction.ts +555 -0
  65. package/src/helpers.ts +52 -0
  66. package/src/index.ts +16 -0
  67. package/src/pyth/PriceServiceConnection.ts +48 -0
  68. package/src/pyth/pyth-helpers.ts +23 -0
  69. package/src/pyth/pyth.ts +312 -0
  70. package/src/types.ts +111 -0
@@ -0,0 +1,89 @@
1
+ import type { HaneulClient } from '@haneullabs/haneul/client';
2
+ import type { TransactionObjectArgument, TransactionObjectInput } from '@haneullabs/haneul/transactions';
3
+ export interface CoinConfig {
4
+ type: string;
5
+ feed: string;
6
+ }
7
+ export interface DiscountInfo {
8
+ discountNft: TransactionObjectInput;
9
+ type: string;
10
+ isFreeClaim?: boolean;
11
+ }
12
+ export interface PackageInfo {
13
+ packageId: string;
14
+ packageIdV1: string;
15
+ packageIdPricing: string;
16
+ haneulns: string;
17
+ discountsPackage: {
18
+ packageId: string;
19
+ discountHouseId: string;
20
+ };
21
+ subNamesPackageId: string;
22
+ tempSubdomainsProxyPackageId: string;
23
+ coupons: {
24
+ packageId: string;
25
+ };
26
+ payments: {
27
+ packageId: string;
28
+ };
29
+ bbb: {
30
+ packageId: string;
31
+ vault: string;
32
+ };
33
+ registryTableId?: string;
34
+ pyth: {
35
+ pythStateId: string;
36
+ wormholeStateId: string;
37
+ };
38
+ utils?: {
39
+ packageId: string;
40
+ };
41
+ coins: Record<string, CoinConfig>;
42
+ }
43
+ export interface NameRecord {
44
+ name: string;
45
+ nftId: string;
46
+ targetAddress: string;
47
+ expirationTimestampMs: number;
48
+ data: Record<string, string>;
49
+ avatar?: string;
50
+ contentHash?: string;
51
+ walrusSiteId?: string;
52
+ }
53
+ export type Network = 'mainnet' | 'testnet' | 'custom';
54
+ export type VersionedPackageId = {
55
+ latest: string;
56
+ v1: string;
57
+ [key: string]: string;
58
+ };
59
+ export type Config = Record<'mainnet' | 'testnet', PackageInfo>;
60
+ export type BaseParams = {
61
+ years: number;
62
+ coinConfig: CoinConfig;
63
+ coin?: TransactionObjectInput;
64
+ couponCode?: string;
65
+ discountInfo?: DiscountInfo;
66
+ maxAmount?: bigint;
67
+ priceInfoObjectId?: string | null;
68
+ };
69
+ export type RegistrationParams = BaseParams & {
70
+ domain: string;
71
+ };
72
+ export type RenewalParams = BaseParams & {
73
+ nft: TransactionObjectInput;
74
+ };
75
+ export type ReceiptParams = {
76
+ paymentIntent: TransactionObjectArgument;
77
+ priceAfterDiscount: TransactionObjectArgument;
78
+ coinConfig: CoinConfig;
79
+ coin?: TransactionObjectInput;
80
+ maxAmount?: bigint;
81
+ priceInfoObjectId?: string | null;
82
+ };
83
+ export type HaneulnsClientConfig = {
84
+ client: HaneulClient;
85
+ network?: Network;
86
+ config?: Config;
87
+ };
88
+ export type SuinsPriceList = Map<[number, number], number>;
89
+ export type CoinTypeDiscount = Map<string, number>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var types_exports = {};
16
+ module.exports = __toCommonJS(types_exports);
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/types.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport type { HaneulClient } from '@haneullabs/haneul/client';\nimport type { TransactionObjectArgument, TransactionObjectInput } from '@haneullabs/haneul/transactions';\n\n// Interfaces\n// -----------------\n\nexport interface CoinConfig {\n\ttype: string;\n\tfeed: string;\n}\n\nexport interface DiscountInfo {\n\tdiscountNft: TransactionObjectInput;\n\ttype: string;\n\tisFreeClaim?: boolean;\n}\n\nexport interface PackageInfo {\n\tpackageId: string;\n\tpackageIdV1: string;\n\tpackageIdPricing: string;\n\thaneulns: string;\n\tdiscountsPackage: {\n\t\tpackageId: string;\n\t\tdiscountHouseId: string;\n\t};\n\tsubNamesPackageId: string;\n\ttempSubdomainsProxyPackageId: string;\n\tcoupons: {\n\t\tpackageId: string;\n\t};\n\tpayments: {\n\t\tpackageId: string;\n\t};\n\tbbb: {\n\t\tpackageId: string;\n\t\tvault: string;\n\t};\n\tregistryTableId?: string;\n\tpyth: {\n\t\tpythStateId: string;\n\t\twormholeStateId: string;\n\t};\n\tutils?: {\n\t\tpackageId: string;\n\t};\n\tcoins: Record<string, CoinConfig>;\n}\n\nexport interface NameRecord {\n\tname: string;\n\tnftId: string;\n\ttargetAddress: string;\n\texpirationTimestampMs: number;\n\tdata: Record<string, string>;\n\tavatar?: string;\n\tcontentHash?: string;\n\twalrusSiteId?: string;\n}\n\n// Types\n// -----------------\n\nexport type Network = 'mainnet' | 'testnet' | 'custom';\n\nexport type VersionedPackageId = {\n\tlatest: string;\n\tv1: string;\n\t[key: string]: string;\n};\n\nexport type Config = Record<'mainnet' | 'testnet', PackageInfo>;\n\nexport type BaseParams = {\n\tyears: number;\n\tcoinConfig: CoinConfig;\n\tcoin?: TransactionObjectInput;\n\tcouponCode?: string;\n\tdiscountInfo?: DiscountInfo;\n\tmaxAmount?: bigint;\n\tpriceInfoObjectId?: string | null;\n};\n\nexport type RegistrationParams = BaseParams & {\n\tdomain: string;\n};\n\nexport type RenewalParams = BaseParams & {\n\tnft: TransactionObjectInput;\n};\n\nexport type ReceiptParams = {\n\tpaymentIntent: TransactionObjectArgument;\n\tpriceAfterDiscount: TransactionObjectArgument;\n\tcoinConfig: CoinConfig;\n\tcoin?: TransactionObjectInput;\n\tmaxAmount?: bigint;\n\tpriceInfoObjectId?: string | null;\n};\n\nexport type HaneulnsClientConfig = {\n\tclient: HaneulClient;\n\tnetwork?: Network;\n\tconfig?: Config;\n};\n\nexport type SuinsPriceList = Map<[number, number], number>;\n\nexport type CoinTypeDiscount = Map<string, number>;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,11 @@
1
+ import type { Config } from './types.js';
2
+ export declare const MAX_U64: bigint;
3
+ /**
4
+ * Allowed keys for metadata.
5
+ */
6
+ export declare const ALLOWED_METADATA: {
7
+ contentHash: string;
8
+ avatar: string;
9
+ walrusSiteId: string;
10
+ };
11
+ export declare const mainPackage: Config;
@@ -0,0 +1,100 @@
1
+ const MAX_U64 = BigInt("18446744073709551615");
2
+ const ALLOWED_METADATA = {
3
+ contentHash: "content_hash",
4
+ avatar: "avatar",
5
+ walrusSiteId: "walrus_site_id"
6
+ };
7
+ const mainPackage = {
8
+ mainnet: {
9
+ packageId: "0x71af035413ed499710980ed8adb010bbf2cc5cacf4ab37c7710a4bb87eb58ba5",
10
+ packageIdV1: "0xd22b24490e0bae52676651b4f56660a5ff8022a2576e0089f79b3c88d44e08f0",
11
+ packageIdPricing: "0x71af035413ed499710980ed8adb010bbf2cc5cacf4ab37c7710a4bb87eb58ba5",
12
+ haneulns: "0x6e0ddefc0ad98889c04bab9639e512c21766c5e6366f89e696956d9be6952871",
13
+ discountsPackage: {
14
+ packageId: "0x03f625d805339b1b0235ba8c503fa6ea62c88c02ddf14cd9d246d9e1febc0c76",
15
+ discountHouseId: "0x4ce82dee11e6f4858509dcdba1a62985f12e5afb054df680a04f16790bfe1d04"
16
+ },
17
+ subNamesPackageId: "0xe177697e191327901637f8d2c5ffbbde8b1aaac27ec1024c4b62d1ebd1cd7430",
18
+ tempSubdomainsProxyPackageId: "0xf335dfbcb2020fc996250c0d6fd4655c5e2036b0606cac7408aa163f51340886",
19
+ coupons: {
20
+ packageId: "0xb162340524e0697461c307b9dc530c17e837b0f2c6d7f787da40d29d29681e5e"
21
+ },
22
+ payments: {
23
+ packageId: "0xdd0a4a34152a80d7841710e916a407b2a62961eee5b2188dcfdaa24194f66286"
24
+ },
25
+ bbb: {
26
+ packageId: "0x6268d072063a311f6f0a1db516d06d97c06a3fa6d10e797cad578937a47b3992",
27
+ vault: "0x869f5100c0ecc0b35c7edad87ba3d488fd291bdba4a7aae84b70d188f440f393"
28
+ },
29
+ pyth: {
30
+ pythStateId: "0x1f9310238ee9298fb703c3419030b35b22bb1cc37113e3bb5007c99aec79e5b8",
31
+ wormholeStateId: "0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c"
32
+ },
33
+ coins: {
34
+ HANEUL: {
35
+ type: "0x0000000000000000000000000000000000000000000000000000000000000002::haneul::HANEUL",
36
+ feed: "0x23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744"
37
+ },
38
+ NS: {
39
+ type: "0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS",
40
+ feed: "0xbb5ff26e47a3a6cc7ec2fce1db996c2a145300edc5acaabe43bf9ff7c5dd5d32"
41
+ },
42
+ USDC: {
43
+ type: "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC",
44
+ feed: ""
45
+ }
46
+ },
47
+ registryTableId: "0xe64cd9db9f829c6cc405d9790bd71567ae07259855f4fba6f02c84f52298c106"
48
+ },
49
+ testnet: {
50
+ packageId: "0x40eee27b014a872f5c3330dcd5329aa55c7fe0fcc6e70c6498852e2e3727172e",
51
+ packageIdV1: "0x22fa05f21b1ad71442491220bb9338f7b7095fe35000ef88d5400d28523bdd93",
52
+ packageIdPricing: "0x8a4df604a449ccb9ef2efb9747046b78f78ba60fc8d88df098d0dd47619df5a4",
53
+ haneulns: "0x300369e8909b9a6464da265b9a5a9ab6fe2158a040e84e808628cde7a07ee5a3",
54
+ discountsPackage: {
55
+ packageId: "0x7976f9bfe81dcbdbb635efb0ecb02844cd79109d3a698d05c06ca9fd2f97d262",
56
+ discountHouseId: "0x9f1ac0f49ddaec4fd2248ae1cc63ed91946f43a236b333439efb9126f31f8e9b"
57
+ },
58
+ subNamesPackageId: "0x3c272bc45f9157b7818ece4f7411bdfa8af46303b071aca4e18c03119c9ff636",
59
+ tempSubdomainsProxyPackageId: "0x295a0749dae0e76126757c305f218f929df0656df66a6361f8b6c6480a943f12",
60
+ coupons: {
61
+ packageId: "0x63029aae8abbefae4f4ac6c5e3e0021159ea93a94ba648681fd64caf5b40677a"
62
+ },
63
+ payments: {
64
+ packageId: "0xc391c200188dd1a363ff12dcffe07eaac5cf28ad1cd8dc0fcc18f2f8625f0da2"
65
+ },
66
+ bbb: {
67
+ packageId: "0xed9b18147ca81c8f3f60192c8d0630574e42387cd200a6e39b3e4e07df1ce6e6",
68
+ vault: "0xa0b7a4dcbb85209c9096a4e0e85e43b716377c605743193abe915e9c9f3043e5"
69
+ },
70
+ pyth: {
71
+ pythStateId: "0x243759059f4c3111179da5878c12f68d612c21a8d54d85edc86164bb18be1c7c",
72
+ wormholeStateId: "0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790"
73
+ },
74
+ /// Testnet coins will be different here for testing purposes, we can publish our own
75
+ coins: {
76
+ HANEUL: {
77
+ type: "0x0000000000000000000000000000000000000000000000000000000000000002::haneul::HANEUL",
78
+ feed: "0x50c67b3fd225db8912a424dd4baed60ffdde625ed2feaaf283724f9608fea266"
79
+ },
80
+ /// this is a test token published as 0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTNS::TESTNS
81
+ /// NS token is using the HFT feed since NS feed on testnet is not available
82
+ NS: {
83
+ type: "0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTNS::TESTNS",
84
+ feed: "0x99137a18354efa7fb6840889d059fdb04c46a6ce21be97ab60d9ad93e91ac758"
85
+ },
86
+ /// this is a test token published as 0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTUSDC::TESTUSDC
87
+ USDC: {
88
+ type: "0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTUSDC::TESTUSDC",
89
+ feed: ""
90
+ }
91
+ },
92
+ registryTableId: "0xb120c0d55432630fce61f7854795a3463deb6e3b443cc4ae72e1282073ff56e4"
93
+ }
94
+ };
95
+ export {
96
+ ALLOWED_METADATA,
97
+ MAX_U64,
98
+ mainPackage
99
+ };
100
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/constants.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Config } from './types.js';\n\nexport const MAX_U64 = BigInt('18446744073709551615');\n\n/**\n * Allowed keys for metadata.\n */\nexport const ALLOWED_METADATA = {\n\tcontentHash: 'content_hash',\n\tavatar: 'avatar',\n\twalrusSiteId: 'walrus_site_id',\n};\n\nexport const mainPackage: Config = {\n\tmainnet: {\n\t\tpackageId: '0x71af035413ed499710980ed8adb010bbf2cc5cacf4ab37c7710a4bb87eb58ba5',\n\t\tpackageIdV1: '0xd22b24490e0bae52676651b4f56660a5ff8022a2576e0089f79b3c88d44e08f0',\n\t\tpackageIdPricing: '0x71af035413ed499710980ed8adb010bbf2cc5cacf4ab37c7710a4bb87eb58ba5',\n\t\thaneulns: '0x6e0ddefc0ad98889c04bab9639e512c21766c5e6366f89e696956d9be6952871',\n\t\tdiscountsPackage: {\n\t\t\tpackageId: '0x03f625d805339b1b0235ba8c503fa6ea62c88c02ddf14cd9d246d9e1febc0c76',\n\t\t\tdiscountHouseId: '0x4ce82dee11e6f4858509dcdba1a62985f12e5afb054df680a04f16790bfe1d04',\n\t\t},\n\t\tsubNamesPackageId: '0xe177697e191327901637f8d2c5ffbbde8b1aaac27ec1024c4b62d1ebd1cd7430',\n\t\ttempSubdomainsProxyPackageId:\n\t\t\t'0xf335dfbcb2020fc996250c0d6fd4655c5e2036b0606cac7408aa163f51340886',\n\t\tcoupons: {\n\t\t\tpackageId: '0xb162340524e0697461c307b9dc530c17e837b0f2c6d7f787da40d29d29681e5e',\n\t\t},\n\t\tpayments: {\n\t\t\tpackageId: '0xdd0a4a34152a80d7841710e916a407b2a62961eee5b2188dcfdaa24194f66286',\n\t\t},\n\t\tbbb: {\n\t\t\tpackageId: '0x6268d072063a311f6f0a1db516d06d97c06a3fa6d10e797cad578937a47b3992',\n\t\t\tvault: '0x869f5100c0ecc0b35c7edad87ba3d488fd291bdba4a7aae84b70d188f440f393',\n\t\t},\n\t\tpyth: {\n\t\t\tpythStateId: '0x1f9310238ee9298fb703c3419030b35b22bb1cc37113e3bb5007c99aec79e5b8',\n\t\t\twormholeStateId: '0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c',\n\t\t},\n\t\tcoins: {\n\t\t\tHANEUL: {\n\t\t\t\ttype: '0x0000000000000000000000000000000000000000000000000000000000000002::haneul::HANEUL',\n\t\t\t\tfeed: '0x23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n\t\t\t},\n\t\t\tNS: {\n\t\t\t\ttype: '0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS',\n\t\t\t\tfeed: '0xbb5ff26e47a3a6cc7ec2fce1db996c2a145300edc5acaabe43bf9ff7c5dd5d32',\n\t\t\t},\n\t\t\tUSDC: {\n\t\t\t\ttype: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n\t\t\t\tfeed: '',\n\t\t\t},\n\t\t},\n\t\tregistryTableId: '0xe64cd9db9f829c6cc405d9790bd71567ae07259855f4fba6f02c84f52298c106',\n\t},\n\ttestnet: {\n\t\tpackageId: '0x40eee27b014a872f5c3330dcd5329aa55c7fe0fcc6e70c6498852e2e3727172e',\n\t\tpackageIdV1: '0x22fa05f21b1ad71442491220bb9338f7b7095fe35000ef88d5400d28523bdd93',\n\t\tpackageIdPricing: '0x8a4df604a449ccb9ef2efb9747046b78f78ba60fc8d88df098d0dd47619df5a4',\n\t\thaneulns: '0x300369e8909b9a6464da265b9a5a9ab6fe2158a040e84e808628cde7a07ee5a3',\n\t\tdiscountsPackage: {\n\t\t\tpackageId: '0x7976f9bfe81dcbdbb635efb0ecb02844cd79109d3a698d05c06ca9fd2f97d262',\n\t\t\tdiscountHouseId: '0x9f1ac0f49ddaec4fd2248ae1cc63ed91946f43a236b333439efb9126f31f8e9b',\n\t\t},\n\t\tsubNamesPackageId: '0x3c272bc45f9157b7818ece4f7411bdfa8af46303b071aca4e18c03119c9ff636',\n\t\ttempSubdomainsProxyPackageId:\n\t\t\t'0x295a0749dae0e76126757c305f218f929df0656df66a6361f8b6c6480a943f12',\n\t\tcoupons: {\n\t\t\tpackageId: '0x63029aae8abbefae4f4ac6c5e3e0021159ea93a94ba648681fd64caf5b40677a',\n\t\t},\n\t\tpayments: {\n\t\t\tpackageId: '0xc391c200188dd1a363ff12dcffe07eaac5cf28ad1cd8dc0fcc18f2f8625f0da2',\n\t\t},\n\t\tbbb: {\n\t\t\tpackageId: '0xed9b18147ca81c8f3f60192c8d0630574e42387cd200a6e39b3e4e07df1ce6e6',\n\t\t\tvault: '0xa0b7a4dcbb85209c9096a4e0e85e43b716377c605743193abe915e9c9f3043e5',\n\t\t},\n\t\tpyth: {\n\t\t\tpythStateId: '0x243759059f4c3111179da5878c12f68d612c21a8d54d85edc86164bb18be1c7c',\n\t\t\twormholeStateId: '0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790',\n\t\t},\n\t\t/// Testnet coins will be different here for testing purposes, we can publish our own\n\t\tcoins: {\n\t\t\tHANEUL: {\n\t\t\t\ttype: '0x0000000000000000000000000000000000000000000000000000000000000002::haneul::HANEUL',\n\t\t\t\tfeed: '0x50c67b3fd225db8912a424dd4baed60ffdde625ed2feaaf283724f9608fea266',\n\t\t\t},\n\t\t\t/// this is a test token published as 0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTNS::TESTNS\n\t\t\t/// NS token is using the HFT feed since NS feed on testnet is not available\n\t\t\tNS: {\n\t\t\t\ttype: '0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTNS::TESTNS',\n\t\t\t\tfeed: '0x99137a18354efa7fb6840889d059fdb04c46a6ce21be97ab60d9ad93e91ac758',\n\t\t\t},\n\t\t\t/// this is a test token published as 0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTUSDC::TESTUSDC\n\t\t\tUSDC: {\n\t\t\t\ttype: '0xb48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTUSDC::TESTUSDC',\n\t\t\t\tfeed: '',\n\t\t\t},\n\t\t},\n\t\tregistryTableId: '0xb120c0d55432630fce61f7854795a3463deb6e3b443cc4ae72e1282073ff56e4',\n\t},\n};\n"],
5
+ "mappings": "AAKO,MAAM,UAAU,OAAO,sBAAsB;AAK7C,MAAM,mBAAmB;AAAA,EAC/B,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,cAAc;AACf;AAEO,MAAM,cAAsB;AAAA,EAClC,SAAS;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,kBAAkB;AAAA,MACjB,WAAW;AAAA,MACX,iBAAiB;AAAA,IAClB;AAAA,IACA,mBAAmB;AAAA,IACnB,8BACC;AAAA,IACD,SAAS;AAAA,MACR,WAAW;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACT,WAAW;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,MACJ,WAAW;AAAA,MACX,OAAO;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACL,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA,OAAO;AAAA,MACN,QAAQ;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,MACP;AAAA,MACA,IAAI;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,MACP;AAAA,MACA,MAAM;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA,iBAAiB;AAAA,EAClB;AAAA,EACA,SAAS;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,kBAAkB;AAAA,MACjB,WAAW;AAAA,MACX,iBAAiB;AAAA,IAClB;AAAA,IACA,mBAAmB;AAAA,IACnB,8BACC;AAAA,IACD,SAAS;AAAA,MACR,WAAW;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACT,WAAW;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,MACJ,WAAW;AAAA,MACX,OAAO;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACL,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA;AAAA,IAEA,OAAO;AAAA,MACN,QAAQ;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,MACP;AAAA;AAAA;AAAA,MAGA,IAAI;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,MACP;AAAA;AAAA,MAEA,MAAM;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA,iBAAiB;AAAA,EAClB;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,40 @@
1
+ import type { HaneulClient } from '@haneullabs/haneul/client';
2
+ import type { Transaction, TransactionObjectArgument } from '@haneullabs/haneul/transactions';
3
+ import type { CoinTypeDiscount, NameRecord, Network, PackageInfo, HaneulnsClientConfig, SuinsPriceList } from './types.js';
4
+ export declare class HaneulnsClient {
5
+ client: HaneulClient;
6
+ network: Network;
7
+ config: PackageInfo;
8
+ constructor(config: HaneulnsClientConfig);
9
+ /**
10
+ * Returns the price list for HaneulNS names in the base asset.
11
+ */
12
+ getPriceList(): Promise<SuinsPriceList>;
13
+ /**
14
+ * Returns the renewal price list for HaneulNS names in the base asset.
15
+ */
16
+ getRenewalPriceList(): Promise<SuinsPriceList>;
17
+ /**
18
+ * Returns the coin discount list for HaneulNS names.
19
+ */
20
+ getCoinTypeDiscount(): Promise<CoinTypeDiscount>;
21
+ getNameRecord(name: string): Promise<NameRecord | null>;
22
+ /**
23
+ * Calculates the registration or renewal price for an SLD (Second Level Domain).
24
+ * It expects a domain name, the number of years and a `SuinsPriceList` object,
25
+ * as returned from `haneulnsClient.getPriceList()` function, or `haneulns.getRenewalPriceList()` function.
26
+ *
27
+ * It throws an error:
28
+ * 1. if the name is a subdomain
29
+ * 2. if the name is not a valid HaneulNS name
30
+ * 3. if the years are not between 1 and 5
31
+ */
32
+ calculatePrice({ name, years, isRegistration, }: {
33
+ name: string;
34
+ years: number;
35
+ isRegistration?: boolean;
36
+ }): Promise<number>;
37
+ getPriceInfoObject(tx: Transaction, feed: string, feeCoin?: TransactionObjectArgument): Promise<string[]>;
38
+ getPythBaseUpdateFee(): Promise<number>;
39
+ getObjectType(objectId: string): Promise<string>;
40
+ }
@@ -0,0 +1,249 @@
1
+ import { isValidHaneulNSName, normalizeHaneulNSName } from "@haneullabs/haneul/utils";
2
+ import { mainPackage } from "./constants.js";
3
+ import {
4
+ getCoinDiscountConfigType,
5
+ getConfigType,
6
+ getDomainType,
7
+ getPricelistConfigType,
8
+ getRenewalPricelistConfigType,
9
+ isSubName,
10
+ validateYears
11
+ } from "./helpers.js";
12
+ import { HaneulPriceServiceConnection, HaneulPythClient } from "./pyth/pyth.js";
13
+ class HaneulnsClient {
14
+ constructor(config) {
15
+ this.client = config.client;
16
+ this.network = config.network || "mainnet";
17
+ if (this.network === "mainnet") {
18
+ this.config = mainPackage.mainnet;
19
+ } else if (this.network === "testnet") {
20
+ this.config = mainPackage.testnet;
21
+ } else {
22
+ throw new Error("Invalid network");
23
+ }
24
+ }
25
+ /**
26
+ * Returns the price list for HaneulNS names in the base asset.
27
+ */
28
+ // Format:
29
+ // {
30
+ // [ 3, 3 ] => 500000000,
31
+ // [ 4, 4 ] => 100000000,
32
+ // [ 5, 63 ] => 20000000
33
+ // }
34
+ async getPriceList() {
35
+ if (!this.config.haneulns) throw new Error("Suins object ID is not set");
36
+ if (!this.config.packageId) throw new Error("Price list config not found");
37
+ const priceList = await this.client.getDynamicFieldObject({
38
+ parentId: this.config.haneulns,
39
+ name: {
40
+ type: getConfigType(
41
+ this.config.packageIdV1,
42
+ getPricelistConfigType(this.config.packageIdPricing)
43
+ ),
44
+ value: { dummy_field: false }
45
+ }
46
+ });
47
+ if (!priceList?.data?.content || priceList.data.content.dataType !== "moveObject" || !("fields" in priceList.data.content)) {
48
+ throw new Error("Price list not found or content is invalid");
49
+ }
50
+ const fields = priceList.data.content.fields;
51
+ if (!fields.value || !fields.value.fields || !fields.value.fields.pricing) {
52
+ throw new Error("Pricing fields not found in the price list");
53
+ }
54
+ const contentArray = fields.value.fields.pricing.fields.contents;
55
+ const priceMap = /* @__PURE__ */ new Map();
56
+ for (const entry of contentArray) {
57
+ const keyFields = entry.fields.key.fields;
58
+ const key = [Number(keyFields.pos0), Number(keyFields.pos1)];
59
+ const value = Number(entry.fields.value);
60
+ priceMap.set(key, value);
61
+ }
62
+ return priceMap;
63
+ }
64
+ /**
65
+ * Returns the renewal price list for HaneulNS names in the base asset.
66
+ */
67
+ // Format:
68
+ // {
69
+ // [ 3, 3 ] => 500000000,
70
+ // [ 4, 4 ] => 100000000,
71
+ // [ 5, 63 ] => 20000000
72
+ // }
73
+ async getRenewalPriceList() {
74
+ if (!this.config.haneulns) throw new Error("Suins object ID is not set");
75
+ if (!this.config.packageId) throw new Error("Price list config not found");
76
+ const priceList = await this.client.getDynamicFieldObject({
77
+ parentId: this.config.haneulns,
78
+ name: {
79
+ type: getConfigType(
80
+ this.config.packageIdV1,
81
+ getRenewalPricelistConfigType(this.config.packageIdPricing)
82
+ ),
83
+ value: { dummy_field: false }
84
+ }
85
+ });
86
+ if (!priceList || !priceList.data || !priceList.data.content || priceList.data.content.dataType !== "moveObject" || !("fields" in priceList.data.content)) {
87
+ throw new Error("Price list not found or content structure is invalid");
88
+ }
89
+ const fields = priceList.data.content.fields;
90
+ if (!fields.value || !fields.value.fields || !fields.value.fields.config || !fields.value.fields.config.fields.pricing || !fields.value.fields.config.fields.pricing.fields.contents) {
91
+ throw new Error("Pricing fields not found in the price list");
92
+ }
93
+ const contentArray = fields.value.fields.config.fields.pricing.fields.contents;
94
+ const priceMap = /* @__PURE__ */ new Map();
95
+ for (const entry of contentArray) {
96
+ const keyFields = entry.fields.key.fields;
97
+ const key = [Number(keyFields.pos0), Number(keyFields.pos1)];
98
+ const value = Number(entry.fields.value);
99
+ priceMap.set(key, value);
100
+ }
101
+ return priceMap;
102
+ }
103
+ /**
104
+ * Returns the coin discount list for HaneulNS names.
105
+ */
106
+ // Format:
107
+ // {
108
+ // 'b48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTUSDC::TESTUSDC' => 0,
109
+ // '0000000000000000000000000000000000000000000000000000000000000002::haneul::HANEUL' => 0,
110
+ // 'b48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTNS::TESTNS' => 25
111
+ // }
112
+ async getCoinTypeDiscount() {
113
+ if (!this.config.haneulns) throw new Error("Suins object ID is not set");
114
+ if (!this.config.packageId) throw new Error("Price list config not found");
115
+ const dfValue = await this.client.getDynamicFieldObject({
116
+ parentId: this.config.haneulns,
117
+ name: {
118
+ type: getConfigType(
119
+ this.config.packageIdV1,
120
+ getCoinDiscountConfigType(this.config.payments.packageId)
121
+ ),
122
+ value: { dummy_field: false }
123
+ }
124
+ });
125
+ if (!dfValue || !dfValue.data || !dfValue.data.content || dfValue.data.content.dataType !== "moveObject" || !("fields" in dfValue.data.content)) {
126
+ throw new Error("dfValue not found or content structure is invalid");
127
+ }
128
+ const fields = dfValue.data.content.fields;
129
+ if (!fields.value || !fields.value.fields || !fields.value.fields.base_currency || !fields.value.fields.base_currency.fields || !fields.value.fields.base_currency.fields.name || !fields.value.fields.currencies || !fields.value.fields.currencies.fields || !fields.value.fields.currencies.fields.contents) {
130
+ throw new Error("Required fields are missing in dfValue");
131
+ }
132
+ const content = fields.value.fields;
133
+ const currencyDiscounts = content.currencies.fields.contents;
134
+ const discountMap = /* @__PURE__ */ new Map();
135
+ for (const entry of currencyDiscounts) {
136
+ const key = entry.fields.key.fields.name;
137
+ const value = Number(entry.fields.value.fields.discount_percentage);
138
+ discountMap.set(key, value);
139
+ }
140
+ return discountMap;
141
+ }
142
+ async getNameRecord(name) {
143
+ if (!isValidHaneulNSName(name)) throw new Error("Invalid HaneulNS name");
144
+ if (!this.config.registryTableId) throw new Error("Suins package ID is not set");
145
+ const nameRecord = await this.client.getDynamicFieldObject({
146
+ parentId: this.config.registryTableId,
147
+ name: {
148
+ type: getDomainType(this.config.packageIdV1),
149
+ value: normalizeHaneulNSName(name, "dot").split(".").reverse()
150
+ }
151
+ });
152
+ const fields = nameRecord.data?.content;
153
+ if (nameRecord.error?.code === "dynamicFieldNotFound") return null;
154
+ if (nameRecord.error || !fields || fields.dataType !== "moveObject")
155
+ throw new Error("Name record not found. This domain is not registered.");
156
+ const content = fields.fields;
157
+ const data = {};
158
+ content.value.fields.data.fields.contents.forEach((item) => {
159
+ data[item.fields.key] = item.fields.value;
160
+ });
161
+ return {
162
+ name,
163
+ nftId: content.value.fields?.nft_id,
164
+ targetAddress: content.value.fields?.target_address,
165
+ expirationTimestampMs: content.value.fields?.expiration_timestamp_ms,
166
+ data,
167
+ avatar: data.avatar,
168
+ contentHash: data.content_hash,
169
+ walrusSiteId: data.walrus_site_id
170
+ };
171
+ }
172
+ /**
173
+ * Calculates the registration or renewal price for an SLD (Second Level Domain).
174
+ * It expects a domain name, the number of years and a `SuinsPriceList` object,
175
+ * as returned from `haneulnsClient.getPriceList()` function, or `haneulns.getRenewalPriceList()` function.
176
+ *
177
+ * It throws an error:
178
+ * 1. if the name is a subdomain
179
+ * 2. if the name is not a valid HaneulNS name
180
+ * 3. if the years are not between 1 and 5
181
+ */
182
+ async calculatePrice({
183
+ name,
184
+ years,
185
+ isRegistration = true
186
+ }) {
187
+ if (!isValidHaneulNSName(name)) {
188
+ throw new Error("Invalid HaneulNS name");
189
+ }
190
+ validateYears(years);
191
+ if (isSubName(name)) {
192
+ throw new Error("Subdomains do not have a registration fee");
193
+ }
194
+ const length = normalizeHaneulNSName(name, "dot").split(".")[0].length;
195
+ const priceList = await this.getPriceList();
196
+ const renewalPriceList = await this.getRenewalPriceList();
197
+ let yearsRemain = years;
198
+ let price = 0;
199
+ if (isRegistration) {
200
+ for (const [[minLength, maxLength], pricePerYear] of priceList.entries()) {
201
+ if (length >= minLength && length <= maxLength) {
202
+ price += pricePerYear;
203
+ yearsRemain -= 1;
204
+ break;
205
+ }
206
+ }
207
+ }
208
+ for (const [[minLength, maxLength], pricePerYear] of renewalPriceList.entries()) {
209
+ if (length >= minLength && length <= maxLength) {
210
+ price += yearsRemain * pricePerYear;
211
+ break;
212
+ }
213
+ }
214
+ return price;
215
+ }
216
+ async getPriceInfoObject(tx, feed, feeCoin) {
217
+ const endpoint = this.network === "testnet" ? "https://hermes-beta.pyth.network" : "https://hermes.pyth.network";
218
+ const connection = new HaneulPriceServiceConnection(endpoint);
219
+ const priceIDs = [
220
+ feed
221
+ // ASSET/USD price ID
222
+ ];
223
+ const priceUpdateData = await connection.getPriceFeedsUpdateData(priceIDs);
224
+ const wormholeStateId = this.config.pyth.wormholeStateId;
225
+ const pythStateId = this.config.pyth.pythStateId;
226
+ const client = new HaneulPythClient(this.client, pythStateId, wormholeStateId);
227
+ return await client.updatePriceFeeds(tx, priceUpdateData, priceIDs, feeCoin);
228
+ }
229
+ async getPythBaseUpdateFee() {
230
+ const pythStateId = this.config.pyth.pythStateId;
231
+ const wormholeStateId = this.config.pyth.wormholeStateId;
232
+ const client = new HaneulPythClient(this.client, pythStateId, wormholeStateId);
233
+ return await client.getBaseUpdateFee();
234
+ }
235
+ async getObjectType(objectId) {
236
+ const objectResponse = await this.client.getObject({
237
+ id: objectId,
238
+ options: { showType: true }
239
+ });
240
+ if (objectResponse && objectResponse.data && objectResponse.data.type) {
241
+ return objectResponse.data.type;
242
+ }
243
+ throw new Error(`Type information not found for object ID: ${objectId}`);
244
+ }
245
+ }
246
+ export {
247
+ HaneulnsClient
248
+ };
249
+ //# sourceMappingURL=haneulns-client.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/haneulns-client.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport type { HaneulClient } from '@haneullabs/haneul/client';\nimport type { Transaction, TransactionObjectArgument } from '@haneullabs/haneul/transactions';\nimport { isValidHaneulNSName, normalizeHaneulNSName } from '@haneullabs/haneul/utils';\n\nimport { mainPackage } from './constants.js';\nimport {\n\tgetCoinDiscountConfigType,\n\tgetConfigType,\n\tgetDomainType,\n\tgetPricelistConfigType,\n\tgetRenewalPricelistConfigType,\n\tisSubName,\n\tvalidateYears,\n} from './helpers.js';\nimport { HaneulPriceServiceConnection, HaneulPythClient } from './pyth/pyth.js';\nimport type {\n\tCoinTypeDiscount,\n\tNameRecord,\n\tNetwork,\n\tPackageInfo,\n\tHaneulnsClientConfig,\n\tSuinsPriceList,\n} from './types.js';\n\n/// The HaneulnsClient is the main entry point for the Haneulns SDK.\n/// It allows you to interact with HaneulNS.\nexport class HaneulnsClient {\n\tclient: HaneulClient;\n\tnetwork: Network;\n\tconfig: PackageInfo;\n\n\tconstructor(config: HaneulnsClientConfig) {\n\t\tthis.client = config.client;\n\t\tthis.network = config.network || 'mainnet';\n\n\t\tif (this.network === 'mainnet') {\n\t\t\tthis.config = mainPackage.mainnet;\n\t\t} else if (this.network === 'testnet') {\n\t\t\tthis.config = mainPackage.testnet;\n\t\t} else {\n\t\t\tthrow new Error('Invalid network');\n\t\t}\n\t}\n\n\t/**\n\t * Returns the price list for HaneulNS names in the base asset.\n\t */\n\n\t// Format:\n\t// {\n\t// \t[ 3, 3 ] => 500000000,\n\t// \t[ 4, 4 ] => 100000000,\n\t// \t[ 5, 63 ] => 20000000\n\t// }\n\tasync getPriceList(): Promise<SuinsPriceList> {\n\t\tif (!this.config.haneulns) throw new Error('Suins object ID is not set');\n\t\tif (!this.config.packageId) throw new Error('Price list config not found');\n\n\t\tconst priceList = await this.client.getDynamicFieldObject({\n\t\t\tparentId: this.config.haneulns,\n\t\t\tname: {\n\t\t\t\ttype: getConfigType(\n\t\t\t\t\tthis.config.packageIdV1,\n\t\t\t\t\tgetPricelistConfigType(this.config.packageIdPricing),\n\t\t\t\t),\n\t\t\t\tvalue: { dummy_field: false },\n\t\t\t},\n\t\t});\n\n\t\t// Ensure the content exists and is a MoveStruct with expected fields\n\t\tif (\n\t\t\t!priceList?.data?.content ||\n\t\t\tpriceList.data.content.dataType !== 'moveObject' ||\n\t\t\t!('fields' in priceList.data.content)\n\t\t) {\n\t\t\tthrow new Error('Price list not found or content is invalid');\n\t\t}\n\n\t\t// Safely extract fields\n\t\tconst fields = priceList.data.content.fields as Record<string, any>;\n\t\tif (!fields.value || !fields.value.fields || !fields.value.fields.pricing) {\n\t\t\tthrow new Error('Pricing fields not found in the price list');\n\t\t}\n\n\t\tconst contentArray = fields.value.fields.pricing.fields.contents;\n\t\tconst priceMap = new Map();\n\n\t\tfor (const entry of contentArray) {\n\t\t\tconst keyFields = entry.fields.key.fields;\n\t\t\tconst key = [Number(keyFields.pos0), Number(keyFields.pos1)]; // Convert keys to numbers\n\t\t\tconst value = Number(entry.fields.value); // Convert value to a number\n\n\t\t\tpriceMap.set(key, value);\n\t\t}\n\n\t\treturn priceMap;\n\t}\n\n\t/**\n\t * Returns the renewal price list for HaneulNS names in the base asset.\n\t */\n\n\t// Format:\n\t// {\n\t// \t[ 3, 3 ] => 500000000,\n\t// \t[ 4, 4 ] => 100000000,\n\t// \t[ 5, 63 ] => 20000000\n\t// }\n\tasync getRenewalPriceList(): Promise<SuinsPriceList> {\n\t\tif (!this.config.haneulns) throw new Error('Suins object ID is not set');\n\t\tif (!this.config.packageId) throw new Error('Price list config not found');\n\n\t\tconst priceList = await this.client.getDynamicFieldObject({\n\t\t\tparentId: this.config.haneulns,\n\t\t\tname: {\n\t\t\t\ttype: getConfigType(\n\t\t\t\t\tthis.config.packageIdV1,\n\t\t\t\t\tgetRenewalPricelistConfigType(this.config.packageIdPricing),\n\t\t\t\t),\n\t\t\t\tvalue: { dummy_field: false },\n\t\t\t},\n\t\t});\n\n\t\tif (\n\t\t\t!priceList ||\n\t\t\t!priceList.data ||\n\t\t\t!priceList.data.content ||\n\t\t\tpriceList.data.content.dataType !== 'moveObject' ||\n\t\t\t!('fields' in priceList.data.content)\n\t\t) {\n\t\t\tthrow new Error('Price list not found or content structure is invalid');\n\t\t}\n\n\t\t// Safely extract fields\n\t\tconst fields = priceList.data.content.fields as Record<string, any>;\n\t\tif (\n\t\t\t!fields.value ||\n\t\t\t!fields.value.fields ||\n\t\t\t!fields.value.fields.config ||\n\t\t\t!fields.value.fields.config.fields.pricing ||\n\t\t\t!fields.value.fields.config.fields.pricing.fields.contents\n\t\t) {\n\t\t\tthrow new Error('Pricing fields not found in the price list');\n\t\t}\n\n\t\tconst contentArray = fields.value.fields.config.fields.pricing.fields.contents;\n\t\tconst priceMap = new Map();\n\n\t\tfor (const entry of contentArray) {\n\t\t\tconst keyFields = entry.fields.key.fields;\n\t\t\tconst key = [Number(keyFields.pos0), Number(keyFields.pos1)]; // Convert keys to numbers\n\t\t\tconst value = Number(entry.fields.value); // Convert value to a number\n\n\t\t\tpriceMap.set(key, value);\n\t\t}\n\n\t\treturn priceMap;\n\t}\n\n\t/**\n\t * Returns the coin discount list for HaneulNS names.\n\t */\n\n\t// Format:\n\t// {\n\t// \t'b48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTUSDC::TESTUSDC' => 0,\n\t// \t'0000000000000000000000000000000000000000000000000000000000000002::haneul::HANEUL' => 0,\n\t// \t'b48aac3f53bab328e1eb4c5b3c34f55e760f2fb3f2305ee1a474878d80f650f0::TESTNS::TESTNS' => 25\n\t// }\n\tasync getCoinTypeDiscount(): Promise<CoinTypeDiscount> {\n\t\tif (!this.config.haneulns) throw new Error('Suins object ID is not set');\n\t\tif (!this.config.packageId) throw new Error('Price list config not found');\n\n\t\tconst dfValue = await this.client.getDynamicFieldObject({\n\t\t\tparentId: this.config.haneulns,\n\t\t\tname: {\n\t\t\t\ttype: getConfigType(\n\t\t\t\t\tthis.config.packageIdV1,\n\t\t\t\t\tgetCoinDiscountConfigType(this.config.payments.packageId),\n\t\t\t\t),\n\t\t\t\tvalue: { dummy_field: false },\n\t\t\t},\n\t\t});\n\n\t\tif (\n\t\t\t!dfValue ||\n\t\t\t!dfValue.data ||\n\t\t\t!dfValue.data.content ||\n\t\t\tdfValue.data.content.dataType !== 'moveObject' ||\n\t\t\t!('fields' in dfValue.data.content)\n\t\t) {\n\t\t\tthrow new Error('dfValue not found or content structure is invalid');\n\t\t}\n\n\t\t// Safely extract fields\n\t\tconst fields = dfValue.data.content.fields as Record<string, any>;\n\t\tif (\n\t\t\t!fields.value ||\n\t\t\t!fields.value.fields ||\n\t\t\t!fields.value.fields.base_currency ||\n\t\t\t!fields.value.fields.base_currency.fields ||\n\t\t\t!fields.value.fields.base_currency.fields.name ||\n\t\t\t!fields.value.fields.currencies ||\n\t\t\t!fields.value.fields.currencies.fields ||\n\t\t\t!fields.value.fields.currencies.fields.contents\n\t\t) {\n\t\t\tthrow new Error('Required fields are missing in dfValue');\n\t\t}\n\n\t\t// Safely extract content\n\t\tconst content = fields.value.fields;\n\t\tconst currencyDiscounts = content.currencies.fields.contents;\n\t\tconst discountMap = new Map();\n\n\t\tfor (const entry of currencyDiscounts) {\n\t\t\tconst key = entry.fields.key.fields.name;\n\t\t\tconst value = Number(entry.fields.value.fields.discount_percentage);\n\n\t\t\tdiscountMap.set(key, value);\n\t\t}\n\n\t\treturn discountMap;\n\t}\n\n\tasync getNameRecord(name: string): Promise<NameRecord | null> {\n\t\tif (!isValidHaneulNSName(name)) throw new Error('Invalid HaneulNS name');\n\t\tif (!this.config.registryTableId) throw new Error('Suins package ID is not set');\n\n\t\tconst nameRecord = await this.client.getDynamicFieldObject({\n\t\t\tparentId: this.config.registryTableId,\n\t\t\tname: {\n\t\t\t\ttype: getDomainType(this.config.packageIdV1),\n\t\t\t\tvalue: normalizeHaneulNSName(name, 'dot').split('.').reverse(),\n\t\t\t},\n\t\t});\n\n\t\tconst fields = nameRecord.data?.content;\n\n\t\t// in case the name record is not found, return null\n\t\tif (nameRecord.error?.code === 'dynamicFieldNotFound') return null;\n\n\t\tif (nameRecord.error || !fields || fields.dataType !== 'moveObject')\n\t\t\tthrow new Error('Name record not found. This domain is not registered.');\n\t\tconst content = fields.fields as Record<string, any>;\n\n\t\tconst data: Record<string, string> = {};\n\t\tcontent.value.fields.data.fields.contents.forEach((item: any) => {\n\t\t\t// @ts-ignore-next-line\n\t\t\tdata[item.fields.key as string] = item.fields.value;\n\t\t});\n\n\t\treturn {\n\t\t\tname,\n\t\t\tnftId: content.value.fields?.nft_id,\n\t\t\ttargetAddress: content.value.fields?.target_address!,\n\t\t\texpirationTimestampMs: content.value.fields?.expiration_timestamp_ms,\n\t\t\tdata,\n\t\t\tavatar: data.avatar,\n\t\t\tcontentHash: data.content_hash,\n\t\t\twalrusSiteId: data.walrus_site_id,\n\t\t};\n\t}\n\n\t/**\n\t * Calculates the registration or renewal price for an SLD (Second Level Domain).\n\t * It expects a domain name, the number of years and a `SuinsPriceList` object,\n\t * as returned from `haneulnsClient.getPriceList()` function, or `haneulns.getRenewalPriceList()` function.\n\t *\n\t * It throws an error:\n\t * 1. if the name is a subdomain\n\t * 2. if the name is not a valid HaneulNS name\n\t * 3. if the years are not between 1 and 5\n\t */\n\tasync calculatePrice({\n\t\tname,\n\t\tyears,\n\t\tisRegistration = true,\n\t}: {\n\t\tname: string;\n\t\tyears: number;\n\t\tisRegistration?: boolean;\n\t}) {\n\t\tif (!isValidHaneulNSName(name)) {\n\t\t\tthrow new Error('Invalid HaneulNS name');\n\t\t}\n\t\tvalidateYears(years);\n\n\t\tif (isSubName(name)) {\n\t\t\tthrow new Error('Subdomains do not have a registration fee');\n\t\t}\n\n\t\tconst length = normalizeHaneulNSName(name, 'dot').split('.')[0].length;\n\t\tconst priceList = await this.getPriceList();\n\t\tconst renewalPriceList = await this.getRenewalPriceList();\n\t\tlet yearsRemain = years;\n\t\tlet price = 0;\n\n\t\tif (isRegistration) {\n\t\t\tfor (const [[minLength, maxLength], pricePerYear] of priceList.entries()) {\n\t\t\t\tif (length >= minLength && length <= maxLength) {\n\t\t\t\t\tprice += pricePerYear; // Registration is always 1 year\n\t\t\t\t\tyearsRemain -= 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [[minLength, maxLength], pricePerYear] of renewalPriceList.entries()) {\n\t\t\tif (length >= minLength && length <= maxLength) {\n\t\t\t\tprice += yearsRemain * pricePerYear;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn price;\n\t}\n\n\tasync getPriceInfoObject(tx: Transaction, feed: string, feeCoin?: TransactionObjectArgument) {\n\t\t// Initialize connection to the Haneul Price Service\n\t\tconst endpoint =\n\t\t\tthis.network === 'testnet'\n\t\t\t\t? 'https://hermes-beta.pyth.network'\n\t\t\t\t: 'https://hermes.pyth.network';\n\t\tconst connection = new HaneulPriceServiceConnection(endpoint);\n\n\t\t// List of price feed IDs\n\t\tconst priceIDs = [\n\t\t\tfeed, // ASSET/USD price ID\n\t\t];\n\n\t\t// Fetch price feed update data\n\t\tconst priceUpdateData = await connection.getPriceFeedsUpdateData(priceIDs);\n\n\t\t// Initialize Sui Client and Pyth Client\n\t\tconst wormholeStateId = this.config.pyth.wormholeStateId;\n\t\tconst pythStateId = this.config.pyth.pythStateId;\n\n\t\tconst client = new HaneulPythClient(this.client, pythStateId, wormholeStateId);\n\n\t\treturn await client.updatePriceFeeds(tx, priceUpdateData, priceIDs, feeCoin); // returns priceInfoObjectIds\n\t}\n\n\tasync getPythBaseUpdateFee(): Promise<number> {\n\t\tconst pythStateId = this.config.pyth.pythStateId;\n\t\tconst wormholeStateId = this.config.pyth.wormholeStateId;\n\n\t\tconst client = new HaneulPythClient(this.client, pythStateId, wormholeStateId);\n\t\treturn await client.getBaseUpdateFee();\n\t}\n\n\tasync getObjectType(objectId: string) {\n\t\t// Fetch the object details from the Haneul client\n\t\tconst objectResponse = await this.client.getObject({\n\t\t\tid: objectId,\n\t\t\toptions: { showType: true },\n\t\t});\n\n\t\t// Extract and return the type if available\n\t\tif (objectResponse && objectResponse.data && objectResponse.data.type) {\n\t\t\treturn objectResponse.data.type;\n\t\t}\n\n\t\t// Throw an error if the type is not found\n\t\tthrow new Error(`Type information not found for object ID: ${objectId}`);\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }