@gearbox-protocol/sdk 13.1.0-next.1 → 13.1.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/dist/cjs/dev/AccountOpener.js +5 -45
- package/dist/cjs/dev/index.js +8 -0
- package/dist/cjs/dev/isOutOfSyncError.js +56 -0
- package/dist/cjs/dev/isRateLimitError.js +80 -0
- package/dist/cjs/dev/isTransientError.js +83 -0
- package/dist/cjs/dev/providers.js +1 -1
- package/dist/cjs/dev/resilientTransport.js +104 -0
- package/dist/cjs/plugins/zappers/ZappersPlugin.js +144 -0
- package/dist/cjs/{sdk/market/ZapperRegister.js → plugins/zappers/extraZappers.js} +6 -110
- package/dist/cjs/plugins/zappers/index.js +26 -0
- package/dist/cjs/plugins/zappers/package.json +1 -0
- package/dist/cjs/sdk/accounts/AbstractCreditAccountsService.js +104 -462
- package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +5 -16
- package/dist/cjs/sdk/base/ChainContractsRegister.js +1 -1
- package/dist/cjs/sdk/base/TokensMeta.js +32 -255
- package/dist/cjs/sdk/base/index.js +0 -2
- package/dist/cjs/sdk/chain/chains.js +5 -6
- package/dist/cjs/sdk/constants/index.js +2 -0
- package/dist/cjs/sdk/{base/token-types.js → constants/phantom-tokens.js} +3 -9
- package/dist/cjs/sdk/market/MarketRegister.js +2 -2
- package/dist/cjs/sdk/market/MarketSuite.js +0 -6
- package/dist/cjs/sdk/market/index.js +1 -3
- package/dist/cjs/sdk/market/pool/PoolSuite.js +0 -3
- package/dist/cjs/sdk/market/pool/PoolV310Contract.js +2 -17
- package/dist/cjs/sdk/market/pool/index.js +0 -4
- package/dist/cjs/sdk/pools/AbstractPoolService.js +137 -0
- package/dist/cjs/{abi/iStateSerializer.js → sdk/pools/PoolServiceV310.js} +8 -14
- package/dist/cjs/sdk/pools/createPoolService.js +35 -0
- package/dist/cjs/sdk/pools/index.js +4 -2
- package/dist/cjs/sdk/utils/AddressMap.js +1 -1
- package/dist/cjs/sdk/utils/viem/sendRawTx.js +0 -16
- package/dist/esm/dev/AccountOpener.js +6 -47
- package/dist/esm/dev/index.js +4 -0
- package/dist/esm/dev/isOutOfSyncError.js +32 -0
- package/dist/esm/dev/isRateLimitError.js +56 -0
- package/dist/esm/dev/isTransientError.js +59 -0
- package/dist/esm/dev/providers.js +1 -1
- package/dist/esm/dev/resilientTransport.js +79 -0
- package/dist/esm/plugins/zappers/ZappersPlugin.js +126 -0
- package/dist/esm/{sdk/market/ZapperRegister.js → plugins/zappers/extraZappers.js} +2 -109
- package/dist/esm/plugins/zappers/index.js +3 -0
- package/dist/esm/plugins/zappers/package.json +1 -0
- package/dist/esm/sdk/accounts/AbstractCreditAccountsService.js +104 -462
- package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +5 -16
- package/dist/esm/sdk/base/ChainContractsRegister.js +1 -1
- package/dist/esm/sdk/base/TokensMeta.js +32 -261
- package/dist/esm/sdk/base/index.js +0 -1
- package/dist/esm/sdk/chain/chains.js +5 -6
- package/dist/esm/sdk/constants/index.js +1 -0
- package/dist/esm/sdk/{base/token-types.js → constants/phantom-tokens.js} +0 -4
- package/dist/esm/sdk/market/MarketRegister.js +2 -2
- package/dist/esm/sdk/market/MarketSuite.js +0 -6
- package/dist/esm/sdk/market/index.js +0 -1
- package/dist/esm/sdk/market/pool/PoolSuite.js +0 -3
- package/dist/esm/sdk/market/pool/PoolV310Contract.js +2 -17
- package/dist/esm/sdk/market/pool/index.js +0 -2
- package/dist/esm/sdk/pools/AbstractPoolService.js +113 -0
- package/dist/esm/sdk/pools/PoolServiceV310.js +6 -0
- package/dist/esm/sdk/pools/createPoolService.js +11 -0
- package/dist/esm/sdk/pools/index.js +2 -1
- package/dist/esm/sdk/utils/AddressMap.js +1 -1
- package/dist/esm/sdk/utils/viem/sendRawTx.js +1 -19
- package/dist/types/dev/index.d.ts +4 -0
- package/dist/types/dev/isOutOfSyncError.d.ts +4 -0
- package/dist/types/dev/isRateLimitError.d.ts +4 -0
- package/dist/types/dev/isTransientError.d.ts +4 -0
- package/dist/types/dev/resilientTransport.d.ts +19 -0
- package/dist/types/plugins/zappers/ZappersPlugin.d.ts +18 -0
- package/dist/types/plugins/zappers/extraZappers.d.ts +6 -0
- package/dist/types/plugins/zappers/index.d.ts +3 -0
- package/dist/types/plugins/zappers/types.d.ts +12 -0
- package/dist/types/sdk/accounts/AbstractCreditAccountsService.d.ts +27 -123
- package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +1 -1
- package/dist/types/sdk/accounts/types.d.ts +8 -108
- package/dist/types/sdk/base/TokensMeta.d.ts +18 -34
- package/dist/types/sdk/base/index.d.ts +0 -1
- package/dist/types/sdk/base/types.d.ts +1 -0
- package/dist/types/sdk/chain/chains.d.ts +1 -1
- package/dist/types/sdk/constants/index.d.ts +1 -0
- package/dist/types/sdk/constants/phantom-tokens.d.ts +2 -0
- package/dist/types/sdk/market/MarketRegister.d.ts +2 -2
- package/dist/types/sdk/market/MarketSuite.d.ts +0 -3
- package/dist/types/sdk/market/index.d.ts +0 -1
- package/dist/types/sdk/market/pool/PoolSuite.d.ts +0 -2
- package/dist/types/sdk/market/pool/PoolV310Contract.d.ts +2 -6
- package/dist/types/sdk/market/pool/index.d.ts +0 -2
- package/dist/types/sdk/pools/AbstractPoolService.d.ts +9 -0
- package/dist/types/sdk/pools/PoolServiceV310.d.ts +4 -0
- package/dist/types/sdk/pools/createPoolService.d.ts +3 -0
- package/dist/types/sdk/pools/index.d.ts +2 -1
- package/dist/types/sdk/pools/types.d.ts +63 -84
- package/dist/types/sdk/utils/AddressMap.d.ts +1 -1
- package/dist/types/sdk/utils/viem/sendRawTx.d.ts +1 -5
- package/package.json +6 -5
- package/dist/cjs/abi/310/iSecuritizeDegenNFT.js +0 -263
- package/dist/cjs/abi/310/iSecuritizeKYCFactory.js +0 -278
- package/dist/cjs/sdk/market/pool/SecuritizeKYCFactory.js +0 -97
- package/dist/cjs/sdk/pools/PoolService.js +0 -391
- package/dist/esm/abi/310/iSecuritizeDegenNFT.js +0 -239
- package/dist/esm/abi/310/iSecuritizeKYCFactory.js +0 -254
- package/dist/esm/abi/iStateSerializer.js +0 -12
- package/dist/esm/sdk/market/pool/SecuritizeKYCFactory.js +0 -73
- package/dist/esm/sdk/pools/PoolService.js +0 -371
- package/dist/types/abi/310/iSecuritizeDegenNFT.d.ts +0 -324
- package/dist/types/abi/310/iSecuritizeKYCFactory.d.ts +0 -322
- package/dist/types/abi/iStateSerializer.d.ts +0 -11
- package/dist/types/sdk/base/token-types.d.ts +0 -33
- package/dist/types/sdk/market/ZapperRegister.d.ts +0 -17
- package/dist/types/sdk/market/pool/SecuritizeKYCFactory.d.ts +0 -345
- package/dist/types/sdk/market/types.d.ts +0 -10
- package/dist/types/sdk/pools/PoolService.d.ts +0 -14
- /package/dist/cjs/{sdk/market → plugins/zappers}/types.js +0 -0
- /package/dist/esm/{sdk/market → plugins/zappers}/types.js +0 -0
|
@@ -52,7 +52,6 @@ class AccountOpener extends import_sdk.SDKConstruct {
|
|
|
52
52
|
#minDebtMultiplier;
|
|
53
53
|
#allowMint;
|
|
54
54
|
#leverageDelta;
|
|
55
|
-
#poolService;
|
|
56
55
|
constructor(service, options_ = {}) {
|
|
57
56
|
super(service.sdk);
|
|
58
57
|
const {
|
|
@@ -78,7 +77,6 @@ class AccountOpener extends import_sdk.SDKConstruct {
|
|
|
78
77
|
this.#poolDepositMultiplier = BigInt(poolDepositMultiplier);
|
|
79
78
|
this.#minDebtMultiplier = BigInt(minDebtMultiplier);
|
|
80
79
|
this.#leverageDelta = BigInt(leverageDelta);
|
|
81
|
-
this.#poolService = new import_sdk.PoolService(service.sdk);
|
|
82
80
|
this.#logger?.info(
|
|
83
81
|
{
|
|
84
82
|
borrower: (0, import_accounts.privateKeyToAccount)(this.borrowerKey).address,
|
|
@@ -116,10 +114,6 @@ class AccountOpener extends import_sdk.SDKConstruct {
|
|
|
116
114
|
},
|
|
117
115
|
"opening credit accounts"
|
|
118
116
|
);
|
|
119
|
-
await Promise.all([
|
|
120
|
-
this.sdk.tokensMeta.loadTokenData(),
|
|
121
|
-
this.sdk.marketRegister.loadZappers()
|
|
122
|
-
]);
|
|
123
117
|
let deposits = [];
|
|
124
118
|
if (depositIntoPools) {
|
|
125
119
|
try {
|
|
@@ -471,34 +465,9 @@ class AccountOpener extends import_sdk.SDKConstruct {
|
|
|
471
465
|
this.#logger?.debug(
|
|
472
466
|
`depositor balance in underlying: ${this.sdk.tokensMeta.formatBN(pool.underlying, allowance, { symbol: true })}`
|
|
473
467
|
);
|
|
474
|
-
const tokensOut = this.#poolService.getDepositTokensOut(
|
|
475
|
-
address,
|
|
476
|
-
underlying
|
|
477
|
-
);
|
|
478
|
-
this.#logger?.debug(
|
|
479
|
-
{ tokensOut: tokensOut.map((t) => this.labelAddress(t)) },
|
|
480
|
-
"deposit tokens out"
|
|
481
|
-
);
|
|
482
|
-
if (tokensOut.length === 0) {
|
|
483
|
-
throw new Error(`no tokens out found for pool ${poolName}`);
|
|
484
|
-
}
|
|
485
|
-
const tokenOut = tokensOut[0];
|
|
486
|
-
const metadata = this.#poolService.getDepositMetadata(
|
|
487
|
-
address,
|
|
488
|
-
underlying,
|
|
489
|
-
tokenOut
|
|
490
|
-
);
|
|
491
|
-
this.logger?.debug(
|
|
492
|
-
{
|
|
493
|
-
underlying: this.labelAddress(underlying),
|
|
494
|
-
tokenOut: this.labelAddress(tokenOut),
|
|
495
|
-
...metadata
|
|
496
|
-
},
|
|
497
|
-
"pool deposit metadata"
|
|
498
|
-
);
|
|
499
468
|
txHash = await this.#anvil.writeContract({
|
|
500
469
|
account: depositor,
|
|
501
|
-
address:
|
|
470
|
+
address: underlying,
|
|
502
471
|
abi: import_iERC20.ierc20Abi,
|
|
503
472
|
functionName: "approve",
|
|
504
473
|
args: [address, allowance],
|
|
@@ -515,21 +484,12 @@ class AccountOpener extends import_sdk.SDKConstruct {
|
|
|
515
484
|
this.#logger?.debug(
|
|
516
485
|
`depositor approved underlying for pool ${poolName}: ${txHash}`
|
|
517
486
|
);
|
|
518
|
-
const depositCall = this.#poolService.addLiquidity({
|
|
519
|
-
collateral: { token: underlying, balance: amount },
|
|
520
|
-
pool: address,
|
|
521
|
-
wallet: depositor.address,
|
|
522
|
-
meta: metadata
|
|
523
|
-
});
|
|
524
|
-
if (!depositCall) {
|
|
525
|
-
throw new Error(`no deposit call could be created for ${poolName}`);
|
|
526
|
-
}
|
|
527
487
|
txHash = await this.#anvil.writeContract({
|
|
528
488
|
account: depositor,
|
|
529
|
-
address
|
|
530
|
-
abi:
|
|
531
|
-
functionName:
|
|
532
|
-
args:
|
|
489
|
+
address,
|
|
490
|
+
abi: import_generated.iPoolV310Abi,
|
|
491
|
+
functionName: "deposit",
|
|
492
|
+
args: [amount, depositor.address],
|
|
533
493
|
chain: this.#anvil.chain
|
|
534
494
|
});
|
|
535
495
|
receipt = await this.#anvil.waitForTransactionReceipt({ hash: txHash });
|
package/dist/cjs/dev/index.js
CHANGED
|
@@ -23,12 +23,16 @@ __reExport(dev_exports, require("./create2.js"), module.exports);
|
|
|
23
23
|
__reExport(dev_exports, require("./createAnvilClient.js"), module.exports);
|
|
24
24
|
__reExport(dev_exports, require("./detectChain.js"), module.exports);
|
|
25
25
|
__reExport(dev_exports, require("./EthCallSpy.js"), module.exports);
|
|
26
|
+
__reExport(dev_exports, require("./isOutOfSyncError.js"), module.exports);
|
|
27
|
+
__reExport(dev_exports, require("./isRateLimitError.js"), module.exports);
|
|
28
|
+
__reExport(dev_exports, require("./isTransientError.js"), module.exports);
|
|
26
29
|
__reExport(dev_exports, require("./ltUtils.js"), module.exports);
|
|
27
30
|
__reExport(dev_exports, require("./migrateFaucet.js"), module.exports);
|
|
28
31
|
__reExport(dev_exports, require("./mint/index.js"), module.exports);
|
|
29
32
|
__reExport(dev_exports, require("./providers.js"), module.exports);
|
|
30
33
|
__reExport(dev_exports, require("./RevolverTransport.js"), module.exports);
|
|
31
34
|
__reExport(dev_exports, require("./replaceStorage.js"), module.exports);
|
|
35
|
+
__reExport(dev_exports, require("./resilientTransport.js"), module.exports);
|
|
32
36
|
__reExport(dev_exports, require("./transports.js"), module.exports);
|
|
33
37
|
__reExport(dev_exports, require("./types.js"), module.exports);
|
|
34
38
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -41,12 +45,16 @@ __reExport(dev_exports, require("./types.js"), module.exports);
|
|
|
41
45
|
...require("./createAnvilClient.js"),
|
|
42
46
|
...require("./detectChain.js"),
|
|
43
47
|
...require("./EthCallSpy.js"),
|
|
48
|
+
...require("./isOutOfSyncError.js"),
|
|
49
|
+
...require("./isRateLimitError.js"),
|
|
50
|
+
...require("./isTransientError.js"),
|
|
44
51
|
...require("./ltUtils.js"),
|
|
45
52
|
...require("./migrateFaucet.js"),
|
|
46
53
|
...require("./mint/index.js"),
|
|
47
54
|
...require("./providers.js"),
|
|
48
55
|
...require("./RevolverTransport.js"),
|
|
49
56
|
...require("./replaceStorage.js"),
|
|
57
|
+
...require("./resilientTransport.js"),
|
|
50
58
|
...require("./transports.js"),
|
|
51
59
|
...require("./types.js")
|
|
52
60
|
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var isOutOfSyncError_exports = {};
|
|
20
|
+
__export(isOutOfSyncError_exports, {
|
|
21
|
+
isOutOfSyncError: () => isOutOfSyncError
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(isOutOfSyncError_exports);
|
|
24
|
+
var import_viem = require("viem");
|
|
25
|
+
const OUT_OF_SYNC_PATTERNS = [
|
|
26
|
+
// Alchemy (code 3), DRPC (code 26), Thirdweb (code 26) on Mainnet/Plasma/Monad
|
|
27
|
+
/unknown block/i,
|
|
28
|
+
// Ankr (code -32000) on Mainnet
|
|
29
|
+
/header not found/i,
|
|
30
|
+
// Alchemy, Ankr, Thirdweb, direct Monad RPCs (code -32602)
|
|
31
|
+
/block requested not found/i,
|
|
32
|
+
// Ankr, Thirdweb, direct Somnia RPCs (code -1)
|
|
33
|
+
/unable to load historical state/i,
|
|
34
|
+
// Ankr, Thirdweb, direct Etherlink RPCs (code -32603)
|
|
35
|
+
/no state available for block/i,
|
|
36
|
+
// Generic "block not found" (code -32001) from various providers
|
|
37
|
+
/block\b.*\bnot found/i,
|
|
38
|
+
// Optimism proxyd (code -32019) for future/non-existent blocks
|
|
39
|
+
/block is out of range/i,
|
|
40
|
+
// EIP-1474 standard (code -32001) when block/state is not available
|
|
41
|
+
/resource not found/i
|
|
42
|
+
];
|
|
43
|
+
function isOutOfSyncError(e) {
|
|
44
|
+
if (e instanceof import_viem.BaseError) {
|
|
45
|
+
const match = e.walk((err) => {
|
|
46
|
+
const msg = err.details ?? err.message ?? "";
|
|
47
|
+
return OUT_OF_SYNC_PATTERNS.some((re) => re.test(msg));
|
|
48
|
+
});
|
|
49
|
+
return match !== null;
|
|
50
|
+
}
|
|
51
|
+
return OUT_OF_SYNC_PATTERNS.some((re) => re.test(e.message));
|
|
52
|
+
}
|
|
53
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
54
|
+
0 && (module.exports = {
|
|
55
|
+
isOutOfSyncError
|
|
56
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var isRateLimitError_exports = {};
|
|
20
|
+
__export(isRateLimitError_exports, {
|
|
21
|
+
isRateLimitError: () => isRateLimitError
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(isRateLimitError_exports);
|
|
24
|
+
var import_viem = require("viem");
|
|
25
|
+
const RATE_LIMIT_PATTERNS = [
|
|
26
|
+
// Thirdweb (status 429): "You've been rate limited, please upgrade your plan."
|
|
27
|
+
// Monad direct/Cloudflare (status 429): "You are being rate limited"
|
|
28
|
+
/rate limit/i,
|
|
29
|
+
// DRPC (code 15, status 429): "Too many request, try again later"
|
|
30
|
+
// Ankr (status 429): HTML "<title>429 Too Many Requests</title>"
|
|
31
|
+
/too many request/i,
|
|
32
|
+
// Alchemy (code 429, status 429): "Your app has exceeded its compute units per second capacity"
|
|
33
|
+
/exceeded its compute units/i,
|
|
34
|
+
// Providers embedding retry hints: "retry after 5 seconds", "retry in 10s"
|
|
35
|
+
/retry.{0,10}(in|after)\s+\d/i
|
|
36
|
+
];
|
|
37
|
+
function extractRetryAfter(headers) {
|
|
38
|
+
if (!headers) {
|
|
39
|
+
return void 0;
|
|
40
|
+
}
|
|
41
|
+
const val = headers.get("retry-after");
|
|
42
|
+
if (!val) {
|
|
43
|
+
return void 0;
|
|
44
|
+
}
|
|
45
|
+
const seconds = Number(val);
|
|
46
|
+
if (!Number.isNaN(seconds)) {
|
|
47
|
+
return seconds * 1e3;
|
|
48
|
+
}
|
|
49
|
+
const date = Date.parse(val);
|
|
50
|
+
if (!Number.isNaN(date)) {
|
|
51
|
+
return Math.max(0, date - Date.now());
|
|
52
|
+
}
|
|
53
|
+
return void 0;
|
|
54
|
+
}
|
|
55
|
+
function isRateLimitError(e) {
|
|
56
|
+
if (e instanceof import_viem.BaseError) {
|
|
57
|
+
let retryAfterMs;
|
|
58
|
+
const httpMatch = e.walk((err) => {
|
|
59
|
+
if (err instanceof import_viem.HttpRequestError && err.status === 429) {
|
|
60
|
+
retryAfterMs = extractRetryAfter(err.headers);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
});
|
|
65
|
+
if (httpMatch !== null) return [true, retryAfterMs];
|
|
66
|
+
const msgMatch = e.walk((err) => {
|
|
67
|
+
const msg = err.details ?? err.message ?? "";
|
|
68
|
+
return RATE_LIMIT_PATTERNS.some((re) => re.test(msg));
|
|
69
|
+
});
|
|
70
|
+
if (msgMatch !== null) return [true, void 0];
|
|
71
|
+
}
|
|
72
|
+
if (RATE_LIMIT_PATTERNS.some((re) => re.test(e.message))) {
|
|
73
|
+
return [true, void 0];
|
|
74
|
+
}
|
|
75
|
+
return [false, void 0];
|
|
76
|
+
}
|
|
77
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
78
|
+
0 && (module.exports = {
|
|
79
|
+
isRateLimitError
|
|
80
|
+
});
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var isTransientError_exports = {};
|
|
20
|
+
__export(isTransientError_exports, {
|
|
21
|
+
isTransientError: () => isTransientError
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(isTransientError_exports);
|
|
24
|
+
var import_viem = require("viem");
|
|
25
|
+
const TRANSIENT_HTTP_STATUSES = /* @__PURE__ */ new Set([502, 503, 504]);
|
|
26
|
+
const TRANSIENT_PATTERNS = [
|
|
27
|
+
// viem TimeoutError: RPC endpoint didn't respond within configured timeout
|
|
28
|
+
// (default 10s). details = "The request timed out."
|
|
29
|
+
/timed?\s*out/i,
|
|
30
|
+
// Node.js ECONNRESET: TCP connection forcibly closed by the server mid-request,
|
|
31
|
+
// typically during server restarts or under heavy load.
|
|
32
|
+
// Wrapped by viem in HttpRequestError with cause TypeError("fetch failed")
|
|
33
|
+
/econnreset/i,
|
|
34
|
+
// Node.js "socket hang up": server closed the TCP connection before sending
|
|
35
|
+
// a complete response, similar to ECONNRESET but at HTTP level
|
|
36
|
+
/socket hang up/i,
|
|
37
|
+
// Browser/Node.js fetch failures: DNS resolution failure, connection refused,
|
|
38
|
+
// unreachable host, or CORS errors. Wrapped in HttpRequestError by viem.
|
|
39
|
+
/network error|failed to fetch|fetch failed/i,
|
|
40
|
+
// HTTP 503 text in response body when status check alone doesn't catch it
|
|
41
|
+
// (e.g., HTML error page from a CDN/proxy during maintenance or overload)
|
|
42
|
+
/service unavailable/i,
|
|
43
|
+
// HTTP 502 text in response body from load balancer/reverse proxy when the
|
|
44
|
+
// backend RPC node is unreachable or returned an invalid response
|
|
45
|
+
/bad gateway/i,
|
|
46
|
+
// HTTP 504 text in response body from gateway/proxy when the upstream RPC
|
|
47
|
+
// node didn't respond in time
|
|
48
|
+
/gateway time/i,
|
|
49
|
+
// Malformed JSON-RPC response: server returned 200 with empty/null body or
|
|
50
|
+
// non-JSON content despite application/json content-type, causing viem's
|
|
51
|
+
// response parser to fail with a destructuring TypeError
|
|
52
|
+
/cannot destructure/i,
|
|
53
|
+
// viem UnknownRpcError: provider returned a JSON-RPC error with an
|
|
54
|
+
// unrecognized error code that viem can't categorize.
|
|
55
|
+
// shortMessage = "An unknown RPC error occurred."
|
|
56
|
+
/unknown rpc error/i,
|
|
57
|
+
// EIP-1474 ResourceUnavailableRpcError (code -32002): node is syncing or the
|
|
58
|
+
// requested resource is temporarily unavailable.
|
|
59
|
+
// Matches both the RPC message and viem's shortMessage "Requested resource not available."
|
|
60
|
+
/resource unavailable|requested resource not available/i
|
|
61
|
+
];
|
|
62
|
+
function isTransientError(e) {
|
|
63
|
+
if (e instanceof import_viem.BaseError) {
|
|
64
|
+
if (e instanceof import_viem.TimeoutError) return true;
|
|
65
|
+
const httpMatch = e.walk((err) => {
|
|
66
|
+
if (err instanceof import_viem.HttpRequestError && err.status !== void 0 && TRANSIENT_HTTP_STATUSES.has(err.status)) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
});
|
|
71
|
+
if (httpMatch !== null) return true;
|
|
72
|
+
const msgMatch = e.walk((err) => {
|
|
73
|
+
const msg = err.details ?? err.message ?? "";
|
|
74
|
+
return TRANSIENT_PATTERNS.some((re) => re.test(msg));
|
|
75
|
+
});
|
|
76
|
+
return msgMatch !== null;
|
|
77
|
+
}
|
|
78
|
+
return TRANSIENT_PATTERNS.some((re) => re.test(e.message));
|
|
79
|
+
}
|
|
80
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
81
|
+
0 && (module.exports = {
|
|
82
|
+
isTransientError
|
|
83
|
+
});
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var resilientTransport_exports = {};
|
|
20
|
+
__export(resilientTransport_exports, {
|
|
21
|
+
resilientTransport: () => resilientTransport,
|
|
22
|
+
resilientTransportOptionsSchema: () => resilientTransportOptionsSchema
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(resilientTransport_exports);
|
|
25
|
+
var import_viem = require("viem");
|
|
26
|
+
var import_v4 = require("zod/v4");
|
|
27
|
+
var import_isOutOfSyncError = require("./isOutOfSyncError.js");
|
|
28
|
+
var import_isRateLimitError = require("./isRateLimitError.js");
|
|
29
|
+
var import_isTransientError = require("./isTransientError.js");
|
|
30
|
+
const resilientTransportOptionsSchema = import_v4.z.object({
|
|
31
|
+
/**
|
|
32
|
+
* Max retry attempts.
|
|
33
|
+
* @default 3
|
|
34
|
+
**/
|
|
35
|
+
retryCount: import_v4.z.number().int().min(0).default(3),
|
|
36
|
+
/**
|
|
37
|
+
* Base delay (ms) for exponential backoff.
|
|
38
|
+
* @default 300
|
|
39
|
+
**/
|
|
40
|
+
delay: import_v4.z.number().min(0).default(300),
|
|
41
|
+
/**
|
|
42
|
+
* Upper bound (ms) for backoff delay.
|
|
43
|
+
* @default 5_000
|
|
44
|
+
**/
|
|
45
|
+
maxDelay: import_v4.z.number().min(0).default(5e3),
|
|
46
|
+
/**
|
|
47
|
+
* Max random jitter (ms) added to each delay.
|
|
48
|
+
* @default 100
|
|
49
|
+
**/
|
|
50
|
+
jitter: import_v4.z.number().min(0).default(100),
|
|
51
|
+
/**
|
|
52
|
+
* Retry on rate-limit (HTTP 429) errors.
|
|
53
|
+
* @default true
|
|
54
|
+
**/
|
|
55
|
+
handleRateLimit: import_v4.z.boolean().default(true),
|
|
56
|
+
/**
|
|
57
|
+
* Retry on transient network/infrastructure errors.
|
|
58
|
+
* @default true
|
|
59
|
+
**/
|
|
60
|
+
handleTransient: import_v4.z.boolean().default(true),
|
|
61
|
+
/**
|
|
62
|
+
* Retry on out-of-sync / block-not-found errors.
|
|
63
|
+
* @default true
|
|
64
|
+
**/
|
|
65
|
+
handleOutOfSync: import_v4.z.boolean().default(true)
|
|
66
|
+
});
|
|
67
|
+
function resilientTransport(underlyingTransport, options) {
|
|
68
|
+
const opts = resilientTransportOptionsSchema.parse(options ?? {});
|
|
69
|
+
return (transportOpts) => {
|
|
70
|
+
const base = underlyingTransport(transportOpts);
|
|
71
|
+
const rpcRequest = base.request;
|
|
72
|
+
const request = async (args) => (0, import_viem.withRetry)(() => rpcRequest(args), {
|
|
73
|
+
retryCount: opts.retryCount,
|
|
74
|
+
delay({ count, error }) {
|
|
75
|
+
if (opts.handleRateLimit) {
|
|
76
|
+
const [isRate, retryAfterMs] = (0, import_isRateLimitError.isRateLimitError)(error);
|
|
77
|
+
if (isRate && retryAfterMs !== void 0) {
|
|
78
|
+
return retryAfterMs + Math.floor(Math.random() * opts.jitter);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const exp = Math.min(opts.maxDelay, opts.delay * 2 ** count);
|
|
82
|
+
return exp + Math.floor(Math.random() * opts.jitter);
|
|
83
|
+
},
|
|
84
|
+
shouldRetry({ error }) {
|
|
85
|
+
if (opts.handleRateLimit && (0, import_isRateLimitError.isRateLimitError)(error)[0]) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
if (opts.handleTransient && (0, import_isTransientError.isTransientError)(error)) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
if (opts.handleOutOfSync && (0, import_isOutOfSyncError.isOutOfSyncError)(error)) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return { ...base, request };
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
101
|
+
0 && (module.exports = {
|
|
102
|
+
resilientTransport,
|
|
103
|
+
resilientTransportOptionsSchema
|
|
104
|
+
});
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var ZappersPlugin_exports = {};
|
|
20
|
+
__export(ZappersPlugin_exports, {
|
|
21
|
+
ZappersPlugin: () => ZappersPlugin
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(ZappersPlugin_exports);
|
|
24
|
+
var import_peripheryCompressor = require("../../abi/compressors/peripheryCompressor.js");
|
|
25
|
+
var import_sdk = require("../../sdk/index.js");
|
|
26
|
+
class ZappersPlugin extends import_sdk.BasePlugin {
|
|
27
|
+
#zappers;
|
|
28
|
+
#extraZappers;
|
|
29
|
+
constructor(extraZappers = [], loadOnAttach = false) {
|
|
30
|
+
super(loadOnAttach);
|
|
31
|
+
this.#extraZappers = this.#addExtraZappers(extraZappers);
|
|
32
|
+
}
|
|
33
|
+
async load(force) {
|
|
34
|
+
if (!force && this.loaded) {
|
|
35
|
+
return this.state;
|
|
36
|
+
}
|
|
37
|
+
const [pcAddr] = this.sdk.addressProvider.mustGetLatest(
|
|
38
|
+
import_sdk.AP_PERIPHERY_COMPRESSOR,
|
|
39
|
+
import_sdk.VERSION_RANGE_310
|
|
40
|
+
);
|
|
41
|
+
this.sdk.logger?.debug(
|
|
42
|
+
`loading zappers with periphery compressor ${pcAddr}`
|
|
43
|
+
);
|
|
44
|
+
const markets = this.sdk.marketRegister.markets;
|
|
45
|
+
const resp = await this.client.multicall({
|
|
46
|
+
contracts: markets.map(
|
|
47
|
+
(m) => ({
|
|
48
|
+
abi: import_peripheryCompressor.peripheryCompressorAbi,
|
|
49
|
+
address: pcAddr,
|
|
50
|
+
functionName: "getZappers",
|
|
51
|
+
args: [m.configurator.address, m.pool.pool.address]
|
|
52
|
+
})
|
|
53
|
+
),
|
|
54
|
+
allowFailure: true,
|
|
55
|
+
batchSize: 0,
|
|
56
|
+
blockNumber: this.sdk.currentBlock
|
|
57
|
+
});
|
|
58
|
+
this.#zappers = new import_sdk.AddressMap(void 0, "zappers");
|
|
59
|
+
for (let i = 0; i < resp.length; i++) {
|
|
60
|
+
const { status, result, error } = resp[i];
|
|
61
|
+
const marketConfigurator = markets[i].configurator.address;
|
|
62
|
+
const pool = markets[i].pool.pool.address;
|
|
63
|
+
if (status === "success") {
|
|
64
|
+
this.#zappers.upsert(
|
|
65
|
+
pool,
|
|
66
|
+
result.map((z) => ({ ...z, pool }))
|
|
67
|
+
);
|
|
68
|
+
} else {
|
|
69
|
+
this.sdk.logger?.error(
|
|
70
|
+
`failed to load zapper for market configurator ${this.labelAddress(
|
|
71
|
+
marketConfigurator
|
|
72
|
+
)} and pool ${this.labelAddress(pool)}: ${error}`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
this.#loadZapperTokens();
|
|
77
|
+
return this.state;
|
|
78
|
+
}
|
|
79
|
+
#addExtraZappers(extraZappers) {
|
|
80
|
+
const zappers = new import_sdk.AddressMap();
|
|
81
|
+
for (const z of extraZappers) {
|
|
82
|
+
const existing = zappers?.get(z.pool);
|
|
83
|
+
if (existing) {
|
|
84
|
+
const hasZapper = existing.some(
|
|
85
|
+
(zz) => (0, import_sdk.hexEq)(zz.baseParams.addr, z.baseParams.addr)
|
|
86
|
+
);
|
|
87
|
+
if (!hasZapper) {
|
|
88
|
+
existing.push(z);
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
zappers?.upsert(z.pool, [z]);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return zappers;
|
|
95
|
+
}
|
|
96
|
+
get extraZappers() {
|
|
97
|
+
if (!this.#extraZappers) {
|
|
98
|
+
console.error("extra zappers not attached");
|
|
99
|
+
return new import_sdk.AddressMap();
|
|
100
|
+
}
|
|
101
|
+
return this.#extraZappers;
|
|
102
|
+
}
|
|
103
|
+
get zappers() {
|
|
104
|
+
if (!this.#zappers) {
|
|
105
|
+
throw new Error("zappers plugin not attached");
|
|
106
|
+
}
|
|
107
|
+
return this.#zappers;
|
|
108
|
+
}
|
|
109
|
+
get loaded() {
|
|
110
|
+
return !!this.#zappers;
|
|
111
|
+
}
|
|
112
|
+
stateHuman(_) {
|
|
113
|
+
return this.zappers.values().flatMap(
|
|
114
|
+
(l) => l.flatMap((z) => ({
|
|
115
|
+
address: z.baseParams.addr,
|
|
116
|
+
contractType: z.baseParams.contractType,
|
|
117
|
+
version: Number(z.baseParams.version),
|
|
118
|
+
tokenIn: this.labelAddress(z.tokenIn.addr),
|
|
119
|
+
tokenOut: this.labelAddress(z.tokenOut.addr)
|
|
120
|
+
}))
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
get state() {
|
|
124
|
+
return {
|
|
125
|
+
zappers: this.zappers.asRecord()
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
hydrate(state) {
|
|
129
|
+
this.#zappers = new import_sdk.AddressMap(Object.entries(state.zappers), "zappers");
|
|
130
|
+
this.#loadZapperTokens();
|
|
131
|
+
}
|
|
132
|
+
#loadZapperTokens() {
|
|
133
|
+
const zappersTokens = this.zappers.values().flatMap((l) => l.flatMap((z) => [z.tokenIn, z.tokenOut]));
|
|
134
|
+
const extraZappersTokens = this.extraZappers.values().flatMap((l) => l.flatMap((z) => [z.tokenIn, z.tokenOut]));
|
|
135
|
+
for (const t of [...zappersTokens, ...extraZappersTokens]) {
|
|
136
|
+
this.sdk.tokensMeta.upsert(t.addr, t);
|
|
137
|
+
this.sdk.setAddressLabel(t.addr, t.symbol);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
142
|
+
0 && (module.exports = {
|
|
143
|
+
ZappersPlugin
|
|
144
|
+
});
|