starkfi 0.1.0 → 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.
- package/MCP.md +70 -0
- package/README.md +120 -58
- package/dist/commands/auth/login.js +2 -2
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/verify.d.ts.map +1 -1
- package/dist/commands/auth/verify.js +2 -2
- package/dist/commands/auth/verify.js.map +1 -1
- package/dist/commands/batch/batch.d.ts +3 -0
- package/dist/commands/batch/batch.d.ts.map +1 -0
- package/dist/commands/batch/batch.js +143 -0
- package/dist/commands/batch/batch.js.map +1 -0
- package/dist/commands/chain/tx-status.js +2 -2
- package/dist/commands/chain/tx-status.js.map +1 -1
- package/dist/commands/config/config.d.ts.map +1 -1
- package/dist/commands/config/config.js +14 -31
- package/dist/commands/config/config.js.map +1 -1
- package/dist/commands/lending/lending.d.ts +1 -0
- package/dist/commands/lending/lending.d.ts.map +1 -1
- package/dist/commands/lending/lending.js +187 -48
- package/dist/commands/lending/lending.js.map +1 -1
- package/dist/commands/portfolio/portfolio.d.ts +3 -0
- package/dist/commands/portfolio/portfolio.d.ts.map +1 -0
- package/dist/commands/portfolio/portfolio.js +76 -0
- package/dist/commands/portfolio/portfolio.js.map +1 -0
- package/dist/commands/staking/staking.d.ts +1 -1
- package/dist/commands/staking/staking.d.ts.map +1 -1
- package/dist/commands/staking/staking.js +142 -61
- package/dist/commands/staking/staking.js.map +1 -1
- package/dist/commands/trade/multi-swap.d.ts +3 -0
- package/dist/commands/trade/multi-swap.d.ts.map +1 -0
- package/dist/commands/trade/multi-swap.js +140 -0
- package/dist/commands/trade/multi-swap.js.map +1 -0
- package/dist/commands/trade/status.js +2 -2
- package/dist/commands/trade/status.js.map +1 -1
- package/dist/commands/trade/swap.d.ts.map +1 -1
- package/dist/commands/trade/swap.js +45 -10
- package/dist/commands/trade/swap.js.map +1 -1
- package/dist/commands/wallet/balance.d.ts.map +1 -1
- package/dist/commands/wallet/balance.js +19 -2
- package/dist/commands/wallet/balance.js.map +1 -1
- package/dist/commands/wallet/deploy.d.ts.map +1 -1
- package/dist/commands/wallet/deploy.js +2 -1
- package/dist/commands/wallet/deploy.js.map +1 -1
- package/dist/commands/wallet/send.d.ts.map +1 -1
- package/dist/commands/wallet/send.js +45 -8
- package/dist/commands/wallet/send.js.map +1 -1
- package/dist/index.js +22 -7
- package/dist/index.js.map +1 -1
- package/dist/lib/banner.d.ts +6 -0
- package/dist/lib/banner.d.ts.map +1 -0
- package/dist/lib/banner.js +78 -0
- package/dist/lib/banner.js.map +1 -0
- package/dist/lib/config.d.ts +0 -11
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +0 -20
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.d.ts +2 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +2 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/format.d.ts +43 -2
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +51 -5
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/retry.d.ts +15 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +29 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/validation.d.ts +0 -12
- package/dist/lib/validation.d.ts.map +1 -1
- package/dist/lib/validation.js +1 -23
- package/dist/lib/validation.js.map +1 -1
- package/dist/mcp/handlers/batch.d.ts +13 -0
- package/dist/mcp/handlers/batch.d.ts.map +1 -0
- package/dist/mcp/handlers/batch.js +33 -0
- package/dist/mcp/handlers/batch.js.map +1 -0
- package/dist/mcp/handlers/config.d.ts +1 -1
- package/dist/mcp/handlers/config.d.ts.map +1 -1
- package/dist/mcp/handlers/config.js +11 -12
- package/dist/mcp/handlers/config.js.map +1 -1
- package/dist/mcp/handlers/index.d.ts +3 -0
- package/dist/mcp/handlers/index.d.ts.map +1 -1
- package/dist/mcp/handlers/index.js +3 -0
- package/dist/mcp/handlers/index.js.map +1 -1
- package/dist/mcp/handlers/lending.d.ts +12 -1
- package/dist/mcp/handlers/lending.d.ts.map +1 -1
- package/dist/mcp/handlers/lending.js +67 -23
- package/dist/mcp/handlers/lending.js.map +1 -1
- package/dist/mcp/handlers/multi-swap.d.ts +27 -0
- package/dist/mcp/handlers/multi-swap.d.ts.map +1 -0
- package/dist/mcp/handlers/multi-swap.js +73 -0
- package/dist/mcp/handlers/multi-swap.js.map +1 -0
- package/dist/mcp/handlers/portfolio.d.ts +7 -0
- package/dist/mcp/handlers/portfolio.d.ts.map +1 -0
- package/dist/mcp/handlers/portfolio.js +11 -0
- package/dist/mcp/handlers/portfolio.js.map +1 -0
- package/dist/mcp/handlers/staking.d.ts +13 -1
- package/dist/mcp/handlers/staking.d.ts.map +1 -1
- package/dist/mcp/handlers/staking.js +18 -5
- package/dist/mcp/handlers/staking.js.map +1 -1
- package/dist/mcp/handlers/trade.d.ts +1 -0
- package/dist/mcp/handlers/trade.d.ts.map +1 -1
- package/dist/mcp/handlers/trade.js +23 -9
- package/dist/mcp/handlers/trade.js.map +1 -1
- package/dist/mcp/handlers/wallet.d.ts +1 -0
- package/dist/mcp/handlers/wallet.d.ts.map +1 -1
- package/dist/mcp/handlers/wallet.js +16 -1
- package/dist/mcp/handlers/wallet.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +102 -33
- package/dist/mcp/tools.js.map +1 -1
- package/dist/services/api/client.d.ts +0 -12
- package/dist/services/api/client.d.ts.map +1 -1
- package/dist/services/api/client.js +3 -8
- package/dist/services/api/client.js.map +1 -1
- package/dist/services/auth/session.d.ts +1 -7
- package/dist/services/auth/session.d.ts.map +1 -1
- package/dist/services/auth/session.js +20 -0
- package/dist/services/auth/session.js.map +1 -1
- package/dist/services/batch/batch.d.ts +36 -0
- package/dist/services/batch/batch.d.ts.map +1 -0
- package/dist/services/batch/batch.js +111 -0
- package/dist/services/batch/batch.js.map +1 -0
- package/dist/services/config/config.d.ts +4 -0
- package/dist/services/config/config.d.ts.map +1 -1
- package/dist/services/config/config.js +31 -1
- package/dist/services/config/config.js.map +1 -1
- package/dist/services/fibrous/config.d.ts +4 -0
- package/dist/services/fibrous/config.d.ts.map +1 -0
- package/dist/services/fibrous/config.js +4 -0
- package/dist/services/fibrous/config.js.map +1 -0
- package/dist/services/fibrous/health.js +1 -1
- package/dist/services/fibrous/health.js.map +1 -1
- package/dist/services/fibrous/route.d.ts +19 -6
- package/dist/services/fibrous/route.d.ts.map +1 -1
- package/dist/services/fibrous/route.js +64 -3
- package/dist/services/fibrous/route.js.map +1 -1
- package/dist/services/portfolio/portfolio.d.ts +35 -0
- package/dist/services/portfolio/portfolio.d.ts.map +1 -0
- package/dist/services/portfolio/portfolio.js +106 -0
- package/dist/services/portfolio/portfolio.js.map +1 -0
- package/dist/services/simulate/simulate.d.ts +18 -0
- package/dist/services/simulate/simulate.d.ts.map +1 -0
- package/dist/services/simulate/simulate.js +61 -0
- package/dist/services/simulate/simulate.js.map +1 -0
- package/dist/services/staking/staking.d.ts +5 -13
- package/dist/services/staking/staking.d.ts.map +1 -1
- package/dist/services/staking/staking.js +44 -52
- package/dist/services/staking/staking.js.map +1 -1
- package/dist/services/starkzap/client.d.ts.map +1 -1
- package/dist/services/starkzap/client.js +38 -18
- package/dist/services/starkzap/client.js.map +1 -1
- package/dist/services/starkzap/config.d.ts +6 -0
- package/dist/services/starkzap/config.d.ts.map +1 -0
- package/dist/services/starkzap/config.js +13 -0
- package/dist/services/starkzap/config.js.map +1 -0
- package/dist/services/tokens/balances.d.ts.map +1 -1
- package/dist/services/tokens/balances.js +26 -14
- package/dist/services/tokens/balances.js.map +1 -1
- package/dist/services/tokens/tokens.d.ts +2 -3
- package/dist/services/tokens/tokens.d.ts.map +1 -1
- package/dist/services/tokens/tokens.js +3 -8
- package/dist/services/tokens/tokens.js.map +1 -1
- package/dist/services/vesu/api.d.ts +28 -0
- package/dist/services/vesu/api.d.ts.map +1 -0
- package/dist/services/vesu/api.js +97 -0
- package/dist/services/vesu/api.js.map +1 -0
- package/dist/services/vesu/config.d.ts +9 -0
- package/dist/services/vesu/config.d.ts.map +1 -0
- package/dist/services/vesu/config.js +32 -0
- package/dist/services/vesu/config.js.map +1 -0
- package/dist/services/vesu/index.d.ts +2 -0
- package/dist/services/vesu/index.d.ts.map +1 -1
- package/dist/services/vesu/index.js +2 -0
- package/dist/services/vesu/index.js.map +1 -1
- package/dist/services/vesu/lending.d.ts +8 -1
- package/dist/services/vesu/lending.d.ts.map +1 -1
- package/dist/services/vesu/lending.js +171 -52
- package/dist/services/vesu/lending.js.map +1 -1
- package/dist/services/vesu/pools.d.ts +5 -11
- package/dist/services/vesu/pools.d.ts.map +1 -1
- package/dist/services/vesu/pools.js +11 -31
- package/dist/services/vesu/pools.js.map +1 -1
- package/package.json +88 -82
- package/skills/README.md +63 -0
- package/skills/authenticate-wallet/SKILL.md +119 -0
- package/skills/balance/SKILL.md +80 -0
- package/skills/batch/SKILL.md +118 -0
- package/skills/config/SKILL.md +144 -0
- package/skills/lending/SKILL.md +209 -0
- package/skills/multi-swap/SKILL.md +95 -0
- package/skills/portfolio/SKILL.md +82 -0
- package/skills/send/SKILL.md +82 -0
- package/skills/staking/SKILL.md +188 -0
- package/skills/trade/SKILL.md +92 -0
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { Amount, fromAddress } from "starkzap";
|
|
2
2
|
import { resolveToken } from "../tokens/tokens.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}));
|
|
3
|
+
import { StarkfiError, ErrorCode } from "../../lib/errors.js";
|
|
4
|
+
// Find a pool matching a specific token symbol from a validator's pools.
|
|
5
|
+
export function resolvePoolForToken(pools, tokenSymbol) {
|
|
6
|
+
const upper = tokenSymbol.toUpperCase();
|
|
7
|
+
const match = pools.find((p) => p.tokenSymbol.toUpperCase() === upper);
|
|
8
|
+
if (!match) {
|
|
9
|
+
const available = pools.map((p) => p.tokenSymbol).join(", ");
|
|
10
|
+
throw new StarkfiError(ErrorCode.POOL_NOT_FOUND, `No ${tokenSymbol} pool found for this validator. Available: ${available}`);
|
|
11
|
+
}
|
|
12
|
+
return match;
|
|
14
13
|
}
|
|
15
14
|
export async function getValidatorPools(sdk, validatorAddress, wallet) {
|
|
16
15
|
const pools = await sdk.getStakerPools(fromAddress(validatorAddress));
|
|
@@ -25,8 +24,8 @@ export async function getValidatorPools(sdk, validatorAddress, wallet) {
|
|
|
25
24
|
}));
|
|
26
25
|
}
|
|
27
26
|
// Smart stake: auto-detects enter vs. add_to_delegation_pool.
|
|
28
|
-
export async function stake(wallet, poolAddress, amount) {
|
|
29
|
-
const token = await
|
|
27
|
+
export async function stake(wallet, poolAddress, amount, tokenSymbol = "STRK") {
|
|
28
|
+
const token = await resolveToken(tokenSymbol);
|
|
30
29
|
const parsedAmount = Amount.parse(amount, token);
|
|
31
30
|
const tx = await wallet.stake(fromAddress(poolAddress), parsedAmount);
|
|
32
31
|
return {
|
|
@@ -37,7 +36,7 @@ export async function stake(wallet, poolAddress, amount) {
|
|
|
37
36
|
export async function claimRewards(wallet, poolAddress) {
|
|
38
37
|
const position = await wallet.getPoolPosition(fromAddress(poolAddress));
|
|
39
38
|
if (!position || position.rewards.isZero()) {
|
|
40
|
-
throw new
|
|
39
|
+
throw new StarkfiError(ErrorCode.STAKING_FAILED, "No rewards to claim for this pool.");
|
|
41
40
|
}
|
|
42
41
|
const tx = await wallet.claimPoolRewards(fromAddress(poolAddress));
|
|
43
42
|
return {
|
|
@@ -49,7 +48,7 @@ export async function claimRewards(wallet, poolAddress) {
|
|
|
49
48
|
export async function compoundRewards(wallet, poolAddress) {
|
|
50
49
|
const position = await wallet.getPoolPosition(fromAddress(poolAddress));
|
|
51
50
|
if (!position || position.rewards.isZero()) {
|
|
52
|
-
throw new
|
|
51
|
+
throw new StarkfiError(ErrorCode.STAKING_FAILED, "No rewards to compound for this pool.");
|
|
53
52
|
}
|
|
54
53
|
const compounded = position.rewards.toFormatted(true);
|
|
55
54
|
const tx = await wallet
|
|
@@ -65,8 +64,8 @@ export async function compoundRewards(wallet, poolAddress) {
|
|
|
65
64
|
};
|
|
66
65
|
}
|
|
67
66
|
// Step 1 of 2-step exit: declare intent, then wait for cooldown.
|
|
68
|
-
export async function exitPoolIntent(wallet, poolAddress, amount) {
|
|
69
|
-
const token = await
|
|
67
|
+
export async function exitPoolIntent(wallet, poolAddress, amount, tokenSymbol = "STRK") {
|
|
68
|
+
const token = await resolveToken(tokenSymbol);
|
|
70
69
|
const parsedAmount = Amount.parse(amount, token);
|
|
71
70
|
const tx = await wallet.exitPoolIntent(fromAddress(poolAddress), parsedAmount);
|
|
72
71
|
return {
|
|
@@ -78,13 +77,13 @@ export async function exitPoolIntent(wallet, poolAddress, amount) {
|
|
|
78
77
|
export async function exitPool(wallet, poolAddress) {
|
|
79
78
|
const position = await wallet.getPoolPosition(fromAddress(poolAddress));
|
|
80
79
|
if (!position) {
|
|
81
|
-
throw new
|
|
80
|
+
throw new StarkfiError(ErrorCode.STAKING_FAILED, "Not a member of this pool.");
|
|
82
81
|
}
|
|
83
82
|
if (position.unpooling.isZero()) {
|
|
84
|
-
throw new
|
|
83
|
+
throw new StarkfiError(ErrorCode.EXIT_NOT_READY, "No exit intent declared. Call 'unstake intent' first.");
|
|
85
84
|
}
|
|
86
85
|
if (position.unpoolTime && new Date() < position.unpoolTime) {
|
|
87
|
-
throw new
|
|
86
|
+
throw new StarkfiError(ErrorCode.EXIT_NOT_READY, `Cooldown period is still active. Please wait until ${position.unpoolTime.toLocaleString()}`);
|
|
88
87
|
}
|
|
89
88
|
const tx = await wallet.exitPool(fromAddress(poolAddress));
|
|
90
89
|
return {
|
|
@@ -105,13 +104,20 @@ export async function getPosition(wallet, poolAddress) {
|
|
|
105
104
|
commissionPercent: position.commissionPercent,
|
|
106
105
|
};
|
|
107
106
|
}
|
|
108
|
-
export async function isPoolMember(wallet, poolAddress) {
|
|
109
|
-
return wallet.isPoolMember(fromAddress(poolAddress));
|
|
110
|
-
}
|
|
111
107
|
// Scan all known validators & pools to build a consolidated staking dashboard.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const
|
|
108
|
+
// If targetValidator is provided, it will strictly scan that validator's pools.
|
|
109
|
+
export async function getStakingOverview(sdk, wallet, network, address, targetValidator) {
|
|
110
|
+
const { getValidators, findValidator } = await import("./validators.js");
|
|
111
|
+
let validators = getValidators(network);
|
|
112
|
+
if (targetValidator) {
|
|
113
|
+
const found = findValidator(targetValidator, network);
|
|
114
|
+
if (found) {
|
|
115
|
+
validators = [found];
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
throw new StarkfiError(ErrorCode.VALIDATOR_NOT_FOUND, `Validator '${targetValidator}' not found`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
115
121
|
// Discover all pools across all validators concurrently.
|
|
116
122
|
const validatorPools = await Promise.all(validators.map(async (v) => {
|
|
117
123
|
const pools = await sdk.getStakerPools(v.stakerAddress);
|
|
@@ -126,6 +132,7 @@ export async function getStakingOverview(sdk, wallet, network, address) {
|
|
|
126
132
|
return {
|
|
127
133
|
validator,
|
|
128
134
|
pool: p.poolContract.toString(),
|
|
135
|
+
tokenSymbol: p.token.symbol,
|
|
129
136
|
staked: position.staked,
|
|
130
137
|
rewards: position.rewards,
|
|
131
138
|
total: position.total,
|
|
@@ -135,35 +142,20 @@ export async function getStakingOverview(sdk, wallet, network, address) {
|
|
|
135
142
|
};
|
|
136
143
|
}));
|
|
137
144
|
const activePositions = results.filter((r) => r !== null);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return {
|
|
150
|
-
validator: p.validator,
|
|
151
|
-
pool: p.pool,
|
|
152
|
-
staked: p.staked.toFormatted(true),
|
|
153
|
-
rewards: p.rewards.toFormatted(true),
|
|
154
|
-
total: p.total.toFormatted(true),
|
|
155
|
-
unpooling: p.unpooling.toFormatted(true),
|
|
156
|
-
cooldownEndsAt: p.unpoolTime ? p.unpoolTime.toISOString() : null,
|
|
157
|
-
commission: `${p.commissionPercent}%`,
|
|
158
|
-
};
|
|
159
|
-
});
|
|
145
|
+
const positions = activePositions.map((p) => ({
|
|
146
|
+
validator: p.validator,
|
|
147
|
+
pool: p.pool,
|
|
148
|
+
token: p.tokenSymbol,
|
|
149
|
+
staked: p.staked.toFormatted(true),
|
|
150
|
+
rewards: p.rewards.toFormatted(true),
|
|
151
|
+
total: p.total.toFormatted(true),
|
|
152
|
+
unpooling: p.unpooling.toFormatted(true),
|
|
153
|
+
cooldownEndsAt: p.unpoolTime ? p.unpoolTime.toISOString() : null,
|
|
154
|
+
commission: `${p.commissionPercent}%`,
|
|
155
|
+
}));
|
|
160
156
|
return {
|
|
161
157
|
network,
|
|
162
158
|
address,
|
|
163
|
-
totalStaked: totalStaked.toFormatted(true),
|
|
164
|
-
totalRewards: totalRewards.toFormatted(true),
|
|
165
|
-
totalValue: totalValue.toFormatted(true),
|
|
166
|
-
totalUnpooling: totalUnpooling.toFormatted(true),
|
|
167
159
|
positions,
|
|
168
160
|
};
|
|
169
161
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staking.js","sourceRoot":"","sources":["../../../src/services/staking/staking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"staking.js","sourceRoot":"","sources":["../../../src/services/staking/staking.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/services/starkzap/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/services/starkzap/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAkC,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AASlD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAGpC,wBAAgB,oBAAoB,CACnC,WAAW,EAAE,OAAO,EACpB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC1B;IACF,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;CACxB,CAkBA;AAkCD,wBAAgB,SAAS,CACxB,OAAO,GAAE,SAAS,GAAG,SAAqB,EAC1C,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,UAAQ,EACtB,YAAY,CAAC,EAAE,MAAM,GACnB,QAAQ,CAWV;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBpF;AAED,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,QAAQ,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAiB9E"}
|
|
@@ -1,19 +1,41 @@
|
|
|
1
|
-
import { StarkZap,
|
|
1
|
+
import { StarkZap, PrivySigner, ArgentXV050Preset } from "starkzap";
|
|
2
2
|
import { ConfigService } from "../config/config.js";
|
|
3
|
-
import { AVNU_PAYMASTER_URL, AVNU_PAYMASTER_SEPOLIA_URL, GAS_TOKEN_ADDRESSES, } from "
|
|
4
|
-
//
|
|
3
|
+
import { AVNU_PAYMASTER_URL, AVNU_PAYMASTER_SEPOLIA_URL, GAS_TOKEN_ADDRESSES, DEFAULT_GAS_TOKEN, } from "./config.js";
|
|
4
|
+
// Resolve fee mode: gasfree (developer pays) vs gasless (user pays in ERC-20).
|
|
5
5
|
export function resolveFeeModeConfig(gasfreeMode, gasToken) {
|
|
6
6
|
if (gasfreeMode) {
|
|
7
7
|
return { feeMode: "sponsored", gasTokenAddress: undefined, needsPaymaster: true };
|
|
8
8
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return { feeMode: "user_pays", gasTokenAddress, needsPaymaster: true };
|
|
14
|
-
}
|
|
9
|
+
const resolvedToken = gasToken ?? DEFAULT_GAS_TOKEN;
|
|
10
|
+
const gasTokenAddress = GAS_TOKEN_ADDRESSES[resolvedToken.toUpperCase()];
|
|
11
|
+
if (gasTokenAddress) {
|
|
12
|
+
return { feeMode: "sponsored", gasTokenAddress, needsPaymaster: true };
|
|
15
13
|
}
|
|
16
|
-
|
|
14
|
+
// Fallback
|
|
15
|
+
return {
|
|
16
|
+
feeMode: "sponsored",
|
|
17
|
+
gasTokenAddress: GAS_TOKEN_ADDRESSES["STRK"],
|
|
18
|
+
needsPaymaster: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// Patch paymaster feeMode: 'sponsored' → 'default' with gasToken for gasless mode.
|
|
22
|
+
function patchGaslessMode(wallet, gasTokenAddress) {
|
|
23
|
+
const account = wallet.getAccount();
|
|
24
|
+
// Defensive guard — if StarkZap SDK changes the internal method name, fail gracefully
|
|
25
|
+
const exec = account.executePaymasterTransaction;
|
|
26
|
+
if (typeof exec !== "function") {
|
|
27
|
+
console.warn("[StarkFi] Cannot patch gasless mode — executePaymasterTransaction not found on account. " +
|
|
28
|
+
"Gas will use default sponsored mode. Consider updating StarkZap SDK.");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const originalExecutePaymaster = exec.bind(account);
|
|
32
|
+
account.executePaymasterTransaction = async function (calls, details, ...rest) {
|
|
33
|
+
const patchedDetails = {
|
|
34
|
+
...details,
|
|
35
|
+
feeMode: { mode: "default", gasToken: gasTokenAddress },
|
|
36
|
+
};
|
|
37
|
+
return originalExecutePaymaster(calls, patchedDetails, ...rest);
|
|
38
|
+
};
|
|
17
39
|
}
|
|
18
40
|
let sdkInstance = null;
|
|
19
41
|
export function createSDK(network = "mainnet", rpcUrl, needsPaymaster = false, paymasterUrl) {
|
|
@@ -31,23 +53,21 @@ export async function connectWallet(sdk, session) {
|
|
|
31
53
|
const configService = ConfigService.getInstance();
|
|
32
54
|
const gasfreeMode = configService.get("gasfreeMode") === true;
|
|
33
55
|
const gasToken = configService.get("gasToken");
|
|
34
|
-
const { feeMode } = resolveFeeModeConfig(gasfreeMode, gasToken);
|
|
35
|
-
if (session.type === "local") {
|
|
36
|
-
return sdk.connectWallet({
|
|
37
|
-
account: { signer: new StarkSigner(session.privateKey) },
|
|
38
|
-
feeMode,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
56
|
+
const { feeMode, gasTokenAddress } = resolveFeeModeConfig(gasfreeMode, gasToken);
|
|
41
57
|
const signer = new PrivySigner({
|
|
42
58
|
walletId: session.walletId,
|
|
43
59
|
publicKey: session.publicKey,
|
|
44
60
|
serverUrl: session.serverUrl,
|
|
45
61
|
headers: { Authorization: `Bearer ${session.token}` },
|
|
46
62
|
});
|
|
47
|
-
|
|
63
|
+
const wallet = await sdk.connectWallet({
|
|
48
64
|
account: { signer, accountClass: ArgentXV050Preset },
|
|
49
65
|
feeMode,
|
|
50
66
|
});
|
|
67
|
+
if (!gasfreeMode && gasTokenAddress) {
|
|
68
|
+
patchGaslessMode(wallet, gasTokenAddress);
|
|
69
|
+
}
|
|
70
|
+
return wallet;
|
|
51
71
|
}
|
|
52
72
|
export async function initSDKAndWallet(session) {
|
|
53
73
|
const configService = ConfigService.getInstance();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/services/starkzap/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/services/starkzap/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const AVNU_PAYMASTER_URL = "https://starknet.paymaster.avnu.fi";
|
|
2
|
+
export declare const AVNU_PAYMASTER_SEPOLIA_URL = "https://sepolia.paymaster.avnu.fi";
|
|
3
|
+
export declare const DEFAULT_GAS_TOKEN = "STRK";
|
|
4
|
+
export declare const GAS_TOKEN_ADDRESSES: Record<string, string>;
|
|
5
|
+
export declare const GASLESS_SUPPORTED_TOKENS: string[];
|
|
6
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/services/starkzap/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,uCAAuC,CAAC;AACvE,eAAO,MAAM,0BAA0B,sCAAsC,CAAC;AAE9E,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAGxC,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMtD,CAAC;AAEF,eAAO,MAAM,wBAAwB,UAAmC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const AVNU_PAYMASTER_URL = "https://starknet.paymaster.avnu.fi";
|
|
2
|
+
export const AVNU_PAYMASTER_SEPOLIA_URL = "https://sepolia.paymaster.avnu.fi";
|
|
3
|
+
export const DEFAULT_GAS_TOKEN = "STRK";
|
|
4
|
+
// Tokens accepted by Paymaster for Gasless mode.
|
|
5
|
+
export const GAS_TOKEN_ADDRESSES = {
|
|
6
|
+
ETH: "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
|
|
7
|
+
STRK: "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",
|
|
8
|
+
USDC: "0x033068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb",
|
|
9
|
+
USDT: "0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8",
|
|
10
|
+
DAI: "0x05574eb6b8789a91466f902c380d978e472db68170ff82a5b650b95a58ddf4ad",
|
|
11
|
+
};
|
|
12
|
+
export const GASLESS_SUPPORTED_TOKENS = Object.keys(GAS_TOKEN_ADDRESSES);
|
|
13
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/services/starkzap/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,oCAAoC,CAAC;AACvE,MAAM,CAAC,MAAM,0BAA0B,GAAG,mCAAmC,CAAC;AAE9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC,iDAAiD;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IAC1D,GAAG,EAAE,oEAAoE;IACzE,IAAI,EAAE,oEAAoE;IAC1E,IAAI,EAAE,oEAAoE;IAC1E,IAAI,EAAE,oEAAoE;IAC1E,GAAG,EAAE,oEAAoE;CACzE,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balances.d.ts","sourceRoot":"","sources":["../../../src/services/tokens/balances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhD,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"balances.d.ts","sourceRoot":"","sources":["../../../src/services/tokens/balances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhD,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAsClF"}
|
|
@@ -2,22 +2,34 @@ import { fetchTokens } from "./tokens.js";
|
|
|
2
2
|
export async function getBalances(wallet) {
|
|
3
3
|
const tokens = await fetchTokens();
|
|
4
4
|
const results = [];
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
// Process tokens concurrently with a sliding window to avoid overwhelming the RPC node.
|
|
6
|
+
// This prevents rate-limiting issues while maintaining maximum throughput,
|
|
7
|
+
// unlike chunking which gets bottlenecked by the slowest request in each chunk.
|
|
8
|
+
const CONCURRENCY_LIMIT = 10;
|
|
9
|
+
let index = 0;
|
|
10
|
+
const worker = async () => {
|
|
11
|
+
while (index < tokens.length) {
|
|
12
|
+
const current = index++;
|
|
13
|
+
const token = tokens[current];
|
|
14
|
+
if (!token)
|
|
15
|
+
continue;
|
|
16
|
+
try {
|
|
17
|
+
const amount = await wallet.balanceOf(token);
|
|
18
|
+
if (amount.isPositive()) {
|
|
19
|
+
results.push({
|
|
20
|
+
symbol: token.symbol,
|
|
21
|
+
name: token.name,
|
|
22
|
+
balance: amount.toUnit(),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Silently fail for individual token checks that might error due to contract issues.
|
|
14
28
|
}
|
|
15
29
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
});
|
|
20
|
-
await Promise.all(balancePromises);
|
|
30
|
+
};
|
|
31
|
+
const workers = Array.from({ length: Math.min(CONCURRENCY_LIMIT, tokens.length) }, () => worker());
|
|
32
|
+
await Promise.all(workers);
|
|
21
33
|
return results;
|
|
22
34
|
}
|
|
23
35
|
//# sourceMappingURL=balances.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balances.js","sourceRoot":"","sources":["../../../src/services/tokens/balances.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAuB;IACxD,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;IACnC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,MAAM,
|
|
1
|
+
{"version":3,"file":"balances.js","sourceRoot":"","sources":["../../../src/services/tokens/balances.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAuB;IACxD,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;IACnC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,wFAAwF;IACxF,2EAA2E;IAC3E,gFAAgF;IAChF,MAAM,iBAAiB,GAAG,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACzB,OAAO,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC;wBACZ,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;qBACxB,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,qFAAqF;YACtF,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CACvF,MAAM,EAAE,CACR,CAAC;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type Token } from "starkzap";
|
|
2
|
-
export declare function fetchTokens():
|
|
3
|
-
export declare function resolveToken(symbol: string):
|
|
4
|
-
export declare function resolveTokenByAddress(address: string): Promise<Token | null>;
|
|
2
|
+
export declare function fetchTokens(): Token[];
|
|
3
|
+
export declare function resolveToken(symbol: string): Token;
|
|
5
4
|
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../src/services/tokens/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAG3D,
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../src/services/tokens/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAG3D,wBAAgB,WAAW,IAAI,KAAK,EAAE,CAGrC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAiBlD"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { ChainId, getPresets } from "starkzap";
|
|
2
2
|
import { ErrorCode, StarkfiError } from "../../lib/errors.js";
|
|
3
|
-
export
|
|
4
|
-
// getPresets returns a Record<string, Token>. We convert it to an array.
|
|
3
|
+
export function fetchTokens() {
|
|
5
4
|
const presetTokens = getPresets(ChainId.MAINNET);
|
|
6
5
|
return Object.values(presetTokens);
|
|
7
6
|
}
|
|
8
|
-
export
|
|
9
|
-
const tokens =
|
|
7
|
+
export function resolveToken(symbol) {
|
|
8
|
+
const tokens = fetchTokens();
|
|
10
9
|
const upperSymbol = symbol.toUpperCase();
|
|
11
10
|
const token = tokens.find((t) => t.symbol.toUpperCase() === upperSymbol);
|
|
12
11
|
if (!token) {
|
|
@@ -17,8 +16,4 @@ export async function resolveToken(symbol) {
|
|
|
17
16
|
}
|
|
18
17
|
return token;
|
|
19
18
|
}
|
|
20
|
-
export async function resolveTokenByAddress(address) {
|
|
21
|
-
const tokens = await fetchTokens();
|
|
22
|
-
return tokens.find((t) => t.address.toLowerCase() === address.toLowerCase()) ?? null;
|
|
23
|
-
}
|
|
24
19
|
//# sourceMappingURL=tokens.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../src/services/tokens/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../src/services/tokens/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,UAAU,WAAW;IAC1B,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IAC1C,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,CAAC;IAEzE,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,YAAY,CACrB,SAAS,CAAC,cAAc,EACxB,oBAAoB,MAAM,uBAAuB,MAAM;aACrD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;aACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CACjB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface VesuAsset {
|
|
2
|
+
address: string;
|
|
3
|
+
name: string;
|
|
4
|
+
symbol: string;
|
|
5
|
+
decimals: number;
|
|
6
|
+
canBeBorrowed: boolean;
|
|
7
|
+
vTokenAddress: string;
|
|
8
|
+
supplyApy: string;
|
|
9
|
+
borrowApr: string;
|
|
10
|
+
}
|
|
11
|
+
export interface VesuPair {
|
|
12
|
+
collateralAddress: string;
|
|
13
|
+
collateralSymbol: string;
|
|
14
|
+
debtAddress: string;
|
|
15
|
+
debtSymbol: string;
|
|
16
|
+
maxLTV: number;
|
|
17
|
+
}
|
|
18
|
+
export interface VesuPoolData {
|
|
19
|
+
address: string;
|
|
20
|
+
name: string;
|
|
21
|
+
protocolVersion: string;
|
|
22
|
+
isDeprecated: boolean;
|
|
23
|
+
assets: VesuAsset[];
|
|
24
|
+
pairs: VesuPair[];
|
|
25
|
+
}
|
|
26
|
+
export declare function fetchPool(address: string): Promise<VesuPoolData>;
|
|
27
|
+
export declare function fetchAllPools(): Promise<VesuPoolData[]>;
|
|
28
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/services/vesu/api.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB;AAmFD,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAwDtE;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAW7D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { VESU_API_BASE, V2_POOLS } from "./config.js";
|
|
2
|
+
import { ErrorCode, StarkfiError } from "../../lib/errors.js";
|
|
3
|
+
import { withRetry } from "../../lib/retry.js";
|
|
4
|
+
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
5
|
+
const REQUEST_TIMEOUT_MS = 15_000;
|
|
6
|
+
const poolCache = new Map();
|
|
7
|
+
function getCached(address) {
|
|
8
|
+
const entry = poolCache.get(address);
|
|
9
|
+
if (!entry)
|
|
10
|
+
return null;
|
|
11
|
+
if (Date.now() - entry.fetchedAt > CACHE_TTL_MS) {
|
|
12
|
+
poolCache.delete(address);
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
return entry.data;
|
|
16
|
+
}
|
|
17
|
+
function parseDecimalValue(raw) {
|
|
18
|
+
return Number(BigInt(raw.value)) / 10 ** raw.decimals;
|
|
19
|
+
}
|
|
20
|
+
function formatPercent(decimal) {
|
|
21
|
+
return `${(decimal * 100).toFixed(2)}%`;
|
|
22
|
+
}
|
|
23
|
+
function parseAsset(raw) {
|
|
24
|
+
return {
|
|
25
|
+
address: raw.address,
|
|
26
|
+
name: raw.name,
|
|
27
|
+
symbol: raw.symbol,
|
|
28
|
+
decimals: raw.decimals,
|
|
29
|
+
canBeBorrowed: raw.stats.canBeBorrowed,
|
|
30
|
+
vTokenAddress: raw.vToken.address,
|
|
31
|
+
supplyApy: formatPercent(parseDecimalValue(raw.stats.supplyApy)),
|
|
32
|
+
borrowApr: formatPercent(parseDecimalValue(raw.stats.borrowApr)),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function parsePair(raw, assetMap) {
|
|
36
|
+
return {
|
|
37
|
+
collateralAddress: raw.collateralAssetAddress,
|
|
38
|
+
collateralSymbol: assetMap.get(raw.collateralAssetAddress) ?? "UNKNOWN",
|
|
39
|
+
debtAddress: raw.debtAssetAddress,
|
|
40
|
+
debtSymbol: assetMap.get(raw.debtAssetAddress) ?? "UNKNOWN",
|
|
41
|
+
maxLTV: parseDecimalValue(raw.maxLTV),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export async function fetchPool(address) {
|
|
45
|
+
const cached = getCached(address);
|
|
46
|
+
if (cached)
|
|
47
|
+
return cached;
|
|
48
|
+
const controller = new AbortController();
|
|
49
|
+
const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
50
|
+
try {
|
|
51
|
+
const url = `${VESU_API_BASE}/pools/${address}`;
|
|
52
|
+
const res = await withRetry(() => fetch(url, { signal: controller.signal }), {
|
|
53
|
+
retryOnCodes: [ErrorCode.NETWORK_ERROR],
|
|
54
|
+
});
|
|
55
|
+
if (!res.ok) {
|
|
56
|
+
throw new StarkfiError(ErrorCode.NETWORK_ERROR, `Vesu API returned ${res.status} for pool ${address}`);
|
|
57
|
+
}
|
|
58
|
+
const json = (await res.json());
|
|
59
|
+
const raw = json.data;
|
|
60
|
+
const assetMap = new Map();
|
|
61
|
+
for (const a of raw.assets) {
|
|
62
|
+
assetMap.set(a.address, a.symbol);
|
|
63
|
+
}
|
|
64
|
+
const pool = {
|
|
65
|
+
address: raw.id,
|
|
66
|
+
name: raw.name,
|
|
67
|
+
protocolVersion: raw.protocolVersion,
|
|
68
|
+
isDeprecated: raw.isDeprecated,
|
|
69
|
+
assets: raw.assets.map(parseAsset),
|
|
70
|
+
pairs: raw.pairs.map((p) => parsePair(p, assetMap)),
|
|
71
|
+
};
|
|
72
|
+
poolCache.set(address, { data: pool, fetchedAt: Date.now() });
|
|
73
|
+
return pool;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (error instanceof StarkfiError)
|
|
77
|
+
throw error;
|
|
78
|
+
if (error instanceof DOMException && error.name === "AbortError") {
|
|
79
|
+
throw new StarkfiError(ErrorCode.NETWORK_ERROR, `Vesu API request timed out for pool ${address}`);
|
|
80
|
+
}
|
|
81
|
+
throw new StarkfiError(ErrorCode.NETWORK_ERROR, `Failed to fetch pool data from Vesu API: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export async function fetchAllPools() {
|
|
88
|
+
const results = await Promise.allSettled(V2_POOLS.map((p) => fetchPool(p.address)));
|
|
89
|
+
const pools = [];
|
|
90
|
+
for (const result of results) {
|
|
91
|
+
if (result.status === "fulfilled") {
|
|
92
|
+
pools.push(result.value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return pools;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/services/vesu/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const VESU_API_BASE = "https://api.vesu.xyz";
|
|
2
|
+
export declare const POOL_FACTORY_ADDRESS = "0x03760f903a37948f97302736f89ce30290e45f441559325026842b7a6fb388c0";
|
|
3
|
+
export interface PoolEntry {
|
|
4
|
+
name: string;
|
|
5
|
+
address: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const V2_POOLS: readonly PoolEntry[];
|
|
8
|
+
export declare const DENOMINATION_ASSETS = 1;
|
|
9
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/services/vesu/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,yBAAyB,CAAC;AAEpD,eAAO,MAAM,oBAAoB,uEACoC,CAAC;AAEtE,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAGD,eAAO,MAAM,QAAQ,EAAE,SAAS,SAAS,EAyB/B,CAAC;AAGX,eAAO,MAAM,mBAAmB,IAAI,CAAC"}
|