@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.
- package/bin/wrapper.js +2 -0
- package/package.json +5 -44
- package/LICENSE +0 -21
- package/README.md +0 -292
- package/assets/logo-black.png +0 -0
- package/assets/logo-yellow.png +0 -0
- package/assets/logo.png +0 -0
- package/bin/cli.js +0 -2
- package/build/abis/aave-pool.d.ts +0 -37
- package/build/abis/aave-pool.js +0 -26
- package/build/abis/aave-pool.js.map +0 -1
- package/build/abis/gooddollar-identity.d.ts +0 -61
- package/build/abis/gooddollar-identity.js +0 -38
- package/build/abis/gooddollar-identity.js.map +0 -1
- package/build/abis/self-registry.d.ts +0 -194
- package/build/abis/self-registry.js +0 -120
- package/build/abis/self-registry.js.map +0 -1
- package/build/clients/celo-client.d.ts +0 -13
- package/build/clients/celo-client.js +0 -39
- package/build/clients/celo-client.js.map +0 -1
- package/build/clients/ens-client.d.ts +0 -10
- package/build/clients/ens-client.js +0 -23
- package/build/clients/ens-client.js.map +0 -1
- package/build/clients/mento-sdk.d.ts +0 -2
- package/build/clients/mento-sdk.js +0 -9
- package/build/clients/mento-sdk.js.map +0 -1
- package/build/clients/self-api.d.ts +0 -82
- package/build/clients/self-api.js +0 -242
- package/build/clients/self-api.js.map +0 -1
- package/build/config/aave.d.ts +0 -11
- package/build/config/aave.js +0 -55
- package/build/config/aave.js.map +0 -1
- package/build/config/celina-tag.d.ts +0 -1
- package/build/config/celina-tag.js +0 -3
- package/build/config/celina-tag.js.map +0 -1
- package/build/config/chains.d.ts +0 -935
- package/build/config/chains.js +0 -251
- package/build/config/chains.js.map +0 -1
- package/build/config/env.d.ts +0 -7
- package/build/config/env.js +0 -9
- package/build/config/env.js.map +0 -1
- package/build/config/gooddollar.d.ts +0 -1
- package/build/config/gooddollar.js +0 -2
- package/build/config/gooddollar.js.map +0 -1
- package/build/config/load-env.d.ts +0 -1
- package/build/config/load-env.js +0 -4
- package/build/config/load-env.js.map +0 -1
- package/build/config/self.d.ts +0 -22
- package/build/config/self.js +0 -27
- package/build/config/self.js.map +0 -1
- package/build/context/app-context.d.ts +0 -28
- package/build/context/app-context.js +0 -28
- package/build/context/app-context.js.map +0 -1
- package/build/index.d.ts +0 -2
- package/build/index.js +0 -17
- package/build/index.js.map +0 -1
- package/build/schemas/common.d.ts +0 -6
- package/build/schemas/common.js +0 -24
- package/build/schemas/common.js.map +0 -1
- package/build/server/create-server.d.ts +0 -2
- package/build/server/create-server.js +0 -23
- package/build/server/create-server.js.map +0 -1
- package/build/server/instructions.d.ts +0 -1
- package/build/server/instructions.js +0 -22
- package/build/server/instructions.js.map +0 -1
- package/build/services/aave.service.d.ts +0 -29
- package/build/services/aave.service.js +0 -166
- package/build/services/aave.service.js.map +0 -1
- package/build/services/account.service.d.ts +0 -13
- package/build/services/account.service.js +0 -23
- package/build/services/account.service.js.map +0 -1
- package/build/services/blockchain.service.d.ts +0 -40
- package/build/services/blockchain.service.js +0 -81
- package/build/services/blockchain.service.js.map +0 -1
- package/build/services/ens.service.d.ts +0 -30
- package/build/services/ens.service.js +0 -78
- package/build/services/ens.service.js.map +0 -1
- package/build/services/gooddollar.service.d.ts +0 -38
- package/build/services/gooddollar.service.js +0 -127
- package/build/services/gooddollar.service.js.map +0 -1
- package/build/services/mento-fx.service.d.ts +0 -71
- package/build/services/mento-fx.service.js +0 -261
- package/build/services/mento-fx.service.js.map +0 -1
- package/build/services/self-session-store.d.ts +0 -19
- package/build/services/self-session-store.js +0 -28
- package/build/services/self-session-store.js.map +0 -1
- package/build/services/self.service.d.ts +0 -247
- package/build/services/self.service.js +0 -685
- package/build/services/self.service.js.map +0 -1
- package/build/services/token.service.d.ts +0 -54
- package/build/services/token.service.js +0 -147
- package/build/services/token.service.js.map +0 -1
- package/build/services/transaction.service.d.ts +0 -24
- package/build/services/transaction.service.js +0 -112
- package/build/services/transaction.service.js.map +0 -1
- package/build/tools/aave.tools.d.ts +0 -2
- package/build/tools/aave.tools.js +0 -55
- package/build/tools/aave.tools.js.map +0 -1
- package/build/tools/blockchain.tools.d.ts +0 -3
- package/build/tools/blockchain.tools.js +0 -88
- package/build/tools/blockchain.tools.js.map +0 -1
- package/build/tools/ens.tools.d.ts +0 -2
- package/build/tools/ens.tools.js +0 -27
- package/build/tools/ens.tools.js.map +0 -1
- package/build/tools/gooddollar.tools.d.ts +0 -2
- package/build/tools/gooddollar.tools.js +0 -23
- package/build/tools/gooddollar.tools.js.map +0 -1
- package/build/tools/helpers.d.ts +0 -3
- package/build/tools/helpers.js +0 -16
- package/build/tools/helpers.js.map +0 -1
- package/build/tools/index.d.ts +0 -5
- package/build/tools/index.js +0 -25
- package/build/tools/index.js.map +0 -1
- package/build/tools/mento-fx.tools.d.ts +0 -2
- package/build/tools/mento-fx.tools.js +0 -80
- package/build/tools/mento-fx.tools.js.map +0 -1
- package/build/tools/self.tools.d.ts +0 -2
- package/build/tools/self.tools.js +0 -242
- package/build/tools/self.tools.js.map +0 -1
- package/build/tools/token.tools.d.ts +0 -2
- package/build/tools/token.tools.js +0 -62
- package/build/tools/token.tools.js.map +0 -1
- package/build/tools/transaction.tools.d.ts +0 -2
- package/build/tools/transaction.tools.js +0 -49
- package/build/tools/transaction.tools.js.map +0 -1
- package/build/tools/types.d.ts +0 -5
- package/build/tools/types.js +0 -2
- package/build/tools/types.js.map +0 -1
- package/build/utils/erc20-allowance-storage.d.ts +0 -7
- package/build/utils/erc20-allowance-storage.js +0 -44
- package/build/utils/erc20-allowance-storage.js.map +0 -1
- package/build/utils/format-date.d.ts +0 -1
- package/build/utils/format-date.js +0 -12
- package/build/utils/format-date.js.map +0 -1
- package/build/utils/self-format.d.ts +0 -16
- package/build/utils/self-format.js +0 -59
- package/build/utils/self-format.js.map +0 -1
- package/build/utils/self-signing.d.ts +0 -4
- package/build/utils/self-signing.js +0 -38
- 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":"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"}
|
|
@@ -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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"}
|