@ghostspeak/sdk 2.0.6 → 2.0.8

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 (118) hide show
  1. package/README.md +295 -30
  2. package/dist/GhostSpeakClient-bnXwUPHI.d.ts +1011 -0
  3. package/dist/StakingModule-DunDShLq.d.ts +2446 -0
  4. package/dist/{agent-M74TCRON.js → agent-S42FIMR7.js} +4 -4
  5. package/dist/{agent-M74TCRON.js.map → agent-S42FIMR7.js.map} +1 -1
  6. package/dist/batch-operations-45CQFEID.js +4 -0
  7. package/dist/batch-operations-45CQFEID.js.map +1 -0
  8. package/dist/browser-CI5_6Gzk.d.ts +234 -0
  9. package/dist/browser.d.ts +6 -576
  10. package/dist/browser.js +15 -842
  11. package/dist/browser.js.map +1 -1
  12. package/dist/chunk-46QWY3MG.js +156 -0
  13. package/dist/chunk-46QWY3MG.js.map +1 -0
  14. package/dist/{chunk-F3DZMBUA.js → chunk-5QBSC4T4.js} +327 -493
  15. package/dist/chunk-5QBSC4T4.js.map +1 -0
  16. package/dist/chunk-5QZVFUXB.js +4176 -0
  17. package/dist/chunk-5QZVFUXB.js.map +1 -0
  18. package/dist/chunk-6XCCMJ6M.js +1865 -0
  19. package/dist/chunk-6XCCMJ6M.js.map +1 -0
  20. package/dist/chunk-A7ALCVUI.js +98 -0
  21. package/dist/chunk-A7ALCVUI.js.map +1 -0
  22. package/dist/chunk-AWMGX3OX.js +814 -0
  23. package/dist/chunk-AWMGX3OX.js.map +1 -0
  24. package/dist/chunk-BF3IQ35I.js +284 -0
  25. package/dist/chunk-BF3IQ35I.js.map +1 -0
  26. package/dist/chunk-BQDGRTVP.js +168 -0
  27. package/dist/chunk-BQDGRTVP.js.map +1 -0
  28. package/dist/chunk-IQM5RASO.js +8502 -0
  29. package/dist/chunk-IQM5RASO.js.map +1 -0
  30. package/dist/chunk-JYXSOXCP.js +3850 -0
  31. package/dist/chunk-JYXSOXCP.js.map +1 -0
  32. package/dist/chunk-OXA7MECJ.js +7787 -0
  33. package/dist/chunk-OXA7MECJ.js.map +1 -0
  34. package/dist/chunk-QLRWUHN2.js +231 -0
  35. package/dist/chunk-QLRWUHN2.js.map +1 -0
  36. package/dist/chunk-SKMJJ3Q6.js +125 -0
  37. package/dist/chunk-SKMJJ3Q6.js.map +1 -0
  38. package/dist/chunk-TTB4OS2D.js +69 -0
  39. package/dist/chunk-TTB4OS2D.js.map +1 -0
  40. package/dist/chunk-UP2VWCW5.js +33 -0
  41. package/dist/{chunk-NSBPE2FW.js.map → chunk-UP2VWCW5.js.map} +1 -1
  42. package/dist/{chunk-UJUGGLMT.js → chunk-VQZQCHUT.js} +5 -5
  43. package/dist/{chunk-UJUGGLMT.js.map → chunk-VQZQCHUT.js.map} +1 -1
  44. package/dist/client.d.ts +4 -4
  45. package/dist/client.js +11 -10
  46. package/dist/createAgentAuthorization-KGZNXZBT.js +5 -0
  47. package/dist/createAgentAuthorization-KGZNXZBT.js.map +1 -0
  48. package/dist/credentials.js +1 -1
  49. package/dist/crypto.js +2 -2
  50. package/dist/errors.js +1 -1
  51. package/dist/feature-flags-B1g0DCPe.d.ts +1181 -0
  52. package/dist/generated-QJREJQ2C.js +9 -0
  53. package/dist/{generated-VNLHMR6Y.js.map → generated-QJREJQ2C.js.map} +1 -1
  54. package/dist/{ghostspeak_wasm-SB2RPJ3D.js → ghostspeak_wasm-F227HOSM.js} +3 -3
  55. package/dist/{ghostspeak_wasm-SB2RPJ3D.js.map → ghostspeak_wasm-F227HOSM.js.map} +1 -1
  56. package/dist/index.d.ts +1179 -1498
  57. package/dist/index.js +356 -3578
  58. package/dist/index.js.map +1 -1
  59. package/dist/metafile-esm.json +1 -1
  60. package/dist/minimal/core-minimal.d.ts +2446 -1245
  61. package/dist/minimal/core-minimal.js +9 -9
  62. package/dist/minimal/core-minimal.js.map +1 -1
  63. package/dist/nacl-fast-W5BJ3KZ2.js +2229 -0
  64. package/dist/nacl-fast-W5BJ3KZ2.js.map +1 -0
  65. package/dist/pda-4KP7CURF.js +4 -0
  66. package/dist/pda-4KP7CURF.js.map +1 -0
  67. package/dist/pda-Ce7VYg4T.d.ts +25 -0
  68. package/dist/reputation-types-Yebf0Rm_.d.ts +1071 -0
  69. package/dist/revokeAuthorization-2ZRO6GUZ.js +5 -0
  70. package/dist/revokeAuthorization-2ZRO6GUZ.js.map +1 -0
  71. package/dist/signature-verification-DGxR4aYQ.d.ts +448 -0
  72. package/dist/types.js +1 -1
  73. package/dist/updateReputationWithAuth-PCEUOCFV.js +5 -0
  74. package/dist/updateReputationWithAuth-PCEUOCFV.js.map +1 -0
  75. package/dist/utils.d.ts +69 -203
  76. package/dist/utils.js +15 -153
  77. package/dist/utils.js.map +1 -1
  78. package/package.json +27 -34
  79. package/dist/.tsbuildinfo +0 -1
  80. package/dist/GhostSpeakClient-D_66Uzsf.d.ts +0 -707
  81. package/dist/GovernanceModule-DQYYys-H.d.ts +0 -1766
  82. package/dist/chunk-APCKGD23.js +0 -1328
  83. package/dist/chunk-APCKGD23.js.map +0 -1
  84. package/dist/chunk-ASQXX4IT.js +0 -572
  85. package/dist/chunk-ASQXX4IT.js.map +0 -1
  86. package/dist/chunk-COGZFWOT.js +0 -19657
  87. package/dist/chunk-COGZFWOT.js.map +0 -1
  88. package/dist/chunk-F3DZMBUA.js.map +0 -1
  89. package/dist/chunk-GMHIUK2R.js +0 -7526
  90. package/dist/chunk-GMHIUK2R.js.map +0 -1
  91. package/dist/chunk-IAWBZYPE.js +0 -356
  92. package/dist/chunk-IAWBZYPE.js.map +0 -1
  93. package/dist/chunk-NSBPE2FW.js +0 -15
  94. package/dist/chunk-OWYHJG6H.js +0 -13311
  95. package/dist/chunk-OWYHJG6H.js.map +0 -1
  96. package/dist/chunk-RDDPOFR5.js +0 -3
  97. package/dist/chunk-RDDPOFR5.js.map +0 -1
  98. package/dist/chunk-RERCHKZP.js +0 -35
  99. package/dist/chunk-RERCHKZP.js.map +0 -1
  100. package/dist/chunk-TVVGXYCI.js +0 -2887
  101. package/dist/chunk-TVVGXYCI.js.map +0 -1
  102. package/dist/chunk-ZGP5552B.js +0 -377
  103. package/dist/chunk-ZGP5552B.js.map +0 -1
  104. package/dist/chunk-ZWOYNHVK.js +0 -196
  105. package/dist/chunk-ZWOYNHVK.js.map +0 -1
  106. package/dist/dist/.tsbuildinfo +0 -1
  107. package/dist/elgamal-VZLWB3XK.js +0 -5
  108. package/dist/elgamal-VZLWB3XK.js.map +0 -1
  109. package/dist/feature-flags-V722ZuXO.d.ts +0 -3512
  110. package/dist/generated-VNLHMR6Y.js +0 -5
  111. package/dist/ipfs-types-BOt9ZNg4.d.ts +0 -592
  112. package/dist/multisigConfig-BzEhy6jy.d.ts +0 -58
  113. package/dist/pda-B_nS8SbD.d.ts +0 -114
  114. package/dist/pda-S4BFJVGE.js +0 -4
  115. package/dist/pda-S4BFJVGE.js.map +0 -1
  116. package/dist/system-addresses-BFNLEbFx.d.ts +0 -857
  117. package/dist/token-2022-rpc-RALH4RK7.js +0 -593
  118. package/dist/token-2022-rpc-RALH4RK7.js.map +0 -1
