@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.
Files changed (113) hide show
  1. package/dist/cjs/dev/AccountOpener.js +5 -45
  2. package/dist/cjs/dev/index.js +8 -0
  3. package/dist/cjs/dev/isOutOfSyncError.js +56 -0
  4. package/dist/cjs/dev/isRateLimitError.js +80 -0
  5. package/dist/cjs/dev/isTransientError.js +83 -0
  6. package/dist/cjs/dev/providers.js +1 -1
  7. package/dist/cjs/dev/resilientTransport.js +104 -0
  8. package/dist/cjs/plugins/zappers/ZappersPlugin.js +144 -0
  9. package/dist/cjs/{sdk/market/ZapperRegister.js → plugins/zappers/extraZappers.js} +6 -110
  10. package/dist/cjs/plugins/zappers/index.js +26 -0
  11. package/dist/cjs/plugins/zappers/package.json +1 -0
  12. package/dist/cjs/sdk/accounts/AbstractCreditAccountsService.js +104 -462
  13. package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +5 -16
  14. package/dist/cjs/sdk/base/ChainContractsRegister.js +1 -1
  15. package/dist/cjs/sdk/base/TokensMeta.js +32 -255
  16. package/dist/cjs/sdk/base/index.js +0 -2
  17. package/dist/cjs/sdk/chain/chains.js +5 -6
  18. package/dist/cjs/sdk/constants/index.js +2 -0
  19. package/dist/cjs/sdk/{base/token-types.js → constants/phantom-tokens.js} +3 -9
  20. package/dist/cjs/sdk/market/MarketRegister.js +2 -2
  21. package/dist/cjs/sdk/market/MarketSuite.js +0 -6
  22. package/dist/cjs/sdk/market/index.js +1 -3
  23. package/dist/cjs/sdk/market/pool/PoolSuite.js +0 -3
  24. package/dist/cjs/sdk/market/pool/PoolV310Contract.js +2 -17
  25. package/dist/cjs/sdk/market/pool/index.js +0 -4
  26. package/dist/cjs/sdk/pools/AbstractPoolService.js +137 -0
  27. package/dist/cjs/{abi/iStateSerializer.js → sdk/pools/PoolServiceV310.js} +8 -14
  28. package/dist/cjs/sdk/pools/createPoolService.js +35 -0
  29. package/dist/cjs/sdk/pools/index.js +4 -2
  30. package/dist/cjs/sdk/utils/AddressMap.js +1 -1
  31. package/dist/cjs/sdk/utils/viem/sendRawTx.js +0 -16
  32. package/dist/esm/dev/AccountOpener.js +6 -47
  33. package/dist/esm/dev/index.js +4 -0
  34. package/dist/esm/dev/isOutOfSyncError.js +32 -0
  35. package/dist/esm/dev/isRateLimitError.js +56 -0
  36. package/dist/esm/dev/isTransientError.js +59 -0
  37. package/dist/esm/dev/providers.js +1 -1
  38. package/dist/esm/dev/resilientTransport.js +79 -0
  39. package/dist/esm/plugins/zappers/ZappersPlugin.js +126 -0
  40. package/dist/esm/{sdk/market/ZapperRegister.js → plugins/zappers/extraZappers.js} +2 -109
  41. package/dist/esm/plugins/zappers/index.js +3 -0
  42. package/dist/esm/plugins/zappers/package.json +1 -0
  43. package/dist/esm/sdk/accounts/AbstractCreditAccountsService.js +104 -462
  44. package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +5 -16
  45. package/dist/esm/sdk/base/ChainContractsRegister.js +1 -1
  46. package/dist/esm/sdk/base/TokensMeta.js +32 -261
  47. package/dist/esm/sdk/base/index.js +0 -1
  48. package/dist/esm/sdk/chain/chains.js +5 -6
  49. package/dist/esm/sdk/constants/index.js +1 -0
  50. package/dist/esm/sdk/{base/token-types.js → constants/phantom-tokens.js} +0 -4
  51. package/dist/esm/sdk/market/MarketRegister.js +2 -2
  52. package/dist/esm/sdk/market/MarketSuite.js +0 -6
  53. package/dist/esm/sdk/market/index.js +0 -1
  54. package/dist/esm/sdk/market/pool/PoolSuite.js +0 -3
  55. package/dist/esm/sdk/market/pool/PoolV310Contract.js +2 -17
  56. package/dist/esm/sdk/market/pool/index.js +0 -2
  57. package/dist/esm/sdk/pools/AbstractPoolService.js +113 -0
  58. package/dist/esm/sdk/pools/PoolServiceV310.js +6 -0
  59. package/dist/esm/sdk/pools/createPoolService.js +11 -0
  60. package/dist/esm/sdk/pools/index.js +2 -1
  61. package/dist/esm/sdk/utils/AddressMap.js +1 -1
  62. package/dist/esm/sdk/utils/viem/sendRawTx.js +1 -19
  63. package/dist/types/dev/index.d.ts +4 -0
  64. package/dist/types/dev/isOutOfSyncError.d.ts +4 -0
  65. package/dist/types/dev/isRateLimitError.d.ts +4 -0
  66. package/dist/types/dev/isTransientError.d.ts +4 -0
  67. package/dist/types/dev/resilientTransport.d.ts +19 -0
  68. package/dist/types/plugins/zappers/ZappersPlugin.d.ts +18 -0
  69. package/dist/types/plugins/zappers/extraZappers.d.ts +6 -0
  70. package/dist/types/plugins/zappers/index.d.ts +3 -0
  71. package/dist/types/plugins/zappers/types.d.ts +12 -0
  72. package/dist/types/sdk/accounts/AbstractCreditAccountsService.d.ts +27 -123
  73. package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +1 -1
  74. package/dist/types/sdk/accounts/types.d.ts +8 -108
  75. package/dist/types/sdk/base/TokensMeta.d.ts +18 -34
  76. package/dist/types/sdk/base/index.d.ts +0 -1
  77. package/dist/types/sdk/base/types.d.ts +1 -0
  78. package/dist/types/sdk/chain/chains.d.ts +1 -1
  79. package/dist/types/sdk/constants/index.d.ts +1 -0
  80. package/dist/types/sdk/constants/phantom-tokens.d.ts +2 -0
  81. package/dist/types/sdk/market/MarketRegister.d.ts +2 -2
  82. package/dist/types/sdk/market/MarketSuite.d.ts +0 -3
  83. package/dist/types/sdk/market/index.d.ts +0 -1
  84. package/dist/types/sdk/market/pool/PoolSuite.d.ts +0 -2
  85. package/dist/types/sdk/market/pool/PoolV310Contract.d.ts +2 -6
  86. package/dist/types/sdk/market/pool/index.d.ts +0 -2
  87. package/dist/types/sdk/pools/AbstractPoolService.d.ts +9 -0
  88. package/dist/types/sdk/pools/PoolServiceV310.d.ts +4 -0
  89. package/dist/types/sdk/pools/createPoolService.d.ts +3 -0
  90. package/dist/types/sdk/pools/index.d.ts +2 -1
  91. package/dist/types/sdk/pools/types.d.ts +63 -84
  92. package/dist/types/sdk/utils/AddressMap.d.ts +1 -1
  93. package/dist/types/sdk/utils/viem/sendRawTx.d.ts +1 -5
  94. package/package.json +6 -5
  95. package/dist/cjs/abi/310/iSecuritizeDegenNFT.js +0 -263
  96. package/dist/cjs/abi/310/iSecuritizeKYCFactory.js +0 -278
  97. package/dist/cjs/sdk/market/pool/SecuritizeKYCFactory.js +0 -97
  98. package/dist/cjs/sdk/pools/PoolService.js +0 -391
  99. package/dist/esm/abi/310/iSecuritizeDegenNFT.js +0 -239
  100. package/dist/esm/abi/310/iSecuritizeKYCFactory.js +0 -254
  101. package/dist/esm/abi/iStateSerializer.js +0 -12
  102. package/dist/esm/sdk/market/pool/SecuritizeKYCFactory.js +0 -73
  103. package/dist/esm/sdk/pools/PoolService.js +0 -371
  104. package/dist/types/abi/310/iSecuritizeDegenNFT.d.ts +0 -324
  105. package/dist/types/abi/310/iSecuritizeKYCFactory.d.ts +0 -322
  106. package/dist/types/abi/iStateSerializer.d.ts +0 -11
  107. package/dist/types/sdk/base/token-types.d.ts +0 -33
  108. package/dist/types/sdk/market/ZapperRegister.d.ts +0 -17
  109. package/dist/types/sdk/market/pool/SecuritizeKYCFactory.d.ts +0 -345
  110. package/dist/types/sdk/market/types.d.ts +0 -10
  111. package/dist/types/sdk/pools/PoolService.d.ts +0 -14
  112. /package/dist/cjs/{sdk/market → plugins/zappers}/types.js +0 -0
  113. /package/dist/esm/{sdk/market → plugins/zappers}/types.js +0 -0
