@gearbox-protocol/sdk 18.2.0-next.11 → 18.2.0-next.13

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 (76) hide show
  1. package/dist/cjs/abi/310/iKillSwitchProxy.js +130 -0
  2. package/dist/cjs/dev/AccountOpener.js +1 -1
  3. package/dist/cjs/dev/withdrawalUtils.js +1 -1
  4. package/dist/cjs/history/trace/extractTransfers.js +1 -1
  5. package/dist/cjs/onchain/accounts/CreditAccountsServiceV310.js +2 -2
  6. package/dist/cjs/onchain/accounts/liquidations/LiquidationsService.js +1 -1
  7. package/dist/cjs/onchain/accounts/withdrawal-compressor/RedemptionLoggerV310Contract.js +2 -1
  8. package/dist/cjs/onchain/accounts/withdrawal-compressor/WithdrawalCompressorV310Contract.js +2 -1
  9. package/dist/cjs/onchain/accounts/withdrawal-compressor/WithdrawalCompressorV311Contract.js +2 -1
  10. package/dist/cjs/onchain/accounts/withdrawal-compressor/WithdrawalCompressorV313Contract.js +1 -1
  11. package/dist/cjs/onchain/base/TokensMeta.js +3 -3
  12. package/dist/cjs/onchain/core/createAddressProvider.js +1 -1
  13. package/dist/cjs/onchain/market/adapters/contracts/AccountMigratorAdapterContract.js +1 -1
  14. package/dist/cjs/onchain/market/adapters/contracts/ERC4626AdapterContract.js +1 -1
  15. package/dist/cjs/onchain/market/credit/CreditFacadeV310BaseContract.js +1 -1
  16. package/dist/cjs/onchain/market/pool/PoolV310Contract.js +1 -1
  17. package/dist/cjs/onchain/market/rwa/createDegenNFT.js +1 -1
  18. package/dist/cjs/onchain/market/zapper/IETHZapperContract.js +2 -1
  19. package/dist/cjs/onchain/market/zapper/ZapperContract.js +1 -1
  20. package/dist/cjs/onchain/preview/preview/previewPoolPositionOperation.js +2 -2
  21. package/dist/cjs/onchain/utils/viem/simulateWithPriceUpdates.js +1 -1
  22. package/dist/cjs/permissionless/api/index.js +7 -3
  23. package/dist/cjs/permissionless/api/oracles/PermissionlessOracles.js +11 -11
  24. package/dist/cjs/permissionless/api/oracles/index.js +7 -3
  25. package/dist/cjs/permissionless/api/oracles/score/formula.js +44 -82
  26. package/dist/cjs/permissionless/api/oracles/score/index.js +6 -3
  27. package/dist/cjs/permissionless/api/oracles/score/run.js +129 -46
  28. package/dist/cjs/permissionless/api/oracles/stress/index.js +1 -0
  29. package/dist/cjs/permissionless/api/oracles/stress/run.js +5 -2
  30. package/dist/cjs/permissionless/bindings/bytecode-repository.js +8 -0
  31. package/dist/cjs/permissionless/bindings/governance/governor.js +1 -1
  32. package/dist/cjs/permissionless/bindings/index.js +7 -2
  33. package/dist/cjs/permissionless/bindings/kill-switch-proxy.js +188 -0
  34. package/dist/cjs/permissionless/bindings/market-configurator-factory.js +39 -1
  35. package/dist/cjs/permissionless/bindings/market-configurator.js +142 -0
  36. package/dist/cjs/permissionless/index.js +15 -5
  37. package/dist/cjs/permissionless/utils/index.js +1 -0
  38. package/dist/cjs/permissionless/utils/literals.js +2 -0
  39. package/dist/esm/abi/310/iKillSwitchProxy.js +129 -0
  40. package/dist/esm/permissionless/api/index.js +3 -3
  41. package/dist/esm/permissionless/api/oracles/PermissionlessOracles.js +11 -11
  42. package/dist/esm/permissionless/api/oracles/index.js +3 -3
  43. package/dist/esm/permissionless/api/oracles/score/formula.js +39 -80
  44. package/dist/esm/permissionless/api/oracles/score/index.js +2 -2
  45. package/dist/esm/permissionless/api/oracles/score/run.js +131 -48
  46. package/dist/esm/permissionless/api/oracles/stress/index.js +2 -2
  47. package/dist/esm/permissionless/api/oracles/stress/run.js +5 -3
  48. package/dist/esm/permissionless/bindings/bytecode-repository.js +8 -0
  49. package/dist/esm/permissionless/bindings/governance/governor.js +1 -1
  50. package/dist/esm/permissionless/bindings/index.js +4 -3
  51. package/dist/esm/permissionless/bindings/kill-switch-proxy.js +184 -0
  52. package/dist/esm/permissionless/bindings/market-configurator-factory.js +37 -0
  53. package/dist/esm/permissionless/bindings/market-configurator.js +143 -1
  54. package/dist/esm/permissionless/index.js +7 -6
  55. package/dist/esm/permissionless/utils/index.js +2 -2
  56. package/dist/esm/permissionless/utils/literals.js +2 -1
  57. package/dist/types/abi/310/iKillSwitchProxy.d.ts +114 -0
  58. package/dist/types/permissionless/api/index.d.ts +4 -4
  59. package/dist/types/permissionless/api/oracles/PermissionlessOracles.d.ts +11 -11
  60. package/dist/types/permissionless/api/oracles/index.d.ts +4 -4
  61. package/dist/types/permissionless/api/oracles/score/formula.d.ts +31 -38
  62. package/dist/types/permissionless/api/oracles/score/index.d.ts +3 -3
  63. package/dist/types/permissionless/api/oracles/score/run.d.ts +7 -4
  64. package/dist/types/permissionless/api/oracles/score/types.d.ts +50 -22
  65. package/dist/types/permissionless/api/oracles/stress/index.d.ts +2 -2
  66. package/dist/types/permissionless/api/oracles/stress/run.d.ts +17 -1
  67. package/dist/types/permissionless/bindings/bytecode-repository.d.ts +10 -1
  68. package/dist/types/permissionless/bindings/index.d.ts +4 -3
  69. package/dist/types/permissionless/bindings/kill-switch-proxy.d.ts +205 -0
  70. package/dist/types/permissionless/bindings/market-configurator-factory.d.ts +30 -0
  71. package/dist/types/permissionless/bindings/market-configurator.d.ts +30 -1
  72. package/dist/types/permissionless/bindings/types.d.ts +27 -0
  73. package/dist/types/permissionless/index.d.ts +8 -7
  74. package/dist/types/permissionless/utils/index.d.ts +2 -2
  75. package/dist/types/permissionless/utils/literals.d.ts +1 -0
  76. package/package.json +1 -1
