@ghostspeak/sdk 2.0.6 → 2.0.7
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.
- package/README.md +152 -30
- package/dist/GhostSpeakClient-CWmGaM9Q.d.ts +1007 -0
- package/dist/StakingModule-C5rzuOWb.d.ts +2526 -0
- package/dist/{agent-M74TCRON.js → agent-5YLZ7DAC.js} +4 -4
- package/dist/{agent-M74TCRON.js.map → agent-5YLZ7DAC.js.map} +1 -1
- package/dist/batch-operations-45CQFEID.js +4 -0
- package/dist/batch-operations-45CQFEID.js.map +1 -0
- package/dist/browser.d.ts +45 -554
- package/dist/browser.js +15 -842
- package/dist/browser.js.map +1 -1
- package/dist/chunk-AL3HQN73.js +754 -0
- package/dist/chunk-AL3HQN73.js.map +1 -0
- package/dist/chunk-BF3IQ35I.js +284 -0
- package/dist/chunk-BF3IQ35I.js.map +1 -0
- package/dist/chunk-BQDGRTVP.js +168 -0
- package/dist/chunk-BQDGRTVP.js.map +1 -0
- package/dist/chunk-C5CDA3WX.js +7314 -0
- package/dist/chunk-C5CDA3WX.js.map +1 -0
- package/dist/chunk-E3FD2CNY.js +1869 -0
- package/dist/chunk-E3FD2CNY.js.map +1 -0
- package/dist/{chunk-F3DZMBUA.js → chunk-G7S6B6WB.js} +327 -493
- package/dist/chunk-G7S6B6WB.js.map +1 -0
- package/dist/chunk-IHVDQ4YI.js +4231 -0
- package/dist/chunk-IHVDQ4YI.js.map +1 -0
- package/dist/chunk-JV2SWONF.js +98 -0
- package/dist/chunk-JV2SWONF.js.map +1 -0
- package/dist/chunk-KB6CKIUK.js +231 -0
- package/dist/chunk-KB6CKIUK.js.map +1 -0
- package/dist/chunk-S74EH3KD.js +7890 -0
- package/dist/chunk-S74EH3KD.js.map +1 -0
- package/dist/chunk-SFTSZ3LC.js +156 -0
- package/dist/chunk-SFTSZ3LC.js.map +1 -0
- package/dist/chunk-SKMJJ3Q6.js +125 -0
- package/dist/chunk-SKMJJ3Q6.js.map +1 -0
- package/dist/chunk-SZGFSCNU.js +3682 -0
- package/dist/chunk-SZGFSCNU.js.map +1 -0
- package/dist/chunk-TTB4OS2D.js +69 -0
- package/dist/chunk-TTB4OS2D.js.map +1 -0
- package/dist/chunk-UP2VWCW5.js +33 -0
- package/dist/{chunk-NSBPE2FW.js.map → chunk-UP2VWCW5.js.map} +1 -1
- package/dist/{chunk-UJUGGLMT.js → chunk-VQZQCHUT.js} +5 -5
- package/dist/{chunk-UJUGGLMT.js.map → chunk-VQZQCHUT.js.map} +1 -1
- package/dist/client.d.ts +5 -4
- package/dist/client.js +11 -10
- package/dist/createAgentAuthorization-ULG47ZJI.js +5 -0
- package/dist/createAgentAuthorization-ULG47ZJI.js.map +1 -0
- package/dist/credentials.js +1 -1
- package/dist/crypto.js +2 -2
- package/dist/errors.js +1 -1
- package/dist/feature-flags-B1g0DCPe.d.ts +1181 -0
- package/dist/generated-EG5USUFG.js +9 -0
- package/dist/{generated-VNLHMR6Y.js.map → generated-EG5USUFG.js.map} +1 -1
- package/dist/{ghostspeak_wasm-SB2RPJ3D.js → ghostspeak_wasm-F227HOSM.js} +3 -3
- package/dist/{ghostspeak_wasm-SB2RPJ3D.js.map → ghostspeak_wasm-F227HOSM.js.map} +1 -1
- package/dist/index.d.ts +1209 -1506
- package/dist/index.js +600 -3532
- package/dist/index.js.map +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/minimal/core-minimal.d.ts +2383 -1264
- package/dist/minimal/core-minimal.js +9 -9
- package/dist/minimal/core-minimal.js.map +1 -1
- package/dist/nacl-fast-W5BJ3KZ2.js +2229 -0
- package/dist/nacl-fast-W5BJ3KZ2.js.map +1 -0
- package/dist/pda-4KP7CURF.js +4 -0
- package/dist/pda-4KP7CURF.js.map +1 -0
- package/dist/pda-Ce7VYg4T.d.ts +25 -0
- package/dist/reputation-types-Yebf0Rm_.d.ts +1071 -0
- package/dist/revokeAuthorization-OK7E7OK3.js +5 -0
- package/dist/revokeAuthorization-OK7E7OK3.js.map +1 -0
- package/dist/signature-verification-DGxR4aYQ.d.ts +448 -0
- package/dist/types.js +1 -1
- package/dist/updateReputationWithAuth-Y4ONEVSP.js +5 -0
- package/dist/updateReputationWithAuth-Y4ONEVSP.js.map +1 -0
- package/dist/utils.d.ts +69 -203
- package/dist/utils.js +15 -153
- package/dist/utils.js.map +1 -1
- package/package.json +24 -31
- package/dist/.tsbuildinfo +0 -1
- package/dist/GhostSpeakClient-D_66Uzsf.d.ts +0 -707
- package/dist/GovernanceModule-DQYYys-H.d.ts +0 -1766
- package/dist/chunk-APCKGD23.js +0 -1328
- package/dist/chunk-APCKGD23.js.map +0 -1
- package/dist/chunk-ASQXX4IT.js +0 -572
- package/dist/chunk-ASQXX4IT.js.map +0 -1
- package/dist/chunk-COGZFWOT.js +0 -19657
- package/dist/chunk-COGZFWOT.js.map +0 -1
- package/dist/chunk-F3DZMBUA.js.map +0 -1
- package/dist/chunk-GMHIUK2R.js +0 -7526
- package/dist/chunk-GMHIUK2R.js.map +0 -1
- package/dist/chunk-IAWBZYPE.js +0 -356
- package/dist/chunk-IAWBZYPE.js.map +0 -1
- package/dist/chunk-NSBPE2FW.js +0 -15
- package/dist/chunk-OWYHJG6H.js +0 -13311
- package/dist/chunk-OWYHJG6H.js.map +0 -1
- package/dist/chunk-RDDPOFR5.js +0 -3
- package/dist/chunk-RDDPOFR5.js.map +0 -1
- package/dist/chunk-RERCHKZP.js +0 -35
- package/dist/chunk-RERCHKZP.js.map +0 -1
- package/dist/chunk-TVVGXYCI.js +0 -2887
- package/dist/chunk-TVVGXYCI.js.map +0 -1
- package/dist/chunk-ZGP5552B.js +0 -377
- package/dist/chunk-ZGP5552B.js.map +0 -1
- package/dist/chunk-ZWOYNHVK.js +0 -196
- package/dist/chunk-ZWOYNHVK.js.map +0 -1
- package/dist/dist/.tsbuildinfo +0 -1
- package/dist/elgamal-VZLWB3XK.js +0 -5
- package/dist/elgamal-VZLWB3XK.js.map +0 -1
- package/dist/feature-flags-V722ZuXO.d.ts +0 -3512
- package/dist/generated-VNLHMR6Y.js +0 -5
- package/dist/ipfs-types-BOt9ZNg4.d.ts +0 -592
- package/dist/multisigConfig-BzEhy6jy.d.ts +0 -58
- package/dist/pda-B_nS8SbD.d.ts +0 -114
- package/dist/pda-S4BFJVGE.js +0 -4
- package/dist/pda-S4BFJVGE.js.map +0 -1
- package/dist/system-addresses-BFNLEbFx.d.ts +0 -857
- package/dist/token-2022-rpc-RALH4RK7.js +0 -593
- package/dist/token-2022-rpc-RALH4RK7.js.map +0 -1
package/dist/chunk-ZGP5552B.js
DELETED
|
@@ -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":"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","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}"]}
|
package/dist/chunk-ZWOYNHVK.js
DELETED
|
@@ -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"]}
|