@gearbox-protocol/sdk 13.2.0-next.1 → 13.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.
Files changed (105) hide show
  1. package/dist/cjs/dev/AccountOpener.js +5 -45
  2. package/dist/cjs/dev/index.js +13 -0
  3. package/dist/cjs/dev/isTransientError.js +5 -1
  4. package/dist/cjs/dev/logSplitterTransport.js +154 -0
  5. package/dist/cjs/plugins/zappers/ZappersPlugin.js +144 -0
  6. package/dist/cjs/{sdk/market/ZapperRegister.js → plugins/zappers/extraZappers.js} +6 -110
  7. package/dist/cjs/plugins/zappers/index.js +26 -0
  8. package/dist/cjs/plugins/zappers/package.json +1 -0
  9. package/dist/cjs/sdk/accounts/AbstractCreditAccountsService.js +104 -462
  10. package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +5 -16
  11. package/dist/cjs/sdk/base/ChainContractsRegister.js +1 -1
  12. package/dist/cjs/sdk/base/TokensMeta.js +32 -255
  13. package/dist/cjs/sdk/base/index.js +0 -2
  14. package/dist/cjs/sdk/chain/chains.js +1 -2
  15. package/dist/cjs/sdk/constants/index.js +2 -0
  16. package/dist/cjs/sdk/{base/token-types.js → constants/phantom-tokens.js} +3 -9
  17. package/dist/cjs/sdk/market/MarketRegister.js +2 -2
  18. package/dist/cjs/sdk/market/MarketSuite.js +0 -6
  19. package/dist/cjs/sdk/market/index.js +1 -3
  20. package/dist/cjs/sdk/market/pool/PoolSuite.js +0 -3
  21. package/dist/cjs/sdk/market/pool/PoolV310Contract.js +2 -17
  22. package/dist/cjs/sdk/market/pool/index.js +0 -4
  23. package/dist/cjs/sdk/pools/AbstractPoolService.js +137 -0
  24. package/dist/cjs/{abi/iStateSerializer.js → sdk/pools/PoolServiceV310.js} +8 -14
  25. package/dist/cjs/sdk/pools/createPoolService.js +35 -0
  26. package/dist/cjs/sdk/pools/index.js +4 -2
  27. package/dist/cjs/sdk/utils/AddressMap.js +1 -1
  28. package/dist/cjs/sdk/utils/viem/sendRawTx.js +0 -16
  29. package/dist/esm/dev/AccountOpener.js +6 -47
  30. package/dist/esm/dev/index.js +10 -0
  31. package/dist/esm/dev/isTransientError.js +5 -1
  32. package/dist/esm/dev/logSplitterTransport.js +131 -0
  33. package/dist/esm/plugins/zappers/ZappersPlugin.js +126 -0
  34. package/dist/esm/{sdk/market/ZapperRegister.js → plugins/zappers/extraZappers.js} +2 -109
  35. package/dist/esm/plugins/zappers/index.js +3 -0
  36. package/dist/esm/plugins/zappers/package.json +1 -0
  37. package/dist/esm/sdk/accounts/AbstractCreditAccountsService.js +104 -462
  38. package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +5 -16
  39. package/dist/esm/sdk/base/ChainContractsRegister.js +1 -1
  40. package/dist/esm/sdk/base/TokensMeta.js +32 -261
  41. package/dist/esm/sdk/base/index.js +0 -1
  42. package/dist/esm/sdk/chain/chains.js +1 -2
  43. package/dist/esm/sdk/constants/index.js +1 -0
  44. package/dist/esm/sdk/{base/token-types.js → constants/phantom-tokens.js} +0 -4
  45. package/dist/esm/sdk/market/MarketRegister.js +2 -2
  46. package/dist/esm/sdk/market/MarketSuite.js +0 -6
  47. package/dist/esm/sdk/market/index.js +0 -1
  48. package/dist/esm/sdk/market/pool/PoolSuite.js +0 -3
  49. package/dist/esm/sdk/market/pool/PoolV310Contract.js +2 -17
  50. package/dist/esm/sdk/market/pool/index.js +0 -2
  51. package/dist/esm/sdk/pools/AbstractPoolService.js +113 -0
  52. package/dist/esm/sdk/pools/PoolServiceV310.js +6 -0
  53. package/dist/esm/sdk/pools/createPoolService.js +11 -0
  54. package/dist/esm/sdk/pools/index.js +2 -1
  55. package/dist/esm/sdk/utils/AddressMap.js +1 -1
  56. package/dist/esm/sdk/utils/viem/sendRawTx.js +1 -19
  57. package/dist/types/dev/index.d.ts +1 -0
  58. package/dist/types/dev/logSplitterTransport.d.ts +118 -0
  59. package/dist/types/plugins/zappers/ZappersPlugin.d.ts +18 -0
  60. package/dist/types/plugins/zappers/extraZappers.d.ts +6 -0
  61. package/dist/types/plugins/zappers/index.d.ts +3 -0
  62. package/dist/types/plugins/zappers/types.d.ts +12 -0
  63. package/dist/types/sdk/accounts/AbstractCreditAccountsService.d.ts +27 -123
  64. package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +1 -1
  65. package/dist/types/sdk/accounts/types.d.ts +8 -108
  66. package/dist/types/sdk/base/TokensMeta.d.ts +18 -34
  67. package/dist/types/sdk/base/index.d.ts +0 -1
  68. package/dist/types/sdk/base/types.d.ts +1 -0
  69. package/dist/types/sdk/chain/chains.d.ts +1 -1
  70. package/dist/types/sdk/constants/index.d.ts +1 -0
  71. package/dist/types/sdk/constants/phantom-tokens.d.ts +2 -0
  72. package/dist/types/sdk/market/MarketRegister.d.ts +2 -2
  73. package/dist/types/sdk/market/MarketSuite.d.ts +0 -3
  74. package/dist/types/sdk/market/credit/CreditFacadeV310BaseContract.d.ts +1 -1
  75. package/dist/types/sdk/market/index.d.ts +0 -1
  76. package/dist/types/sdk/market/pool/PoolSuite.d.ts +0 -2
  77. package/dist/types/sdk/market/pool/PoolV310Contract.d.ts +2 -6
  78. package/dist/types/sdk/market/pool/index.d.ts +0 -2
  79. package/dist/types/sdk/pools/AbstractPoolService.d.ts +9 -0
  80. package/dist/types/sdk/pools/PoolServiceV310.d.ts +4 -0
  81. package/dist/types/sdk/pools/createPoolService.d.ts +3 -0
  82. package/dist/types/sdk/pools/index.d.ts +2 -1
  83. package/dist/types/sdk/pools/types.d.ts +63 -84
  84. package/dist/types/sdk/utils/AddressMap.d.ts +1 -1
  85. package/dist/types/sdk/utils/viem/sendRawTx.d.ts +1 -5
  86. package/package.json +5 -3
  87. package/dist/cjs/abi/310/iSecuritizeDegenNFT.js +0 -263
  88. package/dist/cjs/abi/310/iSecuritizeKYCFactory.js +0 -278
  89. package/dist/cjs/sdk/market/pool/SecuritizeKYCFactory.js +0 -97
  90. package/dist/cjs/sdk/pools/PoolService.js +0 -391
  91. package/dist/esm/abi/310/iSecuritizeDegenNFT.js +0 -239
  92. package/dist/esm/abi/310/iSecuritizeKYCFactory.js +0 -254
  93. package/dist/esm/abi/iStateSerializer.js +0 -12
  94. package/dist/esm/sdk/market/pool/SecuritizeKYCFactory.js +0 -73
  95. package/dist/esm/sdk/pools/PoolService.js +0 -371
  96. package/dist/types/abi/310/iSecuritizeDegenNFT.d.ts +0 -324
  97. package/dist/types/abi/310/iSecuritizeKYCFactory.d.ts +0 -322
  98. package/dist/types/abi/iStateSerializer.d.ts +0 -11
  99. package/dist/types/sdk/base/token-types.d.ts +0 -33
  100. package/dist/types/sdk/market/ZapperRegister.d.ts +0 -17
  101. package/dist/types/sdk/market/pool/SecuritizeKYCFactory.d.ts +0 -345
  102. package/dist/types/sdk/market/types.d.ts +0 -10
  103. package/dist/types/sdk/pools/PoolService.d.ts +0 -14
  104. /package/dist/cjs/{sdk/market → plugins/zappers}/types.js +0 -0
  105. /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 });