@@ -1,377 +0,0 @@
1
- import { __export } from './chunk-NSBPE2FW.js';
2
- import { getProgramDerivedAddress, getBytesEncoder, getAddressEncoder } from '@solana/kit';
3
-
4
- // src/utils/governance-helpers.ts
5
- var governance_helpers_exports = {};
6
- __export(governance_helpers_exports, {
7
- GovernanceAnalyticsUtils: () => GovernanceAnalyticsUtils,
8
- MultisigUtils: () => MultisigUtils,
9
- PERMISSION_TEMPLATES: () => PERMISSION_TEMPLATES,
10
- ProposalUtils: () => ProposalUtils,
11
- ROLE_TEMPLATES: () => ROLE_TEMPLATES,
12
- RbacUtils: () => RbacUtils,
13
- VotingUtils: () => VotingUtils,
14
- deriveMultisigPda: () => deriveMultisigPda,
15
- deriveProposalPda: () => deriveProposalPda,
16
- deriveRbacPda: () => deriveRbacPda
17
- });
18
- async function deriveMultisigPda(programId, authority, multisigId) {
19
- const [pda] = await getProgramDerivedAddress({
20
- programAddress: programId,
21
- seeds: [
22
- getBytesEncoder().encode(new Uint8Array([109, 117, 108, 116, 105, 115, 105, 103])),
23
- // 'multisig'
24
- getAddressEncoder().encode(authority),
25
- new Uint8Array(new BigUint64Array([multisigId]).buffer)
26
- ]
27
- });
28
- return pda;
29
- }
30
- async function deriveProposalPda(programId, multisig, proposalId) {
31
- const [pda] = await getProgramDerivedAddress({
32
- programAddress: programId,
33
- seeds: [
34
- getBytesEncoder().encode(new Uint8Array([112, 114, 111, 112, 111, 115, 97, 108])),
35
- // 'proposal'
36
- getAddressEncoder().encode(multisig),
37
- new Uint8Array(new BigUint64Array([proposalId]).buffer)
38
- ]
39
- });
40
- return pda;
41
- }
42
- async function deriveRbacPda(programId, admin) {
43
- const [pda] = await getProgramDerivedAddress({
44
- programAddress: programId,
45
- seeds: [
46
- getBytesEncoder().encode(new Uint8Array([114, 98, 97, 99])),
47
- // 'rbac'
48
- getAddressEncoder().encode(admin)
49
- ]
50
- });
51
- return pda;
52
- }
53
- var MultisigUtils = class {
54
- /**
55
- * Calculate if a multisig action has reached threshold
56
- */
57
- static hasReachedThreshold(multisig, approvalCount) {
58
- return approvalCount >= multisig.threshold;
59
- }
60
- /**
61
- * Check if an address is a signer on the multisig
62
- */
63
- static isSigner(multisig, address) {
64
- return multisig.signers.some((signer) => signer === address);
65
- }
66
- /**
67
- * Calculate remaining signatures needed
68
- */
69
- static remainingSignatures(multisig, currentApprovals) {
70
- const remaining = multisig.threshold - currentApprovals;
71
- return Math.max(0, remaining);
72
- }
73
- /**
74
- * Validate multisig configuration
75
- */
76
- static validateConfiguration(signers, threshold) {
77
- if (signers.length === 0) {
78
- return { valid: false, error: "At least one signer required" };
79
- }
80
- if (signers.length > 10) {
81
- return { valid: false, error: "Maximum 10 signers allowed" };
82
- }
83
- if (threshold === 0) {
84
- return { valid: false, error: "Threshold must be at least 1" };
85
- }
86
- if (threshold > signers.length) {
87
- return { valid: false, error: "Threshold cannot exceed number of signers" };
88
- }
89
- const uniqueSigners = new Set(signers);
90
- if (uniqueSigners.size !== signers.length) {
91
- return { valid: false, error: "Duplicate signers not allowed" };
92
- }
93
- return { valid: true };
94
- }
95
- /**
96
- * Generate multisig configuration summary
97
- */
98
- static generateSummary(multisig) {
99
- const signerCount = multisig.signers.length;
100
- const percentage = Math.round(multisig.threshold / signerCount * 100);
101
- return `${multisig.threshold}-of-${signerCount} multisig (${percentage}% approval required)`;
102
- }
103
- };
104
- var ProposalUtils = class {
105
- /**
106
- * Check if proposal is in voting period
107
- */
108
- static isVotingOpen(proposal) {
109
- const now = BigInt(Math.floor(Date.now() / 1e3));
110
- return proposal.status === 1 /* Active */ && now >= proposal.votingStartsAt && now <= proposal.votingEndsAt;
111
- }
112
- /**
113
- * Check if proposal has expired
114
- */
115
- static hasExpired(proposal) {
116
- const now = BigInt(Math.floor(Date.now() / 1e3));
117
- return now > proposal.votingEndsAt;
118
- }
119
- /**
120
- * Calculate time remaining for voting
121
- */
122
- static timeRemaining(proposal) {
123
- const now = BigInt(Math.floor(Date.now() / 1e3));
124
- if (now >= proposal.votingEndsAt) return 0n;
125
- return proposal.votingEndsAt - now;
126
- }
127
- /**
128
- * Format time remaining as human-readable string
129
- */
130
- static formatTimeRemaining(proposal) {
131
- const remaining = this.timeRemaining(proposal);
132
- if (remaining === 0n) return "Voting ended";
133
- const seconds = Number(remaining);
134
- const days = Math.floor(seconds / 86400);
135
- const hours = Math.floor(seconds % 86400 / 3600);
136
- const minutes = Math.floor(seconds % 3600 / 60);
137
- if (days > 0) return `${days}d ${hours}h remaining`;
138
- if (hours > 0) return `${hours}h ${minutes}m remaining`;
139
- return `${minutes}m remaining`;
140
- }
141
- /**
142
- * Calculate if proposal has reached quorum
143
- */
144
- static hasReachedQuorum(votingResults, quorumRequirements, totalEligibleVoters) {
145
- const totalVotes = Number(votingResults.votesFor + votingResults.votesAgainst + votingResults.votesAbstain);
146
- const participationRate = totalVotes / totalEligibleVoters * 100;
147
- return participationRate >= quorumRequirements.minimumParticipation;
148
- }
149
- /**
150
- * Calculate voting results summary
151
- */
152
- static calculateResults(votingResults) {
153
- const total = Number(votingResults.votesFor + votingResults.votesAgainst + votingResults.votesAbstain);
154
- if (total === 0) {
155
- return {
156
- total: 0,
157
- forPercentage: 0,
158
- againstPercentage: 0,
159
- abstainPercentage: 0,
160
- passed: false
161
- };
162
- }
163
- const forPercentage = Number(votingResults.votesFor) / total * 100;
164
- const againstPercentage = Number(votingResults.votesAgainst) / total * 100;
165
- const abstainPercentage = Number(votingResults.votesAbstain) / total * 100;
166
- const passed = votingResults.votesFor > votingResults.votesAgainst;
167
- return {
168
- total,
169
- forPercentage,
170
- againstPercentage,
171
- abstainPercentage,
172
- passed
173
- };
174
- }
175
- /**
176
- * Validate proposal
177
- */
178
- static validateProposal(proposal) {
179
- if (!proposal.title || proposal.title.trim().length === 0) {
180
- return { valid: false, error: "Title is required" };
181
- }
182
- if (proposal.title.length > 100) {
183
- return { valid: false, error: "Title cannot exceed 100 characters" };
184
- }
185
- if (!proposal.description || proposal.description.trim().length === 0) {
186
- return { valid: false, error: "Description is required" };
187
- }
188
- if (proposal.description.length > 5e3) {
189
- return { valid: false, error: "Description cannot exceed 5000 characters" };
190
- }
191
- return { valid: true };
192
- }
193
- };
194
- var RbacUtils = class {
195
- /**
196
- * Check if a user has a specific permission
197
- */
198
- static hasPermission(rbac, user, permission) {
199
- const userRole = this.getUserRole(rbac, user);
200
- if (!userRole) return false;
201
- return userRole.permissions.includes(permission);
202
- }
203
- /**
204
- * Get user's role
205
- */
206
- static getUserRole(rbac, user) {
207
- const userPolicy = rbac.accessPolicies.find((policy) => {
208
- return policy.policyId.includes(user) || policy.name.includes(user);
209
- });
210
- if (userPolicy) {
211
- const assignedRole = rbac.roles.find(
212
- (role) => role.roleId === userPolicy.policyId || role.name === userPolicy.name || userPolicy.scope.toString().includes(role.roleId)
213
- );
214
- if (assignedRole) {
215
- return assignedRole;
216
- }
217
- }
218
- return rbac.roles.find((role) => role.name === "default") ?? null;
219
- }
220
- /**
221
- * Check if permission string is valid
222
- */
223
- static isValidPermission(permission) {
224
- return permission.length > 0 && permission.length < 100;
225
- }
226
- /**
227
- * Validate role configuration
228
- */
229
- static validateRole(role) {
230
- if (!role.name || role.name.trim().length === 0) {
231
- return { valid: false, error: "Role name is required" };
232
- }
233
- if (role.name.length > 50) {
234
- return { valid: false, error: "Role name cannot exceed 50 characters" };
235
- }
236
- if (role.permissions.length === 0) {
237
- return { valid: false, error: "Role must have at least one permission" };
238
- }
239
- if (role.permissions.length > 20) {
240
- return { valid: false, error: "Role cannot have more than 20 permissions" };
241
- }
242
- return { valid: true };
243
- }
244
- /**
245
- * Generate permission summary
246
- */
247
- static generatePermissionSummary(permissions) {
248
- if (permissions.length === 0) return "No permissions";
249
- if (permissions.length === 1) return "1 permission";
250
- return `${permissions.length} permissions`;
251
- }
252
- };
253
- var VotingUtils = class {
254
- /**
255
- * Calculate vote weight based on token holdings or other factors
256
- */
257
- static calculateVoteWeight(baseWeight, tokenBalance, stakeDuration) {
258
- let weight = baseWeight;
259
- if (tokenBalance) {
260
- const tokenMultiplier = Math.min(Number(tokenBalance / 1000000n), 10);
261
- weight *= tokenMultiplier;
262
- }
263
- if (stakeDuration) {
264
- const daysStaked = Number(stakeDuration / 86400n);
265
- const timeMultiplier = 1 + daysStaked / 365;
266
- weight *= timeMultiplier;
267
- }
268
- return Math.floor(weight);
269
- }
270
- /**
271
- * Format vote choice as string
272
- */
273
- static formatVoteChoice(voteChoice) {
274
- switch (voteChoice) {
275
- case 0 /* For */:
276
- return "\u2705 For";
277
- case 1 /* Against */:
278
- return "\u274C Against";
279
- case 2 /* Abstain */:
280
- return "\u{1F937} Abstain";
281
- default:
282
- return "Unknown";
283
- }
284
- }
285
- /**
286
- * Calculate if simple majority is reached
287
- */
288
- static hasSimpleMajority(votingResults) {
289
- return votingResults.votesFor > votingResults.votesAgainst;
290
- }
291
- /**
292
- * Calculate if supermajority is reached (2/3)
293
- */
294
- static hasSupermajority(votingResults) {
295
- const totalVotes = votingResults.votesFor + votingResults.votesAgainst;
296
- if (totalVotes === 0n) return false;
297
- const forPercentage = Number(votingResults.votesFor) / Number(totalVotes);
298
- return forPercentage >= 0.667;
299
- }
300
- };
301
- var PERMISSION_TEMPLATES = {
302
- // Admin permissions
303
- ADMIN: {
304
- CREATE_PROPOSAL: { action: "create", resource: "proposal" },
305
- EXECUTE_PROPOSAL: { action: "execute", resource: "proposal" },
306
- MANAGE_ROLES: { action: "manage", resource: "roles" },
307
- MANAGE_TREASURY: { action: "manage", resource: "treasury" }
308
- },
309
- // Member permissions
310
- MEMBER: {
311
- VOTE: { action: "vote", resource: "proposal" },
312
- VIEW: { action: "view", resource: "all" },
313
- COMMENT: { action: "comment", resource: "proposal" }
314
- },
315
- // Moderator permissions
316
- MODERATOR: {
317
- CANCEL_PROPOSAL: { action: "cancel", resource: "proposal" },
318
- MODERATE_COMMENTS: { action: "moderate", resource: "comments" },
319
- VIEW_REPORTS: { action: "view", resource: "reports" }
320
- }
321
- };
322
- var ROLE_TEMPLATES = {
323
- ADMIN: {
324
- name: "Administrator",
325
- description: "Full administrative access",
326
- permissions: Object.values(PERMISSION_TEMPLATES.ADMIN)
327
- },
328
- MEMBER: {
329
- name: "Member",
330
- description: "Standard member access",
331
- permissions: Object.values(PERMISSION_TEMPLATES.MEMBER)
332
- },
333
- MODERATOR: {
334
- name: "Moderator",
335
- description: "Content moderation access",
336
- permissions: [
337
- ...Object.values(PERMISSION_TEMPLATES.MEMBER),
338
- ...Object.values(PERMISSION_TEMPLATES.MODERATOR)
339
- ]
340
- }
341
- };
342
- var GovernanceAnalyticsUtils = class {
343
- /**
344
- * Calculate governance health score (0-100)
345
- */
346
- static calculateHealthScore(analytics) {
347
- let score = 0;
348
- score += Math.min(analytics.averageVoterTurnout * 0.4, 40);
349
- const totalCompleted = analytics.passedProposals + analytics.failedProposals;
350
- if (totalCompleted > 0) {
351
- const successRate = analytics.passedProposals / totalCompleted;
352
- score += successRate * 30;
353
- }
354
- const activityRatio = analytics.activeProposals / Math.max(analytics.totalProposals, 1);
355
- score += Math.min(activityRatio * 60, 30);
356
- return Math.round(score);
357
- }
358
- /**
359
- * Generate governance summary report
360
- */
361
- static generateSummaryReport(analytics) {
362
- const healthScore = this.calculateHealthScore(analytics);
363
- const successRate = analytics.totalProposals > 0 ? Math.round(analytics.passedProposals / analytics.totalProposals * 100) : 0;
364
- return `
365
- Governance Summary:
366
- - Total Proposals: ${analytics.totalProposals}
367
- - Active: ${analytics.activeProposals}
368
- - Success Rate: ${successRate}%
369
- - Avg Turnout: ${Math.round(analytics.averageVoterTurnout)}%
370
- - Health Score: ${healthScore}/100
371
- `.trim();
372
- }
373
- };
374
-
375
- export { deriveMultisigPda, deriveProposalPda, governance_helpers_exports };
376
- //# sourceMappingURL=chunk-ZGP5552B.js.map
377
- //# sourceMappingURL=chunk-ZGP5552B.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/governance-helpers.ts"],"names":[],"mappings":";;;;AAAA,IAAA,0BAAA,GAAA;AAAA,QAAA,CAAA,0BAAA,EAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,aAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA4BA,eAAsB,iBAAA,CACpB,SAAA,EACA,SAAA,EACA,UAAA,EACkB;AAClB,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,wBAAA,CAAyB;AAAA,IAC3C,cAAA,EAAgB,SAAA;AAAA,IAChB,KAAA,EAAO;AAAA,MACL,eAAA,EAAgB,CAAE,MAAA,CAAO,IAAI,WAAW,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAC,CAAA;AAAA;AAAA,MACjF,iBAAA,EAAkB,CAAE,MAAA,CAAO,SAAS,CAAA;AAAA,MACpC,IAAI,WAAW,IAAI,cAAA,CAAe,CAAC,UAAU,CAAC,EAAE,MAAM;AAAA;AACxD,GACD,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAKA,eAAsB,iBAAA,CACpB,SAAA,EACA,QAAA,EACA,UAAA,EACkB;AAClB,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,wBAAA,CAAyB;AAAA,IAC3C,cAAA,EAAgB,SAAA;AAAA,IAChB,KAAA,EAAO;AAAA,MACL,eAAA,EAAgB,CAAE,MAAA,CAAO,IAAI,WAAW,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,EAAA,EAAI,GAAG,CAAC,CAAC,CAAA;AAAA;AAAA,MAChF,iBAAA,EAAkB,CAAE,MAAA,CAAO,QAAQ,CAAA;AAAA,MACnC,IAAI,WAAW,IAAI,cAAA,CAAe,CAAC,UAAU,CAAC,EAAE,MAAM;AAAA;AACxD,GACD,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAKA,eAAsB,aAAA,CACpB,WACA,KAAA,EACkB;AAClB,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAM,wBAAA,CAAyB;AAAA,IAC3C,cAAA,EAAgB,SAAA;AAAA,IAChB,KAAA,EAAO;AAAA,MACL,eAAA,EAAgB,CAAE,MAAA,CAAO,IAAI,UAAA,CAAW,CAAC,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAE,CAAC,CAAC,CAAA;AAAA;AAAA,MAC1D,iBAAA,EAAkB,CAAE,MAAA,CAAO,KAAK;AAAA;AAClC,GACD,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAMO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA,EAIzB,OAAO,mBAAA,CACL,QAAA,EACA,aAAA,EACS;AACT,IAAA,OAAO,iBAAiB,QAAA,CAAS,SAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAA,CAAS,QAAA,EAAoB,OAAA,EAA2B;AAC7D,IAAA,OAAO,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAoB,WAAW,OAAO,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAA,CACL,QAAA,EACA,gBAAA,EACQ;AACR,IAAA,MAAM,SAAA,GAAY,SAAS,SAAA,GAAY,gBAAA;AACvC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,qBAAA,CACL,OAAA,EACA,SAAA,EACoC;AACpC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,8BAAA,EAA+B;AAAA,IAC/D;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,EAAA,EAAI;AACvB,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,4BAAA,EAA6B;AAAA,IAC7D;AAEA,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,8BAAA,EAA+B;AAAA,IAC/D;AAEA,IAAA,IAAI,SAAA,GAAY,QAAQ,MAAA,EAAQ;AAC9B,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,2CAAA,EAA4C;AAAA,IAC5E;AAGA,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,aAAA,CAAc,IAAA,KAAS,OAAA,CAAQ,MAAA,EAAQ;AACzC,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,+BAAA,EAAgC;AAAA,IAChE;AAEA,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBAAgB,QAAA,EAA4B;AACjD,IAAA,MAAM,WAAA,GAAc,SAAS,OAAA,CAAQ,MAAA;AACrC,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAO,QAAA,CAAS,SAAA,GAAY,cAAe,GAAG,CAAA;AAEtE,IAAA,OAAO,GAAG,QAAA,CAAS,SAAS,CAAA,IAAA,EAAO,WAAW,cAAc,UAAU,CAAA,oBAAA,CAAA;AAAA,EACxE;AACF,CAAA;AAMO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA,EAIzB,OAAO,aAAa,QAAA,EAAuC;AACzD,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AAChD,IAAA,OAAO,SAAS,MAAA,KAAA,CAAA,iBACT,GAAA,IAAO,QAAA,CAAS,cAAA,IAChB,OAAO,QAAA,CAAS,YAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,QAAA,EAAuC;AACvD,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AAChD,IAAA,OAAO,MAAM,QAAA,CAAS,YAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAc,QAAA,EAAsC;AACzD,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AAChD,IAAA,IAAI,GAAA,IAAO,QAAA,CAAS,YAAA,EAAc,OAAO,EAAA;AACzC,IAAA,OAAO,SAAS,YAAA,GAAe,GAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,oBAAoB,QAAA,EAAsC;AAC/D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAC7C,IAAA,IAAI,SAAA,KAAc,IAAI,OAAO,cAAA;AAE7B,IAAA,MAAM,OAAA,GAAU,OAAO,SAAS,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAO,OAAA,GAAU,QAAS,IAAI,CAAA;AACjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,OAAA,GAAU,OAAQ,EAAE,CAAA;AAEhD,IAAA,IAAI,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,IAAI,KAAK,KAAK,CAAA,WAAA,CAAA;AACtC,IAAA,IAAI,QAAQ,CAAA,EAAG,OAAO,CAAA,EAAG,KAAK,KAAK,OAAO,CAAA,WAAA,CAAA;AAC1C,IAAA,OAAO,GAAG,OAAO,CAAA,WAAA,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBAAA,CACL,aAAA,EACA,kBAAA,EACA,mBAAA,EACS;AACT,IAAA,MAAM,aAAa,MAAA,CAAO,aAAA,CAAc,WAAW,aAAA,CAAc,YAAA,GAAe,cAAc,YAAY,CAAA;AAC1G,IAAA,MAAM,iBAAA,GAAqB,aAAa,mBAAA,GAAuB,GAAA;AAE/D,IAAA,OAAO,qBAAqB,kBAAA,CAAmB,oBAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,aAAA,EAMtB;AACA,IAAA,MAAM,QAAQ,MAAA,CAAO,aAAA,CAAc,WAAW,aAAA,CAAc,YAAA,GAAe,cAAc,YAAY,CAAA;AAErG,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAA;AAAA,QACP,aAAA,EAAe,CAAA;AAAA,QACf,iBAAA,EAAmB,CAAA;AAAA,QACnB,iBAAA,EAAmB,CAAA;AAAA,QACnB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAiB,MAAA,CAAO,aAAA,CAAc,QAAQ,IAAI,KAAA,GAAS,GAAA;AACjE,IAAA,MAAM,iBAAA,GAAqB,MAAA,CAAO,aAAA,CAAc,YAAY,IAAI,KAAA,GAAS,GAAA;AACzE,IAAA,MAAM,iBAAA,GAAqB,MAAA,CAAO,aAAA,CAAc,YAAY,IAAI,KAAA,GAAS,GAAA;AAGzE,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,GAAW,aAAA,CAAc,YAAA;AAEtD,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,QAAA,EAAkE;AACxF,IAAA,IAAI,CAAC,SAAS,KAAA,IAAS,QAAA,CAAS,MAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACzD,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AAAA,IACpD;AAEA,IAAA,IAAI,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,GAAA,EAAK;AAC/B,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,oCAAA,EAAqC;AAAA,IACrE;AAEA,IAAA,IAAI,CAAC,SAAS,WAAA,IAAe,QAAA,CAAS,YAAY,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACrE,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,IAC1D;AAEA,IAAA,IAAI,QAAA,CAAS,WAAA,CAAY,MAAA,GAAS,GAAA,EAAM;AACtC,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,2CAAA,EAA4C;AAAA,IAC5E;AAEA,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AACF,CAAA;AAMO,IAAM,YAAN,MAAgB;AAAA;AAAA;AAAA;AAAA,EAIrB,OAAO,aAAA,CACL,IAAA,EACA,IAAA,EACA,UAAA,EACS;AACT,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,IAAI,CAAA;AAC5C,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,IAAA,OAAO,QAAA,CAAS,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAA,CAAY,IAAA,EAAkB,IAAA,EAA4B;AAI/D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,CAAA,MAAA,KAAU;AAIpD,MAAA,OAAO,MAAA,CAAO,SAAS,QAAA,CAAS,IAAI,KAAK,MAAA,CAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IACpE,CAAC,CAAA;AAED,IAAA,IAAI,UAAA,EAAY;AAGd,MAAA,MAAM,YAAA,GAAe,KAAK,KAAA,CAAM,IAAA;AAAA,QAAK,CAAA,IAAA,KACnC,IAAA,CAAK,MAAA,KAAW,UAAA,CAAW,YAC3B,IAAA,CAAK,IAAA,KAAS,UAAA,CAAW,IAAA,IACzB,WAAW,KAAA,CAAM,QAAA,EAAS,CAAE,QAAA,CAAS,KAAK,MAAM;AAAA,OAClD;AAEA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,UAAQ,IAAA,CAAK,IAAA,KAAS,SAAS,CAAA,IAAK,IAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,UAAA,EAA6B;AAEpD,IAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,UAAA,CAAW,MAAA,GAAS,GAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAa,IAAA,EAAgD;AAClE,IAAA,IAAI,CAAC,KAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AAC/C,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,uBAAA,EAAwB;AAAA,IACxD;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI;AACzB,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,uCAAA,EAAwC;AAAA,IACxE;AAEA,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AACjC,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,wCAAA,EAAyC;AAAA,IACzE;AAEA,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,EAAA,EAAI;AAChC,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,2CAAA,EAA4C;AAAA,IAC5E;AAEA,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,0BAA0B,WAAA,EAAmC;AAClE,IAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,gBAAA;AACrC,IAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,cAAA;AACrC,IAAA,OAAO,CAAA,EAAG,YAAY,MAAM,CAAA,YAAA,CAAA;AAAA,EAC9B;AACF,CAAA;AAMO,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA,EAIvB,OAAO,mBAAA,CACL,UAAA,EACA,YAAA,EACA,aAAA,EACQ;AACR,IAAA,IAAI,MAAA,GAAS,UAAA;AAGb,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA,CAAI,OAAO,YAAA,GAAe,QAAQ,GAAG,EAAE,CAAA;AACpE,MAAA,MAAA,IAAU,eAAA;AAAA,IACZ;AAGA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,aAAA,GAAgB,MAAM,CAAA;AAChD,MAAA,MAAM,cAAA,GAAiB,IAAK,UAAA,GAAa,GAAA;AACzC,MAAA,MAAA,IAAU,cAAA;AAAA,IACZ;AAEA,IAAA,OAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,UAAA,EAAgC;AACtD,IAAA,QAAQ,UAAA;AAAY,MAClB,KAAA,CAAA;AACE,QAAA,OAAO,YAAA;AAAA,MACT,KAAA,CAAA;AACE,QAAA,OAAO,gBAAA;AAAA,MACT,KAAA,CAAA;AACE,QAAA,OAAO,mBAAA;AAAA,MACT;AACE,QAAA,OAAO,SAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAkB,aAAA,EAAuC;AAC9D,IAAA,OAAO,aAAA,CAAc,WAAW,aAAA,CAAc,YAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,aAAA,EAAuC;AAC7D,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,QAAA,GAAW,aAAA,CAAc,YAAA;AAC1D,IAAA,IAAI,UAAA,KAAe,IAAI,OAAO,KAAA;AAE9B,IAAA,MAAM,gBAAgB,MAAA,CAAO,aAAA,CAAc,QAAQ,CAAA,GAAI,OAAO,UAAU,CAAA;AACxE,IAAA,OAAO,aAAA,IAAiB,KAAA;AAAA,EAC1B;AACF,CAAA;AAMO,IAAM,oBAAA,GAAuB;AAAA;AAAA,EAElC,KAAA,EAAO;AAAA,IACL,eAAA,EAAiB,EAAE,MAAA,EAAQ,QAAA,EAAU,UAAU,UAAA,EAAW;AAAA,IAC1D,gBAAA,EAAkB,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAU,UAAA,EAAW;AAAA,IAC5D,YAAA,EAAc,EAAE,MAAA,EAAQ,QAAA,EAAU,UAAU,OAAA,EAAQ;AAAA,IACpD,eAAA,EAAiB,EAAE,MAAA,EAAQ,QAAA,EAAU,UAAU,UAAA;AAAW,GAC5D;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAU,UAAA,EAAW;AAAA,IAC7C,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAU,KAAA,EAAM;AAAA,IACxC,OAAA,EAAS,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAU,UAAA;AAAW,GACrD;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,eAAA,EAAiB,EAAE,MAAA,EAAQ,QAAA,EAAU,UAAU,UAAA,EAAW;AAAA,IAC1D,iBAAA,EAAmB,EAAE,MAAA,EAAQ,UAAA,EAAY,UAAU,UAAA,EAAW;AAAA,IAC9D,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAU,SAAA;AAAU;AAExD,CAAA;AAMO,IAAM,cAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,WAAA,EAAa,4BAAA;AAAA,IACb,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,oBAAA,CAAqB,KAAK;AAAA,GACvD;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,wBAAA;AAAA,IACb,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,oBAAA,CAAqB,MAAM;AAAA,GACxD;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,2BAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,GAAG,MAAA,CAAO,MAAA,CAAO,oBAAA,CAAqB,MAAM,CAAA;AAAA,MAC5C,GAAG,MAAA,CAAO,MAAA,CAAO,oBAAA,CAAqB,SAAS;AAAA;AACjD;AAEJ,CAAA;AAgBO,IAAM,2BAAN,MAA+B;AAAA;AAAA;AAAA;AAAA,EAIpC,OAAO,qBAAqB,SAAA,EAAwC;AAClE,IAAA,IAAI,KAAA,GAAQ,CAAA;AAGZ,IAAA,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,mBAAA,GAAsB,KAAK,EAAE,CAAA;AAGzD,IAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,eAAA,GAAkB,SAAA,CAAU,eAAA;AAC7D,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,MAAM,WAAA,GAAc,UAAU,eAAA,GAAkB,cAAA;AAChD,MAAA,KAAA,IAAS,WAAA,GAAc,EAAA;AAAA,IACzB;AAGA,IAAA,MAAM,gBAAgB,SAAA,CAAU,eAAA,GAAkB,KAAK,GAAA,CAAI,SAAA,CAAU,gBAAgB,CAAC,CAAA;AACtF,IAAA,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,aAAA,GAAgB,EAAA,EAAI,EAAE,CAAA;AAExC,IAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,sBAAsB,SAAA,EAAwC;AACnE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,oBAAA,CAAqB,SAAS,CAAA;AACvD,IAAA,MAAM,WAAA,GAAc,SAAA,CAAU,cAAA,GAAiB,CAAA,GAC3C,IAAA,CAAK,KAAA,CAAO,SAAA,CAAU,eAAA,GAAkB,SAAA,CAAU,cAAA,GAAkB,GAAG,CAAA,GACvE,CAAA;AAEJ,IAAA,OAAO;AAAA;AAAA,mBAAA,EAEU,UAAU,cAAc;AAAA,UAAA,EACjC,UAAU,eAAe;AAAA,gBAAA,EACnB,WAAW,CAAA;AAAA,eAAA,EACZ,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,mBAAmB,CAAC,CAAA;AAAA,gBAAA,EACxC,WAAW,CAAA;AAAA,IAAA,CAAA,CACvB,IAAA,EAAK;AAAA,EACT;AACF,CAAA","file":"chunk-ZGP5552B.js","sourcesContent":["/**\n * Governance Helper Utilities\n * \n * Comprehensive utilities for RBAC management, multi-signature wallets,\n * proposal lifecycle, and voting mechanisms.\n */\n\nimport type { Address } from '@solana/kit'\nimport { getAddressEncoder, getProgramDerivedAddress, getBytesEncoder } from '@solana/kit'\nimport {\n ProposalStatus,\n VoteChoice,\n type Multisig,\n type GovernanceProposal,\n type RbacConfig,\n type Role,\n type Permission,\n type VotingResults,\n type QuorumRequirements\n} from '../generated/index.js'\n\n// =====================================================\n// PDA DERIVATION\n// =====================================================\n\n/**\n * Derive multisig account PDA\n */\nexport async function deriveMultisigPda(\n programId: Address,\n authority: Address,\n multisigId: bigint\n): Promise<Address> {\n const [pda] = await getProgramDerivedAddress({\n programAddress: programId,\n seeds: [\n getBytesEncoder().encode(new Uint8Array([109, 117, 108, 116, 105, 115, 105, 103])), // 'multisig'\n getAddressEncoder().encode(authority),\n new Uint8Array(new BigUint64Array([multisigId]).buffer)\n ]\n })\n return pda\n}\n\n/**\n * Derive proposal account PDA\n */\nexport async function deriveProposalPda(\n programId: Address,\n multisig: Address,\n proposalId: bigint\n): Promise<Address> {\n const [pda] = await getProgramDerivedAddress({\n programAddress: programId,\n seeds: [\n getBytesEncoder().encode(new Uint8Array([112, 114, 111, 112, 111, 115, 97, 108])), // 'proposal'\n getAddressEncoder().encode(multisig),\n new Uint8Array(new BigUint64Array([proposalId]).buffer)\n ]\n })\n return pda\n}\n\n/**\n * Derive RBAC account PDA\n */\nexport async function deriveRbacPda(\n programId: Address,\n admin: Address\n): Promise<Address> {\n const [pda] = await getProgramDerivedAddress({\n programAddress: programId,\n seeds: [\n getBytesEncoder().encode(new Uint8Array([114, 98, 97, 99])), // 'rbac'\n getAddressEncoder().encode(admin)\n ]\n })\n return pda\n}\n\n// =====================================================\n// MULTISIG UTILITIES\n// =====================================================\n\nexport class MultisigUtils {\n /**\n * Calculate if a multisig action has reached threshold\n */\n static hasReachedThreshold(\n multisig: Multisig,\n approvalCount: number\n ): boolean {\n return approvalCount >= multisig.threshold\n }\n\n /**\n * Check if an address is a signer on the multisig\n */\n static isSigner(multisig: Multisig, address: Address): boolean {\n return multisig.signers.some((signer: Address) => signer === address)\n }\n\n /**\n * Calculate remaining signatures needed\n */\n static remainingSignatures(\n multisig: Multisig,\n currentApprovals: number\n ): number {\n const remaining = multisig.threshold - currentApprovals\n return Math.max(0, remaining)\n }\n\n /**\n * Validate multisig configuration\n */\n static validateConfiguration(\n signers: Address[],\n threshold: number\n ): { valid: boolean; error?: string } {\n if (signers.length === 0) {\n return { valid: false, error: 'At least one signer required' }\n }\n\n if (signers.length > 10) {\n return { valid: false, error: 'Maximum 10 signers allowed' }\n }\n\n if (threshold === 0) {\n return { valid: false, error: 'Threshold must be at least 1' }\n }\n\n if (threshold > signers.length) {\n return { valid: false, error: 'Threshold cannot exceed number of signers' }\n }\n\n // Check for duplicate signers\n const uniqueSigners = new Set(signers)\n if (uniqueSigners.size !== signers.length) {\n return { valid: false, error: 'Duplicate signers not allowed' }\n }\n\n return { valid: true }\n }\n\n /**\n * Generate multisig configuration summary\n */\n static generateSummary(multisig: Multisig): string {\n const signerCount = multisig.signers.length\n const percentage = Math.round((multisig.threshold / signerCount) * 100)\n \n return `${multisig.threshold}-of-${signerCount} multisig (${percentage}% approval required)`\n }\n}\n\n// =====================================================\n// PROPOSAL UTILITIES\n// =====================================================\n\nexport class ProposalUtils {\n /**\n * Check if proposal is in voting period\n */\n static isVotingOpen(proposal: GovernanceProposal): boolean {\n const now = BigInt(Math.floor(Date.now() / 1000))\n return proposal.status === ProposalStatus.Active &&\n now >= proposal.votingStartsAt &&\n now <= proposal.votingEndsAt\n }\n\n /**\n * Check if proposal has expired\n */\n static hasExpired(proposal: GovernanceProposal): boolean {\n const now = BigInt(Math.floor(Date.now() / 1000))\n return now > proposal.votingEndsAt\n }\n\n /**\n * Calculate time remaining for voting\n */\n static timeRemaining(proposal: GovernanceProposal): bigint {\n const now = BigInt(Math.floor(Date.now() / 1000))\n if (now >= proposal.votingEndsAt) return 0n\n return proposal.votingEndsAt - now\n }\n\n /**\n * Format time remaining as human-readable string\n */\n static formatTimeRemaining(proposal: GovernanceProposal): string {\n const remaining = this.timeRemaining(proposal)\n if (remaining === 0n) return 'Voting ended'\n\n const seconds = Number(remaining)\n const days = Math.floor(seconds / 86400)\n const hours = Math.floor((seconds % 86400) / 3600)\n const minutes = Math.floor((seconds % 3600) / 60)\n\n if (days > 0) return `${days}d ${hours}h remaining`\n if (hours > 0) return `${hours}h ${minutes}m remaining`\n return `${minutes}m remaining`\n }\n\n /**\n * Calculate if proposal has reached quorum\n */\n static hasReachedQuorum(\n votingResults: VotingResults,\n quorumRequirements: QuorumRequirements,\n totalEligibleVoters: number\n ): boolean {\n const totalVotes = Number(votingResults.votesFor + votingResults.votesAgainst + votingResults.votesAbstain)\n const participationRate = (totalVotes / totalEligibleVoters) * 100\n \n return participationRate >= quorumRequirements.minimumParticipation\n }\n\n /**\n * Calculate voting results summary\n */\n static calculateResults(votingResults: VotingResults): {\n total: number\n forPercentage: number\n againstPercentage: number\n abstainPercentage: number\n passed: boolean\n } {\n const total = Number(votingResults.votesFor + votingResults.votesAgainst + votingResults.votesAbstain)\n \n if (total === 0) {\n return {\n total: 0,\n forPercentage: 0,\n againstPercentage: 0,\n abstainPercentage: 0,\n passed: false\n }\n }\n\n const forPercentage = (Number(votingResults.votesFor) / total) * 100\n const againstPercentage = (Number(votingResults.votesAgainst) / total) * 100\n const abstainPercentage = (Number(votingResults.votesAbstain) / total) * 100\n \n // Simple majority (>50% for votes)\n const passed = votingResults.votesFor > votingResults.votesAgainst\n\n return {\n total,\n forPercentage,\n againstPercentage,\n abstainPercentage,\n passed\n }\n }\n\n /**\n * Validate proposal\n */\n static validateProposal(proposal: GovernanceProposal): { valid: boolean; error?: string } {\n if (!proposal.title || proposal.title.trim().length === 0) {\n return { valid: false, error: 'Title is required' }\n }\n\n if (proposal.title.length > 100) {\n return { valid: false, error: 'Title cannot exceed 100 characters' }\n }\n\n if (!proposal.description || proposal.description.trim().length === 0) {\n return { valid: false, error: 'Description is required' }\n }\n\n if (proposal.description.length > 5000) {\n return { valid: false, error: 'Description cannot exceed 5000 characters' }\n }\n\n return { valid: true }\n }\n}\n\n// =====================================================\n// RBAC UTILITIES\n// =====================================================\n\nexport class RbacUtils {\n /**\n * Check if a user has a specific permission\n */\n static hasPermission(\n rbac: RbacConfig,\n user: Address,\n permission: string\n ): boolean {\n const userRole = this.getUserRole(rbac, user)\n if (!userRole) return false\n\n return userRole.permissions.includes(permission)\n }\n\n /**\n * Get user's role\n */\n static getUserRole(rbac: RbacConfig, user: Address): Role | null {\n // Find user's role assignment by checking access policies\n // Since Role doesn't have members field, we check access policies instead\n // We'll use the policy metadata to store user assignments\n const userPolicy = rbac.accessPolicies.find(policy => {\n // Check if policy metadata contains user information\n // This is a simplified implementation - in real usage, you'd have\n // a more structured way to associate users with policies\n return policy.policyId.includes(user) || policy.name.includes(user)\n })\n \n if (userPolicy) {\n // Find the role associated with this policy by checking policy scope\n // In a real implementation, you'd have a more structured relationship\n const assignedRole = rbac.roles.find(role => \n role.roleId === userPolicy.policyId || \n role.name === userPolicy.name ||\n userPolicy.scope.toString().includes(role.roleId)\n )\n \n if (assignedRole) {\n return assignedRole\n }\n }\n \n // If no specific role found, return default role (if exists)\n return rbac.roles.find(role => role.name === 'default') ?? null\n }\n\n /**\n * Check if permission string is valid\n */\n static isValidPermission(permission: string): boolean {\n // In production, validate against known permission strings\n return permission.length > 0 && permission.length < 100\n }\n\n /**\n * Validate role configuration\n */\n static validateRole(role: Role): { valid: boolean; error?: string } {\n if (!role.name || role.name.trim().length === 0) {\n return { valid: false, error: 'Role name is required' }\n }\n\n if (role.name.length > 50) {\n return { valid: false, error: 'Role name cannot exceed 50 characters' }\n }\n\n if (role.permissions.length === 0) {\n return { valid: false, error: 'Role must have at least one permission' }\n }\n\n if (role.permissions.length > 20) {\n return { valid: false, error: 'Role cannot have more than 20 permissions' }\n }\n\n return { valid: true }\n }\n\n /**\n * Generate permission summary\n */\n static generatePermissionSummary(permissions: Permission[]): string {\n if (permissions.length === 0) return 'No permissions'\n if (permissions.length === 1) return '1 permission'\n return `${permissions.length} permissions`\n }\n}\n\n// =====================================================\n// VOTING UTILITIES\n// =====================================================\n\nexport class VotingUtils {\n /**\n * Calculate vote weight based on token holdings or other factors\n */\n static calculateVoteWeight(\n baseWeight: number,\n tokenBalance?: bigint,\n stakeDuration?: bigint\n ): number {\n let weight = baseWeight\n\n // Apply token-based multiplier\n if (tokenBalance) {\n const tokenMultiplier = Math.min(Number(tokenBalance / 1000000n), 10) // Cap at 10x\n weight *= tokenMultiplier\n }\n\n // Apply time-based multiplier\n if (stakeDuration) {\n const daysStaked = Number(stakeDuration / 86400n)\n const timeMultiplier = 1 + (daysStaked / 365) // +100% per year\n weight *= timeMultiplier\n }\n\n return Math.floor(weight)\n }\n\n /**\n * Format vote choice as string\n */\n static formatVoteChoice(voteChoice: VoteChoice): string {\n switch (voteChoice) {\n case VoteChoice.For:\n return '✅ For'\n case VoteChoice.Against:\n return '❌ Against'\n case VoteChoice.Abstain:\n return '🤷 Abstain'\n default:\n return 'Unknown'\n }\n }\n\n /**\n * Calculate if simple majority is reached\n */\n static hasSimpleMajority(votingResults: VotingResults): boolean {\n return votingResults.votesFor > votingResults.votesAgainst\n }\n\n /**\n * Calculate if supermajority is reached (2/3)\n */\n static hasSupermajority(votingResults: VotingResults): boolean {\n const totalVotes = votingResults.votesFor + votingResults.votesAgainst\n if (totalVotes === 0n) return false\n \n const forPercentage = Number(votingResults.votesFor) / Number(totalVotes)\n return forPercentage >= 0.667\n }\n}\n\n// =====================================================\n// PERMISSION TEMPLATES\n// =====================================================\n\nexport const PERMISSION_TEMPLATES = {\n // Admin permissions\n ADMIN: {\n CREATE_PROPOSAL: { action: 'create', resource: 'proposal' },\n EXECUTE_PROPOSAL: { action: 'execute', resource: 'proposal' },\n MANAGE_ROLES: { action: 'manage', resource: 'roles' },\n MANAGE_TREASURY: { action: 'manage', resource: 'treasury' }\n },\n \n // Member permissions\n MEMBER: {\n VOTE: { action: 'vote', resource: 'proposal' },\n VIEW: { action: 'view', resource: 'all' },\n COMMENT: { action: 'comment', resource: 'proposal' }\n },\n \n // Moderator permissions\n MODERATOR: {\n CANCEL_PROPOSAL: { action: 'cancel', resource: 'proposal' },\n MODERATE_COMMENTS: { action: 'moderate', resource: 'comments' },\n VIEW_REPORTS: { action: 'view', resource: 'reports' }\n }\n}\n\n// =====================================================\n// ROLE TEMPLATES\n// =====================================================\n\nexport const ROLE_TEMPLATES = {\n ADMIN: {\n name: 'Administrator',\n description: 'Full administrative access',\n permissions: Object.values(PERMISSION_TEMPLATES.ADMIN)\n },\n \n MEMBER: {\n name: 'Member',\n description: 'Standard member access',\n permissions: Object.values(PERMISSION_TEMPLATES.MEMBER)\n },\n \n MODERATOR: {\n name: 'Moderator',\n description: 'Content moderation access',\n permissions: [\n ...Object.values(PERMISSION_TEMPLATES.MEMBER),\n ...Object.values(PERMISSION_TEMPLATES.MODERATOR)\n ]\n }\n}\n\n// =====================================================\n// GOVERNANCE ANALYTICS\n// =====================================================\n\nexport interface GovernanceAnalytics {\n totalProposals: number\n activeProposals: number\n passedProposals: number\n failedProposals: number\n averageVoterTurnout: number\n topVoters: { address: Address; voteCount: number }[]\n proposalCategories: { category: string; count: number }[]\n}\n\nexport class GovernanceAnalyticsUtils {\n /**\n * Calculate governance health score (0-100)\n */\n static calculateHealthScore(analytics: GovernanceAnalytics): number {\n let score = 0\n\n // Voter turnout (40 points max)\n score += Math.min(analytics.averageVoterTurnout * 0.4, 40)\n\n // Proposal success rate (30 points max)\n const totalCompleted = analytics.passedProposals + analytics.failedProposals\n if (totalCompleted > 0) {\n const successRate = analytics.passedProposals / totalCompleted\n score += successRate * 30\n }\n\n // Activity level (30 points max)\n const activityRatio = analytics.activeProposals / Math.max(analytics.totalProposals, 1)\n score += Math.min(activityRatio * 60, 30)\n\n return Math.round(score)\n }\n\n /**\n * Generate governance summary report\n */\n static generateSummaryReport(analytics: GovernanceAnalytics): string {\n const healthScore = this.calculateHealthScore(analytics)\n const successRate = analytics.totalProposals > 0\n ? Math.round((analytics.passedProposals / analytics.totalProposals) * 100)\n : 0\n\n return `\nGovernance Summary:\n- Total Proposals: ${analytics.totalProposals}\n- Active: ${analytics.activeProposals}\n- Success Rate: ${successRate}%\n- Avg Turnout: ${Math.round(analytics.averageVoterTurnout)}%\n- Health Score: ${healthScore}/100\n `.trim()\n }\n}"]}
@@ -1,196 +0,0 @@
1
- import { BaseModule, GHOSTSPEAK_PROGRAM_ID } from './chunk-TVVGXYCI.js';
2
- import { NATIVE_MINT_ADDRESS } from './chunk-OWYHJG6H.js';
3
- import { getCreateWorkOrderInstruction, getSubmitWorkDeliveryInstructionAsync, getVerifyWorkDeliveryInstruction, getRejectWorkDeliveryInstruction } from './chunk-COGZFWOT.js';
4
- import { deriveWorkOrderPda, deriveWorkDeliveryPda } from './chunk-ASQXX4IT.js';
5
-
6
- // src/modules/workorders/WorkOrderModule.ts
7
- var WorkOrderModule = class extends BaseModule {
8
- // =====================================================
9
- // DIRECT INSTRUCTION ACCESS
10
- // =====================================================
11
- /**
12
- * Get create work order instruction
13
- */
14
- async getCreateWorkOrderInstruction(params) {
15
- return getCreateWorkOrderInstruction(params);
16
- }
17
- /**
18
- * Get submit work delivery instruction
19
- */
20
- async getSubmitWorkDeliveryInstruction(params) {
21
- return getSubmitWorkDeliveryInstructionAsync(params);
22
- }
23
- /**
24
- * Get verify work delivery instruction
25
- */
26
- getVerifyWorkDeliveryInstruction(params) {
27
- return getVerifyWorkDeliveryInstruction(params);
28
- }
29
- /**
30
- * Get reject work delivery instruction
31
- */
32
- getRejectWorkDeliveryInstruction(params) {
33
- return getRejectWorkDeliveryInstruction(params);
34
- }
35
- // =====================================================
36
- // CONVENIENCE METHODS
37
- // =====================================================
38
- /**
39
- * Create a new work order
40
- */
41
- async createWorkOrder(params) {
42
- const orderId = BigInt(Date.now());
43
- const workOrderAddress = await this.deriveWorkOrderPda(
44
- params.signer.address,
45
- orderId
46
- );
47
- const instruction = await this.getCreateWorkOrderInstruction({
48
- workOrder: workOrderAddress,
49
- client: params.signer,
50
- orderId,
51
- provider: params.provider,
52
- title: params.title,
53
- description: params.description,
54
- requirements: params.requirements,
55
- paymentAmount: params.paymentAmount,
56
- paymentToken: params.paymentToken ?? this.nativeMint,
57
- deadline: BigInt(Math.floor(params.deadline.getTime() / 1e3))
58
- });
59
- return this.execute("createWorkOrder", () => instruction, [params.signer]);
60
- }
61
- /**
62
- * Submit work delivery for a work order
63
- */
64
- async submitDelivery(params) {
65
- const instruction = await this.getSubmitWorkDeliveryInstruction({
66
- workOrder: params.workOrderAddress,
67
- provider: params.signer,
68
- deliverables: params.deliverables,
69
- ipfsHash: params.ipfsHash,
70
- metadataUri: params.metadataUri
71
- });
72
- return this.execute("submitWorkDelivery", () => instruction, [params.signer]);
73
- }
74
- /**
75
- * Verify and approve a work delivery
76
- */
77
- async verifyDelivery(params) {
78
- const instruction = this.getVerifyWorkDeliveryInstruction({
79
- workOrder: params.workOrderAddress,
80
- workDelivery: params.workDeliveryAddress,
81
- client: params.signer,
82
- verificationNotes: params.verificationNotes ?? null
83
- });
84
- return this.execute("verifyWorkDelivery", () => instruction, [params.signer]);
85
- }
86
- /**
87
- * Reject a work delivery with feedback
88
- */
89
- async rejectDelivery(params) {
90
- const instruction = this.getRejectWorkDeliveryInstruction({
91
- workOrder: params.workOrderAddress,
92
- workDelivery: params.workDeliveryAddress,
93
- client: params.signer,
94
- rejectionReason: params.rejectionReason,
95
- requestedChanges: params.requestedChanges ?? null
96
- });
97
- return this.execute("rejectWorkDelivery", () => instruction, [params.signer]);
98
- }
99
- // =====================================================
100
- // QUERY OPERATIONS
101
- // =====================================================
102
- /**
103
- * Get work order account data
104
- */
105
- async getWorkOrder(address) {
106
- return super.getAccount(address, "getWorkOrderDecoder");
107
- }
108
- /**
109
- * Get work delivery account data
110
- */
111
- async getWorkDelivery(address) {
112
- return super.getAccount(address, "getWorkDeliveryDecoder");
113
- }
114
- /**
115
- * Get all work orders
116
- */
117
- async getAllWorkOrders() {
118
- return this.getProgramAccounts("getWorkOrderDecoder");
119
- }
120
- /**
121
- * Get work orders by client address
122
- */
123
- async getWorkOrdersByClient(client) {
124
- const filters = [
125
- {
126
- memcmp: {
127
- offset: BigInt(8),
128
- // Skip discriminator
129
- bytes: client,
130
- encoding: "base58"
131
- }
132
- }
133
- ];
134
- return this.getProgramAccounts("getWorkOrderDecoder", filters);
135
- }
136
- /**
137
- * Get work orders by provider address
138
- */
139
- async getWorkOrdersByProvider(provider) {
140
- const filters = [
141
- {
142
- memcmp: {
143
- offset: BigInt(40),
144
- // Skip discriminator + client (8 + 32)
145
- bytes: provider,
146
- encoding: "base58"
147
- }
148
- }
149
- ];
150
- return this.getProgramAccounts("getWorkOrderDecoder", filters);
151
- }
152
- /**
153
- * Get work order by address (alias)
154
- */
155
- async getWorkOrderByAddress(address) {
156
- const data = await this.getWorkOrder(address);
157
- if (!data) return null;
158
- return { address, data };
159
- }
160
- /**
161
- * Get work delivery for a work order
162
- */
163
- async getWorkDeliveryForOrder(workOrderAddress) {
164
- const filters = [
165
- {
166
- memcmp: {
167
- offset: BigInt(8),
168
- // Skip discriminator
169
- bytes: workOrderAddress,
170
- encoding: "base58"
171
- }
172
- }
173
- ];
174
- const results = await this.getProgramAccounts(
175
- "getWorkDeliveryDecoder",
176
- filters
177
- );
178
- return results.length > 0 ? results[0] : null;
179
- }
180
- // =====================================================
181
- // HELPER METHODS
182
- // =====================================================
183
- async deriveWorkOrderPda(client, orderId) {
184
- return await deriveWorkOrderPda(GHOSTSPEAK_PROGRAM_ID, client, orderId);
185
- }
186
- async _deriveWorkDeliveryPda(workOrder, provider) {
187
- return await deriveWorkDeliveryPda(GHOSTSPEAK_PROGRAM_ID, workOrder, provider);
188
- }
189
- get nativeMint() {
190
- return NATIVE_MINT_ADDRESS;
191
- }
192
- };
193
-
194
- export { WorkOrderModule };
195
- //# sourceMappingURL=chunk-ZWOYNHVK.js.map
196
- //# sourceMappingURL=chunk-ZWOYNHVK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/modules/workorders/WorkOrderModule.ts"],"names":[],"mappings":"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","file":"chunk-ZWOYNHVK.js","sourcesContent":["import type { Address } from '@solana/addresses'\nimport type { TransactionSigner } from '@solana/kit'\nimport { BaseModule } from '../../core/BaseModule.js'\nimport { NATIVE_MINT_ADDRESS } from '../../constants/system-addresses.js'\nimport { GHOSTSPEAK_PROGRAM_ID } from '../../constants/ghostspeak.js'\nimport { deriveWorkOrderPda, deriveWorkDeliveryPda } from '../../utils/pda.js'\nimport {\n getCreateWorkOrderInstruction,\n getSubmitWorkDeliveryInstructionAsync,\n getVerifyWorkDeliveryInstruction,\n getRejectWorkDeliveryInstruction,\n type WorkOrder,\n type WorkDelivery,\n type WorkOrderStatus,\n type Deliverable,\n} from '../../generated/index.js'\n\n// =====================================================\n// TYPE DEFINITIONS\n// =====================================================\n\nexport interface CreateWorkOrderParams {\n signer: TransactionSigner\n provider: Address\n title: string\n description: string\n requirements: string[]\n paymentAmount: bigint\n paymentToken?: Address\n deadline: Date\n}\n\nexport interface SubmitDeliveryParams {\n signer: TransactionSigner\n workOrderAddress: Address\n deliverables: Deliverable[]\n ipfsHash: string\n metadataUri: string\n}\n\nexport interface VerifyDeliveryParams {\n signer: TransactionSigner\n workOrderAddress: Address\n workDeliveryAddress: Address\n verificationNotes?: string\n}\n\nexport interface RejectDeliveryParams {\n signer: TransactionSigner\n workOrderAddress: Address\n workDeliveryAddress: Address\n rejectionReason: string\n requestedChanges?: string[]\n}\n\n/**\n * Work Order management module\n *\n * Provides high-level access to work order operations including:\n * - Creating work orders for task delegation\n * - Submitting work deliveries\n * - Verifying and approving deliveries\n * - Rejecting deliveries with feedback\n */\nexport class WorkOrderModule extends BaseModule {\n // =====================================================\n // DIRECT INSTRUCTION ACCESS\n // =====================================================\n\n /**\n * Get create work order instruction\n */\n async getCreateWorkOrderInstruction(params: {\n workOrder: Address\n client: TransactionSigner\n orderId: bigint\n provider: Address\n title: string\n description: string\n requirements: string[]\n paymentAmount: bigint\n paymentToken: Address\n deadline: bigint\n }) {\n return getCreateWorkOrderInstruction(params)\n }\n\n /**\n * Get submit work delivery instruction\n */\n async getSubmitWorkDeliveryInstruction(params: {\n workOrder: Address\n provider: TransactionSigner\n deliverables: Deliverable[]\n ipfsHash: string\n metadataUri: string\n }) {\n return getSubmitWorkDeliveryInstructionAsync(params)\n }\n\n /**\n * Get verify work delivery instruction\n */\n getVerifyWorkDeliveryInstruction(params: {\n workOrder: Address\n workDelivery: Address\n client: TransactionSigner\n verificationNotes: string | null\n }) {\n return getVerifyWorkDeliveryInstruction(params)\n }\n\n /**\n * Get reject work delivery instruction\n */\n getRejectWorkDeliveryInstruction(params: {\n workOrder: Address\n workDelivery: Address\n client: TransactionSigner\n rejectionReason: string\n requestedChanges: string[] | null\n }) {\n return getRejectWorkDeliveryInstruction(params)\n }\n\n // =====================================================\n // CONVENIENCE METHODS\n // =====================================================\n\n /**\n * Create a new work order\n */\n async createWorkOrder(params: CreateWorkOrderParams): Promise<string> {\n const orderId = BigInt(Date.now())\n const workOrderAddress = await this.deriveWorkOrderPda(\n params.signer.address,\n orderId\n )\n\n const instruction = await this.getCreateWorkOrderInstruction({\n workOrder: workOrderAddress,\n client: params.signer,\n orderId,\n provider: params.provider,\n title: params.title,\n description: params.description,\n requirements: params.requirements,\n paymentAmount: params.paymentAmount,\n paymentToken: params.paymentToken ?? this.nativeMint,\n deadline: BigInt(Math.floor(params.deadline.getTime() / 1000)),\n })\n\n return this.execute('createWorkOrder', () => instruction, [params.signer])\n }\n\n /**\n * Submit work delivery for a work order\n */\n async submitDelivery(params: SubmitDeliveryParams): Promise<string> {\n const instruction = await this.getSubmitWorkDeliveryInstruction({\n workOrder: params.workOrderAddress,\n provider: params.signer,\n deliverables: params.deliverables,\n ipfsHash: params.ipfsHash,\n metadataUri: params.metadataUri,\n })\n\n return this.execute('submitWorkDelivery', () => instruction, [params.signer])\n }\n\n /**\n * Verify and approve a work delivery\n */\n async verifyDelivery(params: VerifyDeliveryParams): Promise<string> {\n const instruction = this.getVerifyWorkDeliveryInstruction({\n workOrder: params.workOrderAddress,\n workDelivery: params.workDeliveryAddress,\n client: params.signer,\n verificationNotes: params.verificationNotes ?? null,\n })\n\n return this.execute('verifyWorkDelivery', () => instruction, [params.signer])\n }\n\n /**\n * Reject a work delivery with feedback\n */\n async rejectDelivery(params: RejectDeliveryParams): Promise<string> {\n const instruction = this.getRejectWorkDeliveryInstruction({\n workOrder: params.workOrderAddress,\n workDelivery: params.workDeliveryAddress,\n client: params.signer,\n rejectionReason: params.rejectionReason,\n requestedChanges: params.requestedChanges ?? null,\n })\n\n return this.execute('rejectWorkDelivery', () => instruction, [params.signer])\n }\n\n // =====================================================\n // QUERY OPERATIONS\n // =====================================================\n\n /**\n * Get work order account data\n */\n async getWorkOrder(address: Address): Promise<WorkOrder | null> {\n return super.getAccount<WorkOrder>(address, 'getWorkOrderDecoder')\n }\n\n /**\n * Get work delivery account data\n */\n async getWorkDelivery(address: Address): Promise<WorkDelivery | null> {\n return super.getAccount<WorkDelivery>(address, 'getWorkDeliveryDecoder')\n }\n\n /**\n * Get all work orders\n */\n async getAllWorkOrders(): Promise<{ address: Address; data: WorkOrder }[]> {\n return this.getProgramAccounts<WorkOrder>('getWorkOrderDecoder')\n }\n\n /**\n * Get work orders by client address\n */\n async getWorkOrdersByClient(\n client: Address\n ): Promise<{ address: Address; data: WorkOrder }[]> {\n const filters = [\n {\n memcmp: {\n offset: BigInt(8), // Skip discriminator\n bytes: client as string,\n encoding: 'base58' as const,\n },\n },\n ]\n\n return this.getProgramAccounts<WorkOrder>('getWorkOrderDecoder', filters)\n }\n\n /**\n * Get work orders by provider address\n */\n async getWorkOrdersByProvider(\n provider: Address\n ): Promise<{ address: Address; data: WorkOrder }[]> {\n const filters = [\n {\n memcmp: {\n offset: BigInt(40), // Skip discriminator + client (8 + 32)\n bytes: provider as string,\n encoding: 'base58' as const,\n },\n },\n ]\n\n return this.getProgramAccounts<WorkOrder>('getWorkOrderDecoder', filters)\n }\n\n /**\n * Get work order by address (alias)\n */\n async getWorkOrderByAddress(\n address: Address\n ): Promise<{ address: Address; data: WorkOrder } | null> {\n const data = await this.getWorkOrder(address)\n if (!data) return null\n return { address, data }\n }\n\n /**\n * Get work delivery for a work order\n */\n async getWorkDeliveryForOrder(\n workOrderAddress: Address\n ): Promise<{ address: Address; data: WorkDelivery } | null> {\n const filters = [\n {\n memcmp: {\n offset: BigInt(8), // Skip discriminator\n bytes: workOrderAddress as string,\n encoding: 'base58' as const,\n },\n },\n ]\n\n const results = await this.getProgramAccounts<WorkDelivery>(\n 'getWorkDeliveryDecoder',\n filters\n )\n return results.length > 0 ? results[0] : null\n }\n\n // =====================================================\n // HELPER METHODS\n // =====================================================\n\n private async deriveWorkOrderPda(\n client: Address,\n orderId: bigint\n ): Promise<Address> {\n return await deriveWorkOrderPda(GHOSTSPEAK_PROGRAM_ID, client, orderId)\n }\n\n private async _deriveWorkDeliveryPda(\n workOrder: Address,\n provider: Address\n ): Promise<Address> {\n return await deriveWorkDeliveryPda(GHOSTSPEAK_PROGRAM_ID, workOrder, provider)\n }\n\n private get nativeMint(): Address {\n return NATIVE_MINT_ADDRESS\n }\n}\n\n// Re-export types\nexport type { WorkOrder, WorkDelivery, WorkOrderStatus, Deliverable }\n"]}