@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
|
@@ -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
|
|
20
|
-
__export(
|
|
21
|
-
|
|
19
|
+
var PoolServiceV310_exports = {};
|
|
20
|
+
__export(PoolServiceV310_exports, {
|
|
21
|
+
PoolServiceV310: () => PoolServiceV310
|
|
22
22
|
});
|
|
23
|
-
module.exports = __toCommonJS(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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("./
|
|
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("./
|
|
23
|
+
...require("./AbstractPoolService.js"),
|
|
24
|
+
...require("./createPoolService.js"),
|
|
23
25
|
...require("./types.js")
|
|
24
26
|
});
|
|
@@ -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:
|
|
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
|
|
522
|
-
abi:
|
|
523
|
-
functionName:
|
|
524
|
-
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 });
|
package/dist/esm/dev/index.js
CHANGED
|
@@ -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
|
+
};
|
|
@@ -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
|
+
};
|