@@ -1,9 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_abi_310_generated = require("../../abi/310/generated.js");
3
3
  const require_onchain_utils_json = require("../../onchain/utils/json.js");
4
+ const require_onchain_utils_createRawTx = require("../../onchain/utils/createRawTx.js");
4
5
  const require_onchain_base_BaseContract = require("../../onchain/base/BaseContract.js");
5
6
  require("../../onchain/index.js");
7
+ const require_permissionless_utils_literals = require("../utils/literals.js");
6
8
  const require_permissionless_bindings_address_provider = require("./address-provider.js");
9
+ const require_abi_310_iKillSwitchProxy = require("../../abi/310/iKillSwitchProxy.js");
7
10
  const require_abi_310_configure_creditSuiteParams = require("../../abi/310/configure/creditSuiteParams.js");
8
11
  const require_permissionless_plugins_irm_constructor_params_abi = require("../plugins/irm/constructor-params-abi.js");
9
12
  const require_permissionless_plugins_loss_policies_constructor_params_abi = require("../plugins/loss-policies/constructor-params-abi.js");
@@ -396,6 +399,83 @@ var MarketConfiguratorContract = class extends require_onchain_base_BaseContract
396
399
  return;
397
400
  }
398
401
  }
402
+ /**
403
+ * Returns emergency admin of the market configurator.
404
+ * If it is a `KILL_SWITCH_PROXY`, emergency transactions must be sent by proxy's caller via `proxyCall`,
405
+ * otherwise directly by emergency admin itself
406
+ * @param emergencyAdmin - emergency admin address, read from the market configurator if not provided
407
+ */
408
+ async getEmergencyAdmin(emergencyAdmin) {
409
+ const address = emergencyAdmin ?? await this.contract.read.emergencyAdmin();
410
+ const [contractType, caller, owner, isKilled] = await this.client.multicall({
411
+ allowFailure: true,
412
+ contracts: [
413
+ {
414
+ address,
415
+ abi: require_abi_310_iKillSwitchProxy.iKillSwitchProxyAbi,
416
+ functionName: "contractType"
417
+ },
418
+ {
419
+ address,
420
+ abi: require_abi_310_iKillSwitchProxy.iKillSwitchProxyAbi,
421
+ functionName: "caller"
422
+ },
423
+ {
424
+ address,
425
+ abi: require_abi_310_iKillSwitchProxy.iKillSwitchProxyAbi,
426
+ functionName: "owner"
427
+ },
428
+ {
429
+ address,
430
+ abi: require_abi_310_iKillSwitchProxy.iKillSwitchProxyAbi,
431
+ functionName: "isKilled"
432
+ }
433
+ ],
434
+ batchSize: 0
435
+ });
436
+ let isKillSwitch = false;
437
+ if (contractType.status === "success") try {
438
+ isKillSwitch = (0, viem.hexToString)(contractType.result, { size: 32 }) === require_permissionless_utils_literals.KILL_SWITCH_PROXY;
439
+ } catch {}
440
+ if (!isKillSwitch) return {
441
+ type: "direct",
442
+ address,
443
+ executor: address
444
+ };
445
+ if (caller.status !== "success" || owner.status !== "success" || isKilled.status !== "success") throw new Error(`failed to read state of ${require_permissionless_utils_literals.KILL_SWITCH_PROXY} emergency admin ${address}`);
446
+ return {
447
+ type: "killSwitch",
448
+ address,
449
+ caller: caller.result,
450
+ owner: owner.result,
451
+ isKilled: isKilled.result,
452
+ executor: caller.result
453
+ };
454
+ }
455
+ /**
456
+ * Routes emergency transaction to the market configurator through its emergency admin:
457
+ * returns transaction as is for direct emergency admin, or wraps it into `proxyCall` of kill switch proxy
458
+ * @param tx - emergency transaction to the market configurator, e.g. built by `emergencyConfigurePool`
459
+ * @param emergencyAdmin - result of {@link getEmergencyAdmin}
460
+ * @throws if transaction is not addressed to this market configurator or kill switch proxy is killed
461
+ */
462
+ wrapEmergencyTx(tx, emergencyAdmin) {
463
+ if (!(0, viem.isAddressEqual)(tx.to, this.address)) throw new Error(`emergency tx target ${tx.to} is not market configurator ${this.address}`);
464
+ if (emergencyAdmin.type === "direct") return tx;
465
+ if (emergencyAdmin.isKilled) throw new Error(`${require_permissionless_utils_literals.KILL_SWITCH_PROXY} ${emergencyAdmin.address} of market configurator ${this.address} is killed`);
466
+ return require_onchain_utils_createRawTx.createRawTx(emergencyAdmin.address, {
467
+ abi: require_abi_310_iKillSwitchProxy.iKillSwitchProxyAbi,
468
+ functionName: "proxyCall",
469
+ args: [this.address, tx.callData]
470
+ }, tx.description ? `KillSwitchProxy.proxyCall(${tx.description})` : void 0);
471
+ }
472
+ /**
473
+ * Reads emergency admin and routes emergency transaction through it, see {@link wrapEmergencyTx}
474
+ * @param tx - emergency transaction to the market configurator, e.g. built by `emergencyConfigurePool`
475
+ */
476
+ async emergencyTx(tx) {
477
+ return this.wrapEmergencyTx(tx, await this.getEmergencyAdmin());
478
+ }
399
479
  grantRole(role, address) {
400
480
  return this.createRawTx({
401
481
  functionName: "grantRole",
@@ -609,9 +689,53 @@ var MarketConfiguratorContract = class extends require_onchain_base_BaseContract
609
689
  role: (0, viem.hexToString)(role, { size: 32 })
610
690
  };
611
691
  }
692
+ case "emergencyConfigurePool":
693
+ case "emergencyConfigurePriceOracle":
694
+ case "emergencyConfigureLossPolicy":
695
+ case "emergencyConfigureRateKeeper":
696
+ case "emergencyConfigureInterestRateModel": {
697
+ const [pool, calldata] = args;
698
+ const decoded = this.#decodeEmergencyConfig(functionName, calldata);
699
+ return decoded ? {
700
+ pool,
701
+ data: require_onchain_utils_json.json_stringify(decoded)
702
+ } : {
703
+ pool,
704
+ calldata
705
+ };
706
+ }
707
+ case "emergencyConfigureCreditSuite": {
708
+ const [creditManager, calldata] = args;
709
+ const decoded = this.#decodeEmergencyConfig(functionName, calldata);
710
+ return decoded ? {
711
+ creditManager,
712
+ data: require_onchain_utils_json.json_stringify(decoded)
713
+ } : {
714
+ creditManager,
715
+ calldata
716
+ };
717
+ }
612
718
  default: return super.parseFunctionParams(params);
613
719
  }