@@ -0,0 +1,137 @@
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 AbstractPoolService_exports = {};
20
+ __export(AbstractPoolService_exports, {
21
+ AbstractPoolService: () => AbstractPoolService
22
+ });
23
+ module.exports = __toCommonJS(AbstractPoolService_exports);
24
+ var import_generated = require("../../abi/310/generated.js");
25
+ var import_iERC20ZapperDeposits = require("../../abi/iERC20ZapperDeposits.js");
26
+ var import_iETHZapperDeposits = require("../../abi/iETHZapperDeposits.js");
27
+ var import_iZapper = require("../../abi/iZapper.js");
28
+ var import_base = require("../base/index.js");
29
+ class AbstractPoolService extends import_base.SDKConstruct {
30
+ #version;
31
+ constructor(sdk, version) {
32
+ super(sdk);
33
+ this.#version = version;
34
+ this.logger?.debug(`Created PoolService with version: ${this.#version}`);
35
+ }
36
+ addLiquidity({
37
+ collateral,
38
+ pool,
39
+ account,
40
+ zapper,
41
+ permit,
42
+ nativeTokenAddress,
43
+ referralCode = 0n,
44
+ migrate
45
+ }) {
46
+ if (zapper?.tokenIn === nativeTokenAddress) {
47
+ return [
48
+ {
49
+ target: zapper.zapper,
50
+ abi: import_iETHZapperDeposits.iethZapperDepositsAbi,
51
+ functionName: "depositWithReferral",
52
+ args: [account, referralCode],
53
+ value: collateral.balance
54
+ }
55
+ ];
56
+ } else if (zapper) {
57
+ return permit ? [
58
+ {
59
+ target: zapper.zapper,
60
+ abi: import_iERC20ZapperDeposits.ierc20ZapperDepositsAbi,
61
+ functionName: "depositWithReferralAndPermit",
62
+ args: [
63
+ collateral.balance,
64
+ account,
65
+ referralCode,
66
+ permit.deadline,
67
+ permit.v,
68
+ permit.r,
69
+ permit.s
70
+ ]
71
+ }
72
+ ] : [
73
+ {
74
+ target: zapper.zapper,
75
+ abi: import_iERC20ZapperDeposits.ierc20ZapperDepositsAbi,
76
+ functionName: "depositWithReferral",
77
+ args: [collateral.balance, account, referralCode]
78
+ }
79
+ ];
80
+ } else {
81
+ if (migrate) throw Error("No zapper for migration");
82
+ return [
83
+ {
84
+ target: pool,
85
+ abi: import_generated.iPoolV310Abi,
86
+ functionName: "depositWithReferral",
87
+ args: [collateral.balance, account, referralCode]
88
+ }
89
+ ];
90
+ }
91
+ }
92
+ removeLiquidity({
93
+ pool,
94
+ amount,
95
+ account,
96
+ zapper,
97
+ permit
98
+ }) {
99
+ if (zapper) {
100
+ return permit ? [
101
+ {
102
+ target: zapper.zapper,
103
+ abi: import_iZapper.iZapperAbi,
104
+ functionName: "redeemWithPermit",
105
+ args: [
106
+ amount,
107
+ account,
108
+ permit.deadline,
109
+ permit.v,
110
+ permit.r,
111
+ permit.s
112
+ ]
113
+ }
114
+ ] : [
115
+ {
116
+ target: zapper.zapper,
117
+ abi: import_iZapper.iZapperAbi,
118
+ functionName: "redeem",
119
+ args: [amount, account]
120
+ }
121
+ ];
122
+ } else {
123
+ return [
124
+ {
125
+ target: pool,
126
+ abi: import_generated.iPoolV310Abi,
127
+ functionName: "redeem",
128
+ args: [amount, account, account]
129
+ }
130
+ ];
131
+ }
132
+ }
133
+ }
134
+ // Annotate the CommonJS export names for ESM import in node:
135
+ 0 && (module.exports = {
136
+ AbstractPoolService
137
+ });
@@ -16,21 +16,15 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var iStateSerializer_exports = {};
20
- __export(iStateSerializer_exports, {
21
- iStateSerializerAbi: () => iStateSerializerAbi
19
+ var PoolServiceV310_exports = {};
20
+ __export(PoolServiceV310_exports, {
21
+ PoolServiceV310: () => PoolServiceV310
22
22
  });
23
- module.exports = __toCommonJS(iStateSerializer_exports);
24
- const iStateSerializerAbi = [
25
- {
26
- type: "function",
27
- inputs: [],
28
- name: "serialize",
29
- outputs: [{ name: "serializedData", internalType: "bytes", type: "bytes" }],
30
- stateMutability: "view"
31
- }
32
- ];
23
+ module.exports = __toCommonJS(PoolServiceV310_exports);
24
+ var import_AbstractPoolService = require("./AbstractPoolService.js");
25
+ class PoolServiceV310 extends import_AbstractPoolService.AbstractPoolService {
26
+ }
33
27
  // Annotate the CommonJS export names for ESM import in node:
34
28
  0 && (module.exports = {
35
- iStateSerializerAbi
29
+ PoolServiceV310
36
30
  });
@@ -0,0 +1,35 @@
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 createPoolService_exports = {};
20
+ __export(createPoolService_exports, {
21
+ createPoolService: () => createPoolService
22
+ });
23
+ module.exports = __toCommonJS(createPoolService_exports);
24
+ var import_constants = require("../constants/index.js");
25
+ var import_PoolServiceV310 = require("./PoolServiceV310.js");
26
+ function createPoolService(sdk, version) {
27
+ if ((0, import_constants.isV310)(version)) {
28
+ return new import_PoolServiceV310.PoolServiceV310(sdk, version);
29
+ }
30
+ throw new Error(`Unsupported Pool Service version ${version}`);
31
+ }
32
+ // Annotate the CommonJS export names for ESM import in node:
33
+ 0 && (module.exports = {
34
+ createPoolService
35
+ });
@@ -15,10 +15,12 @@ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "defau
15
15
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
16
  var pools_exports = {};
17
17
  module.exports = __toCommonJS(pools_exports);
18
- __reExport(pools_exports, require("./PoolService.js"), module.exports);
18
+ __reExport(pools_exports, require("./AbstractPoolService.js"), module.exports);
19
+ __reExport(pools_exports, require("./createPoolService.js"), module.exports);
19
20
  __reExport(pools_exports, require("./types.js"), module.exports);
20
21
  // Annotate the CommonJS export names for ESM import in node:
21
22
  0 && (module.exports = {
22
- ...require("./PoolService.js"),
23
+ ...require("./AbstractPoolService.js"),
24
+ ...require("./createPoolService.js"),
23
25
  ...require("./types.js")
24
26
  });
@@ -37,7 +37,7 @@ class AddressMap {
37
37
  this.#name = name;
38
38
  }
39
39
  /**
40
- * Adds or overwrites value, undefined removes value
40
+ * Adds or updates value, undefined removes value
41
41
  * @param address
42
42
  * @param value
43
43
  */
@@ -18,7 +18,6 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var sendRawTx_exports = {};
20
20
  __export(sendRawTx_exports, {
21
- estimateRawTxGas: () => estimateRawTxGas,
22
21
  sendRawTx: () => sendRawTx
23
22
  });
24
23
  module.exports = __toCommonJS(sendRawTx_exports);
@@ -37,22 +36,7 @@ async function sendRawTx(client, params) {
37
36
  value: BigInt(tx.value)
38
37
  });
39
38
  }
