@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.
Files changed (47) hide show
  1. package/dist/chunk-3V62JGJY.js +192 -0
  2. package/dist/chunk-3V62JGJY.js.map +1 -0
  3. package/dist/{chunk-ZSWETUGH.cjs → chunk-7BP37BGO.cjs} +359 -31
  4. package/dist/chunk-7BP37BGO.cjs.map +1 -0
  5. package/dist/{chunk-R64I3LAO.js → chunk-AGPBQ56J.js} +81 -155
  6. package/dist/chunk-AGPBQ56J.js.map +1 -0
  7. package/dist/chunk-KSGUFTW3.cjs +206 -0
  8. package/dist/chunk-KSGUFTW3.cjs.map +1 -0
  9. package/dist/{chunk-WRPVPA7E.cjs → chunk-LECDXCSW.cjs} +105 -184
  10. package/dist/chunk-LECDXCSW.cjs.map +1 -0
  11. package/dist/{chunk-4RBWWS2X.js → chunk-PS6EIE5E.js} +359 -32
  12. package/dist/chunk-PS6EIE5E.js.map +1 -0
  13. package/dist/{chunk-RIRT4JX6.js → chunk-TYRBIJVF.js} +3 -228
  14. package/dist/chunk-TYRBIJVF.js.map +1 -0
  15. package/dist/{chunk-ZDAHLZWC.cjs → chunk-VZZN3BR3.cjs} +2 -228
  16. package/dist/chunk-VZZN3BR3.cjs.map +1 -0
  17. package/dist/contracts/index.cjs +13 -13
  18. package/dist/contracts/index.d.cts +104 -24
  19. package/dist/contracts/index.d.ts +104 -24
  20. package/dist/contracts/index.js +2 -2
  21. package/dist/core/index.cjs +17 -17
  22. package/dist/core/index.d.cts +1 -1
  23. package/dist/core/index.d.ts +1 -1
  24. package/dist/core/index.js +3 -3
  25. package/dist/{index-XNClksom.d.ts → index-BMgIlGvW.d.ts} +11 -3
  26. package/dist/{index-yRBqVOHV.d.cts → index-D6VgT_bZ.d.cts} +11 -3
  27. package/dist/index.cjs +50 -50
  28. package/dist/index.d.cts +1 -1
  29. package/dist/index.d.ts +1 -1
  30. package/dist/index.js +4 -4
  31. package/dist/react/index.cjs +145 -22
  32. package/dist/react/index.cjs.map +1 -1
  33. package/dist/react/index.d.cts +112 -1
  34. package/dist/react/index.d.ts +112 -1
  35. package/dist/react/index.js +126 -5
  36. package/dist/react/index.js.map +1 -1
  37. package/package.json +3 -1
  38. package/dist/chunk-4RBWWS2X.js.map +0 -1
  39. package/dist/chunk-4VXNJTNQ.cjs +0 -58
  40. package/dist/chunk-4VXNJTNQ.cjs.map +0 -1
  41. package/dist/chunk-63FIKV36.js +0 -49
  42. package/dist/chunk-63FIKV36.js.map +0 -1
  43. package/dist/chunk-R64I3LAO.js.map +0 -1
  44. package/dist/chunk-RIRT4JX6.js.map +0 -1
  45. package/dist/chunk-WRPVPA7E.cjs.map +0 -1
  46. package/dist/chunk-ZDAHLZWC.cjs.map +0 -1
  47. package/dist/chunk-ZSWETUGH.cjs.map +0 -1