614
720
  }
721
+ /**
722
+ * Emergency actions share selectors with regular configuration actions only partially
723
+ * (e.g., `pause`, `forbidToken`, `setPriceFeed`), so decoding is best-effort
724
+ */
725
+ #decodeEmergencyConfig(functionName, calldata) {
726
+ const factory = {
727
+ emergencyConfigurePool: this.poolFactory,
728
+ emergencyConfigureCreditSuite: this.creditFactory,
729
+ emergencyConfigurePriceOracle: this.priceOracleFactory,
730
+ emergencyConfigureLossPolicy: this.lossPolicyFactory,
731
+ emergencyConfigureRateKeeper: this.rateKeeperFactory
732
+ }[functionName];
733
+ try {
734
+ return factory?.decodeConfig(calldata) ?? null;
735
+ } catch {
736
+ return null;
737
+ }
738
+ }
615
739
  emergencyConfigurePool(pool, calldata) {
616
740
  return this.createRawTx({
617
741
  functionName: "emergencyConfigurePool",
@@ -636,6 +760,24 @@ var MarketConfiguratorContract = class extends require_onchain_base_BaseContract
636
760
  args: [pool, calldata]
637
761
  });
638
762
  }
763
+ /**
764
+ * Note: current interest rate model factory forbids all emergency configuration calls
765
+ */
766
+ emergencyConfigureInterestRateModel(pool, calldata) {
767
+ return this.createRawTx({
768
+ functionName: "emergencyConfigureInterestRateModel",
769
+ args: [pool, calldata]
770
+ });
771
+ }
772
+ /**
773
+ * Note: current rate keeper factory forbids all emergency configuration calls
774
+ */
775
+ emergencyConfigureRateKeeper(pool, calldata) {
776
+ return this.createRawTx({
777
+ functionName: "emergencyConfigureRateKeeper",
778
+ args: [pool, calldata]
779
+ });
780
+ }
639
781
  };
640
782
  //#endregion
641
783
  exports.MarketConfiguratorContract = MarketConfiguratorContract;
