bandkit 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/.env.example +9 -0
  2. package/LICENSE +3 -3
  3. package/README.md +41 -12
  4. package/bin/bandkit.js +38 -0
  5. package/contracts/BandExecutor.sol +178 -0
  6. package/contracts/BandStrategy.sol +111 -0
  7. package/contracts/test/MockDexTarget.sol +29 -0
  8. package/contracts/test/MockErc20.sol +40 -0
  9. package/dist/BandContractPanel.d.ts +11 -0
  10. package/dist/BandContractPanel.d.ts.map +1 -0
  11. package/dist/BandContractPanel.js +95 -0
  12. package/dist/BandContractPanel.js.map +1 -0
  13. package/dist/BandPanel.d.ts +13 -0
  14. package/dist/BandPanel.d.ts.map +1 -0
  15. package/dist/BandPanel.js +142 -0
  16. package/dist/BandPanel.js.map +1 -0
  17. package/dist/bandExecutorAbi.d.ts +431 -0
  18. package/dist/bandExecutorAbi.d.ts.map +1 -0
  19. package/dist/bandExecutorAbi.js +558 -0
  20. package/dist/bandExecutorAbi.js.map +1 -0
  21. package/dist/bandExecutorBytecode.d.ts +2 -0
  22. package/dist/bandExecutorBytecode.d.ts.map +1 -0
  23. package/dist/bandExecutorBytecode.js +3 -0
  24. package/dist/bandExecutorBytecode.js.map +1 -0
  25. package/dist/bandStrategyAbi.d.ts +250 -0
  26. package/dist/bandStrategyAbi.d.ts.map +1 -0
  27. package/dist/bandStrategyAbi.js +323 -0
  28. package/dist/bandStrategyAbi.js.map +1 -0
  29. package/dist/bandStrategyBytecode.d.ts +2 -0
  30. package/dist/bandStrategyBytecode.d.ts.map +1 -0
  31. package/dist/bandStrategyBytecode.js +3 -0
  32. package/dist/bandStrategyBytecode.js.map +1 -0
  33. package/dist/index.d.ts +36 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +36 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/rainbowkit.d.ts +7 -0
  38. package/dist/rainbowkit.d.ts.map +1 -0
  39. package/dist/rainbowkit.js +33 -0
  40. package/dist/rainbowkit.js.map +1 -0
  41. package/dist/tradingExecutor.d.ts +38 -0
  42. package/dist/tradingExecutor.d.ts.map +1 -0
  43. package/dist/tradingExecutor.js +125 -0
  44. package/dist/tradingExecutor.js.map +1 -0
  45. package/dist/useBandDashboard.d.ts +27 -0
  46. package/dist/useBandDashboard.d.ts.map +1 -0
  47. package/dist/useBandDashboard.js +35 -0
  48. package/dist/useBandDashboard.js.map +1 -0
  49. package/dist/useEthPriceTicker.d.ts +32 -0
  50. package/dist/useEthPriceTicker.d.ts.map +1 -0
  51. package/dist/useEthPriceTicker.js +95 -0
  52. package/dist/useEthPriceTicker.js.map +1 -0
  53. package/dist/useStrategyContract.d.ts +42 -0
  54. package/dist/useStrategyContract.d.ts.map +1 -0
  55. package/dist/useStrategyContract.js +258 -0
  56. package/dist/useStrategyContract.js.map +1 -0
  57. package/dist/useStrategyContractDeployment.d.ts +31 -0
  58. package/dist/useStrategyContractDeployment.d.ts.map +1 -0
  59. package/dist/useStrategyContractDeployment.js +229 -0
  60. package/dist/useStrategyContractDeployment.js.map +1 -0
  61. package/dist/useWalletEthBalance.d.ts +17 -0
  62. package/dist/useWalletEthBalance.d.ts.map +1 -0
  63. package/dist/useWalletEthBalance.js +98 -0
  64. package/dist/useWalletEthBalance.js.map +1 -0
  65. package/engine/browser-provider.js +25 -0
  66. package/engine/executor-searcher.js +138 -0
  67. package/engine/provider.js +32 -0
  68. package/engine/uniswap-v2-roundtrip.js +215 -0
  69. package/hardhat.config.cjs +27 -0
  70. package/package.json +75 -14
  71. package/scripts/deploy.cjs +31 -0
  72. package/index.d.ts +0 -2
  73. package/index.js +0 -2
