@metadaoproject/futarchy 0.3.0-alpha.15 → 0.3.0-alpha.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { AnchorProvider, Program } from "@coral-xyz/anchor";
2
- import { Keypair, PublicKey } from "@solana/web3.js";
2
+ import { AddressLookupTableAccount, Keypair, PublicKey } from "@solana/web3.js";
3
3
  import { ConditionalVault } from "./types/conditional_vault";
4
4
  import BN from "bn.js";
5
5
  import { MethodsBuilder } from "@coral-xyz/anchor/dist/cjs/program/namespace/methods";
@@ -10,135 +10,151 @@ export type CreateVaultClientParams = {
10
10
  export declare class ConditionalVaultClient {
11
11
  readonly provider: AnchorProvider;
12
12
  readonly vaultProgram: Program<ConditionalVault>;
13
- constructor(provider: AnchorProvider, conditionalVaultProgramId: PublicKey);
13
+ readonly luts: AddressLookupTableAccount[];
14
+ constructor(provider: AnchorProvider, conditionalVaultProgramId: PublicKey, luts: AddressLookupTableAccount[]);
14
15
  static createClient(createVaultClientParams: CreateVaultClientParams): ConditionalVaultClient;
15
- fetchQuestion(question: PublicKey): Promise<{
16
- questionId: number[];
17
- oracle: PublicKey;
18
- payoutNumerators: number[];
19
- payoutDenominator: number;
20
- }>;
21
- fetchVault(vault: PublicKey): Promise<{
22
- question: PublicKey;
23
- underlyingTokenMint: PublicKey;
24
- underlyingTokenAccount: PublicKey;
25
- conditionalTokenMints: PublicKey[];
26
- pdaBump: number;
27
- decimals: number;
28
- }>;
29
16
  getVault(vault: PublicKey): Promise<{
30
- question: PublicKey;
17
+ status: ({
18
+ finalized?: undefined;
19
+ reverted?: undefined;
20
+ } & {
21
+ active: Record<string, never>;
22
+ }) | ({
23
+ active?: undefined;
24
+ reverted?: undefined;
25
+ } & {
26
+ finalized: Record<string, never>;
27
+ }) | ({
28
+ active?: undefined;
29
+ finalized?: undefined;
30
+ } & {
31
+ reverted: Record<string, never>;
32
+ });
33
+ settlementAuthority: PublicKey;
31
34
  underlyingTokenMint: PublicKey;
32
35
  underlyingTokenAccount: PublicKey;
33
- conditionalTokenMints: PublicKey[];
36
+ conditionalOnFinalizeTokenMint: PublicKey;
37
+ conditionalOnRevertTokenMint: PublicKey;
34
38
  pdaBump: number;
35
39
  decimals: number;
36
40
  }>;
37
- initializeQuestionIx(questionId: Uint8Array, oracle: PublicKey, numConditions: number): MethodsBuilder<ConditionalVault, {
38
- name: "initializeQuestion";
41
+ mintConditionalTokens(vault: PublicKey, uiAmount: number, user?: PublicKey | Keypair): Promise<string>;
42
+ mintConditionalTokensIx(vault: PublicKey, underlyingTokenMint: PublicKey, amount: BN, user?: PublicKey | Keypair): MethodsBuilder<ConditionalVault, {
43
+ name: "mintConditionalTokens";
39
44
  accounts: [{
40
- name: "question";
45
+ name: "vault";
46
+ isMut: false;
47
+ isSigner: false;
48
+ }, {
49
+ name: "conditionalOnFinalizeTokenMint";
41
50
  isMut: true;
42
51
  isSigner: false;
43
52
  }, {
44
- name: "payer";
53
+ name: "conditionalOnRevertTokenMint";
45
54
  isMut: true;
46
- isSigner: true;
55
+ isSigner: false;
47
56
  }, {
48
- name: "systemProgram";
57
+ name: "vaultUnderlyingTokenAccount";
58
+ isMut: true;
59
+ isSigner: false;
60
+ }, {
61
+ name: "authority";
49
62
  isMut: false;
63
+ isSigner: true;
64
+ }, {
65
+ name: "userConditionalOnFinalizeTokenAccount";
66
+ isMut: true;
50
67
  isSigner: false;
51
- }];
52
- args: [{
53
- name: "args";
54
- type: {
55
- defined: "InitializeQuestionArgs";
56
- };
57
- }];
58
- } & {
59
- name: "initializeQuestion";
60
- }>;
61
- initializeQuestion(questionId: Uint8Array, oracle: PublicKey, numConditions: number): Promise<PublicKey>;
62
- initializeVaultIx(question: PublicKey, underlyingTokenMint: PublicKey, numOutcomes: number): MethodsBuilder<ConditionalVault, any>;
63
- initializeVault(question: PublicKey, underlyingTokenMint: PublicKey, numOutcomes: number): Promise<PublicKey>;
64
- resolveQuestionIx(question: PublicKey, oracle: Keypair, payoutNumerators: number[]): MethodsBuilder<ConditionalVault, {
65
- name: "resolveQuestion";
66
- accounts: [{
67
- name: "question";
68
+ }, {
69
+ name: "userConditionalOnRevertTokenAccount";
70
+ isMut: true;
71
+ isSigner: false;
72
+ }, {
73
+ name: "userUnderlyingTokenAccount";
68
74
  isMut: true;
69
75
  isSigner: false;
70
76
  }, {
71
- name: "oracle";
77
+ name: "tokenProgram";
72
78
  isMut: false;
73
- isSigner: true;
79
+ isSigner: false;
74
80
  }];
75
81
  args: [{
76
- name: "args";
77
- type: {
78
- defined: "ResolveQuestionArgs";
79
- };
82
+ name: "amount";
83
+ type: "u64";
80
84
  }];
81
85
  } & {
82
- name: "resolveQuestion";
86
+ name: "mintConditionalTokens";
83
87
  }>;
84
- getConditionalTokenMints(vault: PublicKey, numOutcomes: number): PublicKey[];
85
- getRemainingAccounts(conditionalTokenMints: PublicKey[], userConditionalAccounts: PublicKey[]): {
86
- pubkey: PublicKey;
87
- isWritable: boolean;
88
- isSigner: boolean;
89
- }[];
90
- getConditionalTokenAccountsAndInstructions(vault: PublicKey, numOutcomes: number, user: PublicKey): {
91
- userConditionalAccounts: PublicKey[];
92
- preInstructions: import("@solana/web3.js").TransactionInstruction[];
93
- remainingAccounts: {
94
- pubkey: PublicKey;
95
- isWritable: boolean;
96
- isSigner: boolean;
97
- }[];
98
- };
99
- splitTokensIx(question: PublicKey, vault: PublicKey, underlyingTokenMint: PublicKey, amount: BN, numOutcomes: number, user?: PublicKey): MethodsBuilder<ConditionalVault, {
100
- name: "splitTokens";
88
+ initializeVaultIx(settlementAuthority: PublicKey, underlyingTokenMint: PublicKey): MethodsBuilder<ConditionalVault, any>;
89
+ addMetadataToConditionalTokensIx(vault: PublicKey, underlyingTokenMint: PublicKey, proposalNumber: number, onFinalizeUri: string, onRevertUri: string): MethodsBuilder<ConditionalVault, {
90
+ name: "addMetadataToConditionalTokens";
101
91
  accounts: [{
102
- name: "question";
103
- isMut: false;
104
- isSigner: false;
92
+ name: "payer";
93
+ isMut: true;
94
+ isSigner: true;
105
95
  }, {
106
96
  name: "vault";
107
- isMut: false;
97
+ isMut: true;
108
98
  isSigner: false;
109
99
  }, {
110
- name: "vaultUnderlyingTokenAccount";
100
+ name: "underlyingTokenMint";
111
101
  isMut: true;
112
102
  isSigner: false;
113
103
  }, {
114
- name: "authority";
104
+ name: "underlyingTokenMetadata";
115
105
  isMut: false;
116
- isSigner: true;
106
+ isSigner: false;
117
107
  }, {
118
- name: "userUnderlyingTokenAccount";
108
+ name: "conditionalOnFinalizeTokenMint";
119
109
  isMut: true;
120
110
  isSigner: false;
121
111
  }, {
122
- name: "tokenProgram";
112
+ name: "conditionalOnRevertTokenMint";
113
+ isMut: true;
114
+ isSigner: false;
115
+ }, {
116
+ name: "conditionalOnFinalizeTokenMetadata";
117
+ isMut: true;
118
+ isSigner: false;
119
+ }, {
120
+ name: "conditionalOnRevertTokenMetadata";
121
+ isMut: true;
122
+ isSigner: false;
123
+ }, {
124
+ name: "tokenMetadataProgram";
125
+ isMut: false;
126
+ isSigner: false;
127
+ }, {
128
+ name: "systemProgram";
129
+ isMut: false;
130
+ isSigner: false;
131
+ }, {
132
+ name: "rent";
123
133
  isMut: false;
124
134
  isSigner: false;
125
135
  }];
126
136
  args: [{
127
- name: "amount";
128
- type: "u64";
137
+ name: "args";
138
+ type: {
139
+ defined: "AddMetadataToConditionalTokensArgs";
140
+ };
129
141
  }];
130
142
  } & {
131
- name: "splitTokens";
143
+ name: "addMetadataToConditionalTokens";
132
144
  }>;
133
- mergeTokensIx(question: PublicKey, vault: PublicKey, underlyingTokenMint: PublicKey, amount: BN, numOutcomes: number, user?: PublicKey): MethodsBuilder<ConditionalVault, {
134
- name: "mergeTokens";
145
+ redeemConditionalTokensIx(vault: PublicKey, underlyingTokenMint: PublicKey): MethodsBuilder<ConditionalVault, {
146
+ name: "redeemConditionalTokensForUnderlyingTokens";
135
147
  accounts: [{
136
- name: "question";
148
+ name: "vault";
137
149
  isMut: false;
138
150
  isSigner: false;
139
151
  }, {
140
- name: "vault";
141
- isMut: false;
152
+ name: "conditionalOnFinalizeTokenMint";
153
+ isMut: true;
154
+ isSigner: false;
155
+ }, {
156
+ name: "conditionalOnRevertTokenMint";
157
+ isMut: true;
142
158
  isSigner: false;
143
159
  }, {
144
160
  name: "vaultUnderlyingTokenAccount";
@@ -148,6 +164,14 @@ export declare class ConditionalVaultClient {
148
164
  name: "authority";
149
165
  isMut: false;
150
166
  isSigner: true;
167
+ }, {
168
+ name: "userConditionalOnFinalizeTokenAccount";
169
+ isMut: true;
170
+ isSigner: false;
171
+ }, {
172
+ name: "userConditionalOnRevertTokenAccount";
173
+ isMut: true;
174
+ isSigner: false;
151
175
  }, {
152
176
  name: "userUnderlyingTokenAccount";
153
177
  isMut: true;
@@ -157,22 +181,23 @@ export declare class ConditionalVaultClient {
157
181
  isMut: false;
158
182
  isSigner: false;
159
183
  }];
160
- args: [{
161
- name: "amount";
162
- type: "u64";
163
- }];
184
+ args: [];
164
185
  } & {
165
- name: "mergeTokens";
186
+ name: "redeemConditionalTokensForUnderlyingTokens";
166
187
  }>;
167
- redeemTokensIx(question: PublicKey, vault: PublicKey, underlyingTokenMint: PublicKey, numOutcomes: number, user?: PublicKey): MethodsBuilder<ConditionalVault, {
168
- name: "redeemTokens";
188
+ mergeConditionalTokensIx(vault: PublicKey, underlyingTokenMint: PublicKey, amount: BN): MethodsBuilder<ConditionalVault, {
189
+ name: "mergeConditionalTokensForUnderlyingTokens";
169
190
  accounts: [{
170
- name: "question";
191
+ name: "vault";
171
192
  isMut: false;
172
193
  isSigner: false;
173
194
  }, {
174
- name: "vault";
175
- isMut: false;
195
+ name: "conditionalOnFinalizeTokenMint";
196
+ isMut: true;
197
+ isSigner: false;
198
+ }, {
199
+ name: "conditionalOnRevertTokenMint";
200
+ isMut: true;
176
201
  isSigner: false;
177
202
  }, {
178
203
  name: "vaultUnderlyingTokenAccount";
@@ -182,6 +207,14 @@ export declare class ConditionalVaultClient {
182
207
  name: "authority";
183
208
  isMut: false;
184
209
  isSigner: true;
210
+ }, {
211
+ name: "userConditionalOnFinalizeTokenAccount";
212
+ isMut: true;
213
+ isSigner: false;
214
+ }, {
215
+ name: "userConditionalOnRevertTokenAccount";
216
+ isMut: true;
217
+ isSigner: false;
185
218
  }, {
186
219
  name: "userUnderlyingTokenAccount";
187
220
  isMut: true;
@@ -191,8 +224,12 @@ export declare class ConditionalVaultClient {
191
224
  isMut: false;
192
225
  isSigner: false;
193
226
  }];
194
- args: [];
227
+ args: [{
228
+ name: "amount";
229
+ type: "u64";
230
+ }];
195
231
  } & {
196
- name: "redeemTokens";
232
+ name: "mergeConditionalTokensForUnderlyingTokens";
197
233
  }>;
234
+ initializeVault(settlementAuthority: PublicKey, underlyingTokenMint: PublicKey): Promise<PublicKey>;
198
235
  }
@@ -1,191 +1,158 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.ConditionalVaultClient = void 0;
4
7
  const anchor_1 = require("@coral-xyz/anchor");
8
+ const web3_js_1 = require("@solana/web3.js");
5
9
  const conditional_vault_1 = require("./types/conditional_vault");
10
+ const bn_js_1 = __importDefault(require("bn.js"));
6
11
  const constants_1 = require("./constants");
7
12
  const utils_1 = require("./utils");
8
13
  const spl_token_1 = require("@solana/spl-token");
9
14
  class ConditionalVaultClient {
10
15
  provider;
11
16
  vaultProgram;
12
- constructor(provider, conditionalVaultProgramId) {
17
+ luts;
18
+ constructor(provider, conditionalVaultProgramId, luts) {
13
19
  this.provider = provider;
14
20
  this.vaultProgram = new anchor_1.Program(conditional_vault_1.IDL, conditionalVaultProgramId, provider);
21
+ this.luts = luts;
15
22
  }
16
23
  static createClient(createVaultClientParams) {
17
24
  let { provider, conditionalVaultProgramId } = createVaultClientParams;
18
- return new ConditionalVaultClient(provider, conditionalVaultProgramId || constants_1.CONDITIONAL_VAULT_PROGRAM_ID);
19
- }
20
- async fetchQuestion(question) {
21
- return this.vaultProgram.account.question.fetch(question);
22
- }
23
- async fetchVault(vault) {
24
- return this.vaultProgram.account.conditionalVault.fetch(vault);
25
+ const luts = [];
26
+ return new ConditionalVaultClient(provider, conditionalVaultProgramId || constants_1.CONDITIONAL_VAULT_PROGRAM_ID, luts);
25
27
  }
26
28
  async getVault(vault) {
27
29
  return this.vaultProgram.account.conditionalVault.fetch(vault);
28
30
  }
29
- initializeQuestionIx(questionId, oracle, numConditions) {
30
- const [question] = (0, utils_1.getQuestionAddr)(this.vaultProgram.programId, questionId, oracle, numConditions);
31
- return this.vaultProgram.methods
32
- .initializeQuestion({
33
- questionId: Array.from(questionId),
34
- oracle,
35
- numConditions,
36
- })
37
- .accounts({
38
- question,
39
- });
40
- }
41
- async initializeQuestion(questionId, oracle, numConditions) {
42
- const [question] = (0, utils_1.getQuestionAddr)(this.vaultProgram.programId, questionId, oracle, numConditions);
43
- await this.initializeQuestionIx(questionId, oracle, numConditions).rpc();
44
- return question;
31
+ async mintConditionalTokens(vault, uiAmount, user) {
32
+ const storedVault = await this.getVault(vault);
33
+ try {
34
+ const scaledAmount = uiAmount * Math.pow(10, storedVault.decimals);
35
+ const bnAmount = new bn_js_1.default(scaledAmount.toFixed(0));
36
+ return this.mintConditionalTokensIx(vault, storedVault.underlyingTokenMint, bnAmount, user).rpc();
37
+ }
38
+ catch (e) {
39
+ throw new Error(`Error minting conditional tokens for ${storedVault.underlyingTokenMint} with error ${e}`);
40
+ }
45
41
  }
46
- initializeVaultIx(question, underlyingTokenMint, numOutcomes) {
47
- const [vault] = (0, utils_1.getVaultAddr)(this.vaultProgram.programId, question, underlyingTokenMint);
48
- let conditionalTokenMintAddrs = [];
49
- for (let i = 0; i < numOutcomes; i++) {
50
- const [conditionalTokenMint] = (0, utils_1.getConditionalTokenMintAddr)(this.vaultProgram.programId, vault, i);
51
- conditionalTokenMintAddrs.push(conditionalTokenMint);
42
+ mintConditionalTokensIx(vault, underlyingTokenMint, amount, user) {
43
+ let userPubkey;
44
+ if (!user) {
45
+ userPubkey = this.provider.publicKey;
52
46
  }
47
+ else if (user instanceof web3_js_1.Keypair) {
48
+ userPubkey = user.publicKey;
49
+ }
50
+ else {
51
+ userPubkey = user;
52
+ }
53
+ const [conditionalOnFinalizeTokenMint] = (0, utils_1.getVaultFinalizeMintAddr)(this.vaultProgram.programId, vault);
54
+ const [conditionalOnRevertTokenMint] = (0, utils_1.getVaultRevertMintAddr)(this.vaultProgram.programId, vault);
55
+ let userConditionalOnFinalizeTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(conditionalOnFinalizeTokenMint, userPubkey);
56
+ let userConditionalOnRevertTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(conditionalOnRevertTokenMint, userPubkey);
57
+ let ix = this.vaultProgram.methods
58
+ .mintConditionalTokens(amount)
59
+ .accounts({
60
+ authority: userPubkey,
61
+ vault,
62
+ vaultUnderlyingTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, vault, true),
63
+ userUnderlyingTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, userPubkey, true),
64
+ conditionalOnFinalizeTokenMint,
65
+ userConditionalOnFinalizeTokenAccount,
66
+ conditionalOnRevertTokenMint,
67
+ userConditionalOnRevertTokenAccount,
68
+ })
69
+ .preInstructions([
70
+ (0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(userPubkey, userConditionalOnFinalizeTokenAccount, userPubkey, conditionalOnFinalizeTokenMint),
71
+ (0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(userPubkey, userConditionalOnRevertTokenAccount, userPubkey, conditionalOnRevertTokenMint),
72
+ ]);
73
+ if (user instanceof web3_js_1.Keypair) {
74
+ ix = ix.signers([user]);
75
+ }
76
+ return ix;
77
+ }
78
+ initializeVaultIx(settlementAuthority, underlyingTokenMint) {
79
+ const [vault] = (0, utils_1.getVaultAddr)(this.vaultProgram.programId, settlementAuthority, underlyingTokenMint);
80
+ const [conditionalOnFinalizeTokenMint] = (0, utils_1.getVaultFinalizeMintAddr)(this.vaultProgram.programId, vault);
81
+ const [conditionalOnRevertTokenMint] = (0, utils_1.getVaultRevertMintAddr)(this.vaultProgram.programId, vault);
53
82
  const vaultUnderlyingTokenAccount = (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, vault, true);
54
83
  return this.vaultProgram.methods
55
- .initializeConditionalVault()
84
+ .initializeConditionalVault({ settlementAuthority })
56
85
  .accounts({
57
86
  vault,
58
- question,
59
87
  underlyingTokenMint,
60
88
  vaultUnderlyingTokenAccount,
89
+ conditionalOnFinalizeTokenMint,
90
+ conditionalOnRevertTokenMint,
61
91
  })
62
92
  .preInstructions([
63
93
  (0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(this.provider.publicKey, vaultUnderlyingTokenAccount, vault, underlyingTokenMint),
64
- ])
65
- .remainingAccounts(conditionalTokenMintAddrs.map((conditionalTokenMint) => {
66
- return {
67
- pubkey: conditionalTokenMint,
68
- isWritable: true,
69
- isSigner: false,
70
- };
71
- }));
72
- }
73
- async initializeVault(question, underlyingTokenMint, numOutcomes) {
74
- const [vault] = (0, utils_1.getVaultAddr)(this.vaultProgram.programId, question, underlyingTokenMint);
75
- await this.initializeVaultIx(question, underlyingTokenMint, numOutcomes).rpc();
76
- return vault;
77
- }
78
- resolveQuestionIx(question, oracle, payoutNumerators) {
94
+ ]);
95
+ }
96
+ addMetadataToConditionalTokensIx(vault, underlyingTokenMint, proposalNumber, onFinalizeUri, onRevertUri) {
97
+ const [underlyingTokenMetadata] = (0, utils_1.getMetadataAddr)(underlyingTokenMint);
98
+ const [conditionalOnFinalizeTokenMint] = (0, utils_1.getVaultFinalizeMintAddr)(this.vaultProgram.programId, vault);
99
+ const [conditionalOnRevertTokenMint] = (0, utils_1.getVaultRevertMintAddr)(this.vaultProgram.programId, vault);
100
+ const [conditionalOnFinalizeTokenMetadata] = (0, utils_1.getMetadataAddr)(conditionalOnFinalizeTokenMint);
101
+ const [conditionalOnRevertTokenMetadata] = (0, utils_1.getMetadataAddr)(conditionalOnRevertTokenMint);
79
102
  return this.vaultProgram.methods
80
- .resolveQuestion({
81
- payoutNumerators,
103
+ .addMetadataToConditionalTokens({
104
+ proposalNumber: new bn_js_1.default(proposalNumber),
105
+ onFinalizeUri,
106
+ onRevertUri,
82
107
  })
83
108
  .accounts({
84
- question,
85
- oracle: oracle.publicKey,
86
- })
87
- .signers([oracle]);
88
- }
89
- getConditionalTokenMints(vault, numOutcomes) {
90
- let conditionalTokenMintAddrs = [];
91
- for (let i = 0; i < numOutcomes; i++) {
92
- const [conditionalTokenMint] = (0, utils_1.getConditionalTokenMintAddr)(this.vaultProgram.programId, vault, i);
93
- conditionalTokenMintAddrs.push(conditionalTokenMint);
94
- }
95
- return conditionalTokenMintAddrs;
96
- }
97
- getRemainingAccounts(conditionalTokenMints, userConditionalAccounts) {
98
- return conditionalTokenMints
99
- .concat(userConditionalAccounts)
100
- .map((account) => ({
101
- pubkey: account,
102
- isWritable: true,
103
- isSigner: false,
104
- }));
105
- }
106
- // Helper method to get conditional token accounts and instructions
107
- getConditionalTokenAccountsAndInstructions(vault, numOutcomes, user) {
108
- const conditionalTokenMintAddrs = this.getConditionalTokenMints(vault, numOutcomes);
109
- const userConditionalAccounts = conditionalTokenMintAddrs.map((mint) => (0, spl_token_1.getAssociatedTokenAddressSync)(mint, user, true));
110
- const preInstructions = conditionalTokenMintAddrs.map((mint) => (0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(this.provider.publicKey, (0, spl_token_1.getAssociatedTokenAddressSync)(mint, user), user, mint));
111
- const remainingAccounts = this.getRemainingAccounts(conditionalTokenMintAddrs, userConditionalAccounts);
112
- return { userConditionalAccounts, preInstructions, remainingAccounts };
109
+ payer: this.provider.publicKey,
110
+ vault,
111
+ underlyingTokenMint,
112
+ underlyingTokenMetadata,
113
+ conditionalOnFinalizeTokenMint,
114
+ conditionalOnRevertTokenMint,
115
+ conditionalOnFinalizeTokenMetadata,
116
+ conditionalOnRevertTokenMetadata,
117
+ tokenMetadataProgram: constants_1.MPL_TOKEN_METADATA_PROGRAM_ID,
118
+ });
113
119
  }
114
- splitTokensIx(question, vault, underlyingTokenMint, amount, numOutcomes, user = this.provider.publicKey) {
115
- const { preInstructions, remainingAccounts } = this.getConditionalTokenAccountsAndInstructions(vault, numOutcomes, user);
120
+ redeemConditionalTokensIx(vault, underlyingTokenMint) {
121
+ const [conditionalOnFinalizeTokenMint] = (0, utils_1.getVaultFinalizeMintAddr)(this.vaultProgram.programId, vault);
122
+ const [conditionalOnRevertTokenMint] = (0, utils_1.getVaultRevertMintAddr)(this.vaultProgram.programId, vault);
116
123
  return this.vaultProgram.methods
117
- .splitTokens(amount)
124
+ .redeemConditionalTokensForUnderlyingTokens()
118
125
  .accounts({
119
- question,
120
- authority: user,
126
+ authority: this.provider.publicKey,
121
127
  vault,
122
128
  vaultUnderlyingTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, vault, true),
123
- userUnderlyingTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, user, true),
124
- })
125
- .preInstructions(preInstructions)
126
- .remainingAccounts(remainingAccounts);
129
+ userUnderlyingTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, this.provider.publicKey, true),
130
+ conditionalOnFinalizeTokenMint,
131
+ userConditionalOnFinalizeTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(conditionalOnFinalizeTokenMint, this.provider.publicKey),
132
+ conditionalOnRevertTokenMint,
133
+ userConditionalOnRevertTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(conditionalOnRevertTokenMint, this.provider.publicKey),
134
+ });
127
135
  }
128
- mergeTokensIx(question, vault, underlyingTokenMint, amount, numOutcomes, user = this.provider.publicKey) {
129
- let conditionalTokenMintAddrs = this.getConditionalTokenMints(vault, numOutcomes);
130
- let userConditionalAccounts = [];
131
- for (let conditionalTokenMint of conditionalTokenMintAddrs) {
132
- userConditionalAccounts.push((0, spl_token_1.getAssociatedTokenAddressSync)(conditionalTokenMint, user, true));
133
- }
134
- let ix = this.vaultProgram.methods
135
- .mergeTokens(amount)
136
+ mergeConditionalTokensIx(vault, underlyingTokenMint, amount) {
137
+ const [conditionalOnFinalizeTokenMint] = (0, utils_1.getVaultFinalizeMintAddr)(this.vaultProgram.programId, vault);
138
+ const [conditionalOnRevertTokenMint] = (0, utils_1.getVaultRevertMintAddr)(this.vaultProgram.programId, vault);
139
+ return this.vaultProgram.methods
140
+ .mergeConditionalTokensForUnderlyingTokens(amount)
136
141
  .accounts({
137
- question,
138
- authority: user,
142
+ authority: this.provider.publicKey,
139
143
  vault,
140
144
  vaultUnderlyingTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, vault, true),
141
- userUnderlyingTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, user, true),
142
- })
143
- .preInstructions(conditionalTokenMintAddrs.map((conditionalTokenMint) => {
144
- return (0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(this.provider.publicKey, (0, spl_token_1.getAssociatedTokenAddressSync)(conditionalTokenMint, user), user, conditionalTokenMint);
145
- }))
146
- .remainingAccounts(conditionalTokenMintAddrs
147
- .concat(userConditionalAccounts)
148
- .map((conditionalTokenMint) => {
149
- return {
150
- pubkey: conditionalTokenMint,
151
- isWritable: true,
152
- isSigner: false,
153
- };
154
- }));
155
- return ix;
145
+ userUnderlyingTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, this.provider.publicKey, true),
146
+ conditionalOnFinalizeTokenMint,
147
+ userConditionalOnFinalizeTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(conditionalOnFinalizeTokenMint, this.provider.publicKey),
148
+ conditionalOnRevertTokenMint,
149
+ userConditionalOnRevertTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(conditionalOnRevertTokenMint, this.provider.publicKey),
150
+ });
156
151
  }
157
- redeemTokensIx(question, vault, underlyingTokenMint, numOutcomes, user = this.provider.publicKey) {
158
- let conditionalTokenMintAddrs = [];
159
- for (let i = 0; i < numOutcomes; i++) {
160
- const [conditionalTokenMint] = (0, utils_1.getConditionalTokenMintAddr)(this.vaultProgram.programId, vault, i);
161
- conditionalTokenMintAddrs.push(conditionalTokenMint);
162
- }
163
- let userConditionalAccounts = [];
164
- for (let conditionalTokenMint of conditionalTokenMintAddrs) {
165
- userConditionalAccounts.push((0, spl_token_1.getAssociatedTokenAddressSync)(conditionalTokenMint, user, true));
166
- }
167
- let ix = this.vaultProgram.methods
168
- .redeemTokens()
169
- .accounts({
170
- question,
171
- authority: user,
172
- vault,
173
- vaultUnderlyingTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, vault, true),
174
- userUnderlyingTokenAccount: (0, spl_token_1.getAssociatedTokenAddressSync)(underlyingTokenMint, user, true),
175
- })
176
- .preInstructions(conditionalTokenMintAddrs.map((conditionalTokenMint) => {
177
- return (0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(this.provider.publicKey, (0, spl_token_1.getAssociatedTokenAddressSync)(conditionalTokenMint, user), user, conditionalTokenMint);
178
- }))
179
- .remainingAccounts(conditionalTokenMintAddrs
180
- .concat(userConditionalAccounts)
181
- .map((conditionalTokenMint) => {
182
- return {
183
- pubkey: conditionalTokenMint,
184
- isWritable: true,
185
- isSigner: false,
186
- };
187
- }));
188
- return ix;
152
+ async initializeVault(settlementAuthority, underlyingTokenMint) {
153
+ const [vault] = (0, utils_1.getVaultAddr)(this.vaultProgram.programId, settlementAuthority, underlyingTokenMint);
154
+ await this.initializeVaultIx(settlementAuthority, underlyingTokenMint).rpc();
155
+ return vault;
189
156
  }
190
157
  }
191
158
  exports.ConditionalVaultClient = ConditionalVaultClient;