@andrewkimjoseph/celina-sdk 0.7.3 → 0.7.5
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/build/services/transaction.service.d.ts +12 -9
- package/build/services/transaction.service.js +35 -28
- package/build/services/transaction.service.js.map +1 -1
- package/build/utils/transaction-errors.d.ts +3 -0
- package/build/utils/transaction-errors.js +17 -0
- package/build/utils/transaction-errors.js.map +1 -0
- package/package.json +1 -1
|
@@ -5,6 +5,16 @@
|
|
|
5
5
|
import { type Hex } from "viem";
|
|
6
6
|
import type { CeloClientFactory } from "../clients/celo-client.js";
|
|
7
7
|
import { type SerializedPreparedFlow } from "../types/prepared.js";
|
|
8
|
+
export type SendEstimateResult = {
|
|
9
|
+
network: "mainnet";
|
|
10
|
+
from: `0x${string}`;
|
|
11
|
+
to: `0x${string}`;
|
|
12
|
+
token: string;
|
|
13
|
+
amount: string;
|
|
14
|
+
gas: string | null;
|
|
15
|
+
insufficientBalance?: boolean;
|
|
16
|
+
message?: string;
|
|
17
|
+
};
|
|
8
18
|
/** Token sends, gas fee reads, and `prepareSend` flows with CELINA calldata tags. */
|
|
9
19
|
export declare class TransactionService {
|
|
10
20
|
private readonly clientFactory;
|
|
@@ -16,16 +26,9 @@ export declare class TransactionService {
|
|
|
16
26
|
* @param to - Recipient address
|
|
17
27
|
* @param token - Symbol (e.g. `CELO`, `USDm`) or contract address
|
|
18
28
|
* @param amount - Human-readable amount (e.g. `"10"`)
|
|
19
|
-
* @returns Gas estimate in units as a decimal string
|
|
29
|
+
* @returns Gas estimate in units as a decimal string, or a structured insufficient-balance result when simulation reverts.
|
|
20
30
|
*/
|
|
21
|
-
estimateSend(from: `0x${string}`, to: `0x${string}`, token: string, amount: string): Promise<
|
|
22
|
-
network: "mainnet";
|
|
23
|
-
from: `0x${string}`;
|
|
24
|
-
to: `0x${string}`;
|
|
25
|
-
token: string;
|
|
26
|
-
amount: string;
|
|
27
|
-
gas: string;
|
|
28
|
-
}>;
|
|
31
|
+
estimateSend(from: `0x${string}`, to: `0x${string}`, token: string, amount: string): Promise<SendEstimateResult>;
|
|
29
32
|
/**
|
|
30
33
|
* Build an unsigned send flow (native CELO or ERC-20 transfer).
|
|
31
34
|
* @param from - Sender wallet address (must match connected wallet when signing)
|
|
@@ -8,6 +8,7 @@ import { CELINA_DATA_SUFFIX } from "../config/celina-tag.js";
|
|
|
8
8
|
import { normalizeAddress } from "../utils/normalize-address.js";
|
|
9
9
|
import { serializePreparedFlow, } from "../types/prepared.js";
|
|
10
10
|
import { TokenService } from "./token.service.js";
|
|
11
|
+
import { insufficientBalanceEstimateMessage, isInsufficientBalanceSimulationError, } from "../utils/transaction-errors.js";
|
|
11
12
|
function taggedCalldata(data) {
|
|
12
13
|
return concat([data, CELINA_DATA_SUFFIX]);
|
|
13
14
|
}
|
|
@@ -25,45 +26,51 @@ export class TransactionService {
|
|
|
25
26
|
* @param to - Recipient address
|
|
26
27
|
* @param token - Symbol (e.g. `CELO`, `USDm`) or contract address
|
|
27
28
|
* @param amount - Human-readable amount (e.g. `"10"`)
|
|
28
|
-
* @returns Gas estimate in units as a decimal string
|
|
29
|
+
* @returns Gas estimate in units as a decimal string, or a structured insufficient-balance result when simulation reverts.
|
|
29
30
|
*/
|
|
30
31
|
async estimateSend(from, to, token, amount) {
|
|
31
32
|
const { public: client } = this.clientFactory.getClients();
|
|
32
33
|
const resolved = this.tokenService.resolveToken(token);
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
const base = {
|
|
35
|
+
network: "mainnet",
|
|
36
|
+
from,
|
|
37
|
+
to,
|
|
38
|
+
token: resolved.symbol,
|
|
39
|
+
amount,
|
|
40
|
+
};
|
|
41
|
+
try {
|
|
42
|
+
if (resolved.address === "native") {
|
|
43
|
+
const tokenAmount = parseEther(amount);
|
|
44
|
+
const gas = await client.estimateContractGas({
|
|
45
|
+
account: from,
|
|
46
|
+
address: MENTO_CELO_ADDRESS,
|
|
47
|
+
abi: erc20Abi,
|
|
48
|
+
functionName: "transfer",
|
|
49
|
+
args: [to, tokenAmount],
|
|
50
|
+
});
|
|
51
|
+
return { ...base, gas: gas.toString() };
|
|
52
|
+
}
|
|
53
|
+
const tokenAmount = this.tokenService.parseAmount(amount, resolved.decimals);
|
|
35
54
|
const gas = await client.estimateContractGas({
|
|
36
55
|
account: from,
|
|
37
|
-
address:
|
|
56
|
+
address: resolved.address,
|
|
38
57
|
abi: erc20Abi,
|
|
39
58
|
functionName: "transfer",
|
|
40
59
|
args: [to, tokenAmount],
|
|
41
60
|
});
|
|
42
|
-
return {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
61
|
+
return { ...base, gas: gas.toString() };
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (isInsufficientBalanceSimulationError(error)) {
|
|
65
|
+
return {
|
|
66
|
+
...base,
|
|
67
|
+
gas: null,
|
|
68
|
+
insufficientBalance: true,
|
|
69
|
+
message: insufficientBalanceEstimateMessage(resolved.symbol),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
50
73
|
}
|
|
51
|
-
const tokenAmount = this.tokenService.parseAmount(amount, resolved.decimals);
|
|
52
|
-
const gas = await client.estimateContractGas({
|
|
53
|
-
account: from,
|
|
54
|
-
address: resolved.address,
|
|
55
|
-
abi: erc20Abi,
|
|
56
|
-
functionName: "transfer",
|
|
57
|
-
args: [to, tokenAmount],
|
|
58
|
-
});
|
|
59
|
-
return {
|
|
60
|
-
network: "mainnet",
|
|
61
|
-
from,
|
|
62
|
-
to,
|
|
63
|
-
token: resolved.symbol,
|
|
64
|
-
amount,
|
|
65
|
-
gas: gas.toString(),
|
|
66
|
-
};
|
|
67
74
|
}
|
|
68
75
|
/**
|
|
69
76
|
* Build an unsigned send flow (native CELO or ERC-20 transfer).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.service.js","sourceRoot":"","sources":["../../src/services/transaction.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,SAAS,GAEV,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAEL,qBAAqB,GAEtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"transaction.service.js","sourceRoot":"","sources":["../../src/services/transaction.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const INSUFFICIENT_BALANCE_PATTERNS = [
|
|
2
|
+
/transfer amount exceeds balance/i,
|
|
3
|
+
/erc20:\s*transfer amount exceeds balance/i,
|
|
4
|
+
/insufficient .+ balance/i,
|
|
5
|
+
/insufficient funds/i,
|
|
6
|
+
/exceeds balance/i,
|
|
7
|
+
];
|
|
8
|
+
/** True when a transfer gas simulation failed due to insufficient token balance. */
|
|
9
|
+
export function isInsufficientBalanceSimulationError(error) {
|
|
10
|
+
const message = error instanceof Error ? error.message : typeof error === "string" ? error : "";
|
|
11
|
+
return INSUFFICIENT_BALANCE_PATTERNS.some((pattern) => pattern.test(message));
|
|
12
|
+
}
|
|
13
|
+
export function insufficientBalanceEstimateMessage(token) {
|
|
14
|
+
return (`Insufficient ${token}. Transfer simulation failed — gas cannot be estimated ` +
|
|
15
|
+
"without sufficient balance.");
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=transaction-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-errors.js","sourceRoot":"","sources":["../../src/utils/transaction-errors.ts"],"names":[],"mappings":"AAAA,MAAM,6BAA6B,GAAG;IACpC,kCAAkC;IAClC,2CAA2C;IAC3C,0BAA0B;IAC1B,qBAAqB;IACrB,kBAAkB;CACnB,CAAC;AAEF,oFAAoF;AACpF,MAAM,UAAU,oCAAoC,CAAC,KAAc;IACjE,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,OAAO,6BAA6B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,KAAa;IAC9D,OAAO,CACL,gBAAgB,KAAK,yDAAyD;QAC9E,6BAA6B,CAC9B,CAAC;AACJ,CAAC"}
|