package/dist/index.js ADDED
@@ -0,0 +1,36 @@
1
+ export { BAND_STRATEGY_ABI } from "./bandStrategyAbi.js";
2
+ export { BAND_STRATEGY_BYTECODE } from "./bandStrategyBytecode.js";
3
+ export { BAND_EXECUTOR_ABI } from "./bandExecutorAbi.js";
4
+ export { BAND_EXECUTOR_BYTECODE } from "./bandExecutorBytecode.js";
5
+ export { BandPanel } from "./BandPanel.js";
6
+ export { BandContractPanel } from "./BandContractPanel.js";
7
+ export { createBandKitConfig } from "./rainbowkit.js";
8
+ export { DEFAULT_BAND_STRATEGY_STORAGE_KEY, useStrategyContractDeployment } from "./useStrategyContractDeployment.js";
9
+ export { useBandDashboard } from "./useBandDashboard.js";
10
+ export { approveUniswapV2RoundTripToken, previewUniswapV2RoundTrip } from "./tradingExecutor.js";
11
+ export { useEthPriceTicker } from "./useEthPriceTicker.js";
12
+ export { useStrategyContract } from "./useStrategyContract.js";
13
+ export { useWalletEthBalance } from "./useWalletEthBalance.js";
14
+ /** @deprecated Use BAND_STRATEGY_ABI. Will be removed in v1.0. */
15
+ export { BAND_STRATEGY_ABI as ETH_BOT_VAULT_ABI } from "./bandStrategyAbi.js";
16
+ /** @deprecated Use BAND_STRATEGY_BYTECODE. Will be removed in v1.0. */
17
+ export { BAND_STRATEGY_BYTECODE as ETH_BOT_VAULT_BYTECODE } from "./bandStrategyBytecode.js";
18
+ /** @deprecated Use BAND_EXECUTOR_ABI. Will be removed in v1.0. */
19
+ export { BAND_EXECUTOR_ABI as BOT_TRADE_EXECUTOR_ABI } from "./bandExecutorAbi.js";
20
+ /** @deprecated Use BAND_EXECUTOR_BYTECODE. Will be removed in v1.0. */
21
+ export { BAND_EXECUTOR_BYTECODE as BOT_TRADE_EXECUTOR_BYTECODE } from "./bandExecutorBytecode.js";
22
+ /** @deprecated Use BandPanel. Will be removed in v1.0. */
23
+ export { BandPanel as EthBotPanel } from "./BandPanel.js";
24
+ /** @deprecated Use BandContractPanel. Will be removed in v1.0. */
25
+ export { BandContractPanel as EthVaultPanel } from "./BandContractPanel.js";
26
+ /** @deprecated Use createBandKitConfig. Will be removed in v1.0. */
27
+ export { createBandKitConfig as createEthBotRainbowKitConfig } from "./rainbowkit.js";
28
+ /** @deprecated Use DEFAULT_BAND_STRATEGY_STORAGE_KEY. Will be removed in v1.0. */
29
+ export { DEFAULT_BAND_STRATEGY_STORAGE_KEY as DEFAULT_ETH_BOT_VAULT_STORAGE_KEY } from "./useStrategyContractDeployment.js";
30
+ /** @deprecated Use useStrategyContractDeployment. Will be removed in v1.0. */
31
+ export { useStrategyContractDeployment as useEthBotVaultDeployment } from "./useStrategyContractDeployment.js";
32
+ /** @deprecated Use useBandDashboard. Will be removed in v1.0. */
33
+ export { useBandDashboard as useEthBotDashboard } from "./useBandDashboard.js";
34
+ /** @deprecated Use useStrategyContract. Will be removed in v1.0. */
35
+ export { useStrategyContract as useEthVault } from "./useStrategyContract.js";
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAA+B,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAmC,MAAM,iBAAiB,CAAC;AACvF,OAAO,EACL,iCAAiC,EACjC,6BAA6B,EAG9B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAgC,MAAM,uBAAuB,CAAC;AACvF,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EAI1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EAKlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,EAIpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAmE,MAAM,0BAA0B,CAAC;AAEhI,kEAAkE;AAClE,OAAO,EAAE,iBAAiB,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC7F,kEAAkE;AAClE,OAAO,EAAE,iBAAiB,IAAI,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnF,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,IAAI,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAClG,0DAA0D;AAC1D,OAAO,EAAE,SAAS,IAAI,WAAW,EAA2C,MAAM,gBAAgB,CAAC;AACnG,kEAAkE;AAClE,OAAO,EAAE,iBAAiB,IAAI,aAAa,EAAqD,MAAM,wBAAwB,CAAC;AAC/H,oEAAoE;AACpE,OAAO,EAAE,mBAAmB,IAAI,4BAA4B,EAA0E,MAAM,iBAAiB,CAAC;AAC9J,kFAAkF;AAClF,OAAO,EAAE,iCAAiC,IAAI,iCAAiC,EAAE,MAAM,oCAAoC,CAAC;AAC5H,8EAA8E;AAC9E,OAAO,EACL,6BAA6B,IAAI,wBAAwB,EAG1D,MAAM,oCAAoC,CAAC;AAC5C,iEAAiE;AACjE,OAAO,EAAE,gBAAgB,IAAI,kBAAkB,EAA6D,MAAM,uBAAuB,CAAC;AAC1I,oEAAoE;AACpE,OAAO,EACL,mBAAmB,IAAI,WAAW,EAInC,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type CreateBandKitConfigOptions = {
2
+ appName: string;
3
+ walletConnectProjectId?: string;
4
+ mainnetRpcUrl?: string;
5
+ };
6
+ export declare function createBandKitConfig({ appName, walletConnectProjectId, mainnetRpcUrl }: CreateBandKitConfigOptions): any;
7
+ //# sourceMappingURL=rainbowkit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rainbowkit.d.ts","sourceRoot":"","sources":["../src/rainbowkit.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAcF,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,sBAAsB,EACtB,aAAa,EACd,EAAE,0BAA0B,OAmB5B"}
@@ -0,0 +1,33 @@
1
+ import { getDefaultConfig } from "@rainbow-me/rainbowkit";
2
+ import { injectedWallet } from "@rainbow-me/rainbowkit/wallets";
3
+ import { http, unstable_connector } from "wagmi";
4
+ import { mainnet } from "wagmi/chains";
5
+ function createMainnetTransport(mainnetRpcUrl) {
6
+ if (mainnetRpcUrl)
7
+ return http(mainnetRpcUrl);
8
+ return unstable_connector({ type: "injected" }, {
9
+ key: "injected-wallet",
10
+ name: "Injected Wallet"
11
+ });
12
+ }
13
+ export function createBandKitConfig({ appName, walletConnectProjectId, mainnetRpcUrl }) {
14
+ return getDefaultConfig({
15
+ appName,
16
+ projectId: walletConnectProjectId ?? "bandkit-injected-only",
17
+ chains: [mainnet],
18
+ wallets: [
19
+ {
20
+ groupName: "Chrome",
21
+ wallets: [injectedWallet]
22
+ }
23
+ ],
24
+ transports: {
25
+ [mainnet.id]: createMainnetTransport(mainnetRpcUrl)
26
+ },
27
+ batch: {
28
+ multicall: false
29
+ },
30
+ ssr: true
31
+ });
32
+ }
33
+ //# sourceMappingURL=rainbowkit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rainbowkit.js","sourceRoot":"","sources":["../src/rainbowkit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAkB,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQvC,SAAS,sBAAsB,CAAC,aAAsB;IACpD,IAAI,aAAa;QAAE,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC;IAE9C,OAAO,kBAAkB,CACvB,EAAE,IAAI,EAAE,UAAU,EAAE,EACpB;QACE,GAAG,EAAE,iBAAiB;QACtB,IAAI,EAAE,iBAAiB;KACxB,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAClC,OAAO,EACP,sBAAsB,EACtB,aAAa,EACc;IAC3B,OAAO,gBAAgB,CAAC;QACtB,OAAO;QACP,SAAS,EAAE,sBAAsB,IAAI,uBAAuB;QAC5D,MAAM,EAAE,CAAC,OAAO,CAAC;QACjB,OAAO,EAAE;YACP;gBACE,SAAS,EAAE,QAAQ;gBACnB,OAAO,EAAE,CAAC,cAAc,CAAC;aAC1B;SACF;QACD,UAAU,EAAE;YACV,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,sBAAsB,CAAC,aAAa,CAAC;SACpD;QACD,KAAK,EAAE;YACL,SAAS,EAAE,KAAK;SACjB;QACD,GAAG,EAAE,IAAI;KACV,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { type Address, type Hex } from "viem";
2
+ export type EthereumRequestProvider = {
3
+ request: (args: {
4
+ method: string;
5
+ params?: unknown[];
6
+ }) => Promise<unknown>;
7
+ };
8
+ export type UniswapV2RoundTripPreview = {
9
+ approvedRouter: boolean;
10
+ approvedBuySelector: boolean;
11
+ approvedSellSelector: boolean;
12
+ approvedToken: boolean;
13
+ engineWallet: Address;
14
+ expectedEthOut: bigint;
15
+ expectedProfit: bigint;
16
+ expectedProfitEth: string;
17
+ expectedTokenOut: bigint;
18
+ executorBalance: bigint;
19
+ minBalanceAfter: bigint;
20
+ routerAddress: Address;
21
+ tokenAddress: Address;
22
+ tradeValue: bigint;
23
+ };
24
+ export type UniswapV2RoundTripOptions = {
25
+ account: Address;
26
+ deadlineSeconds?: number;
27
+ executorAddress: Address;
28
+ minProfit?: bigint;
29
+ provider?: EthereumRequestProvider;
30
+ routerAddress?: Address;
31
+ slippageBps?: number;
32
+ tokenAddress: Address;
33
+ tradeValue: bigint;
34
+ wethAddress?: Address;
35
+ };
36
+ export declare function previewUniswapV2RoundTrip(options: UniswapV2RoundTripOptions): Promise<UniswapV2RoundTripPreview>;
37
+ export declare function approveUniswapV2RoundTripToken(options: UniswapV2RoundTripOptions): Promise<Hex | undefined>;
38
+ //# sourceMappingURL=tradingExecutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tradingExecutor.d.ts","sourceRoot":"","sources":["../src/tradingExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,OAAO,EACZ,KAAK,GAAG,EACT,MAAM,MAAM,CAAC;AAgBd,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E,CAAC;AAMF,MAAM,MAAM,yBAAyB,GAAG;IACtC,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAwBF,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CA4EtH;AAED,wBAAsB,8BAA8B,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAoBjH"}
@@ -0,0 +1,125 @@
1
+ import { createPublicClient, createWalletClient, custom, encodeFunctionData, formatEther, maxUint256, parseAbi } from "viem";
2
+ import { mainnet } from "viem/chains";
3
+ import { BAND_EXECUTOR_ABI } from "./bandExecutorAbi.js";
4
+ const UNISWAP_V2_ROUTER = "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D";
5
+ const WETH = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";
6
+ const erc20Abi = parseAbi(["function allowance(address owner,address spender) view returns (uint256)"]);
7
+ const routerAbi = parseAbi([
8
+ "function getAmountsOut(uint amountIn,address[] calldata path) view returns (uint[] memory amounts)",
9
+ "function swapExactETHForTokens(uint amountOutMin,address[] calldata path,address to,uint deadline) payable returns (uint[] memory amounts)",
10
+ "function swapExactTokensForETH(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) returns (uint[] memory amounts)"
11
+ ]);
12
+ const SWAP_EXACT_ETH_FOR_TOKENS_SELECTOR = "0x7ff36ab5";
13
+ const SWAP_EXACT_TOKENS_FOR_ETH_SELECTOR = "0x18cbafe5";
14
+ function getProvider(provider) {
15
+ if (provider)
16
+ return provider;
17
+ const browserWindow = typeof window !== "undefined" ? window : undefined;
18
+ if (browserWindow?.ethereum) {
19
+ return browserWindow.ethereum;
20
+ }
21
+ throw new Error("No browser wallet provider available.");
22
+ }
23
+ function applySlippage(value, slippageBps) {
24
+ return (value * BigInt(10_000 - slippageBps)) / 10000n;
25
+ }
26
+ function createClients(provider, account) {
27
+ const transport = custom(getProvider(provider));
28
+ const publicClient = createPublicClient({ chain: mainnet, transport });
29
+ const walletClient = account ? createWalletClient({ account, chain: mainnet, transport }) : undefined;
30
+ return { publicClient, walletClient };
31
+ }
32
+ export async function previewUniswapV2RoundTrip(options) {
33
+ const routerAddress = options.routerAddress ?? UNISWAP_V2_ROUTER;
34
+ const wethAddress = options.wethAddress ?? WETH;
35
+ const slippageBps = options.slippageBps ?? 50;
36
+ const minProfit = options.minProfit ?? 0n;
37
+ const { publicClient } = createClients(options.provider);
38
+ if (slippageBps < 0 || slippageBps > 1_000)
39
+ throw new Error("slippageBps must be between 0 and 1000.");
40
+ const buyPath = [wethAddress, options.tokenAddress];
41
+ const sellPath = [options.tokenAddress, wethAddress];
42
+ const [paused, engineWallet, approvedRouter, approvedBuySelector, approvedSellSelector, approvedToken, executorBalance, buyQuote] = await Promise.all([
43
+ publicClient.readContract({ address: options.executorAddress, abi: BAND_EXECUTOR_ABI, functionName: "paused" }),
44
+ publicClient.readContract({ address: options.executorAddress, abi: BAND_EXECUTOR_ABI, functionName: "engineWallet" }),
45
+ publicClient.readContract({ address: options.executorAddress, abi: BAND_EXECUTOR_ABI, functionName: "approvedTargets", args: [routerAddress] }),
46
+ publicClient.readContract({ address: options.executorAddress, abi: BAND_EXECUTOR_ABI, functionName: "approvedSelectors", args: [routerAddress, SWAP_EXACT_ETH_FOR_TOKENS_SELECTOR] }),
47
+ publicClient.readContract({ address: options.executorAddress, abi: BAND_EXECUTOR_ABI, functionName: "approvedSelectors", args: [routerAddress, SWAP_EXACT_TOKENS_FOR_ETH_SELECTOR] }),
48
+ publicClient.readContract({ address: options.executorAddress, abi: BAND_EXECUTOR_ABI, functionName: "approvedTokens", args: [options.tokenAddress] }),
49
+ publicClient.getBalance({ address: options.executorAddress }),
50
+ publicClient.readContract({ address: routerAddress, abi: routerAbi, functionName: "getAmountsOut", args: [options.tradeValue, buyPath] })
51
+ ]);
52
+ if (paused)
53
+ throw new Error("Executor is paused.");
54
+ if (!approvedRouter)
55
+ throw new Error("Router is not approved.");
56
+ if (!approvedBuySelector || !approvedSellSelector)
57
+ throw new Error("Router selectors are not approved.");
58
+ const expectedTokenOut = buyQuote[1];
59
+ const sellQuote = await publicClient.readContract({
60
+ address: routerAddress,
61
+ abi: routerAbi,
62
+ functionName: "getAmountsOut",
63
+ args: [expectedTokenOut, sellPath]
64
+ });
65
+ const expectedEthOut = sellQuote[1];
66
+ const expectedProfit = expectedEthOut - options.tradeValue;
67
+ const minBalanceAfter = executorBalance + minProfit;
68
+ if (executorBalance < options.tradeValue)
69
+ throw new Error("Executor balance is lower than tradeValue.");
70
+ const deadline = BigInt(Math.floor(Date.now() / 1000) + (options.deadlineSeconds ?? 180));
71
+ const buyCalldata = encodeFunctionData({
72
+ abi: routerAbi,
73
+ functionName: "swapExactETHForTokens",
74
+ args: [applySlippage(expectedTokenOut, slippageBps), buyPath, options.executorAddress, deadline]
75
+ });
76
+ const sellCalldata = encodeFunctionData({
77
+ abi: routerAbi,
78
+ functionName: "swapExactTokensForETH",
79
+ args: [expectedTokenOut, applySlippage(expectedEthOut, slippageBps), sellPath, options.executorAddress, deadline]
80
+ });
81
+ await publicClient.simulateContract({
82
+ account: options.account,
83
+ address: options.executorAddress,
84
+ abi: BAND_EXECUTOR_ABI,
85
+ functionName: "executeBatch",
86
+ args: [[routerAddress, routerAddress], [options.tradeValue, 0n], [buyCalldata, sellCalldata], minBalanceAfter]
87
+ });
88
+ return {
89
+ approvedRouter,
90
+ approvedBuySelector,
91
+ approvedSellSelector,
92
+ approvedToken,
93
+ engineWallet,
94
+ expectedEthOut,
95
+ expectedProfit,
96
+ expectedProfitEth: formatEther(expectedProfit),
97
+ expectedTokenOut,
98
+ executorBalance,
99
+ minBalanceAfter,
100
+ routerAddress,
101
+ tokenAddress: options.tokenAddress,
102
+ tradeValue: options.tradeValue
103
+ };
104
+ }
105
+ export async function approveUniswapV2RoundTripToken(options) {
106
+ const routerAddress = options.routerAddress ?? UNISWAP_V2_ROUTER;
107
+ const { publicClient, walletClient } = createClients(options.provider, options.account);
108
+ if (!walletClient)
109
+ throw new Error("Wallet client is required.");
110
+ const allowance = await publicClient.readContract({
111
+ address: options.tokenAddress,
112
+ abi: erc20Abi,
113
+ functionName: "allowance",
114
+ args: [options.executorAddress, routerAddress]
115
+ });
116
+ if (allowance >= options.tradeValue)
117
+ return undefined;
118
+ return walletClient.writeContract({
119
+ address: options.executorAddress,
120
+ abi: BAND_EXECUTOR_ABI,
121
+ functionName: "approveToken",
122
+ args: [options.tokenAddress, routerAddress, maxUint256]
123
+ });
124
+ }
125
+ //# sourceMappingURL=tradingExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tradingExecutor.js","sourceRoot":"","sources":["../src/tradingExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Address } from "viem";
2
+ import { type UseStrategyContractDeploymentOptions } from "./useStrategyContractDeployment.js";
3
+ import { type UseEthPriceTickerOptions } from "./useEthPriceTicker.js";
4
+ import { type UseStrategyContractOptions } from "./useStrategyContract.js";
5
+ export type UseBandDashboardOptions = UseStrategyContractOptions & {
6
+ deployment?: UseStrategyContractDeploymentOptions;
7
+ priceTicker?: UseEthPriceTickerOptions;
8
+ walletAddress?: Address;
9
+ };
10
+ export declare function useBandDashboard(options: UseBandDashboardOptions): {
11
+ deployment: import("./useStrategyContractDeployment.js").UseStrategyContractDeploymentResult;
12
+ price: import("./useEthPriceTicker.js").UseEthPriceTickerResult;
13
+ wallet: import("./useWalletEthBalance.js").UseWalletEthBalanceResult;
14
+ strategyContract: import("./useStrategyContract.js").UseStrategyContractResult;
15
+ engine: {
16
+ isFunded: boolean;
17
+ isActive: boolean;
18
+ availableEth: string;
19
+ availableUsd: number | null;
20
+ allocatedEth: string;
21
+ allocatedUsd: number | null;
22
+ strategyWallet: `0x${string}` | undefined;
23
+ walletEth: string;
24
+ walletUsd: number | null;
25
+ };
26
+ };
27
+ //# sourceMappingURL=useBandDashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBandDashboard.d.ts","sourceRoot":"","sources":["../src/useBandDashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAiC,KAAK,oCAAoC,EAAE,MAAM,oCAAoC,CAAC;AAC9H,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAuB,KAAK,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAGhG,MAAM,MAAM,uBAAuB,GAAG,0BAA0B,GAAG;IACjE,UAAU,CAAC,EAAE,oCAAoC,CAAC;IAClD,WAAW,CAAC,EAAE,wBAAwB,CAAC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB;;;;;;;;;;;;;;;;EA6BhE"}
@@ -0,0 +1,35 @@
1
+ import { mainnet } from "wagmi/chains";
2
+ import { useStrategyContractDeployment } from "./useStrategyContractDeployment.js";
3
+ import { useEthPriceTicker } from "./useEthPriceTicker.js";
4
+ import { useStrategyContract } from "./useStrategyContract.js";
5
+ import { useWalletEthBalance } from "./useWalletEthBalance.js";
6
+ export function useBandDashboard(options) {
7
+ const chainId = options.chainId ?? mainnet.id;
8
+ const deployment = useStrategyContractDeployment({ chainId, ...options.deployment });
9
+ const strategyContractAddress = options.strategyContractAddress ?? deployment.strategyContractAddress;
10
+ const price = useEthPriceTicker(options.priceTicker);
11
+ const wallet = useWalletEthBalance({ address: options.walletAddress, chainId });
12
+ const strategyContract = useStrategyContract({ ...options, strategyContractAddress, chainId });
13
+ const ethPrice = price.price ?? 0;
14
+ const contractBalance = Number(strategyContract.balanceEth);
15
+ const allocatedBalance = Number(strategyContract.allocatedToStrategyEth);
16
+ const walletBalance = Number(wallet.balanceEth);
17
+ return {
18
+ deployment,
19
+ price,
20
+ wallet,
21
+ strategyContract,
22
+ engine: {
23
+ isFunded: strategyContract.balanceWei > 0n || strategyContract.allocatedToStrategyWei > 0n,
24
+ isActive: strategyContract.strategyActive,
25
+ availableEth: strategyContract.balanceEth,
26
+ availableUsd: ethPrice > 0 && Number.isFinite(contractBalance) ? contractBalance * ethPrice : null,
27
+ allocatedEth: strategyContract.allocatedToStrategyEth,
28
+ allocatedUsd: ethPrice > 0 && Number.isFinite(allocatedBalance) ? allocatedBalance * ethPrice : null,
29
+ strategyWallet: strategyContract.strategyWallet,
30
+ walletEth: wallet.balanceEth,
31
+ walletUsd: ethPrice > 0 && Number.isFinite(walletBalance) ? walletBalance * ethPrice : null
32
+ }
33
+ };
34
+ }
35
+ //# sourceMappingURL=useBandDashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBandDashboard.js","sourceRoot":"","sources":["../src/useBandDashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,6BAA6B,EAA6C,MAAM,oCAAoC,CAAC;AAC9H,OAAO,EAAE,iBAAiB,EAAiC,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAmC,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAQ/D,MAAM,UAAU,gBAAgB,CAAC,OAAgC;IAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,6BAA6B,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,MAAM,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,IAAI,UAAU,CAAC,uBAAuB,CAAC;IACtG,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAChF,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,EAAE,GAAG,OAAO,EAAE,uBAAuB,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IAClC,MAAM,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEhD,OAAO;QACL,UAAU;QACV,KAAK;QACL,MAAM;QACN,gBAAgB;QAChB,MAAM,EAAE;YACN,QAAQ,EAAE,gBAAgB,CAAC,UAAU,GAAG,EAAE,IAAI,gBAAgB,CAAC,sBAAsB,GAAG,EAAE;YAC1F,QAAQ,EAAE,gBAAgB,CAAC,cAAc;YACzC,YAAY,EAAE,gBAAgB,CAAC,UAAU;YACzC,YAAY,EAAE,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI;YAClG,YAAY,EAAE,gBAAgB,CAAC,sBAAsB;YACrD,YAAY,EAAE,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI;YACpG,cAAc,EAAE,gBAAgB,CAAC,cAAc;YAC/C,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,SAAS,EAAE,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI;SAC5F;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ export type EthPriceTickerStatus = "connecting" | "live" | "stale" | "error";
2
+ export type BinanceMiniTickerMessage = {
3
+ e: string;
4
+ E: number;
5
+ s: string;
6
+ c: string;
7
+ o: string;
8
+ h: string;
9
+ l: string;
10
+ v: string;
11
+ q: string;
12
+ };
13
+ export type UseEthPriceTickerOptions = {
14
+ enabled?: boolean;
15
+ reconnectDelayMs?: number;
16
+ streamUrl?: string;
17
+ };
18
+ export type UseEthPriceTickerResult = {
19
+ price: number | null;
20
+ priceText: string;
21
+ changePercent24h: number | null;
22
+ changePercent24hText: string;
23
+ high24h: number | null;
24
+ low24h: number | null;
25
+ source: "Market feed";
26
+ symbol: "ETHUSDT";
27
+ status: EthPriceTickerStatus;
28
+ updatedAt?: Date;
29
+ error?: string;
30
+ };
31
+ export declare function useEthPriceTicker(options?: UseEthPriceTickerOptions): UseEthPriceTickerResult;
32
+ //# sourceMappingURL=useEthPriceTicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEthPriceTicker.d.ts","sourceRoot":"","sources":["../src/useEthPriceTicker.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAE7E,MAAM,MAAM,wBAAwB,GAAG;IACrC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAiBF,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,uBAAuB,CA0FjG"}
@@ -0,0 +1,95 @@
1
+ import { useEffect, useMemo, useState } from "react";
2
+ const DEFAULT_BINANCE_ETH_TICKER_STREAM = "wss://stream.binance.com:9443/ws/ethusdt@miniTicker";
3
+ const usdFormatter = new Intl.NumberFormat("en-US", {
4
+ currency: "USD",
5
+ maximumFractionDigits: 2,
6
+ minimumFractionDigits: 2,
7
+ style: "currency"
8
+ });
9
+ function formatPercent(value) {
10
+ if (value === null || !Number.isFinite(value))
11
+ return "--";
12
+ const sign = value > 0 ? "+" : "";
13
+ return `${sign}${value.toFixed(2)}%`;
14
+ }
15
+ export function useEthPriceTicker(options = {}) {
16
+ const enabled = options.enabled ?? true;
17
+ const reconnectDelayMs = options.reconnectDelayMs ?? 3000;
18
+ const streamUrl = options.streamUrl ?? DEFAULT_BINANCE_ETH_TICKER_STREAM;
19
+ const [message, setMessage] = useState();
20
+ const [status, setStatus] = useState("connecting");
21
+ const [error, setError] = useState();
22
+ useEffect(() => {
23
+ if (!enabled) {
24
+ setStatus("stale");
25
+ return;
26
+ }
27
+ if (typeof WebSocket === "undefined") {
28
+ setStatus("error");
29
+ setError("WebSocket is not available in this runtime.");
30
+ return;
31
+ }
32
+ let reconnectTimer;
33
+ let closedByHook = false;
34
+ let socket;
35
+ function connect() {
36
+ setStatus("connecting");
37
+ socket = new WebSocket(streamUrl);
38
+ socket.onopen = () => {
39
+ setStatus("live");
40
+ setError(undefined);
41
+ };
42
+ socket.onmessage = (event) => {
43
+ try {
44
+ const nextMessage = JSON.parse(String(event.data));
45
+ if (nextMessage.s === "ETHUSDT") {
46
+ setMessage(nextMessage);
47
+ setStatus("live");
48
+ }
49
+ }
50
+ catch {
51
+ setStatus("error");
52
+ setError("Could not parse market ticker message.");
53
+ }
54
+ };
55
+ socket.onerror = () => {
56
+ setStatus("error");
57
+ setError("Market ticker connection failed.");
58
+ };
59
+ socket.onclose = () => {
60
+ if (closedByHook)
61
+ return;
62
+ setStatus("stale");
63
+ reconnectTimer = setTimeout(connect, reconnectDelayMs);
64
+ };
65
+ }
66
+ connect();
67
+ return () => {
68
+ closedByHook = true;
69
+ if (reconnectTimer)
70
+ clearTimeout(reconnectTimer);
71
+ socket?.close();
72
+ };
73
+ }, [enabled, reconnectDelayMs, streamUrl]);
74
+ return useMemo(() => {
75
+ const price = message ? Number(message.c) : null;
76
+ const open = message ? Number(message.o) : null;
77
+ const high24h = message ? Number(message.h) : null;
78
+ const low24h = message ? Number(message.l) : null;
79
+ const changePercent24h = price !== null && open !== null && Number.isFinite(open) && open > 0 ? ((price - open) / open) * 100 : null;
80
+ return {
81
+ price: price !== null && Number.isFinite(price) ? price : null,
82
+ priceText: price !== null && Number.isFinite(price) ? usdFormatter.format(price) : "--",
83
+ changePercent24h: changePercent24h !== null && Number.isFinite(changePercent24h) ? changePercent24h : null,
84
+ changePercent24hText: formatPercent(changePercent24h),
85
+ high24h: high24h !== null && Number.isFinite(high24h) ? high24h : null,
86
+ low24h: low24h !== null && Number.isFinite(low24h) ? low24h : null,
87
+ source: "Market feed",
88
+ symbol: "ETHUSDT",
89
+ status,
90
+ updatedAt: message ? new Date(message.E) : undefined,
91
+ error
92
+ };
93
+ }, [error, message, status]);
94
+ }
95
+ //# sourceMappingURL=useEthPriceTicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEthPriceTicker.js","sourceRoot":"","sources":["../src/useEthPriceTicker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type Address, type Hash } from "viem";
2
+ export type StrategyContractAction = "deposit" | "withdraw" | "withdrawAll" | "activateStrategyEngine" | "deactivateStrategyEngine";
3
+ export type StrategyContractTransactionStatus = "idle" | "walletPending" | "confirming" | "confirmed" | "failed" | "cancelled";
4
+ export type UseStrategyContractOptions = {
5
+ strategyContractAddress?: Address;
6
+ chainId?: number;
7
+ confirmations?: number;
8
+ };
9
+ export type UseStrategyContractResult = {
10
+ accountAddress?: Address;
11
+ chainId: number;
12
+ requiredChainId: number;
13
+ isConnected: boolean;
14
+ isCorrectChain: boolean;
15
+ balanceWei: bigint;
16
+ balanceEth: string;
17
+ strategyActive: boolean;
18
+ allocatedToStrategyWei: bigint;
19
+ allocatedToStrategyEth: string;
20
+ totalDepositsWei: bigint;
21
+ totalDepositsEth: string;
22
+ totalAllocatedToStrategyWei: bigint;
23
+ totalAllocatedToStrategyEth: string;
24
+ strategyWallet?: Address;
25
+ depositsPaused: boolean;
26
+ pendingHash?: Hash;
27
+ transactionAction?: StrategyContractAction;
28
+ transactionStatus: StrategyContractTransactionStatus;
29
+ transactionStatusText: string;
30
+ isWritePending: boolean;
31
+ isConfirming: boolean;
32
+ isConfirmed: boolean;
33
+ error?: Error;
34
+ depositEth: (amountEth: string) => Promise<Hash>;
35
+ activateStrategyEngine: () => Promise<Hash>;
36
+ deactivateStrategyEngine: () => Promise<Hash>;
37
+ withdrawEth: (amountEth: string) => Promise<Hash>;
38
+ withdrawAll: () => Promise<Hash>;
39
+ refetch: () => void;
40
+ };
41
+ export declare function useStrategyContract(options: UseStrategyContractOptions): UseStrategyContractResult;
42
+ //# sourceMappingURL=useStrategyContract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStrategyContract.d.ts","sourceRoot":"","sources":["../src/useStrategyContract.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAYxE,MAAM,MAAM,sBAAsB,GAC9B,SAAS,GACT,UAAU,GACV,aAAa,GACb,wBAAwB,GACxB,0BAA0B,CAAC;AAC/B,MAAM,MAAM,iCAAiC,GAAG,MAAM,GAAG,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE/H,MAAM,MAAM,0BAA0B,GAAG;IACvC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,2BAA2B,EAAE,MAAM,CAAC;IACpC,2BAA2B,EAAE,MAAM,CAAC;IACpC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;IAC3C,iBAAiB,EAAE,iCAAiC,CAAC;IACrD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,wBAAwB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAyBF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,yBAAyB,CAoRlG"}