@andrewkimjoseph/celina 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +225 -0
  3. package/bin/cli.js +2 -0
  4. package/build/clients/celo-client.d.ts +14 -0
  5. package/build/clients/celo-client.js +58 -0
  6. package/build/clients/celo-client.js.map +1 -0
  7. package/build/config/chains.d.ts +932 -0
  8. package/build/config/chains.js +236 -0
  9. package/build/config/chains.js.map +1 -0
  10. package/build/config/env.d.ts +5 -0
  11. package/build/config/env.js +7 -0
  12. package/build/config/env.js.map +1 -0
  13. package/build/context/app-context.d.ts +16 -0
  14. package/build/context/app-context.js +17 -0
  15. package/build/context/app-context.js.map +1 -0
  16. package/build/crypto/wallet-key-crypto.d.ts +11 -0
  17. package/build/crypto/wallet-key-crypto.js +57 -0
  18. package/build/crypto/wallet-key-crypto.js.map +1 -0
  19. package/build/http.d.ts +2 -0
  20. package/build/http.js +14 -0
  21. package/build/http.js.map +1 -0
  22. package/build/index.d.ts +2 -0
  23. package/build/index.js +14 -0
  24. package/build/index.js.map +1 -0
  25. package/build/schemas/common.d.ts +4 -0
  26. package/build/schemas/common.js +16 -0
  27. package/build/schemas/common.js.map +1 -0
  28. package/build/server/create-http-app.d.ts +1 -0
  29. package/build/server/create-http-app.js +134 -0
  30. package/build/server/create-http-app.js.map +1 -0
  31. package/build/server/create-server.d.ts +2 -0
  32. package/build/server/create-server.js +21 -0
  33. package/build/server/create-server.js.map +1 -0
  34. package/build/server/instructions.d.ts +1 -0
  35. package/build/server/instructions.js +13 -0
  36. package/build/server/instructions.js.map +1 -0
  37. package/build/services/account.service.d.ts +13 -0
  38. package/build/services/account.service.js +23 -0
  39. package/build/services/account.service.js.map +1 -0
  40. package/build/services/blockchain.service.d.ts +40 -0
  41. package/build/services/blockchain.service.js +81 -0
  42. package/build/services/blockchain.service.js.map +1 -0
  43. package/build/services/token.service.d.ts +54 -0
  44. package/build/services/token.service.js +147 -0
  45. package/build/services/token.service.js.map +1 -0
  46. package/build/services/transaction.service.d.ts +33 -0
  47. package/build/services/transaction.service.js +126 -0
  48. package/build/services/transaction.service.js.map +1 -0
  49. package/build/tools/blockchain.tools.d.ts +3 -0
  50. package/build/tools/blockchain.tools.js +88 -0
  51. package/build/tools/blockchain.tools.js.map +1 -0
  52. package/build/tools/helpers.d.ts +3 -0
  53. package/build/tools/helpers.js +16 -0
  54. package/build/tools/helpers.js.map +1 -0
  55. package/build/tools/index.d.ts +5 -0
  56. package/build/tools/index.js +17 -0
  57. package/build/tools/index.js.map +1 -0
  58. package/build/tools/token.tools.d.ts +2 -0
  59. package/build/tools/token.tools.js +62 -0
  60. package/build/tools/token.tools.js.map +1 -0
  61. package/build/tools/transaction.tools.d.ts +2 -0
  62. package/build/tools/transaction.tools.js +68 -0
  63. package/build/tools/transaction.tools.js.map +1 -0
  64. package/build/tools/types.d.ts +5 -0
  65. package/build/tools/types.js +2 -0
  66. package/build/tools/types.js.map +1 -0
  67. package/build/tools/wallet.tools.d.ts +2 -0
  68. package/build/tools/wallet.tools.js +23 -0
  69. package/build/tools/wallet.tools.js.map +1 -0
  70. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/server/instructions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;CAWlC,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { CeloClientFactory } from "../clients/celo-client.js";
