@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
@@ -1,148 +1,8 @@
1
- import { computeSystemHealth } from './chunk-63FIKV36.js';
2
- import { UPD_TOKEN_ABI, OVERCOLLATERALIZATION_REPORTER_ABI, STABILIZER_NFT_ABI, POSITION_ESCROW_ABI, STABILIZER_ESCROW_ABI, SUPD_ABI } from './chunk-4RBWWS2X.js';
1
+ import { getDeploymentOrThrow, computeSystemHealth } from './chunk-3V62JGJY.js';
2
+ import { UPD_TOKEN_ABI, OVERCOLLATERALIZATION_REPORTER_ABI, STABILIZER_NFT_ABI, POSITION_ESCROW_ABI, STABILIZER_ESCROW_ABI, SUPD_ABI, INSURANCE_ESCROW_ABI } from './chunk-PS6EIE5E.js';
3
3
  import { createOracleClient } from './chunk-DJBU2OEB.js';
4
4
  import { hexToBytes, bytesToHex } from 'viem';
5
5
 
6
- // src/deployments/31337.json
7
- var __default = {
8
- contracts: {
9
- UPDToken: "0x0000000000000000000000000000000000000000",
10
- PriceOracle: "0x0000000000000000000000000000000000000000",
11
- StabilizerNFT: "0x0000000000000000000000000000000000000000",
12
- OvercollateralizationReporter: "0x0000000000000000000000000000000000000000",
13
- InsuranceEscrow: "0x0000000000000000000000000000000000000000",
14
- BridgeEscrow: "0x0000000000000000000000000000000000000000",
15
- sUPD: "0x0000000000000000000000000000000000000000"
16
- },
17
- implementations: {
18
- PriceOracle: "0x0000000000000000000000000000000000000000",
19
- StabilizerNFT: "0x0000000000000000000000000000000000000000",
20
- OvercollateralizationReporter: "0x0000000000000000000000000000000000000000"
21
- },
22
- libraries: {
23
- LinkedListLib: "0x0000000000000000000000000000000000000000",
24
- CollateralMathLib: "0x0000000000000000000000000000000000000000"
25
- },
26
- templates: {
27
- StabilizerEscrow: "0x0000000000000000000000000000000000000000",
28
- PositionEscrow: "0x0000000000000000000000000000000000000000"
29
- },
30
- external: {
31
- stETH: "0x0000000000000000000000000000000000000000",
32
- lido: "0x0000000000000000000000000000000000000000",
33
- oracleSigner: "0x0000000000000000000000000000000000000000"
34
- },
35
- metadata: {
36
- chainId: 31337,
37
- deployBlock: 0,
38
- deployTimestamp: 0,
39
- deployer: "0x0000000000000000000000000000000000000000"
40
- }
41
- };
42
-
43
- // src/deployments/11155111.json
44
- var __default2 = {
45
- contracts: {
46
- UPDToken: "0x0000000000000000000000000000000000000000",
47
- PriceOracle: "0x0000000000000000000000000000000000000000",
48
- StabilizerNFT: "0x0000000000000000000000000000000000000000",
49
- OvercollateralizationReporter: "0x0000000000000000000000000000000000000000",
50
- InsuranceEscrow: "0x0000000000000000000000000000000000000000",
51
- BridgeEscrow: "0x0000000000000000000000000000000000000000",
52
- sUPD: "0x0000000000000000000000000000000000000000"
53
- },
54
- implementations: {
55
- PriceOracle: "0x0000000000000000000000000000000000000000",
56
- StabilizerNFT: "0x0000000000000000000000000000000000000000",
57
- OvercollateralizationReporter: "0x0000000000000000000000000000000000000000"
58
- },
59
- libraries: {
60
- LinkedListLib: "0x0000000000000000000000000000000000000000",
61
- CollateralMathLib: "0x0000000000000000000000000000000000000000"
62
- },
63
- templates: {
64
- StabilizerEscrow: "0x0000000000000000000000000000000000000000",
65
- PositionEscrow: "0x0000000000000000000000000000000000000000"
66
- },
67
- external: {
68
- stETH: "0x0000000000000000000000000000000000000000",
69
- lido: "0x0000000000000000000000000000000000000000",
70
- oracleSigner: "0x0000000000000000000000000000000000000000"
71
- },
72
- metadata: {
73
- chainId: 11155111,
74
- deployBlock: 0,
75
- deployTimestamp: 0,
76
- deployer: "0x0000000000000000000000000000000000000000"
77
- }
78
- };
79
-
80
- // src/deployments/index.ts
81
- function parseDeployment(json, chainId) {
82
- return {
83
- chainId,
84
- contracts: {
85
- UPDToken: json.contracts.UPDToken,
86
- PriceOracle: json.contracts.PriceOracle,
87
- StabilizerNFT: json.contracts.StabilizerNFT,
88
- OvercollateralizationReporter: json.contracts.OvercollateralizationReporter,
89
- InsuranceEscrow: json.contracts.InsuranceEscrow,
90
- BridgeEscrow: json.contracts.BridgeEscrow,
91
- sUPD: json.contracts.sUPD
92
- },
93
- implementations: {
94
- PriceOracle: json.implementations.PriceOracle,
95
- StabilizerNFT: json.implementations.StabilizerNFT,
96
- OvercollateralizationReporter: json.implementations.OvercollateralizationReporter
97
- },
98
- libraries: {
99
- LinkedListLib: json.libraries.LinkedListLib,
100
- CollateralMathLib: json.libraries.CollateralMathLib
101
- },
102
- templates: {
103
- StabilizerEscrow: json.templates.StabilizerEscrow,
104
- PositionEscrow: json.templates.PositionEscrow
105
- },
106
- external: {
107
- stETH: json.external.stETH,
108
- lido: json.external.lido,
109
- oracleSigner: json.external.oracleSigner
110
- },
111
- metadata: {
112
- deployBlock: json.metadata.deployBlock,
113
- deployTimestamp: json.metadata.deployTimestamp,
114
- deployer: json.metadata.deployer
115
- }
116
- };
117
- }
118
- var deployments = {
119
- 31337: parseDeployment(__default, 31337),
120
- 11155111: parseDeployment(__default2, 11155111)
121
- };
122
- function getDeployment(chainId) {
123
- return deployments[chainId] ?? null;
124
- }
125
- function getDeploymentOrThrow(chainId) {
126
- const deployment = getDeployment(chainId);
127
- if (!deployment) {
128
- throw new Error(
129
- `No UPD deployment found for chain ${chainId}. Supported chains: ${getSupportedChainIds().join(", ")}`
130
- );
131
- }
132
- return deployment;
133
- }
134
- function hasDeployment(chainId) {
135
- return chainId in deployments;
136
- }
137
- function getSupportedChainIds() {
138
- return Object.keys(deployments).map(Number);
139
- }
140
- function getContractAddress(chainId, contractName) {
141
- const deployment = getDeployment(chainId);
142
- if (!deployment) return null;
143
- return deployment.contracts[contractName] ?? null;
144
- }
145
-
146
6
  // src/core/client.ts
147
7
  var UPDClient = class {
148
8
  config;
@@ -173,13 +33,13 @@ var UPDClient = class {
173
33
  functionName: "totalSupply"
174
34
  });
175
35
  }
