@1stdex/first-sdk 1.0.70 → 1.0.71
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/dist/cjs/calls/batch/prepare-withdraw.js +16 -11
- package/dist/cjs/calls/batch/prepare-withdraw.js.map +1 -1
- package/dist/esm/calls/batch/prepare-withdraw.js +19 -14
- package/dist/esm/calls/batch/prepare-withdraw.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/calls/batch/prepare-withdraw.d.ts +3 -3
- package/dist/types/calls/batch/prepare-withdraw.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -7,6 +7,7 @@ const addresses_1 = require("../../constants/chain-configs/addresses");
|
|
|
7
7
|
const dex_vault_abi_1 = require("../../constants/abis/core/dex-vault-abi");
|
|
8
8
|
const vault_1 = require("../../views/vault");
|
|
9
9
|
const withdraw_from_vault_1 = require("../vault/withdraw-from-vault");
|
|
10
|
+
const apis_1 = require("../../entities/currency/apis");
|
|
10
11
|
class NotEnoughFundsError extends Error {
|
|
11
12
|
constructor(message, required, available) {
|
|
12
13
|
super(message);
|
|
@@ -33,11 +34,15 @@ const prepareWithdraw = async ({ chainId, userAddress, toAddress, currency, amou
|
|
|
33
34
|
chain: chain_1.CHAIN_MAP[chainId],
|
|
34
35
|
transport: options?.rpcUrl ? (0, viem_1.http)(options.rpcUrl) : (0, viem_1.http)(),
|
|
35
36
|
});
|
|
36
|
-
const vault = await
|
|
37
|
-
chainId,
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
const [currencyInfo, vault] = await Promise.all([
|
|
38
|
+
(0, apis_1.fetchCurrency)(publicClient, chainId, currency),
|
|
39
|
+
(0, vault_1.getVault)({
|
|
40
|
+
chainId,
|
|
41
|
+
tokenAddress: currency,
|
|
42
|
+
...(options?.rpcUrl && { options: { rpcUrl: options.rpcUrl } }),
|
|
43
|
+
}),
|
|
44
|
+
]);
|
|
45
|
+
const rawAmount = (0, viem_1.parseUnits)(amount, currencyInfo.decimals);
|
|
41
46
|
const results = await publicClient.multicall({
|
|
42
47
|
contracts: [
|
|
43
48
|
{
|
|
@@ -64,24 +69,24 @@ const prepareWithdraw = async ({ chainId, userAddress, toAddress, currency, amou
|
|
|
64
69
|
const vaultBalance = results[1].result || 0n;
|
|
65
70
|
const vaultAllowance = results[2].result || 0n;
|
|
66
71
|
const totalBalance = walletBalance + vaultBalance;
|
|
67
|
-
if (totalBalance <
|
|
68
|
-
throw new NotEnoughFundsError(`Insufficient funds: need ${
|
|
72
|
+
if (totalBalance < rawAmount) {
|
|
73
|
+
throw new NotEnoughFundsError(`Insufficient funds: need ${rawAmount}, but only have ${totalBalance} (wallet: ${walletBalance}, vault: ${vaultBalance})`, rawAmount, totalBalance);
|
|
69
74
|
}
|
|
70
75
|
const calls = [];
|
|
71
76
|
const maxValue = 2n ** 256n - 1n;
|
|
72
|
-
if (walletBalance >=
|
|
77
|
+
if (walletBalance >= rawAmount) {
|
|
73
78
|
calls.push({
|
|
74
79
|
to: currency,
|
|
75
80
|
data: (0, viem_1.encodeFunctionData)({
|
|
76
81
|
abi: viem_1.erc20Abi,
|
|
77
82
|
functionName: 'transfer',
|
|
78
|
-
args: [toAddress,
|
|
83
|
+
args: [toAddress, rawAmount],
|
|
79
84
|
}),
|
|
80
85
|
value: 0n,
|
|
81
86
|
});
|
|
82
87
|
return calls;
|
|
83
88
|
}
|
|
84
|
-
const amountToWithdraw =
|
|
89
|
+
const amountToWithdraw = rawAmount - walletBalance;
|
|
85
90
|
if (vaultAllowance < amountToWithdraw) {
|
|
86
91
|
calls.push({
|
|
87
92
|
to: vault.address,
|
|
@@ -113,7 +118,7 @@ const prepareWithdraw = async ({ chainId, userAddress, toAddress, currency, amou
|
|
|
113
118
|
data: (0, viem_1.encodeFunctionData)({
|
|
114
119
|
abi: viem_1.erc20Abi,
|
|
115
120
|
functionName: 'transfer',
|
|
116
|
-
args: [toAddress,
|
|
121
|
+
args: [toAddress, rawAmount],
|
|
117
122
|
}),
|
|
118
123
|
value: 0n,
|
|
119
124
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-withdraw.js","sourceRoot":"","sources":["../../../../src/calls/batch/prepare-withdraw.ts"],"names":[],"mappings":";;;AAAA,+
|
|
1
|
+
{"version":3,"file":"prepare-withdraw.js","sourceRoot":"","sources":["../../../../src/calls/batch/prepare-withdraw.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { createPublicClient, encodeFunctionData, erc20Abi, http } from 'viem';
|
|
1
|
+
import { createPublicClient, encodeFunctionData, erc20Abi, http, parseUnits, } from 'viem';
|
|
2
2
|
import { CHAIN_MAP } from '../../constants/chain-configs/chain';
|
|
3
3
|
import { CONTRACT_ADDRESSES } from '../../constants/chain-configs/addresses';
|
|
4
4
|
import { DEX_VAULT_ABI } from '../../constants/abis/core/dex-vault-abi';
|
|
5
5
|
import { getVault } from '../../views/vault';
|
|
6
6
|
import { withdrawFromVault } from '../vault/withdraw-from-vault';
|
|
7
|
+
import { fetchCurrency } from '../../entities/currency/apis';
|
|
7
8
|
/**
|
|
8
9
|
* Error thrown when there are insufficient funds in wallet and vault combined.
|
|
9
10
|
*/
|
|
@@ -36,7 +37,7 @@ export class NotEnoughFundsError extends Error {
|
|
|
36
37
|
* @param userAddress The user address (wallet and vault owner).
|
|
37
38
|
* @param toAddress The recipient address.
|
|
38
39
|
* @param currency The currency/token address.
|
|
39
|
-
* @param amount The amount to send (
|
|
40
|
+
* @param amount The amount to send (decimal-adjusted string, e.g., '100.5' for 100.5 tokens).
|
|
40
41
|
* @param options Optional parameters.
|
|
41
42
|
* @returns Promise resolving to array of batch calls.
|
|
42
43
|
* @example
|
|
@@ -48,7 +49,7 @@ export class NotEnoughFundsError extends Error {
|
|
|
48
49
|
* userAddress: '0xF8c1869Ecd4df136693C45EcE1b67f85B6bDaE69',
|
|
49
50
|
* toAddress: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
|
|
50
51
|
* currency: '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
|
|
51
|
-
* amount:
|
|
52
|
+
* amount: '100.5' // 100.5 tokens
|
|
52
53
|
* })
|
|
53
54
|
*
|
|
54
55
|
* // Send all calls in one batched transaction
|
|
@@ -61,11 +62,15 @@ export const prepareWithdraw = async ({ chainId, userAddress, toAddress, currenc
|
|
|
61
62
|
chain: CHAIN_MAP[chainId],
|
|
62
63
|
transport: options?.rpcUrl ? http(options.rpcUrl) : http(),
|
|
63
64
|
});
|
|
64
|
-
const vault = await
|
|
65
|
-
chainId,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
const [currencyInfo, vault] = await Promise.all([
|
|
66
|
+
fetchCurrency(publicClient, chainId, currency),
|
|
67
|
+
getVault({
|
|
68
|
+
chainId,
|
|
69
|
+
tokenAddress: currency,
|
|
70
|
+
...(options?.rpcUrl && { options: { rpcUrl: options.rpcUrl } }),
|
|
71
|
+
}),
|
|
72
|
+
]);
|
|
73
|
+
const rawAmount = parseUnits(amount, currencyInfo.decimals);
|
|
69
74
|
const results = await publicClient.multicall({
|
|
70
75
|
contracts: [
|
|
71
76
|
{
|
|
@@ -92,26 +97,26 @@ export const prepareWithdraw = async ({ chainId, userAddress, toAddress, currenc
|
|
|
92
97
|
const vaultBalance = results[1].result || 0n;
|
|
93
98
|
const vaultAllowance = results[2].result || 0n;
|
|
94
99
|
const totalBalance = walletBalance + vaultBalance;
|
|
95
|
-
if (totalBalance <
|
|
96
|
-
throw new NotEnoughFundsError(`Insufficient funds: need ${
|
|
100
|
+
if (totalBalance < rawAmount) {
|
|
101
|
+
throw new NotEnoughFundsError(`Insufficient funds: need ${rawAmount}, but only have ${totalBalance} (wallet: ${walletBalance}, vault: ${vaultBalance})`, rawAmount, totalBalance);
|
|
97
102
|
}
|
|
98
103
|
const calls = [];
|
|
99
104
|
const maxValue = 2n ** 256n - 1n;
|
|
100
105
|
// If wallet has enough, just transfer
|
|
101
|
-
if (walletBalance >=
|
|
106
|
+
if (walletBalance >= rawAmount) {
|
|
102
107
|
calls.push({
|
|
103
108
|
to: currency,
|
|
104
109
|
data: encodeFunctionData({
|
|
105
110
|
abi: erc20Abi,
|
|
106
111
|
functionName: 'transfer',
|
|
107
|
-
args: [toAddress,
|
|
112
|
+
args: [toAddress, rawAmount],
|
|
108
113
|
}),
|
|
109
114
|
value: 0n,
|
|
110
115
|
});
|
|
111
116
|
return calls;
|
|
112
117
|
}
|
|
113
118
|
// Need to withdraw from vault - determine how much
|
|
114
|
-
const amountToWithdraw =
|
|
119
|
+
const amountToWithdraw = rawAmount - walletBalance;
|
|
115
120
|
// Add approval if needed
|
|
116
121
|
if (vaultAllowance < amountToWithdraw) {
|
|
117
122
|
calls.push({
|
|
@@ -146,7 +151,7 @@ export const prepareWithdraw = async ({ chainId, userAddress, toAddress, currenc
|
|
|
146
151
|
data: encodeFunctionData({
|
|
147
152
|
abi: erc20Abi,
|
|
148
153
|
functionName: 'transfer',
|
|
149
|
-
args: [toAddress,
|
|
154
|
+
args: [toAddress, rawAmount],
|
|
150
155
|
}),
|
|
151
156
|
value: 0n,
|
|
152
157
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-withdraw.js","sourceRoot":"","sources":["../../../../src/calls/batch/prepare-withdraw.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"prepare-withdraw.js","sourceRoot":"","sources":["../../../../src/calls/batch/prepare-withdraw.ts"],"names":[],"mappings":"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"}
|