@metadaoproject/futarchy 0.4.0-alpha.10 → 0.4.0-alpha.12

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 (55) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +2 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/v0.4/AmmClient.d.ts +289 -0
  5. package/dist/v0.4/AmmClient.js +278 -0
  6. package/dist/v0.4/AmmClient.js.map +1 -0
  7. package/dist/v0.4/AutocratClient.d.ts +234 -0
  8. package/dist/v0.4/AutocratClient.js +375 -0
  9. package/dist/v0.4/AutocratClient.js.map +1 -0
  10. package/dist/v0.4/ConditionalVaultClient.d.ts +315 -0
  11. package/dist/v0.4/ConditionalVaultClient.js +225 -0
  12. package/dist/v0.4/ConditionalVaultClient.js.map +1 -0
  13. package/dist/v0.4/constants.d.ts +9 -0
  14. package/dist/v0.4/constants.js +10 -0
  15. package/dist/v0.4/constants.js.map +1 -0
  16. package/dist/v0.4/index.d.ts +6 -0
  17. package/dist/v0.4/index.js +7 -0
  18. package/dist/v0.4/index.js.map +1 -0
  19. package/dist/v0.4/types/amm.d.ts +813 -0
  20. package/dist/v0.4/types/amm.js +813 -0
  21. package/dist/v0.4/types/amm.js.map +1 -0
  22. package/dist/v0.4/types/autocrat.d.ts +641 -0
  23. package/dist/v0.4/types/autocrat.js +641 -0
  24. package/dist/v0.4/types/autocrat.js.map +1 -0
  25. package/dist/v0.4/types/conditional_vault.d.ts +920 -0
  26. package/dist/v0.4/types/conditional_vault.js +920 -0
  27. package/dist/v0.4/types/conditional_vault.js.map +1 -0
  28. package/dist/v0.4/types/index.d.ts +17 -0
  29. package/dist/v0.4/types/index.js +7 -0
  30. package/dist/v0.4/types/index.js.map +1 -0
  31. package/dist/v0.4/types/utils.d.ts +3 -0
  32. package/dist/v0.4/types/utils.js +2 -0
  33. package/dist/v0.4/types/utils.js.map +1 -0
  34. package/dist/v0.4/utils/cu.d.ts +10 -0
  35. package/dist/v0.4/utils/cu.js +11 -0
  36. package/dist/v0.4/utils/cu.js.map +1 -0
  37. package/dist/v0.4/utils/filters.d.ts +3 -0
  38. package/dist/v0.4/utils/filters.js +14 -0
  39. package/dist/v0.4/utils/filters.js.map +1 -0
  40. package/dist/v0.4/utils/index.d.ts +16 -0
  41. package/dist/v0.4/utils/index.js +30 -0
  42. package/dist/v0.4/utils/index.js.map +1 -0
  43. package/dist/v0.4/utils/instruction.d.ts +4 -0
  44. package/dist/v0.4/utils/instruction.js +10 -0
  45. package/dist/v0.4/utils/instruction.js.map +1 -0
  46. package/dist/v0.4/utils/metadata.d.ts +4 -0
  47. package/dist/v0.4/utils/metadata.js +26 -0
  48. package/dist/v0.4/utils/metadata.js.map +1 -0
  49. package/dist/v0.4/utils/pda.d.ts +13 -0
  50. package/dist/v0.4/utils/pda.js +69 -0
  51. package/dist/v0.4/utils/pda.js.map +1 -0
  52. package/dist/v0.4/utils/priceMath.d.ts +12 -0
  53. package/dist/v0.4/utils/priceMath.js +52 -0
  54. package/dist/v0.4/utils/priceMath.js.map +1 -0
  55. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ export { sha256 } from "@noble/hashes/sha256";
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { sha256 } from "@noble/hashes/sha256";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,289 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { AnchorProvider, IdlTypes, Program } from "@coral-xyz/anchor";
3
+ import { AccountInfo, AddressLookupTableAccount, PublicKey } from "@solana/web3.js";
4
+ import { Amm as AmmIDLType } from "./types/amm.js";
5
+ import BN from "bn.js";
6
+ import { Amm, LowercaseKeys } from "./types/index.js";
7
+ export type SwapType = LowercaseKeys<IdlTypes<AmmIDLType>["SwapType"]>;
8
+ export type CreateAmmClientParams = {
9
+ provider: AnchorProvider;
10
+ ammProgramId?: PublicKey;
11
+ };
12
+ export type AddLiquiditySimulation = {
13
+ baseAmount: BN;
14
+ quoteAmount: BN;
15
+ expectedLpTokens: BN;
16
+ minLpTokens?: BN;
17
+ maxBaseAmount?: BN;
18
+ };
19
+ export type SwapSimulation = {
20
+ expectedOut: BN;
21
+ newBaseReserves: BN;
22
+ newQuoteReserves: BN;
23
+ minExpectedOut?: BN;
24
+ };
25
+ export type RemoveLiquiditySimulation = {
26
+ expectedBaseOut: BN;
27
+ expectedQuoteOut: BN;
28
+ minBaseOut?: BN;
29
+ minQuoteOut?: BN;
30
+ };
31
+ export declare class AmmClient {
32
+ readonly provider: AnchorProvider;
33
+ readonly program: Program<AmmIDLType>;
34
+ readonly luts: AddressLookupTableAccount[];
35
+ constructor(provider: AnchorProvider, ammProgramId: PublicKey, luts: AddressLookupTableAccount[]);
36
+ static createClient(createAutocratClientParams: CreateAmmClientParams): AmmClient;
37
+ getProgramId(): PublicKey;
38
+ getAmm(amm: PublicKey): Promise<Amm>;
39
+ fetchAmm(amm: PublicKey): Promise<Amm | null>;
40
+ deserializeAmm(accountInfo: AccountInfo<Buffer>): Promise<Amm>;
41
+ createAmm(proposal: PublicKey, baseMint: PublicKey, quoteMint: PublicKey, twapInitialObservation: number, twapMaxObservationChangePerUpdate?: number): Promise<PublicKey>;
42
+ initializeAmmIx(baseMint: PublicKey, quoteMint: PublicKey, twapInitialObservation: BN, twapMaxObservationChangePerUpdate: BN): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<AmmIDLType, {
43
+ name: "createAmm";
44
+ accounts: [{
45
+ name: "user";
46
+ isMut: true;
47
+ isSigner: true;
48
+ }, {
49
+ name: "amm";
50
+ isMut: true;
51
+ isSigner: false;
52
+ }, {
53
+ name: "lpMint";
54
+ isMut: true;
55
+ isSigner: false;
56
+ }, {
57
+ name: "baseMint";
58
+ isMut: false;
59
+ isSigner: false;
60
+ }, {
61
+ name: "quoteMint";
62
+ isMut: false;
63
+ isSigner: false;
64
+ }, {
65
+ name: "vaultAtaBase";
66
+ isMut: true;
67
+ isSigner: false;
68
+ }, {
69
+ name: "vaultAtaQuote";
70
+ isMut: true;
71
+ isSigner: false;
72
+ }, {
73
+ name: "associatedTokenProgram";
74
+ isMut: false;
75
+ isSigner: false;
76
+ }, {
77
+ name: "tokenProgram";
78
+ isMut: false;
79
+ isSigner: false;
80
+ }, {
81
+ name: "systemProgram";
82
+ isMut: false;
83
+ isSigner: false;
84
+ }, {
85
+ name: "eventAuthority";
86
+ isMut: false;
87
+ isSigner: false;
88
+ }, {
89
+ name: "program";
90
+ isMut: false;
91
+ isSigner: false;
92
+ }];
93
+ args: [{
94
+ name: "args";
95
+ type: {
96
+ defined: "CreateAmmArgs";
97
+ };
98
+ }];
99
+ } & {
100
+ name: "createAmm";
101
+ }>;
102
+ addLiquidity(amm: PublicKey, quoteAmount?: number, baseAmount?: number): Promise<string | undefined>;
103
+ addLiquidityIx(amm: PublicKey, baseMint: PublicKey, quoteMint: PublicKey, quoteAmount: BN, maxBaseAmount: BN, minLpTokens: BN, user?: PublicKey): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<AmmIDLType, {
104
+ name: "addLiquidity";
105
+ accounts: [{
106
+ name: "user";
107
+ isMut: true;
108
+ isSigner: true;
109
+ }, {
110
+ name: "amm";
111
+ isMut: true;
112
+ isSigner: false;
113
+ }, {
114
+ name: "lpMint";
115
+ isMut: true;
116
+ isSigner: false;
117
+ }, {
118
+ name: "userLpAccount";
119
+ isMut: true;
120
+ isSigner: false;
121
+ }, {
122
+ name: "userBaseAccount";
123
+ isMut: true;
124
+ isSigner: false;
125
+ }, {
126
+ name: "userQuoteAccount";
127
+ isMut: true;
128
+ isSigner: false;
129
+ }, {
130
+ name: "vaultAtaBase";
131
+ isMut: true;
132
+ isSigner: false;
133
+ }, {
134
+ name: "vaultAtaQuote";
135
+ isMut: true;
136
+ isSigner: false;
137
+ }, {
138
+ name: "tokenProgram";
139
+ isMut: false;
140
+ isSigner: false;
141
+ }, {
142
+ name: "eventAuthority";
143
+ isMut: false;
144
+ isSigner: false;
145
+ }, {
146
+ name: "program";
147
+ isMut: false;
148
+ isSigner: false;
149
+ }];
150
+ args: [{
151
+ name: "args";
152
+ type: {
153
+ defined: "AddLiquidityArgs";
154
+ };
155
+ }];
156
+ } & {
157
+ name: "addLiquidity";
158
+ }>;
159
+ removeLiquidityIx(ammAddr: PublicKey, baseMint: PublicKey, quoteMint: PublicKey, lpTokensToBurn: BN, minBaseAmount: BN, minQuoteAmount: BN): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<AmmIDLType, {
160
+ name: "removeLiquidity";
161
+ accounts: [{
162
+ name: "user";
163
+ isMut: true;
164
+ isSigner: true;
165
+ }, {
166
+ name: "amm";
167
+ isMut: true;
168
+ isSigner: false;
169
+ }, {
170
+ name: "lpMint";
171
+ isMut: true;
172
+ isSigner: false;
173
+ }, {
174
+ name: "userLpAccount";
175
+ isMut: true;
176
+ isSigner: false;
177
+ }, {
178
+ name: "userBaseAccount";
179
+ isMut: true;
180
+ isSigner: false;
181
+ }, {
182
+ name: "userQuoteAccount";
183
+ isMut: true;
184
+ isSigner: false;
185
+ }, {
186
+ name: "vaultAtaBase";
187
+ isMut: true;
188
+ isSigner: false;
189
+ }, {
190
+ name: "vaultAtaQuote";
191
+ isMut: true;
192
+ isSigner: false;
193
+ }, {
194
+ name: "tokenProgram";
195
+ isMut: false;
196
+ isSigner: false;
197
+ }, {
198
+ name: "eventAuthority";
199
+ isMut: false;
200
+ isSigner: false;
201
+ }, {
202
+ name: "program";
203
+ isMut: false;
204
+ isSigner: false;
205
+ }];
206
+ args: [{
207
+ name: "args";
208
+ type: {
209
+ defined: "RemoveLiquidityArgs";
210
+ };
211
+ }];
212
+ } & {
213
+ name: "removeLiquidity";
214
+ }>;
215
+ swap(amm: PublicKey, swapType: SwapType, inputAmount: number, outputAmountMin: number): Promise<string>;
216
+ swapIx(amm: PublicKey, baseMint: PublicKey, quoteMint: PublicKey, swapType: SwapType, inputAmount: BN, outputAmountMin: BN, user?: PublicKey): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<AmmIDLType, {
217
+ name: "swap";
218
+ accounts: [{
219
+ name: "user";
220
+ isMut: true;
221
+ isSigner: true;
222
+ }, {
223
+ name: "amm";
224
+ isMut: true;
225
+ isSigner: false;
226
+ }, {
227
+ name: "userBaseAccount";
228
+ isMut: true;
229
+ isSigner: false;
230
+ }, {
231
+ name: "userQuoteAccount";
232
+ isMut: true;
233
+ isSigner: false;
234
+ }, {
235
+ name: "vaultAtaBase";
236
+ isMut: true;
237
+ isSigner: false;
238
+ }, {
239
+ name: "vaultAtaQuote";
240
+ isMut: true;
241
+ isSigner: false;
242
+ }, {
243
+ name: "tokenProgram";
244
+ isMut: false;
245
+ isSigner: false;
246
+ }, {
247
+ name: "eventAuthority";
248
+ isMut: false;
249
+ isSigner: false;
250
+ }, {
251
+ name: "program";
252
+ isMut: false;
253
+ isSigner: false;
254
+ }];
255
+ args: [{
256
+ name: "args";
257
+ type: {
258
+ defined: "SwapArgs";
259
+ };
260
+ }];
261
+ } & {
262
+ name: "swap";
263
+ }>;
264
+ crankThatTwap(amm: PublicKey): Promise<string>;
265
+ crankThatTwapIx(amm: PublicKey): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<AmmIDLType, {
266
+ name: "crankThatTwap";
267
+ accounts: [{
268
+ name: "amm";
269
+ isMut: true;
270
+ isSigner: false;
271
+ }, {
272
+ name: "eventAuthority";
273
+ isMut: false;
274
+ isSigner: false;
275
+ }, {
276
+ name: "program";
277
+ isMut: false;
278
+ isSigner: false;
279
+ }];
280
+ args: [];
281
+ } & {
282
+ name: "crankThatTwap";
283
+ }>;
284
+ getTwap(amm: Amm): BN;
285
+ simulateAddLiquidity(baseReserves: BN, quoteReserves: BN, lpMintSupply: number, baseAmount?: BN, quoteAmount?: BN, slippageBps?: BN): AddLiquiditySimulation;
286
+ simulateSwap(inputAmount: BN, swapType: SwapType, baseReserves: BN, quoteReserves: BN, slippageBps?: BN): SwapSimulation;
287
+ simulateRemoveLiquidity(lpTokensToBurn: BN, baseReserves: BN, quoteReserves: BN, lpTotalSupply: BN, slippageBps?: BN): RemoveLiquiditySimulation;
288
+ getDecimals(mint: PublicKey): Promise<number>;
289
+ }
@@ -0,0 +1,278 @@
1
+ import { Program } from "@coral-xyz/anchor";
2
+ import { IDL as AmmIDL } from "./types/amm.js";
3
+ import BN from "bn.js";
4
+ import { AMM_PROGRAM_ID } from "./constants.js";
5
+ import { getAmmLpMintAddr, getAmmAddr } from "./utils/pda.js";
6
+ // import { MethodsBuilder } from "@coral-xyz/anchor/dist/cjs/program/namespace/methods";
7
+ import { unpackMint, getAssociatedTokenAddressSync, createAssociatedTokenAccountIdempotentInstruction, } from "@solana/spl-token";
8
+ import { PriceMath } from "./utils/priceMath.js";
9
+ export class AmmClient {
10
+ provider;
11
+ program;
12
+ luts;
13
+ constructor(provider, ammProgramId, luts) {
14
+ this.provider = provider;
15
+ this.program = new Program(AmmIDL, ammProgramId, provider);
16
+ this.luts = luts;
17
+ }
18
+ static createClient(createAutocratClientParams) {
19
+ let { provider, ammProgramId: programId } = createAutocratClientParams;
20
+ const luts = [];
21
+ return new AmmClient(provider, programId || AMM_PROGRAM_ID, luts);
22
+ }
23
+ getProgramId() {
24
+ return this.program.programId;
25
+ }
26
+ async getAmm(amm) {
27
+ return await this.program.account.amm.fetch(amm);
28
+ }
29
+ async fetchAmm(amm) {
30
+ return await this.program.account.amm.fetchNullable(amm);
31
+ }
32
+ async deserializeAmm(accountInfo) {
33
+ return this.program.coder.accounts.decode("amm", accountInfo.data);
34
+ }
35
+ async createAmm(proposal, baseMint, quoteMint, twapInitialObservation, twapMaxObservationChangePerUpdate) {
36
+ if (!twapMaxObservationChangePerUpdate) {
37
+ twapMaxObservationChangePerUpdate = twapInitialObservation * 0.02;
38
+ }
39
+ let [amm] = getAmmAddr(this.getProgramId(), baseMint, quoteMint);
40
+ let baseDecimals = unpackMint(baseMint, await this.provider.connection.getAccountInfo(baseMint)).decimals;
41
+ let quoteDecimals = unpackMint(quoteMint, await this.provider.connection.getAccountInfo(quoteMint)).decimals;
42
+ let [twapFirstObservationScaled, twapMaxObservationChangePerUpdateScaled] = PriceMath.getAmmPrices(baseDecimals, quoteDecimals, twapInitialObservation, twapMaxObservationChangePerUpdate);
43
+ await this.initializeAmmIx(baseMint, quoteMint, twapFirstObservationScaled, twapMaxObservationChangePerUpdateScaled).rpc();
44
+ return amm;
45
+ }
46
+ // both twap values need to be scaled beforehand
47
+ initializeAmmIx(baseMint, quoteMint, twapInitialObservation, twapMaxObservationChangePerUpdate) {
48
+ let [amm] = getAmmAddr(this.getProgramId(), baseMint, quoteMint);
49
+ let [lpMint] = getAmmLpMintAddr(this.getProgramId(), amm);
50
+ let vaultAtaBase = getAssociatedTokenAddressSync(baseMint, amm, true);
51
+ let vaultAtaQuote = getAssociatedTokenAddressSync(quoteMint, amm, true);
52
+ return this.program.methods
53
+ .createAmm({
54
+ twapInitialObservation,
55
+ twapMaxObservationChangePerUpdate,
56
+ })
57
+ .accounts({
58
+ user: this.provider.publicKey,
59
+ amm,
60
+ lpMint,
61
+ baseMint,
62
+ quoteMint,
63
+ vaultAtaBase,
64
+ vaultAtaQuote,
65
+ });
66
+ }
67
+ async addLiquidity(amm, quoteAmount, baseAmount) {
68
+ let storedAmm = await this.getAmm(amm);
69
+ let lpMintSupply = unpackMint(storedAmm.lpMint, await this.provider.connection.getAccountInfo(storedAmm.lpMint)).supply;
70
+ let quoteAmountCasted;
71
+ let baseAmountCasted;
72
+ if (quoteAmount != undefined) {
73
+ let quoteDecimals = unpackMint(storedAmm.quoteMint, await this.provider.connection.getAccountInfo(storedAmm.quoteMint)).decimals;
74
+ quoteAmountCasted = new BN(quoteAmount).mul(new BN(10).pow(new BN(quoteDecimals)));
75
+ }
76
+ if (baseAmount != undefined) {
77
+ let baseDecimals = unpackMint(storedAmm.baseMint, await this.provider.connection.getAccountInfo(storedAmm.baseMint)).decimals;
78
+ baseAmountCasted = new BN(baseAmount).mul(new BN(10).pow(new BN(baseDecimals)));
79
+ }
80
+ if (lpMintSupply == 0n) {
81
+ if (quoteAmount == undefined || baseAmount == undefined) {
82
+ throw new Error("No pool created yet, you need to specify both base and quote");
83
+ }
84
+ // console.log(quoteAmountCasted?.toString());
85
+ // console.log(baseAmountCasted?.toString())
86
+ return await this.addLiquidityIx(amm, storedAmm.baseMint, storedAmm.quoteMint, quoteAmountCasted, baseAmountCasted, new BN(0)).rpc();
87
+ }
88
+ // quoteAmount == undefined ? undefined : new BN(quoteAmount);
89
+ // let baseAmountCasted: BN | undefined =
90
+ // baseAmount == undefined ? undefined : new BN(baseAmount);
91
+ let sim = this.simulateAddLiquidity(storedAmm.baseAmount, storedAmm.quoteAmount, Number(lpMintSupply), baseAmountCasted, quoteAmountCasted);
92
+ await this.addLiquidityIx(amm, storedAmm.baseMint, storedAmm.quoteMint, sim.quoteAmount, sim.baseAmount, sim.expectedLpTokens).rpc();
93
+ }
94
+ addLiquidityIx(amm, baseMint, quoteMint, quoteAmount, maxBaseAmount, minLpTokens, user = this.provider.publicKey) {
95
+ const [lpMint] = getAmmLpMintAddr(this.program.programId, amm);
96
+ const userLpAccount = getAssociatedTokenAddressSync(lpMint, user);
97
+ return this.program.methods
98
+ .addLiquidity({
99
+ quoteAmount,
100
+ maxBaseAmount,
101
+ minLpTokens,
102
+ })
103
+ .accounts({
104
+ user,
105
+ amm,
106
+ lpMint,
107
+ userLpAccount,
108
+ userBaseAccount: getAssociatedTokenAddressSync(baseMint, user),
109
+ userQuoteAccount: getAssociatedTokenAddressSync(quoteMint, user),
110
+ vaultAtaBase: getAssociatedTokenAddressSync(baseMint, amm, true),
111
+ vaultAtaQuote: getAssociatedTokenAddressSync(quoteMint, amm, true),
112
+ })
113
+ .preInstructions([
114
+ createAssociatedTokenAccountIdempotentInstruction(this.provider.publicKey, userLpAccount, this.provider.publicKey, lpMint),
115
+ ]);
116
+ }
117
+ removeLiquidityIx(ammAddr, baseMint, quoteMint, lpTokensToBurn, minBaseAmount, minQuoteAmount) {
118
+ const [lpMint] = getAmmLpMintAddr(this.program.programId, ammAddr);
119
+ return this.program.methods
120
+ .removeLiquidity({
121
+ lpTokensToBurn,
122
+ minBaseAmount,
123
+ minQuoteAmount,
124
+ })
125
+ .accounts({
126
+ user: this.provider.publicKey,
127
+ amm: ammAddr,
128
+ lpMint,
129
+ userLpAccount: getAssociatedTokenAddressSync(lpMint, this.provider.publicKey),
130
+ userBaseAccount: getAssociatedTokenAddressSync(baseMint, this.provider.publicKey),
131
+ userQuoteAccount: getAssociatedTokenAddressSync(quoteMint, this.provider.publicKey),
132
+ vaultAtaBase: getAssociatedTokenAddressSync(baseMint, ammAddr, true),
133
+ vaultAtaQuote: getAssociatedTokenAddressSync(quoteMint, ammAddr, true),
134
+ });
135
+ }
136
+ async swap(amm, swapType, inputAmount, outputAmountMin) {
137
+ const storedAmm = await this.getAmm(amm);
138
+ let quoteDecimals = await this.getDecimals(storedAmm.quoteMint);
139
+ let baseDecimals = await this.getDecimals(storedAmm.baseMint);
140
+ let inputAmountScaled;
141
+ let outputAmountMinScaled;
142
+ if (swapType.buy) {
143
+ inputAmountScaled = PriceMath.scale(inputAmount, quoteDecimals);
144
+ outputAmountMinScaled = PriceMath.scale(outputAmountMin, baseDecimals);
145
+ }
146
+ else {
147
+ inputAmountScaled = PriceMath.scale(inputAmount, baseDecimals);
148
+ outputAmountMinScaled = PriceMath.scale(outputAmountMin, quoteDecimals);
149
+ }
150
+ return await this.swapIx(amm, storedAmm.baseMint, storedAmm.quoteMint, swapType, inputAmountScaled, outputAmountMinScaled).rpc();
151
+ }
152
+ swapIx(amm, baseMint, quoteMint, swapType, inputAmount, outputAmountMin, user = this.provider.publicKey) {
153
+ const receivingToken = swapType.buy ? baseMint : quoteMint;
154
+ return this.program.methods
155
+ .swap({
156
+ swapType,
157
+ inputAmount,
158
+ outputAmountMin,
159
+ })
160
+ .accounts({
161
+ user,
162
+ amm,
163
+ userBaseAccount: getAssociatedTokenAddressSync(baseMint, user, true),
164
+ userQuoteAccount: getAssociatedTokenAddressSync(quoteMint, user, true),
165
+ vaultAtaBase: getAssociatedTokenAddressSync(baseMint, amm, true),
166
+ vaultAtaQuote: getAssociatedTokenAddressSync(quoteMint, amm, true),
167
+ })
168
+ .preInstructions([
169
+ // create the receiving token account if it doesn't exist
170
+ createAssociatedTokenAccountIdempotentInstruction(this.provider.publicKey, getAssociatedTokenAddressSync(receivingToken, user), user, receivingToken),
171
+ ]);
172
+ }
173
+ async crankThatTwap(amm) {
174
+ return this.crankThatTwapIx(amm).rpc();
175
+ }
176
+ crankThatTwapIx(amm) {
177
+ return this.program.methods.crankThatTwap().accounts({
178
+ amm,
179
+ });
180
+ }
181
+ // getter functions
182
+ // async getLTWAP(ammAddr: PublicKey): Promise<number> {
183
+ // const amm = await this.program.account.amm.fetch(ammAddr);
184
+ // return amm.twapLastObservationUq64X32
185
+ // .div(new BN(2).pow(new BN(32)))
186
+ // .toNumber();
187
+ // }
188
+ getTwap(amm) {
189
+ return amm.oracle.aggregator.div(amm.oracle.lastUpdatedSlot.sub(amm.createdAtSlot));
190
+ }
191
+ simulateAddLiquidity(baseReserves, quoteReserves, lpMintSupply, baseAmount, quoteAmount, slippageBps) {
192
+ if (lpMintSupply == 0) {
193
+ throw new Error("This AMM doesn't have existing liquidity so we can't fill in the blanks");
194
+ }
195
+ if (baseAmount == undefined && quoteAmount == undefined) {
196
+ throw new Error("Must specify either a base amount or a quote amount");
197
+ }
198
+ let expectedLpTokens;
199
+ if (quoteAmount == undefined) {
200
+ quoteAmount = baseAmount?.mul(quoteReserves).div(baseReserves);
201
+ }
202
+ baseAmount = quoteAmount?.mul(baseReserves).div(quoteReserves).addn(1);
203
+ expectedLpTokens = quoteAmount
204
+ ?.mul(new BN(lpMintSupply))
205
+ .div(quoteReserves);
206
+ let minLpTokens, maxBaseAmount;
207
+ if (slippageBps) {
208
+ minLpTokens = PriceMath.subtractSlippage(expectedLpTokens, slippageBps);
209
+ maxBaseAmount = PriceMath.addSlippage(baseAmount, slippageBps);
210
+ }
211
+ return {
212
+ quoteAmount: quoteAmount,
213
+ baseAmount: baseAmount,
214
+ expectedLpTokens,
215
+ minLpTokens,
216
+ maxBaseAmount,
217
+ };
218
+ }
219
+ simulateSwap(inputAmount, swapType, baseReserves, quoteReserves, slippageBps) {
220
+ if (baseReserves.eqn(0) || quoteReserves.eqn(0)) {
221
+ throw new Error("reserves must be non-zero");
222
+ }
223
+ let inputReserves, outputReserves;
224
+ if (swapType.buy) {
225
+ inputReserves = quoteReserves;
226
+ outputReserves = baseReserves;
227
+ }
228
+ else {
229
+ inputReserves = baseReserves;
230
+ outputReserves = quoteReserves;
231
+ }
232
+ let inputAmountWithFee = inputAmount.muln(990);
233
+ let numerator = inputAmountWithFee.mul(outputReserves);
234
+ let denominator = inputReserves.muln(1000).add(inputAmountWithFee);
235
+ let expectedOut = numerator.div(denominator);
236
+ let minExpectedOut;
237
+ if (slippageBps) {
238
+ minExpectedOut = PriceMath.subtractSlippage(expectedOut, slippageBps);
239
+ }
240
+ let newBaseReserves, newQuoteReserves;
241
+ if (swapType.buy) {
242
+ newBaseReserves = baseReserves.sub(expectedOut);
243
+ newQuoteReserves = quoteReserves.add(inputAmount);
244
+ }
245
+ else {
246
+ newBaseReserves = baseReserves.add(inputAmount);
247
+ newQuoteReserves = quoteReserves.sub(expectedOut);
248
+ }
249
+ return {
250
+ expectedOut,
251
+ newBaseReserves,
252
+ newQuoteReserves,
253
+ minExpectedOut,
254
+ };
255
+ }
256
+ simulateRemoveLiquidity(lpTokensToBurn, baseReserves, quoteReserves, lpTotalSupply, slippageBps) {
257
+ const expectedBaseOut = lpTokensToBurn.mul(baseReserves).div(lpTotalSupply);
258
+ const expectedQuoteOut = lpTokensToBurn
259
+ .mul(quoteReserves)
260
+ .div(lpTotalSupply);
261
+ let minBaseOut, minQuoteOut;
262
+ if (slippageBps) {
263
+ minBaseOut = PriceMath.subtractSlippage(expectedBaseOut, slippageBps);
264
+ minQuoteOut = PriceMath.subtractSlippage(expectedQuoteOut, slippageBps);
265
+ }
266
+ return {
267
+ expectedBaseOut,
268
+ expectedQuoteOut,
269
+ minBaseOut,
270
+ minQuoteOut,
271
+ };
272
+ }
273
+ async getDecimals(mint) {
274
+ return unpackMint(mint, await this.provider.connection.getAccountInfo(mint))
275
+ .decimals;
276
+ }
277
+ }
278
+ //# sourceMappingURL=AmmClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AmmClient.js","sourceRoot":"","sources":["../../src/v0.4/AmmClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAQtE,OAAO,EAAqB,GAAG,IAAI,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9D,yFAAyF;AACzF,OAAO,EAEL,UAAU,EACV,6BAA6B,EAC7B,iDAAiD,GAClD,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AA+BjD,MAAM,OAAO,SAAS;IACJ,QAAQ,CAAiB;IACzB,OAAO,CAAsB;IAC7B,IAAI,CAA8B;IAElD,YACE,QAAwB,EACxB,YAAuB,EACvB,IAAiC;QAEjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAa,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,YAAY,CACxB,0BAAiD;QAEjD,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,0BAA0B,CAAC;QAEvE,MAAM,IAAI,GAAgC,EAAE,CAAC;QAE7C,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,SAAS,IAAI,cAAc,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAc;QACzB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAc;QAC3B,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAgC;QACnD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,SAAS,CACb,QAAmB,EACnB,QAAmB,EACnB,SAAoB,EACpB,sBAA8B,EAC9B,iCAA0C;QAE1C,IAAI,CAAC,iCAAiC,EAAE;YACtC,iCAAiC,GAAG,sBAAsB,GAAG,IAAI,CAAC;SACnE;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEjE,IAAI,YAAY,GAAG,UAAU,CAC3B,QAAQ,EACR,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,CACxD,CAAC,QAAQ,CAAC;QACX,IAAI,aAAa,GAAG,UAAU,CAC5B,SAAS,EACT,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CACzD,CAAC,QAAQ,CAAC;QAEX,IAAI,CAAC,0BAA0B,EAAE,uCAAuC,CAAC,GACvE,SAAS,CAAC,YAAY,CACpB,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,iCAAiC,CAClC,CAAC;QAEJ,MAAM,IAAI,CAAC,eAAe,CACxB,QAAQ,EACR,SAAS,EACT,0BAA0B,EAC1B,uCAAuC,CACxC,CAAC,GAAG,EAAE,CAAC;QAER,OAAO,GAAG,CAAC;IACb,CAAC;IAED,gDAAgD;IAChD,eAAe,CACb,QAAmB,EACnB,SAAoB,EACpB,sBAA0B,EAC1B,iCAAqC;QAErC,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;QAE1D,IAAI,YAAY,GAAG,6BAA6B,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,aAAa,GAAG,6BAA6B,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAExE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO;aACxB,SAAS,CAAC;YACT,sBAAsB;YACtB,iCAAiC;SAClC,CAAC;aACD,QAAQ,CAAC;YACR,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;YAC7B,GAAG;YACH,MAAM;YACN,QAAQ;YACR,SAAS;YACT,YAAY;YACZ,aAAa;SACd,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,GAAc,EACd,WAAoB,EACpB,UAAmB;QAEnB,IAAI,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,YAAY,GAAG,UAAU,CAC3B,SAAS,CAAC,MAAM,EAChB,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAChE,CAAC,MAAM,CAAC;QAET,IAAI,iBAAiC,CAAC;QACtC,IAAI,gBAAgC,CAAC;QAErC,IAAI,WAAW,IAAI,SAAS,EAAE;YAC5B,IAAI,aAAa,GAAG,UAAU,CAC5B,SAAS,CAAC,SAAS,EACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CACnE,CAAC,QAAQ,CAAC;YACX,iBAAiB,GAAG,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,GAAG,CACzC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,CAAC,CACtC,CAAC;SACH;QAED,IAAI,UAAU,IAAI,SAAS,EAAE;YAC3B,IAAI,YAAY,GAAG,UAAU,CAC3B,SAAS,CAAC,QAAQ,EAClB,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,CAClE,CAAC,QAAQ,CAAC;YACX,gBAAgB,GAAG,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,CACvC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CACrC,CAAC;SACH;QAED,IAAI,YAAY,IAAI,EAAE,EAAE;YACtB,IAAI,WAAW,IAAI,SAAS,IAAI,UAAU,IAAI,SAAS,EAAE;gBACvD,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;aACH;YAED,8CAA8C;YAC9C,4CAA4C;YAE5C,OAAO,MAAM,IAAI,CAAC,cAAc,CAC9B,GAAG,EACH,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,SAAS,EACnB,iBAAuB,EACvB,gBAAsB,EACtB,IAAI,EAAE,CAAC,CAAC,CAAC,CACV,CAAC,GAAG,EAAE,CAAC;SACT;QAED,gEAAgE;QAChE,yCAAyC;QACzC,8DAA8D;QAE9D,IAAI,GAAG,GAAG,IAAI,CAAC,oBAAoB,CACjC,SAAS,CAAC,UAAU,EACpB,SAAS,CAAC,WAAW,EACrB,MAAM,CAAC,YAAY,CAAC,EACpB,gBAAgB,EAChB,iBAAiB,CAClB,CAAC;QAEF,MAAM,IAAI,CAAC,cAAc,CACvB,GAAG,EACH,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,SAAS,EACnB,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,gBAAgB,CACrB,CAAC,GAAG,EAAE,CAAC;IACV,CAAC;IAED,cAAc,CACZ,GAAc,EACd,QAAmB,EACnB,SAAoB,EACpB,WAAe,EACf,aAAiB,EACjB,WAAe,EACf,OAAkB,IAAI,CAAC,QAAQ,CAAC,SAAS;QAEzC,MAAM,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAE/D,MAAM,aAAa,GAAG,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAElE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO;aACxB,YAAY,CAAC;YACZ,WAAW;YACX,aAAa;YACb,WAAW;SACZ,CAAC;aACD,QAAQ,CAAC;YACR,IAAI;YACJ,GAAG;YACH,MAAM;YACN,aAAa;YACb,eAAe,EAAE,6BAA6B,CAAC,QAAQ,EAAE,IAAI,CAAC;YAC9D,gBAAgB,EAAE,6BAA6B,CAAC,SAAS,EAAE,IAAI,CAAC;YAChE,YAAY,EAAE,6BAA6B,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC;YAChE,aAAa,EAAE,6BAA6B,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC;SACnE,CAAC;aACD,eAAe,CAAC;YACf,iDAAiD,CAC/C,IAAI,CAAC,QAAQ,CAAC,SAAS,EACvB,aAAa,EACb,IAAI,CAAC,QAAQ,CAAC,SAAS,EACvB,MAAM,CACP;SACF,CAAC,CAAC;IACP,CAAC;IAED,iBAAiB,CACf,OAAkB,EAClB,QAAmB,EACnB,SAAoB,EACpB,cAAkB,EAClB,aAAiB,EACjB,cAAkB;QAElB,MAAM,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEnE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO;aACxB,eAAe,CAAC;YACf,cAAc;YACd,aAAa;YACb,cAAc;SACf,CAAC;aACD,QAAQ,CAAC;YACR,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;YAC7B,GAAG,EAAE,OAAO;YACZ,MAAM;YACN,aAAa,EAAE,6BAA6B,CAC1C,MAAM,EACN,IAAI,CAAC,QAAQ,CAAC,SAAS,CACxB;YACD,eAAe,EAAE,6BAA6B,CAC5C,QAAQ,EACR,IAAI,CAAC,QAAQ,CAAC,SAAS,CACxB;YACD,gBAAgB,EAAE,6BAA6B,CAC7C,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,SAAS,CACxB;YACD,YAAY,EAAE,6BAA6B,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;YACpE,aAAa,EAAE,6BAA6B,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;SACvE,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,IAAI,CACR,GAAc,EACd,QAAkB,EAClB,WAAmB,EACnB,eAAuB;QAEvB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,aAAa,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE9D,IAAI,iBAAqB,CAAC;QAC1B,IAAI,qBAAyB,CAAC;QAC9B,IAAI,QAAQ,CAAC,GAAG,EAAE;YAChB,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAChE,qBAAqB,GAAG,SAAS,CAAC,KAAK,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;SACxE;aAAM;YACL,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC/D,qBAAqB,GAAG,SAAS,CAAC,KAAK,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;SACzE;QAED,OAAO,MAAM,IAAI,CAAC,MAAM,CACtB,GAAG,EACH,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,SAAS,EACnB,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,CACtB,CAAC,GAAG,EAAE,CAAC;IACV,CAAC;IAED,MAAM,CACJ,GAAc,EACd,QAAmB,EACnB,SAAoB,EACpB,QAAkB,EAClB,WAAe,EACf,eAAmB,EACnB,OAAkB,IAAI,CAAC,QAAQ,CAAC,SAAS;QAEzC,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAE3D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO;aACxB,IAAI,CAAC;YACJ,QAAQ;YACR,WAAW;YACX,eAAe;SAChB,CAAC;aACD,QAAQ,CAAC;YACR,IAAI;YACJ,GAAG;YACH,eAAe,EAAE,6BAA6B,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;YACpE,gBAAgB,EAAE,6BAA6B,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC;YACtE,YAAY,EAAE,6BAA6B,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC;YAChE,aAAa,EAAE,6BAA6B,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC;SACnE,CAAC;aACD,eAAe,CAAC;YACf,yDAAyD;YACzD,iDAAiD,CAC/C,IAAI,CAAC,QAAQ,CAAC,SAAS,EACvB,6BAA6B,CAAC,cAAc,EAAE,IAAI,CAAC,EACnD,IAAI,EACJ,cAAc,CACf;SACF,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAc;QAChC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACzC,CAAC;IAED,eAAe,CAAC,GAAc;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC;YACnD,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IAEnB,wDAAwD;IACxD,+DAA+D;IAC/D,0CAA0C;IAC1C,sCAAsC;IACtC,mBAAmB;IACnB,IAAI;IAEJ,OAAO,CAAC,GAAQ;QACd,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAC9B,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAClD,CAAC;IACJ,CAAC;IAED,oBAAoB,CAClB,YAAgB,EAChB,aAAiB,EACjB,YAAoB,EACpB,UAAe,EACf,WAAgB,EAChB,WAAgB;QAEhB,IAAI,YAAY,IAAI,CAAC,EAAE;YACrB,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;SACH;QAED,IAAI,UAAU,IAAI,SAAS,IAAI,WAAW,IAAI,SAAS,EAAE;YACvD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;SACxE;QAED,IAAI,gBAAoB,CAAC;QAEzB,IAAI,WAAW,IAAI,SAAS,EAAE;YAC5B,WAAW,GAAG,UAAU,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;SAChE;QACD,UAAU,GAAG,WAAW,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEvE,gBAAgB,GAAG,WAAW;YAC5B,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC;aAC1B,GAAG,CAAC,aAAa,CAAO,CAAC;QAE5B,IAAI,WAAW,EAAE,aAAa,CAAC;QAC/B,IAAI,WAAW,EAAE;YACf,WAAW,GAAG,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YACxE,aAAa,GAAG,SAAS,CAAC,WAAW,CAAC,UAAgB,EAAE,WAAW,CAAC,CAAC;SACtE;QAED,OAAO;YACL,WAAW,EAAE,WAAiB;YAC9B,UAAU,EAAE,UAAgB;YAC5B,gBAAgB;YAChB,WAAW;YACX,aAAa;SACd,CAAC;IACJ,CAAC;IAED,YAAY,CACV,WAAe,EACf,QAAkB,EAClB,YAAgB,EAChB,aAAiB,EACjB,WAAgB;QAEhB,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;SAC9C;QAED,IAAI,aAAa,EAAE,cAAkB,CAAC;QACtC,IAAI,QAAQ,CAAC,GAAG,EAAE;YAChB,aAAa,GAAG,aAAa,CAAC;YAC9B,cAAc,GAAG,YAAY,CAAC;SAC/B;aAAM;YACL,aAAa,GAAG,YAAY,CAAC;YAC7B,cAAc,GAAG,aAAa,CAAC;SAChC;QAED,IAAI,kBAAkB,GAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnD,IAAI,SAAS,GAAO,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,WAAW,GAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAEvE,IAAI,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,cAAc,CAAC;QACnB,IAAI,WAAW,EAAE;YACf,cAAc,GAAG,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;SACvE;QAED,IAAI,eAAe,EAAE,gBAAoB,CAAC;QAC1C,IAAI,QAAQ,CAAC,GAAG,EAAE;YAChB,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAChD,gBAAgB,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;SACnD;aAAM;YACL,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAChD,gBAAgB,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;SACnD;QAED,OAAO;YACL,WAAW;YACX,eAAe;YACf,gBAAgB;YAChB,cAAc;SACf,CAAC;IACJ,CAAC;IAED,uBAAuB,CACrB,cAAkB,EAClB,YAAgB,EAChB,aAAiB,EACjB,aAAiB,EACjB,WAAgB;QAEhB,MAAM,eAAe,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC5E,MAAM,gBAAgB,GAAG,cAAc;aACpC,GAAG,CAAC,aAAa,CAAC;aAClB,GAAG,CAAC,aAAa,CAAC,CAAC;QAEtB,IAAI,UAAU,EAAE,WAAW,CAAC;QAC5B,IAAI,WAAW,EAAE;YACf,UAAU,GAAG,SAAS,CAAC,gBAAgB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;YACtE,WAAW,GAAG,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;SACzE;QAED,OAAO;YACL,eAAe;YACf,gBAAgB;YAChB,UAAU;YACV,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAe;QAC/B,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;aACzE,QAAQ,CAAC;IACd,CAAC;CACF"}