@andrewkimjoseph/celina 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/bin/wrapper.js +2 -0
  2. package/package.json +5 -44
  3. package/LICENSE +0 -21
  4. package/README.md +0 -292
  5. package/assets/logo-black.png +0 -0
  6. package/assets/logo-yellow.png +0 -0
  7. package/assets/logo.png +0 -0
  8. package/bin/cli.js +0 -2
  9. package/build/abis/aave-pool.d.ts +0 -37
  10. package/build/abis/aave-pool.js +0 -26
  11. package/build/abis/aave-pool.js.map +0 -1
  12. package/build/abis/gooddollar-identity.d.ts +0 -61
  13. package/build/abis/gooddollar-identity.js +0 -38
  14. package/build/abis/gooddollar-identity.js.map +0 -1
  15. package/build/abis/self-registry.d.ts +0 -194
  16. package/build/abis/self-registry.js +0 -120
  17. package/build/abis/self-registry.js.map +0 -1
  18. package/build/clients/celo-client.d.ts +0 -13
  19. package/build/clients/celo-client.js +0 -39
  20. package/build/clients/celo-client.js.map +0 -1
  21. package/build/clients/ens-client.d.ts +0 -10
  22. package/build/clients/ens-client.js +0 -23
  23. package/build/clients/ens-client.js.map +0 -1
  24. package/build/clients/mento-sdk.d.ts +0 -2
  25. package/build/clients/mento-sdk.js +0 -9
  26. package/build/clients/mento-sdk.js.map +0 -1
  27. package/build/clients/self-api.d.ts +0 -82
  28. package/build/clients/self-api.js +0 -242
  29. package/build/clients/self-api.js.map +0 -1
  30. package/build/config/aave.d.ts +0 -11
  31. package/build/config/aave.js +0 -55
  32. package/build/config/aave.js.map +0 -1
  33. package/build/config/celina-tag.d.ts +0 -1
  34. package/build/config/celina-tag.js +0 -3
  35. package/build/config/celina-tag.js.map +0 -1
  36. package/build/config/chains.d.ts +0 -935
  37. package/build/config/chains.js +0 -251
  38. package/build/config/chains.js.map +0 -1
  39. package/build/config/env.d.ts +0 -7
  40. package/build/config/env.js +0 -9
  41. package/build/config/env.js.map +0 -1
  42. package/build/config/gooddollar.d.ts +0 -1
  43. package/build/config/gooddollar.js +0 -2
  44. package/build/config/gooddollar.js.map +0 -1
  45. package/build/config/load-env.d.ts +0 -1
  46. package/build/config/load-env.js +0 -4
  47. package/build/config/load-env.js.map +0 -1
  48. package/build/config/self.d.ts +0 -22
  49. package/build/config/self.js +0 -27
  50. package/build/config/self.js.map +0 -1
  51. package/build/context/app-context.d.ts +0 -28
  52. package/build/context/app-context.js +0 -28
  53. package/build/context/app-context.js.map +0 -1
  54. package/build/index.d.ts +0 -2
  55. package/build/index.js +0 -17
  56. package/build/index.js.map +0 -1
  57. package/build/schemas/common.d.ts +0 -6
  58. package/build/schemas/common.js +0 -24
  59. package/build/schemas/common.js.map +0 -1
  60. package/build/server/create-server.d.ts +0 -2
  61. package/build/server/create-server.js +0 -23
  62. package/build/server/create-server.js.map +0 -1
  63. package/build/server/instructions.d.ts +0 -1
  64. package/build/server/instructions.js +0 -22
  65. package/build/server/instructions.js.map +0 -1
  66. package/build/services/aave.service.d.ts +0 -29
  67. package/build/services/aave.service.js +0 -166
  68. package/build/services/aave.service.js.map +0 -1
  69. package/build/services/account.service.d.ts +0 -13
  70. package/build/services/account.service.js +0 -23
  71. package/build/services/account.service.js.map +0 -1
  72. package/build/services/blockchain.service.d.ts +0 -40
  73. package/build/services/blockchain.service.js +0 -81
  74. package/build/services/blockchain.service.js.map +0 -1
  75. package/build/services/ens.service.d.ts +0 -30
  76. package/build/services/ens.service.js +0 -78
  77. package/build/services/ens.service.js.map +0 -1
  78. package/build/services/gooddollar.service.d.ts +0 -38
  79. package/build/services/gooddollar.service.js +0 -127
  80. package/build/services/gooddollar.service.js.map +0 -1
  81. package/build/services/mento-fx.service.d.ts +0 -71
  82. package/build/services/mento-fx.service.js +0 -261
  83. package/build/services/mento-fx.service.js.map +0 -1
  84. package/build/services/self-session-store.d.ts +0 -19
  85. package/build/services/self-session-store.js +0 -28
  86. package/build/services/self-session-store.js.map +0 -1
  87. package/build/services/self.service.d.ts +0 -247
  88. package/build/services/self.service.js +0 -685
  89. package/build/services/self.service.js.map +0 -1
  90. package/build/services/token.service.d.ts +0 -54
  91. package/build/services/token.service.js +0 -147
  92. package/build/services/token.service.js.map +0 -1
  93. package/build/services/transaction.service.d.ts +0 -24
  94. package/build/services/transaction.service.js +0 -112
  95. package/build/services/transaction.service.js.map +0 -1
  96. package/build/tools/aave.tools.d.ts +0 -2
  97. package/build/tools/aave.tools.js +0 -55
  98. package/build/tools/aave.tools.js.map +0 -1
  99. package/build/tools/blockchain.tools.d.ts +0 -3
  100. package/build/tools/blockchain.tools.js +0 -88
  101. package/build/tools/blockchain.tools.js.map +0 -1
  102. package/build/tools/ens.tools.d.ts +0 -2
  103. package/build/tools/ens.tools.js +0 -27
  104. package/build/tools/ens.tools.js.map +0 -1
  105. package/build/tools/gooddollar.tools.d.ts +0 -2
  106. package/build/tools/gooddollar.tools.js +0 -23
  107. package/build/tools/gooddollar.tools.js.map +0 -1
  108. package/build/tools/helpers.d.ts +0 -3
  109. package/build/tools/helpers.js +0 -16
  110. package/build/tools/helpers.js.map +0 -1
  111. package/build/tools/index.d.ts +0 -5
  112. package/build/tools/index.js +0 -25
  113. package/build/tools/index.js.map +0 -1
  114. package/build/tools/mento-fx.tools.d.ts +0 -2
  115. package/build/tools/mento-fx.tools.js +0 -80
  116. package/build/tools/mento-fx.tools.js.map +0 -1
  117. package/build/tools/self.tools.d.ts +0 -2
  118. package/build/tools/self.tools.js +0 -242
  119. package/build/tools/self.tools.js.map +0 -1
  120. package/build/tools/token.tools.d.ts +0 -2
  121. package/build/tools/token.tools.js +0 -62
  122. package/build/tools/token.tools.js.map +0 -1
  123. package/build/tools/transaction.tools.d.ts +0 -2
  124. package/build/tools/transaction.tools.js +0 -49
  125. package/build/tools/transaction.tools.js.map +0 -1
  126. package/build/tools/types.d.ts +0 -5
  127. package/build/tools/types.js +0 -2
  128. package/build/tools/types.js.map +0 -1
  129. package/build/utils/erc20-allowance-storage.d.ts +0 -7
  130. package/build/utils/erc20-allowance-storage.js +0 -44
  131. package/build/utils/erc20-allowance-storage.js.map +0 -1
  132. package/build/utils/format-date.d.ts +0 -1
  133. package/build/utils/format-date.js +0 -12
  134. package/build/utils/format-date.js.map +0 -1
  135. package/build/utils/self-format.d.ts +0 -16
  136. package/build/utils/self-format.js +0 -59
  137. package/build/utils/self-format.js.map +0 -1
  138. package/build/utils/self-signing.d.ts +0 -4
  139. package/build/utils/self-signing.js +0 -38
  140. package/build/utils/self-signing.js.map +0 -1