@@ -9,6 +9,11 @@ export * from "./EthCallSpy.js";
9
9
  export * from "./isOutOfSyncError.js";
10
10
  export * from "./isRateLimitError.js";
11
11
  export * from "./isTransientError.js";
12
+ import {
13
+ isRangeError,
14
+ LogSplitterTransportOptions,
15
+ logSplitterTransport
16
+ } from "./logSplitterTransport.js";
12
17
  export * from "./ltUtils.js";
13
18
  export * from "./migrateFaucet.js";
14
19
  export * from "./mint/index.js";
@@ -18,3 +23,8 @@ export * from "./replaceStorage.js";
18
23
  export * from "./resilientTransport.js";
19
24
  export * from "./transports.js";
20
25
  export * from "./types.js";
26
+ export {
27
+ LogSplitterTransportOptions as GetLogsTransportOptions,
28
+ isRangeError,
29
+ logSplitterTransport
30
+ };
@@ -34,7 +34,11 @@ const TRANSIENT_PATTERNS = [
34
34
  // EIP-1474 ResourceUnavailableRpcError (code -32002): node is syncing or the
35
35
  // requested resource is temporarily unavailable.
36
36
  // Matches both the RPC message and viem's shortMessage "Requested resource not available."
37
- /resource unavailable|requested resource not available/i
37
+ /resource unavailable|requested resource not available/i,
38
+ // sometimes happens on DRPC: "GRPC Context cancellation"
39
+ /context cancel/i,
40
+ // DRPC error: Can't route your request to suitable provider, if you specified certain providers revise the list
41
+ /suitable provider/i
38
42
  ];
