@andrewkimjoseph/celina-sdk 0.3.1 → 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 +41 -0
- package/build/abis/gooddollar-identity.d.ts +12 -0
- package/build/abis/gooddollar-identity.js +7 -0
- package/build/abis/gooddollar-identity.js.map +1 -1
- package/build/abis/ubi-scheme.d.ts +79 -0
- package/build/abis/ubi-scheme.js +59 -0
- package/build/abis/ubi-scheme.js.map +1 -0
- package/build/analytics/mcp-tool-events.js +1 -0
- package/build/analytics/mcp-tool-events.js.map +1 -1
- package/build/config/gooddollar.d.ts +2 -0
- package/build/config/gooddollar.js +2 -0
- package/build/config/gooddollar.js.map +1 -1
- package/build/index.d.ts +2 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/services/gooddollar.service.d.ts +42 -4
- package/build/services/gooddollar.service.js +165 -2
- 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/tests/catalog/domains/defi.ts +43 -0
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`)
|
|
@@ -36,8 +38,47 @@ await celina.token.getStablecoinBalances("0xYourAddress");
|
|
|
36
38
|
|
|
37
39
|
const flow = await celina.transaction.prepareSend("0xFrom", "0xTo", "USDm", "10");
|
|
38
40
|
// flow.steps → pass to wagmi sendTransaction
|
|
41
|
+
|
|
42
|
+
// Carbon DeFi (reads + unsigned strategy/trade prep)
|
|
43
|
+
const strategies = await celina.carbon.getStrategies("0xYourAddress");
|
|
44
|
+
const prepared = await celina.carbon.prepareLimitOrder({
|
|
45
|
+
wallet_address: "0xYourAddress",
|
|
46
|
+
base_token: "CELO",
|
|
47
|
+
quote_token: "USDC",
|
|
48
|
+
direction: "buy",
|
|
49
|
+
price: 0.5,
|
|
50
|
+
budget: 100,
|
|
51
|
+
});
|
|
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)
|
|
39
58
|
```
|
|
40
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
|
+
|
|
70
|
+
## Carbon DeFi
|
|
71
|
+
|
|
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.
|
|
73
|
+
|
|
74
|
+
| Reads (`celina.carbon`) | Prepare (unsigned) |
|
|
75
|
+
|-------------------------|-------------------|
|
|
76
|
+
| `getStrategies`, `getStrategy`, `getTradeQuote`, `explorePair`, `resolveToken`, `getActivity`, `findOpportunities`, `getProtocolStats`, `getPriceHistory`, `simulateStrategy`, `help`, `learn` | `prepareLimitOrder`, `prepareRangeOrder`, `prepareRecurringStrategy`, `prepareConcentratedStrategy`, `prepareFullRangeStrategy`, `prepareRepriceStrategy`, `prepareEditStrategy`, `prepareDepositBudget`, `prepareWithdrawBudget`, `preparePauseStrategy`, `prepareResumeStrategy`, `prepareDeleteStrategy`, `prepareTrade` |
|
|
77
|
+
|
|
78
|
+
Set `CARBON_API_BASE_URL` to override the REST base. Hosted [celina-mcp](https://mcp.usecelina.xyz/api/mcp) exposes the 12 read tools only; use this SDK or local MCP stdio for all `prepare*` methods.
|
|
79
|
+
|
|
80
|
+
Full workflow, MCP tool names, and env vars: [Carbon DeFi guide](docs/guides/carbon.md).
|
|
81
|
+
|
|
41
82
|
## Related packages
|
|
42
83
|
|
|
43
84
|
- [`@andrewkimjoseph/celina-mcp`](https://www.npmjs.com/package/@andrewkimjoseph/celina-mcp) — MCP server for IDE/CLI agents
|
|
@@ -37,6 +37,18 @@ export declare const goodDollarIdentityAbi: readonly [{
|
|
|
37
37
|
readonly name: "";
|
|
38
38
|
readonly type: "bool";
|
|
39
39
|
}];
|
|
40
|
+
}, {
|
|
41
|
+
readonly name: "getWhitelistedRoot";
|
|
42
|
+
readonly type: "function";
|
|
43
|
+
readonly stateMutability: "view";
|
|
44
|
+
readonly inputs: readonly [{
|
|
45
|
+
readonly name: "account";
|
|
46
|
+
readonly type: "address";
|
|
47
|
+
}];
|
|
48
|
+
readonly outputs: readonly [{
|
|
49
|
+
readonly name: "whitelisted";
|
|
50
|
+
readonly type: "address";
|
|
51
|
+
}];
|
|
40
52
|
}, {
|
|
41
53
|
readonly name: "authenticationPeriod";
|
|
42
54
|
readonly type: "function";
|
|
@@ -20,6 +20,13 @@ export const goodDollarIdentityAbi = [
|
|
|
20
20
|
inputs: [{ name: "account", type: "address" }],
|
|
21
21
|
outputs: [{ name: "", type: "bool" }],
|
|
22
22
|
},
|
|
23
|
+
{
|
|
24
|
+
name: "getWhitelistedRoot",
|
|
25
|
+
type: "function",
|
|
26
|
+
stateMutability: "view",
|
|
27
|
+
inputs: [{ name: "account", type: "address" }],
|
|
28
|
+
outputs: [{ name: "whitelisted", type: "address" }],
|
|
29
|
+
},
|
|
23
30
|
{
|
|
24
31
|
name: "authenticationPeriod",
|
|
25
32
|
type: "function",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gooddollar-identity.js","sourceRoot":"","sources":["../../src/abis/gooddollar-identity.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC;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;YACP,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;YAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;YACtC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,EAAE;YACjD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;YACjC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE;SACtC;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,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,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,qBAAqB;QAC3B,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,OAAO,EAAE,CAAC;KACvC;CACqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"gooddollar-identity.js","sourceRoot":"","sources":["../../src/abis/gooddollar-identity.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC;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;YACP,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;YAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;YACtC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,EAAE;YACjD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;YACjC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE;SACtC;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,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,oBAAoB;QAC1B,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,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACpD;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,qBAAqB;QAC3B,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,OAAO,EAAE,CAAC;KACvC;CACqB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export declare const ubiSchemeAbi: readonly [{
|
|
2
|
+
readonly name: "claim";
|
|
3
|
+
readonly type: "function";
|
|
4
|
+
readonly stateMutability: "nonpayable";
|
|
5
|
+
readonly inputs: readonly [];
|
|
6
|
+
readonly outputs: readonly [{
|
|
7
|
+
readonly name: "";
|
|
8
|
+
readonly type: "bool";
|
|
9
|
+
}];
|
|
10
|
+
}, {
|
|
11
|
+
readonly name: "checkEntitlement";
|
|
12
|
+
readonly type: "function";
|
|
13
|
+
readonly stateMutability: "view";
|
|
14
|
+
readonly inputs: readonly [{
|
|
15
|
+
readonly name: "_member";
|
|
16
|
+
readonly type: "address";
|
|
17
|
+
}];
|
|
18
|
+
readonly outputs: readonly [{
|
|
19
|
+
readonly name: "";
|
|
20
|
+
readonly type: "uint256";
|
|
21
|
+
}];
|
|
22
|
+
}, {
|
|
23
|
+
readonly name: "hasClaimed";
|
|
24
|
+
readonly type: "function";
|
|
25
|
+
readonly stateMutability: "view";
|
|
26
|
+
readonly inputs: readonly [{
|
|
27
|
+
readonly name: "account";
|
|
28
|
+
readonly type: "address";
|
|
29
|
+
}];
|
|
30
|
+
readonly outputs: readonly [{
|
|
31
|
+
readonly name: "";
|
|
32
|
+
readonly type: "bool";
|
|
33
|
+
}];
|
|
34
|
+
}, {
|
|
35
|
+
readonly name: "paused";
|
|
36
|
+
readonly type: "function";
|
|
37
|
+
readonly stateMutability: "view";
|
|
38
|
+
readonly inputs: readonly [];
|
|
39
|
+
readonly outputs: readonly [{
|
|
40
|
+
readonly name: "";
|
|
41
|
+
readonly type: "bool";
|
|
42
|
+
}];
|
|
43
|
+
}, {
|
|
44
|
+
readonly name: "periodStart";
|
|
45
|
+
readonly type: "function";
|
|
46
|
+
readonly stateMutability: "view";
|
|
47
|
+
readonly inputs: readonly [];
|
|
48
|
+
readonly outputs: readonly [{
|
|
49
|
+
readonly name: "";
|
|
50
|
+
readonly type: "uint256";
|
|
51
|
+
}];
|
|
52
|
+
}, {
|
|
53
|
+
readonly name: "estimateNextDailyUBI";
|
|
54
|
+
readonly type: "function";
|
|
55
|
+
readonly stateMutability: "view";
|
|
56
|
+
readonly inputs: readonly [];
|
|
57
|
+
readonly outputs: readonly [{
|
|
58
|
+
readonly name: "";
|
|
59
|
+
readonly type: "uint256";
|
|
60
|
+
}];
|
|
61
|
+
}, {
|
|
62
|
+
readonly name: "dailyUbi";
|
|
63
|
+
readonly type: "function";
|
|
64
|
+
readonly stateMutability: "view";
|
|
65
|
+
readonly inputs: readonly [];
|
|
66
|
+
readonly outputs: readonly [{
|
|
67
|
+
readonly name: "";
|
|
68
|
+
readonly type: "uint256";
|
|
69
|
+
}];
|
|
70
|
+
}, {
|
|
71
|
+
readonly name: "currentDay";
|
|
72
|
+
readonly type: "function";
|
|
73
|
+
readonly stateMutability: "view";
|
|
74
|
+
readonly inputs: readonly [];
|
|
75
|
+
readonly outputs: readonly [{
|
|
76
|
+
readonly name: "";
|
|
77
|
+
readonly type: "uint256";
|
|
78
|
+
}];
|
|
79
|
+
}];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export const ubiSchemeAbi = [
|
|
2
|
+
{
|
|
3
|
+
name: "claim",
|
|
4
|
+
type: "function",
|
|
5
|
+
stateMutability: "nonpayable",
|
|
6
|
+
inputs: [],
|
|
7
|
+
outputs: [{ name: "", type: "bool" }],
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
name: "checkEntitlement",
|
|
11
|
+
type: "function",
|
|
12
|
+
stateMutability: "view",
|
|
13
|
+
inputs: [{ name: "_member", type: "address" }],
|
|
14
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: "hasClaimed",
|
|
18
|
+
type: "function",
|
|
19
|
+
stateMutability: "view",
|
|
20
|
+
inputs: [{ name: "account", type: "address" }],
|
|
21
|
+
outputs: [{ name: "", type: "bool" }],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "paused",
|
|
25
|
+
type: "function",
|
|
26
|
+
stateMutability: "view",
|
|
27
|
+
inputs: [],
|
|
28
|
+
outputs: [{ name: "", type: "bool" }],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "periodStart",
|
|
32
|
+
type: "function",
|
|
33
|
+
stateMutability: "view",
|
|
34
|
+
inputs: [],
|
|
35
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "estimateNextDailyUBI",
|
|
39
|
+
type: "function",
|
|
40
|
+
stateMutability: "view",
|
|
41
|
+
inputs: [],
|
|
42
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "dailyUbi",
|
|
46
|
+
type: "function",
|
|
47
|
+
stateMutability: "view",
|
|
48
|
+
inputs: [],
|
|
49
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: "currentDay",
|
|
53
|
+
type: "function",
|
|
54
|
+
stateMutability: "view",
|
|
55
|
+
inputs: [],
|
|
56
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
//# sourceMappingURL=ubi-scheme.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -23,6 +23,7 @@ export const MCP_TOOL_EVENT_BY_SDK_METHOD = {
|
|
|
23
23
|
"contract.callFunction": "call_contract_function",
|
|
24
24
|
"contract.estimateGas": "estimate_contract_gas",
|
|
25
25
|
"ens.resolveEns": "resolve_ens",
|
|
26
|
+
"gooddollar.getUbiClaimEligibility": "get_gooddollar_ubi_entitlement",
|
|
26
27
|
"gooddollar.getWhitelistingInfo": "get_gooddollar_whitelisting_info",
|
|
27
28
|
"governance.getGovernanceProposals": "get_governance_proposals",
|
|
28
29
|
"governance.getProposalDetails": "get_proposal_details",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tool-events.js","sourceRoot":"","sources":["../../src/analytics/mcp-tool-events.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAqC;IAC5E,oBAAoB,EAAE,aAAa;IACnC,qBAAqB,EAAE,WAAW;IAClC,4BAA4B,EAAE,mBAAmB;IACjD,6BAA6B,EAAE,oBAAoB;IACnD,2BAA2B,EAAE,iBAAiB;IAC9C,oBAAoB,EAAE,qBAAqB;IAC3C,0BAA0B,EAAE,2BAA2B;IACvD,oBAAoB,EAAE,qBAAqB;IAC3C,wBAAwB,EAAE,0BAA0B;IACpD,yBAAyB,EAAE,2BAA2B;IACtD,sBAAsB,EAAE,uBAAuB;IAC/C,oBAAoB,EAAE,qBAAqB;IAC3C,sBAAsB,EAAE,wBAAwB;IAChD,aAAa,EAAE,aAAa;IAC5B,cAAc,EAAE,cAAc;IAC9B,qBAAqB,EAAE,sBAAsB;IAC7C,yBAAyB,EAAE,0BAA0B;IACrD,uBAAuB,EAAE,wBAAwB;IACjD,sBAAsB,EAAE,uBAAuB;IAC/C,gBAAgB,EAAE,aAAa;IAC/B,gCAAgC,EAAE,kCAAkC;IACpE,mCAAmC,EAAE,0BAA0B;IAC/D,+BAA+B,EAAE,sBAAsB;IACvD,oBAAoB,EAAE,mBAAmB;IACzC,oBAAoB,EAAE,oBAAoB;IAC1C,mBAAmB,EAAE,iBAAiB;IACtC,gBAAgB,EAAE,cAAc;IAChC,6BAA6B,EAAE,0BAA0B;IACzD,4BAA4B,EAAE,yBAAyB;IACvD,sBAAsB,EAAE,mBAAmB;IAC3C,sBAAsB,EAAE,mBAAmB;IAC3C,sBAAsB,EAAE,mBAAmB;IAC3C,sBAAsB,EAAE,mBAAmB;IAC3C,wBAAwB,EAAE,qBAAqB;IAC/C,8BAA8B,EAAE,wBAAwB;IACxD,4BAA4B,EAAE,sBAAsB;IACpD,6BAA6B,EAAE,wBAAwB;IACvD,kCAAkC,EAAE,6BAA6B;IACjE,4BAA4B,EAAE,sBAAsB;IACpD,mBAAmB,EAAE,mBAAmB;IACxC,6BAA6B,EAAE,yBAAyB;IACxD,uBAAuB,EAAE,mBAAmB;IAC5C,oBAAoB,EAAE,gBAAgB;IACtC,0BAA0B,EAAE,eAAe;IAC3C,iCAAiC,EAAE,sBAAsB;IACzD,2BAA2B,EAAE,kBAAkB;IAC/C,sBAAsB,EAAE,uBAAuB;IAC/C,sBAAsB,EAAE,mBAAmB;CACnC,CAAC"}
|
|
1
|
+
{"version":3,"file":"mcp-tool-events.js","sourceRoot":"","sources":["../../src/analytics/mcp-tool-events.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAqC;IAC5E,oBAAoB,EAAE,aAAa;IACnC,qBAAqB,EAAE,WAAW;IAClC,4BAA4B,EAAE,mBAAmB;IACjD,6BAA6B,EAAE,oBAAoB;IACnD,2BAA2B,EAAE,iBAAiB;IAC9C,oBAAoB,EAAE,qBAAqB;IAC3C,0BAA0B,EAAE,2BAA2B;IACvD,oBAAoB,EAAE,qBAAqB;IAC3C,wBAAwB,EAAE,0BAA0B;IACpD,yBAAyB,EAAE,2BAA2B;IACtD,sBAAsB,EAAE,uBAAuB;IAC/C,oBAAoB,EAAE,qBAAqB;IAC3C,sBAAsB,EAAE,wBAAwB;IAChD,aAAa,EAAE,aAAa;IAC5B,cAAc,EAAE,cAAc;IAC9B,qBAAqB,EAAE,sBAAsB;IAC7C,yBAAyB,EAAE,0BAA0B;IACrD,uBAAuB,EAAE,wBAAwB;IACjD,sBAAsB,EAAE,uBAAuB;IAC/C,gBAAgB,EAAE,aAAa;IAC/B,mCAAmC,EAAE,gCAAgC;IACrE,gCAAgC,EAAE,kCAAkC;IACpE,mCAAmC,EAAE,0BAA0B;IAC/D,+BAA+B,EAAE,sBAAsB;IACvD,oBAAoB,EAAE,mBAAmB;IACzC,oBAAoB,EAAE,oBAAoB;IAC1C,mBAAmB,EAAE,iBAAiB;IACtC,gBAAgB,EAAE,cAAc;IAChC,6BAA6B,EAAE,0BAA0B;IACzD,4BAA4B,EAAE,yBAAyB;IACvD,sBAAsB,EAAE,mBAAmB;IAC3C,sBAAsB,EAAE,mBAAmB;IAC3C,sBAAsB,EAAE,mBAAmB;IAC3C,sBAAsB,EAAE,mBAAmB;IAC3C,wBAAwB,EAAE,qBAAqB;IAC/C,8BAA8B,EAAE,wBAAwB;IACxD,4BAA4B,EAAE,sBAAsB;IACpD,6BAA6B,EAAE,wBAAwB;IACvD,kCAAkC,EAAE,6BAA6B;IACjE,4BAA4B,EAAE,sBAAsB;IACpD,mBAAmB,EAAE,mBAAmB;IACxC,6BAA6B,EAAE,yBAAyB;IACxD,uBAAuB,EAAE,mBAAmB;IAC5C,oBAAoB,EAAE,gBAAgB;IACtC,0BAA0B,EAAE,eAAe;IAC3C,iCAAiC,EAAE,sBAAsB;IACzD,2BAA2B,EAAE,kBAAkB;IAC/C,sBAAsB,EAAE,uBAAuB;IAC/C,sBAAsB,EAAE,mBAAmB;CACnC,CAAC"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
/** GoodDollar IdentityV4 contract on Celo mainnet. */
|
|
2
2
|
export declare const GOODDOLLAR_IDENTITY_ADDRESS: "0xC361A6E67822a0EDc17D899227dd9FC50BD62F42";
|
|
3
|
+
/** GoodDollar UBISchemeV2 contract on Celo mainnet. */
|
|
4
|
+
export declare const GOODDOLLAR_UBI_SCHEME_ADDRESS: "0x43d72Ff17701B2DA814620735C39C620Ce0ea4A1";
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
/** GoodDollar IdentityV4 contract on Celo mainnet. */
|
|
2
2
|
export const GOODDOLLAR_IDENTITY_ADDRESS = "0xC361A6E67822a0EDc17D899227dd9FC50BD62F42";
|
|
3
|
+
/** GoodDollar UBISchemeV2 contract on Celo mainnet. */
|
|
4
|
+
export const GOODDOLLAR_UBI_SCHEME_ADDRESS = "0x43d72Ff17701B2DA814620735C39C620Ce0ea4A1";
|
|
3
5
|
//# sourceMappingURL=gooddollar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gooddollar.js","sourceRoot":"","sources":["../../src/config/gooddollar.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,MAAM,CAAC,MAAM,2BAA2B,GACtC,4CAAqD,CAAC"}
|
|
1
|
+
{"version":3,"file":"gooddollar.js","sourceRoot":"","sources":["../../src/config/gooddollar.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,MAAM,CAAC,MAAM,2BAA2B,GACtC,4CAAqD,CAAC;AAExD,uDAAuD;AACvD,MAAM,CAAC,MAAM,6BAA6B,GACxC,4CAAqD,CAAC"}
|
package/build/index.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ export interface CelinaClient {
|
|
|
32
32
|
uniswap: UniswapService;
|
|
33
33
|
/** Aave V3 `prepareSupply` and `prepareWithdraw` flows on Celo. */
|
|
34
34
|
aave: AaveService;
|
|
35
|
-
/** GoodDollar IdentityV4 whitelist status. */
|
|
35
|
+
/** GoodDollar IdentityV4 whitelist status and daily UBI claim preparation. */
|
|
36
36
|
gooddollar: GoodDollarService;
|
|
37
37
|
/** Celo and Ethereum ENS resolution. */
|
|
38
38
|
ens: EnsService;
|
|
@@ -79,6 +79,7 @@ export type { ContractCallParams } from "./services/contract.service.js";
|
|
|
79
79
|
/** Aave V3 Celo pool address and supported asset symbols. */
|
|
80
80
|
export { AAVE_POOL, AAVE_SUPPORTED_SYMBOLS, resolveAaveAsset, } from "./config/aave.js";
|
|
81
81
|
export type { AaveAsset } from "./config/aave.js";
|
|
82
|
+
export { GOODDOLLAR_IDENTITY_ADDRESS, GOODDOLLAR_UBI_SCHEME_ADDRESS, } from "./config/gooddollar.js";
|
|
82
83
|
export type { CarbonPrepareResult, CarbonRestSuccess, } from "./types/carbon.js";
|
|
83
84
|
export type { CarbonWriteBody } from "./services/carbon.service.js";
|
|
84
85
|
export { CARBON_CHAIN, CELO_CARBON_CONTRACTS, DEFAULT_CARBON_REST_BASE_URL, } from "./config/carbon.js";
|
package/build/index.js
CHANGED
|
@@ -54,6 +54,7 @@ export function createCelinaClient(opts) {
|
|
|
54
54
|
export { serializePreparedFlow } from "./types/prepared.js";
|
|
55
55
|
/** Aave V3 Celo pool address and supported asset symbols. */
|
|
56
56
|
export { AAVE_POOL, AAVE_SUPPORTED_SYMBOLS, resolveAaveAsset, } from "./config/aave.js";
|
|
57
|
+
export { GOODDOLLAR_IDENTITY_ADDRESS, GOODDOLLAR_UBI_SCHEME_ADDRESS, } from "./config/gooddollar.js";
|
|
57
58
|
export { CARBON_CHAIN, CELO_CARBON_CONTRACTS, DEFAULT_CARBON_REST_BASE_URL, } from "./config/carbon.js";
|
|
58
59
|
export { CarbonRestError } from "./clients/carbon-rest.js";
|
|
59
60
|
export { SelfService, } from "./services/self.service.js";
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAkB,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAuCtE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA0B;IAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,CAAmB,GAAW,EAAE,OAAU,EAAE,EAAE,CACzD,uBAAuB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAEhD,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACpE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;QAC3D,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;QAClC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,kBAAkB,CAAC,aAAa,CAAC,CAAC;QACvE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;QAC3D,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;QAC3D,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,aAAa,CAAC,CAAC;QAClD,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACpE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAClD,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACpE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;QAC3D,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;QAC/C,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,eAAe,CAAC,aAAa,CAAC,CAAC;QAC9D,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC/D,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;KAC3D,CAAC;AACJ,CAAC;AAYD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAa5D,6DAA6D;AAC7D,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EACL,WAAW,GAIZ,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAE9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GoodDollar IdentityV4 whitelist and reverification reads on Celo mainnet.
|
|
3
|
-
*/
|
|
4
1
|
import type { CeloClientFactory } from "../clients/celo-client.js";
|
|
5
|
-
|
|
2
|
+
import { type SerializedPreparedFlow } from "../types/prepared.js";
|
|
3
|
+
/** GoodDollar IdentityV4 whitelist, reverification, and daily UBI claim preparation. */
|
|
6
4
|
export declare class GoodDollarService {
|
|
7
5
|
private readonly clientFactory;
|
|
8
6
|
constructor(clientFactory: CeloClientFactory);
|
|
7
|
+
private getPublicClient;
|
|
9
8
|
/**
|
|
10
9
|
* GoodDollar IdentityV4 whitelist status and reverification progress for a wallet.
|
|
11
10
|
* @param address - Wallet to check against IdentityV4
|
|
@@ -41,6 +40,45 @@ export declare class GoodDollarService {
|
|
|
41
40
|
authCount: number;
|
|
42
41
|
};
|
|
43
42
|
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Daily UBI claim eligibility for a wallet against UBISchemeV2 on Celo.
|
|
45
|
+
* Resolves connected wallets via Identity `getWhitelistedRoot`.
|
|
46
|
+
*/
|
|
47
|
+
getUbiClaimEligibility(address: `0x${string}`): Promise<{
|
|
48
|
+
address: `0x${string}`;
|
|
49
|
+
contract: "0x43d72Ff17701B2DA814620735C39C620Ce0ea4A1";
|
|
50
|
+
whitelistedRoot: `0x${string}` | null;
|
|
51
|
+
isConnectedWallet: boolean;
|
|
52
|
+
isEligibleToClaim: boolean;
|
|
53
|
+
claimableAmount: string;
|
|
54
|
+
claimableAmountFormatted: string;
|
|
55
|
+
alreadyClaimedToday: boolean;
|
|
56
|
+
schemePaused: boolean;
|
|
57
|
+
schemeStarted: boolean;
|
|
58
|
+
estimatedDailyUbi: string;
|
|
59
|
+
estimatedDailyUbiFormatted: string;
|
|
60
|
+
currentDailyUbi: string;
|
|
61
|
+
currentDailyUbiFormatted: string;
|
|
62
|
+
reasons: string[];
|
|
63
|
+
identity: {
|
|
64
|
+
isCurrentlyWhitelisted: boolean;
|
|
65
|
+
statusLabel: string;
|
|
66
|
+
reverification: {
|
|
67
|
+
daysSinceLastAuthentication: number;
|
|
68
|
+
currentReverificationPeriodDays: number;
|
|
69
|
+
maxReverificationPeriodDays: number;
|
|
70
|
+
daysUntilReverificationRequired: number;
|
|
71
|
+
reverificationRequiredOn: string;
|
|
72
|
+
reverificationProgressPercent: number;
|
|
73
|
+
isReverificationOverdue: boolean;
|
|
74
|
+
} | null;
|
|
75
|
+
};
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Build an unsigned UBISchemeV2 `claim()` transaction for daily G$ UBI.
|
|
79
|
+
* Validates whitelist, entitlement, and simulates gas before returning steps.
|
|
80
|
+
*/
|
|
81
|
+
prepareClaimUbi(from: `0x${string}`): Promise<SerializedPreparedFlow>;
|
|
44
82
|
private effectiveAuthCount;
|
|
45
83
|
private fetchReverifyDaysOptions;
|
|
46
84
|
private buildReverificationProgress;
|
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GoodDollar IdentityV4 whitelist and reverification reads on Celo mainnet.
|
|
3
|
+
*/
|
|
4
|
+
import { concat, encodeFunctionData, formatUnits } from "viem";
|
|
1
5
|
import { goodDollarIdentityAbi } from "../abis/gooddollar-identity.js";
|
|
2
|
-
import {
|
|
6
|
+
import { ubiSchemeAbi } from "../abis/ubi-scheme.js";
|
|
7
|
+
import { GOODDOLLAR_IDENTITY_ADDRESS, GOODDOLLAR_UBI_SCHEME_ADDRESS, } from "../config/gooddollar.js";
|
|
8
|
+
import { CELINA_DATA_SUFFIX } from "../config/celina-tag.js";
|
|
9
|
+
import { serializePreparedFlow, } from "../types/prepared.js";
|
|
3
10
|
import { formatUnixDate } from "../utils/format-date.js";
|
|
11
|
+
const G_DOLLAR_DECIMALS = 18;
|
|
12
|
+
const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
4
13
|
const STATUS_LABELS = {
|
|
5
14
|
0: "none",
|
|
6
15
|
1: "whitelisted",
|
|
@@ -12,12 +21,18 @@ const LEGACY_AUTH_CUTOFF = 1772697574;
|
|
|
12
21
|
function statusLabel(status) {
|
|
13
22
|
return STATUS_LABELS[status] ?? "unknown";
|
|
14
23
|
}
|
|
15
|
-
|
|
24
|
+
function taggedCalldata(data) {
|
|
25
|
+
return concat([data, CELINA_DATA_SUFFIX]);
|
|
26
|
+
}
|
|
27
|
+
/** GoodDollar IdentityV4 whitelist, reverification, and daily UBI claim preparation. */
|
|
16
28
|
export class GoodDollarService {
|
|
17
29
|
clientFactory;
|
|
18
30
|
constructor(clientFactory) {
|
|
19
31
|
this.clientFactory = clientFactory;
|
|
20
32
|
}
|
|
33
|
+
getPublicClient() {
|
|
34
|
+
return this.clientFactory.getClients().public;
|
|
35
|
+
}
|
|
21
36
|
/**
|
|
22
37
|
* GoodDollar IdentityV4 whitelist status and reverification progress for a wallet.
|
|
23
38
|
* @param address - Wallet to check against IdentityV4
|
|
@@ -84,6 +99,154 @@ export class GoodDollarService {
|
|
|
84
99
|
},
|
|
85
100
|
};
|
|
86
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Daily UBI claim eligibility for a wallet against UBISchemeV2 on Celo.
|
|
104
|
+
* Resolves connected wallets via Identity `getWhitelistedRoot`.
|
|
105
|
+
*/
|
|
106
|
+
async getUbiClaimEligibility(address) {
|
|
107
|
+
const client = this.getPublicClient();
|
|
108
|
+
const ubiContract = GOODDOLLAR_UBI_SCHEME_ADDRESS;
|
|
109
|
+
const identityContract = GOODDOLLAR_IDENTITY_ADDRESS;
|
|
110
|
+
const [whitelistedRoot, claimableAmount, schemePaused, periodStart, estimatedDailyUbi, dailyUbi, whitelistingInfo,] = await Promise.all([
|
|
111
|
+
client.readContract({
|
|
112
|
+
address: identityContract,
|
|
113
|
+
abi: goodDollarIdentityAbi,
|
|
114
|
+
functionName: "getWhitelistedRoot",
|
|
115
|
+
args: [address],
|
|
116
|
+
}),
|
|
117
|
+
client.readContract({
|
|
118
|
+
address: ubiContract,
|
|
119
|
+
abi: ubiSchemeAbi,
|
|
120
|
+
functionName: "checkEntitlement",
|
|
121
|
+
args: [address],
|
|
122
|
+
}),
|
|
123
|
+
client.readContract({
|
|
124
|
+
address: ubiContract,
|
|
125
|
+
abi: ubiSchemeAbi,
|
|
126
|
+
functionName: "paused",
|
|
127
|
+
}),
|
|
128
|
+
client.readContract({
|
|
129
|
+
address: ubiContract,
|
|
130
|
+
abi: ubiSchemeAbi,
|
|
131
|
+
functionName: "periodStart",
|
|
132
|
+
}),
|
|
133
|
+
client.readContract({
|
|
134
|
+
address: ubiContract,
|
|
135
|
+
abi: ubiSchemeAbi,
|
|
136
|
+
functionName: "estimateNextDailyUBI",
|
|
137
|
+
}),
|
|
138
|
+
client.readContract({
|
|
139
|
+
address: ubiContract,
|
|
140
|
+
abi: ubiSchemeAbi,
|
|
141
|
+
functionName: "dailyUbi",
|
|
142
|
+
}),
|
|
143
|
+
this.getWhitelistingInfo(address),
|
|
144
|
+
]);
|
|
145
|
+
const root = whitelistedRoot;
|
|
146
|
+
const claimable = claimableAmount;
|
|
147
|
+
const nowSec = BigInt(Math.floor(Date.now() / 1000));
|
|
148
|
+
const schemeStarted = nowSec >= periodStart;
|
|
149
|
+
let alreadyClaimedToday = false;
|
|
150
|
+
if (root !== ZERO_ADDRESS) {
|
|
151
|
+
alreadyClaimedToday = await client.readContract({
|
|
152
|
+
address: ubiContract,
|
|
153
|
+
abi: ubiSchemeAbi,
|
|
154
|
+
functionName: "hasClaimed",
|
|
155
|
+
args: [root],
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
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
|
+
if (schemePaused) {
|
|
171
|
+
reasons.push("scheme paused");
|
|
172
|
+
}
|
|
173
|
+
if (!schemeStarted) {
|
|
174
|
+
reasons.push("scheme not started");
|
|
175
|
+
}
|
|
176
|
+
if (alreadyClaimedToday) {
|
|
177
|
+
reasons.push("already claimed today");
|
|
178
|
+
}
|
|
179
|
+
if (claimable === 0n && !alreadyClaimedToday && root !== ZERO_ADDRESS) {
|
|
180
|
+
reasons.push("no entitlement available");
|
|
181
|
+
}
|
|
182
|
+
const isEligibleToClaim = root !== ZERO_ADDRESS &&
|
|
183
|
+
!schemePaused &&
|
|
184
|
+
schemeStarted &&
|
|
185
|
+
whitelistingInfo.isCurrentlyWhitelisted &&
|
|
186
|
+
claimable > 0n;
|
|
187
|
+
return {
|
|
188
|
+
address,
|
|
189
|
+
contract: ubiContract,
|
|
190
|
+
whitelistedRoot: root === ZERO_ADDRESS ? null : root,
|
|
191
|
+
isConnectedWallet: root !== ZERO_ADDRESS &&
|
|
192
|
+
root.toLowerCase() !== address.toLowerCase(),
|
|
193
|
+
isEligibleToClaim,
|
|
194
|
+
claimableAmount: claimable.toString(),
|
|
195
|
+
claimableAmountFormatted: claimable > 0n ? `${formatUnits(claimable, G_DOLLAR_DECIMALS)} G$` : "0 G$",
|
|
196
|
+
alreadyClaimedToday,
|
|
197
|
+
schemePaused,
|
|
198
|
+
schemeStarted,
|
|
199
|
+
estimatedDailyUbi: estimatedDailyUbi.toString(),
|
|
200
|
+
estimatedDailyUbiFormatted: `${formatUnits(estimatedDailyUbi, G_DOLLAR_DECIMALS)} G$`,
|
|
201
|
+
currentDailyUbi: dailyUbi.toString(),
|
|
202
|
+
currentDailyUbiFormatted: `${formatUnits(dailyUbi, G_DOLLAR_DECIMALS)} G$`,
|
|
203
|
+
reasons: isEligibleToClaim ? [] : reasons,
|
|
204
|
+
identity: {
|
|
205
|
+
isCurrentlyWhitelisted: whitelistingInfo.isCurrentlyWhitelisted,
|
|
206
|
+
statusLabel: whitelistingInfo.statusLabel,
|
|
207
|
+
reverification: whitelistingInfo.reverification,
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Build an unsigned UBISchemeV2 `claim()` transaction for daily G$ UBI.
|
|
213
|
+
* Validates whitelist, entitlement, and simulates gas before returning steps.
|
|
214
|
+
*/
|
|
215
|
+
async prepareClaimUbi(from) {
|
|
216
|
+
const eligibility = await this.getUbiClaimEligibility(from);
|
|
217
|
+
if (!eligibility.isEligibleToClaim) {
|
|
218
|
+
const detail = eligibility.reasons.length > 0
|
|
219
|
+
? eligibility.reasons.join("; ")
|
|
220
|
+
: "not eligible to claim";
|
|
221
|
+
throw new Error(`Cannot claim GoodDollar UBI: ${detail}.`);
|
|
222
|
+
}
|
|
223
|
+
const publicClient = this.getPublicClient();
|
|
224
|
+
const claimData = taggedCalldata(encodeFunctionData({
|
|
225
|
+
abi: ubiSchemeAbi,
|
|
226
|
+
functionName: "claim",
|
|
227
|
+
}));
|
|
228
|
+
await publicClient.estimateContractGas({
|
|
229
|
+
account: from,
|
|
230
|
+
address: GOODDOLLAR_UBI_SCHEME_ADDRESS,
|
|
231
|
+
abi: ubiSchemeAbi,
|
|
232
|
+
functionName: "claim",
|
|
233
|
+
});
|
|
234
|
+
const flow = {
|
|
235
|
+
network: "mainnet",
|
|
236
|
+
from,
|
|
237
|
+
summary: `Claim daily GoodDollar UBI (${eligibility.claimableAmountFormatted})`,
|
|
238
|
+
steps: [
|
|
239
|
+
{
|
|
240
|
+
kind: "contract",
|
|
241
|
+
to: GOODDOLLAR_UBI_SCHEME_ADDRESS,
|
|
242
|
+
data: claimData,
|
|
243
|
+
value: "0",
|
|
244
|
+
description: "Claim daily GoodDollar UBI",
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
};
|
|
248
|
+
return serializePreparedFlow(flow);
|
|
249
|
+
}
|
|
87
250
|
effectiveAuthCount(dateAuthenticated, authCount, optionsLength) {
|
|
88
251
|
if (dateAuthenticated < LEGACY_AUTH_CUTOFF) {
|
|
89
252
|
return optionsLength - 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gooddollar.service.js","sourceRoot":"","sources":["../../src/services/gooddollar.service.ts"],"names":[],"mappings":"
|
|
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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"}
|
package/package.json
CHANGED
|
@@ -261,4 +261,47 @@ export const gooddollarOperations: OperationSpec[] = [
|
|
|
261
261
|
assertHasKeys(result, ["isCurrentlyWhitelisted"]);
|
|
262
262
|
},
|
|
263
263
|
},
|
|
264
|
+
{
|
|
265
|
+
id: "gooddollar.getUbiClaimEligibility",
|
|
266
|
+
domain: "gooddollar",
|
|
267
|
+
layer: "read",
|
|
268
|
+
sdk: {
|
|
269
|
+
invoke: (client, fx) =>
|
|
270
|
+
client.gooddollar.getUbiClaimEligibility(fx.wallet),
|
|
271
|
+
},
|
|
272
|
+
mcp: {
|
|
273
|
+
tool: "get_gooddollar_ubi_entitlement",
|
|
274
|
+
arguments: (fx) => ({ address: fx.wallet }),
|
|
275
|
+
},
|
|
276
|
+
assert: (result) => {
|
|
277
|
+
assertHasKeys(result, ["isEligibleToClaim", "claimableAmount"]);
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
id: "gooddollar.prepareClaimUbi",
|
|
282
|
+
domain: "gooddollar",
|
|
283
|
+
layer: "prepare",
|
|
284
|
+
requiresEnv: ["CELO_PRIVATE_KEY"],
|
|
285
|
+
sdk: {
|
|
286
|
+
invoke: (client, fx) =>
|
|
287
|
+
client.gooddollar.prepareClaimUbi(fromAddress(fx)),
|
|
288
|
+
},
|
|
289
|
+
assert: (result) => {
|
|
290
|
+
assertHasKeys(result, ["from", "steps"]);
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
id: "gooddollar.claimDailyUbi",
|
|
295
|
+
domain: "gooddollar",
|
|
296
|
+
layer: "write",
|
|
297
|
+
requiresEnv: ["CELO_PRIVATE_KEY"],
|
|
298
|
+
requiresWrites: true,
|
|
299
|
+
mcp: {
|
|
300
|
+
tool: "claim_daily_gooddollar_ubi",
|
|
301
|
+
arguments: () => ({}),
|
|
302
|
+
},
|
|
303
|
+
assert: (result) => {
|
|
304
|
+
assertHasKeys(result, ["hash"]);
|
|
305
|
+
},
|
|
306
|
+
},
|
|
264
307
|
];
|