40
- async function estimateRawTxGas(client, params) {
41
- const { tx, ...rest } = params;
42
- return (0, import_utils.getAction)(
43
- client,
44
- import_actions.estimateGas,
45
- "estimateGas"
46
- )({
47
- ...rest,
48
- account: params.account,
49
- data: tx.callData,
50
- to: tx.to,
51
- value: BigInt(tx.value)
52
- });
53
- }
54
39
  // Annotate the CommonJS export names for ESM import in node:
55
40
  0 && (module.exports = {
56
- estimateRawTxGas,
57
41
  sendRawTx
58
42
  });
@@ -6,7 +6,7 @@ import {
6
6
  parseEventLogs
7
7
  } from "viem";
8
8
  import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
9
- import { iCreditFacadeV310Abi } from "../abi/310/generated.js";
9
+ import { iCreditFacadeV310Abi, iPoolV310Abi } from "../abi/310/generated.js";
10
10
  import { ierc20Abi } from "../abi/iERC20.js";
11
11
  import {
12
12
  ADDRESS_0X0,
@@ -15,7 +15,6 @@ import {
15
15
  childLogger,
16
16
  MAX_UINT256,
17
17
  PERCENTAGE_FACTOR,
18
- PoolService,
19
18
  SDKConstruct,
20
19
  sendRawTx
21
20
  } from "../sdk/index.js";
@@ -44,7 +43,6 @@ class AccountOpener extends SDKConstruct {
44
43
  #minDebtMultiplier;
45
44
  #allowMint;
46
45
  #leverageDelta;
47
- #poolService;
48
46
  constructor(service, options_ = {}) {
49
47
  super(service.sdk);
50
48
  const {
@@ -70,7 +68,6 @@ class AccountOpener extends SDKConstruct {
70
68
  this.#poolDepositMultiplier = BigInt(poolDepositMultiplier);
71
69
  this.#minDebtMultiplier = BigInt(minDebtMultiplier);
72
70
  this.#leverageDelta = BigInt(leverageDelta);
73
- this.#poolService = new PoolService(service.sdk);
74
71
  this.#logger?.info(
75
72
  {
76
73
  borrower: privateKeyToAccount(this.borrowerKey).address,
@@ -108,10 +105,6 @@ class AccountOpener extends SDKConstruct {
108
105
  },
109
106
  "opening credit accounts"
110
107
  );
111
- await Promise.all([
112
- this.sdk.tokensMeta.loadTokenData(),
113
- this.sdk.marketRegister.loadZappers()
114
- ]);
115
108
  let deposits = [];
116
109
  if (depositIntoPools) {
117
110
  try {
@@ -463,34 +456,9 @@ class AccountOpener extends SDKConstruct {
463
456
  this.#logger?.debug(
464
457
  `depositor balance in underlying: ${this.sdk.tokensMeta.formatBN(pool.underlying, allowance, { symbol: true })}`
465
458
  );
466
- const tokensOut = this.#poolService.getDepositTokensOut(
467
- address,
468
- underlying
469
- );
470
- this.#logger?.debug(
471
- { tokensOut: tokensOut.map((t) => this.labelAddress(t)) },
472
- "deposit tokens out"
473
- );
474
- if (tokensOut.length === 0) {
475
- throw new Error(`no tokens out found for pool ${poolName}`);
476
- }
477
- const tokenOut = tokensOut[0];
478
- const metadata = this.#poolService.getDepositMetadata(
479
- address,
480
- underlying,
481
- tokenOut
482
- );
483
- this.logger?.debug(
484
- {
485
- underlying: this.labelAddress(underlying),
486
- tokenOut: this.labelAddress(tokenOut),
487
- ...metadata
488
- },
489
- "pool deposit metadata"
490
- );
491
459
  txHash = await this.#anvil.writeContract({
492
460
  account: depositor,
493
- address: metadata.approveTarget,
461
+ address: underlying,
494
462
  abi: ierc20Abi,
495
463
  functionName: "approve",
496
464
  args: [address, allowance],
@@ -507,21 +475,12 @@ class AccountOpener extends SDKConstruct {
507
475
  this.#logger?.debug(
508
476
  `depositor approved underlying for pool ${poolName}: ${txHash}`
509
477
  );
510
- const depositCall = this.#poolService.addLiquidity({
511
- collateral: { token: underlying, balance: amount },
512
- pool: address,
513
- wallet: depositor.address,
514
- meta: metadata
515
- });
516
- if (!depositCall) {
517
- throw new Error(`no deposit call could be created for ${poolName}`);
518
- }
519
478
  txHash = await this.#anvil.writeContract({
520
479
  account: depositor,
521
- address: depositCall.target,
522
- abi: depositCall.abi,
523
- functionName: depositCall.functionName,
524
- args: depositCall.args,
480
+ address,
481
+ abi: iPoolV310Abi,
482
+ functionName: "deposit",
483
+ args: [amount, depositor.address],
525
484
  chain: this.#anvil.chain
526
485
  });
