@gearbox-protocol/sdk 14.12.0-next.1 → 14.12.0-next.3

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 (91) hide show
  1. package/dist/cjs/abi/iZapper.js +62 -24
  2. package/dist/cjs/preview/parse/errors.js +5 -2
  3. package/dist/cjs/preview/parse/index.js +2 -0
  4. package/dist/cjs/preview/parse/parseOperationCalldata.js +38 -1
  5. package/dist/cjs/preview/parse/parsePoolOperationCalldata.js +10 -2
  6. package/dist/cjs/preview/parse/parseRWAFactoryOperationCalldata.js +92 -0
  7. package/dist/cjs/preview/prerequisites/buildPrerequisites.js +57 -10
  8. package/dist/cjs/preview/simulate/errors.js +0 -7
  9. package/dist/cjs/preview/simulate/index.js +0 -3
  10. package/dist/cjs/preview/simulate/simulatePoolOperation.js +154 -29
  11. package/dist/cjs/sdk/MultichainSDK.js +1 -0
  12. package/dist/cjs/sdk/OnchainSDK.js +7 -3
  13. package/dist/cjs/sdk/market/MarketRegister.js +10 -5
  14. package/dist/cjs/sdk/market/ZapperRegister.js +54 -0
  15. package/dist/cjs/sdk/market/rwa/securitize/SecuritizeRWAFactory.js +20 -0
  16. package/dist/cjs/sdk/market/zapper/IERC20ZapperContract.js +3 -38
  17. package/dist/cjs/sdk/market/zapper/IETHZapperContract.js +3 -38
  18. package/dist/cjs/sdk/market/zapper/ZapperContract.js +109 -0
  19. package/dist/cjs/sdk/market/zapper/createZapper.js +12 -4
  20. package/dist/cjs/{preview/simulate/constants.js → sdk/market/zapper/errors.js} +15 -6
  21. package/dist/cjs/sdk/market/zapper/index.js +6 -2
  22. package/dist/cjs/sdk/market/zapper/types.js +16 -0
  23. package/dist/cjs/sdk/options.js +41 -17
  24. package/dist/esm/abi/iZapper.js +62 -24
  25. package/dist/esm/preview/parse/errors.js +3 -1
  26. package/dist/esm/preview/parse/index.js +1 -0
  27. package/dist/esm/preview/parse/parseOperationCalldata.js +41 -2
  28. package/dist/esm/preview/parse/parsePoolOperationCalldata.js +10 -2
  29. package/dist/esm/preview/parse/parseRWAFactoryOperationCalldata.js +71 -0
  30. package/dist/esm/preview/prerequisites/buildPrerequisites.js +57 -10
  31. package/dist/esm/preview/simulate/errors.js +0 -6
  32. package/dist/esm/preview/simulate/index.js +0 -2
  33. package/dist/esm/preview/simulate/simulatePoolOperation.js +155 -30
  34. package/dist/esm/sdk/MultichainSDK.js +1 -0
  35. package/dist/esm/sdk/OnchainSDK.js +7 -3
  36. package/dist/esm/sdk/market/MarketRegister.js +10 -5
  37. package/dist/esm/sdk/market/ZapperRegister.js +54 -0
  38. package/dist/esm/sdk/market/rwa/securitize/SecuritizeRWAFactory.js +23 -1
  39. package/dist/esm/sdk/market/zapper/IERC20ZapperContract.js +3 -38
  40. package/dist/esm/sdk/market/zapper/IETHZapperContract.js +3 -38
  41. package/dist/esm/sdk/market/zapper/ZapperContract.js +85 -0
  42. package/dist/esm/sdk/market/zapper/createZapper.js +12 -4
  43. package/dist/esm/sdk/market/zapper/errors.js +13 -0
  44. package/dist/esm/sdk/market/zapper/index.js +3 -1
  45. package/dist/esm/sdk/market/zapper/types.js +0 -0
  46. package/dist/esm/sdk/options.js +39 -15
  47. package/dist/types/abi/iERC20Zapper.d.ts +91 -23
  48. package/dist/types/abi/iETHZapper.d.ts +91 -23
  49. package/dist/types/abi/iZapper.d.ts +91 -23
  50. package/dist/types/preview/parse/classifyInnerOperations.d.ts +0 -2
  51. package/dist/types/preview/parse/errors.d.ts +1 -0
  52. package/dist/types/preview/parse/index.d.ts +1 -0
  53. package/dist/types/preview/parse/parseOperationCalldata.d.ts +3 -3
  54. package/dist/types/preview/parse/parseRWAFactoryOperationCalldata.d.ts +23 -0
  55. package/dist/types/preview/parse/types-pools.d.ts +61 -1
  56. package/dist/types/preview/prerequisites/buildPrerequisites.d.ts +1 -1
  57. package/dist/types/preview/simulate/errors.d.ts +6 -12
  58. package/dist/types/preview/simulate/index.d.ts +0 -1
  59. package/dist/types/preview/simulate/simulatePoolOperation.d.ts +22 -4
  60. package/dist/types/preview/simulate/types.d.ts +3 -16
  61. package/dist/types/sdk/MultichainSDK.d.ts +5 -0
  62. package/dist/types/sdk/OnchainSDK.d.ts +4 -0
  63. package/dist/types/sdk/market/MarketRegister.d.ts +15 -6
  64. package/dist/types/sdk/market/ZapperRegister.d.ts +25 -4
  65. package/dist/types/sdk/market/rwa/securitize/SecuritizeRWAFactory.d.ts +2 -1
  66. package/dist/types/sdk/market/zapper/IERC20ZapperContract.d.ts +93 -39
  67. package/dist/types/sdk/market/zapper/IETHZapperContract.d.ts +93 -39
  68. package/dist/types/sdk/market/zapper/ZapperContract.d.ts +35 -0
  69. package/dist/types/sdk/market/zapper/createZapper.d.ts +2 -4
  70. package/dist/types/sdk/market/zapper/errors.d.ts +10 -0
  71. package/dist/types/sdk/market/zapper/index.d.ts +3 -1
  72. package/dist/types/sdk/market/zapper/types.d.ts +64 -0
  73. package/dist/types/sdk/options.d.ts +10 -5
  74. package/dist/types/sdk/pools/types.d.ts +3 -3
  75. package/dist/types/sdk/types/state-human.d.ts +9 -0
  76. package/dist/types/sdk/types/state.d.ts +7 -0
  77. package/package.json +3 -3
  78. package/dist/cjs/preview/simulate/extractERC20Transfers.js +0 -47
  79. package/dist/cjs/preview/simulate/simulatePoolOpMulticall.js +0 -155
  80. package/dist/cjs/preview/simulate/simulatePoolOpV1.js +0 -106
  81. package/dist/cjs/sdk/market/zapper/Zapper.js +0 -47
  82. package/dist/esm/preview/simulate/constants.js +0 -4
  83. package/dist/esm/preview/simulate/extractERC20Transfers.js +0 -23
  84. package/dist/esm/preview/simulate/simulatePoolOpMulticall.js +0 -130
  85. package/dist/esm/preview/simulate/simulatePoolOpV1.js +0 -82
  86. package/dist/esm/sdk/market/zapper/Zapper.js +0 -23
  87. package/dist/types/preview/simulate/constants.d.ts +0 -6
  88. package/dist/types/preview/simulate/extractERC20Transfers.d.ts +0 -11
  89. package/dist/types/preview/simulate/simulatePoolOpMulticall.d.ts +0 -28
  90. package/dist/types/preview/simulate/simulatePoolOpV1.d.ts +0 -14
  91. package/dist/types/sdk/market/zapper/Zapper.d.ts +0 -13
