@hashgraphonline/standards-sdk 0.1.162 → 0.1.163

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.
@@ -1,245 +1,76 @@
1
- import { skillVerificationStatusResponseSchema, skillRegistryConfigResponseSchema, skillRegistryListResponseSchema, skillRegistryVersionsResponseSchema, skillRegistryMineResponseSchema, skillRegistryMyListResponseSchema, skillRegistryQuoteResponseSchema, skillRegistryPublishResponseSchema, skillRegistryJobStatusResponseSchema, skillRegistryOwnershipResponseSchema, skillRegistryVoteStatusResponseSchema, skillVerificationRequestCreateResponseSchema } from "./standards-sdk.es140.js";
2
- async function skillsConfig(client) {
3
- const raw = await client.requestJson("/skills/config", {
4
- method: "GET"
5
- });
6
- return client.parseWithSchema(
7
- raw,
8
- skillRegistryConfigResponseSchema,
9
- "skill registry config response"
10
- );
1
+ import BigNumber from "bignumber.js";
2
+ const TINYBAR_DIVISOR = 1e8;
3
+ function safePositiveTransfers(transfers) {
4
+ if (!Array.isArray(transfers)) {
5
+ return [];
6
+ }
7
+ return transfers.filter(
8
+ (transfer) => typeof transfer.amount === "number" && transfer.amount > 0
9
+ ).map((transfer) => ({
10
+ account: transfer.account,
11
+ amountTinybar: transfer.amount
12
+ }));
11
13
  }
12
- async function listSkills(client, params = {}) {
13
- const query = new URLSearchParams();
14
- if (params.name) {
15
- query.set("name", params.name);
16
- }
17
- if (params.version) {
18
- query.set("version", params.version);
19
- }
20
- if (typeof params.limit === "number" && Number.isFinite(params.limit)) {
21
- query.set("limit", String(Math.trunc(params.limit)));
22
- }
23
- if (params.cursor) {
24
- query.set("cursor", params.cursor);
25
- }
26
- if (typeof params.includeFiles === "boolean") {
27
- query.set("includeFiles", params.includeFiles ? "true" : "false");
28
- }
29
- if (params.accountId) {
30
- query.set("accountId", params.accountId);
14
+ function resolvePayerDebitTinybar(transfers, payerAccountId) {
15
+ if (!Array.isArray(transfers)) {
16
+ return null;
31
17
  }
32
- const suffix = query.size > 0 ? `?${query.toString()}` : "";
33
- const raw = await client.requestJson(`/skills${suffix}`, {
34
- method: "GET"
35
- });
36
- return client.parseWithSchema(
37
- raw,
38
- skillRegistryListResponseSchema,
39
- "skill registry list response"
18
+ const payerDebit = transfers.find(
19
+ (transfer) => transfer.account === payerAccountId && typeof transfer.amount === "number" && transfer.amount < 0
40
20
  );
41
- }
42
- async function listSkillVersions(client, params) {
43
- const normalizedName = params.name.trim();
44
- if (!normalizedName) {
45
- throw new Error("name is required");
21
+ if (!payerDebit || typeof payerDebit.amount !== "number") {
22
+ return null;
46
23
  }
47
- const query = new URLSearchParams();
48
- query.set("name", normalizedName);
49
- const raw = await client.requestJson(
50
- `/skills/versions?${query.toString()}`,
51
- { method: "GET" }
52
- );
53
- return client.parseWithSchema(
54
- raw,
55
- skillRegistryVersionsResponseSchema,
56
- "skill registry versions response"
57
- );
24
+ return Math.abs(payerDebit.amount);
58
25
  }
59
- async function listMySkills(client, params = {}) {
60
- const query = new URLSearchParams();
61
- if (typeof params.limit === "number" && Number.isFinite(params.limit)) {
62
- query.set("limit", String(Math.trunc(params.limit)));
63
- }
64
- const suffix = query.size > 0 ? `?${query.toString()}` : "";
65
- const raw = await client.requestJson(`/skills/mine${suffix}`, {
66
- method: "GET"
67
- });
68
- return client.parseWithSchema(
69
- raw,
70
- skillRegistryMineResponseSchema,
71
- "skill registry mine response"
72
- );
26
+ function toHbarString(tinybar) {
27
+ return new BigNumber(tinybar).dividedBy(TINYBAR_DIVISOR).toFixed();
73
28
  }
74
- async function getMySkillsList(client, params = {}) {
75
- const query = new URLSearchParams();
76
- if (typeof params.limit === "number" && Number.isFinite(params.limit)) {
77
- query.set("limit", String(Math.trunc(params.limit)));
29
+ function fallbackFeeTinybar(chargedTxFee) {
30
+ if (typeof chargedTxFee !== "number" || !Number.isFinite(chargedTxFee)) {
31
+ return null;
78
32
  }
79
- if (params.cursor) {
80
- query.set("cursor", params.cursor);
33
+ if (chargedTxFee <= 0) {
34
+ return null;
81
35
  }
82
- if (params.accountId) {
83
- query.set("accountId", params.accountId);
84
- }
85
- const suffix = query.size > 0 ? `?${query.toString()}` : "";
86
- const raw = await client.requestJson(`/skills/my-list${suffix}`, {
87
- method: "GET"
88
- });
89
- return client.parseWithSchema(
90
- raw,
91
- skillRegistryMyListResponseSchema,
92
- "skill registry my list response"
93
- );
94
- }
95
- async function quoteSkillPublish(client, payload) {
96
- const raw = await client.requestJson("/skills/quote", {
97
- method: "POST",
98
- body: payload,
99
- headers: { "content-type": "application/json" }
100
- });
101
- return client.parseWithSchema(
102
- raw,
103
- skillRegistryQuoteResponseSchema,
104
- "skill registry quote response"
105
- );
106
- }
107
- async function publishSkill(client, payload) {
108
- const raw = await client.requestJson("/skills/publish", {
109
- method: "POST",
110
- body: payload,
111
- headers: { "content-type": "application/json" }
112
- });
113
- return client.parseWithSchema(
114
- raw,
115
- skillRegistryPublishResponseSchema,
116
- "skill registry publish response"
117
- );
118
- }
119
- async function getSkillPublishJob(client, jobId, params = {}) {
120
- const normalized = jobId.trim();
121
- if (!normalized) {
122
- throw new Error("jobId is required");
123
- }
124
- const query = new URLSearchParams();
125
- if (params.accountId) {
126
- query.set("accountId", params.accountId);
127
- }
128
- const suffix = query.size > 0 ? `?${query.toString()}` : "";
129
- const raw = await client.requestJson(
130
- `/skills/jobs/${encodeURIComponent(normalized)}${suffix}`,
131
- { method: "GET" }
132
- );
133
- return client.parseWithSchema(
134
- raw,
135
- skillRegistryJobStatusResponseSchema,
136
- "skill registry job status response"
137
- );
36
+ return chargedTxFee;
138
37
  }
139
- async function getSkillOwnership(client, params) {
140
- const normalizedName = params.name.trim();
141
- if (!normalizedName) {
142
- throw new Error("name is required");
143
- }
144
- const query = new URLSearchParams();
145
- query.set("name", normalizedName);
146
- if (params.accountId) {
147
- query.set("accountId", params.accountId);
148
- }
149
- const raw = await client.requestJson(
150
- `/skills/ownership?${query.toString()}`,
38
+ function computeInscriptionCostSummary(params) {
39
+ const { txn, payerAccountId } = params;
40
+ const positiveTransfers = safePositiveTransfers(txn.transfers);
41
+ const payerDebitTinybar = resolvePayerDebitTinybar(
42
+ txn.transfers,
43
+ payerAccountId
44
+ );
45
+ const transferOutflowTinybar = payerDebitTinybar ?? positiveTransfers.reduce((sum, t) => sum + t.amountTinybar, 0);
46
+ const chargedFeeTinybar = fallbackFeeTinybar(txn.charged_tx_fee);
47
+ const resolvedTotalTinybar = transferOutflowTinybar > 0 ? transferOutflowTinybar : chargedFeeTinybar;
48
+ if (!resolvedTotalTinybar || resolvedTotalTinybar <= 0) {
49
+ return null;
50
+ }
51
+ const totalCostHbar = toHbarString(resolvedTotalTinybar);
52
+ const breakdownTransfers = positiveTransfers.length > 0 ? positiveTransfers.map((transfer) => ({
53
+ to: transfer.account,
54
+ amount: toHbarString(transfer.amountTinybar),
55
+ description: `HBAR transfer from ${payerAccountId}`
56
+ })) : [
151
57
  {
152
- method: "GET"
58
+ to: "Hedera network",
59
+ amount: totalCostHbar,
60
+ description: `Transaction fee debited from ${payerAccountId}`
153
61
  }
154
- );
155
- return client.parseWithSchema(
156
- raw,
157
- skillRegistryOwnershipResponseSchema,
158
- "skill registry ownership response"
159
- );
160
- }
161
- async function getSkillVoteStatus(client, params) {
162
- const normalizedName = params.name.trim();
163
- if (!normalizedName) {
164
- throw new Error("name is required");
165
- }
166
- const query = new URLSearchParams();
167
- query.set("name", normalizedName);
168
- const raw = await client.requestJson(
169
- `/skills/vote?${query.toString()}`,
170
- { method: "GET" }
171
- );
172
- return client.parseWithSchema(
173
- raw,
174
- skillRegistryVoteStatusResponseSchema,
175
- "skill registry vote status response"
176
- );
177
- }
178
- async function setSkillVote(client, payload) {
179
- const normalizedName = payload.name.trim();
180
- if (!normalizedName) {
181
- throw new Error("name is required");
182
- }
183
- const raw = await client.requestJson("/skills/vote", {
184
- method: "POST",
185
- body: { name: normalizedName, upvoted: payload.upvoted },
186
- headers: { "content-type": "application/json" }
187
- });
188
- return client.parseWithSchema(
189
- raw,
190
- skillRegistryVoteStatusResponseSchema,
191
- "skill registry vote status response"
192
- );
193
- }
194
- async function requestSkillVerification(client, payload) {
195
- const normalizedName = payload.name.trim();
196
- if (!normalizedName) {
197
- throw new Error("name is required");
198
- }
199
- const raw = await client.requestJson(
200
- "/skills/verification/request",
201
- {
202
- method: "POST",
203
- body: { name: normalizedName, tier: payload.tier },
204
- headers: { "content-type": "application/json" }
62
+ ];
63
+ return {
64
+ totalTinybar: resolvedTotalTinybar,
65
+ summary: {
66
+ totalCostHbar,
67
+ breakdown: {
68
+ transfers: breakdownTransfers
69
+ }
205
70
  }
206
- );
207
- return client.parseWithSchema(
208
- raw,
209
- skillVerificationRequestCreateResponseSchema,
210
- "skill verification request create response"
211
- );
212
- }
213
- async function getSkillVerificationStatus(client, params) {
214
- const normalizedName = params.name.trim();
215
- if (!normalizedName) {
216
- throw new Error("name is required");
217
- }
218
- const query = new URLSearchParams();
219
- query.set("name", normalizedName);
220
- const raw = await client.requestJson(
221
- `/skills/verification/status?${query.toString()}`,
222
- { method: "GET" }
223
- );
224
- return client.parseWithSchema(
225
- raw,
226
- skillVerificationStatusResponseSchema,
227
- "skill verification status response"
228
- );
71
+ };
229
72
  }
230
73
  export {
231
- getMySkillsList,
232
- getSkillOwnership,
233
- getSkillPublishJob,
234
- getSkillVerificationStatus,
235
- getSkillVoteStatus,
236
- listMySkills,
237
- listSkillVersions,
238
- listSkills,
239
- publishSkill,
240
- quoteSkillPublish,
241
- requestSkillVerification,
242
- setSkillVote,
243
- skillsConfig
74
+ computeInscriptionCostSummary
244
75
  };
245
76
  //# sourceMappingURL=standards-sdk.es162.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es162.js","sources":["../../src/services/registry-broker/client/skills.ts"],"sourcesContent":["import type {\n JsonValue,\n SkillRegistryConfigResponse,\n SkillRegistryJobStatusResponse,\n SkillRegistryListResponse,\n SkillRegistryMineResponse,\n SkillRegistryMyListResponse,\n SkillRegistryOwnershipResponse,\n SkillRegistryPublishRequest,\n SkillRegistryPublishResponse,\n SkillRegistryQuoteRequest,\n SkillRegistryQuoteResponse,\n SkillRegistryVoteRequest,\n SkillRegistryVoteStatusResponse,\n SkillRegistryVersionsResponse,\n SkillVerificationRequestCreateRequest,\n SkillVerificationRequestCreateResponse,\n SkillVerificationStatusResponse,\n} from '../types';\nimport {\n skillRegistryConfigResponseSchema,\n skillRegistryJobStatusResponseSchema,\n skillRegistryListResponseSchema,\n skillRegistryMineResponseSchema,\n skillRegistryMyListResponseSchema,\n skillRegistryOwnershipResponseSchema,\n skillRegistryPublishResponseSchema,\n skillRegistryQuoteResponseSchema,\n skillRegistryVoteStatusResponseSchema,\n skillRegistryVersionsResponseSchema,\n skillVerificationRequestCreateResponseSchema,\n skillVerificationStatusResponseSchema,\n} from '../schemas';\nimport type { RegistryBrokerClient } from './base-client';\n\nexport async function skillsConfig(\n client: RegistryBrokerClient,\n): Promise<SkillRegistryConfigResponse> {\n const raw = await client.requestJson<JsonValue>('/skills/config', {\n method: 'GET',\n });\n return client.parseWithSchema(\n raw,\n skillRegistryConfigResponseSchema,\n 'skill registry config response',\n );\n}\n\nexport async function listSkills(\n client: RegistryBrokerClient,\n params: {\n name?: string;\n version?: string;\n limit?: number;\n cursor?: string;\n includeFiles?: boolean;\n accountId?: string;\n } = {},\n): Promise<SkillRegistryListResponse> {\n const query = new URLSearchParams();\n if (params.name) {\n query.set('name', params.name);\n }\n if (params.version) {\n query.set('version', params.version);\n }\n if (typeof params.limit === 'number' && Number.isFinite(params.limit)) {\n query.set('limit', String(Math.trunc(params.limit)));\n }\n if (params.cursor) {\n query.set('cursor', params.cursor);\n }\n if (typeof params.includeFiles === 'boolean') {\n query.set('includeFiles', params.includeFiles ? 'true' : 'false');\n }\n if (params.accountId) {\n query.set('accountId', params.accountId);\n }\n\n const suffix = query.size > 0 ? `?${query.toString()}` : '';\n\n const raw = await client.requestJson<JsonValue>(`/skills${suffix}`, {\n method: 'GET',\n });\n\n return client.parseWithSchema(\n raw,\n skillRegistryListResponseSchema,\n 'skill registry list response',\n );\n}\n\nexport async function listSkillVersions(\n client: RegistryBrokerClient,\n params: { name: string },\n): Promise<SkillRegistryVersionsResponse> {\n const normalizedName = params.name.trim();\n if (!normalizedName) {\n throw new Error('name is required');\n }\n\n const query = new URLSearchParams();\n query.set('name', normalizedName);\n\n const raw = await client.requestJson<JsonValue>(\n `/skills/versions?${query.toString()}`,\n { method: 'GET' },\n );\n\n return client.parseWithSchema(\n raw,\n skillRegistryVersionsResponseSchema,\n 'skill registry versions response',\n );\n}\n\nexport async function listMySkills(\n client: RegistryBrokerClient,\n params: { limit?: number } = {},\n): Promise<SkillRegistryMineResponse> {\n const query = new URLSearchParams();\n if (typeof params.limit === 'number' && Number.isFinite(params.limit)) {\n query.set('limit', String(Math.trunc(params.limit)));\n }\n const suffix = query.size > 0 ? `?${query.toString()}` : '';\n\n const raw = await client.requestJson<JsonValue>(`/skills/mine${suffix}`, {\n method: 'GET',\n });\n\n return client.parseWithSchema(\n raw,\n skillRegistryMineResponseSchema,\n 'skill registry mine response',\n );\n}\n\nexport async function getMySkillsList(\n client: RegistryBrokerClient,\n params: { limit?: number; cursor?: string; accountId?: string } = {},\n): Promise<SkillRegistryMyListResponse> {\n const query = new URLSearchParams();\n if (typeof params.limit === 'number' && Number.isFinite(params.limit)) {\n query.set('limit', String(Math.trunc(params.limit)));\n }\n if (params.cursor) {\n query.set('cursor', params.cursor);\n }\n if (params.accountId) {\n query.set('accountId', params.accountId);\n }\n const suffix = query.size > 0 ? `?${query.toString()}` : '';\n\n const raw = await client.requestJson<JsonValue>(`/skills/my-list${suffix}`, {\n method: 'GET',\n });\n\n return client.parseWithSchema(\n raw,\n skillRegistryMyListResponseSchema,\n 'skill registry my list response',\n );\n}\n\nexport async function quoteSkillPublish(\n client: RegistryBrokerClient,\n payload: SkillRegistryQuoteRequest,\n): Promise<SkillRegistryQuoteResponse> {\n const raw = await client.requestJson<JsonValue>('/skills/quote', {\n method: 'POST',\n body: payload,\n headers: { 'content-type': 'application/json' },\n });\n\n return client.parseWithSchema(\n raw,\n skillRegistryQuoteResponseSchema,\n 'skill registry quote response',\n );\n}\n\nexport async function publishSkill(\n client: RegistryBrokerClient,\n payload: SkillRegistryPublishRequest,\n): Promise<SkillRegistryPublishResponse> {\n const raw = await client.requestJson<JsonValue>('/skills/publish', {\n method: 'POST',\n body: payload,\n headers: { 'content-type': 'application/json' },\n });\n\n return client.parseWithSchema(\n raw,\n skillRegistryPublishResponseSchema,\n 'skill registry publish response',\n );\n}\n\nexport async function getSkillPublishJob(\n client: RegistryBrokerClient,\n jobId: string,\n params: { accountId?: string } = {},\n): Promise<SkillRegistryJobStatusResponse> {\n const normalized = jobId.trim();\n if (!normalized) {\n throw new Error('jobId is required');\n }\n\n const query = new URLSearchParams();\n if (params.accountId) {\n query.set('accountId', params.accountId);\n }\n const suffix = query.size > 0 ? `?${query.toString()}` : '';\n\n const raw = await client.requestJson<JsonValue>(\n `/skills/jobs/${encodeURIComponent(normalized)}${suffix}`,\n { method: 'GET' },\n );\n\n return client.parseWithSchema(\n raw,\n skillRegistryJobStatusResponseSchema,\n 'skill registry job status response',\n );\n}\n\nexport async function getSkillOwnership(\n client: RegistryBrokerClient,\n params: { name: string; accountId?: string },\n): Promise<SkillRegistryOwnershipResponse> {\n const normalizedName = params.name.trim();\n if (!normalizedName) {\n throw new Error('name is required');\n }\n\n const query = new URLSearchParams();\n query.set('name', normalizedName);\n if (params.accountId) {\n query.set('accountId', params.accountId);\n }\n\n const raw = await client.requestJson<JsonValue>(\n `/skills/ownership?${query.toString()}`,\n {\n method: 'GET',\n },\n );\n\n return client.parseWithSchema(\n raw,\n skillRegistryOwnershipResponseSchema,\n 'skill registry ownership response',\n );\n}\n\nexport async function getSkillVoteStatus(\n client: RegistryBrokerClient,\n params: { name: string },\n): Promise<SkillRegistryVoteStatusResponse> {\n const normalizedName = params.name.trim();\n if (!normalizedName) {\n throw new Error('name is required');\n }\n\n const query = new URLSearchParams();\n query.set('name', normalizedName);\n\n const raw = await client.requestJson<JsonValue>(\n `/skills/vote?${query.toString()}`,\n { method: 'GET' },\n );\n\n return client.parseWithSchema(\n raw,\n skillRegistryVoteStatusResponseSchema,\n 'skill registry vote status response',\n );\n}\n\nexport async function setSkillVote(\n client: RegistryBrokerClient,\n payload: SkillRegistryVoteRequest,\n): Promise<SkillRegistryVoteStatusResponse> {\n const normalizedName = payload.name.trim();\n if (!normalizedName) {\n throw new Error('name is required');\n }\n\n const raw = await client.requestJson<JsonValue>('/skills/vote', {\n method: 'POST',\n body: { name: normalizedName, upvoted: payload.upvoted },\n headers: { 'content-type': 'application/json' },\n });\n\n return client.parseWithSchema(\n raw,\n skillRegistryVoteStatusResponseSchema,\n 'skill registry vote status response',\n );\n}\n\nexport async function requestSkillVerification(\n client: RegistryBrokerClient,\n payload: SkillVerificationRequestCreateRequest,\n): Promise<SkillVerificationRequestCreateResponse> {\n const normalizedName = payload.name.trim();\n if (!normalizedName) {\n throw new Error('name is required');\n }\n\n const raw = await client.requestJson<JsonValue>(\n '/skills/verification/request',\n {\n method: 'POST',\n body: { name: normalizedName, tier: payload.tier },\n headers: { 'content-type': 'application/json' },\n },\n );\n\n return client.parseWithSchema(\n raw,\n skillVerificationRequestCreateResponseSchema,\n 'skill verification request create response',\n );\n}\n\nexport async function getSkillVerificationStatus(\n client: RegistryBrokerClient,\n params: { name: string },\n): Promise<SkillVerificationStatusResponse> {\n const normalizedName = params.name.trim();\n if (!normalizedName) {\n throw new Error('name is required');\n }\n\n const query = new URLSearchParams();\n query.set('name', normalizedName);\n\n const raw = await client.requestJson<JsonValue>(\n `/skills/verification/status?${query.toString()}`,\n { method: 'GET' },\n );\n\n return client.parseWithSchema(\n raw,\n skillVerificationStatusResponseSchema,\n 'skill verification status response',\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es162.js","sources":["../../src/inscribe/inscription-cost.ts"],"sourcesContent":["import BigNumber from 'bignumber.js';\nimport { Transaction } from '../services/types';\nimport { QuoteResult, InscriptionCostSummary } from './types';\n\nconst TINYBAR_DIVISOR = 100000000;\n\ntype MirrorNodeTransactionLike = Pick<\n Transaction,\n 'charged_tx_fee' | 'transfers'\n>;\n\ntype CostTransfer = QuoteResult['breakdown']['transfers'][number];\n\nfunction safePositiveTransfers(\n transfers: Transaction['transfers'] | undefined,\n): Array<{ account: string; amountTinybar: number }> {\n if (!Array.isArray(transfers)) {\n return [];\n }\n\n return transfers\n .filter(\n transfer => typeof transfer.amount === 'number' && transfer.amount > 0,\n )\n .map(transfer => ({\n account: transfer.account,\n amountTinybar: transfer.amount,\n }));\n}\n\nfunction resolvePayerDebitTinybar(\n transfers: Transaction['transfers'] | undefined,\n payerAccountId: string,\n): number | null {\n if (!Array.isArray(transfers)) {\n return null;\n }\n\n const payerDebit = transfers.find(\n transfer =>\n transfer.account === payerAccountId &&\n typeof transfer.amount === 'number' &&\n transfer.amount < 0,\n );\n\n if (!payerDebit || typeof payerDebit.amount !== 'number') {\n return null;\n }\n\n return Math.abs(payerDebit.amount);\n}\n\nfunction toHbarString(tinybar: number): string {\n return new BigNumber(tinybar).dividedBy(TINYBAR_DIVISOR).toFixed();\n}\n\nfunction fallbackFeeTinybar(chargedTxFee: unknown): number | null {\n if (typeof chargedTxFee !== 'number' || !Number.isFinite(chargedTxFee)) {\n return null;\n }\n if (chargedTxFee <= 0) {\n return null;\n }\n return chargedTxFee;\n}\n\nexport function computeInscriptionCostSummary(params: {\n txn: MirrorNodeTransactionLike;\n payerAccountId: string;\n}): { summary: InscriptionCostSummary; totalTinybar: number } | null {\n const { txn, payerAccountId } = params;\n\n const positiveTransfers = safePositiveTransfers(txn.transfers);\n const payerDebitTinybar = resolvePayerDebitTinybar(\n txn.transfers,\n payerAccountId,\n );\n\n const transferOutflowTinybar =\n payerDebitTinybar ??\n positiveTransfers.reduce((sum, t) => sum + t.amountTinybar, 0);\n const chargedFeeTinybar = fallbackFeeTinybar(txn.charged_tx_fee);\n\n const resolvedTotalTinybar =\n transferOutflowTinybar > 0 ? transferOutflowTinybar : chargedFeeTinybar;\n\n if (!resolvedTotalTinybar || resolvedTotalTinybar <= 0) {\n return null;\n }\n\n const totalCostHbar = toHbarString(resolvedTotalTinybar);\n\n const breakdownTransfers: CostTransfer[] =\n positiveTransfers.length > 0\n ? positiveTransfers.map(transfer => ({\n to: transfer.account,\n amount: toHbarString(transfer.amountTinybar),\n description: `HBAR transfer from ${payerAccountId}`,\n }))\n : [\n {\n to: 'Hedera network',\n amount: totalCostHbar,\n description: `Transaction fee debited from ${payerAccountId}`,\n },\n ];\n\n return {\n totalTinybar: resolvedTotalTinybar,\n summary: {\n totalCostHbar,\n breakdown: {\n transfers: breakdownTransfers,\n },\n },\n };\n}\n"],"names":[],"mappings":";AAIA,MAAM,kBAAkB;AASxB,SAAS,sBACP,WACmD;AACnD,MAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,WAAO,CAAA;AAAA,EACT;AAEA,SAAO,UACJ;AAAA,IACC,cAAY,OAAO,SAAS,WAAW,YAAY,SAAS,SAAS;AAAA,EAAA,EAEtE,IAAI,CAAA,cAAa;AAAA,IAChB,SAAS,SAAS;AAAA,IAClB,eAAe,SAAS;AAAA,EAAA,EACxB;AACN;AAEA,SAAS,yBACP,WACA,gBACe;AACf,MAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,UAAU;AAAA,IAC3B,CAAA,aACE,SAAS,YAAY,kBACrB,OAAO,SAAS,WAAW,YAC3B,SAAS,SAAS;AAAA,EAAA;AAGtB,MAAI,CAAC,cAAc,OAAO,WAAW,WAAW,UAAU;AACxD,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,WAAW,MAAM;AACnC;AAEA,SAAS,aAAa,SAAyB;AAC7C,SAAO,IAAI,UAAU,OAAO,EAAE,UAAU,eAAe,EAAE,QAAA;AAC3D;AAEA,SAAS,mBAAmB,cAAsC;AAChE,MAAI,OAAO,iBAAiB,YAAY,CAAC,OAAO,SAAS,YAAY,GAAG;AACtE,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,GAAG;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,8BAA8B,QAGuB;AACnE,QAAM,EAAE,KAAK,eAAA,IAAmB;AAEhC,QAAM,oBAAoB,sBAAsB,IAAI,SAAS;AAC7D,QAAM,oBAAoB;AAAA,IACxB,IAAI;AAAA,IACJ;AAAA,EAAA;AAGF,QAAM,yBACJ,qBACA,kBAAkB,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,eAAe,CAAC;AAC/D,QAAM,oBAAoB,mBAAmB,IAAI,cAAc;AAE/D,QAAM,uBACJ,yBAAyB,IAAI,yBAAyB;AAExD,MAAI,CAAC,wBAAwB,wBAAwB,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,aAAa,oBAAoB;AAEvD,QAAM,qBACJ,kBAAkB,SAAS,IACvB,kBAAkB,IAAI,CAAA,cAAa;AAAA,IACjC,IAAI,SAAS;AAAA,IACb,QAAQ,aAAa,SAAS,aAAa;AAAA,IAC3C,aAAa,sBAAsB,cAAc;AAAA,EAAA,EACjD,IACF;AAAA,IACE;AAAA,MACE,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,aAAa,gCAAgC,cAAc;AAAA,IAAA;AAAA,EAC7D;AAGR,SAAO;AAAA,IACL,cAAc;AAAA,IACd,SAAS;AAAA,MACP;AAAA,MACA,WAAW;AAAA,QACT,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,EACF;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es74.js","sources":["../../src/hcs-2/types.ts"],"sourcesContent":["import { Logger, LogLevel } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { TransactionReceipt, PrivateKey } from '@hashgraph/sdk';\nimport { z } from 'zod';\n\n/**\n * HCS-2 operation types\n * - register: Add a new entry/version\n * - update: Modify a previous entry (indexed topics only)\n * - delete: Remove an entry by uid (indexed topics only)\n * - migrate: Move a topic to a new one\n */\nexport enum HCS2Operation {\n REGISTER = 'register',\n UPDATE = 'update',\n DELETE = 'delete',\n MIGRATE = 'migrate',\n}\n\n/**\n * HCS-2 registry type\n * - 0: Indexed registry - All records are considered for processing\n * - 1: Non-indexed registry - Only the latest message is considered\n */\nexport enum HCS2RegistryType {\n INDEXED = 0,\n NON_INDEXED = 1,\n}\n\n/**\n * Base HCS-2 message format\n */\nexport interface HCS2Message {\n p: string; // Protocol (e.g., \"hcs-2\", \"hcs-6\", etc.)\n op: HCS2Operation; // Operation\n t_id?: string; // Target Topic ID (for register, update, migrate)\n uid?: string; // Unique ID/Sequence number (for update, delete)\n metadata?: string; // Metadata URI (HIP-412 format)\n m?: string; // Memo (max 500 chars)\n ttl?: number; // Time to live (in seconds, optional override)\n}\n\n/**\n * Register operation message\n */\nexport interface HCS2RegisterMessage extends HCS2Message {\n op: HCS2Operation.REGISTER;\n t_id: string;\n}\n\n/**\n * Update operation message\n */\nexport interface HCS2UpdateMessage extends HCS2Message {\n op: HCS2Operation.UPDATE;\n uid: string;\n t_id: string;\n}\n\n/**\n * Delete operation message\n */\nexport interface HCS2DeleteMessage extends HCS2Message {\n op: HCS2Operation.DELETE;\n uid: string;\n}\n\n/**\n * Migrate operation message\n */\nexport interface HCS2MigrateMessage extends HCS2Message {\n op: HCS2Operation.MIGRATE;\n t_id: string;\n}\n\n/**\n * Configuration for HCS-2 client\n */\nexport interface HCS2ClientConfig {\n network: NetworkType;\n logLevel?: LogLevel;\n silent?: boolean;\n mirrorNodeUrl?: string;\n logger?: Logger;\n}\n\n/**\n * Response from topic registration\n */\nexport interface TopicRegistrationResponse {\n success: boolean;\n topicId?: string;\n transactionId?: string;\n error?: string;\n}\n\n/**\n * Response from a registry operation\n */\nexport interface RegistryOperationResponse {\n success: boolean;\n transactionId?: string;\n receipt?: TransactionReceipt;\n error?: string;\n sequenceNumber?: number;\n}\n\n/**\n * Registry entry information\n */\nexport interface RegistryEntry {\n topicId: string;\n sequence: number;\n timestamp: string;\n payer: string;\n message: HCS2Message;\n consensus_timestamp: string;\n registry_type: HCS2RegistryType;\n}\n\n/**\n * Topic registry information\n */\nexport interface TopicRegistry {\n topicId: string;\n registryType: HCS2RegistryType;\n ttl: number;\n entries: RegistryEntry[];\n latestEntry?: RegistryEntry;\n}\n\n/**\n * Options for creating a new registry\n */\nexport interface CreateRegistryOptions {\n registryType?: HCS2RegistryType;\n ttl?: number;\n adminKey?: string | boolean | PrivateKey;\n submitKey?: string | boolean | PrivateKey;\n}\n\n/**\n * Options for registering a topic entry\n */\nexport interface RegisterEntryOptions {\n targetTopicId: string;\n metadata?: string;\n memo?: string;\n analyticsMemo?: string;\n registryType?: HCS2RegistryType;\n}\n\n/**\n * Options for updating a topic entry\n */\nexport interface UpdateEntryOptions {\n targetTopicId: string;\n uid: string;\n metadata?: string;\n memo?: string;\n analyticsMemo?: string;\n registryType?: HCS2RegistryType;\n}\n\n/**\n * Options for deleting a topic entry\n */\nexport interface DeleteEntryOptions {\n uid: string;\n memo?: string;\n analyticsMemo?: string;\n registryType?: HCS2RegistryType;\n}\n\n/**\n * Options for migrating a topic\n */\nexport interface MigrateTopicOptions {\n targetTopicId: string;\n metadata?: string;\n memo?: string;\n analyticsMemo?: string;\n registryType?: HCS2RegistryType;\n}\n\n/**\n * Options for querying registry entries\n */\nexport interface QueryRegistryOptions {\n limit?: number;\n order?: 'asc' | 'desc';\n skip?: number;\n}\n\n/**\n * Zod schemas for HCS-2 message validation\n */\n\nexport const topicIdSchema = z.string().regex(/^\\d+\\.\\d+\\.\\d+$/, {\n message: \"Topic ID must be in Hedera format (e.g., '0.0.123456')\",\n});\n\nexport const baseMessageSchema = z.object({\n p: z.string().regex(/^hcs-\\d+$/, {\n message: \"Protocol must be in format 'hcs-N' where N is a number\",\n }),\n op: z.enum([\n HCS2Operation.REGISTER,\n HCS2Operation.UPDATE,\n HCS2Operation.DELETE,\n HCS2Operation.MIGRATE,\n ]),\n m: z.string().max(500, 'Memo must not exceed 500 characters').optional(),\n ttl: z.number().int().positive().optional(),\n});\n\nexport const registerMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS2Operation.REGISTER),\n t_id: topicIdSchema,\n metadata: z.string().optional(),\n});\n\nexport const updateMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS2Operation.UPDATE),\n uid: z.string(),\n t_id: topicIdSchema,\n metadata: z.string().optional(),\n});\n\nexport const deleteMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS2Operation.DELETE),\n uid: z.string(),\n});\n\nexport const migrateMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS2Operation.MIGRATE),\n t_id: topicIdSchema,\n metadata: z.string().optional(),\n});\n\nexport const hcs2MessageSchema = z.discriminatedUnion('op', [\n registerMessageSchema,\n updateMessageSchema,\n deleteMessageSchema,\n migrateMessageSchema,\n]);\n"],"names":["HCS2Operation","HCS2RegistryType"],"mappings":";AAaO,IAAK,kCAAAA,mBAAL;AACLA,iBAAA,UAAA,IAAW;AACXA,iBAAA,QAAA,IAAS;AACTA,iBAAA,QAAA,IAAS;AACTA,iBAAA,SAAA,IAAU;AAJA,SAAAA;AAAA,GAAA,iBAAA,CAAA,CAAA;AAYL,IAAK,qCAAAC,sBAAL;AACLA,oBAAAA,kBAAA,aAAU,CAAA,IAAV;AACAA,oBAAAA,kBAAA,iBAAc,CAAA,IAAd;AAFU,SAAAA;AAAA,GAAA,oBAAA,CAAA,CAAA;AA8KL,MAAM,gBAAgB,EAAE,SAAS,MAAM,mBAAmB;AAAA,EAC/D,SAAS;AACX,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,GAAG,EAAE,SAAS,MAAM,aAAa;AAAA,IAC/B,SAAS;AAAA,EAAA,CACV;AAAA,EACD,IAAI,EAAE,KAAK;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAAA,CACD;AAAA,EACD,GAAG,EAAE,OAAA,EAAS,IAAI,KAAK,qCAAqC,EAAE,SAAA;AAAA,EAC9D,KAAK,EAAE,OAAA,EAAS,MAAM,SAAA,EAAW,SAAA;AACnC,CAAC;AAEM,MAAM,wBAAwB,kBAAkB,OAAO;AAAA,EAC5D,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,MAAM;AAAA,EACN,UAAU,EAAE,OAAA,EAAS,SAAA;AACvB,CAAC;AAEM,MAAM,sBAAsB,kBAAkB,OAAO;AAAA,EAC1D,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,KAAK,EAAE,OAAA;AAAA,EACP,MAAM;AAAA,EACN,UAAU,EAAE,OAAA,EAAS,SAAA;AACvB,CAAC;AAEM,MAAM,sBAAsB,kBAAkB,OAAO;AAAA,EAC1D,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,KAAK,EAAE,OAAA;AACT,CAAC;AAEM,MAAM,uBAAuB,kBAAkB,OAAO;AAAA,EAC3D,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,MAAM;AAAA,EACN,UAAU,EAAE,OAAA,EAAS,SAAA;AACvB,CAAC;AAEM,MAAM,oBAAoB,EAAE,mBAAmB,MAAM;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;"}
1
+ {"version":3,"file":"standards-sdk.es74.js","sources":["../../src/hcs-2/types.ts"],"sourcesContent":["import { Logger, LogLevel } from '../utils/logger';\nimport { NetworkType } from '../utils/types';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { TransactionReceipt, PrivateKey } from '@hashgraph/sdk';\nimport { z } from 'zod';\n\n/**\n * HCS-2 operation types\n * - register: Add a new entry/version\n * - update: Modify a previous entry (indexed topics only)\n * - delete: Remove an entry by uid (indexed topics only)\n * - migrate: Move a topic to a new one\n */\nexport enum HCS2Operation {\n REGISTER = 'register',\n UPDATE = 'update',\n DELETE = 'delete',\n MIGRATE = 'migrate',\n}\n\n/**\n * HCS-2 registry type\n * - 0: Indexed registry - All records are considered for processing\n * - 1: Non-indexed registry - Only the latest message is considered\n */\nexport enum HCS2RegistryType {\n INDEXED = 0,\n NON_INDEXED = 1,\n}\n\n/**\n * Base HCS-2 message format\n */\nexport interface HCS2Message {\n p: string; // Protocol (e.g., \"hcs-2\", \"hcs-6\", etc.)\n op: HCS2Operation; // Operation\n t_id?: string; // Target Topic ID (for register, update, migrate)\n uid?: string; // Unique ID/Sequence number (for update, delete)\n metadata?: string; // Metadata URI (HIP-412 format)\n m?: string; // Memo (max 500 chars)\n ttl?: number; // Time to live (in seconds, optional override)\n}\n\n/**\n * Register operation message\n */\nexport interface HCS2RegisterMessage extends HCS2Message {\n op: HCS2Operation.REGISTER;\n t_id: string;\n}\n\n/**\n * Update operation message\n */\nexport interface HCS2UpdateMessage extends HCS2Message {\n op: HCS2Operation.UPDATE;\n uid: string;\n t_id: string;\n}\n\n/**\n * Delete operation message\n */\nexport interface HCS2DeleteMessage extends HCS2Message {\n op: HCS2Operation.DELETE;\n uid: string;\n}\n\n/**\n * Migrate operation message\n */\nexport interface HCS2MigrateMessage extends HCS2Message {\n op: HCS2Operation.MIGRATE;\n t_id: string;\n}\n\n/**\n * Configuration for HCS-2 client\n */\nexport interface HCS2ClientConfig {\n network: NetworkType;\n logLevel?: LogLevel;\n silent?: boolean;\n mirrorNodeUrl?: string;\n logger?: Logger;\n}\n\n/**\n * Response from topic registration\n */\nexport interface TopicRegistrationResponse {\n success: boolean;\n topicId?: string;\n transactionId?: string;\n error?: string;\n}\n\n/**\n * Response from a registry operation\n */\nexport interface RegistryOperationResponse {\n success: boolean;\n transactionId?: string;\n receipt?: TransactionReceipt;\n error?: string;\n sequenceNumber?: number;\n}\n\n/**\n * Registry entry information\n */\nexport interface RegistryEntry {\n topicId: string;\n sequence: number;\n timestamp: string;\n payer: string;\n message: HCS2Message;\n consensus_timestamp: string;\n registry_type: HCS2RegistryType;\n}\n\n/**\n * Topic registry information\n */\nexport interface TopicRegistry {\n topicId: string;\n registryType: HCS2RegistryType;\n ttl: number;\n entries: RegistryEntry[];\n latestEntry?: RegistryEntry;\n}\n\n/**\n * Options for creating a new registry\n */\nexport interface CreateRegistryOptions {\n registryType?: HCS2RegistryType;\n ttl?: number;\n adminKey?: string | boolean | PrivateKey;\n submitKey?: string | boolean | PrivateKey;\n}\n\n/**\n * Options for registering a topic entry\n */\nexport interface RegisterEntryOptions {\n targetTopicId: string;\n metadata?: string;\n memo?: string;\n analyticsMemo?: string;\n registryType?: HCS2RegistryType;\n}\n\n/**\n * Options for updating a topic entry\n */\nexport interface UpdateEntryOptions {\n targetTopicId: string;\n uid: string;\n metadata?: string;\n memo?: string;\n analyticsMemo?: string;\n registryType?: HCS2RegistryType;\n}\n\n/**\n * Options for deleting a topic entry\n */\nexport interface DeleteEntryOptions {\n uid: string;\n memo?: string;\n analyticsMemo?: string;\n registryType?: HCS2RegistryType;\n}\n\n/**\n * Options for migrating a topic\n */\nexport interface MigrateTopicOptions {\n targetTopicId: string;\n metadata?: string;\n memo?: string;\n analyticsMemo?: string;\n registryType?: HCS2RegistryType;\n}\n\n/**\n * Options for querying registry entries\n */\nexport interface QueryRegistryOptions {\n limit?: number;\n order?: 'asc' | 'desc';\n skip?: number;\n /** When true, overflow messages with data_ref are resolved via HCS-1. */\n resolveOverflow?: boolean;\n}\n\n/**\n * Zod schemas for HCS-2 message validation\n */\n\nexport const topicIdSchema = z.string().regex(/^\\d+\\.\\d+\\.\\d+$/, {\n message: \"Topic ID must be in Hedera format (e.g., '0.0.123456')\",\n});\n\nexport const baseMessageSchema = z.object({\n p: z.string().regex(/^hcs-\\d+$/, {\n message: \"Protocol must be in format 'hcs-N' where N is a number\",\n }),\n op: z.enum([\n HCS2Operation.REGISTER,\n HCS2Operation.UPDATE,\n HCS2Operation.DELETE,\n HCS2Operation.MIGRATE,\n ]),\n m: z.string().max(500, 'Memo must not exceed 500 characters').optional(),\n ttl: z.number().int().positive().optional(),\n});\n\nexport const registerMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS2Operation.REGISTER),\n t_id: topicIdSchema,\n metadata: z.string().optional(),\n});\n\nexport const updateMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS2Operation.UPDATE),\n uid: z.string(),\n t_id: topicIdSchema,\n metadata: z.string().optional(),\n});\n\nexport const deleteMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS2Operation.DELETE),\n uid: z.string(),\n});\n\nexport const migrateMessageSchema = baseMessageSchema.extend({\n op: z.literal(HCS2Operation.MIGRATE),\n t_id: topicIdSchema,\n metadata: z.string().optional(),\n});\n\nexport const hcs2MessageSchema = z.discriminatedUnion('op', [\n registerMessageSchema,\n updateMessageSchema,\n deleteMessageSchema,\n migrateMessageSchema,\n]);\n"],"names":["HCS2Operation","HCS2RegistryType"],"mappings":";AAaO,IAAK,kCAAAA,mBAAL;AACLA,iBAAA,UAAA,IAAW;AACXA,iBAAA,QAAA,IAAS;AACTA,iBAAA,QAAA,IAAS;AACTA,iBAAA,SAAA,IAAU;AAJA,SAAAA;AAAA,GAAA,iBAAA,CAAA,CAAA;AAYL,IAAK,qCAAAC,sBAAL;AACLA,oBAAAA,kBAAA,aAAU,CAAA,IAAV;AACAA,oBAAAA,kBAAA,iBAAc,CAAA,IAAd;AAFU,SAAAA;AAAA,GAAA,oBAAA,CAAA,CAAA;AAgLL,MAAM,gBAAgB,EAAE,SAAS,MAAM,mBAAmB;AAAA,EAC/D,SAAS;AACX,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,GAAG,EAAE,SAAS,MAAM,aAAa;AAAA,IAC/B,SAAS;AAAA,EAAA,CACV;AAAA,EACD,IAAI,EAAE,KAAK;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAAA,CACD;AAAA,EACD,GAAG,EAAE,OAAA,EAAS,IAAI,KAAK,qCAAqC,EAAE,SAAA;AAAA,EAC9D,KAAK,EAAE,OAAA,EAAS,MAAM,SAAA,EAAW,SAAA;AACnC,CAAC;AAEM,MAAM,wBAAwB,kBAAkB,OAAO;AAAA,EAC5D,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,MAAM;AAAA,EACN,UAAU,EAAE,OAAA,EAAS,SAAA;AACvB,CAAC;AAEM,MAAM,sBAAsB,kBAAkB,OAAO;AAAA,EAC1D,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,KAAK,EAAE,OAAA;AAAA,EACP,MAAM;AAAA,EACN,UAAU,EAAE,OAAA,EAAS,SAAA;AACvB,CAAC;AAEM,MAAM,sBAAsB,kBAAkB,OAAO;AAAA,EAC1D,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,KAAK,EAAE,OAAA;AACT,CAAC;AAEM,MAAM,uBAAuB,kBAAkB,OAAO;AAAA,EAC3D,IAAI,EAAE;AAAA,IAAQ;AAAA;AAAA,EAAA;AAAA,EACd,MAAM;AAAA,EACN,UAAU,EAAE,OAAA,EAAS,SAAA;AACvB,CAAC;AAEM,MAAM,oBAAoB,EAAE,mBAAmB,MAAM;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;"}
@@ -1,9 +1,15 @@
1
1
  import { AccountId, Client, PublicKey } from "@hashgraph/sdk";
2
+ import { randomUUID } from "crypto";
2
3
  import { HCS2BaseClient } from "./standards-sdk.es77.js";
3
4
  import { HCS2Operation, HCS2RegistryType } from "./standards-sdk.es74.js";
4
5
  import { createNodeOperatorContext } from "./standards-sdk.es153.js";
5
6
  import { buildMessageTx } from "./standards-sdk.es154.js";
6
7
  import { buildHcs2CreateRegistryTx } from "./standards-sdk.es78.js";
8
+ import { inscribe } from "./standards-sdk.es137.js";
9
+ import { InscriptionSDK } from "./standards-sdk.es155.js";
10
+ import { getTopicId } from "./standards-sdk.es127.js";
11
+ const MAX_PAYLOAD_BYTES = 1024;
12
+ const HCS1_HRL_PATTERN = /^hcs:\/\/1\/(\d+\.\d+\.\d+)$/;
7
13
  const _HCS2Client = class _HCS2Client extends HCS2BaseClient {
8
14
  /**
9
15
  * Create a new HCS-2 client
@@ -331,14 +337,39 @@ const _HCS2Client = class _HCS2Client extends HCS2BaseClient {
331
337
  let latestEntry;
332
338
  for (const msg of rawMessages) {
333
339
  try {
334
- const message = {
335
- p: "hcs-2",
340
+ let message;
341
+ message = {
342
+ p: msg.p || "hcs-2",
336
343
  op: msg.op,
337
344
  t_id: msg.t_id,
338
345
  uid: msg.uid,
339
346
  metadata: msg.metadata,
340
347
  m: msg.m
341
348
  };
349
+ if (options.resolveOverflow && typeof msg.metadata === "string" && HCS1_HRL_PATTERN.test(msg.metadata)) {
350
+ const hrlMatch = msg.metadata.match(HCS1_HRL_PATTERN);
351
+ if (hrlMatch) {
352
+ const refTopicId = hrlMatch[1];
353
+ try {
354
+ const refMessages = await this.mirrorNode.getTopicMessages(refTopicId);
355
+ if (refMessages.length > 0) {
356
+ const resolvedMsg = refMessages[0];
357
+ message = {
358
+ p: resolvedMsg.p || "hcs-2",
359
+ op: resolvedMsg.op,
360
+ t_id: resolvedMsg.t_id,
361
+ uid: resolvedMsg.uid,
362
+ metadata: resolvedMsg.metadata,
363
+ m: resolvedMsg.m
364
+ };
365
+ }
366
+ } catch (resolveErr) {
367
+ this.logger.warn(
368
+ `Failed to resolve overflow ${msg.metadata}: ${resolveErr}`
369
+ );
370
+ }
371
+ }
372
+ }
342
373
  const { valid, errors } = this.validateMessage(message);
343
374
  if (!valid) {
344
375
  this.logger.warn(`Invalid HCS-2 message: ${errors.join(", ")}`);
@@ -397,9 +428,14 @@ const _HCS2Client = class _HCS2Client extends HCS2BaseClient {
397
428
  return memoInfo.registryType;
398
429
  }
399
430
  /**
400
- * Submit a message to a topic
431
+ * Submit a message to a topic.
432
+ * If the serialized payload exceeds 1024 bytes, the full message is
433
+ * inscribed via HCS-1 (using the Inscriber) and a compact overflow
434
+ * wrapper containing the HRL reference + SHA-256 digest is submitted
435
+ * instead.
401
436
  * @param topicId The topic ID to submit to
402
437
  * @param payload The message payload
438
+ * @param analyticsMemo Optional analytics memo for the transaction
403
439
  * @returns Promise resolving to the transaction receipt
404
440
  */
405
441
  async submitMessage(topicId, payload, analyticsMemo) {
@@ -409,9 +445,64 @@ const _HCS2Client = class _HCS2Client extends HCS2BaseClient {
409
445
  if (!valid) {
410
446
  throw new Error(`Invalid HCS-2 message: ${errors.join(", ")}`);
411
447
  }
448
+ let messageString = JSON.stringify(payload);
449
+ if (Buffer.byteLength(messageString, "utf8") > MAX_PAYLOAD_BYTES) {
450
+ this.logger.info(
451
+ `HCS-2 payload exceeds ${MAX_PAYLOAD_BYTES} bytes, inscribing via HCS-1`
452
+ );
453
+ const contentBuffer = Buffer.from(messageString, "utf8");
454
+ const fileName = `hcs2-overflow-${randomUUID()}.json`;
455
+ if (this.network !== "testnet" && this.network !== "mainnet") {
456
+ throw new Error(
457
+ `Overflow inscription is only supported on testnet and mainnet, but network is ${this.network}`
458
+ );
459
+ }
460
+ const authOptions = {
461
+ accountId: this.operatorId.toString(),
462
+ privateKey: this.operatorCtx.operatorKey,
463
+ network: this.network
464
+ };
465
+ if (!this.inscriptionSDK) {
466
+ this.inscriptionSDK = await InscriptionSDK.createWithAuth({
467
+ type: "server",
468
+ ...authOptions
469
+ });
470
+ }
471
+ const inscriptionResult = await inscribe(
472
+ {
473
+ type: "buffer",
474
+ buffer: contentBuffer,
475
+ fileName,
476
+ mimeType: "application/json"
477
+ },
478
+ authOptions,
479
+ {
480
+ mode: "file",
481
+ waitForConfirmation: true,
482
+ waitMaxAttempts: 30,
483
+ waitIntervalMs: 4e3
484
+ },
485
+ this.inscriptionSDK
486
+ );
487
+ const inscriptionTopicId = getTopicId(inscriptionResult?.inscription);
488
+ if (!inscriptionTopicId) {
489
+ throw new Error(
490
+ "Failed to inscribe overflow HCS-2 payload: no topic ID returned"
491
+ );
492
+ }
493
+ const hrl = `hcs://1/${inscriptionTopicId}`;
494
+ const overflowMessage = {
495
+ ...payload,
496
+ metadata: hrl
497
+ };
498
+ this.logger.info(
499
+ `HCS-2 payload inscribed to ${hrl}, submitting overflow wrapper`
500
+ );
501
+ messageString = JSON.stringify(overflowMessage);
502
+ }
412
503
  const transaction = buildMessageTx({
413
504
  topicId,
414
- message: JSON.stringify(payload),
505
+ message: messageString,
415
506
  transactionMemo: analyticsMemo
416
507
  });
417
508
  const txResponse = await transaction.execute(this.client);