@luxfi/exchange 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 (154) hide show
  1. package/dist/bridge/__tests__/use-private-teleport.test.d.ts +2 -0
  2. package/dist/bridge/__tests__/use-private-teleport.test.d.ts.map +1 -0
  3. package/dist/bridge/__tests__/use-private-teleport.test.js +272 -0
  4. package/dist/bridge/cross-chain-store.d.ts +57 -0
  5. package/dist/bridge/cross-chain-store.d.ts.map +1 -0
  6. package/dist/bridge/cross-chain-store.js +158 -0
  7. package/dist/bridge/index.d.ts +78 -0
  8. package/dist/bridge/index.d.ts.map +1 -0
  9. package/dist/bridge/index.js +79 -0
  10. package/dist/bridge/private-teleport-types.d.ts +634 -0
  11. package/dist/bridge/private-teleport-types.d.ts.map +1 -0
  12. package/dist/bridge/private-teleport-types.js +308 -0
  13. package/dist/bridge/types.d.ts +84 -0
  14. package/dist/bridge/types.d.ts.map +1 -0
  15. package/dist/bridge/types.js +37 -0
  16. package/dist/bridge/use-cross-chain-mint.d.ts +34 -0
  17. package/dist/bridge/use-cross-chain-mint.d.ts.map +1 -0
  18. package/dist/bridge/use-cross-chain-mint.js +228 -0
  19. package/dist/bridge/use-private-teleport.d.ts +69 -0
  20. package/dist/bridge/use-private-teleport.d.ts.map +1 -0
  21. package/dist/bridge/use-private-teleport.js +666 -0
  22. package/dist/chains/index.d.ts +6 -0
  23. package/dist/chains/index.d.ts.map +1 -0
  24. package/dist/chains/index.js +6 -0
  25. package/dist/chains/lux.d.ts +508 -0
  26. package/dist/chains/lux.d.ts.map +1 -0
  27. package/dist/chains/lux.js +131 -0
  28. package/dist/contracts/abis/dex-swap-router.d.ts +137 -0
  29. package/dist/contracts/abis/dex-swap-router.d.ts.map +1 -0
  30. package/dist/contracts/abis/dex-swap-router.js +95 -0
  31. package/dist/contracts/abis/erc20.d.ts +136 -0
  32. package/dist/contracts/abis/erc20.d.ts.map +1 -0
  33. package/dist/contracts/abis/erc20.js +96 -0
  34. package/dist/contracts/abis/index.d.ts +15 -0
  35. package/dist/contracts/abis/index.d.ts.map +1 -0
  36. package/dist/contracts/abis/index.js +15 -0
  37. package/dist/contracts/abis/nft-position-manager.d.ts +235 -0
  38. package/dist/contracts/abis/nft-position-manager.d.ts.map +1 -0
  39. package/dist/contracts/abis/nft-position-manager.js +146 -0
  40. package/dist/contracts/abis/pool-manager.d.ts +315 -0
  41. package/dist/contracts/abis/pool-manager.d.ts.map +1 -0
  42. package/dist/contracts/abis/pool-manager.js +191 -0
  43. package/dist/contracts/abis/quoter-v2.d.ts +103 -0
  44. package/dist/contracts/abis/quoter-v2.d.ts.map +1 -0
  45. package/dist/contracts/abis/quoter-v2.js +68 -0
  46. package/dist/contracts/abis/swap-router.d.ts +119 -0
  47. package/dist/contracts/abis/swap-router.d.ts.map +1 -0
  48. package/dist/contracts/abis/swap-router.js +75 -0
  49. package/dist/contracts/abis/uniswap-v2-factory.d.ts +75 -0
  50. package/dist/contracts/abis/uniswap-v2-factory.d.ts.map +1 -0
  51. package/dist/contracts/abis/uniswap-v2-factory.js +49 -0
  52. package/dist/contracts/abis/uniswap-v2-pair.d.ts +119 -0
  53. package/dist/contracts/abis/uniswap-v2-pair.d.ts.map +1 -0
  54. package/dist/contracts/abis/uniswap-v2-pair.js +85 -0
  55. package/dist/contracts/abis/uniswap-v2-router.d.ts +249 -0
  56. package/dist/contracts/abis/uniswap-v2-router.d.ts.map +1 -0
  57. package/dist/contracts/abis/uniswap-v2-router.js +146 -0
  58. package/dist/contracts/abis/uniswap-v3-factory.d.ts +77 -0
  59. package/dist/contracts/abis/uniswap-v3-factory.d.ts.map +1 -0
  60. package/dist/contracts/abis/uniswap-v3-factory.js +45 -0
  61. package/dist/contracts/abis/uniswap-v3-pool.d.ts +128 -0
  62. package/dist/contracts/abis/uniswap-v3-pool.d.ts.map +1 -0
  63. package/dist/contracts/abis/uniswap-v3-pool.js +81 -0
  64. package/dist/contracts/addresses.d.ts +141 -0
  65. package/dist/contracts/addresses.d.ts.map +1 -0
  66. package/dist/contracts/addresses.js +108 -0
  67. package/dist/contracts/index.d.ts +6 -0
  68. package/dist/contracts/index.d.ts.map +1 -0
  69. package/dist/contracts/index.js +5 -0
  70. package/dist/dex/balance-delta.d.ts +27 -0
  71. package/dist/dex/balance-delta.d.ts.map +1 -0
  72. package/dist/dex/balance-delta.js +45 -0
  73. package/dist/dex/index.d.ts +7 -0
  74. package/dist/dex/index.d.ts.map +1 -0
  75. package/dist/dex/index.js +6 -0
  76. package/dist/dex/pool-key.d.ts +19 -0
  77. package/dist/dex/pool-key.d.ts.map +1 -0
  78. package/dist/dex/pool-key.js +44 -0
  79. package/dist/dex/types.d.ts +71 -0
  80. package/dist/dex/types.d.ts.map +1 -0
  81. package/dist/dex/types.js +28 -0
  82. package/dist/hooks/index.d.ts +10 -0
  83. package/dist/hooks/index.d.ts.map +1 -0
  84. package/dist/hooks/index.js +9 -0
  85. package/dist/hooks/use-pools.d.ts +24 -0
  86. package/dist/hooks/use-pools.d.ts.map +1 -0
  87. package/dist/hooks/use-pools.js +85 -0
  88. package/dist/hooks/use-positions.d.ts +17 -0
  89. package/dist/hooks/use-positions.d.ts.map +1 -0
  90. package/dist/hooks/use-positions.js +65 -0
  91. package/dist/hooks/use-swap-quote.d.ts +19 -0
  92. package/dist/hooks/use-swap-quote.d.ts.map +1 -0
  93. package/dist/hooks/use-swap-quote.js +54 -0
  94. package/dist/hooks/use-swap.d.ts +22 -0
  95. package/dist/hooks/use-swap.d.ts.map +1 -0
  96. package/dist/hooks/use-swap.js +46 -0
  97. package/dist/hooks/use-token-allowance.d.ts +27 -0
  98. package/dist/hooks/use-token-allowance.d.ts.map +1 -0
  99. package/dist/hooks/use-token-allowance.js +59 -0
  100. package/dist/hooks/use-token-balance.d.ts +17 -0
  101. package/dist/hooks/use-token-balance.d.ts.map +1 -0
  102. package/dist/hooks/use-token-balance.js +58 -0
  103. package/dist/index.d.ts +17 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +24 -0
  106. package/dist/stores/index.d.ts +7 -0
  107. package/dist/stores/index.d.ts.map +1 -0
  108. package/dist/stores/index.js +6 -0
  109. package/dist/stores/settings-store.d.ts +25 -0
  110. package/dist/stores/settings-store.d.ts.map +1 -0
  111. package/dist/stores/settings-store.js +16 -0
  112. package/dist/stores/swap-store.d.ts +38 -0
  113. package/dist/stores/swap-store.d.ts.map +1 -0
  114. package/dist/stores/swap-store.js +58 -0
  115. package/dist/stores/token-store.d.ts +21 -0
  116. package/dist/stores/token-store.d.ts.map +1 -0
  117. package/dist/stores/token-store.js +32 -0
  118. package/dist/tokens/index.d.ts +65 -0
  119. package/dist/tokens/index.d.ts.map +1 -0
  120. package/dist/tokens/index.js +185 -0
  121. package/package.json +78 -0
  122. package/src/chains/index.ts +21 -0
  123. package/src/chains/lux.ts +141 -0
  124. package/src/contracts/abis/dex-swap-router.ts +98 -0
  125. package/src/contracts/abis/erc20.ts +96 -0
  126. package/src/contracts/abis/index.ts +17 -0
  127. package/src/contracts/abis/nft-position-manager.ts +146 -0
  128. package/src/contracts/abis/pool-manager.ts +198 -0
  129. package/src/contracts/abis/quoter-v2.ts +68 -0
  130. package/src/contracts/abis/swap-router.ts +75 -0
  131. package/src/contracts/abis/uniswap-v2-factory.ts +49 -0
  132. package/src/contracts/abis/uniswap-v2-pair.ts +85 -0
  133. package/src/contracts/abis/uniswap-v2-router.ts +146 -0
  134. package/src/contracts/abis/uniswap-v3-factory.ts +45 -0
  135. package/src/contracts/abis/uniswap-v3-pool.ts +81 -0
  136. package/src/contracts/addresses.ts +128 -0
  137. package/src/contracts/index.ts +14 -0
  138. package/src/dex/balance-delta.ts +52 -0
  139. package/src/dex/index.ts +7 -0
  140. package/src/dex/pool-key.ts +62 -0
  141. package/src/dex/types.ts +87 -0
  142. package/src/hooks/index.ts +10 -0
  143. package/src/hooks/use-pools.ts +116 -0
  144. package/src/hooks/use-positions.ts +90 -0
  145. package/src/hooks/use-swap-quote.ts +81 -0
  146. package/src/hooks/use-swap.ts +64 -0
  147. package/src/hooks/use-token-allowance.ts +74 -0
  148. package/src/hooks/use-token-balance.ts +71 -0
  149. package/src/index.ts +31 -0
  150. package/src/stores/index.ts +7 -0
  151. package/src/stores/settings-store.ts +54 -0
  152. package/src/stores/swap-store.ts +112 -0
  153. package/src/stores/token-store.ts +62 -0
  154. package/src/tokens/index.ts +220 -0