@@ -30,13 +30,14 @@ const require_permissionless_utils_price_update_get_updatable_feeds = require(".
30
30
  const require_permissionless_api_transactions_InstanceOwnerTransactions = require("./api/transactions/InstanceOwnerTransactions.js");
31
31
  const require_permissionless_api_GearboxPermissionless = require("./api/GearboxPermissionless.js");
32
32
  require("./api/index.js");
33
- const require_permissionless_bindings_market_configurator_factory = require("./bindings/market-configurator-factory.js");
34
- const require_permissionless_bindings_cross_chain_multisig = require("./bindings/cross-chain-multisig.js");
35
33
  const require_permissionless_utils_create2 = require("./utils/create2.js");
36
34
  const require_permissionless_utils_format = require("./utils/format.js");
37
35
  const require_permissionless_core_raw_tx = require("./core/raw-tx.js");
38
36
  const require_permissionless_bindings_types = require("./bindings/types.js");
39
37
  const require_permissionless_bindings_market_configurator = require("./bindings/market-configurator.js");
38
+ const require_permissionless_bindings_kill_switch_proxy = require("./bindings/kill-switch-proxy.js");
39
+ const require_permissionless_bindings_market_configurator_factory = require("./bindings/market-configurator-factory.js");
40
+ const require_permissionless_bindings_cross_chain_multisig = require("./bindings/cross-chain-multisig.js");
40
41
  const require_permissionless_bindings_governance_governor = require("./bindings/governance/governor.js");
41
42
  const require_permissionless_bindings_governance_timelock = require("./bindings/governance/timelock.js");
42
43
  require("./bindings/index.js");
@@ -52,7 +53,6 @@ exports.AccessMode = require_permissionless_bindings_types.AccessMode;
52
53
  exports.AddressProviderContract = require_permissionless_bindings_address_provider.AddressProviderContract;
53
54
  exports.Addresses = require_permissionless_deployment_addresses.Addresses;
54
55
  exports.ArchiveTransport = require_permissionless_chains_archive_transport.ArchiveTransport;
55
- exports.BOUND_WEIGHT = require_permissionless_api_oracles_score_formula.BOUND_WEIGHT;
56
56
  exports.BYTECODE_REPOSITORY = require_permissionless_utils_literals.BYTECODE_REPOSITORY;
57
57
  exports.BytecodeRepositoryContract = require_permissionless_bindings_bytecode_repository.BytecodeRepositoryContract;
58
58
  exports.CROSS_CHAIN_GOVERNANCE = require_permissionless_utils_literals.CROSS_CHAIN_GOVERNANCE;
@@ -65,10 +65,13 @@ exports.GET_PRICES_CHUNK_SIZE = require_permissionless_api_oracles_Permissionles
65
65
  exports.GET_PRICES_GAS_LIMIT_BY_CHAIN_ID = require_permissionless_api_oracles_PermissionlessOracles.GET_PRICES_GAS_LIMIT_BY_CHAIN_ID;
66
66
  exports.GearboxPermissionless = require_permissionless_api_GearboxPermissionless.GearboxPermissionless;
67
67
  exports.GovernorContract = require_permissionless_bindings_governance_governor.GovernorContract;
68
- exports.INDEPENDENCE_WEIGHT = require_permissionless_api_oracles_score_formula.INDEPENDENCE_WEIGHT;
69
68
  exports.INSTANCE_MANAGER = require_permissionless_utils_literals.INSTANCE_MANAGER;
70
69
  exports.InstanceManagerContract = require_permissionless_bindings_instance_manager.InstanceManagerContract;
71
70
  exports.InstanceOwnerTransactions = require_permissionless_api_transactions_InstanceOwnerTransactions.InstanceOwnerTransactions;
71
+ exports.KILL_SWITCH_PROXY = require_permissionless_utils_literals.KILL_SWITCH_PROXY;
72
+ exports.KILL_SWITCH_PROXY_MINOR_VERSION = require_permissionless_bindings_kill_switch_proxy.KILL_SWITCH_PROXY_MINOR_VERSION;
73
+ exports.KillSwitchProxyContract = require_permissionless_bindings_kill_switch_proxy.KillSwitchProxyContract;
74
+ exports.KillSwitchProxyNotAllowedError = require_permissionless_bindings_kill_switch_proxy.KillSwitchProxyNotAllowedError;
72
75
  exports.MAINNET_CCM_CONSTRUCTOR_PARAMS = require_permissionless_deployment_mainnet.MAINNET_CCM_CONSTRUCTOR_PARAMS;
73
76
  exports.MAINNET_DEPLOYMENT_BLOCK = require_permissionless_deployment_mainnet.MAINNET_DEPLOYMENT_BLOCK;
74
77
  exports.MAINNET_DEPLOYMENT_CCM_SALT = require_permissionless_deployment_mainnet.MAINNET_DEPLOYMENT_CCM_SALT;
@@ -88,7 +91,9 @@ exports.PriceFeedSaltMissingError = require_permissionless_api_errors.PriceFeedS
88
91
  exports.PriceFeedStalenessUnknownError = require_permissionless_api_errors.PriceFeedStalenessUnknownError;
89
92
  exports.PriceFeedStoreContract = require_permissionless_bindings_price_feed_store.PriceFeedStoreContract;
90
93
  exports.RATE_FEED_TYPE = require_permissionless_api_oracles_stress_run.RATE_FEED_TYPE;
94
+ exports.REVERT_SCORE = require_permissionless_api_oracles_score_formula.REVERT_SCORE;
91
95
  exports.RoutingManagerContract = require_permissionless_bindings_router_routing_manager.RoutingManagerContract;
96
+ exports.SCORE_MULTIPLIER = require_permissionless_api_oracles_score_formula.SCORE_MULTIPLIER;
92
97
  exports.TOKEN_COMPRESSOR = require_permissionless_utils_literals.TOKEN_COMPRESSOR;
93
98
  exports.TimeLockContract = require_permissionless_bindings_governance_timelock.TimeLockContract;
94
99
  exports.TokenCompressorContract = require_permissionless_bindings_compressors_token_compressor.TokenCompressorContract;
@@ -110,6 +115,8 @@ exports.deepJsonParse = require_permissionless_utils_format.deepJsonParse;
110
115
  exports.deployUsingPublicCreate2 = require_permissionless_utils_create2.deployUsingPublicCreate2;
111
116
  exports.deriveEffectiveStalenessPeriod = require_permissionless_api_deploy_effective_staleness.deriveEffectiveStalenessPeriod;
112
117
  exports.encodeFunctionParams = require_permissionless_utils_abi_encoder.encodeFunctionParams;
118
+ exports.factorOf = require_permissionless_api_oracles_score_formula.factorOf;
119
+ exports.finalPrice = require_permissionless_api_oracles_score_formula.finalPrice;
113
120
  exports.formatBytecodeSize = require_permissionless_utils_format.formatBytecodeSize;
114
121
  exports.formatBytecodeVersion = require_permissionless_utils_format.formatBytecodeVersion;
115
122
  exports.getBlockNumberByTimestamp = require_permissionless_utils_block_utils.getBlockNumberByTimestamp;
@@ -124,6 +131,7 @@ exports.getSafeBatches = require_permissionless_utils_governance_batch.getSafeBa
124
131
  exports.getUpdatablePriceFeeds = require_permissionless_utils_price_update_get_updatable_feeds.getUpdatablePriceFeeds;
125
132
  exports.groupOverride = require_permissionless_api_oracles_stress_override.groupOverride;
126
133
  exports.handleSalt = require_permissionless_utils_create2.handleSalt;
134
+ exports.killSwitchProxySalt = require_permissionless_bindings_kill_switch_proxy.killSwitchProxySalt;
127
135
  exports.normalizeSignature = require_permissionless_utils_signature.normalizeSignature;
128
136
  exports.perturb = require_permissionless_api_oracles_stress_override.perturb;
129
137
  exports.priceFeedSalt = require_permissionless_api_deploy_PermissionlessDeploy.priceFeedSalt;
@@ -131,13 +139,15 @@ exports.priceFeedSetupParams = require_permissionless_bindings_pricefeeds_index.
131
139
  exports.rateStub = require_permissionless_api_oracles_stress_override.rateStub;
132
140
  exports.readForest = require_permissionless_api_oracles_stress_run.readForest;
133
141
  exports.readRateTargets = require_permissionless_api_oracles_stress_run.readRateTargets;
142
+ exports.readUnder = require_permissionless_api_oracles_stress_run.readUnder;
134
143
  exports.roundDataStub = require_permissionless_api_oracles_stress_override.roundDataStub;
135
144
  exports.runAssetScores = require_permissionless_api_oracles_score_run.runAssetScores;
136
145
  exports.runStressTest = require_permissionless_api_oracles_stress_run.runStressTest;
137
146
  exports.scoreGroup = require_permissionless_api_oracles_stress_score.scoreGroup;
138
- exports.scoreMarket = require_permissionless_api_oracles_score_formula.scoreMarket;
147
+ exports.scoreOfFactor = require_permissionless_api_oracles_score_formula.scoreOfFactor;
139
148
  exports.shortenHash = require_permissionless_utils_format.shortenHash;
140
149
  exports.significantTrunc = require_permissionless_utils_format.significantTrunc;
141
150
  exports.slotHarm = require_permissionless_api_oracles_stress_score.slotHarm;
142
151
  exports.sourcesByFeed = require_permissionless_api_oracles_stress_classify.sourcesByFeed;
143
152
  exports.verdictOf = require_permissionless_api_oracles_stress_score.verdictOf;
153
+ exports.worstOf = require_permissionless_api_oracles_score_formula.worstOf;
@@ -16,6 +16,7 @@ exports.BYTECODE_REPOSITORY = require_permissionless_utils_literals.BYTECODE_REP
16
16
  exports.CROSS_CHAIN_GOVERNANCE = require_permissionless_utils_literals.CROSS_CHAIN_GOVERNANCE;
17
17
  exports.CROSS_CHAIN_MULTISIG = require_permissionless_utils_literals.CROSS_CHAIN_MULTISIG;
18
18
  exports.INSTANCE_MANAGER = require_permissionless_utils_literals.INSTANCE_MANAGER;
19
+ exports.KILL_SWITCH_PROXY = require_permissionless_utils_literals.KILL_SWITCH_PROXY;
19
20
  exports.MARKET_CONFIGURATOR_FACTORY = require_permissionless_utils_literals.MARKET_CONFIGURATOR_FACTORY;
20
21
  exports.PRICE_FEED_STORE = require_permissionless_utils_literals.PRICE_FEED_STORE;
21
22
  exports.PUBLIC_CREATE2_FACTORY = require_permissionless_utils_create2.PUBLIC_CREATE2_FACTORY;
@@ -7,11 +7,13 @@ const TOKEN_COMPRESSOR = "GLOBAL::TOKEN_COMPRESSOR";
7
7
  const CROSS_CHAIN_MULTISIG = "CROSS_CHAIN_MULTISIG";
8
8
  const PRICE_FEED_STORE = "PRICE_FEED_STORE";
9
9
  const MARKET_CONFIGURATOR_FACTORY = "MARKET_CONFIGURATOR_FACTORY";
10
+ const KILL_SWITCH_PROXY = "KILL_SWITCH_PROXY";
10
11
  //#endregion
11
12
  exports.BYTECODE_REPOSITORY = BYTECODE_REPOSITORY;
12
13
  exports.CROSS_CHAIN_GOVERNANCE = CROSS_CHAIN_GOVERNANCE;
13
14
  exports.CROSS_CHAIN_MULTISIG = CROSS_CHAIN_MULTISIG;
14
15
  exports.INSTANCE_MANAGER = INSTANCE_MANAGER;
16
+ exports.KILL_SWITCH_PROXY = KILL_SWITCH_PROXY;
15
17
  exports.MARKET_CONFIGURATOR_FACTORY = MARKET_CONFIGURATOR_FACTORY;
16
18
  exports.PRICE_FEED_STORE = PRICE_FEED_STORE;
17
19
  exports.TOKEN_COMPRESSOR = TOKEN_COMPRESSOR;
@@ -0,0 +1,129 @@
1
+ //#region src/abi/310/iKillSwitchProxy.ts
2
+ const iKillSwitchProxyAbi = [
3
+ {
4
+ type: "constructor",
5
+ inputs: [{
6
+ name: "_owner",
7
+ internalType: "address",
8
+ type: "address"
9
+ }, {
10
+ name: "_caller",
11
+ internalType: "address",
12
+ type: "address"
13
+ }],
14
+ stateMutability: "nonpayable"
15
+ },
16
+ {
17
+ type: "function",
18
+ inputs: [],
19
+ name: "caller",
20
+ outputs: [{
21
+ name: "",
22
+ internalType: "address",
23
+ type: "address"
24
+ }],
25
+ stateMutability: "view"
26
+ },
27
+ {
28
+ type: "function",
29
+ inputs: [],
30
+ name: "contractType",
31
+ outputs: [{
32
+ name: "",
33
+ internalType: "bytes32",
34
+ type: "bytes32"
35
+ }],
36
+ stateMutability: "view"
37
+ },
38
+ {
39
+ type: "function",
40
+ inputs: [],
41
+ name: "isKilled",
42
+ outputs: [{
43
+ name: "",
44
+ internalType: "bool",
45
+ type: "bool"
46
+ }],
47
+ stateMutability: "view"
48
+ },
49
+ {
50
+ type: "function",
51
+ inputs: [],
52
+ name: "kill",
53
+ outputs: [],
54
+ stateMutability: "nonpayable"
55
+ },
56
+ {
57
+ type: "function",
58
+ inputs: [],
59
+ name: "owner",
60
+ outputs: [{
61
+ name: "",
62
+ internalType: "address",
63
+ type: "address"
64
+ }],
65
+ stateMutability: "view"
66
+ },
67
+ {
68
+ type: "function",
69
+ inputs: [{
70
+ name: "target",
71
+ internalType: "address",
72
+ type: "address"
73
+ }, {
74
+ name: "data",
75
+ internalType: "bytes",
76
+ type: "bytes"
77
+ }],
78
+ name: "proxyCall",
79
+ outputs: [{
80
+ name: "result",
81
+ internalType: "bytes",
82
+ type: "bytes"
83
+ }],
84
+ stateMutability: "nonpayable"
85
+ },
86
+ {
87
+ type: "function",
88
+ inputs: [],
89
+ name: "version",
90
+ outputs: [{
91
+ name: "",
92
+ internalType: "uint256",
93
+ type: "uint256"
94
+ }],
95
+ stateMutability: "view"
96
+ },
97
+ {
98
+ type: "event",
99
+ anonymous: false,
100
+ inputs: [],
101
+ name: "Killed"
102
+ },
103
+ {
104
+ type: "error",
105
+ inputs: [{
106
+ name: "caller",
107
+ internalType: "address",
108
+ type: "address"
109
+ }],
110
+ name: "CallerIsNotOwnerException"
111
+ },
112
+ {
113
+ type: "error",
114
+ inputs: [],
115
+ name: "KilledException"
116
+ },
117
+ {
118
+ type: "error",
119
+ inputs: [],
120
+ name: "OnlyCallerException"
121
+ },
122
+ {
123
+ type: "error",
124
+ inputs: [],
125
+ name: "OwnerSameAsCallerException"
126
+ }
127
+ ];
128
+ //#endregion
129
+ export { iKillSwitchProxyAbi };
@@ -9,8 +9,8 @@ import "./deploy/index.js";
9
9
  import { classifySources, sourcesByFeed } from "./oracles/stress/classify.js";
10
10
  import { UNBOUNDED_DOWN, UNBOUNDED_UP, groupOverride, perturb, rateStub, roundDataStub } from "./oracles/stress/override.js";
11
11
  import { scoreGroup, slotHarm, verdictOf } from "./oracles/stress/score.js";
12
- import { DEFAULT_SCENARIOS, RATE_FEED_TYPE, readForest, readRateTargets, runStressTest } from "./oracles/stress/run.js";
13
- import { BOUND_WEIGHT, INDEPENDENCE_WEIGHT, scoreMarket } from "./oracles/score/formula.js";
12
+ import { DEFAULT_SCENARIOS, RATE_FEED_TYPE, readForest, readRateTargets, readUnder, runStressTest } from "./oracles/stress/run.js";
13
+ import { REVERT_SCORE, SCORE_MULTIPLIER, factorOf, finalPrice, scoreOfFactor, worstOf } from "./oracles/score/formula.js";
14
14
  import { runAssetScores } from "./oracles/score/run.js";
15
15
  import { GET_PRICES_CHUNK_SIZE, GET_PRICES_GAS_LIMIT_BY_CHAIN_ID, PermissionlessOracles } from "./oracles/PermissionlessOracles.js";
16
16
  import { InstanceOwnerTransactions } from "./transactions/InstanceOwnerTransactions.js";
@@ -18,4 +18,4 @@ import { GearboxPermissionless } from "./GearboxPermissionless.js";
18
18
  import "./oracles/index.js";
19
19
  import "./transactions/index.js";
20
20
  import "./types.js";
21
- export { BOUND_WEIGHT, ChainsNamespace, DEFAULT_DEPLOY_SALT, DEFAULT_SCENARIOS, GET_PRICES_CHUNK_SIZE, GET_PRICES_GAS_LIMIT_BY_CHAIN_ID, GearboxPermissionless, INDEPENDENCE_WEIGHT, InstanceOwnerTransactions, PermissionlessAnalytics, PermissionlessChainUnreachableError, PermissionlessDeploy, PermissionlessNotAttachedError, PermissionlessOracles, PriceFeedNotInStoreError, PriceFeedSaltMissingError, PriceFeedStalenessUnknownError, RATE_FEED_TYPE, UNBOUNDED_DOWN, UNBOUNDED_UP, classifySources, deriveEffectiveStalenessPeriod, groupOverride, perturb, priceFeedSalt, rateStub, readForest, readRateTargets, roundDataStub, runAssetScores, runStressTest, scoreGroup, scoreMarket, slotHarm, sourcesByFeed, verdictOf };
21
+ export { ChainsNamespace, DEFAULT_DEPLOY_SALT, DEFAULT_SCENARIOS, GET_PRICES_CHUNK_SIZE, GET_PRICES_GAS_LIMIT_BY_CHAIN_ID, GearboxPermissionless, InstanceOwnerTransactions, PermissionlessAnalytics, PermissionlessChainUnreachableError, PermissionlessDeploy, PermissionlessNotAttachedError, PermissionlessOracles, PriceFeedNotInStoreError, PriceFeedSaltMissingError, PriceFeedStalenessUnknownError, RATE_FEED_TYPE, REVERT_SCORE, SCORE_MULTIPLIER, UNBOUNDED_DOWN, UNBOUNDED_UP, classifySources, deriveEffectiveStalenessPeriod, factorOf, finalPrice, groupOverride, perturb, priceFeedSalt, rateStub, readForest, readRateTargets, readUnder, roundDataStub, runAssetScores, runStressTest, scoreGroup, scoreOfFactor, slotHarm, sourcesByFeed, verdictOf, worstOf };
@@ -361,17 +361,17 @@ var PermissionlessOracles = class extends AbstractOffchainNamespace {
361
361
  /**
362
362
  * Every asset's score out of 10 for how its markets guard its price.
363
363
  *
364
- * A market scores 10 when its reserve feed is a second feed on other
365
- * sources than the main one, and one of the two is bounded — a
366
- * `BoundedPriceFeed` or a Gearbox LP feed. It loses 6 points as the two
367
- * feeds' sources overlap — all of them if there is no reserve, it is a
368
- * `ZeroPriceFeed`, or it is the main feed again — and 5 if neither is
369
- * bounded. An asset scores its worst running market that takes it as
370
- * collateral.
371
- *
372
- * Read off the chain, one multicall of feed trees per chain, so the score
373
- * is of the trees as they stand rather than as last indexed. A chain with
374
- * no client configured is left out with a warning rather than failing the
364
+ * Each source group behind an asset's feeds — Chainlink, Redstone, Lido and
365
+ * so on — is made in turn to answer five times what it answers now, and a
366
+ * market scores by how far that moves its final price, `min(main,
367
+ * reserve)`: 10 for not at all, 0 for the full five times, on a log scale.
368
+ * A price that stops answering scores 5. An asset scores its worst running
369
+ * market that takes it as collateral.
370
+ *
371
+ * Simulated on the chain as it stands, through state overrides in
372
+ * `eth_call`: one call per source group per chain, so the node behind the
373
+ * client has to accept overrides. A chain with no client configured, or
374
+ * whose node refuses, is left out with a warning rather than failing the
375
375
  * rest.
376
376
  *
377
377
  * ```ts
@@ -1,11 +1,11 @@
1
1
  import { classifySources, sourcesByFeed } from "./stress/classify.js";
2
2
  import { UNBOUNDED_DOWN, UNBOUNDED_UP, groupOverride, perturb, rateStub, roundDataStub } from "./stress/override.js";
3
3
  import { scoreGroup, slotHarm, verdictOf } from "./stress/score.js";
4
- import { DEFAULT_SCENARIOS, RATE_FEED_TYPE, readForest, readRateTargets, runStressTest } from "./stress/run.js";
5
- import { BOUND_WEIGHT, INDEPENDENCE_WEIGHT, scoreMarket } from "./score/formula.js";
4
+ import { DEFAULT_SCENARIOS, RATE_FEED_TYPE, readForest, readRateTargets, readUnder, runStressTest } from "./stress/run.js";
5
+ import { REVERT_SCORE, SCORE_MULTIPLIER, factorOf, finalPrice, scoreOfFactor, worstOf } from "./score/formula.js";
6
6
  import { runAssetScores } from "./score/run.js";
7
7
  import { GET_PRICES_CHUNK_SIZE, GET_PRICES_GAS_LIMIT_BY_CHAIN_ID, PermissionlessOracles } from "./PermissionlessOracles.js";
8
8
  import "./score/index.js";
9
9
  import "./stress/index.js";
10
10
  import "./types.js";
11
- export { BOUND_WEIGHT, DEFAULT_SCENARIOS, GET_PRICES_CHUNK_SIZE, GET_PRICES_GAS_LIMIT_BY_CHAIN_ID, INDEPENDENCE_WEIGHT, PermissionlessOracles, RATE_FEED_TYPE, UNBOUNDED_DOWN, UNBOUNDED_UP, classifySources, groupOverride, perturb, rateStub, readForest, readRateTargets, roundDataStub, runAssetScores, runStressTest, scoreGroup, scoreMarket, slotHarm, sourcesByFeed, verdictOf };
11
+ export { DEFAULT_SCENARIOS, GET_PRICES_CHUNK_SIZE, GET_PRICES_GAS_LIMIT_BY_CHAIN_ID, PermissionlessOracles, RATE_FEED_TYPE, REVERT_SCORE, SCORE_MULTIPLIER, UNBOUNDED_DOWN, UNBOUNDED_UP, classifySources, factorOf, finalPrice, groupOverride, perturb, rateStub, readForest, readRateTargets, readUnder, roundDataStub, runAssetScores, runStressTest, scoreGroup, scoreOfFactor, slotHarm, sourcesByFeed, verdictOf, worstOf };
@@ -1,96 +1,55 @@
1
1
  //#region src/permissionless/api/oracles/score/formula.ts
2
+ /** What every source of a group is made to answer, as a multiple of now. */
3
+ const SCORE_MULTIPLIER = 5;
2
4
  /**
3
- * How well a market guards an asset's price, from its two feeds alone.
5
+ * The score of a price that stops answering under the lie.
4
6
  *
5
- * Two questions, and the points are lost for each separately:
6
- *
7
- * - Would the reserve disagree with a main feed that has gone wrong? Only if
8
- * it is a second feed on other sources. A missing reserve, a
9
- * `ZeroPriceFeed`, the main feed again, and a different feed on the same
10
- * sources all answer no.
11
- * - Is either feed bounded? A `BoundedPriceFeed` caps the answer from above,
12
- * and a Gearbox LP feed clamps its exchange rate to a window.
13
- *
14
- * Independence costs more than the bound, 6 points against 5, because it is
15
- * the broader protection: a bounded feed caps only from above, and an LP
16
- * feed's window holds only its rate, not the price of what the rate is in.
17
- * Either failure alone lands a market at 4 or 5; both together at 0.
7
+ * Half marks: nobody can borrow against a wrong number, but nobody can be
8
+ * liquidated either until the feed is replaced.
18
9
  */
19
- const INDEPENDENCE_WEIGHT = 6;
20
- const BOUND_WEIGHT = 5;
10
+ const REVERT_SCORE = 5;
21
11
  /**
22
- * The feed types that bound what they answer: the `BoundedPriceFeed`, and
23
- * every Gearbox LP feed, all of which clamp the rate they read.
12
+ * 0 to 10 by how far the final price moved, on a log scale against the lie
13
+ * itself: 10 for a price that did not move, 0 for one that moved by the full
14
+ * {@link SCORE_MULTIPLIER} or more, either way. Rounded to a half point.
15
+ *
16
+ * A bound holding a price within a few percent keeps a 10; a price that let
17
+ * half the lie through, ×√5, scores 5.
24
18
  */
25
- const BOUNDED_TYPE = /::(BOUNDED|ERC4626|CURVE_\w+|WSTETH|YEARN|MELLOW\w*|BALANCER\w*)$/;
26
- const ZERO_TYPE = "PRICE_FEED::ZERO";
19
+ function scoreOfFactor(factor) {
20
+ if (factor === null || !Number.isFinite(factor) || factor <= 0) return 5;
21
+ const moved = Math.abs(Math.log(factor)) / Math.log(5);
22
+ return Math.round(10 * Math.max(0, 1 - moved) * 2) / 2;
23
+ }
27
24
  /**
28
- * The share of the two sides' sources that are not shared, by key.
29
- *
30
- * Nothing on either side — two hardcoded prices — is 0, because a reserve is
31
- * there to be a second opinion and neither of them is one.
25
+ * The price a market settles on: the lower of main and reserve, or the main
26
+ * feed's alone where there is no reserve to compare it with. `null` where a
27
+ * feed it needs does not answer.
32
28
  */
33
- function independenceOf(main, reserve) {
34
- const a = new Set(main.map((source) => source.key));
35
- const b = new Set(reserve.map((source) => source.key));
36
- const union = /* @__PURE__ */ new Set([...a, ...b]);
37
- if (union.size === 0) return 0;
38
- return 1 - [...a].filter((key) => b.has(key)).length / union.size;
29
+ function finalPrice(main, reserve) {
30
+ if (main === null || reserve === null) return null;
31
+ if (reserve === void 0) return main;
32
+ return main < reserve ? main : reserve;
39
33
  }
40
- /** Down to the half point, so that a score is never rounded up into a band. */
41
- function toHalf(value) {
42
- return Math.floor(value * 2 + 1e-9) / 2;
34
+ /** `stressed / base` as a float, `null` where the stressed price is gone. */
35
+ function factorOf(base, stressed) {
36
+ if (stressed === null) return null;
37
+ return Number(stressed) / Number(base);
43
38
  }
44
39
  /**
45
- * One market's score for one asset.
46
- *
47
- * `reserve` is `null` where the market holds no reserve for the asset at all.
48
- * A source is passed per side and keyed by the caller, which is where it is
49
- * decided that an unnamed source is its own contract and a named one is its
50
- * group.
40
+ * The market's score and the group it comes from: the lowest of its groups,
41
+ * ties going to the group that moved the price further. 10 where no source
42
+ * feeds the price at all, since nothing can be made to lie about it.
51
43
  */
52
- function scoreMarket(market, main, reserve) {
53
- const reasons = [];
54
- let hasReserve = true;
55
- if (reserve === null) {
56
- hasReserve = false;
57
- reasons.push("no reserve feed");
58
- } else if (reserve.feed.contractType === ZERO_TYPE) {
59
- hasReserve = false;
60
- reasons.push("reserve is a ZeroPriceFeed");
61
- } else if (reserve.feed.feed.toLowerCase() === main.feed.feed.toLowerCase()) {
62
- hasReserve = false;
63
- reasons.push("reserve is the main feed");
64
- }
65
- const reserveSources = hasReserve && reserve ? reserve.sources : [];
66
- const independence = hasReserve ? independenceOf(main.sources, reserveSources) : 0;
67
- const reserveKeys = new Set(reserveSources.map((source) => source.key));
68
- const mainKeys = new Set(main.sources.map((source) => source.key));
69
- const shared = main.sources.filter((source) => reserveKeys.has(source.key));
70
- const names = (sources) => [...new Set(sources.map((source) => source.name))];
71
- if (hasReserve && independence < 1) reasons.push(shared.length > 0 ? `main and reserve share ${names(shared).join(", ")}` : "neither feed reads a price source");
72
- const unverified = hasReserve && [...main.sources.filter((source) => !reserveKeys.has(source.key)), ...reserveSources.filter((source) => !mainKeys.has(source.key))].some((source) => !source.identified);
73
- const bounded = BOUNDED_TYPE.test(main.feed.contractType) || reserve !== null && BOUNDED_TYPE.test(reserve.feed.contractType);
74
- if (!bounded) reasons.push("neither feed is bounded");
75
- const score = toHalf(Math.max(0, 10 - 6 * (1 - independence) - 5 * (bounded ? 0 : 1)));
44
+ function worstOf(impacts) {
45
+ const distance = (impact) => impact.factor === null ? Infinity : Math.abs(Math.log(impact.factor));
46
+ const sorted = [...impacts].sort((a, b) => a.score - b.score || distance(b) - distance(a));
47
+ const worst = sorted[0] ?? null;
76
48
  return {
77
- ...market,
78
- main: {
79
- ...main.feed,
80
- sources: names(main.sources)
81
- },
82
- reserve: reserve ? {
83
- ...reserve.feed,
84
- sources: names(reserve.sources)
85
- } : null,
86
- hasReserve,
87
- independence,
88
- bounded,
89
- sharedSources: names(shared),
90
- unverified,
91
- score,
92
- reasons
49
+ score: worst?.score ?? 10,
50
+ impacts: sorted,
51
+ worst
93
52
  };
94
53
  }
95
54
  //#endregion
96
- export { BOUND_WEIGHT, INDEPENDENCE_WEIGHT, scoreMarket };
55
+ export { REVERT_SCORE, SCORE_MULTIPLIER, factorOf, finalPrice, scoreOfFactor, worstOf };
@@ -1,4 +1,4 @@
1
- import { BOUND_WEIGHT, INDEPENDENCE_WEIGHT, scoreMarket } from "./formula.js";
1
+ import { REVERT_SCORE, SCORE_MULTIPLIER, factorOf, finalPrice, scoreOfFactor, worstOf } from "./formula.js";
2
2
  import { runAssetScores } from "./run.js";
3
3
  import "./types.js";
4
- export { BOUND_WEIGHT, INDEPENDENCE_WEIGHT, runAssetScores, scoreMarket };
4
+ export { REVERT_SCORE, SCORE_MULTIPLIER, factorOf, finalPrice, runAssetScores, scoreOfFactor, worstOf };