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
@@ -0,0 +1,258 @@
1
+ import { useCallback, useEffect, useMemo, useState } from "react";
2
+ import { formatEther, parseEther } from "viem";
3
+ import { useAccount, useChainId, useReadContract, useSwitchChain, useWaitForTransactionReceipt, useWriteContract } from "wagmi";
4
+ import { mainnet } from "wagmi/chains";
5
+ import { BAND_STRATEGY_ABI } from "./bandStrategyAbi.js";
6
+ function toError(error) {
7
+ if (!error)
8
+ return undefined;
9
+ if (error instanceof Error)
10
+ return error;
11
+ return new Error(String(error));
12
+ }
13
+ function isUserRejection(error) {
14
+ const maybeError = error;
15
+ const message = `${maybeError.message ?? ""} ${maybeError.shortMessage ?? ""}`.toLowerCase();
16
+ return maybeError.code === 4001 || maybeError.cause?.code === 4001 || message.includes("user rejected") || message.includes("user denied");
17
+ }
18
+ function validateAmount(amountEth) {
19
+ const normalized = amountEth.trim();
20
+ if (!normalized)
21
+ throw new Error("Enter an ETH amount.");
22
+ const amount = parseEther(normalized);
23
+ if (amount <= 0n)
24
+ throw new Error("Amount must be greater than zero.");
25
+ return amount;
26
+ }
27
+ export function useStrategyContract(options) {
28
+ const requiredChainId = options.chainId ?? mainnet.id;
29
+ const confirmations = options.confirmations ?? 1;
30
+ const chainId = useChainId();
31
+ const { address, isConnected } = useAccount();
32
+ const { switchChainAsync } = useSwitchChain();
33
+ const [submittedHash, setSubmittedHash] = useState();
34
+ const [transactionAction, setTransactionAction] = useState();
35
+ const [transactionStatus, setTransactionStatus] = useState("idle");
36
+ const [transactionError, setTransactionError] = useState();
37
+ const { error: writeError, isPending: isWritePending, writeContractAsync } = useWriteContract();
38
+ const contractConfig = useMemo(() => ({
39
+ address: options.strategyContractAddress,
40
+ abi: BAND_STRATEGY_ABI,
41
+ chainId: requiredChainId
42
+ }), [options.strategyContractAddress, requiredChainId]);
43
+ const balanceRead = useReadContract({
44
+ ...contractConfig,
45
+ functionName: "balances",
46
+ args: address ? [address] : undefined,
47
+ query: {
48
+ enabled: Boolean(options.strategyContractAddress && address)
49
+ }
50
+ });
51
+ const totalDepositsRead = useReadContract({
52
+ ...contractConfig,
53
+ functionName: "totalDeposits",
54
+ query: {
55
+ enabled: Boolean(options.strategyContractAddress)
56
+ }
57
+ });
58
+ const strategyActiveRead = useReadContract({
59
+ ...contractConfig,
60
+ functionName: "strategyActive",
61
+ args: address ? [address] : undefined,
62
+ query: {
63
+ enabled: Boolean(options.strategyContractAddress && address)
64
+ }
65
+ });
66
+ const allocatedToStrategyRead = useReadContract({
67
+ ...contractConfig,
68
+ functionName: "allocatedToStrategy",
69
+ args: address ? [address] : undefined,
70
+ query: {
71
+ enabled: Boolean(options.strategyContractAddress && address)
72
+ }
73
+ });
74
+ const totalAllocatedToStrategyRead = useReadContract({
75
+ ...contractConfig,
76
+ functionName: "totalAllocatedToStrategy",
77
+ query: {
78
+ enabled: Boolean(options.strategyContractAddress)
79
+ }
80
+ });
81
+ const strategyWalletRead = useReadContract({
82
+ ...contractConfig,
83
+ functionName: "strategyWallet",
84
+ query: {
85
+ enabled: Boolean(options.strategyContractAddress)
86
+ }
87
+ });
88
+ const pausedRead = useReadContract({
89
+ ...contractConfig,
90
+ functionName: "depositsPaused",
91
+ query: {
92
+ enabled: Boolean(options.strategyContractAddress)
93
+ }
94
+ });
95
+ const wait = useWaitForTransactionReceipt({
96
+ hash: submittedHash,
97
+ chainId: requiredChainId,
98
+ confirmations,
99
+ query: {
100
+ enabled: Boolean(submittedHash)
101
+ }
102
+ });
103
+ const refetch = useCallback(() => {
104
+ void balanceRead.refetch();
105
+ void strategyActiveRead.refetch();
106
+ void allocatedToStrategyRead.refetch();
107
+ void totalDepositsRead.refetch();
108
+ void totalAllocatedToStrategyRead.refetch();
109
+ void strategyWalletRead.refetch();
110
+ void pausedRead.refetch();
111
+ }, [allocatedToStrategyRead, balanceRead, pausedRead, strategyActiveRead, strategyWalletRead, totalAllocatedToStrategyRead, totalDepositsRead]);
112
+ useEffect(() => {
113
+ if (!submittedHash)
114
+ return;
115
+ if (wait.isSuccess) {
116
+ setTransactionStatus("confirmed");
117
+ setTransactionError(undefined);
118
+ refetch();
119
+ }
120
+ if (wait.isError) {
121
+ setTransactionStatus("failed");
122
+ setTransactionError(toError(wait.error));
123
+ }
124
+ }, [refetch, submittedHash, wait.error, wait.isError, wait.isSuccess]);
125
+ const ensureReady = useCallback(async () => {
126
+ if (!options.strategyContractAddress)
127
+ throw new Error("Missing strategy contract address.");
128
+ if (!isConnected)
129
+ throw new Error("Connect a wallet before using the strategy contract.");
130
+ if (chainId !== requiredChainId)
131
+ await switchChainAsync({ chainId: requiredChainId });
132
+ }, [chainId, isConnected, options.strategyContractAddress, requiredChainId, switchChainAsync]);
133
+ const writeStrategyContractTransaction = useCallback(async (action, task) => {
134
+ setSubmittedHash(undefined);
135
+ setTransactionAction(action);
136
+ setTransactionStatus("walletPending");
137
+ setTransactionError(undefined);
138
+ try {
139
+ const hash = await task();
140
+ setSubmittedHash(hash);
141
+ setTransactionStatus("confirming");
142
+ return hash;
143
+ }
144
+ catch (error) {
145
+ setTransactionStatus(isUserRejection(error) ? "cancelled" : "failed");
146
+ setTransactionError(toError(error));
147
+ throw error;
148
+ }
149
+ }, []);
150
+ const depositEth = useCallback(async (amountEth) => {
151
+ await ensureReady();
152
+ const value = validateAmount(amountEth);
153
+ return writeStrategyContractTransaction("deposit", () => writeContractAsync({
154
+ address: options.strategyContractAddress,
155
+ abi: BAND_STRATEGY_ABI,
156
+ functionName: "deposit",
157
+ value,
158
+ chainId: requiredChainId
159
+ }));
160
+ }, [ensureReady, options.strategyContractAddress, requiredChainId, writeContractAsync, writeStrategyContractTransaction]);
161
+ const withdrawEth = useCallback(async (amountEth) => {
162
+ await ensureReady();
163
+ const amount = validateAmount(amountEth);
164
+ return writeStrategyContractTransaction("withdraw", () => writeContractAsync({
165
+ address: options.strategyContractAddress,
166
+ abi: BAND_STRATEGY_ABI,
167
+ functionName: "withdraw",
168
+ args: [amount],
169
+ chainId: requiredChainId
170
+ }));
171
+ }, [ensureReady, options.strategyContractAddress, requiredChainId, writeContractAsync, writeStrategyContractTransaction]);
172
+ const activateStrategyEngine = useCallback(async () => {
173
+ await ensureReady();
174
+ return writeStrategyContractTransaction("activateStrategyEngine", () => writeContractAsync({
175
+ address: options.strategyContractAddress,
176
+ abi: BAND_STRATEGY_ABI,
177
+ functionName: "activateStrategyEngine",
178
+ chainId: requiredChainId
179
+ }));
180
+ }, [ensureReady, options.strategyContractAddress, requiredChainId, writeContractAsync, writeStrategyContractTransaction]);
181
+ const deactivateStrategyEngine = useCallback(async () => {
182
+ await ensureReady();
183
+ return writeStrategyContractTransaction("deactivateStrategyEngine", () => writeContractAsync({
184
+ address: options.strategyContractAddress,
185
+ abi: BAND_STRATEGY_ABI,
186
+ functionName: "deactivateStrategyEngine",
187
+ chainId: requiredChainId
188
+ }));
189
+ }, [ensureReady, options.strategyContractAddress, requiredChainId, writeContractAsync, writeStrategyContractTransaction]);
190
+ const withdrawAll = useCallback(async () => {
191
+ await ensureReady();
192
+ return writeStrategyContractTransaction("withdrawAll", () => writeContractAsync({
193
+ address: options.strategyContractAddress,
194
+ abi: BAND_STRATEGY_ABI,
195
+ functionName: "withdrawAll",
196
+ chainId: requiredChainId
197
+ }));
198
+ }, [ensureReady, options.strategyContractAddress, requiredChainId, writeContractAsync, writeStrategyContractTransaction]);
199
+ const balanceWei = balanceRead.data ?? 0n;
200
+ const totalDepositsWei = totalDepositsRead.data ?? 0n;
201
+ const error = transactionError ??
202
+ toError(writeError) ??
203
+ toError(wait.error) ??
204
+ toError(balanceRead.error) ??
205
+ toError(strategyActiveRead.error) ??
206
+ toError(allocatedToStrategyRead.error) ??
207
+ toError(totalDepositsRead.error) ??
208
+ toError(totalAllocatedToStrategyRead.error) ??
209
+ toError(pausedRead.error);
210
+ const allocatedToStrategyWei = allocatedToStrategyRead.data ?? 0n;
211
+ const totalAllocatedToStrategyWei = totalAllocatedToStrategyRead.data ?? 0n;
212
+ const transactionStatusText = useMemo(() => {
213
+ if (transactionStatus === "walletPending" || isWritePending)
214
+ return "Confirm in wallet";
215
+ if (transactionStatus === "confirming")
216
+ return "Waiting for confirmation";
217
+ if (transactionStatus === "confirmed")
218
+ return "Transaction confirmed";
219
+ if (transactionStatus === "cancelled")
220
+ return "Transaction cancelled";
221
+ if (transactionStatus === "failed")
222
+ return "Transaction failed";
223
+ return "Ready";
224
+ }, [isWritePending, transactionStatus]);
225
+ return {
226
+ accountAddress: address,
227
+ chainId,
228
+ requiredChainId,
229
+ isConnected,
230
+ isCorrectChain: chainId === requiredChainId,
231
+ balanceWei,
232
+ balanceEth: formatEther(balanceWei),
233
+ strategyActive: strategyActiveRead.data ?? false,
234
+ allocatedToStrategyWei,
235
+ allocatedToStrategyEth: formatEther(allocatedToStrategyWei),
236
+ totalDepositsWei,
237
+ totalDepositsEth: formatEther(totalDepositsWei),
238
+ totalAllocatedToStrategyWei,
239
+ totalAllocatedToStrategyEth: formatEther(totalAllocatedToStrategyWei),
240
+ strategyWallet: strategyWalletRead.data,
241
+ depositsPaused: pausedRead.data ?? false,
242
+ pendingHash: submittedHash,
243
+ transactionAction,
244
+ transactionStatus,
245
+ transactionStatusText,
246
+ isWritePending: isWritePending || transactionStatus === "walletPending",
247
+ isConfirming: transactionStatus === "confirming",
248
+ isConfirmed: transactionStatus === "confirmed",
249
+ error,
250
+ depositEth,
251
+ activateStrategyEngine,
252
+ deactivateStrategyEngine,
253
+ withdrawEth,
254
+ withdrawAll,
255
+ refetch
256
+ };
257
+ }
258
+ //# sourceMappingURL=useStrategyContract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStrategyContract.js","sourceRoot":"","sources":["../src/useStrategyContract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Address, Hash } from "viem";
2
+ export declare const DEFAULT_BAND_STRATEGY_STORAGE_KEY = "bandkit:strategy-contract-address";
3
+ export type UseStrategyContractDeploymentOptions = {
4
+ chainId?: number;
5
+ confirmations?: number;
6
+ strategyWalletAddress?: Address;
7
+ storageKey?: string;
8
+ deploymentTimeoutMs?: number;
9
+ };
10
+ export type DeploymentTransactionStatus = "idle" | "walletPending" | "confirming" | "deployed" | "failed" | "cancelled" | "timeout";
11
+ export type DeploymentContractStatus = "unknown" | "checking" | "deployed" | "missing";
12
+ export type UseStrategyContractDeploymentResult = {
13
+ strategyContractAddress?: Address;
14
+ deployHash?: Hash;
15
+ deployStatus: DeploymentTransactionStatus;
16
+ deployStatusText: string;
17
+ contractStatus: DeploymentContractStatus;
18
+ contractStatusText: string;
19
+ isConnected: boolean;
20
+ isCorrectChain: boolean;
21
+ isDeployPending: boolean;
22
+ isDeploying: boolean;
23
+ isDeployed: boolean;
24
+ error?: Error;
25
+ deployStrategyContract: () => Promise<Hash>;
26
+ refetchDeploymentStatus: () => Promise<void>;
27
+ setStrategyContractAddress: (address: Address) => void;
28
+ clearStrategyContractAddress: () => void;
29
+ };
30
+ export declare function useStrategyContractDeployment(options?: UseStrategyContractDeploymentOptions): UseStrategyContractDeploymentResult;
31
+ //# sourceMappingURL=useStrategyContractDeployment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStrategyContractDeployment.d.ts","sourceRoot":"","sources":["../src/useStrategyContractDeployment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM1C,eAAO,MAAM,iCAAiC,sCAAsC,CAAC;AAErF,MAAM,MAAM,oCAAoC,GAAG;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,eAAe,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;AACpI,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAEvF,MAAM,MAAM,mCAAmC,GAAG;IAChD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,YAAY,EAAE,2BAA2B,CAAC;IAC1C,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,wBAAwB,CAAC;IACzC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,uBAAuB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,0BAA0B,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvD,4BAA4B,EAAE,MAAM,IAAI,CAAC;CAC1C,CAAC;AAuCF,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,oCAAyC,GACjD,mCAAmC,CAoNrC"}
@@ -0,0 +1,229 @@
1
+ import { useCallback, useEffect, useMemo, useState } from "react";
2
+ import { useAccount, useChainId, useDeployContract, useSwitchChain } from "wagmi";
3
+ import { mainnet } from "wagmi/chains";
4
+ import { BAND_STRATEGY_ABI } from "./bandStrategyAbi.js";
5
+ import { BAND_STRATEGY_BYTECODE } from "./bandStrategyBytecode.js";
6
+ export const DEFAULT_BAND_STRATEGY_STORAGE_KEY = "bandkit:strategy-contract-address";
7
+ function isAddress(value) {
8
+ return /^0x[a-fA-F0-9]{40}$/.test(value);
9
+ }
10
+ function getStoredAddress(storageKey) {
11
+ if (typeof window === "undefined")
12
+ return undefined;
13
+ const value = window.localStorage.getItem(storageKey);
14
+ return value && isAddress(value) ? value : undefined;
15
+ }
16
+ function getChromeWalletProvider() {
17
+ if (typeof window === "undefined")
18
+ return undefined;
19
+ return window.ethereum;
20
+ }
21
+ function isUserRejection(error) {
22
+ const maybeError = error;
23
+ const message = maybeError.message?.toLowerCase() ?? "";
24
+ return maybeError.code === 4001 || maybeError.cause?.code === 4001 || message.includes("user rejected") || message.includes("user denied");
25
+ }
26
+ function toError(error) {
27
+ if (!error)
28
+ return undefined;
29
+ if (error instanceof Error)
30
+ return error;
31
+ return new Error(String(error));
32
+ }
33
+ export function useStrategyContractDeployment(options = {}) {
34
+ const requiredChainId = options.chainId ?? mainnet.id;
35
+ const deploymentTimeoutMs = options.deploymentTimeoutMs ?? 240_000;
36
+ const storageKey = options.storageKey ?? DEFAULT_BAND_STRATEGY_STORAGE_KEY;
37
+ const chainId = useChainId();
38
+ const account = useAccount();
39
+ const { switchChainAsync } = useSwitchChain();
40
+ const [strategyContractAddress, setStrategyContractAddressState] = useState();
41
+ const [submittedDeployHash, setSubmittedDeployHash] = useState();
42
+ const [deployStatus, setDeployStatus] = useState("idle");
43
+ const [deployStatusError, setDeployStatusError] = useState();
44
+ const [contractStatus, setContractStatus] = useState("unknown");
45
+ const { deployContractAsync, error: deployError, isPending: isDeployPending } = useDeployContract();
46
+ useEffect(() => {
47
+ setStrategyContractAddressState(getStoredAddress(storageKey));
48
+ }, [storageKey]);
49
+ const setStrategyContractAddress = useCallback((address) => {
50
+ setStrategyContractAddressState(address);
51
+ setContractStatus("deployed");
52
+ if (typeof window !== "undefined") {
53
+ window.localStorage.setItem(storageKey, address);
54
+ }
55
+ }, [storageKey]);
56
+ const clearStrategyContractAddress = useCallback(() => {
57
+ setStrategyContractAddressState(undefined);
58
+ setContractStatus("unknown");
59
+ if (typeof window !== "undefined") {
60
+ window.localStorage.removeItem(storageKey);
61
+ }
62
+ }, [storageKey]);
63
+ const refetchDeploymentStatus = useCallback(async () => {
64
+ const provider = getChromeWalletProvider();
65
+ if (!provider || !strategyContractAddress) {
66
+ setContractStatus(strategyContractAddress ? "unknown" : "missing");
67
+ return;
68
+ }
69
+ setContractStatus("checking");
70
+ try {
71
+ const code = await provider.request({
72
+ method: "eth_getCode",
73
+ params: [strategyContractAddress, "latest"]
74
+ });
75
+ setContractStatus(typeof code === "string" && code !== "0x" ? "deployed" : "missing");
76
+ }
77
+ catch (error) {
78
+ setContractStatus("unknown");
79
+ setDeployStatusError(toError(error));
80
+ }
81
+ }, [strategyContractAddress]);
82
+ useEffect(() => {
83
+ void refetchDeploymentStatus();
84
+ }, [refetchDeploymentStatus]);
85
+ useEffect(() => {
86
+ if (!strategyContractAddress)
87
+ return;
88
+ const intervalId = window.setInterval(() => {
89
+ void refetchDeploymentStatus();
90
+ }, 15_000);
91
+ return () => {
92
+ window.clearInterval(intervalId);
93
+ };
94
+ }, [refetchDeploymentStatus, strategyContractAddress]);
95
+ useEffect(() => {
96
+ if (!submittedDeployHash)
97
+ return;
98
+ const provider = getChromeWalletProvider();
99
+ if (!provider) {
100
+ setDeployStatus("failed");
101
+ setDeployStatusError(new Error("Chrome wallet provider is not available."));
102
+ return;
103
+ }
104
+ const activeProvider = provider;
105
+ let cancelled = false;
106
+ const startedAt = Date.now();
107
+ async function pollReceipt() {
108
+ if (cancelled)
109
+ return;
110
+ try {
111
+ const receipt = (await activeProvider.request({
112
+ method: "eth_getTransactionReceipt",
113
+ params: [submittedDeployHash]
114
+ }));
115
+ if (!receipt) {
116
+ if (Date.now() - startedAt >= deploymentTimeoutMs) {
117
+ setDeployStatus("timeout");
118
+ setDeployStatusError(new Error("Deployment transaction was not confirmed. It may have been cancelled or replaced in the wallet."));
119
+ return;
120
+ }
121
+ window.setTimeout(() => {
122
+ void pollReceipt();
123
+ }, 4_000);
124
+ return;
125
+ }
126
+ if (receipt.status === "0x0") {
127
+ setDeployStatus("failed");
128
+ setDeployStatusError(new Error("Deployment transaction failed on-chain."));
129
+ return;
130
+ }
131
+ if (receipt.contractAddress && isAddress(receipt.contractAddress)) {
132
+ const code = await activeProvider.request({
133
+ method: "eth_getCode",
134
+ params: [receipt.contractAddress, "latest"]
135
+ });
136
+ if (typeof code === "string" && code !== "0x") {
137
+ setStrategyContractAddress(receipt.contractAddress);
138
+ setDeployStatus("deployed");
139
+ setDeployStatusError(undefined);
140
+ return;
141
+ }
142
+ }
143
+ setDeployStatus("failed");
144
+ setDeployStatusError(new Error("Deployment transaction confirmed, but no contract code was found."));
145
+ }
146
+ catch (error) {
147
+ setDeployStatus("failed");
148
+ setDeployStatusError(toError(error));
149
+ }
150
+ }
151
+ setDeployStatus("confirming");
152
+ void pollReceipt();
153
+ return () => {
154
+ cancelled = true;
155
+ };
156
+ }, [deploymentTimeoutMs, setStrategyContractAddress, submittedDeployHash]);
157
+ const deployStrategyContract = useCallback(async () => {
158
+ if (!account.isConnected)
159
+ throw new Error("Connect a wallet before deploying the strategy contract.");
160
+ if (chainId !== requiredChainId)
161
+ await switchChainAsync({ chainId: requiredChainId });
162
+ setDeployStatus("walletPending");
163
+ setDeployStatusError(undefined);
164
+ try {
165
+ const hash = await deployContractAsync({
166
+ abi: BAND_STRATEGY_ABI,
167
+ bytecode: BAND_STRATEGY_BYTECODE,
168
+ args: [options.strategyWalletAddress ?? account.address],
169
+ chainId: requiredChainId
170
+ });
171
+ setSubmittedDeployHash(hash);
172
+ setDeployStatus("confirming");
173
+ return hash;
174
+ }
175
+ catch (error) {
176
+ setDeployStatus(isUserRejection(error) ? "cancelled" : "failed");
177
+ setDeployStatusError(toError(error));
178
+ throw error;
179
+ }
180
+ }, [account.address, account.isConnected, chainId, deployContractAsync, options.strategyWalletAddress, requiredChainId, switchChainAsync]);
181
+ const error = useMemo(() => deployStatusError ?? toError(deployError), [deployError, deployStatusError]);
182
+ const deployStatusText = useMemo(() => {
183
+ if (isDeployPending)
184
+ return "Confirm in wallet";
185
+ if (deployStatus === "walletPending")
186
+ return "Confirm in wallet";
187
+ if (deployStatus === "confirming")
188
+ return "Confirming deployment";
189
+ if (deployStatus === "deployed")
190
+ return "Strategy contract deployed";
191
+ if (deployStatus === "cancelled")
192
+ return "Deployment cancelled";
193
+ if (deployStatus === "failed")
194
+ return "Deployment failed";
195
+ if (deployStatus === "timeout")
196
+ return "Deployment not confirmed";
197
+ return strategyContractAddress ? "Strategy contract address loaded" : "Not deployed";
198
+ }, [deployStatus, isDeployPending, strategyContractAddress]);
199
+ const contractStatusText = useMemo(() => {
200
+ if (!strategyContractAddress)
201
+ return "No strategy contract address";
202
+ if (contractStatus === "checking")
203
+ return "Checking contract";
204
+ if (contractStatus === "deployed")
205
+ return "Contract live";
206
+ if (contractStatus === "missing")
207
+ return "No contract found at stored address";
208
+ return "Contract status unknown";
209
+ }, [contractStatus, strategyContractAddress]);
210
+ return {
211
+ strategyContractAddress,
212
+ deployHash: submittedDeployHash,
213
+ deployStatus,
214
+ deployStatusText,
215
+ contractStatus,
216
+ contractStatusText,
217
+ isConnected: account.isConnected,
218
+ isCorrectChain: chainId === requiredChainId,
219
+ isDeployPending,
220
+ isDeploying: deployStatus === "walletPending" || deployStatus === "confirming",
221
+ isDeployed: contractStatus === "deployed" && Boolean(strategyContractAddress),
222
+ error,
223
+ deployStrategyContract,
224
+ refetchDeploymentStatus,
225
+ setStrategyContractAddress,
226
+ clearStrategyContractAddress
227
+ };
228
+ }
229
+ //# sourceMappingURL=useStrategyContractDeployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStrategyContractDeployment.js","sourceRoot":"","sources":["../src/useStrategyContractDeployment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type Address } from "viem";
2
+ export type UseWalletEthBalanceOptions = {
3
+ address?: Address;
4
+ chainId?: number;
5
+ };
6
+ export type UseWalletEthBalanceResult = {
7
+ address?: Address;
8
+ balanceWei: bigint;
9
+ balanceEth: string;
10
+ formatted: string;
11
+ symbol: string;
12
+ isLoading: boolean;
13
+ error?: Error;
14
+ refetch: () => void;
15
+ };
16
+ export declare function useWalletEthBalance(options?: UseWalletEthBalanceOptions): UseWalletEthBalanceResult;
17
+ //# sourceMappingURL=useWalletEthBalance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWalletEthBalance.d.ts","sourceRoot":"","sources":["../src/useWalletEthBalance.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AAIjD,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAqBF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,yBAAyB,CA2FvG"}