@luxfi/exchange 0.1.0 → 1.0.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.
- package/dist/bridge/use-private-teleport.d.ts +1 -1
- package/dist/bridge/use-private-teleport.d.ts.map +1 -1
- package/dist/bridge/use-private-teleport.js +73 -71
- package/dist/contracts/abis/amm-v2-factory.d.ts +148 -0
- package/dist/contracts/abis/amm-v2-factory.d.ts.map +1 -0
- package/dist/contracts/abis/amm-v2-factory.js +52 -0
- package/dist/contracts/abis/amm-v2-pair.d.ts +236 -0
- package/dist/contracts/abis/amm-v2-pair.d.ts.map +1 -0
- package/dist/contracts/abis/amm-v2-pair.js +88 -0
- package/dist/contracts/abis/amm-v2-router.d.ts +496 -0
- package/dist/contracts/abis/amm-v2-router.d.ts.map +1 -0
- package/dist/contracts/abis/amm-v2-router.js +149 -0
- package/dist/contracts/abis/amm-v3-factory.d.ts +152 -0
- package/dist/contracts/abis/amm-v3-factory.d.ts.map +1 -0
- package/dist/contracts/abis/amm-v3-factory.js +48 -0
- package/dist/contracts/abis/amm-v3-pool.d.ts +254 -0
- package/dist/contracts/abis/amm-v3-pool.d.ts.map +1 -0
- package/dist/contracts/abis/amm-v3-pool.js +84 -0
- package/dist/contracts/abis/index.d.ts +8 -5
- package/dist/contracts/abis/index.d.ts.map +1 -1
- package/dist/contracts/abis/index.js +13 -6
- package/dist/contracts/abis/lux-amm-v2-factory.d.ts +148 -0
- package/dist/contracts/abis/lux-amm-v2-factory.d.ts.map +1 -0
- package/dist/contracts/abis/lux-amm-v2-factory.js +52 -0
- package/dist/contracts/abis/lux-amm-v2-pair.d.ts +236 -0
- package/dist/contracts/abis/lux-amm-v2-pair.d.ts.map +1 -0
- package/dist/contracts/abis/lux-amm-v2-pair.js +88 -0
- package/dist/contracts/abis/lux-amm-v2-router.d.ts +496 -0
- package/dist/contracts/abis/lux-amm-v2-router.d.ts.map +1 -0
- package/dist/contracts/abis/lux-amm-v2-router.js +149 -0
- package/dist/contracts/abis/lux-amm-v3-factory.d.ts +152 -0
- package/dist/contracts/abis/lux-amm-v3-factory.d.ts.map +1 -0
- package/dist/contracts/abis/lux-amm-v3-factory.js +48 -0
- package/dist/contracts/abis/lux-amm-v3-pool.d.ts +254 -0
- package/dist/contracts/abis/lux-amm-v3-pool.d.ts.map +1 -0
- package/dist/contracts/abis/lux-amm-v3-pool.js +84 -0
- package/dist/contracts/addresses.d.ts +18 -48
- package/dist/contracts/addresses.d.ts.map +1 -1
- package/dist/contracts/addresses.js +30 -22
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/tokens/index.d.ts +25 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +90 -5
- package/package.json +6 -2
- package/src/bridge/cross-chain-store.ts +210 -0
- package/src/bridge/index.ts +81 -0
- package/src/bridge/private-teleport-types.ts +578 -0
- package/src/bridge/types.ts +125 -0
- package/src/bridge/use-cross-chain-mint.ts +299 -0
- package/src/bridge/use-private-teleport.ts +951 -0
- package/src/contracts/abis/{uniswap-v2-factory.ts → amm-v2-factory.ts} +6 -2
- package/src/contracts/abis/{uniswap-v2-pair.ts → amm-v2-pair.ts} +6 -2
- package/src/contracts/abis/{uniswap-v2-router.ts → amm-v2-router.ts} +6 -2
- package/src/contracts/abis/{uniswap-v3-factory.ts → amm-v3-factory.ts} +6 -2
- package/src/contracts/abis/{uniswap-v3-pool.ts → amm-v3-pool.ts} +6 -2
- package/src/contracts/abis/index.ts +16 -6
- package/src/contracts/abis/pool-manager.ts +1 -1
- package/src/contracts/addresses.ts +53 -52
- package/src/hooks/use-pools.ts +8 -6
- package/src/hooks/use-positions.ts +3 -3
- package/src/hooks/use-swap-quote.ts +1 -1
- package/src/hooks/use-swap.ts +1 -1
- package/src/index.ts +2 -2
- package/src/tokens/index.ts +148 -32
- package/dist/bridge/__tests__/use-private-teleport.test.d.ts +0 -2
- package/dist/bridge/__tests__/use-private-teleport.test.d.ts.map +0 -1
- package/dist/bridge/__tests__/use-private-teleport.test.js +0 -272
|
@@ -30,6 +30,10 @@ export const LUX_TESTNET_CONTRACTS = {
|
|
|
30
30
|
WLUX: '0x732740c5c895C9FCF619930ed4293fc858eb44c7',
|
|
31
31
|
WETH: '0xd9956542B51032d940ef076d70B69410667277A3',
|
|
32
32
|
MULTICALL: '0xd25F88CBdAe3c2CCA3Bb75FC4E723b44C0Ea362F',
|
|
33
|
+
// Bridge tokens (testnet deployments)
|
|
34
|
+
LETH: '0x60E0a8167FC13dE89348978860466C9ceC24B9ba',
|
|
35
|
+
LBTC: '0x1E48D32a4F5e9f08DB9aE4959163300FaF8A6C8e',
|
|
36
|
+
LUSD: '0xb84112ac9318a0b2319aa11d4d10e9762b25f7f4',
|
|
33
37
|
// AMM V2
|
|
34
38
|
V2_FACTORY: '0x81C3669B139D92909AA67DbF74a241b10540d919',
|
|
35
39
|
V2_ROUTER: '0xDB6c703c80BFaE5F9a56482d3c8535f27E1136EB',
|
|
@@ -44,38 +48,42 @@ export const LUX_TESTNET_CONTRACTS = {
|
|
|
44
48
|
V3_NFT_DESCRIPTOR: '0x53B1aAA5b6DDFD4eD00D0A7b5Ef333dc74B605b5',
|
|
45
49
|
};
|
|
46
50
|
/**
|
|
47
|
-
* DEX Precompile addresses (native AMM)
|
|
48
|
-
* These provide sub-microsecond execution
|
|
51
|
+
* DEX Precompile addresses (native AMM - Uniswap v4 style singleton PoolManager)
|
|
52
|
+
* These provide sub-microsecond execution via native Go implementation
|
|
49
53
|
*
|
|
50
|
-
*
|
|
51
|
-
* -
|
|
52
|
-
* -
|
|
54
|
+
* Address format: 0x0000...00LPNUMBER (addresses end with LP number)
|
|
55
|
+
* LP-9010: DEX Precompile - Native HFT Order Book (PoolManager)
|
|
56
|
+
* LP-9011: Oracle Precompile - Multi-Source Price Aggregation
|
|
53
57
|
*
|
|
54
|
-
* @see ~/work/lux/precompile/
|
|
58
|
+
* @see ~/work/lux/precompile/registry/registry.go for the full address scheme
|
|
59
|
+
* @see ~/work/lux/dex/pkg/gateway/lux/provider.go for gateway implementation
|
|
55
60
|
*/
|
|
56
61
|
export const DEX_PRECOMPILES = {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
// Core DEX (LP-9010 series - Uniswap v4 style)
|
|
63
|
+
POOL_MANAGER: '0x0000000000000000000000000000000000009010', // LP-9010
|
|
64
|
+
SWAP_ROUTER: '0x0000000000000000000000000000000000009012', // LP-9012
|
|
65
|
+
HOOKS_REGISTRY: '0x0000000000000000000000000000000000009013', // LP-9013
|
|
66
|
+
FLASH_LOAN: '0x0000000000000000000000000000000000009014', // LP-9014
|
|
67
|
+
// DeFi Extensions
|
|
68
|
+
ORACLE_HUB: '0x0000000000000000000000000000000000009011', // LP-9011
|
|
69
|
+
CLOB: '0x0000000000000000000000000000000000009020', // LP-9020
|
|
70
|
+
VAULT: '0x0000000000000000000000000000000000009030', // LP-9030
|
|
71
|
+
// Bridges (LP-6xxx)
|
|
72
|
+
TELEPORT: '0x0000000000000000000000000000000000006010', // LP-6010
|
|
64
73
|
};
|
|
65
74
|
/**
|
|
66
75
|
* Contract addresses for Lux Dev (1337)
|
|
76
|
+
* Deterministic CREATE addresses from DeployFullStack.s.sol deployed by anvil account 0
|
|
77
|
+
* Account 0: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
|
|
67
78
|
*/
|
|
68
79
|
export const LUX_DEV_CONTRACTS = {
|
|
69
|
-
// Core
|
|
70
|
-
WLUX: '
|
|
80
|
+
// Core - Nonce 0
|
|
81
|
+
WLUX: '0x5FbDB2315678afecb367f032d93F642f64180aa3',
|
|
71
82
|
MULTICALL: '0xd25F88CBdAe3c2CCA3Bb75FC4E723b44C0Ea362F',
|
|
72
|
-
// Bridged tokens (
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
USDT: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9',
|
|
77
|
-
DAI: '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9',
|
|
78
|
-
AI: '0x0B306BF915C4d645ff596e518fAf3F9669b97016',
|
|
83
|
+
// Bridged tokens (deterministic deployment nonces 1-3)
|
|
84
|
+
LETH: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512', // Nonce 1
|
|
85
|
+
LBTC: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0', // Nonce 2
|
|
86
|
+
LUSD: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', // Nonce 3
|
|
79
87
|
// AMM V2
|
|
80
88
|
V2_FACTORY: '0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1',
|
|
81
89
|
V2_ROUTER: '0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE',
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,cAAc,UAAU,CAAA;AAGxB,cAAc,UAAU,CAAA;AAGxB,cAAc,aAAa,CAAA;AAG3B,cAAc,OAAO,CAAA;AAGrB,cAAc,SAAS,CAAA;AAGvB,cAAc,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,cAAc,UAAU,CAAA;AAGxB,cAAc,UAAU,CAAA;AAGxB,cAAc,aAAa,CAAA;AAG3B,cAAc,OAAO,CAAA;AAGrB,cAAc,SAAS,CAAA;AAGvB,cAAc,UAAU,CAAA;AAGxB,cAAc,UAAU,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -20,5 +20,5 @@ export * from './dex';
|
|
|
20
20
|
export * from './hooks';
|
|
21
21
|
// Stores
|
|
22
22
|
export * from './stores';
|
|
23
|
-
//
|
|
24
|
-
|
|
23
|
+
// Bridge (cross-chain + Z-Chain privacy layer)
|
|
24
|
+
export * from './bridge';
|
package/dist/tokens/index.d.ts
CHANGED
|
@@ -28,9 +28,22 @@ export declare const WLUX_DEV: Token;
|
|
|
28
28
|
export declare const LUSD: Token;
|
|
29
29
|
/**
|
|
30
30
|
* Bridge tokens (L-prefix for assets bridged to Lux)
|
|
31
|
+
* These are the canonical mainnet addresses from @luxfi/config
|
|
31
32
|
*/
|
|
32
33
|
export declare const LETH: Token;
|
|
33
34
|
export declare const LBTC: Token;
|
|
35
|
+
/**
|
|
36
|
+
* Testnet bridge tokens
|
|
37
|
+
*/
|
|
38
|
+
export declare const LETH_TESTNET: Token;
|
|
39
|
+
export declare const LBTC_TESTNET: Token;
|
|
40
|
+
export declare const LUSD_TESTNET: Token;
|
|
41
|
+
/**
|
|
42
|
+
* Dev mode bridge tokens (deterministic CREATE addresses)
|
|
43
|
+
*/
|
|
44
|
+
export declare const LETH_DEV: Token;
|
|
45
|
+
export declare const LBTC_DEV: Token;
|
|
46
|
+
export declare const LUSD_DEV: Token;
|
|
34
47
|
/**
|
|
35
48
|
* Major tokens on Lux Mainnet
|
|
36
49
|
*/
|
|
@@ -54,6 +67,18 @@ export declare const LUX_MAINNET_TOKENS: Token[];
|
|
|
54
67
|
* Default token list for Zoo Mainnet
|
|
55
68
|
*/
|
|
56
69
|
export declare const ZOO_MAINNET_TOKENS: Token[];
|
|
70
|
+
/**
|
|
71
|
+
* Default token list for Lux Testnet
|
|
72
|
+
*/
|
|
73
|
+
export declare const LUX_TESTNET_TOKENS: Token[];
|
|
74
|
+
/**
|
|
75
|
+
* Default token list for Lux Dev
|
|
76
|
+
*/
|
|
77
|
+
export declare const LUX_DEV_TOKENS: Token[];
|
|
78
|
+
/**
|
|
79
|
+
* Get tokens for a chain
|
|
80
|
+
*/
|
|
81
|
+
export declare function getTokensForChain(chainId: number): Token[];
|
|
57
82
|
/**
|
|
58
83
|
* Get wrapped native token for chain
|
|
59
84
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAOtB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,KAMlB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,KAMlB,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,KAMlB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,KAMlB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,EAWrC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,EAMrC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,EAKrC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,EAKjC,CAAA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAa1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAWnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEnD"}
|
package/dist/tokens/index.js
CHANGED
|
@@ -35,7 +35,8 @@ export const WLUX_TESTNET = {
|
|
|
35
35
|
name: 'Wrapped LUX',
|
|
36
36
|
};
|
|
37
37
|
export const WLUX_DEV = {
|
|
38
|
-
address
|
|
38
|
+
// Deterministic CREATE address from DeployFullStack.s.sol (nonce 0)
|
|
39
|
+
address: '0x5FbDB2315678afecb367f032d93F642f64180aa3',
|
|
39
40
|
chainId: 1337,
|
|
40
41
|
decimals: 18,
|
|
41
42
|
symbol: 'WLUX',
|
|
@@ -45,29 +46,78 @@ export const WLUX_DEV = {
|
|
|
45
46
|
* Stablecoins
|
|
46
47
|
*/
|
|
47
48
|
export const LUSD = {
|
|
48
|
-
address: '
|
|
49
|
+
address: '0x4B1BfA76eD63F1A0aD2E4f40b3F46C45E8F7A4E2',
|
|
49
50
|
chainId: 96369,
|
|
50
|
-
decimals:
|
|
51
|
+
decimals: 6, // USDC-compatible decimals
|
|
51
52
|
symbol: 'LUSD',
|
|
52
53
|
name: 'Lux Dollar',
|
|
53
54
|
};
|
|
54
55
|
/**
|
|
55
56
|
* Bridge tokens (L-prefix for assets bridged to Lux)
|
|
57
|
+
* These are the canonical mainnet addresses from @luxfi/config
|
|
56
58
|
*/
|
|
57
59
|
export const LETH = {
|
|
58
|
-
address: '
|
|
60
|
+
address: '0xAA3AE95816a4A6FbC6b8Ed5a6C06f22A96A80C8C',
|
|
59
61
|
chainId: 96369,
|
|
60
62
|
decimals: 18,
|
|
61
63
|
symbol: 'LETH',
|
|
62
64
|
name: 'Lux ETH',
|
|
63
65
|
};
|
|
64
66
|
export const LBTC = {
|
|
65
|
-
address: '
|
|
67
|
+
address: '0x526903E35E7106D62ED3B5d77E14e51d024Aa1D3',
|
|
66
68
|
chainId: 96369,
|
|
67
69
|
decimals: 8,
|
|
68
70
|
symbol: 'LBTC',
|
|
69
71
|
name: 'Lux BTC',
|
|
70
72
|
};
|
|
73
|
+
/**
|
|
74
|
+
* Testnet bridge tokens
|
|
75
|
+
*/
|
|
76
|
+
export const LETH_TESTNET = {
|
|
77
|
+
address: '0x60E0a8167FC13dE89348978860466C9ceC24B9ba',
|
|
78
|
+
chainId: 96368,
|
|
79
|
+
decimals: 18,
|
|
80
|
+
symbol: 'LETH',
|
|
81
|
+
name: 'Lux ETH',
|
|
82
|
+
};
|
|
83
|
+
export const LBTC_TESTNET = {
|
|
84
|
+
address: '0x1E48D32a4F5e9f08DB9aE4959163300FaF8A6C8e',
|
|
85
|
+
chainId: 96368,
|
|
86
|
+
decimals: 8,
|
|
87
|
+
symbol: 'LBTC',
|
|
88
|
+
name: 'Lux BTC',
|
|
89
|
+
};
|
|
90
|
+
export const LUSD_TESTNET = {
|
|
91
|
+
address: '0xb84112ac9318a0b2319aa11d4d10e9762b25f7f4',
|
|
92
|
+
chainId: 96368,
|
|
93
|
+
decimals: 18,
|
|
94
|
+
symbol: 'LUSD',
|
|
95
|
+
name: 'Lux Dollar',
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Dev mode bridge tokens (deterministic CREATE addresses)
|
|
99
|
+
*/
|
|
100
|
+
export const LETH_DEV = {
|
|
101
|
+
address: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512',
|
|
102
|
+
chainId: 1337,
|
|
103
|
+
decimals: 18,
|
|
104
|
+
symbol: 'LETH',
|
|
105
|
+
name: 'Lux ETH',
|
|
106
|
+
};
|
|
107
|
+
export const LBTC_DEV = {
|
|
108
|
+
address: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0',
|
|
109
|
+
chainId: 1337,
|
|
110
|
+
decimals: 8,
|
|
111
|
+
symbol: 'LBTC',
|
|
112
|
+
name: 'Lux BTC',
|
|
113
|
+
};
|
|
114
|
+
export const LUSD_DEV = {
|
|
115
|
+
address: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9',
|
|
116
|
+
chainId: 1337,
|
|
117
|
+
decimals: 6,
|
|
118
|
+
symbol: 'LUSD',
|
|
119
|
+
name: 'Lux Dollar',
|
|
120
|
+
};
|
|
71
121
|
/**
|
|
72
122
|
* Major tokens on Lux Mainnet
|
|
73
123
|
*/
|
|
@@ -162,6 +212,41 @@ export const ZOO_MAINNET_TOKENS = [
|
|
|
162
212
|
USDT_ZOO,
|
|
163
213
|
WETH_ZOO,
|
|
164
214
|
];
|
|
215
|
+
/**
|
|
216
|
+
* Default token list for Lux Testnet
|
|
217
|
+
*/
|
|
218
|
+
export const LUX_TESTNET_TOKENS = [
|
|
219
|
+
WLUX_TESTNET,
|
|
220
|
+
LETH_TESTNET,
|
|
221
|
+
LBTC_TESTNET,
|
|
222
|
+
LUSD_TESTNET,
|
|
223
|
+
];
|
|
224
|
+
/**
|
|
225
|
+
* Default token list for Lux Dev
|
|
226
|
+
*/
|
|
227
|
+
export const LUX_DEV_TOKENS = [
|
|
228
|
+
WLUX_DEV,
|
|
229
|
+
LETH_DEV,
|
|
230
|
+
LBTC_DEV,
|
|
231
|
+
LUSD_DEV,
|
|
232
|
+
];
|
|
233
|
+
/**
|
|
234
|
+
* Get tokens for a chain
|
|
235
|
+
*/
|
|
236
|
+
export function getTokensForChain(chainId) {
|
|
237
|
+
switch (chainId) {
|
|
238
|
+
case 96369:
|
|
239
|
+
return LUX_MAINNET_TOKENS;
|
|
240
|
+
case 96368:
|
|
241
|
+
return LUX_TESTNET_TOKENS;
|
|
242
|
+
case 1337:
|
|
243
|
+
return LUX_DEV_TOKENS;
|
|
244
|
+
case 200200:
|
|
245
|
+
return ZOO_MAINNET_TOKENS;
|
|
246
|
+
default:
|
|
247
|
+
return [];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
165
250
|
/**
|
|
166
251
|
* Get wrapped native token for chain
|
|
167
252
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@luxfi/exchange",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Lux Exchange SDK - React hooks and utilities for Lux DEX",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -34,6 +34,10 @@
|
|
|
34
34
|
"./dex": {
|
|
35
35
|
"types": "./dist/dex/index.d.ts",
|
|
36
36
|
"import": "./dist/dex/index.js"
|
|
37
|
+
},
|
|
38
|
+
"./bridge": {
|
|
39
|
+
"types": "./dist/bridge/index.d.ts",
|
|
40
|
+
"import": "./dist/bridge/index.js"
|
|
37
41
|
}
|
|
38
42
|
},
|
|
39
43
|
"files": [
|
|
@@ -64,7 +68,7 @@
|
|
|
64
68
|
"repository": {
|
|
65
69
|
"type": "git",
|
|
66
70
|
"url": "https://github.com/luxfi/exchange.git",
|
|
67
|
-
"directory": "
|
|
71
|
+
"directory": "pkgs/exchange"
|
|
68
72
|
},
|
|
69
73
|
"keywords": [
|
|
70
74
|
"lux",
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zustand store for cross-chain mint operations
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { create } from 'zustand'
|
|
6
|
+
import { devtools, persist } from 'zustand/middleware'
|
|
7
|
+
import type { CrossChainMintRequest, CrossChainMintState, CrossChainMintStatus } from './types'
|
|
8
|
+
|
|
9
|
+
interface PendingMint extends CrossChainMintRequest {
|
|
10
|
+
state: CrossChainMintState
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface CrossChainStore {
|
|
14
|
+
/** Currently active mints by swap ID */
|
|
15
|
+
pendingMints: Record<string, PendingMint>
|
|
16
|
+
/** Most recent completed mints (for history) */
|
|
17
|
+
recentMints: PendingMint[]
|
|
18
|
+
/** Maximum number of recent mints to keep */
|
|
19
|
+
maxRecentMints: number
|
|
20
|
+
|
|
21
|
+
// Actions
|
|
22
|
+
initiateMint: (request: CrossChainMintRequest) => string
|
|
23
|
+
updateMintStatus: (swapId: string, status: CrossChainMintStatus) => void
|
|
24
|
+
updateMintTxHash: (swapId: string, field: 'sourceTxHash' | 'mintTxHash' | 'swapTxHash', hash: string) => void
|
|
25
|
+
completeMint: (swapId: string) => void
|
|
26
|
+
failMint: (swapId: string, error: string) => void
|
|
27
|
+
cancelMint: (swapId: string) => void
|
|
28
|
+
clearPendingMint: (swapId: string) => void
|
|
29
|
+
getPendingMint: (swapId: string) => PendingMint | undefined
|
|
30
|
+
getActiveMints: () => PendingMint[]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Generate a random swap ID
|
|
34
|
+
function generateSwapId(): string {
|
|
35
|
+
const bytes = new Uint8Array(32)
|
|
36
|
+
crypto.getRandomValues(bytes)
|
|
37
|
+
return '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const useCrossChainStore = create<CrossChainStore>()(
|
|
41
|
+
devtools(
|
|
42
|
+
persist(
|
|
43
|
+
(set, get) => ({
|
|
44
|
+
pendingMints: {},
|
|
45
|
+
recentMints: [],
|
|
46
|
+
maxRecentMints: 20,
|
|
47
|
+
|
|
48
|
+
initiateMint: (request: CrossChainMintRequest) => {
|
|
49
|
+
const swapId = generateSwapId()
|
|
50
|
+
const now = Date.now()
|
|
51
|
+
|
|
52
|
+
const pendingMint: PendingMint = {
|
|
53
|
+
...request,
|
|
54
|
+
state: {
|
|
55
|
+
swapId: swapId as `0x${string}`,
|
|
56
|
+
status: 'initiating',
|
|
57
|
+
sourceTxHash: null,
|
|
58
|
+
mintTxHash: null,
|
|
59
|
+
swapTxHash: null,
|
|
60
|
+
error: null,
|
|
61
|
+
startedAt: now,
|
|
62
|
+
completedAt: null,
|
|
63
|
+
},
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
set((state) => ({
|
|
67
|
+
pendingMints: {
|
|
68
|
+
...state.pendingMints,
|
|
69
|
+
[swapId]: pendingMint,
|
|
70
|
+
},
|
|
71
|
+
}))
|
|
72
|
+
|
|
73
|
+
return swapId
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
updateMintStatus: (swapId: string, status: CrossChainMintStatus) => {
|
|
77
|
+
set((state) => {
|
|
78
|
+
const mint = state.pendingMints[swapId]
|
|
79
|
+
if (!mint) return state
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
pendingMints: {
|
|
83
|
+
...state.pendingMints,
|
|
84
|
+
[swapId]: {
|
|
85
|
+
...mint,
|
|
86
|
+
state: {
|
|
87
|
+
...mint.state,
|
|
88
|
+
status,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
updateMintTxHash: (swapId: string, field: 'sourceTxHash' | 'mintTxHash' | 'swapTxHash', hash: string) => {
|
|
97
|
+
set((state) => {
|
|
98
|
+
const mint = state.pendingMints[swapId]
|
|
99
|
+
if (!mint) return state
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
pendingMints: {
|
|
103
|
+
...state.pendingMints,
|
|
104
|
+
[swapId]: {
|
|
105
|
+
...mint,
|
|
106
|
+
state: {
|
|
107
|
+
...mint.state,
|
|
108
|
+
[field]: hash,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
}
|
|
113
|
+
})
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
completeMint: (swapId: string) => {
|
|
117
|
+
set((state) => {
|
|
118
|
+
const mint = state.pendingMints[swapId]
|
|
119
|
+
if (!mint) return state
|
|
120
|
+
|
|
121
|
+
const completedMint: PendingMint = {
|
|
122
|
+
...mint,
|
|
123
|
+
state: {
|
|
124
|
+
...mint.state,
|
|
125
|
+
status: 'complete',
|
|
126
|
+
completedAt: Date.now(),
|
|
127
|
+
},
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const { [swapId]: _, ...remainingPending } = state.pendingMints
|
|
131
|
+
const newRecent = [completedMint, ...state.recentMints].slice(0, state.maxRecentMints)
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
pendingMints: remainingPending,
|
|
135
|
+
recentMints: newRecent,
|
|
136
|
+
}
|
|
137
|
+
})
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
failMint: (swapId: string, error: string) => {
|
|
141
|
+
set((state) => {
|
|
142
|
+
const mint = state.pendingMints[swapId]
|
|
143
|
+
if (!mint) return state
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
pendingMints: {
|
|
147
|
+
...state.pendingMints,
|
|
148
|
+
[swapId]: {
|
|
149
|
+
...mint,
|
|
150
|
+
state: {
|
|
151
|
+
...mint.state,
|
|
152
|
+
status: 'failed',
|
|
153
|
+
error,
|
|
154
|
+
completedAt: Date.now(),
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
}
|
|
159
|
+
})
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
cancelMint: (swapId: string) => {
|
|
163
|
+
set((state) => {
|
|
164
|
+
const mint = state.pendingMints[swapId]
|
|
165
|
+
if (!mint) return state
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
pendingMints: {
|
|
169
|
+
...state.pendingMints,
|
|
170
|
+
[swapId]: {
|
|
171
|
+
...mint,
|
|
172
|
+
state: {
|
|
173
|
+
...mint.state,
|
|
174
|
+
status: 'cancelled',
|
|
175
|
+
completedAt: Date.now(),
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
}
|
|
180
|
+
})
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
clearPendingMint: (swapId: string) => {
|
|
184
|
+
set((state) => {
|
|
185
|
+
const { [swapId]: _, ...remainingPending } = state.pendingMints
|
|
186
|
+
return { pendingMints: remainingPending }
|
|
187
|
+
})
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
getPendingMint: (swapId: string) => {
|
|
191
|
+
return get().pendingMints[swapId]
|
|
192
|
+
},
|
|
193
|
+
|
|
194
|
+
getActiveMints: () => {
|
|
195
|
+
const { pendingMints } = get()
|
|
196
|
+
return Object.values(pendingMints).filter(
|
|
197
|
+
(m) => m.state.status !== 'failed' && m.state.status !== 'cancelled'
|
|
198
|
+
)
|
|
199
|
+
},
|
|
200
|
+
}),
|
|
201
|
+
{
|
|
202
|
+
name: 'cross-chain-mint-storage',
|
|
203
|
+
partialize: (state) => ({
|
|
204
|
+
recentMints: state.recentMints,
|
|
205
|
+
}),
|
|
206
|
+
}
|
|
207
|
+
),
|
|
208
|
+
{ name: 'CrossChainStore' }
|
|
209
|
+
)
|
|
210
|
+
)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-chain bridge module for XVM ↔ C-Chain atomic swaps
|
|
3
|
+
*
|
|
4
|
+
* Enables one-click minting of wrapped tokens on C-Chain from X-Chain assets
|
|
5
|
+
* using Warp cross-chain messaging and HTLC atomic swaps.
|
|
6
|
+
*
|
|
7
|
+
* Includes Z-Chain privacy layer for fully shielded cross-chain teleportation:
|
|
8
|
+
* XVM UTXO → ZNote (shielded) → Z-Chain AMM (private swap) → destination
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* // Standard cross-chain mint
|
|
13
|
+
* import { useCrossChainMint } from '@luxfi/exchange/bridge'
|
|
14
|
+
*
|
|
15
|
+
* function MintButton() {
|
|
16
|
+
* const { mint, isLoading } = useCrossChainMint()
|
|
17
|
+
*
|
|
18
|
+
* const handleMint = async () => {
|
|
19
|
+
* const swapId = await mint({
|
|
20
|
+
* sourceAsset: '0x...', // XVM asset ID
|
|
21
|
+
* amount: 1000000n, // 1 token (6 decimals)
|
|
22
|
+
* recipient: '0x...', // C-Chain recipient
|
|
23
|
+
* targetToken: '0x...', // Optional: swap to this token
|
|
24
|
+
* minReceive: 990000n, // Slippage protection
|
|
25
|
+
* })
|
|
26
|
+
* console.log('Mint initiated:', swapId)
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* return (
|
|
30
|
+
* <button onClick={handleMint} disabled={isLoading}>
|
|
31
|
+
* {isLoading ? 'Minting...' : 'Mint on C-Chain'}
|
|
32
|
+
* </button>
|
|
33
|
+
* )
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* // Private teleport with Z-Chain
|
|
40
|
+
* import { usePrivateTeleport } from '@luxfi/exchange/bridge'
|
|
41
|
+
*
|
|
42
|
+
* function PrivateTeleportButton() {
|
|
43
|
+
* const { teleport, executeSwap, exportToDestination, isLoading } = usePrivateTeleport()
|
|
44
|
+
*
|
|
45
|
+
* const handlePrivateTeleport = async () => {
|
|
46
|
+
* // 1. Initiate shielded teleport (creates ZNote)
|
|
47
|
+
* const teleportId = await teleport({
|
|
48
|
+
* sourceChain: '0x...', // X-Chain ID
|
|
49
|
+
* destChain: '0x...', // C-Chain ID
|
|
50
|
+
* sourceAsset: '0x...', // Asset to teleport
|
|
51
|
+
* destAsset: '0x...', // Asset to receive (if swapping)
|
|
52
|
+
* amount: 1000000n, // Amount (will be encrypted)
|
|
53
|
+
* recipient: '0x...', // Destination address
|
|
54
|
+
* deadline: Math.floor(Date.now() / 1000) + 3600,
|
|
55
|
+
* privateSwap: true, // Use Z-Chain AMM for private swap
|
|
56
|
+
* })
|
|
57
|
+
*
|
|
58
|
+
* // 2. Execute private swap on Z-Chain (optional)
|
|
59
|
+
* await executeSwap(teleportId, '0x...poolId', 990000n)
|
|
60
|
+
*
|
|
61
|
+
* // 3. Export to destination chain with range proof
|
|
62
|
+
* await exportToDestination(teleportId)
|
|
63
|
+
* }
|
|
64
|
+
*
|
|
65
|
+
* return (
|
|
66
|
+
* <button onClick={handlePrivateTeleport} disabled={isLoading}>
|
|
67
|
+
* Private Teleport
|
|
68
|
+
* </button>
|
|
69
|
+
* )
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
// Standard cross-chain (public)
|
|
75
|
+
export * from './types'
|
|
76
|
+
export * from './cross-chain-store'
|
|
77
|
+
export * from './use-cross-chain-mint'
|
|
78
|
+
|
|
79
|
+
// Private teleport (Z-Chain privacy layer)
|
|
80
|
+
export * from './private-teleport-types'
|
|
81
|
+
export * from './use-private-teleport'
|