@echoclaw/echo-0g 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/README.md +1175 -0
- package/dist/0g-compute/account.d.ts +36 -0
- package/dist/0g-compute/account.d.ts.map +1 -0
- package/dist/0g-compute/account.js +85 -0
- package/dist/0g-compute/account.js.map +1 -0
- package/dist/0g-compute/bridge.d.ts +16 -0
- package/dist/0g-compute/bridge.d.ts.map +1 -0
- package/dist/0g-compute/bridge.js +40 -0
- package/dist/0g-compute/bridge.js.map +1 -0
- package/dist/0g-compute/broker-factory.d.ts +19 -0
- package/dist/0g-compute/broker-factory.d.ts.map +1 -0
- package/dist/0g-compute/broker-factory.js +65 -0
- package/dist/0g-compute/broker-factory.js.map +1 -0
- package/dist/0g-compute/constants.d.ts +10 -0
- package/dist/0g-compute/constants.d.ts.map +1 -0
- package/dist/0g-compute/constants.js +12 -0
- package/dist/0g-compute/constants.js.map +1 -0
- package/dist/0g-compute/monitor.d.ts +43 -0
- package/dist/0g-compute/monitor.d.ts.map +1 -0
- package/dist/0g-compute/monitor.js +302 -0
- package/dist/0g-compute/monitor.js.map +1 -0
- package/dist/0g-compute/pricing.d.ts +43 -0
- package/dist/0g-compute/pricing.d.ts.map +1 -0
- package/dist/0g-compute/pricing.js +53 -0
- package/dist/0g-compute/pricing.js.map +1 -0
- package/dist/0g-compute/sdk-bridge.cjs +17 -0
- package/dist/0g-compute/sdk-bridge.cjs.map +1 -0
- package/dist/0g-compute/sdk-bridge.d.cts +9 -0
- package/dist/0g-compute/sdk-bridge.d.cts.map +1 -0
- package/dist/0g-compute/smoke-test.d.ts +11 -0
- package/dist/0g-compute/smoke-test.d.ts.map +1 -0
- package/dist/0g-compute/smoke-test.js +172 -0
- package/dist/0g-compute/smoke-test.js.map +1 -0
- package/dist/bot/daemon.d.ts +34 -0
- package/dist/bot/daemon.d.ts.map +1 -0
- package/dist/bot/daemon.js +386 -0
- package/dist/bot/daemon.js.map +1 -0
- package/dist/bot/executor.d.ts +14238 -0
- package/dist/bot/executor.d.ts.map +1 -0
- package/dist/bot/executor.js +183 -0
- package/dist/bot/executor.js.map +1 -0
- package/dist/bot/nonce-queue.d.ts +20 -0
- package/dist/bot/nonce-queue.d.ts.map +1 -0
- package/dist/bot/nonce-queue.js +41 -0
- package/dist/bot/nonce-queue.js.map +1 -0
- package/dist/bot/notify.d.ts +15 -0
- package/dist/bot/notify.d.ts.map +1 -0
- package/dist/bot/notify.js +98 -0
- package/dist/bot/notify.js.map +1 -0
- package/dist/bot/orders.d.ts +30 -0
- package/dist/bot/orders.d.ts.map +1 -0
- package/dist/bot/orders.js +172 -0
- package/dist/bot/orders.js.map +1 -0
- package/dist/bot/state.d.ts +14 -0
- package/dist/bot/state.d.ts.map +1 -0
- package/dist/bot/state.js +109 -0
- package/dist/bot/state.js.map +1 -0
- package/dist/bot/stream.d.ts +28 -0
- package/dist/bot/stream.d.ts.map +1 -0
- package/dist/bot/stream.js +96 -0
- package/dist/bot/stream.js.map +1 -0
- package/dist/bot/triggers.d.ts +17 -0
- package/dist/bot/triggers.d.ts.map +1 -0
- package/dist/bot/triggers.js +95 -0
- package/dist/bot/triggers.js.map +1 -0
- package/dist/bot/types.d.ts +199 -0
- package/dist/bot/types.d.ts.map +1 -0
- package/dist/bot/types.js +12 -0
- package/dist/bot/types.js.map +1 -0
- package/dist/chainscan/client.d.ts +28 -0
- package/dist/chainscan/client.d.ts.map +1 -0
- package/dist/chainscan/client.js +361 -0
- package/dist/chainscan/client.js.map +1 -0
- package/dist/chainscan/constants.d.ts +15 -0
- package/dist/chainscan/constants.d.ts.map +1 -0
- package/dist/chainscan/constants.js +15 -0
- package/dist/chainscan/constants.js.map +1 -0
- package/dist/chainscan/types.d.ts +148 -0
- package/dist/chainscan/types.d.ts.map +1 -0
- package/dist/chainscan/types.js +2 -0
- package/dist/chainscan/types.js.map +1 -0
- package/dist/chainscan/validation.d.ts +35 -0
- package/dist/chainscan/validation.d.ts.map +1 -0
- package/dist/chainscan/validation.js +97 -0
- package/dist/chainscan/validation.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +328 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/0g-compute.d.ts +21 -0
- package/dist/commands/0g-compute.d.ts.map +1 -0
- package/dist/commands/0g-compute.js +850 -0
- package/dist/commands/0g-compute.js.map +1 -0
- package/dist/commands/chainscan.d.ts +17 -0
- package/dist/commands/chainscan.d.ts.map +1 -0
- package/dist/commands/chainscan.js +605 -0
- package/dist/commands/chainscan.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +251 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/echobook.d.ts +17 -0
- package/dist/commands/echobook.d.ts.map +1 -0
- package/dist/commands/echobook.js +905 -0
- package/dist/commands/echobook.js.map +1 -0
- package/dist/commands/jaine-subgraph.d.ts +3 -0
- package/dist/commands/jaine-subgraph.d.ts.map +1 -0
- package/dist/commands/jaine-subgraph.js +565 -0
- package/dist/commands/jaine-subgraph.js.map +1 -0
- package/dist/commands/jaine.d.ts +3 -0
- package/dist/commands/jaine.d.ts.map +1 -0
- package/dist/commands/jaine.js +1415 -0
- package/dist/commands/jaine.js.map +1 -0
- package/dist/commands/marketmaker.d.ts +6 -0
- package/dist/commands/marketmaker.d.ts.map +1 -0
- package/dist/commands/marketmaker.js +451 -0
- package/dist/commands/marketmaker.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +229 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +263 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/slop-app.d.ts +9 -0
- package/dist/commands/slop-app.d.ts.map +1 -0
- package/dist/commands/slop-app.js +708 -0
- package/dist/commands/slop-app.js.map +1 -0
- package/dist/commands/slop-stream.d.ts +9 -0
- package/dist/commands/slop-stream.d.ts.map +1 -0
- package/dist/commands/slop-stream.js +99 -0
- package/dist/commands/slop-stream.js.map +1 -0
- package/dist/commands/slop.d.ts +3 -0
- package/dist/commands/slop.d.ts.map +1 -0
- package/dist/commands/slop.js +1053 -0
- package/dist/commands/slop.js.map +1 -0
- package/dist/commands/wallet.d.ts +13 -0
- package/dist/commands/wallet.d.ts.map +1 -0
- package/dist/commands/wallet.js +748 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/config/paths.d.ts +13 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +33 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/store.d.ts +48 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +113 -0
- package/dist/config/store.js.map +1 -0
- package/dist/constants/chain.d.ts +57 -0
- package/dist/constants/chain.d.ts.map +1 -0
- package/dist/constants/chain.js +51 -0
- package/dist/constants/chain.js.map +1 -0
- package/dist/echobook/api.d.ts +38 -0
- package/dist/echobook/api.d.ts.map +1 -0
- package/dist/echobook/api.js +86 -0
- package/dist/echobook/api.js.map +1 -0
- package/dist/echobook/auth.d.ts +31 -0
- package/dist/echobook/auth.d.ts.map +1 -0
- package/dist/echobook/auth.js +93 -0
- package/dist/echobook/auth.js.map +1 -0
- package/dist/echobook/comments.d.ts +26 -0
- package/dist/echobook/comments.d.ts.map +1 -0
- package/dist/echobook/comments.js +20 -0
- package/dist/echobook/comments.js.map +1 -0
- package/dist/echobook/follows.d.ts +19 -0
- package/dist/echobook/follows.d.ts.map +1 -0
- package/dist/echobook/follows.js +21 -0
- package/dist/echobook/follows.js.map +1 -0
- package/dist/echobook/jwtCache.d.ts +15 -0
- package/dist/echobook/jwtCache.d.ts.map +1 -0
- package/dist/echobook/jwtCache.js +63 -0
- package/dist/echobook/jwtCache.js.map +1 -0
- package/dist/echobook/notifications.d.ts +30 -0
- package/dist/echobook/notifications.d.ts.map +1 -0
- package/dist/echobook/notifications.js +26 -0
- package/dist/echobook/notifications.js.map +1 -0
- package/dist/echobook/points.d.ts +35 -0
- package/dist/echobook/points.d.ts.map +1 -0
- package/dist/echobook/points.js +20 -0
- package/dist/echobook/points.js.map +1 -0
- package/dist/echobook/posts.d.ts +46 -0
- package/dist/echobook/posts.d.ts.map +1 -0
- package/dist/echobook/posts.js +43 -0
- package/dist/echobook/posts.js.map +1 -0
- package/dist/echobook/profile.d.ts +29 -0
- package/dist/echobook/profile.d.ts.map +1 -0
- package/dist/echobook/profile.js +14 -0
- package/dist/echobook/profile.js.map +1 -0
- package/dist/echobook/submolts.d.ts +22 -0
- package/dist/echobook/submolts.d.ts.map +1 -0
- package/dist/echobook/submolts.js +24 -0
- package/dist/echobook/submolts.js.map +1 -0
- package/dist/echobook/tradeProof.d.ts +21 -0
- package/dist/echobook/tradeProof.d.ts.map +1 -0
- package/dist/echobook/tradeProof.js +14 -0
- package/dist/echobook/tradeProof.js.map +1 -0
- package/dist/echobook/votes.d.ts +17 -0
- package/dist/echobook/votes.d.ts.map +1 -0
- package/dist/echobook/votes.js +20 -0
- package/dist/echobook/votes.js.map +1 -0
- package/dist/errors.d.ts +125 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +147 -0
- package/dist/errors.js.map +1 -0
- package/dist/intents/store.d.ts +22 -0
- package/dist/intents/store.d.ts.map +1 -0
- package/dist/intents/store.js +76 -0
- package/dist/intents/store.js.map +1 -0
- package/dist/intents/types.d.ts +21 -0
- package/dist/intents/types.d.ts.map +1 -0
- package/dist/intents/types.js +2 -0
- package/dist/intents/types.js.map +1 -0
- package/dist/jaine/abi/erc20.d.ts +90 -0
- package/dist/jaine/abi/erc20.d.ts.map +1 -0
- package/dist/jaine/abi/erc20.js +65 -0
- package/dist/jaine/abi/erc20.js.map +1 -0
- package/dist/jaine/abi/factory.d.ts +38 -0
- package/dist/jaine/abi/factory.d.ts.map +1 -0
- package/dist/jaine/abi/factory.js +26 -0
- package/dist/jaine/abi/factory.js.map +1 -0
- package/dist/jaine/abi/index.d.ts +11 -0
- package/dist/jaine/abi/index.d.ts.map +1 -0
- package/dist/jaine/abi/index.js +11 -0
- package/dist/jaine/abi/index.js.map +1 -0
- package/dist/jaine/abi/nftManager.d.ts +282 -0
- package/dist/jaine/abi/nftManager.d.ts.map +1 -0
- package/dist/jaine/abi/nftManager.js +182 -0
- package/dist/jaine/abi/nftManager.js.map +1 -0
- package/dist/jaine/abi/pool.d.ts +77 -0
- package/dist/jaine/abi/pool.d.ts.map +1 -0
- package/dist/jaine/abi/pool.js +56 -0
- package/dist/jaine/abi/pool.js.map +1 -0
- package/dist/jaine/abi/quoter.d.ts +84 -0
- package/dist/jaine/abi/quoter.d.ts.map +1 -0
- package/dist/jaine/abi/quoter.js +53 -0
- package/dist/jaine/abi/quoter.js.map +1 -0
- package/dist/jaine/abi/router.d.ts +135 -0
- package/dist/jaine/abi/router.d.ts.map +1 -0
- package/dist/jaine/abi/router.js +88 -0
- package/dist/jaine/abi/router.js.map +1 -0
- package/dist/jaine/abi/w0g.d.ts +41 -0
- package/dist/jaine/abi/w0g.d.ts.map +1 -0
- package/dist/jaine/abi/w0g.js +34 -0
- package/dist/jaine/abi/w0g.js.map +1 -0
- package/dist/jaine/allowance.d.ts +48 -0
- package/dist/jaine/allowance.d.ts.map +1 -0
- package/dist/jaine/allowance.js +192 -0
- package/dist/jaine/allowance.js.map +1 -0
- package/dist/jaine/coreTokens.d.ts +32 -0
- package/dist/jaine/coreTokens.d.ts.map +1 -0
- package/dist/jaine/coreTokens.js +91 -0
- package/dist/jaine/coreTokens.js.map +1 -0
- package/dist/jaine/pathEncoding.d.ts +39 -0
- package/dist/jaine/pathEncoding.d.ts.map +1 -0
- package/dist/jaine/pathEncoding.js +98 -0
- package/dist/jaine/pathEncoding.js.map +1 -0
- package/dist/jaine/paths.d.ts +11 -0
- package/dist/jaine/paths.d.ts.map +1 -0
- package/dist/jaine/paths.js +20 -0
- package/dist/jaine/paths.js.map +1 -0
- package/dist/jaine/poolCache.d.ts +47 -0
- package/dist/jaine/poolCache.d.ts.map +1 -0
- package/dist/jaine/poolCache.js +195 -0
- package/dist/jaine/poolCache.js.map +1 -0
- package/dist/jaine/routing.d.ts +41 -0
- package/dist/jaine/routing.d.ts.map +1 -0
- package/dist/jaine/routing.js +247 -0
- package/dist/jaine/routing.js.map +1 -0
- package/dist/jaine/subgraph/client.d.ts +26 -0
- package/dist/jaine/subgraph/client.d.ts.map +1 -0
- package/dist/jaine/subgraph/client.js +201 -0
- package/dist/jaine/subgraph/client.js.map +1 -0
- package/dist/jaine/subgraph/constants.d.ts +9 -0
- package/dist/jaine/subgraph/constants.d.ts.map +1 -0
- package/dist/jaine/subgraph/constants.js +9 -0
- package/dist/jaine/subgraph/constants.js.map +1 -0
- package/dist/jaine/subgraph/queries.d.ts +21 -0
- package/dist/jaine/subgraph/queries.d.ts.map +1 -0
- package/dist/jaine/subgraph/queries.js +304 -0
- package/dist/jaine/subgraph/queries.js.map +1 -0
- package/dist/jaine/subgraph/types.d.ts +209 -0
- package/dist/jaine/subgraph/types.d.ts.map +1 -0
- package/dist/jaine/subgraph/types.js +7 -0
- package/dist/jaine/subgraph/types.js.map +1 -0
- package/dist/jaine/userTokens.d.ts +27 -0
- package/dist/jaine/userTokens.d.ts.map +1 -0
- package/dist/jaine/userTokens.js +89 -0
- package/dist/jaine/userTokens.js.map +1 -0
- package/dist/openclaw/config.d.ts +43 -0
- package/dist/openclaw/config.d.ts.map +1 -0
- package/dist/openclaw/config.js +231 -0
- package/dist/openclaw/config.js.map +1 -0
- package/dist/openclaw/hooks-client.d.ts +24 -0
- package/dist/openclaw/hooks-client.d.ts.map +1 -0
- package/dist/openclaw/hooks-client.js +119 -0
- package/dist/openclaw/hooks-client.js.map +1 -0
- package/dist/slop/abi/factory.d.ts +128 -0
- package/dist/slop/abi/factory.d.ts.map +1 -0
- package/dist/slop/abi/factory.js +70 -0
- package/dist/slop/abi/factory.js.map +1 -0
- package/dist/slop/abi/feeCollector.d.ts +95 -0
- package/dist/slop/abi/feeCollector.d.ts.map +1 -0
- package/dist/slop/abi/feeCollector.js +71 -0
- package/dist/slop/abi/feeCollector.js.map +1 -0
- package/dist/slop/abi/index.d.ts +5 -0
- package/dist/slop/abi/index.d.ts.map +1 -0
- package/dist/slop/abi/index.js +5 -0
- package/dist/slop/abi/index.js.map +1 -0
- package/dist/slop/abi/registry.d.ts +135 -0
- package/dist/slop/abi/registry.d.ts.map +1 -0
- package/dist/slop/abi/registry.js +90 -0
- package/dist/slop/abi/registry.js.map +1 -0
- package/dist/slop/abi/token.d.ts +320 -0
- package/dist/slop/abi/token.d.ts.map +1 -0
- package/dist/slop/abi/token.js +251 -0
- package/dist/slop/abi/token.js.map +1 -0
- package/dist/slop/auth.d.ts +19 -0
- package/dist/slop/auth.d.ts.map +1 -0
- package/dist/slop/auth.js +92 -0
- package/dist/slop/auth.js.map +1 -0
- package/dist/slop/jwtCache.d.ts +27 -0
- package/dist/slop/jwtCache.d.ts.map +1 -0
- package/dist/slop/jwtCache.js +91 -0
- package/dist/slop/jwtCache.js.map +1 -0
- package/dist/slop/quote.d.ts +80 -0
- package/dist/slop/quote.d.ts.map +1 -0
- package/dist/slop/quote.js +174 -0
- package/dist/slop/quote.js.map +1 -0
- package/dist/utils/canonicalJson.d.ts +8 -0
- package/dist/utils/canonicalJson.d.ts.map +1 -0
- package/dist/utils/canonicalJson.js +20 -0
- package/dist/utils/canonicalJson.js.map +1 -0
- package/dist/utils/env.d.ts +11 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +20 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/http.d.ts +19 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +61 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +21 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/output.d.ts +29 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +51 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/rateLimit.d.ts +22 -0
- package/dist/utils/rateLimit.d.ts.map +1 -0
- package/dist/utils/rateLimit.js +58 -0
- package/dist/utils/rateLimit.js.map +1 -0
- package/dist/utils/respond.d.ts +19 -0
- package/dist/utils/respond.d.ts.map +1 -0
- package/dist/utils/respond.js +25 -0
- package/dist/utils/respond.js.map +1 -0
- package/dist/utils/ui.d.ts +38 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +126 -0
- package/dist/utils/ui.js.map +1 -0
- package/dist/wallet/client.d.ts +4 -0
- package/dist/wallet/client.d.ts.map +1 -0
- package/dist/wallet/client.js +53 -0
- package/dist/wallet/client.js.map +1 -0
- package/dist/wallet/keystore.d.ts +22 -0
- package/dist/wallet/keystore.d.ts.map +1 -0
- package/dist/wallet/keystore.js +111 -0
- package/dist/wallet/keystore.js.map +1 -0
- package/package.json +63 -0
- package/skills/echo/SKILL.md +1121 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { maxUint256, getAddress } from "viem";
|
|
2
|
+
import { createWalletClient, http } from "viem";
|
|
3
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
4
|
+
import { ERC20_EXTENDED_ABI } from "./abi/erc20.js";
|
|
5
|
+
import { getPublicClient } from "../wallet/client.js";
|
|
6
|
+
import { loadConfig } from "../config/store.js";
|
|
7
|
+
import { EchoError, ErrorCodes } from "../errors.js";
|
|
8
|
+
import logger from "../utils/logger.js";
|
|
9
|
+
/**
|
|
10
|
+
* Allowed spenders - only these addresses can be approved
|
|
11
|
+
*/
|
|
12
|
+
export function getAllowedSpenders() {
|
|
13
|
+
const cfg = loadConfig();
|
|
14
|
+
return {
|
|
15
|
+
router: cfg.protocol.jaineRouter,
|
|
16
|
+
nft: cfg.protocol.nftPositionManager,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Validate that spender is in the allowlist
|
|
21
|
+
*/
|
|
22
|
+
export function validateSpender(spender) {
|
|
23
|
+
const allowed = getAllowedSpenders();
|
|
24
|
+
const isAllowed = Object.values(allowed).some((addr) => getAddress(addr) === getAddress(spender));
|
|
25
|
+
if (!isAllowed) {
|
|
26
|
+
throw new EchoError(ErrorCodes.INVALID_SPENDER, `Spender ${spender} is not in allowlist`, `Allowed spenders: router (${allowed.router}), nft (${allowed.nft})`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get spender address by type
|
|
31
|
+
*/
|
|
32
|
+
export function getSpenderAddress(spenderType) {
|
|
33
|
+
const allowed = getAllowedSpenders();
|
|
34
|
+
return allowed[spenderType];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get current allowance for a token
|
|
38
|
+
*/
|
|
39
|
+
export async function getAllowance(token, owner, spender) {
|
|
40
|
+
const client = getPublicClient();
|
|
41
|
+
const allowance = await client.readContract({
|
|
42
|
+
address: token,
|
|
43
|
+
abi: ERC20_EXTENDED_ABI,
|
|
44
|
+
functionName: "allowance",
|
|
45
|
+
args: [owner, spender],
|
|
46
|
+
});
|
|
47
|
+
return allowance;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get allowances for both spenders
|
|
51
|
+
*/
|
|
52
|
+
export async function getAllAllowances(token, owner) {
|
|
53
|
+
const allowed = getAllowedSpenders();
|
|
54
|
+
const client = getPublicClient();
|
|
55
|
+
const [routerAllowance, nftAllowance] = await Promise.all([
|
|
56
|
+
client.readContract({
|
|
57
|
+
address: token,
|
|
58
|
+
abi: ERC20_EXTENDED_ABI,
|
|
59
|
+
functionName: "allowance",
|
|
60
|
+
args: [owner, allowed.router],
|
|
61
|
+
}),
|
|
62
|
+
client.readContract({
|
|
63
|
+
address: token,
|
|
64
|
+
abi: ERC20_EXTENDED_ABI,
|
|
65
|
+
functionName: "allowance",
|
|
66
|
+
args: [owner, allowed.nft],
|
|
67
|
+
}),
|
|
68
|
+
]);
|
|
69
|
+
return {
|
|
70
|
+
router: routerAllowance,
|
|
71
|
+
nft: nftAllowance,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Safe approve with USDT-style reset handling
|
|
76
|
+
*
|
|
77
|
+
* Some tokens (like USDT) require setting allowance to 0 before
|
|
78
|
+
* setting a new non-zero allowance if current allowance is non-zero.
|
|
79
|
+
*
|
|
80
|
+
* @param token - Token address
|
|
81
|
+
* @param spender - Spender address (must be in allowlist)
|
|
82
|
+
* @param amount - Amount to approve (use maxUint256 for unlimited)
|
|
83
|
+
* @param privateKey - Private key for signing
|
|
84
|
+
* @returns Transaction hash(es)
|
|
85
|
+
*/
|
|
86
|
+
export async function safeApprove(token, spender, amount, privateKey) {
|
|
87
|
+
// Validate spender is in allowlist
|
|
88
|
+
validateSpender(spender);
|
|
89
|
+
const cfg = loadConfig();
|
|
90
|
+
const client = getPublicClient();
|
|
91
|
+
const account = privateKeyToAccount(privateKey);
|
|
92
|
+
const walletClient = createWalletClient({
|
|
93
|
+
account,
|
|
94
|
+
chain: {
|
|
95
|
+
id: cfg.chain.chainId,
|
|
96
|
+
name: "0G",
|
|
97
|
+
nativeCurrency: { name: "0G", symbol: "0G", decimals: 18 },
|
|
98
|
+
rpcUrls: { default: { http: [cfg.chain.rpcUrl] } },
|
|
99
|
+
},
|
|
100
|
+
transport: http(cfg.chain.rpcUrl, {
|
|
101
|
+
timeout: 30_000,
|
|
102
|
+
retryCount: 2,
|
|
103
|
+
}),
|
|
104
|
+
});
|
|
105
|
+
// Check current allowance
|
|
106
|
+
const currentAllowance = await getAllowance(token, account.address, spender);
|
|
107
|
+
// If current allowance is sufficient, no action needed
|
|
108
|
+
if (currentAllowance >= amount) {
|
|
109
|
+
logger.debug(`Allowance already sufficient: ${currentAllowance} >= ${amount}`);
|
|
110
|
+
return { txHash: "0x0" }; // No-op
|
|
111
|
+
}
|
|
112
|
+
let resetTxHash;
|
|
113
|
+
// If current allowance > 0 and < amount, reset to 0 first (USDT-style)
|
|
114
|
+
if (currentAllowance > 0n && currentAllowance < amount) {
|
|
115
|
+
logger.debug("Resetting allowance to 0 (USDT-style)");
|
|
116
|
+
try {
|
|
117
|
+
resetTxHash = await walletClient.writeContract({
|
|
118
|
+
address: token,
|
|
119
|
+
abi: ERC20_EXTENDED_ABI,
|
|
120
|
+
functionName: "approve",
|
|
121
|
+
args: [spender, 0n],
|
|
122
|
+
});
|
|
123
|
+
// Wait for reset tx to confirm
|
|
124
|
+
await client.waitForTransactionReceipt({ hash: resetTxHash });
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
throw new EchoError(ErrorCodes.APPROVAL_FAILED, `Failed to reset allowance: ${err instanceof Error ? err.message : err}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Approve the target amount
|
|
131
|
+
try {
|
|
132
|
+
const txHash = await walletClient.writeContract({
|
|
133
|
+
address: token,
|
|
134
|
+
abi: ERC20_EXTENDED_ABI,
|
|
135
|
+
functionName: "approve",
|
|
136
|
+
args: [spender, amount],
|
|
137
|
+
});
|
|
138
|
+
// Wait for approve tx to confirm before returning
|
|
139
|
+
await client.waitForTransactionReceipt({ hash: txHash });
|
|
140
|
+
return { txHash, resetTxHash };
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
throw new EchoError(ErrorCodes.APPROVAL_FAILED, `Failed to approve: ${err instanceof Error ? err.message : err}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Revoke approval (set to 0)
|
|
148
|
+
*/
|
|
149
|
+
export async function revokeApproval(token, spender, privateKey) {
|
|
150
|
+
// Validate spender is in allowlist
|
|
151
|
+
validateSpender(spender);
|
|
152
|
+
const cfg = loadConfig();
|
|
153
|
+
const account = privateKeyToAccount(privateKey);
|
|
154
|
+
const walletClient = createWalletClient({
|
|
155
|
+
account,
|
|
156
|
+
chain: {
|
|
157
|
+
id: cfg.chain.chainId,
|
|
158
|
+
name: "0G",
|
|
159
|
+
nativeCurrency: { name: "0G", symbol: "0G", decimals: 18 },
|
|
160
|
+
rpcUrls: { default: { http: [cfg.chain.rpcUrl] } },
|
|
161
|
+
},
|
|
162
|
+
transport: http(cfg.chain.rpcUrl, {
|
|
163
|
+
timeout: 30_000,
|
|
164
|
+
retryCount: 2,
|
|
165
|
+
}),
|
|
166
|
+
});
|
|
167
|
+
try {
|
|
168
|
+
const txHash = await walletClient.writeContract({
|
|
169
|
+
address: token,
|
|
170
|
+
abi: ERC20_EXTENDED_ABI,
|
|
171
|
+
functionName: "approve",
|
|
172
|
+
args: [spender, 0n],
|
|
173
|
+
});
|
|
174
|
+
return txHash;
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
throw new EchoError(ErrorCodes.APPROVAL_FAILED, `Failed to revoke approval: ${err instanceof Error ? err.message : err}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Ensure allowance is sufficient, approve if needed
|
|
182
|
+
*/
|
|
183
|
+
export async function ensureAllowance(token, spender, requiredAmount, privateKey, approveExact = false) {
|
|
184
|
+
const account = privateKeyToAccount(privateKey);
|
|
185
|
+
const currentAllowance = await getAllowance(token, account.address, spender);
|
|
186
|
+
if (currentAllowance >= requiredAmount) {
|
|
187
|
+
return null; // No approval needed
|
|
188
|
+
}
|
|
189
|
+
const approveAmount = approveExact ? requiredAmount : maxUint256;
|
|
190
|
+
return safeApprove(token, spender, approveAmount, privateKey);
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=allowance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowance.js","sourceRoot":"","sources":["../../src/jaine/allowance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Address } from "viem";
|
|
2
|
+
/**
|
|
3
|
+
* Core tokens on 0G mainnet supported by Jaine DEX
|
|
4
|
+
* Addresses from MOLTBOT/jaine.md
|
|
5
|
+
*/
|
|
6
|
+
export declare const CORE_TOKENS: Record<string, Address>;
|
|
7
|
+
/** List of core token symbols */
|
|
8
|
+
export declare const CORE_TOKEN_SYMBOLS: (keyof typeof CORE_TOKENS)[];
|
|
9
|
+
/**
|
|
10
|
+
* Resolve token symbol or address to checksummed address
|
|
11
|
+
* @param tokenOrSymbol - Token symbol (e.g., "USDC") or address (0x...)
|
|
12
|
+
* @param userAliases - Optional user-defined token aliases
|
|
13
|
+
* @returns Checksummed address
|
|
14
|
+
* @throws EchoError if token not found
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveToken(tokenOrSymbol: string, userAliases?: Record<string, Address>): Address;
|
|
17
|
+
/**
|
|
18
|
+
* Get symbol for a token address (reverse lookup)
|
|
19
|
+
* @param address - Token address
|
|
20
|
+
* @param userAliases - Optional user-defined token aliases
|
|
21
|
+
* @returns Symbol if found, shortened address otherwise
|
|
22
|
+
*/
|
|
23
|
+
export declare function getTokenSymbol(address: Address, userAliases?: Record<string, Address>): string;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a token is a core token
|
|
26
|
+
*/
|
|
27
|
+
export declare function isCoreToken(address: Address): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Get all core token addresses
|
|
30
|
+
*/
|
|
31
|
+
export declare function getCoreTokenAddresses(): Address[];
|
|
32
|
+
//# sourceMappingURL=coreTokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coreTokens.d.ts","sourceRoot":"","sources":["../../src/jaine/coreTokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAIpC;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAatC,CAAC;AAEX,iCAAiC;AACjC,eAAO,MAAM,kBAAkB,EAA+B,CAAC,MAAM,OAAO,WAAW,CAAC,EAAE,CAAC;AAE3F;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,OAAO,CA8BT;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,MAAM,CAqBR;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAGrD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,EAAE,CAEjD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { isAddress, getAddress } from "viem";
|
|
2
|
+
import { EchoError, ErrorCodes } from "../errors.js";
|
|
3
|
+
/**
|
|
4
|
+
* Core tokens on 0G mainnet supported by Jaine DEX
|
|
5
|
+
* Addresses from MOLTBOT/jaine.md
|
|
6
|
+
*/
|
|
7
|
+
export const CORE_TOKENS = {
|
|
8
|
+
USDC: "0x1f3aa82227281ca364bfb3d253b0f1af1da6473e",
|
|
9
|
+
WETH: "0x564770837ef8bbf077cfe54e5f6106538c815b22",
|
|
10
|
+
stgUSDT: "0x9FBBAFC2Ad79af2b57eD23C60DfF79eF5c2b0FB5",
|
|
11
|
+
stgUSDC: "0x8a2B28364102Bea189D99A475C494330Ef2bDD0B",
|
|
12
|
+
w0G: "0x1Cd0690fF9a693f5EF2dD976660a8dAFc81A109c",
|
|
13
|
+
st0G: "0x7bBC63D01CA42491c3E084C941c3E86e55951404",
|
|
14
|
+
wstETH: "0x161a128567BF0C005b58211757F7e46eed983F02",
|
|
15
|
+
PAI: "0x59ef6F3943bBdFE2fB19565037Ac85071223E94C",
|
|
16
|
+
oUSDT: "0x1217BfE6c773EEC6cc4A38b5Dc45B92292B6E189",
|
|
17
|
+
LINK: "0x76159c2b43ff6F630193e37EC68452169914C1Bb",
|
|
18
|
+
coinbaseBTC: "0xa5613ac7f1E83a68719b1398c8F6aAA25581db82",
|
|
19
|
+
HAIO: "0xbCB868d3d0A823ced82B77DD72E4f7A3C720A40E",
|
|
20
|
+
};
|
|
21
|
+
/** List of core token symbols */
|
|
22
|
+
export const CORE_TOKEN_SYMBOLS = Object.keys(CORE_TOKENS);
|
|
23
|
+
/**
|
|
24
|
+
* Resolve token symbol or address to checksummed address
|
|
25
|
+
* @param tokenOrSymbol - Token symbol (e.g., "USDC") or address (0x...)
|
|
26
|
+
* @param userAliases - Optional user-defined token aliases
|
|
27
|
+
* @returns Checksummed address
|
|
28
|
+
* @throws EchoError if token not found
|
|
29
|
+
*/
|
|
30
|
+
export function resolveToken(tokenOrSymbol, userAliases) {
|
|
31
|
+
// If it's already a valid address, return checksummed
|
|
32
|
+
if (isAddress(tokenOrSymbol)) {
|
|
33
|
+
return getAddress(tokenOrSymbol);
|
|
34
|
+
}
|
|
35
|
+
// Normalize symbol to match case-insensitive
|
|
36
|
+
const upperSymbol = tokenOrSymbol.toUpperCase();
|
|
37
|
+
// Check user aliases first (they have priority)
|
|
38
|
+
if (userAliases) {
|
|
39
|
+
for (const [symbol, addr] of Object.entries(userAliases)) {
|
|
40
|
+
if (symbol.toUpperCase() === upperSymbol) {
|
|
41
|
+
return getAddress(addr);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Check core tokens (case-insensitive)
|
|
46
|
+
for (const [symbol, addr] of Object.entries(CORE_TOKENS)) {
|
|
47
|
+
if (symbol.toUpperCase() === upperSymbol) {
|
|
48
|
+
return getAddress(addr);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
throw new EchoError(ErrorCodes.TOKEN_NOT_FOUND, `Token not found: ${tokenOrSymbol}`, `Use a valid address or one of: ${CORE_TOKEN_SYMBOLS.join(", ")}`);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get symbol for a token address (reverse lookup)
|
|
55
|
+
* @param address - Token address
|
|
56
|
+
* @param userAliases - Optional user-defined token aliases
|
|
57
|
+
* @returns Symbol if found, shortened address otherwise
|
|
58
|
+
*/
|
|
59
|
+
export function getTokenSymbol(address, userAliases) {
|
|
60
|
+
const checksummed = getAddress(address);
|
|
61
|
+
// Check user aliases first
|
|
62
|
+
if (userAliases) {
|
|
63
|
+
for (const [symbol, addr] of Object.entries(userAliases)) {
|
|
64
|
+
if (getAddress(addr) === checksummed) {
|
|
65
|
+
return symbol;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Check core tokens
|
|
70
|
+
for (const [symbol, addr] of Object.entries(CORE_TOKENS)) {
|
|
71
|
+
if (getAddress(addr) === checksummed) {
|
|
72
|
+
return symbol;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Return shortened address if not found
|
|
76
|
+
return `${checksummed.slice(0, 6)}...${checksummed.slice(-4)}`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if a token is a core token
|
|
80
|
+
*/
|
|
81
|
+
export function isCoreToken(address) {
|
|
82
|
+
const checksummed = getAddress(address);
|
|
83
|
+
return Object.values(CORE_TOKENS).some((addr) => getAddress(addr) === checksummed);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get all core token addresses
|
|
87
|
+
*/
|
|
88
|
+
export function getCoreTokenAddresses() {
|
|
89
|
+
return Object.values(CORE_TOKENS).map((addr) => getAddress(addr));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=coreTokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coreTokens.js","sourceRoot":"","sources":["../../src/jaine/coreTokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Address, Hex } from "viem";
|
|
2
|
+
/**
|
|
3
|
+
* Encode path for Uniswap V3 exactInput
|
|
4
|
+
* Format: token0 + fee0 + token1 + fee1 + token2 + ...
|
|
5
|
+
*
|
|
6
|
+
* @param tokens - Array of token addresses in swap order
|
|
7
|
+
* @param fees - Array of fee tiers (length = tokens.length - 1)
|
|
8
|
+
* @returns Encoded path bytes
|
|
9
|
+
*/
|
|
10
|
+
export declare function encodePath(tokens: Address[], fees: number[]): Hex;
|
|
11
|
+
/**
|
|
12
|
+
* Encode path for Uniswap V3 exactOutput
|
|
13
|
+
* Note: exactOutput requires REVERSED path (tokenOut first)
|
|
14
|
+
*
|
|
15
|
+
* @param tokens - Array of token addresses in swap order (tokenIn → tokenOut)
|
|
16
|
+
* @param fees - Array of fee tiers
|
|
17
|
+
* @returns Encoded path bytes (reversed for exactOutput)
|
|
18
|
+
*/
|
|
19
|
+
export declare function encodePathForExactOutput(tokens: Address[], fees: number[]): Hex;
|
|
20
|
+
/**
|
|
21
|
+
* Decode path bytes into tokens and fees
|
|
22
|
+
*
|
|
23
|
+
* @param path - Encoded path bytes
|
|
24
|
+
* @returns Object with tokens array and fees array
|
|
25
|
+
*/
|
|
26
|
+
export declare function decodePath(path: Hex): {
|
|
27
|
+
tokens: Address[];
|
|
28
|
+
fees: number[];
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Calculate the number of hops in a path
|
|
32
|
+
*/
|
|
33
|
+
export declare function getPathHops(tokens: Address[]): number;
|
|
34
|
+
/**
|
|
35
|
+
* Format path as human-readable string
|
|
36
|
+
* e.g., "USDC → [0.3%] → w0G → [0.05%] → WETH"
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatPath(tokens: Address[], fees: number[], getSymbol: (addr: Address) => string): string;
|
|
39
|
+
//# sourceMappingURL=pathEncoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathEncoding.d.ts","sourceRoot":"","sources":["../../src/jaine/pathEncoding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAGzC;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAwBjE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAK/E;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG;IAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CA4B3E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,OAAO,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GACnC,MAAM,CAaR"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { concat, pad, toHex } from "viem";
|
|
2
|
+
/**
|
|
3
|
+
* Encode path for Uniswap V3 exactInput
|
|
4
|
+
* Format: token0 + fee0 + token1 + fee1 + token2 + ...
|
|
5
|
+
*
|
|
6
|
+
* @param tokens - Array of token addresses in swap order
|
|
7
|
+
* @param fees - Array of fee tiers (length = tokens.length - 1)
|
|
8
|
+
* @returns Encoded path bytes
|
|
9
|
+
*/
|
|
10
|
+
export function encodePath(tokens, fees) {
|
|
11
|
+
if (tokens.length < 2) {
|
|
12
|
+
throw new Error("Path must have at least 2 tokens");
|
|
13
|
+
}
|
|
14
|
+
if (fees.length !== tokens.length - 1) {
|
|
15
|
+
throw new Error("Fees length must be tokens.length - 1");
|
|
16
|
+
}
|
|
17
|
+
// Each address is 20 bytes, each fee is 3 bytes
|
|
18
|
+
const parts = [];
|
|
19
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
20
|
+
// Add token address (20 bytes)
|
|
21
|
+
parts.push(tokens[i].toLowerCase());
|
|
22
|
+
// Add fee if not last token (3 bytes)
|
|
23
|
+
if (i < fees.length) {
|
|
24
|
+
// Fee is uint24, encode as 3 bytes
|
|
25
|
+
const feeHex = pad(toHex(fees[i]), { size: 3 });
|
|
26
|
+
parts.push(feeHex);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return concat(parts);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Encode path for Uniswap V3 exactOutput
|
|
33
|
+
* Note: exactOutput requires REVERSED path (tokenOut first)
|
|
34
|
+
*
|
|
35
|
+
* @param tokens - Array of token addresses in swap order (tokenIn → tokenOut)
|
|
36
|
+
* @param fees - Array of fee tiers
|
|
37
|
+
* @returns Encoded path bytes (reversed for exactOutput)
|
|
38
|
+
*/
|
|
39
|
+
export function encodePathForExactOutput(tokens, fees) {
|
|
40
|
+
// Reverse both arrays for exactOutput
|
|
41
|
+
const reversedTokens = [...tokens].reverse();
|
|
42
|
+
const reversedFees = [...fees].reverse();
|
|
43
|
+
return encodePath(reversedTokens, reversedFees);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Decode path bytes into tokens and fees
|
|
47
|
+
*
|
|
48
|
+
* @param path - Encoded path bytes
|
|
49
|
+
* @returns Object with tokens array and fees array
|
|
50
|
+
*/
|
|
51
|
+
export function decodePath(path) {
|
|
52
|
+
// Remove 0x prefix
|
|
53
|
+
const data = path.slice(2);
|
|
54
|
+
// Each token is 20 bytes (40 hex chars), each fee is 3 bytes (6 hex chars)
|
|
55
|
+
const tokens = [];
|
|
56
|
+
const fees = [];
|
|
57
|
+
let offset = 0;
|
|
58
|
+
let isToken = true;
|
|
59
|
+
while (offset < data.length) {
|
|
60
|
+
if (isToken) {
|
|
61
|
+
// Read 20 bytes for token
|
|
62
|
+
const tokenHex = data.slice(offset, offset + 40);
|
|
63
|
+
tokens.push(`0x${tokenHex}`);
|
|
64
|
+
offset += 40;
|
|
65
|
+
isToken = false;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Read 3 bytes for fee
|
|
69
|
+
const feeHex = data.slice(offset, offset + 6);
|
|
70
|
+
fees.push(parseInt(feeHex, 16));
|
|
71
|
+
offset += 6;
|
|
72
|
+
isToken = true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { tokens, fees };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Calculate the number of hops in a path
|
|
79
|
+
*/
|
|
80
|
+
export function getPathHops(tokens) {
|
|
81
|
+
return tokens.length - 1;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Format path as human-readable string
|
|
85
|
+
* e.g., "USDC → [0.3%] → w0G → [0.05%] → WETH"
|
|
86
|
+
*/
|
|
87
|
+
export function formatPath(tokens, fees, getSymbol) {
|
|
88
|
+
const parts = [];
|
|
89
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
90
|
+
parts.push(getSymbol(tokens[i]));
|
|
91
|
+
if (i < fees.length) {
|
|
92
|
+
const feePercent = (fees[i] / 10000).toFixed(2);
|
|
93
|
+
parts.push(`→ [${feePercent}%] →`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return parts.join(" ");
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=pathEncoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathEncoding.js","sourceRoot":"","sources":["../../src/jaine/pathEncoding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Jaine-specific data directory */
|
|
2
|
+
export declare const JAINE_DIR: string;
|
|
3
|
+
/** Pool cache file */
|
|
4
|
+
export declare const POOLS_CACHE_FILE: string;
|
|
5
|
+
/** User token aliases file */
|
|
6
|
+
export declare const TOKENS_FILE: string;
|
|
7
|
+
/**
|
|
8
|
+
* Ensure Jaine data directory exists
|
|
9
|
+
*/
|
|
10
|
+
export declare function ensureJaineDir(): void;
|
|
11
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/jaine/paths.ts"],"names":[],"mappings":"AAKA,oCAAoC;AACpC,eAAO,MAAM,SAAS,QAA4B,CAAC;AAEnD,sBAAsB;AACtB,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AAEvE,8BAA8B;AAC9B,eAAO,MAAM,WAAW,QAAiC,CAAC;AAE1D;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { CONFIG_DIR } from "../config/paths.js";
|
|
4
|
+
import logger from "../utils/logger.js";
|
|
5
|
+
/** Jaine-specific data directory */
|
|
6
|
+
export const JAINE_DIR = join(CONFIG_DIR, "jaine");
|
|
7
|
+
/** Pool cache file */
|
|
8
|
+
export const POOLS_CACHE_FILE = join(JAINE_DIR, "pools-cache.v1.json");
|
|
9
|
+
/** User token aliases file */
|
|
10
|
+
export const TOKENS_FILE = join(JAINE_DIR, "tokens.json");
|
|
11
|
+
/**
|
|
12
|
+
* Ensure Jaine data directory exists
|
|
13
|
+
*/
|
|
14
|
+
export function ensureJaineDir() {
|
|
15
|
+
if (!existsSync(JAINE_DIR)) {
|
|
16
|
+
mkdirSync(JAINE_DIR, { recursive: true });
|
|
17
|
+
logger.debug(`Created Jaine directory: ${JAINE_DIR}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/jaine/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,oCAAoC;AACpC,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAEnD,sBAAsB;AACtB,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;AAEvE,8BAA8B;AAC9B,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Address } from "viem";
|
|
2
|
+
import { type FeeTier } from "./abi/factory.js";
|
|
3
|
+
export interface PoolInfo {
|
|
4
|
+
address: Address;
|
|
5
|
+
token0: Address;
|
|
6
|
+
token1: Address;
|
|
7
|
+
fee: FeeTier;
|
|
8
|
+
}
|
|
9
|
+
export interface PoolsCache {
|
|
10
|
+
version: number;
|
|
11
|
+
chainId: number;
|
|
12
|
+
generatedAt: string;
|
|
13
|
+
pools: PoolInfo[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load pools cache from disk
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadPoolsCache(): PoolsCache | null;
|
|
19
|
+
/**
|
|
20
|
+
* Save pools cache to disk (atomic write)
|
|
21
|
+
*/
|
|
22
|
+
export declare function savePoolsCache(cache: PoolsCache): void;
|
|
23
|
+
/**
|
|
24
|
+
* Scan factory for pools between core tokens
|
|
25
|
+
* @param feeTiers - Fee tiers to scan (defaults to all standard tiers)
|
|
26
|
+
* @param onProgress - Optional progress callback (poolsFound, pairsScanned)
|
|
27
|
+
*/
|
|
28
|
+
export declare function scanCorePools(feeTiers?: readonly FeeTier[], onProgress?: (poolsFound: number, pairsScanned: number) => void): Promise<PoolInfo[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Get pool for specific token pair and fee
|
|
31
|
+
*/
|
|
32
|
+
export declare function getPool(tokenA: Address, tokenB: Address, fee: FeeTier): Promise<Address | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Sync pool cache from Goldsky subgraph (fast, read-only).
|
|
35
|
+
* Fetches top pools by TVL and maps them to PoolInfo format.
|
|
36
|
+
*/
|
|
37
|
+
export declare function syncPoolsFromSubgraph(maxPools?: number, onProgress?: (poolsFetched: number) => void): Promise<PoolInfo[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Find pools containing a specific token from cache
|
|
40
|
+
*/
|
|
41
|
+
export declare function findPoolsForToken(token: Address, cache?: PoolsCache | null): PoolInfo[];
|
|
42
|
+
/**
|
|
43
|
+
* Find pool between two tokens from cache
|
|
44
|
+
* Returns all matching pools (different fee tiers)
|
|
45
|
+
*/
|
|
46
|
+
export declare function findPoolsBetweenTokens(tokenA: Address, tokenB: Address, cache?: PoolsCache | null): PoolInfo[];
|
|
47
|
+
//# sourceMappingURL=poolCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poolCache.d.ts","sourceRoot":"","sources":["../../src/jaine/poolCache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,EAA0B,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAUxE,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CA0BlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAoBtD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,GAAE,SAAS,OAAO,EAAc,EACxC,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,GAC9D,OAAO,CAAC,QAAQ,EAAE,CAAC,CAsDrB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAmBzB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,GAAE,MAA6C,EACvD,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,GAC1C,OAAO,CAAC,QAAQ,EAAE,CAAC,CA4BrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,QAAQ,EAAE,CAQvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,OAAO,EACf,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,GACxB,QAAQ,EAAE,CAYZ"}
|