@@ -1,166 +0,0 @@
1
- import { erc20Abi } from "viem";
2
- import { aavePoolAbi } from "../abis/aave-pool.js";
3
- import { AAVE_POOL, resolveAaveAsset, } from "../config/aave.js";
4
- import { CELINA_DATA_SUFFIX } from "../config/celina-tag.js";
5
- import { TokenService } from "./token.service.js";
6
- export class AaveService {
7
- clientFactory;
8
- tokenService;
9
- constructor(clientFactory) {
10
- this.clientFactory = clientFactory;
11
- this.tokenService = new TokenService(clientFactory);
12
- }
13
- requireClients() {
14
- const clients = this.clientFactory.getClients();
15
- if (!clients.wallet || !clients.accountAddress) {
16
- throw new Error("No wallet configured. Set CELO_PRIVATE_KEY in the MCP server env.");
17
- }
18
- return clients;
19
- }
20
- requireWallet(clients) {
21
- const { public: publicClient, wallet, accountAddress: from } = clients;
22
- if (!wallet || !from) {
23
- throw new Error("Wallet client unavailable. Set CELO_PRIVATE_KEY in the MCP server env.");
24
- }
25
- const account = wallet.account;
26
- if (!account) {
27
- throw new Error("Wallet account unavailable.");
28
- }
29
- const chain = publicClient.chain;
30
- if (!chain) {
31
- throw new Error("Chain configuration missing.");
32
- }
33
- return { publicClient, wallet, from, account, chain };
34
- }
35
- async assertUnderlyingBalance(asset, publicClient, owner, amount) {
36
- const token = this.tokenService.resolveToken(asset.symbol);
37
- const required = this.tokenService.parseAmount(amount, token.decimals);
38
- const balance = await publicClient.readContract({
39
- address: asset.underlying,
40
- abi: erc20Abi,
41
- functionName: "balanceOf",
42
- args: [owner],
43
- });
44
- if (balance < required) {
45
- const celoHint = asset.symbol === "CELO"
46
- ? " Aave requires wrapped CELO (ERC-20), not native CELO."
47
- : "";
48
- throw new Error(`Insufficient ${asset.symbol} balance. Required ${amount} ${asset.symbol}, available ${balance.toString()} raw units.${celoHint}`);
49
- }
50
- }
51
- async assertATokenBalance(asset, publicClient, owner, amount) {
52
- const token = this.tokenService.resolveToken(asset.symbol);
53
- const required = this.tokenService.parseAmount(amount, token.decimals);
54
- const balance = await publicClient.readContract({
55
- address: asset.aToken,
56
- abi: erc20Abi,
57
- functionName: "balanceOf",
58
- args: [owner],
59
- });
60
- if (balance < required) {
61
- throw new Error(`Insufficient Aave ${asset.symbol} supply balance. Required ${amount} ${asset.symbol}, available ${balance.toString()} raw aToken units.`);
62
- }
63
- }
64
- async ensureAllowance(underlying, tokenSymbol, publicClient, wallet, from, account, chain, amountWei) {
65
- const allowance = await publicClient.readContract({
66
- address: underlying,
67
- abi: erc20Abi,
68
- functionName: "allowance",
69
- args: [from, AAVE_POOL],
70
- });
71
- if (allowance >= amountWei) {
72
- return undefined;
73
- }
74
- const approvalHash = await wallet.writeContract({
75
- chain,
76
- account,
77
- address: underlying,
78
- abi: erc20Abi,
79
- functionName: "approve",
80
- args: [AAVE_POOL, amountWei],
81
- dataSuffix: CELINA_DATA_SUFFIX,
82
- });
83
- const receipt = await publicClient.waitForTransactionReceipt({ hash: approvalHash });
84
- if (receipt.status === "reverted") {
85
- throw new Error(`${tokenSymbol} approval reverted: ${approvalHash}`);
86
- }
87
- return approvalHash;
88
- }
89
- async supply(token, amount) {
90
- const asset = resolveAaveAsset(token);
91
- const clients = this.requireClients();
92
- const { publicClient, wallet, from, account, chain } = this.requireWallet(clients);
93
- await this.assertUnderlyingBalance(asset, publicClient, from, amount);
94
- const resolved = this.tokenService.resolveToken(asset.symbol);
95
- const amountWei = this.tokenService.parseAmount(amount, resolved.decimals);
96
- const approvalHash = await this.ensureAllowance(asset.underlying, asset.symbol, publicClient, wallet, from, account, chain, amountWei);
97
- const hash = await wallet.writeContract({
98
- chain,
99
- account,
100
- address: AAVE_POOL,
101
- abi: aavePoolAbi,
102
- functionName: "supply",
103
- args: [asset.underlying, amountWei, from, 0],
104
- dataSuffix: CELINA_DATA_SUFFIX,
105
- });
106
- const receipt = await publicClient.waitForTransactionReceipt({ hash });
107
- if (receipt.status === "reverted") {
108
- throw new Error(`Aave supply reverted: ${hash}`);
109
- }
110
- return {
111
- from,
112
- amount,
113
- token: asset.symbol,
114
- market: AAVE_POOL,
115
- hash,
116
- approvalHash,
117
- operation: "SUPPLY",
118
- };
119
- }
120
- async withdraw(token, amount, withdrawMax) {
121
- const asset = resolveAaveAsset(token);
122
- const clients = this.requireClients();
123
- const { publicClient, wallet, from, account, chain } = this.requireWallet(clients);
124
- if (!withdrawMax && !amount) {
125
- throw new Error("Provide amount or set withdrawMax to true.");
126
- }
127
- if (!withdrawMax && amount) {
128
- await this.assertATokenBalance(asset, publicClient, from, amount);
129
- }
130
- const resolved = this.tokenService.resolveToken(asset.symbol);
131
- const amountWei = withdrawMax
132
- ? await publicClient.readContract({
133
- address: asset.aToken,
134
- abi: erc20Abi,
135
- functionName: "balanceOf",
136
- args: [from],
137
- })
138
- : this.tokenService.parseAmount(amount, resolved.decimals);
139
- if (amountWei === 0n) {
140
- throw new Error(`No supplied ${asset.symbol} balance to withdraw.`);
141
- }
142
- const hash = await wallet.writeContract({
143
- chain,
144
- account,
145
- address: AAVE_POOL,
146
- abi: aavePoolAbi,
147
- functionName: "withdraw",
148
- args: [asset.underlying, amountWei, from],
149
- dataSuffix: CELINA_DATA_SUFFIX,
150
- });
151
- const receipt = await publicClient.waitForTransactionReceipt({ hash });
152
- if (receipt.status === "reverted") {
153
- throw new Error(`Aave withdraw reverted: ${hash}`);
154
- }
155
- return {
156
- from,
157
- amount: withdrawMax ? "max" : amount,
158
- token: asset.symbol,
159
- market: AAVE_POOL,
160
- hash,
161
- operation: "WITHDRAW",
162
- withdrawMax: Boolean(withdrawMax),
163
- };
164
- }
165
- }
166
- //# sourceMappingURL=aave.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aave.service.js","sourceRoot":"","sources":["../../src/services/aave.service.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
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
- }
@@ -1,23 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,40 +0,0 @@
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
- }
@@ -1,81 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"blockchain.service.js","sourceRoot":"","sources":["../../src/services/blockchain.service.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- import { type EnsClientFactory } from "../clients/ens-client.js";
2
- export type EnsResolveChain = "celo" | "ethereum";
3
- export type ResolvedRecipient = {
4
- address: `0x${string}`;
5
- ens?: {
6
- name: string;
7
- normalizedName: string;
8
- resolvedVia?: "celo" | "ethereum";
9
- };
10
- };
11
- export declare class EnsService {
12
- private readonly ensClientFactory;
13
- constructor(ensClientFactory: EnsClientFactory);
14
- resolveEns(name: string, chain?: EnsResolveChain): Promise<{
15
- name: string;
16
- normalizedName: string;
17
- address: `0x${string}`;
18
- coinType: string;
19
- chain: "ethereum";
20
- resolvedVia?: undefined;
21
- } | {
22
- name: string;
23
- normalizedName: string;
24
- address: `0x${string}`;
25
- coinType: string;
26
- chain: "celo";
27
- resolvedVia: "celo" | "ethereum";
28
- }>;
29
- resolveAddressOrEns(input: string): Promise<ResolvedRecipient>;
30
- }
@@ -1,78 +0,0 @@
1
- import { toCoinType } from "viem";
2
- import { celo } from "viem/chains";
3
- import { getEnsAddress, normalize } from "viem/ens";
4
- import { ENS_CCIP_GATEWAY, } from "../clients/ens-client.js";
5
- const ADDRESS_PATTERN = /^0x[a-fA-F0-9]{40}$/;
6
- export class EnsService {
7
- ensClientFactory;
8
- constructor(ensClientFactory) {
9
- this.ensClientFactory = ensClientFactory;
10
- }
11
- async resolveEns(name, chain = "celo") {
12
- const trimmedName = name.trim();
13
- const normalizedName = normalize(trimmedName);
14
- const client = this.ensClientFactory.getClient();
15
- const gatewayUrls = [ENS_CCIP_GATEWAY];
16
- if (chain === "ethereum") {
17
- const address = await getEnsAddress(client, {
18
- name: normalizedName,
19
- gatewayUrls,
20
- });
21
- if (!address) {
22
- throw new Error(`ENS name "${trimmedName}" has no Ethereum address record`);
23
- }
24
- return {
25
- name: trimmedName,
26
- normalizedName,
27
- address,
28
- coinType: "60",
29
- chain: "ethereum",
30
- };
31
- }
32
- const celoCoinType = toCoinType(celo.id);
33
- let address = await getEnsAddress(client, {
34
- name: normalizedName,
35
- coinType: celoCoinType,
36
- gatewayUrls,
37
- });
38
- let coinType = celoCoinType.toString();
39
- let resolvedVia = "celo";
40
- if (!address) {
41
- address = await getEnsAddress(client, {
42
- name: normalizedName,
43
- gatewayUrls,
44
- });
45
- coinType = "60";
46
- resolvedVia = "ethereum";
47
- }
48
- if (!address) {
49
- throw new Error(`ENS name "${trimmedName}" could not be resolved to an address`);
50
- }
51
- return {
52
- name: trimmedName,
53
- normalizedName,
54
- address,
55
- coinType,
56
- chain: "celo",
57
- resolvedVia,
58
- };
59
- }
60
- async resolveAddressOrEns(input) {
61
- const trimmed = input.trim();
62
- if (ADDRESS_PATTERN.test(trimmed)) {
63
- return { address: trimmed };
64
- }
65
- const resolved = await this.resolveEns(trimmed);
66
- return {
67
- address: resolved.address,
68
- ens: {
69
- name: resolved.name,
70
- normalizedName: resolved.normalizedName,
71
- ...(resolved.chain === "celo"
72
- ? { resolvedVia: resolved.resolvedVia }
73
- : {}),
74
- },
75
- };
76
- }
77
- }
78
- //# sourceMappingURL=ens.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ens.service.js","sourceRoot":"","sources":["../../src/services/ens.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EACL,gBAAgB,GAEjB,MAAM,0BAA0B,CAAC;AAIlC,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAW9C,MAAM,OAAO,UAAU;IACQ;IAA7B,YAA6B,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;IAAG,CAAC;IAEnE,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,QAAyB,MAAM;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,WAAW,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAEvC,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;gBAC1C,IAAI,EAAE,cAAc;gBACpB,WAAW;aACZ,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,aAAa,WAAW,kCAAkC,CAC3D,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,cAAc;gBACd,OAAO;gBACP,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,UAAmB;aAC3B,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;YACxC,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,YAAY;YACtB,WAAW;SACZ,CAAC,CAAC;QAEH,IAAI,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,WAAW,GAAwB,MAAM,CAAC;QAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;gBACpC,IAAI,EAAE,cAAc;gBACpB,WAAW;aACZ,CAAC,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC;YAChB,WAAW,GAAG,UAAU,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,aAAa,WAAW,uCAAuC,CAChE,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,cAAc;YACd,OAAO;YACP,QAAQ;YACR,KAAK,EAAE,MAAe;YACtB,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,KAAa;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAE7B,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,OAAwB,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,OAAwB;YAC1C,GAAG,EAAE;gBACH,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM;oBAC3B,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE;oBACvC,CAAC,CAAC,EAAE,CAAC;aACR;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -1,38 +0,0 @@
1
- import type { CeloClientFactory } from "../clients/celo-client.js";
2
- export declare class GoodDollarService {
3
- private readonly clientFactory;
4
- constructor(clientFactory: CeloClientFactory);
5
- getWhitelistingInfo(address: `0x${string}`): Promise<{
6
- address: `0x${string}`;
7
- contract: "0xC361A6E67822a0EDc17D899227dd9FC50BD62F42";
8
- isCurrentlyWhitelisted: boolean;
9
- status: number;
10
- statusLabel: string;
11
- whitelistedOn: string | null;
12
- lastAuthenticatedOn: string | null;
13
- fieldDescriptions: {
14
- whitelistedOn: string;
15
- lastAuthenticatedOn: string;
16
- };
17
- reverification: {
18
- daysSinceLastAuthentication: number;
19
- currentReverificationPeriodDays: number;
20
- maxReverificationPeriodDays: number;
21
- daysUntilReverificationRequired: number;
22
- reverificationRequiredOn: string;
23
- reverificationProgressPercent: number;
24
- isReverificationOverdue: boolean;
25
- } | null;
26
- identity: {
27
- dateAuthenticated: number;
28
- dateAdded: number;
29
- did: string;
30
- whitelistedOnChainId: number;
31
- status: number;
32
- authCount: number;
33
- };
34
- }>;
35
- private effectiveAuthCount;
36
- private fetchReverifyDaysOptions;
37
- private buildReverificationProgress;
38
- }
@@ -1,127 +0,0 @@
1
- import { goodDollarIdentityAbi } from "../abis/gooddollar-identity.js";
2
- import { GOODDOLLAR_IDENTITY_ADDRESS } from "../config/gooddollar.js";
3
- import { formatUnixDate } from "../utils/format-date.js";
4
- const STATUS_LABELS = {
5
- 0: "none",
6
- 1: "whitelisted",
7
- 2: "dao_contract",
8
- 255: "blacklisted",
9
- };
10
- // Post-upgrade users authenticated before this timestamp use the last reverify step.
11
- const LEGACY_AUTH_CUTOFF = 1772697574;
12
- function statusLabel(status) {
13
- return STATUS_LABELS[status] ?? "unknown";
14
- }
15
- export class GoodDollarService {
16
- clientFactory;
17
- constructor(clientFactory) {
18
- this.clientFactory = clientFactory;
19
- }
20
- async getWhitelistingInfo(address) {
21
- const { public: client } = this.clientFactory.getClients();
22
- const contract = GOODDOLLAR_IDENTITY_ADDRESS;
23
- const [identityResult, isCurrentlyWhitelisted, maxReverificationPeriodDays, reverifyDaysOptions,] = await Promise.all([
24
- client.readContract({
25
- address: contract,
26
- abi: goodDollarIdentityAbi,
27
- functionName: "identities",
28
- args: [address],
29
- }),
30
- client.readContract({
31
- address: contract,
32
- abi: goodDollarIdentityAbi,
33
- functionName: "isWhitelisted",
34
- args: [address],
35
- }),
36
- client.readContract({
37
- address: contract,
38
- abi: goodDollarIdentityAbi,
39
- functionName: "authenticationPeriod",
40
- }),
41
- this.fetchReverifyDaysOptions(client, contract),
42
- ]);
43
- const [dateAuthenticated, dateAdded, did, whitelistedOnChainId, status, authCount,] = identityResult;
44
- const statusNum = Number(status);
45
- const dateAuthenticatedNum = Number(dateAuthenticated);
46
- const dateAddedNum = Number(dateAdded);
47
- const authCountNum = Number(authCount);
48
- let currentReverificationPeriodDays = null;
49
- if (statusNum === 1 && dateAuthenticatedNum > 0 && reverifyDaysOptions.length > 0) {
50
- const effectiveAuthCount = this.effectiveAuthCount(dateAuthenticatedNum, authCountNum, reverifyDaysOptions.length);
51
- currentReverificationPeriodDays =
52
- reverifyDaysOptions[effectiveAuthCount] ?? null;
53
- }
54
- const isWhitelistedStatus = statusNum === 1 && dateAddedNum > 0;
55
- const reverification = statusNum === 1 && dateAuthenticatedNum > 0 && currentReverificationPeriodDays !== null
56
- ? this.buildReverificationProgress(dateAuthenticatedNum, currentReverificationPeriodDays, Number(maxReverificationPeriodDays))
57
- : null;
58
- return {
59
- address,
60
- contract,
61
- isCurrentlyWhitelisted,
62
- status: statusNum,
63
- statusLabel: statusLabel(statusNum),
64
- whitelistedOn: isWhitelistedStatus ? formatUnixDate(dateAddedNum) : null,
65
- lastAuthenticatedOn: dateAuthenticatedNum > 0 ? formatUnixDate(dateAuthenticatedNum) : null,
66
- fieldDescriptions: {
67
- whitelistedOn: "When the wallet was first added to the GoodDollar whitelist.",
68
- lastAuthenticatedOn: "When the wallet last verified its identity. Periodic reverification is required to remain whitelisted.",
69
- },
70
- reverification,
71
- identity: {
72
- dateAuthenticated: dateAuthenticatedNum,
73
- dateAdded: dateAddedNum,
74
- did,
75
- whitelistedOnChainId: Number(whitelistedOnChainId),
76
- status: statusNum,
77
- authCount: authCountNum,
78
- },
79
- };
80
- }
81
- effectiveAuthCount(dateAuthenticated, authCount, optionsLength) {
82
- if (dateAuthenticated < LEGACY_AUTH_CUTOFF) {
83
- return optionsLength - 1;
84
- }
85
- if (authCount >= optionsLength) {
86
- return 0;
87
- }
88
- return authCount;
89
- }
90
- async fetchReverifyDaysOptions(client, contract) {
91
- const options = [];
92
- for (let index = 0; index < 8; index++) {
93
- try {
94
- const value = await client.readContract({
95
- address: contract,
96
- abi: goodDollarIdentityAbi,
97
- functionName: "reverifyDaysOptions",
98
- args: [BigInt(index)],
99
- });
100
- options.push(Number(value));
101
- }
102
- catch {
103
- break;
104
- }
105
- }
106
- return options;
107
- }
108
- buildReverificationProgress(dateAuthenticated, currentReverificationPeriodDays, maxReverificationPeriodDays) {
109
- const nowSec = Math.floor(Date.now() / 1000);
110
- const daysSinceLastAuthentication = Math.floor((nowSec - dateAuthenticated) / 86400);
111
- const daysUntilReverificationRequired = currentReverificationPeriodDays - daysSinceLastAuthentication;
112
- const reverificationRequiredTimestamp = dateAuthenticated + currentReverificationPeriodDays * 86400;
113
- const isReverificationOverdue = daysUntilReverificationRequired < 0;
114
- const reverificationProgressPercent = Math.min(100, Math.max(0, Math.round((daysSinceLastAuthentication / currentReverificationPeriodDays) *
115
- 100)));
116
- return {
117
- daysSinceLastAuthentication,
118
- currentReverificationPeriodDays,
119
- maxReverificationPeriodDays,
120
- daysUntilReverificationRequired,
121
- reverificationRequiredOn: formatUnixDate(reverificationRequiredTimestamp),
122
- reverificationProgressPercent,
123
- isReverificationOverdue,
124
- };
125
- }
126
- }
127
- //# sourceMappingURL=gooddollar.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gooddollar.service.js","sourceRoot":"","sources":["../../src/services/gooddollar.service.ts"],"names":[],"mappings":"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"}