@@ -18,45 +18,170 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var simulatePoolOperation_exports = {};
20
20
  __export(simulatePoolOperation_exports, {
21
+ computePoolOpBalanceChanges: () => computePoolOpBalanceChanges,
21
22
  simulatePoolOperation: () => simulatePoolOperation
22
23
  });
23
24
  module.exports = __toCommonJS(simulatePoolOperation_exports);
24
- var import_constants = require("./constants.js");
25
+ var import_generated = require("../../abi/310/generated.js");
26
+ var import_iERC20 = require("../../abi/iERC20.js");
27
+ var import_iZapper = require("../../abi/iZapper.js");
28
+ var import_sdk = require("../../sdk/index.js");
25
29
  var import_errors = require("./errors.js");
26
- var import_simulatePoolOpMulticall = require("./simulatePoolOpMulticall.js");
27
- var import_simulatePoolOpV1 = require("./simulatePoolOpV1.js");
30
+ var import_holders = require("./holders.js");
31
+ function previewRead(operation) {
32
+ switch (operation.operation) {
33
+ case "Deposit":
34
+ return { functionName: "previewDeposit", amount: operation.assets };
35
+ case "Mint":
36
+ return { functionName: "previewMint", amount: operation.shares };
37
+ case "Withdraw":
38
+ return { functionName: "previewWithdraw", amount: operation.assets };
39
+ case "Redeem":
40
+ return { functionName: "previewRedeem", amount: operation.shares };
41
+ }
42
+ }
43
+ function outsideToken(operation) {
44
+ switch (operation.operation) {
45
+ case "Deposit":
46
+ case "Mint":
47
+ return operation.tokenIn;
48
+ case "Withdraw":
49
+ case "Redeem":
50
+ return operation.tokenOut;
51
+ }
52
+ }
53
+ function previewContract(operation) {
54
+ const { functionName, amount } = previewRead(operation);
55
+ if (operation.zapper) {
56
+ return {
57
+ address: operation.zapper,
58
+ abi: import_iZapper.iZapperAbi,
59
+ functionName,
60
+ args: [amount]
61
+ };
62
+ }
63
+ return {
64
+ address: operation.pool,
65
+ abi: import_generated.iPoolV310Abi,
66
+ functionName,
67
+ args: [amount]
68
+ };
69
+ }
28
70
  async function simulatePoolOperation(input, options = {}) {
29
- const { sdk } = input;
30
- const { logger } = options;
31
- const useSimulateV1 = options.useSimulateV1 ?? import_constants.ETH_SIMULATE_V1_NETWORKS.has(sdk.networkType);
32
- logger?.debug(
33
- { wallet: input.wallet, to: input.to },
34
- "simulating pool operation"
35
- );
36
- const [v1, multicall] = await Promise.allSettled([
37
- useSimulateV1 ? (0, import_simulatePoolOpV1.simulatePoolOpV1)(input, options) : void 0,
38
- (0, import_simulatePoolOpMulticall.simulatePoolOpMulticall)(input, options)
39
- ]);
40
- if (v1.status === "fulfilled" && v1.value) {
41
- return { status: "success", ...v1.value };
71
+ const { sdk, operation, wallet } = input;
72
+ const { blockNumber, logger } = options;
73
+ const { pool } = operation;
74
+ try {
75
+ const holders = (0, import_holders.watchedHolders)(operation, wallet);
76
+ const tokens = [outsideToken(operation), pool];
77
+ const balanceCalls = holders.flatMap(
78
+ (holder) => tokens.map((token) => ({ holder, token }))
79
+ );
80
+ const balanceContracts = balanceCalls.map(
81
+ ({ holder, token }) => ({
82
+ address: token,
83
+ abi: import_iERC20.ierc20Abi,
84
+ functionName: "balanceOf",
85
+ args: [holder]
86
+ })
87
+ );
88
+ const preview = previewContract(operation);
89
+ let results;
90
+ try {
91
+ results = await sdk.client.multicall({
92
+ allowFailure: false,
93
+ // `undefined` lets viem read at `latest`; `blockNumber` is only set for
94
+ // testnet forks pinned to a specific block.
95
+ blockNumber,
96
+ contracts: [...balanceContracts, preview]
97
+ });
98
+ } catch (cause) {
99
+ throw new import_errors.PreviewSimulationError([
100
+ {
101
+ source: "multicall",
102
+ detail: (0, import_errors.decodeSimulationError)({
103
+ error: cause instanceof Error ? cause : new Error(String(cause))
104
+ })
105
+ }
106
+ ]);
107
+ }
108
+ const previewAmount = results[balanceContracts.length];
109
+ const balances = new import_sdk.AddressMap();
110
+ for (const [i, { holder, token }] of balanceCalls.entries()) {
111
+ const tokenBalances = balances.get(holder) ?? new import_sdk.AddressMap();
112
+ tokenBalances.upsert(token, results[i]);
113
+ balances.upsert(holder, tokenBalances);
114
+ }
115
+ const before = (token, holder) => balances.get(holder)?.get(token) ?? 0n;
116
+ return {
117
+ status: "success",
118
+ balanceChanges: computePoolOpBalanceChanges(
119
+ operation,
120
+ wallet,
121
+ previewAmount,
122
+ before
123
+ )
124
+ };
125
+ } catch (cause) {
126
+ const error = (0, import_errors.asPreviewSimulationError)(cause, "multicall");
127
+ logger?.error(error, "pool operation simulation failed");
128
+ return { status: "failure", error };
42
129
  }
43
- if (multicall.status === "fulfilled") {
44
- if (v1.status === "rejected") {
45
- logger?.debug(
46
- (0, import_errors.asPreviewSimulationError)(v1.reason, "eth_simulateV1"),
47
- "eth_simulateV1 flow failed; falling back to multicall result"
48
- );
130
+ }
131
+ function balanceLegs(operation, wallet, previewAmount) {
132
+ const { pool, receiver } = operation;
133
+ switch (operation.operation) {
134
+ case "Deposit":
135
+ return [
136
+ { address: wallet, token: operation.tokenIn, delta: -operation.assets },
137
+ { address: receiver, token: pool, delta: previewAmount }
138
+ ];
139
+ case "Mint":
140
+ return [
141
+ { address: wallet, token: operation.tokenIn, delta: -previewAmount },
142
+ { address: receiver, token: pool, delta: operation.shares }
143
+ ];
144
+ case "Withdraw":
145
+ return [
146
+ { address: operation.owner, token: pool, delta: -previewAmount },
147
+ {
148
+ address: receiver,
149
+ token: operation.tokenOut,
150
+ delta: operation.assets
151
+ }
152
+ ];
153
+ case "Redeem":
154
+ return [
155
+ { address: operation.owner, token: pool, delta: -operation.shares },
156
+ { address: receiver, token: operation.tokenOut, delta: previewAmount }
157
+ ];
158
+ }
159
+ }
160
+ function computePoolOpBalanceChanges(operation, wallet, previewAmount, before) {
161
+ const byAddress = new import_sdk.AddressMap();
162
+ for (const { address, token, delta } of balanceLegs(
163
+ operation,
164
+ wallet,
165
+ previewAmount
166
+ )) {
167
+ const beforeBalance = before(token, address);
168
+ const change = {
169
+ token,
170
+ before: beforeBalance,
171
+ after: beforeBalance + delta,
172
+ delta
173
+ };
174
+ const existing = byAddress.get(address);
175
+ if (existing) {
176
+ existing.changes.push(change);
177
+ } else {
178
+ byAddress.upsert(address, { address, changes: [change] });
49
179
  }
50
- return { status: "success", ...multicall.value };
51
180
  }
52
- const error = (0, import_errors.combinePreviewSimulationErrors)(
53
- v1.status === "rejected" ? (0, import_errors.asPreviewSimulationError)(v1.reason, "eth_simulateV1") : void 0,
54
- (0, import_errors.asPreviewSimulationError)(multicall.reason, "multicall")
55
- );
56
- logger?.error(error, "pool operation simulation failed");
57
- return { status: "failure", error };
181
+ return byAddress.values();
58
182
  }
59
183
  // Annotate the CommonJS export names for ESM import in node:
60
184
  0 && (module.exports = {
185
+ computePoolOpBalanceChanges,
61
186
  simulatePoolOperation
62
187
  });
@@ -81,6 +81,7 @@ class MultichainSDK {
81
81
  const perChainOpts = options?.perChain?.[network] ?? {};
82
82
  return sdk.attach({
83
83
  ...perChainOpts,
84
+ loadZappers: perChainOpts.loadZappers ?? options?.loadZappers,
84
85
  redstone: {
85
86
  ...options?.redstone,
86
87
  cache: this.#redstoneCache,
@@ -127,7 +127,8 @@ class OnchainSDK extends import_base.ChainContractsRegister {
127
127
  ignoreMarkets,
128
128
  marketConfigurators: mcs,
129
129
  redstone,
130
- pyth
130
+ pyth,
131
+ loadZappers
131
132
  } = options ?? {};
132
133
  const marketConfigurators = mcs ?? import_utils.TypedObjectUtils.keys(
133
134
  this.client.chain.defaultMarketConfigurators
@@ -196,6 +197,9 @@ class OnchainSDK extends import_base.ChainContractsRegister {
196
197
  blockNumber: this.currentBlock,
197
198
  gas: this.gasLimit
198
199
  });
200
+ if (loadZappers) {
201
+ await this.#marketRegister.loadZappers();
202
+ }
199
203
  }
200
204
  const pluginsList = import_utils.TypedObjectUtils.entries(this.plugins);
201
205
  const pluginResponse = await Promise.allSettled(
@@ -248,7 +252,7 @@ class OnchainSDK extends import_base.ChainContractsRegister {
248
252
  `address provider version: ${this.#addressProvider.version}`
249
253
  );
250
254
  this.#marketRegister = new import_MarketRegister.MarketRegister(this, ignoreMarkets);
251
- this.#marketRegister.hydrate(state.markets);
255
+ this.#marketRegister.hydrate(state);
252
256
  this.#rwa = new import_market.RWARegistry(this);
253
257
  this.#rwa.setState(state.rwa);
254
258
  for (const [name, plugin] of import_utils.TypedObjectUtils.entries(this.plugins)) {
@@ -313,7 +317,7 @@ class OnchainSDK extends import_base.ChainContractsRegister {
313
317
  currentBlock: this.currentBlock,
314
318
  timestamp: this.timestamp,
315
319
  addressProvider: this.addressProvider.state,
316
- markets: this.marketRegister.state,
320
+ ...this.marketRegister.state,
317
321
  rwa: this.#rwa.state,
318
322
  plugins: Object.fromEntries(
319
323
  import_utils.TypedObjectUtils.entries(this.plugins).map(([name, plugin]) => [
@@ -52,10 +52,11 @@ class MarketRegister extends import_ZapperRegister.ZapperRegister {
52
52
  * bypassing on-chain reads.
53
53
  * @param state - Array of market data snapshots.
54
54
  **/
55
- hydrate(state) {
56
- const configurators = new Set(state.map((m) => m.configurator));
55
+ hydrate({ markets, zappers }) {
56
+ const configurators = new Set(markets.map((m) => m.configurator));
57
57
  this.#setMarketFilter([...configurators]);
58
- this.#setMarkets(state);
58
+ this.#setMarkets(markets);
59
+ this.hydrateZappers(zappers);
59
60
  }
60
61
  /**
61
62
  * @internal
@@ -174,7 +175,10 @@ class MarketRegister extends import_ZapperRegister.ZapperRegister {
174
175
  * Serializable snapshot of all loaded markets, suitable for hydration.
175
176
  **/
176
177
  get state() {
177
- return this.markets.map((market) => market.state);
178
+ return {
179
+ markets: this.markets.map((market) => market.state),
180
+ zappers: this.zappersState
181
+ };
178
182
  }
179
183
  /**
180
184
  * Returns a human-readable snapshot of all markets.
@@ -182,7 +186,8 @@ class MarketRegister extends import_ZapperRegister.ZapperRegister {
182
186
  **/
183
187
  stateHuman(raw = true) {
184
188
  return {
185
- markets: this.markets.map((market) => market.stateHuman(raw))
189
+ markets: this.markets.map((market) => market.stateHuman(raw)),
190
+ zappers: this.zappersStateHuman(raw)
186
191
  };
187
192
  }
188
193
  /**
@@ -75,6 +75,60 @@ class ZapperRegister extends import_base.SDKConstruct {
75
75
  }
76
76
  }
77
77
  }
78
+ /**
79
+ * Serializable snapshot of all loaded zappers, suitable for hydration.
80
+ * Returns `undefined` when zappers were never loaded (i.e. `loadZappers` was
81
+ * not called), so the not-loaded state round-trips cleanly.
82
+ **/
83
+ get zappersState() {
84
+ if (!this.#zappers) {
85
+ return void 0;
86
+ }
87
+ return this.#zappers.values().flatMap(
88
+ (zappers) => zappers.map((z) => ({
89
+ pool: z.pool,
90
+ type: z.type,
91
+ baseParams: z.baseParams,
92
+ tokenIn: z.tokenIn,
93
+ tokenOut: z.tokenOut
94
+ }))
95
+ );
96
+ }
97
+ /**
98
+ * Restores zapper state from a previously serialized snapshot,
99
+ * bypassing on-chain reads.
100
+ * @param state - Array of zapper data snapshots, or `undefined` when zappers
101
+ * were not loaded in the snapshot (leaves the registry in the not-loaded state).
102
+ **/
103
+ hydrateZappers(state) {
104
+ if (!state) {
105
+ return;
106
+ }
107
+ this.#zappers = new import_utils.AddressMap(void 0, "zappers");
108
+ for (const z of state) {
109
+ this.#addZapper(z);
110
+ }
111
+ }
112
+ /**
113
+ * Returns a human-readable snapshot of all loaded zappers.
114
+ * Returns `undefined` when zappers were never loaded.
115
+ * @param raw - When `true`, includes raw/unformatted values.
116
+ **/
117
+ zappersStateHuman(_ = true) {
118
+ if (!this.#zappers) {
119
+ return void 0;
120
+ }
121
+ return this.#zappers.values().flatMap(
122
+ (zappers) => zappers.map((z) => ({
123
+ address: this.labelAddress(z.baseParams.addr),
124
+ contractType: z.contractType,
125
+ type: z.type,
126
+ pool: this.labelAddress(z.pool),
127
+ tokenIn: this.sdk.labelAddress(z.tokenIn.addr),
128
+ tokenOut: this.sdk.labelAddress(z.tokenOut.addr)
129
+ }))
130
+ );
131
+ }
78
132
  #addZapper(z) {
79
133
  const zapper = (0, import_zapper.createZapper)(this.sdk, z);
80
134
  const existing = this.zappers.get(z.pool);
@@ -70,6 +70,26 @@ class SecuritizeRWAFactory extends import_base.BaseContract {
70
70
  operators: [...t.operators]
71
71
  }));
72
72
  }
73
+ parseFunctionParamsV2(params, strict) {
74
+ switch (params.functionName) {
75
+ case "openCreditAccount": {
76
+ const [creditManager, calls] = params.args;
77
+ return {
78
+ creditManager,
79
+ calls: this.register.parseMultiCallV2([...calls], strict)
80
+ };
81
+ }
82
+ case "multicall": {
83
+ const [creditAccount, calls] = params.args;
84
+ return {
85
+ creditAccount,
86
+ calls: this.register.parseMultiCallV2([...calls], strict)
87
+ };
88
+ }
89
+ default:
90
+ return super.parseFunctionParamsV2(params, strict);
91
+ }
92
+ }
73
93
  /**
74
94
  * {@inheritDoc IRWAFactory.decodeInvestorData}
75
95
  */
@@ -22,27 +22,11 @@ __export(IERC20ZapperContract_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(IERC20ZapperContract_exports);
24
24
  var import_iERC20Zapper = require("../../../abi/iERC20Zapper.js");
25
- var import_base = require("../../base/index.js");
25
+ var import_ZapperContract = require("./ZapperContract.js");
26
26
  const abi = import_iERC20Zapper.ierc20ZapperAbi;
27
- class IERC20ZapperContract extends import_base.BaseContract {
28
- pool;
29
- type;
30
- baseParams;
31
- tokenIn;
32
- tokenOut;
27
+ class IERC20ZapperContract extends import_ZapperContract.ZapperContract {
33
28
  constructor(sdk, data) {
34
- super(sdk, {
35
- addr: data.baseParams.addr,
36
- abi,
37
- name: `ERC20Zapper(${sdk.labelAddress(data.baseParams.addr)})`,
38
- version: data.baseParams.version,
39
- contractType: data.baseParams.contractType
40
- });
41
- this.pool = data.pool;
42
- this.type = data.type;
43
- this.baseParams = data.baseParams;
44
- this.tokenIn = data.tokenIn;
45
- this.tokenOut = data.tokenOut;
29
+ super(sdk, data, abi, "ERC20Zapper");
46
30
  }
47
31
  /**
48
32
  * Deposits ERC20 tokens into the pool via this zapper.
@@ -72,25 +56,6 @@ class IERC20ZapperContract extends import_base.BaseContract {
72
56
  args: [tokenInAmount, receiver, referralCode, deadline, v, r, s]
73
57
  });
74
58
  }
75
- /**
76
- * Redeems pool shares (diesel tokens) for the underlying asset via this zapper.
77
- */
78
- redeem(tokenInAmount, receiver) {
79
- return this.createRawTx({
80
- functionName: "redeem",
81
- args: [tokenInAmount, receiver]
82
- });
83
- }
84
- /**
85
- * Redeems pool shares via this zapper with an EIP-2612 permit signature,
86
- * skipping a separate approve transaction.
87
- */
88
- redeemWithPermit(tokenInAmount, receiver, deadline, v, r, s) {
89
- return this.createRawTx({
90
- functionName: "redeemWithPermit",
91
- args: [tokenInAmount, receiver, deadline, v, r, s]
92
- });
93
- }
94
59
  }
95
60
  // Annotate the CommonJS export names for ESM import in node:
96
61
  0 && (module.exports = {
@@ -22,27 +22,11 @@ __export(IETHZapperContract_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(IETHZapperContract_exports);
24
24
  var import_iETHZapper = require("../../../abi/iETHZapper.js");
25
- var import_base = require("../../base/index.js");
25
+ var import_ZapperContract = require("./ZapperContract.js");
26
26
  const abi = import_iETHZapper.iethZapperAbi;
27
- class IETHZapperContract extends import_base.BaseContract {
28
- pool;
29
- type;
30
- baseParams;
31
- tokenIn;
32
- tokenOut;
27
+ class IETHZapperContract extends import_ZapperContract.ZapperContract {
33
28
  constructor(sdk, data) {
34
- super(sdk, {
35
- addr: data.baseParams.addr,
36
- abi,
37
- name: `ETHZapper(${sdk.labelAddress(data.baseParams.addr)})`,
38
- version: data.baseParams.version,
39
- contractType: data.baseParams.contractType
40
- });
41
- this.pool = data.pool;
42
- this.type = data.type;
43
- this.baseParams = data.baseParams;
44
- this.tokenIn = data.tokenIn;
45
- this.tokenOut = data.tokenOut;
29
+ super(sdk, data, abi, "ETHZapper");
46
30
  }
47
31
  /**
48
32
  * Deposits native ETH into the pool via this zapper.
@@ -63,25 +47,6 @@ class IETHZapperContract extends import_base.BaseContract {
63
47
  args: [receiver, referralCode]
64
48
  });
65
49
  }
66
- /**
67
- * Redeems pool shares (diesel tokens) for the underlying asset via this zapper.
68
- */
69
- redeem(tokenInAmount, receiver) {
70
- return this.createRawTx({
71
- functionName: "redeem",
72
- args: [tokenInAmount, receiver]
73
- });
74
- }
75
- /**
76
- * Redeems pool shares via this zapper with an EIP-2612 permit signature,
77
- * skipping a separate approve transaction.
78
- */
79
- redeemWithPermit(tokenInAmount, receiver, deadline, v, r, s) {
80
- return this.createRawTx({
81
- functionName: "redeemWithPermit",
82
- args: [tokenInAmount, receiver, deadline, v, r, s]
83
- });
84
- }
85
50
  }
86
51
  // Annotate the CommonJS export names for ESM import in node:
87
52
  0 && (module.exports = {
@@ -0,0 +1,109 @@
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 ZapperContract_exports = {};
20
+ __export(ZapperContract_exports, {
21
+ ZapperContract: () => ZapperContract
22
+ });
23
+ module.exports = __toCommonJS(ZapperContract_exports);
24
+ var import_iZapper = require("../../../abi/iZapper.js");
25
+ var import_base = require("../../base/index.js");
26
+ var import_errors = require("./errors.js");
27
+ class ZapperContract extends import_base.BaseContract {
28
+ sdk;
29
+ pool;
30
+ type;
31
+ baseParams;
32
+ tokenIn;
33
+ tokenOut;
34
+ constructor(sdk, data, abi = import_iZapper.iZapperAbi, namePrefix = "Zapper") {
35
+ super(sdk, {
36
+ addr: data.baseParams.addr,
37
+ abi,
38
+ name: `${namePrefix}(${sdk.labelAddress(data.baseParams.addr)})`,
39
+ version: data.baseParams.version,
40
+ contractType: data.baseParams.contractType
41
+ });
42
+ this.sdk = sdk;
43
+ this.pool = data.pool;
44
+ this.type = data.type;
45
+ this.baseParams = data.baseParams;
46
+ this.tokenIn = data.tokenIn;
47
+ this.tokenOut = data.tokenOut;
48
+ }
49
+ /**
50
+ * Decodes zapper calldata into {@link ParsedZapperOperation}.
51
+ * Throws {@link UnsupportedZapperFunctionError} for unknown selectors.
52
+ */
53
+ parseOperation(calldata, value) {
54
+ const parsed = this.parseFunctionDataV2(calldata);
55
+ const { rawArgs } = parsed;
56
+ const pool = this.pool;
57
+ const zapper = this.address;
58
+ const token = this.tokenIn.addr;
59
+ const underlying = this.sdk.marketRegister.findByPool(pool).underlying;
60
+ const receiver = rawArgs.receiver;
61
+ if (parsed.functionName.startsWith("deposit")) {
62
+ return {
63
+ operation: "Deposit",
64
+ pool,
65
+ zapper,
66
+ receiver,
67
+ assets: rawArgs.tokenInAmount ?? value ?? 0n,
68
+ token,
69
+ underlying,
70
+ referralCode: rawArgs.referralCode
71
+ };
72
+ }
73
+ if (parsed.functionName.startsWith("redeem")) {
74
+ return {
75
+ operation: "Redeem",
76
+ pool,
77
+ zapper,
78
+ receiver,
79
+ shares: rawArgs.tokenOutAmount,
80
+ token,
81
+ underlying
82
+ };
83
+ }
84
+ throw new import_errors.UnsupportedZapperFunctionError(zapper, parsed.functionName);
85
+ }
86
+ /**
87
+ * Redeems pool shares (diesel tokens) for the underlying asset via this zapper.
88
+ */
89
+ redeem(tokenInAmount, receiver) {
90
+ return this.createRawTx({
91
+ functionName: "redeem",
92
+ args: [tokenInAmount, receiver]
93
+ });
94
+ }
95
+ /**
96
+ * Redeems pool shares via this zapper with an EIP-2612 permit signature,
97
+ * skipping a separate approve transaction.
98
+ */
99
+ redeemWithPermit(tokenInAmount, receiver, deadline, v, r, s) {
100
+ return this.createRawTx({
101
+ functionName: "redeemWithPermit",
102
+ args: [tokenInAmount, receiver, deadline, v, r, s]
103
+ });
104
+ }
105
+ }
106
+ // Annotate the CommonJS export names for ESM import in node:
107
+ 0 && (module.exports = {
108
+ ZapperContract
109
+ });
@@ -21,23 +21,31 @@ __export(createZapper_exports, {
21
21
  createZapper: () => createZapper
22
22
  });
23
23
  module.exports = __toCommonJS(createZapper_exports);
24
+ var import_utils = require("../../utils/index.js");
24
25
  var import_IERC20ZapperContract = require("./IERC20ZapperContract.js");
25
26
  var import_IETHZapperContract = require("./IETHZapperContract.js");
26
- var import_Zapper = require("./Zapper.js");
27
+ var import_ZapperContract = require("./ZapperContract.js");
27
28
  function createZapper(sdk, data) {
29
+ const existing = sdk.getContract(data.baseParams.addr);
30
+ if (existing) {
31
+ return existing;
32
+ }
28
33
  if (data.type === "base") {
29
- const contractType = import_Zapper.Zapper.contractType(data.baseParams);
34
+ const contractType = (0, import_utils.bytes32ToString)(data.baseParams.contractType);
30
35
  switch (contractType) {
31
36
  case "ZAPPER::ERC4626_UNDERLYING":
32
37
  return new import_IERC20ZapperContract.IERC20ZapperContract(sdk, data);
33
38
  case "ZAPPER::WETH_DEPOSIT":
34
39
  return new import_IETHZapperContract.IETHZapperContract(sdk, data);
35
40
  default:
41
+ if (sdk.strictContractTypes) {
42
+ throw new Error(`Unknown zapper contract type: ${contractType}`);
43
+ }
36
44
  sdk.logger?.warn(`Unknown zapper contract type: ${contractType}`);
37
- return new import_Zapper.Zapper(data);
45
+ return new import_ZapperContract.ZapperContract(sdk, data);
38
46
  }
39
47
  }
40
- return new import_Zapper.Zapper(data);
48
+ return new import_ZapperContract.ZapperContract(sdk, data);
41
49
  }
42
50
  // Annotate the CommonJS export names for ESM import in node:
43
51
  0 && (module.exports = {
@@ -16,13 +16,22 @@ 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 constants_exports = {};
20
- __export(constants_exports, {
21
- ETH_SIMULATE_V1_NETWORKS: () => ETH_SIMULATE_V1_NETWORKS
19
+ var errors_exports = {};
20
+ __export(errors_exports, {
21
+ UnsupportedZapperFunctionError: () => UnsupportedZapperFunctionError
22
22
  });
23
- module.exports = __toCommonJS(constants_exports);
24
- const ETH_SIMULATE_V1_NETWORKS = /* @__PURE__ */ new Set(["Mainnet", "Plasma", "Somnia"]);
23
+ module.exports = __toCommonJS(errors_exports);
24
+ class UnsupportedZapperFunctionError extends Error {
25
+ zapper;
26
+ functionName;
27
+ constructor(zapper, functionName) {
28
+ super(`unsupported zapper function "${functionName}" on ${zapper}`);
29
+ this.name = "UnsupportedZapperFunctionError";
30
+ this.zapper = zapper;
31
+ this.functionName = functionName;
32
+ }
33
+ }
25
34
  // Annotate the CommonJS export names for ESM import in node:
26
35
  0 && (module.exports = {
27
- ETH_SIMULATE_V1_NETWORKS
36
+ UnsupportedZapperFunctionError
28
37
  });
@@ -16,13 +16,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
16
16
  var zapper_exports = {};
17
17
  module.exports = __toCommonJS(zapper_exports);
18
18
  __reExport(zapper_exports, require("./createZapper.js"), module.exports);
19
+ __reExport(zapper_exports, require("./errors.js"), module.exports);
19
20
  __reExport(zapper_exports, require("./IERC20ZapperContract.js"), module.exports);
20
21
  __reExport(zapper_exports, require("./IETHZapperContract.js"), module.exports);
21
- __reExport(zapper_exports, require("./Zapper.js"), module.exports);
22
+ __reExport(zapper_exports, require("./types.js"), module.exports);
23
+ __reExport(zapper_exports, require("./ZapperContract.js"), module.exports);
22
24
  // Annotate the CommonJS export names for ESM import in node:
23
25
  0 && (module.exports = {
24
26
  ...require("./createZapper.js"),
27
+ ...require("./errors.js"),
25
28
  ...require("./IERC20ZapperContract.js"),
26
29
  ...require("./IETHZapperContract.js"),
27
- ...require("./Zapper.js")
30
+ ...require("./types.js"),
31
+ ...require("./ZapperContract.js")
28
32
  });