@andrewkimjoseph/celina-sdk 0.4.0 → 0.4.2

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 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.
@@ -31,6 +31,18 @@ export declare const ubiSchemeAbi: readonly [{
31
31
  readonly name: "";
32
32
  readonly type: "bool";
33
33
  }];
34
+ }, {
35
+ readonly name: "lastClaimed";
36
+ readonly type: "function";
37
+ readonly stateMutability: "view";
38
+ readonly inputs: readonly [{
39
+ readonly name: "";
40
+ readonly type: "address";
41
+ }];
42
+ readonly outputs: readonly [{
43
+ readonly name: "";
44
+ readonly type: "uint256";
45
+ }];
34
46
  }, {
35
47
  readonly name: "paused";
36
48
  readonly type: "function";
@@ -20,6 +20,13 @@ export const ubiSchemeAbi = [
20
20
  inputs: [{ name: "account", type: "address" }],
21
21
  outputs: [{ name: "", type: "bool" }],
22
22
  },
23
+ {
24
+ name: "lastClaimed",
25
+ type: "function",
26
+ stateMutability: "view",
27
+ inputs: [{ name: "", type: "address" }],
28
+ outputs: [{ name: "", type: "uint256" }],
29
+ },
23
30
  {
24
31
  name: "paused",
25
32
  type: "function",
@@ -1 +1 @@
1
- {"version":3,"file":"ubi-scheme.js","sourceRoot":"","sources":["../../src/abis/ubi-scheme.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;CACqB,CAAC"}
1
+ {"version":3,"file":"ubi-scheme.js","sourceRoot":"","sources":["../../src/abis/ubi-scheme.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;CACqB,CAAC"}
@@ -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 status and reverification progress. */
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);
@@ -53,6 +53,12 @@ export declare class GoodDollarService {
53
53
  claimableAmount: string;
54
54
  claimableAmountFormatted: string;
55
55
  alreadyClaimedToday: boolean;
56
+ inClaimCooldown: boolean;
57
+ lastClaimedAt: string | null;
58
+ nextClaimAvailableAt: string;
59
+ secondsUntilNextClaim: string;
60
+ nextClaimAvailableIn: string;
61
+ ubiPeriodDay: string;
56
62
  schemePaused: boolean;
57
63
  schemeStarted: boolean;
58
64
  estimatedDailyUbi: string;
@@ -61,6 +67,7 @@ export declare class GoodDollarService {
61
67
  currentDailyUbiFormatted: string;
62
68
  reasons: string[];
63
69
  identity: {
70
+ checkedAddress: `0x${string}`;
64
71
  isCurrentlyWhitelisted: boolean;
65
72
  statusLabel: string;
66
73
  reverification: {
@@ -8,6 +8,9 @@ import { GOODDOLLAR_IDENTITY_ADDRESS, GOODDOLLAR_UBI_SCHEME_ADDRESS, } from "../
8
8
  import { CELINA_DATA_SUFFIX } from "../config/celina-tag.js";
9
9
  import { serializePreparedFlow, } from "../types/prepared.js";
10
10
  import { formatUnixDate } from "../utils/format-date.js";
11
+ import { formatDuration } from "../utils/format-duration.js";
12
+ import { formatUnixDateTimeUtc, formatUnixIso, } from "../utils/format-unix-datetime.js";
13
+ const SECONDS_PER_DAY = 86400n;
11
14
  const G_DOLLAR_DECIMALS = 18;
12
15
  const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
13
16
  const STATUS_LABELS = {
@@ -24,7 +27,7 @@ function statusLabel(status) {
24
27
  function taggedCalldata(data) {
25
28
  return concat([data, CELINA_DATA_SUFFIX]);
26
29
  }
27
- /** GoodDollar IdentityV4 whitelist status and reverification progress. */
30
+ /** GoodDollar IdentityV4 whitelist, reverification, and daily UBI claim preparation. */
28
31
  export class GoodDollarService {
29
32
  clientFactory;
30
33
  constructor(clientFactory) {
@@ -107,7 +110,7 @@ export class GoodDollarService {
107
110
  const client = this.getPublicClient();
108
111
  const ubiContract = GOODDOLLAR_UBI_SCHEME_ADDRESS;
109
112
  const identityContract = GOODDOLLAR_IDENTITY_ADDRESS;
110
- const [whitelistedRoot, claimableAmount, schemePaused, periodStart, estimatedDailyUbi, dailyUbi, whitelistingInfo,] = await Promise.all([
113
+ const [whitelistedRoot, claimableAmount, schemePaused, periodStart, estimatedDailyUbi, dailyUbi, ubiPeriodDay,] = await Promise.all([
111
114
  client.readContract({
112
115
  address: identityContract,
113
116
  abi: goodDollarIdentityAbi,
@@ -140,50 +143,80 @@ export class GoodDollarService {
140
143
  abi: ubiSchemeAbi,
141
144
  functionName: "dailyUbi",
142
145
  }),
143
- this.getWhitelistingInfo(address),
146
+ client.readContract({
147
+ address: ubiContract,
148
+ abi: ubiSchemeAbi,
149
+ functionName: "currentDay",
150
+ }),
144
151
  ]);
145
152
  const root = whitelistedRoot;
146
153
  const claimable = claimableAmount;
154
+ const periodStartBn = periodStart;
147
155
  const nowSec = BigInt(Math.floor(Date.now() / 1000));
148
- const schemeStarted = nowSec >= periodStart;
156
+ const schemeStarted = nowSec >= periodStartBn;
157
+ const identityAddress = root !== ZERO_ADDRESS ? root : address;
149
158
  let alreadyClaimedToday = false;
159
+ let lastClaimedSec = 0n;
150
160
  if (root !== ZERO_ADDRESS) {
151
- alreadyClaimedToday = await client.readContract({
152
- address: ubiContract,
153
- abi: ubiSchemeAbi,
154
- functionName: "hasClaimed",
155
- args: [root],
156
- });
161
+ const [hasClaimed, lastClaimed] = await Promise.all([
162
+ client.readContract({
163
+ address: ubiContract,
164
+ abi: ubiSchemeAbi,
165
+ functionName: "hasClaimed",
166
+ args: [root],
167
+ }),
168
+ client.readContract({
169
+ address: ubiContract,
170
+ abi: ubiSchemeAbi,
171
+ functionName: "lastClaimed",
172
+ args: [root],
173
+ }),
174
+ ]);
175
+ alreadyClaimedToday = hasClaimed;
176
+ lastClaimedSec = lastClaimed;
157
177
  }
178
+ const whitelistingInfo = await this.getWhitelistingInfo(identityAddress);
179
+ const currentContractDay = schemeStarted && periodStartBn > 0n
180
+ ? (nowSec - periodStartBn) / SECONDS_PER_DAY
181
+ : 0n;
182
+ const nextClaimAt = periodStartBn + (currentContractDay + 1n) * SECONDS_PER_DAY;
183
+ const secondsUntilNextClaim = nextClaimAt > nowSec ? nextClaimAt - nowSec : 0n;
184
+ const inClaimCooldown = root !== ZERO_ADDRESS && alreadyClaimedToday;
158
185
  const reasons = [];
159
- if (root === ZERO_ADDRESS) {
160
- reasons.push("not whitelisted");
161
- }
162
- if (!whitelistingInfo.isCurrentlyWhitelisted) {
163
- if (whitelistingInfo.reverification?.isReverificationOverdue) {
164
- reasons.push("reverification overdue");
165
- }
166
- else if (root !== ZERO_ADDRESS) {
167
- reasons.push("identity not currently whitelisted");
168
- }
169
- }
170
186
  if (schemePaused) {
171
187
  reasons.push("scheme paused");
172
188
  }
173
189
  if (!schemeStarted) {
174
190
  reasons.push("scheme not started");
175
191
  }
176
- if (alreadyClaimedToday) {
177
- reasons.push("already claimed today");
192
+ if (root === ZERO_ADDRESS) {
193
+ reasons.push("not whitelisted");
194
+ }
195
+ else if (alreadyClaimedToday) {
196
+ const waitLabel = formatDuration(secondsUntilNextClaim);
197
+ const atLabel = formatUnixDateTimeUtc(nextClaimAt);
198
+ reasons.push(`already claimed this period; next claim in ${waitLabel} (${atLabel})`);
178
199
  }
179
- if (claimable === 0n && !alreadyClaimedToday && root !== ZERO_ADDRESS) {
180
- reasons.push("no entitlement available");
200
+ else {
201
+ if (!whitelistingInfo.isCurrentlyWhitelisted) {
202
+ if (whitelistingInfo.reverification?.isReverificationOverdue) {
203
+ reasons.push("reverification overdue");
204
+ }
205
+ else {
206
+ reasons.push("identity not currently whitelisted");
207
+ }
208
+ }
209
+ if (claimable === 0n) {
210
+ reasons.push("no entitlement available");
211
+ }
181
212
  }
182
213
  const isEligibleToClaim = root !== ZERO_ADDRESS &&
183
214
  !schemePaused &&
184
215
  schemeStarted &&
185
- whitelistingInfo.isCurrentlyWhitelisted &&
186
216
  claimable > 0n;
217
+ const lastClaimedAt = lastClaimedSec > 0n ? formatUnixIso(lastClaimedSec) : null;
218
+ const nextClaimAvailableAt = formatUnixIso(nextClaimAt);
219
+ const nextClaimAvailableIn = formatDuration(secondsUntilNextClaim);
187
220
  return {
188
221
  address,
189
222
  contract: ubiContract,
@@ -194,6 +227,12 @@ export class GoodDollarService {
194
227
  claimableAmount: claimable.toString(),
195
228
  claimableAmountFormatted: claimable > 0n ? `${formatUnits(claimable, G_DOLLAR_DECIMALS)} G$` : "0 G$",
196
229
  alreadyClaimedToday,
230
+ inClaimCooldown,
231
+ lastClaimedAt,
232
+ nextClaimAvailableAt,
233
+ secondsUntilNextClaim: secondsUntilNextClaim.toString(),
234
+ nextClaimAvailableIn,
235
+ ubiPeriodDay: ubiPeriodDay.toString(),
197
236
  schemePaused,
198
237
  schemeStarted,
199
238
  estimatedDailyUbi: estimatedDailyUbi.toString(),
@@ -202,6 +241,7 @@ export class GoodDollarService {
202
241
  currentDailyUbiFormatted: `${formatUnits(dailyUbi, G_DOLLAR_DECIMALS)} G$`,
203
242
  reasons: isEligibleToClaim ? [] : reasons,
204
243
  identity: {
244
+ checkedAddress: identityAddress,
205
245
  isCurrentlyWhitelisted: whitelistingInfo.isCurrentlyWhitelisted,
206
246
  statusLabel: whitelistingInfo.statusLabel,
207
247
  reverification: whitelistingInfo.reverification,
@@ -1 +1 @@
1
- {"version":3,"file":"gooddollar.service.js","sourceRoot":"","sources":["../../src/services/gooddollar.service.ts"],"names":[],"mappings":"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"}
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
- const MAX_HOPS = 2;
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 >= MAX_HOPS + 1) {
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
- const poolKey = index.edges.find((edge) => {
54
- const a = edge.tokenA.toLowerCase();
55
- const b = edge.tokenB.toLowerCase();
56
- return ((a === node.currency && b === neighbor) ||
57
- (a === neighbor && b === node.currency));
58
- })?.poolKey;
59
- if (!poolKey) {
60
- continue;
61
- }
62
- const nextPools = [...node.pools, poolKey];
63
- if (neighbor === goal) {
64
- results.push(nextPools);
65
- continue;
66
- }
67
- if (nextPools.length <= MAX_HOPS) {
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 pools of candidatePaths) {
128
- try {
129
- const amountOut = await quotePath(client, currencyIn, pools, amountIn);
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
- catch {
147
- // skip paths that fail to quote
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":"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"}
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
- function addEdge(edges, adjacency, poolKey) {
23
- const normalized = normalizeUniswapPoolKey(poolKey);
24
- const a = normalized.currency0.toLowerCase();
25
- const b = normalized.currency1.toLowerCase();
26
- if (edges.some((edge) => edge.poolKey === normalized)) {
27
- return;
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.push({
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
- const edges = [];
67
- const adjacency = new Map();
68
- for (const pool of pools) {
69
- const poolKey = {
70
- currency0: pool.token0.id,
71
- currency1: pool.token1.id,
72
- fee: Number(pool.feeTier),
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
- const poolKey = await probePoolOnChain(client, currency0, currency1, fee, tickSpacing);
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
- return {
137
- edges,
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 subgraphEdges = await fetchSubgraphPools();
156
- if (subgraphEdges?.length) {
157
- const adjacency = new Map();
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
- const a = tokenA.toLowerCase();
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":"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"}
1
+ {"version":3,"file":"uniswap-pool-discovery.js","sourceRoot":"","sources":["../../src/services/uniswap-pool-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Format a duration in seconds as a short human-readable string (hours and minutes). */
2
+ export declare function formatDuration(seconds: bigint | number): string;
@@ -0,0 +1,17 @@
1
+ /** Format a duration in seconds as a short human-readable string (hours and minutes). */
2
+ export function formatDuration(seconds) {
3
+ const total = Number(seconds);
4
+ if (total <= 0)
5
+ return "0 minutes";
6
+ const hours = Math.floor(total / 3600);
7
+ const minutes = Math.floor((total % 3600) / 60);
8
+ const parts = [];
9
+ if (hours > 0) {
10
+ parts.push(`${hours} hour${hours === 1 ? "" : "s"}`);
11
+ }
12
+ if (minutes > 0 || hours === 0) {
13
+ parts.push(`${minutes} minute${minutes === 1 ? "" : "s"}`);
14
+ }
15
+ return parts.join(" ");
16
+ }
17
+ //# sourceMappingURL=format-duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-duration.js","sourceRoot":"","sources":["../../src/utils/format-duration.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC;IAEnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Format a Unix timestamp (seconds) as an ISO 8601 UTC string. */
2
+ export declare function formatUnixIso(unixSeconds: number | bigint): string;
3
+ /** Format a Unix timestamp for display in reason strings (UTC date and time). */
4
+ export declare function formatUnixDateTimeUtc(unixSeconds: number | bigint): string;
@@ -0,0 +1,18 @@
1
+ /** Format a Unix timestamp (seconds) as an ISO 8601 UTC string. */
2
+ export function formatUnixIso(unixSeconds) {
3
+ return new Date(Number(unixSeconds) * 1000).toISOString();
4
+ }
5
+ /** Format a Unix timestamp for display in reason strings (UTC date and time). */
6
+ export function formatUnixDateTimeUtc(unixSeconds) {
7
+ const date = new Date(Number(unixSeconds) * 1000);
8
+ return new Intl.DateTimeFormat("en-US", {
9
+ month: "long",
10
+ day: "numeric",
11
+ year: "numeric",
12
+ hour: "numeric",
13
+ minute: "2-digit",
14
+ timeZone: "UTC",
15
+ timeZoneName: "short",
16
+ }).format(date);
17
+ }
18
+ //# sourceMappingURL=format-unix-datetime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-unix-datetime.js","sourceRoot":"","sources":["../../src/utils/format-unix-datetime.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,UAAU,aAAa,CAAC,WAA4B;IACxD,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5D,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,WAA4B;IAChE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;IAClD,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QACtC,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,OAAO;KACtB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewkimjoseph/celina-sdk",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Celina SDK — Celo mainnet reads and unsigned transaction preparation for frontend apps.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -274,7 +274,13 @@ export const gooddollarOperations: OperationSpec[] = [
274
274
  arguments: (fx) => ({ address: fx.wallet }),
275
275
  },
276
276
  assert: (result) => {
277
- assertHasKeys(result, ["isEligibleToClaim", "claimableAmount"]);
277
+ assertHasKeys(result, [
278
+ "isEligibleToClaim",
279
+ "claimableAmount",
280
+ "secondsUntilNextClaim",
281
+ "nextClaimAvailableIn",
282
+ "ubiPeriodDay",
283
+ ]);
278
284
  },
279
285
  },
280
286
  {