@metadaoproject/futarchy 0.4.0-alpha.2 → 0.4.0-alpha.21

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 (79) hide show
  1. package/dist/v0.3/AmmClient.d.ts +246 -0
  2. package/dist/v0.3/AmmClient.js +271 -0
  3. package/dist/v0.3/AmmClient.js.map +1 -0
  4. package/dist/v0.3/AutocratClient.d.ts +234 -0
  5. package/dist/v0.3/AutocratClient.js +270 -0
  6. package/dist/v0.3/AutocratClient.js.map +1 -0
  7. package/dist/v0.3/ConditionalVaultClient.d.ts +281 -0
  8. package/dist/v0.3/ConditionalVaultClient.js +149 -0
  9. package/dist/v0.3/ConditionalVaultClient.js.map +1 -0
  10. package/dist/v0.3/constants.d.ts +9 -0
  11. package/dist/v0.3/constants.js +10 -0
  12. package/dist/v0.3/constants.js.map +1 -0
  13. package/dist/v0.3/index.d.ts +6 -0
  14. package/dist/v0.3/index.js +7 -0
  15. package/dist/v0.3/index.js.map +1 -0
  16. package/dist/v0.3/types/amm.d.ts +542 -0
  17. package/dist/v0.3/types/amm.js +542 -0
  18. package/dist/v0.3/types/amm.js.map +1 -0
  19. package/dist/v0.3/types/autocrat.d.ts +632 -0
  20. package/dist/v0.3/types/autocrat.js +632 -0
  21. package/dist/v0.3/types/autocrat.js.map +1 -0
  22. package/dist/v0.3/types/conditional_vault.d.ts +448 -0
  23. package/dist/v0.3/types/conditional_vault.js +448 -0
  24. package/dist/v0.3/types/conditional_vault.js.map +1 -0
  25. package/dist/v0.3/types/index.d.ts +21 -0
  26. package/dist/v0.3/types/index.js +4 -0
  27. package/dist/v0.3/types/index.js.map +1 -0
  28. package/dist/v0.3/types/utils.d.ts +3 -0
  29. package/dist/v0.3/types/utils.js +2 -0
  30. package/dist/v0.3/types/utils.js.map +1 -0
  31. package/dist/v0.3/utils/cu.d.ts +10 -0
  32. package/dist/v0.3/utils/cu.js +11 -0
  33. package/dist/v0.3/utils/cu.js.map +1 -0
  34. package/dist/v0.3/utils/filters.d.ts +3 -0
  35. package/dist/v0.3/utils/filters.js +14 -0
  36. package/dist/v0.3/utils/filters.js.map +1 -0
  37. package/dist/v0.3/utils/index.d.ts +16 -0
  38. package/dist/v0.3/utils/index.js +30 -0
  39. package/dist/v0.3/utils/index.js.map +1 -0
  40. package/dist/v0.3/utils/instruction.d.ts +4 -0
  41. package/dist/v0.3/utils/instruction.js +10 -0
  42. package/dist/v0.3/utils/instruction.js.map +1 -0
  43. package/dist/v0.3/utils/metadata.d.ts +4 -0
  44. package/dist/v0.3/utils/metadata.js +26 -0
  45. package/dist/v0.3/utils/metadata.js.map +1 -0
  46. package/dist/v0.3/utils/pda.d.ts +10 -0
  47. package/dist/v0.3/utils/pda.js +47 -0
  48. package/dist/v0.3/utils/pda.js.map +1 -0
  49. package/dist/v0.3/utils/priceMath.d.ts +12 -0
  50. package/dist/v0.3/utils/priceMath.js +52 -0
  51. package/dist/v0.3/utils/priceMath.js.map +1 -0
  52. package/dist/v0.4/AmmClient.d.ts +62 -6
  53. package/dist/v0.4/AmmClient.js +53 -10
  54. package/dist/v0.4/AmmClient.js.map +1 -1
  55. package/dist/v0.4/AutocratClient.d.ts +10 -1
  56. package/dist/v0.4/AutocratClient.js +19 -3
  57. package/dist/v0.4/AutocratClient.js.map +1 -1
  58. package/dist/v0.4/ConditionalVaultClient.d.ts +75 -24
  59. package/dist/v0.4/ConditionalVaultClient.js +13 -9
  60. package/dist/v0.4/ConditionalVaultClient.js.map +1 -1
  61. package/dist/v0.4/constants.js +3 -3
  62. package/dist/v0.4/types/amm.d.ts +268 -2
  63. package/dist/v0.4/types/amm.js +268 -2
  64. package/dist/v0.4/types/amm.js.map +1 -1
  65. package/dist/v0.4/types/autocrat.d.ts +6 -1
  66. package/dist/v0.4/types/autocrat.js +6 -1
  67. package/dist/v0.4/types/autocrat.js.map +1 -1
  68. package/dist/v0.4/types/conditional_vault.d.ts +416 -4
  69. package/dist/v0.4/types/conditional_vault.js +416 -4
  70. package/dist/v0.4/types/conditional_vault.js.map +1 -1
  71. package/dist/v0.4/types/index.d.ts +29 -15
  72. package/dist/v0.4/types/index.js +6 -3
  73. package/dist/v0.4/types/index.js.map +1 -1
  74. package/dist/v0.4/utils/pda.d.ts +6 -1
  75. package/dist/v0.4/utils/pda.js +12 -3
  76. package/dist/v0.4/utils/pda.js.map +1 -1
  77. package/dist/v0.4/utils/priceMath.js +10 -3
  78. package/dist/v0.4/utils/priceMath.js.map +1 -1
  79. package/package.json +4 -1
