@zemyth/raise-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +416 -0
  2. package/dist/accounts/index.cjs +258 -0
  3. package/dist/accounts/index.cjs.map +1 -0
  4. package/dist/accounts/index.d.cts +115 -0
  5. package/dist/accounts/index.d.ts +115 -0
  6. package/dist/accounts/index.js +245 -0
  7. package/dist/accounts/index.js.map +1 -0
  8. package/dist/constants/index.cjs +174 -0
  9. package/dist/constants/index.cjs.map +1 -0
  10. package/dist/constants/index.d.cts +143 -0
  11. package/dist/constants/index.d.ts +143 -0
  12. package/dist/constants/index.js +158 -0
  13. package/dist/constants/index.js.map +1 -0
  14. package/dist/errors/index.cjs +177 -0
  15. package/dist/errors/index.cjs.map +1 -0
  16. package/dist/errors/index.d.cts +83 -0
  17. package/dist/errors/index.d.ts +83 -0
  18. package/dist/errors/index.js +170 -0
  19. package/dist/errors/index.js.map +1 -0
  20. package/dist/index.cjs +2063 -0
  21. package/dist/index.cjs.map +1 -0
  22. package/dist/index.d.cts +680 -0
  23. package/dist/index.d.ts +680 -0
  24. package/dist/index.js +1926 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/instructions/index.cjs +852 -0
  27. package/dist/instructions/index.cjs.map +1 -0
  28. package/dist/instructions/index.d.cts +452 -0
  29. package/dist/instructions/index.d.ts +452 -0
  30. package/dist/instructions/index.js +809 -0
  31. package/dist/instructions/index.js.map +1 -0
  32. package/dist/pdas/index.cjs +241 -0
  33. package/dist/pdas/index.cjs.map +1 -0
  34. package/dist/pdas/index.d.cts +171 -0
  35. package/dist/pdas/index.d.ts +171 -0
  36. package/dist/pdas/index.js +217 -0
  37. package/dist/pdas/index.js.map +1 -0
  38. package/dist/types/index.cjs +44 -0
  39. package/dist/types/index.cjs.map +1 -0
  40. package/dist/types/index.d.cts +229 -0
  41. package/dist/types/index.d.ts +229 -0
  42. package/dist/types/index.js +39 -0
  43. package/dist/types/index.js.map +1 -0
  44. package/package.json +130 -0
  45. package/src/accounts/index.ts +329 -0
  46. package/src/client.ts +715 -0
  47. package/src/constants/index.ts +205 -0
  48. package/src/errors/index.ts +222 -0
  49. package/src/events/index.ts +256 -0
  50. package/src/index.ts +253 -0
  51. package/src/instructions/index.ts +1504 -0
  52. package/src/pdas/index.ts +404 -0
  53. package/src/types/index.ts +267 -0
  54. package/src/utils/index.ts +277 -0