527
486
  receipt = await this.#anvil.waitForTransactionReceipt({ hash: txHash });
@@ -6,11 +6,15 @@ export * from "./create2.js";
6
6
  export * from "./createAnvilClient.js";
7
7
  export * from "./detectChain.js";
8
8
  export * from "./EthCallSpy.js";
9
+ export * from "./isOutOfSyncError.js";
10
+ export * from "./isRateLimitError.js";
11
+ export * from "./isTransientError.js";
9
12
  export * from "./ltUtils.js";
10
13
  export * from "./migrateFaucet.js";
11
14
  export * from "./mint/index.js";
12
15
  export * from "./providers.js";
13
16
  export * from "./RevolverTransport.js";
14
17
  export * from "./replaceStorage.js";
18
+ export * from "./resilientTransport.js";
15
19
  export * from "./transports.js";
16
20
  export * from "./types.js";
@@ -0,0 +1,32 @@
1
+ import { BaseError } from "viem";
2
+ const OUT_OF_SYNC_PATTERNS = [
3
+ // Alchemy (code 3), DRPC (code 26), Thirdweb (code 26) on Mainnet/Plasma/Monad
4
+ /unknown block/i,
5
+ // Ankr (code -32000) on Mainnet
6
+ /header not found/i,
7
+ // Alchemy, Ankr, Thirdweb, direct Monad RPCs (code -32602)
8
+ /block requested not found/i,
9
+ // Ankr, Thirdweb, direct Somnia RPCs (code -1)
10
+ /unable to load historical state/i,
11
+ // Ankr, Thirdweb, direct Etherlink RPCs (code -32603)
12
+ /no state available for block/i,
13
+ // Generic "block not found" (code -32001) from various providers
14
+ /block\b.*\bnot found/i,
15
+ // Optimism proxyd (code -32019) for future/non-existent blocks
16
+ /block is out of range/i,
17
+ // EIP-1474 standard (code -32001) when block/state is not available
18
+ /resource not found/i
19
+ ];
20
+ function isOutOfSyncError(e) {
21
+ if (e instanceof BaseError) {
22
+ const match = e.walk((err) => {
23
+ const msg = err.details ?? err.message ?? "";
24
+ return OUT_OF_SYNC_PATTERNS.some((re) => re.test(msg));
25
+ });
26
+ return match !== null;
27
+ }
28
+ return OUT_OF_SYNC_PATTERNS.some((re) => re.test(e.message));
29
+ }
30
+ export {
31
+ isOutOfSyncError
32
+ };
@@ -0,0 +1,56 @@
1
+ import { BaseError, HttpRequestError } from "viem";
2
+ const RATE_LIMIT_PATTERNS = [
3
+ // Thirdweb (status 429): "You've been rate limited, please upgrade your plan."
4
+ // Monad direct/Cloudflare (status 429): "You are being rate limited"
5
+ /rate limit/i,
6
+ // DRPC (code 15, status 429): "Too many request, try again later"
7
+ // Ankr (status 429): HTML "<title>429 Too Many Requests</title>"
8
+ /too many request/i,
9
+ // Alchemy (code 429, status 429): "Your app has exceeded its compute units per second capacity"
10
+ /exceeded its compute units/i,
11
+ // Providers embedding retry hints: "retry after 5 seconds", "retry in 10s"
12
+ /retry.{0,10}(in|after)\s+\d/i
13
+ ];
14
+ function extractRetryAfter(headers) {
15
+ if (!headers) {
16
+ return void 0;
17
+ }
18
+ const val = headers.get("retry-after");
19
+ if (!val) {
20
+ return void 0;
21
+ }
22
+ const seconds = Number(val);
23
+ if (!Number.isNaN(seconds)) {
24
+ return seconds * 1e3;
25
+ }
26
+ const date = Date.parse(val);
27
+ if (!Number.isNaN(date)) {
28
+ return Math.max(0, date - Date.now());
29
+ }
30
+ return void 0;
31
+ }
32
+ function isRateLimitError(e) {
33
+ if (e instanceof BaseError) {
34
+ let retryAfterMs;
35
+ const httpMatch = e.walk((err) => {
36
+ if (err instanceof HttpRequestError && err.status === 429) {
37
+ retryAfterMs = extractRetryAfter(err.headers);
38
+ return true;
39
+ }
40
+ return false;
41
+ });
42
+ if (httpMatch !== null) return [true, retryAfterMs];
43
+ const msgMatch = e.walk((err) => {
44
+ const msg = err.details ?? err.message ?? "";
45
+ return RATE_LIMIT_PATTERNS.some((re) => re.test(msg));
46
+ });
47
+ if (msgMatch !== null) return [true, void 0];
48
+ }
49
+ if (RATE_LIMIT_PATTERNS.some((re) => re.test(e.message))) {
50
+ return [true, void 0];
51
+ }
52
+ return [false, void 0];
53
+ }
54
+ export {
55
+ isRateLimitError
56
+ };
@@ -0,0 +1,59 @@
1
+ import { BaseError, HttpRequestError, TimeoutError } from "viem";
2
+ const TRANSIENT_HTTP_STATUSES = /* @__PURE__ */ new Set([502, 503, 504]);
3
+ const TRANSIENT_PATTERNS = [
4
+ // viem TimeoutError: RPC endpoint didn't respond within configured timeout
5
+ // (default 10s). details = "The request timed out."
6
+ /timed?\s*out/i,
7
+ // Node.js ECONNRESET: TCP connection forcibly closed by the server mid-request,
8
+ // typically during server restarts or under heavy load.
9
+ // Wrapped by viem in HttpRequestError with cause TypeError("fetch failed")
10
+ /econnreset/i,
11
+ // Node.js "socket hang up": server closed the TCP connection before sending
12
+ // a complete response, similar to ECONNRESET but at HTTP level
13
+ /socket hang up/i,
14
+ // Browser/Node.js fetch failures: DNS resolution failure, connection refused,
15
+ // unreachable host, or CORS errors. Wrapped in HttpRequestError by viem.
16
+ /network error|failed to fetch|fetch failed/i,
17
+ // HTTP 503 text in response body when status check alone doesn't catch it
18
+ // (e.g., HTML error page from a CDN/proxy during maintenance or overload)
19
+ /service unavailable/i,
20
+ // HTTP 502 text in response body from load balancer/reverse proxy when the
21
+ // backend RPC node is unreachable or returned an invalid response
22
+ /bad gateway/i,
23
+ // HTTP 504 text in response body from gateway/proxy when the upstream RPC
24
+ // node didn't respond in time
25
+ /gateway time/i,
26
+ // Malformed JSON-RPC response: server returned 200 with empty/null body or
27
+ // non-JSON content despite application/json content-type, causing viem's
28
+ // response parser to fail with a destructuring TypeError
29
+ /cannot destructure/i,
30
+ // viem UnknownRpcError: provider returned a JSON-RPC error with an
31
+ // unrecognized error code that viem can't categorize.
32
+ // shortMessage = "An unknown RPC error occurred."
33
+ /unknown rpc error/i,
34
+ // EIP-1474 ResourceUnavailableRpcError (code -32002): node is syncing or the
35
+ // requested resource is temporarily unavailable.
36
+ // Matches both the RPC message and viem's shortMessage "Requested resource not available."
37
+ /resource unavailable|requested resource not available/i
38
+ ];
39
+ function isTransientError(e) {
40
+ if (e instanceof BaseError) {
41
+ if (e instanceof TimeoutError) return true;
42
+ const httpMatch = e.walk((err) => {
43
+ if (err instanceof HttpRequestError && err.status !== void 0 && TRANSIENT_HTTP_STATUSES.has(err.status)) {
44
+ return true;
45
+ }
46
+ return false;
47
+ });
48
+ if (httpMatch !== null) return true;
49
+ const msgMatch = e.walk((err) => {
50
+ const msg = err.details ?? err.message ?? "";
51
+ return TRANSIENT_PATTERNS.some((re) => re.test(msg));
52
+ });
53
+ return msgMatch !== null;
54
+ }
55
+ return TRANSIENT_PATTERNS.some((re) => re.test(e.message));
56
+ }
57
+ export {
58
+ isTransientError
59
+ };
@@ -47,7 +47,7 @@ const DRPC_NETS = {
47
47
  MegaETH: "megaeth",
48
48
  Etherlink: null,
49
49
  Plasma: "plasma",
50
- Somnia: "somnia"
50
+ Somnia: null
51
51
  };