@@ -0,0 +1,192 @@
1
+ // src/deployments/31337.json
2
+ var __default = {
3
+ contracts: {
4
+ UPDToken: "0x0000000000000000000000000000000000000000",
5
+ PriceOracle: "0x0000000000000000000000000000000000000000",
6
+ StabilizerNFT: "0x0000000000000000000000000000000000000000",
7
+ OvercollateralizationReporter: "0x0000000000000000000000000000000000000000",
8
+ InsuranceEscrow: "0x0000000000000000000000000000000000000000",
9
+ BridgeEscrow: "0x0000000000000000000000000000000000000000",
10
+ sUPD: "0x0000000000000000000000000000000000000000"
11
+ },
12
+ implementations: {
13
+ PriceOracle: "0x0000000000000000000000000000000000000000",
14
+ StabilizerNFT: "0x0000000000000000000000000000000000000000",
15
+ OvercollateralizationReporter: "0x0000000000000000000000000000000000000000"
16
+ },
17
+ libraries: {
18
+ LinkedListLib: "0x0000000000000000000000000000000000000000",
19
+ CollateralMathLib: "0x0000000000000000000000000000000000000000"
20
+ },
21
+ templates: {
22
+ StabilizerEscrow: "0x0000000000000000000000000000000000000000",
23
+ PositionEscrow: "0x0000000000000000000000000000000000000000"
24
+ },
25
+ external: {
26
+ stETH: "0x0000000000000000000000000000000000000000",
27
+ lido: "0x0000000000000000000000000000000000000000",
28
+ oracleSigner: "0x0000000000000000000000000000000000000000"
29
+ },
30
+ metadata: {
31
+ chainId: 31337,
32
+ deployBlock: 0,
33
+ deployTimestamp: 0,
34
+ deployer: "0x0000000000000000000000000000000000000000"
35
+ }
36
+ };
37
+
38
+ // src/deployments/11155111.json
39
+ var __default2 = {
40
+ contracts: {
41
+ UPDToken: "0xcF6Ace4Ff3B6f2e56E2Bd89a68cf5CA148Bd69a8",
42
+ PriceOracle: "0x415eb7A422291231a27EC86673B5d5ae0e1aD849",
43
+ StabilizerNFT: "0x4B705a4773f110F1716337a6C34eeaA4f575ee9f",
44
+ OvercollateralizationReporter: "0xA4dF955BB8eF2047deC4Ff889152479D5D62e287",
45
+ InsuranceEscrow: "0xc2Ae7a917c77B459951f56E73854Faa51b8c6103",
46
+ BridgeEscrow: "0x7BfDE5064ED50b4778B0983cc345a76DAFAC00Aa"
47
+ },
48
+ implementations: {
49
+ PriceOracle: "0x7205C15a8266Fc203045b8B5b7CD2f4B41082c89",
50
+ StabilizerNFT: "0x82Ac19eC8bc8a660112333A250274b18ba05e8da",
51
+ OvercollateralizationReporter: "0x84499938994b7555A0C2759001B8293a0f23FF49"
52
+ },
53
+ libraries: {
54
+ LinkedListLib: "0x28C62c4D84014c0714001483a7FB9C1902cB3E7D",
55
+ CollateralMathLib: "0xb7FC9e16380afce7Bcbb1a4B903fe3A3564CebCE"
56
+ },
57
+ templates: {
58
+ StabilizerEscrow: "0x37302F82605EA0121Dc28b8950E41A8CEa817e50",
59
+ PositionEscrow: "0x3B0F4a18d41bf3Aa7179578c193c579f9043c948",
60
+ StabilizerEscrowBeacon: "0x82868B7FB57b14AdA6954f34acc1085d6fC189f9",
61
+ PositionEscrowBeacon: "0xa0233E45Fd5f14fe10c66ff1A1815ce54Cda1a33",
62
+ BeaconProxyFactory: "0xb44181b1671760B814cB5a96eD345160b9faaB61"
63
+ },
64
+ external: {
65
+ stETH: "0x3e3FE7dBc6B4C189E7128855dD526361c49b40Af",
66
+ lido: "0x3e3FE7dBc6B4C189E7128855dD526361c49b40Af",
67
+ oracleSigner: "0xDEAD59BD1E61a3B6AB81806A30f4102831b70001"
68
+ },
69
+ metadata: {
70
+ chainId: 11155111,
71
+ deployBlock: 0,
72
+ deployTimestamp: 1775502732,
73
+ deployer: "0xdEadDEADb916b00D02f4f2db062Fb2C47fe0689b"
74
+ }
75
+ };
76
+
77
+ // src/deployments/index.ts
78
+ function parseDeployment(json, chainId) {
79
+ return {
80
+ chainId,
81
+ contracts: {
82
+ UPDToken: json.contracts.UPDToken,
83
+ PriceOracle: json.contracts.PriceOracle,
84
+ StabilizerNFT: json.contracts.StabilizerNFT,
85
+ OvercollateralizationReporter: json.contracts.OvercollateralizationReporter,
86
+ InsuranceEscrow: json.contracts.InsuranceEscrow,
87
+ BridgeEscrow: json.contracts.BridgeEscrow,
88
+ sUPD: json.contracts.sUPD
89
+ },
90
+ implementations: {
91
+ PriceOracle: json.implementations.PriceOracle,
92
+ StabilizerNFT: json.implementations.StabilizerNFT,
93
+ OvercollateralizationReporter: json.implementations.OvercollateralizationReporter,
94
+ sUPD: json.implementations.sUPD
95
+ },
96
+ libraries: {
97
+ LinkedListLib: json.libraries.LinkedListLib,
98
+ CollateralMathLib: json.libraries.CollateralMathLib
99
+ },
100
+ templates: {
101
+ StabilizerEscrow: json.templates.StabilizerEscrow,
102
+ PositionEscrow: json.templates.PositionEscrow
103
+ },
104
+ external: {
105
+ stETH: json.external.stETH,
106
+ lido: json.external.lido,
107
+ oracleSigner: json.external.oracleSigner
108
+ },
109
+ metadata: {
110
+ deployBlock: json.metadata.deployBlock,
111
+ deployTimestamp: json.metadata.deployTimestamp,
112
+ deployer: json.metadata.deployer
113
+ }
114
+ };
115
+ }
116
+ var deployments = {
117
+ 31337: parseDeployment(__default, 31337),
118
+ 11155111: parseDeployment(__default2, 11155111)
119
+ };
120
+ function getDeployment(chainId) {
121
+ return deployments[chainId] ?? null;
122
+ }
123
+ function getDeploymentOrThrow(chainId) {
124
+ const deployment = getDeployment(chainId);
125
+ if (!deployment) {
126
+ throw new Error(
127
+ `No UPD deployment found for chain ${chainId}. Supported chains: ${getSupportedChainIds().join(", ")}`
128
+ );
129
+ }
130
+ return deployment;
131
+ }
132
+ function hasDeployment(chainId) {
133
+ return chainId in deployments;
134
+ }
135
+ function getSupportedChainIds() {
136
+ return Object.keys(deployments).map(Number);
137
+ }
138
+ function getContractAddress(chainId, contractName) {
139
+ const deployment = getDeployment(chainId);
140
+ if (!deployment) return null;
141
+ return deployment.contracts[contractName] ?? null;
142
+ }
143
+
144
+ // src/core/quote.ts
145
+ var PRICE_PRECISION = 10n ** 18n;
146
+ var SHARE_PRECISION = 10n ** 18n;
147
+ function quoteMintUPD(ethAmount, ethUsdPrice) {
148
+ return ethAmount * ethUsdPrice / PRICE_PRECISION;
149
+ }
150
+ function quoteBurnUPD(updAmount, ethUsdPrice) {
151
+ if (ethUsdPrice === 0n) throw new Error("Price cannot be zero");
152
+ return updAmount * PRICE_PRECISION / ethUsdPrice;
153
+ }
154
+ function stabilizerStEthNeeded(userEth, minCollateralRatioBps) {
155
+ return userEth * (minCollateralRatioBps - 10000n) / 10000n;
156
+ }
157
+ function quoteStakeUPD(updAmount, shareValue) {
158
+ if (shareValue === 0n) throw new Error("Share value cannot be zero");
159
+ return updAmount * SHARE_PRECISION / shareValue;
160
+ }
161
+ function quoteUnstakeUPD(shares, shareValue) {
162
+ return shares * shareValue / SHARE_PRECISION;
163
+ }
164
+ function collateralizationRatio(stEthBalance, ethUsdPrice, backedUPDAmount) {
165
+ if (backedUPDAmount === 0n) return BigInt(2) ** BigInt(256) - 1n;
166
+ const collateralValueUSD = stEthBalance * ethUsdPrice / PRICE_PRECISION;
167
+ return collateralValueUSD * 10000n / backedUPDAmount;
168
+ }
169
+
170
+ // src/core/health.ts
171
+ var DEFAULT_MIN_RATIO_BPS = 12500n;
172
+ function computeSystemHealth(collateral, ethUsdPrice, minRatioBps = DEFAULT_MIN_RATIO_BPS) {
173
+ const PRICE_PRECISION2 = 10n ** 18n;
174
+ const collateralValueUsd = collateral.totalStEthCollateral * ethUsdPrice / PRICE_PRECISION2;
175
+ const systemCollateralRatioBps = collateralizationRatio(
176
+ collateral.totalStEthCollateral,
177
+ ethUsdPrice,
178
+ collateral.totalUPDSupply
179
+ );
180
+ const bufferUsd = collateralValueUsd - collateral.totalUPDSupply;
181
+ return {
182
+ systemCollateralRatioBps,
183
+ isHealthy: systemCollateralRatioBps >= minRatioBps,
184
+ collateralValueUsd,
185
+ totalUPDSupply: collateral.totalUPDSupply,
186
+ bufferUsd
187
+ };
188
+ }
189
+
190
+ export { DEFAULT_MIN_RATIO_BPS, collateralizationRatio, computeSystemHealth, getContractAddress, getDeployment, getDeploymentOrThrow, getSupportedChainIds, hasDeployment, quoteBurnUPD, quoteMintUPD, quoteStakeUPD, quoteUnstakeUPD, stabilizerStEthNeeded };
191
+ //# sourceMappingURL=chunk-3V62JGJY.js.map
192
+ //# sourceMappingURL=chunk-3V62JGJY.js.map
@@ -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":"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","file":"chunk-3V62JGJY.js","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"]}