@metadaoproject/futarchy 0.6.0-alpha.1 → 0.6.0-alpha.3

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 (67) hide show
  1. package/dist/v0.6/ConditionalVaultClient.d.ts +314 -0
  2. package/dist/v0.6/ConditionalVaultClient.js +209 -0
  3. package/dist/v0.6/ConditionalVaultClient.js.map +1 -0
  4. package/dist/v0.6/FutarchyClient.d.ts +744 -0
  5. package/dist/v0.6/FutarchyClient.js +390 -0
  6. package/dist/v0.6/FutarchyClient.js.map +1 -0
  7. package/dist/v0.6/LaunchpadClient.d.ts +460 -0
  8. package/dist/v0.6/LaunchpadClient.js +211 -0
  9. package/dist/v0.6/LaunchpadClient.js.map +1 -0
  10. package/dist/v0.6/PriceBasedUnlockClient.d.ts +325 -0
  11. package/dist/v0.6/PriceBasedUnlockClient.js +100 -0
  12. package/dist/v0.6/PriceBasedUnlockClient.js.map +1 -0
  13. package/dist/v0.6/constants.d.ts +26 -0
  14. package/dist/v0.6/constants.js +37 -0
  15. package/dist/v0.6/constants.js.map +1 -0
  16. package/dist/v0.6/index.d.ts +7 -0
  17. package/dist/v0.6/index.js +8 -0
  18. package/dist/v0.6/index.js.map +1 -0
  19. package/dist/v0.6/types/amm.d.ts +832 -0
  20. package/dist/v0.6/types/amm.js +832 -0
  21. package/dist/v0.6/types/amm.js.map +1 -0
  22. package/dist/v0.6/types/conditional_vault.d.ts +925 -0
  23. package/dist/v0.6/types/conditional_vault.js +925 -0
  24. package/dist/v0.6/types/conditional_vault.js.map +1 -0
  25. package/dist/v0.6/types/futarchy.d.ts +2236 -0
  26. package/dist/v0.6/types/futarchy.js +2236 -0
  27. package/dist/v0.6/types/futarchy.js.map +1 -0
  28. package/dist/v0.6/types/index.d.ts +50 -0
  29. package/dist/v0.6/types/index.js +11 -0
  30. package/dist/v0.6/types/index.js.map +1 -0
  31. package/dist/v0.6/types/launchpad.d.ts +1075 -0
  32. package/dist/v0.6/types/launchpad.js +1075 -0
  33. package/dist/v0.6/types/launchpad.js.map +1 -0
  34. package/dist/v0.6/types/price_based_token_lock.d.ts +444 -0
  35. package/dist/v0.6/types/price_based_token_lock.js +444 -0
  36. package/dist/v0.6/types/price_based_token_lock.js.map +1 -0
  37. package/dist/v0.6/types/price_based_unlock.d.ts +665 -0
  38. package/dist/v0.6/types/price_based_unlock.js +665 -0
  39. package/dist/v0.6/types/price_based_unlock.js.map +1 -0
  40. package/dist/v0.6/types/shared_liquidity_manager.d.ts +89 -0
  41. package/dist/v0.6/types/shared_liquidity_manager.js +89 -0
  42. package/dist/v0.6/types/shared_liquidity_manager.js.map +1 -0
  43. package/dist/v0.6/types/utils.d.ts +3 -0
  44. package/dist/v0.6/types/utils.js +2 -0
  45. package/dist/v0.6/types/utils.js.map +1 -0
  46. package/dist/v0.6/utils/cu.d.ts +10 -0
  47. package/dist/v0.6/utils/cu.js +11 -0
  48. package/dist/v0.6/utils/cu.js.map +1 -0
  49. package/dist/v0.6/utils/filters.d.ts +3 -0
  50. package/dist/v0.6/utils/filters.js +14 -0
  51. package/dist/v0.6/utils/filters.js.map +1 -0
  52. package/dist/v0.6/utils/index.d.ts +16 -0
  53. package/dist/v0.6/utils/index.js +30 -0
  54. package/dist/v0.6/utils/index.js.map +1 -0
  55. package/dist/v0.6/utils/instruction.d.ts +4 -0
  56. package/dist/v0.6/utils/instruction.js +10 -0
  57. package/dist/v0.6/utils/instruction.js.map +1 -0
  58. package/dist/v0.6/utils/metadata.d.ts +4 -0
  59. package/dist/v0.6/utils/metadata.js +22 -0
  60. package/dist/v0.6/utils/metadata.js.map +1 -0
  61. package/dist/v0.6/utils/pda.d.ts +25 -0
  62. package/dist/v0.6/utils/pda.js +75 -0
  63. package/dist/v0.6/utils/pda.js.map +1 -0
  64. package/dist/v0.6/utils/priceMath.d.ts +39 -0
  65. package/dist/v0.6/utils/priceMath.js +48 -0
  66. package/dist/v0.6/utils/priceMath.js.map +1 -0
  67. package/package.json +4 -3