52
52
  const ALCHEMY_DOMAINS = {
53
53
  Mainnet: "eth-mainnet",
@@ -0,0 +1,79 @@
1
+ import { withRetry } from "viem";
2
+ import { z } from "zod/v4";
3
+ import { isOutOfSyncError } from "./isOutOfSyncError.js";
4
+ import { isRateLimitError } from "./isRateLimitError.js";
5
+ import { isTransientError } from "./isTransientError.js";
6
+ const resilientTransportOptionsSchema = z.object({
7
+ /**
8
+ * Max retry attempts.
9
+ * @default 3
10
+ **/
11
+ retryCount: z.number().int().min(0).default(3),
12
+ /**
13
+ * Base delay (ms) for exponential backoff.
14
+ * @default 300
15
+ **/
16
+ delay: z.number().min(0).default(300),
17
+ /**
18
+ * Upper bound (ms) for backoff delay.
19
+ * @default 5_000
20
+ **/
21
+ maxDelay: z.number().min(0).default(5e3),
22
+ /**
23
+ * Max random jitter (ms) added to each delay.
24
+ * @default 100
25
+ **/
26
+ jitter: z.number().min(0).default(100),
27
+ /**
28
+ * Retry on rate-limit (HTTP 429) errors.
29
+ * @default true
30
+ **/
31
+ handleRateLimit: z.boolean().default(true),
32
+ /**
33
+ * Retry on transient network/infrastructure errors.
34
+ * @default true
35
+ **/
36
+ handleTransient: z.boolean().default(true),
37
+ /**
38
+ * Retry on out-of-sync / block-not-found errors.
39
+ * @default true
40
+ **/
41
+ handleOutOfSync: z.boolean().default(true)
42
+ });
43
+ function resilientTransport(underlyingTransport, options) {
44
+ const opts = resilientTransportOptionsSchema.parse(options ?? {});
45
+ return (transportOpts) => {
46
+ const base = underlyingTransport(transportOpts);
47
+ const rpcRequest = base.request;
48
+ const request = async (args) => withRetry(() => rpcRequest(args), {
49
+ retryCount: opts.retryCount,
50
+ delay({ count, error }) {
51
+ if (opts.handleRateLimit) {
52
+ const [isRate, retryAfterMs] = isRateLimitError(error);
53
+ if (isRate && retryAfterMs !== void 0) {
54
+ return retryAfterMs + Math.floor(Math.random() * opts.jitter);
55
+ }
56
+ }
57
+ const exp = Math.min(opts.maxDelay, opts.delay * 2 ** count);
58
+ return exp + Math.floor(Math.random() * opts.jitter);
59
+ },
60
+ shouldRetry({ error }) {
61
+ if (opts.handleRateLimit && isRateLimitError(error)[0]) {
62
+ return true;
63
+ }
64
+ if (opts.handleTransient && isTransientError(error)) {
65
+ return true;
66
+ }
67
+ if (opts.handleOutOfSync && isOutOfSyncError(error)) {
68
+ return true;
69
+ }
70
+ return false;
71
+ }
72
+ });
73
+ return { ...base, request };
74
+ };
75
+ }
76
+ export {
77
+ resilientTransport,
78
+ resilientTransportOptionsSchema
79
+ };