2
+ export declare class AccountService {
3
+ private readonly clientFactory;
4
+ constructor(clientFactory: CeloClientFactory);
5
+ getAccount(address: `0x${string}`): Promise<{
6
+ address: `0x${string}`;
7
+ network: string;
8
+ balanceWei: string;
9
+ balanceCelo: number;
10
+ nonce: number;
11
+ isContract: boolean;
12
+ }>;
13
+ }
@@ -0,0 +1,23 @@
1
+ export class AccountService {
2
+ clientFactory;
3
+ constructor(clientFactory) {
4
+ this.clientFactory = clientFactory;
5
+ }
6
+ async getAccount(address) {
7
+ const { public: client } = this.clientFactory.getClients();
8
+ const [balance, nonce, bytecode] = await Promise.all([
9
+ client.getBalance({ address }),
10
+ client.getTransactionCount({ address }),
11
+ client.getCode({ address }),
12
+ ]);
13
+ return {
14
+ address,
15
+ network: "mainnet",
16
+ balanceWei: balance.toString(),
17
+ balanceCelo: Number(balance) / 1e18,
18
+ nonce,
19
+ isContract: bytecode !== undefined && bytecode !== "0x",
20
+ };
21
+ }
22
+ }
23
+ //# sourceMappingURL=account.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.service.js","sourceRoot":"","sources":["../../src/services/account.service.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;IAAG,CAAC;IAEjE,KAAK,CAAC,UAAU,CAAC,OAAsB;QACrC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACnD,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;SAC5B,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE;YAC9B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI;YACnC,KAAK;YACL,UAAU,EAAE,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;SACxD,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ import type { CeloClientFactory } from "../clients/celo-client.js";
2
+ export declare class BlockchainService {
3
+ private readonly clientFactory;
4
+ constructor(clientFactory: CeloClientFactory);
5
+ getNetworkStatus(): Promise<{
6
+ network: string;
7
+ chainId: number;
8
+ blockNumber: string;
9
+ gasPriceWei: string;
10
+ }>;
11
+ getBlock(blockId: number | string | "latest" | "pending"): Promise<{
12
+ number: string | undefined;
13
+ hash: `0x${string}` | null;
14
+ timestamp: string;
15
+ parentHash: `0x${string}`;
16
+ gasUsed: string;
17
+ gasLimit: string;
18
+ miner: `0x${string}`;
19
+ transactionCount: number;
20
+ }>;
21
+ getLatestBlocks(count?: number): Promise<{
22
+ number: string;
23
+ hash: `0x${string}`;
24
+ timestamp: string;
25
+ transactionCount: number;
26
+ }[]>;
27
+ getTransaction(hash: `0x${string}`): Promise<{
28
+ hash: `0x${string}`;
29
+ from: `0x${string}`;
30
+ to: `0x${string}` | null;
31
+ value: string;
32
+ nonce: number;
33
+ gas: string;
34
+ gasPrice: string | undefined;
35
+ input: `0x${string}`;
36
+ blockNumber: string;
37
+ status: "success" | "reverted";
38
+ gasUsed: string;
39
+ }>;
40
+ }
@@ -0,0 +1,81 @@
1
+ export class BlockchainService {
2
+ clientFactory;
3
+ constructor(clientFactory) {
4
+ this.clientFactory = clientFactory;
5
+ }
6
+ async getNetworkStatus() {
7
+ const { public: client } = this.clientFactory.getClients();
8
+ const [chainId, blockNumber, gasPrice] = await Promise.all([
9
+ client.getChainId(),
10
+ client.getBlockNumber(),
11
+ client.getGasPrice(),
12
+ ]);
13
+ return {
14
+ network: "mainnet",
15
+ chainId,
16
+ blockNumber: blockNumber.toString(),
17
+ gasPriceWei: gasPrice.toString(),
18
+ };
19
+ }
20
+ async getBlock(blockId) {
21
+ const { public: client } = this.clientFactory.getClients();
22
+ const blockParams = typeof blockId === "number"
23
+ ? { blockNumber: BigInt(blockId), includeTransactions: false }
24
+ : blockId === "latest" || blockId === "pending"
25
+ ? {
26
+ blockTag: blockId,
27
+ includeTransactions: false,
28
+ }
29
+ : { blockHash: blockId, includeTransactions: false };
30
+ const block = await client.getBlock(blockParams);
31
+ if (!block) {
32
+ throw new Error(`Block not found: ${blockId}`);
33
+ }
34
+ return {
35
+ number: block.number?.toString(),
36
+ hash: block.hash,
37
+ timestamp: block.timestamp.toString(),
38
+ parentHash: block.parentHash,
39
+ gasUsed: block.gasUsed.toString(),
40
+ gasLimit: block.gasLimit.toString(),
41
+ miner: block.miner,
42
+ transactionCount: block.transactions.length,
43
+ };
44
+ }
45
+ async getLatestBlocks(count = 5) {
46
+ const { public: client } = this.clientFactory.getClients();
47
+ const latest = await client.getBlockNumber();
48
+ const start = latest - BigInt(Math.max(count - 1, 0));
49
+ const blocks = await Promise.all(Array.from({ length: count }, (_, index) => client.getBlock({ blockNumber: start + BigInt(index) })));
50
+ return blocks.filter(Boolean).map((block) => ({
51
+ number: block.number?.toString(),
52
+ hash: block.hash,
53
+ timestamp: block.timestamp.toString(),
54
+ transactionCount: block.transactions.length,
55
+ }));
56
+ }
57
+ async getTransaction(hash) {
58
+ const { public: client } = this.clientFactory.getClients();
59
+ const [tx, receipt] = await Promise.all([
60
+ client.getTransaction({ hash }),
61
+ client.getTransactionReceipt({ hash }),
62
+ ]);
63
+ if (!tx) {
64
+ throw new Error(`Transaction not found: ${hash}`);
65
+ }
66
+ return {
67
+ hash: tx.hash,
68
+ from: tx.from,
69
+ to: tx.to,
70
+ value: tx.value.toString(),
71
+ nonce: tx.nonce,
72
+ gas: tx.gas.toString(),
73
+ gasPrice: tx.gasPrice?.toString(),
74
+ input: tx.input,
75
+ blockNumber: tx.blockNumber?.toString(),
76
+ status: receipt?.status,
77
+ gasUsed: receipt?.gasUsed.toString(),
78
+ };
79
+ }
80
+ }
81
+ //# sourceMappingURL=blockchain.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockchain.service.js","sourceRoot":"","sources":["../../src/services/blockchain.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { CeloClientFactory } from "../clients/celo-client.js";
2
+ export interface ResolvedToken {
3
+ address: `0x${string}` | "native";
4
+ symbol: string;
5
+ decimals: number;
6
+ }
7
+ export declare class TokenService {
8
+ private readonly clientFactory;
9
+ constructor(clientFactory: CeloClientFactory);
10
+ resolveToken(token: string): ResolvedToken;
11
+ getTokenInfo(token: string): Promise<{
12
+ network: string;
13
+ name: string;
14
+ address: `0x${string}` | "native";
15
+ symbol: string;
16
+ decimals: number;
17
+ }>;
18
+ getBalances(address: `0x${string}`, tokens?: string[]): Promise<{
19
+ network: string;
20
+ address: `0x${string}`;
21
+ balances: {
22
+ token: string;
23
+ address: string;
24
+ raw: string;
25
+ formatted: string;
26
+ }[];
27
+ }>;
28
+ getStablecoinBalances(address: `0x${string}`, options?: {
29
+ stablecoins?: string[];
30
+ includeZero?: boolean;
31
+ }): Promise<{
32
+ network: string;
33
+ address: `0x${string}`;
34
+ totalChecked: number;
35
+ stablecoins: ({
36
+ symbol: string;
37
+ address: `0x${string}`;
38
+ issuer: string;
39
+ useCase: string;
40
+ raw: string;
41
+ formatted: string;
42
+ readError: boolean;
43
+ } | {
44
+ symbol: string;
45
+ address: `0x${string}`;
46
+ issuer: string;
47
+ useCase: string;
48
+ raw: string;
49
+ formatted: string;
50
+ readError?: undefined;
51
+ })[];
52
+ }>;
53
+ parseAmount(amount: string, decimals: number): bigint;
54
+ }
@@ -0,0 +1,147 @@
1
+ import { erc20Abi, formatUnits, isAddress, parseUnits } from "viem";
2
+ import { findKnownToken, KNOWN_TOKEN_SYMBOLS, resolveStablecoins, } from "../config/chains.js";
3
+ export class TokenService {
4
+ clientFactory;
5
+ constructor(clientFactory) {
6
+ this.clientFactory = clientFactory;
7
+ }
8
+ resolveToken(token) {
9
+ const normalized = token.trim();
10
+ const known = findKnownToken(normalized);
11
+ if (known) {
12
+ return {
13
+ address: known.address,
14
+ symbol: known.symbol,
15
+ decimals: known.decimals,
16
+ };
17
+ }
18
+ if (isAddress(normalized)) {
19
+ return {
20
+ address: normalized,
21
+ symbol: normalized,
22
+ decimals: 18,
23
+ };
24
+ }
25
+ throw new Error(`Unknown token "${token}". Use ${KNOWN_TOKEN_SYMBOLS.join(", ")}, or a contract address.`);
26
+ }
27
+ async getTokenInfo(token) {
28
+ const resolved = this.resolveToken(token);
29
+ if (resolved.address === "native") {
30
+ return {
31
+ ...resolved,
32
+ network: "mainnet",
33
+ name: "Celo",
34
+ };
35
+ }
36
+ const { public: client } = this.clientFactory.getClients();
37
+ const address = resolved.address;
38
+ const [name, symbol, decimals] = await Promise.all([
39
+ client.readContract({
40
+ address,
41
+ abi: erc20Abi,
42
+ functionName: "name",
43
+ }),
44
+ client.readContract({
45
+ address,
46
+ abi: erc20Abi,
47
+ functionName: "symbol",
48
+ }),
49
+ client.readContract({
50
+ address,
51
+ abi: erc20Abi,
52
+ functionName: "decimals",
53
+ }),
54
+ ]);
55
+ return {
56
+ network: "mainnet",
57
+ address,
58
+ name,
59
+ symbol,
60
+ decimals: Number(decimals),
61
+ };
62
+ }
63
+ async getBalances(address, tokens = ["CELO", "USDm"]) {
64
+ const { public: client } = this.clientFactory.getClients();
65
+ const balances = await Promise.all(tokens.map(async (tokenInput) => {
66
+ const token = this.resolveToken(tokenInput);
67
+ if (token.address === "native") {
68
+ const balance = await client.getBalance({ address });
69
+ return {
70
+ token: token.symbol,
71
+ address: "native",
72
+ raw: balance.toString(),
73
+ formatted: formatUnits(balance, token.decimals),
74
+ };
75
+ }
76
+ const balance = await client.readContract({
77
+ address: token.address,
78
+ abi: erc20Abi,
79
+ functionName: "balanceOf",
80
+ args: [address],
81
+ });
82
+ const decimals = token.symbol === token.address
83
+ ? Number(await client.readContract({
84
+ address: token.address,
85
+ abi: erc20Abi,
86
+ functionName: "decimals",
87
+ }))
88
+ : token.decimals;
89
+ return {
90
+ token: token.symbol,
91
+ address: token.address,
92
+ raw: balance.toString(),
93
+ formatted: formatUnits(balance, decimals),
94
+ };
95
+ }));
96
+ return { network: "mainnet", address, balances };
97
+ }
98
+ async getStablecoinBalances(address, options) {
99
+ const coins = resolveStablecoins(options?.stablecoins);
100
+ const { public: client } = this.clientFactory.getClients();
101
+ const results = await client.multicall({
102
+ contracts: coins.map((coin) => ({
103
+ address: coin.address,
104
+ abi: erc20Abi,
105
+ functionName: "balanceOf",
106
+ args: [address],
107
+ })),
108
+ allowFailure: true,
109
+ });
110
+ const balances = coins.map((coin, index) => {
111
+ const result = results[index];
112
+ if (result.status === "failure") {
113
+ return {
114
+ symbol: coin.symbol,
115
+ address: coin.address,
116
+ issuer: coin.issuer,
117
+ useCase: coin.useCase,
118
+ raw: "0",
119
+ formatted: "0",
120
+ readError: true,
121
+ };
122
+ }
123
+ const raw = result.result;
124
+ return {
125
+ symbol: coin.symbol,
126
+ address: coin.address,
127
+ issuer: coin.issuer,
128
+ useCase: coin.useCase,
129
+ raw: raw.toString(),
130
+ formatted: formatUnits(raw, coin.decimals),
131
+ };
132
+ });
133
+ const stablecoins = options?.includeZero
134
+ ? balances
135
+ : balances.filter((balance) => balance.raw !== "0");
136
+ return {
137
+ network: "mainnet",
138
+ address,
139
+ totalChecked: coins.length,
140
+ stablecoins,
141
+ };
142
+ }
143
+ parseAmount(amount, decimals) {
144
+ return parseUnits(amount, decimals);
145
+ }
146
+ }
147
+ //# sourceMappingURL=token.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.service.js","sourceRoot":"","sources":["../../src/services/token.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { CeloClientFactory } from "../clients/celo-client.js";
2
+ export declare class TransactionService {
3
+ private readonly clientFactory;
4
+ private readonly tokenService;
5
+ constructor(clientFactory: CeloClientFactory);
6
+ private resolveClients;
7
+ estimateSend(to: `0x${string}`, token: string, amount: string, encryptedPrivateKey?: string): Promise<{
8
+ network: string;
9
+ from: `0x${string}`;
10
+ to: `0x${string}`;
11
+ token: string;
12
+ amount: string;
13
+ gas: string;
14
+ }>;
15
+ sendToken(to: `0x${string}`, token: string, amount: string, encryptedPrivateKey?: string): Promise<{
16
+ network: string;
17
+ hash: `0x${string}`;
18
+ status: "success" | "reverted";
19
+ from: `0x${string}`;
20
+ to: `0x${string}`;
21
+ token: string;
22
+ amount: string;
23
+ }>;
24
+ getSwapQuote(fromToken: string, toToken: string, amount: string): Promise<{
25
+ network: string;
26
+ status: string;
27
+ message: string;
28
+ fromToken: string;
29
+ toToken: string;
30
+ amount: string;
31
+ nextStep: string;
32
+ }>;
33
+ }
@@ -0,0 +1,126 @@
1
+ import { encodeFunctionData, erc20Abi, parseEther } from "viem";
2
+ import { decryptPrivateKey } from "../crypto/wallet-key-crypto.js";
3
+ import { TokenService } from "./token.service.js";
4
+ export class TransactionService {
5
+ clientFactory;
6
+ tokenService;
7
+ constructor(clientFactory) {
8
+ this.clientFactory = clientFactory;
9
+ this.tokenService = new TokenService(clientFactory);
10
+ }
11
+ resolveClients(encryptedPrivateKey) {
12
+ if (encryptedPrivateKey) {
13
+ const privateKey = decryptPrivateKey(encryptedPrivateKey);
14
+ return this.clientFactory.getClientsForAccount(privateKey);
15
+ }
16
+ const clients = this.clientFactory.getClients();
17
+ if (!clients.wallet || !clients.accountAddress) {
18
+ throw new Error("No wallet configured. Provide encryptedPrivateKey (encrypt with get_wallet_encryption_public_key) or set CELO_PRIVATE_KEY for local mode.");
19
+ }
20
+ return clients;
21
+ }
22
+ async estimateSend(to, token, amount, encryptedPrivateKey) {
23
+ const { public: client, accountAddress: from } = this.resolveClients(encryptedPrivateKey);
24
+ if (!from) {
25
+ throw new Error("Wallet address unavailable.");
26
+ }
27
+ const resolved = this.tokenService.resolveToken(token);
28
+ if (resolved.address === "native") {
29
+ const value = parseEther(amount);
30
+ const gas = await client.estimateGas({
31
+ account: from,
32
+ to,
33
+ value,
34
+ });
35
+ return {
36
+ network: "mainnet",
37
+ from,
38
+ to,
39
+ token: resolved.symbol,
40
+ amount,
41
+ gas: gas.toString(),
42
+ };
43
+ }
44
+ const tokenAmount = this.tokenService.parseAmount(amount, resolved.decimals);
45
+ const data = encodeFunctionData({
46
+ abi: erc20Abi,
47
+ functionName: "transfer",
48
+ args: [to, tokenAmount],
49
+ });
50
+ const gas = await client.estimateGas({
51
+ account: from,
52
+ to: resolved.address,
53
+ data,
54
+ });
55
+ return {
56
+ network: "mainnet",
57
+ from,
58
+ to,
59
+ token: resolved.symbol,
60
+ amount,
61
+ gas: gas.toString(),
62
+ };
63
+ }
64
+ async sendToken(to, token, amount, encryptedPrivateKey) {
65
+ const { public: client, wallet, accountAddress: from } = this.resolveClients(encryptedPrivateKey);
66
+ if (!wallet || !from) {
67
+ throw new Error("Wallet client unavailable. Provide encryptedPrivateKey or set CELO_PRIVATE_KEY.");
68
+ }
69
+ const resolved = this.tokenService.resolveToken(token);
70
+ const chain = client.chain;
71
+ if (!chain) {
72
+ throw new Error("Chain configuration missing");
73
+ }
74
+ if (resolved.address === "native") {
75
+ const hash = await wallet.sendTransaction({
76
+ chain,
77
+ account: from,
78
+ to,
79
+ value: parseEther(amount),
80
+ });
81
+ const receipt = await client.waitForTransactionReceipt({ hash });
82
+ return {
83
+ network: "mainnet",
84
+ hash,
85
+ status: receipt.status,
86
+ from,
87
+ to,
88
+ token: resolved.symbol,
89
+ amount,
90
+ };
91
+ }
92
+ const tokenAmount = this.tokenService.parseAmount(amount, resolved.decimals);
93
+ const hash = await wallet.writeContract({
94
+ chain,
95
+ account: from,
96
+ address: resolved.address,
97
+ abi: erc20Abi,
98
+ functionName: "transfer",
99
+ args: [to, tokenAmount],
100
+ });
101
+ const receipt = await client.waitForTransactionReceipt({ hash });
102
+ return {
103
+ network: "mainnet",
104
+ hash,
105
+ status: receipt.status,
106
+ from,
107
+ to,
108
+ token: resolved.symbol,
109
+ amount,
110
+ };
111
+ }
112
+ async getSwapQuote(fromToken, toToken, amount) {
113
+ const from = this.tokenService.resolveToken(fromToken);
114
+ const to = this.tokenService.resolveToken(toToken);
115
+ return {
116
+ network: "mainnet",
117
+ status: "not_implemented",
118
+ message: "On-chain swap routing (Mento/Uniswap) is not wired yet. Use this tool to validate token pairs before execute_swap ships.",
119
+ fromToken: from.symbol,
120
+ toToken: to.symbol,
121
+ amount,
122
+ nextStep: "Add a SwapService with Mento broker/router quotes, then implement execute_swap.",
123
+ };
124
+ }
125
+ }
126
+ //# sourceMappingURL=transaction.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.service.js","sourceRoot":"","sources":["../../src/services/transaction.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolModule } from "./types.js";
2
+ export declare const blockchainTools: ToolModule;
3
+ export declare const accountTools: ToolModule;
@@ -0,0 +1,88 @@
1
+ import { z } from "zod";
2
+ import { addressSchema, blockIdSchema } from "../schemas/common.js";
3
+ import { err, ok } from "./helpers.js";
4
+ export const blockchainTools = {
5
+ register(server, ctx) {
6
+ server.registerTool("get_network_status", {
7
+ title: "Get Network Status",
8
+ description: "Returns Celo mainnet chain ID, latest block, and gas price.",
9
+ inputSchema: z.object({}),
10
+ annotations: {
11
+ readOnlyHint: true,
12
+ idempotentHint: true,
13
+ },
14
+ }, async () => {
15
+ try {
16
+ return ok(await ctx.blockchain.getNetworkStatus());
17
+ }
18
+ catch (error) {
19
+ return err(error instanceof Error ? error.message : String(error));
20
+ }
21
+ });
22
+ server.registerTool("get_block", {
23
+ title: "Get Block",
24
+ description: "Fetch a Celo mainnet block by number, hash, or latest.",
25
+ inputSchema: z.object({
26
+ blockId: blockIdSchema,
27
+ }),
28
+ annotations: { readOnlyHint: true, idempotentHint: true },
29
+ }, async ({ blockId }) => {
30
+ try {
31
+ return ok(await ctx.blockchain.getBlock(blockId));
32
+ }
33
+ catch (error) {
34
+ return err(error instanceof Error ? error.message : String(error));
35
+ }
36
+ });
37
+ server.registerTool("get_latest_blocks", {
38
+ title: "Get Latest Blocks",
39
+ description: "Fetch the most recent blocks on Celo mainnet.",
40
+ inputSchema: z.object({
41
+ count: z.number().int().min(1).max(20).default(5),
42
+ }),
43
+ annotations: { readOnlyHint: true, idempotentHint: true },
44
+ }, async ({ count }) => {
45
+ try {
46
+ return ok(await ctx.blockchain.getLatestBlocks(count));
47
+ }
48
+ catch (error) {
49
+ return err(error instanceof Error ? error.message : String(error));
50
+ }
51
+ });
52
+ server.registerTool("get_transaction", {
53
+ title: "Get Transaction",
54
+ description: "Fetch a transaction and receipt by hash on Celo mainnet.",
55
+ inputSchema: z.object({
56
+ hash: z.string().regex(/^0x[a-fA-F0-9]{64}$/),
57
+ }),
58
+ annotations: { readOnlyHint: true, idempotentHint: true },
59
+ }, async ({ hash }) => {
60
+ try {
61
+ return ok(await ctx.blockchain.getTransaction(hash));
62
+ }
63
+ catch (error) {
64
+ return err(error instanceof Error ? error.message : String(error));
65
+ }
66
+ });
67
+ },
68
+ };
69
+ export const accountTools = {
70
+ register(server, ctx) {
71
+ server.registerTool("get_account", {
72
+ title: "Get Account",
73
+ description: "Returns native CELO balance, nonce, and contract flag on mainnet.",
74
+ inputSchema: z.object({
75
+ address: addressSchema,
76
+ }),
77
+ annotations: { readOnlyHint: true, idempotentHint: true },
78
+ }, async ({ address }) => {
79
+ try {
80
+ return ok(await ctx.account.getAccount(address));
81
+ }
82
+ catch (error) {
83
+ return err(error instanceof Error ? error.message : String(error));
84
+ }
85
+ });
86
+ },
87
+ };
88
+ //# sourceMappingURL=blockchain.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockchain.tools.js","sourceRoot":"","sources":["../../src/tools/blockchain.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare function ok(data: unknown): CallToolResult;
3
+ export declare function err(message: string): CallToolResult;