@pear-protocol/exchanges-sdk 0.6.5 → 0.6.6
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/client/base-ws.js +15 -6
- package/dist/client/binance/exchange-ws.js +22 -8
- package/dist/client/binance/rest.js +40 -27
- package/dist/client/binance/ws.js +21 -2
- package/dist/client/bybit/exchange-ws.js +13 -6
- package/dist/client/bybit/rest.js +30 -36
- package/dist/client/bybit/ws.js +16 -2
- package/dist/client/exchange-ws.js +5 -0
- package/dist/client/hmac.js +9 -1
- package/dist/client/hyperliquid/exchange-ws.js +13 -5
- package/dist/client/hyperliquid/rest.js +37 -7
- package/dist/client/hyperliquid/ws.js +10 -4
- package/dist/client/index.js +9 -2
- package/dist/client/lighter/constants.js +4 -0
- package/dist/client/lighter/exchange-ws.js +13 -5
- package/dist/client/lighter/rest.js +153 -18
- package/dist/client/lighter/ws.js +10 -4
- package/dist/client/okx/exchange-ws.js +13 -6
- package/dist/client/okx/rest.js +27 -24
- package/dist/client/okx/ws.js +5 -0
- package/dist/helper/factory.js +3 -0
- package/dist/helper/hyperliquid/helper.js +18 -23
- package/dist/helper/lighter/auth-token.helper.js +68 -0
- package/dist/helper/lighter/cctp-deposit.helper.js +297 -0
- package/dist/helper/lighter/ethereum/abi.js +55 -11
- package/dist/helper/lighter/ethereum/index.js +22 -3
- package/dist/helper/lighter/ethereum/usdc.helper.js +77 -0
- package/dist/helper/lighter/helper.js +112 -37
- package/dist/helper/lighter/index.js +1 -0
- package/dist/helper/lighter/onboarding.helper.js +28 -0
- package/dist/helper/lighter/types.js +6 -1
- package/dist/helper/subaccount.helper.js +20 -0
- package/dist/index.d.ts +200 -1
- package/dist/sdk.js +18 -7
- package/dist/status/base.js +16 -3
- package/dist/status/binance/status.js +3 -0
- package/dist/status/bybit/status.js +3 -0
- package/dist/status/factory.js +3 -0
- package/dist/status/hyperliquid/status.js +8 -6
- package/dist/status/lighter/status.js +11 -3
- package/dist/status/okx/status.js +3 -0
- package/dist/syncer/base.js +63 -24
- package/dist/syncer/binance/syncer.js +14 -13
- package/dist/syncer/bybit/syncer.js +10 -6
- package/dist/syncer/factory.js +3 -0
- package/dist/syncer/hyperliquid/funding.js +3 -0
- package/dist/syncer/hyperliquid/syncer.js +52 -66
- package/dist/syncer/lighter/funding.js +3 -0
- package/dist/syncer/lighter/syncer.js +26 -25
- package/dist/syncer/okx/syncer.js +15 -13
- package/dist/tracker/base.js +15 -5
- package/dist/tracker/binance/mapper.js +5 -1
- package/dist/tracker/binance/tracker.js +63 -23
- package/dist/tracker/binance/types.js +2 -2
- package/dist/tracker/bybit/mapper.js +7 -1
- package/dist/tracker/bybit/tracker.js +68 -24
- package/dist/tracker/bybit/types.js +2 -2
- package/dist/tracker/hyperliquid/const.js +3 -1
- package/dist/tracker/hyperliquid/mapper.js +36 -20
- package/dist/tracker/hyperliquid/tracker.js +147 -54
- package/dist/tracker/hyperliquid/types.js +2 -2
- package/dist/tracker/index.js +3 -0
- package/dist/tracker/lighter/mapper.js +41 -31
- package/dist/tracker/lighter/tracker.js +68 -27
- package/dist/tracker/lighter/types.js +4 -4
- package/dist/tracker/okx/mapper.js +8 -0
- package/dist/tracker/okx/tracker.js +69 -18
- package/dist/tracker/okx/types.js +2 -2
- package/dist/tracker/utils.js +4 -0
- package/package.json +3 -3
- package/dist/client/hyperliquid/client.test.js +0 -41
- package/dist/client/lighter/constants.test.js +0 -22
- package/dist/client/lighter/rest.test.js +0 -158
- package/dist/helper/hyperliquid/helper.test.js +0 -72
- package/dist/helper/lighter/helper.test.js +0 -289
- package/dist/sdk.test.js +0 -117
- package/dist/status/hyperliquid/status.test.js +0 -94
- package/dist/status/lighter/status.test.js +0 -86
- package/dist/syncer/base.test.js +0 -178
- package/dist/syncer/hyperliquid/funding.test.js +0 -63
- package/dist/syncer/hyperliquid/syncer.test.js +0 -271
- package/dist/syncer/lighter/funding.test.js +0 -48
- package/dist/syncer/lighter/syncer.test.js +0 -274
- package/dist/tracker/base.test.js +0 -132
- package/dist/tracker/binance/tracker.test.js +0 -138
- package/dist/tracker/bybit/tracker.test.js +0 -145
- package/dist/tracker/hyperliquid/mapper.test.js +0 -260
- package/dist/tracker/hyperliquid/tracker.test.js +0 -597
- package/dist/tracker/lighter/mapper.test.js +0 -199
- package/dist/tracker/lighter/tracker.test.js +0 -515
- package/dist/tracker/okx/tracker.test.js +0 -126
- package/dist/tracker/utils.test.js +0 -8
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
const ASSUMED_AUTH_TOKEN_TTL_SECONDS = 10 * 60;
|
|
4
|
+
const AUTH_TOKEN_REFRESH_MARGIN_MS = 60 * 1e3;
|
|
5
|
+
const cachedTokens = /* @__PURE__ */ new Map();
|
|
6
|
+
async function retrieveLighterAuthToken(sdk, credentials, demo) {
|
|
7
|
+
const cacheKey = buildCacheKey(credentials, demo);
|
|
8
|
+
evictLapsedTokens();
|
|
9
|
+
const cached = cachedTokens.get(cacheKey);
|
|
10
|
+
if (cached && cached.apiPrivateKey === credentials.apiPrivateKey) {
|
|
11
|
+
return cached.token;
|
|
12
|
+
}
|
|
13
|
+
let entry;
|
|
14
|
+
const token = signAuthToken(sdk, credentials).catch((error) => {
|
|
15
|
+
if (cachedTokens.get(cacheKey) === entry) {
|
|
16
|
+
cachedTokens.delete(cacheKey);
|
|
17
|
+
}
|
|
18
|
+
throw error;
|
|
19
|
+
});
|
|
20
|
+
entry = {
|
|
21
|
+
token,
|
|
22
|
+
apiPrivateKey: credentials.apiPrivateKey,
|
|
23
|
+
expiresAt: Date.now() + ASSUMED_AUTH_TOKEN_TTL_SECONDS * 1e3 - AUTH_TOKEN_REFRESH_MARGIN_MS
|
|
24
|
+
};
|
|
25
|
+
cachedTokens.set(cacheKey, entry);
|
|
26
|
+
void token.then((signed) => alignExpiry(cacheKey, entry, signed)).catch(() => void 0);
|
|
27
|
+
return token;
|
|
28
|
+
}
|
|
29
|
+
__name(retrieveLighterAuthToken, "retrieveLighterAuthToken");
|
|
30
|
+
function _resetLighterAuthTokens() {
|
|
31
|
+
cachedTokens.clear();
|
|
32
|
+
}
|
|
33
|
+
__name(_resetLighterAuthTokens, "_resetLighterAuthTokens");
|
|
34
|
+
async function signAuthToken(sdk, credentials) {
|
|
35
|
+
const { token } = await sdk.core.misc.lighter.createAuthToken({
|
|
36
|
+
accountIndex: credentials.accountIndex,
|
|
37
|
+
apiKeyIndex: credentials.apiKeyIndex,
|
|
38
|
+
apiPrivateKey: credentials.apiPrivateKey
|
|
39
|
+
});
|
|
40
|
+
return token;
|
|
41
|
+
}
|
|
42
|
+
__name(signAuthToken, "signAuthToken");
|
|
43
|
+
function alignExpiry(cacheKey, entry, token) {
|
|
44
|
+
if (cachedTokens.get(cacheKey) !== entry) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const deadlineSeconds = Number(token.split(":")[0]);
|
|
48
|
+
if (!Number.isSafeInteger(deadlineSeconds) || deadlineSeconds <= 0) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
entry.expiresAt = Math.min(entry.expiresAt, deadlineSeconds * 1e3 - AUTH_TOKEN_REFRESH_MARGIN_MS);
|
|
52
|
+
}
|
|
53
|
+
__name(alignExpiry, "alignExpiry");
|
|
54
|
+
function buildCacheKey(credentials, demo) {
|
|
55
|
+
return `${demo ? "demo" : "live"}:${credentials.accountIndex}:${credentials.apiKeyIndex}`;
|
|
56
|
+
}
|
|
57
|
+
__name(buildCacheKey, "buildCacheKey");
|
|
58
|
+
function evictLapsedTokens() {
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
for (const [cacheKey, cached] of cachedTokens) {
|
|
61
|
+
if (cached.expiresAt <= now) {
|
|
62
|
+
cachedTokens.delete(cacheKey);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
__name(evictLapsedTokens, "evictLapsedTokens");
|
|
67
|
+
|
|
68
|
+
export { _resetLighterAuthTokens, retrieveLighterAuthToken };
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { isAddress } from 'viem';
|
|
2
|
+
import { fetchDepositNetworks, createCctpDepositIntentAddress, fetchAccountsByL1Address, fetchDepositHistory } from '../../client/lighter/rest';
|
|
3
|
+
import { parseUsdcAmount } from '../subaccount.helper';
|
|
4
|
+
import { retrieveLighterAuthToken } from './auth-token.helper';
|
|
5
|
+
import { getLighterCctpUsdcAddress, writeUsdcTransfer } from './ethereum/usdc.helper';
|
|
6
|
+
import { readOnboardingStatus } from './onboarding.helper';
|
|
7
|
+
import { MIN_LIGHTER_CCTP_DEPOSIT_USDC } from './types';
|
|
8
|
+
|
|
9
|
+
var __defProp = Object.defineProperty;
|
|
10
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
11
|
+
const DEPOSIT_POLL_INTERVAL_MS = 5e3;
|
|
12
|
+
const EXTERNAL_INTENT_LIFETIME_MS = 9 * 60 * 1e3;
|
|
13
|
+
const REGISTRATION_WATCH_LIMIT_MS = 60 * 60 * 1e3;
|
|
14
|
+
const USDC_AMOUNT_PATTERN = /^\d+(?:\.\d{1,6})?$/;
|
|
15
|
+
const MINIMUM_LABEL = `Minimum deposit: $${MIN_LIGHTER_CCTP_DEPOSIT_USDC} USDC`;
|
|
16
|
+
const MINIMUM_UNITS = parseUsdcAmount(MIN_LIGHTER_CCTP_DEPOSIT_USDC);
|
|
17
|
+
async function listCctpDepositNetworks(demo) {
|
|
18
|
+
assertCctpEnvironment(demo);
|
|
19
|
+
return fetchDepositNetworks(demo);
|
|
20
|
+
}
|
|
21
|
+
__name(listCctpDepositNetworks, "listCctpDepositNetworks");
|
|
22
|
+
async function createExternalCctpDepositIntent(params, demo) {
|
|
23
|
+
await validateIntentRoute(params, demo);
|
|
24
|
+
const intentAddress = await createCctpDepositIntentAddress({
|
|
25
|
+
chainId: params.chainId,
|
|
26
|
+
fromAddress: params.ownerAddress,
|
|
27
|
+
amount: "0",
|
|
28
|
+
external: true
|
|
29
|
+
}, demo);
|
|
30
|
+
return {
|
|
31
|
+
intentAddress,
|
|
32
|
+
expiresAt: Date.now() + EXTERNAL_INTENT_LIFETIME_MS
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
__name(createExternalCctpDepositIntent, "createExternalCctpDepositIntent");
|
|
36
|
+
async function depositUsdcViaCctp(sdk, params, demo) {
|
|
37
|
+
assertCctpEnvironment(demo);
|
|
38
|
+
assertOwnerWallet(params.ownerAddress, params.connectedAddress);
|
|
39
|
+
const usdcAddress = getLighterCctpUsdcAddress(params.chainId);
|
|
40
|
+
if (!usdcAddress) {
|
|
41
|
+
throw new Error(`Lighter CCTP chain ID ${params.chainId} has no known native USDC token.`);
|
|
42
|
+
}
|
|
43
|
+
const amountError = readCctpDepositAmountError(params.amount);
|
|
44
|
+
if (amountError) {
|
|
45
|
+
throw new Error(amountError);
|
|
46
|
+
}
|
|
47
|
+
const units = parseUsdcAmount(params.amount);
|
|
48
|
+
const balance = await params.wallet.readUsdcBalance(params.chainId, params.ownerAddress);
|
|
49
|
+
if (units > balance) {
|
|
50
|
+
throw new Error(`Your wallet holds ${formatUsdcUnits(balance)} USDC.`);
|
|
51
|
+
}
|
|
52
|
+
await validateIntentRoute({
|
|
53
|
+
chainId: params.chainId,
|
|
54
|
+
ownerAddress: params.ownerAddress
|
|
55
|
+
}, demo);
|
|
56
|
+
const wallet = await params.wallet.retrieveWallet(params.chainId);
|
|
57
|
+
if (wallet.account.address.toLowerCase() !== params.ownerAddress.toLowerCase()) {
|
|
58
|
+
throw new Error(`Connect the Lighter owner wallet ${params.ownerAddress} and try again.`);
|
|
59
|
+
}
|
|
60
|
+
if (wallet.chain?.id !== params.chainId) {
|
|
61
|
+
throw new Error(`Switch the wallet to chain ${params.chainId} before depositing.`);
|
|
62
|
+
}
|
|
63
|
+
const intentAddress = await createCctpDepositIntentAddress({
|
|
64
|
+
chainId: params.chainId,
|
|
65
|
+
fromAddress: params.ownerAddress,
|
|
66
|
+
amount: units.toString(),
|
|
67
|
+
external: false
|
|
68
|
+
}, demo);
|
|
69
|
+
const txHash = await writeUsdcTransfer(wallet, {
|
|
70
|
+
usdcAddress,
|
|
71
|
+
to: intentAddress,
|
|
72
|
+
amount: BigInt(units)
|
|
73
|
+
});
|
|
74
|
+
emitProgress(params.onProgress, params.signal, {
|
|
75
|
+
state: "confirming",
|
|
76
|
+
txHash
|
|
77
|
+
});
|
|
78
|
+
await params.wallet.confirmTransaction(params.chainId, txHash);
|
|
79
|
+
emitProgress(params.onProgress, params.signal, {
|
|
80
|
+
state: "bridging",
|
|
81
|
+
txHash
|
|
82
|
+
});
|
|
83
|
+
await followDepositSettlement(params, txHash, sdk, demo);
|
|
84
|
+
return {
|
|
85
|
+
txHash,
|
|
86
|
+
intentAddress
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
__name(depositUsdcViaCctp, "depositUsdcViaCctp");
|
|
90
|
+
function readCctpDepositAmountError(amount) {
|
|
91
|
+
if (!USDC_AMOUNT_PATTERN.test(amount)) {
|
|
92
|
+
return "Enter a USDC amount with up to six decimal places.";
|
|
93
|
+
}
|
|
94
|
+
const units = parseUsdcAmount(amount);
|
|
95
|
+
if (units < MINIMUM_UNITS) {
|
|
96
|
+
return `${MINIMUM_LABEL}.`;
|
|
97
|
+
}
|
|
98
|
+
return void 0;
|
|
99
|
+
}
|
|
100
|
+
__name(readCctpDepositAmountError, "readCctpDepositAmountError");
|
|
101
|
+
async function validateIntentRoute(params, demo) {
|
|
102
|
+
assertCctpEnvironment(demo);
|
|
103
|
+
if (!isAddress(params.ownerAddress)) {
|
|
104
|
+
throw new Error(`Invalid Lighter CCTP owner address: ${params.ownerAddress}`);
|
|
105
|
+
}
|
|
106
|
+
const networks = await fetchDepositNetworks(demo);
|
|
107
|
+
if (!networks.some((network) => network.chainId === params.chainId)) {
|
|
108
|
+
const supported = networks.map((network) => `${network.name} (${network.chainId})`).join(", ");
|
|
109
|
+
throw new Error(`Unsupported Lighter CCTP chain ID: ${params.chainId}. Lighter accepts ${supported}.`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
__name(validateIntentRoute, "validateIntentRoute");
|
|
113
|
+
function assertOwnerWallet(ownerAddress, connectedAddress) {
|
|
114
|
+
if (connectedAddress?.toLowerCase() !== ownerAddress.toLowerCase()) {
|
|
115
|
+
throw new Error(`Connect the Lighter owner wallet ${ownerAddress} and try again.`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
__name(assertOwnerWallet, "assertOwnerWallet");
|
|
119
|
+
function assertCctpEnvironment(demo) {
|
|
120
|
+
if (demo) {
|
|
121
|
+
throw new Error("Lighter demo CCTP deposits are disabled because safe testnet funding is not documented");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
__name(assertCctpEnvironment, "assertCctpEnvironment");
|
|
125
|
+
async function followDepositSettlement(params, txHash, sdk, demo) {
|
|
126
|
+
const settlement = params.settlement;
|
|
127
|
+
if (!settlement) {
|
|
128
|
+
emitProgress(params.onProgress, params.signal, {
|
|
129
|
+
state: "untracked",
|
|
130
|
+
txHash
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
switch (settlement.follow) {
|
|
135
|
+
case "deposit-history": {
|
|
136
|
+
const watch = await resolveDepositWatch(params.ownerAddress, settlement, params.signal, demo);
|
|
137
|
+
if (!watch) {
|
|
138
|
+
emitProgress(params.onProgress, params.signal, {
|
|
139
|
+
state: "untracked",
|
|
140
|
+
txHash
|
|
141
|
+
});
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
await watchCctpDeposit(params.ownerAddress, txHash, watch, params.onProgress, sdk, demo);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
case "account-registration": {
|
|
148
|
+
await watchAccountRegistration(params.ownerAddress, txHash, params.onProgress, params.signal, demo);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
__name(followDepositSettlement, "followDepositSettlement");
|
|
154
|
+
async function resolveDepositWatch(ownerAddress, settlement, signal, demo) {
|
|
155
|
+
const data = await fetchAccountsByL1Address(ownerAddress, demo);
|
|
156
|
+
const main = data.sub_accounts?.find((account) => account.account_type === 0);
|
|
157
|
+
if (!main || main.index !== settlement.selectedAccountIndex) {
|
|
158
|
+
return void 0;
|
|
159
|
+
}
|
|
160
|
+
const credentials = await settlement.retrieveCredentials();
|
|
161
|
+
return {
|
|
162
|
+
accountIndex: main.index,
|
|
163
|
+
apiKeyIndex: credentials.apiKeyIndex,
|
|
164
|
+
apiPrivateKey: credentials.apiPrivateKey,
|
|
165
|
+
signal
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
__name(resolveDepositWatch, "resolveDepositWatch");
|
|
169
|
+
async function watchCctpDeposit(ownerAddress, txHash, watch, onProgress, sdk, demo) {
|
|
170
|
+
while (!watch.signal?.aborted) {
|
|
171
|
+
await waitForDepositPoll(watch.signal);
|
|
172
|
+
if (watch.signal?.aborted) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
let deposits;
|
|
176
|
+
try {
|
|
177
|
+
const authToken = await retrieveLighterAuthToken(sdk, watch, demo);
|
|
178
|
+
deposits = await fetchDepositHistory({
|
|
179
|
+
accountIndex: watch.accountIndex,
|
|
180
|
+
l1Address: ownerAddress,
|
|
181
|
+
authToken
|
|
182
|
+
}, demo);
|
|
183
|
+
} catch {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const deposit = deposits.find((candidate) => candidate.l1TxHash.toLowerCase() === txHash.toLowerCase());
|
|
187
|
+
if (!deposit) {
|
|
188
|
+
emitProgress(onProgress, watch.signal, {
|
|
189
|
+
state: "bridging",
|
|
190
|
+
txHash
|
|
191
|
+
});
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
switch (deposit.status) {
|
|
195
|
+
case "pending":
|
|
196
|
+
emitProgress(onProgress, watch.signal, {
|
|
197
|
+
state: "bridging",
|
|
198
|
+
txHash
|
|
199
|
+
});
|
|
200
|
+
break;
|
|
201
|
+
case "completed":
|
|
202
|
+
emitProgress(onProgress, watch.signal, {
|
|
203
|
+
state: "credited",
|
|
204
|
+
txHash,
|
|
205
|
+
deposit
|
|
206
|
+
});
|
|
207
|
+
return;
|
|
208
|
+
case "failed":
|
|
209
|
+
emitProgress(onProgress, watch.signal, {
|
|
210
|
+
state: "failed",
|
|
211
|
+
txHash,
|
|
212
|
+
deposit
|
|
213
|
+
});
|
|
214
|
+
return;
|
|
215
|
+
case "claimable":
|
|
216
|
+
emitProgress(onProgress, watch.signal, {
|
|
217
|
+
state: "action-required",
|
|
218
|
+
txHash,
|
|
219
|
+
deposit
|
|
220
|
+
});
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
__name(watchCctpDeposit, "watchCctpDeposit");
|
|
226
|
+
async function watchAccountRegistration(ownerAddress, txHash, onProgress, signal, demo) {
|
|
227
|
+
const deadline = Date.now() + REGISTRATION_WATCH_LIMIT_MS;
|
|
228
|
+
while (!signal?.aborted) {
|
|
229
|
+
await waitForDepositPoll(signal);
|
|
230
|
+
if (signal?.aborted) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (Date.now() >= deadline) {
|
|
234
|
+
emitProgress(onProgress, signal, {
|
|
235
|
+
state: "unsettled",
|
|
236
|
+
txHash
|
|
237
|
+
});
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
let status;
|
|
241
|
+
try {
|
|
242
|
+
status = await readOnboardingStatus(ownerAddress, demo);
|
|
243
|
+
} catch {
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
switch (status.step) {
|
|
247
|
+
case "deposit-required":
|
|
248
|
+
emitProgress(onProgress, signal, {
|
|
249
|
+
state: "bridging",
|
|
250
|
+
txHash
|
|
251
|
+
});
|
|
252
|
+
break;
|
|
253
|
+
case "account-ready":
|
|
254
|
+
emitProgress(onProgress, signal, {
|
|
255
|
+
state: "registered",
|
|
256
|
+
txHash,
|
|
257
|
+
mainAccountIndex: status.mainAccountIndex,
|
|
258
|
+
subAccountIndexes: status.subAccountIndexes
|
|
259
|
+
});
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
__name(watchAccountRegistration, "watchAccountRegistration");
|
|
265
|
+
function emitProgress(onProgress, signal, progress) {
|
|
266
|
+
if (signal?.aborted) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
onProgress(progress);
|
|
270
|
+
}
|
|
271
|
+
__name(emitProgress, "emitProgress");
|
|
272
|
+
async function waitForDepositPoll(signal) {
|
|
273
|
+
await new Promise((resolve) => {
|
|
274
|
+
let timeout;
|
|
275
|
+
const stopWaiting = /* @__PURE__ */ __name(() => {
|
|
276
|
+
clearTimeout(timeout);
|
|
277
|
+
resolve();
|
|
278
|
+
}, "stopWaiting");
|
|
279
|
+
timeout = setTimeout(() => {
|
|
280
|
+
signal?.removeEventListener("abort", stopWaiting);
|
|
281
|
+
resolve();
|
|
282
|
+
}, DEPOSIT_POLL_INTERVAL_MS);
|
|
283
|
+
signal?.addEventListener("abort", stopWaiting, {
|
|
284
|
+
once: true
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
__name(waitForDepositPoll, "waitForDepositPoll");
|
|
289
|
+
function formatUsdcUnits(units) {
|
|
290
|
+
const value = units.toString().padStart(7, "0");
|
|
291
|
+
const whole = value.slice(0, -6);
|
|
292
|
+
const fraction = value.slice(-6).replace(/0+$/, "");
|
|
293
|
+
return fraction ? `${whole}.${fraction}` : whole;
|
|
294
|
+
}
|
|
295
|
+
__name(formatUsdcUnits, "formatUsdcUnits");
|
|
296
|
+
|
|
297
|
+
export { createExternalCctpDepositIntent, depositUsdcViaCctp, listCctpDepositNetworks };
|
|
@@ -2,9 +2,21 @@ const LIGHTER_GATEWAY_ADDRESS = "0x3B4D794a66304F130a4Db8F2551B0070dfCf5ca7";
|
|
|
2
2
|
const lighterGatewayAbi = [
|
|
3
3
|
{
|
|
4
4
|
inputs: [
|
|
5
|
-
{
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
{
|
|
6
|
+
internalType: "uint48",
|
|
7
|
+
name: "_accountIndex",
|
|
8
|
+
type: "uint48"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
internalType: "uint8",
|
|
12
|
+
name: "_apiKeyIndex",
|
|
13
|
+
type: "uint8"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
internalType: "bytes",
|
|
17
|
+
name: "_pubKey",
|
|
18
|
+
type: "bytes"
|
|
19
|
+
}
|
|
8
20
|
],
|
|
9
21
|
name: "changePubKey",
|
|
10
22
|
outputs: [],
|
|
@@ -13,10 +25,26 @@ const lighterGatewayAbi = [
|
|
|
13
25
|
},
|
|
14
26
|
{
|
|
15
27
|
inputs: [
|
|
16
|
-
{
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
28
|
+
{
|
|
29
|
+
internalType: "address",
|
|
30
|
+
name: "_to",
|
|
31
|
+
type: "address"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
internalType: "uint16",
|
|
35
|
+
name: "_assetIndex",
|
|
36
|
+
type: "uint16"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
internalType: "uint8",
|
|
40
|
+
name: "_routeType",
|
|
41
|
+
type: "uint8"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
internalType: "uint256",
|
|
45
|
+
name: "_amount",
|
|
46
|
+
type: "uint256"
|
|
47
|
+
}
|
|
20
48
|
],
|
|
21
49
|
name: "deposit",
|
|
22
50
|
outputs: [],
|
|
@@ -25,10 +53,26 @@ const lighterGatewayAbi = [
|
|
|
25
53
|
},
|
|
26
54
|
{
|
|
27
55
|
inputs: [
|
|
28
|
-
{
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
56
|
+
{
|
|
57
|
+
internalType: "uint48",
|
|
58
|
+
name: "_accountIndex",
|
|
59
|
+
type: "uint48"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
internalType: "uint16",
|
|
63
|
+
name: "_assetIndex",
|
|
64
|
+
type: "uint16"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
internalType: "uint8",
|
|
68
|
+
name: "_routeType",
|
|
69
|
+
type: "uint8"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
internalType: "uint64",
|
|
73
|
+
name: "_baseAmount",
|
|
74
|
+
type: "uint64"
|
|
75
|
+
}
|
|
32
76
|
],
|
|
33
77
|
name: "withdraw",
|
|
34
78
|
outputs: [],
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { mainnet } from 'viem/chains';
|
|
2
2
|
import { lighterGatewayAbi, LIGHTER_GATEWAY_ADDRESS } from './abi';
|
|
3
3
|
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
4
6
|
const chain = mainnet;
|
|
5
7
|
async function writeChangePubKey(walletClient, params) {
|
|
6
8
|
return walletClient.writeContract({
|
|
@@ -8,27 +10,44 @@ async function writeChangePubKey(walletClient, params) {
|
|
|
8
10
|
address: LIGHTER_GATEWAY_ADDRESS,
|
|
9
11
|
abi: lighterGatewayAbi,
|
|
10
12
|
functionName: "changePubKey",
|
|
11
|
-
args: [
|
|
13
|
+
args: [
|
|
14
|
+
params.accountIndex,
|
|
15
|
+
params.apiKeyIndex,
|
|
16
|
+
params.pubKey
|
|
17
|
+
]
|
|
12
18
|
});
|
|
13
19
|
}
|
|
20
|
+
__name(writeChangePubKey, "writeChangePubKey");
|
|
14
21
|
async function writeDeposit(walletClient, params) {
|
|
15
22
|
return walletClient.writeContract({
|
|
16
23
|
chain,
|
|
17
24
|
address: LIGHTER_GATEWAY_ADDRESS,
|
|
18
25
|
abi: lighterGatewayAbi,
|
|
19
26
|
functionName: "deposit",
|
|
20
|
-
args: [
|
|
27
|
+
args: [
|
|
28
|
+
params.to,
|
|
29
|
+
params.assetIndex,
|
|
30
|
+
params.routeType,
|
|
31
|
+
params.amount
|
|
32
|
+
],
|
|
21
33
|
value: params.value ?? 0n
|
|
22
34
|
});
|
|
23
35
|
}
|
|
36
|
+
__name(writeDeposit, "writeDeposit");
|
|
24
37
|
async function writeWithdraw(walletClient, params) {
|
|
25
38
|
return walletClient.writeContract({
|
|
26
39
|
chain,
|
|
27
40
|
address: LIGHTER_GATEWAY_ADDRESS,
|
|
28
41
|
abi: lighterGatewayAbi,
|
|
29
42
|
functionName: "withdraw",
|
|
30
|
-
args: [
|
|
43
|
+
args: [
|
|
44
|
+
params.accountIndex,
|
|
45
|
+
params.assetIndex,
|
|
46
|
+
params.routeType,
|
|
47
|
+
params.baseAmount
|
|
48
|
+
]
|
|
31
49
|
});
|
|
32
50
|
}
|
|
51
|
+
__name(writeWithdraw, "writeWithdraw");
|
|
33
52
|
|
|
34
53
|
export { writeChangePubKey, writeDeposit, writeWithdraw };
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
const LIGHTER_CCTP_USDC_ADDRESSES = {
|
|
4
|
+
// Arbitrum One
|
|
5
|
+
42161: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
|
|
6
|
+
// Base
|
|
7
|
+
8453: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
8
|
+
// Avalanche C-Chain
|
|
9
|
+
43114: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
|
|
10
|
+
// HyperEVM
|
|
11
|
+
999: "0xb88339CB7199b77E23DB6E890353E22632Ba630f"
|
|
12
|
+
};
|
|
13
|
+
const LIGHTER_CCTP_USDC_DECIMALS = 6;
|
|
14
|
+
const usdcAbi = [
|
|
15
|
+
{
|
|
16
|
+
inputs: [
|
|
17
|
+
{
|
|
18
|
+
internalType: "address",
|
|
19
|
+
name: "to",
|
|
20
|
+
type: "address"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
internalType: "uint256",
|
|
24
|
+
name: "amount",
|
|
25
|
+
type: "uint256"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
name: "transfer",
|
|
29
|
+
outputs: [
|
|
30
|
+
{
|
|
31
|
+
internalType: "bool",
|
|
32
|
+
name: "",
|
|
33
|
+
type: "bool"
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
stateMutability: "nonpayable",
|
|
37
|
+
type: "function"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
inputs: [
|
|
41
|
+
{
|
|
42
|
+
internalType: "address",
|
|
43
|
+
name: "account",
|
|
44
|
+
type: "address"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
name: "balanceOf",
|
|
48
|
+
outputs: [
|
|
49
|
+
{
|
|
50
|
+
internalType: "uint256",
|
|
51
|
+
name: "",
|
|
52
|
+
type: "uint256"
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
stateMutability: "view",
|
|
56
|
+
type: "function"
|
|
57
|
+
}
|
|
58
|
+
];
|
|
59
|
+
function getLighterCctpUsdcAddress(chainId) {
|
|
60
|
+
return LIGHTER_CCTP_USDC_ADDRESSES[chainId];
|
|
61
|
+
}
|
|
62
|
+
__name(getLighterCctpUsdcAddress, "getLighterCctpUsdcAddress");
|
|
63
|
+
async function writeUsdcTransfer(walletClient, params) {
|
|
64
|
+
return walletClient.writeContract({
|
|
65
|
+
chain: walletClient.chain,
|
|
66
|
+
address: params.usdcAddress,
|
|
67
|
+
abi: usdcAbi,
|
|
68
|
+
functionName: "transfer",
|
|
69
|
+
args: [
|
|
70
|
+
params.to,
|
|
71
|
+
params.amount
|
|
72
|
+
]
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
__name(writeUsdcTransfer, "writeUsdcTransfer");
|
|
76
|
+
|
|
77
|
+
export { LIGHTER_CCTP_USDC_ADDRESSES, LIGHTER_CCTP_USDC_DECIMALS, getLighterCctpUsdcAddress, usdcAbi, writeUsdcTransfer };
|