@gearbox-protocol/sdk 13.7.0-kyc.3 → 14.0.0-next.10
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/RevolverTransport.js +10 -4
- package/dist/cjs/dev/index.js +0 -2
- package/dist/cjs/dev/logSplitterTransport.js +10 -1
- package/dist/cjs/permissionless/utils/create2.js +2 -2
- package/dist/cjs/permissionless/utils/price-update/get-price-feeds.js +11 -5
- package/dist/cjs/permissionless/utils/price-update/get-price-update-tx.js +11 -5
- package/dist/cjs/permissionless/utils/price-update/get-prices.js +12 -6
- package/dist/cjs/sdk/MultichainSDK.js +232 -0
- package/dist/cjs/sdk/OnchainSDK.js +478 -0
- package/dist/cjs/sdk/accounts/AbstractCreditAccountsService.js +16 -324
- package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +1 -7
- package/dist/cjs/sdk/base/TokensMeta.js +42 -22
- package/dist/cjs/sdk/base/token-types.js +0 -9
- package/dist/cjs/sdk/chain/chains.js +1 -2
- package/dist/cjs/sdk/constants/address-provider.js +0 -3
- package/dist/cjs/sdk/core/errors.js +77 -0
- package/dist/cjs/sdk/core/index.js +2 -0
- package/dist/cjs/sdk/index.js +4 -2
- package/dist/cjs/sdk/market/MarketRegister.js +116 -70
- package/dist/cjs/sdk/market/MarketSuite.js +0 -3
- package/dist/cjs/sdk/market/index.js +0 -2
- package/dist/cjs/sdk/market/pool/PoolSuite.js +0 -3
- package/dist/cjs/sdk/market/pool/PoolV310Contract.js +2 -11
- package/dist/cjs/sdk/market/pool/index.js +0 -2
- package/dist/cjs/sdk/market/pricefeeds/PriceFeedsRegister.js +10 -3
- package/dist/cjs/sdk/market/pricefeeds/updates/PythAccumulatorUpdateData.js +20 -23
- package/dist/cjs/sdk/market/pricefeeds/updates/PythUpdater.js +7 -4
- package/dist/cjs/sdk/market/pricefeeds/updates/RedstoneUpdater.js +4 -4
- package/dist/cjs/sdk/market/pricefeeds/updates/fetchPythPayloads.js +1 -1
- package/dist/cjs/sdk/market/pricefeeds/updates/index.js +3 -0
- package/dist/cjs/sdk/options.js +24 -52
- package/dist/cjs/sdk/plugins/BasePlugin.js +11 -4
- package/dist/cjs/sdk/pools/PoolService.js +12 -104
- package/dist/cjs/sdk/utils/formatter.js +99 -20
- package/dist/cjs/sdk/utils/viem/index.js +3 -3
- package/dist/cjs/sdk/utils/viem/watchBlocksAsync.js +76 -0
- package/dist/esm/dev/AccountOpener.js +6 -47
- package/dist/esm/dev/RevolverTransport.js +10 -4
- package/dist/esm/dev/index.js +0 -1
- package/dist/esm/dev/logSplitterTransport.js +10 -1
- package/dist/esm/permissionless/utils/create2.js +1 -1
- package/dist/esm/permissionless/utils/price-update/get-price-feeds.js +12 -6
- package/dist/esm/permissionless/utils/price-update/get-price-update-tx.js +13 -7
- package/dist/esm/permissionless/utils/price-update/get-prices.js +13 -7
- package/dist/esm/sdk/MultichainSDK.js +217 -0
- package/dist/esm/sdk/OnchainSDK.js +472 -0
- package/dist/esm/sdk/accounts/AbstractCreditAccountsService.js +17 -328
- package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +1 -7
- package/dist/esm/sdk/base/TokensMeta.js +44 -22
- package/dist/esm/sdk/base/token-types.js +0 -6
- package/dist/esm/sdk/chain/chains.js +1 -2
- package/dist/esm/sdk/constants/address-provider.js +0 -2
- package/dist/esm/sdk/core/errors.js +48 -0
- package/dist/esm/sdk/core/index.js +1 -0
- package/dist/esm/sdk/index.js +2 -1
- package/dist/esm/sdk/market/MarketRegister.js +118 -74
- package/dist/esm/sdk/market/MarketSuite.js +0 -3
- 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 -11
- package/dist/esm/sdk/market/pool/index.js +0 -1
- package/dist/esm/sdk/market/pricefeeds/PriceFeedsRegister.js +10 -3
- package/dist/esm/sdk/market/pricefeeds/updates/PythAccumulatorUpdateData.js +20 -13
- package/dist/esm/sdk/market/pricefeeds/updates/PythUpdater.js +7 -4
- package/dist/esm/sdk/market/pricefeeds/updates/RedstoneUpdater.js +4 -4
- package/dist/esm/sdk/market/pricefeeds/updates/fetchPythPayloads.js +1 -1
- package/dist/esm/sdk/market/pricefeeds/updates/index.js +2 -0
- package/dist/esm/sdk/options.js +22 -51
- package/dist/esm/sdk/plugins/BasePlugin.js +11 -4
- package/dist/esm/sdk/pools/PoolService.js +13 -109
- package/dist/esm/sdk/utils/formatter.js +99 -10
- package/dist/esm/sdk/utils/viem/index.js +1 -1
- package/dist/esm/sdk/utils/viem/watchBlocksAsync.js +52 -0
- package/dist/types/dev/RevolverTransport.d.ts +2 -1
- package/dist/types/dev/calcLiquidatableLTs.d.ts +2 -2
- package/dist/types/dev/claimFromFaucet.d.ts +2 -2
- package/dist/types/dev/create2.d.ts +3 -4
- package/dist/types/dev/index.d.ts +0 -1
- package/dist/types/dev/logSplitterTransport.d.ts +3 -1
- package/dist/types/dev/migrateFaucet.d.ts +2 -2
- package/dist/types/dev/mint/AbstractMinter.d.ts +2 -2
- package/dist/types/dev/mint/FallbackMinter.d.ts +2 -2
- package/dist/types/dev/mint/factory.d.ts +2 -2
- package/dist/types/dev/replaceStorage.d.ts +1 -1
- package/dist/types/permissionless/utils/price-update/get-updatable-feeds.d.ts +2 -2
- package/dist/types/plugins/accounts/AccountsPlugin.d.ts +2 -2
- package/dist/types/plugins/accounts-counter/AccountsCounterPlugin.d.ts +2 -2
- package/dist/types/plugins/adapters/AdaptersPlugin.d.ts +2 -2
- package/dist/types/plugins/apy/ApyPlugin.d.ts +2 -2
- package/dist/types/plugins/bots/BotsPlugin.d.ts +2 -2
- package/dist/types/plugins/bots/PartialLiquidationBotV310Contract.d.ts +2 -2
- package/dist/types/plugins/degen-distributors/DegenDistributorsPlugin.d.ts +2 -2
- package/dist/types/plugins/delayed-withdrawal/DelayedWithdrawalPlugin.d.ts +2 -2
- package/dist/types/sdk/MultichainSDK.d.ts +144 -0
- package/dist/types/sdk/OnchainSDK.d.ts +257 -0
- package/dist/types/sdk/accounts/AbstractCreditAccountsService.d.ts +4 -54
- package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +1 -1
- package/dist/types/sdk/accounts/createCreditAccountService.d.ts +2 -2
- package/dist/types/sdk/accounts/types.d.ts +15 -95
- package/dist/types/sdk/base/SDKConstruct.d.ts +4 -4
- package/dist/types/sdk/base/TokensMeta.d.ts +3 -14
- package/dist/types/sdk/base/token-types.d.ts +4 -44
- package/dist/types/sdk/base/types.d.ts +2 -116
- package/dist/types/sdk/chain/chains.d.ts +1 -5
- package/dist/types/sdk/constants/address-provider.d.ts +0 -1
- package/dist/types/sdk/core/createAddressProvider.d.ts +3 -3
- package/dist/types/sdk/core/errors.d.ts +51 -0
- package/dist/types/sdk/core/index.d.ts +1 -0
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/market/MarketRegister.d.ts +11 -8
- package/dist/types/sdk/market/MarketSuite.d.ts +2 -4
- package/dist/types/sdk/market/adapters/createAdapter.d.ts +2 -2
- package/dist/types/sdk/market/credit/CreditConfiguratorV310Contract.d.ts +3 -3
- package/dist/types/sdk/market/credit/CreditManagerV310Contract.d.ts +2 -2
- package/dist/types/sdk/market/credit/CreditSuite.d.ts +2 -2
- package/dist/types/sdk/market/credit/createCreditConfigurator.d.ts +2 -2
- package/dist/types/sdk/market/credit/createCreditFacade.d.ts +2 -2
- package/dist/types/sdk/market/credit/createCreditManager.d.ts +2 -2
- package/dist/types/sdk/market/credit/types.d.ts +1 -1
- package/dist/types/sdk/market/index.d.ts +0 -1
- package/dist/types/sdk/market/loss-policy/AliasLossPolicyV310Contract.d.ts +3 -3
- package/dist/types/sdk/market/loss-policy/createLossPolicy.d.ts +2 -2
- package/dist/types/sdk/market/oracle/PriceOracleBaseContract.d.ts +5 -6
- package/dist/types/sdk/market/oracle/PriceOracleV310Contract.d.ts +2 -2
- package/dist/types/sdk/market/oracle/createPriceOracle.d.ts +2 -2
- package/dist/types/sdk/market/oracle/types.d.ts +10 -3
- package/dist/types/sdk/market/pool/PoolSuite.d.ts +2 -4
- package/dist/types/sdk/market/pool/PoolV310Contract.d.ts +2 -6
- package/dist/types/sdk/market/pool/createInterestRateModel.d.ts +2 -2
- package/dist/types/sdk/market/pool/createPool.d.ts +2 -2
- package/dist/types/sdk/market/pool/createPoolQuotaKeeper.d.ts +2 -2
- package/dist/types/sdk/market/pool/createRateKeeper.d.ts +2 -2
- package/dist/types/sdk/market/pool/index.d.ts +0 -1
- package/dist/types/sdk/market/pricefeeds/PriceFeedsRegister.d.ts +8 -3
- package/dist/types/sdk/market/pricefeeds/updates/PythAccumulatorUpdateData.d.ts +12 -13
- package/dist/types/sdk/market/pricefeeds/updates/PythUpdater.d.ts +8 -3
- package/dist/types/sdk/market/pricefeeds/updates/RedstoneUpdater.d.ts +8 -3
- package/dist/types/sdk/market/pricefeeds/updates/index.d.ts +1 -0
- package/dist/types/sdk/market/pricefeeds/updates/types.d.ts +4 -0
- package/dist/types/sdk/market/types.d.ts +1 -1
- package/dist/types/sdk/options.d.ts +15 -16
- package/dist/types/sdk/plugins/BasePlugin.d.ts +12 -6
- package/dist/types/sdk/plugins/errors.d.ts +2 -2
- package/dist/types/sdk/plugins/types.d.ts +16 -6
- package/dist/types/sdk/pools/PoolService.d.ts +8 -8
- package/dist/types/sdk/pools/types.d.ts +2 -3
- package/dist/types/sdk/router/AbstractRouterContract.d.ts +3 -3
- package/dist/types/sdk/router/RouterV310Contract.d.ts +2 -2
- package/dist/types/sdk/router/createRouter.d.ts +2 -2
- package/dist/types/sdk/router/helpers.d.ts +1 -1
- package/dist/types/sdk/types/state-human.d.ts +10 -2
- package/dist/types/sdk/types/state.d.ts +14 -8
- package/dist/types/sdk/utils/filterDust.d.ts +2 -2
- package/dist/types/sdk/utils/formatter.d.ts +1 -1
- package/dist/types/sdk/utils/isDust.d.ts +2 -2
- package/dist/types/sdk/utils/toAddress.d.ts +1 -1
- package/dist/types/sdk/utils/viem/getLogsPaginated.d.ts +1 -2
- package/dist/types/sdk/utils/viem/getLogsSafe.d.ts +1 -1
- package/dist/types/sdk/utils/viem/index.d.ts +1 -1
- package/dist/types/sdk/utils/viem/simulateWithPriceUpdates.d.ts +1 -2
- package/dist/types/sdk/utils/viem/watchBlocksAsync.d.ts +74 -0
- package/package.json +3 -6
- package/dist/cjs/abi/kyc/iDSRegistryService.js +0 -70
- package/dist/cjs/abi/kyc/iDSToken.js +0 -71
- package/dist/cjs/abi/kyc/iKYCCompressor.js +0 -196
- package/dist/cjs/abi/kyc/iKYCFactory.js +0 -122
- package/dist/cjs/abi/kyc/iKYCUnderlying.js +0 -401
- package/dist/cjs/abi/kyc/iSecuritizeDegenNFT.js +0 -326
- package/dist/cjs/abi/kyc/iSecuritizeKYCFactory.js +0 -319
- package/dist/cjs/dev/CachedStateSubscriber.js +0 -78
- package/dist/cjs/sdk/GearboxSDK.js +0 -696
- package/dist/cjs/sdk/market/kyc/KYCRegistry.js +0 -269
- package/dist/cjs/sdk/market/kyc/index.js +0 -26
- package/dist/cjs/sdk/market/kyc/securitize/SecuritizeKYCFactory.js +0 -244
- package/dist/cjs/sdk/market/kyc/securitize/constants.js +0 -28
- package/dist/cjs/sdk/market/kyc/securitize/index.js +0 -26
- package/dist/cjs/sdk/market/kyc/securitize/types.js +0 -16
- package/dist/cjs/sdk/market/kyc/types.js +0 -34
- package/dist/cjs/sdk/utils/viem/executeDelegatedMulticalls.js +0 -38
- package/dist/esm/abi/kyc/iDSRegistryService.js +0 -46
- package/dist/esm/abi/kyc/iDSToken.js +0 -47
- package/dist/esm/abi/kyc/iKYCCompressor.js +0 -172
- package/dist/esm/abi/kyc/iKYCFactory.js +0 -98
- package/dist/esm/abi/kyc/iKYCUnderlying.js +0 -377
- package/dist/esm/abi/kyc/iSecuritizeDegenNFT.js +0 -302
- package/dist/esm/abi/kyc/iSecuritizeKYCFactory.js +0 -295
- package/dist/esm/dev/CachedStateSubscriber.js +0 -54
- package/dist/esm/sdk/GearboxSDK.js +0 -689
- package/dist/esm/sdk/market/kyc/KYCRegistry.js +0 -253
- package/dist/esm/sdk/market/kyc/index.js +0 -3
- package/dist/esm/sdk/market/kyc/securitize/SecuritizeKYCFactory.js +0 -220
- package/dist/esm/sdk/market/kyc/securitize/constants.js +0 -4
- package/dist/esm/sdk/market/kyc/securitize/index.js +0 -3
- package/dist/esm/sdk/market/kyc/securitize/types.js +0 -0
- package/dist/esm/sdk/market/kyc/types.js +0 -9
- package/dist/esm/sdk/utils/viem/executeDelegatedMulticalls.js +0 -14
- package/dist/types/abi/kyc/iDSRegistryService.d.ts +0 -71
- package/dist/types/abi/kyc/iDSToken.d.ts +0 -67
- package/dist/types/abi/kyc/iKYCCompressor.d.ts +0 -228
- package/dist/types/abi/kyc/iKYCFactory.d.ts +0 -139
- package/dist/types/abi/kyc/iKYCUnderlying.d.ts +0 -548
- package/dist/types/abi/kyc/iSecuritizeDegenNFT.d.ts +0 -404
- package/dist/types/abi/kyc/iSecuritizeKYCFactory.d.ts +0 -376
- package/dist/types/dev/CachedStateSubscriber.d.ts +0 -21
- package/dist/types/sdk/GearboxSDK.d.ts +0 -324
- package/dist/types/sdk/market/kyc/KYCRegistry.d.ts +0 -52
- package/dist/types/sdk/market/kyc/index.d.ts +0 -3
- package/dist/types/sdk/market/kyc/securitize/SecuritizeKYCFactory.d.ts +0 -428
- package/dist/types/sdk/market/kyc/securitize/constants.d.ts +0 -1
- package/dist/types/sdk/market/kyc/securitize/index.d.ts +0 -3
- package/dist/types/sdk/market/kyc/securitize/types.d.ts +0 -127
- package/dist/types/sdk/market/kyc/types.d.ts +0 -170
- package/dist/types/sdk/utils/viem/executeDelegatedMulticalls.d.ts +0 -28
|
@@ -0,0 +1,478 @@
|
|
|
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 OnchainSDK_exports = {};
|
|
20
|
+
__export(OnchainSDK_exports, {
|
|
21
|
+
OnchainSDK: () => OnchainSDK,
|
|
22
|
+
STATE_VERSION: () => STATE_VERSION
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(OnchainSDK_exports);
|
|
25
|
+
var import_viem = require("viem");
|
|
26
|
+
var import_base = require("./base/index.js");
|
|
27
|
+
var import_chain = require("./chain/index.js");
|
|
28
|
+
var import_constants = require("./constants/index.js");
|
|
29
|
+
var import_core = require("./core/index.js");
|
|
30
|
+
var import_MarketRegister = require("./market/MarketRegister.js");
|
|
31
|
+
var import_pricefeeds = require("./market/pricefeeds/index.js");
|
|
32
|
+
var import_plugins = require("./plugins/index.js");
|
|
33
|
+
var import_router = require("./router/index.js");
|
|
34
|
+
var import_utils = require("./utils/index.js");
|
|
35
|
+
var import_viem2 = require("./utils/viem/index.js");
|
|
36
|
+
const STATE_VERSION = 1;
|
|
37
|
+
function createViemClient(opts, chain) {
|
|
38
|
+
if ("client" in opts) {
|
|
39
|
+
return opts.client;
|
|
40
|
+
}
|
|
41
|
+
let transport;
|
|
42
|
+
if ("transport" in opts) {
|
|
43
|
+
transport = opts.transport;
|
|
44
|
+
} else {
|
|
45
|
+
const rpcs = opts.rpcURLs.map(
|
|
46
|
+
(url) => (0, import_viem.http)(url, {
|
|
47
|
+
...opts.httpTransportOptions,
|
|
48
|
+
timeout: opts.timeout,
|
|
49
|
+
retryCount: opts.retryCount
|
|
50
|
+
})
|
|
51
|
+
);
|
|
52
|
+
transport = rpcs.length > 1 ? (0, import_viem.fallback)(rpcs) : rpcs[0];
|
|
53
|
+
}
|
|
54
|
+
return (0, import_viem.createPublicClient)({ transport, chain });
|
|
55
|
+
}
|
|
56
|
+
class OnchainSDK extends import_base.ChainContractsRegister {
|
|
57
|
+
/** Registered plugin instances, keyed by plugin name. */
|
|
58
|
+
plugins;
|
|
59
|
+
#currentBlock;
|
|
60
|
+
#timestamp;
|
|
61
|
+
#syncing = false;
|
|
62
|
+
#attached = false;
|
|
63
|
+
#addressProvider;
|
|
64
|
+
#marketRegister;
|
|
65
|
+
#priceFeeds;
|
|
66
|
+
/**
|
|
67
|
+
* Gas limit applied to read-only `eth_call` requests.
|
|
68
|
+
**/
|
|
69
|
+
gasLimit;
|
|
70
|
+
/**
|
|
71
|
+
* When `true`, the SDK throws on unrecognised contract types.
|
|
72
|
+
**/
|
|
73
|
+
strictContractTypes;
|
|
74
|
+
/**
|
|
75
|
+
* @param network - Gearbox network type (e.g. `"Mainnet"`, `"Monad"`).
|
|
76
|
+
* @param clientOptions - Connection options (RPC URLs, transport, or client).
|
|
77
|
+
* @param options - SDK configuration options.
|
|
78
|
+
*/
|
|
79
|
+
constructor(network, clientOptions, options) {
|
|
80
|
+
const gearboxChain = (0, import_chain.getChain)(network);
|
|
81
|
+
if ("client" in clientOptions) {
|
|
82
|
+
const clientChainId = clientOptions.client.chain?.id;
|
|
83
|
+
if (clientChainId !== void 0 && clientChainId !== gearboxChain.id) {
|
|
84
|
+
throw new import_core.SdkChainMismatchError(gearboxChain.id, clientChainId);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const client = createViemClient(clientOptions, gearboxChain);
|
|
88
|
+
super(client, options?.logger);
|
|
89
|
+
this.strictContractTypes = options?.strictContractTypes ?? false;
|
|
90
|
+
this.plugins = options?.plugins ?? {};
|
|
91
|
+
for (const plugin of Object.values(this.plugins)) {
|
|
92
|
+
plugin.sdk = this;
|
|
93
|
+
}
|
|
94
|
+
if (options?.gasLimit !== null) {
|
|
95
|
+
this.gasLimit = options?.gasLimit ?? (0, import_chain.getChain)(this.networkType).gasLimit;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Initialises the SDK by reading live on-chain state.
|
|
100
|
+
*
|
|
101
|
+
* @param options - Attach configuration.
|
|
102
|
+
* @throws {@link SdkAlreadyAttachedError} if already attached.
|
|
103
|
+
*/
|
|
104
|
+
async attach(options) {
|
|
105
|
+
if (this.#attached) {
|
|
106
|
+
throw new import_core.SdkAlreadyAttachedError();
|
|
107
|
+
}
|
|
108
|
+
const {
|
|
109
|
+
addressProvider = import_constants.ADDRESS_PROVIDER_V310,
|
|
110
|
+
blockNumber,
|
|
111
|
+
ignoreUpdateablePrices,
|
|
112
|
+
ignoreMarkets,
|
|
113
|
+
marketConfigurators: mcs,
|
|
114
|
+
redstone,
|
|
115
|
+
pyth
|
|
116
|
+
} = options ?? {};
|
|
117
|
+
const marketConfigurators = mcs ?? import_utils.TypedObjectUtils.keys(
|
|
118
|
+
this.client.chain.defaultMarketConfigurators
|
|
119
|
+
);
|
|
120
|
+
this.logger?.info(
|
|
121
|
+
{
|
|
122
|
+
networkType: this.networkType,
|
|
123
|
+
chainId: this.chainId,
|
|
124
|
+
addressProvider,
|
|
125
|
+
marketConfigurators,
|
|
126
|
+
blockNumber,
|
|
127
|
+
ignoreMarkets
|
|
128
|
+
},
|
|
129
|
+
"attaching sdk"
|
|
130
|
+
);
|
|
131
|
+
const time = Date.now();
|
|
132
|
+
const block = await this.client.getBlock(
|
|
133
|
+
blockNumber ? { blockNumber: BigInt(blockNumber) } : { blockTag: "latest" }
|
|
134
|
+
);
|
|
135
|
+
this.#currentBlock = block.number;
|
|
136
|
+
this.#timestamp = block.timestamp;
|
|
137
|
+
if (!!blockNumber && !redstone?.historicTimestamp && time - Number(block.timestamp) * 1e3 > 60 * 1e3) {
|
|
138
|
+
this.logger?.warn(
|
|
139
|
+
"attaching to fixed block number, but redstone historicTimestamp is not set. price updates might fail"
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
if (!!blockNumber && !pyth?.historicTimestamp && time - Number(block.timestamp) * 1e3 > 60 * 1e3) {
|
|
143
|
+
this.logger?.warn(
|
|
144
|
+
"attaching to fixed block number, but pyth historicTimestamp is not set. price updates might fail"
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
this.#priceFeeds = new import_pricefeeds.PriceFeedRegister(this, { redstone, pyth });
|
|
148
|
+
this.logger?.debug(
|
|
149
|
+
`attach block number ${this.currentBlock} timestamp ${this.timestamp}`
|
|
150
|
+
);
|
|
151
|
+
this.#addressProvider = await (0, import_core.createAddressProvider)(this, addressProvider);
|
|
152
|
+
this.logger?.debug(
|
|
153
|
+
`address provider version: ${this.#addressProvider.version}`
|
|
154
|
+
);
|
|
155
|
+
await this.#addressProvider.syncState(this.currentBlock);
|
|
156
|
+
this.#marketRegister = new import_MarketRegister.MarketRegister(this, ignoreMarkets);
|
|
157
|
+
await this.#marketRegister.loadMarkets(
|
|
158
|
+
marketConfigurators,
|
|
159
|
+
ignoreUpdateablePrices
|
|
160
|
+
);
|
|
161
|
+
const pluginsList = import_utils.TypedObjectUtils.entries(this.plugins);
|
|
162
|
+
const pluginResponse = await Promise.allSettled(
|
|
163
|
+
pluginsList.map(([name, plugin]) => {
|
|
164
|
+
if (plugin.attach) {
|
|
165
|
+
this.logger?.debug(`attaching plugin ${name}`);
|
|
166
|
+
return plugin.attach();
|
|
167
|
+
}
|
|
168
|
+
return void 0;
|
|
169
|
+
})
|
|
170
|
+
);
|
|
171
|
+
pluginResponse.forEach((r, i) => {
|
|
172
|
+
const [name, plugin] = pluginsList[i];
|
|
173
|
+
if (plugin.attach && r.status === "fulfilled") {
|
|
174
|
+
this.logger?.debug(`attached plugin ${name}`);
|
|
175
|
+
} else if (plugin.attach && r.status === "rejected") {
|
|
176
|
+
this.logger?.error(r.reason, `failed to attach plugin ${name}`);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
this.logger?.info(`attach time: ${Date.now() - time} ms`);
|
|
180
|
+
this.#attached = true;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Restores SDK state from a previously serialised {@link GearboxState}
|
|
184
|
+
* snapshot, without making any on-chain calls.
|
|
185
|
+
*
|
|
186
|
+
* @param state - Serialised state obtained from {@link OnchainSDK.state}.
|
|
187
|
+
* @param options - Hydrate configuration.
|
|
188
|
+
* @throws {@link SdkAlreadyAttachedError} if already attached.
|
|
189
|
+
* @throws {@link SdkStateVersionMismatchError} if snapshot version doesn't match.
|
|
190
|
+
* @throws {@link SdkChainMismatchError} if snapshot network doesn't match.
|
|
191
|
+
*/
|
|
192
|
+
hydrate(state, options) {
|
|
193
|
+
if (this.#attached) {
|
|
194
|
+
throw new import_core.SdkAlreadyAttachedError();
|
|
195
|
+
}
|
|
196
|
+
if (state.version !== STATE_VERSION) {
|
|
197
|
+
throw new import_core.SdkStateVersionMismatchError(STATE_VERSION, state.version);
|
|
198
|
+
}
|
|
199
|
+
if (state.network !== this.networkType) {
|
|
200
|
+
throw new import_core.SdkChainMismatchError(this.networkType, state.network);
|
|
201
|
+
}
|
|
202
|
+
const { ignoreMarkets, redstone, pyth } = options ?? {};
|
|
203
|
+
this.logger?.info({ networkType: this.networkType }, "hydrating sdk state");
|
|
204
|
+
this.#currentBlock = state.currentBlock;
|
|
205
|
+
this.#timestamp = state.timestamp;
|
|
206
|
+
this.#priceFeeds = new import_pricefeeds.PriceFeedRegister(this, { redstone, pyth });
|
|
207
|
+
this.#addressProvider = (0, import_core.hydrateAddressProvider)(this, state.addressProvider);
|
|
208
|
+
this.logger?.debug(
|
|
209
|
+
`address provider version: ${this.#addressProvider.version}`
|
|
210
|
+
);
|
|
211
|
+
this.#marketRegister = new import_MarketRegister.MarketRegister(this, ignoreMarkets);
|
|
212
|
+
this.#marketRegister.hydrate(state.markets);
|
|
213
|
+
for (const [name, plugin] of import_utils.TypedObjectUtils.entries(this.plugins)) {
|
|
214
|
+
const pluginState = state.plugins[name];
|
|
215
|
+
if (plugin.hydrate && pluginState) {
|
|
216
|
+
if (!pluginState.loaded) {
|
|
217
|
+
this.logger?.debug(
|
|
218
|
+
`skipping hydrating plugin ${name} state: not loaded`
|
|
219
|
+
);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (pluginState.version !== plugin.version) {
|
|
223
|
+
throw new import_plugins.PluginStateVersionError(plugin, pluginState);
|
|
224
|
+
}
|
|
225
|
+
plugin.hydrate(pluginState);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
this.logger?.info("hydrated sdk state");
|
|
229
|
+
this.#attached = true;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Gearbox network type the SDK is connected to (e.g. `"Mainnet"`, `"Arbitrum"`).
|
|
233
|
+
**/
|
|
234
|
+
get networkType() {
|
|
235
|
+
return this.client.chain.network;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Whether the SDK has been initialised via {@link attach} or {@link hydrate}.
|
|
239
|
+
**/
|
|
240
|
+
get attached() {
|
|
241
|
+
return this.#attached;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Returns a human-readable snapshot of the entire SDK state.
|
|
245
|
+
* @param raw - When `true`, include raw numeric values alongside formatted ones.
|
|
246
|
+
*/
|
|
247
|
+
stateHuman(raw = true) {
|
|
248
|
+
return {
|
|
249
|
+
network: this.networkType,
|
|
250
|
+
block: Number(this.currentBlock),
|
|
251
|
+
timestamp: (0, import_utils.formatTimestamp)(Number(this.timestamp), raw),
|
|
252
|
+
core: {
|
|
253
|
+
addressProviderV3: this.addressProvider.stateHuman(raw)
|
|
254
|
+
},
|
|
255
|
+
tokens: this.tokensMeta.values(),
|
|
256
|
+
plugins: Object.fromEntries(
|
|
257
|
+
import_utils.TypedObjectUtils.entries(this.plugins).map(([name, plugin]) => [
|
|
258
|
+
name,
|
|
259
|
+
plugin.loaded ? plugin.stateHuman?.(raw) : void 0
|
|
260
|
+
])
|
|
261
|
+
),
|
|
262
|
+
...this.marketRegister.stateHuman(raw)
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/** Serialisable snapshot of the current SDK state. */
|
|
266
|
+
get state() {
|
|
267
|
+
return {
|
|
268
|
+
version: STATE_VERSION,
|
|
269
|
+
network: this.networkType,
|
|
270
|
+
chainId: this.chainId,
|
|
271
|
+
currentBlock: this.currentBlock,
|
|
272
|
+
timestamp: this.timestamp,
|
|
273
|
+
addressProvider: this.addressProvider.state,
|
|
274
|
+
markets: this.marketRegister.state,
|
|
275
|
+
plugins: Object.fromEntries(
|
|
276
|
+
import_utils.TypedObjectUtils.entries(this.plugins).map(([name, plugin]) => [
|
|
277
|
+
name,
|
|
278
|
+
plugin.loaded ? { version: plugin.version, loaded: true, ...plugin.state } : { version: plugin.version, loaded: false }
|
|
279
|
+
])
|
|
280
|
+
)
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Incrementally updates SDK state by replaying on-chain events.
|
|
285
|
+
*
|
|
286
|
+
* @param opts - Target block and sync behaviour.
|
|
287
|
+
* @returns `true` if the sync completed successfully.
|
|
288
|
+
*/
|
|
289
|
+
async syncState(opts) {
|
|
290
|
+
let { blockNumber, timestamp, ignoreUpdateablePrices } = opts ?? {};
|
|
291
|
+
if (this.priceFeeds.historical && !ignoreUpdateablePrices) {
|
|
292
|
+
this.logger?.warn(
|
|
293
|
+
"syncState is not supported with redstone or pyth historicTimestamp"
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
if (!blockNumber || !timestamp) {
|
|
297
|
+
const block = await this.client.getBlock({
|
|
298
|
+
blockTag: "latest"
|
|
299
|
+
});
|
|
300
|
+
blockNumber = block.number;
|
|
301
|
+
timestamp = block.timestamp;
|
|
302
|
+
}
|
|
303
|
+
if (blockNumber <= this.currentBlock) {
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
if (this.#syncing) {
|
|
307
|
+
this.logger?.warn(
|
|
308
|
+
`cannot sync to ${blockNumber}, already syncing at ${this.currentBlock}`
|
|
309
|
+
);
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
this.#syncing = true;
|
|
313
|
+
const prevBlock = this.currentBlock;
|
|
314
|
+
const prevTimestamp = this.timestamp;
|
|
315
|
+
let success = false;
|
|
316
|
+
try {
|
|
317
|
+
let delta = Math.floor(Date.now() / 1e3) - Number(timestamp);
|
|
318
|
+
this.logger?.debug(
|
|
319
|
+
`syncing state to block ${blockNumber} (delta ${delta}s )...`
|
|
320
|
+
);
|
|
321
|
+
const watchAddresses = [
|
|
322
|
+
...Array.from(this.marketRegister.watchAddresses),
|
|
323
|
+
this.addressProvider.address
|
|
324
|
+
];
|
|
325
|
+
const fromBlock = this.currentBlock + 1n;
|
|
326
|
+
this.logger?.debug(
|
|
327
|
+
`getting logs from ${watchAddresses.length} addresses in [${fromBlock}:${blockNumber}]`
|
|
328
|
+
);
|
|
329
|
+
const logs = await (0, import_viem2.getLogsSafe)(this.client, {
|
|
330
|
+
fromBlock,
|
|
331
|
+
toBlock: blockNumber,
|
|
332
|
+
address: watchAddresses
|
|
333
|
+
});
|
|
334
|
+
for (const log of logs) {
|
|
335
|
+
const contract = this.getContract(log.address);
|
|
336
|
+
if (contract) {
|
|
337
|
+
const event = (0, import_viem.parseEventLogs)({
|
|
338
|
+
abi: contract.abi,
|
|
339
|
+
logs: [log]
|
|
340
|
+
})[0];
|
|
341
|
+
contract.processLog(event);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
this.#currentBlock = blockNumber;
|
|
345
|
+
this.#timestamp = timestamp;
|
|
346
|
+
await this.marketRegister.syncState(ignoreUpdateablePrices);
|
|
347
|
+
const pluginsList = import_utils.TypedObjectUtils.entries(this.plugins);
|
|
348
|
+
const pluginResponse = await Promise.allSettled(
|
|
349
|
+
pluginsList.map(([name, plugin]) => {
|
|
350
|
+
if (plugin.syncState) {
|
|
351
|
+
this.logger?.debug(`syncing plugin ${name}`);
|
|
352
|
+
return plugin.syncState();
|
|
353
|
+
}
|
|
354
|
+
return void 0;
|
|
355
|
+
})
|
|
356
|
+
);
|
|
357
|
+
pluginResponse.forEach((r, i) => {
|
|
358
|
+
const [name, plugin] = pluginsList[i];
|
|
359
|
+
if (plugin.syncState && r.status === "fulfilled") {
|
|
360
|
+
this.logger?.debug(`synced plugin ${name}`);
|
|
361
|
+
} else if (plugin.syncState && r.status === "rejected") {
|
|
362
|
+
this.logger?.error(r.reason, `failed to sync plugin ${name}`);
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
delta = Math.floor(Date.now() / 1e3) - Number(timestamp);
|
|
366
|
+
this.logger?.debug(
|
|
367
|
+
`synced state to block ${blockNumber} (delta ${delta}s)`
|
|
368
|
+
);
|
|
369
|
+
success = true;
|
|
370
|
+
} catch (e) {
|
|
371
|
+
this.logger?.error(
|
|
372
|
+
`sync state to block ${blockNumber} with ts ${timestamp} failed, reverting to old block ${prevBlock} with ts ${prevTimestamp}: ${e}`
|
|
373
|
+
);
|
|
374
|
+
this.#currentBlock = prevBlock;
|
|
375
|
+
this.#timestamp = prevTimestamp;
|
|
376
|
+
} finally {
|
|
377
|
+
this.#syncing = false;
|
|
378
|
+
}
|
|
379
|
+
return success;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Block number that the SDK state corresponds to.
|
|
383
|
+
* @throws {@link SdkNotAttachedError} if not attached.
|
|
384
|
+
*/
|
|
385
|
+
get currentBlock() {
|
|
386
|
+
if (this.#currentBlock === void 0) {
|
|
387
|
+
throw new import_core.SdkNotAttachedError();
|
|
388
|
+
}
|
|
389
|
+
return this.#currentBlock;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Block timestamp (Unix epoch seconds) corresponding to {@link currentBlock}.
|
|
393
|
+
* @throws {@link SdkNotAttachedError} if not attached.
|
|
394
|
+
*/
|
|
395
|
+
get timestamp() {
|
|
396
|
+
if (this.#timestamp === void 0) {
|
|
397
|
+
throw new import_core.SdkNotAttachedError();
|
|
398
|
+
}
|
|
399
|
+
return this.#timestamp;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Global registry of all price feeds known to the SDK.
|
|
403
|
+
* @throws {@link SdkNotAttachedError} if not attached.
|
|
404
|
+
*/
|
|
405
|
+
get priceFeeds() {
|
|
406
|
+
if (this.#priceFeeds === void 0) {
|
|
407
|
+
throw new import_core.SdkNotAttachedError();
|
|
408
|
+
}
|
|
409
|
+
return this.#priceFeeds;
|
|
410
|
+
}
|
|
411
|
+
/** GEAR governance token address, or `undefined` if not listed. */
|
|
412
|
+
get gear() {
|
|
413
|
+
try {
|
|
414
|
+
const g = this.addressProvider.getAddress(import_constants.AP_GEAR_TOKEN, import_constants.NO_VERSION);
|
|
415
|
+
return g;
|
|
416
|
+
} catch (e) {
|
|
417
|
+
this.logger?.warn(e);
|
|
418
|
+
return void 0;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* The chain's address provider contract.
|
|
423
|
+
* @throws {@link SdkNotAttachedError} if not attached.
|
|
424
|
+
*/
|
|
425
|
+
get addressProvider() {
|
|
426
|
+
if (this.#addressProvider === void 0) {
|
|
427
|
+
throw new import_core.SdkNotAttachedError();
|
|
428
|
+
}
|
|
429
|
+
return this.#addressProvider;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Registry of all loaded markets.
|
|
433
|
+
* @throws {@link SdkNotAttachedError} if not attached.
|
|
434
|
+
*/
|
|
435
|
+
get marketRegister() {
|
|
436
|
+
if (this.#marketRegister === void 0) {
|
|
437
|
+
throw new import_core.SdkNotAttachedError();
|
|
438
|
+
}
|
|
439
|
+
return this.#marketRegister;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Resolves the appropriate router contract for a given credit manager,
|
|
443
|
+
* credit facade, or explicit version range.
|
|
444
|
+
*/
|
|
445
|
+
routerFor(params) {
|
|
446
|
+
let routerRange;
|
|
447
|
+
if (Array.isArray(params)) {
|
|
448
|
+
routerRange = params;
|
|
449
|
+
} else {
|
|
450
|
+
let facadeAddr;
|
|
451
|
+
if ("creditFacade" in params) {
|
|
452
|
+
facadeAddr = (0, import_utils.toAddress)(params.creditFacade);
|
|
453
|
+
} else {
|
|
454
|
+
const cm = this.marketRegister.findCreditManager(
|
|
455
|
+
(0, import_utils.toAddress)(params.creditManager)
|
|
456
|
+
);
|
|
457
|
+
facadeAddr = cm.creditFacade.address;
|
|
458
|
+
}
|
|
459
|
+
const facadeV = this.mustGetContract(facadeAddr).version;
|
|
460
|
+
if ((0, import_constants.isV310)(facadeV)) {
|
|
461
|
+
routerRange = import_constants.VERSION_RANGE_310;
|
|
462
|
+
} else {
|
|
463
|
+
throw new Error(`Unsupported credit facade version ${facadeV}`);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
const routerEntry = this.addressProvider.getLatest(import_constants.AP_ROUTER, routerRange);
|
|
467
|
+
if (!routerEntry) {
|
|
468
|
+
throw new Error(`router not found in version range ${routerRange}`);
|
|
469
|
+
}
|
|
470
|
+
const [routerAddr, routerV] = routerEntry;
|
|
471
|
+
return (0, import_router.createRouter)(this, routerAddr, routerV);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
475
|
+
0 && (module.exports = {
|
|
476
|
+
OnchainSDK,
|
|
477
|
+
STATE_VERSION
|
|
478
|
+
});
|