@@ -0,0 +1,246 @@
1
+ import { AnchorProvider, IdlTypes, Program } from "@coral-xyz/anchor";
2
+ import { AddressLookupTableAccount, PublicKey } from "@solana/web3.js";
3
+ import { Amm as AmmIDLType } from "./types/amm.js";
4
+ import BN from "bn.js";
5
+ import { AmmAccount, LowercaseKeys } from "./types/index.js";
6
+ export type SwapType = LowercaseKeys<IdlTypes<AmmIDLType>["SwapType"]>;
7
+ export type CreateAmmClientParams = {
8
+ provider: AnchorProvider;
9
+ ammProgramId?: PublicKey;
10
+ };
11
+ export type AddLiquiditySimulation = {
12
+ baseAmount: BN;
13
+ quoteAmount: BN;
14
+ expectedLpTokens: BN;
15
+ minLpTokens?: BN;
16
+ maxBaseAmount?: BN;
17
+ };
18
+ export type SwapSimulation = {
19
+ expectedOut: BN;
20
+ newBaseReserves: BN;
21
+ newQuoteReserves: BN;
22
+ minExpectedOut?: BN;
23
+ };
24
+ export type RemoveLiquiditySimulation = {
25
+ expectedBaseOut: BN;
26
+ expectedQuoteOut: BN;
27
+ minBaseOut?: BN;
28
+ minQuoteOut?: BN;
29
+ };
30
+ export declare class AmmClient {
31
+ readonly provider: AnchorProvider;
32
+ readonly program: Program<AmmIDLType>;
33
+ readonly luts: AddressLookupTableAccount[];
34
+ constructor(provider: AnchorProvider, ammProgramId: PublicKey, luts: AddressLookupTableAccount[]);
35
+ static createClient(createAutocratClientParams: CreateAmmClientParams): AmmClient;
36
+ getProgramId(): PublicKey;
37
+ createAmm(proposal: PublicKey, baseMint: PublicKey, quoteMint: PublicKey, twapInitialObservation: number, twapMaxObservationChangePerUpdate?: number): Promise<PublicKey>;
38
+ createAmmIx(baseMint: PublicKey, quoteMint: PublicKey, twapInitialObservation: BN, twapMaxObservationChangePerUpdate: BN): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<AmmIDLType, {
39
+ name: "createAmm";
40
+ accounts: [{
41
+ name: "user";
42
+ isMut: true;
43
+ isSigner: true;
44
+ }, {
45
+ name: "amm";
46
+ isMut: true;
47
+ isSigner: false;
48
+ }, {
49
+ name: "lpMint";
50
+ isMut: true;
51
+ isSigner: false;
52
+ }, {
53
+ name: "baseMint";
54
+ isMut: false;
55
+ isSigner: false;
56
+ }, {
57
+ name: "quoteMint";
58
+ isMut: false;
59
+ isSigner: false;
60
+ }, {
61
+ name: "vaultAtaBase";
62
+ isMut: true;
63
+ isSigner: false;
64
+ }, {
65
+ name: "vaultAtaQuote";
66
+ isMut: true;
67
+ isSigner: false;
68
+ }, {
69
+ name: "associatedTokenProgram";
70
+ isMut: false;
71
+ isSigner: false;
72
+ }, {
73
+ name: "tokenProgram";
74
+ isMut: false;
75
+ isSigner: false;
76
+ }, {
77
+ name: "systemProgram";
78
+ isMut: false;
79
+ isSigner: false;
80
+ }];
81
+ args: [{
82
+ name: "args";
83
+ type: {
84
+ defined: "CreateAmmArgs";
85
+ };
86
+ }];
87
+ } & {
88
+ name: "createAmm";
89
+ }>;
90
+ addLiquidity(amm: PublicKey, quoteAmount?: number, baseAmount?: number): Promise<string | undefined>;
91
+ 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, {
92
+ name: "addLiquidity";
93
+ accounts: [{
94
+ name: "user";
95
+ isMut: true;
96
+ isSigner: true;
97
+ }, {
98
+ name: "amm";
99
+ isMut: true;
100
+ isSigner: false;
101
+ }, {
102
+ name: "lpMint";
103
+ isMut: true;
104
+ isSigner: false;
105
+ }, {
106
+ name: "userLpAccount";
107
+ isMut: true;
108
+ isSigner: false;
109
+ }, {
110
+ name: "userBaseAccount";
111
+ isMut: true;
112
+ isSigner: false;
113
+ }, {
114
+ name: "userQuoteAccount";
115
+ isMut: true;
116
+ isSigner: false;
117
+ }, {
118
+ name: "vaultAtaBase";
119
+ isMut: true;
120
+ isSigner: false;
121
+ }, {
122
+ name: "vaultAtaQuote";
123
+ isMut: true;
124
+ isSigner: false;
125
+ }, {
126
+ name: "tokenProgram";
127
+ isMut: false;
128
+ isSigner: false;
129
+ }];
130
+ args: [{
131
+ name: "args";
132
+ type: {
133
+ defined: "AddLiquidityArgs";
134
+ };
135
+ }];
136
+ } & {
137
+ name: "addLiquidity";
138
+ }>;
139
+ 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, {
140
+ name: "removeLiquidity";
141
+ accounts: [{
142
+ name: "user";
143
+ isMut: true;
144
+ isSigner: true;
145
+ }, {
146
+ name: "amm";
147
+ isMut: true;
148
+ isSigner: false;
149
+ }, {
150
+ name: "lpMint";
151
+ isMut: true;
152
+ isSigner: false;
153
+ }, {
154
+ name: "userLpAccount";
155
+ isMut: true;
156
+ isSigner: false;
157
+ }, {
158
+ name: "userBaseAccount";
159
+ isMut: true;
160
+ isSigner: false;
161
+ }, {
162
+ name: "userQuoteAccount";
163
+ isMut: true;
164
+ isSigner: false;
165
+ }, {
166
+ name: "vaultAtaBase";
167
+ isMut: true;
168
+ isSigner: false;
169
+ }, {
170
+ name: "vaultAtaQuote";
171
+ isMut: true;
172
+ isSigner: false;
173
+ }, {
174
+ name: "tokenProgram";
175
+ isMut: false;
176
+ isSigner: false;
177
+ }];
178
+ args: [{
179
+ name: "args";
180
+ type: {
181
+ defined: "RemoveLiquidityArgs";
182
+ };
183
+ }];
184
+ } & {
185
+ name: "removeLiquidity";
186
+ }>;
187
+ swap(amm: PublicKey, swapType: SwapType, inputAmount: number, outputAmountMin: number): Promise<string>;
188
+ swapIx(amm: PublicKey, baseMint: PublicKey, quoteMint: PublicKey, swapType: SwapType, inputAmount: BN, outputAmountMin: BN): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<AmmIDLType, {
189
+ name: "swap";
190
+ accounts: [{
191
+ name: "user";
192
+ isMut: true;
193
+ isSigner: true;
194
+ }, {
195
+ name: "amm";
196
+ isMut: true;
197
+ isSigner: false;
198
+ }, {
199
+ name: "userBaseAccount";
200
+ isMut: true;
201
+ isSigner: false;
202
+ }, {
203
+ name: "userQuoteAccount";
204
+ isMut: true;
205
+ isSigner: false;
206
+ }, {
207
+ name: "vaultAtaBase";
208
+ isMut: true;
209
+ isSigner: false;
210
+ }, {
211
+ name: "vaultAtaQuote";
212
+ isMut: true;
213
+ isSigner: false;
214
+ }, {
215
+ name: "tokenProgram";
216
+ isMut: false;
217
+ isSigner: false;
218
+ }];
219
+ args: [{
220
+ name: "args";
221
+ type: {
222
+ defined: "SwapArgs";
223
+ };
224
+ }];
225
+ } & {
226
+ name: "swap";
227
+ }>;
228
+ crankThatTwap(amm: PublicKey): Promise<string>;
229
+ crankThatTwapIx(amm: PublicKey): import("@coral-xyz/anchor/dist/cjs/program/namespace/methods.js").MethodsBuilder<AmmIDLType, {
230
+ name: "crankThatTwap";
231
+ accounts: [{
232
+ name: "amm";
233
+ isMut: true;
234
+ isSigner: false;
235
+ }];
236
+ args: [];
237
+ } & {
238
+ name: "crankThatTwap";
239
+ }>;
240
+ getAmm(amm: PublicKey): Promise<AmmAccount>;
241
+ getTwap(amm: AmmAccount): BN;
242
+ simulateAddLiquidity(baseReserves: BN, quoteReserves: BN, lpMintSupply: number, baseAmount?: BN, quoteAmount?: BN, slippageBps?: BN): AddLiquiditySimulation;
243
+ simulateSwap(inputAmount: BN, swapType: SwapType, baseReserves: BN, quoteReserves: BN, slippageBps?: BN): SwapSimulation;
244
+ simulateRemoveLiquidity(lpTokensToBurn: BN, baseReserves: BN, quoteReserves: BN, lpTotalSupply: BN, slippageBps?: BN): RemoveLiquiditySimulation;
245
+ getDecimals(mint: PublicKey): Promise<number>;
246
+ }
@@ -0,0 +1,271 @@
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 { unpackMint, getAssociatedTokenAddressSync, createAssociatedTokenAccountIdempotentInstruction, } from "@solana/spl-token";
7
+ import { PriceMath } from "./utils/priceMath.js";
8
+ export class AmmClient {
9
+ provider;
10
+ program;
11
+ luts;
12
+ constructor(provider, ammProgramId, luts) {
13
+ this.provider = provider;
14
+ this.program = new Program(AmmIDL, ammProgramId, provider);
15
+ this.luts = luts;
16
+ }
17
+ static createClient(createAutocratClientParams) {
18
+ let { provider, ammProgramId: programId } = createAutocratClientParams;
19
+ const luts = [];
20
+ return new AmmClient(provider, programId || AMM_PROGRAM_ID, luts);
21
+ }
22
+ getProgramId() {
23
+ return this.program.programId;
24
+ }
25
+ async createAmm(proposal, baseMint, quoteMint, twapInitialObservation, twapMaxObservationChangePerUpdate) {
26
+ if (!twapMaxObservationChangePerUpdate) {
27
+ twapMaxObservationChangePerUpdate = twapInitialObservation * 0.02;
28
+ }
29
+ let [amm] = getAmmAddr(this.getProgramId(), baseMint, quoteMint);
30
+ let baseDecimals = unpackMint(baseMint, await this.provider.connection.getAccountInfo(baseMint)).decimals;
31
+ let quoteDecimals = unpackMint(quoteMint, await this.provider.connection.getAccountInfo(quoteMint)).decimals;
32
+ let [twapFirstObservationScaled, twapMaxObservationChangePerUpdateScaled] = PriceMath.getAmmPrices(baseDecimals, quoteDecimals, twapInitialObservation, twapMaxObservationChangePerUpdate);
33
+ await this.createAmmIx(baseMint, quoteMint, twapFirstObservationScaled, twapMaxObservationChangePerUpdateScaled).rpc();
34
+ return amm;
35
+ }
36
+ // both twap values need to be scaled beforehand
37
+ createAmmIx(baseMint, quoteMint, twapInitialObservation, twapMaxObservationChangePerUpdate) {
38
+ let [amm] = getAmmAddr(this.getProgramId(), baseMint, quoteMint);
39
+ let [lpMint] = getAmmLpMintAddr(this.getProgramId(), amm);
40
+ let vaultAtaBase = getAssociatedTokenAddressSync(baseMint, amm, true);
41
+ let vaultAtaQuote = getAssociatedTokenAddressSync(quoteMint, amm, true);
42
+ return this.program.methods
43
+ .createAmm({
44
+ twapInitialObservation,
45
+ twapMaxObservationChangePerUpdate,
46
+ })
47
+ .accounts({
48
+ user: this.provider.publicKey,
49
+ amm,
50
+ lpMint,
51
+ baseMint,
52
+ quoteMint,
53
+ vaultAtaBase,
54
+ vaultAtaQuote,
55
+ });
56
+ }
57
+ async addLiquidity(amm, quoteAmount, baseAmount) {
58
+ let storedAmm = await this.getAmm(amm);
59
+ let lpMintSupply = unpackMint(storedAmm.lpMint, await this.provider.connection.getAccountInfo(storedAmm.lpMint)).supply;
60
+ let quoteAmountCasted;
61
+ let baseAmountCasted;
62
+ if (quoteAmount != undefined) {
63
+ let quoteDecimals = unpackMint(storedAmm.quoteMint, await this.provider.connection.getAccountInfo(storedAmm.quoteMint)).decimals;
64
+ quoteAmountCasted = new BN(quoteAmount).mul(new BN(10).pow(new BN(quoteDecimals)));
65
+ }
66
+ if (baseAmount != undefined) {
67
+ let baseDecimals = unpackMint(storedAmm.baseMint, await this.provider.connection.getAccountInfo(storedAmm.baseMint)).decimals;
68
+ baseAmountCasted = new BN(baseAmount).mul(new BN(10).pow(new BN(baseDecimals)));
69
+ }
70
+ if (lpMintSupply == 0n) {
71
+ if (quoteAmount == undefined || baseAmount == undefined) {
72
+ throw new Error("No pool created yet, you need to specify both base and quote");
73
+ }
74
+ // console.log(quoteAmountCasted?.toString());
75
+ // console.log(baseAmountCasted?.toString())
76
+ return await this.addLiquidityIx(amm, storedAmm.baseMint, storedAmm.quoteMint, quoteAmountCasted, baseAmountCasted, new BN(0)).rpc();
77
+ }
78
+ // quoteAmount == undefined ? undefined : new BN(quoteAmount);
79
+ // let baseAmountCasted: BN | undefined =
80
+ // baseAmount == undefined ? undefined : new BN(baseAmount);
81
+ let sim = this.simulateAddLiquidity(storedAmm.baseAmount, storedAmm.quoteAmount, Number(lpMintSupply), baseAmountCasted, quoteAmountCasted);
82
+ await this.addLiquidityIx(amm, storedAmm.baseMint, storedAmm.quoteMint, sim.quoteAmount, sim.baseAmount, sim.expectedLpTokens).rpc();
83
+ }
84
+ addLiquidityIx(amm, baseMint, quoteMint, quoteAmount, maxBaseAmount, minLpTokens, user = this.provider.publicKey) {
85
+ const [lpMint] = getAmmLpMintAddr(this.program.programId, amm);
86
+ const userLpAccount = getAssociatedTokenAddressSync(lpMint, user);
87
+ return this.program.methods
88
+ .addLiquidity({
89
+ quoteAmount,
90
+ maxBaseAmount,
91
+ minLpTokens,
92
+ })
93
+ .accounts({
94
+ user,
95
+ amm,
96
+ lpMint,
97
+ userLpAccount,
98
+ userBaseAccount: getAssociatedTokenAddressSync(baseMint, user),
99
+ userQuoteAccount: getAssociatedTokenAddressSync(quoteMint, user),
100
+ vaultAtaBase: getAssociatedTokenAddressSync(baseMint, amm, true),
101
+ vaultAtaQuote: getAssociatedTokenAddressSync(quoteMint, amm, true),
102
+ })
103
+ .preInstructions([
104
+ createAssociatedTokenAccountIdempotentInstruction(this.provider.publicKey, userLpAccount, this.provider.publicKey, lpMint),
105
+ ]);
106
+ }
107
+ removeLiquidityIx(ammAddr, baseMint, quoteMint, lpTokensToBurn, minBaseAmount, minQuoteAmount) {
108
+ const [lpMint] = getAmmLpMintAddr(this.program.programId, ammAddr);
109
+ return this.program.methods
110
+ .removeLiquidity({
111
+ lpTokensToBurn,
112
+ minBaseAmount,
113
+ minQuoteAmount,
114
+ })
115
+ .accounts({
116
+ user: this.provider.publicKey,
117
+ amm: ammAddr,
118
+ lpMint,
119
+ userLpAccount: getAssociatedTokenAddressSync(lpMint, this.provider.publicKey),
120
+ userBaseAccount: getAssociatedTokenAddressSync(baseMint, this.provider.publicKey),
121
+ userQuoteAccount: getAssociatedTokenAddressSync(quoteMint, this.provider.publicKey),
122
+ vaultAtaBase: getAssociatedTokenAddressSync(baseMint, ammAddr, true),
123
+ vaultAtaQuote: getAssociatedTokenAddressSync(quoteMint, ammAddr, true),
124
+ });
125
+ }
126
+ async swap(amm, swapType, inputAmount, outputAmountMin) {
127
+ const storedAmm = await this.getAmm(amm);
128
+ let quoteDecimals = await this.getDecimals(storedAmm.quoteMint);
129
+ let baseDecimals = await this.getDecimals(storedAmm.baseMint);
130
+ let inputAmountScaled;
131
+ let outputAmountMinScaled;
132
+ if (swapType.buy) {
133
+ inputAmountScaled = PriceMath.scale(inputAmount, quoteDecimals);
134
+ outputAmountMinScaled = PriceMath.scale(outputAmountMin, baseDecimals);
135
+ }
136
+ else {
137
+ inputAmountScaled = PriceMath.scale(inputAmount, baseDecimals);
138
+ outputAmountMinScaled = PriceMath.scale(outputAmountMin, quoteDecimals);
139
+ }
140
+ return await this.swapIx(amm, storedAmm.baseMint, storedAmm.quoteMint, swapType, inputAmountScaled, outputAmountMinScaled).rpc();
141
+ }
142
+ swapIx(amm, baseMint, quoteMint, swapType, inputAmount, outputAmountMin) {
143
+ const receivingToken = swapType.buy ? baseMint : quoteMint;
144
+ return this.program.methods
145
+ .swap({
146
+ swapType,
147
+ inputAmount,
148
+ outputAmountMin,
149
+ })
150
+ .accounts({
151
+ user: this.provider.publicKey,
152
+ amm,
153
+ userBaseAccount: getAssociatedTokenAddressSync(baseMint, this.provider.publicKey, true),
154
+ userQuoteAccount: getAssociatedTokenAddressSync(quoteMint, this.provider.publicKey, true),
155
+ vaultAtaBase: getAssociatedTokenAddressSync(baseMint, amm, true),
156
+ vaultAtaQuote: getAssociatedTokenAddressSync(quoteMint, amm, true),
157
+ })
158
+ .preInstructions([
159
+ // create the receiving token account if it doesn't exist
160
+ createAssociatedTokenAccountIdempotentInstruction(this.provider.publicKey, getAssociatedTokenAddressSync(receivingToken, this.provider.publicKey), this.provider.publicKey, receivingToken),
161
+ ]);
162
+ }
163
+ async crankThatTwap(amm) {
164
+ return this.crankThatTwapIx(amm).rpc();
165
+ }
166
+ crankThatTwapIx(amm) {
167
+ return this.program.methods.crankThatTwap().accounts({
168
+ amm,
169
+ });
170
+ }
171
+ // getter functions
172
+ // async getLTWAP(ammAddr: PublicKey): Promise<number> {
173
+ // const amm = await this.program.account.amm.fetch(ammAddr);
174
+ // return amm.twapLastObservationUq64X32
175
+ // .div(new BN(2).pow(new BN(32)))
176
+ // .toNumber();
177
+ // }
178
+ async getAmm(amm) {
179
+ return await this.program.account.amm.fetch(amm);
180
+ }
181
+ getTwap(amm) {
182
+ return amm.oracle.aggregator.div(amm.oracle.lastUpdatedSlot.sub(amm.createdAtSlot));
183
+ }
184
+ simulateAddLiquidity(baseReserves, quoteReserves, lpMintSupply, baseAmount, quoteAmount, slippageBps) {
185
+ if (lpMintSupply == 0) {
186
+ throw new Error("This AMM doesn't have existing liquidity so we can't fill in the blanks");
187
+ }
188
+ if (baseAmount == undefined && quoteAmount == undefined) {
189
+ throw new Error("Must specify either a base amount or a quote amount");
190
+ }
191
+ let expectedLpTokens;
192
+ if (quoteAmount == undefined) {
193
+ quoteAmount = baseAmount?.mul(quoteReserves).div(baseReserves);
194
+ }
195
+ baseAmount = quoteAmount?.mul(baseReserves).div(quoteReserves).addn(1);
196
+ expectedLpTokens = quoteAmount
197
+ ?.mul(new BN(lpMintSupply))
198
+ .div(quoteReserves);
199
+ let minLpTokens, maxBaseAmount;
200
+ if (slippageBps) {
201
+ minLpTokens = PriceMath.subtractSlippage(expectedLpTokens, slippageBps);
202
+ maxBaseAmount = PriceMath.addSlippage(baseAmount, slippageBps);
203
+ }
204
+ return {
205
+ quoteAmount: quoteAmount,
206
+ baseAmount: baseAmount,
207
+ expectedLpTokens,
208
+ minLpTokens,
209
+ maxBaseAmount,
210
+ };
211
+ }
212
+ simulateSwap(inputAmount, swapType, baseReserves, quoteReserves, slippageBps) {
213
+ if (baseReserves.eqn(0) || quoteReserves.eqn(0)) {
214
+ throw new Error("reserves must be non-zero");
215
+ }
216
+ let inputReserves, outputReserves;
217
+ if (swapType.buy) {
218
+ inputReserves = quoteReserves;
219
+ outputReserves = baseReserves;
220
+ }
221
+ else {
222
+ inputReserves = baseReserves;
223
+ outputReserves = quoteReserves;
224
+ }
225
+ let inputAmountWithFee = inputAmount.muln(990);
226
+ let numerator = inputAmountWithFee.mul(outputReserves);
227
+ let denominator = inputReserves.muln(1000).add(inputAmountWithFee);
228
+ let expectedOut = numerator.div(denominator);
229
+ let minExpectedOut;
230
+ if (slippageBps) {
231
+ minExpectedOut = PriceMath.subtractSlippage(expectedOut, slippageBps);
232
+ }
233
+ let newBaseReserves, newQuoteReserves;
234
+ if (swapType.buy) {
235
+ newBaseReserves = baseReserves.sub(expectedOut);
236
+ newQuoteReserves = quoteReserves.add(inputAmount);
237
+ }
238
+ else {
239
+ newBaseReserves = baseReserves.add(inputAmount);
240
+ newQuoteReserves = quoteReserves.sub(expectedOut);
241
+ }
242
+ return {
243
+ expectedOut,
244
+ newBaseReserves,
245
+ newQuoteReserves,
246
+ minExpectedOut,
247
+ };
248
+ }
249
+ simulateRemoveLiquidity(lpTokensToBurn, baseReserves, quoteReserves, lpTotalSupply, slippageBps) {
250
+ const expectedBaseOut = lpTokensToBurn.mul(baseReserves).div(lpTotalSupply);
251
+ const expectedQuoteOut = lpTokensToBurn
252
+ .mul(quoteReserves)
253
+ .div(lpTotalSupply);
254
+ let minBaseOut, minQuoteOut;
255
+ if (slippageBps) {
256
+ minBaseOut = PriceMath.subtractSlippage(expectedBaseOut, slippageBps);
257
+ minQuoteOut = PriceMath.subtractSlippage(expectedQuoteOut, slippageBps);
258
+ }
259
+ return {
260
+ expectedBaseOut,
261
+ expectedQuoteOut,
262
+ minBaseOut,
263
+ minQuoteOut,
264
+ };
265
+ }
266
+ async getDecimals(mint) {
267
+ return unpackMint(mint, await this.provider.connection.getAccountInfo(mint))
268
+ .decimals;
269
+ }
270
+ }
271
+ //# sourceMappingURL=AmmClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AmmClient.js","sourceRoot":"","sources":["../../src/v0.3/AmmClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGtE,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,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,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,WAAW,CACpB,QAAQ,EACR,SAAS,EACT,0BAA0B,EAC1B,uCAAuC,CACxC,CAAC,GAAG,EAAE,CAAC;QAER,OAAO,GAAG,CAAC;IACb,CAAC;IAED,gDAAgD;IAChD,WAAW,CACT,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;QAEnB,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,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;YAC7B,GAAG;YACH,eAAe,EAAE,6BAA6B,CAC5C,QAAQ,EACR,IAAI,CAAC,QAAQ,CAAC,SAAS,EACvB,IAAI,CACL;YACD,gBAAgB,EAAE,6BAA6B,CAC7C,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,SAAS,EACvB,IAAI,CACL;YACD,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,CAC3B,cAAc,EACd,IAAI,CAAC,QAAQ,CAAC,SAAS,CACxB,EACD,IAAI,CAAC,QAAQ,CAAC,SAAS,EACvB,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,KAAK,CAAC,MAAM,CAAC,GAAc;QACzB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,CAAC,GAAe;QACrB,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"}