@@ -0,0 +1,852 @@
1
+ 'use strict';
2
+
3
+ var anchor = require('@coral-xyz/anchor');
4
+ var web3_js = require('@solana/web3.js');
5
+ var splToken = require('@solana/spl-token');
6
+
7
+ // src/instructions/index.ts
8
+
9
+ // src/constants/index.ts
10
+ var SEEDS = {
11
+ PROJECT: "project",
12
+ MILESTONE: "milestone",
13
+ INVESTMENT: "investment",
14
+ VOTE: "vote",
15
+ ESCROW: "escrow",
16
+ PIVOT: "pivot",
17
+ TGE_ESCROW: "tge_escrow",
18
+ ADMIN_CONFIG: "admin-config",
19
+ NFT_MINT: "nft_mint",
20
+ AUTHORITY: "authority"
21
+ };
22
+
23
+ // src/pdas/index.ts
24
+ function ensureBN(value) {
25
+ if (value && typeof value.toArrayLike === "function") {
26
+ return value;
27
+ }
28
+ return new anchor.BN(String(value));
29
+ }
30
+ function getProjectPDA(projectId, programId) {
31
+ const projectIdBN = ensureBN(projectId);
32
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
33
+ [Buffer.from(SEEDS.PROJECT), projectIdBN.toArrayLike(Buffer, "le", 8)],
34
+ programId
35
+ );
36
+ return pda;
37
+ }
38
+ function getEscrowPDA(projectId, programId) {
39
+ const projectIdBN = ensureBN(projectId);
40
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
41
+ [Buffer.from(SEEDS.ESCROW), projectIdBN.toArrayLike(Buffer, "le", 8)],
42
+ programId
43
+ );
44
+ return pda;
45
+ }
46
+ function getMilestonePDA(projectPda, milestoneIndex, programId) {
47
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
48
+ [
49
+ Buffer.from(SEEDS.MILESTONE),
50
+ projectPda.toBuffer(),
51
+ Buffer.from([milestoneIndex])
52
+ ],
53
+ programId
54
+ );
55
+ return pda;
56
+ }
57
+ function getInvestmentPDA(projectPda, nftMint, programId) {
58
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
59
+ [
60
+ Buffer.from(SEEDS.INVESTMENT),
61
+ projectPda.toBuffer(),
62
+ nftMint.toBuffer()
63
+ ],
64
+ programId
65
+ );
66
+ return pda;
67
+ }
68
+ function getVotePDA(milestonePda, voterKey, votingRound, programId) {
69
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
70
+ [Buffer.from(SEEDS.VOTE), milestonePda.toBuffer(), voterKey.toBuffer(), Buffer.from([votingRound])],
71
+ programId
72
+ );
73
+ return pda;
74
+ }
75
+ function getPivotProposalPDA(projectPda, pivotCount, programId) {
76
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
77
+ [
78
+ Buffer.from(SEEDS.PIVOT),
79
+ // Use PIVOT seed, not PIVOT_PROPOSAL
80
+ projectPda.toBuffer(),
81
+ Buffer.from([pivotCount])
82
+ // pivot_count is u8 (1 byte) on-chain
83
+ ],
84
+ programId
85
+ );
86
+ return pda;
87
+ }
88
+ function getTgeEscrowPDA(projectPda, programId) {
89
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
90
+ [Buffer.from(SEEDS.TGE_ESCROW), projectPda.toBuffer()],
91
+ programId
92
+ );
93
+ return pda;
94
+ }
95
+ function getTokenVaultPDA(projectPda, programId) {
96
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
97
+ [Buffer.from("token_vault"), projectPda.toBuffer()],
98
+ programId
99
+ );
100
+ return pda;
101
+ }
102
+ function getAdminConfigPDA(programId) {
103
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
104
+ [Buffer.from(SEEDS.ADMIN_CONFIG)],
105
+ programId
106
+ );
107
+ return pda;
108
+ }
109
+ function getNftMintPDA(projectId, investor, investmentCount, programId) {
110
+ const projectIdBN = ensureBN(projectId);
111
+ const countBN = ensureBN(investmentCount);
112
+ return web3_js.PublicKey.findProgramAddressSync(
113
+ [
114
+ Buffer.from(SEEDS.NFT_MINT),
115
+ projectIdBN.toArrayLike(Buffer, "le", 8),
116
+ investor.toBuffer(),
117
+ countBN.toArrayLike(Buffer, "le", 8)
118
+ // u64 is 8 bytes LE
119
+ ],
120
+ programId
121
+ );
122
+ }
123
+ function getProgramAuthorityPDA(programId) {
124
+ return web3_js.PublicKey.findProgramAddressSync(
125
+ [Buffer.from(SEEDS.AUTHORITY)],
126
+ programId
127
+ );
128
+ }
129
+ function getTokenomicsPDA(projectPda, programId) {
130
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
131
+ [Buffer.from("tokenomics"), projectPda.toBuffer()],
132
+ programId
133
+ );
134
+ return pda;
135
+ }
136
+ function getTokenMintPDA(projectPda, programId) {
137
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
138
+ [Buffer.from("token_mint"), projectPda.toBuffer()],
139
+ programId
140
+ );
141
+ return pda;
142
+ }
143
+ function getVaultAuthorityPDA(projectPda, programId) {
144
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
145
+ [Buffer.from("vault_authority"), projectPda.toBuffer()],
146
+ programId
147
+ );
148
+ return pda;
149
+ }
150
+ function getInvestorVaultPDA(projectPda, programId) {
151
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
152
+ [Buffer.from("investor_vault"), projectPda.toBuffer()],
153
+ programId
154
+ );
155
+ return pda;
156
+ }
157
+ function getFounderVaultPDA(projectPda, programId) {
158
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
159
+ [Buffer.from("founder_vault"), projectPda.toBuffer()],
160
+ programId
161
+ );
162
+ return pda;
163
+ }
164
+ function getLpTokenVaultPDA(projectPda, programId) {
165
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
166
+ [Buffer.from("lp_token_vault"), projectPda.toBuffer()],
167
+ programId
168
+ );
169
+ return pda;
170
+ }
171
+ function getTreasuryVaultPDA(projectPda, programId) {
172
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
173
+ [Buffer.from("treasury_vault"), projectPda.toBuffer()],
174
+ programId
175
+ );
176
+ return pda;
177
+ }
178
+ function getLpUsdcVaultPDA(projectPda, programId) {
179
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
180
+ [Buffer.from("lp_usdc_vault"), projectPda.toBuffer()],
181
+ programId
182
+ );
183
+ return pda;
184
+ }
185
+ function getFounderVestingPDA(projectPda, programId) {
186
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
187
+ [Buffer.from("founder_vesting"), projectPda.toBuffer()],
188
+ programId
189
+ );
190
+ return pda;
191
+ }
192
+ var TOKEN_METADATA_PROGRAM_ID = new web3_js.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
193
+ function ensurePublicKey(value) {
194
+ if (value instanceof web3_js.PublicKey) {
195
+ return value;
196
+ }
197
+ return new web3_js.PublicKey(String(value));
198
+ }
199
+ function getMethods(program) {
200
+ return program.methods;
201
+ }
202
+ function getAccountNamespace(program) {
203
+ return program.account;
204
+ }
205
+ async function initializeAdmin(program, admin, payer) {
206
+ return getMethods(program).initializeAdmin().accounts({
207
+ admin,
208
+ payer
209
+ }).rpc();
210
+ }
211
+ async function transferAdmin(program, adminKeypair, newAdmin) {
212
+ return getMethods(program).transferAdmin().accounts({
213
+ authority: adminKeypair.publicKey,
214
+ newAdmin
215
+ }).signers([adminKeypair]).rpc();
216
+ }
217
+ async function acceptAdmin(program, newAuthority) {
218
+ return getMethods(program).acceptAdmin().accounts({
219
+ newAuthority
220
+ }).rpc();
221
+ }
222
+ function symbolToBytes(symbol) {
223
+ const bytes = new Array(8).fill(0);
224
+ const chars = symbol.toUpperCase().slice(0, 8);
225
+ for (let i = 0; i < chars.length; i++) {
226
+ bytes[i] = chars.charCodeAt(i);
227
+ }
228
+ return bytes;
229
+ }
230
+ var MIN_DEADLINE_DURATION_SECONDS_PROD = 604800;
231
+ var MIN_DEADLINE_DURATION_SECONDS_DEV = 60;
232
+ var MAX_DEADLINE_DURATION_SECONDS = 31536e3;
233
+ function calculateDeadline(daysFromNow, isDev = false) {
234
+ const nowSeconds = Math.floor(Date.now() / 1e3);
235
+ const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;
236
+ const daysInSeconds = daysFromNow * 24 * 60 * 60;
237
+ const deadlineSeconds = nowSeconds + Math.max(daysInSeconds, minDuration);
238
+ const maxDeadline = nowSeconds + MAX_DEADLINE_DURATION_SECONDS;
239
+ return new anchor.BN(Math.min(deadlineSeconds, maxDeadline));
240
+ }
241
+ function minDeadline(isDev = false) {
242
+ const nowSeconds = Math.floor(Date.now() / 1e3);
243
+ const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;
244
+ return new anchor.BN(nowSeconds + minDuration + 1);
245
+ }
246
+ function validateDeadline(deadline, isDev = false) {
247
+ const nowSeconds = Math.floor(Date.now() / 1e3);
248
+ const deadlineSeconds = deadline.toNumber();
249
+ const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;
250
+ const minDeadline2 = nowSeconds + minDuration;
251
+ const maxDeadline = nowSeconds + MAX_DEADLINE_DURATION_SECONDS;
252
+ if (deadlineSeconds < minDeadline2) {
253
+ const minDays = isDev ? "60 seconds" : "7 days";
254
+ return {
255
+ valid: false,
256
+ error: `Deadline must be at least ${minDays} from now`
257
+ };
258
+ }
259
+ if (deadlineSeconds > maxDeadline) {
260
+ return {
261
+ valid: false,
262
+ error: "Deadline must be within 1 year from now"
263
+ };
264
+ }
265
+ return { valid: true };
266
+ }
267
+ async function initializeProject(program, args, founder) {
268
+ return getMethods(program).initializeProject({
269
+ projectId: args.projectId,
270
+ fundingGoal: args.fundingGoal,
271
+ metadataUri: args.metadataUri,
272
+ tiers: args.tiers,
273
+ tokenomics: {
274
+ tokenSymbol: args.tokenomics.tokenSymbol,
275
+ totalSupply: args.tokenomics.totalSupply,
276
+ investorAllocationBps: args.tokenomics.investorAllocationBps,
277
+ lpTokenAllocationBps: args.tokenomics.lpTokenAllocationBps,
278
+ lpUsdcAllocationBps: args.tokenomics.lpUsdcAllocationBps,
279
+ founderAllocationBps: args.tokenomics.founderAllocationBps ?? null,
280
+ treasuryAllocationBps: args.tokenomics.treasuryAllocationBps ?? null,
281
+ founderWallet: args.tokenomics.founderWallet ?? null,
282
+ vestingDurationMonths: args.tokenomics.vestingDurationMonths ?? null,
283
+ cliffMonths: args.tokenomics.cliffMonths ?? null
284
+ },
285
+ milestone1Deadline: args.milestone1Deadline
286
+ }).accounts({
287
+ founder
288
+ }).rpc();
289
+ }
290
+ async function submitForApproval(program, projectId, founder) {
291
+ const projectPda = getProjectPDA(projectId, program.programId);
292
+ return getMethods(program).submitForApproval().accounts({
293
+ project: projectPda,
294
+ founder
295
+ }).rpc();
296
+ }
297
+ async function approveProject(program, args, adminKeypair) {
298
+ const projectPda = getProjectPDA(args.projectId, program.programId);
299
+ const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);
300
+ const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);
301
+ const tokenMintPda = getTokenMintPDA(projectPda, program.programId);
302
+ const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);
303
+ const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);
304
+ const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);
305
+ const lpTokenVaultPda = getLpTokenVaultPDA(projectPda, program.programId);
306
+ const treasuryVaultPda = getTreasuryVaultPDA(projectPda, program.programId);
307
+ const lpUsdcVaultPda = getLpUsdcVaultPDA(projectPda, program.programId);
308
+ return getMethods(program).approveProject().accounts({
309
+ project: projectPda,
310
+ tokenomics: tokenomicsPda,
311
+ tokenVault: tokenVaultPda,
312
+ tokenMint: tokenMintPda,
313
+ vaultAuthority: vaultAuthorityPda,
314
+ investorVault: investorVaultPda,
315
+ founderVault: founderVaultPda,
316
+ lpTokenVault: lpTokenVaultPda,
317
+ treasuryVault: treasuryVaultPda,
318
+ lpUsdcVault: lpUsdcVaultPda,
319
+ usdcMint: args.usdcMint,
320
+ authority: adminKeypair.publicKey,
321
+ payer: adminKeypair.publicKey
322
+ }).signers([adminKeypair]).rpc();
323
+ }
324
+ async function createMilestone(program, args, founder) {
325
+ const projectPda = getProjectPDA(args.projectId, program.programId);
326
+ const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);
327
+ return getMethods(program).createMilestone({
328
+ milestoneIndex: args.milestoneIndex,
329
+ percentage: args.percentage,
330
+ description: args.description
331
+ }).accounts({
332
+ project: projectPda,
333
+ milestone: milestonePda,
334
+ founder
335
+ }).rpc();
336
+ }
337
+ async function submitMilestone(program, projectId, milestoneIndex, founder) {
338
+ const projectPda = getProjectPDA(projectId, program.programId);
339
+ const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);
340
+ return getMethods(program).submitMilestone().accounts({
341
+ project: projectPda,
342
+ milestone: milestonePda,
343
+ founder
344
+ }).rpc();
345
+ }
346
+ async function voteOnMilestone(program, args, voter) {
347
+ const nftMintPubkey = ensurePublicKey(args.nftMint);
348
+ const projectPda = getProjectPDA(args.projectId, program.programId);
349
+ const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);
350
+ const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);
351
+ const milestone = await getAccountNamespace(program).milestone.fetch(milestonePda);
352
+ const votingRound = milestone.votingRound ?? 0;
353
+ const votePda = getVotePDA(milestonePda, voter, votingRound, program.programId);
354
+ const voterNftAccount = splToken.getAssociatedTokenAddressSync(
355
+ nftMintPubkey,
356
+ voter,
357
+ false,
358
+ // allowOwnerOffCurve
359
+ splToken.TOKEN_PROGRAM_ID
360
+ );
361
+ return getMethods(program).voteOnMilestone({ choice: args.choice }).accounts({
362
+ milestone: milestonePda,
363
+ project: projectPda,
364
+ investment: investmentPda,
365
+ vote: votePda,
366
+ nftMint: nftMintPubkey,
367
+ voterNftAccount,
368
+ voter
369
+ }).rpc();
370
+ }
371
+ async function finalizeVoting(program, projectId, milestoneIndex) {
372
+ const projectPda = getProjectPDA(projectId, program.programId);
373
+ const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);
374
+ return getMethods(program).finalizeVoting().accounts({
375
+ project: projectPda,
376
+ milestone: milestonePda
377
+ }).rpc();
378
+ }
379
+ async function claimMilestoneFunds(program, args, founder) {
380
+ const projectPda = getProjectPDA(args.projectId, program.programId);
381
+ const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);
382
+ const escrowPda = getEscrowPDA(args.projectId, program.programId);
383
+ const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);
384
+ const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);
385
+ const lpUsdcVaultPda = getLpUsdcVaultPDA(projectPda, program.programId);
386
+ const nextMilestonePda = args.nextMilestonePda ?? (args.nextMilestoneDeadline.gt(new anchor.BN(0)) ? getMilestonePDA(projectPda, args.milestoneIndex + 1, program.programId) : null);
387
+ return getMethods(program).claimMilestoneFunds({ nextMilestoneDeadline: args.nextMilestoneDeadline }).accounts({
388
+ milestone: milestonePda,
389
+ project: projectPda,
390
+ founder,
391
+ projectEscrow: args.escrowTokenAccount,
392
+ founderUsdcAccount: args.founderUsdcAccount,
393
+ escrowPda,
394
+ tokenVault: tokenVaultPda,
395
+ tokenomics: tokenomicsPda,
396
+ lpUsdcVault: lpUsdcVaultPda,
397
+ nextMilestone: nextMilestonePda,
398
+ systemProgram: web3_js.SystemProgram.programId,
399
+ tokenProgram: splToken.TOKEN_PROGRAM_ID
400
+ }).rpc();
401
+ }
402
+ async function resubmitMilestone(program, args, founder) {
403
+ const projectPda = getProjectPDA(args.projectId, program.programId);
404
+ const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);
405
+ return getMethods(program).resubmitMilestone().accounts({
406
+ project: projectPda,
407
+ milestone: milestonePda,
408
+ founder
409
+ }).rpc();
410
+ }
411
+ async function setMilestoneDeadline(program, args, founder) {
412
+ const projectPda = getProjectPDA(args.projectId, program.programId);
413
+ const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);
414
+ return getMethods(program).setMilestoneDeadline({
415
+ milestoneIndex: args.milestoneIndex,
416
+ deadline: args.deadline
417
+ }).accounts({
418
+ project: projectPda,
419
+ milestone: milestonePda,
420
+ founder
421
+ }).rpc();
422
+ }
423
+ async function extendMilestoneDeadline(program, args, founder) {
424
+ const projectPda = getProjectPDA(args.projectId, program.programId);
425
+ const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);
426
+ return getMethods(program).extendMilestoneDeadline({
427
+ milestoneIndex: args.milestoneIndex,
428
+ newDeadline: args.newDeadline
429
+ }).accounts({
430
+ project: projectPda,
431
+ milestone: milestonePda,
432
+ founder
433
+ }).rpc();
434
+ }
435
+ function getMetadataPDA(mint) {
436
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
437
+ [
438
+ Buffer.from("metadata"),
439
+ TOKEN_METADATA_PROGRAM_ID.toBuffer(),
440
+ mint.toBuffer()
441
+ ],
442
+ TOKEN_METADATA_PROGRAM_ID
443
+ );
444
+ return pda;
445
+ }
446
+ function getMasterEditionPDA(mint) {
447
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
448
+ [
449
+ Buffer.from("metadata"),
450
+ TOKEN_METADATA_PROGRAM_ID.toBuffer(),
451
+ mint.toBuffer(),
452
+ Buffer.from("edition")
453
+ ],
454
+ TOKEN_METADATA_PROGRAM_ID
455
+ );
456
+ return pda;
457
+ }
458
+ async function invest(program, args, investor) {
459
+ const projectPda = getProjectPDA(args.projectId, program.programId);
460
+ const [nftMint] = getNftMintPDA(args.projectId, investor, args.investmentCount, program.programId);
461
+ const investmentPda = getInvestmentPDA(projectPda, nftMint, program.programId);
462
+ const investorNftAccount = splToken.getAssociatedTokenAddressSync(nftMint, investor);
463
+ const metadataAccount = getMetadataPDA(nftMint);
464
+ const masterEdition = getMasterEditionPDA(nftMint);
465
+ const [programAuthority] = getProgramAuthorityPDA(program.programId);
466
+ const firstMilestonePda = getMilestonePDA(projectPda, 0, program.programId);
467
+ return getMethods(program).invest({ amount: args.amount }).accounts({
468
+ project: projectPda,
469
+ firstMilestone: firstMilestonePda,
470
+ nftMint,
471
+ investment: investmentPda,
472
+ investorNftAccount,
473
+ metadataAccount,
474
+ masterEdition,
475
+ escrowTokenAccount: args.escrowTokenAccount,
476
+ investorTokenAccount: args.investorTokenAccount,
477
+ programAuthority,
478
+ investor,
479
+ tokenProgram: splToken.TOKEN_PROGRAM_ID,
480
+ associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID,
481
+ systemProgram: web3_js.SystemProgram.programId,
482
+ rent: web3_js.SYSVAR_RENT_PUBKEY,
483
+ tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID,
484
+ sysvarInstructions: web3_js.SYSVAR_INSTRUCTIONS_PUBKEY
485
+ }).preInstructions([
486
+ web3_js.ComputeBudgetProgram.setComputeUnitLimit({ units: 4e5 })
487
+ ]).rpc();
488
+ }
489
+ async function cancelInvestment(program, args, investor) {
490
+ const nftMintPubkey = ensurePublicKey(args.nftMint);
491
+ const projectPda = getProjectPDA(args.projectId, program.programId);
492
+ const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);
493
+ const escrowPda = getEscrowPDA(args.projectId, program.programId);
494
+ return getMethods(program).cancelInvestment().accounts({
495
+ investor,
496
+ project: projectPda,
497
+ investment: investmentPda,
498
+ nftMint: nftMintPubkey,
499
+ investorNftAccount: args.investorNftAccount,
500
+ projectEscrow: args.escrowTokenAccount,
501
+ investorUsdcAccount: args.investorUsdcAccount,
502
+ escrowPda
503
+ }).rpc();
504
+ }
505
+ async function proposePivot(program, args, founder) {
506
+ const projectPda = getProjectPDA(args.projectId, program.programId);
507
+ const projectAccount = await getAccountNamespace(program).project.fetch(projectPda);
508
+ const pivotCount = projectAccount.pivotCount || 0;
509
+ const pivotProposalPda = getPivotProposalPDA(projectPda, pivotCount, program.programId);
510
+ return getMethods(program).proposePivot({
511
+ newMetadataUri: args.newMetadataUri,
512
+ newMilestones: args.newMilestones
513
+ }).accounts({
514
+ project: projectPda,
515
+ founder,
516
+ pivotProposal: pivotProposalPda,
517
+ systemProgram: web3_js.SystemProgram.programId,
518
+ clock: web3_js.SYSVAR_CLOCK_PUBKEY
519
+ }).rpc();
520
+ }
521
+ async function approvePivot(program, projectId, adminKeypair) {
522
+ const projectPda = getProjectPDA(projectId, program.programId);
523
+ const projectAccount = await getAccountNamespace(program).project.fetch(projectPda);
524
+ let pivotProposalPda;
525
+ if (projectAccount.activePivot) {
526
+ pivotProposalPda = projectAccount.activePivot;
527
+ } else {
528
+ const pivotCount = projectAccount.pivotCount || 0;
529
+ pivotProposalPda = getPivotProposalPDA(projectPda, pivotCount, program.programId);
530
+ }
531
+ return getMethods(program).approvePivot().accounts({
532
+ moderator: adminKeypair.publicKey,
533
+ project: projectPda,
534
+ pivotProposal: pivotProposalPda
535
+ }).signers([adminKeypair]).rpc();
536
+ }
537
+ async function withdrawFromPivot(program, args, investor) {
538
+ const nftMintPubkey = ensurePublicKey(args.nftMint);
539
+ const projectPda = getProjectPDA(args.projectId, program.programId);
540
+ const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);
541
+ const escrowPda = getEscrowPDA(args.projectId, program.programId);
542
+ const pivotProposalPda = getPivotProposalPDA(projectPda, args.pivotCount, program.programId);
543
+ const investorNftAccount = splToken.getAssociatedTokenAddressSync(
544
+ nftMintPubkey,
545
+ investor,
546
+ false,
547
+ splToken.TOKEN_PROGRAM_ID
548
+ );
549
+ const remainingAccounts = args.milestoneAccounts.map((pubkey) => ({
550
+ pubkey: ensurePublicKey(pubkey),
551
+ isSigner: false,
552
+ isWritable: false
553
+ }));
554
+ return getMethods(program).withdrawFromPivot().accounts({
555
+ investor,
556
+ project: projectPda,
557
+ pivotProposal: pivotProposalPda,
558
+ investment: investmentPda,
559
+ nftMint: nftMintPubkey,
560
+ investorNftAccount,
561
+ escrowTokenAccount: args.escrowTokenAccount,
562
+ investorTokenAccount: args.investorTokenAccount,
563
+ escrow: escrowPda
564
+ }).remainingAccounts(remainingAccounts).rpc();
565
+ }
566
+ async function finalizePivot(program, args, authority) {
567
+ const projectPda = getProjectPDA(args.projectId, program.programId);
568
+ const pivotProposalPda = getPivotProposalPDA(projectPda, args.pivotCount, program.programId);
569
+ const remainingAccounts = args.milestoneAccounts.map((pubkey) => ({
570
+ pubkey,
571
+ isSigner: false,
572
+ isWritable: true
573
+ }));
574
+ return getMethods(program).finalizePivot().accounts({
575
+ authority,
576
+ project: projectPda,
577
+ pivotProposal: pivotProposalPda
578
+ }).remainingAccounts(remainingAccounts).rpc();
579
+ }
580
+ async function setTgeDate(program, args, founder) {
581
+ const projectPda = getProjectPDA(args.projectId, program.programId);
582
+ return getMethods(program).setTgeDate({
583
+ tgeDate: args.tgeDate,
584
+ tokenMint: args.tokenMint
585
+ }).accounts({
586
+ project: projectPda,
587
+ founder
588
+ }).rpc();
589
+ }
590
+ async function depositTokens(program, args, founder) {
591
+ const projectPda = getProjectPDA(args.projectId, program.programId);
592
+ return getMethods(program).depositTokens({ amount: args.amount }).accounts({
593
+ project: projectPda,
594
+ tokenMint: args.tokenMint,
595
+ founderTokenAccount: args.founderTokenAccount,
596
+ founder
597
+ }).rpc();
598
+ }
599
+ async function claimTokens(program, args, investor) {
600
+ const projectPda = getProjectPDA(args.projectId, program.programId);
601
+ const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);
602
+ const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);
603
+ return getMethods(program).claimTokens().accounts({
604
+ investor,
605
+ project: projectPda,
606
+ investment: investmentPda,
607
+ investorNftAccount: args.investorNftAccount,
608
+ projectTokenVault: args.projectTokenVault,
609
+ investorTokenAccount: args.investorTokenAccount,
610
+ tokenVaultPda,
611
+ tokenProgram: splToken.TOKEN_PROGRAM_ID
612
+ }).rpc();
613
+ }
614
+ async function reportScam(program, args, reporter) {
615
+ const projectPda = getProjectPDA(args.projectId, program.programId);
616
+ const tgeEscrowPda = getTgeEscrowPDA(projectPda, program.programId);
617
+ const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);
618
+ return getMethods(program).reportScam().accounts({
619
+ tgeEscrow: tgeEscrowPda,
620
+ project: projectPda,
621
+ investment: investmentPda,
622
+ nftMint: args.nftMint,
623
+ reporter
624
+ }).rpc();
625
+ }
626
+ async function releaseHoldback(program, args) {
627
+ const projectPda = getProjectPDA(args.projectId, program.programId);
628
+ const tgeEscrowPda = getTgeEscrowPDA(projectPda, program.programId);
629
+ return getMethods(program).releaseHoldback().accounts({
630
+ tgeEscrow: tgeEscrowPda,
631
+ project: projectPda,
632
+ founderTokenAccount: args.founderTokenAccount
633
+ }).rpc();
634
+ }
635
+ async function checkAbandonment(program, projectId, milestoneIndex = 0) {
636
+ const projectPda = getProjectPDA(projectId, program.programId);
637
+ const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);
638
+ return getMethods(program).checkAbandonment().accounts({
639
+ project: projectPda,
640
+ milestone: milestonePda
641
+ }).rpc();
642
+ }
643
+ async function claimRefund(program, args, investor) {
644
+ const nftMintPubkey = ensurePublicKey(args.nftMint);
645
+ const projectPda = getProjectPDA(args.projectId, program.programId);
646
+ const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);
647
+ const milestoneCount = args.milestoneCount ?? 1;
648
+ const remainingAccounts = [];
649
+ for (let i = 0; i < milestoneCount; i++) {
650
+ const milestonePda = getMilestonePDA(projectPda, i, program.programId);
651
+ remainingAccounts.push({
652
+ pubkey: milestonePda,
653
+ isWritable: false,
654
+ isSigner: false
655
+ });
656
+ }
657
+ return getMethods(program).claimRefund().accounts({
658
+ project: projectPda,
659
+ investment: investmentPda,
660
+ nftMint: nftMintPubkey,
661
+ investorNftAccount: args.investorNftAccount,
662
+ investor,
663
+ investorTokenAccount: args.investorUsdcAccount,
664
+ escrowTokenAccount: args.escrowTokenAccount
665
+ }).remainingAccounts(remainingAccounts).rpc();
666
+ }
667
+ async function claimInvestorTokens(program, args, investor) {
668
+ const nftMintPubkey = ensurePublicKey(args.nftMint);
669
+ const projectPda = getProjectPDA(args.projectId, program.programId);
670
+ const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);
671
+ const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);
672
+ const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);
673
+ const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);
674
+ const investorNftAccount = splToken.getAssociatedTokenAddressSync(
675
+ nftMintPubkey,
676
+ investor,
677
+ false,
678
+ splToken.TOKEN_PROGRAM_ID
679
+ );
680
+ return getMethods(program).claimInvestorTokens({ milestoneIndex: args.milestoneIndex }).accounts({
681
+ investor,
682
+ project: projectPda,
683
+ tokenVault: tokenVaultPda,
684
+ investment: investmentPda,
685
+ nftMint: nftMintPubkey,
686
+ investorNftAccount,
687
+ investorVault: investorVaultPda,
688
+ investorTokenAccount: args.investorTokenAccount,
689
+ vaultAuthority: vaultAuthorityPda,
690
+ tokenProgram: splToken.TOKEN_PROGRAM_ID
691
+ }).rpc();
692
+ }
693
+ async function distributeTokens(program, args, payer) {
694
+ const projectPda = getProjectPDA(args.projectId, program.programId);
695
+ const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);
696
+ const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);
697
+ const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);
698
+ const remainingAccounts = args.investments.flatMap((inv) => [
699
+ { pubkey: inv.investmentPda, isSigner: false, isWritable: true },
700
+ { pubkey: inv.investorTokenAccount, isSigner: false, isWritable: true }
701
+ ]);
702
+ return getMethods(program).distributeTokens({ milestoneIndex: args.milestoneIndex }).accounts({
703
+ project: projectPda,
704
+ tokenVault: tokenVaultPda,
705
+ investorVault: investorVaultPda,
706
+ vaultAuthority: vaultAuthorityPda,
707
+ payer,
708
+ tokenProgram: splToken.TOKEN_PROGRAM_ID
709
+ }).remainingAccounts(remainingAccounts).rpc();
710
+ }
711
+ async function completeDistribution(program, args, payer) {
712
+ const projectPda = getProjectPDA(args.projectId, program.programId);
713
+ const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);
714
+ return getMethods(program).completeDistribution({ milestoneIndex: args.milestoneIndex }).accounts({
715
+ project: projectPda,
716
+ tokenVault: tokenVaultPda,
717
+ payer
718
+ }).rpc();
719
+ }
720
+ async function claimExitWindowRefund(program, args, investor) {
721
+ const projectPda = getProjectPDA(args.projectId, program.programId);
722
+ const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);
723
+ const escrowPda = getEscrowPDA(args.projectId, program.programId);
724
+ const remainingAccounts = (args.milestoneAccounts || []).map((pubkey) => ({
725
+ pubkey,
726
+ isSigner: false,
727
+ isWritable: false
728
+ }));
729
+ return getMethods(program).claimExitWindowRefund().accountsPartial({
730
+ project: projectPda,
731
+ investment: investmentPda,
732
+ nftMint: args.nftMint,
733
+ investorNftAccount: args.investorNftAccount,
734
+ escrowTokenAccount: args.escrowTokenAccount,
735
+ investorTokenAccount: args.investorTokenAccount,
736
+ escrowPda,
737
+ investor
738
+ }).remainingAccounts(remainingAccounts).rpc();
739
+ }
740
+ async function initializeFounderVesting(program, args, payer) {
741
+ const projectPda = getProjectPDA(args.projectId, program.programId);
742
+ const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);
743
+ const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);
744
+ const founderVestingPda = getFounderVestingPDA(projectPda, program.programId);
745
+ return getMethods(program).initializeFounderVesting().accounts({
746
+ project: projectPda,
747
+ tokenomics: tokenomicsPda,
748
+ tokenVault: tokenVaultPda,
749
+ founderVesting: founderVestingPda,
750
+ payer,
751
+ systemProgram: web3_js.SystemProgram.programId
752
+ }).rpc();
753
+ }
754
+ async function claimVestedTokens(program, args, founder) {
755
+ const projectPda = getProjectPDA(args.projectId, program.programId);
756
+ const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);
757
+ const founderVestingPda = getFounderVestingPDA(projectPda, program.programId);
758
+ const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);
759
+ const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);
760
+ return getMethods(program).claimVestedTokens().accounts({
761
+ project: projectPda,
762
+ tokenVault: tokenVaultPda,
763
+ founderVesting: founderVestingPda,
764
+ founderVault: founderVaultPda,
765
+ vaultAuthority: vaultAuthorityPda,
766
+ founderTokenAccount: args.founderTokenAccount,
767
+ founder,
768
+ tokenProgram: splToken.TOKEN_PROGRAM_ID
769
+ }).rpc();
770
+ }
771
+ async function forceCompleteDistribution(program, args, adminKeypair) {
772
+ const projectPda = getProjectPDA(args.projectId, program.programId);
773
+ const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);
774
+ const adminConfigPda = getAdminConfigPDA(program.programId);
775
+ return getMethods(program).forceCompleteDistribution().accounts({
776
+ admin: adminKeypair.publicKey,
777
+ adminConfig: adminConfigPda,
778
+ project: projectPda,
779
+ tokenVault: tokenVaultPda
780
+ }).signers([adminKeypair]).rpc();
781
+ }
782
+ async function claimMissedUnlock(program, args, claimer) {
783
+ const nftMintPubkey = ensurePublicKey(args.nftMint);
784
+ const projectPda = getProjectPDA(args.projectId, program.programId);
785
+ const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);
786
+ const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);
787
+ const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);
788
+ const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);
789
+ const claimerNftAccount = splToken.getAssociatedTokenAddressSync(
790
+ nftMintPubkey,
791
+ claimer,
792
+ false,
793
+ splToken.TOKEN_PROGRAM_ID
794
+ );
795
+ return getMethods(program).claimMissedUnlock({ milestoneIndex: args.milestoneIndex }).accounts({
796
+ claimer,
797
+ project: projectPda,
798
+ tokenVault: tokenVaultPda,
799
+ investment: investmentPda,
800
+ nftMint: nftMintPubkey,
801
+ claimerNftAccount,
802
+ investorVault: investorVaultPda,
803
+ claimerTokenAccount: args.claimerTokenAccount,
804
+ vaultAuthority: vaultAuthorityPda,
805
+ tokenProgram: splToken.TOKEN_PROGRAM_ID
806
+ }).rpc();
807
+ }
808
+
809
+ exports.MAX_DEADLINE_DURATION_SECONDS = MAX_DEADLINE_DURATION_SECONDS;
810
+ exports.MIN_DEADLINE_DURATION_SECONDS_DEV = MIN_DEADLINE_DURATION_SECONDS_DEV;
811
+ exports.MIN_DEADLINE_DURATION_SECONDS_PROD = MIN_DEADLINE_DURATION_SECONDS_PROD;
812
+ exports.acceptAdmin = acceptAdmin;
813
+ exports.approvePivot = approvePivot;
814
+ exports.approveProject = approveProject;
815
+ exports.calculateDeadline = calculateDeadline;
816
+ exports.cancelInvestment = cancelInvestment;
817
+ exports.checkAbandonment = checkAbandonment;
818
+ exports.claimExitWindowRefund = claimExitWindowRefund;
819
+ exports.claimInvestorTokens = claimInvestorTokens;
820
+ exports.claimMilestoneFunds = claimMilestoneFunds;
821
+ exports.claimMissedUnlock = claimMissedUnlock;
822
+ exports.claimRefund = claimRefund;
823
+ exports.claimTokens = claimTokens;
824
+ exports.claimVestedTokens = claimVestedTokens;
825
+ exports.completeDistribution = completeDistribution;
826
+ exports.createMilestone = createMilestone;
827
+ exports.depositTokens = depositTokens;
828
+ exports.distributeTokens = distributeTokens;
829
+ exports.extendMilestoneDeadline = extendMilestoneDeadline;
830
+ exports.finalizePivot = finalizePivot;
831
+ exports.finalizeVoting = finalizeVoting;
832
+ exports.forceCompleteDistribution = forceCompleteDistribution;
833
+ exports.initializeAdmin = initializeAdmin;
834
+ exports.initializeFounderVesting = initializeFounderVesting;
835
+ exports.initializeProject = initializeProject;
836
+ exports.invest = invest;
837
+ exports.minDeadline = minDeadline;
838
+ exports.proposePivot = proposePivot;
839
+ exports.releaseHoldback = releaseHoldback;
840
+ exports.reportScam = reportScam;
841
+ exports.resubmitMilestone = resubmitMilestone;
842
+ exports.setMilestoneDeadline = setMilestoneDeadline;
843
+ exports.setTgeDate = setTgeDate;
844
+ exports.submitForApproval = submitForApproval;
845
+ exports.submitMilestone = submitMilestone;
846
+ exports.symbolToBytes = symbolToBytes;
847
+ exports.transferAdmin = transferAdmin;
848
+ exports.validateDeadline = validateDeadline;
849
+ exports.voteOnMilestone = voteOnMilestone;
850
+ exports.withdrawFromPivot = withdrawFromPivot;
851
+ //# sourceMappingURL=index.cjs.map
852
+ //# sourceMappingURL=index.cjs.map