@andrewkimjoseph/celina 0.2.6 → 0.2.8
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 +9 -4
- package/build/clients/aave-client.d.ts +2 -0
- package/build/clients/aave-client.js +3 -0
- package/build/clients/aave-client.js.map +1 -0
- package/build/clients/aave-send.d.ts +7 -0
- package/build/clients/aave-send.js +49 -0
- package/build/clients/aave-send.js.map +1 -0
- package/build/clients/mento-sdk.d.ts +2 -0
- package/build/clients/mento-sdk.js +9 -0
- package/build/clients/mento-sdk.js.map +1 -0
- package/build/config/aave.d.ts +5 -0
- package/build/config/aave.js +6 -0
- package/build/config/aave.js.map +1 -0
- package/build/config/chains.d.ts +3 -0
- package/build/config/chains.js +8 -0
- package/build/config/chains.js.map +1 -1
- package/build/config/load-env.d.ts +1 -0
- package/build/config/load-env.js +4 -0
- package/build/config/load-env.js.map +1 -0
- package/build/context/app-context.d.ts +4 -0
- package/build/context/app-context.js +4 -0
- package/build/context/app-context.js.map +1 -1
- package/build/http.d.ts +1 -1
- package/build/http.js +1 -0
- package/build/http.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/server/instructions.js +4 -1
- package/build/server/instructions.js.map +1 -1
- package/build/services/aave.service.d.ts +28 -0
- package/build/services/aave.service.js +144 -0
- package/build/services/aave.service.js.map +1 -0
- package/build/services/mento-fx.service.d.ts +66 -0
- package/build/services/mento-fx.service.js +190 -0
- package/build/services/mento-fx.service.js.map +1 -0
- package/build/tools/aave.tools.d.ts +2 -0
- package/build/tools/aave.tools.js +56 -0
- package/build/tools/aave.tools.js.map +1 -0
- package/build/tools/index.js +4 -0
- package/build/tools/index.js.map +1 -1
- package/build/tools/mento-fx.tools.d.ts +2 -0
- package/build/tools/mento-fx.tools.js +87 -0
- package/build/tools/mento-fx.tools.js.map +1 -0
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -106,7 +106,7 @@ Never commit private keys. Use env vars only.
|
|
|
106
106
|
|
|
107
107
|
Celina is an **MCP tool server**. A local LLM stack needs an **MCP client** that can connect to Celina and pass tool definitions to a model that supports **function / tool calling**.
|
|
108
108
|
|
|
109
|
-
Read-only tools (balances, blocks, GoodDollar status, etc.) work out of the box. For local write tools (`send_token`, `estimate_send`), set `CELO_PRIVATE_KEY` in the MCP server `env` block (stdio) or use the [hosted encryption flow](#write-tools-hosted-mode) (HTTP).
|
|
109
|
+
Read-only tools (balances, blocks, GoodDollar status, etc.) work out of the box. For local write tools (`send_token`, `estimate_send`, `execute_mento_fx`), set `CELO_PRIVATE_KEY` in the MCP server `env` block (stdio) or use the [hosted encryption flow](#write-tools-hosted-mode) (HTTP).
|
|
110
110
|
|
|
111
111
|
### LM Studio (0.3.17+)
|
|
112
112
|
|
|
@@ -196,7 +196,7 @@ npm run inspect
|
|
|
196
196
|
|
|
197
197
|
## Write tools (hosted mode)
|
|
198
198
|
|
|
199
|
-
Write tools (`send_token`, `estimate_send`) accept an RSA-encrypted private key per request — never plaintext.
|
|
199
|
+
Write tools (`send_token`, `estimate_send`, `execute_mento_fx`) accept an RSA-encrypted private key per request — never plaintext.
|
|
200
200
|
|
|
201
201
|
### Flow
|
|
202
202
|
|
|
@@ -257,6 +257,11 @@ Token symbols are resolved case-insensitively. Legacy aliases `cUSD` and `cEUR`
|
|
|
257
257
|
| `get_wallet_encryption_public_key` | read | RSA public key for encrypting private keys |
|
|
258
258
|
| `estimate_send` | read* | Gas estimate (*needs encrypted or env key) |
|
|
259
259
|
| `send_token` | write | Send CELO or ERC-20 |
|
|
260
|
+
| `get_mento_fx_quote` | read | Mento FX expected output (no wallet) |
|
|
261
|
+
| `estimate_mento_fx` | read* | Mento FX gas estimate (*needs encrypted or env key) |
|
|
262
|
+
| `execute_mento_fx` | write | Execute Mento FX conversion |
|
|
263
|
+
| `supply_aave_usdt` | write | Supply USDT to Aave V3 on Celo |
|
|
264
|
+
| `withdraw_aave_usdt` | write | Withdraw USDT from Aave V3 on Celo |
|
|
260
265
|
|
|
261
266
|
## Adding a new tool
|
|
262
267
|
|
|
@@ -282,8 +287,8 @@ No changes to `src/index.ts` or server bootstrap required.
|
|
|
282
287
|
|
|
283
288
|
## Roadmap
|
|
284
289
|
|
|
285
|
-
- [
|
|
286
|
-
- [
|
|
290
|
+
- [x] Mento FX routing (`get_mento_fx_quote`, `estimate_mento_fx`, `execute_mento_fx`)
|
|
291
|
+
- [x] Aave lending tools (`supply_aave_usdt`, `withdraw_aave_usdt`)
|
|
287
292
|
- [ ] Self proof verification (`ai.self.xyz`)
|
|
288
293
|
- [ ] Self Agent ID check
|
|
289
294
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aave-client.js","sourceRoot":"","sources":["../../src/clients/aave-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TransactionExecutionResult } from "@aave/client";
|
|
2
|
+
import type { ExecutionPlan } from "@aave/graphql";
|
|
3
|
+
import type { PublicClient, WalletClient } from "viem";
|
|
4
|
+
export declare function sendExecutionPlan(wallet: WalletClient, publicClient: PublicClient, plan: ExecutionPlan): Promise<{
|
|
5
|
+
result: TransactionExecutionResult;
|
|
6
|
+
approvalHash?: `0x${string}`;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { txHash } from "@aave/types";
|
|
2
|
+
function toTxParams(request) {
|
|
3
|
+
return {
|
|
4
|
+
to: request.to,
|
|
5
|
+
data: request.data,
|
|
6
|
+
value: BigInt(request.value),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
async function sendTransactionRequest(wallet, publicClient, request) {
|
|
10
|
+
const account = wallet.account;
|
|
11
|
+
if (!account) {
|
|
12
|
+
throw new Error("Wallet account unavailable.");
|
|
13
|
+
}
|
|
14
|
+
const chain = publicClient.chain;
|
|
15
|
+
if (!chain) {
|
|
16
|
+
throw new Error("Chain configuration missing.");
|
|
17
|
+
}
|
|
18
|
+
const hash = await wallet.sendTransaction({
|
|
19
|
+
chain,
|
|
20
|
+
account,
|
|
21
|
+
...toTxParams(request),
|
|
22
|
+
});
|
|
23
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
24
|
+
if (receipt.status === "reverted") {
|
|
25
|
+
throw new Error(`Transaction reverted: ${hash}`);
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
txHash: txHash(hash),
|
|
29
|
+
operation: request.operation ?? null,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function sendExecutionPlan(wallet, publicClient, plan) {
|
|
33
|
+
switch (plan.__typename) {
|
|
34
|
+
case "InsufficientBalanceError":
|
|
35
|
+
throw new Error(`Insufficient balance: required ${plan.required.value}, available ${plan.available.value}.`);
|
|
36
|
+
case "TransactionRequest": {
|
|
37
|
+
const result = await sendTransactionRequest(wallet, publicClient, plan);
|
|
38
|
+
return { result };
|
|
39
|
+
}
|
|
40
|
+
case "ApprovalRequired": {
|
|
41
|
+
const approval = await sendTransactionRequest(wallet, publicClient, plan.approval);
|
|
42
|
+
const result = await sendTransactionRequest(wallet, publicClient, plan.originalTransaction);
|
|
43
|
+
return { result, approvalHash: approval.txHash };
|
|
44
|
+
}
|
|
45
|
+
default:
|
|
46
|
+
throw new Error(`Unknown execution plan: ${plan.__typename}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=aave-send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aave-send.js","sourceRoot":"","sources":["../../src/clients/aave-send.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,SAAS,UAAU,CAAC,OAA2B;IAC7C,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAmB;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAqB;QACnC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,MAAoB,EACpB,YAA0B,EAC1B,OAA2B;IAE3B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;QACxC,KAAK;QACL,OAAO;QACP,GAAG,UAAU,CAAC,OAAO,CAAC;KACvB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,YAA0B,EAC1B,IAAmB;IAEnB,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,KAAK,0BAA0B;YAC7B,MAAM,IAAI,KAAK,CACb,kCAAkC,IAAI,CAAC,QAAQ,CAAC,KAAK,eAAe,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAC5F,CAAC;QACJ,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;YACxE,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC;QACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAC3C,MAAM,EACN,YAAY,EACZ,IAAI,CAAC,QAAQ,CACd,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,sBAAsB,CACzC,MAAM,EACN,YAAY,EACZ,IAAI,CAAC,mBAAmB,CACzB,CAAC;YACF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAuB,EAAE,CAAC;QACpE,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CACb,2BAA4B,IAA+B,CAAC,UAAU,EAAE,CACzE,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const Mento: typeof import("@mento-protocol/mento-sdk").Mento, ChainId: typeof import("@mento-protocol/mento-sdk").ChainId, deadlineFromMinutes: typeof import("@mento-protocol/mento-sdk").deadlineFromMinutes, RouteNotFoundError: typeof import("@mento-protocol/mento-sdk").RouteNotFoundError, FXMarketClosedError: typeof import("@mento-protocol/mento-sdk").FXMarketClosedError;
|
|
2
|
+
export type { CallParams } from "@mento-protocol/mento-sdk";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
/**
|
|
3
|
+
* @mento-protocol/mento-sdk's ESM build omits .js extensions on internal imports.
|
|
4
|
+
* Load the CJS entry via createRequire until upstream fixes exports.
|
|
5
|
+
*/
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const mentoSdk = require("@mento-protocol/mento-sdk");
|
|
8
|
+
export const { Mento, ChainId, deadlineFromMinutes, RouteNotFoundError, FXMarketClosedError, } = mentoSdk;
|
|
9
|
+
//# sourceMappingURL=mento-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mento-sdk.js","sourceRoot":"","sources":["../../src/clients/mento-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;;GAGG;AACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,QAAQ,GAAG,OAAO,CAAC,2BAA2B,CAA+C,CAAC;AAEpG,MAAM,CAAC,MAAM,EACX,KAAK,EACL,OAAO,EACP,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACpB,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Aave V3 on Celo mainnet — from bgd-labs/aave-address-book AaveV3Celo */
|
|
2
|
+
export declare const AAVE_POOL: "0x3E59A31363E2ad014dcbc521c4a0d5757d9f3402";
|
|
3
|
+
export declare const AAVE_USDT: "0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e";
|
|
4
|
+
export declare const AAVE_USDT_A_TOKEN: "0xDeE98402A302e4D707fB9bf2bac66fAEEc31e8Df";
|
|
5
|
+
export declare const AAVE_CHAIN_ID = 42220;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Aave V3 on Celo mainnet — from bgd-labs/aave-address-book AaveV3Celo */
|
|
2
|
+
export const AAVE_POOL = "0x3E59A31363E2ad014dcbc521c4a0d5757d9f3402";
|
|
3
|
+
export const AAVE_USDT = "0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e";
|
|
4
|
+
export const AAVE_USDT_A_TOKEN = "0xDeE98402A302e4D707fB9bf2bac66fAEEc31e8Df";
|
|
5
|
+
export const AAVE_CHAIN_ID = 42220;
|
|
6
|
+
//# sourceMappingURL=aave.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aave.js","sourceRoot":"","sources":["../../src/config/aave.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,SAAS,GAAG,4CAAqD,CAAC;AAC/E,MAAM,CAAC,MAAM,SAAS,GAAG,4CAAqD,CAAC;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAC5B,4CAAqD,CAAC;AACxD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC"}
|
package/build/config/chains.d.ts
CHANGED
|
@@ -912,6 +912,8 @@ export declare const CHAIN: {
|
|
|
912
912
|
verifyHash?: ((client: import("viem").Client, parameters: import("viem").VerifyHashActionParameters) => Promise<import("viem").VerifyHashActionReturnType>) | undefined;
|
|
913
913
|
};
|
|
914
914
|
export declare const DEFAULT_RPC_URL = "https://forno.celo.org";
|
|
915
|
+
/** Mento collateral address for native CELO (used by @mento-protocol/mento-sdk). */
|
|
916
|
+
export declare const MENTO_CELO_ADDRESS: "0x471EcE3750Da237f93B8E339c536989b8978a438";
|
|
915
917
|
export type KnownToken = {
|
|
916
918
|
symbol: string;
|
|
917
919
|
address: `0x${string}` | "native";
|
|
@@ -929,4 +931,5 @@ export type Stablecoin = KnownToken & {
|
|
|
929
931
|
export declare const STABLECOINS: Stablecoin[];
|
|
930
932
|
export declare const KNOWN_TOKEN_SYMBOLS: string[];
|
|
931
933
|
export declare function findKnownToken(token: string): KnownToken | undefined;
|
|
934
|
+
export declare function toMentoTokenAddress(address: `0x${string}` | "native"): `0x${string}`;
|
|
932
935
|
export declare function resolveStablecoins(symbols?: string[]): Stablecoin[];
|
package/build/config/chains.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { celo } from "viem/chains";
|
|
2
2
|
export const CHAIN = celo;
|
|
3
3
|
export const DEFAULT_RPC_URL = "https://forno.celo.org";
|
|
4
|
+
/** Mento collateral address for native CELO (used by @mento-protocol/mento-sdk). */
|
|
5
|
+
export const MENTO_CELO_ADDRESS = "0x471EcE3750Da237f93B8E339c536989b8978a438";
|
|
4
6
|
export const KNOWN_TOKENS = [
|
|
5
7
|
{
|
|
6
8
|
symbol: "CELO",
|
|
@@ -219,6 +221,12 @@ export function findKnownToken(token) {
|
|
|
219
221
|
return KNOWN_TOKENS.find((entry) => tokenMatchesInput(entry, normalized, upper) ||
|
|
220
222
|
(upper === "NATIVE" && entry.address === "native"));
|
|
221
223
|
}
|
|
224
|
+
export function toMentoTokenAddress(address) {
|
|
225
|
+
if (address === "native") {
|
|
226
|
+
return MENTO_CELO_ADDRESS;
|
|
227
|
+
}
|
|
228
|
+
return address;
|
|
229
|
+
}
|
|
222
230
|
export function resolveStablecoins(symbols) {
|
|
223
231
|
if (!symbols?.length) {
|
|
224
232
|
return STABLECOINS;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/config/chains.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/config/chains.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/config/load-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,kFAAkF;AAClF,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC"}
|
|
@@ -3,7 +3,9 @@ import { BlockchainService } from "../services/blockchain.service.js";
|
|
|
3
3
|
import { AccountService } from "../services/account.service.js";
|
|
4
4
|
import { TokenService } from "../services/token.service.js";
|
|
5
5
|
import { TransactionService } from "../services/transaction.service.js";
|
|
6
|
+
import { MentoFxService } from "../services/mento-fx.service.js";
|
|
6
7
|
import { GoodDollarService } from "../services/gooddollar.service.js";
|
|
8
|
+
import { AaveService } from "../services/aave.service.js";
|
|
7
9
|
export interface AppContext {
|
|
8
10
|
config: {
|
|
9
11
|
hasWallet: boolean;
|
|
@@ -13,6 +15,8 @@ export interface AppContext {
|
|
|
13
15
|
account: AccountService;
|
|
14
16
|
token: TokenService;
|
|
15
17
|
transaction: TransactionService;
|
|
18
|
+
mentoFx: MentoFxService;
|
|
16
19
|
gooddollar: GoodDollarService;
|
|
20
|
+
aave: AaveService;
|
|
17
21
|
}
|
|
18
22
|
export declare function createAppContext(clientFactory: CeloClientFactory, walletAddress?: `0x${string}`): AppContext;
|
|
@@ -2,7 +2,9 @@ import { BlockchainService } from "../services/blockchain.service.js";
|
|
|
2
2
|
import { AccountService } from "../services/account.service.js";
|
|
3
3
|
import { TokenService } from "../services/token.service.js";
|
|
4
4
|
import { TransactionService } from "../services/transaction.service.js";
|
|
5
|
+
import { MentoFxService } from "../services/mento-fx.service.js";
|
|
5
6
|
import { GoodDollarService } from "../services/gooddollar.service.js";
|
|
7
|
+
import { AaveService } from "../services/aave.service.js";
|
|
6
8
|
export function createAppContext(clientFactory, walletAddress) {
|
|
7
9
|
return {
|
|
8
10
|
config: {
|
|
@@ -13,7 +15,9 @@ export function createAppContext(clientFactory, walletAddress) {
|
|
|
13
15
|
account: new AccountService(clientFactory),
|
|
14
16
|
token: new TokenService(clientFactory),
|
|
15
17
|
transaction: new TransactionService(clientFactory),
|
|
18
|
+
mentoFx: new MentoFxService(clientFactory),
|
|
16
19
|
gooddollar: new GoodDollarService(clientFactory),
|
|
20
|
+
aave: new AaveService(clientFactory),
|
|
17
21
|
};
|
|
18
22
|
}
|
|
19
23
|
//# sourceMappingURL=app-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-context.js","sourceRoot":"","sources":["../../src/context/app-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"app-context.js","sourceRoot":"","sources":["../../src/context/app-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAgB1D,MAAM,UAAU,gBAAgB,CAC9B,aAAgC,EAChC,aAA6B;IAE7B,OAAO;QACL,MAAM,EAAE;YACN,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC;YACjC,aAAa;SACd;QACD,UAAU,EAAE,IAAI,iBAAiB,CAAC,aAAa,CAAC;QAChD,OAAO,EAAE,IAAI,cAAc,CAAC,aAAa,CAAC;QAC1C,KAAK,EAAE,IAAI,YAAY,CAAC,aAAa,CAAC;QACtC,WAAW,EAAE,IAAI,kBAAkB,CAAC,aAAa,CAAC;QAClD,OAAO,EAAE,IAAI,cAAc,CAAC,aAAa,CAAC;QAC1C,UAAU,EAAE,IAAI,iBAAiB,CAAC,aAAa,CAAC;QAChD,IAAI,EAAE,IAAI,WAAW,CAAC,aAAa,CAAC;KACrC,CAAC;AACJ,CAAC"}
|
package/build/http.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
import "./config/load-env.js";
|
package/build/http.js
CHANGED
package/build/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAElD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAEvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;IAC/C,OAAO,CAAC,IAAI,CACV,yGAAyG,CAC1G,CAAC;AACJ,CAAC;AAED,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;IAC/B,OAAO,CAAC,GAAG,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";AACA,OAAO,sBAAsB,CAAC;AAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAElD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAEvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;IAC/C,OAAO,CAAC,IAAI,CACV,yGAAyG,CAC1G,CAAC;AACJ,CAAC;AAED,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;IAC/B,OAAO,CAAC,GAAG,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/build/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
import "./config/load-env.js";
|
package/build/index.js
CHANGED
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC3C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC3C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -4,11 +4,14 @@ You are connected to Celina, the Celo MCP server (mainnet only).
|
|
|
4
4
|
Guidelines:
|
|
5
5
|
- Prefer read-only tools (get_*) before any write operation.
|
|
6
6
|
- Always call estimate_send before send_token when possible.
|
|
7
|
+
- For Mento FX conversions, call get_mento_fx_quote and estimate_mento_fx before execute_mento_fx.
|
|
7
8
|
- Write tools require CELO_PRIVATE_KEY in the server environment.
|
|
8
9
|
- Known tokens are defined in a single registry: CELO (native), mainnet stablecoins (USDm, EURm, USDC, USDT, etc.), and GoodDollar.
|
|
9
10
|
- Use get_stablecoin_balances to scan all stablecoins at once; use get_celo_balances with a tokens list for specific symbols.
|
|
10
11
|
- Use get_gooddollar_whitelisting_info to check GoodDollar IdentityV4 whitelist status, whitelisting date, and reverification progress for a wallet.
|
|
12
|
+
- Mento FX tools (get_mento_fx_quote, estimate_mento_fx, execute_mento_fx) convert between Mento oracle-priced tokens (USDm, EURm, CELO, etc.). They are unavailable when the Mento FX market is closed.
|
|
13
|
+
- Aave tools (supply_aave_usdt, withdraw_aave_usdt) supply and withdraw USDT on Aave V3 Celo. Use get_celo_balances with tokens ["USDT"] before supplying; use withdrawMax on withdraw to redeem the full supplied balance.
|
|
11
14
|
|
|
12
|
-
Future tools (add as new modules in src/tools/):
|
|
15
|
+
Future tools (add as new modules in src/tools/): Self verify, Self Agent ID check.
|
|
13
16
|
`.trim();
|
|
14
17
|
//# sourceMappingURL=instructions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/server/instructions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/server/instructions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;CAelC,CAAC,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CeloClientFactory } from "../clients/celo-client.js";
|
|
2
|
+
export declare class AaveService {
|
|
3
|
+
private readonly clientFactory;
|
|
4
|
+
private readonly tokenService;
|
|
5
|
+
constructor(clientFactory: CeloClientFactory);
|
|
6
|
+
private resolveClients;
|
|
7
|
+
private formatAaveError;
|
|
8
|
+
private assertUsdtBalance;
|
|
9
|
+
private assertSuppliedBalance;
|
|
10
|
+
supplyUsdt(amount: string, encryptedPrivateKey?: string): Promise<{
|
|
11
|
+
from: `0x${string}`;
|
|
12
|
+
amount: string;
|
|
13
|
+
token: string;
|
|
14
|
+
market: "0x3E59A31363E2ad014dcbc521c4a0d5757d9f3402";
|
|
15
|
+
hash: import("@aave/types").TxHash;
|
|
16
|
+
approvalHash: `0x${string}` | undefined;
|
|
17
|
+
operation: string;
|
|
18
|
+
}>;
|
|
19
|
+
withdrawUsdt(amount: string | undefined, encryptedPrivateKey?: string, withdrawMax?: boolean): Promise<{
|
|
20
|
+
from: `0x${string}`;
|
|
21
|
+
amount: string;
|
|
22
|
+
token: string;
|
|
23
|
+
market: "0x3E59A31363E2ad014dcbc521c4a0d5757d9f3402";
|
|
24
|
+
hash: import("@aave/types").TxHash;
|
|
25
|
+
operation: string;
|
|
26
|
+
withdrawMax: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { supply, withdraw } from "@aave/client/actions";
|
|
2
|
+
import { bigDecimal, chainId, evmAddress } from "@aave/types";
|
|
3
|
+
import { erc20Abi } from "viem";
|
|
4
|
+
import { aaveClient } from "../clients/aave-client.js";
|
|
5
|
+
import { sendExecutionPlan } from "../clients/aave-send.js";
|
|
6
|
+
import { AAVE_CHAIN_ID, AAVE_POOL, AAVE_USDT, AAVE_USDT_A_TOKEN, } from "../config/aave.js";
|
|
7
|
+
import { decryptPrivateKey } from "../crypto/wallet-key-crypto.js";
|
|
8
|
+
import { TokenService } from "./token.service.js";
|
|
9
|
+
export class AaveService {
|
|
10
|
+
clientFactory;
|
|
11
|
+
tokenService;
|
|
12
|
+
constructor(clientFactory) {
|
|
13
|
+
this.clientFactory = clientFactory;
|
|
14
|
+
this.tokenService = new TokenService(clientFactory);
|
|
15
|
+
}
|
|
16
|
+
resolveClients(encryptedPrivateKey) {
|
|
17
|
+
if (encryptedPrivateKey) {
|
|
18
|
+
const privateKey = decryptPrivateKey(encryptedPrivateKey);
|
|
19
|
+
return this.clientFactory.getClientsForAccount(privateKey);
|
|
20
|
+
}
|
|
21
|
+
const clients = this.clientFactory.getClients();
|
|
22
|
+
if (!clients.wallet || !clients.accountAddress) {
|
|
23
|
+
throw new Error("No wallet configured. Provide encryptedPrivateKey (encrypt with get_wallet_encryption_public_key) or set CELO_PRIVATE_KEY for local mode.");
|
|
24
|
+
}
|
|
25
|
+
return clients;
|
|
26
|
+
}
|
|
27
|
+
formatAaveError(error) {
|
|
28
|
+
if (error && typeof error === "object" && "name" in error && "message" in error) {
|
|
29
|
+
const named = error;
|
|
30
|
+
throw new Error(`${named.name}: ${named.message}`);
|
|
31
|
+
}
|
|
32
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
33
|
+
}
|
|
34
|
+
async assertUsdtBalance(publicClient, owner, amount) {
|
|
35
|
+
const usdt = this.tokenService.resolveToken("USDT");
|
|
36
|
+
const required = this.tokenService.parseAmount(amount, usdt.decimals);
|
|
37
|
+
const balance = await publicClient.readContract({
|
|
38
|
+
address: AAVE_USDT,
|
|
39
|
+
abi: erc20Abi,
|
|
40
|
+
functionName: "balanceOf",
|
|
41
|
+
args: [owner],
|
|
42
|
+
});
|
|
43
|
+
if (balance < required) {
|
|
44
|
+
throw new Error(`Insufficient USDT balance. Required ${amount} USDT, available ${balance.toString()} raw units.`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async assertSuppliedBalance(publicClient, owner, amount) {
|
|
48
|
+
const usdt = this.tokenService.resolveToken("USDT");
|
|
49
|
+
const required = this.tokenService.parseAmount(amount, usdt.decimals);
|
|
50
|
+
const balance = await publicClient.readContract({
|
|
51
|
+
address: AAVE_USDT_A_TOKEN,
|
|
52
|
+
abi: erc20Abi,
|
|
53
|
+
functionName: "balanceOf",
|
|
54
|
+
args: [owner],
|
|
55
|
+
});
|
|
56
|
+
if (balance < required) {
|
|
57
|
+
throw new Error(`Insufficient Aave USDT supply balance. Required ${amount} USDT, available ${balance.toString()} raw aToken units.`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async supplyUsdt(amount, encryptedPrivateKey) {
|
|
61
|
+
const { public: publicClient, wallet, accountAddress: from } = this.resolveClients(encryptedPrivateKey);
|
|
62
|
+
if (!wallet || !from) {
|
|
63
|
+
throw new Error("Wallet client unavailable. Provide encryptedPrivateKey or set CELO_PRIVATE_KEY.");
|
|
64
|
+
}
|
|
65
|
+
await this.assertUsdtBalance(publicClient, from, amount);
|
|
66
|
+
const planResult = await supply(aaveClient, {
|
|
67
|
+
market: evmAddress(AAVE_POOL),
|
|
68
|
+
amount: {
|
|
69
|
+
erc20: {
|
|
70
|
+
currency: evmAddress(AAVE_USDT),
|
|
71
|
+
value: bigDecimal(amount),
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
sender: evmAddress(from),
|
|
75
|
+
chainId: chainId(AAVE_CHAIN_ID),
|
|
76
|
+
});
|
|
77
|
+
if (planResult.isErr()) {
|
|
78
|
+
this.formatAaveError(planResult.error);
|
|
79
|
+
}
|
|
80
|
+
const { result, approvalHash } = await sendExecutionPlan(wallet, publicClient, planResult.value);
|
|
81
|
+
const waitResult = await aaveClient.waitForTransaction(result);
|
|
82
|
+
if (waitResult.isErr()) {
|
|
83
|
+
this.formatAaveError(waitResult.error);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
from,
|
|
87
|
+
amount,
|
|
88
|
+
token: "USDT",
|
|
89
|
+
market: AAVE_POOL,
|
|
90
|
+
hash: waitResult.value,
|
|
91
|
+
approvalHash,
|
|
92
|
+
operation: "SUPPLY",
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async withdrawUsdt(amount, encryptedPrivateKey, withdrawMax) {
|
|
96
|
+
const { public: publicClient, wallet, accountAddress: from } = this.resolveClients(encryptedPrivateKey);
|
|
97
|
+
if (!wallet || !from) {
|
|
98
|
+
throw new Error("Wallet client unavailable. Provide encryptedPrivateKey or set CELO_PRIVATE_KEY.");
|
|
99
|
+
}
|
|
100
|
+
if (!withdrawMax && !amount) {
|
|
101
|
+
throw new Error("Provide amount or set withdrawMax to true.");
|
|
102
|
+
}
|
|
103
|
+
if (!withdrawMax && amount) {
|
|
104
|
+
await this.assertSuppliedBalance(publicClient, from, amount);
|
|
105
|
+
}
|
|
106
|
+
const withdrawAmount = withdrawMax
|
|
107
|
+
? {
|
|
108
|
+
erc20: {
|
|
109
|
+
currency: evmAddress(AAVE_USDT),
|
|
110
|
+
value: { max: true },
|
|
111
|
+
},
|
|
112
|
+
}
|
|
113
|
+
: {
|
|
114
|
+
erc20: {
|
|
115
|
+
currency: evmAddress(AAVE_USDT),
|
|
116
|
+
value: { exact: bigDecimal(amount) },
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
const planResult = await withdraw(aaveClient, {
|
|
120
|
+
market: evmAddress(AAVE_POOL),
|
|
121
|
+
amount: withdrawAmount,
|
|
122
|
+
sender: evmAddress(from),
|
|
123
|
+
chainId: chainId(AAVE_CHAIN_ID),
|
|
124
|
+
});
|
|
125
|
+
if (planResult.isErr()) {
|
|
126
|
+
this.formatAaveError(planResult.error);
|
|
127
|
+
}
|
|
128
|
+
const { result } = await sendExecutionPlan(wallet, publicClient, planResult.value);
|
|
129
|
+
const waitResult = await aaveClient.waitForTransaction(result);
|
|
130
|
+
if (waitResult.isErr()) {
|
|
131
|
+
this.formatAaveError(waitResult.error);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
from,
|
|
135
|
+
amount: withdrawMax ? "max" : amount,
|
|
136
|
+
token: "USDT",
|
|
137
|
+
market: AAVE_POOL,
|
|
138
|
+
hash: waitResult.value,
|
|
139
|
+
operation: "WITHDRAW",
|
|
140
|
+
withdrawMax: Boolean(withdrawMax),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=aave.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aave.service.js","sourceRoot":"","sources":["../../src/services/aave.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { CeloClientFactory } from "../clients/celo-client.js";
|
|
2
|
+
export interface MentoFxParams {
|
|
3
|
+
slippageTolerance?: number;
|
|
4
|
+
deadlineMinutes?: number;
|
|
5
|
+
recipient?: `0x${string}`;
|
|
6
|
+
encryptedPrivateKey?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class MentoFxService {
|
|
9
|
+
private readonly clientFactory;
|
|
10
|
+
private readonly tokenService;
|
|
11
|
+
constructor(clientFactory: CeloClientFactory);
|
|
12
|
+
private resolveClients;
|
|
13
|
+
private getMentoClient;
|
|
14
|
+
private resolveMentoPair;
|
|
15
|
+
private fxOptions;
|
|
16
|
+
private formatFxError;
|
|
17
|
+
private toGasParams;
|
|
18
|
+
private estimateCallGas;
|
|
19
|
+
private baseQuoteFields;
|
|
20
|
+
getFxQuote(tokenIn: string, tokenOut: string, amount: string): Promise<{
|
|
21
|
+
protocol: "mento_fx";
|
|
22
|
+
network: "mainnet";
|
|
23
|
+
tokenIn: string;
|
|
24
|
+
tokenOut: string;
|
|
25
|
+
amountIn: string;
|
|
26
|
+
expectedOut: string;
|
|
27
|
+
routeHops: number;
|
|
28
|
+
}>;
|
|
29
|
+
estimateFx(tokenIn: string, tokenOut: string, amount: string, params?: MentoFxParams): Promise<{
|
|
30
|
+
from: `0x${string}`;
|
|
31
|
+
recipient: `0x${string}`;
|
|
32
|
+
amountOutMin: string;
|
|
33
|
+
approvalNeeded: boolean;
|
|
34
|
+
approvalGas: string | undefined;
|
|
35
|
+
fxGas: string;
|
|
36
|
+
slippageTolerance: number;
|
|
37
|
+
deadline: string;
|
|
38
|
+
deadlineMinutes: number;
|
|
39
|
+
protocol: "mento_fx";
|
|
40
|
+
network: "mainnet";
|
|
41
|
+
tokenIn: string;
|
|
42
|
+
tokenOut: string;
|
|
43
|
+
amountIn: string;
|
|
44
|
+
expectedOut: string;
|
|
45
|
+
routeHops: number;
|
|
46
|
+
}>;
|
|
47
|
+
executeFx(tokenIn: string, tokenOut: string, amount: string, params?: MentoFxParams): Promise<{
|
|
48
|
+
from: `0x${string}`;
|
|
49
|
+
recipient: `0x${string}`;
|
|
50
|
+
amountOutMin: string;
|
|
51
|
+
approvalNeeded: boolean;
|
|
52
|
+
approvalHash: `0x${string}` | undefined;
|
|
53
|
+
hash: `0x${string}`;
|
|
54
|
+
status: "success" | "reverted";
|
|
55
|
+
slippageTolerance: number;
|
|
56
|
+
deadline: string;
|
|
57
|
+
deadlineMinutes: number;
|
|
58
|
+
protocol: "mento_fx";
|
|
59
|
+
network: "mainnet";
|
|
60
|
+
tokenIn: string;
|
|
61
|
+
tokenOut: string;
|
|
62
|
+
amountIn: string;
|
|
63
|
+
expectedOut: string;
|
|
64
|
+
routeHops: number;
|
|
65
|
+
}>;
|
|
66
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { ChainId, deadlineFromMinutes, Mento, RouteNotFoundError, FXMarketClosedError, } from "../clients/mento-sdk.js";
|
|
2
|
+
import { formatUnits } from "viem";
|
|
3
|
+
import { toMentoTokenAddress } from "../config/chains.js";
|
|
4
|
+
import { decryptPrivateKey } from "../crypto/wallet-key-crypto.js";
|
|
5
|
+
import { TokenService } from "./token.service.js";
|
|
6
|
+
const DEFAULT_SLIPPAGE = 0.5;
|
|
7
|
+
const DEFAULT_DEADLINE_MINUTES = 5;
|
|
8
|
+
export class MentoFxService {
|
|
9
|
+
clientFactory;
|
|
10
|
+
tokenService;
|
|
11
|
+
constructor(clientFactory) {
|
|
12
|
+
this.clientFactory = clientFactory;
|
|
13
|
+
this.tokenService = new TokenService(clientFactory);
|
|
14
|
+
}
|
|
15
|
+
resolveClients(encryptedPrivateKey) {
|
|
16
|
+
if (encryptedPrivateKey) {
|
|
17
|
+
const privateKey = decryptPrivateKey(encryptedPrivateKey);
|
|
18
|
+
return this.clientFactory.getClientsForAccount(privateKey);
|
|
19
|
+
}
|
|
20
|
+
const clients = this.clientFactory.getClients();
|
|
21
|
+
if (!clients.wallet || !clients.accountAddress) {
|
|
22
|
+
throw new Error("No wallet configured. Provide encryptedPrivateKey (encrypt with get_wallet_encryption_public_key) or set CELO_PRIVATE_KEY for local mode.");
|
|
23
|
+
}
|
|
24
|
+
return clients;
|
|
25
|
+
}
|
|
26
|
+
async getMentoClient(publicClient) {
|
|
27
|
+
return Mento.create(ChainId.CELO, publicClient);
|
|
28
|
+
}
|
|
29
|
+
resolveMentoPair(tokenIn, tokenOut) {
|
|
30
|
+
const resolvedIn = this.tokenService.resolveToken(tokenIn);
|
|
31
|
+
const resolvedOut = this.tokenService.resolveToken(tokenOut);
|
|
32
|
+
return {
|
|
33
|
+
resolvedIn,
|
|
34
|
+
resolvedOut,
|
|
35
|
+
mentoIn: toMentoTokenAddress(resolvedIn.address),
|
|
36
|
+
mentoOut: toMentoTokenAddress(resolvedOut.address),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
fxOptions(params) {
|
|
40
|
+
const slippageTolerance = params?.slippageTolerance ?? DEFAULT_SLIPPAGE;
|
|
41
|
+
const deadlineMinutes = params?.deadlineMinutes ?? DEFAULT_DEADLINE_MINUTES;
|
|
42
|
+
return {
|
|
43
|
+
slippageTolerance,
|
|
44
|
+
deadlineMinutes,
|
|
45
|
+
deadline: deadlineFromMinutes(deadlineMinutes),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
formatFxError(error, tokenIn, tokenOut) {
|
|
49
|
+
if (error instanceof RouteNotFoundError) {
|
|
50
|
+
throw new Error(`No Mento FX route for ${tokenIn} → ${tokenOut}.`);
|
|
51
|
+
}
|
|
52
|
+
if (error instanceof FXMarketClosedError) {
|
|
53
|
+
throw new Error("Mento FX market is currently closed. FX quotes and execution are unavailable until the market reopens.");
|
|
54
|
+
}
|
|
55
|
+
if (error instanceof Error && /FXMarketClosed/i.test(error.message)) {
|
|
56
|
+
throw new Error("Mento FX market is currently closed. FX quotes and execution are unavailable until the market reopens.");
|
|
57
|
+
}
|
|
58
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
59
|
+
}
|
|
60
|
+
toGasParams(params) {
|
|
61
|
+
return {
|
|
62
|
+
to: params.to,
|
|
63
|
+
data: params.data,
|
|
64
|
+
value: BigInt(params.value),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async estimateCallGas(client, from, params) {
|
|
68
|
+
const gas = await client.estimateGas({
|
|
69
|
+
account: from,
|
|
70
|
+
...this.toGasParams(params),
|
|
71
|
+
});
|
|
72
|
+
return gas.toString();
|
|
73
|
+
}
|
|
74
|
+
baseQuoteFields(resolvedIn, resolvedOut, amount, expectedOutWei, routeHops) {
|
|
75
|
+
return {
|
|
76
|
+
protocol: "mento_fx",
|
|
77
|
+
network: "mainnet",
|
|
78
|
+
tokenIn: resolvedIn.symbol,
|
|
79
|
+
tokenOut: resolvedOut.symbol,
|
|
80
|
+
amountIn: amount,
|
|
81
|
+
expectedOut: formatUnits(expectedOutWei, resolvedOut.decimals),
|
|
82
|
+
routeHops,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async getFxQuote(tokenIn, tokenOut, amount) {
|
|
86
|
+
const { public: client } = this.clientFactory.getClients();
|
|
87
|
+
const { resolvedIn, resolvedOut, mentoIn, mentoOut } = this.resolveMentoPair(tokenIn, tokenOut);
|
|
88
|
+
const amountInWei = this.tokenService.parseAmount(amount, resolvedIn.decimals);
|
|
89
|
+
try {
|
|
90
|
+
const mento = await this.getMentoClient(client);
|
|
91
|
+
const [expectedOutWei, route] = await Promise.all([
|
|
92
|
+
mento.quotes.getAmountOut(mentoIn, mentoOut, amountInWei),
|
|
93
|
+
mento.routes.findRoute(mentoIn, mentoOut),
|
|
94
|
+
]);
|
|
95
|
+
return this.baseQuoteFields(resolvedIn, resolvedOut, amount, expectedOutWei, route.path.length);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
this.formatFxError(error, resolvedIn.symbol, resolvedOut.symbol);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async estimateFx(tokenIn, tokenOut, amount, params) {
|
|
102
|
+
const { public: client, accountAddress: from } = this.resolveClients(params?.encryptedPrivateKey);
|
|
103
|
+
if (!from) {
|
|
104
|
+
throw new Error("Wallet address unavailable.");
|
|
105
|
+
}
|
|
106
|
+
const { resolvedIn, resolvedOut, mentoIn, mentoOut } = this.resolveMentoPair(tokenIn, tokenOut);
|
|
107
|
+
const recipient = params?.recipient ?? from;
|
|
108
|
+
const amountInWei = this.tokenService.parseAmount(amount, resolvedIn.decimals);
|
|
109
|
+
const { slippageTolerance, deadlineMinutes, deadline } = this.fxOptions(params);
|
|
110
|
+
try {
|
|
111
|
+
const mento = await this.getMentoClient(client);
|
|
112
|
+
const { approval, swap } = await mento.swap.buildSwapTransaction(mentoIn, mentoOut, amountInWei, recipient, from, { slippageTolerance, deadline });
|
|
113
|
+
const [approvalGas, fxGas] = await Promise.all([
|
|
114
|
+
approval
|
|
115
|
+
? this.estimateCallGas(client, from, approval)
|
|
116
|
+
: Promise.resolve(undefined),
|
|
117
|
+
this.estimateCallGas(client, from, swap.params),
|
|
118
|
+
]);
|
|
119
|
+
return {
|
|
120
|
+
...this.baseQuoteFields(resolvedIn, resolvedOut, amount, swap.expectedAmountOut, swap.route.path.length),
|
|
121
|
+
from,
|
|
122
|
+
recipient,
|
|
123
|
+
amountOutMin: formatUnits(swap.amountOutMin, resolvedOut.decimals),
|
|
124
|
+
approvalNeeded: approval !== null,
|
|
125
|
+
approvalGas,
|
|
126
|
+
fxGas,
|
|
127
|
+
slippageTolerance,
|
|
128
|
+
deadline: deadline.toString(),
|
|
129
|
+
deadlineMinutes,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
this.formatFxError(error, resolvedIn.symbol, resolvedOut.symbol);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async executeFx(tokenIn, tokenOut, amount, params) {
|
|
137
|
+
const { public: client, wallet, accountAddress: from } = this.resolveClients(params?.encryptedPrivateKey);
|
|
138
|
+
if (!wallet || !from) {
|
|
139
|
+
throw new Error("Wallet client unavailable. Provide encryptedPrivateKey or set CELO_PRIVATE_KEY.");
|
|
140
|
+
}
|
|
141
|
+
const account = wallet.account;
|
|
142
|
+
if (!account) {
|
|
143
|
+
throw new Error("Wallet account unavailable.");
|
|
144
|
+
}
|
|
145
|
+
const chain = client.chain;
|
|
146
|
+
if (!chain) {
|
|
147
|
+
throw new Error("Chain configuration missing");
|
|
148
|
+
}
|
|
149
|
+
const { resolvedIn, resolvedOut, mentoIn, mentoOut } = this.resolveMentoPair(tokenIn, tokenOut);
|
|
150
|
+
const recipient = params?.recipient ?? from;
|
|
151
|
+
const amountInWei = this.tokenService.parseAmount(amount, resolvedIn.decimals);
|
|
152
|
+
const { slippageTolerance, deadlineMinutes, deadline } = this.fxOptions(params);
|
|
153
|
+
try {
|
|
154
|
+
const mento = await this.getMentoClient(client);
|
|
155
|
+
const { approval, swap } = await mento.swap.buildSwapTransaction(mentoIn, mentoOut, amountInWei, recipient, from, { slippageTolerance, deadline });
|
|
156
|
+
let approvalHash;
|
|
157
|
+
if (approval) {
|
|
158
|
+
approvalHash = await wallet.sendTransaction({
|
|
159
|
+
chain,
|
|
160
|
+
account,
|
|
161
|
+
...this.toGasParams(approval),
|
|
162
|
+
});
|
|
163
|
+
await client.waitForTransactionReceipt({ hash: approvalHash });
|
|
164
|
+
}
|
|
165
|
+
const hash = await wallet.sendTransaction({
|
|
166
|
+
chain,
|
|
167
|
+
account,
|
|
168
|
+
...this.toGasParams(swap.params),
|
|
169
|
+
});
|
|
170
|
+
const receipt = await client.waitForTransactionReceipt({ hash });
|
|
171
|
+
return {
|
|
172
|
+
...this.baseQuoteFields(resolvedIn, resolvedOut, amount, swap.expectedAmountOut, swap.route.path.length),
|
|
173
|
+
from,
|
|
174
|
+
recipient,
|
|
175
|
+
amountOutMin: formatUnits(swap.amountOutMin, resolvedOut.decimals),
|
|
176
|
+
approvalNeeded: approval !== null,
|
|
177
|
+
approvalHash,
|
|
178
|
+
hash,
|
|
179
|
+
status: receipt.status,
|
|
180
|
+
slippageTolerance,
|
|
181
|
+
deadline: deadline.toString(),
|
|
182
|
+
deadlineMinutes,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
this.formatFxError(error, resolvedIn.symbol, resolvedOut.symbol);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=mento-fx.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mento-fx.service.js","sourceRoot":"","sources":["../../src/services/mento-fx.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,KAAK,EACL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AAStE,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAEnC,MAAM,OAAO,cAAc;IAGI;IAFZ,YAAY,CAAe;IAE5C,YAA6B,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;QAC3D,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;IAEO,cAAc,CAAC,mBAA4B;QACjD,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,2IAA2I,CAC5I,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,YAAmC;QAC9D,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAClD,CAAC;IAEO,gBAAgB,CAAC,OAAe,EAAE,QAAgB;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE7D,OAAO;YACL,UAAU;YACV,WAAW;YACX,OAAO,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC;YAChD,QAAQ,EAAE,mBAAmB,CAAC,WAAW,CAAC,OAAO,CAAC;SACnD,CAAC;IACJ,CAAC;IAEO,SAAS,CAAC,MAAsB;QACtC,MAAM,iBAAiB,GAAG,MAAM,EAAE,iBAAiB,IAAI,gBAAgB,CAAC;QACxE,MAAM,eAAe,GAAG,MAAM,EAAE,eAAe,IAAI,wBAAwB,CAAC;QAE5E,OAAO;YACL,iBAAiB;YACjB,eAAe;YACf,QAAQ,EAAE,mBAAmB,CAAC,eAAe,CAAC;SAC/C,CAAC;IACJ,CAAC;IAEO,aAAa,CACnB,KAAc,EACd,OAAe,EACf,QAAgB;QAEhB,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,MAAM,QAAQ,GAAG,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,YAAY,KAAK,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;IAEO,WAAW,CAAC,MAAkB;QACpC,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAmB;YAC9B,IAAI,EAAE,MAAM,CAAC,IAAqB;YAClC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;SAC5B,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,MAA6B,EAC7B,IAAmB,EACnB,MAAkB;QAElB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;YACnC,OAAO,EAAE,IAAI;YACb,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;SAC5B,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAEO,eAAe,CACrB,UAAyB,EACzB,WAA0B,EAC1B,MAAc,EACd,cAAsB,EACtB,SAAiB;QAEjB,OAAO;YACL,QAAQ,EAAE,UAAmB;YAC7B,OAAO,EAAE,SAAkB;YAC3B,OAAO,EAAE,UAAU,CAAC,MAAM;YAC1B,QAAQ,EAAE,WAAW,CAAC,MAAM;YAC5B,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,QAAQ,CAAC;YAC9D,SAAS;SACV,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,QAAgB,EAAE,MAAc;QAChE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,GAClD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE3C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE/E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChD,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC;gBACzD,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;aAC1C,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,eAAe,CACzB,UAAU,EACV,WAAW,EACX,MAAM,EACN,cAAc,EACd,KAAK,CAAC,IAAI,CAAC,MAAM,CAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CACd,OAAe,EACf,QAAgB,EAChB,MAAc,EACd,MAAsB;QAEtB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,cAAc,CAClE,MAAM,EAAE,mBAAmB,CAC5B,CAAC;QAEF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,GAClD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/E,MAAM,EAAE,iBAAiB,EAAE,eAAe,EAAE,QAAQ,EAAE,GACpD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAC9D,OAAO,EACP,QAAQ,EACR,WAAW,EACX,SAAS,EACT,IAAI,EACJ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAChC,CAAC;YAEF,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC7C,QAAQ;oBACN,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;oBAC9C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;gBAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;aAChD,CAAC,CAAC;YAEH,OAAO;gBACL,GAAG,IAAI,CAAC,eAAe,CACrB,UAAU,EACV,WAAW,EACX,MAAM,EACN,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CACvB;gBACD,IAAI;gBACJ,SAAS;gBACT,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,QAAQ,CAAC;gBAClE,cAAc,EAAE,QAAQ,KAAK,IAAI;gBACjC,WAAW;gBACX,KAAK;gBACL,iBAAiB;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;gBAC7B,eAAe;aAChB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAe,EACf,QAAgB,EAChB,MAAc,EACd,MAAsB;QAEtB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,cAAc,CAC1E,MAAM,EAAE,mBAAmB,CAC5B,CAAC;QAEF,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,GAClD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/E,MAAM,EAAE,iBAAiB,EAAE,eAAe,EAAE,QAAQ,EAAE,GACpD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAC9D,OAAO,EACP,QAAQ,EACR,WAAW,EACX,SAAS,EACT,IAAI,EACJ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAChC,CAAC;YAEF,IAAI,YAAuC,CAAC;YAE5C,IAAI,QAAQ,EAAE,CAAC;gBACb,YAAY,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;oBAC1C,KAAK;oBACL,OAAO;oBACP,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;iBAC9B,CAAC,CAAC;gBACH,MAAM,MAAM,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;gBACxC,KAAK;gBACL,OAAO;gBACP,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;aACjC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAEjE,OAAO;gBACL,GAAG,IAAI,CAAC,eAAe,CACrB,UAAU,EACV,WAAW,EACX,MAAM,EACN,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CACvB;gBACD,IAAI;gBACJ,SAAS;gBACT,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,QAAQ,CAAC;gBAClE,cAAc,EAAE,QAAQ,KAAK,IAAI;gBACjC,YAAY;gBACZ,IAAI;gBACJ,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,iBAAiB;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;gBAC7B,eAAe;aAChB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { err, ok } from "./helpers.js";
|
|
3
|
+
const encryptedPrivateKeySchema = z
|
|
4
|
+
.string()
|
|
5
|
+
.optional()
|
|
6
|
+
.describe("RSA-OAEP encrypted private key (base64). Encrypt locally with get_wallet_encryption_public_key.");
|
|
7
|
+
export const aaveTools = {
|
|
8
|
+
register(server, ctx) {
|
|
9
|
+
server.registerTool("supply_aave_usdt", {
|
|
10
|
+
title: "Supply Aave USDT",
|
|
11
|
+
description: "Supply (lend) USDT to Aave V3 on Celo mainnet. Deposits USDT and receives aUSDT interest-bearing tokens. Sends ERC-20 approval first if needed. User must encrypt their private key with the server's public key (get_wallet_encryption_public_key) before calling.",
|
|
12
|
+
inputSchema: z.object({
|
|
13
|
+
amount: z.string().describe("Human-readable USDT amount, e.g. 100"),
|
|
14
|
+
encryptedPrivateKey: encryptedPrivateKeySchema,
|
|
15
|
+
}),
|
|
16
|
+
annotations: {
|
|
17
|
+
destructiveHint: true,
|
|
18
|
+
openWorldHint: true,
|
|
19
|
+
},
|
|
20
|
+
}, async ({ amount, encryptedPrivateKey }) => {
|
|
21
|
+
try {
|
|
22
|
+
return ok(await ctx.aave.supplyUsdt(amount, encryptedPrivateKey));
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return err(error instanceof Error ? error.message : String(error));
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
server.registerTool("withdraw_aave_usdt", {
|
|
29
|
+
title: "Withdraw Aave USDT",
|
|
30
|
+
description: "Withdraw USDT from Aave V3 on Celo mainnet by redeeming aUSDT. User must encrypt their private key with the server's public key (get_wallet_encryption_public_key) before calling.",
|
|
31
|
+
inputSchema: z.object({
|
|
32
|
+
amount: z
|
|
33
|
+
.string()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("Human-readable USDT amount, e.g. 100 (omit when withdrawMax is true)"),
|
|
36
|
+
withdrawMax: z
|
|
37
|
+
.boolean()
|
|
38
|
+
.optional()
|
|
39
|
+
.describe("Withdraw the full supplied USDT balance from Aave"),
|
|
40
|
+
encryptedPrivateKey: encryptedPrivateKeySchema,
|
|
41
|
+
}),
|
|
42
|
+
annotations: {
|
|
43
|
+
destructiveHint: true,
|
|
44
|
+
openWorldHint: true,
|
|
45
|
+
},
|
|
46
|
+
}, async ({ amount, withdrawMax, encryptedPrivateKey }) => {
|
|
47
|
+
try {
|
|
48
|
+
return ok(await ctx.aave.withdrawUsdt(amount, encryptedPrivateKey, withdrawMax));
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return err(error instanceof Error ? error.message : String(error));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=aave.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aave.tools.js","sourceRoot":"","sources":["../../src/tools/aave.tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,yBAAyB,GAAG,CAAC;KAChC,MAAM,EAAE;KACR,QAAQ,EAAE;KACV,QAAQ,CACP,iGAAiG,CAClG,CAAC;AAEJ,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC,QAAQ,CAAC,MAAiB,EAAE,GAAe;QACzC,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;YACE,KAAK,EAAE,kBAAkB;YACzB,WAAW,EACT,qQAAqQ;YACvQ,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;gBACnE,mBAAmB,EAAE,yBAAyB;aAC/C,CAAC;YACF,WAAW,EAAE;gBACX,eAAe,EAAE,IAAI;gBACrB,aAAa,EAAE,IAAI;aACpB;SACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;YACpE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;YACE,KAAK,EAAE,oBAAoB;YAC3B,WAAW,EACT,oLAAoL;YACtL,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACpB,MAAM,EAAE,CAAC;qBACN,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,sEAAsE,CAAC;gBACnF,WAAW,EAAE,CAAC;qBACX,OAAO,EAAE;qBACT,QAAQ,EAAE;qBACV,QAAQ,CAAC,mDAAmD,CAAC;gBAChE,mBAAmB,EAAE,yBAAyB;aAC/C,CAAC;YACF,WAAW,EAAE;gBACX,eAAe,EAAE,IAAI;gBACrB,aAAa,EAAE,IAAI;aACpB;SACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,EAAE,EAAE;YACrD,IAAI,CAAC;gBACH,OAAO,EAAE,CACP,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,mBAAmB,EAAE,WAAW,CAAC,CACtE,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/build/tools/index.js
CHANGED
|
@@ -2,6 +2,8 @@ import { accountTools, blockchainTools } from "./blockchain.tools.js";
|
|
|
2
2
|
import { gooddollarTools } from "./gooddollar.tools.js";
|
|
3
3
|
import { tokenTools } from "./token.tools.js";
|
|
4
4
|
import { transactionTools } from "./transaction.tools.js";
|
|
5
|
+
import { mentoFxTools } from "./mento-fx.tools.js";
|
|
6
|
+
import { aaveTools } from "./aave.tools.js";
|
|
5
7
|
import { walletTools } from "./wallet.tools.js";
|
|
6
8
|
export const toolModules = [
|
|
7
9
|
blockchainTools,
|
|
@@ -9,6 +11,8 @@ export const toolModules = [
|
|
|
9
11
|
tokenTools,
|
|
10
12
|
walletTools,
|
|
11
13
|
transactionTools,
|
|
14
|
+
mentoFxTools,
|
|
15
|
+
aaveTools,
|
|
12
16
|
gooddollarTools,
|
|
13
17
|
];
|
|
14
18
|
export function registerAllTools(server, ctx) {
|
package/build/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,eAAe;IACf,YAAY;IACZ,UAAU;IACV,WAAW;IACX,gBAAgB;IAChB,eAAe;CAChB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,GAAe;IACjE,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,eAAe;IACf,YAAY;IACZ,UAAU;IACV,WAAW;IACX,gBAAgB;IAChB,YAAY;IACZ,SAAS;IACT,eAAe;CAChB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,GAAe;IACjE,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { addressSchema, tokenSymbolSchema } from "../schemas/common.js";
|
|
3
|
+
import { err, ok } from "./helpers.js";
|
|
4
|
+
const encryptedPrivateKeySchema = z
|
|
5
|
+
.string()
|
|
6
|
+
.optional()
|
|
7
|
+
.describe("RSA-OAEP encrypted private key (base64). Encrypt locally with get_wallet_encryption_public_key.");
|
|
8
|
+
const mentoFxInputSchema = z.object({
|
|
9
|
+
tokenIn: tokenSymbolSchema.describe("Input token symbol or address"),
|
|
10
|
+
tokenOut: tokenSymbolSchema.describe("Output token symbol or address"),
|
|
11
|
+
amount: z.string().describe("Human-readable amount of tokenIn, e.g. 100"),
|
|
12
|
+
});
|
|
13
|
+
const mentoFxWalletSchema = mentoFxInputSchema.extend({
|
|
14
|
+
recipient: addressSchema
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("Address that receives output tokens (defaults to signer)"),
|
|
17
|
+
slippageTolerance: z
|
|
18
|
+
.number()
|
|
19
|
+
.min(0)
|
|
20
|
+
.max(20)
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Max slippage in percent (default 0.5)"),
|
|
23
|
+
deadlineMinutes: z
|
|
24
|
+
.number()
|
|
25
|
+
.int()
|
|
26
|
+
.positive()
|
|
27
|
+
.optional()
|
|
28
|
+
.describe("Transaction deadline in minutes (default 5)"),
|
|
29
|
+
encryptedPrivateKey: encryptedPrivateKeySchema,
|
|
30
|
+
});
|
|
31
|
+
export const mentoFxTools = {
|
|
32
|
+
register(server, ctx) {
|
|
33
|
+
server.registerTool("get_mento_fx_quote", {
|
|
34
|
+
title: "Get Mento FX Quote",
|
|
35
|
+
description: "Get an expected Mento FX conversion output for a token pair on mainnet (e.g. USDm → EURm). Oracle-priced via Mento protocol. Read-only; no wallet required.",
|
|
36
|
+
inputSchema: mentoFxInputSchema,
|
|
37
|
+
annotations: { readOnlyHint: true },
|
|
38
|
+
}, async ({ tokenIn, tokenOut, amount }) => {
|
|
39
|
+
try {
|
|
40
|
+
return ok(await ctx.mentoFx.getFxQuote(tokenIn, tokenOut, amount));
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
return err(error instanceof Error ? error.message : String(error));
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
server.registerTool("estimate_mento_fx", {
|
|
47
|
+
title: "Estimate Mento FX",
|
|
48
|
+
description: "Estimate gas for a Mento FX conversion on mainnet, including ERC-20 approval if needed. Requires encryptedPrivateKey (hosted) or CELO_PRIVATE_KEY (local).",
|
|
49
|
+
inputSchema: mentoFxWalletSchema,
|
|
50
|
+
annotations: { readOnlyHint: true },
|
|
51
|
+
}, async ({ tokenIn, tokenOut, amount, recipient, slippageTolerance, deadlineMinutes, encryptedPrivateKey, }) => {
|
|
52
|
+
try {
|
|
53
|
+
return ok(await ctx.mentoFx.estimateFx(tokenIn, tokenOut, amount, {
|
|
54
|
+
recipient: recipient,
|
|
55
|
+
slippageTolerance,
|
|
56
|
+
deadlineMinutes,
|
|
57
|
+
encryptedPrivateKey,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return err(error instanceof Error ? error.message : String(error));
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
server.registerTool("execute_mento_fx", {
|
|
65
|
+
title: "Execute Mento FX",
|
|
66
|
+
description: "Execute a Mento FX conversion on mainnet (e.g. USDm → EURm via Mento oracle pools). Sends approval first if needed, then the FX trade. User must encrypt their private key with the server's public key (get_wallet_encryption_public_key) before calling.",
|
|
67
|
+
inputSchema: mentoFxWalletSchema,
|
|
68
|
+
annotations: {
|
|
69
|
+
destructiveHint: true,
|
|
70
|
+
openWorldHint: true,
|
|
71
|
+
},
|
|
72
|
+
}, async ({ tokenIn, tokenOut, amount, recipient, slippageTolerance, deadlineMinutes, encryptedPrivateKey, }) => {
|
|
73
|
+
try {
|
|
74
|
+
return ok(await ctx.mentoFx.executeFx(tokenIn, tokenOut, amount, {
|
|
75
|
+
recipient: recipient,
|
|
76
|
+
slippageTolerance,
|
|
77
|
+
deadlineMinutes,
|
|
78
|
+
encryptedPrivateKey,
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
return err(error instanceof Error ? error.message : String(error));
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=mento-fx.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mento-fx.tools.js","sourceRoot":"","sources":["../../src/tools/mento-fx.tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,yBAAyB,GAAG,CAAC;KAChC,MAAM,EAAE;KACR,QAAQ,EAAE;KACV,QAAQ,CACP,iGAAiG,CAClG,CAAC;AAEJ,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IACpE,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,MAAM,CAAC;IACpD,SAAS,EAAE,aAAa;SACrB,QAAQ,EAAE;SACV,QAAQ,CAAC,0DAA0D,CAAC;IACvE,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CAAC,uCAAuC,CAAC;IACpD,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,6CAA6C,CAAC;IAC1D,mBAAmB,EAAE,yBAAyB;CAC/C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,QAAQ,CAAC,MAAiB,EAAE,GAAe;QACzC,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;YACE,KAAK,EAAE,oBAAoB;YAC3B,WAAW,EACT,6JAA6J;YAC/J,WAAW,EAAE,kBAAkB;YAC/B,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;SACpC,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;YACE,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EACT,4JAA4J;YAC9J,WAAW,EAAE,mBAAmB;YAChC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;SACpC,EACD,KAAK,EAAE,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,mBAAmB,GACpB,EAAE,EAAE;YACH,IAAI,CAAC;gBACH,OAAO,EAAE,CACP,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;oBACtD,SAAS,EAAE,SAAsC;oBACjD,iBAAiB;oBACjB,eAAe;oBACf,mBAAmB;iBACpB,CAAC,CACH,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;YACE,KAAK,EAAE,kBAAkB;YACzB,WAAW,EACT,4PAA4P;YAC9P,WAAW,EAAE,mBAAmB;YAChC,WAAW,EAAE;gBACX,eAAe,EAAE,IAAI;gBACrB,aAAa,EAAE,IAAI;aACpB;SACF,EACD,KAAK,EAAE,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,mBAAmB,GACpB,EAAE,EAAE;YACH,IAAI,CAAC;gBACH,OAAO,EAAE,CACP,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;oBACrD,SAAS,EAAE,SAAsC;oBACjD,iBAAiB;oBACjB,eAAe;oBACf,mBAAmB;iBACpB,CAAC,CACH,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrewkimjoseph/celina",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"description": "Celina — MCP server for Celo mainnet. Balances, transfers, and chain reads for LLM agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "build/index.js",
|
|
@@ -40,7 +40,10 @@
|
|
|
40
40
|
"author": "Andrew Kim Joseph",
|
|
41
41
|
"license": "MIT",
|
|
42
42
|
"dependencies": {
|
|
43
|
+
"@aave/client": "^0.9.3",
|
|
44
|
+
"@mento-protocol/mento-sdk": "^3.2.8",
|
|
43
45
|
"@modelcontextprotocol/sdk": "^1.22.0",
|
|
46
|
+
"dotenv": "^17.4.2",
|
|
44
47
|
"express": "^5.2.1",
|
|
45
48
|
"viem": "^2.39.3",
|
|
46
49
|
"zod": "^3.24.3"
|