@permissionless-technologies/upd-sdk 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-3V62JGJY.js +192 -0
- package/dist/chunk-3V62JGJY.js.map +1 -0
- package/dist/{chunk-ZSWETUGH.cjs → chunk-7BP37BGO.cjs} +359 -31
- package/dist/chunk-7BP37BGO.cjs.map +1 -0
- package/dist/{chunk-R64I3LAO.js → chunk-AGPBQ56J.js} +81 -155
- package/dist/chunk-AGPBQ56J.js.map +1 -0
- package/dist/chunk-KSGUFTW3.cjs +206 -0
- package/dist/chunk-KSGUFTW3.cjs.map +1 -0
- package/dist/{chunk-WRPVPA7E.cjs → chunk-LECDXCSW.cjs} +105 -184
- package/dist/chunk-LECDXCSW.cjs.map +1 -0
- package/dist/{chunk-4RBWWS2X.js → chunk-PS6EIE5E.js} +359 -32
- package/dist/chunk-PS6EIE5E.js.map +1 -0
- package/dist/{chunk-RIRT4JX6.js → chunk-TYRBIJVF.js} +3 -228
- package/dist/chunk-TYRBIJVF.js.map +1 -0
- package/dist/{chunk-ZDAHLZWC.cjs → chunk-VZZN3BR3.cjs} +2 -228
- package/dist/chunk-VZZN3BR3.cjs.map +1 -0
- package/dist/contracts/index.cjs +13 -13
- package/dist/contracts/index.d.cts +104 -24
- package/dist/contracts/index.d.ts +104 -24
- package/dist/contracts/index.js +2 -2
- package/dist/core/index.cjs +17 -17
- package/dist/core/index.d.cts +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +3 -3
- package/dist/{index-XNClksom.d.ts → index-BMgIlGvW.d.ts} +11 -3
- package/dist/{index-yRBqVOHV.d.cts → index-D6VgT_bZ.d.cts} +11 -3
- package/dist/index.cjs +50 -50
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/react/index.cjs +145 -22
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +112 -1
- package/dist/react/index.d.ts +112 -1
- package/dist/react/index.js +126 -5
- package/dist/react/index.js.map +1 -1
- package/package.json +3 -1
- package/dist/chunk-4RBWWS2X.js.map +0 -1
- package/dist/chunk-4VXNJTNQ.cjs +0 -58
- package/dist/chunk-4VXNJTNQ.cjs.map +0 -1
- package/dist/chunk-63FIKV36.js +0 -49
- package/dist/chunk-63FIKV36.js.map +0 -1
- package/dist/chunk-R64I3LAO.js.map +0 -1
- package/dist/chunk-RIRT4JX6.js.map +0 -1
- package/dist/chunk-WRPVPA7E.cjs.map +0 -1
- package/dist/chunk-ZDAHLZWC.cjs.map +0 -1
- package/dist/chunk-ZSWETUGH.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/deployments/31337.json","../src/deployments/11155111.json","../src/deployments/index.ts","../src/core/quote.ts","../src/core/health.ts"],"names":["__default","PRICE_PRECISION"],"mappings":";;;AAAA,IAAA,SAAA,GAAA;AAAA,EACE,SAAA,EAAa;AAAA,IACX,QAAA,EAAY,4CAAA;AAAA,IACZ,WAAA,EAAe,4CAAA;AAAA,IACf,aAAA,EAAiB,4CAAA;AAAA,IACjB,6BAAA,EAAiC,4CAAA;AAAA,IACjC,eAAA,EAAmB,4CAAA;AAAA,IACnB,YAAA,EAAgB,4CAAA;AAAA,IAChB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA,eAAA,EAAmB;AAAA,IACjB,WAAA,EAAe,4CAAA;AAAA,IACf,aAAA,EAAiB,4CAAA;AAAA,IACjB,6BAAA,EAAiC;AAAA,GACnC;AAAA,EACA,SAAA,EAAa;AAAA,IACX,aAAA,EAAiB,4CAAA;AAAA,IACjB,iBAAA,EAAqB;AAAA,GACvB;AAAA,EACA,SAAA,EAAa;AAAA,IACX,gBAAA,EAAoB,4CAAA;AAAA,IACpB,cAAA,EAAkB;AAAA,GACpB;AAAA,EACA,QAAA,EAAY;AAAA,IACV,KAAA,EAAS,4CAAA;AAAA,IACT,IAAA,EAAQ,4CAAA;AAAA,IACR,YAAA,EAAgB;AAAA,GAClB;AAAA,EACA,QAAA,EAAY;AAAA,IACV,OAAA,EAAW,KAAA;AAAA,IACX,WAAA,EAAe,CAAA;AAAA,IACf,eAAA,EAAmB,CAAA;AAAA,IACnB,QAAA,EAAY;AAAA;AAEhB,CAAA;;;AClCA,IAAAA,UAAAA,GAAA;AAAA,EACE,SAAA,EAAa;AAAA,IACX,QAAA,EAAY,4CAAA;AAAA,IACZ,WAAA,EAAe,4CAAA;AAAA,IACf,aAAA,EAAiB,4CAAA;AAAA,IACjB,6BAAA,EAAiC,4CAAA;AAAA,IACjC,eAAA,EAAmB,4CAAA;AAAA,IACnB,YAAA,EAAgB;AAAA,GAClB;AAAA,EACA,eAAA,EAAmB;AAAA,IACjB,WAAA,EAAe,4CAAA;AAAA,IACf,aAAA,EAAiB,4CAAA;AAAA,IACjB,6BAAA,EAAiC;AAAA,GACnC;AAAA,EACA,SAAA,EAAa;AAAA,IACX,aAAA,EAAiB,4CAAA;AAAA,IACjB,iBAAA,EAAqB;AAAA,GACvB;AAAA,EACA,SAAA,EAAa;AAAA,IACX,gBAAA,EAAoB,4CAAA;AAAA,IACpB,cAAA,EAAkB,4CAAA;AAAA,IAClB,sBAAA,EAA0B,4CAAA;AAAA,IAC1B,oBAAA,EAAwB,4CAAA;AAAA,IACxB,kBAAA,EAAsB;AAAA,GACxB;AAAA,EACA,QAAA,EAAY;AAAA,IACV,KAAA,EAAS,4CAAA;AAAA,IACT,IAAA,EAAQ,4CAAA;AAAA,IACR,YAAA,EAAgB;AAAA,GAClB;AAAA,EACA,QAAA,EAAY;AAAA,IACV,OAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAe,CAAA;AAAA,IACf,eAAA,EAAmB,UAAA;AAAA,IACnB,QAAA,EAAY;AAAA;AAEhB,CAAA;;;AC6BA,SAAS,eAAA,CAAgB,MAAsB,OAAA,EAAsC;AACnF,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,KAAK,SAAA,CAAU,QAAA;AAAA,MACzB,WAAA,EAAa,KAAK,SAAA,CAAU,WAAA;AAAA,MAC5B,aAAA,EAAe,KAAK,SAAA,CAAU,aAAA;AAAA,MAC9B,6BAAA,EAA+B,KAAK,SAAA,CAAU,6BAAA;AAAA,MAC9C,eAAA,EAAiB,KAAK,SAAA,CAAU,eAAA;AAAA,MAChC,YAAA,EAAc,KAAK,SAAA,CAAU,YAAA;AAAA,MAC7B,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,KACvB;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,WAAA,EAAa,KAAK,eAAA,CAAgB,WAAA;AAAA,MAClC,aAAA,EAAe,KAAK,eAAA,CAAgB,aAAA;AAAA,MACpC,6BAAA,EAA+B,KAAK,eAAA,CAAgB,6BAAA;AAAA,MACpD,IAAA,EAAM,KAAK,eAAA,CAAgB;AAAA,KAC7B;AAAA,IACA,SAAA,EAAW;AAAA,MACT,aAAA,EAAe,KAAK,SAAA,CAAU,aAAA;AAAA,MAC9B,iBAAA,EAAmB,KAAK,SAAA,CAAU;AAAA,KACpC;AAAA,IACA,SAAA,EAAW;AAAA,MACT,gBAAA,EAAkB,KAAK,SAAA,CAAU,gBAAA;AAAA,MACjC,cAAA,EAAgB,KAAK,SAAA,CAAU;AAAA,KACjC;AAAA,IACA,QAAA,EAAU;AAAA,MACR,KAAA,EAAO,KAAK,QAAA,CAAS,KAAA;AAAA,MACrB,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,MACpB,YAAA,EAAc,KAAK,QAAA,CAAS;AAAA,KAC9B;AAAA,IACA,QAAA,EAAU;AAAA,MACR,WAAA,EAAa,KAAK,QAAA,CAAS,WAAA;AAAA,MAC3B,eAAA,EAAiB,KAAK,QAAA,CAAS,eAAA;AAAA,MAC/B,QAAA,EAAU,KAAK,QAAA,CAAS;AAAA;AAC1B,GACF;AACF;AAMA,IAAM,WAAA,GAAmD;AAAA,EACvD,KAAA,EAAO,eAAA,CAAgB,SAAA,EAAoC,KAAK,CAAA;AAAA,EAChE,QAAA,EAAU,eAAA,CAAgBA,UAAAA,EAAsC,QAAQ;AAC1E,CAAA;AAGO,SAAS,cAAc,OAAA,EAA6C;AACzE,EAAA,OAAO,WAAA,CAAY,OAAO,CAAA,IAAK,IAAA;AACjC;AAGO,SAAS,qBAAqB,OAAA,EAAsC;AACzE,EAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,qCAAqC,OAAO,CAAA,oBAAA,EACvB,sBAAqB,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACxD;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAGO,SAAS,cAAc,OAAA,EAA0B;AACtD,EAAA,OAAO,OAAA,IAAW,WAAA;AACpB;AAGO,SAAS,oBAAA,GAAiC;AAC/C,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,IAAI,MAAM,CAAA;AAC5C;AAGO,SAAS,kBAAA,CACd,SACA,YAAA,EACgB;AAChB,EAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,OAAO,UAAA,CAAW,SAAA,CAAU,YAAY,CAAA,IAAK,IAAA;AAC/C;;;AC5IA,IAAM,kBAAkB,GAAA,IAAO,GAAA;AAC/B,IAAM,kBAAkB,GAAA,IAAO,GAAA;AAexB,SAAS,YAAA,CAAa,WAAmB,WAAA,EAA6B;AAC3E,EAAA,OAAQ,YAAY,WAAA,GAAe,eAAA;AACrC;AAeO,SAAS,YAAA,CAAa,WAAmB,WAAA,EAA6B;AAC3E,EAAA,IAAI,WAAA,KAAgB,EAAA,EAAI,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAC9D,EAAA,OAAQ,YAAY,eAAA,GAAmB,WAAA;AACzC;AAeO,SAAS,qBAAA,CACd,SACA,qBAAA,EACQ;AACR,EAAA,OAAQ,OAAA,IAAW,wBAAwB,MAAA,CAAA,GAAW,MAAA;AACxD;AA+BO,SAAS,aAAA,CAAc,WAAmB,UAAA,EAA4B;AAC3E,EAAA,IAAI,UAAA,KAAe,EAAA,EAAI,MAAM,IAAI,MAAM,4BAA4B,CAAA;AACnE,EAAA,OAAQ,YAAY,eAAA,GAAmB,UAAA;AACzC;AAiBO,SAAS,eAAA,CAAgB,QAAgB,UAAA,EAA4B;AAC1E,EAAA,OAAQ,SAAS,UAAA,GAAc,eAAA;AACjC;AAEO,SAAS,sBAAA,CACd,YAAA,EACA,WAAA,EACA,eAAA,EACQ;AACR,EAAA,IAAI,eAAA,KAAoB,IAAI,OAAO,MAAA,CAAO,CAAC,CAAA,IAAK,MAAA,CAAO,GAAG,CAAA,GAAI,EAAA;AAC9D,EAAA,MAAM,kBAAA,GAAsB,eAAe,WAAA,GAAe,eAAA;AAC1D,EAAA,OAAQ,qBAAqB,MAAA,GAAU,eAAA;AACzC;;;ACnHO,IAAM,qBAAA,GAAwB;AAkC9B,SAAS,mBAAA,CACd,UAAA,EACA,WAAA,EACA,WAAA,GAAsB,qBAAA,EACR;AACd,EAAA,MAAMC,mBAAkB,GAAA,IAAO,GAAA;AAE/B,EAAA,MAAM,kBAAA,GACH,UAAA,CAAW,oBAAA,GAAuB,WAAA,GAAeA,gBAAAA;AAEpD,EAAA,MAAM,wBAAA,GAA2B,sBAAA;AAAA,IAC/B,UAAA,CAAW,oBAAA;AAAA,IACX,WAAA;AAAA,IACA,UAAA,CAAW;AAAA,GACb;AAEA,EAAA,MAAM,SAAA,GAAY,qBAAqB,UAAA,CAAW,cAAA;AAElD,EAAA,OAAO;AAAA,IACL,wBAAA;AAAA,IACA,WAAW,wBAAA,IAA4B,WAAA;AAAA,IACvC,kBAAA;AAAA,IACA,gBAAgB,UAAA,CAAW,cAAA;AAAA,IAC3B;AAAA,GACF;AACF","file":"chunk-KSGUFTW3.cjs","sourcesContent":["{\n \"contracts\": {\n \"UPDToken\": \"0x0000000000000000000000000000000000000000\",\n \"PriceOracle\": \"0x0000000000000000000000000000000000000000\",\n \"StabilizerNFT\": \"0x0000000000000000000000000000000000000000\",\n \"OvercollateralizationReporter\": \"0x0000000000000000000000000000000000000000\",\n \"InsuranceEscrow\": \"0x0000000000000000000000000000000000000000\",\n \"BridgeEscrow\": \"0x0000000000000000000000000000000000000000\",\n \"sUPD\": \"0x0000000000000000000000000000000000000000\"\n },\n \"implementations\": {\n \"PriceOracle\": \"0x0000000000000000000000000000000000000000\",\n \"StabilizerNFT\": \"0x0000000000000000000000000000000000000000\",\n \"OvercollateralizationReporter\": \"0x0000000000000000000000000000000000000000\"\n },\n \"libraries\": {\n \"LinkedListLib\": \"0x0000000000000000000000000000000000000000\",\n \"CollateralMathLib\": \"0x0000000000000000000000000000000000000000\"\n },\n \"templates\": {\n \"StabilizerEscrow\": \"0x0000000000000000000000000000000000000000\",\n \"PositionEscrow\": \"0x0000000000000000000000000000000000000000\"\n },\n \"external\": {\n \"stETH\": \"0x0000000000000000000000000000000000000000\",\n \"lido\": \"0x0000000000000000000000000000000000000000\",\n \"oracleSigner\": \"0x0000000000000000000000000000000000000000\"\n },\n \"metadata\": {\n \"chainId\": 31337,\n \"deployBlock\": 0,\n \"deployTimestamp\": 0,\n \"deployer\": \"0x0000000000000000000000000000000000000000\"\n }\n}\n","{\n \"contracts\": {\n \"UPDToken\": \"0xcF6Ace4Ff3B6f2e56E2Bd89a68cf5CA148Bd69a8\",\n \"PriceOracle\": \"0x415eb7A422291231a27EC86673B5d5ae0e1aD849\",\n \"StabilizerNFT\": \"0x4B705a4773f110F1716337a6C34eeaA4f575ee9f\",\n \"OvercollateralizationReporter\": \"0xA4dF955BB8eF2047deC4Ff889152479D5D62e287\",\n \"InsuranceEscrow\": \"0xc2Ae7a917c77B459951f56E73854Faa51b8c6103\",\n \"BridgeEscrow\": \"0x7BfDE5064ED50b4778B0983cc345a76DAFAC00Aa\"\n },\n \"implementations\": {\n \"PriceOracle\": \"0x7205C15a8266Fc203045b8B5b7CD2f4B41082c89\",\n \"StabilizerNFT\": \"0x82Ac19eC8bc8a660112333A250274b18ba05e8da\",\n \"OvercollateralizationReporter\": \"0x84499938994b7555A0C2759001B8293a0f23FF49\"\n },\n \"libraries\": {\n \"LinkedListLib\": \"0x28C62c4D84014c0714001483a7FB9C1902cB3E7D\",\n \"CollateralMathLib\": \"0xb7FC9e16380afce7Bcbb1a4B903fe3A3564CebCE\"\n },\n \"templates\": {\n \"StabilizerEscrow\": \"0x37302F82605EA0121Dc28b8950E41A8CEa817e50\",\n \"PositionEscrow\": \"0x3B0F4a18d41bf3Aa7179578c193c579f9043c948\",\n \"StabilizerEscrowBeacon\": \"0x82868B7FB57b14AdA6954f34acc1085d6fC189f9\",\n \"PositionEscrowBeacon\": \"0xa0233E45Fd5f14fe10c66ff1A1815ce54Cda1a33\",\n \"BeaconProxyFactory\": \"0xb44181b1671760B814cB5a96eD345160b9faaB61\"\n },\n \"external\": {\n \"stETH\": \"0x3e3FE7dBc6B4C189E7128855dD526361c49b40Af\",\n \"lido\": \"0x3e3FE7dBc6B4C189E7128855dD526361c49b40Af\",\n \"oracleSigner\": \"0xDEAD59BD1E61a3B6AB81806A30f4102831b70001\"\n },\n \"metadata\": {\n \"chainId\": 11155111,\n \"deployBlock\": 0,\n \"deployTimestamp\": 1775502732,\n \"deployer\": \"0xdEadDEADb916b00D02f4f2db062Fb2C47fe0689b\"\n }\n}","/**\n * Deployment Configuration Loader\n *\n * Loads UPD contract addresses based on chain ID.\n * JSON structure matches Forge deployment output exactly — no transformation needed.\n */\n\nimport type { Address } from 'viem'\n\nexport interface UPDDeploymentConfig {\n chainId: number\n /** Proxy/final contract addresses — what integrators use */\n contracts: {\n UPDToken: Address\n PriceOracle: Address\n StabilizerNFT: Address\n OvercollateralizationReporter: Address\n InsuranceEscrow: Address\n BridgeEscrow?: Address\n sUPD?: Address\n }\n /** UUPS implementation addresses — for upgrades only */\n implementations: {\n PriceOracle: Address\n StabilizerNFT: Address\n OvercollateralizationReporter: Address\n sUPD?: Address\n }\n /** Externally deployed Solidity libraries */\n libraries: {\n LinkedListLib: Address\n CollateralMathLib: Address\n }\n /** Clone template implementations (used by StabilizerNFT for escrow deployment) */\n templates: {\n StabilizerEscrow: Address\n PositionEscrow: Address\n }\n /** Third-party / external addresses */\n external: {\n stETH: Address\n lido: Address\n oracleSigner: Address\n }\n metadata: {\n deployBlock: number\n deployTimestamp: number\n deployer: Address\n }\n}\n\ninterface DeploymentJSON {\n contracts: Record<string, string>\n implementations: Record<string, string>\n libraries: Record<string, string>\n templates: Record<string, string>\n external: Record<string, string>\n metadata: {\n chainId: number\n deployBlock: number\n deployTimestamp: number\n deployer: string\n }\n}\n\nfunction parseDeployment(json: DeploymentJSON, chainId: number): UPDDeploymentConfig {\n return {\n chainId,\n contracts: {\n UPDToken: json.contracts.UPDToken as Address,\n PriceOracle: json.contracts.PriceOracle as Address,\n StabilizerNFT: json.contracts.StabilizerNFT as Address,\n OvercollateralizationReporter: json.contracts.OvercollateralizationReporter as Address,\n InsuranceEscrow: json.contracts.InsuranceEscrow as Address,\n BridgeEscrow: json.contracts.BridgeEscrow as Address | undefined,\n sUPD: json.contracts.sUPD as Address | undefined,\n },\n implementations: {\n PriceOracle: json.implementations.PriceOracle as Address,\n StabilizerNFT: json.implementations.StabilizerNFT as Address,\n OvercollateralizationReporter: json.implementations.OvercollateralizationReporter as Address,\n sUPD: json.implementations.sUPD as Address | undefined,\n },\n libraries: {\n LinkedListLib: json.libraries.LinkedListLib as Address,\n CollateralMathLib: json.libraries.CollateralMathLib as Address,\n },\n templates: {\n StabilizerEscrow: json.templates.StabilizerEscrow as Address,\n PositionEscrow: json.templates.PositionEscrow as Address,\n },\n external: {\n stETH: json.external.stETH as Address,\n lido: json.external.lido as Address,\n oracleSigner: json.external.oracleSigner as Address,\n },\n metadata: {\n deployBlock: json.metadata.deployBlock,\n deployTimestamp: json.metadata.deployTimestamp,\n deployer: json.metadata.deployer as Address,\n },\n }\n}\n\n// Import deployment configs — add new chains here\nimport anvil from './31337.json' with { type: 'json' }\nimport sepolia from './11155111.json' with { type: 'json' }\n\nconst deployments: Record<number, UPDDeploymentConfig> = {\n 31337: parseDeployment(anvil as unknown as DeploymentJSON, 31337),\n 11155111: parseDeployment(sepolia as unknown as DeploymentJSON, 11155111),\n}\n\n/** Get deployment config for a chain. Returns null if not found. */\nexport function getDeployment(chainId: number): UPDDeploymentConfig | null {\n return deployments[chainId] ?? null\n}\n\n/** Get deployment config or throw if not found. */\nexport function getDeploymentOrThrow(chainId: number): UPDDeploymentConfig {\n const deployment = getDeployment(chainId)\n if (!deployment) {\n throw new Error(\n `No UPD deployment found for chain ${chainId}. ` +\n `Supported chains: ${getSupportedChainIds().join(', ')}`,\n )\n }\n return deployment\n}\n\n/** Check if a chain has a deployment. */\nexport function hasDeployment(chainId: number): boolean {\n return chainId in deployments\n}\n\n/** Get all supported chain IDs. */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(deployments).map(Number)\n}\n\n/** Get a specific contract address for a chain. */\nexport function getContractAddress(\n chainId: number,\n contractName: keyof UPDDeploymentConfig['contracts'],\n): Address | null {\n const deployment = getDeployment(chainId)\n if (!deployment) return null\n return deployment.contracts[contractName] ?? null\n}\n\n/**\n * Register a deployment for a custom chain at runtime.\n *\n * Use this when deploying your own UPD system on a chain not built into the SDK.\n * Overrides any existing deployment for the same chainId.\n *\n * @example\n * ```ts\n * registerDeployment(8453, {\n * chainId: 8453,\n * contracts: { UPDToken: '0x...', PriceOracle: '0x...', ... },\n * implementations: { ... },\n * libraries: { ... },\n * templates: { ... },\n * external: { stETH: '0x...', lido: '0x...', oracleSigner: '0x...' },\n * metadata: { deployBlock: 12345678, deployTimestamp: 0, deployer: '0x...' },\n * })\n * ```\n */\nexport function registerDeployment(chainId: number, config: UPDDeploymentConfig): void {\n deployments[chainId] = { ...config, chainId }\n}\n","/**\n * UPD Quote Functions — Pure math for estimating mint/burn amounts.\n *\n * These functions require no blockchain calls. They mirror the Solidity\n * CollateralMathLib logic so integrators can show users expected amounts\n * before submitting a transaction.\n */\n\nconst PRICE_PRECISION = 10n ** 18n\nconst SHARE_PRECISION = 10n ** 18n\n\n/**\n * Estimate how much UPD a user will receive for a given ETH amount.\n *\n * @param ethAmount - ETH to deposit (in wei)\n * @param ethUsdPrice - ETH/USD price (18 decimals, e.g. 2000e18 = $2000)\n * @returns Expected UPD amount (18 decimals)\n *\n * @example\n * ```ts\n * const upd = quoteMintUPD(parseEther('1'), 2000n * 10n**18n)\n * // → 2000000000000000000000n (2000 UPD)\n * ```\n */\nexport function quoteMintUPD(ethAmount: bigint, ethUsdPrice: bigint): bigint {\n return (ethAmount * ethUsdPrice) / PRICE_PRECISION\n}\n\n/**\n * Estimate how much stETH a user will receive for burning UPD.\n *\n * @param updAmount - UPD to burn (18 decimals)\n * @param ethUsdPrice - ETH/USD price (18 decimals)\n * @returns Expected stETH amount (in wei)\n *\n * @example\n * ```ts\n * const stEth = quoteBurnUPD(parseUnits('2000', 18), 2000n * 10n**18n)\n * // → 1000000000000000000n (1 stETH)\n * ```\n */\nexport function quoteBurnUPD(updAmount: bigint, ethUsdPrice: bigint): bigint {\n if (ethUsdPrice === 0n) throw new Error('Price cannot be zero')\n return (updAmount * PRICE_PRECISION) / ethUsdPrice\n}\n\n/**\n * Calculate the stabilizer stETH needed for a given user ETH deposit.\n *\n * @param userEth - User's ETH amount (in wei)\n * @param minCollateralRatioBps - Minimum collateral ratio in basis points (e.g. 12500 = 125%)\n * @returns Stabilizer stETH required (in wei)\n *\n * @example\n * ```ts\n * const needed = stabilizerStEthNeeded(parseEther('10'), 12500n)\n * // → 2500000000000000000n (2.5 ETH worth of stETH at 125% ratio)\n * ```\n */\nexport function stabilizerStEthNeeded(\n userEth: bigint,\n minCollateralRatioBps: bigint,\n): bigint {\n return (userEth * (minCollateralRatioBps - 10000n)) / 10000n\n}\n\n/**\n * Calculate the collateralization ratio from stETH balance, price, and UPD liability.\n *\n * @param stEthBalance - stETH held in escrow (in wei)\n * @param ethUsdPrice - ETH/USD price (18 decimals)\n * @param backedUPDAmount - UPD liability (18 decimals)\n * @returns Collateralization ratio in basis points (e.g. 12500 = 125%)\n *\n * @example\n * ```ts\n * const ratio = collateralizationRatio(parseEther('1.25'), 2000n * 10n**18n, parseUnits('2000', 18))\n * // → 12500n (125%)\n * ```\n */\n/**\n * Estimate sUPD shares received for staking UPD.\n *\n * Mirrors sUPD.sol line 136: shares = updAmount * SHARE_PRECISION / shareValue\n *\n * @param updAmount - UPD to stake (18 decimals)\n * @param shareValue - Current sUPD share value (18 decimals, e.g. 1.05e18 = $1.05/share)\n * @returns Expected sUPD shares (18 decimals)\n *\n * @example\n * ```ts\n * const shares = quoteStakeUPD(parseUnits('1000', 18), 1050000000000000000n)\n * // → ~952.38e18 shares (1000 UPD at $1.05/share)\n * ```\n */\nexport function quoteStakeUPD(updAmount: bigint, shareValue: bigint): bigint {\n if (shareValue === 0n) throw new Error('Share value cannot be zero')\n return (updAmount * SHARE_PRECISION) / shareValue\n}\n\n/**\n * Estimate UPD received for unstaking sUPD shares.\n *\n * Mirrors sUPD.sol line 173: updOwed = shares * shareValue / SHARE_PRECISION\n *\n * @param shares - sUPD shares to unstake (18 decimals)\n * @param shareValue - Current sUPD share value (18 decimals)\n * @returns Expected UPD amount (18 decimals)\n *\n * @example\n * ```ts\n * const upd = quoteUnstakeUPD(parseUnits('952.38', 18), 1050000000000000000n)\n * // → ~1000e18 UPD\n * ```\n */\nexport function quoteUnstakeUPD(shares: bigint, shareValue: bigint): bigint {\n return (shares * shareValue) / SHARE_PRECISION\n}\n\nexport function collateralizationRatio(\n stEthBalance: bigint,\n ethUsdPrice: bigint,\n backedUPDAmount: bigint,\n): bigint {\n if (backedUPDAmount === 0n) return BigInt(2) ** BigInt(256) - 1n // type(uint256).max\n const collateralValueUSD = (stEthBalance * ethUsdPrice) / PRICE_PRECISION\n return (collateralValueUSD * 10000n) / backedUPDAmount\n}\n","/**\n * System Health — Pure functions for computing UPD system health metrics.\n *\n * These functions take pre-fetched data (from UPDClient or React hooks) and\n * compute derived health metrics. No blockchain calls — composable with\n * any data source.\n */\n\nimport type { CollateralInfo } from './types.js'\nimport { collateralizationRatio } from './quote.js'\n\n/** Default minimum system collateral ratio: 125% (12500 bps). */\nexport const DEFAULT_MIN_RATIO_BPS = 12500n\n\nexport interface SystemHealth {\n /** System-wide collateralization ratio in basis points (e.g. 12500 = 125%). */\n systemCollateralRatioBps: bigint\n /** Whether the system is at or above the minimum collateral threshold. */\n isHealthy: boolean\n /** USD value of total stETH collateral (18 decimals). */\n collateralValueUsd: bigint\n /** Total UPD supply (18 decimals). */\n totalUPDSupply: bigint\n /** Overcollateralization buffer in USD (collateral - supply). Can be negative. */\n bufferUsd: bigint\n}\n\n/**\n * Compute system health from collateral info and current ETH/USD price.\n *\n * @param collateral - Total stETH collateral and UPD supply (from getCollateralInfo)\n * @param ethUsdPrice - Current ETH/USD price in 18 decimals\n * @param minRatioBps - Minimum healthy ratio in basis points (default: 12500 = 125%)\n * @returns Computed system health metrics\n *\n * @example\n * ```ts\n * const info = await client.getCollateralInfo()\n * const { price } = await oracle.getEthUsdPrice()\n * const health = computeSystemHealth(info, price)\n *\n * if (!health.isHealthy) {\n * console.warn(`System undercollateralized: ${health.systemCollateralRatioBps} bps`)\n * }\n * ```\n */\nexport function computeSystemHealth(\n collateral: CollateralInfo,\n ethUsdPrice: bigint,\n minRatioBps: bigint = DEFAULT_MIN_RATIO_BPS,\n): SystemHealth {\n const PRICE_PRECISION = 10n ** 18n\n\n const collateralValueUsd =\n (collateral.totalStEthCollateral * ethUsdPrice) / PRICE_PRECISION\n\n const systemCollateralRatioBps = collateralizationRatio(\n collateral.totalStEthCollateral,\n ethUsdPrice,\n collateral.totalUPDSupply,\n )\n\n const bufferUsd = collateralValueUsd - collateral.totalUPDSupply\n\n return {\n systemCollateralRatioBps,\n isHealthy: systemCollateralRatioBps >= minRatioBps,\n collateralValueUsd,\n totalUPDSupply: collateral.totalUPDSupply,\n bufferUsd,\n }\n}\n"]}
|
|
@@ -1,150 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkKSGUFTW3_cjs = require('./chunk-KSGUFTW3.cjs');
|
|
4
|
+
var chunk7BP37BGO_cjs = require('./chunk-7BP37BGO.cjs');
|
|
5
5
|
var chunkCZEDT3MS_cjs = require('./chunk-CZEDT3MS.cjs');
|
|
6
6
|
var viem = require('viem');
|
|
7
7
|
|
|
8
|
-
// src/deployments/31337.json
|
|
9
|
-
var __default = {
|
|
10
|
-
contracts: {
|
|
11
|
-
UPDToken: "0x0000000000000000000000000000000000000000",
|
|
12
|
-
PriceOracle: "0x0000000000000000000000000000000000000000",
|
|
13
|
-
StabilizerNFT: "0x0000000000000000000000000000000000000000",
|
|
14
|
-
OvercollateralizationReporter: "0x0000000000000000000000000000000000000000",
|
|
15
|
-
InsuranceEscrow: "0x0000000000000000000000000000000000000000",
|
|
16
|
-
BridgeEscrow: "0x0000000000000000000000000000000000000000",
|
|
17
|
-
sUPD: "0x0000000000000000000000000000000000000000"
|
|
18
|
-
},
|
|
19
|
-
implementations: {
|
|
20
|
-
PriceOracle: "0x0000000000000000000000000000000000000000",
|
|
21
|
-
StabilizerNFT: "0x0000000000000000000000000000000000000000",
|
|
22
|
-
OvercollateralizationReporter: "0x0000000000000000000000000000000000000000"
|
|
23
|
-
},
|
|
24
|
-
libraries: {
|
|
25
|
-
LinkedListLib: "0x0000000000000000000000000000000000000000",
|
|
26
|
-
CollateralMathLib: "0x0000000000000000000000000000000000000000"
|
|
27
|
-
},
|
|
28
|
-
templates: {
|
|
29
|
-
StabilizerEscrow: "0x0000000000000000000000000000000000000000",
|
|
30
|
-
PositionEscrow: "0x0000000000000000000000000000000000000000"
|
|
31
|
-
},
|
|
32
|
-
external: {
|
|
33
|
-
stETH: "0x0000000000000000000000000000000000000000",
|
|
34
|
-
lido: "0x0000000000000000000000000000000000000000",
|
|
35
|
-
oracleSigner: "0x0000000000000000000000000000000000000000"
|
|
36
|
-
},
|
|
37
|
-
metadata: {
|
|
38
|
-
chainId: 31337,
|
|
39
|
-
deployBlock: 0,
|
|
40
|
-
deployTimestamp: 0,
|
|
41
|
-
deployer: "0x0000000000000000000000000000000000000000"
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
// src/deployments/11155111.json
|
|
46
|
-
var __default2 = {
|
|
47
|
-
contracts: {
|
|
48
|
-
UPDToken: "0x0000000000000000000000000000000000000000",
|
|
49
|
-
PriceOracle: "0x0000000000000000000000000000000000000000",
|
|
50
|
-
StabilizerNFT: "0x0000000000000000000000000000000000000000",
|
|
51
|
-
OvercollateralizationReporter: "0x0000000000000000000000000000000000000000",
|
|
52
|
-
InsuranceEscrow: "0x0000000000000000000000000000000000000000",
|
|
53
|
-
BridgeEscrow: "0x0000000000000000000000000000000000000000",
|
|
54
|
-
sUPD: "0x0000000000000000000000000000000000000000"
|
|
55
|
-
},
|
|
56
|
-
implementations: {
|
|
57
|
-
PriceOracle: "0x0000000000000000000000000000000000000000",
|
|
58
|
-
StabilizerNFT: "0x0000000000000000000000000000000000000000",
|
|
59
|
-
OvercollateralizationReporter: "0x0000000000000000000000000000000000000000"
|
|
60
|
-
},
|
|
61
|
-
libraries: {
|
|
62
|
-
LinkedListLib: "0x0000000000000000000000000000000000000000",
|
|
63
|
-
CollateralMathLib: "0x0000000000000000000000000000000000000000"
|
|
64
|
-
},
|
|
65
|
-
templates: {
|
|
66
|
-
StabilizerEscrow: "0x0000000000000000000000000000000000000000",
|
|
67
|
-
PositionEscrow: "0x0000000000000000000000000000000000000000"
|
|
68
|
-
},
|
|
69
|
-
external: {
|
|
70
|
-
stETH: "0x0000000000000000000000000000000000000000",
|
|
71
|
-
lido: "0x0000000000000000000000000000000000000000",
|
|
72
|
-
oracleSigner: "0x0000000000000000000000000000000000000000"
|
|
73
|
-
},
|
|
74
|
-
metadata: {
|
|
75
|
-
chainId: 11155111,
|
|
76
|
-
deployBlock: 0,
|
|
77
|
-
deployTimestamp: 0,
|
|
78
|
-
deployer: "0x0000000000000000000000000000000000000000"
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
// src/deployments/index.ts
|
|
83
|
-
function parseDeployment(json, chainId) {
|
|
84
|
-
return {
|
|
85
|
-
chainId,
|
|
86
|
-
contracts: {
|
|
87
|
-
UPDToken: json.contracts.UPDToken,
|
|
88
|
-
PriceOracle: json.contracts.PriceOracle,
|
|
89
|
-
StabilizerNFT: json.contracts.StabilizerNFT,
|
|
90
|
-
OvercollateralizationReporter: json.contracts.OvercollateralizationReporter,
|
|
91
|
-
InsuranceEscrow: json.contracts.InsuranceEscrow,
|
|
92
|
-
BridgeEscrow: json.contracts.BridgeEscrow,
|
|
93
|
-
sUPD: json.contracts.sUPD
|
|
94
|
-
},
|
|
95
|
-
implementations: {
|
|
96
|
-
PriceOracle: json.implementations.PriceOracle,
|
|
97
|
-
StabilizerNFT: json.implementations.StabilizerNFT,
|
|
98
|
-
OvercollateralizationReporter: json.implementations.OvercollateralizationReporter
|
|
99
|
-
},
|
|
100
|
-
libraries: {
|
|
101
|
-
LinkedListLib: json.libraries.LinkedListLib,
|
|
102
|
-
CollateralMathLib: json.libraries.CollateralMathLib
|
|
103
|
-
},
|
|
104
|
-
templates: {
|
|
105
|
-
StabilizerEscrow: json.templates.StabilizerEscrow,
|
|
106
|
-
PositionEscrow: json.templates.PositionEscrow
|
|
107
|
-
},
|
|
108
|
-
external: {
|
|
109
|
-
stETH: json.external.stETH,
|
|
110
|
-
lido: json.external.lido,
|
|
111
|
-
oracleSigner: json.external.oracleSigner
|
|
112
|
-
},
|
|
113
|
-
metadata: {
|
|
114
|
-
deployBlock: json.metadata.deployBlock,
|
|
115
|
-
deployTimestamp: json.metadata.deployTimestamp,
|
|
116
|
-
deployer: json.metadata.deployer
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
var deployments = {
|
|
121
|
-
31337: parseDeployment(__default, 31337),
|
|
122
|
-
11155111: parseDeployment(__default2, 11155111)
|
|
123
|
-
};
|
|
124
|
-
function getDeployment(chainId) {
|
|
125
|
-
return deployments[chainId] ?? null;
|
|
126
|
-
}
|
|
127
|
-
function getDeploymentOrThrow(chainId) {
|
|
128
|
-
const deployment = getDeployment(chainId);
|
|
129
|
-
if (!deployment) {
|
|
130
|
-
throw new Error(
|
|
131
|
-
`No UPD deployment found for chain ${chainId}. Supported chains: ${getSupportedChainIds().join(", ")}`
|
|
132
|
-
);
|
|
133
|
-
}
|
|
134
|
-
return deployment;
|
|
135
|
-
}
|
|
136
|
-
function hasDeployment(chainId) {
|
|
137
|
-
return chainId in deployments;
|
|
138
|
-
}
|
|
139
|
-
function getSupportedChainIds() {
|
|
140
|
-
return Object.keys(deployments).map(Number);
|
|
141
|
-
}
|
|
142
|
-
function getContractAddress(chainId, contractName) {
|
|
143
|
-
const deployment = getDeployment(chainId);
|
|
144
|
-
if (!deployment) return null;
|
|
145
|
-
return deployment.contracts[contractName] ?? null;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
8
|
// src/core/client.ts
|
|
149
9
|
var UPDClient = class {
|
|
150
10
|
config;
|
|
@@ -152,7 +12,7 @@ var UPDClient = class {
|
|
|
152
12
|
oracle;
|
|
153
13
|
constructor(config) {
|
|
154
14
|
this.config = config;
|
|
155
|
-
this.deployment = getDeploymentOrThrow(config.chainId);
|
|
15
|
+
this.deployment = chunkKSGUFTW3_cjs.getDeploymentOrThrow(config.chainId);
|
|
156
16
|
this.oracle = chunkCZEDT3MS_cjs.createOracleClient({ oracleUrl: config.oracleUrl });
|
|
157
17
|
}
|
|
158
18
|
// ============================================================
|
|
@@ -162,7 +22,7 @@ var UPDClient = class {
|
|
|
162
22
|
async getUPDBalance(address) {
|
|
163
23
|
return this.config.publicClient.readContract({
|
|
164
24
|
address: this.deployment.contracts.UPDToken,
|
|
165
|
-
abi:
|
|
25
|
+
abi: chunk7BP37BGO_cjs.UPD_TOKEN_ABI,
|
|
166
26
|
functionName: "balanceOf",
|
|
167
27
|
args: [address]
|
|
168
28
|
});
|
|
@@ -171,17 +31,17 @@ var UPDClient = class {
|
|
|
171
31
|
async getTotalSupply() {
|
|
172
32
|
return this.config.publicClient.readContract({
|
|
173
33
|
address: this.deployment.contracts.UPDToken,
|
|
174
|
-
abi:
|
|
34
|
+
abi: chunk7BP37BGO_cjs.UPD_TOKEN_ABI,
|
|
175
35
|
functionName: "totalSupply"
|
|
176
36
|
});
|
|
177
37
|
}
|
|
178
|
-
/** Get system collateral info: total stETH collateral and total UPD supply. */
|
|
38
|
+
/** Get system collateral info: total stETH collateral (yield-inclusive) and total UPD supply. */
|
|
179
39
|
async getCollateralInfo() {
|
|
180
40
|
const [totalStEthCollateral, totalUPDSupply] = await Promise.all([
|
|
181
41
|
this.config.publicClient.readContract({
|
|
182
42
|
address: this.deployment.contracts.OvercollateralizationReporter,
|
|
183
|
-
abi:
|
|
184
|
-
functionName: "
|
|
43
|
+
abi: chunk7BP37BGO_cjs.OVERCOLLATERALIZATION_REPORTER_ABI,
|
|
44
|
+
functionName: "getTotalStEthCollateral"
|
|
185
45
|
}),
|
|
186
46
|
this.getTotalSupply()
|
|
187
47
|
]);
|
|
@@ -193,19 +53,19 @@ var UPDClient = class {
|
|
|
193
53
|
const [posEscrowAddr, stabEscrowAddr, minRatio] = await Promise.all([
|
|
194
54
|
this.config.publicClient.readContract({
|
|
195
55
|
address: stabNFT,
|
|
196
|
-
abi:
|
|
56
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_NFT_ABI,
|
|
197
57
|
functionName: "positionEscrows",
|
|
198
58
|
args: [tokenId]
|
|
199
59
|
}),
|
|
200
60
|
this.config.publicClient.readContract({
|
|
201
61
|
address: stabNFT,
|
|
202
|
-
abi:
|
|
62
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_NFT_ABI,
|
|
203
63
|
functionName: "stabilizerEscrows",
|
|
204
64
|
args: [tokenId]
|
|
205
65
|
}),
|
|
206
66
|
this.config.publicClient.readContract({
|
|
207
67
|
address: stabNFT,
|
|
208
|
-
abi:
|
|
68
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_NFT_ABI,
|
|
209
69
|
functionName: "minCollateralRatios",
|
|
210
70
|
args: [tokenId]
|
|
211
71
|
})
|
|
@@ -213,17 +73,17 @@ var UPDClient = class {
|
|
|
213
73
|
const [backedUPDAmount, stETHBalance, unallocatedStETH] = await Promise.all([
|
|
214
74
|
this.config.publicClient.readContract({
|
|
215
75
|
address: posEscrowAddr,
|
|
216
|
-
abi:
|
|
76
|
+
abi: chunk7BP37BGO_cjs.POSITION_ESCROW_ABI,
|
|
217
77
|
functionName: "backedUPDAmount"
|
|
218
78
|
}),
|
|
219
79
|
this.config.publicClient.readContract({
|
|
220
80
|
address: posEscrowAddr,
|
|
221
|
-
abi:
|
|
81
|
+
abi: chunk7BP37BGO_cjs.POSITION_ESCROW_ABI,
|
|
222
82
|
functionName: "getCurrentStEthBalance"
|
|
223
83
|
}),
|
|
224
84
|
this.config.publicClient.readContract({
|
|
225
85
|
address: stabEscrowAddr,
|
|
226
|
-
abi:
|
|
86
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_ESCROW_ABI,
|
|
227
87
|
functionName: "unallocatedStETH"
|
|
228
88
|
})
|
|
229
89
|
]);
|
|
@@ -263,7 +123,7 @@ var UPDClient = class {
|
|
|
263
123
|
const { to, ethAmount, priceAttestation } = params;
|
|
264
124
|
return walletClient.writeContract({
|
|
265
125
|
address: this.deployment.contracts.StabilizerNFT,
|
|
266
|
-
abi:
|
|
126
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_NFT_ABI,
|
|
267
127
|
functionName: "mintUPD",
|
|
268
128
|
args: [to, this._toSolidityAttestation(priceAttestation)],
|
|
269
129
|
value: ethAmount,
|
|
@@ -288,7 +148,7 @@ var UPDClient = class {
|
|
|
288
148
|
const { updAmount, priceAttestation } = params;
|
|
289
149
|
return walletClient.writeContract({
|
|
290
150
|
address: this.deployment.contracts.StabilizerNFT,
|
|
291
|
-
abi:
|
|
151
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_NFT_ABI,
|
|
292
152
|
functionName: "burnUPD",
|
|
293
153
|
args: [updAmount, this._toSolidityAttestation(priceAttestation)],
|
|
294
154
|
chain: walletClient.chain ?? null,
|
|
@@ -305,22 +165,22 @@ var UPDClient = class {
|
|
|
305
165
|
const [shareValue, annualYieldBps, totalSupply, totalLiabilityUSD] = await Promise.all([
|
|
306
166
|
this.config.publicClient.readContract({
|
|
307
167
|
address: supdAddr,
|
|
308
|
-
abi:
|
|
168
|
+
abi: chunk7BP37BGO_cjs.SUPD_ABI,
|
|
309
169
|
functionName: "currentShareValue"
|
|
310
170
|
}),
|
|
311
171
|
this.config.publicClient.readContract({
|
|
312
172
|
address: supdAddr,
|
|
313
|
-
abi:
|
|
173
|
+
abi: chunk7BP37BGO_cjs.SUPD_ABI,
|
|
314
174
|
functionName: "annualYieldBps"
|
|
315
175
|
}),
|
|
316
176
|
this.config.publicClient.readContract({
|
|
317
177
|
address: supdAddr,
|
|
318
|
-
abi:
|
|
178
|
+
abi: chunk7BP37BGO_cjs.SUPD_ABI,
|
|
319
179
|
functionName: "totalSupply"
|
|
320
180
|
}),
|
|
321
181
|
this.config.publicClient.readContract({
|
|
322
182
|
address: supdAddr,
|
|
323
|
-
abi:
|
|
183
|
+
abi: chunk7BP37BGO_cjs.SUPD_ABI,
|
|
324
184
|
functionName: "totalLiabilityUSD"
|
|
325
185
|
})
|
|
326
186
|
]);
|
|
@@ -333,7 +193,7 @@ var UPDClient = class {
|
|
|
333
193
|
if (!supdAddr) throw new Error("sUPD not deployed on this chain");
|
|
334
194
|
return walletClient.writeContract({
|
|
335
195
|
address: supdAddr,
|
|
336
|
-
abi:
|
|
196
|
+
abi: chunk7BP37BGO_cjs.SUPD_ABI,
|
|
337
197
|
functionName: "stakeUPD",
|
|
338
198
|
args: [params.updAmount, this._toSolidityAttestation(params.priceAttestation)],
|
|
339
199
|
chain: walletClient.chain ?? null,
|
|
@@ -347,7 +207,7 @@ var UPDClient = class {
|
|
|
347
207
|
if (!supdAddr) throw new Error("sUPD not deployed on this chain");
|
|
348
208
|
return walletClient.writeContract({
|
|
349
209
|
address: supdAddr,
|
|
350
|
-
abi:
|
|
210
|
+
abi: chunk7BP37BGO_cjs.SUPD_ABI,
|
|
351
211
|
functionName: "unstakeToUPD",
|
|
352
212
|
args: [params.shares, this._toSolidityAttestation(params.priceAttestation)],
|
|
353
213
|
chain: walletClient.chain ?? null,
|
|
@@ -401,7 +261,7 @@ var UPDClient = class {
|
|
|
401
261
|
this.getCollateralInfo(),
|
|
402
262
|
this.oracle.getEthUsdPrice()
|
|
403
263
|
]);
|
|
404
|
-
return
|
|
264
|
+
return chunkKSGUFTW3_cjs.computeSystemHealth(collateral, price);
|
|
405
265
|
}
|
|
406
266
|
/** Stake UPD, fetching oracle attestation automatically. */
|
|
407
267
|
async stakeUPDWithOracle(params) {
|
|
@@ -413,6 +273,21 @@ var UPDClient = class {
|
|
|
413
273
|
const attestation = await this.oracle.getEthUsdAttestation();
|
|
414
274
|
return this.unstakeUPD({ ...params, priceAttestation: attestation });
|
|
415
275
|
}
|
|
276
|
+
/**
|
|
277
|
+
* Permissionless sync: recalculates the reporter's collateral snapshot from on-chain truth.
|
|
278
|
+
* Iterates all PositionEscrows, sums their stETH shares, and resets the reporter.
|
|
279
|
+
* Anyone can call this — gas cost is proportional to the number of stabilizers.
|
|
280
|
+
*/
|
|
281
|
+
async syncReporter() {
|
|
282
|
+
const walletClient = this._requireWallet();
|
|
283
|
+
return walletClient.writeContract({
|
|
284
|
+
address: this.deployment.contracts.OvercollateralizationReporter,
|
|
285
|
+
abi: chunk7BP37BGO_cjs.OVERCOLLATERALIZATION_REPORTER_ABI,
|
|
286
|
+
functionName: "syncFromChain",
|
|
287
|
+
chain: walletClient.chain ?? null,
|
|
288
|
+
account: walletClient.account
|
|
289
|
+
});
|
|
290
|
+
}
|
|
416
291
|
// ============================================================
|
|
417
292
|
// HELPERS
|
|
418
293
|
// ============================================================
|
|
@@ -553,6 +428,10 @@ async function verifyDeployment(publicClient, deployment) {
|
|
|
553
428
|
await _verifyBytecode(publicClient, checks, "StabilizerNFT", deployment.contracts.StabilizerNFT);
|
|
554
429
|
await _verifyBytecode(publicClient, checks, "Reporter", deployment.contracts.OvercollateralizationReporter);
|
|
555
430
|
await _verifyBytecode(publicClient, checks, "InsuranceEscrow", deployment.contracts.InsuranceEscrow);
|
|
431
|
+
await _verifyBytecode(publicClient, checks, "LinkedListLib", deployment.libraries.LinkedListLib);
|
|
432
|
+
await _verifyBytecode(publicClient, checks, "CollateralMathLib", deployment.libraries.CollateralMathLib);
|
|
433
|
+
await _verifyBytecode(publicClient, checks, "StabilizerEscrow template", deployment.templates.StabilizerEscrow);
|
|
434
|
+
await _verifyBytecode(publicClient, checks, "PositionEscrow template", deployment.templates.PositionEscrow);
|
|
556
435
|
await _verifyProxyImpl(publicClient, checks, "PriceOracle", deployment.contracts.PriceOracle, deployment.implementations.PriceOracle);
|
|
557
436
|
await _verifyProxyImpl(publicClient, checks, "StabilizerNFT", deployment.contracts.StabilizerNFT, deployment.implementations.StabilizerNFT);
|
|
558
437
|
await _verifyProxyImpl(publicClient, checks, "Reporter", deployment.contracts.OvercollateralizationReporter, deployment.implementations.OvercollateralizationReporter);
|
|
@@ -561,23 +440,24 @@ async function verifyDeployment(publicClient, deployment) {
|
|
|
561
440
|
await _verifyRole(
|
|
562
441
|
publicClient,
|
|
563
442
|
checks,
|
|
564
|
-
"UPDToken
|
|
443
|
+
"UPDToken CONTROLLER_ROLE -> StabilizerNFT",
|
|
565
444
|
deployment.contracts.UPDToken,
|
|
566
|
-
|
|
567
|
-
"
|
|
568
|
-
// keccak256("
|
|
445
|
+
chunk7BP37BGO_cjs.UPD_TOKEN_ABI,
|
|
446
|
+
"0x7b765e0e932d348852a6f810bfa1ab891e259123f02db8cdcde614c570223357",
|
|
447
|
+
// keccak256("CONTROLLER_ROLE")
|
|
569
448
|
deployment.contracts.StabilizerNFT
|
|
570
449
|
);
|
|
571
450
|
await _verifyRole(
|
|
572
451
|
publicClient,
|
|
573
452
|
checks,
|
|
574
|
-
"
|
|
575
|
-
deployment.contracts.
|
|
576
|
-
|
|
577
|
-
"
|
|
578
|
-
// keccak256("
|
|
453
|
+
"Reporter UPDATER_ROLE -> StabilizerNFT",
|
|
454
|
+
deployment.contracts.OvercollateralizationReporter,
|
|
455
|
+
chunk7BP37BGO_cjs.OVERCOLLATERALIZATION_REPORTER_ABI,
|
|
456
|
+
"0x73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab",
|
|
457
|
+
// keccak256("UPDATER_ROLE")
|
|
579
458
|
deployment.contracts.StabilizerNFT
|
|
580
459
|
);
|
|
460
|
+
await _verifyOwnership(publicClient, checks, deployment);
|
|
581
461
|
const passed = checks.filter((c) => c.passed).length;
|
|
582
462
|
const failed = checks.filter((c) => !c.passed).length;
|
|
583
463
|
return {
|
|
@@ -620,7 +500,7 @@ async function _verifyStabilizerNFTStorage(client, checks, d) {
|
|
|
620
500
|
const nft = d.contracts.StabilizerNFT;
|
|
621
501
|
const updToken = await client.readContract({
|
|
622
502
|
address: nft,
|
|
623
|
-
abi:
|
|
503
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_NFT_ABI,
|
|
624
504
|
functionName: "updToken"
|
|
625
505
|
});
|
|
626
506
|
checks.push({
|
|
@@ -631,7 +511,7 @@ async function _verifyStabilizerNFTStorage(client, checks, d) {
|
|
|
631
511
|
});
|
|
632
512
|
const oracle = await client.readContract({
|
|
633
513
|
address: nft,
|
|
634
|
-
abi:
|
|
514
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_NFT_ABI,
|
|
635
515
|
functionName: "oracle"
|
|
636
516
|
});
|
|
637
517
|
checks.push({
|
|
@@ -642,7 +522,7 @@ async function _verifyStabilizerNFTStorage(client, checks, d) {
|
|
|
642
522
|
});
|
|
643
523
|
const stETH = await client.readContract({
|
|
644
524
|
address: nft,
|
|
645
|
-
abi:
|
|
525
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_NFT_ABI,
|
|
646
526
|
functionName: "stETH"
|
|
647
527
|
});
|
|
648
528
|
checks.push({
|
|
@@ -651,6 +531,35 @@ async function _verifyStabilizerNFTStorage(client, checks, d) {
|
|
|
651
531
|
expected: d.external.stETH,
|
|
652
532
|
actual: stETH
|
|
653
533
|
});
|
|
534
|
+
const reporter = await client.readContract({
|
|
535
|
+
address: nft,
|
|
536
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_NFT_ABI,
|
|
537
|
+
functionName: "reporter"
|
|
538
|
+
});
|
|
539
|
+
const ZERO = "0x0000000000000000000000000000000000000000";
|
|
540
|
+
checks.push({
|
|
541
|
+
name: "StabilizerNFT.reporter != address(0)",
|
|
542
|
+
passed: reporter.toLowerCase() !== ZERO,
|
|
543
|
+
expected: `!= ${ZERO}`,
|
|
544
|
+
actual: reporter
|
|
545
|
+
});
|
|
546
|
+
checks.push({
|
|
547
|
+
name: "StabilizerNFT.reporter == Reporter proxy",
|
|
548
|
+
passed: reporter.toLowerCase() === d.contracts.OvercollateralizationReporter.toLowerCase(),
|
|
549
|
+
expected: d.contracts.OvercollateralizationReporter,
|
|
550
|
+
actual: reporter
|
|
551
|
+
});
|
|
552
|
+
const insuranceEscrow = await client.readContract({
|
|
553
|
+
address: nft,
|
|
554
|
+
abi: chunk7BP37BGO_cjs.STABILIZER_NFT_ABI,
|
|
555
|
+
functionName: "insuranceEscrow"
|
|
556
|
+
});
|
|
557
|
+
checks.push({
|
|
558
|
+
name: "StabilizerNFT.insuranceEscrow",
|
|
559
|
+
passed: insuranceEscrow.toLowerCase() === d.contracts.InsuranceEscrow.toLowerCase(),
|
|
560
|
+
expected: d.contracts.InsuranceEscrow,
|
|
561
|
+
actual: insuranceEscrow
|
|
562
|
+
});
|
|
654
563
|
} catch {
|
|
655
564
|
checks.push({ name: "StabilizerNFT storage", passed: false });
|
|
656
565
|
}
|
|
@@ -660,7 +569,7 @@ async function _verifyReporterStorage(client, checks, d) {
|
|
|
660
569
|
const reporter = d.contracts.OvercollateralizationReporter;
|
|
661
570
|
const stabNFT = await client.readContract({
|
|
662
571
|
address: reporter,
|
|
663
|
-
abi:
|
|
572
|
+
abi: chunk7BP37BGO_cjs.OVERCOLLATERALIZATION_REPORTER_ABI,
|
|
664
573
|
functionName: "stabilizerNFTContract"
|
|
665
574
|
});
|
|
666
575
|
checks.push({
|
|
@@ -671,7 +580,7 @@ async function _verifyReporterStorage(client, checks, d) {
|
|
|
671
580
|
});
|
|
672
581
|
const updToken = await client.readContract({
|
|
673
582
|
address: reporter,
|
|
674
|
-
abi:
|
|
583
|
+
abi: chunk7BP37BGO_cjs.OVERCOLLATERALIZATION_REPORTER_ABI,
|
|
675
584
|
functionName: "updToken"
|
|
676
585
|
});
|
|
677
586
|
checks.push({
|
|
@@ -697,17 +606,29 @@ async function _verifyRole(client, checks, name, contractAddress, abi, roleHash,
|
|
|
697
606
|
checks.push({ name, passed: false });
|
|
698
607
|
}
|
|
699
608
|
}
|
|
609
|
+
async function _verifyOwnership(client, checks, d) {
|
|
610
|
+
try {
|
|
611
|
+
const owner = await client.readContract({
|
|
612
|
+
address: d.contracts.InsuranceEscrow,
|
|
613
|
+
abi: chunk7BP37BGO_cjs.INSURANCE_ESCROW_ABI,
|
|
614
|
+
functionName: "owner"
|
|
615
|
+
});
|
|
616
|
+
checks.push({
|
|
617
|
+
name: "InsuranceEscrow.owner == StabilizerNFT",
|
|
618
|
+
passed: owner.toLowerCase() === d.contracts.StabilizerNFT.toLowerCase(),
|
|
619
|
+
expected: d.contracts.StabilizerNFT,
|
|
620
|
+
actual: owner
|
|
621
|
+
});
|
|
622
|
+
} catch {
|
|
623
|
+
checks.push({ name: "InsuranceEscrow.owner", passed: false });
|
|
624
|
+
}
|
|
625
|
+
}
|
|
700
626
|
|
|
701
627
|
exports.UPDClient = UPDClient;
|
|
702
628
|
exports.createUPDClient = createUPDClient;
|
|
703
|
-
exports.getContractAddress = getContractAddress;
|
|
704
|
-
exports.getDeployment = getDeployment;
|
|
705
|
-
exports.getDeploymentOrThrow = getDeploymentOrThrow;
|
|
706
|
-
exports.getSupportedChainIds = getSupportedChainIds;
|
|
707
|
-
exports.hasDeployment = hasDeployment;
|
|
708
629
|
exports.signCancelAuthorization = signCancelAuthorization;
|
|
709
630
|
exports.signReceiveAuthorization = signReceiveAuthorization;
|
|
710
631
|
exports.signTransferAuthorization = signTransferAuthorization;
|
|
711
632
|
exports.verifyDeployment = verifyDeployment;
|
|
712
|
-
//# sourceMappingURL=chunk-
|
|
713
|
-
//# sourceMappingURL=chunk-
|
|
633
|
+
//# sourceMappingURL=chunk-LECDXCSW.cjs.map
|
|
634
|
+
//# sourceMappingURL=chunk-LECDXCSW.cjs.map
|