39
43
  function isTransientError(e) {
40
44
  if (e instanceof BaseError) {
@@ -0,0 +1,131 @@
1
+ import {
2
+ HttpRequestError,
3
+ hexToNumber,
4
+ InvalidParamsRpcError,
5
+ numberToHex
6
+ } from "viem";
7
+ function isFixedBlockRange(filter) {
8
+ if (filter.blockHash != null) return false;
9
+ return isHexBlockNumber(filter.fromBlock) && isHexBlockNumber(filter.toBlock);
10
+ }
11
+ function isHexBlockNumber(value) {
12
+ return typeof value === "string" && value.startsWith("0x");
13
+ }
14
+ const RANGE_ERROR_PATTERNS = [
15
+ /block range/i,
16
+ /too many results/i,
17
+ /response size/i,
18
+ /result window/i,
19
+ /exceeds allowed/i,
20
+ /cannot request logs over more than/i,
21
+ /eth_getLogs is limited to/i,
22
+ /eth_getLogs requests with up to/i,
23
+ /range is too large/i,
24
+ /exceeded max allowed range/i
25
+ ];
26
+ function isRangeError(error) {
27
+ const msg = errorMessage(error);
28
+ return RANGE_ERROR_PATTERNS.some((re) => re.test(msg));
29
+ }
30
+ const GENERIC_BLOCKS_RE = /(\d+)\s*block/i;
31
+ const ALCHEMY_RANGE_RE = /this block range should work: \[(0x[0-9a-fA-F]+),\s*(0x[0-9a-fA-F]+)\]/;
32
+ function parsePageSizeHint(error) {
33
+ const alchemy = tryAlchemyHint(error);
34
+ if (alchemy != null) return alchemy;
35
+ const msg = errorMessage(error);
36
+ const m = msg.match(GENERIC_BLOCKS_RE);
37
+ return m ? Number(m[1]) : null;
38
+ }
39
+ function tryAlchemyHint(error) {
40
+ if (!(error instanceof HttpRequestError)) return void 0;
41
+ try {
42
+ const parsed = JSON.parse(error.details);
43
+ if (typeof parsed.message !== "string") return void 0;
44
+ const match = parsed.message.match(ALCHEMY_RANGE_RE);
45
+ if (!match) return void 0;
46
+ const from = hexToNumber(match[1]);
47
+ const to = hexToNumber(match[2]);
48
+ return to - from + 1;
49
+ } catch {
50
+ return void 0;
51
+ }
52
+ }
53
+ function errorMessage(error) {
54
+ if (error instanceof Error) {
55
+ const details = error.details;
56
+ return details ? `${error.message} ${details}` : error.message;
57
+ }
58
+ return String(error);
59
+ }
60
+ async function fetchLogsWithPagination(callRpc, from, to, options) {
61
+ if (from > to) {
62
+ throw new InvalidParamsRpcError(
63
+ new Error(`Invalid parameters: from (${from}) > to (${to})`)
64
+ );
65
+ }
66
+ const { softLimit, hardLimit } = options ?? {};
67
+ let pageSize = hardLimit ?? to - from + 1;
68
+ const results = [];
69
+ let cursor = from;
70
+ while (cursor <= to) {
71
+ const chunkEnd = Math.min(to, cursor + pageSize - 1);
72
+ try {
73
+ const logs = await callRpc(cursor, chunkEnd);
74
+ results.push(...logs);
75
+ cursor = chunkEnd + 1;
76
+ } catch (error) {
77
+ if (!isRangeError(error)) {
78
+ throw error;
79
+ }
80
+ if (cursor === chunkEnd) {
81
+ throw error;
82
+ }
83
+ const hint = parsePageSizeHint(error);
84
+ if (hint) {
85
+ pageSize = hint;
86
+ } else {
87
+ const half = Math.max(1, Math.floor((chunkEnd - cursor + 1) / 2));
88
+ pageSize = softLimit ? Math.min(softLimit, half) : half;
89
+ }
90
+ }
91
+ }
92
+ return results;
93
+ }
94
+ function logSplitterTransport(transport, logOptions) {
95
+ return (opts) => {
96
+ const base = transport(opts);
97
+ const rpcRequest = base.request;
98
+ const request = (async (args) => {
99
+ const { method, params } = args;
100
+ if (method !== "eth_getLogs") {
101
+ return rpcRequest(args);
102
+ }
103
+ const filter = params?.[0] ?? {};
104
+ if (!isFixedBlockRange(filter)) {
105
+ return rpcRequest(args);
106
+ }
107
+ const from = hexToNumber(filter.fromBlock);
108
+ const to = hexToNumber(filter.toBlock);
109
+ const callRpc = async (f, t) => {
110
+ const paginatedFilter = {
111
+ ...filter,
112
+ fromBlock: numberToHex(f),
113
+ toBlock: numberToHex(t)
114
+ };
115
+ return rpcRequest({
116
+ method: "eth_getLogs",
117
+ params: [paginatedFilter]
118
+ });
119
+ };
120
+ return fetchLogsWithPagination(callRpc, from, to, logOptions);
121
+ });
122
+ return { ...base, request };
123
+ };
124
+ }
125
+ export {
126
+ fetchLogsWithPagination,
127
+ isFixedBlockRange,
128
+ isRangeError,
129
+ logSplitterTransport,
130
+ parsePageSizeHint
131
+ };
@@ -0,0 +1,126 @@
1
+ import { peripheryCompressorAbi } from "../../abi/compressors/peripheryCompressor.js";
2
+ import {
3
+ AddressMap,
4
+ AP_PERIPHERY_COMPRESSOR,
5
+ BasePlugin,
6
+ hexEq,
7
+ VERSION_RANGE_310
8
+ } from "../../sdk/index.js";
9
+ class ZappersPlugin extends BasePlugin {
10
+ #zappers;
11
+ #extraZappers;
12
+ constructor(extraZappers = [], loadOnAttach = false) {
13
+ super(loadOnAttach);
14
+ this.#extraZappers = this.#addExtraZappers(extraZappers);
15
+ }
16
+ async load(force) {
17
+ if (!force && this.loaded) {
18
+ return this.state;
19
+ }
20
+ const [pcAddr] = this.sdk.addressProvider.mustGetLatest(
21
+ AP_PERIPHERY_COMPRESSOR,
22
+ VERSION_RANGE_310
23
+ );
24
+ this.sdk.logger?.debug(
25
+ `loading zappers with periphery compressor ${pcAddr}`
26
+ );
27
+ const markets = this.sdk.marketRegister.markets;
28
+ const resp = await this.client.multicall({
29
+ contracts: markets.map(
30
+ (m) => ({
31
+ abi: peripheryCompressorAbi,
32
+ address: pcAddr,
33
+ functionName: "getZappers",
34
+ args: [m.configurator.address, m.pool.pool.address]
35
+ })
36
+ ),
37
+ allowFailure: true,
38
+ batchSize: 0,
39
+ blockNumber: this.sdk.currentBlock
40
+ });
41
+ this.#zappers = new AddressMap(void 0, "zappers");
42
+ for (let i = 0; i < resp.length; i++) {
43
+ const { status, result, error } = resp[i];
44
+ const marketConfigurator = markets[i].configurator.address;
45
+ const pool = markets[i].pool.pool.address;
46
+ if (status === "success") {
47
+ this.#zappers.upsert(
48
+ pool,
49
+ result.map((z) => ({ ...z, pool }))
50
+ );
51
+ } else {
52
+ this.sdk.logger?.error(
53
+ `failed to load zapper for market configurator ${this.labelAddress(
54
+ marketConfigurator
55
+ )} and pool ${this.labelAddress(pool)}: ${error}`
56
+ );
57
+ }
58
+ }
59
+ this.#loadZapperTokens();
60
+ return this.state;
61
+ }
62
+ #addExtraZappers(extraZappers) {
63
+ const zappers = new AddressMap();
64
+ for (const z of extraZappers) {
65
+ const existing = zappers?.get(z.pool);
66
+ if (existing) {
67
+ const hasZapper = existing.some(
68
+ (zz) => hexEq(zz.baseParams.addr, z.baseParams.addr)
69
+ );
70
+ if (!hasZapper) {
71
+ existing.push(z);
72
+ }
73
+ } else {
74
+ zappers?.upsert(z.pool, [z]);
75
+ }
76
+ }
77
+ return zappers;
78
+ }
79
+ get extraZappers() {
80
+ if (!this.#extraZappers) {
81
+ console.error("extra zappers not attached");
82
+ return new AddressMap();
83
+ }
84
+ return this.#extraZappers;
85
+ }
86
+ get zappers() {
87
+ if (!this.#zappers) {
88
+ throw new Error("zappers plugin not attached");
89
+ }
90
+ return this.#zappers;
91
+ }
92
+ get loaded() {
93
+ return !!this.#zappers;
94
+ }
95
+ stateHuman(_) {
96
+ return this.zappers.values().flatMap(
97
+ (l) => l.flatMap((z) => ({
98
+ address: z.baseParams.addr,
99
+ contractType: z.baseParams.contractType,
100
+ version: Number(z.baseParams.version),
101
+ tokenIn: this.labelAddress(z.tokenIn.addr),
102
+ tokenOut: this.labelAddress(z.tokenOut.addr)
103
+ }))
104
+ );
105
+ }
106
+ get state() {
107
+ return {
108
+ zappers: this.zappers.asRecord()
109
+ };
110
+ }
111
+ hydrate(state) {
112
+ this.#zappers = new AddressMap(Object.entries(state.zappers), "zappers");
113
+ this.#loadZapperTokens();
114
+ }
115
+ #loadZapperTokens() {
116
+ const zappersTokens = this.zappers.values().flatMap((l) => l.flatMap((z) => [z.tokenIn, z.tokenOut]));
117
+ const extraZappersTokens = this.extraZappers.values().flatMap((l) => l.flatMap((z) => [z.tokenIn, z.tokenOut]));
118
+ for (const t of [...zappersTokens, ...extraZappersTokens]) {
119
+ this.sdk.tokensMeta.upsert(t.addr, t);
120
+ this.sdk.setAddressLabel(t.addr, t.symbol);
121
+ }
122
+ }
123
+ }
124
+ export {
125
+ ZappersPlugin
126
+ };