@@ -0,0 +1,228 @@
1
+ /**
2
+ * React hook for one-click cross-chain minting
3
+ *
4
+ * Enables users to mint wrapped tokens on C-Chain from X-Chain assets
5
+ * with a single transaction using Warp atomic swaps.
6
+ */
7
+ import { useCallback, useEffect, useState } from 'react';
8
+ import { usePublicClient, useWalletClient } from 'wagmi';
9
+ import { encodeFunctionData, parseAbi } from 'viem';
10
+ import { useCrossChainStore } from './cross-chain-store';
11
+ import { DEFAULT_SWAP_CONFIG, getWrappedToken } from './types';
12
+ // AtomicSwapBridge contract ABI (minimal interface)
13
+ const BRIDGE_ABI = parseAbi([
14
+ 'function initiateMint(bytes32 swapId, address recipient, bytes32 asset, uint256 amount, uint256 minReceive, uint64 deadline, tuple(address tokenIn, address tokenOut, uint24 poolFee, int24 tickSpacing, address hooks)[] routes) external payable',
15
+ 'function processLockMessage(uint32 messageIndex) external',
16
+ 'function executeSwap(bytes32 swapId, tuple(address tokenIn, address tokenOut, uint24 poolFee, int24 tickSpacing, address hooks)[] routes) external',
17
+ 'function settleSwap(bytes32 swapId, bytes32 preimage) external',
18
+ 'function cancelSwap(bytes32 swapId) external',
19
+ 'function getSwapState(bytes32 swapId) external view returns (uint8 state, address sender, address recipient, bytes32 asset, uint256 amount, uint256 minReceive, uint64 deadline)',
20
+ 'event SwapInitiated(bytes32 indexed swapId, address indexed sender, address indexed recipient, bytes32 asset, uint256 amount)',
21
+ 'event SwapCompleted(bytes32 indexed swapId, uint256 amountReceived)',
22
+ 'event SwapCancelled(bytes32 indexed swapId)',
23
+ ]);
24
+ export function useCrossChainMint(options = {}) {
25
+ const { config: configOverrides, pollInterval = 5000 } = options;
26
+ const config = { ...DEFAULT_SWAP_CONFIG, ...configOverrides };
27
+ const publicClient = usePublicClient();
28
+ const { data: walletClient } = useWalletClient();
29
+ const store = useCrossChainStore();
30
+ const [isLoading, setIsLoading] = useState(false);
31
+ const [error, setError] = useState(null);
32
+ /**
33
+ * Initiate a one-click cross-chain mint
34
+ */
35
+ const mint = useCallback(async (request) => {
36
+ if (!walletClient) {
37
+ throw new Error('Wallet not connected');
38
+ }
39
+ setIsLoading(true);
40
+ setError(null);
41
+ try {
42
+ // Validate the asset has a wrapped token mapping
43
+ const wrappedToken = getWrappedToken(request.sourceAsset);
44
+ if (!wrappedToken) {
45
+ throw new Error('Asset not supported for cross-chain mint');
46
+ }
47
+ // Create the full request with deadline
48
+ const fullRequest = {
49
+ ...request,
50
+ deadline: request.deadline ?? Math.floor(Date.now() / 1000) + config.defaultDeadline,
51
+ };
52
+ // Initialize in store
53
+ const swapId = store.initiateMint(fullRequest);
54
+ store.updateMintStatus(swapId, 'locking');
55
+ // Build swap routes if target token specified
56
+ const routes = [];
57
+ if (request.targetToken && request.targetToken !== wrappedToken) {
58
+ routes.push({
59
+ tokenIn: wrappedToken,
60
+ tokenOut: request.targetToken,
61
+ poolFee: 3000, // 0.3% default
62
+ tickSpacing: 60,
63
+ });
64
+ }
65
+ // Prepare transaction data
66
+ const txData = encodeFunctionData({
67
+ abi: BRIDGE_ABI,
68
+ functionName: 'initiateMint',
69
+ args: [
70
+ swapId,
71
+ request.recipient,
72
+ request.sourceAsset,
73
+ request.amount,
74
+ request.minReceive ?? BigInt(0),
75
+ BigInt(fullRequest.deadline),
76
+ routes.map((r) => ({
77
+ tokenIn: r.tokenIn,
78
+ tokenOut: r.tokenOut,
79
+ poolFee: r.poolFee,
80
+ tickSpacing: r.tickSpacing,
81
+ hooks: r.hooks ?? '0x0000000000000000000000000000000000000000',
82
+ })),
83
+ ],
84
+ });
85
+ // Send transaction to bridge contract
86
+ const hash = await walletClient.sendTransaction({
87
+ to: config.bridgeContract,
88
+ data: txData,
89
+ value: BigInt(0), // Native assets locked via XVM, not ETH
90
+ });
91
+ store.updateMintTxHash(swapId, 'sourceTxHash', hash);
92
+ store.updateMintStatus(swapId, 'waiting_confirmation');
93
+ // Wait for transaction confirmation
94
+ if (publicClient) {
95
+ const receipt = await publicClient.waitForTransactionReceipt({ hash });
96
+ if (receipt.status === 'success') {
97
+ // Transaction was included, now waiting for Warp message
98
+ store.updateMintStatus(swapId, 'minting');
99
+ // The bridge contract handles the rest:
100
+ // 1. Warp message is sent to destination chain
101
+ // 2. Validators sign the message
102
+ // 3. Message is processed, wrapped tokens minted
103
+ // 4. Optional DEX swap executed
104
+ // 5. Tokens delivered to recipient
105
+ }
106
+ else {
107
+ store.failMint(swapId, 'Transaction failed');
108
+ }
109
+ }
110
+ return swapId;
111
+ }
112
+ catch (err) {
113
+ const errorMessage = err instanceof Error ? err.message : 'Unknown error';
114
+ setError(errorMessage);
115
+ throw err;
116
+ }
117
+ finally {
118
+ setIsLoading(false);
119
+ }
120
+ }, [walletClient, publicClient, store, config]);
121
+ /**
122
+ * Cancel a pending mint after deadline
123
+ */
124
+ const cancel = useCallback(async (swapId) => {
125
+ if (!walletClient) {
126
+ throw new Error('Wallet not connected');
127
+ }
128
+ const pending = store.getPendingMint(swapId);
129
+ if (!pending) {
130
+ throw new Error('Mint not found');
131
+ }
132
+ // Check deadline
133
+ if (pending.deadline > Date.now() / 1000) {
134
+ throw new Error('Cannot cancel before deadline');
135
+ }
136
+ const txData = encodeFunctionData({
137
+ abi: BRIDGE_ABI,
138
+ functionName: 'cancelSwap',
139
+ args: [swapId],
140
+ });
141
+ const hash = await walletClient.sendTransaction({
142
+ to: config.bridgeContract,
143
+ data: txData,
144
+ });
145
+ if (publicClient) {
146
+ await publicClient.waitForTransactionReceipt({ hash });
147
+ }
148
+ store.cancelMint(swapId);
149
+ }, [walletClient, publicClient, store, config]);
150
+ /**
151
+ * Get mint state by swap ID
152
+ */
153
+ const getMintState = useCallback((swapId) => {
154
+ return store.getPendingMint(swapId)?.state;
155
+ }, [store]);
156
+ /**
157
+ * Poll for status updates on active mints
158
+ */
159
+ useEffect(() => {
160
+ if (!publicClient)
161
+ return;
162
+ const activeMints = store.getActiveMints();
163
+ if (activeMints.length === 0)
164
+ return;
165
+ const pollStatuses = async () => {
166
+ for (const mint of activeMints) {
167
+ if (!mint.state.swapId)
168
+ continue;
169
+ try {
170
+ // Query on-chain state
171
+ const state = await publicClient.readContract({
172
+ address: config.bridgeContract,
173
+ abi: BRIDGE_ABI,
174
+ functionName: 'getSwapState',
175
+ args: [mint.state.swapId],
176
+ });
177
+ // Map on-chain state to our status
178
+ const [onChainState] = state;
179
+ let newStatus = mint.state.status;
180
+ switch (onChainState) {
181
+ case 0: // Pending
182
+ newStatus = 'waiting_confirmation';
183
+ break;
184
+ case 1: // Locked
185
+ newStatus = 'locking';
186
+ break;
187
+ case 2: // Minted
188
+ newStatus = 'minting';
189
+ break;
190
+ case 3: // Swapped
191
+ newStatus = 'swapping';
192
+ break;
193
+ case 4: // Settled
194
+ newStatus = 'complete';
195
+ store.completeMint(mint.state.swapId);
196
+ break;
197
+ case 5: // Cancelled
198
+ newStatus = 'cancelled';
199
+ store.cancelMint(mint.state.swapId);
200
+ break;
201
+ case 6: // Expired
202
+ newStatus = 'failed';
203
+ store.failMint(mint.state.swapId, 'Swap expired');
204
+ break;
205
+ }
206
+ if (newStatus !== mint.state.status && onChainState < 4) {
207
+ store.updateMintStatus(mint.state.swapId, newStatus);
208
+ }
209
+ }
210
+ catch {
211
+ // Ignore polling errors
212
+ }
213
+ }
214
+ };
215
+ pollStatuses();
216
+ const interval = setInterval(pollStatuses, pollInterval);
217
+ return () => clearInterval(interval);
218
+ }, [publicClient, store, config, pollInterval]);
219
+ return {
220
+ mint,
221
+ cancel,
222
+ getMintState,
223
+ activeMints: store.pendingMints,
224
+ recentMints: store.recentMints,
225
+ isLoading,
226
+ error,
227
+ };
228
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Private Teleport Hook
3
+ *
4
+ * React hook for cross-chain private teleportation
5
+ * Enables: XVM UTXO → ZNote (shielded) → Z-Chain AMM → destination
6
+ */
7
+ import { type PrivateTeleportConfig, type PrivateTeleportRequest, type TeleportRecord, type TeleportState } from './private-teleport-types';
8
+ export interface UsePrivateTeleportOptions {
9
+ /** Custom config */
10
+ config?: Partial<PrivateTeleportConfig>;
11
+ /** Enable auto-polling for teleport status */
12
+ pollInterval?: number;
13
+ /** Callback when teleport state changes */
14
+ onStateChange?: (teleportId: string, state: TeleportState) => void;
15
+ }
16
+ /** Private transfer request to another recipient */
17
+ export interface PrivateTransferRequest {
18
+ teleportId: string;
19
+ /** Recipient's viewing public key (for note encryption) */
20
+ recipientViewKey: `0x${string}`;
21
+ /** Amount to send (will generate new commitment) */
22
+ amount: bigint;
23
+ /** Optional: change amount back to sender */
24
+ changeAmount?: bigint;
25
+ }
26
+ /** Unshield request to X-Chain */
27
+ export interface UnshieldToXChainRequest {
28
+ teleportId: string;
29
+ /** X-Chain destination address (bech32 format) */
30
+ destinationAddress: string;
31
+ /** Amount to unshield (must match commitment) */
32
+ amount: bigint;
33
+ }
34
+ export interface UsePrivateTeleportReturn {
35
+ /** Initiate a private teleport */
36
+ teleport: (request: PrivateTeleportRequest) => Promise<string>;
37
+ /** Execute private swap on Z-Chain AMM */
38
+ executeSwap: (teleportId: string, poolId: string, minOutput: bigint) => Promise<void>;
39
+ /** Export to C-Chain (unshield) */
40
+ exportToDestination: (teleportId: string) => Promise<void>;
41
+ /** Unshield back to X-Chain UTXO */
42
+ unshieldToXChain: (request: UnshieldToXChainRequest) => Promise<string>;
43
+ /** Private transfer to another recipient (stays shielded) */
44
+ privateTransfer: (request: PrivateTransferRequest) => Promise<number>;
45
+ /** Split note into payment + change */
46
+ splitAndTransfer: (teleportId: string, outputs: Array<{
47
+ recipient: `0x${string}`;
48
+ amount: bigint;
49
+ }>) => Promise<number[]>;
50
+ /** Complete teleport after confirmation */
51
+ completeTeleport: (teleportId: string, warpConfirmation: `0x${string}`) => Promise<void>;
52
+ /** Cancel teleport */
53
+ cancelTeleport: (teleportId: string) => Promise<void>;
54
+ /** Get teleport record */
55
+ getTeleport: (teleportId: string) => Promise<TeleportRecord | null>;
56
+ /** Check if teleport is complete */
57
+ isComplete: (teleportId: string) => Promise<boolean>;
58
+ /** Current teleport ID (if any) */
59
+ currentTeleportId: string | null;
60
+ /** Current teleport state */
61
+ currentState: TeleportState | null;
62
+ /** Loading state */
63
+ isLoading: boolean;
64
+ /** Error state */
65
+ error: Error | null;
66
+ }
67
+ export declare function usePrivateTeleport(options?: UsePrivateTeleportOptions): UsePrivateTeleportReturn;
68
+ export type { PrivateTeleportRequest, TeleportRecord, TeleportState, PrivateTeleportConfig, } from './private-teleport-types';
69
+ //# sourceMappingURL=use-private-teleport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-private-teleport.d.ts","sourceRoot":"","sources":["../../src/bridge/use-private-teleport.ts"],"names":[],"mappings":"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"}