@@ -0,0 +1,460 @@
1
+ import { AnchorProvider, Program } from "@coral-xyz/anchor";
2
+ import { PublicKey, AccountInfo } from "@solana/web3.js";
3
+ import { Launchpad } from "./types/launchpad.js";
4
+ import BN from "bn.js";
5
+ import { FundingRecord, Launch } from "./types/index.js";
6
+ import { FutarchyClient } from "./FutarchyClient.js";
7
+ import { PriceBasedUnlockClient } from "./PriceBasedUnlockClient.js";
8
+ export type CreateLaunchpadClientParams = {
9
+ provider: AnchorProvider;
10
+ launchpadProgramId?: PublicKey;
11
+ autocratProgramId?: PublicKey;
12
+ conditionalVaultProgramId?: PublicKey;
13
+ priceBasedUnlockProgramId?: PublicKey;
14
+ };
15
+ export declare class LaunchpadClient {
16
+ launchpad: Program<Launchpad>;
17
+ provider: AnchorProvider;
18
+ autocratClient: FutarchyClient;
19
+ priceBasedUnlock: PriceBasedUnlockClient;
20
+ private constructor();
21
+ static createClient(params: CreateLaunchpadClientParams): LaunchpadClient;
22
+ getProgramId(): PublicKey;
23
+ getLaunch(launch: PublicKey): Promise<Launch>;
24
+ fetchLaunch(launch: PublicKey): Promise<Launch | null>;
25
+ deserializeLaunch(accountInfo: AccountInfo<Buffer>): Promise<Launch>;
26
+ getFundingRecord(fundingRecord: PublicKey): Promise<FundingRecord>;
27
+ fetchFundingRecord(fundingRecord: PublicKey): Promise<FundingRecord | null>;
28
+ deserializeFundingRecord(accountInfo: AccountInfo<Buffer>): Promise<FundingRecord>;
29
+ initializeLaunchIx({ tokenName, tokenSymbol, tokenUri, minimumRaiseAmount, secondsForLaunch, // 5 days
30
+ baseMint, quoteMint, monthlySpendingLimitAmount, monthlySpendingLimitMembers, priceBasedUnlockAddress, priceBasedPremineAmount, priceBasedUnlockThreshold, launchAuthority, payer, }: {
31
+ tokenName: string;
32
+ tokenSymbol: string;
33
+ tokenUri: string;
34
+ minimumRaiseAmount: BN;
35
+ secondsForLaunch?: number;
36
+ baseMint: PublicKey;
37
+ quoteMint?: PublicKey;
38
+ monthlySpendingLimitAmount: BN;
39
+ monthlySpendingLimitMembers: PublicKey[];
40
+ priceBasedUnlockAddress: PublicKey;
41
+ priceBasedPremineAmount: BN;
42
+ priceBasedUnlockThreshold: BN;
43
+ launchAuthority?: PublicKey;
44
+ payer?: PublicKey;
45
+ }): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<Launchpad, {
46
+ name: "initializeLaunch";
47
+ accounts: [{
48
+ name: "launch";
49
+ isMut: true;
50
+ isSigner: false;
51
+ }, {
52
+ name: "baseMint";
53
+ isMut: true;
54
+ isSigner: false;
55
+ }, {
56
+ name: "tokenMetadata";
57
+ isMut: true;
58
+ isSigner: false;
59
+ }, {
60
+ name: "launchSigner";
61
+ isMut: false;
62
+ isSigner: false;
63
+ }, {
64
+ name: "quoteVault";
65
+ isMut: true;
66
+ isSigner: false;
67
+ }, {
68
+ name: "baseVault";
69
+ isMut: true;
70
+ isSigner: false;
71
+ }, {
72
+ name: "payer";
73
+ isMut: true;
74
+ isSigner: true;
75
+ }, {
76
+ name: "launchAuthority";
77
+ isMut: false;
78
+ isSigner: false;
79
+ }, {
80
+ name: "quoteMint";
81
+ isMut: false;
82
+ isSigner: false;
83
+ }, {
84
+ name: "rent";
85
+ isMut: false;
86
+ isSigner: false;
87
+ }, {
88
+ name: "tokenProgram";
89
+ isMut: false;
90
+ isSigner: false;
91
+ }, {
92
+ name: "associatedTokenProgram";
93
+ isMut: false;
94
+ isSigner: false;
95
+ }, {
96
+ name: "systemProgram";
97
+ isMut: false;
98
+ isSigner: false;
99
+ }, {
100
+ name: "tokenMetadataProgram";
101
+ isMut: false;
102
+ isSigner: false;
103
+ }, {
104
+ name: "eventAuthority";
105
+ isMut: false;
106
+ isSigner: false;
107
+ }, {
108
+ name: "program";
109
+ isMut: false;
110
+ isSigner: false;
111
+ }];
112
+ args: [{
113
+ name: "args";
114
+ type: {
115
+ defined: "InitializeLaunchArgs";
116
+ };
117
+ }];
118
+ } & {
119
+ name: "initializeLaunch";
120
+ }>;
121
+ startLaunchIx({ launch, launchAuthority, }: {
122
+ launch: PublicKey;
123
+ launchAuthority?: PublicKey;
124
+ }): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<Launchpad, {
125
+ name: "startLaunch";
126
+ accounts: [{
127
+ name: "launch";
128
+ isMut: true;
129
+ isSigner: false;
130
+ }, {
131
+ name: "launchAuthority";
132
+ isMut: false;
133
+ isSigner: true;
134
+ }, {
135
+ name: "eventAuthority";
136
+ isMut: false;
137
+ isSigner: false;
138
+ }, {
139
+ name: "program";
140
+ isMut: false;
141
+ isSigner: false;
142
+ }];
143
+ args: [];
144
+ } & {
145
+ name: "startLaunch";
146
+ }>;
147
+ fundIx({ launch, amount, funder, quoteMint, }: {
148
+ launch: PublicKey;
149
+ amount: BN;
150
+ funder?: PublicKey;
151
+ quoteMint?: PublicKey;
152
+ }): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<Launchpad, {
153
+ name: "fund";
154
+ accounts: [{
155
+ name: "launch";
156
+ isMut: true;
157
+ isSigner: false;
158
+ }, {
159
+ name: "fundingRecord";
160
+ isMut: true;
161
+ isSigner: false;
162
+ }, {
163
+ name: "launchSigner";
164
+ isMut: false;
165
+ isSigner: false;
166
+ }, {
167
+ name: "launchQuoteVault";
168
+ isMut: true;
169
+ isSigner: false;
170
+ }, {
171
+ name: "funder";
172
+ isMut: false;
173
+ isSigner: true;
174
+ }, {
175
+ name: "payer";
176
+ isMut: true;
177
+ isSigner: true;
178
+ }, {
179
+ name: "funderQuoteAccount";
180
+ isMut: true;
181
+ isSigner: false;
182
+ }, {
183
+ name: "tokenProgram";
184
+ isMut: false;
185
+ isSigner: false;
186
+ }, {
187
+ name: "systemProgram";
188
+ isMut: false;
189
+ isSigner: false;
190
+ }, {
191
+ name: "eventAuthority";
192
+ isMut: false;
193
+ isSigner: false;
194
+ }, {
195
+ name: "program";
196
+ isMut: false;
197
+ isSigner: false;
198
+ }];
199
+ args: [{
200
+ name: "amount";
201
+ type: "u64";
202
+ }];
203
+ } & {
204
+ name: "fund";
205
+ }>;
206
+ completeLaunchIx({ launch, quoteMint, baseMint, }: {
207
+ launch: PublicKey;
208
+ quoteMint?: PublicKey;
209
+ baseMint: PublicKey;
210
+ }): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<Launchpad, {
211
+ name: "completeLaunch";
212
+ accounts: [{
213
+ name: "launch";
214
+ isMut: true;
215
+ isSigner: false;
216
+ }, {
217
+ name: "tokenMetadata";
218
+ isMut: true;
219
+ isSigner: false;
220
+ }, {
221
+ name: "payer";
222
+ isMut: true;
223
+ isSigner: true;
224
+ }, {
225
+ name: "launchSigner";
226
+ isMut: true;
227
+ isSigner: false;
228
+ }, {
229
+ name: "launchQuoteVault";
230
+ isMut: true;
231
+ isSigner: false;
232
+ }, {
233
+ name: "launchBaseVault";
234
+ isMut: true;
235
+ isSigner: false;
236
+ }, {
237
+ name: "treasuryQuoteAccount";
238
+ isMut: true;
239
+ isSigner: false;
240
+ }, {
241
+ name: "baseMint";
242
+ isMut: true;
243
+ isSigner: false;
244
+ }, {
245
+ name: "quoteMint";
246
+ isMut: false;
247
+ isSigner: false;
248
+ }, {
249
+ name: "daoOwnedLpPosition";
250
+ isMut: true;
251
+ isSigner: false;
252
+ }, {
253
+ name: "futarchyAmmBaseVault";
254
+ isMut: true;
255
+ isSigner: false;
256
+ }, {
257
+ name: "futarchyAmmQuoteVault";
258
+ isMut: true;
259
+ isSigner: false;
260
+ }, {
261
+ name: "dao";
262
+ isMut: true;
263
+ isSigner: false;
264
+ }, {
265
+ name: "squadsMultisig";
266
+ isMut: true;
267
+ isSigner: false;
268
+ }, {
269
+ name: "squadsMultisigVault";
270
+ isMut: false;
271
+ isSigner: false;
272
+ }, {
273
+ name: "spendingLimit";
274
+ isMut: true;
275
+ isSigner: false;
276
+ }, {
277
+ name: "locker";
278
+ isMut: true;
279
+ isSigner: false;
280
+ }, {
281
+ name: "lockerTokenAccount";
282
+ isMut: true;
283
+ isSigner: false;
284
+ }, {
285
+ name: "systemProgram";
286
+ isMut: false;
287
+ isSigner: false;
288
+ }, {
289
+ name: "tokenProgram";
290
+ isMut: false;
291
+ isSigner: false;
292
+ }, {
293
+ name: "associatedTokenProgram";
294
+ isMut: false;
295
+ isSigner: false;
296
+ }, {
297
+ name: "staticAccounts";
298
+ accounts: [{
299
+ name: "futarchyProgram";
300
+ isMut: false;
301
+ isSigner: false;
302
+ }, {
303
+ name: "tokenMetadataProgram";
304
+ isMut: false;
305
+ isSigner: false;
306
+ }, {
307
+ name: "autocratEventAuthority";
308
+ isMut: false;
309
+ isSigner: false;
310
+ }, {
311
+ name: "rent";
312
+ isMut: false;
313
+ isSigner: false;
314
+ }, {
315
+ name: "squadsProgram";
316
+ isMut: false;
317
+ isSigner: false;
318
+ }, {
319
+ name: "squadsProgramConfig";
320
+ isMut: false;
321
+ isSigner: false;
322
+ }, {
323
+ name: "squadsProgramConfigTreasury";
324
+ isMut: true;
325
+ isSigner: false;
326
+ }, {
327
+ name: "priceBasedUnlockProgram";
328
+ isMut: false;
329
+ isSigner: false;
330
+ }, {
331
+ name: "priceBasedUnlockEventAuthority";
332
+ isMut: false;
333
+ isSigner: false;
334
+ }];
335
+ }, {
336
+ name: "eventAuthority";
337
+ isMut: false;
338
+ isSigner: false;
339
+ }, {
340
+ name: "program";
341
+ isMut: false;
342
+ isSigner: false;
343
+ }];
344
+ args: [];
345
+ } & {
346
+ name: "completeLaunch";
347
+ }>;
348
+ refundIx(launch: PublicKey, funder: PublicKey | undefined, quoteMint: PublicKey, isDevnet?: boolean): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<Launchpad, {
349
+ name: "refund";
350
+ accounts: [{
351
+ name: "launch";
352
+ isMut: true;
353
+ isSigner: false;
354
+ }, {
355
+ name: "fundingRecord";
356
+ isMut: true;
357
+ isSigner: false;
358
+ }, {
359
+ name: "launchQuoteVault";
360
+ isMut: true;
361
+ isSigner: false;
362
+ }, {
363
+ name: "launchSigner";
364
+ isMut: false;
365
+ isSigner: false;
366
+ }, {
367
+ name: "funder";
368
+ isMut: true;
369
+ isSigner: true;
370
+ }, {
371
+ name: "funderQuoteAccount";
372
+ isMut: true;
373
+ isSigner: false;
374
+ }, {
375
+ name: "tokenProgram";
376
+ isMut: false;
377
+ isSigner: false;
378
+ }, {
379
+ name: "systemProgram";
380
+ isMut: false;
381
+ isSigner: false;
382
+ }, {
383
+ name: "eventAuthority";
384
+ isMut: false;
385
+ isSigner: false;
386
+ }, {
387
+ name: "program";
388
+ isMut: false;
389
+ isSigner: false;
390
+ }];
391
+ args: [];
392
+ } & {
393
+ name: "refund";
394
+ }>;
395
+ claimIx(launch: PublicKey, baseMint: PublicKey, funder?: PublicKey): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<Launchpad, {
396
+ name: "claim";
397
+ accounts: [{
398
+ name: "launch";
399
+ isMut: true;
400
+ isSigner: false;
401
+ }, {
402
+ name: "fundingRecord";
403
+ isMut: true;
404
+ isSigner: false;
405
+ }, {
406
+ name: "launchSigner";
407
+ isMut: false;
408
+ isSigner: false;
409
+ }, {
410
+ name: "baseMint";
411
+ isMut: true;
412
+ isSigner: false;
413
+ }, {
414
+ name: "launchBaseVault";
415
+ isMut: true;
416
+ isSigner: false;
417
+ }, {
418
+ name: "funder";
419
+ isMut: false;
420
+ isSigner: false;
421
+ }, {
422
+ name: "payer";
423
+ isMut: true;
424
+ isSigner: true;
425
+ }, {
426
+ name: "funderTokenAccount";
427
+ isMut: true;
428
+ isSigner: false;
429
+ }, {
430
+ name: "tokenProgram";
431
+ isMut: false;
432
+ isSigner: false;
433
+ }, {
434
+ name: "systemProgram";
435
+ isMut: false;
436
+ isSigner: false;
437
+ }, {
438
+ name: "eventAuthority";
439
+ isMut: false;
440
+ isSigner: false;
441
+ }, {
442
+ name: "program";
443
+ isMut: false;
444
+ isSigner: false;
445
+ }];
446
+ args: [];
447
+ } & {
448
+ name: "claim";
449
+ }>;
450
+ getLaunchAddress({ baseMint }: {
451
+ baseMint: PublicKey;
452
+ }): PublicKey;
453
+ getLaunchSignerAddress({ launch }: {
454
+ launch: PublicKey;
455
+ }): PublicKey;
456
+ getFundingRecordAddress({ launch, funder, }: {
457
+ launch: PublicKey;
458
+ funder: PublicKey;
459
+ }): PublicKey;
460
+ }
@@ -0,0 +1,211 @@
1
+ import { Program } from "@coral-xyz/anchor";
2
+ import { PublicKey, ComputeBudgetProgram, } from "@solana/web3.js";
3
+ import { IDL as LaunchpadIDL } from "./types/launchpad.js";
4
+ import { LAUNCHPAD_PROGRAM_ID, MPL_TOKEN_METADATA_PROGRAM_ID, MAINNET_USDC, SQUADS_PROGRAM_ID, SQUADS_PROGRAM_CONFIG, SQUADS_PROGRAM_CONFIG_TREASURY, } from "./constants.js";
5
+ import { createAssociatedTokenAccountIdempotentInstruction, getAssociatedTokenAddressSync, } from "@solana/spl-token";
6
+ import BN from "bn.js";
7
+ import { getDaoAddr, getEventAuthorityAddr, getFundingRecordAddr, getLaunchAddr, getLaunchSignerAddr, getMetadataAddr, } from "./utils/pda.js";
8
+ import { FutarchyClient } from "./FutarchyClient.js";
9
+ import * as multisig from "@sqds/multisig";
10
+ import { PriceBasedUnlockClient } from "./PriceBasedUnlockClient.js";
11
+ export class LaunchpadClient {
12
+ launchpad;
13
+ provider;
14
+ autocratClient;
15
+ priceBasedUnlock;
16
+ constructor(params) {
17
+ this.provider = params.provider;
18
+ this.launchpad = new Program(LaunchpadIDL, params.launchpadProgramId || LAUNCHPAD_PROGRAM_ID, this.provider);
19
+ this.autocratClient = FutarchyClient.createClient({
20
+ provider: this.provider,
21
+ autocratProgramId: params.autocratProgramId,
22
+ conditionalVaultProgramId: params.conditionalVaultProgramId,
23
+ });
24
+ this.priceBasedUnlock = PriceBasedUnlockClient.createClient({
25
+ provider: this.provider,
26
+ priceBasedTokenLockProgramId: params.priceBasedUnlockProgramId,
27
+ });
28
+ }
29
+ static createClient(params) {
30
+ return new LaunchpadClient(params);
31
+ }
32
+ getProgramId() {
33
+ return this.launchpad.programId;
34
+ }
35
+ async getLaunch(launch) {
36
+ return await this.launchpad.account.launch.fetch(launch);
37
+ }
38
+ async fetchLaunch(launch) {
39
+ return await this.launchpad.account.launch.fetchNullable(launch);
40
+ }
41
+ async deserializeLaunch(accountInfo) {
42
+ return this.launchpad.coder.accounts.decode("launch", accountInfo.data);
43
+ }
44
+ async getFundingRecord(fundingRecord) {
45
+ return await this.launchpad.account.fundingRecord.fetch(fundingRecord);
46
+ }
47
+ async fetchFundingRecord(fundingRecord) {
48
+ return await this.launchpad.account.fundingRecord.fetchNullable(fundingRecord);
49
+ }
50
+ async deserializeFundingRecord(accountInfo) {
51
+ return this.launchpad.coder.accounts.decode("fundingRecord", accountInfo.data);
52
+ }
53
+ initializeLaunchIx({ tokenName, tokenSymbol, tokenUri, minimumRaiseAmount, secondsForLaunch = 60 * 60 * 24 * 5, // 5 days
54
+ baseMint, quoteMint = MAINNET_USDC, monthlySpendingLimitAmount, monthlySpendingLimitMembers, priceBasedUnlockAddress, priceBasedPremineAmount, priceBasedUnlockThreshold, launchAuthority = this.provider.publicKey, payer = this.provider.publicKey, }) {
55
+ const [launch] = getLaunchAddr(this.launchpad.programId, baseMint);
56
+ const [launchSigner] = getLaunchSignerAddr(this.launchpad.programId, launch);
57
+ const quoteVault = getAssociatedTokenAddressSync(quoteMint, launchSigner, true);
58
+ const baseVault = getAssociatedTokenAddressSync(baseMint, launchSigner, true);
59
+ const [tokenMetadata] = getMetadataAddr(baseMint);
60
+ return this.launchpad.methods
61
+ .initializeLaunch({
62
+ minimumRaiseAmount,
63
+ secondsForLaunch,
64
+ tokenName,
65
+ tokenSymbol,
66
+ tokenUri,
67
+ monthlySpendingLimitAmount,
68
+ monthlySpendingLimitMembers,
69
+ priceBasedUnlockAddress,
70
+ priceBasedPremineAmount,
71
+ priceBasedUnlockThreshold,
72
+ })
73
+ .accounts({
74
+ launch,
75
+ launchSigner,
76
+ quoteVault,
77
+ baseVault,
78
+ launchAuthority,
79
+ quoteMint,
80
+ baseMint,
81
+ tokenMetadata,
82
+ tokenMetadataProgram: MPL_TOKEN_METADATA_PROGRAM_ID,
83
+ payer,
84
+ })
85
+ .preInstructions([
86
+ createAssociatedTokenAccountIdempotentInstruction(payer, getAssociatedTokenAddressSync(quoteMint, launchSigner, true), launchSigner, quoteMint),
87
+ ]);
88
+ // .signers([tokenMintKp]);
89
+ }
90
+ startLaunchIx({ launch, launchAuthority = this.provider.publicKey, }) {
91
+ return this.launchpad.methods.startLaunch().accounts({
92
+ launch,
93
+ launchAuthority,
94
+ });
95
+ }
96
+ fundIx({ launch, amount, funder = this.provider.publicKey, quoteMint = MAINNET_USDC, }) {
97
+ const launchSigner = this.getLaunchSignerAddress({ launch });
98
+ const launchQuoteVault = getAssociatedTokenAddressSync(quoteMint, launchSigner, true);
99
+ const funderQuoteAccount = getAssociatedTokenAddressSync(quoteMint, funder, true);
100
+ const [fundingRecord] = getFundingRecordAddr(this.launchpad.programId, launch, funder);
101
+ return this.launchpad.methods.fund(amount).accounts({
102
+ launch,
103
+ launchQuoteVault,
104
+ fundingRecord,
105
+ funder,
106
+ funderQuoteAccount,
107
+ launchSigner,
108
+ });
109
+ }
110
+ completeLaunchIx({ launch, quoteMint = MAINNET_USDC, baseMint, }) {
111
+ const launchSigner = this.getLaunchSignerAddress({ launch });
112
+ const launchQuoteVault = getAssociatedTokenAddressSync(quoteMint, launchSigner, true);
113
+ const launchBaseVault = getAssociatedTokenAddressSync(baseMint, launchSigner, true);
114
+ // const daoKp = Keypair.generate();
115
+ const [dao] = getDaoAddr({
116
+ nonce: new BN(0),
117
+ daoCreator: launchSigner,
118
+ });
119
+ const [autocratEventAuthority] = getEventAuthorityAddr(this.autocratClient.getProgramId());
120
+ const [tokenMetadata] = getMetadataAddr(baseMint);
121
+ const [multisigPda] = multisig.getMultisigPda({ createKey: dao });
122
+ const [multisigVault] = multisig.getVaultPda({
123
+ multisigPda,
124
+ index: 0,
125
+ });
126
+ const [spendingLimit] = multisig.getSpendingLimitPda({
127
+ multisigPda,
128
+ createKey: dao,
129
+ });
130
+ const treasuryQuoteAccount = getAssociatedTokenAddressSync(quoteMint, multisigVault, true);
131
+ const [ammPosition] = PublicKey.findProgramAddressSync([Buffer.from("amm_position"), dao.toBuffer(), multisigVault.toBuffer()], this.autocratClient.getProgramId());
132
+ const locker = this.priceBasedUnlock.getLockerAddress(launchSigner);
133
+ const lockerTokenAccount = this.priceBasedUnlock.getLockerTokenAccountAddress(locker);
134
+ return this.launchpad.methods
135
+ .completeLaunch()
136
+ .accounts({
137
+ launch,
138
+ launchSigner,
139
+ launchQuoteVault,
140
+ launchBaseVault,
141
+ dao,
142
+ treasuryQuoteAccount,
143
+ quoteMint,
144
+ baseMint,
145
+ tokenMetadata,
146
+ daoOwnedLpPosition: ammPosition,
147
+ futarchyAmmQuoteVault: getAssociatedTokenAddressSync(quoteMint, dao, true),
148
+ futarchyAmmBaseVault: getAssociatedTokenAddressSync(baseMint, dao, true),
149
+ staticAccounts: {
150
+ futarchyProgram: this.autocratClient.getProgramId(),
151
+ tokenMetadataProgram: MPL_TOKEN_METADATA_PROGRAM_ID,
152
+ autocratEventAuthority,
153
+ squadsProgram: SQUADS_PROGRAM_ID,
154
+ squadsProgramConfig: SQUADS_PROGRAM_CONFIG,
155
+ squadsProgramConfigTreasury: SQUADS_PROGRAM_CONFIG_TREASURY,
156
+ priceBasedUnlockProgram: this.priceBasedUnlock.programId,
157
+ priceBasedUnlockEventAuthority: this.priceBasedUnlock.getEventAuthorityAddress(),
158
+ },
159
+ squadsMultisig: multisigPda,
160
+ squadsMultisigVault: multisigVault,
161
+ spendingLimit,
162
+ locker,
163
+ lockerTokenAccount,
164
+ })
165
+ .preInstructions([
166
+ ComputeBudgetProgram.setComputeUnitLimit({ units: 500_000 }),
167
+ ]);
168
+ }
169
+ refundIx(launch, funder = this.provider.publicKey, quoteMint, isDevnet = false) {
170
+ const [launchSigner] = getLaunchSignerAddr(this.launchpad.programId, launch);
171
+ const [fundingRecord] = getFundingRecordAddr(this.launchpad.programId, launch, funder);
172
+ const launchQuoteVault = getAssociatedTokenAddressSync(quoteMint, launchSigner, true);
173
+ const funderQuoteAccount = getAssociatedTokenAddressSync(quoteMint, funder, true);
174
+ return this.launchpad.methods.refund().accounts({
175
+ launch,
176
+ launchSigner,
177
+ launchQuoteVault,
178
+ funder,
179
+ funderQuoteAccount,
180
+ fundingRecord,
181
+ });
182
+ }
183
+ claimIx(launch, baseMint, funder = this.provider.publicKey) {
184
+ const [launchSigner] = getLaunchSignerAddr(this.launchpad.programId, launch);
185
+ const [fundingRecord] = getFundingRecordAddr(this.launchpad.programId, launch, funder);
186
+ return this.launchpad.methods
187
+ .claim()
188
+ .accounts({
189
+ launch,
190
+ fundingRecord,
191
+ launchSigner,
192
+ funder,
193
+ funderTokenAccount: getAssociatedTokenAddressSync(baseMint, funder, true),
194
+ baseMint,
195
+ launchBaseVault: getAssociatedTokenAddressSync(baseMint, launchSigner, true),
196
+ })
197
+ .preInstructions([
198
+ createAssociatedTokenAccountIdempotentInstruction(this.provider.publicKey, getAssociatedTokenAddressSync(baseMint, funder, true), funder, baseMint),
199
+ ]);
200
+ }
201
+ getLaunchAddress({ baseMint }) {
202
+ return getLaunchAddr(this.launchpad.programId, baseMint)[0];
203
+ }
204
+ getLaunchSignerAddress({ launch }) {
205
+ return getLaunchSignerAddr(this.launchpad.programId, launch)[0];
206
+ }
207
+ getFundingRecordAddress({ launch, funder, }) {
208
+ return getFundingRecordAddr(this.launchpad.programId, launch, funder)[0];
209
+ }
210
+ }
211
+ //# sourceMappingURL=LaunchpadClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LaunchpadClient.js","sourceRoot":"","sources":["../../src/v0.6/LaunchpadClient.ts"],"names":[],"mappings":"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"}