@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
|
@@ -1,148 +1,8 @@
|
|
|
1
|
-
import { computeSystemHealth } from './chunk-
|
|
2
|
-
import { UPD_TOKEN_ABI, OVERCOLLATERALIZATION_REPORTER_ABI, STABILIZER_NFT_ABI, POSITION_ESCROW_ABI, STABILIZER_ESCROW_ABI, SUPD_ABI } from './chunk-
|
|
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: "
|
|
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
|
|
441
|
+
"UPDToken CONTROLLER_ROLE -> StabilizerNFT",
|
|
563
442
|
deployment.contracts.UPDToken,
|
|
564
443
|
UPD_TOKEN_ABI,
|
|
565
|
-
"
|
|
566
|
-
// keccak256("
|
|
444
|
+
"0x7b765e0e932d348852a6f810bfa1ab891e259123f02db8cdcde614c570223357",
|
|
445
|
+
// keccak256("CONTROLLER_ROLE")
|
|
567
446
|
deployment.contracts.StabilizerNFT
|
|
568
447
|
);
|
|
569
448
|
await _verifyRole(
|
|
570
449
|
publicClient,
|
|
571
450
|
checks,
|
|
572
|
-
"
|
|
573
|
-
deployment.contracts.
|
|
574
|
-
|
|
575
|
-
"
|
|
576
|
-
// keccak256("
|
|
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,
|
|
700
|
-
//# sourceMappingURL=chunk-
|
|
701
|
-
//# sourceMappingURL=chunk-
|
|
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
|