176
- /** Get system collateral info: total stETH collateral and total UPD supply. */
36
+ /** Get system collateral info: total stETH collateral (yield-inclusive) and total UPD supply. */
177
37
  async getCollateralInfo() {
178
38
  const [totalStEthCollateral, totalUPDSupply] = await Promise.all([
179
39
  this.config.publicClient.readContract({
180
40
  address: this.deployment.contracts.OvercollateralizationReporter,
181
41
  abi: OVERCOLLATERALIZATION_REPORTER_ABI,
182
- functionName: "totalStEthCollateral"
42
+ functionName: "getTotalStEthCollateral"
183
43
  }),
184
44
  this.getTotalSupply()
185
45
  ]);
@@ -411,6 +271,21 @@ var UPDClient = class {
411
271
  const attestation = await this.oracle.getEthUsdAttestation();
412
272
  return this.unstakeUPD({ ...params, priceAttestation: attestation });
413
273
  }
274
+ /**
275
+ * Permissionless sync: recalculates the reporter's collateral snapshot from on-chain truth.
276
+ * Iterates all PositionEscrows, sums their stETH shares, and resets the reporter.
277
+ * Anyone can call this — gas cost is proportional to the number of stabilizers.
278
+ */
279
+ async syncReporter() {
280
+ const walletClient = this._requireWallet();
281
+ return walletClient.writeContract({
282
+ address: this.deployment.contracts.OvercollateralizationReporter,
283
+ abi: OVERCOLLATERALIZATION_REPORTER_ABI,
284
+ functionName: "syncFromChain",
285
+ chain: walletClient.chain ?? null,
286
+ account: walletClient.account
287
+ });
288
+ }
414
289
  // ============================================================
415
290
  // HELPERS
416
291
  // ============================================================
@@ -551,6 +426,10 @@ async function verifyDeployment(publicClient, deployment) {
551
426
  await _verifyBytecode(publicClient, checks, "StabilizerNFT", deployment.contracts.StabilizerNFT);
552
427
  await _verifyBytecode(publicClient, checks, "Reporter", deployment.contracts.OvercollateralizationReporter);
553
428
  await _verifyBytecode(publicClient, checks, "InsuranceEscrow", deployment.contracts.InsuranceEscrow);
429
+ await _verifyBytecode(publicClient, checks, "LinkedListLib", deployment.libraries.LinkedListLib);
430
+ await _verifyBytecode(publicClient, checks, "CollateralMathLib", deployment.libraries.CollateralMathLib);
431
+ await _verifyBytecode(publicClient, checks, "StabilizerEscrow template", deployment.templates.StabilizerEscrow);
432
+ await _verifyBytecode(publicClient, checks, "PositionEscrow template", deployment.templates.PositionEscrow);
554
433
  await _verifyProxyImpl(publicClient, checks, "PriceOracle", deployment.contracts.PriceOracle, deployment.implementations.PriceOracle);
555
434
  await _verifyProxyImpl(publicClient, checks, "StabilizerNFT", deployment.contracts.StabilizerNFT, deployment.implementations.StabilizerNFT);
556
435
  await _verifyProxyImpl(publicClient, checks, "Reporter", deployment.contracts.OvercollateralizationReporter, deployment.implementations.OvercollateralizationReporter);
@@ -559,23 +438,24 @@ async function verifyDeployment(publicClient, deployment) {
559
438
  await _verifyRole(
560
439
  publicClient,
561
440
  checks,
562
- "UPDToken MINTER_ROLE -> StabilizerNFT",
441
+ "UPDToken CONTROLLER_ROLE -> StabilizerNFT",
563
442
  deployment.contracts.UPDToken,
564
443
  UPD_TOKEN_ABI,
565
- "0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6",
566
- // keccak256("MINTER_ROLE")
444
+ "0x7b765e0e932d348852a6f810bfa1ab891e259123f02db8cdcde614c570223357",
445
+ // keccak256("CONTROLLER_ROLE")
567
446
  deployment.contracts.StabilizerNFT
568
447
  );
569
448
  await _verifyRole(
570
449
  publicClient,
571
450
  checks,
572
- "UPDToken BURNER_ROLE -> StabilizerNFT",
573
- deployment.contracts.UPDToken,
574
- UPD_TOKEN_ABI,
575
- "0x3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848",
576
- // keccak256("BURNER_ROLE")
451
+ "Reporter UPDATER_ROLE -> StabilizerNFT",
452
+ deployment.contracts.OvercollateralizationReporter,
453
+ OVERCOLLATERALIZATION_REPORTER_ABI,
454
+ "0x73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab",
455
+ // keccak256("UPDATER_ROLE")
577
456
  deployment.contracts.StabilizerNFT
578
457
  );
458
+ await _verifyOwnership(publicClient, checks, deployment);
579
459
  const passed = checks.filter((c) => c.passed).length;
580
460
  const failed = checks.filter((c) => !c.passed).length;
581
461
  return {
@@ -649,6 +529,35 @@ async function _verifyStabilizerNFTStorage(client, checks, d) {
649
529
  expected: d.external.stETH,
650
530
  actual: stETH
651
531
  });
532
+ const reporter = await client.readContract({
533
+ address: nft,
534
+ abi: STABILIZER_NFT_ABI,
535
+ functionName: "reporter"
536
+ });
537
+ const ZERO = "0x0000000000000000000000000000000000000000";
538
+ checks.push({
539
+ name: "StabilizerNFT.reporter != address(0)",
540
+ passed: reporter.toLowerCase() !== ZERO,
541
+ expected: `!= ${ZERO}`,
542
+ actual: reporter
543
+ });
544
+ checks.push({
545
+ name: "StabilizerNFT.reporter == Reporter proxy",
546
+ passed: reporter.toLowerCase() === d.contracts.OvercollateralizationReporter.toLowerCase(),
547
+ expected: d.contracts.OvercollateralizationReporter,
548
+ actual: reporter
549
+ });
550
+ const insuranceEscrow = await client.readContract({
551
+ address: nft,
552
+ abi: STABILIZER_NFT_ABI,
553
+ functionName: "insuranceEscrow"
554
+ });
555
+ checks.push({
556
+ name: "StabilizerNFT.insuranceEscrow",
557
+ passed: insuranceEscrow.toLowerCase() === d.contracts.InsuranceEscrow.toLowerCase(),
558
+ expected: d.contracts.InsuranceEscrow,
559
+ actual: insuranceEscrow
560
+ });
652
561
  } catch {
653
562
  checks.push({ name: "StabilizerNFT storage", passed: false });
654
563
  }
@@ -695,7 +604,24 @@ async function _verifyRole(client, checks, name, contractAddress, abi, roleHash,
695
604
  checks.push({ name, passed: false });
696
605
  }
697
606
  }
607
+ async function _verifyOwnership(client, checks, d) {
608
+ try {
609
+ const owner = await client.readContract({
610
+ address: d.contracts.InsuranceEscrow,
611
+ abi: INSURANCE_ESCROW_ABI,
612
+ functionName: "owner"
613
+ });
614
+ checks.push({
615
+ name: "InsuranceEscrow.owner == StabilizerNFT",
616
+ passed: owner.toLowerCase() === d.contracts.StabilizerNFT.toLowerCase(),
617
+ expected: d.contracts.StabilizerNFT,
618
+ actual: owner
619
+ });
620
+ } catch {
621
+ checks.push({ name: "InsuranceEscrow.owner", passed: false });
622
+ }
623
+ }
698
624
 
699
- export { UPDClient, createUPDClient, getContractAddress, getDeployment, getDeploymentOrThrow, getSupportedChainIds, hasDeployment, signCancelAuthorization, signReceiveAuthorization, signTransferAuthorization, verifyDeployment };
700
- //# sourceMappingURL=chunk-R64I3LAO.js.map
701
- //# sourceMappingURL=chunk-R64I3LAO.js.map
625
+ export { UPDClient, createUPDClient, signCancelAuthorization, signReceiveAuthorization, signTransferAuthorization, verifyDeployment };
626
+ //# sourceMappingURL=chunk-AGPBQ56J.js.map
627
+ //# sourceMappingURL=chunk-AGPBQ56J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/client.ts","../src/core/eip3009.ts","../src/core/verify.ts"],"names":["collateralizationRatio"],"mappings":"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","file":"chunk-AGPBQ56J.js","sourcesContent":["/**\n * UPDClient — Main client for interacting with the UPD protocol.\n *\n * Read operations use publicClient only (no wallet needed).\n * Write operations require a walletClient.\n *\n * @example\n * ```ts\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createUPDClient } from '@permissionless-technologies/upd-sdk'\n *\n * const publicClient = createPublicClient({ chain: mainnet, transport: http() })\n * const client = createUPDClient({ publicClient, chainId: 1 })\n *\n * const balance = await client.getUPDBalance('0x...')\n * const supply = await client.getTotalSupply()\n * ```\n */\n\nimport type { Address, Hash } from 'viem'\nimport type {\n UPDClientConfig,\n StabilizerPosition,\n MintParams,\n BurnParams,\n CollateralInfo,\n PriceAttestationQuery,\n SUPDInfo,\n StakeParams,\n UnstakeParams,\n} from './types.js'\nimport { getDeploymentOrThrow, type UPDDeploymentConfig } from '../deployments/index.js'\nimport { createOracleClient } from '../oracle/client.js'\nimport type { OracleClient } from '../oracle/types.js'\nimport { computeSystemHealth, type SystemHealth } from './health.js'\nimport { UPD_TOKEN_ABI } from '../contracts/abi/UPDToken.js'\nimport { STABILIZER_NFT_ABI } from '../contracts/abi/StabilizerNFT.js'\nimport { OVERCOLLATERALIZATION_REPORTER_ABI } from '../contracts/abi/OvercollateralizationReporter.js'\nimport { POSITION_ESCROW_ABI } from '../contracts/abi/PositionEscrow.js'\nimport { STABILIZER_ESCROW_ABI } from '../contracts/abi/StabilizerEscrow.js'\nimport { SUPD_ABI } from '../contracts/abi/sUPD.js'\n\nexport class UPDClient {\n readonly config: UPDClientConfig\n readonly deployment: UPDDeploymentConfig\n readonly oracle: OracleClient\n\n constructor(config: UPDClientConfig) {\n this.config = config\n this.deployment = getDeploymentOrThrow(config.chainId)\n this.oracle = createOracleClient({ oracleUrl: config.oracleUrl })\n }\n\n // ============================================================\n // READ OPERATIONS\n // ============================================================\n\n /** Get UPD token balance for an address. */\n async getUPDBalance(address: Address): Promise<bigint> {\n return this.config.publicClient.readContract({\n address: this.deployment.contracts.UPDToken,\n abi: UPD_TOKEN_ABI,\n functionName: 'balanceOf',\n args: [address],\n }) as Promise<bigint>\n }\n\n /** Get total UPD supply. */\n async getTotalSupply(): Promise<bigint> {\n return this.config.publicClient.readContract({\n address: this.deployment.contracts.UPDToken,\n abi: UPD_TOKEN_ABI,\n functionName: 'totalSupply',\n }) as Promise<bigint>\n }\n\n /** Get system collateral info: total stETH collateral (yield-inclusive) and total UPD supply. */\n async getCollateralInfo(): Promise<CollateralInfo> {\n const [totalStEthCollateral, totalUPDSupply] = await Promise.all([\n this.config.publicClient.readContract({\n address: this.deployment.contracts.OvercollateralizationReporter,\n abi: OVERCOLLATERALIZATION_REPORTER_ABI,\n functionName: 'getTotalStEthCollateral',\n }) as Promise<bigint>,\n this.getTotalSupply(),\n ])\n\n return { totalStEthCollateral, totalUPDSupply }\n }\n\n /** Get details for a specific stabilizer position. */\n async getStabilizerPosition(tokenId: bigint): Promise<StabilizerPosition> {\n const stabNFT = this.deployment.contracts.StabilizerNFT\n\n const [posEscrowAddr, stabEscrowAddr, minRatio] = await Promise.all([\n this.config.publicClient.readContract({\n address: stabNFT,\n abi: STABILIZER_NFT_ABI,\n functionName: 'positionEscrows',\n args: [tokenId],\n }) as Promise<Address>,\n this.config.publicClient.readContract({\n address: stabNFT,\n abi: STABILIZER_NFT_ABI,\n functionName: 'stabilizerEscrows',\n args: [tokenId],\n }) as Promise<Address>,\n this.config.publicClient.readContract({\n address: stabNFT,\n abi: STABILIZER_NFT_ABI,\n functionName: 'minCollateralRatios',\n args: [tokenId],\n }) as Promise<bigint>,\n ])\n\n const [backedUPDAmount, stETHBalance, unallocatedStETH] = await Promise.all([\n this.config.publicClient.readContract({\n address: posEscrowAddr,\n abi: POSITION_ESCROW_ABI,\n functionName: 'backedUPDAmount',\n }) as Promise<bigint>,\n this.config.publicClient.readContract({\n address: posEscrowAddr,\n abi: POSITION_ESCROW_ABI,\n functionName: 'getCurrentStEthBalance',\n }) as Promise<bigint>,\n this.config.publicClient.readContract({\n address: stabEscrowAddr,\n abi: STABILIZER_ESCROW_ABI,\n functionName: 'unallocatedStETH',\n }) as Promise<bigint>,\n ])\n\n // Calculate collateralization ratio locally if there's a liability\n let collateralizationRatio = 0n\n if (backedUPDAmount > 0n && stETHBalance > 0n) {\n // Note: this is approximate — actual ratio requires a price feed\n // For exact ratio, use the on-chain getCollateralizationRatio with a price response\n collateralizationRatio = 0n // Requires price — caller should compute\n }\n\n return {\n tokenId,\n positionEscrowAddress: posEscrowAddr,\n stabilizerEscrowAddress: stabEscrowAddr,\n collateralizationRatio,\n backedUPDAmount,\n stETHBalance,\n unallocatedStETH,\n minCollateralRatio: minRatio,\n }\n }\n\n // ============================================================\n // WRITE OPERATIONS\n // ============================================================\n\n /**\n * Mint UPD by sending ETH. Requires walletClient.\n *\n * @example\n * ```ts\n * const attestation = createMockAttestation(2000n * 10n**18n)\n * const hash = await client.mint({\n * to: '0x...',\n * ethAmount: parseEther('1'),\n * priceAttestation: attestation,\n * })\n * ```\n */\n async mint(params: MintParams): Promise<Hash> {\n const walletClient = this._requireWallet()\n const { to, ethAmount, priceAttestation } = params\n\n return walletClient.writeContract({\n address: this.deployment.contracts.StabilizerNFT,\n abi: STABILIZER_NFT_ABI,\n functionName: 'mintUPD',\n args: [to, this._toSolidityAttestation(priceAttestation)],\n value: ethAmount,\n chain: walletClient.chain ?? null,\n account: walletClient.account!,\n })\n }\n\n /**\n * Burn UPD to receive stETH. Requires walletClient.\n *\n * @example\n * ```ts\n * const attestation = createMockAttestation(2000n * 10n**18n)\n * const hash = await client.burn({\n * updAmount: parseUnits('2000', 18),\n * priceAttestation: attestation,\n * })\n * ```\n */\n async burn(params: BurnParams): Promise<Hash> {\n const walletClient = this._requireWallet()\n const { updAmount, priceAttestation } = params\n\n return walletClient.writeContract({\n address: this.deployment.contracts.StabilizerNFT,\n abi: STABILIZER_NFT_ABI,\n functionName: 'burnUPD',\n args: [updAmount, this._toSolidityAttestation(priceAttestation)],\n chain: walletClient.chain ?? null,\n account: walletClient.account!,\n })\n }\n\n // ============================================================\n // sUPD OPERATIONS\n // ============================================================\n\n /** Get sUPD contract info: share value, APY, supply, liability. */\n async getSUPDInfo(): Promise<SUPDInfo> {\n const supdAddr = this.deployment.contracts.sUPD\n if (!supdAddr) throw new Error('sUPD not deployed on this chain')\n\n const [shareValue, annualYieldBps, totalSupply, totalLiabilityUSD] = await Promise.all([\n this.config.publicClient.readContract({\n address: supdAddr,\n abi: SUPD_ABI,\n functionName: 'currentShareValue',\n }) as Promise<bigint>,\n this.config.publicClient.readContract({\n address: supdAddr,\n abi: SUPD_ABI,\n functionName: 'annualYieldBps',\n }) as Promise<bigint>,\n this.config.publicClient.readContract({\n address: supdAddr,\n abi: SUPD_ABI,\n functionName: 'totalSupply',\n }) as Promise<bigint>,\n this.config.publicClient.readContract({\n address: supdAddr,\n abi: SUPD_ABI,\n functionName: 'totalLiabilityUSD',\n }) as Promise<bigint>,\n ])\n\n return { shareValue, annualYieldBps, totalSupply, totalLiabilityUSD }\n }\n\n /** Stake UPD to receive sUPD shares. Requires walletClient. */\n async stakeUPD(params: StakeParams): Promise<Hash> {\n const walletClient = this._requireWallet()\n const supdAddr = this.deployment.contracts.sUPD\n if (!supdAddr) throw new Error('sUPD not deployed on this chain')\n\n return walletClient.writeContract({\n address: supdAddr,\n abi: SUPD_ABI,\n functionName: 'stakeUPD',\n args: [params.updAmount, this._toSolidityAttestation(params.priceAttestation)],\n chain: walletClient.chain ?? null,\n account: walletClient.account!,\n })\n }\n\n /** Unstake sUPD shares to receive UPD. Requires walletClient. */\n async unstakeUPD(params: UnstakeParams): Promise<Hash> {\n const walletClient = this._requireWallet()\n const supdAddr = this.deployment.contracts.sUPD\n if (!supdAddr) throw new Error('sUPD not deployed on this chain')\n\n return walletClient.writeContract({\n address: supdAddr,\n abi: SUPD_ABI,\n functionName: 'unstakeToUPD',\n args: [params.shares, this._toSolidityAttestation(params.priceAttestation)],\n chain: walletClient.chain ?? null,\n account: walletClient.account!,\n })\n }\n\n // ============================================================\n // CONVENIENCE METHODS\n // ============================================================\n\n /**\n * Mint UPD by sending ETH, automatically fetching a price attestation from the oracle.\n *\n * @example\n * ```ts\n * const hash = await client.mintWithOracle({\n * to: '0x...',\n * ethAmount: parseEther('1'),\n * })\n * ```\n */\n async mintWithOracle(params: { to: Address; ethAmount: bigint }): Promise<Hash> {\n const attestation = await this.oracle.getEthUsdAttestation()\n return this.mint({ ...params, priceAttestation: attestation })\n }\n\n /**\n * Burn UPD to receive stETH, automatically fetching a price attestation from the oracle.\n *\n * @example\n * ```ts\n * const hash = await client.burnWithOracle({\n * updAmount: parseUnits('2000', 18),\n * })\n * ```\n */\n async burnWithOracle(params: { updAmount: bigint }): Promise<Hash> {\n const attestation = await this.oracle.getEthUsdAttestation()\n return this.burn({ ...params, priceAttestation: attestation })\n }\n\n /**\n * Get system health metrics by combining on-chain collateral data with oracle price.\n *\n * @example\n * ```ts\n * const health = await client.getSystemHealth()\n * console.log(`System ratio: ${health.systemCollateralRatioBps} bps`)\n * console.log(`Healthy: ${health.isHealthy}`)\n * ```\n */\n async getSystemHealth(): Promise<SystemHealth> {\n const [collateral, { price }] = await Promise.all([\n this.getCollateralInfo(),\n this.oracle.getEthUsdPrice(),\n ])\n return computeSystemHealth(collateral, price)\n }\n\n /** Stake UPD, fetching oracle attestation automatically. */\n async stakeUPDWithOracle(params: { updAmount: bigint }): Promise<Hash> {\n const attestation = await this.oracle.getEthUsdAttestation()\n return this.stakeUPD({ ...params, priceAttestation: attestation })\n }\n\n /** Unstake sUPD, fetching oracle attestation automatically. */\n async unstakeUPDWithOracle(params: { shares: bigint }): Promise<Hash> {\n const attestation = await this.oracle.getEthUsdAttestation()\n return this.unstakeUPD({ ...params, priceAttestation: attestation })\n }\n\n /**\n * Permissionless sync: recalculates the reporter's collateral snapshot from on-chain truth.\n * Iterates all PositionEscrows, sums their stETH shares, and resets the reporter.\n * Anyone can call this — gas cost is proportional to the number of stabilizers.\n */\n async syncReporter(): Promise<Hash> {\n const walletClient = this._requireWallet()\n return walletClient.writeContract({\n address: this.deployment.contracts.OvercollateralizationReporter,\n abi: OVERCOLLATERALIZATION_REPORTER_ABI,\n functionName: 'syncFromChain',\n chain: walletClient.chain ?? null,\n account: walletClient.account!,\n })\n }\n\n // ============================================================\n // HELPERS\n // ============================================================\n\n private _requireWallet() {\n if (!this.config.walletClient) {\n throw new Error(\n 'UPDClient: walletClient is required for write operations. ' +\n 'Pass a walletClient in the config to use mint/burn.',\n )\n }\n return this.config.walletClient\n }\n\n private _toSolidityAttestation(a: PriceAttestationQuery) {\n return {\n price: a.price,\n decimals: a.decimals,\n dataTimestamp: a.dataTimestamp,\n assetPair: a.assetPair,\n signature: a.signature,\n } as const\n }\n}\n\n/**\n * Create a UPD client instance.\n *\n * @example\n * ```ts\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createUPDClient } from '@permissionless-technologies/upd-sdk'\n *\n * const client = createUPDClient({\n * publicClient: createPublicClient({ chain: mainnet, transport: http() }),\n * chainId: 1,\n * })\n * ```\n */\nexport function createUPDClient(config: UPDClientConfig): UPDClient {\n return new UPDClient(config)\n}\n","/**\n * EIP-3009 Transfer Authorization helpers for UPD.\n *\n * Pure signing functions — no blockchain calls. Generate off-chain EIP-712\n * signatures that can be submitted by any relayer or facilitator (e.g., x402).\n *\n * @example\n * ```ts\n * import { signTransferAuthorization } from '@permissionless-technologies/upd-sdk'\n *\n * const auth = await signTransferAuthorization({\n * walletClient,\n * tokenAddress: '0x...',\n * from: '0xAlice...',\n * to: '0xBob...',\n * value: parseUnits('100', 18),\n * validAfter: 0n,\n * validBefore: BigInt(Math.floor(Date.now() / 1000) + 3600),\n * })\n *\n * // Submit via relayer, x402 facilitator, or directly\n * await publicClient.writeContract({\n * address: tokenAddress,\n * abi: UPD_TOKEN_ABI,\n * functionName: 'transferWithAuthorization',\n * args: [auth.from, auth.to, auth.value, auth.validAfter, auth.validBefore, auth.nonce, auth.v, auth.r, auth.s],\n * })\n * ```\n */\n\nimport { type Address, type Hex, type WalletClient, hexToBytes, bytesToHex } from 'viem'\n\nexport interface TransferAuthorizationParams {\n walletClient: WalletClient\n tokenAddress: Address\n from: Address\n to: Address\n value: bigint\n validAfter?: bigint\n validBefore?: bigint\n nonce?: Hex\n}\n\nexport interface TransferAuthorization {\n from: Address\n to: Address\n value: bigint\n validAfter: bigint\n validBefore: bigint\n nonce: Hex\n v: number\n r: Hex\n s: Hex\n}\n\nexport interface CancelAuthorizationParams {\n walletClient: WalletClient\n tokenAddress: Address\n authorizer: Address\n nonce: Hex\n}\n\nexport interface CancelAuthorization {\n authorizer: Address\n nonce: Hex\n v: number\n r: Hex\n s: Hex\n}\n\nconst EIP3009_DOMAIN_VERSION = '1'\n\nfunction randomNonce(): Hex {\n const bytes = new Uint8Array(32)\n crypto.getRandomValues(bytes)\n return bytesToHex(bytes)\n}\n\nfunction eip3009Domain(tokenAddress: Address, chainId: number, tokenName: string) {\n return {\n name: tokenName,\n version: EIP3009_DOMAIN_VERSION,\n chainId,\n verifyingContract: tokenAddress,\n } as const\n}\n\n/**\n * Sign a TransferWithAuthorization (EIP-3009).\n *\n * Generates a random nonce if none is provided. Default time window: now → +1 hour.\n * The returned object contains all arguments needed for `transferWithAuthorization()`.\n */\nexport async function signTransferAuthorization(\n params: TransferAuthorizationParams,\n tokenName = 'Universal Private Dollar',\n): Promise<TransferAuthorization> {\n const {\n walletClient,\n tokenAddress,\n from,\n to,\n value,\n validAfter = 0n,\n validBefore = BigInt(Math.floor(Date.now() / 1000) + 3600),\n nonce = randomNonce(),\n } = params\n\n const chainId = walletClient.chain?.id\n if (!chainId) throw new Error('walletClient must have a chain configured')\n\n const signature = await walletClient.signTypedData({\n account: from,\n domain: eip3009Domain(tokenAddress, chainId, tokenName),\n types: {\n TransferWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n },\n primaryType: 'TransferWithAuthorization',\n message: { from, to, value, validAfter, validBefore, nonce },\n })\n\n const sigBytes = hexToBytes(signature)\n const r = bytesToHex(sigBytes.slice(0, 32))\n const s = bytesToHex(sigBytes.slice(32, 64))\n const v = sigBytes[64]!\n\n return { from, to, value, validAfter, validBefore, nonce, v, r, s }\n}\n\n/**\n * Sign a ReceiveWithAuthorization (EIP-3009).\n *\n * Same as transferWithAuthorization but the resulting signature can only be\n * submitted by the `to` address (prevents front-running).\n */\nexport async function signReceiveAuthorization(\n params: TransferAuthorizationParams,\n tokenName = 'Universal Private Dollar',\n): Promise<TransferAuthorization> {\n const {\n walletClient,\n tokenAddress,\n from,\n to,\n value,\n validAfter = 0n,\n validBefore = BigInt(Math.floor(Date.now() / 1000) + 3600),\n nonce = randomNonce(),\n } = params\n\n const chainId = walletClient.chain?.id\n if (!chainId) throw new Error('walletClient must have a chain configured')\n\n const signature = await walletClient.signTypedData({\n account: from,\n domain: eip3009Domain(tokenAddress, chainId, tokenName),\n types: {\n ReceiveWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n },\n primaryType: 'ReceiveWithAuthorization',\n message: { from, to, value, validAfter, validBefore, nonce },\n })\n\n const sigBytes = hexToBytes(signature)\n const r = bytesToHex(sigBytes.slice(0, 32))\n const s = bytesToHex(sigBytes.slice(32, 64))\n const v = sigBytes[64]!\n\n return { from, to, value, validAfter, validBefore, nonce, v, r, s }\n}\n\n/**\n * Sign a CancelAuthorization (EIP-3009).\n *\n * Cancels a previously signed authorization before it's been used.\n */\nexport async function signCancelAuthorization(\n params: CancelAuthorizationParams,\n tokenName = 'Universal Private Dollar',\n): Promise<CancelAuthorization> {\n const { walletClient, tokenAddress, authorizer, nonce } = params\n\n const chainId = walletClient.chain?.id\n if (!chainId) throw new Error('walletClient must have a chain configured')\n\n const signature = await walletClient.signTypedData({\n account: authorizer,\n domain: eip3009Domain(tokenAddress, chainId, tokenName),\n types: {\n CancelAuthorization: [\n { name: 'authorizer', type: 'address' },\n { name: 'nonce', type: 'bytes32' },\n ],\n },\n primaryType: 'CancelAuthorization',\n message: { authorizer, nonce },\n })\n\n const sigBytes = hexToBytes(signature)\n const r = bytesToHex(sigBytes.slice(0, 32))\n const s = bytesToHex(sigBytes.slice(32, 64))\n const v = sigBytes[64]!\n\n return { authorizer, nonce, v, r, s }\n}\n","/**\n * UPD Deployment Verification — Check on-chain state matches deployment config.\n *\n * Verifies:\n * 1. Bytecode exists at all deployed addresses\n * 2. UUPS proxy implementation slots point to correct implementations\n * 3. Critical storage values are initialized correctly (including reporter != address(0))\n * 4. Access control roles are granted properly (CONTROLLER_ROLE, UPDATER_ROLE)\n * 5. Ownership (InsuranceEscrow owned by StabilizerNFT)\n */\n\nimport type { Address, PublicClient } from 'viem'\nimport type { UPDDeploymentConfig } from '../deployments/index.js'\nimport { UPD_TOKEN_ABI } from '../contracts/abi/UPDToken.js'\nimport { STABILIZER_NFT_ABI } from '../contracts/abi/StabilizerNFT.js'\nimport { OVERCOLLATERALIZATION_REPORTER_ABI } from '../contracts/abi/OvercollateralizationReporter.js'\nimport { INSURANCE_ESCROW_ABI } from '../contracts/abi/InsuranceEscrow.js'\n\n/** ERC-1967 implementation storage slot */\nconst ERC1967_IMPL_SLOT =\n '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc' as const\n\nexport interface VerificationCheck {\n name: string\n passed: boolean\n expected?: string\n actual?: string\n}\n\nexport interface VerificationResult {\n chainId: number\n checks: VerificationCheck[]\n passed: number\n failed: number\n allPassed: boolean\n}\n\n/**\n * Verify that a UPD deployment matches its on-chain state.\n *\n * @example\n * ```ts\n * const result = await verifyDeployment(publicClient, deployment)\n * if (!result.allPassed) {\n * console.error('Deployment verification failed:', result.checks.filter(c => !c.passed))\n * }\n * ```\n */\nexport async function verifyDeployment(\n publicClient: PublicClient,\n deployment: UPDDeploymentConfig,\n): Promise<VerificationResult> {\n const checks: VerificationCheck[] = []\n\n // 1. Bytecode existence — every deployed address must have code\n await _verifyBytecode(publicClient, checks, 'UPDToken', deployment.contracts.UPDToken)\n await _verifyBytecode(publicClient, checks, 'PriceOracle', deployment.contracts.PriceOracle)\n await _verifyBytecode(publicClient, checks, 'StabilizerNFT', deployment.contracts.StabilizerNFT)\n await _verifyBytecode(publicClient, checks, 'Reporter', deployment.contracts.OvercollateralizationReporter)\n await _verifyBytecode(publicClient, checks, 'InsuranceEscrow', deployment.contracts.InsuranceEscrow)\n await _verifyBytecode(publicClient, checks, 'LinkedListLib', deployment.libraries.LinkedListLib)\n await _verifyBytecode(publicClient, checks, 'CollateralMathLib', deployment.libraries.CollateralMathLib)\n await _verifyBytecode(publicClient, checks, 'StabilizerEscrow template', deployment.templates.StabilizerEscrow)\n await _verifyBytecode(publicClient, checks, 'PositionEscrow template', deployment.templates.PositionEscrow)\n\n // 2. Proxy implementation slots (ERC-1967)\n await _verifyProxyImpl(publicClient, checks, 'PriceOracle', deployment.contracts.PriceOracle, deployment.implementations.PriceOracle)\n await _verifyProxyImpl(publicClient, checks, 'StabilizerNFT', deployment.contracts.StabilizerNFT, deployment.implementations.StabilizerNFT)\n await _verifyProxyImpl(publicClient, checks, 'Reporter', deployment.contracts.OvercollateralizationReporter, deployment.implementations.OvercollateralizationReporter)\n\n // 3. Storage initialization — all dependency pointers must be wired\n await _verifyStabilizerNFTStorage(publicClient, checks, deployment)\n await _verifyReporterStorage(publicClient, checks, deployment)\n\n // 4. Access control\n // UPDToken uses a single CONTROLLER_ROLE for mint+burn (NOT separate MINTER/BURNER roles)\n await _verifyRole(publicClient, checks, 'UPDToken CONTROLLER_ROLE -> StabilizerNFT',\n deployment.contracts.UPDToken, UPD_TOKEN_ABI,\n '0x7b765e0e932d348852a6f810bfa1ab891e259123f02db8cdcde614c570223357', // keccak256(\"CONTROLLER_ROLE\")\n deployment.contracts.StabilizerNFT)\n\n // Reporter UPDATER_ROLE must be held by StabilizerNFT\n await _verifyRole(publicClient, checks, 'Reporter UPDATER_ROLE -> StabilizerNFT',\n deployment.contracts.OvercollateralizationReporter, OVERCOLLATERALIZATION_REPORTER_ABI,\n '0x73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab', // keccak256(\"UPDATER_ROLE\")\n deployment.contracts.StabilizerNFT)\n\n // 5. Ownership — InsuranceEscrow must be owned by StabilizerNFT\n await _verifyOwnership(publicClient, checks, deployment)\n\n const passed = checks.filter((c) => c.passed).length\n const failed = checks.filter((c) => !c.passed).length\n\n return {\n chainId: deployment.chainId,\n checks,\n passed,\n failed,\n allPassed: failed === 0,\n }\n}\n\n// ---- Internal helpers ----\n\nasync function _verifyBytecode(\n client: PublicClient,\n checks: VerificationCheck[],\n name: string,\n address: Address,\n): Promise<void> {\n try {\n const code = await client.getCode({ address })\n const exists = code !== undefined && code !== '0x' && code.length > 2\n checks.push({ name: `${name} bytecode exists`, passed: exists })\n } catch {\n checks.push({ name: `${name} bytecode exists`, passed: false })\n }\n}\n\nasync function _verifyProxyImpl(\n client: PublicClient,\n checks: VerificationCheck[],\n name: string,\n proxyAddress: Address,\n expectedImpl: Address,\n): Promise<void> {\n try {\n const implSlot = await client.getStorageAt({\n address: proxyAddress,\n slot: ERC1967_IMPL_SLOT,\n })\n const actualImpl = ('0x' + (implSlot ?? '0x').slice(26)).toLowerCase() as Address\n const expected = expectedImpl.toLowerCase()\n checks.push({\n name: `${name} proxy -> impl`,\n passed: actualImpl === expected,\n expected: expectedImpl,\n actual: actualImpl as string,\n })\n } catch {\n checks.push({ name: `${name} proxy -> impl`, passed: false, expected: expectedImpl })\n }\n}\n\nasync function _verifyStabilizerNFTStorage(\n client: PublicClient,\n checks: VerificationCheck[],\n d: UPDDeploymentConfig,\n): Promise<void> {\n try {\n const nft = d.contracts.StabilizerNFT\n const updToken = await client.readContract({\n address: nft, abi: STABILIZER_NFT_ABI, functionName: 'updToken',\n }) as Address\n checks.push({\n name: 'StabilizerNFT.updToken',\n passed: updToken.toLowerCase() === d.contracts.UPDToken.toLowerCase(),\n expected: d.contracts.UPDToken,\n actual: updToken,\n })\n\n const oracle = await client.readContract({\n address: nft, abi: STABILIZER_NFT_ABI, functionName: 'oracle',\n }) as Address\n checks.push({\n name: 'StabilizerNFT.oracle',\n passed: oracle.toLowerCase() === d.contracts.PriceOracle.toLowerCase(),\n expected: d.contracts.PriceOracle,\n actual: oracle,\n })\n\n const stETH = await client.readContract({\n address: nft, abi: STABILIZER_NFT_ABI, functionName: 'stETH',\n }) as Address\n checks.push({\n name: 'StabilizerNFT.stETH',\n passed: stETH.toLowerCase() === d.external.stETH.toLowerCase(),\n expected: d.external.stETH,\n actual: stETH,\n })\n\n // Critical: reporter must be wired (address(0) causes mintUPD to revert)\n const reporter = await client.readContract({\n address: nft, abi: STABILIZER_NFT_ABI, functionName: 'reporter',\n }) as Address\n const ZERO = '0x0000000000000000000000000000000000000000'\n checks.push({\n name: 'StabilizerNFT.reporter != address(0)',\n passed: reporter.toLowerCase() !== ZERO,\n expected: `!= ${ZERO}`,\n actual: reporter,\n })\n checks.push({\n name: 'StabilizerNFT.reporter == Reporter proxy',\n passed: reporter.toLowerCase() === d.contracts.OvercollateralizationReporter.toLowerCase(),\n expected: d.contracts.OvercollateralizationReporter,\n actual: reporter,\n })\n\n // InsuranceEscrow pointer\n const insuranceEscrow = await client.readContract({\n address: nft, abi: STABILIZER_NFT_ABI, functionName: 'insuranceEscrow',\n }) as Address\n checks.push({\n name: 'StabilizerNFT.insuranceEscrow',\n passed: insuranceEscrow.toLowerCase() === d.contracts.InsuranceEscrow.toLowerCase(),\n expected: d.contracts.InsuranceEscrow,\n actual: insuranceEscrow,\n })\n } catch {\n checks.push({ name: 'StabilizerNFT storage', passed: false })\n }\n}\n\nasync function _verifyReporterStorage(\n client: PublicClient,\n checks: VerificationCheck[],\n d: UPDDeploymentConfig,\n): Promise<void> {\n try {\n const reporter = d.contracts.OvercollateralizationReporter\n const stabNFT = await client.readContract({\n address: reporter, abi: OVERCOLLATERALIZATION_REPORTER_ABI, functionName: 'stabilizerNFTContract',\n }) as Address\n checks.push({\n name: 'Reporter.stabilizerNFT',\n passed: stabNFT.toLowerCase() === d.contracts.StabilizerNFT.toLowerCase(),\n expected: d.contracts.StabilizerNFT,\n actual: stabNFT,\n })\n\n const updToken = await client.readContract({\n address: reporter, abi: OVERCOLLATERALIZATION_REPORTER_ABI, functionName: 'updToken',\n }) as Address\n checks.push({\n name: 'Reporter.updToken',\n passed: updToken.toLowerCase() === d.contracts.UPDToken.toLowerCase(),\n expected: d.contracts.UPDToken,\n actual: updToken,\n })\n } catch {\n checks.push({ name: 'Reporter storage', passed: false })\n }\n}\n\nasync function _verifyRole(\n client: PublicClient,\n checks: VerificationCheck[],\n name: string,\n contractAddress: Address,\n abi: readonly unknown[],\n roleHash: `0x${string}`,\n account: Address,\n): Promise<void> {\n try {\n const hasRole = await client.readContract({\n address: contractAddress,\n abi: abi as never,\n functionName: 'hasRole',\n args: [roleHash, account],\n }) as boolean\n checks.push({ name, passed: hasRole })\n } catch {\n checks.push({ name, passed: false })\n }\n}\n\nasync function _verifyOwnership(\n client: PublicClient,\n checks: VerificationCheck[],\n d: UPDDeploymentConfig,\n): Promise<void> {\n try {\n const owner = await client.readContract({\n address: d.contracts.InsuranceEscrow,\n abi: INSURANCE_ESCROW_ABI,\n functionName: 'owner',\n }) as Address\n checks.push({\n name: 'InsuranceEscrow.owner == StabilizerNFT',\n passed: owner.toLowerCase() === d.contracts.StabilizerNFT.toLowerCase(),\n expected: d.contracts.StabilizerNFT,\n actual: owner,\n })\n } catch {\n checks.push({ name: 'InsuranceEscrow.owner', passed: false })\n }\n}\n"]}
@@ -0,0 +1,206 @@
1
+ 'use strict';
2
+
3
+ // src/deployments/31337.json
4
+ var __default = {
5
+ contracts: {
6
+ UPDToken: "0x0000000000000000000000000000000000000000",
7
+ PriceOracle: "0x0000000000000000000000000000000000000000",
8
+ StabilizerNFT: "0x0000000000000000000000000000000000000000",
9
+ OvercollateralizationReporter: "0x0000000000000000000000000000000000000000",
10
+ InsuranceEscrow: "0x0000000000000000000000000000000000000000",
11
+ BridgeEscrow: "0x0000000000000000000000000000000000000000",
12
+ sUPD: "0x0000000000000000000000000000000000000000"
13
+ },
14
+ implementations: {
15
+ PriceOracle: "0x0000000000000000000000000000000000000000",
16
+ StabilizerNFT: "0x0000000000000000000000000000000000000000",
17
+ OvercollateralizationReporter: "0x0000000000000000000000000000000000000000"
18
+ },
19
+ libraries: {
20
+ LinkedListLib: "0x0000000000000000000000000000000000000000",
21
+ CollateralMathLib: "0x0000000000000000000000000000000000000000"
22
+ },
23
+ templates: {
24
+ StabilizerEscrow: "0x0000000000000000000000000000000000000000",
25
+ PositionEscrow: "0x0000000000000000000000000000000000000000"
26
+ },
27
+ external: {
28
+ stETH: "0x0000000000000000000000000000000000000000",
29
+ lido: "0x0000000000000000000000000000000000000000",
30
+ oracleSigner: "0x0000000000000000000000000000000000000000"
31
+ },
32
+ metadata: {
33
+ chainId: 31337,
34
+ deployBlock: 0,
35
+ deployTimestamp: 0,
36
+ deployer: "0x0000000000000000000000000000000000000000"
37
+ }
38
+ };
39
+
40
+ // src/deployments/11155111.json
41
+ var __default2 = {
42
+ contracts: {
43
+ UPDToken: "0xcF6Ace4Ff3B6f2e56E2Bd89a68cf5CA148Bd69a8",
44
+ PriceOracle: "0x415eb7A422291231a27EC86673B5d5ae0e1aD849",
45
+ StabilizerNFT: "0x4B705a4773f110F1716337a6C34eeaA4f575ee9f",
46
+ OvercollateralizationReporter: "0xA4dF955BB8eF2047deC4Ff889152479D5D62e287",
47
+ InsuranceEscrow: "0xc2Ae7a917c77B459951f56E73854Faa51b8c6103",
48
+ BridgeEscrow: "0x7BfDE5064ED50b4778B0983cc345a76DAFAC00Aa"
49
+ },
50
+ implementations: {
51
+ PriceOracle: "0x7205C15a8266Fc203045b8B5b7CD2f4B41082c89",
52
+ StabilizerNFT: "0x82Ac19eC8bc8a660112333A250274b18ba05e8da",
53
+ OvercollateralizationReporter: "0x84499938994b7555A0C2759001B8293a0f23FF49"
54
+ },
55
+ libraries: {
56
+ LinkedListLib: "0x28C62c4D84014c0714001483a7FB9C1902cB3E7D",
57
+ CollateralMathLib: "0xb7FC9e16380afce7Bcbb1a4B903fe3A3564CebCE"
58
+ },
59
+ templates: {
60
+ StabilizerEscrow: "0x37302F82605EA0121Dc28b8950E41A8CEa817e50",
61
+ PositionEscrow: "0x3B0F4a18d41bf3Aa7179578c193c579f9043c948",
62
+ StabilizerEscrowBeacon: "0x82868B7FB57b14AdA6954f34acc1085d6fC189f9",
63
+ PositionEscrowBeacon: "0xa0233E45Fd5f14fe10c66ff1A1815ce54Cda1a33",
64
+ BeaconProxyFactory: "0xb44181b1671760B814cB5a96eD345160b9faaB61"
65
+ },
66
+ external: {
67
+ stETH: "0x3e3FE7dBc6B4C189E7128855dD526361c49b40Af",
68
+ lido: "0x3e3FE7dBc6B4C189E7128855dD526361c49b40Af",
69
+ oracleSigner: "0xDEAD59BD1E61a3B6AB81806A30f4102831b70001"
70
+ },
71
+ metadata: {
72
+ chainId: 11155111,
73
+ deployBlock: 0,
74
+ deployTimestamp: 1775502732,
75
+ deployer: "0xdEadDEADb916b00D02f4f2db062Fb2C47fe0689b"
76
+ }
77
+ };
78
+
79
+ // src/deployments/index.ts
80
+ function parseDeployment(json, chainId) {
81
+ return {
82
+ chainId,
83
+ contracts: {
84
+ UPDToken: json.contracts.UPDToken,
85
+ PriceOracle: json.contracts.PriceOracle,
86
+ StabilizerNFT: json.contracts.StabilizerNFT,
87
+ OvercollateralizationReporter: json.contracts.OvercollateralizationReporter,
88
+ InsuranceEscrow: json.contracts.InsuranceEscrow,
89
+ BridgeEscrow: json.contracts.BridgeEscrow,
90
+ sUPD: json.contracts.sUPD
91
+ },
92
+ implementations: {
93
+ PriceOracle: json.implementations.PriceOracle,
94
+ StabilizerNFT: json.implementations.StabilizerNFT,
95
+ OvercollateralizationReporter: json.implementations.OvercollateralizationReporter,
96
+ sUPD: json.implementations.sUPD
97
+ },
98
+ libraries: {
99
+ LinkedListLib: json.libraries.LinkedListLib,
100
+ CollateralMathLib: json.libraries.CollateralMathLib
101
+ },
102
+ templates: {
103
+ StabilizerEscrow: json.templates.StabilizerEscrow,
104
+ PositionEscrow: json.templates.PositionEscrow
105
+ },
106
+ external: {
107
+ stETH: json.external.stETH,
108
+ lido: json.external.lido,
109
+ oracleSigner: json.external.oracleSigner
110
+ },
111
+ metadata: {
112
+ deployBlock: json.metadata.deployBlock,
113
+ deployTimestamp: json.metadata.deployTimestamp,
114
+ deployer: json.metadata.deployer
115
+ }
116
+ };
117
+ }
118
+ var deployments = {
119
+ 31337: parseDeployment(__default, 31337),
120
+ 11155111: parseDeployment(__default2, 11155111)
121
+ };
122
+ function getDeployment(chainId) {
123
+ return deployments[chainId] ?? null;
124
+ }
125
+ function getDeploymentOrThrow(chainId) {
126
+ const deployment = getDeployment(chainId);
127
+ if (!deployment) {
128
+ throw new Error(
129
+ `No UPD deployment found for chain ${chainId}. Supported chains: ${getSupportedChainIds().join(", ")}`
130
+ );
131
+ }
132
+ return deployment;
133
+ }
134
+ function hasDeployment(chainId) {
135
+ return chainId in deployments;
136
+ }
137
+ function getSupportedChainIds() {
138
+ return Object.keys(deployments).map(Number);
139
+ }
140
+ function getContractAddress(chainId, contractName) {
141
+ const deployment = getDeployment(chainId);
142
+ if (!deployment) return null;
143
+ return deployment.contracts[contractName] ?? null;
144
+ }
145
+
146
+ // src/core/quote.ts
147
+ var PRICE_PRECISION = 10n ** 18n;
148
+ var SHARE_PRECISION = 10n ** 18n;
149
+ function quoteMintUPD(ethAmount, ethUsdPrice) {
150
+ return ethAmount * ethUsdPrice / PRICE_PRECISION;
151
+ }
152
+ function quoteBurnUPD(updAmount, ethUsdPrice) {
153
+ if (ethUsdPrice === 0n) throw new Error("Price cannot be zero");
154
+ return updAmount * PRICE_PRECISION / ethUsdPrice;
155
+ }
156
+ function stabilizerStEthNeeded(userEth, minCollateralRatioBps) {
157
+ return userEth * (minCollateralRatioBps - 10000n) / 10000n;
158
+ }
159
+ function quoteStakeUPD(updAmount, shareValue) {
160
+ if (shareValue === 0n) throw new Error("Share value cannot be zero");
161
+ return updAmount * SHARE_PRECISION / shareValue;
162
+ }
163
+ function quoteUnstakeUPD(shares, shareValue) {
164
+ return shares * shareValue / SHARE_PRECISION;
165
+ }
166
+ function collateralizationRatio(stEthBalance, ethUsdPrice, backedUPDAmount) {
167
+ if (backedUPDAmount === 0n) return BigInt(2) ** BigInt(256) - 1n;
168
+ const collateralValueUSD = stEthBalance * ethUsdPrice / PRICE_PRECISION;
169
+ return collateralValueUSD * 10000n / backedUPDAmount;
170
+ }
171
+
172
+ // src/core/health.ts
173
+ var DEFAULT_MIN_RATIO_BPS = 12500n;
174
+ function computeSystemHealth(collateral, ethUsdPrice, minRatioBps = DEFAULT_MIN_RATIO_BPS) {
175
+ const PRICE_PRECISION2 = 10n ** 18n;
176
+ const collateralValueUsd = collateral.totalStEthCollateral * ethUsdPrice / PRICE_PRECISION2;
177
+ const systemCollateralRatioBps = collateralizationRatio(
178
+ collateral.totalStEthCollateral,
179
+ ethUsdPrice,
180
+ collateral.totalUPDSupply
181
+ );
182
+ const bufferUsd = collateralValueUsd - collateral.totalUPDSupply;
183
+ return {
184
+ systemCollateralRatioBps,
185
+ isHealthy: systemCollateralRatioBps >= minRatioBps,
186
+ collateralValueUsd,
187
+ totalUPDSupply: collateral.totalUPDSupply,
188
+ bufferUsd
189
+ };
190
+ }
191
+
192
+ exports.DEFAULT_MIN_RATIO_BPS = DEFAULT_MIN_RATIO_BPS;
193
+ exports.collateralizationRatio = collateralizationRatio;
194
+ exports.computeSystemHealth = computeSystemHealth;
195
+ exports.getContractAddress = getContractAddress;
196
+ exports.getDeployment = getDeployment;
197
+ exports.getDeploymentOrThrow = getDeploymentOrThrow;
198
+ exports.getSupportedChainIds = getSupportedChainIds;
199
+ exports.hasDeployment = hasDeployment;
200
+ exports.quoteBurnUPD = quoteBurnUPD;
201
+ exports.quoteMintUPD = quoteMintUPD;
202
+ exports.quoteStakeUPD = quoteStakeUPD;
203
+ exports.quoteUnstakeUPD = quoteUnstakeUPD;
204
+ exports.stabilizerStEthNeeded = stabilizerStEthNeeded;
205
+ //# sourceMappingURL=chunk-KSGUFTW3.cjs.map
206
+ //# sourceMappingURL=chunk-KSGUFTW3.cjs.map