@andrewkimjoseph/celina-sdk 0.4.0 → 0.4.1
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 +17 -0
- package/build/services/gooddollar.service.d.ts +1 -1
- package/build/services/gooddollar.service.js +1 -1
- package/build/services/gooddollar.service.js.map +1 -1
- package/build/services/uniswap-path-router.js +43 -43
- package/build/services/uniswap-path-router.js.map +1 -1
- package/build/services/uniswap-pool-discovery.d.ts +13 -0
- package/build/services/uniswap-pool-discovery.js +68 -71
- package/build/services/uniswap-pool-discovery.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,6 +18,8 @@ Requires Node.js ≥ 20.
|
|
|
18
18
|
|
|
19
19
|
- [Quick start](https://andrewkimjoseph.gitbook.io/celina-sdk/getting-started/quick-start)
|
|
20
20
|
- [wagmi integration](https://andrewkimjoseph.gitbook.io/celina-sdk/guides/wagmi-integration)
|
|
21
|
+
- [Aave](https://andrewkimjoseph.gitbook.io/celina-sdk/guides/aave)
|
|
22
|
+
- [GoodDollar UBI](docs/guides/gooddollar.md) — whitelist, daily entitlement, `prepareClaimUbi` on Celo
|
|
21
23
|
- [Carbon DeFi on Celo](docs/guides/carbon.md) — hybrid Carbon REST + `@bancor/carbon-sdk` (25 operations)
|
|
22
24
|
- [Self Agent ID](docs/guides/self-agent-id.md) — verify, register, and refresh human-backed agents on Celo
|
|
23
25
|
- [Telemetry](docs/guides/telemetry.md) — optional Amplitude read metrics (opt out with `CELINA_ANALYTICS_DISABLED=1`)
|
|
@@ -48,8 +50,23 @@ const prepared = await celina.carbon.prepareLimitOrder({
|
|
|
48
50
|
budget: 100,
|
|
49
51
|
});
|
|
50
52
|
// prepared.preparedFlow?.steps → same signing flow; check prepared.warnings
|
|
53
|
+
|
|
54
|
+
// GoodDollar UBI (reads + unsigned claim)
|
|
55
|
+
const eligibility = await celina.gooddollar.getUbiClaimEligibility("0xYourAddress");
|
|
56
|
+
const ubiFlow = await celina.gooddollar.prepareClaimUbi("0xYourAddress");
|
|
57
|
+
// ubiFlow.steps → wagmi sendTransaction (G$ to signer, gas in CELO)
|
|
51
58
|
```
|
|
52
59
|
|
|
60
|
+
## GoodDollar UBI
|
|
61
|
+
|
|
62
|
+
Identity whitelist reads, daily entitlement checks, and unsigned `UBISchemeV2.claim()` preparation on Celo mainnet. One claim per verified identity per day; connected wallets resolve via `getWhitelistedRoot`.
|
|
63
|
+
|
|
64
|
+
| Reads (`celina.gooddollar`) | Prepare (unsigned) |
|
|
65
|
+
|-----------------------------|-------------------|
|
|
66
|
+
| `getWhitelistingInfo`, `getUbiClaimEligibility` | `prepareClaimUbi` |
|
|
67
|
+
|
|
68
|
+
MCP tools: `get_gooddollar_whitelisting_info`, `get_gooddollar_ubi_entitlement` (read); `claim_daily_gooddollar_ubi` (stdio write with server key). Full workflow: [GoodDollar guide](docs/guides/gooddollar.md).
|
|
69
|
+
|
|
53
70
|
## Carbon DeFi
|
|
54
71
|
|
|
55
72
|
Hybrid **Carbon REST** (`https://mcp.carbondefi.xyz`) plus **`@bancor/carbon-sdk`** fallback for trade quotes and taker swaps when REST is unavailable. All 25 operations target Celo mainnet; no private keys — `prepare*` returns unsigned flows for the user’s wallet.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CeloClientFactory } from "../clients/celo-client.js";
|
|
2
2
|
import { type SerializedPreparedFlow } from "../types/prepared.js";
|
|
3
|
-
/** GoodDollar IdentityV4 whitelist
|
|
3
|
+
/** GoodDollar IdentityV4 whitelist, reverification, and daily UBI claim preparation. */
|
|
4
4
|
export declare class GoodDollarService {
|
|
5
5
|
private readonly clientFactory;
|
|
6
6
|
constructor(clientFactory: CeloClientFactory);
|
|
@@ -24,7 +24,7 @@ function statusLabel(status) {
|
|
|
24
24
|
function taggedCalldata(data) {
|
|
25
25
|
return concat([data, CELINA_DATA_SUFFIX]);
|
|
26
26
|
}
|
|
27
|
-
/** GoodDollar IdentityV4 whitelist
|
|
27
|
+
/** GoodDollar IdentityV4 whitelist, reverification, and daily UBI claim preparation. */
|
|
28
28
|
export class GoodDollarService {
|
|
29
29
|
clientFactory;
|
|
30
30
|
constructor(clientFactory) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gooddollar.service.js","sourceRoot":"","sources":["../../src/services/gooddollar.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAY,MAAM,MAAM,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAEL,qBAAqB,GAEtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,YAAY,GAAG,4CAAqD,CAAC;AAE3E,MAAM,aAAa,GAA2B;IAC5C,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,cAAc;IACjB,GAAG,EAAE,aAAa;CACnB,CAAC;AAEF,qFAAqF;AACrF,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAEtC,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,IAAS;IAC/B,OAAO,MAAM,CAAC,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"gooddollar.service.js","sourceRoot":"","sources":["../../src/services/gooddollar.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { v4QuoterAbi } from "../abis/uniswap-v4-quoter.js";
|
|
2
2
|
import { normalizeUniswapPoolKey, UNISWAP_V4, } from "../config/uniswap.js";
|
|
3
|
-
import { getUniswapPoolIndex, } from "./uniswap-pool-discovery.js";
|
|
4
|
-
|
|
3
|
+
import { getUniswapPoolIndex, poolsBetween, } from "./uniswap-pool-discovery.js";
|
|
4
|
+
/** Maximum pools in a route (2 intermediate currencies → 3 pools). */
|
|
5
|
+
const MAX_POOLS = 3;
|
|
5
6
|
function otherToken(poolKey, currency) {
|
|
6
7
|
const c = currency.toLowerCase();
|
|
7
8
|
if (poolKey.currency0.toLowerCase() === c)
|
|
@@ -39,7 +40,7 @@ function enumeratePaths(index, currencyIn, currencyOut) {
|
|
|
39
40
|
const queue = [{ currency: start, pools: [], visited: new Set([start]) }];
|
|
40
41
|
while (queue.length > 0) {
|
|
41
42
|
const node = queue.shift();
|
|
42
|
-
if (node.pools.length >=
|
|
43
|
+
if (node.pools.length >= MAX_POOLS) {
|
|
43
44
|
continue;
|
|
44
45
|
}
|
|
45
46
|
const neighbors = index.adjacency.get(node.currency);
|
|
@@ -50,26 +51,21 @@ function enumeratePaths(index, currencyIn, currencyOut) {
|
|
|
50
51
|
if (node.visited.has(neighbor)) {
|
|
51
52
|
continue;
|
|
52
53
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
queue.push({
|
|
69
|
-
currency: neighbor,
|
|
70
|
-
pools: nextPools,
|
|
71
|
-
visited: new Set([...node.visited, neighbor]),
|
|
72
|
-
});
|
|
54
|
+
// A pair can have several pools (different fee tiers); branch over each so
|
|
55
|
+
// the quoter can pick the genuinely best-priced one.
|
|
56
|
+
for (const poolKey of poolsBetween(index, node.currency, neighbor)) {
|
|
57
|
+
const nextPools = [...node.pools, poolKey];
|
|
58
|
+
if (neighbor === goal) {
|
|
59
|
+
results.push(nextPools);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (nextPools.length < MAX_POOLS) {
|
|
63
|
+
queue.push({
|
|
64
|
+
currency: neighbor,
|
|
65
|
+
pools: nextPools,
|
|
66
|
+
visited: new Set([...node.visited, neighbor]),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
73
69
|
}
|
|
74
70
|
}
|
|
75
71
|
}
|
|
@@ -123,28 +119,32 @@ async function quotePath(client, currencyIn, pools, amountIn) {
|
|
|
123
119
|
export async function findBestUniswapRoute(client, currencyIn, currencyOut, amountIn) {
|
|
124
120
|
const index = await getUniswapPoolIndex(client);
|
|
125
121
|
const candidatePaths = enumeratePaths(index, currencyIn, currencyOut);
|
|
122
|
+
// Quote every candidate path concurrently; failed quotes (e.g. uninitialized
|
|
123
|
+
// pools or insufficient liquidity) are dropped rather than aborting the rest.
|
|
124
|
+
const quotes = await Promise.allSettled(candidatePaths.map(async (pools) => ({
|
|
125
|
+
pools,
|
|
126
|
+
amountOut: await quotePath(client, currencyIn, pools, amountIn),
|
|
127
|
+
})));
|
|
126
128
|
let best = null;
|
|
127
|
-
for (const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (amountOut <= 0n) {
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
if (!best || amountOut > best.amountOut) {
|
|
134
|
-
best = {
|
|
135
|
-
amountOut,
|
|
136
|
-
route: {
|
|
137
|
-
currencyIn,
|
|
138
|
-
currencyOut,
|
|
139
|
-
pools,
|
|
140
|
-
pathKeys: buildPathKeys(pools, currencyIn),
|
|
141
|
-
hops: pools.length,
|
|
142
|
-
},
|
|
143
|
-
};
|
|
144
|
-
}
|
|
129
|
+
for (const quote of quotes) {
|
|
130
|
+
if (quote.status !== "fulfilled") {
|
|
131
|
+
continue;
|
|
145
132
|
}
|
|
146
|
-
|
|
147
|
-
|
|
133
|
+
const { pools, amountOut } = quote.value;
|
|
134
|
+
if (amountOut <= 0n) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (!best || amountOut > best.amountOut) {
|
|
138
|
+
best = {
|
|
139
|
+
amountOut,
|
|
140
|
+
route: {
|
|
141
|
+
currencyIn,
|
|
142
|
+
currencyOut,
|
|
143
|
+
pools,
|
|
144
|
+
pathKeys: buildPathKeys(pools, currencyIn),
|
|
145
|
+
hops: pools.length,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
if (!best) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uniswap-path-router.js","sourceRoot":"","sources":["../../src/services/uniswap-path-router.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,UAAU,GAEX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,mBAAmB,
|
|
1
|
+
{"version":3,"file":"uniswap-path-router.js","sourceRoot":"","sources":["../../src/services/uniswap-path-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,12 @@ export type UniswapPoolIndex = {
|
|
|
14
14
|
edges: UniswapPoolEdge[];
|
|
15
15
|
/** Currency address (lowercase) → neighbor currencies in the graph. */
|
|
16
16
|
adjacency: Map<string, Set<string>>;
|
|
17
|
+
/**
|
|
18
|
+
* Sorted pair key (`tokenLo|tokenHi`, lowercase) → every pool connecting that
|
|
19
|
+
* pair. A single token pair can have several pools across fee tiers, so the
|
|
20
|
+
* router must consider all of them to find the best rate.
|
|
21
|
+
*/
|
|
22
|
+
poolsByPair: Map<string, UniswapPoolKey[]>;
|
|
17
23
|
/** Whether pools came from the v4 subgraph or on-chain hub probing. */
|
|
18
24
|
source: "subgraph" | "onchain";
|
|
19
25
|
fetchedAt: number;
|
|
@@ -31,6 +37,13 @@ export declare function computeUniswapPoolId(poolKey: UniswapPoolKey): `0x${stri
|
|
|
31
37
|
export declare function getUniswapPoolIndex(client: PublicClient, options?: {
|
|
32
38
|
forceRefresh?: boolean;
|
|
33
39
|
}): Promise<UniswapPoolIndex>;
|
|
40
|
+
/**
|
|
41
|
+
* All pools connecting two tokens in a cached index (one per fee tier / hooks).
|
|
42
|
+
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
43
|
+
* @param tokenA - First currency address
|
|
44
|
+
* @param tokenB - Second currency address
|
|
45
|
+
*/
|
|
46
|
+
export declare function poolsBetween(index: UniswapPoolIndex, tokenA: `0x${string}`, tokenB: `0x${string}`): UniswapPoolKey[];
|
|
34
47
|
/**
|
|
35
48
|
* Find a pool key connecting two tokens in a cached index, if present.
|
|
36
49
|
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
@@ -5,6 +5,12 @@ import { encodeAbiParameters, keccak256, parseAbiParameters, } from "viem";
|
|
|
5
5
|
import { stateViewAbi } from "../abis/uniswap-state-view.js";
|
|
6
6
|
import { normalizeUniswapPoolKey, UNISWAP_DEFAULT_TICK_SPACING, UNISWAP_FEE_TIERS, UNISWAP_HUB_CURRENCIES, UNISWAP_POOL_CACHE_TTL_MS, UNISWAP_SUBGRAPH_URL, UNISWAP_V4, } from "../config/uniswap.js";
|
|
7
7
|
let cachedIndex = null;
|
|
8
|
+
/** Canonical lowercase key for the unordered pair `(a, b)`. */
|
|
9
|
+
function pairKey(a, b) {
|
|
10
|
+
const lo = a.toLowerCase();
|
|
11
|
+
const hi = b.toLowerCase();
|
|
12
|
+
return lo < hi ? `${lo}|${hi}` : `${hi}|${lo}`;
|
|
13
|
+
}
|
|
8
14
|
/**
|
|
9
15
|
* Compute the Uniswap v4 pool id (keccak256 of sorted pool key fields).
|
|
10
16
|
* @param poolKey - Pool key (normalized so currency0 sorts before currency1)
|
|
@@ -19,24 +25,45 @@ export function computeUniswapPoolId(poolKey) {
|
|
|
19
25
|
normalized.hooks,
|
|
20
26
|
]));
|
|
21
27
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Build a routing index from raw pool keys: dedup by pool id, then derive the
|
|
30
|
+
* edge list, currency adjacency, and per-pair pool buckets.
|
|
31
|
+
*/
|
|
32
|
+
function buildPoolIndex(poolKeys, source) {
|
|
33
|
+
const edges = [];
|
|
34
|
+
const adjacency = new Map();
|
|
35
|
+
const poolsByPair = new Map();
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
for (const key of poolKeys) {
|
|
38
|
+
const normalized = normalizeUniswapPoolKey(key);
|
|
39
|
+
const id = computeUniswapPoolId(normalized);
|
|
40
|
+
if (seen.has(id)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
seen.add(id);
|
|
44
|
+
const a = normalized.currency0.toLowerCase();
|
|
45
|
+
const b = normalized.currency1.toLowerCase();
|
|
46
|
+
edges.push({
|
|
47
|
+
poolKey: normalized,
|
|
48
|
+
tokenA: normalized.currency0,
|
|
49
|
+
tokenB: normalized.currency1,
|
|
50
|
+
});
|
|
51
|
+
if (!adjacency.has(a))
|
|
52
|
+
adjacency.set(a, new Set());
|
|
53
|
+
if (!adjacency.has(b))
|
|
54
|
+
adjacency.set(b, new Set());
|
|
55
|
+
adjacency.get(a).add(b);
|
|
56
|
+
adjacency.get(b).add(a);
|
|
57
|
+
const pk = pairKey(a, b);
|
|
58
|
+
const bucket = poolsByPair.get(pk);
|
|
59
|
+
if (bucket) {
|
|
60
|
+
bucket.push(normalized);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
poolsByPair.set(pk, [normalized]);
|
|
64
|
+
}
|
|
28
65
|
}
|
|
29
|
-
edges.
|
|
30
|
-
poolKey: normalized,
|
|
31
|
-
tokenA: normalized.currency0,
|
|
32
|
-
tokenB: normalized.currency1,
|
|
33
|
-
});
|
|
34
|
-
if (!adjacency.has(a))
|
|
35
|
-
adjacency.set(a, new Set());
|
|
36
|
-
if (!adjacency.has(b))
|
|
37
|
-
adjacency.set(b, new Set());
|
|
38
|
-
adjacency.get(a).add(b);
|
|
39
|
-
adjacency.get(b).add(a);
|
|
66
|
+
return { edges, adjacency, poolsByPair, source, fetchedAt: Date.now() };
|
|
40
67
|
}
|
|
41
68
|
async function fetchSubgraphPools() {
|
|
42
69
|
try {
|
|
@@ -63,19 +90,13 @@ async function fetchSubgraphPools() {
|
|
|
63
90
|
if (!pools?.length) {
|
|
64
91
|
return null;
|
|
65
92
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
tickSpacing: Number(pool.tickSpacing),
|
|
74
|
-
hooks: (pool.hooks || UNISWAP_V4.zeroHooks),
|
|
75
|
-
};
|
|
76
|
-
addEdge(edges, adjacency, poolKey);
|
|
77
|
-
}
|
|
78
|
-
return edges;
|
|
93
|
+
return pools.map((pool) => ({
|
|
94
|
+
currency0: pool.token0.id,
|
|
95
|
+
currency1: pool.token1.id,
|
|
96
|
+
fee: Number(pool.feeTier),
|
|
97
|
+
tickSpacing: Number(pool.tickSpacing),
|
|
98
|
+
hooks: (pool.hooks || UNISWAP_V4.zeroHooks),
|
|
99
|
+
}));
|
|
79
100
|
}
|
|
80
101
|
catch {
|
|
81
102
|
return null;
|
|
@@ -115,9 +136,8 @@ async function probePoolOnChain(client, currencyA, currencyB, fee, tickSpacing)
|
|
|
115
136
|
return null;
|
|
116
137
|
}
|
|
117
138
|
async function buildOnChainIndex(client) {
|
|
118
|
-
const edges = [];
|
|
119
|
-
const adjacency = new Map();
|
|
120
139
|
const hubs = [...UNISWAP_HUB_CURRENCIES];
|
|
140
|
+
const probes = [];
|
|
121
141
|
for (let i = 0; i < hubs.length; i++) {
|
|
122
142
|
for (let j = i + 1; j < hubs.length; j++) {
|
|
123
143
|
const [currency0, currency1] = hubs[i].toLowerCase() < hubs[j].toLowerCase()
|
|
@@ -126,19 +146,12 @@ async function buildOnChainIndex(client) {
|
|
|
126
146
|
for (const fee of UNISWAP_FEE_TIERS) {
|
|
127
147
|
const tickSpacing = UNISWAP_DEFAULT_TICK_SPACING[fee] ??
|
|
128
148
|
UNISWAP_DEFAULT_TICK_SPACING[3000];
|
|
129
|
-
|
|
130
|
-
if (poolKey) {
|
|
131
|
-
addEdge(edges, adjacency, poolKey);
|
|
132
|
-
}
|
|
149
|
+
probes.push(probePoolOnChain(client, currency0, currency1, fee, tickSpacing));
|
|
133
150
|
}
|
|
134
151
|
}
|
|
135
152
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
adjacency,
|
|
139
|
-
source: "onchain",
|
|
140
|
-
fetchedAt: Date.now(),
|
|
141
|
-
};
|
|
153
|
+
const poolKeys = (await Promise.all(probes)).filter((poolKey) => poolKey !== null);
|
|
154
|
+
return buildPoolIndex(poolKeys, "onchain");
|
|
142
155
|
}
|
|
143
156
|
/**
|
|
144
157
|
* Load or refresh the v4 pool index (subgraph first, on-chain hub fallback).
|
|
@@ -152,30 +165,23 @@ export async function getUniswapPoolIndex(client, options) {
|
|
|
152
165
|
now - cachedIndex.fetchedAt < UNISWAP_POOL_CACHE_TTL_MS) {
|
|
153
166
|
return cachedIndex;
|
|
154
167
|
}
|
|
155
|
-
const
|
|
156
|
-
if (
|
|
157
|
-
|
|
158
|
-
for (const edge of subgraphEdges) {
|
|
159
|
-
const a = edge.tokenA.toLowerCase();
|
|
160
|
-
const b = edge.tokenB.toLowerCase();
|
|
161
|
-
if (!adjacency.has(a))
|
|
162
|
-
adjacency.set(a, new Set());
|
|
163
|
-
if (!adjacency.has(b))
|
|
164
|
-
adjacency.set(b, new Set());
|
|
165
|
-
adjacency.get(a).add(b);
|
|
166
|
-
adjacency.get(b).add(a);
|
|
167
|
-
}
|
|
168
|
-
cachedIndex = {
|
|
169
|
-
edges: subgraphEdges,
|
|
170
|
-
adjacency,
|
|
171
|
-
source: "subgraph",
|
|
172
|
-
fetchedAt: now,
|
|
173
|
-
};
|
|
168
|
+
const subgraphPools = await fetchSubgraphPools();
|
|
169
|
+
if (subgraphPools?.length) {
|
|
170
|
+
cachedIndex = buildPoolIndex(subgraphPools, "subgraph");
|
|
174
171
|
return cachedIndex;
|
|
175
172
|
}
|
|
176
173
|
cachedIndex = await buildOnChainIndex(client);
|
|
177
174
|
return cachedIndex;
|
|
178
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* All pools connecting two tokens in a cached index (one per fee tier / hooks).
|
|
178
|
+
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
179
|
+
* @param tokenA - First currency address
|
|
180
|
+
* @param tokenB - Second currency address
|
|
181
|
+
*/
|
|
182
|
+
export function poolsBetween(index, tokenA, tokenB) {
|
|
183
|
+
return index.poolsByPair.get(pairKey(tokenA, tokenB)) ?? [];
|
|
184
|
+
}
|
|
179
185
|
/**
|
|
180
186
|
* Find a pool key connecting two tokens in a cached index, if present.
|
|
181
187
|
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
@@ -183,16 +189,7 @@ export async function getUniswapPoolIndex(client, options) {
|
|
|
183
189
|
* @param tokenB - Second currency address
|
|
184
190
|
*/
|
|
185
191
|
export function findPoolBetween(index, tokenA, tokenB) {
|
|
186
|
-
|
|
187
|
-
const b = tokenB.toLowerCase();
|
|
188
|
-
for (const edge of index.edges) {
|
|
189
|
-
const e0 = edge.tokenA.toLowerCase();
|
|
190
|
-
const e1 = edge.tokenB.toLowerCase();
|
|
191
|
-
if ((e0 === a && e1 === b) || (e0 === b && e1 === a)) {
|
|
192
|
-
return edge.poolKey;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return null;
|
|
192
|
+
return poolsBetween(index, tokenA, tokenB)[0] ?? null;
|
|
196
193
|
}
|
|
197
194
|
/** Reset cached index (for tests). */
|
|
198
195
|
export function resetUniswapPoolIndexCache() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uniswap-pool-discovery.js","sourceRoot":"","sources":["../../src/services/uniswap-pool-discovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,kBAAkB,GAEnB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GAEX,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"uniswap-pool-discovery.js","sourceRoot":"","sources":["../../src/services/uniswap-pool-discovery.ts"],"names":[],"mappings":"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"}
|